From c97d09c8de8a1751f2072908498f4237f824dd57 Mon Sep 17 00:00:00 2001 From: LoRd_MuldeR Date: Wed, 10 May 2023 23:08:24 +0200 Subject: [PATCH] Initial commit. --- .gitignore | 6 + LICENSE.txt | 121 ++++++ Makefile | 94 +++++ README.md | 306 +++++++++++++++ etc/build/cygwin/mk-release.sh | 33 ++ etc/build/dragonfly/mk-release.sh | 22 ++ etc/build/freebsd/mk-release.sh | 35 ++ etc/build/gnuhurd/mk-release.sh | 21 ++ etc/build/haiku/mk-release.sh | 32 ++ etc/build/linux/mk-libmusl.sh | 52 +++ etc/build/linux/mk-release.sh | 36 ++ etc/build/macos/hdiutil.txt | 1 + etc/build/macos/mk-release.sh | 24 ++ etc/build/mingw/mk-clang.cmd | 27 ++ etc/build/mingw/mk-gcc.cmd | 27 ++ etc/build/mingw/mk-release.sh | 37 ++ etc/build/netbsd/mk-release.sh | 22 ++ etc/build/openbsd/mk-release.sh | 31 ++ etc/images/nuhash_logo.png | Bin 0 -> 218512 bytes etc/images/table_xor.png | Bin 0 -> 12719 bytes etc/style/gh-pandoc.min.css | 1 + libnuhash/include/nuhash.h | 109 ++++++ libnuhash/libnuhash.vcxproj | 463 +++++++++++++++++++++++ libnuhash/libnuhash.vcxproj.filters | 30 ++ libnuhash/src/nuhash.c | 554 ++++++++++++++++++++++++++++ libnuhash/src/version.h | 8 + make.cmd | 95 +++++ nuhash.sln | 66 ++++ tool/nuhash.user | 4 + tool/nuhash.vcxproj | 473 ++++++++++++++++++++++++ tool/nuhash.vcxproj.filters | 40 ++ tool/res/compatibility.manifest | 17 + tool/res/hash.ico | Bin 0 -> 5430 bytes tool/res/version.rc | 79 ++++ tool/src/main.c | 502 +++++++++++++++++++++++++ tool/src/platform.c | 74 ++++ tool/src/platform.h | 211 +++++++++++ 37 files changed, 3653 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.md create mode 100755 etc/build/cygwin/mk-release.sh create mode 100755 etc/build/dragonfly/mk-release.sh create mode 100755 etc/build/freebsd/mk-release.sh create mode 100755 etc/build/gnuhurd/mk-release.sh create mode 100755 etc/build/haiku/mk-release.sh create mode 100755 etc/build/linux/mk-libmusl.sh create mode 100755 etc/build/linux/mk-release.sh create mode 100644 etc/build/macos/hdiutil.txt create mode 100755 etc/build/macos/mk-release.sh create mode 100644 etc/build/mingw/mk-clang.cmd create mode 100644 etc/build/mingw/mk-gcc.cmd create mode 100755 etc/build/mingw/mk-release.sh create mode 100755 etc/build/netbsd/mk-release.sh create mode 100755 etc/build/openbsd/mk-release.sh create mode 100644 etc/images/nuhash_logo.png create mode 100644 etc/images/table_xor.png create mode 100644 etc/style/gh-pandoc.min.css create mode 100644 libnuhash/include/nuhash.h create mode 100644 libnuhash/libnuhash.vcxproj create mode 100644 libnuhash/libnuhash.vcxproj.filters create mode 100644 libnuhash/src/nuhash.c create mode 100644 libnuhash/src/version.h create mode 100644 make.cmd create mode 100644 nuhash.sln create mode 100644 tool/nuhash.user create mode 100644 tool/nuhash.vcxproj create mode 100644 tool/nuhash.vcxproj.filters create mode 100644 tool/res/compatibility.manifest create mode 100644 tool/res/hash.ico create mode 100644 tool/res/version.rc create mode 100644 tool/src/main.c create mode 100644 tool/src/platform.c create mode 100644 tool/src/platform.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de9d101 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*.o +*.user +/**/obj +/.vs +/bin +/out diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..955913e --- /dev/null +++ b/Makefile @@ -0,0 +1,94 @@ +STATIC ?= 0 +FLTO ?= 0 +DEBUG ?= 0 +STRIP ?= 0 + +# ---------------------------------------------------------------------------- +# Flags +# ---------------------------------------------------------------------------- + +OS_TYPE := $(shell $(CC) -dumpmachine) + +ifneq ($(TARGET),) + CFLAGS += -target $(TARGET) +endif + +ifneq ($(SYSROOT),) + CFLAGS += --sysroot=$(SYSROOT) +endif + +ifneq ($(CPU),) + CFLAGS += -m$(CPU) +endif + +CFLAGS += -std=gnu99 -Wall -pedantic -Wno-deprecated-declarations -Ilibnuhash/include -D_FILE_OFFSET_BITS=64 + +ifneq ($(DEBUG),1) + CFLAGS += -Ofast -DNDEBUG +else + CFLAGS += -Og -g +endif + +ifeq ($(FLTO),1) + CFLAGS += -flto +endif + +ifneq ($(MARCH),) + CFLAGS += -march=$(MARCH) +endif + +ifneq ($(MTUNE),) + CFLAGS += -mtune=$(MTUNE) +endif + +ifeq ($(STATIC),1) + LDFLAGS += -static +endif + +ifeq ($(STRIP),1) + LDFLAGS += -Wl,-s +endif + +ifneq ($(filter %w64-mingw32 %w64-windows-gnu,$(OS_TYPE)),) + LDFLAGS += -municode +endif + +# ---------------------------------------------------------------------------- +# Files +# ---------------------------------------------------------------------------- + +INFILES = $(patsubst %.c,%.o,$(wildcard libnuhash/src/*.c)) $(patsubst %.c,%.o,$(wildcard tool/src/*.c)) +OUTFILE = bin/nuhash +OUTPATH = $(patsubst %/,%,$(dir $(OUTFILE))) + +ifneq ($(filter %mingw32 %windows-gnu %cygwin %cygnus,$(OS_TYPE)),) + OUTFILE := $(OUTFILE).exe +endif + +ifneq ($(filter %mingw32 %windows-gnu %cygwin %cygnus,$(OS_TYPE)),) + INFILES += $(patsubst %.rc,%.o,$(wildcard tool/res/*.rc)) +endif + +# ---------------------------------------------------------------------------- +# Rules +# ---------------------------------------------------------------------------- + +.PHONY: all clean + +all: $(OUTFILE) + +$(OUTFILE): $(INFILES) | $(OUTPATH) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +$(OUTPATH): + mkdir -p $@ + +%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< + +%.o: %.rc + windres -o $@ $< + +clean: + rm -vrf $(OUTPATH) + find . \! -path '*/.*' -type f -name '*.o' -exec rm -vf {} \; diff --git a/README.md b/README.md new file mode 100644 index 0000000..101a37e --- /dev/null +++ b/README.md @@ -0,0 +1,306 @@ +![](etc/images/nuhash_logo.png) + + +Introduction +============ + +**NuHash** is a fast, portable and secure hashing library, released under the CC0 license. + +The "core" library (*libnuhash*) is written in pure **C99**, but a high-level wrapper for **C++** is also provided. + +Supported platforms include Linux, Windows, *BSD, Illumos, Haiku OS, GNU Hurd and MacOS X. + + +Getting Started +=============== + +The following example shows how to use the *libnuhash* “stream” API in C99 code: + +```c +#include +#include + +int main(int argc, char *argv[]) +{ + /* state variables */ + nuhash_t context; + uint8_t buffer[BUFSIZ], digest[NUHASH_BYTES]; + char hexstr[NUHASH_CHARS]; + + /* initialization */ + nuhash_init(&context); + + /* input data processing */ + while(more_data()) + { + const size_t len = read_data(buffer, BUFSIZ); + nuhash_update(&context, buffer, len); + } + + /* finalization */ + nuhash_final(&context, digest); + + /* print the result */ + puts(nuhash_tohex(digest, 0, hexstr)); +} +``` + +If all input data is available at once, the *libnuhash* “simple” API can be used instead: + +```c +#include +#include + +int main(int argc, char *argv[]) +{ + /* state variables */ + uint8_t digest[NUHASH_BYTES]; + char hexstr[NUHASH_CHARS]; + + /* compute hash */ + nuhash_compute(get_data(), length(), digest); + + /* print the result */ + puts(nuhash_tohex(digest, 0, hexstr)); +} +``` + + +Command-line Usage +================== + +The **`nuhash`** command-line tool provides an interface similar to [`sha256sum`](https://linux.die.net/man/1/sha256sum) and friends: + +``` +Usage: + nuhash.exe [options] [ [... ]] + +Options: + -b --binary Output digest as binary, default is hex-string. + -h --help Print the help screen and exit. + -i --ignore Ignore interrupt signals. + -l --line-mode Process the input file(s) as text, line by line. + -p --progress Print progress, while computing the hash. + -s --stop Stop on all errors, default is to keep going. + -t --self-test Run the built-in self-test. + -u --uppercase Print digest as uppercase, default is lowercase. + -v --version Print version information and exit. +``` + +### Example output: + +``` +abe9d2f9f55d62951540397875f1104d0374a7ce3ca9e21cfde6efd638b75765885f186477669b79d78d13b6d1abe0a2 foo +06573eaba880f77db3a9e6a085e3a4f8c1bf6f2997d6789bc38439d1f581e0907b21200aff43df37de27d241dc64d19e bar +e26b0338b7a3d662397cbc1ff9f81ac8885ee71f861f5897fc3a7b113ea314994f749caf7618a4bfc1ac90727ef64f94 baz +d113572666421a1e2cf6e17481f1f94b2b006e8c48504fea03e4b24d04930db4302368dc0e7bf44b104f7118bdd62f2d qux +``` + + +Application Programming Interface (API) +======================================= + +C99 API +------- + +### Constants + +The C99 API defines the following constants: + +* **`NUHASH_WORDS`:** The size of the “raw” hash value (digest), in [`uint64_t`](https://cplusplus.com/reference/cstdint/) words. + +* **`NUHASH_BYTES`:** The size of the “raw” hash value (digest), in bytes. + +* **`NUHASH_CHARS`:** The size of the hash value (digest) encoded as a null-terminated “hex” string, in characters. This is twice the size of a “raw” hash value *plus* an additional slot for the terminating `\0` character. + +### Simple + +The ***simple*** API can be used to compute a hash value in an *“all at once”* fashion. + +Use this API, if *all* input data is available at once. It can compute the hash value with as *single* function call. + +#### `nuhash_compute()` + +Compute the hash value from the given input data and return the resulting hash value (digest). + +* Syntax: + ```c + uint8_t *nuhash_compute(const uint8_t *const src, const size_t len, uint8_t *const out); + ``` + +* Parameters: + - **`src`:** Pointer to the source array containing all input data to be processed (sequence of bytes). + - **`len`:** The length of the input data, in bytes. + - **`out`:** Pointer to the destination array where the hash value is stored, **must** be `NUHASH_BYTES` in size. + +* Return value: + - This function returns the given `out` pointer. + +#### `nuhash_compute_with_key()` + +Compute the hash value from the given input data and a user-defined key; returns the hash value (digest). + +* Syntax: + ```c + uint8_t *nuhash_compute_with_key(const uint8_t *const key, const size_t key_len, + const uint8_t *const src, const size_t in_len, uint8_t *const out); + ``` + +* Parameters: + - **`key`:** Pointer to the source array containing a user-defined key (sequence of bytes). + - **`key_len`:** The length of the user-defined key, in bytes. + - **`src`:** Pointer to the source array containing all input data to be processed (sequence of bytes). + - **`in_len`:** The length of the input data, in bytes. + - **`out`:** Pointer to the destination array where the hash value is stored, **must** be `NUHASH_BYTES` in size. + +* Return value: + - This function returns the given `out` pointer. + +### Stream API + +The ***stream*** API can be used to compute a hash value in a *“step by step”* fashion. + +Use this API, if **not** all input data is available at once. The input data can be processed in chunks of arbitrary size. + +#### `nuhash_t` + +An object containing the state of an ongoing hash computation. + +The application **shall** treat this type as an *opaque* data structure; it is **not** meant to be accessed directly! + +#### `nuhash_init()` + +Initialize or reset the state for a new hash computation. + +This function is supposed to be called exactly *once* at the beginning of a new hash computation! + +* Syntax: + ```c + void nuhash_init(nuhash_t *const ctx); + ``` + +* Parameters: + - **`ctx`:** Pointer to the `nuhash_t` instance to be initialized. + +#### `nuhash_init_with_key()` + +Initialize or reset the state for a new hash computation with a user-defined key. + +This function is supposed to be called exactly *once* at the beginning of a new hash computation! + +* Syntax: + ```c + void nuhash_init_with_key(nuhash_t *const ctx, const uint8_t *const key, const size_t len); + ``` + +* Parameters: + - **`ctx`:** Pointer to the `nuhash_t` instance to be initialized. + - **`key`:** Pointer to the source array containing the user-defined key (sequence of bytes). + - **`len`:** The length of the user-defined key, in bytes. + +#### `nuhash_update()` + +Process the next chunk of input data and update the state. + +This function is supposed to be called *repeatedly* until all the input data has been processed! + +* Syntax: + ```c + void nuhash_update(nuhash_t *const ctx, const uint8_t *const src, const size_t len); + ``` + +* Parameters: + - **`ctx`:** Pointer to the `nuhash_t` instance to be updated. + - **`src`:** Pointer to the source array containing the next chunk of input data (sequence of bytes). + - **`len`:** The length of the input data, in bytes. + +#### `nuhash_final()` + +Finish the hash computation and return the resulting hash value (digest). + +This function is supposed to be called exactly *once* after all the input data has been processed! After calling this function, the `nuhash_t` instance is **invalidated**; it must be [*reset*](#nuhash_init) in order to start a new hash computation. + +* Syntax: + ```c + uint8_t *nuhash_final(nuhash_t *const ctx, uint8_t *const out); + ``` + +* Parameters: + - **`ctx`:** Pointer to the `nuhash_t` instance to be updated. + - **`out`:** Pointer to the destination array where the hash value is stored, **must** be `NUHASH_BYTES` in size. + +* Return value: + - This function returns the given `out` pointer. + +### Utilities + +The C99 API also provides a few additional utility functions that may be helpful. + +#### `nuhash_tohex()` + +Converts a “raw” hash value (digest) into a null-terminated “hex” string. + +* Syntax: + ```c + char *nuhash_tohex(const uint8_t *const hash, const int upper, char *const out); + ``` + +* Parameters: + - **`hash`:** Pointer to the source array containing the “raw” hash value, **must** be `NUHASH_BYTES` in size. + - **`upper`:** If non-zero, generate upper-case characters; otherwise generate lower-case characters. + - **`out`:** Pointer to the destination array where the “hex” string is stored, **must** be `NUHASH_CHARS` in size. + +* Return value: + - This function returns the given `out` pointer. + +#### `nuhash_version()` + +Returns the version number and the build date of the current *libnuhash* library. + +* Syntax: + ```c + char *nuhash_version(uint16_t version[3U], char *const build); + ``` + +* Parameters: + - **`version`:** Pointer to the destination array where the *major*, *minor* and *patch* version are stored. + - **`build`:** Pointer to the destination array where the build date is stored, **must** be 12 characters in size. + +* Return value: + - This function returns the given `build` pointer. + +### Thread-safety + +All functions provided by ***libnuhash*** are *thread-safe* and *reentrant*, in the sense that there is **no** implicitly shared “global” state; the functions operate strictly on the given input parameters. Specifically, the functions of the “stream” API maintain **all** state of the hash computation within the given `nuhash_t` instance. This means that these functions are *thread-safe* and *reentrant* as long as each “concurrent” invocation uses its own separate `nuhash_t` instance; **no** synchronization is required in that case. However, *libnuhash* makes **no** attempt to coordinate the access to the *same* `nuhash_t` instance between concurrent threads. If the *same* `nuhash_t` instance needs to be accessed by *multiple* concurrent threads (which generally is **not** advised), then the application is responsible for *serializing* all access to that “shared” instance, e.g. by using a [*mutex*](https://pubs.opengroup.org/onlinepubs/009604499/functions/pthread_mutex_lock.html) lock! Reentrancy can **not** be achieved with a single “shared” `nuhash_t`. + + + +Source Code +=========== + +The source code is available from these [Git](https://git-scm.com/) mirrors: + +* `git clone https://github.com/lordmulder/NuHash.git` ([Browse](https://github.com/lordmulder/NuHash)) +* `git clone https://bitbucket.org/muldersoft/nuhash.git` ([Browse](https://bitbucket.org/muldersoft/nuhash/)) +* `git clone https://gitlab.com/lord_mulder/nuhash.git` ([Browse](https://gitlab.com/lord_mulder/nuhash)) +* `git clone https://repo.or.cz/nuhash.git` ([Browse](https://repo.or.cz/nuhash.git)) +* `git clone https://punkindrublic.mooo.com:3000/Muldersoft/NuHash.git` ([Browse](https://punkindrublic.mooo.com:3000/Muldersoft/NuHash)) + + +License +======= + +This work has been released under the **CC0 1.0 Universal** license. + +For details, please refer to: + + +Acknowledgment +-------------- + +Licenses for third-party components used by NuHash: + +* [**Hash icons**](https://www.flaticon.com/free-icons/hash) + Created by Vectors Market – Flaticon. Free for personal and commercial use with attribution. + +▮ diff --git a/etc/build/cygwin/mk-release.sh b/etc/build/cygwin/mk-release.sh new file mode 100755 index 0000000..779d482 --- /dev/null +++ b/etc/build/cygwin/mk-release.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../.." + +mk_nuhash() { + local command="make -B CC=${2} MARCH=${3} MTUNE=${4} STATIC=1 STRIP=1" + $BASH -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [[ "$(uname -s)" != "CYGWIN_NT"* ]]; then + echo "This script is supposed to run on the Cygwin platform !!!" + exit 1 +fi + +[[ "${1}" == "--no-remove" ]] || rm -vrf "${PWD}/out" && mkdir -vp "${PWD}/out" +$BASH -x -c "make clean" + +case "$(uname -m)" in + x86_64) + mk_nuhash "x86_64" "clang" "x86-64" "znver3" + ;; + i686) + mk_nuhash "i686" "gcc" "pentiumpro" "generic" + ;; + *) + echo "Unknown host CPU type !!!" + exit 1 +esac + +cp -vf "$(which cygwin1.dll)" "${PWD}/out" + +echo "Build completed successfully." diff --git a/etc/build/dragonfly/mk-release.sh b/etc/build/dragonfly/mk-release.sh new file mode 100755 index 0000000..fce2232 --- /dev/null +++ b/etc/build/dragonfly/mk-release.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# pkg install llvm14 +set -e +cd -- "$(dirname -- "${0}")/../../.." + +mk_nuhash() { + local command="gmake -B CC=clang14 STATIC=1 STRIP=1 ${2}" + $SHELL -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [ "$(uname -sm)" != "DragonFly x86_64" ]; then + echo "This script is supposed to run on the DragonFly (x86_64) platform !!!" + exit 1 +fi + +rm -rf "${PWD}/out" && mkdir -p "${PWD}/out" +$SHELL -x -c "gmake clean" + +mk_nuhash "x86_64" "MARCH=x86-64 MTUNE=znver3" + +printf "\033[1;32m\nBuild completed successfully.\033[0m\n\n" diff --git a/etc/build/freebsd/mk-release.sh b/etc/build/freebsd/mk-release.sh new file mode 100755 index 0000000..a6f822c --- /dev/null +++ b/etc/build/freebsd/mk-release.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# pkg install {armv7,aarch64,powerpc,powerpc64,powerpc64le,riscv64}-freebsd-sysroot +set -e +cd -- "$(dirname -- "${0}")/../../.." + +mk_nuhash1() { + local command="gmake -B CPU=${1} STATIC=1 STRIP=1 FLTO=1 ${3}" + $SHELL -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${2}" +} + +mk_nuhash2() { + local command="gmake -B TARGET=${1}-unknown-freebsd SYSROOT=/usr/local/freebsd-sysroot/${1} STATIC=1 STRIP=1" + $SHELL -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [ "$(uname -sm)" != "FreeBSD amd64" ]; then + echo "This script is supposed to run on the FreeBSD (amd64) platform !!!" + exit 1 +fi + +rm -rf "${PWD}/out" && mkdir -p "${PWD}/out" +$SHELL -x -c "gmake clean" + +mk_nuhash1 32 "i686" "MARCH=pentiumpro MTUNE=generic" +mk_nuhash1 64 "x86_64" "MARCH=x86-64 MTUNE=znver3" +mk_nuhash2 "armv7" +mk_nuhash2 "aarch64" +mk_nuhash2 "powerpc" +mk_nuhash2 "powerpc64" +mk_nuhash2 "powerpc64le" +mk_nuhash2 "riscv64" + +printf "\033[1;32m\nBuild completed successfully.\033[0m\n\n" diff --git a/etc/build/gnuhurd/mk-release.sh b/etc/build/gnuhurd/mk-release.sh new file mode 100755 index 0000000..584c346 --- /dev/null +++ b/etc/build/gnuhurd/mk-release.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../.." + +function mk_nuhash() { + local command="make -B CC=gcc STATIC=1 STRIP=1 FLTO=1" + $BASH -x -c "${command}${2:+ ${2}}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [[ "$(uname -sm)" != "GNU i686-AT386" ]]; then + echo "This script is supposed to run on the GNU Hurd (i686) platform !!!" + exit 1 +fi + +rm -rf "${PWD}/out" && mkdir -p "${PWD}/out" +$BASH -x -c "make clean" + +mk_nuhash "i686" "MARCH=pentiumpro MTUNE=generic" + +printf "\033[1;32m\nBuild completed successfully.\033[0m\n\n" diff --git a/etc/build/haiku/mk-release.sh b/etc/build/haiku/mk-release.sh new file mode 100755 index 0000000..2e838b5 --- /dev/null +++ b/etc/build/haiku/mk-release.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# pkgman install llvm12_clang +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../.." + +mk_nuhash() { + local command="make -B CC=${2} MARCH=${3} MTUNE=${4} STATIC=1 STRIP=1" + $BASH -x -c "${command}" + mv -vf "bin/nuhash" "out/nuhash-${1}" +} + +if [ "$(uname)" != "Haiku" ]; then + echo "This script is supposed to run on the Haiku platform !!!" + exit 1 +fi + +rm -rf "out" && mkdir -p "out" +$BASH -x -c "make clean" + +case "${BE_HOST_CPU}" in + x86_64) + mk_nuhash "x86_64" "clang-12" "x86-64" "znver3" + ;; + x86) + mk_nuhash "i686" "gcc-x86" "pentiumpro" "generic" + ;; + *) + echo "Unknown host CPU type !!!" + exit 1 +esac + +echo "Build completed successfully." diff --git a/etc/build/linux/mk-libmusl.sh b/etc/build/linux/mk-libmusl.sh new file mode 100755 index 0000000..fd87329 --- /dev/null +++ b/etc/build/linux/mk-libmusl.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# sudo apt install clang crossbuild-essential-{i386,armel,armhf,arm64,mips,mipsel,mips64,mips64el,mips64r6,mips64r6el,s390x,riscv64} +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")" + +function mk_musl() { + for cc in gcc clang; do + local outdir="/usr/local/musl/${1}-${cc}" + local build="${PWD}/musl-build" + rm -rf "${build}" && mkdir -p "${build}" + tar -xvf "${PWD}/musl-latest.tar.gz" --strip-components=1 -C "${build}" + pushd "${build}" + local optdirs="$(find './src' -mindepth 1 -maxdepth 1 -type d -printf '%f,' | sed 's/,$//g')" + if [ "${cc}" == "clang" ]; then + CC="${cc} --target=${2}" ./configure --enable-optimize="${optdirs}" --disable-shared --enable-wrapper=${cc} --prefix="${outdir}" --host="${2}" + else + CC="${2}-${cc}" ./configure --enable-optimize="${optdirs}" --disable-shared --enable-wrapper=${cc} --prefix="${outdir}" --host="${2}" + fi + make + sudo rm -rf "${outdir}" && sudo make install + popd + done +} + +if [[ "$(uname -sm)" != "Linux x86_64" ]]; then + echo "This script is supposed to run on the Linux (x86_64) platform !!!" + exit 1 +fi + +if ! which gcc clang > /dev/null; then + echo "Please make sure that \"gcc\" and \"clang\" are installed !!!" + exit 1 +fi + +rm -f "${PWD}/musl-latest.tar.gz" +curl -vkf -o "${PWD}/musl-latest.tar.gz" "https://musl.libc.org/releases/musl-latest.tar.gz" + +mk_musl x86_64 x86_64-linux-gnu +mk_musl i686 i686-linux-gnu +mk_musl armel arm-linux-gnueabi +mk_musl armhf arm-linux-gnueabihf +mk_musl arm64 aarch64-linux-gnu +mk_musl mips mips-linux-gnu +mk_musl mipsel mipsel-linux-gnu +mk_musl mips64 mips64-linux-gnuabi64 +mk_musl mips64el mips64el-linux-gnuabi64 +mk_musl mips64r6 mipsisa64r6-linux-gnuabi64 +mk_musl mips64r6el mipsisa64r6el-linux-gnuabi64 +mk_musl s390x s390x-linux-gnu +mk_musl riscv64 riscv64-linux-gnu + +rm -rvf "${PWD}/musl-build" diff --git a/etc/build/linux/mk-release.sh b/etc/build/linux/mk-release.sh new file mode 100755 index 0000000..7a53fdf --- /dev/null +++ b/etc/build/linux/mk-release.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# See "etc/utils/linux/mk-libmusl.sh" in order to build musl libc! +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../.." + +function mk_nuhash() { + local command="make -B CC=/usr/local/musl/${1}-${3:-clang}/bin/musl-${3:-clang} STATIC=1 STRIP=1 FLTO=1" + $BASH -x -c "${command}${2:+ ${2}}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [[ "$(uname -sm)" != "Linux x86_64" ]]; then + echo "This script is supposed to run on the Linux (x86_64) platform !!!" + exit 1 +fi + +rm -vrf "${PWD}/out" && mkdir -vp "${PWD}/out" +$BASH -x -c "make clean" + +mk_nuhash "x86_64" "MARCH=x86-64 MTUNE=znver3" +mk_nuhash "i686" "MARCH=pentiumpro MTUNE=generic" +mk_nuhash "armel" +mk_nuhash "armhf" +mk_nuhash "arm64" +mk_nuhash "mips" +mk_nuhash "mipsel" +mk_nuhash "mips64" "" "gcc" +mk_nuhash "mips64el" "" "gcc" +mk_nuhash "mips64r6" "" "gcc" +mk_nuhash "mips64r6el" "" "gcc" +mk_nuhash "s390x" +mk_nuhash "riscv64" + +$BASH -x -c "pandoc --standalone --embed-resources --css \"${PWD}/etc/style/gh-pandoc.min.css\" --metadata title=\"NuHash README\" -o \"${PWD}/out/README.html\" \"${PWD}/README.md\"" + +printf "\033[1;32m\nBuild completed successfully.\033[0m\n\n" diff --git a/etc/build/macos/hdiutil.txt b/etc/build/macos/hdiutil.txt new file mode 100644 index 0000000..4056cb5 --- /dev/null +++ b/etc/build/macos/hdiutil.txt @@ -0,0 +1 @@ +sudo hdiutil create archive.dmg -ov -volname "NuHash" -fs HFS+ -srcfolder out diff --git a/etc/build/macos/mk-release.sh b/etc/build/macos/mk-release.sh new file mode 100755 index 0000000..3e59824 --- /dev/null +++ b/etc/build/macos/mk-release.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -e +cd -- "$(dirname -- "${0}")/../../.." + +mk_nuhash() { + local command="make -B TARGET=${1}-apple-darwin FLTO=1" + $SHELL -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [ "$(uname)" != "Darwin" ]; then + echo "This script is supposed to run on the MacOS platform !!!" + exit 1 +fi + +rm -rf "${PWD}/out" && mkdir -p "${PWD}/out" +$SHELL -x -c "make clean" + +mk_nuhash "x86_64" +mk_nuhash "aarch64" + +find "${PWD}/out" -type f -name 'nuhash-*' -exec $SHELL -x -c "strip \"{}\"" \; + +printf "\033[1;32m\nBuild completed successfully.\033[0m\n\n" diff --git a/etc/build/mingw/mk-clang.cmd b/etc/build/mingw/mk-clang.cmd new file mode 100644 index 0000000..01f6a28 --- /dev/null +++ b/etc/build/mingw/mk-clang.cmd @@ -0,0 +1,27 @@ +@echo off +cd /d "%~dp0" + +if "%MSYS2_DIR%"=="" ( + set "MSYS2_DIR=C:\msys64" +) + +if not exist "%MSYS2_DIR%\msys2_shell.cmd" ( + echo MSYS2 shell not found. Please check MSYS2_DIR and try again! + pause + goto:eof +) + +if exist "%~dp0..\..\..\out" ( + rmdir /S /Q "%~dp0..\..\..\out" +) + +for %%m in (32,64) do ( + echo ======================================================================== + echo Clang%%m + echo ======================================================================== + echo. + call "%MSYS2_DIR%\msys2_shell.cmd" -clang%%m -no-start -defterm -where "%~dp0" -c "./mk-release.sh --no-remove" + echo. +) + +pause diff --git a/etc/build/mingw/mk-gcc.cmd b/etc/build/mingw/mk-gcc.cmd new file mode 100644 index 0000000..8eb8901 --- /dev/null +++ b/etc/build/mingw/mk-gcc.cmd @@ -0,0 +1,27 @@ +@echo off +cd /d "%~dp0" + +if "%MSYS2_DIR%"=="" ( + set "MSYS2_DIR=C:\msys64" +) + +if not exist "%MSYS2_DIR%\msys2_shell.cmd" ( + echo MSYS2 shell not found. Please check MSYS2_DIR and try again! + pause + goto:eof +) + +if exist "%~dp0..\..\..\out" ( + rmdir /S /Q "%~dp0..\..\..\out" +) + +for %%m in (32,64) do ( + echo ======================================================================== + echo MinGW%%m + echo ======================================================================== + echo. + call "%MSYS2_DIR%\msys2_shell.cmd" -mingw%%m -no-start -defterm -where "%~dp0" -c "./mk-release.sh --no-remove" + echo. +) + +pause diff --git a/etc/build/mingw/mk-release.sh b/etc/build/mingw/mk-release.sh new file mode 100755 index 0000000..2162ac8 --- /dev/null +++ b/etc/build/mingw/mk-release.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -e +cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../../.." + +mk_nuhash() { + local command="make -B CC=${2} MARCH=${3} MTUNE=${4} STATIC=1 STRIP=1 FLTO=1" + $BASH -x -c "${command}" + mv -vf "${PWD}/bin/nuhash" "${PWD}/out/nuhash-${1}" +} + +if [[ "$(uname -so)" != "MINGW"*" Msys" ]]; then + echo "This script is supposed to run on the Mingw-w64 platform !!!" + exit 1 +fi + +[[ "${1}" == "--no-remove" ]] || rm -vrf "${PWD}/out" && mkdir -vp "${PWD}/out" +$BASH -x -c "make clean" + +case "$MSYSTEM" in + MINGW64) + mk_nuhash "x86_64" "gcc" "x86-64" "znver3" + ;; + MINGW32) + mk_nuhash "i686" "gcc" "pentiumpro" "generic" + ;; + CLANG64) + mk_nuhash "x86_64" "clang" "x86-64" "znver3" + ;; + CLANG32) + mk_nuhash "i686" "clang" "pentiumpro" "generic" + ;; + *) + echo "Unknown host CPU type !!!" + exit 1 +esac + +echo "Build completed successfully." diff --git a/etc/build/netbsd/mk-release.sh b/etc/build/netbsd/mk-release.sh new file mode 100755 index 0000000..80194e8 --- /dev/null +++ b/etc/build/netbsd/mk-release.sh @@ -0,0 +1,22 @@ +#!/bin/ksh +set -e +cd -- "$(dirname -- "${0}")/../../.." + +mk_nuhash() { + local command="gmake -B CC=clang CPU=${1} MARCH=${3} MTUNE=${4} STATIC=1 STRIP=1" + $SHELL -x -c "${command}" + mv -vf "bin/nuhash" "out/nuhash-${2}" +} + +if [ "$(uname)" != "NetBSD" ]; then + echo "This script is supposed to run on the OpenBSD platform !!!" + exit 1 +fi + +rm -rf "out" && mkdir -p "out" +$SHELL -x -c "gmake clean" + +mk_nuhash 32 "i686" "pentiumpro" "generic" +mk_nuhash 64 "x86_64" "x86-64" "znver3" + +echo "Build completed successfully." diff --git a/etc/build/openbsd/mk-release.sh b/etc/build/openbsd/mk-release.sh new file mode 100755 index 0000000..d1696d3 --- /dev/null +++ b/etc/build/openbsd/mk-release.sh @@ -0,0 +1,31 @@ +#!/bin/ksh +set -e +cd -- "$(dirname -- "${0}")/../../.." + +mk_nuhash() { + local command="gmake -B MARCH=${2} MTUNE=${3} STATIC=1 STRIP=1 FLTO=1" + $SHELL -x -c "${command}" + mv -vf "bin/nuhash" "out/nuhash-${1}" +} + +if [ "$(uname)" != "OpenBSD" ]; then + echo "This script is supposed to run on the OpenBSD platform !!!" + exit 1 +fi + +rm -rf "out" && mkdir -p "out" +$SHELL -x -c "gmake clean" + +case "$(arch -s)" in + amd64) + mk_nuhash "x86_64" "x86-64" "znver3" + ;; + i386) + mk_nuhash "i686" "pentiumpro" "generic" + ;; + *) + echo "Unknown host CPU type !!!" + exit 1 +esac + +echo "Build completed successfully." diff --git a/etc/images/nuhash_logo.png b/etc/images/nuhash_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d504deda0d0afd743f75aaae32d36babd89f07ab GIT binary patch literal 218512 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

rMDmEP0-!oAac@mXDe+SYALif{DxoCkzu}prd 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

bGImg&MB`M3woMTU_RPAqA`b+^W!Y{$s_ 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%0DFenyL;2S zx813x+nu_hA9ufZ(`nSm*=zyE(2HM4y9hnjO=_siS!nEF!No6rhI2n0T>L^9r8(=5 zBWhzup)d(mh4$> zHFH9MHQw1E-uLDVk&|z$)W^Wzib8T?IE%jGqIO+<*3T^lL+k_QzJ3a80>>E$t;XEJWoM8jO7 zZGJK#@g3!k{Il=dzxGLThE9LByw&23SDLyWx2gam4w)8|;0XOJ*?JXMlglm;Ucxwe zr(?O31v74|l7!B3y2~%3rX1fdlxpR35<~9P15qSBp`RoJS~y?SsQ^@YKN1M7@6jQ9hk43A`Fkw3P3}dVJ(XTk{*&`ZpCwz3~ zAVoXVg%#~kEZ>9I&>a>+dB1B#EHl3P=_nxS#Qqg6s^HFmPGhK~xMoUooV}|3H@j#W zXQD z^k_PK4*=Qhp>?9ERhEjv$d?15mgrjMMNyyqo)J%D`$WB-Eicg0Q8m+rNx2XrT(6`{ zhVazEC-8A{#`rjAQCNO6Ca@KA^b?lB0_zSI$QLbPd>%Gn^!12NWmc)rj$lKx>2JN5S7zyjlbY*kdmZ8qStkm zOgh0W@!Y58l%kKPMfTQ`IsZ)(2uSqhOT+l{@OO>bmj_dep#>74V>xU-x#)n4Rq?&w z82|yC^?0x5k`~28-~qRYwRZ%x&kCm&rPGV75q_r`vGl~yZpA}X!D3X2l0Y_N)di6; zwfLcBzzWpyV(1}WrRl{EY#M;n(==g6%4B_%H>sQZkq6?tvwVSSRLqG_f08xga>u;F zZ~S;#{BZ^A!XaIX0gH@B!@tA!?U1S=I!A${*Oz-ZQN(lsgLqrFYuP<@^Ei@4KLRS) zV|NU#mpd(0X&roJ)5u38FOj(nlgxMDg-);M{f~zw+>~TwD8Cuj5QB5#x~l@B@WIBj z_==nEq>oPkS$o4D7XfSfw=WtZkJ+jK1W-AcnjY+li$>JIIYed)`-i^=7($QCYJ9Pi zi#uUJvKVyF$%io@%Z+JvqFiS4x zv)kNuf&snXLYU27X71HfXaB(`HmjZsqj%$uEBNTHO$x_^S`L@VdcRSu`<}|Gik5K zKX4vMk%4TGVU_A3kfnr%Rm8y)OQXVLQL?0PQj?i(~B?a^ux5JiJjbod^qfWyup{Y{D1sltl^b z!-;|&^12#Q>g04(z>$V zz&blc@R1?xXpaKfk37i%5(y}@NFIFKtCt$i*MkP7C){}8AvdITAC)z(TZ9Y zoC~v})Hkgm_rrQWEGr|J_v3DKibR8v`#H6!y{0$4d-Hx!{BqCzu-=a;c*y9-$o(M4 z&$Jn{Fvg)9u^Vn*uGu5g?TdpcOYXTJe#1p0>lhiPcTmO^f&h>aD2D+(coU*cfkah_ z{9=cf(Y#_HGBYuyD4ekJZj6^ONNMnqiTF4VB!r29aI!c9vK!5evQ@X&AGncOwezZlw-$ro)1L76 z;x^%`2Hj_BR^nU;{hZ9?D(`#fjq>?1y2BU@ar3ixd%P=`h@92iP`0Vw`@gV07~7-D z47MUV1_3qFCpfxwDq$r#GQrKgs?i_eTlELe_|hp>^epGjSHvLyVWebws39ZqTBa+tJG!iY5P@Jw*Pt8s3z?JnM-QrXOj=|dhDPJOp@hU-3V>jh3c zDtYp;BLA^XZ6aSk%9P?@>--|{sGVEX%qh0r5TLlixWi$8>;izkf?BSkeB8Sl(tc0k z$fSiXapBCV`;>i^H?>GMvfX;o>hP@$b#kT&&7OwQkKB%Y-waqeg;ZY*@sa!S9sd2{ z6Ya#1wL9o>{p2R#0QLR)7+}!OSMlQCg+;wzHOqaGMRY7c?;c{I8>{dN)PE*DUOv7N zzFke+vZdUP&~UeD7iTBF6f!`a$L%8qN%lu|Md)4vg(@X&6^A51vl;Pku?W4*u zi7;|GOXb~w<5j6N&n~{YbMUUSGpl&I^k3A7@>PI)@Jf7hXeW6uIE5C8QWYW^ zIqmmXR>`-18Z=YAN6 z7)@GkL?w^hPp=8PJv(Zip@ zC&K6pV+@3o#qIHucI{yJqG+bL0Pjn;k#=0W)D#xsR=l*lHJBITM^*9NjlkWTzHW)+ zYUG5yVn}n5!!7p{=)S6o`gspXDXOd$a-s?O!tNU)-gYA-JU-MC8y*rJZoTMmPz!6A z#T)dPDc`?tznr;$q0IVxJGdgxxZFg;iexCs!#Xs%6b_?7&sS)i6Ji+j#D`9_9?TqK zH>e)u$!xP=`Bi7|cA+LreZMBUuI}5l#qqYllR!~t9?V&Jdcr%!El!15M|pr$Hy5x# zyvohjuydgh=pWpSyxoE^O>w^%KL0E!Rpv=2{%7M_)YH*_eEahCl=sSDkwj@ZhhxcT z@VW>qpmI;5aB&GDsA!)@)W~Xmop>Yy{_iQ1EnuCx{^zypnr2?zf*Hg+!K-p(h&C;V zE!97-3*3A$XX|Bjz4mNWNLA!CBLq$$bcLR#3cH>sji{4fR=OAKi>ZSvO(U@^8i3E8(@075!-=%$A44@4CvX#GK>En zKtI0Y+qcTt9B>$5g=po}&m@0JT0s`;uJ7B^c;*iI$FIc6`_#nuzY{sHMYTD0``cy5 z^ioU0im`PRYERiIG|Q*c_aT8t%awRrFu6(VowxH?>SPjFtfaDlmJ}tDj#Q7Mn;yKI zu1r>Ixhy1a!6Q>q7H&8%R7;m;#WuGt6v+MIMV{2yz*4bB#n}$uN3UqbeCfmD?cwpZ zM5|ingBmZ=glxuA@U&fc+&Z~_1ZEk9C{rN{p`Sus49c_V^ToLzuBfojmj~~Mb3eymb0IvH zn)$)dVrH`oLo~?b`cU{1JT%|V-RYg3N%`ZGd5&PN7B`5p`cX)9I zh?7MIWI^{lD?}T-k(J{bcnBooZ;d>VLP6Oe52Fmu12G1@n0;8u1 zad5V>{`>2N&4u11G!OU^I1KUyn~1pDayjV>_jYPP1HFAXOV@z@UyXQ3XNaETXe4m? zkh#yi`nM{?n5Hkz+wSZCTL5U|rM7W#0G-U+SU!rFNo|J0ze(HpRWlF`JCBi!E{7xN zk%?z_buW%5r+^K~IZ;JfSvx0$1{tl_!VkW(9E&K3qs_3vbSGNxgSl~r2RXYp{lAV zlPwVF!;#OXwdz!S*5X3|K;1@>=%VEPpwMqB_ff-2Qt?oFL}qQhoZa!5Icim;U78T7 z;}YUTxZf(6xeu6#P1BNl*{U;Qa!= zfui^scKZTphkL$~;bXmvHV!HeWuqk0yy3MCBAUU8cFzN`Q3j7IW+R)g#DB>&6#t_) zAIR(r^B|@ec_40q^X?17GxGE)9y-y!$=ZxknJ!KKw7hOZk-K6)n4VfUK_=Wr7RN|+ zTnJ0Kq-6fMRAHXLCHVay{uA^0!sBAc<U_CdQ!(yeX#p#@H}-tZM}>{LpoxFFBYWoku*m)&id$5eEd(T)l#OltN44=|nbEvB&WQLQjWWmY)x7pNt;`J%m7sj{q`E0(sS#20 z19I$IF%hL<^@EuwM5(-DViWN{7sby!tbO6ZcPmNhXY@N|$)D@{BY1vnze+$46F|Nm z-$azkF8;3~)uZU{nj*2PMe6=@ ziC?mhSxstX7ZlU|LLYtsskQC=dtzUxAlly@3oDfv&O-gOu49PBmGR>{*o(=^R%;}? zHGNn^WTbv6nB&}=Sp%)izjZSstXpg3M zybruCnBK#@ALDO-7+T8#0Q%iG<1kkGPuXW+i3Ok4_P{`R3lFHld?3Y#Q3iq&R<3>; zEMLvFJ=Gm)(J3%P@dh@oc_7_#RnZydib0D;Hi-X_VG!dtnSW3cs06l2sLpPepT;z% zX+D9r^~G{u%b)Sz;htdsDbwAT4bI%po)AxRy>wHfS}bm_Z9mz}%5~o8haHIA-C)fc zv!~^rqEqma?GaO0IojJm15o3a9)KFf-bS%0eEGx{Pve1sXxmaE&~~t18_(xe;^E@~ znbfYIZN{?W;?J#g7cead^Gh=nHa9+sq%m4=2m`78zBwk+q!CNIQkVXJ4~Q@=K02~z z2^{AzeVV~Fs?&diAy2n?dMhBXrxJUO)xt!Z;^KcI@?L$~{McP|Bu!g%#OM+GW>8hU zfT+HTI_AA9XEUT(S0S$m4-x;D5fw|eblWd;&Bf4H+&Z})j+RM3#YtltQ%+Z&a{M{Z zo6iLPN|c|N0nI1B)kw0!9onb*vGnP7*2^#cS7ZH2@%`>4BdVp=d)zAZT7@b0=GxA< zpA_j%Y`G0zx8im%0H81L#EOrqiT}Zvd2mpU2xoCT#L;iUpN8DP$wi=-3igs~Fl0MT ziNb0O@Q#X;+**9 zoGJBbZV4xUYza_Uq|-8{{&ixw?bdxXVN+06Y=Fy+~xIYUd&2jDQ<-MJUr zXm|Jac=rKXG$-%Jp;fBzw)OSSyH){x`NpET{Saa3Fo2me?P8ti`46<{&W~{hkv>oC)L9<*w;Iy9ru5U z#Ghv4pNjbw?1ARGwotgztawPRvsMuAdgp;S1H>@Ms~kp#!7Z0bzD48M?N>#UBI3UUTuYXp78~Jf7@s!Go<>g;wpSBrXGXErD*}T-{x!iJ zY=+;umY4O8J&_jVQWzZVWihL^F=ZaxLP>j96v#Q1%)n^;w+Ok%!v%V+{y-t`r& zposi5x~YoZ?d1ddJfMBe!B%uOVU_i- z5XHe~cpG}uXSWkM(*Bpk4*|WUXT%?umdWMHl=sR4xJx%lth%Y}Rr|dSI9C^!w6&<* z?Zu&?+ly87FvOE=ch^_~R0!90chk8+4>R|}E$-a&rRRQ3b1pr|V%$N{hjTwPyu4lp zY7L&}V_>AgMyH(nq0qSJi;Yf`==svok0*!QYN7^83f06;-^qInXkzezIPXGILSuIt z-#wC%mrz`EqV+B34&c`7Pdx0vT zY?5ue_Ym~!0UYxnPQ!-I=FN!fMh+z=Z#$C%{eC&|0i-S{f=QW(0rAFUj4FG@! zG|0Q*+Vg)3r}yKIdG{rk38XKNw)flSSictTyd24`r(3%D$^`h$6R_CYg{AFZQ7<$t zN%1LI&kah9`}TEwB8r&72kTFEy7eq?YIT|fJy_3SUSVKrdP7ooDu%EsB}{DC2O`WH z8=LRuvzu^A`PZ@KlKA=fCtZrAELwc*_kZCN7k^$ICyno?5c?vlcFh3*#KsF_+7^0w z<>5Cwuak`~!217QY`@+50WUFT)9WOgDW$@`k>f z;r+kfq`+IlxZbpIOw*_F>Zfy0i{k&2vv0_Y_)Jl;S)yW3Z@D0@J`zt~KC>mv`?PYZ z3bnd^{;TdY#eiOJ4y9!GRk)Mv{-HyHL&LR0M&U)gqxso?79=`AUH>nLy!@#LRc<`_ z_QpeuiqYSaO(|?fkOXQrkf0}~E(}8a9B5oPh=R>>(h(LKnU(K6{ku@ce{W;_Jg(ZA z2c;jsper8gnE7Ej{LuPN*g@R8vE=!~?Z1d#b=2;Kh|EU;lK}Xu01p zqY3VB72hHU^=z=I_6~+VdhoK=6fdxb?w;E|)S@mPSqsa#foQPUc1iTA^zRct=O2kB zr^M|i23D5&?8FTd>ZA;T_@NymhZXEBs;ANqHw$}@L+X$UTR>A~&p zj4<@vk7n20+uaS}9|!Mn*^Bm19fJnrC5@n|0N)(2WKmbgKBnu3mo<*3(9Y=r0aMAkO8 z%ive4dV!55V%NyQ80DwS$zp%a2q14d=na=b^q%0h{oGR}2dOgxvZFSWwHe z5awA9)AVc*XMoJm+@5hShp7tbp~=oz{Ja}WQA8~wM4Pkd1k$SFo95>CO)B09S5t)0 zy*OOnlxw|*+I;*?sgS{+;xqh9;h_qqTla^AEuGLT!QsdlpV7IO^0vddRdAPtfd<_;RNGsl{{$|ChIp4#wcrl`0}JFa3% zd$(3TT8NY3mpFaoI==5rEKx!n?~MBs`#YvL!gsIKdkyyQtm}*~E=wDZ8>>3S*uVtZ zfC0()Os*NiM258DvwGsqEdP#iRqymYl*m(sJBVFtPxyI6wUp8u2iuAHEig_nEO891 z=ft{#jR$Vx<%;td&OQ=@Yl&bZCQ+%RpHWTbn)D6>` zb^7Q2#{O$W{%oRYNl_)A$e!kZJnK_GHnHgAm*4Kbh$G<*#`OSX$h#QQlo4`3=9ad* z-k`^LhO<_3YVSxAi-}ZJZ8vHs88t3@BZwBTiw~#vFH4jxsR9~iAuD)vPDRKTNYl*Q z>wmK${{#@Wu^XOYS4W`{o~{FiD=U2R72I@I6wM;4kS0#y6(Yk9#nf;p0at!Bgd#p^OQAsQBfPTCux86GQ5dt39ql z&xXy#)@e-~y3NHV>^n5qm$|;PtIroxo;h4|KNelgs)uKIU z(Z&VPb3z>K8pah$vpY;G2Ca7rZ7J4mvs=g6)Yc<*VDNoAydL(4%sC1G#7cLx;;fh_ zce6L{Wld>M9TqGr2QV9G&#g0X8=%jkF^!@V0R_mubPQa$Eg{v0)xDfE%@e3hsp@~ARycCpe(}bg z7jNEwfm`G^i;v?-z8X*ghxftco!H+vsXmT2rIh6?*K?IIR#{`$UjZw4=P&o*lg|K% zt;%H8NquayjA~L&1Q^i?;^qr+^SQYGOk92JYl+{&bNRbCoH_k({- z2ljqVQLj*dC9sTlUKG3eyx5}`I43h8HEB;^4D{3IH2{4&(XuL0-!SY=j+8fRhP%Ct zVi8wSU_50A;CT6)nn@i#D37w2x5cS9`f(Tg;ShSeJBJ2pjp6e}!5;67ube$!e%jrc z_haUM^ssvKhB$Nb!?0RT5JT%c#oeUBNsBi8!tgp*zO!+loClI!`+s`SqR}13&_}05 z1Nu1CqB#S^Fo;04%;@Z%W2gja$(O^*_g?1)gA`MK$f+KtiU`%Agb2dOn&X3se=_dD zApY`$>X>!LqPyY11Y{;4dkK=9d>%F$3J^S_g8Slq4>UQBiJb zW__~gFvuu}W%htU?&3{P%$$(9?@c^Ol{w4f~Y7 zWpS(eWcohC$Z-2Njq%apdg%}!Cl{f1Tfh`?HqFjlk0+Oj>3KDFTjtX(>FDuxf8vXuO=zW%Txj^X{u zJNOjgJfsh!1H%Bu^S9S@;2vXMmiXjy`H3K2$!o~MomX-83)|YMEpW7>cHI^LK)%?r zw_b|tQI%4L=6D*N`Bgm5C)8^U(8J0-KlRAW8 zpV8!x4R6JCZxv^8V^@^ab9Y#UquMtQO~MXzB)z7ei39IEB2l}y^}^u-nQmlF9hV`( zXBzU-6S41>*mM1MLV`IqpxA3qTs^Kfzz3IN&n#-i^S#VJIhO<&|5-4ts&c{Ru+WbJ zhtF=rPonbw8NIh)=5qxzLBqmVbt&iL=r?aaFBtWD=Gqg+6=%E!v0$KcTDow?MWZR- zp`ovKJ-by%Wph>76{0ZWV=w(9t~~m{Qs&i#N7u8ZzLzn@bsPyiOD#=0w{{@KCQtS-<8n*=@G%zL}0DRNT7l{vkr4ely% zbWhaOpFgYqGC}!p<}oZI#j!i0ei2bVr%&i}{W(q-M$Xf_QTrUW8a+#fQvp2&$FpEq zb(}PY&bwze#%Zkj&N^PVU^B1+GkzHB7$S$|HClfh2Lk6HFIEl$n!l3{b9$zY4qE|6m8a-9x+Ak)J>Upi~q%>6L*;av|K zR}NcVR!zf~o>0cEqs)u1= zx6`NGc|8itUzz)QP1YO_Uk$964--KcK^YVx58{yK53L%ZXJVQT++-MD-dWqpkP_j~ zWkh&wZFl}$*?03NPsw;3|3P(p?xWDqYZ+7R`uhnK;Yt@Z^4)o#G_ z!~6nzRIsCVf2;hfu#i__*646-AsD6CA>A93SPF7;HpkJO*C5gKZnfN@0^bgs2vOxaaw|vH}v&NzkDDree#TZcp)6P zXiOpnI6qIGo%x)6@Dwj%vp$W<{5Ur2lbCET;{HF*t^}y6GfUrlA0#u~HC0wuO@fz zCdPDTrf0gU9Tj=+&UgOv?%^$Hs`}Qg%m4m&AOHE!`Oi7ufBsG2&TK??baTz_4|szj z0YI#zTjmVMo6}aFK_+*L8&`xQCu!~xd}PFPy&@hw!CW7tZ?}xcf8$X;T76(8b-iBkvP?(wsGfdTgeZ4UyC9{=d*areP5?soKe@DL(cPrY_3 zj@yQ`hs69tEDNz1KOS&+^IzwwBsc5Q!I?qR+Jpv9a7a5fdpJtJ_~-vb&kb6Qqd&r5 z`emR0`M=7_8z_{^#jP|Vh#@#MA}04Bmn*}vx0)TDE*&QE9#u`hN8w4xf;0l@8S5@v ztY02d`vOHO(fD^)}}y<19isYFuz`B9ZK3~h@W_++rDVXxaZVZl|r+R zf<=|fA`w_6`dN;KEjOb-+JvFz9TuzhW5w_3#-@vi%tht2A}06eJqb^OW7LC%m6mDF zxJ-`v2=tN8t#>~YBvIQwzugWP6g~HZW}^{_yTn*x^6G}0+V6S}iuw)I`R2F(tNrcX zu;+U8xcjiZ^19a1IV*P@fM-;2A)2fj<6qk-t3bCA7^f zzTgRfMtl0w#}0?-YLPrehA^>6GWRSF)h*bPx$KnBZyE~2WjHKl;R&^gb%gG|w1jz7 z$%AXg$baz1KoL2IyImoFesi3KwIBdOnu1R?UCN{+CPxcVA63#cuKrV6p$`|gCqqSp z-)@KA(w1UQJ#EPuaVn~H@{pOa_>I9%m;P?$2Nr14v4J}GgZT-v`7lKa=h$?1Eohza z!kO4C%j`V14oKV;lC|HmIIgc7Qpuij9dr>Dz)+2kB<{4T-h;}Q-V6hy$8EQTQD;-; z3}p!8lykLa3(349I$z93Ic;o7&u$~-jG1===`97L5B2Sd8vORo-~a6&9SZwV9bu}l zvzChebR1q2j!t24R*Pl3o$P`B`;eF?5vK2${ofF*=Ct3%Fb)G@y^|ZPkxDZ0a&O2F zg#-(>T!XyStrxsTGGarvyy7ZFII@R`VZ{^XK5jPL%)=WMaljv(*(b4z`$;}Wg*>1I zSupo(_h~RLalt7r+G;R1E}F~5ZBv#pfLa1s$(*(4*occYzq~aDB@UR_fV6iPP5diN zwgct9G^rJ??qpd4(y)v`>gmhRpj`#JRBti8w$1ONwnR~ZO{-Vat@7Q$KO<(Ew&${scRs{YFOUm-C ze~#p<_6dpWz3ugKXzS693E+J4;qSD+KiCla;yq#o-9@`UVv{IvXXW(4;QZXui%4(I zC%E%w5yKsqb({N&BA|ou`R&L#SsINxhEnJr6?frzbFV#+WJf}Lnp%bVUxzY1-7OD< zDG{(6O9mRatDGwcV@UxqV9GGs?TTHHi`N0x;`JHdNZV*%8-b?CScF3z&)IA6CYP=* z;kGU)nGbYp+YpELiB?KJ-iaQaXaosw{%Zpvg_XOmOC+o$XDEcr1#!fMgDxX5H_-{{ zCqw$rBv*r4cGz4T->0@DFp}sX5oo9>5|G#IjhDIUy4$dBJw2{DnRI^QYQPH-hvKQjcIg%C!m=(b_e}& z^G+((5f4{okAO#bXDjV>g!Tgp3pQP1ssx5|Pw8rT%)eUTm~K;sx6;Lu_e%7&&$sub zi-iYoEC?HTb!Q4l3duQw^zNmREISU z^WxUAq|`v|4BSx-MU}^~rsgMm>_{-g;X|eP`e0|*CWo(LmaX@7aa$aoL0JcUu+(W9 z>M}>oY?J)srI_YS(^?q%;J-!Zwafch>fw2~DZa%>(W7?yk)g4SrKcVR+T@Zc&v-v; z&3UBD@`vL&b1gxi(%C_vYF5enB!Klri@?|1(o5ozHsuZX03e!SrLt5sh+mUv5b`G@ z++&QO>1p>Kri=j~HGSDgt-r;)j3UMSpc_6BM*tR>}hhQS>0`7+U}@A&DigePsZu8r3U z>0+MZRJ7^f1fTTdFTBa_&_!pK)haP{L7&#*71;9?FbgVXJu+khtUC zew|pc?LKb$>!$GpAK94D(}f3@`x*^6ZhQfR7jUy>MVVRU(Whv zAx{#JbzxC`csAnMoKM7e8~FKjkDVte%ZwlXzW-$3^V_d%PvE88;#J?@5-aPlM)Jsv zI?sz&euZbZNhwE5qLCdnyS-bOvVT>i%neFX@t)>)Blx40Z>Du^Y-m<34wLxO#O0@@ zQacugpp>by+RGmrLD%v}pqRJU5$M^F8-$!$B^Qz#tM*JW3fheZNoDVCIk>^oEF8zgCg#)byd#4?=;Dm&QYT zaXU>Talvtpn$puSm@x0yn68eG)s%NZAnv3X&4a5V0}TlNko0Um-kAjGgWIrr($A#U zp@!c!IXr5m`$(W~N-Zf*b2=%Hos{afNY`hL+`lN9^I!7u(?d;12#{*h})566FA%d}aZQ|x{?oNC{MemSr>zdtSc2}+@!%`pZPKC9Cg~F3NzOwz_5BqK9Fcckn%E@#`Ko>#zIrybR&u27Rzhl8?Gvl}yf%&8m}(Ef+3m<_ z1q?z2h-`q)j%c!K8++a%t;tw+(!%9#$A58ij1`k3(2TpEy&CU4g7YS55WoIKJ;gTu zFu4`XIk_nT>4&Q5l*Ol2o90_8;u(K(o-84!PH}66!2C2q6G7o`2go9?yQDgkRQepI4_rUN28Q00tf}MU!juVL^-Q3W(**eg6ZBSD31U!@er*7K>QTv_op2R zfl5gNbp2Oq!Qrj?G(4Y4qcmUNHjEdka1s5+)p5SWO8WvZNq?fzAr z7&SWtBz+ISB$v)0N#(aVd>Gr?UZe7lG|H1a$E0TXF+o8Tks zV_-7WN(3XJ;3y5Su8vf$jw3NxwrUwxkZNczIO-UrfLwFAQvd+s};{u6Sa4j4N1PG>6fqvMRZs`6Tkh)WSdnVOL6J;81>`11f zaa)65WAag7y>)dIRo}hw2B`^RuHw!a3!W&6wgMz3@5c7WDJ{tVf}oH2TpIC2e7~Pu zz%Nqw9kTOUn>HP+gt4KccAhLJZh&u<2F)_B&@fGJIa)owM6!#n*_>jc*D z)i1SH(zlcie+KrPEk9kJ7=SMOcmRY8F(<%zPqi~S~F7s_JA9xyZs z&QS}MN@8RcSVV3Y0BSFelITthv=ReeMPp>OSK|DmK7whWK`u>U1Fd#x7}Du#I!%?@ z(Pu*8Y1M5AMcUe@P zhBSxAJfX%yia!Zb@kmoLVg51yvLxf^`mxB3oZa3XA^N#ZF-qGFJV(wv=tH(7vY<)DItlJT}hsD8M+8k$~C!Mw5np|n# z+?@>N`HebK?yK5VD$>`y>d%g^m-ILF<0Km71(KjV{8Lf0arJDt@$8#Q>F<;h_JKko z-K5fXflbJ92w=jul9q2hKvk_r*Otb@Jof61t~L7@6#55*tTCy7dlCG!0{TWbDX@~2;1Mew z1o3E-HqG582T$84Q?o58)Jov3`*J16Yp8{q@>ligXc)hp(Bz{LY*EgZ#_H|{Zw{X> z(2&PUT;J5CLL>UZc}uz8Q6q0k*naAC3$Wmih9NoUH$z5R2*n1xOy21YW3BmlZag~V zP2$7HyOM00h0Jt%GG3%YOz2Cke|Mj|ZTRH(6+oft>@_*?*=>tVU1+{po#J#E&>$;E zzq~C$vtZ(otX8Bw8_cJm&2Vwgfn=vFuoQ>RswjRxvD@7c#RX_z*QH6;bK@J3^;uOa zWYoSwH5_sQK3f>0mBwg{|J4zcX>1OW#+t-n`AQQezV+}?|yfFb7#K! zfVBnS$mWN0f{=_7&`uhsGoNoSq3#+#U+<7M-=p;A(us)ZtuPwi7+`So;_=)r>7wOtolGo& zMT;+ll1QJQ-$vOW-WI)MDOdc|md^ud(qvzrPcgjaNb=*Uv)6wXbb6=whZG9bFv2y5 z))zaEQ3Z97bRU&e#$X6Oe07>82VzP1(4UV4(tXnSaB@YA;*&{@Y`tH+Rm%Cqqou`+ zTl9Wxi`^q}oOihc8ptBKwLc7c>BNpQu0_hbNuJWXWXsrp_f@0}j;iktRP0h~I%R7a zDx1-I)x*7-15bsfYZD2|u`ZrK#v>kN}j5MB+c)BB~B_DW7G!y7S z{RLC%;kc7`O~I+%<=Q7Hz#=je)ZQlca*ddivE#kA8h;j;bu+;%^g^mhvKkl9`(+@> zLjpl&I6$CoZN(qM=mlK>|C=K?+r&pC+{uR{I3U7dZ>F|S!sHN$QH|iF^4?5`w`>Ss z@2Rk9*wE;sZ0p6Iw(1n1&IPp&Uw$9bx{$zDk`t(hR(i25P3W8&BttCldyaG8BYv`9 z&+r%YP~|zd?@`j#JL(UqNFEa)iXX8KoG(zM(jmu7sQsXv{1nUlzeM`qFh8Es_%z9s zsx9Oq8Bo_nHswNd%`Zmg>&DzQkIw@;xw|~2LupDEqwx-M?;~D3SgEj2nSi1f-qh&; z>Dm%&o##jL=b&($%PNMQIS4p7x37wo0G)E-n7LjzemGEN7k6Uaz&!e&=wS@>!t10) zXdq<8Kx4fx8j?TYU5C!Eb`bE=OWG$&`R<69#GRK{knU7lk+qNHNP?;W-|nqMLspTk z#3?>B&x~Dg*n5RN!oVC5Z>>rJG9W-CADFdB7~`8H^>(p6QGNlXXHH!*t~r$BZqw!V znqM)c-&(nyq_yUoN|-i|7G}|se?Wm+{Z5=;iq&2t_2gS!^Lul@jrNx z3#SX{`N+P*MPaEw#mD@8eKBz>3GN_vlgk5XS(bP9WZ2WAIZR#nCKoo#=Sv?G(4*A! z7v9u7kM?FMA?}i$J&Rsv=(ByvABeSBcJ{pS+yoWF%46XfFmw5iuSkYh78Mz^OJExp z7C{PLkT3miS~v~>8g?@DX}yI(-aHY&ptqLZ%U1;5EEFM>_O9TyUiAdklatEk zXjwUhShEwGrrTFdwF4HUle@bi92wu+Fii_I0*17^0ib005tmqlqnk@oV5Z7$^G{_4 zJY@;RV*(9nVS+-Czp?V&+EY8riBrT5KsdFl9E};fi1}(ezuHMd2o#a>f%)d`a+RL~ zJ&ulzuYvOiDwqxE#JcUVLkxhLs~y_Bbq;ebAFKwuY%+9qH$M_BH2`MFtS(CTQ){*3 z_q5hf$b3sz1UxAXCI}T1nri}>1`>G6OAxcJcUtfS{CJZ&lUb|+4sf#=qEU}`@yxZQ zhRqf`t4%NE1#52DprginGj+}DJ+yKt}?4UCXO%t#UnM^Hax`|N1Z$n{Qt zKGT47qI`@dhAKlkxG$lE9y;(<_^sn4`IhLaa)Q2yuVPkf?=&e7Jt^|N9BeU4;LeZD zRc@>D5Yl#S9kq)m09n$IoTg!{QL(;xf}|u8584v90#QTfkOPhz@>6!Jh6p&b8UiTj zO(!a-{a+CF8|Lk84A?*=Aky9Ju)F2FR?ubk3^AdVl6onvl4$>E52!&63H#g^j5OBn z%%HY(T9^qm<@=TD)wTJcVkJ?@q?%V zW<|+q{Ed_lb-YHz3jHR;x?=xrFUedhV|_b+t=-IA$MF_9zsF(&w1IQ1OrmhEK%dkSo}Fk<>*=$MwO|Vi*VJ$y74?L?gtmXhWa|o| zKoTS8nl1RQZPoo!0%xvW`)P2{@S&F<0Dww4Rp`C-54x0PiEY#$Z9zkW5d2u5NUALo+~@{Caa7P~+tc8Jdu&G&O1= zCo?0LAGHLy-d^jn50qA4lO6!@KC*&ZSC_`Ix1$d8*5WC;>R@HA{Z|!|dagoGywTx6 zp$<+MnrTpZlvFBB70cs6D%fL72T0qmb@;XqO5AagDwan|LoFXE9<(vyB->^CFcZk^ zTM_d^I2CEg&yq&@J|6p54EVuDrv!k(U3LZg+EL?5NqJB~xu*A5Eh`Tgz(ni7rVnc* zLQri7e=qdzAYSjNg+5w``LsRY2k}TYg;Pp!wY?4l3xKH4qbRK}IY0TkgRYH9!boR) z?X{SHk`{fPGHEN2`YpVQ{mbRqXTErPT z5E#vv1s*V+;uQ?U1f)<9GU4eDf<8U=#v@s~A9@Onm0-WzzIi&ai)B3h=cb3yt{zV( z=ws>qjSmvHO!n`_)U}p9J!x6tQEFQ?#Vu?l9U{&2>P9vvQ@tEuxNrHSto2CE-^^HI zCvRuw)u#acY$%OTc$62s*=|oDupz#Z*noY|lB@q&!sb@$8)KqqG@&0yC ziV7*5AuqXQ=V5RB^TI6y>5+)>p{$z;Tf*Qy0YD{te#C;C=dOPN8S}4e0CZ|BlkqqdKeW;$P zTxkMF+S8E?99ZrTkewen(D9Rfik7 z`B&I zkK8U`=zH}QIeElmBo9CZaYi_J`+13tU{j!T7n>`scLs;CD-|vs z;Jk&h!hK0*9)-jY!BdsU?nm>Xa|9l-2>^yoV6LxL-cF4NxvnOqYPIn^l0(!r`Q!<%hW8G_G+;GQ1C3*U{U5go zA`S+epdb3X%hx%j*Nr%h3Y`D`dhK#rNLM{9@cjNMmLaG&R>?Ro_`C{MqI(f>FzPpj zmHBl^NuT|=dEOd;OsEq4uoXQmX@hE2Ft9m%l{g4P=h(PCLk0iO*R{A;brkV4@$c|c zr4U5G5*maCfk3c?@+v9PhZ2Yhr6yJ+(1ZX%5P}E@l@<))8B~juNGTT4TJS}&(zH+z zM6~jUG~?`V_s-nibMKw+Bi}GP`#5{fne*G3*}GX$Y5{-?B(QI4{a_Wp=u;Gg=e&hv zEJw4^0$+rOH5S`j&bWAstukk~0d5o(j}>cALG$i$X_>#&g71Rcl%Dx-#OO0?7 z8}ttLDtfpvxBGGe>E6aZK98#adb0D|8?xwBuMCajOU>Eq@boYw&mr2Q*hT3iK#y;t zWsgGz1D$okw;{;Yzpl-S$!j2`q?-|x#^NP0;sBVcb!C9ptg3L)P~mEvp-3 zzFPoWSiPYIvQo&2zTnIp_?SKqc?y8a5K9X(HVU;KqP3)js243YIYFX29BG!PhggYP zU3NT2EvExd+a%K@6&1G$iY2TP))`J$!|AmXSql}et8yuM9lL6S)CzjEmpq^Jg1aBh zfRbJjR~nTORn)2cj9Doq{aPtQZdN&Nv%-}=EU8nTK38%4`o5^?%lBoyl<@=stXM76 zWW1*!yzlm2gEw>O<=Pso1c-CE0u~04#m(U;SQQFIRH)0N3f74f&@`tOzyJ++`z$l7 zg}g672g>l!!;5o5B!P;TsrO_-8_Vw&Ns7P?j|=eurYP0bz6hN0gtj*mXnFI<;*moB z-Xv@~`QXqZDV!_^P?TOYn)Gi6o@57o9K`waes>PnEF>>q**71-CQAsL<9s~y``u4y zx=*8gF**C~t_B4$*m33m@}k~%lbiJG-g;45E?;UMIn!G&-kN7+CwN4Bx_jnG0nV(1 zr|0;FI=xokQJae(@z2)QIW5qOuUr%6;CH9;r`b!dInZ;UeTwXXbJzn_W8z(HQ$*S` z;84nrZ$HM&TM*;g-crLEZ^du2|6s+VxVfKAPlMmKY7$&RVY3zfSbk5}077FgJQklF z77*0;4$FYDS39PPu;W$7A3{>ncaT8ck6#t4LJDK+UKb`iwthOQB3&Bj&(mPnOp$&I zyZnFNBRpm72Jq}o2ZPRFYyC3u41v_)^P6q6qdj5}dY0o2_Vao!qn^TzB&D=& z(>FRM=#YNx)iOLdX^RJD$o)bNo|VzyGq%U@-(r^tz(p+*G{>y69?dJm)*maB0e=rZ zm^27g-Zl5nquysT1m43VRx51;h@>Fi6Jo0sLmOuD-uuE$g=WY2sx<4*_^};3T6~uKyh6-`1p2riC(ITi)#Sp? zh7j`_;itB~E6lmAE`_-XySL76o~2HpXLei(K`suL_57|sIq1_hlbKiO>7w}hi=-7N za}8{$6KJK4kY-F{h#kNWKW(4t|LYV-5b8SYw{6vma(BN&CcBW|gOP@q9ENQ;k4N-R zW&mjOHz#SP&bGmiEKVkFqN;3*ASTNCS|&^R#$z|s{_T;@3NUCrqHFuZkM64@$FUj( zBM{JBpd;(1YaU4}GKY?LP8aP}wx^#4yJjdD0tGDds~!h~miJu|{>Iw+(w_9aR>OvD zm^=tK(r*{+1`63*8&hV=$Px)yf=Wc{eTn@soC7t6J?y58bMOV06LPhsW>*oAa#puh zGd=^_xCI?=nQ!)s4w53Gjyi(W%tH7QTRU@db3C=i-jJ91ygIq#VBlhfxe+%Q^(v(*QlMZ>pEl z3GdTV~5-hGI4Fa z=PzDQ5NrL(wGzlX**+B#sb&gCHmWL*JiB=(>!&_j#0&q){sk`AADr0WHpeS(xqx5$F`h_zOI0fruhb!+%*d>c)`koElA-(ZGvPC7d|iNkJP?>@$Nr6jYnUYsKm9)+0;u zyLMo;D)ag5s4#MdH!cB}$zVYkVc;wG5^QX$!pdM`XphGAs*u zlb2J_u_DU15aUw>e{IZ)IL2tLQoY}|Ypgs@5JhrQ{ixp{(PzK_kP$|u?XQelh@V>q zU+RvKX{OO*HvdO5pJe}{Cp;m267r5TeNPjfQ*g-gcB3?SrW2^+YyuK~wFhQzD-8M+ z)Bg#(@-C~2B>$rPApQR!o0JT@U?D<*2rekLwhN4cjKwC%TCx;tLD9&7XBtLfx=~~p zRF*)v5Z4{TD`7*wk*yCm8>(j}BlSF1lM&`>K_m>foc}ce*b5Adr2Nj%G-Idx5 zQk!9FISxxe12jll5z))deo&iZxkHJH>Sj83r(~f8ni+!dPS~QrifuC`|$Y&=fnxd z@6apbWl+8<5ZC?bc2wEDWE{~pi)m)(i{qHTbhGUghw=3OVXSciR8Qir(`@3|w0IQp zp(sS2jtx(bQhSYsE;|V5`}1A)mOVcP9D?XSTTc>e?l}C%8&CW-mizvf$1Cn3j%)vY z$W%oc&v=AFrvWHhNaKWvvWzT4KwxOHRV_cHxc2aJBR0_GwG_OAZ(SA?gCKJmL zwOriyRUX6Zoe>B4A1BL@^Z#&L*FC`b7{w#K*J4_)>}LCrm;_^FIg)Gre89d-7TNU! zvn}!lV7lP$uMf_J4r2;xA6hl2u|!hKv6i{d!0^7@$1q+@n%^B|2!&GAxkAFOk3FJL zDJGE~o6;e{dkB`pA3VyBT`oa$d~!|p90{HT`cz}%{Ytv$s1-l(va^xh4B43&LS@^L ztUiD)LTuw8Nf&9VVi6uC@+lX%I{UD8za{Wm5X4NtrPKqJT36Z1lqnXljNw{r`IO@S zt&>UaN*The4I0LtwNUvx;H&j!mPS5%6>b$qlvWn?g;?m%43;!Xit5q=m-;g+lnSJR z&PFL)IRHUGzP}gPDlL?w(`bg2L{dpfejs4i=umL0=dDg7{OCY+;xMzxr~1WUhNznLMF!Ugb#vvJ6pPapDQNdwQvS!v5XYr})t_ zxJOJ=DXRmfX9WzMk>hqxOE5J>4gtU-L9Zd68uy6D0=cE&V_6)J3Jki~M~lXsW%aGg zpVHzZk%4Ist-ng7FZR!llVW0i%ou20#8i2Tm?*zF+?_=LpjM&=D@*NOtCK0}M93EkJ7dMI)8z2YSeXtxbiU33G}m`HrVfpdou)hk;ZQg}%VE zVz0^*s#Y5Is)P=#1Q&KVkAz$~Qq6!WL8$5sa|?)u06Rc&T28-Q{H zsE#SQsodZoV$u^hVo-{3cqnU1wUD+@ZPBWh*-ZD)-bhxos`#K%FnMAKQS_T4SA43w z$x?(;S}^Bq-7sCZna>d=&aFpL(Xov{$Row!BZ6pk!uzf9w$;y?H3F%nYLx-G^uy>~ zGs&|`S}Hcz8qkz&p-tOd;gGWFG^+eMYLL9svnI+qjD)bK9>QF#$vMLY54_oD5K-Lk0^+$6_JUo8x_P* zdFS%9!TgmemhM-*ntB-PqpX5VkS_dqY2IB&PA)S>{Kr~}=^2oip4F3yWipiN5)FJaqJ&pe(5LRE|K-l& z;}}iU;S=5vN+v~Qz0ZxNEIYX}p=uAqIf#2d_$g@c`r1|OSNpGDIl%epkyg`kgV-4Ts^F+;N;%fORO3jgt*W~{k_is*@uDg`A!@m{kev(gwxG+i<$2se;qs3Z=Gy+zoK$KUMvaoF1 z{+9yD>q=I-DP-@bl&6WvPnJpm)&vkAdQUjDoq1FJ{Km{&sTwuUZ zMmKChVvQu=rrhOcLf#Nw5O6cUbT;uxUab&)-R6%b71}b{A_JNRq?qW9C-j&eR=q8} zvvktROR@o;N94&XFALo1X1KFjPH9o>j=~*FaJ_#vnxBCWsE5dT^)@yi-tbv0kc+!! z5=NN2<#UO7?NS4Yzs0b19Orr;M8GGvr!(sVKC&*L$J6PJ(^^qcK&Tfekl6(}A#dR& z2X6Q@WK#E*oZ(vH9B3;itC_((QwO!}PinY$(~kw9`VB5jpZ03;n(Q`LPUl zPTfIcS}eHD&y23@J)RI%*{*$Z1h2=nt5-TKfPr(rHlT0|zp-d^yuSCG`AOo0*c!Bx zylACn*!~9&mwxl)4-z`fR-!HM-l5`MViVF^a5i`Vb?n;@$gtV;o=Fj*v`nz%@imiM?*US0na_klq7GsGoE*A4&9@D4T)LX|0AO*S*@q%% zNfJE4S9HUN+h!1P;Wl0aV9rkVfeRwwRO;kU~uLn*0;AeayW_ z9T47nv#Nz9rn?Xz6*^_fnWzK+szVe{ko)`Opow>-Mp5PNgUnt~L1AThM_2vYWQ=o8 zIm=c`0Z>ZDhm}ynONo!bkR`R@KHQSd$Zmmk5S*K>sXJMe=ptvqM zz~AW+rI+$|!JNG!jOs7pt-U-P_}Dn^k|K6cwt~Q~(9ce{^)&f5^#{ zN|J2urPVd`KB;ncHSlAez%m<2?F>pjQ8=z}4+*z2xx*;&mOq;T6jA@8YK(d-mz%eF z(5iWW!v-`fz~wRkA4bvEAeRB!CAWxbUq?iyxNXLD5K$Po5XHL`iVHkRHljC=bVs}p zK^cKHRHr#<^GxTo2&VBc_c*%f}itVPTbTm!uCObBio?;EqwO3iWnw^{SNK5EaVP^`EgiJ|zG@+;6<&Xu}giYWM zJ7Et$RY5Y@+=zF3IrFMY`t-0btMq=r!!lMC#9^3siu)k`pqW&GqS1$>b&GHx#VD>61IVdUN zPKxcXE9c4J52_mh(0VbRNzuacmBuoN%*B4Xl)R3O$fr))mNhe>)3c7wyySi6C4sf= zY~h2gG8}CI*?eP4(HFKi?Et^R0qS1_GFOeUO2xP^$CVR~RtH<=4ZKyI?u#A~V~y1^ zCVC9`J^=lDk9`YrL4OFiov-Ft7F>?ux{JtqDBe7YH|7$uiw zrXkiR7+W$Br&6>Pu#ysh*vOIf*d+khWA)qAVpy<&?1aJwJEVv-smB0K>RN8f5jhHO z1U49;QHawdExl?m7>lk(*4tFM#WrEi({t@vbkS)e#AC^^AO*!9O*sC$iHv=aI$4F|e9; z8!z^1egxE1qZo1s)fQ1c71LdwHWnd1U4sh@kKNgJKdIbcfz`!?Z7tVnWpTx)d$`+2$f-x_Pn5DR zIi@Rwl8)&z0#Tsz6rAx6&-2O=wUiSGy>JmK#eWdy4C+QKQFgg+4jH&6VpIq^5QW)inAF7dEkVp% z6{!XV2WzGjp!!@~%)G$sV<}H2nV<6Ioe>)*o3%pa4>5Z=^Cq-OTP9y!^F#JX*|g?~ zZI%b3)fp;gPx3CU4=W`pR#&~()0ubS2yl3pw1%xOwS@r06G2a|6pKYq8l%a&MKs1+b5+koH?D=|x*>z* zG9Ber!0&J44WR=Rbv!k_GuC^EY^TA-)HQ>mE$67V^ntQ2rThbHK2dAET!s?dkj@3$ zK>YAIyRL{5a0Iby{Z&1V&Vw~NSC~zjza7rL)JLF)>^j$=0Ti}u+@SI3)@!kjAg zAH{M=Z>7Z80U|N9Xc>c*C$^@7Hpp{Z2n}2^a1;3UzKJGqv$5=tH}!5ms<=W75dX%3 z%&2$mq}>VSeeJ3L<@=-Gb$|LU4I(df#&P>iWEMfbc1J}|s230tb%rW{iGl)XtHW8e+!__YuopvJ3%1 zqH#=PLxe>R?PV)bcHUv3(?vAPVZMR7W96}-I87!cd~<+;p_W)55PbS=FgU(uin5h9 z`caN=0!p0XrJ((beFzv5K|{}%!I@3dO@s~$tUk;44|S-k>q#~<0!I-+zKW=$N8gMk z%OnY}o@t|Vt^Md9c4^ z&|^bokmMD=CLjf2c^Y(xzzV|bOqoEy)0_h4P@PrG4InGsI7~d9hJ_0c5x%iq*B}*D zs?80~1iwl@*hJx=W4fjHbgv=`@BAD-^8QaLHj4V?EtV}0OLX;3l zexcwg`_$HGEtOnVJkit4&V4xr*f`G=s-vZ-`3B{Uj@l~d$pOuwDU`~5rGKKNy@O@~ z$t-#2j4H{u(IcfSO~o3eL8udGE6Cmj3a2af){$->V>KHxt{hPXtm|(wOkiLwb135~ zwxX?b2$~0$#Cw!{Cg3{rVvHn-tr_7D)oxfUH{En@>Ov6Mxkz9(CZU435_=K|M|KSC#{NWf6vEz z$-fa%6cD3Hl`&BeX9i|iL_iQRxFeu~i0mrcAcBe#ArXj>=Nfklu@ISIM-wec@?zC< zi<ZzrCGJ_VWH zRYQ$?JoWSd-)rycA-74CfNiCI%(Z7U)<34$+%>mS?v_2%IRrqIN}^0?CUDF z)+rK?pvf@L7(C%y@m`+ve)G07$i4o^#4tAo?YG;LQ#$Irvi@2WL=eJQ<5cy|r#^Pw z2vk}Yo2M-?C!E>0!ravF_cc@rrW7kL=(;?)tg|Yk^<0%4#I#xq&|?A)b5>su#g-@H zG#88Lh8O-@-QS$;Z(%$_TwQPl8iII*ymp=Iqf`?Z0yx|Gwt=2ibH}0AU2p#n13|91 z@zR73G3NKa|-Xw3IZ~B!RP{0h;NL9+%3U@FgAJF|?x}53qmz zFiUgTv8y1dZ_Q9dwN}d?E1Hjwb_&bH6*%y7ur7?*nmZyzXL`*tGjumn&?C?aqJiIEvBE^i# zMX>V&n?}B_yi?W|=2~V3XlI($Mf)Chj7XxqJC+WhMo~84ng+;IwwxD+pfeweMX6t9 z(x6W(0an=pfgn;T=7}*^A}A@D$oAWHIZmUONm1rVd*nnvC50nr`D+S_NTL%7H_Hb_ zRWl_Xb+ki>4@E60jk;Eo(n?hhl4C1-;g}lflPHr9z!BDk;i{ltw!{9}exp2rZ=J$% zY0Vg)W!g`My_A~)rVv(f%q6eF9OfV`3lx!@k$ug!vmuS>%sykV11A`+ey*1osNW3y53{gBU9ccCb z8A6l@x`=i*Kuu;oWhM>U;PD)HEHnk#`ak_0m7fA6qG^s}pH=(MtA|VC2w`T$-reaA zkjN;{IT(_B!ibus`Zb+AxKNfcP&Y+jHff}KY0ZR)Kg2sjcyEkh!H$or42*tj=GB;* z$O|m$)vW7#s6C91=EV8-d=P%388QKk4sV^*5xK#`Gq&T>z{t9`qqh&tqgwBn?5eck z;O+4dauZ|~1fS?|W2HRd`<2of67jDYPXiyks#7dKr6Q#mSkQ;g2JKt9vapO zAF_-k*5cyC{#&n!wNgoCtpxAd;8hyE>^21}?pnO0lqGnltlt_ZSvBrOoFXFaGSNsp zpLFsO@)<_ApA~C~kC2i};TR;YvZRl}>5-&$7aTv|EU%WKpG%>ABc0>eqNt?N@{JQH z5Ju$qzmh3a8zR67_+FeYmCswTJaIhUO9|!Fw=t>)I4GC_;Ly4~VyJ|u^J^qXl*^gz z<)=jZ+)za-zx@C%u_dcYbrQW(YBoKt-YN{44f^c#Fg>g1jRVdLzx9=K$L14Qt7k*K<%nhX zAz%_+HghbWtf1?LU7J`|{_|&e8M0{V#aS*R{6i4450EG)NQM-U;_%m@OX~%Gz%7RsJ@Xf-8s1!PIJV|mPR-lv?)Qw{ z@|qvnG2iTmIFsx0d_g3JUOvD%!2W`d1i%y@$%#;zp%nDNAtt4&3|;_g(5IhZf{;kv zAB|>o$D)i7D^zfv6oJ9rKxO%1H_f&(c|(4?-I>l6YmHW}0iyzaK&wzGmZ~vz*%(1AVVo^3DKD&`u?VpY^6n_hHrvTy zU&GpcBIS8zCZBpQ+ich=wyzSXk>aDX1+_iSat`pd<7$w^rG`?J=a{wCFY?W%MB*-l zA59}gEgw}Z&oRyh%3%8?MMTQph2s&+2WV!GyqB^C)nfdff+}IGf0H8#j zn$%gUR#He@($y}$T+h4R4CtAMDCODSq%=S$HfDq@0d$z0-d_?TUQTd1&WQfZyNv$C zQd6jp11kUH+#*dsRaV;MmIJp`pKi=Xp0d%e-Q;pLtA=hCHp4Xt# zQWa@v3N<{MquPtBCjeC3wey^+nJv3Q$S@EN9p^}%M^qkFMAU05J;lvPqBY8pmcvcG z2uN6kmdOu6Z-BNZ4d_&?NQ>!50ey1&Tkra1l?{xxAVQDAO8Dmr`m6s8zj9QgdaGdo zzviaPkbxVP#uGuKBxN+76o_-*4csiqv$(i_Hz1Pm&Zte9(7M9;qag$T59mqn}ieFi$Y zB5~jR@GUgViu@D77P9Z9M(D5nq#DI`OLLF+ssi|s1 zL}Z9)b?>6YSZjMZ68fT|&`RL23cYPe98 zEjfhZC8mgbVMLx(Z0$@@QDc1C4*V!!pp^XtCZ6oI*ik9RQe&)<_oXFYMM)fpD@Zt&Y+XbcVW3a2KMXahoUa&cvE~POzcrnEXwmvSEYqN@>*$o zhMZ)c^9LZnC_^pG9(D6oCQ-^Pqct3iKtPY)xyk8ckI{6V$rL20*KG)B@$C?H0H8G9 zMBh52^D7pV1SNx&c0{g_RkUvnG8kmANfW6CBJVs$$#a4WG5>hKws)WztQ-Z12}+jG zfcrV$I{_-0Yo@p2qd8y2ALFr=9TCb{J2z}R8Aox)Bm1FHZK{^aE4?X8bdr|9IX^DK zc83zB1>4W^0ll*BS{031bccZ+iG~mgIJ=@-3?6#45rLHtlgCX&6)xyq)wsbD`cOW? zLqu0S|5-%kL8&!qRkh1I?zVLn5qkLca12EN9S*<)CP!jFNh72cN2Hp)x8Sl4>QirK zwU>Id9yOa|QX(y%Z9oU=E#4}xaXd?|AFZkf0DAIETr_o*$-|EQ3uPBh8HHN1Xz{%w z)r-f!6QIcci$eI5xxF0x@LyJK`o$vh$0OgM8q{Q!SnAZ>#Gzf|38)X=I5vO^%DCyY zth{L)r6;%<7ix`TZ7C0yciITgZF~LmkPP9{pb5vQCi?}j5P~3C8AJsT*#IyUTEqo?HIwEMrPmMEf7ISVZ^!?ysOdZ&8RKEBd&I zlwf*R_?l_W4TjB92WY3<^PseFM~@P>Y(E!qi9ndQ?Ti>O>aqO+PCA3EXj5Nsu?X0x zbwxUWkpdVw03r&DSP{t2*hm;eG}R0Pgx!q8qmz|ErL?p0{A50sX};GH`BAY6Skh!( zG$19EQKg_elsO?OS(sCfJ<-pra0lgm^{*S&oDcnaGzWT33h09FEV|*p#7qg!q_ON1 zg!#4O4!k7MkBOj7$R5zwv2a@rI*K6AohY3y)XMbxk~5^mVT3G6N_66Mwp@|I0dlmB zM9@}Du=asqKOV#fk*M5YlRY}bbWlhY02A%WFhaV%nr#HjFc%L#pk$^@$}Ni&eU;TT z`fWR?+fvGJ##)HF0zl9lxoXw+|6-;tp=4bW`P_uhLA-ad{8SN+nSdMg2AD28)$$%= zv|S_Ho7Maz`QC|XI74dlMB1Q1S(3Co8`I2`TnqEI5l1^pO3R8IiXnb?kp611W@>yp zYF{GxMmyo#ENzKI_@y&>`vft5wWc3rmlgSj1}CX?N(r|^8Jt@#UM7mSlB&zj*~|3+ zJtYh9tLhw5oLh=;D9G9glHx&6I6QN0Q9DeDXd_IOwLm{_xh#k7U?9zhPjP}fT(P^R z#@a#W^Y-XVr}VfE|E!O-IAWr!y5x6%RX13svpQBQPMOv`hgRe&Rb9E4=P|%+`AVzm z_S>ri^q6AHjv8epLC$pN6;u>bALKD+PY|g7466de9sF@Vn2w|262aUH$><^7~&FbElms#W9?tS+XNP zxuB1{;Ew)LWLwe+7}O#22r#r5;v+ot50Fm@BBn~9Ci|uysJ;UQ8CuwL=u7;<5*rtu z1sIZQ<(zS7?<5_887{kj<9^Ct>jeqHHxcdyy=jWFZSzj#z=fF=Y zNk_Uab}{3D71#K|9pQeDGMz9zD{x-*(%K0lk{xwKUub*lh+ zA(ry+T(M7T3tIW{QqXDgC+@xYCuC7%a2jMwrrHDLC;*n_0}@5oX|7WCQ$+eM_K4Kq zBZ*Uj$!fmpo_A$pJ1kECDPEocCAfG1wO9sVv<{l*%OnHd4$Cl)lqediNiD143}+CA z4c>7OEda-{`EHx^c3zdWv~^W-YZ?@d<LpulfWleIlMQLfUrJDDlpD4zF{LqA)gzge z7Kh&NBlM0glcd0&JwA<0&n60v0a#JQE~?7`CwRu&07nOgdJ;fU`4 z5NKEJ{H(JM$R;ii6@asDP=cZ22es@;Xp#4%7;^BAZDfID$KlopZ?_kC7{Yx<|4 z{9&mdG+}N)y8HfLW58I;A_!q#<8+sKX+?cq<9^mpE{2T9!_a8xRbn`l@hAh?AjENs z#hh-NlAh*{=+Rp)rz<-QV8W0YlsI&&41oevfILi?70_qSSlTeDDn0Z65GKsZAHC0H zJYk{(WO8v7LppdA_=HJCsyq8fkvqIR{4FPw{PY5wA`ALPcCz)yD<{53=Jv@Ki6yJ> z;_!E%+&yry0*69;)Y@NC_5&~^o%Dh213JsAyeBIFPfeJMl`8SN7 zC@L9INKLlCiHFG4UagojXL}H$)&>v8xE&_dB2nz&|2ogGkZ{jKIlOpo6>+A0Cwt0ATE(eD9#S99N!tyx#yXW z1kZErgm_>fo#K&ludKbc=H@1{;E8kMpHN^yP=iIlx`_AkCXV|MrH_j$;L(}ZR+j`j z`U9C8VU#U`-As5N5Ck6{>~%PGiuFyxqyeg!)aisu6%D@}PMwla(v`vtaoAK(VWF49 z1faakh=A^3cB*deL@hXHGQoLzSuW`AM`i{f6bJ#!oHE^+FOzB(iC0R5RImUl>7E~C>%fxQ%obDnUm zp~^J)rKB{Km;i{J>2W)tvlm3GDy91E7LaK`&*t&;ky=V(!qdpJyiwFvI39U&m3ntvPZ{RUdc-pUsg)e8NNL{7FIt^SnMx#l%kf=% z{$#_UTI&_t_hviwAv|?p};z$e*Cs}^_CrHRE=+K82Jjj^FL#PS45`$X@pd+^S@v-9sPc^~8FI8c@ z{Ev|CsK@P7HLVLMn~-m5G25@MEFwwU!`Wpdde4!S?1Bk%el9=@$o>9Mf;&w2-EaxY zswe29LN^7oOx)TxQao`Y zgqTDMz15!}6RMl^LO#@yY;O!ggvb%u>tJZvtT6$msqR6}ZMMH)zbogOe_6+CKI1Z> zH8)>wlmIL4>;JHwT`$|?Xb!U&uW(u!?a4=Y$I-!-m+>ME4AEi8UT53v-br!NZ1S)7 z_|)RZxS}~2R!1yLaWm?MAcYbK)nHY^14pD_KYo12CmverYP8|ciB%=a6NcWkGyKlR z7g2>eBk&3l%R%7ucpU?lBT|viBS|tn(VO8I2|~-D?Cs4xe0}nx@d|0@9Ym7-M=iSO zsR+QuCop@{DZWZDAYoMwx{_JRth=vr@T7LANFTos?7bQrATqd+NU0L~FibueVy`Rp zP7)vjX5lv;DQbx%Q8xauBmovk6mi$kP8@6^#=d!v5RCJIfu71#R2SBaA60!n8cE#N zs?mWDi3>>tK46~hlyt3{0M3{0fSKvJDh9 zNb3}i_vzNr?D?m`HUKW=G^mR*T@CI8hmxK|M}AX}R_=96D1)n7Az)yB%P3>Kbgmg7 zE3T%v&#Dpjwq%uWm`O6hVmJSBN=j7(WX2{|4epFbfjf47tX_!e;HqoHL-NK^PO9C- zuE2`4|H0poao^_<2PYr+sp-f^(mlzq**4o`p5dQ`u2x~w-eL)ooYJd@9r`epX71{t z2$6GLN*Bjl8R)?p8Y!=^kHL7ED{r`|TXkJ;hfY*+)F>NI!3otATO=aDvZ=Q`*s@YR zoYVa?N84S$_jNL1MhfSoBVQ9Q-!ttJE(*XQs(?PD7$fn;A(QdkG5I3RujbX0fIE6? z?}g~Ty~bt9BtlYxJhYq9w~9dYRHGezrS7-j~fKU915c<)+oHsaDx5k z4CIJF+Cns;_%SeqD=^(^#2=CXLl6lDA`w~d@}a1@bMdceyR(u(8r6T?|f!g*1JDVDzi?N{LUU45BfbWD`Hg<=Iq}~CLeNHks^fo1b@pQn=V=7JQp=r z$%ZN18yhDkgKJl%A%C;k6-hhVEutBTxHz{Qy)zUP2&vLL$n&r^OU2GfppxsWvyWgy zXrZ@Zsd1yz4{dg76Y|lhfYPTPUpt|GXNAZ>BIQ*z0Vy$dDV2b|N=Ie`PKmMLQ)gN>IT$B8CAeO zs^~Z6E2Y$dPXq7H zDTJ`fk^yJ?oPLr!1dLGJ`%>!CizA*dL*LGL)ZcricrU%>yNecxHOjg-c<+Zj2p;mv z;nI3flrVyd8_YC*TJI;y2~HTBv7qD=zv;;s^qHH>FTzF+S#PvJIqQ44s<;Y@Mvx9} zcmk&IRt&7DQPhD;`y30&vKdCWiSNAu#0!f?_liv^qN$PIQwhQVo{l`@4$s+onosqu zjT5cb;3 zlnJIlD#$K;`Y(#S0i9|QtVP|WCR99x4hYrDhxXjE-z2I-9Cp8ZsmXZ!cqptgR|4=o zwD&WDo~jGrrE8x5jOCwPWQR?yd;UDES!3=h}l|a*#U0jlBD~Bt;`4C zs5-K9HCbcdx_s7Hkp!f6ANooJ$8mrH`=PJg?|+;xYlKP+dd=~ee5i8!p(=tgT0v=h z@koyMw*`1Mr^g`Z^Rm=*O1XEUlt?=34xEo5-(rsUe-k$%Q=spC=Nrd6Fh(T5x)_j6 z^iJH0g_&Yu*cE9K1xbV+|KqBwNBBh}irxM_aLf0@J@BhU8EP?#vIM(&(V`Z4^iQoH zbeFZx(lm9EWS}QF0K^Z7wY<#VepcKlyH-g8NP#{PM8qL=CXx)d%ZB;qosGQ&WOK=k z%-^kt;E6-E^3EdXfc>ey1%{|d0hmrRPlH(=OCnOm+5RH(u1l)GKsjp2uGs#KrrKkN zVpj)y#OOAXLtA@lYX>D>UdxC=ww~A?|C@y#{pj2x?_=|ZKoKq>+BDJ&J{TsJ<(?Q6 z<~b6l$*wXnmQ@ixK9a*z z5mk-xhYFP%!}5*-$b!O63x`y;Rx~br0-zW9(~)oMRI*A}`P_oS_MI+qtj%G6Cj9oJ zBzu{Oydsh5Ccet|)##XSIp&4}UH}ScNJAs<*QtQ^r#*X+^UX?1>y{|(FfSy3FO}yd zddoMU#Z;aXGkmb8L~N8|;@&lr@CA7$Z(t-rlVTYEN7uK1?^Ts|p6B(a&RYGoRjxsp zR?9t*D@h0pP_%#rMo=Kw5bmkmfk8%878>L_3Sx?uA}lO-ZD}1lqTG@+0VJSx(JrMD zP_#3DgYPq+&vQHHS>I-7<^Arn&pvzav(LVK_H)(KKmT0fIow?vbC&exk#ZxdF~^y1 zDjgm-XhPj6g+wFL`^o^{Reh3Royl*(6)8L3*Bk{as@PslAgAB4k1Z1TeB7bo_QP?PjDzg%5ks*>smzM%^7O|TS zEhL*vzV^(UG6WcMqeSmRSq(){KHNKapQK(x+=tMgN2MRud7=`k{Y$rkcxFPVf~5pf z3ATI*d;CT$sazseA#Au-m2@d>T31{;qXWf$V!-jtR~lhYjxfvO%D6IqY*MEd$a>QT zt3CCF=ldIBp|7VHS0x>*CPPDKNHs_u3g>C;(z6Dsbo z19>#S;-HaoOmh#^!)Z4^Cu|!jeC6~v844^%RT=jUvN1;rTplBA)$@dg$SDKM=^;ya zF4_}22g~oa(PcLnh)+dpE6!)VAf|Y}OlM1WFEyzBvVZ%5?H3U*v%Z&1ebbqnf};Q7 zu0xjo?JT`Bc^zOePo|9Jv#z+CkflZ%XqFML{_Om}*5{oB%bh;p%Y>SSG1;}}9EhmV zRNAZ=WIV1&y-VHI{MW^?sLeWsFTG)pK}^`!fl`)A74dFY3Thuged#J0d@7`Hu+A9M z>Jd{Zw;QouJwh0yXJa+1{+Pf)UkUAsR2)Pe1jI>$w+~*unsLf&^1xXnjcIe$Qn(Yl zHrAkiYGMY;~xb{ghgrV6;TgLIusmxaqhf~aAB?%ZTKob>h-X{ zoT)6W;jqZ$k-J^7Nf(+^RX3dzHmlx-rZ~&rau}~hQ+_gXw+bKg{Y`21EcBlu^hthB8u<_&%&&W7?bBH9`c|`Q9 zrgHCa45pC$8zWdT;m5v$`z%W+7A&(eujahWS@O)n@OFRSeiU$DW2a+P$Hb@lBEVhM zE*oCp+W%jObA}3_k}4T$s^l>fB!Qt8yk~LVGb~9IG{vP)_)Z)aSfQ{*0qOK6gJkF| zSnk~i5iB=CTcshgoyiSQ<8Ii_4p1e4TzL~IybCy$Q;pQ7lA-(djcZiti%nHS&*FMI&aa$O-5crB&Rv zjkQ8}$96uBIMZK2=At?l_s+#TK9Ts&OTTuY|0kqcR%B1 zZ*#QD+HkZQ5Y&;y5P7N)<_t7%rCExIm1FfqX{zXf5YJCU#&W#&c*+|>;nN!TOwYme zWae+Rx6s@b7J~AJa zDPUAxw_1$~E;=b8gpny{X~XqD_uu@@S~*7pxhn#!|pnzmGJTw_)b^-4ECKwDzKARQ0a5< zmmYq#=ut}sz3H68?fsNts+7no0@G}IKjjOc?b8sTjlrmKXxQRAGI&Zvs>Tk&QuI$l%pkddgqf+vflV34vFbeplpK zlczee^ODrX<+2NS%C~PkT8g@sZ&J{T_En=z1Wy*%Wd9+Bd1~Q~uUmQ_wv_i}-C!9v z3FSG}f`r5s{lrxVK4!3hjbVCOebxGe>ZfE4@P|-jMTlh9Hpw;!HU6?`ysP7>`WQ=j zPAy(%45suA@-c4Mlmm0OzM)abc!ED+ZckBzTtTzmtp`b(X6SH}>dst6hD<#3MII`9zU1T^DYU=5*! z4Ub+$vsvR`q_g;yOn;ZlvG^Q^I#9UN<>z`hy%w%-gPI6|7>zs|qpArG!(#Ggu9mUG zUqmVn4df=~D#sDqJW?_`yi7;)bl2U2-f`hliJl7r5meBfuA|LiSky}cE*WlFzc`!9 z|K$(MOCsp8Snp~r_N_T7KUAk|FbzQwYH6v$omS0FIGyNNTHU8Q-A(AY@0rHdhpV;N zkxhgd;D#yl93v23u2<_p5ln9j!ZUM(*iqr#XjXE;k(=3sjR0SwFpU1ZvpfX zkc@mm;?`TPxcC&QJdeKcOKvB}?k|B}NQ{c6TM}Qu6zta>N7-z?m|GqaiZ8hW8wch0 zf8O+>gr*l~BKJepErhAlRfm?evEIY37dSkNXW$vcY(yG;NT6aTVQC=j4|x?7+LH8J zKfaX5goC4p{|Om*8NLYn)Xh{dEh03{Cza2FK9ox)&^i)ns*!m|Q^kcrm_HH z|8nSYCnk(*$rsXc6*)#B1h+#60THzvQhoZK9jf3iFB`?mz6$9gLZV_#UBcZ z6S~Ow)Au8uU;$bQW_pVY#|AqC)yBi`#f5_lN^!(1h(uQRHoTC2wmVx@-zt_|!6{+R zb9pWl4%QGOiBlcpN#hK_Iz6^v@CfL{x&7@1MnYKJwf!qL?ezwQ| z2TE?VB+41^SyH45npV}Y?kWOUvsQ#9B-m=+SV6$&#J*vzZAAfASSEo^0yqK`mV-j8 z5_>k}Fgl@X01)(&8BYlbPvMpcK;UuPn8g^HBEoh?Iz!Yr5FTZpGbP*H11rzF*;?C} z(L%Ptpa9t`d@qZ44G6ZRKH^!}k}V>H2wrBURNE?jtUX~+^^E3QG$9(kk+-&Csj9_V zPcyyBMDM84T>p6F-TYL^0^<{Nn13;ErsRRx{ zlkgEK4sljz!JO}1MZ72zJ#ali&UP648|qk*iqk}G>G$fWIU2!Bvy!Z&d=CRbPrdv7 zSFL0@TI5pInyspr!1KA#vQ9DDu!^S3h(I2fVWrK+!cSJnql^R_EpxlnBQAT&5KK0o zS;eT@#1v{~`74*x&>K?`eJ)f!&z3-yhqN3BDd+ownRRGkrkhQUhoZ`Zx_;JYU~(|A zF5!+qc_=LLG=6xK_=z8Y9wfS}tIOT5mIS!S5lcUz1U;v?Js!p{{<9C2P3ilgw-q#= z0k(PgMNT}x%P;zqX>932(_PTmLIj}4rFlxq>TjQWYs{$iS3kaHKiHJ?!k>C+SCh?) z*zmEHds9VV>xgjVjI++wvfvtPcNNV`<^Kdm8BSZh-;9z&Z+E>d^4<`C{CT7=us5u< zHWXs_3Ts2ZP?2?nN2OWDjO$N?F-DglLf5ZWh)L@mJb$nUb=9OylCsw0B9sI|;0L9TOn6ddAk?vcZ{32%|1)}@!n z?b+H@oM}(m?9O5db0-^kk)W6$7Z4ul{bZ=Qwwgf4p&k1jHudlTnQm16%m$JT*S-!x z)k~GGmcAZh-F$X+%+chyW8u@{7WI{V5K^lASrGwX64RLLORcBKI70}$Rv8G}l7Ngs z>`W;^{bIZp@d}#f*Xn!;+LhqsTB|l7Q~|Pe3B~f%OK_&D4{>Wzl%_)yU9bFw)MYlF zo{PGc`B|FZ<>ptVsUjs{T+b;JSBoOCWyah#u-I7os{T}MkO3t#RC*H*WxWIer3TU^ z*$G(PxPyogVoJo3o-JX@5IF&S1B_C^wccF<)OwP=@9B_(6b>GAp&^)AwxU&1_MbdlzD1<$^usuC_uUc8m5P}uU+epYZ><%_ur6lhCMtdC!h2 z{GN@=l<_9!;#yZ(X8gSa^m|QPaoT?dg>0y*UT^LrHqn)Y$&A)F>p_HxC9nlPgBs9@ zeIzOb#M#+Ewi51y;h`ut=sMRY&>0ocANTmd+SK+PjF=HZ03EZz^A*U~(t|ocPq>@- z%TqoS1f?AK-rmii?%)Vb?^>!81uJ)YnsPjY>1rJ?7^SCLzV3KqbxrWlBR~Rmv@p=~ zw?; z$ymAt)%gNE`hhQuJd>=Ol5m9UA@O{2YrZ=&dD;nh9cDv zul^~T;|hMaJrOX-#j9znni54(&yB`VgNmT4LeyGB91?jApCfYT@WrM3H8Yb!QQS=r zPz>#s^Jtcew4y%YZ{2W2SmmD4T$LwQfEIvbxx(^Sr*eL#(3dY|j38v!ZH#^O(&d8$ zIQ#Uy+v_{Re?C&+Cbmk3Sl>WrAlrJ$X8$^R)YbT9x}}-lG?8v?EII3xPx4gZ`D|O3 z%BP~*Ze#Gg+f9-QesJgk=cV~n9#33EQD$k#NCXS(RuR&u+AiWj2#*NM%zv_Wx~$0u z1b{0jN>9s7PaxG{Tmh_3(;_8|-!8>1)6P@tLw|M(?>zlMY*#F~XlZQ&K>1Y;AzH7O zAvQvmGq{>=+p4wq$53FApuJC%3ZeQ-I^3!%Y8^_pn5Cn3*43pUXwjrYzcOZ&CF#QyO70-*>^+dB|(QQ$=IwNF_@#h*01dtrEn85-ACMrG4K< z$xt-_&74~bQ?uv!6&z9@rPJ}OBXsD2{V)h=9wGo73FY}6SH~#sXzNoxk~t3fRP6+% zwbX5z)A*iWF6<1|D96hnH1Qw?Xmlum(%N7G!jWd)sk{N=utoqMcyT^U6aMS_5F83c zF@B&@ro<}I2kJMV2qN{>OGJhY{rLo)_oGpUkpK^oWO_TFN$y8sD_Itb3Ep+d(ttRm z#8Z8F3t*|9V`3Ar3*R%r}jqL(vF2k?4?_JcQ`|1U(g8V7Y05MaDRU z-{3;Z1fKIRKT6hB>{f(3dJQ~s(z%2=6FvQ)YVcizIOLF&8a#Ba$wT-UBz2nJ+1JA3 zr%K!FDaVsu)r~S_G@fRV5Z?!7k&y9=S_#fQ?!Riuk!#>(q&rLNlO&)F5U0VdGYmOA z_WZw_;0>XVH}y#$X$Ctut}!N4_(%94s% z8&c4UNd85f1g`ySK04faNh_4(K&I2&QWP451D=(EH5qCl> zeYmtxT4}BICX`oS$LvhduBc3W0*iqByCT~VO8e8oH=7k~kdC#ZGupzQQ346i0V?%l zoIqp3S#JrR7|(f5Hr$A4Gf|lbzBxX^{QJgf|P=jibfWi~p5BqgLRxY9TxUL*ZQ{J>aUsh~X{)6Kk*i382t%UMF_4Oc6l|GOh*^8^3tTJ^~$BGz7%E*{TNc zxM;G*1_+|GdiN@=SSk@D%VfGv;-)J!Wdrs8Q5l-=$y%52H8XK)0gjZ9zP^@6qM9;< z;6A##zcw;`Z~>OIDjn~r@(X6|9LYYa9gc{{1>=8JQfd+Rd6y8Rnq6V6i?bNEZQQ!O z8ceC2Ofl-q;PW&B=W-RqIc|`pdXM_8le*FZGMiJfIIxt1IM$HZZAD>0t-4qls93H> zT%6Nv;5H2bWQZPbZ|pOsFZ1`4bbkabT^$H?WS}R2`bHIr(WI2)tn^JA7MDEG4G+9Z zxU-&zSXYaIii{5W*#~x#qGPHv?qie+G#1pTJ2fM##tL9#i7H)(ru5IPPTc`_BDrz5 z(K|xm3sQH~7;&BbahL61@X<+GCCKr_ZNME$@W78c%7RBNCI95jYD4=|(8qm)vItMe z%3Mvojs$81z|eQLz9R(?QU+T@T=QPFe)6RX5kkP|G ze2e7Y_zMCzBN^2GTkf@P+bRiIgxi>yEvT`;Ns@n1`A2qqcDZB@$v zDIzHn7Gi?o@+M)y=?6xB0;8Yhi_znKLRqN*)1mdL2MV@D4Qrz_d zuzmTJR}PGCElUUX-2WOgQay+qMk zP-aQ~)%b7oObI(0j#NgRkz_s)2`nnq?5nDKP^tOWyYxP@dVHxp+jqWxgq=PrR3kS# z$UL5r#jgsJv#L1AEuZTgv>b10xfLsS5CT2ii>Rx6wOjT#pyRE9FmhJ}E8hS|40D#2 zE2@5JJ=}j%bYTKq8Z9S8k_YWnvaqCF=X3bAoIWciT;VZQ1<=W6P>Xpm!Q@&G!JR0P zbMPya60QU{MZ76o7|6r0_B~`~#jTCT(gJly=~3&$L{pXK3e8h{&AKd=smxR`%^gB|Hvu-{cMrphp)XyH-rX*$}+C- zIY9szs*m)MrF+#`wk_@q!7Tgp75hpt!ekVTg=i9Dwxr$^9x z0jCmYT#^f}BZh)dTufz33nJHF2AN0z7*s->i!Z@e7o1`cH%KqcDV@4h8$+#YRE3?A zj5B932W7Bw0`mG@YUCN|9?vpoQ3%Q?zN!MW)rbme8B(M+FuqaI&kFF_CdUmmi!qR= zv=_xPuPEjM4YkE~8`W@=F3jO+ehj$iF81pEnV(DwhjYw*FiQ zfI>E)=h>YApMN{$Kh~>5e$)Ey-BvQy5hh@QaqD?}FOi0)yN;3?y(Bz=>m2c|QxbSr z;TFys2_J=Yv*5*Q&IQg3{W|Uj(5cr+u#y3a6h7m0Jivgd1lJAQJ3yoxhrH&z_W3T8 zcnpdT6y~;_T~J_jB%mD zQ_k{vB4%ZXmdztNJpMcZ(8rCj1!eV6Q_tRY+SYfr>~gq+OP4?Hovw7evuy853|^j% zfbT)1NBvSySiDEHDHp_Nfp#*;$)}x_D@p^}KiEmobKK#3(l_#Jh}W(%Mn1Z9Pvms& zQP~X4D}o`KT|a6c&mK6(=tG0bX{+|pcE&CL6)X^)A|hau1&3+|Uf|n zqYm1k1-T|3+NqpRo1SLa>I)AC^(fT!Gu%YJGX1=S*L%7FF$K%6&sJqZTR~#6pqJpp zffBe@qLZbeH@SNA4#{MurehEgnZ0NsBw`BfVN|9hO6$NSPlp8|DNNLHD`czjN8>s` z6+=O*%a#k`q(2F{{tTi<9&aZB=3G%H-INa(!YRP7qFvd-UBf8uvKiSD2Vt69!sX0Q z>Q|D1z$lyvAlD9&I79Op19R%}5@MKm1u8<VozS0;q{FeIS!D@^_(B8GWcl(cC8U zZljhNXd@`BxLCLp+o5lq(H%tzSQ(`$-y#{w56yyLUZ+DM(mgm)4t2{%(G z6q|0D1LZA$HfIEd_jLpiq{(gewxOL1XQcxO!Ak`_Hd_jbYNk3;o~p97xP3s zD~&$6810{+KpQQ~Bgg8TM|h9va2q zxK%xHCqa*116dqWvX8Xg+vp;jUx`jIi5#TR<>w$@uGP#a;wqHFnJjnetgBc73f!c6 zx!PLFHI`nnxYCXt-suZSxCL-$5ciX%rR$~iR%w=$sffPm(Km|9h4o+OR&STDz6(1= z_bGZMppR00r*@pVMh!L0s12>u$r_Rhg2Q~Rm={A-*|;Ck-t2S0ojI7N)Y4iA>E?7a zp#v@XHLFxQC3T+-A(nm!R9;Ym2az+@?DxBpPA4cNjVH1uGwW%>9X)l`KEvD%@hCL5 zXpP;Vk87zv^UsL4Y5Y;h@yIYyV58^`VkaE2$9xXl0tyhwI(zDT{_M{83d$dQ_y>^w z+|J+N8Z59<85J*M?I9m1O^P4w{4J9H+u{%4^4ZsZQxNEcC3^~h5hz0;askQ^q0;wX zd9NRv9GAQZl%C*D=Ac)zQZna^1B!8FVWqS^jZ=D8>yMOkrGrOLgg z`kblRo63D-vC$!Zs4~%INAX8Cz?T_#6TAeW@8{jX4=q%R%!Enf{CUA$$4()r~XO$z@T(dmlR_8E?49y%c2s2ycyR#0XQ87Z+p2?>!n}W?uBbR#%9jTmuDBbBoNz>R4ag+ ztg%Kuw`#T|zXD}4@Qb&r_*@51nJdi1ZJ$>^RokNFEUiFTRU@`Zi!>R#LMqt?wvBPV zT?=Si8?BbVdLAW5N-%0GUQbmk7WOLgWN+i!`8O@_Z7|{lD~@46<3@WOyM|Gk1w>@_`h&a znLB;A=H@cy=^=sLILN#6;h^7)RgfXIq*BO^_dwNgXVw=0k}pHt*lxLw6(PlWM_NDY zoC3%{o*eiW9)Ab(|F}5fggCGHdT0m8os6$TT)$v`ByXboPlbB9udX_fqGL{$4sLGy z5>imeA&RELxtg6hrS8=sgU%tCoCw&}ZuCyB`IIzOHQxr+TEtQ(3!De{i=bxkrK&5} zp=I?Lf*jhJh}51AEJo^%dC_9Zod02zm?@O9g>)JejLKpk;f|hr9OK$)Ok#euy4`lF zI;nUDQg^a`R?;QYE!M?g*p3XREGOvs`+t5nUyn2%x=(%?DYa%+4^fc0j*Df301;r7 zNLM}f@b@G3L%^L3M<4S3?2~0DH6m$ zdNiBK{TxPFQm0_4Dl$0hIsBePLunb41Deh~hOdwp%XFa}KBj@=deth^Y;Gb8C`MJ& zwWJ&QUE1grio%&Y*iy(>n07ogax_K#5X8Rak=G?mJC>E|+DBm`op}q%att8SaiY%6JEt$vizY%C}*B4#=1m0GZnzZU2#5?WQgL2}m`jtkXssa4n6tb9sa zt`YIhq^S-7P9fr3*JUQ8IkN31?hm^v7IMBU*`N0i*g5PYfb+y=e$AJjwgy4(Z>a{; z%F~r5`AhrHSeC590iQ@sZE@L)wtYs=13H*3`Xc$DJxg`&;-~}xjWDkPC{b_NRw3Bz zmd-swsQU6C%r7DH(d#dG+JeJ^Nl=3V8T@_mrWt1m{n)^CkCMNc+-X>vZGik*E-rk_J0cN{H|Svu4Y`-bZHs)93n24(?%D7PIMw2BDvXHte=$5 zY5b6|rc?Hoyk{7=_BKf!uFO$BT{9h2llqPc&;jUCa|^0L(P0w9J_|g z>oBMrd6BTY6OV0v1|VjB;YlB|I86>>pHjdbr|38v`b5xp^a04rc3)cLkhB0Tt^KQH z?wDqHaBd_9Npgd|U??-40g^-tWx8rQ9BO5?oc^V(N83CIBP-E7w92b z1SleUCovO+mv#8lBlpx2d(9kkN5O4dtnqemN+Gr)V|xg|~+Y6tJT0RFdGtWzM}Ef}{)`Z}AH5 zJJ1AJtd6ui1D@ypW^K4^0H)StLv-N)$AQ|*FAhj;qW5vg4sN!QPXB@K6X|<#UY44g zV(OzY$HXxp&c4UeXB+(g&h}>ig z!56qF@C-CV9CW4-${ro*O^Gc+A8Mc*3E6E__ymP1z8)e7#&i?7=$navzaE1j08`MA zHc>uFT{OFb8-_1*v5F}c+g10yEHiAqOJ_3ypqxPt1MJK0 zilO-ZYRV_`+!z4VaN+59UBW&=y@NJ-9zmy!T_j$<3|A235oFX1s~{53qCIV-w=Fy< zg?D>SvRy2o2gW?%Nn0eItrx%QzE`HGMg(6iYs`=-1sr!v(Y(@ozP_ygBqU;)1tVfy ziI*>tB8=ylsgNTrOJx}0xc|1`M~JS2c`ZQ+E!ni@>qvu1fW>))2E)_1s?RTm0xq|Q zcdAzzH~mwYP<&wG)$QO93MLe1+`>?Dilc3ta`GTxPEnWYCP*}j&{_4+&G(t)FAdKs z^=jv8YUId&_F-9o7D>u^O$%HeX{Xvwps-tmlWdEsQFI7#7RuJr6{wnexs;?1@3|qt z-1^;mG986d<5(5GFC!xl$t6TVh|@jyQ9RkK-~CY&^hu|or0bNDfjOJP!9L(|{GmE} zxL`NgSq+^mJ?A(h5FnlbJ7(vf=wlO6W`3=Fs;u<&F1JD0*0P$RFVM zMIf2{RI3j9!vel?!pUcpB<{AK{Xaxj9{2~M!ayk zUQ^?|k4#0w#5t*@o*G_G(z{t{a=1eN*MZXuUpaw2WQ^Wy!U_aNm`F}BN~*)D2Nr_l z>7iqu-JeU_R++y7NK`3hcq!=}>403ml}bIO4%#}~%MM9Y{hep;H3Xj} z`<^jO%^q7oP$4Aa<=@6xGs9wt_`6m3YFN4091sNsQs_ zVFDEClICTVxZ^jb=hnrix@#-7c^7a;`e!oA&HtzC>Yw$hs`FW||A2-h0wx0aAmoOd z+>1a6hy*}8&_KsvLSZ^(S{!YMjs+2_O>3p9Q@_ffFiN2XGblpEOaVoe;j2O-A)kia zkeEnQ#PSvF@8zsM>+88^bM++i-u>>g&pvyfcb~nVz1FkV0+UAVZH2|_Rg=UA@&0}u zZ+(gb4B`YUku^ZloH859`?=d#KcrzaBGZ8mK#$3@d#J0vwNnd=6KjOhDtxm=J*m3t zv%yeTHDIxzKU@eFcnawe@lG27)T!E$&)HbgM8*Kn*WBGM;7*SJ0v})BG-WDj%=z`! z!}vVhwfHvz95v}qdyt;&%B;m~lCMN+3M}pJ{E4TX3IffBb_$y;{)h&8RLv12Z5E3N!P;MXmt=pmU6;DCAKHXjJ)_kpoeV0i7o;pIzXgXO7K9LM~Xd zj=*9df|jTDzCy@y*2(WIj}!nyF9#T+z}BQhXwbwl1z?OhgwON6>EgLR-C^7yheSYd zNQ0&X`cjgAp(dkl`l6Nd#EtBQk|oLiNIhs?9p#cU=K)MS0OpVqL|Nj4V2s!L@O}Gv z#Km#yW_2wju!_@3yd%6O zEFnUHSdt2Uqon0il|c7qjwr3|$pD_*vT2I>&$V7<7t zn&mi|-M$7{Tj>7F@2pBKqD_T?&fSgJWLFrpaW9~ekR;rpRbT_SZzN74P{Vo7sS&rI z`{U-&Fm@%Aso4+`7`1weQtCN``kRtSaeIxNHU^0AjMI^KhCKnm5)lJWc_8OKwwT?% z&1!b)apja(n#6W1X_C_F8MfuYxJ@(zah@_Gt>Kv8w zix_Am4S=(HTzS#Ev$$S0(n$2ZfjOkLjU2`|i_XJnQ3@7_Sev(|jjd)&072T>%UEUP ztXs=}|G~gAOcN?GCwdL<>LQktah3IVFyEB0U;r0{1qd~2c;f6}$?TaXEc5#sXT^Yv zAe}XfkC~Rr$8m)#ZNyR+gFC7k_;BdI)xCnfhwZTqgJ@I&_Ka|<<*UTzwwx({r?$45 zSyM&zfDyN|o$>`Z_se?Huf0V=Ov|ZG%Q&2aAhtb_7SmZ`D5n_YLEM%qW{DsjGnmHb z?%o;ZAn6vb*U$PUO>50d8!J^h3G7M>PH+C~H~5#Gnxz%V2iL7%7G`nu{U&tj>ojBo zI`{7}h2z>~;Zr9%m=gWCQ~c2uJ{0_MV)9--;q;-LMVa(1v{_?CY^?OETs1fMj3;YuiFN=wnd_O1mbzu{E3N`tc+Oki@|8>H;M-=G2CW*K%jx%N$b<|G%^iu* zQbtDdq|1jgs}+$meg0(NHR+s=^!psG)HEv~H_=o(77p0-yLK=&h1{nBV-mGJu=%i9 zyboYf8LnIR`;Ww^u!JKHj5rzOHKFO0+JC`gL1a^01MEyH3%nB{c_r|*$VPfWXa>Fq z_aL4Vak2*h1pSTU9eYZ?*BkC?90Wv4UFIZ%2h05^EJ0X0+J}6}=scYe zP71Hu{`+(wA`ZM73!_y0QQ+UIEJ5CUmaWAy!+mocSl%RakUmA+FF5H%pSok4xU4I3 zB6f6K6;CE!d)HE_FO%CM(HirDr-l0pXr!Y8J*ZP6UCcnbh{38GYe4@>7RvL;< zD#g$e)h2=>#|8m};E0+LgAcv)!dksR&Gvk5-zIfmlx$2=+kEd<=0qa_ZM7?i0N|+Z z-^JV3w5k(>o+80uV-3<62YHWDq9x{~y~Wk|jYP~vo|oKS=%HcET84vlE$0+a{&E~5 zpQ8)ogwz2#+$)I!&Q4Mwf%|fz_mRwplOw!&H!<3+<}C7erk-|gpCX<0sM_1a)^12v z%>-E&04|<0$yvhG;?5)N24Nfs!9B;)A-QP`5vnPysz6mUL}C14PxbO~N*`kcVtW>8 zvimWck^2XGTjX$lBP_Z0Lt|lYMJRR+n3vub707Qqn&bz^*fOwlTKyZrl!^)|$uUcd zm_#QLQ8d-G0sHXhBNv|7*Qfx{X}lJ=GAn!;GDK*zT$Tc>)82rNb_gfcYbdY?y0k(` zBrWf|&~h{$f>|&dDDH!Yr$U*v_N;fSOLx-y4nu)?c?ckohOP#m4{gSZ9M2?8)1kfT z%xTWCs%fD9@H4+AZ;b};JT90t&;who>LxHlP?gEK<6G3L%XP$gJn>+ur#kcGxmwG? zQ;t~9SULySZQg5mX62GOd`dsxXJ_Ty3ojjlmfR5F^wg``0;5$1j7FRHzS5|qM4(X< zk^kKDGV?izT~>6Als4+IooFKXLq}@~PC!;NDby(;J(9N>La1}*nDHefE(Ag(p7Fm0 zhUQUe_RyBY>;oJ#+7GY=Weg0_lr9cKuT>GGL`YuxK4S}g&*GX@bz~7iefH!F0g2)S zt^LhicNgY=krnQq@{4O#?Tgc^Nxp83TK^mXh`PVQouiIBevq_ld`9duxTWH?x4|mS zuSh@FBR(_21xw~1_w~uxF4+a&dEdM#j4GFT22NmqgO}X)I`khJ2Q=KosbC#NJL%=< z%l{5iwt$pfJ<1OwYYQlZD`aGVDRoKMDPF!JrD%X7zE|7egznE-AQ5D1#4ct;6_FN= z89!+!aXtW33REkwGbUmJ98evd%Dsbc(~a&wN&SCI@!rvrQVmXxBp(@A2*W7lp}b>x z^#_PuZ!9EiDwY$2R+ZCv8RG4kNBD4R&vJyg`L1+;7m``1E!6~(?}_}-)`w);$e4GN zm=@70TRvGrN%@5GG00o>2}LAQAeQnjR15T)xC)X6B>0tyt|7D+^zqMxS!Di2FHC;W z;Pr@!%^ZgaRGkP2_zhdDIlMNiV2~d4H1b;spP*(NpBxGG+il=4o6C6u0z8?Sg!h@0 z=y0Q#Z9r`RD?HhW-No%LRoROeOP-20NVZ+8n1{{THnci+rP8F0WQ?1#=(|@N*r_>9nkQ}i2W=*ocS3B z5&8nQPo5_Nh_gIVsTzM#vM`9o%OlyBt|P2|AjRqHDIm6EF(cJyt(1sg6TBQUV@-au z$EE4ZqPB)Ssm93RPYO3EDrRF9^DUnV!ha$K=epAzor{;4A1ut?aBg`~&e)w(l09z0 z;>2wx(Rto91|L|AyZ_t62cn0x!-{8jSL<33S%{(8X}W+xqAIh{;Q_sE3 zmwV`M;`EbdBQK<2&+L1ZL+{iRk8%mnf^*o7_nbHzwLZK5wd_nwFFE6+Ifk3E3a;D3 zL(W<@mvI}QEDK7tNKlZnudAI)^f)*}jirx3N(B7#=&s*T`5mV|aO$xfh^`kDUS*7; z)90b&!_T~koQuwwhtD7W{MRB7zRefIp)V%GT=J@vu5+Nr&)k9#gwaPQ5bCwc2zW)v z$Iz+PW(fZK+=)~8D~bg;fDvra7&+0526?b+5edI|!Z15zmneGI7OT5*tpmZW5wbZ* zB1t74{%sHKCsYd4eRJ(tyAy)2G~k~;BnWzu3e){&Rq_20^Kk@J!W|>BjF7buW}n>a zTfTq#$Y3$RBd!oox@D?9|H;XQF!ir~jRp;EEGj{1M2ZVT#A1s=8jL0NNm&gxX~s_$ zNSpFj680dlgWFO5(A*lXlh172Ns-lzz#0(jPk4%a|M1god<6m+FuhvgI84mMC~k1 zn1Ytz6ALG$HI$U_00=-0|L4*qJTcU~;m#eD{m=}Aqb_O&$YcFTk4mog*6PI;a?M3O zpASH4wj~z$I*^~aUOsZ7cLaEz2yhVj>Q@oEZ~!X+FdYVX}9u18v}(%Fa{hG$-(k2Y&730CM8BzgTXFe{iQL{*GsP{9XoJxTk_|q2;*y)aB zJ-yDhMql+fi~(*eY^V31zNWy8g!HlV;daxey$$MCFe#Tx5eELsH-WdnO^KSN6|T7@ z49jPR#vANe{{n1Iv2CXp%UQQNLa0bZl^7+tPD>MDDAD z@V?W;eNlyNxSFG!mk8Mbagclj=ICldkX{u)hX80b46QU#0S*T}VDJRo5u{P>XSyj)E&|g@XOwCJgL5aGWWCEI zN$0IFxl!14 zFf%Yupk@dRkr^l9wvl)oydvso?g>vtt4(EQ&Ksk)W+{aLbI~a7E~AYF$DW>+seP&GuFX1)KfB-U9hiKirm=#Hb?YL(^PzY&V!>Xm=i9YZFp9tanVhlHH_pF{q2>yS>kp_zXJ`mgtK~ZKQ;d zC=`bTS|p^=3dwX!QR-nJqBva22s>GG=f*m!uA!Iq^-Z0-~Im(GQ zxHux_O-DQ(G-OqU$2d2IS){#D8rU$*(jvwOl}(oZ|^-+`*t?1J40}zf+ZAHk5Cpn%BLo z!xdOT9U&fF0|l0NkSnBJuJc0|B3uZ43*p`%mX(Pl)Ey5}OQq_B<(DWy#LBLInu@>2 zO&8R-k)#EBfF2I~_m0oSNhq^Y9@ri$PnyG8fJRXBX-iDr)6)#C2X1+lIPer;n?WOc zRY-u&CJ>ldI4ijxB0GNhx?NzvNVXpU^nu7|HjUV~K7Yi4(d-e#NL!fngCn>|5 z4I~l2@{lk^``MnC8~Sk|L6Ik1!?$|kXb>G9bD0pOBPYUGu%um?bI$fT?8a0Q0>KB8i0%0jeUbp13OI>LR#h>XmJ=*@Ea`BHGLIYR zjx6uu5XxZ_6+lJw&S*Olk|#;AJnZ1S=>s*5gQ{u!xPV*|%SI!|_znj#gbBd4nLsdu^^OGL z7z51Fc=*#*bFYAdCQo{^%)an<1I&+mwYymDL>Iomi%_$M|Ed2XGb|BOgH*71t3%Rg zIjNDzApjK)<{{{$t>VnMu=UwOUVCm?10S?{J;(>h3$to6$`$#P;@DXc1ImOTgck%8 zA}uji16bQA(&|M#?F}|Inq$zB)FnagqMFJhKo)hCagQ+^cSL(ksf2VMX7AZn3Mi8` zlDzNS8uBc7Z~Am$OCnj^nq@zS`E{(sDiz1O2MV0MU{EVS#x6I$oTAGp0cmyMG6SW zB9Q1D7)jb&aiD2hxn$~ZrlD>RSoW__S;;nGqLC>?bEt($H60X z5dr{Y5}@S^W}y|k4;idkv2YeXcO5*^!Yw&v@lkZ!vF*TXokJoALrAwa9)oXZ1f_b4 zx;Jt2GkF>uZ11)ROzvL}R)BMc<|6SVjO|NVCIiX)U^L~ieB$Omc4t)eB za}J3bXht_mr-k2YD?^WyA?a}f7xMvz=8p^`zbF!1cL83m*Al?!c-FniBH_1!z!?E` zFEg*!!Lb*Qe=DIxyBvI@k=*kb&Gqx0j~E>~u#dg_(SyTBLe7mOFj`DWJ_SVrBS|{E z3OhCFdHs7n==)~+!Y0)x3EGKpQl2#BAwv&Bzroc~tskrz0#Po&4xxBt zx5MU61ZNY9Nu#wT%)(h%%AgHMTYFR)R}Ro*ITvrJGd$4-5sGvIXj{~YQ2>4DLX)5^ zWL?Gev0kex{N&;*Lb#}g&s;^TqJ@ONfNrB21b~u^KE{Lf0}#-RJYixvtRw0HZ!8k@ zWyPvmC2~R;I*y9F5ZLi&_r5Q8D9Mq7lG!7JkKWS(cnGK=0bEFEBK!s8Ez-m3o4|-A z$#L|2D;py!Eivp-dKNzJMa0v&+v~Up$aA$F(|qaV1p6 zqSCOI3NE0%YoU;8n1TTuLoH4{A^10>zM4UJkN0{{w1C#Eb)B*X%orTo9)?J6eW0;; z)gE)sl8`du6C1F;*P(Mx$h=jJJt;Pu832L<+mPQ>4T%Kq_+iO%w3CvoOYtZX2tqvM zwsc4@YTQ1n!j&!(pdqJu`S3KL&-)h!E)z#=ybRJE)eiH2G<6WmGs~$ULe`;hDww0S zEdIU^cY=IjiRw+3Q*2iS+?h{|6DZ@Mr+vd82M3`?_Kffm`Ca%gv@35hK^G629=$VV zR+%;?^m){C!1`5NsbA7`JQ%8|>}ru=G;~A>Sle+7o-qNC44BBL14~rDgn+6#+PiuE zw*9YrZndm>yWCODPKb3J?P%ZaI`lfu$(iS0LXiE7U%kN&j{_1_BdBNbDvod(H-VC5 z8N*p6B@*h8Og{9gH9h%5(@<$uB0H{bAsEQ-#@{BPq&*xY9m_QU*8fPt{gI3Wc$2>$ z53L}trjKMMQ!JYDq4}0U+cQ_9i8$dprBumpx33^%7VOBm(oweLXw&ZarpQ^f}5_uG-qxJ006TPh=iP0g?=8W8+mNPwq;XyxHF3g!Jc;IX%hDbj0cAYJSi zxdgQ;t%%OHv|+JnB>kj2E2ADE64zaNaulSUhztT^Aa+|z#5Mtb3i&0JcaSO>*y35w zSw2dhlao5R2todY{7NhByzcRmmvN_VQmdh%ljJ^rz(Z<-<9Y;X!M(h2b1HyZw5qR( zkg*BLsQAKnsLn9xHhd+;l^sYRh%d)dKp(&q(x0==*6=9+q6p=G!GNZZ>3lLs)MC%! z$|X(F{`|>W*9>S6(I8}a?xtb9-8EW%7)5jCKo0GR@Z9n@8ZH1*Tr>w9IGYL}b}*`D zo6XP~^$613AOQrkFP|*PGDKxWeqVBUjqxDqO;|9ZC~3oJQ3ER`?*tGZE*dcoIqC@G zXbFYO1IlO{oE&4`zq1*5FRX@Z0c-m1pUbOF!h~9BuW=5|O<_Dyd_nRZhJNC;_jGpHS+cJ>OU z?0@sEG&eMm_du4@n<08MOvIejSfqzjkFCiPu;wK~Bk*(yDctj)LSs{`I52o#YC^t5 zIR`qX*c!MZTm^ZL+QBxvl@<>T%pjGq)lq~tUV+)!q?Q~+ntiI6U z&R@R4M)BzoLCUK0E3237LYB zYBtl2#AtvzS1p|zDkadJzS>ZnMVj}`_+<>D;UsGgiE}3$$BH`Pb(hngN zFt66q8M@bLNrZ-5afzWR!8Fp8_%ufQTv{S8E!40tF<_L|YSl;fmrk)P5pnfPwWLPM z13}O25s+>!tOmfnIGDDD4wqsotYKiL1VQ?+I?lk5IUx)6y%1RWh5Wz_#Us6bT-`#aFUm7RVMKyZ;|6aP zY95)3x#h`)PY*z_AKW8iux}=(hj8|bF2h4#m}9-R!c~9gEf=(k;LmbYo35i|aLbyl zh37|ks|_{e6Sh05!I9mWR+I@A3(^`A5gEkp7Ak-oltk}%FZ`yeiX8h!Q*Cdp-*Hbt z2wV%vN{$vCLY8%7s-_xdogZIE8H~b5JR#Xl1!Y3wLfzlT%-&Nm&Q;$kE=oWn`n64s zJ5~?Na8loyAF^KCWtO~zlHX7v9wk`vqiar5?ZGna+fel%g=_|}26CF

_jFw$ZX z7~K-KCQALVhj+kyqM9t6(y8^mGjbYW+SoP57|z)Y&Poacz&)VnJVFJQ1x-r)Xe^wA zeC4ljsXVu7)C1mwGWDd^L!wjn#azwjikRnqH->}g)}D<`a&z}U0~K&8s7NMH{lZ$5MU2DnManK;q_=0z+rY`H`7-D^1GoRt2JW90?XNX@JPdy72^*LLyU<)GnY~# zWCp!jTKB}1Xn0mosw2b2Vl7J_Y;a%^_gD>4+dJFUB1?ix6!1vPS9Pm}Z_O4$R+M31 zp+56821)`8=tSpnRRFK3Rz=`znRuWAOa8L3U^(5xyK&fmPQ-^VHD3;0@u320)WhwiAX1y!&Ma0z$qMsd7p5_2Lli)?cR~{w3d1NmjU>= zRq&y5J$gjXid5wa`fg7tYW_;x9qBy0p3W4VMxOPvXy=g7#t-y8t|f!#D^;FPIP9fC z$q#@=sDYetf5$iF#ddH|=#mGbRy2N16qTBUTmT8Q=qDrU*%0@~U4?zw?Cb zkkfEep`M?rZ3h;{|3mLV6Ao?-yY*36NVOX?7+Vm9d<0;{66y-6eOf@7ZDqS3RvK}dA`6l1=BFF}uX?Ey+M0VonN!;=t0Zgd=!&97NCpOj+` zAWcvK&|_>KSU~e)Kj93X;nB$B(z6br4>RFUnPc-&=uff%P2lp?2#w{L#63@fxtm%j zgq4_ET?5ehA63)sSQ_iKs`=pIRHNyA#}gU`RqVNmMbxl?nsnzizh6J<#97D&dXV9u zhh3sB8`$GDLSEpLE`JmVagOA$$&5JDjlKKrbc-)5SFe#FRIX#{@c(M1mmOzFiX|!^ zH~4KQhPiO!7l+;$;15buN=oD!xb3Ds>%b)n99M?-@+`VHjL9X=?iN47c3%XKk`kaT zQ>Gw06IAN}MukN1V~ny)vx$U{qR>ZbmoY)!x8mqd1+4dX-6rEbUGm6Og&A zh??C{uJNFi#M-lu8;Mxte1Xqv)PwY4X>m>|-Hvayi3X2U&0~c5ig@f-HLqqAnD2m% zl-`d((=(d(6&Eb18A`A>5|6qsV&0Dkd9kA+SsUh^mWBdO8XIHi(J39Fx-ArNE}GuY z$s*#fMd5!n2qj=FjYfI1JAQNkNtZc^P!*PcI0S^-6o4x3wJ>Fe)f>ZT{H0IpN%u@x-&-bu?54*)KIw<^zfk%WpW)TTPoZQs5I2_gj^~Ve2gB?-MN^}-IVyE zNGMw2Py$XFFuEBaKu~5`*ShDw)^fz}lEibrXGp)Ct5NB=O+ZsP5h;4ryy9vfhab@B^2Z56{}B^xe1^u2N75BsT?9FjxOSU03$=$x&VF z_B_S*Y#Dp@Z+6evW-*J+U?-043=lSBh=M^85`vdV$zKzpNXbJW4=e&%m?apn0LL;W zfjEjp660Asi@#aC#yfd(-<*5yQe8hojpo<&Rd-iccU5X`n-y3)ws$l3p1k-94!L2?;LellCIPx}-xh))%knNv)R)gV-0=NlhISN8<1UFNT?p+_T3~?nwFr*xW6)cvrC3tr*PQ`*( z3~M#BO@l^xYVtd2y$vKgH|F1Ogu8z^ugzX~?W0^9L&-{$AZ7Q!1-zDPxMeUu{v6#! zvJys_NqS)G^Qe6Fr)OI7kP4w1&G4a9g<)!eUA4owbQ06tdth2hl4^A*uIc|G3Egx7 zKzWjy&m`}Taw%!5H-k;bikLNbDu;n2wzJ4T28=|45LOeA#{g0ltb?GtHU<$%e$Snc0odZRs^T2vt9MXEN?#<4CJlTqb}gRiC=Wu&Zri9o7{Nnsr6 zsDzVi98Cz7Zu^-Sl#z%f&t-DIDI!8B0H9W0aXXHlsX)XpCpMgWqer(^uZL0!zixUw zw@7xWOeDZs!aE+q@B-g6$}we6l1OR7ODI~;AXM6#W4@Eqzs04Ay?Y+kLK^pishb3IMh1my``0-U?cn9Pm%kfqv z6G%U6<@ybj^WtStlGv_)SULhA|Hl7x=O#_{e&c15evoG52*Mryku!aY>Z$$r4p5Lql|6f|lFYUIg6JD6f5Cpi^XI-l;nhoK;Ozfjo%G+D@boXljVDL~}lF$bd9m5YI0e$K;Rg!Z`#MLWmHyY?+DvmjK{AQid zr}ZYvEq8o$P|)NG^&})fqmc60zRf&B5)v_q0i%+;0CS1qGGI5dh@zNWA|@)!(CD6M zqIT^hMqgs}op(t}wfx7K7f^o7G2|yWX)H>0Ezk=avCQN{^iFhLQ^&!CL=1kGF9HN~ zVSZom;0~DOGnIEDdY@#CghwGT6al+POiHxVA<-lzJRGFlqjMJ~Aq)zI+J`|g6ZtXe zW=nDj;-t_EyT{32S6c_HS>9zx$M;SQ5Zg$;o*Gz37sY7T3>?ewAXs@!Aw3e2@O&*R zG9-x?xQTSLDe9-Q$?@{v4>}%o*v`xHNFL5c60wz&Ow+gM>j?R>qY~y;e4R~VY$Or+ z%RfDA^{fzh7iugu!SxwMstQQ!4uQ7m@~`(&q5fX%^J*nu!DqBQrz=0l)cSwfwEiYf z(xOoDCI2$v5ujBzgezAzj0(GB4afY@y?`9^m98=Xp$nX6N|okNh=3A)l*0d0iE>y^ z+IuqyE>r-gs>lC|ao@1c4p2p&MDrE7gm2j*;xroZ8uKZQd(&(UCC4~T0@yL10H7oR zB7(dhUI7=g*JGTz?4brj31dsCftb}XQF@M=oU&@B2TGI zgj+`FWgDebHnE09u*{=sd4oHECNmi`Wd($#LV|zt`LOMw5y}T~pQS9gCg2O-CS9?& zB*TVizdN&DN%IVwsnY`l84}IKRlur=sB@ERg4$Y7PB}UA^FC+jI zVSwR};On16-MR4V&7pO>U&` zAjc@{n(99UTp|Kqw=;^SChtDFZCXN`W)BhBVuK^&kjQ6fNQ|;(gz_L%B35lG8T^bS zEO~3hGU_aA#POUzre^}E&x(LLpe~l(jX)o?L>u~%O0>*2N8+W?m~t8bB$|TaF#*?$ z2mNn!9G+TT)oKqkzH8FN6>1;54Pa>c!LQaQA>mpCfT^(5Jt#4?nmaN#00c{cyj6&2 z*XnNgs(bXbrWsd%pg87?0@e`3rmD4=<|6l$CuX>CW^_$ZFX zgm=Tz!4J=UvXD36lr;GVmTc$>(Fs&jzY2Y&ls8*PFtV7Q3ED=rINxVNH173onh6e; z!4s5{v$E{v@vMe`%mJKa4Sq$bXmf{^OfQx*e{w|vG)hEP6YDoMkUMnn zyaTu-r0;xyE#v%LUV;Y((c8s`zpSuGA=NLe^e{K%sv z*<~3=)M$hSx#pX}`Lw-`RzeOcV=O`D)s4Cz#E8|;{~6)Sk8EjS@)*VpXH6A;K}})Z z;7a4LHZesuj_hU-Mj2Kk5uZl4e(r?j8J1xft8qKo5|5myrj|PEH*Q!Z1qS}Ut2_G3 za}kpqyC>vm32PbV?{m-l06_fOm@k}%&&|Q;H=YfRpu1U-xvM36QbhUHLVmwC12k;F z(zN7b`USxyscRs58`6@SaS(Vc&CbL%A#1Ih5sel{a#9 zB#7+?l5bjSESkR5+!3bc#b)`b!5vi%4Tkowh=zV6r8|$>+@x?fgB>s)Qf;@t&7cf* zRir2DAj`S^#_bwHgm(O<>pUn{y@KVCvd?fTgjVdjd z>x^+TAt>3B6;sP3oyc5W^TdVJO{uyv>)6_63T0mM{G590Cof_zuRpX_kL=lq+dmD= zqY4$+?XAh-T^kDvJay$YY>({Tw1U4*UwYLsRF#~(_-gJS%&BhLzjdVI2per$I&Qs(?H5sHwA_A3}q)`|%W`r+zxYw86nS}T1W82DVxsPo%FOY?4 zbnqa#J;R}aT{L*Ijt&(01%`_|Xp;5|4ixuO`Ew}L#27`BgtG6EaOc>sap%pus8zkf z0ukc$P^O4%upbNh;W6`3=J;LGXum+fL%{w>%rDbOrk3!3EekF=!-E7s;Om;blj^qP z`=$x&nDzP`eWF%2gEi9-rwM+K%8Exu$JVi;VpRi_%+^A@oMA_VhK=#=a2QwO|fTh$j(VHs$sJdfG61{uWwrYX;KZLVAJ2DU>?f6_|+(I*lzpG0iUJx!P}&f*tj@JVbUajt_jn||DHY=2t)anZJp zNM! z$e&qGU5n+!?@PSjGB(b*hvWzb=i{3XpHF6_mA`c_5%`F!ww%NqoFpv!eW@&2`B6v4$ws;($~4**17 zjw*RMWaPM$Kyw=id#hZyEJCy6Bt(K-W`j%{ou8g7B zrbNfDd33MIc$CdJ1sc!jS?I{FP1pjx)LP>3&W+dt=cuaOeA|Z#Oq{*)`mk;q5zx3} z)r|e<-pygnRK5sV?~{}jF%8ifZ#uB0Xekh38JQZl&3uYj@Zh$!z9i~Xa_7`iR+OPU z3V}tBg$ORW<&OvbN(PQB6>5_N04iU6bN7KE!>uMHqKUrclbyuaXW2qPrI4u*gO9T* z(&+tG7$+rL57b}CT9JmxE>X`1p+svFoKvOTNMthH!&qr%!0+9*L4tk(n>7}M^D71k z!I6r5YbHGkjL5iY3?;knpN0fjf~acKlGtmaVCFmJ#9~9 zvb=lH*VPzI8dZy%T;@Y=_RJdre9#4P*RL6 z6HKm0nh4+*N-f_ez%L>Ek_A^o)d88hD2bh7+IdE}^Zb`AIz@10WmkS2G`?J#LjVki^?QR}4Sa;wuPU2D=?r(}P z4&~$6(HPYItS>sH8ga#P6)(4l1yC4U_Ar>K$+2KBpw(F@l~t zSh;{#9sNZ*3FJ4=srQ+7cY=vpX7i`4gga8RWcBN~8mUA>^tx68ovo@$zVG18#C1MI z&LQ&1ed;Dw*gQd_^tVEd8}@H*N=9-P9wlG-l5H!_^BCo)F27bd`S8wb z5}?P=*~_ohgWr$6+T`uWKP1vFJo|dfbkGn}JO9jU%x~<9FP9Jb1z2+Zp3Sx6DJs#H zCecUHpeY{ONi=sHBsVy{`ob$!10IC4izGr{f?mA^xniNFG{TUh$n?>j{;pz!MxF zk!l^Dtdq=DJ_EMt@Kjlz=@v#hU8?;|RhSZacw19H& zZFXwVxrzvetWbI+lL01_+w&CotCPM&Z2n>^{bFnDAjuDz1S_6Ph1H<*mZ>7933CHoRQS#n)`s)-d?KNYqaST5 z-DFi_r$X&}u30|?YN0_T0<3}KxoSi7X?ja)E`=JL1srfCU0_)fy-SBpJ29tAH2x}Fmb9|GO=+CC0pc6Aup)^Y|xUTX8)^!YC2Gk~8Ir3VH7cC(j~hCDMKmNtx{#-#fIe3O>&# zR!>8kJu%_6ICzt8L4}S#z4Gyx^WqS9Q`MeBP-!49gfhsl%YH;=3X8~Yukcvg%4<;pDR{)3U5QY(S0n{10{$$=thav>Mih5b3Gcrd*^cQ{7iC+vpvKGMjV;I1X{<@J*|D0BoGwQqitzzuz^w1W&Z8Wj|kb!DF?wy7ID0-43v!|D$6Iw>ggV{3nXE^V^lRr%aYsxz3r z36AF_N!c|&LJUM*(D43}#}oAv4@8f_Fe~H_s;8iRQfQwxq6FNXRwpck=ZAJ*6InIs z4mLnC*l~`Mo`XB=T<+9!&%Ew=vUYC$ps!cz!WW+ZZH<`Y_XFh-LP-;Xp_m{Y`}o@>0-PA~A6lQG1j@4C6E{bE zEUvow@4&%aI1ZsC=+9aKiC~_mW{DOxQ5aYgBn|oGIL-1YDvUI$(rhn;jUFLi#4z~4 zb`&=(OJD?$)C4?yUQPi{|t2k0@c3>liW#8?9wz}7uF`1AX~dv?hLsnRor z#rPf|kq9V?EWhB2xx4}))No1g0}i@4 zJs%fJ!oI^VJ(B&&XA+@-t4INl1WVVgNX{iFs4l$1BsL? z`_8+6rY5X`6IHRJ7$L5K4^hvV5Uo2VsFgP@UjU~@CE!TQfK!9GdY2i5^UO;8Y+%m0dbWKqb~4#uNni7>O&tWv6R zsQyF^!%Q-6(Y83IxA|OF8F!7V@LN*k`hL84s}kv!h0)S)tk(bk{1_r8N@6 zq9RvhUcYDlY>Y}A{wt(Ch;Kr=g9Fe(7XFK6aPUu6RFa)%jZEpq$`_7^xh7#%qnv~R zk+8AA4owlZGh$l#A*HB#?=DwARV0TMgClpFqUBA8JCYB&n(lnZjyYqSvljE9(^L@# z%Ev|}5|HEXigxaEiUR0>ouhjEM#zEmmzHn0VsV}$4YC~OW6nyK(VWXtLv63IBlmc z0pgedg>Wa?$;24gedZDXO*_1MV|h{HzeJyN7HT^SpreE8X$Tp>bL8s%w@GXJwqK31 z_2=IZY5R8==(+IR8wP;3U(*-eOy{4aWN0UvGM%H82>hXnzD`s`Y0&6`K}W84@UbcD zbor1B3}Z866C*LbA~Hk+yUEJq-xE*2B&IJ!_l(Lfk)>}HG5-NCc}aEW6kuT>vec); zsMdV7JT`tICq_VvB$hD9w#PY)mfyh;I7Skzct9oOCt^7e%0w{4cO*%6nidQ5sVm&d z(UZ(U8&pV);w~sdimcGH5mSX)MPLy6!hW`_uTR*kj*=@R(;;6_w%%)h?FG8(W_eTF zEex8(+Q|^Jtg{A$;8Wrdld8AfF;9qy_Qg==iHVW8^LA~mmU*n+F1kxeQVZ9MLS)VY znvlfZK<*A-na$~k!q02NUS6;*QUOgU=JxxgM{78&Q};DBgB1yAW{Qts1#HNOVoH|Tbu7FUzC;qd5Xhlv0&>*Q6&6r8X+kwA^*c%EXA z3k2JrofoltOk`yYm7?K?wTcIMy%RJN{~G+GL~NVUWbd(-7c>}!CS zhJL5o$N;gVNx>w7z0w56*gm4N4zDc&VdC@%p3p7WON$f@aS&5-xgxEP%=hZOP70PL zP71!4N^Ms>@qCMoSPCQM`2QaEj({7B9M6Ho&ZsVnq3 zXyYrP&S}7}%c>KQz?3A1mco3*89DChILC}YuA@!q-qw?zC?l02XhUuW0fXJ78IXI} zhuQcyD5iCl4-z;A1gzmV*-6KhDxSGnS~2#egC29s0y6S;hd3oVm8P!7V*jdJGz;|) zCGGeX7udJZ>T2-M*)&2%FbHVw${XN)c~Eoa6<&5yu4%y{{B&`?PI}oPUuQ`fA>3g@ zDsDu17H#yq=37mDhPKv06Gj_a+mG^00m!p zRKhpnmW{aU3(vidlKsRs-Y}q=8v1*$vvRq5-}?(&@4fcw<$R3H)6cyjqi$#UM@_p4 zCjg8#mGU0=OQanly&5Iez?^qW$m?6dtriUfrfaD7^!jTeloEwysXPf)nq|74;>P`( z2f}~^OI%fhj?HfK4lC#*ma}fo6Uj?wu>vreMl+r$u&^Z6x&&V$HpmrNr~iN@9=iiGX|rSlSe>+*52v4;hi-80lK3!7U`i*|H=gPc%~H?K^Pj6zuNO zTEFwydP_MI)}zt8ERk{OyU>0#0YfT8!GeO(7CM1nL73)<#*BQ#cEG zlnh$p*YDVl^u4LM;M$$}k-6MS<*s35>f9!rCBnUCDRYh_Q{)GKw6yFq<=_C+1io$o zn2hIhjX3|=7Ou|kltO6PHDDrN>R?qR{i@g_$D+K%DlKHa2XuP_DVZro9JH1DjN2rpzK{fE7bXYlsB~nMjI@iK8_OA9^{AA;B3F*Ez@}b;&AI1N*}(hK_#X$ zSZxYu60j+#vicy(!_SRLWn5-6iRGsZo`bWHV{mJaT4ms-0NDwCdHgGcf@0p-A9PTX zicU2-4ZmYC?{tF|(uzqch+4UYOTc*7vhN-RAz?7PWRxq~Qi=JTqrtgEzsgd6BN6)& z%+Um0gf$(AR<7%0yQ`)8gJwOpEH6@raa-v&@Ot>m=^l^q&c+@x?W8llY;XHP91hAKY;@Hs?UvQ4`jbGM5`8^OP!ZA0ZB4P&Iz-x~nT@ z?!_10P;GM6+WVTw-s`SvO)kIiM!dWPL&#lx;kP9pVRe0lMtFp(D@f7A#$Drvp;KX! z7!*wcuPO4>*lprXLbsRm@FIljk-eKH!DD)D6-nKuMbnxxbi3hNJ+KU8HKU^k+Jlvcet#w_c~`)kUUaFPn^>;DlMI&q4qo zocKFgTgpoWZ3^Ir{x#Cxb9OmR#UyWpRlP&zQ2Gw6EO&Ykxwo3+jKz0lz08wJ-V2fyvmad z7Aw7+yeQ4H_-oEEmwO9O!(XkrWJDvpCGk|az9*;}2oj@z<8M<5NVZ3%AxbDcMI{JR zH#1gP0$O{RuS)wGjT>-Bx+2DoYzzRYe~}UKLJ>(h+|-u`HMAA=r=kkScx?n6b=`m? zgI9FO^P~xm=U}!fquL?fFYBSw2Y#@qvYBT-VO5s+1y~Y~Lt{&yzxwA;$a#32jmnPNLljBPYEa;rQ%n4Gah~inI&&Vd1Rx1 zngJ??)wLKm4{tX99ICY^@Vg=U@=80$;kAn^Ahu0Q>YZC<}KA& zN-0jGTt~77n}2oH1&;Tr%YI- zU3SG>O{FTeY^4oF@0pPwEG1zQqMrdO3D=J91xHxo9i3qU`4_z|c?o@WgxEYw*cehK zRjtGVoBYzm`0SUE03k#!ejgcs&#n?%Y5`IJK!k)SM$lcBw?fB$9F+vPgRKIo}l;A@&7QHCuzn)0ca^4 z2j{SrxtG^^fYP$1+?#N%5w8n;>`o%Mi|TR8Hdu4iX^!c%q5V($z|m~2w;VNid*jzs zHpMa_h~Yg-o<+wHad-C|-d1i}*N4zDD>+`6yq* zQ5hvPLyXh>|4=SSY6kr=NWrSko1skCPty;+XOB=ST;PLy+O%IvDd<&&^%9R%uXI^hwsLTwzAO5Q5iMIG5m6EKPjMI73_(T^*Ou!VSI0>>z* zb^?Dzo0p!)vFyy|NOZlmARU6H4fV8`37a65z)go|gDPc>LbBnz(Z9+yb|iQSno)Ji}h&!@+=HIpm;WCil5Fki;Hy-kb)?Y_eIklJsis<7gkG*o!=mtjQ=a zH9fE2u| z!a~E4LR+6#3iAHs|J%B@9zBlZI@K#vyopQhF1ZvfGrlT`q`*exo1_HEi-G*&AVD6S z2L~ZySTrQt3M`A3C4v+$yIe{Xb>r9NbLw;zdX{Q(XM1~QdU|?#rcYO$s-k>XWq>au z{DLi}Hx#9k)5PzhA9p~VYq83^v&SzuU>{iK0W0$Dw6A3 z(28vlJ-}o@R>?2_UvpjbHhsTa6Q=_$g)Ta2L4p_j-=SYGNX1w``=1D3mzyzX%Uf2gWN z2;rXUk&5V`{gqsyvAQ%ZDta+wIf6Kqp(-Tix zW4ViM+!qgPbpM-+XR{&FGAT<1R$X_N912u^2xQ_e8P81sqr^>Dc1|O6n|MYrY{rvR zf&Bz!moJ=3Igp@?jw2*O_W7Mt*xo*TjAL*C9}_uH6-okONn!*@gr;j{IY&m-5ADl7 zT@NIIBoM0wgPt?x^ON))03(C8?^6pYk(mK4nh{ZA%ls@a8p(o4CBhuBs?T=Xfnn2> zP8f=WEHko;O7}3R_M^uA-ApFLdwmf^dKXmzV=2G{bn>EY&yDP zrM-9H9-cHA9^^1>Q2ZacS9WSjfK7YO5;-HM`b>VYlY6umYPf^6%Yf)r)a?6X)shBK zSi96+2ra$-$|VbL+FQ+De|f)|!D*zKk-nWA-bxiBK+d?z-AJ;OSU#J2Hk&D1Emv$w zBt)JrzskdD0w(d6kg|I%Bm7s9{H3Zu<;C-mARX`sW#R$+g1(n*{Z?4!916SS_e`&x zZ0PhCr;}ULbV499CqYK6k7v93l0VI&6l*K0jr=z0#-&_v<;SXhH6{NW0gxQBG0!QJ zc_yRP-ZvW|*DZxtv=&F&BEHlt7y0*JbILEqRqZV=+cnYJq+*_E(=OW_PWjbilY$RW zuXhh%;kqMdF{!Ur$C?An1Sq3SdR`!0C{YuxC|JNeS`L~mVFB}N>lVTV)vmo!p>S2o z=kyR%zmk*G@1*WB`Vvg0nMeB*Z>i`1lfA8mQ#LdEEYNk`3A@!@MV$W+$PooQ)JiFH zq1eTdYEq0YjpG_!ajYaRKI88h3qf zGJ)QZ!Mu^Y8Q{)gTN{%rQ$|2taWEa<`JGvxUU&3c$#P)bd`ut2jK3Aj>{lq!@m!Wa zs8R6J)osEZhW~Ubs!~Kv|H#PZ;@{TPFhQIQ8L_>Tf1PwK=pGJ`1$2xSSlG+_0*5%G z+?jt^*7@_wMA;H~m@Q>WL`U=XViBsv}WVh9l! zA%E-OGeIK3BkX~cNJvOlX1X!2{G~JIZ6;W&z7Gk5jN&g5vCAMo5>ccX1ZWwdvjGfA zZd5l099qh?KM|7_&wRVC#z$+bi9iRDf*sVY831VjNpAGCsczOHkTiJVzbC#nnhPGc z5jD%WX%;^ONye*}LJcK3isWXBInNSOvvcir9eUqPsygLK2aWO6F6yF%)MVaY~k}d%J zX~%1sDyvpi#}6k0muE-eCHht}C1&VLDLb3eDGT|N9z{x_P{P`NseHmOP6L!hIb=}< zmAtl^4738C@@6wXTT{-gCY8VMD7U3bbZ{oCuYHisZ|4;qFs{Cy0$~CWTGP)|CryFs zE9_N?P^W^i)b${*n!DRditv*cnpBFaGyq&Zrn0-K<6WD1@2gk3?1sb_NezgOK^p}4 zum#9yritISqZ%;DM(*#5kXy2ok|(K#Qmt4x%1d>yL9weA7Sp9v$xDPs za8P=gr|ffZ)wpcj6;m|Z%5 zvO4G9!_Ra1j1x}PYkueGGn72f3)t-kj}xm%KD5|mE`KY55qU+srwb_%sg){iNQ@+~ zdh8-u3mC1EV32SEWJr%}XbPeKdu+m$Op{GoBq`JYl6npHTxXgxbn5s>xil_ZJzsxqWR9M&@w0EBX% z9a81Cdjh6RMe4{N1NW$f(yc0-(~QxJ&ed82Bm(G>4CBrB4v_g7xJOn1t}q{YNF6Ju z7x%hpR>Mb%0q}kruD9^Ps{Tp(_VAXp?#Xoz*6pv0Uxz$N;7Pb5%t~h;ND5Svf9Ye& zkF`p4l7-mZNB{@?YQK8>BhSFMO7yp+5(1-I(Ng{-sFV$ajOuw+tFR}UqOjFESeN6v zSw{$Fty-(2QWc2lLg`;UEsfp}^2t=y-XsOyvkW?}Z zrc${QUKIY0-?@;J1jR$Ks|iZr?@4!Yf$Zx@&b4x5fxLQKaA%FX(OPvt2HtUc z6VAl3+M$>(`KY19QqHOd1L%~~F~J(2xFY~DJzQ^$i-Zj3X`g~JllEcS?ONnam`{8f z8f|o^4OGd%7)n!nncrK_&h)RA%QllwHCR7M#qWz`*cz}T6wAe5Hd9UG7fBQXIxG1B z^Ch`SxI=>#_qAK%MCvpYC-fn>SvwkaDykCn0_d!x648v@Oe(69=iI>C0vl0w_&bwNMaz){c0G~P?wpR(=;9N#lS4Z>HoL|x$r;PX+ zo{=E}fO)x0$~9x2(czxK{BESuinHo%9uGhxdn@sMqiMZ>i3WM(q`-1G*{LwSH&Y0b zVj9l=V(PfVGOIlItW(Je=OkH9U03bEHqkK)4_2qvmg5kl(l>J=V zKB={Hb=ln`lrQ@ic-kFEgOpfudZO<0=MF_o5JR0_+esOOQN_W&bucj9=rS`Hq-pTV z`mDecx@Iu}qd7K{K$1lY!nJlAAIWT(K$p&y_~9lO{e3m zTMQ(zkrI{B7693|Zz!tTjv}cQ;z5Z^-8L!IWXz`*yER7RZ)V7djiH#Dtx*jZ;@@3& z+OH|zuXO0%o#NtjASQnm!BVmnE6}QU39YiTOBrXwmy(iJerxFP8U@-mhepv_Pzk_D zR&r({cT>)^2Cn#^bDALqQi&z|I;7NgvkHvTCM8?X{wv$4va=JwLa{)VN-j4QnF(f@ zfD}Md4RIY$8riexUSe;Qb^^f zV~7CcQC?S1kcZyWxhunRZFFA~Hsbvzcp}g#CRsx=mNX;TcD4vB0<2n#p6~9GzBqES zHkw0@NKyNA4Kn=J)*V)vn~ua?xI2^_qxfembY3yX67u^c-K6wImFHf76@eR#>cyGo z{=8?anu{4`9F4~%nw~5ejsJ822w3Awm_g)`QaL3G8RsQCYEp*Kao;^1DX@YJN>sDD z(OolpQPWa=oJ|$QIHOVd_@1azZTT(QsoT)kDbFY`h~!x=a|$z*dV`L+s$!}?BZ8GK zEw9IFWcDiLI=jvN?Y}%2&9+$9&Z?V)6u&~o_k7sX!LJNN9;#(>lb1V-~D7Qo1O$^cC@>t*z5+vF2#%*Xr%~og|!%n)@Vg~TP&{S*C zwz51$Hu89sim=%wB8~a;1t5{FURRc@4QnN0&Zf2Wug1F%vwzwPXsAowCTOL(M=|-g z6wN9^St+%}etYAPb*8sa?<8)QXESh^%2zTnnx}QVM9Rp+5xdr5g^y>4P-HSqP(ZG| zWc$V%;w;7d*P0K>=#_iVg4?7T>vrKUwWSa7Dy=?hQ=n7$R}~#n-Bu;ew2H2XProt> zG+68YH^7eKVXD2-aix|`j3py1ySLWsSt$|b$Pyk?TF$1+8}Jz3Io%c?rDP8y8K=x< zHpR4`8zits2|<4A$i7m^vVgGxC_wjaCC_MK76<^R+GaVKF$L_alBZnD_D=ZaNq|KV zM`X${UL3DPSERlUDP1<6s>#^vMHNboj9TJOxT*a5d#ncV?ri3nrG#v~8ky(d^5e`p z%WkW9yK4W`+m~mx%glT0PI7Mgj$*HFHpmPySVE2!qAs*2f59txq3aL-pFiB0@pql9 z%xtCh2Gr1@PSS0P2;9tQwbVG~*Nz^buqO1uJLOJ`(K*bxmMfmDL1BlVKq}K+M%{oo zdN;=`?+i4AoE-GM8j={~)qCpC*;GQyDx+*BzB9H$LSY2H0|)~8@bFgbeto^D6Nj>% z!Vf_eh`lyT%C(P{Q#`&W_$xUgv0&woWL6cno@GYksGj z__dtr{4Zr*?t_VY91*UyPBWTGj!wn;rE~||AiZcu9}27#e2^-my)I~7$a_eUKvhN- zavc$DM8a{3T?!02)L4sfMIpzji5It@J?47jexR3K;F&z;J_J39PVHL&K(;&p^huuK z-gD2|OnqGJ0DEoOJ9kodAC-QA+(kel!J|x2r6n+;e24%DduQCFeAt~8`V0Ax6Xm4> z3mqXzQlgGwmT$EPOwhv|MG8~ihhJw<#%u%$vHIF#6IN_gsHJ+MP3&7pjOvwGq|JQ?Y$Q>$)0p4W zSWzmrJl!ZsG9F|4yJGEH#RhRu=Mp~KE5lMC=-Wxn7C%YG^Q{>)*}_0+ZCBuF@sK?A z?pRCJ8uy3a+35o>03O{>Kuczlq)>~ID%ez6ViEzN5MJ*d$@0C5)K*C%>lsGpP$lVG zhVIxx>1LCYNx^Vyqg*Ep-`up1Beb%GAW1t18QcuQ`KNilZekeB$bGgL)vhpOYvd+GB3#+*YXi;9@zv=`)^oA_^SIWp-o7IkAr}UPpcHQo(yZ2K-`5%^VC?wS z?*$HOX^IwdVuqDXeeBAPMgTDY4Z)DKQDSbX{r{ZwcH||2sFapCY(p8*C}%Oc$=hZ?1#Ac>?=5WO$ zxxyDLa3`Ud+a1Z5*(;1T)7oQEu;jdVjs$uC+sOG%r)mk?pRt_OUHSi2`%EJ(GGfm0 zcm2dDRi@Z5YVT|l-jlkU!;E7laUPAdtqIDnDec@ku8ypnaa>a#utq~M7bM!ND?%Q# z7Ip~egx?z1n=1|tz5qMrC;=rUIbzMTgvN&h5t@CNA>VQW`4N>$x=z^7uEJBvTbrz< zbOK~EEP)hUp&Kd~C&MVYr$?M4_dd*A;(I7y0ojbZlg2PPJM}K*6lM0!M7eNAELbEa z=T{nAz?ym@4Bn~SNXt7PqGm!ISCp%1fu$?W!5?(u1}Z8+9KawIr3=At1Il#TUakG` z6qNB&gTf{&%#1!Y1L!$pH4k2jIgu^|!>5kB+zCP(Q_{Sdnljsfqr6&wC5|sO)*5@! z1YI+`Bsw!$&?BWzoOr;c-s%Z-5?$27=iX6DaU{|4Wf#y#$iyAu8z;~a^f`gO2cLXV z{kn6Od)0~d!r#4SZA`#NkG|w?0H9e}K*+c73c{3ap(lMZu*mmnjbuPBF#prg@qRXh!B0vyP`+6$WK5fc%eim_);EMIV-pb3Xt4>z)Q118BxaJi z3T+e4vL>FJ3rOrOCwt{?QEi(Y0myh;&_wxxx4MS~Yp-T_!IXE$yPOzJtQsnn6m6%dB@X9yd6-+$)pi|Sn7U3nS>4%X?*rv^R){Ws-NWIPiiKDlE}+`3UZxd z>Z~0OjRGC1NLAMG?LF6;y?gVMt)}Ns8BfXoWLJf6zIWeDA$9eyYMix6UM3E)n$%KOc`kA-=4Ot#18o4UGpHVD^`mZ)&{WK}Gpt2F*6 zpjn5Jr*Yu?Ni;bBz6^GeZMrujU}|RX0<1KXBXH5s#+sle28R1DV}8OTHM3sH7em4X zz+^^=k(qBL`mv;MYiy<8+Hxpsdf|&VX5P)0@s%_OtZ60{Sb(Zl;cN%NpfPIOg>b-i zP(GlaaIO>S&*fe8ddPto+h4Lzi@+m`;qzx^{IoH-#McE!@~ti;?)ogswqnz}bb1MO zcoka=)Wxj9Xn$cYYMjJ?$<9;#-OTV)u6!k(5+tH0R=||-!}RJTm-A#WX6134EcrmyCofLZBqH+>Qp!EdC<&TI>m?or;QUf_3qbV zeXnjW^gbkEbck>-;R`2q?kdt~8u}(9)i-_kl=||CESiTDttBZQ;9!gT&}Ihs!k(W; zdf&J;mejLrlPe8%FBKo%x3(I4r^)RK52)5xn*Hq)?kJkxGDn+ds}d|iO>?I_wO&Ks z40b@0lqA+km_mrg;E|Ir!xAz9TBY2}Y}})zp(8;sYlBTC{@U7FtlOq7mTeL!`M;sA z-AyVBOUlms8vC5yypjj)0=N;J5~kYsHK^8R2L9wp=V*V@i_iX5v<;^lf!)29YUNq? z_nWkAGV?bHr#POixnQLrcXw|X)$~KQA_WWdK%LYb^>DmFrt3L5p=a>xt0x;**aUX~ z7mv3-di1ziMgkqa*8)0Pq)FB^RlhjI}$PJ!nQD9 znrsQCnm+S2O2@_kgM96oQ5%9Jl9+;f1XKLv7?qH@-eX9Knhkm%j;E+?_Z0H83Zqt; zdgRE;jNb#C!L_3WEvvvV)oq!|P7V9SJ@N@Q3r-13l6z#!`vHT>38c*Uml)7(usa(< zvb8oq+xH-rG^5gO?V^dkvqP=s&U3v~Y#9VjOnzDOs&|{w;NL9b=$ggr#Ju{}L%HVe z;{UTm;plv_&(7)pnJq&S`hit~r7ucKp7@Cw2AsV!{!8zC&G-TAjx9bhn-02PNSi`{ zEXCnF?;q8(d*!)s$iF1HD-B-bJeZ8DhUiTuEpG8*nYrJk5 zT^OKX3%woehcewSi5TQ0Tw2LaR6bVbt+Z@f&8Ms})q=y~VLUY_Cqr@wY+)xT zy-dM+fTxy1B$2=%#lbefkRBlKJt{_t0=)3Ll6mL`^$n>2jhkpT?h)5Q6l>(6?$kwR z9$Pt=LqS0t!ieEZ*8w!G@xB%#7^ResG7@_;?)s8%RJ!3`+3f zv;2(G$|x5=DN~QPFecNDs(^(cMF5BaU#>&$q9my*C9eb%II9@|T*KX=9uB-3Zch2` zXm4MxLz>%N&D(gS9*6v2aiJT~ zgv}^Xw%NKdq4FPSIprmTshLkOMY8Q$r^*^vf0PHfnUeg+4<1Ii27(VUZw%#<0$fmOp25h=&1muM>ir=)TX2SVOdSdqRI;2d&gW*(<=gb z;>h>!KI)qi9eEKsdQ?o(v5bdOA%#o;np2v&Qn5=~NO|caBPa5+L6W^t{}hCBz^P3{h$jD_*}(9)s@1N1qMdXr6-d(mw4V z@094wBC`f&pg}Bw*h@p4)ZY7VcTa< zG?Qw~=6*N?ddf>?p_kT8=w|o1p)wo!jUS+%;1VSo@!jncskalDl2)%e)5Bi>alQwB zY5P==vO_X-{`AsdclNpPkiZb~x<4Lm(m0Y-H8^+ORCB$;f$lMD+9eT1MZdg4ZT{v)5i zc*DpyBl)^Q9B^%#+BWEzZGPR|TVoHr3sBW*`WT%w=-W$xr;J$6Pr$ImG5i0UM~$_e z-%1{LedIz7cOFfJc|Tinb-M@A57R0uO8RyIff_`c=x)F-lmK99eP-rZ3(A+02Vg3R z8drM&H}B1>y?9v7W8H>Ed&wJ&j|w@DyjCjAxkH9@l%bJH=x+Fk6FkvDWkpQ~c-l%< zjwTg#eK4O4&?iTxJ=3f&u|8J)-66pesodRBzlTUa>D%%>gBtdF!>aednBOJBV9!Ps zslvlVrS0$?+&#jih+pMU{Pi9o47uvDOj_|bz~bhe_Z1;rGx1_AQI`&7f;y`rAW;CYh^UuzC{ zfjfePsk_p||43)bs6V+Z3V=XhRExgNW|Qk$^NllO*3^Ys-iqs|N0hSk90`g9LYUt#Fg|Go6)Ap+@O3nGpMVI zwaK(a#-V$UfSN%QHv7giYAn+`p**4y_)rNrPj&@lAh^kEInGrt=bK*4&&&|w5NyH4 zpZjsLL4nTi0StK%ijgN{MhgZKkb3|ZRQ4xq6XZh1-^{?v(K1vO$1j(yu}2aD?oOso z=O5ayk=#qktM5Ov4D)%$hlYzE@<8$;c)hjxYPNz@oa!Lv@9G)GSd2BszWgfxdLUK+ke#Qhxb} z1{$0AyV;UZhPZAzvg9i+r4VH~z8p+EW8aiI#EC#s#-puj*+zL%dSsBZ4XICGAmYJa f=gvq1#N+=8x*PjBWcL*w00000NkvXXu0mjf;FutP literal 0 HcmV?d00001 diff --git a/etc/images/table_xor.png b/etc/images/table_xor.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0e815730bea75e64336dcd82b86c9a20a2b8f0 GIT binary patch literal 12719 zcmV;gF;LElP)Px#1ZP1_K>z@;j|==^1poj522e~?MF0Q*|NsA`*`M72000SaNLh0L01m&_x*T^7u9|`DdE3Ii9Nb?=V3+4=BXI^7spJ_m}-HliMD$ z@SkZby{tP5?%I8uPEBH$z@~F*`QJ0!-um}Qm8zW3;3*&^G&@Rvl94Cuq3d^+GEx{f z%S-veA2-;-)EkSm<$Nn-ENgE_RL8YAjO!06!O$)UpfigceHPLGNPGpTu|NpZGcb zhMk@>qM`NDhYw*IS9YxP3RwzW;F-Pi7$_1VMUVX5DXUowi>}fk;#Ui#9a{6$|mn*L6Ka?HTbufG) zwy`K=mJRP7l7|StfQZgWWJ?5Mj#{OY3s`op{=1LXTXM|@5sgD$Eo6RC*CM|^sB#Ma z+Qi6F6J`xeeFrS)6T~JaH_V-hhabz7KAYcApahZ5idm~L8M|V49{ERXS&|%+P-(m6 zXw^!5U&aCA)w@h~!ADTYDsW^>NQ=9Tw-(Z3Fuxgm@m_yy@Y=&3ZT47beJhsK>~qu&~Ih8|c=2R^T^H zO11B>h`|DHOGU(5vKidUxi+X<|F%VOUc#Q^E1(;c9i1nbPG=zef@Jj%zw-NysEb~5TV`OojqVYQf6Oiav!&Q z6W^lc@eX$0j?|>6!LCTQUa#pLWqFyL$G5{s_I3MfoW47 ze3hr3d+>!*=&eT(!Tze56{G+5XV;>9MiU0#T121d0mM`WvFINWPUu9vkTJRiEfp$8 ze%+i~+?y4ErELy_65gHd_FG+Zn+c3P8mi5WIsvf)klQlZzU=DUZj2VYO&|CEOnMpU zAX++9z~5k73J&fwhB_-P?vwy+=;9Tb1vHLms$Mv ziHBQq@zY2H%k5Za7Cs6kf(bFZV2QIZX6|euyzCnw+mNcT%i0*ZKVT^(rHj;aTvQzN z`y;syb6O|&rz-TarB@4Pj>IAX zOeqJp`xiJ4wHUBwAAmh1>C?Kv^)^LkXWP8sNXfM03(=!hBiDQX{R~ZelSH#wobJx@ z!=E9Bu<>y~vphHHbuk2K+rx>-S$F#WTwGom%je`e`}3(w?DLGHJ{GBzq63v0Ci9$@ z$?U=k_`;iUW~^Gk>USSUtkFmNlIEZ&wIyS~c3I@jcQ_NtPQn-S)^c4M$2zP!_fm(# z0*aKBVu)ndYT=5$lgakqhz}z6%Eeg1v@f@jh``a;*_Yp>t2Uv<O)S$8=Zgz9_FqFynHU$HKdDL+L7%{ z@UX{LFSOdfo7=Wg`tkQH0e%~Aas3`PumLT*VA?0zB6W2!G%y+k^gky2lZ2Mva?3Au zU<}(i4Vkv|ioEIXAs10+RC+^LLn$Y@E9SQkXQMN*Q(2;^2PPS2rsiHZ{Dpjlo$7n4 z4vSTZrgnO(XS3qY4xz_XdC*HR1~1yzML?x7L^e`(q55T&-cd#K<25YzR7Sgmn`-Di6i{cHtu`h~Be~ zt|qiaixqW0cq$i(RrmMach$4j8r;ue#e6GVF>3#b5EIvI?zD2~Kon(Pel3cI&dD9~ zVa+GWU)A~OmxnJ*$D?4?!C!!y#ZofESsNJ7-GHKVkCeB{&!i)B88!a@lx<=v^AL z?yQOD?VJVIV2%w!&9Z3uA3}G5`XVXKXkhcn`Jg5F!Sjv{uGaU~vY%PPgC26tlqf8c zTbktA^?*?eGI*dQv4RIg&Ng_Jw$@-wF|j=%z4{-0qei1OJ0Eyi#ISG{8*n}UZgJm0 z(FN!T3`R?<_{7yGj^L#fln3Wyg}%8PhtVvtsog__lq>(8KnbA`Xgt(oXEXBjucQOc zhNwGiS3kt#6MhYMZE|kycFPX;yGcQqcC#TBRcU>OT+DV;efH_I6i+}iCSK72qUlwG z5`m2(?^vdZtjni?Wf8qO5~S0W5}Ev1zbE1eB+I(_9LX>^*9d3zpshIG0ihPZgBq)_ zZMRMiT&}cUj$1*Qd8`89T@f&Y)cyu#MouE~0mb>-y%FiFTE=oB2as<55IVdtOC;{= z7*tg?fInYo3K?_m5}k*lU=B@MsGYVGQffzyCh6%awdgx0@Sju8xP@(m;RmA$PnU{9Ss`{BGb0O{$j^hV&bG?r%?o zl+(X3T)J~p|7*q-ollq%lhp>zEI-!8Zt)?mpTJKw{ZPqQ-EFr6=3Yc&e`JIq>kx8i z+)96U-S@rB0jdYohlxNcjSBuul}2oR3s*nIf5++5ZGh>jt$@D| zJ2`n%MHJa^F<}vh+HO^xynMX`OZpva0UW(ciImF&S!FlMz5){t`sM>~#B5KlE68X~ zQB<8d-7l)*LlGK@`rg5>z^==O1zuvYbn^N{(tcANZvQ+Hz0e7@HP4kOWxn^H& zt4N4Hr+F*{5<1+4ImW-LL$}6& zlIM>8g{^kn%&%h>AmE^rzJ8uYGp*iRE=7BUW{=PBC&c8iyOrmB0P4e}vuS!7pwwmm zIinHZbC~uNiy9Y}JAAQ|#e0KXnwa5rJueKX!mqb!Wp%zuB8Ak)@kS6>0$d{~sJ)^k zTI+OWvAH90yMxK7nJ-uvI29amg=|t;Yi^^3I?m^jOR37}>aO&cExpd2_zK(kZ?4Z0tN0kZ7=~un)o&Iu$l)}pvvSP*XQ!aoli|8ziUSL>9W(y= z$;`!kl$B7cs=p2W@u*k$U3GBxlrxlivgR#m0WKx0^{^UDe!)u?-;eA3MVvIOS=xHR zn8sO1${1BNDqyQ>LVb3T;C|{Y_N_WOx>-Mmt)=t}=quz$TsU8jz;75@*1>9esHN(n z5#Y**8twC;z%9#EaeB%p(V_I9=P&Vb$EOpE2k9+RMhIlY-WiX%dBjD}fv+sX!tR7~ zlsjdGKSJt!vElg?_vxRM0;Q8>4pNh!ivZ=g5V1nnc*ib{2KO`}&mK_^`h8BM!Wc}6 zH9T~jf#Qzt+Ip7$`@49K=+Q%BhC zU}>VUeN^I$#47sqEr9(8V32!*iNRUoVTUS(*{+-29LyA!R#CJXy(NLHaHiu3E91{QP?y`UNzC+_(5 z9aOy#!ZHokY6zfd`iV2ZjF-TaeyFKm%Q1{FooxpoRh9pQ&@nQ`c%^3Pd$G#NVGoCp zWJ9hYH68-9_vZ1LT9dQvRA1ZqVbhZy_`gfAOE_B8R~JPlC))T0>QYUldMTF6tQl)u z(FLx6_CV;>{ODiFRNLgvboyIiYPPv=skgh~2D*u|eT!ITg}414d*pYN!feoLzPK110^DAD z5R^`E%Vm;CA$=CUSL~Ziyb{49ESuz(B1)$@n{g)E1 z{;M_x+5Q9t>Kc!+9j?e_mDeUZ>{rUcZHGb2ai^ip44QWFA`z-|Pb1iXfG_Xc`^WlQ zYNq03m@&PDg-j%^=^j2XL@2sgp1!-JdT}(j95>(>f&h*I-{Ltys;*4`lPVuPa;;O6 zKGwM6XvSnDH+k2mQ^Dt(8rWUl6G&>k4e@Wcrn5hsSP=CF(9~nRsK(d}TePpt6QX;{ z9ds+f7Kh>6|8cq-#uA@02#V-HStvg@91X;@j=;|M1&qu{10CVNe1}Tsp8u(S`;~GN zua%ekz3PRxgwXz6Q7M}(R;lEv-XcDAnqKZ~xBKrVYKZrEjZo}NFDu%vSY&cBzJ!MgyvZyogJIK#7`d&&4++B zK%+NH{fqr-hs|T+>hMBXTPa}i2Iz%Y7cLoz*5jUCnPQ2|xTvidIJOI-ENbn01#L9Q zzXVY$ueI3Bsb^q68FLM{G6UI2`r++txdWEl@>>(yc8soe-}2y_A27*C4AA#$$%;yT zzqQa`QPkVlll$ZSbhiQaCfcBgv~d95PI(NC{3C0knf~T}RFYy)@GVYJ<2hEf}?fJW(HBk=Q8UvO@)0Q$~HeOp3Zzhzc&(tFQFRK7c% zJ&{973Xpj698^F~(+U^rSO1X}E}9#EYuZeH?oMk8=rF@WRvsAoW?v>oEN-)4+}}rr z%L$%O+B;>O+_)vhRFCdiU2q!kk4oRBhA4elg2=GOup|_73~T0WBVv`?O2PCe&3TEkP=k#DJVvw6 zXuJ=Ns-wOMcJCUWFwHcNz~faPZ0JP_LY_ zmb0{HccKK(G#YC+<#DX}+#udcN*>|d+S@6eNA$mxoVp1`gf#9@$pf?+!EM6oOtWMEeXHHRO8Ham6zz zNL{mXSksG3gd=G)EVa=_C~7y|_Csu8oK`pek71wsN0^6` z9KJ}Rzrx+&cpe(=8^d_8iXQQ!p8&Y|7@MF{`naIBdq4zT`Sz%~M23DdU5lf;;KE_$ zKEI^U(D|1nVL%L7C!;BVqgxhev>u|aZSiV)H^m>PguQ9o|AV)QVI*CDLvw(QdQVqA z&75YVil~;bswX9bHQn6*?38^ImI_K=5_mWn|2T@0kF{1A+uTn{Lg6=tiUE0%TF)u-@sbyt zGZZU42&yjr6z~fP*l*GFyyO4*A&_Bnu1nS7tu5E$k+(JByC561RyX4wEuLmunHpf$ z`7IvRgah#X8EA?8#xWwk$a2k4+jy!`9T>b`43&(`;F}jT5W=0^>6l0&w?x6zVfv2G zQZ5FTrZWQUk$x%OXIqx&NILrr{0p3Pzpj;WuX`I9x1QFSo=ru3nK+EpR-ymYLUVTm zwqUFK{HI@^V8-*!asXFC3k>pDu8umURicUL2b|>iV6k6%rP`Bv6rq|^qP!l+An78; z`uEjMes__B%W2ls*puLa}DKvhh&fhZUu*a;w!4sm~O6XDllHr~WV~n9#kzQ9wWl<7X#K6NPOB zby8!U zrH}L&4e*I_b2wS~IKQS+reLHanN`N*D!jIx3bOlGf$>;1#0WW&_O6_{R**I++I1}n zw|V2{BV9e@d=SHRcJoI~h_=CHkFf3oZYn=a1^CyWRMP)B(3dGE8%tJqiO#>6+yb5; zv!~<|asy>@$+SBzd&r;Z#t=(wXEU_OT^a;8>2E`PjdkVU7~&x(%N4GR%lKfkS=EJ* zrxKXzI>WqIL2t;57-m*zqK|BoMVSlMN1#Z1Hs9lr@C*<1gIE#SaTz)-ol-(n$&J+I zJGtv}S$zczA*v;2#0$i}1T_-@zmKcdjJTI_(~goGsCF&k)J`EXt%pdT7P+Hl`0}0y zf7qCx$%Z3KJEL-Fr*PuB0@$zLVmX!$8-5rE>AGj`72!c646PbOV@tE5e+LuJ=FgcIGY`IvSOJvH60h=XH8 zMGfiFd?TcFr}V(_jG0q7sMK74wb)5p`wn^Go{nYD4x`~`6U1F2gC%Ln3Q7uMAo*l z%b~vlYB|Dcb%&IQ$k^egW0$cs$gh!DL{$Mo(FiwG@vP;!kn9(-Vd-fy0_a6IMc_s;cte|2flYZBa_Xk8(2eM9Y4BvI*h%bY>oHU|FkV>g|z z23t^KZv`+j&mLoMRF^%`xie^+pEd?;>p@aKjAI{7-5td0N}{is9&~~OCf>C-a)9LB zz;KLrAym4Ti?gFJ)~uzq^IdnX&~&L$AOOCM&R7OzxUt4h?tln<6||tj5L>HuVdmgu zl7!{w3G>T0leC_obDHNgRh+{Qd}4D73|w-0!Cu_Op-f ziwPufZkT@?3bMW+Ij_l&3mJux_^Qa{-GN%dJfaSKdU4u3#aC6#YAjSvC{s&4TaxOFXa8xpg^7zWlf=dnf%XSuxA z?~Nfo1h$A_b?q^9(8ITjb?KAbw@9+!;w2`;EejBZFWsR!}@k3cKW3;Rhvbb^oXb`AXK(%3(Rm|Zf=v9O8Ng$($R%`S44RHu|g{Y~3p>iU%biG<>D z`J?y}){CgJ5Gya(7U?Z@v=U49BOhCScw3*q{b18zwNUq{+4IA%$(7f&{v+1kAd5vS zwam82CoAzk0LtOpdikmW2Ml$PaR4(Ei|@ni(qcjPb#S7)M7?`T3%L>b-rQ4Dn};j6 z?I3E)8z^f~mp_W|2-bfS3(_D|iBGM0ox&te_3V=x95eTd7=b4{WSv;i9nqxOxy`Fq zRt7~bIb?6nUHuMU_KW+96-vIAeRG@$S2AEUh3Cjg&5}tf;bB|ope)rVnXUlPM*Bd_ z2Yc@^I%<_9lr1zCDzl$sRkT1=g_&qed~CAOkWq-9(YpBp&YPK-pS5d8!Ic3Bo!j1g z#a*(?NcP66v|1ea&KxSasnC$cSb&yxm4m)w4TTjW#xOV-!?}PJmnTO8==QUssC_Y* z!lYrNhh%eS7W%%l1UwNCHsa#oay-<)7qD%ie9q4wc!PCpOVJPd1-{;P68Xoy^6;)f zvG0FITPv$@j;~@w>S};X6%>LC8txj@yq_A!Af>$A3c_o>Tmy&~{Yr@;Ludk1MV=hZ zgwsLkp-;LOaFk=ZP;xQ;Ms0tp{9tMgl$-2%3V-K*LmdQ=v@MiqJ6cOYn2Zq;SUn*4-27Raw2BZ;)H)niee@y9rxXglP*?6ZZS z08zs5n#ZEiTT6qM&yg& S)+4qe-h;@}I;z8~e?R~}h27ZXPPlH9%g*{R;2uQ zn~x`oW*F8qyKqlmJj|g-OyO}oRP=$^&OiQ0$3BafkowMSx_X---I+@&b$&XQQ4v0j zm4@kRv=O;%7dzV3taa$93WXW4n59NRLUw2=o3ri`FL(%@3E`0DdmAMC`rIft$2!y( zh?#WL3f`VnNrnl=)u+2bp6-QbE6w?)luHf0BHpN;k(#fP;`R5YRs9T_q$h)2OV!`d zFB;b=6~ZkjmIs7Ht6rW7PRn1w>N|l{e9u z!)6rm-pQG!RN|Ask5Cpc8JP>pj>ht#=a1dVS*O#u)sn8KRd(?%yMuiAq!l-}vWGZh zIY_|BGFFCA$Yu`Z=vtP3A5kg~_+ClT5#D~Ef{?d4q!IOowcoc$ zivGIZ$-VMx!?}2+z(HH!J`0IHz(%nGyRjUK9%R|B!78~#83#?`cIgpw-<4%@8-2kh z!ladX)|-8vJffL($&+5rlC6cQ`>vvoj0|v^3kpzY--weqYMe6{^r$H&IX)(JF%d0N zEz8y!MQz*8uEJopIpKv={!Bwzv=juCsKfM&-VN8{82afX^gi_kPnup#>LZRarPg$( zJNl(Q2WCYuyb@r&_p{&U+iWX9w%*p|F7XKo#yp|!nI#%_Txmmf2G<8jnJ{X?a6f)k z5w)gH?I*oOd_4OS`4TJ-0OgQtqH1dphn{li!e>8F%_Vd${5%~eG73Yp;LWvx67Tu4 z640qGM0D^Gll?}}yz)2hl3rc_ zTkC=WG5~3-+gU%Ak9WkZ@aC||dCUg}aqT>Jh+OL=xrCu=_ihE@sZRFc2X*=m%&6&1 z7(fo~>A{?sog;&t3F2qtLb14q9k$P9P+vELmI-Zy*VpN_sl+ZR)WeS_(f)V#BO-uN zya_l;fmM2LC6p_y3NLzerIE28$8qc+68z31O>g4Y+v@Wml7eWUy?7vv<_Qn9b+(}@ zP2~vP?Jhzev2-@cMA}u?T>0!g$Aq42hnz_daz5^`5m=_~gbhzmMYib!2H4U*WR%I& z^m+R4HYKjc*Gu>v9x^%&^9 zL=rw9F#2IBYj;8%C;8W(nW56~KUj0;<$dP(EHyWRcu`+R?F+OxXi%^TQ{Cs;0*rO- z3s<9eh3}JjrlszgHIDsUzlLubB;m_sN}d#z|H?)BsWJ|_y1a4S{T*^2Qi5r(TAJ5& zMl91C)Z8!V92NZSs}>Ui!+S;X#4x<42d`4Ztme!?>fTXF6P7+zWYl8FKE0QRq-0-S zs{T+1*7I&xuI{dH&AgcpYQhF%0cE8}u zL}FSd@YqnGWWRYu878aPSE;QH-xD5v0=Grmv$3QSNJg~gg7X#>TiBL;$|Q~0WEn~E z;%PBF{SyZU&s2sDHs+$$8+7YGH38|jW<8MzDvd?NMqIz{ru5m(tgnCMe7Wo8G~_J6>V=ODqUz{*hM*CUs>o(N^t{JO9ivwh?c#nk-%j`*YA z8STyL+s^{&Z}9VbiD2sLOW2Pm+B1lG8hT4tJ#}8`vz{ z$2Difo(q`7%4^Q+z`FtQUY!rggPBj6(Lc_+8PcP$AFGBl!uS5bbzN&VSWA40&1H~E z^|{VCYA$~bABZ)oSKQ&CL?wuzXJLeINB4WTn3FaNJe{r|g#1MhCU9Ty2^(_YIQenr z(pw{X84No2gmm-okY3uq(vCwfNr4x~)wF_c3;FpC55IJwbGg^T+z*>hX#B*vifb~eIDeUPlZ#gbjrMKN+--3o7h+R)XuiZZGLo3srf>TX45^_^TKFt(5v;7yRT zJ4kD-w??SR28v?aSp;I<1q6$Q%Su-bJj};&SrSjv?bxY%An`)2-0(bRg6<03owbAJ z-8jCp(cJ{+O%tCnO_A#?RQWd?9A#ys(hD=T<}T6bJ+5XA3=~|YbWpYakLXt)@gD|4 z8m9Iygn3BU^dtznie5_XJOV+=`mwx^%zoOLxd;Au2Ue5|Xy_hbWiy zk`&>RM;f2QCtT#juzU=97P<=OpR7#$k9l3gsX_aVGj}i5SRtm?1)io#(Zu2DrO8zY}HkHC*Zw-FcBkZwT zNIxU(i?sFyU&-^ScJXoC*1lEK;Z-FYM>VN^@JG?ovvT_F#R?B|@jE=WF!>Wd;k2Tk zbd&zmB%rtzr4cOOusQUu5A$HD^rn~PaZ6zkJ^lb&;9nBmMzsDHGKrz9ZN%$RAbbr^ zjRRQT&*L=-QzoRYS{7U)5%ZCFRA+{i%V-i{31kXq!a13{FJBS*HvCD>m}S-5HVp>v z5}Z?8*@*&BwXbhZ0$?u5waJDWfewY*|rEq>esC=<5hMJHGmjWt(L?0AVt&k2s zjQ3cazas~b5k+X@PgCR>Mg%Bw{f3SE3JqCMI~)4Zae_mkXtNh|zRa@Z!A#9xQs_y! zX|m(MZ%1(_me!cT{FeKU9DRAs$DLP5bZ!#A{O%` z$vi-HPY9bEzp+7!WSh;sN;0vlp_jy8=`?{3O9GdMGFWn2d7Kd?MyCmDwrz1Ew|piC zf@aUepL3r+872CWXDexOdT}w@$t-Lj{tW?y{!c^l(8g~Pd1YEG$u{*@*wh8gA9@nW zVmL67e#N3*FMdj`3D`E9J|B14Jg`p!^G@;N+4N&Y61{M1j7Bxte;qbuN&}|XOzUCx z%1o&0@I#uXg9qLXTbpb{n|G$k!Hq-ZGbg2Adbi}MntJE^tSFPMRBJt9FO^Bj>*4W~ z^<##EJ}wRY>%IMSq3i1R4*++|#C2_ekmSl4;@iM8??6Z2w0ukOxyeez&(0%;1E-Re znU@%v-VS`#!0Hr)`vq`?zPg?~=WcqJ+o8~Idy^z3VDcg&XatB&T2tO*Ju8hGcC3GF z=ryOi(EYJgG$R1yunG7TJMyN1#I1vI)30_i0#HmZT2GKKACF`RqI?%`R{CYeaa|^`aUZUM=_3YDl__frSF4L^0Z)$gQdn?LzqT))2c;{ zOK|8R;3|aAugnndp^*;IYdF|Tly8wUbu`t9dzON{&|ke%5?MEsMs#vr)&3za_!IuQ z5~$`Sw|Xd)z!<}&D!5);Q$sSmKU4*lsUuhq%C~bkE<_g6CPbdK3q2qOb88EVAc7el zY>R1?sMZ#wDn zCM+XG;+4-^E59v@{@a)5a299--%h%0BGhG_fRE}uII1cZSZ{6 zlph&*!%DJhlltN}i5yPCScHA(U`M+zALgPq|1$X8>Itqg%oxvODiOIfVh#OX^;pJ7 zWnCLDwd*U`{bq%rxT>Ad`gpI0@OZQ0CuQ|SIdMU5=|&s(6|`x-S|*Z?6l-=adIH91 z+nFV0;VGSj632qm8XQ`mS8p&uFB*!-H*{PR6aC~m=H}s4uViKKf@Wi0(U8cE zb?KeX576?fsJXR_p(EK4h3G%{Kq`BLkbasB!%NJL^^+GAO<2G!95%m-VG(il>*VjB zyLn=l4T~+M@51b=?;QmBmEiFF-V5;Cso0O?%C}XnAXPkCY77!PFw@Z#@f)4Z&VaFX1pX zk=mI@XS8wdo1`P-Ef;W!d6b+NLL-8J#C(qkvGN>$2C|F)&(Fr^^?jSKiCDc}D*|4(=b>zNW>R_GyfRAvCiz2CV4pyJ*80Yp>YZB@( z5g!gO&>#dk^{PkNF0xkx(ed@M+VEJ#{}NP4He#)*)WeB3;&J~_U78>NNN0y0>x>RX zVWhD%n^YrjU#$C~*!@@uv%*7haLWuV-#)5r+PB$9wl5LkT5}jqh;@HZgmDj0w~mwD@5a;^VGz3a#m8^wElnR_S(*VGl*E! pYoh2:first-child{margin-top:0;padding-top:0}body>h1:first-child{margin-top:0;padding-top:0}body>h1:first-child+h2{margin-top:0;padding-top:0}body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child{margin-top:0;padding-top:0}a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6{margin-top:0;padding-top:0}a{color:#4078c0;text-decoration:none}a:active,a:hover{outline:0;text-decoration:underline}sup,sub,a.footnote{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}ol,ul{margin-bottom:16px;margin-top:0;padding-left:2em}p,blockquote,table,pre{margin:15px 0}ul,ol{padding-left:2em}ul.no-list,ol.no-list{padding:0;list-style-type:none}ul ul,ul ol,ol ol,ol ul{margin-top:0;margin-bottom:0}li>p{margin-top:16px}li+li{margin-top:.25em}ol li ul:first-of-type{margin-top:0}hr{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;border:0 none;color:#ccc;height:4px;margin:16px 0;padding:0}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p,ul li>:first-child,ol li>:first-child{margin-top:0}dl{padding:0}dl dt{font-size:1em;font-weight:bold;font-style:italic;padding:0;margin:15px 0 5px}dl dt:first-child{padding:0}dl dt>:first-child{margin-top:0}dl dt>:last-child{margin-bottom:0}dl dd{margin:0 0 15px;padding:0 15px}dl dd>:first-child{margin-top:0}dl dd>:last-child{margin-bottom:0}blockquote{border-left:4px solid #DDD;padding:0 15px;color:#777}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}table{border-collapse:collapse;border-spacing:0;font-size:100%;font:inherit}table th{font-weight:bold;border:1px solid #ccc;padding:6px 13px}table td{border:1px solid #ccc;padding:6px 13px}table td>p:first-child{margin-top:0}table td>p:last-child{margin-bottom:0}table tr{border-top:1px solid #ccc;background-color:#fff}table tr:nth-child(2n){background-color:#f8f8f8}img{max-width:100%}code,tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:10pt;background-color:rgba(0,0,0,0.04);border-radius:3px}pre>code{margin:0;padding:0;white-space:pre;border:0;background:transparent}pre{padding:16px;margin-top:0;margin-bottom:0;background-color:#f8f8f8;font-size:10pt;line-height:19px;overflow:auto;border-radius:3px}pre code,pre tt{background-color:transparent;border:0}code::before,code::after,tt::before,tt::after{letter-spacing:-0.2em;content:"\00a0"}pre code::before,pre code::after,pre tt::before,pre tt::after{content:normal}code>span.kw{color:#a71d5d;font-weight:normal}code>span.dt{color:inherit}code>span.dv{color:#0086b3}code>span.bn{color:#0086b3}code>span.fl{color:#0086b3}code>span.ch{color:#183691}code>span.st{color:#183691}code>span.co{color:#969896;font-style:normal}code>span.ot{color:#a71d5d}code>span.al{color:red}code>span.fu{color:#795da3}code>span.er{color:red;font-weight:bold}code>span.wa{color:#969896;font-weight:bold;font-style:italic}code>span.cn{color:#800}code>span.sc{color:#183691}code>span.vs{color:#183691}code>span.ss{color:#b68}code>span.va{color:#19177c}code>span.cf{color:#a71d5d;font-weight:normal}code>span.op{color:#666}code>span.pp{color:#bc7a00}code>span.at{color:#0086b3}code>span.do{color:#ba2121;font-style:italic}code>span.an{color:#969896;font-weight:bold;font-style:italic}code>span.cv{color:#969896;font-weight:bold;font-style:italic}code>span.in{color:#969896;font-weight:bold;font-style:italic}@media print{body{background:#fff}img,pre,blockquote,table,figure{page-break-inside:avoid}body{background:#fff;border:0}code{background-color:#fff;color:#333 !important;padding:0 .2em;border:1px solid #dedede}pre{background:#fff}pre code{background-color:white !important;overflow:visible}}@media screen{::selection{background:rgba(157,193,200,0.5)}h1::selection{background-color:rgba(45,156,208,0.3)}h2::selection{background-color:rgba(90,182,224,0.3)}h3::selection,h4::selection,h5::selection,h6::selection,li::selection,ol::selection{background-color:rgba(133,201,232,0.3)}code::selection{background-color:rgba(0,0,0,0.7);color:#eee}code span::selection{background-color:rgba(0,0,0,0.7) !important;color:#eee !important}a::selection{background-color:rgba(255,230,102,0.2)}.inverted a::selection{background-color:rgba(255,230,102,0.6)}td::selection,th::selection,caption::selection{background-color:rgba(180,237,95,0.5)}} \ No newline at end of file diff --git a/libnuhash/include/nuhash.h b/libnuhash/include/nuhash.h new file mode 100644 index 0000000..2da91d8 --- /dev/null +++ b/libnuhash/include/nuhash.h @@ -0,0 +1,109 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#ifndef _INC_LIBNUHASH_H +#define _INC_LIBNUHASH_H + +#ifndef __cplusplus +# include +# include +#else +# include +# include +#endif + +#define NUHASH_WORDS 6U +#define NUHASH_BYTES (sizeof(uint64_t) * NUHASH_WORDS) +#define NUHASH_CHARS ((2U * NUHASH_BYTES) + 1U) + +/* Must be defined to build/use DLL */ +#ifdef LIBNUHASH_DLL +# ifdef LIBNUHASH_EXPORTS +# define NUHASH_API __declspec(dllexport) +# else +# define NUHASH_API __declspec(dllimport) +# endif +#else +# define NUHASH_API +#endif + +/* ------------------------------------------------------------------------ */ +/* C99 API */ +/* ------------------------------------------------------------------------ */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + uint64_t hash[NUHASH_WORDS]; +} +nuhash_t; + +/* Stream API */ +NUHASH_API void nuhash_init(nuhash_t *const ctx); +NUHASH_API void nuhash_init_with_key(nuhash_t *const ctx, const uint8_t *const key, const size_t len); +NUHASH_API void nuhash_update(nuhash_t *const ctx, const uint8_t *const src, const size_t len); +NUHASH_API uint8_t *nuhash_final(nuhash_t *const ctx, uint8_t *const out); + +/* Simple API */ +NUHASH_API uint8_t *nuhash_compute(const uint8_t *const src, const size_t len, uint8_t *const out); +NUHASH_API uint8_t *nuhash_compute_with_key(const uint8_t *const key, const size_t key_len, const uint8_t *const src, const size_t in_len, uint8_t *const out); + +/* Utilities */ +NUHASH_API char *nuhash_tohex(const uint8_t *const hash, const int upper, char *const out); +NUHASH_API char *nuhash_version(uint16_t version[3U], char *const build); + +#ifdef __cplusplus +} +#endif + +/* ------------------------------------------------------------------------ */ +/* C++ API */ +/* ------------------------------------------------------------------------ */ + +#if defined(__cplusplus) && !defined(NUHASH_NO_CPLUSPLUS) + +#include +#include +#include + +class NuHash +{ +public: + NuHash(void) { reset(); } + NuHash(const std::vector &key) { reset(key); } + void update(const uint8_t *const src, const size_t len) { ::nuhash_update(&m_ctx, src, len); } + void update(const uint8_t src) { ::nuhash_update(&m_ctx, &src, sizeof(uint8_t)); } + void update(const std::vector &src) { ::nuhash_update(&m_ctx, src.data(), src.size()); } + void update(const std::string &src) { ::nuhash_update(&m_ctx, reinterpret_cast(src.c_str()), src.size()); } + std::string do_final(const bool uppercase = false); + void do_final(std::array &out) { ::nuhash_final(&m_ctx, out.data()); } + void reset(void) { ::nuhash_init(&m_ctx); } + void reset(const std::vector &key) { ::nuhash_init_with_key(&m_ctx, key.data(), key.size()); } + static std::string version(std::array &version); +private: + nuhash_t m_ctx; + NuHash(const NuHash&) { std::abort(); } + NuHash &operator=(const NuHash&) { std::abort(); } +}; + +std::string NuHash::do_final(const bool uppercase) +{ + std::array digest; + std::array hex; + return std::string(::nuhash_tohex(::nuhash_final(&m_ctx, digest.data()), uppercase, hex.data())); +} + +std::string NuHash::version(std::array &version) +{ + std::array build; + return std::string(::nuhash_version(version.data(), build.data())); +} + +#endif + +#endif /*_INC_LIBNUHASH_H*/ diff --git a/libnuhash/libnuhash.vcxproj b/libnuhash/libnuhash.vcxproj new file mode 100644 index 0000000..639e500 --- /dev/null +++ b/libnuhash/libnuhash.vcxproj @@ -0,0 +1,463 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release_DLL + ARM64 + + + Release_DLL + Win32 + + + Release_DLL + x64 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + 16.0 + Win32Proj + {8fa5c597-887d-46bc-a6c9-2183aef7b793} + libnuhash + 10.0.20348.0 + + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + false + v143 + true + Unicode + x64 + + + DynamicLibrary + false + v143 + true + Unicode + x64 + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + false + v143 + true + Unicode + x64 + + + DynamicLibrary + false + v143 + true + Unicode + x64 + + + StaticLibrary + false + v143 + true + Unicode + x64 + + + DynamicLibrary + false + v143 + true + Unicode + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + libnuhash-1 + + + + Level4 + false + WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + false + 4706;4996;6031 + true + + + + + true + + + + + Level4 + true + true + false + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreaded + NoExtensions + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + + + true + true + true + + + + + Level4 + true + true + false + LIBNUHASH_DLL;LIBNUHASH_EXPORTS;WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreadedDLL + NoExtensions + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + Console + true + true + true + 5.1 + + + + + Level4 + false + _DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + false + 4706;4996;6031 + true + + + + + true + + + + + Level4 + false + _DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + false + 4706;4996;6031 + true + + + + + true + + + + + Level4 + true + true + false + NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreaded + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + + + true + true + true + + + + + Level4 + true + true + false + LIBNUHASH_DLL;LIBNUHASH_EXPORTS;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreadedDLL + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + Console + true + true + true + 5.2 + + + + + Level4 + true + true + false + NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreaded + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + + + true + true + true + + + + + Level4 + true + true + false + LIBNUHASH_DLL;LIBNUHASH_EXPORTS;NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + NotUsing + pch.h + $(ProjectDir)include + MultiThreadedDLL + false + AnySuitable + Speed + true + 4706;4996;6031 + true + false + Fast + false + MaxSpeed + true + + + + + true + true + true + + + + + + \ No newline at end of file diff --git a/libnuhash/libnuhash.vcxproj.filters b/libnuhash/libnuhash.vcxproj.filters new file mode 100644 index 0000000..3331409 --- /dev/null +++ b/libnuhash/libnuhash.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Quelldateien + + + + + Headerdateien + + + Headerdateien + + + \ No newline at end of file diff --git a/libnuhash/src/nuhash.c b/libnuhash/src/nuhash.c new file mode 100644 index 0000000..95305c8 --- /dev/null +++ b/libnuhash/src/nuhash.c @@ -0,0 +1,554 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#include "nuhash.h" +#include "version.h" +#include + +#define COUNT_OF(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) + +#define ROUNDS 5U + +/* Compiler inline support */ +#if defined(_MSC_VER) && !defined(__INTEL_LLVM_COMPILER) +# define INLINE __forceinline +#elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_LLVM_COMPILER) +# define INLINE __attribute__((always_inline)) __inline__ +#else +# define INLINE inline +#endif + +/* ------------------------------------------------------------------------ */ +/* Version */ +/* ------------------------------------------------------------------------ */ + +static const uint8_t VERSION_MAJOR = NUHASH_VERSION_MAJOR; +static const uint8_t VERSION_MINOR = NUHASH_VERSION_MINOR; +static const uint8_t VERSION_PATCH = NUHASH_VERSION_PATCH; + +static const char *const BUILD_DATE = __DATE__; + +/* ------------------------------------------------------------------------ */ +/* Const tables */ +/* ------------------------------------------------------------------------ */ + +/* 48 byte initialization vector containing the first 384 bits of PI */ +static const uint64_t NUHASH_INI[NUHASH_WORDS] = +{ + UINT64_C(0x243F6A8885A308D3), UINT64_C(0x13198A2E03707344), UINT64_C(0xA4093822299F31D0), + UINT64_C(0x082EFA98EC4E6C89), UINT64_C(0x452821E638D01377), UINT64_C(0xBE5466CF34E90C6C) +}; + +/* 257x48 byte matrix containing pre-computed 384-bit words with HamD(a,b) >= 182 for each pair (a,b) with a != b */ +static const uint64_t NUHASH_XOR[257U][NUHASH_WORDS] = +{ + { UINT64_C(0x01DCDF00414B3037), UINT64_C(0xB1B3AF661B8E96F8), UINT64_C(0x944D2873DB393121), UINT64_C(0x73DA9A36662AE755), UINT64_C(0x1F4F318C4ECB56B1), UINT64_C(0xF09743D99C2AA5BC) }, /*00*/ + { UINT64_C(0xA81FBBC6CBBFC954), UINT64_C(0x39DE43648959EDDB), UINT64_C(0x1A641A0BDA01822F), UINT64_C(0xB52E607266932658), UINT64_C(0x2C5B1731AC802084), UINT64_C(0xC2EF10671FC79DD4) }, /*01*/ + { UINT64_C(0xCF2A8D8E08810046), UINT64_C(0x8B7E9B2089E268F6), UINT64_C(0x930461652C5D2DEC), UINT64_C(0xF096E42223BFC8B9), UINT64_C(0x8DD338964CFE0970), UINT64_C(0x269C342F7CEC60BD) }, /*02*/ + { UINT64_C(0xB970A920D2ED0552), UINT64_C(0x010F894A254DA7E1), UINT64_C(0x8D5F205F9D1A40D8), UINT64_C(0x50C33DCCC3FD5F58), UINT64_C(0xB49F31BDE7D82C57), UINT64_C(0x7CDE04F62A959033) }, /*03*/ + { UINT64_C(0x49FAB2822B9C84AC), UINT64_C(0x34B8648CD68CBEF1), UINT64_C(0xE5121147BB4126DE), UINT64_C(0xC0B31F54B2FFE00F), UINT64_C(0x2F193DA38E8CC632), UINT64_C(0x058C984B429B8AFC) }, /*04*/ + { UINT64_C(0xE07F9DA44D8C9942), UINT64_C(0xBE2AF9B39ACA65F2), UINT64_C(0x5D3D8FB1466DC295), UINT64_C(0xC0051E3EC3F962C7), UINT64_C(0xF8FDC3CCD4CE2BB6), UINT64_C(0x9024C0EFC6199937) }, /*05*/ + { UINT64_C(0xA3111377EF01F5EF), UINT64_C(0x31F59B366C02A3FF), UINT64_C(0x61B82949760D16DC), UINT64_C(0xF6B958AF92BD3BDF), UINT64_C(0x7297AAEFEC69C0B2), UINT64_C(0xFE8A50AD9E8684CD) }, /*06*/ + { UINT64_C(0x3D3DD0C829EA9AA0), UINT64_C(0x3E77597EEC96C7A3), UINT64_C(0x8FD038231E7F1684), UINT64_C(0x64617B131FB7EDE0), UINT64_C(0x85C99CE4C5405874), UINT64_C(0xA58735D41F19C5E3) }, /*07*/ + { UINT64_C(0x8028628ACAF91B9A), UINT64_C(0x194A640538C97064), UINT64_C(0x04A15E018A4F1680), UINT64_C(0xF4BE1B04C2360955), UINT64_C(0xDFB24D4CEF581A20), UINT64_C(0x3C59D0A0FD15879D) }, /*08*/ + { UINT64_C(0x88F8E2ECE78AF1BC), UINT64_C(0xB46B6E22297364C2), UINT64_C(0x9339F17F926B99F3), UINT64_C(0x31293489B3B8F07C), UINT64_C(0x3909CE1649C9BCF1), UINT64_C(0x0C46103BFA31BCE9) }, /*09*/ + { UINT64_C(0x4D1A0B8CC7EFE2A9), UINT64_C(0xAFD7878CAD55E871), UINT64_C(0xC89CFBC858CF4153), UINT64_C(0xC4739486C74F75D6), UINT64_C(0x0BF7192C130AC9F2), UINT64_C(0x0084F2BC5E81BD9A) }, /*0A*/ + { UINT64_C(0x4AFBE975014FCACF), UINT64_C(0x41DEAF8CFACC41E4), UINT64_C(0x3C1EC23B53ED16E9), UINT64_C(0x78B06EB30F1C3248), UINT64_C(0xDD11165D04285C72), UINT64_C(0x6546D9B5609491E4) }, /*0B*/ + { UINT64_C(0xFFD1E2E04DC8D260), UINT64_C(0x07B186948A74ECCE), UINT64_C(0xB5120E45121AC531), UINT64_C(0xBD0BC86330810C85), UINT64_C(0xDE93AFDDDB487730), UINT64_C(0x78DEB0DE6EB99196) }, /*0C*/ + { UINT64_C(0x79BAA2AC3FDEBA55), UINT64_C(0xB1B7E3E1C92A567E), UINT64_C(0xA53F69AB4A5B0794), UINT64_C(0xF0DA7499954F6DDD), UINT64_C(0x58117C89E1132248), UINT64_C(0xD95DF5F794C51A6E) }, /*0D*/ + { UINT64_C(0x89BC8A0C65091C33), UINT64_C(0xB04EEAEE063135C2), UINT64_C(0xF53267E04AB6E689), UINT64_C(0xB4C579B7207E8BF2), UINT64_C(0x3FD31E51343CD2DF), UINT64_C(0x119E523E2F8197FE) }, /*0E*/ + { UINT64_C(0x2E10CB1C6060F32D), UINT64_C(0xBC92E732A94E6B63), UINT64_C(0xF3220D831FD04267), UINT64_C(0x502C5F7414BCE87F), UINT64_C(0x89E0651DE91D2457), UINT64_C(0x759E56B04482D915) }, /*0F*/ + { UINT64_C(0x43AEE32C6A84E803), UINT64_C(0x0C5007202C0BD7E3), UINT64_C(0xB4F464474205D32A), UINT64_C(0x7D17FC95DE386C06), UINT64_C(0xE8DFBF64567AA545), UINT64_C(0x55BD889D5853046F) }, /*10*/ + { UINT64_C(0x687ABE14EAB8DA27), UINT64_C(0x397B3AB50D72C344), UINT64_C(0x505EAA6D1FDE618D), UINT64_C(0x61BE79865DA13F69), UINT64_C(0x17BBAB29B5E90E2D), UINT64_C(0x010C921972FA8B2F) }, /*11*/ + { UINT64_C(0x8B7223A4F56FF453), UINT64_C(0x291B7B5CB98B6FE1), UINT64_C(0xFD421625786FBF7D), UINT64_C(0xE33D1020D0E8CDC8), UINT64_C(0xCA530C708B739E87), UINT64_C(0x878AF1F304B8A12F) }, /*12*/ + { UINT64_C(0x7ECE1F24E56DD711), UINT64_C(0x2E0869241B2FA6DF), UINT64_C(0x84B834DCC459B2FD), UINT64_C(0xE022EDA6319E7D3B), UINT64_C(0x59839D8CA03C9928), UINT64_C(0x644790F491BBC774) }, /*13*/ + { UINT64_C(0xCBDC6F49E6B0DD0D), UINT64_C(0x44BA2F8D00346732), UINT64_C(0x86BCC821586AE61C), UINT64_C(0xC7B7491285CEE55B), UINT64_C(0xED3912FFD97F3851), UINT64_C(0xF4AF0186BEBEBCBF) }, /*14*/ + { UINT64_C(0xCA8A48E54ECCE516), UINT64_C(0xBEDF1864B7F8F506), UINT64_C(0xD56A1F60A4B36AA4), UINT64_C(0x49B25AB5FE0DD9D9), UINT64_C(0x21377DBB5E49FCE1), UINT64_C(0x708F64F5D59D99E7) }, /*15*/ + { UINT64_C(0xE9F873A569AFE02C), UINT64_C(0xDA66BC05CA997390), UINT64_C(0x8C88174756D35385), UINT64_C(0xEAAAF16CF4FDA730), UINT64_C(0xB39F7A55653A3512), UINT64_C(0xF10AB727BC23E852) }, /*16*/ + { UINT64_C(0x93E96FF8C5BBE2AF), UINT64_C(0xA47785420253E97C), UINT64_C(0x704B25D1F77D074C), UINT64_C(0xC0B2093F1470559C), UINT64_C(0x8D5BFDD4E364AACF), UINT64_C(0x550518673F5B1BF7) }, /*17*/ + { UINT64_C(0x8DAC832E5BE81ACB), UINT64_C(0x588BFB202B7583D8), UINT64_C(0xA34D8A70DFD1D7E4), UINT64_C(0xD03B0627B687033E), UINT64_C(0xE3D0BE7EDBDC75CF), UINT64_C(0x818EE8C5B09F8BEA) }, /*18*/ + { UINT64_C(0x8E3B02E1489D7D31), UINT64_C(0x5336752B64E3B532), UINT64_C(0xE4D4CC795C580A65), UINT64_C(0x6DAB08F313ED767E), UINT64_C(0x8E567E88FDBA36BF), UINT64_C(0x259490F1D8E933D0) }, /*19*/ + { UINT64_C(0xEAB437D0D62CAA62), UINT64_C(0xC090AD28B982B003), UINT64_C(0xE255D768D25704EC), UINT64_C(0xA048511AF6256A43), UINT64_C(0xE79F078F4D498B5F), UINT64_C(0xC41735FB75B357FE) }, /*1A*/ + { UINT64_C(0x70DA9FC3504FF29D), UINT64_C(0xB9AB1F388673FF25), UINT64_C(0x36922F4CD17357BA), UINT64_C(0xF09C3AB292E7E04A), UINT64_C(0x90CE0BC3D9BA13EC), UINT64_C(0x647C4CA63C918DE3) }, /*1B*/ + { UINT64_C(0xD834A38DD1ECD688), UINT64_C(0xA97A0020DE46AB6A), UINT64_C(0x9CDEC7F6E62EA71F), UINT64_C(0x288A5A6FD74DC47E), UINT64_C(0xD44A2E2765CE50F1), UINT64_C(0xBB9B50B5DB9E4F3C) }, /*1C*/ + { UINT64_C(0xC66DA90E41DDF2E6), UINT64_C(0x5A3FE86F160C5C09), UINT64_C(0x6F6AF0405108CCBE), UINT64_C(0xF938382EB627FC7F), UINT64_C(0x163DD634617F006C), UINT64_C(0x5184B1FEDC908497) }, /*1D*/ + { UINT64_C(0xC95719ED07FCB21C), UINT64_C(0x5112DF043F6EE7EB), UINT64_C(0x50F9FD60012334CE), UINT64_C(0x589FA85104D96579), UINT64_C(0xB7129E44D71905A7), UINT64_C(0x3314766E0733528D) }, /*1E*/ + { UINT64_C(0xDC6C8014C5457CB8), UINT64_C(0xD635FDCD286A69B6), UINT64_C(0xD66F232CE27D01BF), UINT64_C(0x56AF4AC0F682EC0F), UINT64_C(0x57DF1D55B64328F5), UINT64_C(0x651ED4C52A87CACA) }, /*1F*/ + { UINT64_C(0x26D9D1CC79EEC502), UINT64_C(0x69BF340A34B1EBFE), UINT64_C(0xFAA5AAAC8E397174), UINT64_C(0xD0A8F9BD426BCF6F), UINT64_C(0x5B131F464D6D2452), UINT64_C(0x122DD15660D0D6DA) }, /*20*/ + { UINT64_C(0x6E389AEC5F51A22F), UINT64_C(0x7EF68F1C54C127FB), UINT64_C(0x986D4D46E0485C30), UINT64_C(0xF0A47B39E7CF8A31), UINT64_C(0x1D398DFDB7F2A78F), UINT64_C(0x2FC651D1FBB10D2E) }, /*21*/ + { UINT64_C(0xA44E4E8D1B49DCB0), UINT64_C(0x07A4822049C2F343), UINT64_C(0xC40AC04A8D6505BA), UINT64_C(0xD9B91D3F0729B16C), UINT64_C(0xAAF39951B50F9015), UINT64_C(0x966EF5D3AD3F9076) }, /*22*/ + { UINT64_C(0xEA78CBAC0EB6D009), UINT64_C(0xA0FEA6725A23DEAB), UINT64_C(0xCE729C7444CB94D9), UINT64_C(0x40A994626627AA0D), UINT64_C(0x37F738CDE3D018D5), UINT64_C(0x4C29491C01CDB3C5) }, /*23*/ + { UINT64_C(0x7C9792AEA745C87A), UINT64_C(0xD1FF5620C5BD8FD4), UINT64_C(0x9ECA84E3004B56B9), UINT64_C(0x5AFD3923C228B1D6), UINT64_C(0xE5DBF79EB3FD283B), UINT64_C(0x441712E354084B9F) }, /*24*/ + { UINT64_C(0xE35D288BD8E249BC), UINT64_C(0x91776C1453A366E5), UINT64_C(0xF5D1E1684E95EFEC), UINT64_C(0x9108E117D7DDF606), UINT64_C(0x81B30F9DA2CE7C8C), UINT64_C(0x6497DBD786818C0D) }, /*25*/ + { UINT64_C(0xC2F891FF45044BE0), UINT64_C(0x75A1A76D2B87E2EB), UINT64_C(0x85CE65798AF3C2BF), UINT64_C(0x213F532B4EFD09DC), UINT64_C(0x0DAA1DF5A53A6C88), UINT64_C(0x3028606A50D826B2) }, /*26*/ + { UINT64_C(0x609A62616379F33A), UINT64_C(0xA339A3BC53E4516D), UINT64_C(0xD7AD92616A5ADBEC), UINT64_C(0xD043726D86E924AA), UINT64_C(0x8555B564F4C29865), UINT64_C(0x56AA12AB31C1D6B0) }, /*27*/ + { UINT64_C(0xCED9ED85C1C17BFF), UINT64_C(0xEB522325ACBAFFC2), UINT64_C(0x04D3D8F4B2D15394), UINT64_C(0xD271504C04756EEA), UINT64_C(0x2DDBA4A91AF827F1), UINT64_C(0x1F67D5C28F8002E4) }, /*28*/ + { UINT64_C(0x8B9C08AD432DC08F), UINT64_C(0x5A7543E29796BBC7), UINT64_C(0x34A6DB5B3C1967DE), UINT64_C(0x016E3BC2A2804EE4), UINT64_C(0x5B9BCACCE5172F75), UINT64_C(0x7549598B80ADBDBA) }, /*29*/ + { UINT64_C(0x6F3FB117C5CDD155), UINT64_C(0x16C3B0A59CD6EEC5), UINT64_C(0xD9A1A411DE538769), UINT64_C(0x938C54979F4AC37C), UINT64_C(0x3737BCC1D55284DB), UINT64_C(0x6CAD9F8AF9156BB7) }, /*2A*/ + { UINT64_C(0xEBBF284F9C75EBDF), UINT64_C(0xB383EBB406753DE8), UINT64_C(0xAA86127AEE7C403C), UINT64_C(0x10BFDD10523DE027), UINT64_C(0x138BF6C4EB4A8A13), UINT64_C(0xB1EFF67DDB78B067) }, /*2B*/ + { UINT64_C(0xF6D1138D7AA3DA5E), UINT64_C(0xBAA8098D8FB66371), UINT64_C(0xDAE76D1B8B6CAAF2), UINT64_C(0x400F1034368D1EDC), UINT64_C(0x7C937F5172E8D277), UINT64_C(0x7D05BBF83CADE6EF) }, /*2C*/ + { UINT64_C(0x0E9C2EA6CF34B081), UINT64_C(0x9036B30D58F60BA0), UINT64_C(0xDB3A2C5848F08BCA), UINT64_C(0xC87AD1B94250D564), UINT64_C(0x7C892E09EEF96166), UINT64_C(0x26DB85CF571085F3) }, /*2D*/ + { UINT64_C(0x251EE3F58718C12A), UINT64_C(0xF9438D81178A2AE4), UINT64_C(0xF0929A889039A8A8), UINT64_C(0xF06B65225EBDCCFD), UINT64_C(0x2E4D14EDF7BF73C6), UINT64_C(0xA9369895BC1DFACF) }, /*2E*/ + { UINT64_C(0xCAE302B41D6979CB), UINT64_C(0xBBFA5A58B51EE623), UINT64_C(0x5113B99DC81AB52F), UINT64_C(0x6093795BEC17A056), UINT64_C(0x8F71FB4D2E5E355E), UINT64_C(0x762F92EDBA34A2F2) }, /*2F*/ + { UINT64_C(0xD130015265A4D9FF), UINT64_C(0x09BEA253D71F26C8), UINT64_C(0x81B6EAEDC46521E6), UINT64_C(0xFAE268165682B8A9), UINT64_C(0xA89C3EC4774AB623), UINT64_C(0x0D2E45E055219DB2) }, /*30*/ + { UINT64_C(0x2B560284C3A692AB), UINT64_C(0x37008AD0B379A7B8), UINT64_C(0xAF11CD2C30F90BFC), UINT64_C(0x7FE87A250F2762ED), UINT64_C(0xC3FBD711647242C3), UINT64_C(0x74ED8264F6B322BD) }, /*31*/ + { UINT64_C(0x28195CC8A7AD3943), UINT64_C(0x53CBE808464C4FC4), UINT64_C(0xD58E3D7A765F8726), UINT64_C(0xD83052F60185AA4F), UINT64_C(0xEFCB0D85223BB4E7), UINT64_C(0x5A31305E787FAC28) }, /*32*/ + { UINT64_C(0x725D0EE230F19543), UINT64_C(0x9091D2C6BDDF34E0), UINT64_C(0xE3BE49C6C2754601), UINT64_C(0x61BE300BA4AD566B), UINT64_C(0x02D79D7551FA7CC1), UINT64_C(0x6543910F5F1CDA58) }, /*33*/ + { UINT64_C(0x4099ADC44481B43F), UINT64_C(0xFE1361922FD9EB81), UINT64_C(0xA989C09E441FCEAC), UINT64_C(0x449B3A13D3CB9019), UINT64_C(0x45A9BE396F201134), UINT64_C(0xDC1AD05A046633FE) }, /*34*/ + { UINT64_C(0x1A563A6D522F3E69), UINT64_C(0xBE589E079F475A9E), UINT64_C(0x75A2A9638E4C0038), UINT64_C(0xDA3B6202577A0362), UINT64_C(0x211D3F1E0D727AF6), UINT64_C(0x5E1FFC529AD99233) }, /*35*/ + { UINT64_C(0x47B61E86C6D6D01B), UINT64_C(0x437D6F83ADADC318), UINT64_C(0xD5A361028DED738C), UINT64_C(0xA00D4C630425164B), UINT64_C(0x1A69AFA5AF4C9DD2), UINT64_C(0xF99E1C67F951B582) }, /*36*/ + { UINT64_C(0xA66A7740B6BDEA79), UINT64_C(0xFEF7FF1496AF80A3), UINT64_C(0x05AFD43EEACD898C), UINT64_C(0xB00C78ED31AD7134), UINT64_C(0x0ED31A1AD7846673), UINT64_C(0x74B96844161499BE) }, /*37*/ + { UINT64_C(0x46FA8D6CCBF6D12E), UINT64_C(0x31C2FC147F303956), UINT64_C(0x707F4401DE5F067F), UINT64_C(0x3AE5FEC7E33594E9), UINT64_C(0x28E39F8A63531714), UINT64_C(0xB7B329EA1E9FCAB2) }, /*38*/ + { UINT64_C(0xEFD8F755825C7804), UINT64_C(0x1F5A93870BD30CD1), UINT64_C(0xEFBF894671FF8716), UINT64_C(0x28ED617FF22BDA58), UINT64_C(0x411289CCAE5CB62E), UINT64_C(0x95DD42F41801F2F9) }, /*39*/ + { UINT64_C(0xA8525B8645FC59E1), UINT64_C(0x75E62DC00A5F7F0C), UINT64_C(0x09C56785210416AC), UINT64_C(0x50EF76E9B30D7626), UINT64_C(0x2B3B2CDC19F5D665), UINT64_C(0xA41297CD11D8F4FF) }, /*3A*/ + { UINT64_C(0xEAC99A649EEE5039), UINT64_C(0xA593C92F143C0065), UINT64_C(0xB314735203071206), UINT64_C(0xEA2761A0C764A4EC), UINT64_C(0x02AA7FD46CAC25B3), UINT64_C(0xC68CC182A96D03BF) }, /*3B*/ + { UINT64_C(0xB2873F024EC83CA8), UINT64_C(0x97470AB8FD8853EB), UINT64_C(0x18FE15C159B305BD), UINT64_C(0xB0AB08F687EAEAFD), UINT64_C(0x510A3FDE73602E43), UINT64_C(0x03E1B84DCCF0FCF0) }, /*3C*/ + { UINT64_C(0xD85BBBDC8033C0D8), UINT64_C(0x9223D9C39CA9F34F), UINT64_C(0x7D3BCB6D5B63C3FD), UINT64_C(0x1C30F974DA0C0FB5), UINT64_C(0x8B24BC9EBEFB5143), UINT64_C(0xC58954925B7B84FC) }, /*3D*/ + { UINT64_C(0x6ABD7C2E0844D7A7), UINT64_C(0xCCF2EA456CDF530D), UINT64_C(0xE8938CF52B3921B8), UINT64_C(0xBA023CA2F281657C), UINT64_C(0xEC635DA675D1EDAE), UINT64_C(0xB4AA52F22EE1BE6C) }, /*3E*/ + { UINT64_C(0x981C3AC677CB5904), UINT64_C(0x6A92B54C84877B49), UINT64_C(0x745BA6BB40C55815), UINT64_C(0xB7AF550D22A371ED), UINT64_C(0xD5E8BD87C65F5374), UINT64_C(0x67874A37F0F538F5) }, /*3F*/ + { UINT64_C(0xC23BBA2A9DECC021), UINT64_C(0x4E610E930B0E3450), UINT64_C(0x1A681AA91477577E), UINT64_C(0x38A3209714EDC376), UINT64_C(0x0FD15563EEEB4AB6), UINT64_C(0x7D57668A01D42178) }, /*40*/ + { UINT64_C(0x6AF88CE145A098B5), UINT64_C(0x1AEB858CD88B8B46), UINT64_C(0xE8B733AFB8E2D6E8), UINT64_C(0x313FAA8C10A7EBFA), UINT64_C(0x127D375E77557CEA), UINT64_C(0x96BDA2F70B2F2155) }, /*41*/ + { UINT64_C(0xEC8903978FAFB636), UINT64_C(0xC7213C425C079763), UINT64_C(0x760384036AB6D17C), UINT64_C(0xE0C63A26385F1F49), UINT64_C(0x299877D6811A6DF5), UINT64_C(0x876F90FC5304B88D) }, /*42*/ + { UINT64_C(0xA6FABBC2D6E0BA16), UINT64_C(0x9B70C9640080E6BC), UINT64_C(0x29B2D5265598B27B), UINT64_C(0x4A9657C726E4397E), UINT64_C(0xA801CCC6766678D5), UINT64_C(0x800EF7CC72619998) }, /*43*/ + { UINT64_C(0x235931A8CF5490BF), UINT64_C(0xE798F98E0E8F879F), UINT64_C(0xC6EEE29C38F30CA7), UINT64_C(0x929A79F2D53E0024), UINT64_C(0x88F2E12749587A45), UINT64_C(0x0B85B28F38891965) }, /*44*/ + { UINT64_C(0x165E0303E4A4D827), UINT64_C(0x67994F42D1E8436A), UINT64_C(0xE6CC8BCF6E130D1B), UINT64_C(0x50101711709DDEFC), UINT64_C(0x373BDEC40CD05328), UINT64_C(0x40B274A4AA5109F6) }, /*45*/ + { UINT64_C(0xA9F88BA008FDF8C8), UINT64_C(0xECC897E3476EE05A), UINT64_C(0xBCE290AB69D57A74), UINT64_C(0xFA44DB1811E3115D), UINT64_C(0x6267AEFD64480C88), UINT64_C(0x2697D04A2D3AECEB) }, /*46*/ + { UINT64_C(0xC0782AF2ABCD3313), UINT64_C(0x02BA1290F2F96273), UINT64_C(0x63C82F1A56ADC2B9), UINT64_C(0x10F8E8C03EFE51C4), UINT64_C(0xE3EB348625CCAFFD), UINT64_C(0x93D607969CB8E7AE) }, /*47*/ + { UINT64_C(0xCC6E179443E58FBC), UINT64_C(0xD21C93C655A7B8EE), UINT64_C(0x2B9834A31F2B8BA4), UINT64_C(0xC83B69516025ECEE), UINT64_C(0x9176EB7B427AAE94), UINT64_C(0x8CB65B9E30B7A76E) }, /*48*/ + { UINT64_C(0xC1A33A0AD6EDD989), UINT64_C(0x18B3C5D95813B5F7), UINT64_C(0xB024BD263B359A8B), UINT64_C(0xC8C17C2216A99B50), UINT64_C(0x71F9A11D58237729), UINT64_C(0x3AA67C7618284290) }, /*49*/ + { UINT64_C(0x99B7465E09201C7B), UINT64_C(0x9AF89FA01CA4FA81), UINT64_C(0xFC2EC63E761AD123), UINT64_C(0xE2A9A39585B17D14), UINT64_C(0x08394DE529F94E81), UINT64_C(0x479448E69794FAA4) }, /*4A*/ + { UINT64_C(0x23CA3D1C4CBDCABB), UINT64_C(0xE3265436CE1A37E4), UINT64_C(0x1BBF10F69E8A4CC9), UINT64_C(0x05A66708048F5C4D), UINT64_C(0xE259DCDD9C5BFEFE), UINT64_C(0x439E65FAFD936EFD) }, /*4B*/ + { UINT64_C(0xA24D73B6978F719C), UINT64_C(0x3F53F343CCB0BB8E), UINT64_C(0xBE3C72769EE07C6A), UINT64_C(0xFACB9E539CF558DD), UINT64_C(0x67B91D4E30DE986A), UINT64_C(0x1DB913D11698913A) }, /*4C*/ + { UINT64_C(0x98BD4E140DC3C3C6), UINT64_C(0x142B1592BF3263E8), UINT64_C(0xCDBEAC59ED095B0E), UINT64_C(0x900763F0F625896A), UINT64_C(0xE213550F30324E39), UINT64_C(0x8A13A4417A803195) }, /*4D*/ + { UINT64_C(0x2ACD98ED8C626073), UINT64_C(0x1CAAA6B4C4CF3238), UINT64_C(0x04DCB41EB677EB5D), UINT64_C(0xF88B5844A8105B68), UINT64_C(0x981D9E951A061A4D), UINT64_C(0xBC9471894C878EDB) }, /*4E*/ + { UINT64_C(0x4959FEAD5D6C2DBD), UINT64_C(0x6ABD59E28C503049), UINT64_C(0x06D2C5494CAF8B34), UINT64_C(0x70E4541304A4293C), UINT64_C(0x520F3416CAF2F503), UINT64_C(0xB23D09D92613DB85) }, /*4F*/ + { UINT64_C(0x26B5A815C32D1791), UINT64_C(0x2C99E7555BB033C6), UINT64_C(0x09CE9D6A0002514F), UINT64_C(0xD485282B2B8D7997), UINT64_C(0x9C5B792F4A4A14C6), UINT64_C(0x851D9D02DC0BB4E7) }, /*50*/ + { UINT64_C(0x62FEB6CACFB060EC), UINT64_C(0x9D977D69D5C661EA), UINT64_C(0xBF08EFD806D81556), UINT64_C(0x25F1EEA460EA5718), UINT64_C(0xA25346B51F5A9665), UINT64_C(0xD92F9ADC358CA274) }, /*51*/ + { UINT64_C(0x27E63DFC63E8FFA6), UINT64_C(0xCDB9CCE2CE99FDA3), UINT64_C(0x979D5B754974830D), UINT64_C(0x3298C8407D6693BE), UINT64_C(0x629D5FADA39B42B7), UINT64_C(0x2654D31271CD84E1) }, /*52*/ + { UINT64_C(0xAB1FA4DAF66E583C), UINT64_C(0xEEB6B7A236D24766), UINT64_C(0xA90738CDFDF5C6B3), UINT64_C(0x28CBA9E5648E2D4C), UINT64_C(0xFDE5BF6C0CFE0DA3), UINT64_C(0x9D00B863D7D78485) }, /*53*/ + { UINT64_C(0x75FBBF094EEA16AA), UINT64_C(0x48931F027CD729F2), UINT64_C(0x5D360679009B2E7F), UINT64_C(0xDDFCD148BD3DE21A), UINT64_C(0x4DBFF544B094D0E1), UINT64_C(0x9C0E5C6294352C22) }, /*54*/ + { UINT64_C(0x283A27FF968853D2), UINT64_C(0xB0960C6CEA0D03F2), UINT64_C(0x172BBA07A473DB38), UINT64_C(0x688C87D296E6F4BB), UINT64_C(0x5CB7E9BC5D68CF0F), UINT64_C(0x57A5D71B0E47BFB4) }, /*55*/ + { UINT64_C(0xDE0108AAC1E4FF2F), UINT64_C(0xD346CFABEAC62B99), UINT64_C(0xB72E203F98B5F608), UINT64_C(0x81853D8CA54B29BE), UINT64_C(0xA6AED7C89FAA1680), UINT64_C(0xD2093B155C39D7ED) }, /*56*/ + { UINT64_C(0x0BAEAC99D4974B84), UINT64_C(0xC7F258A699C9B4DA), UINT64_C(0x6F622C5E4ACCF5C1), UINT64_C(0x58AB397D9781BEAA), UINT64_C(0xBF811F67E101FFE3), UINT64_C(0xAFBCC2881C3C0EF3) }, /*57*/ + { UINT64_C(0x26B211FB518D6C3E), UINT64_C(0x64BADAD51A10784A), UINT64_C(0xE6BE4E06A587186C), UINT64_C(0xD471F5C61343CD5C), UINT64_C(0x8389BB0DD6AAED5D), UINT64_C(0xC88112678914A17D) }, /*58*/ + { UINT64_C(0x2B2D0BC3BB88D27D), UINT64_C(0xC5A7D1FAFF517AD2), UINT64_C(0x96F39056A09F82AD), UINT64_C(0xFB38A61A6CED4D4E), UINT64_C(0x9D308E4EA6F9B264), UINT64_C(0x9097CE294AECC6B3) }, /*59*/ + { UINT64_C(0x8FCA2B950690B1A2), UINT64_C(0x293EFCBF03D422DF), UINT64_C(0x8C9125B3E76353AB), UINT64_C(0x3D402092A1A70173), UINT64_C(0x9BAB974CAB9BF676), UINT64_C(0x5EA8FCC55D8C586E) }, /*5A*/ + { UINT64_C(0x408C92E8C2E1EC8C), UINT64_C(0x4AF4C914B71B4350), UINT64_C(0x5186AEE0CDFB1069), UINT64_C(0x2385EAFAB9657C67), UINT64_C(0xF708E4D3C898CA80), UINT64_C(0x1EC8B9F89884907E) }, /*5B*/ + { UINT64_C(0x46E8958B6A2C1878), UINT64_C(0x2172FD410F78A647), UINT64_C(0x9D8E9DD83A299004), UINT64_C(0x390913C3265AD025), UINT64_C(0xD231F1E23077CBF1), UINT64_C(0xE7EE3E574E80D7F3) }, /*5C*/ + { UINT64_C(0x5A8567A3D85E40B2), UINT64_C(0x16ECF161133FCF73), UINT64_C(0x52DA5C6FBA3C0DD7), UINT64_C(0x56E57983DEB34BFB), UINT64_C(0x83254FDCB768D153), UINT64_C(0x9A14F95F35C6B82D) }, /*5D*/ + { UINT64_C(0x498A29C6E19D4AE6), UINT64_C(0x2EF4AAF46027BA11), UINT64_C(0xBDBA7DAA84F39505), UINT64_C(0x940B2A04F6DC944D), UINT64_C(0x4E7ED35610FC0D53), UINT64_C(0xBADD94C2907E59E1) }, /*5E*/ + { UINT64_C(0x14DF0FC43F475F80), UINT64_C(0x17E2AA8D264BF82F), UINT64_C(0x92625BDFE58B934D), UINT64_C(0x8384F415A4ACEA81), UINT64_C(0x8E9C5EAEC5D8642B), UINT64_C(0x4D8EF55F1C826687) }, /*5F*/ + { UINT64_C(0x4A2335C4F77128D9), UINT64_C(0x544E1476D29ABA94), UINT64_C(0x654EC86321785044), UINT64_C(0xB04AD9B02F80445A), UINT64_C(0xB0E01B6480C8D020), UINT64_C(0x596E325E88A3CBBF) }, /*60*/ + { UINT64_C(0x896955157448D062), UINT64_C(0x0DB08C4C0F236D68), UINT64_C(0x3BA8FC5B3CD1C4A2), UINT64_C(0x04F57C53E144535B), UINT64_C(0xB7D04DCC7BE46840), UINT64_C(0x4BBE993192334646) }, /*61*/ + { UINT64_C(0x1D7837E6AB02CE27), UINT64_C(0x3EA35BAED4493EA4), UINT64_C(0xD1CAFDB5DF94FABE), UINT64_C(0x98B580BB62170C4F), UINT64_C(0xC3C57A6CA9421C43), UINT64_C(0x68D65FC2C1201634) }, /*62*/ + { UINT64_C(0xFAEABABC48717536), UINT64_C(0x454251E8F62F7315), UINT64_C(0xB318E8A7FDCDC523), UINT64_C(0x7C2E832013C91344), UINT64_C(0x4D9E5DAFD1699052), UINT64_C(0x12262E8C870537A7) }, /*63*/ + { UINT64_C(0x8A3E5D0BEF8402A2), UINT64_C(0xA33BC5FAFA019909), UINT64_C(0x63CBE8ACD00762F5), UINT64_C(0xEA26A3F181984178), UINT64_C(0x6EEB78D1BB4AF6BB), UINT64_C(0x7ECF9671300E845F) }, /*64*/ + { UINT64_C(0x0811B67CCCF5D0FC), UINT64_C(0x9F8CAB3F3496BD6B), UINT64_C(0x57CB7D24F1355C2D), UINT64_C(0x58218594165BDE80), UINT64_C(0xFAF3368A653A78F8), UINT64_C(0xC04CD80176267762) }, /*65*/ + { UINT64_C(0xE6417CE75AAA23B0), UINT64_C(0x34A7BFE3CBA61761), UINT64_C(0x8C13E396F8C9B6ED), UINT64_C(0x5C9066464B09ED63), UINT64_C(0x76CB6A642C5CE283), UINT64_C(0x498E082A3EB449C6) }, /*66*/ + { UINT64_C(0x6F2ADEA6357B5AA0), UINT64_C(0x54DA382B15557B69), UINT64_C(0x302BD81946237AAE), UINT64_C(0x8F0CBB82111EFEDC), UINT64_C(0x45DD2DADCE20F2D3), UINT64_C(0x8A77A5E9E8A2D1D8) }, /*67*/ + { UINT64_C(0xE1EC332735862A28), UINT64_C(0x92B68B1A7E9C7C44), UINT64_C(0xF45618DC99E963E3), UINT64_C(0x7CAC984502DD1A73), UINT64_C(0xC8650598CD70840D), UINT64_C(0x9A5DA584A26D4EFD) }, /*68*/ + { UINT64_C(0x16B19B010740C15C), UINT64_C(0xB4544AC01016439A), UINT64_C(0x221F749C9E2F99A5), UINT64_C(0xA63E8A279A65570F), UINT64_C(0xC7231669ADD072AD), UINT64_C(0xC5BC35BA740BC801) }, /*69*/ + { UINT64_C(0x6C44E75A4F378694), UINT64_C(0xD27ACE108A577647), UINT64_C(0x17C487FAFA7E15D6), UINT64_C(0x6A3654D5C8E29EDF), UINT64_C(0x0CE35EEDCC611FFA), UINT64_C(0xD88A8C03C0095093) }, /*6A*/ + { UINT64_C(0xCF106948BC4B1F2C), UINT64_C(0x91C0DC9990B99712), UINT64_C(0x193B21E3E109AB32), UINT64_C(0x3340DE0608DD1666), UINT64_C(0x8A5BB677BF602828), UINT64_C(0x402C410B1197B771) }, /*6B*/ + { UINT64_C(0xEB080FF49CA5543E), UINT64_C(0xB4B9429542D6CA27), UINT64_C(0x5999D45DC1533205), UINT64_C(0xF7EA9E398A1BEF3E), UINT64_C(0xBE8817775476DEC6), UINT64_C(0x17064D7790C84100) }, /*6C*/ + { UINT64_C(0xF3328E9150A7F8D6), UINT64_C(0x52E3E61B04ACFDF8), UINT64_C(0x51D82010F3CEB015), UINT64_C(0x59D673336676D5D8), UINT64_C(0x4CB3BCEF1D91C342), UINT64_C(0x0C589AB58033BE49) }, /*6D*/ + { UINT64_C(0x54B8E70EDCE03855), UINT64_C(0x7BB590E99687FD57), UINT64_C(0x6CFF08688D2B1FDD), UINT64_C(0xFD0F6D068BFE994F), UINT64_C(0xEB9BCE302489AE44), UINT64_C(0x66B21F200661E3E4) }, /*6E*/ + { UINT64_C(0x2F5E0060189669AD), UINT64_C(0x473AF1D03C00CAE4), UINT64_C(0x0278299268D1F3B4), UINT64_C(0x888714BC3A7EC9D2), UINT64_C(0x9FF9C7F071EBD2D9), UINT64_C(0x875A5DC25DFFDB10) }, /*6F*/ + { UINT64_C(0xE2A97A3E468399D8), UINT64_C(0x3BF7EACA32C80DA1), UINT64_C(0x13DCAC8EB6C2231D), UINT64_C(0x227EC90E1102EE97), UINT64_C(0xB2344832F0381434), UINT64_C(0x8613888303B190EB) }, /*70*/ + { UINT64_C(0x3A3D3B6CE026BFFE), UINT64_C(0x18D4953B9A68ED59), UINT64_C(0x24BB7B574AB777A0), UINT64_C(0xE0CB7DD64983DCB1), UINT64_C(0xCF768C439869AC97), UINT64_C(0x8062BC7A900E6033) }, /*71*/ + { UINT64_C(0x39D4C3B78A7A33C7), UINT64_C(0x43D72EF22AB0B4EB), UINT64_C(0x54AE8184DDA50394), UINT64_C(0x0C2A7DA083C38536), UINT64_C(0x9DBC6F921D4AD822), UINT64_C(0x2CBB61FE182EAA42) }, /*72*/ + { UINT64_C(0xD8CE9A806C0BD24D), UINT64_C(0xF69D65A65845727C), UINT64_C(0xC3FF81CC76F2B048), UINT64_C(0x76B1FDC3CA67CE58), UINT64_C(0xCED0970AFBCBE78A), UINT64_C(0x57502941B726F5F3) }, /*73*/ + { UINT64_C(0xE006AEC17FCEFCF9), UINT64_C(0x05CAA1629E003591), UINT64_C(0xB7050CC99F585312), UINT64_C(0x669260401E159490), UINT64_C(0x8442D25AA757CC5A), UINT64_C(0x228655CD4038770C) }, /*74*/ + { UINT64_C(0x93EE8D67D3F1F3A1), UINT64_C(0xBEA46D48DBF8D7F4), UINT64_C(0x3C91F02B8646453C), UINT64_C(0x6C3D7C1F04188A58), UINT64_C(0xEFA97287F89CEF84), UINT64_C(0xCB40364E108BFF4B) }, /*75*/ + { UINT64_C(0xC6DCE3730D4FF825), UINT64_C(0x02AF54F87D972790), UINT64_C(0x7D69D20F6F4F788F), UINT64_C(0x90C255C64C166E8F), UINT64_C(0xA3529FBF4BF9C9A2), UINT64_C(0x3ECEC41136694F6B) }, /*76*/ + { UINT64_C(0x3DE10A5EC6CA7B3F), UINT64_C(0x7E196081D085ACAA), UINT64_C(0xDF5F0DE3705D60F7), UINT64_C(0x393E7C83DCC57075), UINT64_C(0xA5F33BC2DCB98F97), UINT64_C(0x0AEB7F050D1204C0) }, /*77*/ + { UINT64_C(0x6F3B3B3D11A8BC05), UINT64_C(0xB52269AB2B95B8DC), UINT64_C(0x12EDE24EB1385F13), UINT64_C(0x202BBA6B5836B5E1), UINT64_C(0xEE3636C5925ACC49), UINT64_C(0x42224CF6EEB509BF) }, /*78*/ + { UINT64_C(0x5F0CC3BBC4BE9A92), UINT64_C(0x584313FCCC54DD2E), UINT64_C(0xC11FE90F00394036), UINT64_C(0x3371667C72FC9723), UINT64_C(0x9611990B62AC8D9F), UINT64_C(0x4CFCB9EB3C317FAD) }, /*79*/ + { UINT64_C(0xCA8E520A894A3FBA), UINT64_C(0xBD9ED1B80098CC40), UINT64_C(0xBDF24507DFF3757C), UINT64_C(0x47AEC572E68D35EC), UINT64_C(0xF3D4523D27B373E4), UINT64_C(0x1AB11E16973A05AB) }, /*7A*/ + { UINT64_C(0xFFC293A6C26B817D), UINT64_C(0x2C9E9D134959D828), UINT64_C(0x7FA5216408199BBF), UINT64_C(0xA6F002DE0DCCD861), UINT64_C(0xBE8F9DC57F2CF35D), UINT64_C(0x1352E2DF86A47647) }, /*7B*/ + { UINT64_C(0x84B55BE101708E74), UINT64_C(0x3ADEC53721209F3E), UINT64_C(0xB18F9A1E68DFADBD), UINT64_C(0x09A050819774CF2D), UINT64_C(0xE4AB295D380A8762), UINT64_C(0xA3605B0C689C239F) }, /*7C*/ + { UINT64_C(0xDDC7031FBFDFFE8F), UINT64_C(0x0B175DE65B832F0A), UINT64_C(0x31162ABC65719685), UINT64_C(0x51215E534BBC36B1), UINT64_C(0x9F2F7D3B5D01AE44), UINT64_C(0xCF43A2426E83B61B) }, /*7D*/ + { UINT64_C(0x7E32DB672B16F04A), UINT64_C(0xCE6F45DE0E6AB788), UINT64_C(0x25718548B8E70B41), UINT64_C(0xD7368BCF39A0FAC4), UINT64_C(0x956863EC49880C47), UINT64_C(0x720E335796341674) }, /*7E*/ + { UINT64_C(0x06707A8E33D9D6C6), UINT64_C(0xB684BFE26CD576C6), UINT64_C(0x44F47E5ECD5FC46C), UINT64_C(0xAF1B23A856D844B7), UINT64_C(0x98A627916AC5657E), UINT64_C(0x040C3964A1127E19) }, /*7F*/ + { UINT64_C(0xA5DAEC3134C0A39B), UINT64_C(0x0CA04160BD5ADB1F), UINT64_C(0xB50EC5A9F29E1ACB), UINT64_C(0xBE2FA1126AF7BFAF), UINT64_C(0xBEFC0AC4C9C5A4B3), UINT64_C(0x994739C71FB1EB29) }, /*80*/ + { UINT64_C(0x6FEC2D343E83A763), UINT64_C(0x5BDBA5715757F50C), UINT64_C(0xD6F6282EE46A11B3), UINT64_C(0xA8B501F5922A5524), UINT64_C(0xA782A21006B605CA), UINT64_C(0xA10BD2E896975C81) }, /*81*/ + { UINT64_C(0xB8AAE0532226D0ED), UINT64_C(0x891831C0470E84B7), UINT64_C(0x74C824D648E8FF28), UINT64_C(0xB5E4E02EAD3906EB), UINT64_C(0x5ABB086ADA60A713), UINT64_C(0xA80C57666A9E29F1) }, /*82*/ + { UINT64_C(0x529E3E52B1E7230A), UINT64_C(0x0C148861C9F08E26), UINT64_C(0x0CFC8A131BAD803D), UINT64_C(0x8C09F324902FAA9F), UINT64_C(0x0231EE4987999848), UINT64_C(0x3B0688492E2B5457) }, /*83*/ + { UINT64_C(0xEFA6EAC5036814CD), UINT64_C(0x02773C1F8DAA5DF5), UINT64_C(0x0E4EEDBD0702DE31), UINT64_C(0xBA7FD757D0D740EF), UINT64_C(0xA8805F0C74005F8B), UINT64_C(0x1448467BFF3E1EF8) }, /*84*/ + { UINT64_C(0x2A07B766016AC70D), UINT64_C(0x64215C35364219E9), UINT64_C(0xCD6F7EFE35FCF6F1), UINT64_C(0xF05CC06084C29267), UINT64_C(0xAB3BF2F32579A444), UINT64_C(0xAC75F42D9A25B9C9) }, /*85*/ + { UINT64_C(0xEF3A14B5EDDB8464), UINT64_C(0x2314E0802D2DD0E9), UINT64_C(0x14DEAEA9F928762A), UINT64_C(0x5763EBB480E15A02), UINT64_C(0x25F7CA14E8CDF5E6), UINT64_C(0x8E594510DC61E6BC) }, /*86*/ + { UINT64_C(0xE62C38DCFD21000B), UINT64_C(0x7BB32AE917EE3DA7), UINT64_C(0xE49F15E24CC9B656), UINT64_C(0x56E28259DCA361D8), UINT64_C(0xB43B8008A9285F48), UINT64_C(0x0DC6B4AF7E4AE61B) }, /*87*/ + { UINT64_C(0x703C64241142DCAE), UINT64_C(0x732D33342C45063A), UINT64_C(0x37877EA1624567CB), UINT64_C(0x2871D534614DD114), UINT64_C(0xE748092A1D94F5D1), UINT64_C(0x4524056F0C6D1CB7) }, /*88*/ + { UINT64_C(0xE325B1823A595DF9), UINT64_C(0x742D0DD5C96F397C), UINT64_C(0x44361C9540A9F451), UINT64_C(0x02382F9BF6331FB9), UINT64_C(0x8ECBAFBBE91A0467), UINT64_C(0x528EBF3811F904A8) }, /*89*/ + { UINT64_C(0xFD2BC6534631FB0D), UINT64_C(0x27A5F036FEEB9A6C), UINT64_C(0xD0F876D7911D0775), UINT64_C(0x12EFB3A29C6E0B72), UINT64_C(0xDC4BCA3D5E871DA1), UINT64_C(0x028FB6E6E608F46F) }, /*8A*/ + { UINT64_C(0xEF17ECC8930A7B4A), UINT64_C(0x9D97B34672FB273D), UINT64_C(0xC6AE835F35A25D8F), UINT64_C(0x6C27469530C21F5B), UINT64_C(0x2FBC16A26150E795), UINT64_C(0x02AD93AAE0B5C71A) }, /*8B*/ + { UINT64_C(0x6D24BE43CF07DD56), UINT64_C(0x63681D62A38D2A2F), UINT64_C(0x9872C9B411724AA0), UINT64_C(0xB882B4857C19690A), UINT64_C(0x87B1BA8D2804C6F4), UINT64_C(0xD7B199CC36F40B49) }, /*8C*/ + { UINT64_C(0xEEFB8D8573FD9E0F), UINT64_C(0x933403199B91560A), UINT64_C(0xFF0DB41665D5248C), UINT64_C(0x322EE105EA984196), UINT64_C(0xDB8CE0F83890D89B), UINT64_C(0x3A32F8983C901F80) }, /*8D*/ + { UINT64_C(0x082CDAF93F215BAC), UINT64_C(0x67C118A1B9274FAC), UINT64_C(0xAF74501CFB93198A), UINT64_C(0x53525CABA0E812D3), UINT64_C(0xC9AF3A005EFE8A6E), UINT64_C(0xF242DCB60DA7B2FE) }, /*8E*/ + { UINT64_C(0xD3887FBFBB7314DF), UINT64_C(0xDDDCCCF0F720C342), UINT64_C(0xB2C4331C33C8C415), UINT64_C(0x1666010767F4785B), UINT64_C(0x8455B7C1FD5DE487), UINT64_C(0xA821C5EA181875F2) }, /*8F*/ + { UINT64_C(0x7E289831418562F0), UINT64_C(0x2AD12E3042B185C3), UINT64_C(0x7C20D0D735A6AE96), UINT64_C(0xA68BEF98E22CBD41), UINT64_C(0xA1411D22F8D93243), UINT64_C(0xD813FB404F3D2F38) }, /*90*/ + { UINT64_C(0xE13FC0A76F664294), UINT64_C(0x7E21C9D9F7FDDDCB), UINT64_C(0x161E68B366D6B1F8), UINT64_C(0x55BF957EB5743874), UINT64_C(0xB23213EF8364D766), UINT64_C(0x529BB98AF96643D4) }, /*91*/ + { UINT64_C(0x036D7ADDAADB5C33), UINT64_C(0x0525835F802D032E), UINT64_C(0x7DF7D0D8D7A2BEF2), UINT64_C(0x84927644B27696B7), UINT64_C(0x215E21E4D1F9B5B9), UINT64_C(0x77743669C40EB7FD) }, /*92*/ + { UINT64_C(0xA9B3534BE8897784), UINT64_C(0x5BFD4283541A5090), UINT64_C(0x97AFFCCD121C9778), UINT64_C(0xC146C4C9637989C7), UINT64_C(0x0820E72FCBDA59C7), UINT64_C(0x5526E2F4A0AE4F4F) }, /*93*/ + { UINT64_C(0xA4739E20FD72BDC2), UINT64_C(0x6D6EE5A5C1A54CA6), UINT64_C(0x70A97A6FCB884E5C), UINT64_C(0x2B6108339E979C48), UINT64_C(0x93A63730D6BB23A7), UINT64_C(0x5B1DCEAB00045EE5) }, /*94*/ + { UINT64_C(0x427C14E4F88C8BDB), UINT64_C(0x1D8630868E039BC2), UINT64_C(0x33DB40A251502D1B), UINT64_C(0xE043C9CCB45D2B3D), UINT64_C(0x292B67B6EE077B2D), UINT64_C(0x1C3A2FBDE24C742A) }, /*95*/ + { UINT64_C(0x3DED69F37016D86A), UINT64_C(0x9A947B13AC66D7C3), UINT64_C(0x822D8645DF4CB39C), UINT64_C(0x2BA20F98F19E10DA), UINT64_C(0x6703138D422AC4C4), UINT64_C(0x8D34D6138FA04A1D) }, /*96*/ + { UINT64_C(0x28E59C8B257D112C), UINT64_C(0x8747068CC5499FCF), UINT64_C(0xD6C16EB780F9191A), UINT64_C(0xB416151633F7AF08), UINT64_C(0xA230E00D6BA1A1C3), UINT64_C(0xFD066FB9965B83D2) }, /*97*/ + { UINT64_C(0x70F4BC1B7F8FFC37), UINT64_C(0x38DC0331E56B0FDC), UINT64_C(0xA9AB7290AD2B0BBD), UINT64_C(0xB307973C3D0783C6), UINT64_C(0xBDC455F6CDCA111F), UINT64_C(0x23F0E08317B8F0DC) }, /*98*/ + { UINT64_C(0x0AEEC24E9285C50F), UINT64_C(0x3BCDA47833B61ACE), UINT64_C(0x839986F959EE0723), UINT64_C(0xC959034A8D7F5EB9), UINT64_C(0xD4AD7E05B05C4FB5), UINT64_C(0x6C37A3D39F7A0EC4) }, /*99*/ + { UINT64_C(0x0227B7230FBF2D07), UINT64_C(0x28D7D2AD632BED47), UINT64_C(0x07BD8F8B5012EFD0), UINT64_C(0x48A0D43AE0403442), UINT64_C(0x9B8939207F1449A1), UINT64_C(0x351EAD01B9FDF219) }, /*9A*/ + { UINT64_C(0xA7119D2E311CEF25), UINT64_C(0x1E532CD0C4ED0479), UINT64_C(0x2272F878D8D30A0B), UINT64_C(0x769C412CED9C4C42), UINT64_C(0x262FFBFA65CBDDF5), UINT64_C(0xDB73D86721EA368E) }, /*9B*/ + { UINT64_C(0x4BDBE90B3FBADCB2), UINT64_C(0x1324EC3A8D6FEA57), UINT64_C(0x6D9EFBE530850D00), UINT64_C(0x401A88AFF8A4C8F4), UINT64_C(0x655CB76B8A2E271C), UINT64_C(0x35505B6DBDE16F43) }, /*9C*/ + { UINT64_C(0x6E15E57E23F57037), UINT64_C(0x4962737362C1FA26), UINT64_C(0xC962372D1829B80B), UINT64_C(0xA1FE6832EA4D6211), UINT64_C(0x6726E307F96E7763), UINT64_C(0x04C761081677505B) }, /*9D*/ + { UINT64_C(0x42E2FF3A8A6FC164), UINT64_C(0xFB85B2BC9D28B268), UINT64_C(0xC559CFF024533A28), UINT64_C(0x2EC83F3911DAB3CE), UINT64_C(0xAE0FC74A9D736A27), UINT64_C(0xDB9CDD048BAB4CCF) }, /*9E*/ + { UINT64_C(0xD79C52221D20E765), UINT64_C(0x499EDD73903CE704), UINT64_C(0x9B016D987DF48349), UINT64_C(0xFCFAB44AD12FC5C1), UINT64_C(0x811293F3B800FDF9), UINT64_C(0x511DC619CA53CEBE) }, /*9F*/ + { UINT64_C(0xA059EE78B826EDDF), UINT64_C(0x4673AF294D17C85A), UINT64_C(0x5E527D4E4DF282B5), UINT64_C(0xDB5B9A2693F95CE3), UINT64_C(0x6551D304FB54F296), UINT64_C(0xAB3EB70D65912FCC) }, /*A0*/ + { UINT64_C(0x7D0C4F67B6C78135), UINT64_C(0x390CAEA7DE304D37), UINT64_C(0x49E19FABC8D494FE), UINT64_C(0x1A9E1B6437A04516), UINT64_C(0x886CC4BDAB6AF35A), UINT64_C(0x0529217344F502FE) }, /*A1*/ + { UINT64_C(0x3CEDF34141B52CEE), UINT64_C(0x8133BA924753573F), UINT64_C(0xCB32BE22BC66025A), UINT64_C(0x0C480183DE403CB3), UINT64_C(0xBF5B84B427DFCF31), UINT64_C(0x7251428DB0232156) }, /*A2*/ + { UINT64_C(0x86FCE831C58E25CB), UINT64_C(0x5CC43FFE45CBFC75), UINT64_C(0x33877CC042F199BE), UINT64_C(0x1212FA7F0CC22E1C), UINT64_C(0x448EAB4B7D1F9823), UINT64_C(0xA7B1363A9FA7599E) }, /*A3*/ + { UINT64_C(0x2D8C2FEDA0E5106D), UINT64_C(0x192E366838BBEB3F), UINT64_C(0x36226AA60ACEA0AF), UINT64_C(0xE7E1285DC1F3926A), UINT64_C(0x900371FA1883D9EC), UINT64_C(0xBAC33B1AF360EB66) }, /*A4*/ + { UINT64_C(0xD4A2A11612BDE0E3), UINT64_C(0x82AB0DA614CB4CB8), UINT64_C(0x189A4D50AC01F4C6), UINT64_C(0xE36A5DA1D9F6A647), UINT64_C(0xE43120D6B16B11B6), UINT64_C(0x7D395F4236E75378) }, /*A5*/ + { UINT64_C(0xC0C155CD47F3877F), UINT64_C(0x4B03BFE5C334CA71), UINT64_C(0x77710F1F4B844FF7), UINT64_C(0x3443BBAB720E8DC5), UINT64_C(0xF03F8868C5863406), UINT64_C(0x0FD60511C872EB50) }, /*A6*/ + { UINT64_C(0x8C253DAAB5286306), UINT64_C(0x9AA438F54A6196AC), UINT64_C(0x181D08C723A22C5E), UINT64_C(0x633C49C88E3910A1), UINT64_C(0xC9F54A67992675B0), UINT64_C(0x1FDD98ACBD38D976) }, /*A7*/ + { UINT64_C(0xA10893DA7575A9F7), UINT64_C(0x8F5F4A025AB2A018), UINT64_C(0xD80538F0336BFFC0), UINT64_C(0x0F9751D33889626F), UINT64_C(0x30383EB925BF911A), UINT64_C(0xE6149F68CE19CC60) }, /*A8*/ + { UINT64_C(0xB9081DBAC6BE0598), UINT64_C(0x785DD9BC69C71492), UINT64_C(0x8B035A0CA56E172B), UINT64_C(0x8946783500724888), UINT64_C(0xAF1E57C958650569), UINT64_C(0xE1DE4E944FF22261) }, /*A9*/ + { UINT64_C(0xEA5EDC4D2718C0D2), UINT64_C(0xCB1C5D4DA15A8AE4), UINT64_C(0xC6272382F8163015), UINT64_C(0x94A934E5057B54CE), UINT64_C(0x658E481A3D68D10D), UINT64_C(0xE8F24929E50A46A0) }, /*AA*/ + { UINT64_C(0x7DF146281AF482CD), UINT64_C(0x014B68E726407B06), UINT64_C(0x6CE564938C70DDBC), UINT64_C(0x36DAD2DE72A5DAA2), UINT64_C(0x6D573BF69C0B2980), UINT64_C(0x684DAB14B4AA0329) }, /*AB*/ + { UINT64_C(0x9C69DC064E738B5F), UINT64_C(0x83CC16BD5A1C36F5), UINT64_C(0xA99B365E6E141B12), UINT64_C(0x2748FA5AD0FACCE8), UINT64_C(0x26D073A047D99C49), UINT64_C(0xB005B182505B0C0C) }, /*AC*/ + { UINT64_C(0x15B6A2A20ED0FD1C), UINT64_C(0x9333AF729BD65A25), UINT64_C(0x22CC333293BD2C1B), UINT64_C(0xD724D949B15E8BE1), UINT64_C(0x69D0DB0512B97117), UINT64_C(0x85ACA8980DD7653C) }, /*AD*/ + { UINT64_C(0x230EC629D77BB3F2), UINT64_C(0x43115B991D297CB2), UINT64_C(0xA2F955792C53C76F), UINT64_C(0x48A76728EBE25BA7), UINT64_C(0x7CE662A405384400), UINT64_C(0xDDC06B7E6BF49D66) }, /*AE*/ + { UINT64_C(0x20DDB9BD7644410B), UINT64_C(0x056391B1FA2E8C06), UINT64_C(0xCA4EDE51CF167C00), UINT64_C(0x46602B550536F870), UINT64_C(0x5040672597C21FF4), UINT64_C(0x0AF8EC6E8AFB844B) }, /*AF*/ + { UINT64_C(0x0023C5749251B883), UINT64_C(0x335A4F86D66B7E00), UINT64_C(0xAE353DED3EFACE8F), UINT64_C(0x3FC80526D67B35DE), UINT64_C(0x0D9078FBDA80BC53), UINT64_C(0x467900DFF3FE4C14) }, /*B0*/ + { UINT64_C(0x0F9CB2BE6A448113), UINT64_C(0xE38D541B6A9A5829), UINT64_C(0x673953DAF354FC0E), UINT64_C(0x3C818A277F8569E9), UINT64_C(0x8D16EA77DB122A3B), UINT64_C(0xE40A860318B6EA84) }, /*B1*/ + { UINT64_C(0x78CE11F42D7D5E50), UINT64_C(0x84F76DFF199C998D), UINT64_C(0x999B578E3AE935CB), UINT64_C(0xD9FD092C1BE63212), UINT64_C(0x31F33C63ACD316D8), UINT64_C(0x5AA08030B8D65C0C) }, /*B2*/ + { UINT64_C(0x0098DBE19CA84FE9), UINT64_C(0xE2426617D1142137), UINT64_C(0x63C3C4166A78E21B), UINT64_C(0x74B145353E03B0E4), UINT64_C(0xF43C0824EAE508C4), UINT64_C(0x58C1E6622528602A) }, /*B3*/ + { UINT64_C(0x9E27EBE6D1426A6F), UINT64_C(0x2A6A600A6B5FA342), UINT64_C(0x8FF7E2306BA90370), UINT64_C(0xDF83D91A683EDDDD), UINT64_C(0x29572442F0225388), UINT64_C(0xE9CC0F1B6437320A) }, /*B4*/ + { UINT64_C(0x054DF380E896064E), UINT64_C(0xFAB81A4AA3AD88A4), UINT64_C(0xF87426486CCA156F), UINT64_C(0xBB1B3C8237472960), UINT64_C(0x7EC0B87CF73F960A), UINT64_C(0x5C57D7E6470F7808) }, /*B5*/ + { UINT64_C(0x5758E103AC614A1A), UINT64_C(0x766AEE86F81358DF), UINT64_C(0x203FBA51DC74396A), UINT64_C(0x78C93DF969C5721F), UINT64_C(0xE69E32E230196597), UINT64_C(0xE287C6CECD8AB95B) }, /*B6*/ + { UINT64_C(0x2A06A7C10C0DCC97), UINT64_C(0x99D5298268A6745F), UINT64_C(0xF2D818BB774858B3), UINT64_C(0xD52A820D4F64D886), UINT64_C(0x2F808EF87A263981), UINT64_C(0xBB91206E6347C676) }, /*B7*/ + { UINT64_C(0x0847C6D71CE0C746), UINT64_C(0x86FD451B447C1E11), UINT64_C(0xC20623B0E2856FCC), UINT64_C(0x3ADDFA2D0398181E), UINT64_C(0x6736A0A06B336B46), UINT64_C(0xD1C70AEEB2B1257D) }, /*B8*/ + { UINT64_C(0x5633260D141A9776), UINT64_C(0xD530805F596CA3DB), UINT64_C(0x8CE33EF69437CE46), UINT64_C(0xF62D54E97E747088), UINT64_C(0xDF5C9318489B45EA), UINT64_C(0xA4AAD29F0BA850CA) }, /*B9*/ + { UINT64_C(0xBDBD7B16767F6D9F), UINT64_C(0xF7968427F1B7B6DD), UINT64_C(0x58C76599B35276EE), UINT64_C(0x286F4C7F6CADD791), UINT64_C(0x8188C0401742117B), UINT64_C(0xCEC4F1964266D163) }, /*BA*/ + { UINT64_C(0x97E4E8A6B5135B24), UINT64_C(0x8A8BD785E5297977), UINT64_C(0x4545C1A0975BC5BB), UINT64_C(0x13FAE3BD9F59E37D), UINT64_C(0xAFD5627C0E91DE2B), UINT64_C(0xA223AC778474E1A9) }, /*BB*/ + { UINT64_C(0xDE1BF1EAF86C6B3B), UINT64_C(0xA246A3ACD50035FE), UINT64_C(0x6F80179DD96A21CD), UINT64_C(0x3F8DB7CB17300D03), UINT64_C(0x497A798B5D94506C), UINT64_C(0xAD52DCC6F61AE841) }, /*BC*/ + { UINT64_C(0xF4A4E1D08E1F440B), UINT64_C(0x5E27633CD56422E0), UINT64_C(0x1465C14F1DB41420), UINT64_C(0x9A939043988D37C2), UINT64_C(0xCBE65CFA245DB368), UINT64_C(0x6340AEDE28DDA855) }, /*BD*/ + { UINT64_C(0x1F7AB65A3F892454), UINT64_C(0xD70AB4167EBEB5A1), UINT64_C(0x9B2631E824C2028D), UINT64_C(0xD5D97BDEE31519BC), UINT64_C(0xEA2DC77449E4058C), UINT64_C(0xEB204F2D6D2FBAFF) }, /*BE*/ + { UINT64_C(0x6537E69171A2665D), UINT64_C(0x3FD2F835435A3F23), UINT64_C(0xADD5DD3E622D6C8A), UINT64_C(0xC522CDD5E5E243F8), UINT64_C(0x5AEC27F3DBFDA8A2), UINT64_C(0x477A65ED570E1445) }, /*BF*/ + { UINT64_C(0x3BA7CB01D32E9D63), UINT64_C(0x9E335734E7B5416B), UINT64_C(0x0ED96A84F94539F6), UINT64_C(0x45CEE2E46DF5A70D), UINT64_C(0xDE142EE1E9AFEC1C), UINT64_C(0x78D6121C4FDC72DD) }, /*C0*/ + { UINT64_C(0x7BB30AF653390B77), UINT64_C(0x2D394F2B7F8F7BB6), UINT64_C(0x0277A3C213AF3489), UINT64_C(0x7DF6E674DD56D084), UINT64_C(0x5643CD3073C42451), UINT64_C(0xFAB15F8BD1A1DC18) }, /*C1*/ + { UINT64_C(0x42B453ABF5150D8B), UINT64_C(0x913F109C1188E18C), UINT64_C(0xC27BB7631FB43BF9), UINT64_C(0xEBDDE685EF108419), UINT64_C(0x76D67C87C56D33EA), UINT64_C(0x95EC73C0AF40F084) }, /*C2*/ + { UINT64_C(0xBCE43D59A1F50BFB), UINT64_C(0xBA7027CA04D84600), UINT64_C(0xFB6FDB98A2BE644B), UINT64_C(0xD5DE777E993DED4A), UINT64_C(0xFCA39F1EDF710F3A), UINT64_C(0xA5E5893C858D8841) }, /*C3*/ + { UINT64_C(0xC68AC776E6AEACFC), UINT64_C(0x538067C7866106EB), UINT64_C(0xD27B4A352F4EFDE3), UINT64_C(0x847DA2B3BF01E378), UINT64_C(0x3C79E3C136926D58), UINT64_C(0xF957BC8726AA1610) }, /*C4*/ + { UINT64_C(0x95492C4203C7C612), UINT64_C(0x0DD60DB1EE8321FC), UINT64_C(0xE1D9EBA902F62B42), UINT64_C(0xEA2DBF7D0E37A4F2), UINT64_C(0xE11FB9098BF5DA48), UINT64_C(0xDBFE213F818EA338) }, /*C5*/ + { UINT64_C(0x17CB21316D4756DD), UINT64_C(0xB88952498140146A), UINT64_C(0x648112F580844288), UINT64_C(0x4947ADC3F7D58F35), UINT64_C(0x651CCE28E26A5377), UINT64_C(0x0B3803DAF337F89B) }, /*C6*/ + { UINT64_C(0xBEAB16E2DCE6B6E3), UINT64_C(0x8F39ECC8E39172DF), UINT64_C(0x607CC9553FF29C0E), UINT64_C(0x4BFD15154F4F0BA7), UINT64_C(0xEE6230B6BD408CE4), UINT64_C(0x35B654110D164E99) }, /*C7*/ + { UINT64_C(0xADDDFF1BD2C11CD4), UINT64_C(0x2A1A262CBA6E1AA0), UINT64_C(0x0BF2291D09475A46), UINT64_C(0x4C93A0ABADF4DE32), UINT64_C(0x73EE8E1327333E63), UINT64_C(0xF3AE2031F5D13B28) }, /*C8*/ + { UINT64_C(0x246C7CABB2D9A55C), UINT64_C(0x50E9C7282C1EE0F6), UINT64_C(0x2FBDA09565A0D3D7), UINT64_C(0x196552679C04A4EB), UINT64_C(0x137C66DA29A6DD82), UINT64_C(0x08A76B6B4BDA56BF) }, /*C9*/ + { UINT64_C(0x7CA3C59BE3E28610), UINT64_C(0x6ADD75CF1F7AE248), UINT64_C(0x01747450737A6435), UINT64_C(0xA1F2259CB2B4923B), UINT64_C(0xE0C8F55E8ECE7210), UINT64_C(0xD7964398F350B69B) }, /*CA*/ + { UINT64_C(0xE045864ED1825101), UINT64_C(0xAC54969193E1A1C5), UINT64_C(0x23D85A934D0794C7), UINT64_C(0xB4FA88CB734A4213), UINT64_C(0x7C5CBFD6BDA3D5F9), UINT64_C(0x66607FE938748825) }, /*CB*/ + { UINT64_C(0xBAF36FD2A180D481), UINT64_C(0xEAC440AC1B9598F7), UINT64_C(0x9AA24D80FFB7B06C), UINT64_C(0x79601F517358F163), UINT64_C(0xD1071831418BB63B), UINT64_C(0x819609A6AE7D3A03) }, /*CC*/ + { UINT64_C(0x3E9152D8CDBAE551), UINT64_C(0x86AD793F203DD016), UINT64_C(0xBE3AEB778AD4A891), UINT64_C(0x2810254DD76B6618), UINT64_C(0x9B5DCDE36636C327), UINT64_C(0x0A8AAD65868BC58C) }, /*CD*/ + { UINT64_C(0x6D0672780D93152A), UINT64_C(0xEEE705247B828091), UINT64_C(0x9EBDB976F137463F), UINT64_C(0xA7DE3E73A2D0C1BF), UINT64_C(0xF871A00BA0046AC7), UINT64_C(0x484C96A803F23486) }, /*CE*/ + { UINT64_C(0x0FC7BCDABB06BFFB), UINT64_C(0xF75C3FFB3D6309B3), UINT64_C(0xECA305D103109162), UINT64_C(0x373F503B204FFF61), UINT64_C(0xCE332C9F54963FA2), UINT64_C(0x9A4420A52242CDB4) }, /*CF*/ + { UINT64_C(0xC71D481179D198C1), UINT64_C(0x505A2845CEE92569), UINT64_C(0xF339BFF6DD6755B5), UINT64_C(0x8BEAD52B8DE89245), UINT64_C(0x4B686E65920DCA2B), UINT64_C(0x99593FA43EE68A37) }, /*D0*/ + { UINT64_C(0xD90A68D717E61501), UINT64_C(0x9BB920AEA19161A6), UINT64_C(0x2F3D6F96D90EB1E4), UINT64_C(0xDF15ECBA10513D7D), UINT64_C(0xE6E5D539B4F01831), UINT64_C(0xC7D17A7528FECE36) }, /*D1*/ + { UINT64_C(0xA04FF0BEB4EBFBAF), UINT64_C(0xE5E90A5B3DDAA3CA), UINT64_C(0x8453542209F4A145), UINT64_C(0x80A6FFD72BB5A707), UINT64_C(0x14E0C4705A1ABF6A), UINT64_C(0xD699EC1FC18A677D) }, /*D2*/ + { UINT64_C(0x7021A124E3181575), UINT64_C(0xDC7AAE2817AD945F), UINT64_C(0x8BB5521E7F0D565A), UINT64_C(0x6671D3792F0805EE), UINT64_C(0xD3888EA394413A1A), UINT64_C(0xCE4D7E47B55BF9CC) }, /*D3*/ + { UINT64_C(0x22F440263CAADE68), UINT64_C(0xE77BB287772EAC7B), UINT64_C(0x29493775962A40E9), UINT64_C(0x1E06A27FA68CB91B), UINT64_C(0xDDEF02932ABDB9C7), UINT64_C(0x79F03B88DC175233) }, /*D4*/ + { UINT64_C(0x65F6D517B53E2391), UINT64_C(0x97DB65A2F00B1C39), UINT64_C(0x1D77AE9B85AA4855), UINT64_C(0x19133B9B3E9B0771), UINT64_C(0x6376D9F11A7DB3D4), UINT64_C(0x949AD02F5AE16184) }, /*D5*/ + { UINT64_C(0xFE4434CDE09D923B), UINT64_C(0x03B0FCFD713B7052), UINT64_C(0x2D713290D4A67238), UINT64_C(0x2B56946FF629EE96), UINT64_C(0x60A15D01B2B3C428), UINT64_C(0x0B1D5EAF793933A0) }, /*D6*/ + { UINT64_C(0xBC40FCFB0E0D494B), UINT64_C(0xA31C4648C7B3D1DE), UINT64_C(0xF1113C219A07EC8D), UINT64_C(0x2378BEB1A5C2BD1C), UINT64_C(0x190CC3478070A194), UINT64_C(0x63DAB6E1CCF56329) }, /*D7*/ + { UINT64_C(0x901B6B9E82BABF91), UINT64_C(0x872A234C45D61001), UINT64_C(0x6CA46A95C1CC6D6C), UINT64_C(0x22779315E0F02295), UINT64_C(0x60A59396346BE6AC), UINT64_C(0xFB67A503CB488846) }, /*D8*/ + { UINT64_C(0x50D440F74C97660B), UINT64_C(0xE71ECABF64EDFE0C), UINT64_C(0x80201B895718CE22), UINT64_C(0xA05D89804D35D306), UINT64_C(0x8F700402A2B0D086), UINT64_C(0x326FCB334CA4DFC0) }, /*D9*/ + { UINT64_C(0xBCFBD02EA005CDD5), UINT64_C(0xF0225A4675553115), UINT64_C(0x08E18B3692A7AF62), UINT64_C(0x05D34A820C8CED0A), UINT64_C(0x51A8D7CEC33E80EA), UINT64_C(0x0AC007503FAE879C) }, /*DA*/ + { UINT64_C(0xF43EEFB5C83C521A), UINT64_C(0xE5E9B05FC48841AC), UINT64_C(0x79C52C38BF85B5F9), UINT64_C(0x26CD0818AE3BF7A9), UINT64_C(0x4F385C32CA8F5F74), UINT64_C(0xF17B22107B954752) }, /*DB*/ + { UINT64_C(0x1A48FC969198A4B0), UINT64_C(0xD9A78940BB0C4E1C), UINT64_C(0x42781D9BE60E7691), UINT64_C(0x87D1CAF3680F8A30), UINT64_C(0xD09FF193606AAF29), UINT64_C(0x4518DABC60048793) }, /*DC*/ + { UINT64_C(0xF05D48134A56A034), UINT64_C(0x89A65EEB91DC69B9), UINT64_C(0x8FC7F43960E63C62), UINT64_C(0xFA1C6B9FF9415E92), UINT64_C(0x7E219D4E56347935), UINT64_C(0x2B6A48D6DE0AEF85) }, /*DD*/ + { UINT64_C(0x1A7FF9C54B045FFD), UINT64_C(0x44A0A9562E9468B2), UINT64_C(0xF11425A22D1EBF92), UINT64_C(0x208D33120BD28E0E), UINT64_C(0xF2D74197AF80E162), UINT64_C(0xCEEDCA73DFE66C93) }, /*DE*/ + { UINT64_C(0xD57190439D29C9A4), UINT64_C(0x44C007DC2B5EAF9D), UINT64_C(0xEF6DDF48A780CEDC), UINT64_C(0x61B205E4A96024B1), UINT64_C(0x1885B6CE84C3FE5D), UINT64_C(0xB8B56986B6E2CE21) }, /*DF*/ + { UINT64_C(0xF36DACFA34237E99), UINT64_C(0xBE45EB5253BCFED0), UINT64_C(0x402C6946B8B21AC0), UINT64_C(0x2460A6FCE7E9CD67), UINT64_C(0xF89A6D5B162629FC), UINT64_C(0xF66CCEA374DB821E) }, /*E0*/ + { UINT64_C(0x16E06074DCC31A1D), UINT64_C(0xF172017AC3FA38C3), UINT64_C(0xBBC1CE4BB784ED60), UINT64_C(0xDA89A8BCE82AE671), UINT64_C(0xA6DACFFB8D26C0BB), UINT64_C(0x185181AE9609F6D6) }, /*E1*/ + { UINT64_C(0xF110DBDD94D17661), UINT64_C(0xF59FBB4CBA69F393), UINT64_C(0x463B60FB3F3C5E00), UINT64_C(0x1C60B896FE8E78AC), UINT64_C(0x5EB3E26795DE5AB6), UINT64_C(0x997328D4654D6219) }, /*E2*/ + { UINT64_C(0x21069118ABE24B61), UINT64_C(0x811CB8C48FCEFC6A), UINT64_C(0x483B032CFB56F902), UINT64_C(0xFB32E848198CC057), UINT64_C(0xA620815462A04F70), UINT64_C(0x900038D1894959E2) }, /*E3*/ + { UINT64_C(0x5AD509789BFFECD0), UINT64_C(0xDDCD5E8325F69CA0), UINT64_C(0x154D8F1ACD9B8C82), UINT64_C(0xAC7DF75E94CE3CAF), UINT64_C(0x6D6554D1B38754BE), UINT64_C(0xB5DB64AF738486E7) }, /*E4*/ + { UINT64_C(0x35A308A1AC9A43BF), UINT64_C(0x2647805AB3E6E492), UINT64_C(0x4BB74A616F61588F), UINT64_C(0xFA4602EE5BDBF54E), UINT64_C(0x3FDD62470A7174DB), UINT64_C(0x5795433CA808FAAC) }, /*E5*/ + { UINT64_C(0x51A094B8774CA605), UINT64_C(0x5F07974C74EEF225), UINT64_C(0x022AFEF7AD81A953), UINT64_C(0x0967C44BBA336FD6), UINT64_C(0x8AA327918AECBA3D), UINT64_C(0xF70B8436573C3F0A) }, /*E6*/ + { UINT64_C(0xCF374F83420766C3), UINT64_C(0x71F31901A13EF07C), UINT64_C(0x63AD56C7DEF9DC0F), UINT64_C(0x9E5BB5E859F5A231), UINT64_C(0xD0BF453BB9893E4C), UINT64_C(0xA1E14B66C2719760) }, /*E7*/ + { UINT64_C(0xB41861CC73FD3E48), UINT64_C(0x461D79A138B04BE1), UINT64_C(0x4010D37D37FBA817), UINT64_C(0x7D9622AA693225A4), UINT64_C(0x2204454B8126799A), UINT64_C(0x33A5D487DCCD6EB6) }, /*E8*/ + { UINT64_C(0xD291D0317A053320), UINT64_C(0xE27678F1E50D1F76), UINT64_C(0x9A3D663A63159FC7), UINT64_C(0xAD7B4D3F67BAB452), UINT64_C(0x269CC05E2B33CE1C), UINT64_C(0x0FB8261CD734BCC3) }, /*E9*/ + { UINT64_C(0xF3D0546D3D4A25EE), UINT64_C(0xB42874AD28C9B7F2), UINT64_C(0x73EC788B29962D28), UINT64_C(0x4AE73A48132B8553), UINT64_C(0x756C99D7A0910B66), UINT64_C(0xECA7E2C2712D555C) }, /*EA*/ + { UINT64_C(0x559FA5BF24911FDD), UINT64_C(0xA1DDF5DE3770554B), UINT64_C(0xC7C3FD139366B946), UINT64_C(0x6E7ECC0C881D2BA4), UINT64_C(0x14E76D6A27E54B87), UINT64_C(0x7352D5FBC4FAB878) }, /*EB*/ + { UINT64_C(0xF19A622BED8DAC0A), UINT64_C(0x35548E5D7EFC5A2E), UINT64_C(0xCAC84974B4F057B2), UINT64_C(0xAB317ED03D0335AE), UINT64_C(0x710FC138F2C51738), UINT64_C(0x9C90CC495A403416) }, /*EC*/ + { UINT64_C(0x9FA7DEB936F10461), UINT64_C(0xA1529B0B58462F9D), UINT64_C(0x9F109111C8B9EC65), UINT64_C(0x23A3EB28444E33EA), UINT64_C(0x554084CA75118937), UINT64_C(0x599D58A7C946EAC2) }, /*ED*/ + { UINT64_C(0x6EC3AABB7856AC4E), UINT64_C(0x980E6907C1CBCCAF), UINT64_C(0x1F8557ADC700CBF5), UINT64_C(0x7DCB1CE0AF48D9F4), UINT64_C(0x7FB3DADF8199AB8A), UINT64_C(0xE6B36DB8FADBF312) }, /*EE*/ + { UINT64_C(0xC00F0D3F7A101660), UINT64_C(0x605B94B12DB6C697), UINT64_C(0x79944F7BA2B65F38), UINT64_C(0x40858ADEDD47E2BC), UINT64_C(0x1E044BDB0E9FB02B), UINT64_C(0x86C79D01A3109539) }, /*EF*/ + { UINT64_C(0x9731893D5B98482A), UINT64_C(0xFB8DE267F9790326), UINT64_C(0x8780F407143A505D), UINT64_C(0xA41CAEFCCCD3A8E3), UINT64_C(0xA042F0B3D7B7A7FE), UINT64_C(0x3E3151FEBB19A1AC) }, /*F0*/ + { UINT64_C(0xE7EDF679003A6950), UINT64_C(0xBAFC97D4A8C6AB12), UINT64_C(0x13C096B49C79559A), UINT64_C(0xC3052501434B5019), UINT64_C(0x1280FB23E7ADFB09), UINT64_C(0x1959905D31BD2FC0) }, /*F1*/ + { UINT64_C(0x575C0C46FCFCC65B), UINT64_C(0xFE625E873F34B419), UINT64_C(0x1696FDCC7F51B8A3), UINT64_C(0xC79C56F30E5AE7C0), UINT64_C(0x14E3461CD27FAD15), UINT64_C(0x1B7BCCB9CB472859) }, /*F2*/ + { UINT64_C(0x3806FE58E5CC8F16), UINT64_C(0xF8244ED76734C1BF), UINT64_C(0x4E04940E0F5DDB56), UINT64_C(0x5BD0AFDDC4158B7B), UINT64_C(0xA4C6BA949911C5C9), UINT64_C(0xFF6E2AC155AE9726) }, /*F3*/ + { UINT64_C(0x49C7C844B8114144), UINT64_C(0xB450E41BCA35CB00), UINT64_C(0x302450EC67BEF97C), UINT64_C(0xA8662049DB1E0D8B), UINT64_C(0xDA69C022528EB8FA), UINT64_C(0x6ABBF16585C1A2F7) }, /*F4*/ + { UINT64_C(0x37BB420DF67F044E), UINT64_C(0xDCC0E9F3E2EF07B3), UINT64_C(0x4D10088618777841), UINT64_C(0x0492E5379305DAAE), UINT64_C(0x3DA4791C37E4128F), UINT64_C(0x80688445CBA4EA17) }, /*F5*/ + { UINT64_C(0x51398A7CE4CF8D9D), UINT64_C(0x49A5FCD891A69CA5), UINT64_C(0x3D72A60EC2392DA5), UINT64_C(0x0E8296B879AB5539), UINT64_C(0x6BCB00AF2EDC0BDE), UINT64_C(0xBEB93848E54B3E90) }, /*F6*/ + { UINT64_C(0x7AD7C52A18922E19), UINT64_C(0x29292C57C4F5B8F5), UINT64_C(0xF0CF1F98A577C10B), UINT64_C(0x072B9F293BB660CD), UINT64_C(0x09B8604F5575B6FB), UINT64_C(0xDECB396A81B9FCDB) }, /*F7*/ + { UINT64_C(0x254AD7ADB4C220DE), UINT64_C(0x6C62E20F95A0070D), UINT64_C(0xADEB89F339309BD8), UINT64_C(0xA2F685CC178B289F), UINT64_C(0x9343905B5DEE95A5), UINT64_C(0xE0C30F34A2977C86) }, /*F8*/ + { UINT64_C(0x669CD51AF7CFBFAA), UINT64_C(0xE3E0806F6880271D), UINT64_C(0x6934C259E098BF90), UINT64_C(0x5DFEEAF0FBCA7249), UINT64_C(0x89F74B948B4118B6), UINT64_C(0x53640AEAFB6807C3) }, /*F9*/ + { UINT64_C(0xDD3BACDCC04BE120), UINT64_C(0x6D4949BD64198E51), UINT64_C(0x31FDB39666598A74), UINT64_C(0xBBBC6DE9C0C15A81), UINT64_C(0xF27F201C61C06279), UINT64_C(0x2738AFE3E84E5CDD) }, /*FA*/ + { UINT64_C(0xCDD71FD35A6411DE), UINT64_C(0x3CC012793E87523F), UINT64_C(0xB0CFF8720FCA36F3), UINT64_C(0x93E85FE07300F012), UINT64_C(0xE894A085263F090B), UINT64_C(0x2DF60A01DAFA90EC) }, /*FB*/ + { UINT64_C(0x9DA50DB1EEB4FADD), UINT64_C(0xE524E49C9974799A), UINT64_C(0xDE09FFF26A24CBB9), UINT64_C(0xAF9D71E9F3ACE7CD), UINT64_C(0xEB62B1A62566EC9D), UINT64_C(0x06D02AB1217D3553) }, /*FC*/ + { UINT64_C(0xDD31E6391AE03522), UINT64_C(0x93ACD1065B35E915), UINT64_C(0xF4EB56CC03E79218), UINT64_C(0x0717815C850C97F1), UINT64_C(0xBF4F6A8AC0540A6F), UINT64_C(0xFCF8AE5DE9507FF0) }, /*FD*/ + { UINT64_C(0xAB45B413DC50B207), UINT64_C(0x40B417369551D8D5), UINT64_C(0xCA32286A108E7210), UINT64_C(0x03225E54D8D093AF), UINT64_C(0x4B6CA5591EA576E9), UINT64_C(0x4E12AB774DC4E062) }, /*FE*/ + { UINT64_C(0xD9F4F850DF6CB96C), UINT64_C(0x8ABAD81B1667335D), UINT64_C(0xCB4079CFE79C72E5), UINT64_C(0xE5542F763E316996), UINT64_C(0x303E4B79B9D397C4), UINT64_C(0xE46933038B945111) }, /*FF*/ + { UINT64_C(0x75B15CC53B0D2502), UINT64_C(0xDA1BCA6BA0524358), UINT64_C(0x9EDA977556C06B7E), UINT64_C(0x6C57727ECF0A1325), UINT64_C(0xDC613D5A78E5C3F8), UINT64_C(0xCE062D94A3B4945A) } /*ZZ*/ +}; + +/* 144 byte round keys containing the first 1152 bits of sqrt(2) */ +static const uint64_t NUHASH_RND[ROUNDS][NUHASH_WORDS] = +{ + { UINT64_C(0x6A09E667F3BCC908), UINT64_C(0xB2FB1366EA957D3E), UINT64_C(0x3ADEC17512775099), UINT64_C(0xDA2F590B0667322A), UINT64_C(0x95F9060875714587), UINT64_C(0x5163FCDFB907B672) }, /*R1*/ + { UINT64_C(0x1EE950BC8738F694), UINT64_C(0xF0090E6C7BF44ED1), UINT64_C(0xA4405D0E855E3E9C), UINT64_C(0xA60B38C0237866F7), UINT64_C(0x956379222D108B14), UINT64_C(0x8C1578E45EF89C67) }, /*R2*/ + { UINT64_C(0x8DAB5147176FD3B9), UINT64_C(0x9654C68663E7909B), UINT64_C(0xEA5E241F06DCB05D), UINT64_C(0xD549411320819495), UINT64_C(0x0272956DB1FA1DFB), UINT64_C(0xE9A74059D7927C18) }, /*R3*/ + { UINT64_C(0x84C9B579AA516CA3), UINT64_C(0x719E6836DF046D8E), UINT64_C(0x0209B803FC646A5E), UINT64_C(0x6654BD3EF7B43D7F), UINT64_C(0xED437C7F9444260F), UINT64_C(0xBD40C483EF550385) }, /*R4*/ + { UINT64_C(0x83F97BBD45EFB866), UINT64_C(0x3107145D5FEBE765), UINT64_C(0xA49E94EC7F597105), UINT64_C(0xFBFC2E1FA763EF01), UINT64_C(0xF3599C82F2FE500B), UINT64_C(0x848CF0BD252AE046) }, /*R5*/ +}; + +/* 16x16 8-bit substitution box, borrowed straight from Rijndael */ +static const uint8_t NUHASH_SBX[256U] = +{ + UINT8_C(0x63), UINT8_C(0x7C), UINT8_C(0x77), UINT8_C(0x7B), UINT8_C(0xF2), UINT8_C(0x6B), UINT8_C(0x6F), UINT8_C(0xC5), UINT8_C(0x30), UINT8_C(0x01), UINT8_C(0x67), UINT8_C(0x2B), UINT8_C(0xFE), UINT8_C(0xD7), UINT8_C(0xAB), UINT8_C(0x76), + UINT8_C(0xCA), UINT8_C(0x82), UINT8_C(0xC9), UINT8_C(0x7D), UINT8_C(0xFA), UINT8_C(0x59), UINT8_C(0x47), UINT8_C(0xF0), UINT8_C(0xAD), UINT8_C(0xD4), UINT8_C(0xA2), UINT8_C(0xAF), UINT8_C(0x9C), UINT8_C(0xA4), UINT8_C(0x72), UINT8_C(0xC0), + UINT8_C(0xB7), UINT8_C(0xFD), UINT8_C(0x93), UINT8_C(0x26), UINT8_C(0x36), UINT8_C(0x3F), UINT8_C(0xF7), UINT8_C(0xCC), UINT8_C(0x34), UINT8_C(0xA5), UINT8_C(0xE5), UINT8_C(0xF1), UINT8_C(0x71), UINT8_C(0xD8), UINT8_C(0x31), UINT8_C(0x15), + UINT8_C(0x04), UINT8_C(0xC7), UINT8_C(0x23), UINT8_C(0xC3), UINT8_C(0x18), UINT8_C(0x96), UINT8_C(0x05), UINT8_C(0x9A), UINT8_C(0x07), UINT8_C(0x12), UINT8_C(0x80), UINT8_C(0xE2), UINT8_C(0xEB), UINT8_C(0x27), UINT8_C(0xB2), UINT8_C(0x75), + UINT8_C(0x09), UINT8_C(0x83), UINT8_C(0x2C), UINT8_C(0x1A), UINT8_C(0x1B), UINT8_C(0x6E), UINT8_C(0x5A), UINT8_C(0xA0), UINT8_C(0x52), UINT8_C(0x3B), UINT8_C(0xD6), UINT8_C(0xB3), UINT8_C(0x29), UINT8_C(0xE3), UINT8_C(0x2F), UINT8_C(0x84), + UINT8_C(0x53), UINT8_C(0xD1), UINT8_C(0x00), UINT8_C(0xED), UINT8_C(0x20), UINT8_C(0xFC), UINT8_C(0xB1), UINT8_C(0x5B), UINT8_C(0x6A), UINT8_C(0xCB), UINT8_C(0xBE), UINT8_C(0x39), UINT8_C(0x4A), UINT8_C(0x4C), UINT8_C(0x58), UINT8_C(0xCF), + UINT8_C(0xD0), UINT8_C(0xEF), UINT8_C(0xAA), UINT8_C(0xFB), UINT8_C(0x43), UINT8_C(0x4D), UINT8_C(0x33), UINT8_C(0x85), UINT8_C(0x45), UINT8_C(0xF9), UINT8_C(0x02), UINT8_C(0x7F), UINT8_C(0x50), UINT8_C(0x3C), UINT8_C(0x9F), UINT8_C(0xA8), + UINT8_C(0x51), UINT8_C(0xA3), UINT8_C(0x40), UINT8_C(0x8F), UINT8_C(0x92), UINT8_C(0x9D), UINT8_C(0x38), UINT8_C(0xF5), UINT8_C(0xBC), UINT8_C(0xB6), UINT8_C(0xDA), UINT8_C(0x21), UINT8_C(0x10), UINT8_C(0xFF), UINT8_C(0xF3), UINT8_C(0xD2), + UINT8_C(0xCD), UINT8_C(0x0C), UINT8_C(0x13), UINT8_C(0xEC), UINT8_C(0x5F), UINT8_C(0x97), UINT8_C(0x44), UINT8_C(0x17), UINT8_C(0xC4), UINT8_C(0xA7), UINT8_C(0x7E), UINT8_C(0x3D), UINT8_C(0x64), UINT8_C(0x5D), UINT8_C(0x19), UINT8_C(0x73), + UINT8_C(0x60), UINT8_C(0x81), UINT8_C(0x4F), UINT8_C(0xDC), UINT8_C(0x22), UINT8_C(0x2A), UINT8_C(0x90), UINT8_C(0x88), UINT8_C(0x46), UINT8_C(0xEE), UINT8_C(0xB8), UINT8_C(0x14), UINT8_C(0xDE), UINT8_C(0x5E), UINT8_C(0x0B), UINT8_C(0xDB), + UINT8_C(0xE0), UINT8_C(0x32), UINT8_C(0x3A), UINT8_C(0x0A), UINT8_C(0x49), UINT8_C(0x06), UINT8_C(0x24), UINT8_C(0x5C), UINT8_C(0xC2), UINT8_C(0xD3), UINT8_C(0xAC), UINT8_C(0x62), UINT8_C(0x91), UINT8_C(0x95), UINT8_C(0xE4), UINT8_C(0x79), + UINT8_C(0xE7), UINT8_C(0xC8), UINT8_C(0x37), UINT8_C(0x6D), UINT8_C(0x8D), UINT8_C(0xD5), UINT8_C(0x4E), UINT8_C(0xA9), UINT8_C(0x6C), UINT8_C(0x56), UINT8_C(0xF4), UINT8_C(0xEA), UINT8_C(0x65), UINT8_C(0x7A), UINT8_C(0xAE), UINT8_C(0x08), + UINT8_C(0xBA), UINT8_C(0x78), UINT8_C(0x25), UINT8_C(0x2E), UINT8_C(0x1C), UINT8_C(0xA6), UINT8_C(0xB4), UINT8_C(0xC6), UINT8_C(0xE8), UINT8_C(0xDD), UINT8_C(0x74), UINT8_C(0x1F), UINT8_C(0x4B), UINT8_C(0xBD), UINT8_C(0x8B), UINT8_C(0x8A), + UINT8_C(0x70), UINT8_C(0x3E), UINT8_C(0xB5), UINT8_C(0x66), UINT8_C(0x48), UINT8_C(0x03), UINT8_C(0xF6), UINT8_C(0x0E), UINT8_C(0x61), UINT8_C(0x35), UINT8_C(0x57), UINT8_C(0xB9), UINT8_C(0x86), UINT8_C(0xC1), UINT8_C(0x1D), UINT8_C(0x9E), + UINT8_C(0xE1), UINT8_C(0xF8), UINT8_C(0x98), UINT8_C(0x11), UINT8_C(0x69), UINT8_C(0xD9), UINT8_C(0x8E), UINT8_C(0x94), UINT8_C(0x9B), UINT8_C(0x1E), UINT8_C(0x87), UINT8_C(0xE9), UINT8_C(0xCE), UINT8_C(0x55), UINT8_C(0x28), UINT8_C(0xDF), + UINT8_C(0x8C), UINT8_C(0xA1), UINT8_C(0x89), UINT8_C(0x0D), UINT8_C(0xBF), UINT8_C(0xE6), UINT8_C(0x42), UINT8_C(0x68), UINT8_C(0x41), UINT8_C(0x99), UINT8_C(0x2D), UINT8_C(0x0F), UINT8_C(0xB0), UINT8_C(0x54), UINT8_C(0xBB), UINT8_C(0x16) +}; + +/* 256 byte finalization vector, random permutation courtesy of Random.org */ +static const uint8_t NUHASH_FIN[256U] = +{ + UINT8_C(0xB4), UINT8_C(0x98), UINT8_C(0x0C), UINT8_C(0x84), UINT8_C(0x24), UINT8_C(0xF3), UINT8_C(0x27), UINT8_C(0x8F), UINT8_C(0xA6), UINT8_C(0x5E), UINT8_C(0xF0), UINT8_C(0x65), UINT8_C(0x86), UINT8_C(0xBC), UINT8_C(0x09), UINT8_C(0x92), + UINT8_C(0x75), UINT8_C(0x21), UINT8_C(0xB9), UINT8_C(0x95), UINT8_C(0x66), UINT8_C(0x8A), UINT8_C(0x2F), UINT8_C(0x13), UINT8_C(0xB5), UINT8_C(0xB7), UINT8_C(0x6B), UINT8_C(0x33), UINT8_C(0x2A), UINT8_C(0xBF), UINT8_C(0xF7), UINT8_C(0x0F), + UINT8_C(0x0A), UINT8_C(0xE7), UINT8_C(0x16), UINT8_C(0x30), UINT8_C(0x77), UINT8_C(0x61), UINT8_C(0x48), UINT8_C(0x90), UINT8_C(0xDF), UINT8_C(0xAF), UINT8_C(0x72), UINT8_C(0x79), UINT8_C(0xF6), UINT8_C(0xA5), UINT8_C(0x58), UINT8_C(0xD1), + UINT8_C(0xF2), UINT8_C(0x40), UINT8_C(0x9F), UINT8_C(0x41), UINT8_C(0xE8), UINT8_C(0x03), UINT8_C(0xA1), UINT8_C(0x05), UINT8_C(0xC5), UINT8_C(0x35), UINT8_C(0xC7), UINT8_C(0x97), UINT8_C(0x54), UINT8_C(0x7B), UINT8_C(0xB3), UINT8_C(0xF5), + UINT8_C(0xB8), UINT8_C(0xA8), UINT8_C(0xD8), UINT8_C(0x68), UINT8_C(0x51), UINT8_C(0xAD), UINT8_C(0xE3), UINT8_C(0xC2), UINT8_C(0x5D), UINT8_C(0xCF), UINT8_C(0xEA), UINT8_C(0x89), UINT8_C(0x37), UINT8_C(0xF1), UINT8_C(0x55), UINT8_C(0x60), + UINT8_C(0xA4), UINT8_C(0x26), UINT8_C(0xAC), UINT8_C(0x32), UINT8_C(0x0E), UINT8_C(0xD2), UINT8_C(0x85), UINT8_C(0x6F), UINT8_C(0xC8), UINT8_C(0xDC), UINT8_C(0x36), UINT8_C(0x6D), UINT8_C(0xA3), UINT8_C(0x22), UINT8_C(0x5A), UINT8_C(0xC9), + UINT8_C(0x5C), UINT8_C(0x91), UINT8_C(0x1B), UINT8_C(0x5B), UINT8_C(0xE9), UINT8_C(0x78), UINT8_C(0xD7), UINT8_C(0x44), UINT8_C(0xEB), UINT8_C(0x1A), UINT8_C(0xC0), UINT8_C(0xCA), UINT8_C(0x94), UINT8_C(0x53), UINT8_C(0xC4), UINT8_C(0x11), + UINT8_C(0x12), UINT8_C(0xCC), UINT8_C(0xFF), UINT8_C(0x88), UINT8_C(0x0D), UINT8_C(0x4E), UINT8_C(0xB2), UINT8_C(0xB1), UINT8_C(0x4A), UINT8_C(0x3A), UINT8_C(0xE1), UINT8_C(0x2E), UINT8_C(0x0B), UINT8_C(0x4C), UINT8_C(0x5F), UINT8_C(0x06), + UINT8_C(0x81), UINT8_C(0x31), UINT8_C(0xD9), UINT8_C(0x3D), UINT8_C(0xFD), UINT8_C(0x43), UINT8_C(0x67), UINT8_C(0x62), UINT8_C(0x00), UINT8_C(0x9C), UINT8_C(0x50), UINT8_C(0xCE), UINT8_C(0x6E), UINT8_C(0x15), UINT8_C(0x82), UINT8_C(0x29), + UINT8_C(0x96), UINT8_C(0xDA), UINT8_C(0x87), UINT8_C(0xEF), UINT8_C(0x6C), UINT8_C(0xC1), UINT8_C(0x8B), UINT8_C(0x07), UINT8_C(0x8E), UINT8_C(0x17), UINT8_C(0xEC), UINT8_C(0x9A), UINT8_C(0xBA), UINT8_C(0x46), UINT8_C(0x04), UINT8_C(0x73), + UINT8_C(0x39), UINT8_C(0xE4), UINT8_C(0x63), UINT8_C(0xBE), UINT8_C(0x64), UINT8_C(0x47), UINT8_C(0xE6), UINT8_C(0x3F), UINT8_C(0x25), UINT8_C(0x52), UINT8_C(0x59), UINT8_C(0xA7), UINT8_C(0x42), UINT8_C(0x38), UINT8_C(0x99), UINT8_C(0x01), + UINT8_C(0xE5), UINT8_C(0x1D), UINT8_C(0x28), UINT8_C(0x7A), UINT8_C(0xB0), UINT8_C(0x7C), UINT8_C(0x9D), UINT8_C(0x56), UINT8_C(0xE2), UINT8_C(0xD6), UINT8_C(0xA0), UINT8_C(0xF4), UINT8_C(0x1E), UINT8_C(0xE0), UINT8_C(0xD3), UINT8_C(0x83), + UINT8_C(0x6A), UINT8_C(0xBB), UINT8_C(0x18), UINT8_C(0x20), UINT8_C(0xAE), UINT8_C(0x57), UINT8_C(0xAA), UINT8_C(0x8D), UINT8_C(0x71), UINT8_C(0x1F), UINT8_C(0x34), UINT8_C(0x4D), UINT8_C(0x2D), UINT8_C(0x3C), UINT8_C(0x2B), UINT8_C(0xF8), + UINT8_C(0x10), UINT8_C(0x7E), UINT8_C(0xCB), UINT8_C(0xFB), UINT8_C(0x49), UINT8_C(0xA2), UINT8_C(0x45), UINT8_C(0x7F), UINT8_C(0x3E), UINT8_C(0xBD), UINT8_C(0xC3), UINT8_C(0xFC), UINT8_C(0x14), UINT8_C(0x74), UINT8_C(0x23), UINT8_C(0x4F), + UINT8_C(0x7D), UINT8_C(0x69), UINT8_C(0x93), UINT8_C(0x19), UINT8_C(0xD0), UINT8_C(0x1C), UINT8_C(0x08), UINT8_C(0xF9), UINT8_C(0xDD), UINT8_C(0xC6), UINT8_C(0x2C), UINT8_C(0x9E), UINT8_C(0xA9), UINT8_C(0x4B), UINT8_C(0xFE), UINT8_C(0xED), + UINT8_C(0x76), UINT8_C(0xDB), UINT8_C(0xAB), UINT8_C(0xD4), UINT8_C(0x80), UINT8_C(0xCD), UINT8_C(0xB6), UINT8_C(0x8C), UINT8_C(0xDE), UINT8_C(0x70), UINT8_C(0x9B), UINT8_C(0xD5), UINT8_C(0xFA), UINT8_C(0xEE), UINT8_C(0x02), UINT8_C(0x3B) +}; + +/* ------------------------------------------------------------------------ */ +/* Mix functions */ +/* ------------------------------------------------------------------------ */ + +/* Based on "Better Bit Mixing" functions, by David Stafford */ +#define MIX_FUNCTION(U,V,W,X,Y,Z) \ + static INLINE uint64_t mix_##U(uint64_t key) \ + { \ + key = (key ^ (key >> (V))) * (W); \ + key = (key ^ (key >> (X))) * (Y); \ + return key ^ (key >> (Z)); \ + } + +MIX_FUNCTION(1, 31, UINT64_C(0x7FB5D329728EA185), 27, UINT64_C(0x81DADEF4BC2DD44D), 33) /* Mix01 */ +MIX_FUNCTION(2, 31, UINT64_C(0x99BCF6822B23CA35), 30, UINT64_C(0x14020A57ACCED8B7), 33) /* Mix03 */ +MIX_FUNCTION(3, 31, UINT64_C(0x69B0BC90BD9A8C49), 27, UINT64_C(0x3D5E661A2A77868D), 30) /* Mix06 */ +MIX_FUNCTION(4, 30, UINT64_C(0x16A6AC37883AF045), 26, UINT64_C(0xCC9C31A4274686A5), 32) /* Mix07 */ +MIX_FUNCTION(5, 30, UINT64_C(0xBF58476D1CE4E5B9), 27, UINT64_C(0x94D049BB133111EB), 31) /* Mix13 */ +MIX_FUNCTION(6, 30, UINT64_C(0x4BE98134A5976FD3), 29, UINT64_C(0x3BC0993A5AD19A13), 31) /* Mix14 */ + +/* ------------------------------------------------------------------------ */ +/* Substitution function */ +/* ------------------------------------------------------------------------ */ + +static INLINE void substitute_bytes(uint8_t *const buffer, const size_t len) +{ + size_t pos; + for (pos = 0U; pos < len; ++pos) + { + buffer[pos] = NUHASH_SBX[buffer[pos]]; + } +} + +/* ------------------------------------------------------------------------ */ +/* Update function */ +/* ------------------------------------------------------------------------ */ + +static INLINE void update(nuhash_t *const ctx, const size_t index) +{ + size_t rnd; + const uint64_t *const row_addr = NUHASH_XOR[index]; + + for (rnd = 0U; rnd < ROUNDS; ++rnd) + { + const uint64_t initial_value = ctx->hash[0U]; + + ctx->hash[0U] = mix_1(((ctx->hash[0U] << 32) | (ctx->hash[1U] >> 32)) ^ row_addr[0U] ^ NUHASH_RND[rnd][0U]); + ctx->hash[1U] = mix_2(((ctx->hash[1U] << 32) | (ctx->hash[2U] >> 32)) ^ row_addr[1U] ^ NUHASH_RND[rnd][1U]); + ctx->hash[2U] = mix_3(((ctx->hash[2U] << 32) | (ctx->hash[3U] >> 32)) ^ row_addr[2U] ^ NUHASH_RND[rnd][2U]); + ctx->hash[3U] = mix_4(((ctx->hash[3U] << 32) | (ctx->hash[4U] >> 32)) ^ row_addr[3U] ^ NUHASH_RND[rnd][3U]); + ctx->hash[4U] = mix_5(((ctx->hash[4U] << 32) | (ctx->hash[5U] >> 32)) ^ row_addr[4U] ^ NUHASH_RND[rnd][4U]); + ctx->hash[5U] = mix_6(((ctx->hash[5U] << 32) | (initial_value >> 32)) ^ row_addr[5U] ^ NUHASH_RND[rnd][5U]); + + substitute_bytes((uint8_t*)ctx->hash, NUHASH_BYTES); + } +} + +/* ------------------------------------------------------------------------ */ +/* Bit function */ +/* ------------------------------------------------------------------------ */ + +static INLINE void store_ui64(uint8_t *const out, uint64_t value) +{ + size_t pos; + for (pos = sizeof(uint64_t); pos--; value >>= 8) + { + out[pos] = (uint8_t)(value & 0xFF); + } +} + +static INLINE void store_words(uint8_t *out, const uint64_t *const src, const size_t count) +{ + size_t pos; + for (pos = 0U; pos < count; ++pos, out += sizeof(uint64_t)) + { + store_ui64(out, src[pos]); + } +} + +static INLINE void copy_words(uint64_t *const out, const uint64_t *const src, const size_t count) +{ + size_t pos; + for (pos = 0U; pos < count; ++pos) + { + out[pos] = src[pos]; + } +} + +/* ------------------------------------------------------------------------ */ +/* Stream API */ +/* ------------------------------------------------------------------------ */ + +void nuhash_init(nuhash_t *const ctx) +{ + copy_words(ctx->hash, NUHASH_INI, NUHASH_WORDS); +} + +void nuhash_init_with_key(nuhash_t *const ctx, const uint8_t *const key, const size_t len) +{ + size_t pos; + nuhash_init(ctx); + + if (len > 0U) + { + for (pos = 0U; pos < len; ++pos) + { + update(ctx, key[pos]); + } + update(ctx, 256U); + } +} + +void nuhash_update(nuhash_t *const ctx, const uint8_t *const src, const size_t len) +{ + size_t pos; + for (pos = 0U; pos < len; ++pos) + { + update(ctx, src[pos]); + } +} + +uint8_t *nuhash_final(nuhash_t *const ctx, uint8_t *const out) +{ + size_t pos; + update(ctx, 256U); + + for (pos = 0U; pos < COUNT_OF(NUHASH_FIN); ++pos) + { + update(ctx, NUHASH_FIN[pos]); + } + + store_words(out, ctx->hash, NUHASH_WORDS); + return out; +} + +/* ------------------------------------------------------------------------ */ +/* Simple API */ +/* ------------------------------------------------------------------------ */ + +uint8_t *nuhash_compute(const uint8_t *const src, const size_t len, uint8_t *const out) +{ + nuhash_t ctx; + nuhash_init(&ctx); + + if (len > 0U) + { + nuhash_update(&ctx, src, len); + } + + nuhash_final(&ctx, out); + return out; +} + +uint8_t *nuhash_compute_with_key(const uint8_t *const key, const size_t key_len, const uint8_t *const src, const size_t in_len, uint8_t *const out) +{ + nuhash_t ctx; + nuhash_init_with_key(&ctx, key, key_len); + + if (in_len > 0U) + { + nuhash_update(&ctx, src, in_len); + } + + nuhash_final(&ctx, out); + return out; +} + +/* ------------------------------------------------------------------------ */ +/* Utility functions */ +/* ------------------------------------------------------------------------ */ + +static const char* const XDIGIT_LOWER = "0123456789abcdef"; +static const char* const XDIGIT_UPPER = "0123456789ABCDEF"; + +char *nuhash_tohex(const uint8_t *const hash, const int upper, char *const out) +{ + char *ptr = out; + const char *const xdigit = upper ? XDIGIT_UPPER : XDIGIT_LOWER; + size_t pos; + for (pos = 0U; pos < NUHASH_BYTES; ++pos) + { + *(ptr++) = xdigit[(hash[pos] >> 4) & 0x0F]; + *(ptr++) = xdigit[(hash[pos] >> 0) & 0x0F]; + } + + *ptr = (char)0U; + return out; +} + +char *nuhash_version(uint16_t version[3U], char *const build) +{ + version[0U] = VERSION_MAJOR; + version[1U] = VERSION_MINOR; + version[2U] = VERSION_PATCH; + + return strcpy(build, BUILD_DATE); +} diff --git a/libnuhash/src/version.h b/libnuhash/src/version.h new file mode 100644 index 0000000..62a2315 --- /dev/null +++ b/libnuhash/src/version.h @@ -0,0 +1,8 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#define NUHASH_VERSION_MAJOR 1 +#define NUHASH_VERSION_MINOR 0 +#define NUHASH_VERSION_PATCH 0 diff --git a/make.cmd b/make.cmd new file mode 100644 index 0000000..a8ef0ec --- /dev/null +++ b/make.cmd @@ -0,0 +1,95 @@ +@echo off +cd /d "%~dp0" + +if "%MSVC_PATH%"=="" ( + set "MSVC_PATH=C:\Program Files\Microsoft Visual Studio\2022\Community" +) + +if exist "%MSVC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" ( + call "%MSVC_PATH%\VC\Auxiliary\Build\vcvarsall.bat" x86 +) else ( + echo vcvarsall.bat not found. Please check your MSVC_PATH variable! + goto BuildError +) + +if "%PANDODC_PATH%"=="" ( + set "PANDODC_PATH=C:\Program Files\Pandoc" +) + +if not exist "%PANDODC_PATH%\pandoc.exe" ( + echo pandoc.exe not found. Please check your PANDODC_PATH variable! + goto BuildError +) + +REM ------------------------------------------------------------ +REM CLEAN UP +REM ------------------------------------------------------------ + +if exist "%CD%\bin\" rmdir /S /Q "%CD%\bin" +if exist "%CD%\bin\" ( + echo Failed to clean up intermediate files! + goto BuildError +) + +if exist "%CD%\obj\" rmdir /S /Q "%CD%\obj" +if exist "%CD%\obj\" ( + echo Failed to clean up intermediate files! + goto BuildError +) + +REM ------------------------------------------------------------ +REM BUILD EXECUTABLES +REM ------------------------------------------------------------ + +MSBuild.exe /property:Platform=x86 /property:Configuration=Release /target:rebuild "%CD%\nuhash.sln" +if not "%ERRORLEVEL%"=="0" goto BuildError + +MSBuild.exe /property:Platform=x64 /property:Configuration=Release /target:rebuild "%CD%\nuhash.sln" +if not "%ERRORLEVEL%"=="0" goto BuildError + +MSBuild.exe /property:Platform=ARM64 /property:Configuration=Release /target:rebuild "%CD%\nuhash.sln" +if not "%ERRORLEVEL%"=="0" goto BuildError + +REM ------------------------------------------------------------ +REM GENERATE DOCUMENTS +REM ------------------------------------------------------------ + +if not exist "%CD%\out\" mkdir "%CD%\out" + +"%PANDODC_PATH%\pandoc.exe" --standalone --embed-resources --css etc\style\gh-pandoc.min.css --metadata title="NuHash README" -o "%~dp0\out\README.html" "%~dp0\README.md" + +REM ------------------------------------------------------------ +REM COPY FILES +REM ------------------------------------------------------------ + +if exist "%CD%\out\nuhash-x86.exe" del /F "%CD%\out\nuhash-x86.exe" +if exist "%CD%\out\nuhash-x64.exe" del /F "%CD%\out\nuhash-x64.exe" +if exist "%CD%\out\nuhash-a64.exe" del /F "%CD%\out\nuhash-a64.exe" + +copy /Y /B "%CD%\bin\Win32\Release\nuhash.exe" "%CD%\out\nuhash-x86.exe" +copy /Y /B "%CD%\bin\x64\Release\nuhash.exe" "%CD%\out\nuhash-x64.exe" +copy /Y /B "%CD%\bin\ARM64\Release\nuhash.exe" "%CD%\out\nuhash-a64.exe" + +attrib +R "%CD%\out\nuhash-x86.exe" +attrib +R "%CD%\out\nuhash-x64.exe" +attrib +R "%CD%\out\nuhash-a64.exe" + +REM ------------------------------------------------------------ +REM COMPLETED +REM ------------------------------------------------------------ + +echo. +echo Build completed. +echo. +pause +goto:eof + +REM ------------------------------------------------------------ +REM BUILD ERROR +REM ------------------------------------------------------------ + +:BuildError +echo. +echo Build has failed !!! +echo. +pause diff --git a/nuhash.sln b/nuhash.sln new file mode 100644 index 0000000..a7ab20a --- /dev/null +++ b/nuhash.sln @@ -0,0 +1,66 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33815.320 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NuHash", "tool\nuhash.vcxproj", "{867A1634-C6AC-4089-B645-A1BE289D597B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnuhash", "libnuhash\libnuhash.vcxproj", "{8FA5C597-887D-46BC-A6C9-2183AEF7B793}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release_DLL|ARM64 = Release_DLL|ARM64 + Release_DLL|x64 = Release_DLL|x64 + Release_DLL|x86 = Release_DLL|x86 + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|ARM64.Build.0 = Debug|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|x64.ActiveCfg = Debug|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|x64.Build.0 = Debug|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|x86.ActiveCfg = Debug|Win32 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Debug|x86.Build.0 = Debug|Win32 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|ARM64.ActiveCfg = Release_DLL|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|ARM64.Build.0 = Release_DLL|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|x86.ActiveCfg = Release_DLL|Win32 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release_DLL|x86.Build.0 = Release_DLL|Win32 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|ARM64.ActiveCfg = Release|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|ARM64.Build.0 = Release|ARM64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|x64.ActiveCfg = Release|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|x64.Build.0 = Release|x64 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|x86.ActiveCfg = Release|Win32 + {867A1634-C6AC-4089-B645-A1BE289D597B}.Release|x86.Build.0 = Release|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|ARM64.Build.0 = Debug|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|x64.ActiveCfg = Debug|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|x64.Build.0 = Debug|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|x86.ActiveCfg = Debug|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Debug|x86.Build.0 = Debug|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|ARM64.ActiveCfg = Release_DLL|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|ARM64.Build.0 = Release_DLL|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|x64.ActiveCfg = Release_DLL|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|x64.Build.0 = Release_DLL|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|x86.ActiveCfg = Release_DLL|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release_DLL|x86.Build.0 = Release_DLL|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|ARM64.ActiveCfg = Release|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|ARM64.Build.0 = Release|ARM64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|x64.ActiveCfg = Release|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|x64.Build.0 = Release|x64 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|x86.ActiveCfg = Release|Win32 + {8FA5C597-887D-46BC-A6C9-2183AEF7B793}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A92699B5-187B-4A92-95AF-F0392B047DDD} + EndGlobalSection +EndGlobal diff --git a/tool/nuhash.user b/tool/nuhash.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/tool/nuhash.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tool/nuhash.vcxproj b/tool/nuhash.vcxproj new file mode 100644 index 0000000..3fce237 --- /dev/null +++ b/tool/nuhash.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + ARM64 + + + Debug + Win32 + + + Release_DLL + ARM64 + + + Release_DLL + Win32 + + + Release_DLL + x64 + + + Release + ARM64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {867a1634-c6ac-4089-b645-a1be289d597b} + NuHash + 10.0.20348.0 + NuHash + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + x64 + + + Application + false + v143 + true + Unicode + x64 + + + Application + true + v143 + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + x64 + + + Application + false + v143 + true + Unicode + x64 + + + Application + false + v143 + true + Unicode + x64 + + + Application + false + v143 + true + Unicode + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + true + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + false + $(SolutionDir)bin\$(Platform)\$(Configuration)\ + $(ProjectDir)obj\$(Platform)\$(Configuration)\ + nuhash + + + + Level4 + false + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + 4706;4996;6031 + false + true + + + Console + true + + + + + Level4 + true + true + false + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreaded + false + MaxSpeed + AnySuitable + Speed + true + true + true + NoExtensions + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + 5.1 + + + + + Level4 + true + true + false + LIBNUHASH_DLL;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreadedDLL + false + MaxSpeed + AnySuitable + Speed + true + true + true + NoExtensions + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + 5.1 + + + + + Level4 + false + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + 4706;4996;6031 + false + true + + + Console + true + + + + + Level4 + false + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + 4706;4996;6031 + true + + + Console + true + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreaded + false + MaxSpeed + AnySuitable + Speed + true + true + true + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + 5.2 + + + + + Level4 + true + true + false + LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_OBSOLETE_NO_DEPRECATE;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreadedDLL + false + MaxSpeed + AnySuitable + Speed + true + true + true + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + 5.2 + + + + + Level4 + true + true + false + NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreaded + false + MaxSpeed + AnySuitable + Speed + true + true + true + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + + + + + Level4 + true + true + false + LIBNUHASH_DLL;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + $(SolutionDir)libnuhash\include + MultiThreadedDLL + false + MaxSpeed + AnySuitable + Speed + true + true + true + 4706;4996;6031 + false + Fast + false + + + Console + true + true + false + UseLinkTimeCodeGeneration + wsetargv.obj;%(AdditionalDependencies) + + + + + + + + + {8fa5c597-887d-46bc-a6c9-2183aef7b793} + + + + + _M_X64;%(PreprocessorDefinitions) + _M_X64;%(PreprocessorDefinitions) + _M_X64;%(PreprocessorDefinitions) + _M_ARM64;%(PreprocessorDefinitions) + _M_ARM64;%(PreprocessorDefinitions) + _M_ARM64;%(PreprocessorDefinitions) + _M_IX86;%(PreprocessorDefinitions) + _M_IX86;%(PreprocessorDefinitions) + _M_IX86;%(PreprocessorDefinitions) + + + + + + + + + + + + \ No newline at end of file diff --git a/tool/nuhash.vcxproj.filters b/tool/nuhash.vcxproj.filters new file mode 100644 index 0000000..6fd0edd --- /dev/null +++ b/tool/nuhash.vcxproj.filters @@ -0,0 +1,40 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Quelldateien + + + Quelldateien + + + + + Ressourcendateien + + + + + Ressourcendateien + + + + + Headerdateien + + + \ No newline at end of file diff --git a/tool/res/compatibility.manifest b/tool/res/compatibility.manifest new file mode 100644 index 0000000..fce5b0f --- /dev/null +++ b/tool/res/compatibility.manifest @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/tool/res/hash.ico b/tool/res/hash.ico new file mode 100644 index 0000000000000000000000000000000000000000..09c27ff1fcafeecd5b6a0dda1193238d5c5dea3e GIT binary patch literal 5430 zcmcIoX>1!s6yCN7gg~OI1V8xG{6ZWOKM;TT!6A^~XC+W1)Yxfh(%4B%Ra%fh2na_- zD=I)#EvN@aZ0GP*QUrw_sTHE8G-^s{O>D2dYv(?k#Ic?D_VC^&v!30oUDKo^y`4An z=DqLj%$wOa%W)gHjojwV9Mn~u@h*;ggyXoXs^xYE^nVF`k3t`?Fk-nMs#_MmP5-># zqCe%c=)3(Eofjw$v;ciWP+#D!x)VOL?pd`VZ>#=kzgag3V@O2=V^Ig~cx)|q3wFa~ zptFwfZ973uh@%8?-A&1U~TXrS95{t(>girBZXX= zgnr&b#=8$n`t!a&SUt)wg-)AR>BoXSlFr!qPf56IujI?p)DZDoRcm9`O@senV`csU z4{^(tiQZ!r8|$kue8syM`ZN7Mkf3ch z)z1#K@2tWY6djF%mJO{wM*m0D#lkxqo)Vpn<67g@eL-7&fw$;8yzQ?)ysTY(3N}NX z=rCRroQ*Rfmnj33M-pAl8SI0(>gVnC+lm?-7rKYzS~frrQiTP_BcU#yGgUw@0O5Ib zyM?#ZJPv2bYY=05{Fa(SK8wy=>KyV}YFa_|Ih;i%82{?fPqlai{_n!K?RWy_@-W09 zziMw+dX^Q(dBOjK{#N~Cw{pZ|tKI_dcN8#l>wrt+k=9v=>m!Jv<;P&F{yxC;+yPvQ zPiqfiseRx(cew-YJK?OarQ_~cjd8-_2kpCS)cXncE(vzlgFid&h#&Bt&rly=Zw{&P zX*=BY7JO&&(m8{VsVk=x{-ozeWLeaIQ6Ve0mJr{^5r5iNeZSUOPw}zNCT19nZUsg> zbVZgWXLyCI96rdRBev>$108h+7E6m?nz&iShy)0(4ULn?pi`FRvnjw=eT$0waFuTm z2QP{C2B#J#+qb}9EMjC9S8@syKL|61UseS>RMYW|_$3$c_`d1u94AdWdmDNMG1qUUP`#)SK@j6d?*dkWd~U&=GG z%=+_+JQZS&#bkNhk8GK}-k}(qOD@RbsP}h8K3N9;0_1mL7Ki0&jx8I$4JOJf&ui8f zY5zNntMX*lhYZ}2)>2Y);nJ~S)_oAP8BVfzYCbXCzZQ77qUB2N2YCNl$eSD0m~4CW z{3itOUr15kIfXA6XH+(KvrAJpcIgZ0JHgJo%v-lVC$!Z+$>Npc$GZ>?E6Yt z&sS1>mOK9h>-Me0R=r8O50r_0>Qng4K1D7P8L%q$Kt8=F`+)ak)Pp;Gsr8Q_Hs&C( z2YeLcRyDmxBM_d6?D!<)2DHS(SC(ZilO{gRe-IyHa35=@9FOR(agX|+AJx-Ibk>O0ZZ zGzYo497mPn6~~zf-tQsL)M?$hw6N8E1Gef1gY9+OAwG`4K6Qtj&G28wlz{(BNuaC% z1UW" + VALUE "CompanyName", "Muldersoft" + VALUE "LegalTrademarks", "Muldersoft" + VALUE "Comments", "This work has been released under the CC0 1.0 Universal license!" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END diff --git a/tool/src/main.c b/tool/src/main.c new file mode 100644 index 0000000..3620762 --- /dev/null +++ b/tool/src/main.c @@ -0,0 +1,502 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +/* libnuhash*/ +#include + +/* Platfrom */ +#include "platform.h" + +/* wildcard support */ +#ifdef __MINGW32__ +const int _dowildcard = 1; +#endif + +/* array length */ +#define COUNT_OF(ARRAY) (sizeof(ARRAY) / sizeof(ARRAY[0])) + +/* I/O buffer */ +#define BUFFSIZE 4096U + +/* update interval */ +#define UPDATE_INTERVAL 997U + +/* ------------------------------------------------------------------------ */ +/* Print digest */ +/* ------------------------------------------------------------------------ */ + +#define PRINTF_DIGEST(FORMAT, ...) do \ +{ \ + if (!binary_mode) \ + { \ + FPRINTF(stdout, FMT_HCHAR TEXT(" ") FORMAT TEXT("\n"), nuhash_tohex(digest, upper_case, hexstr), __VA_ARGS__); \ + } \ + else \ + { \ + fwrite(digest, sizeof(uint8_t), NUHASH_BYTES, stdout); \ + } \ + fflush(stdout); \ +} \ +while (0) + +/* ------------------------------------------------------------------------ */ +/* Print progress */ +/* ------------------------------------------------------------------------ */ + +#define SUFFIX(FLAG, STR1, STR2) ((FLAG) ? (STR1 STR2) : (STR1)) +#define PREFIX(FLAG, STR1, STR2) ((FLAG) ? (STR1 STR2) : (STR2)) + +static void print_progress(const uint64_t total, const uint64_t current, const int finished) +{ + if (total > 0U) + { + FPRINTF(stderr, SUFFIX(finished, TEXT("\r%") TEXT(PRIu64) TEXT("/%") TEXT(PRIu64) TEXT(" bytes hashed... [%.1f%%]"), TEXT("\n")), current, total, 100.0 * (current / (double)total)); + } + else + { + FPRINTF(stderr, SUFFIX(finished, TEXT("\r%") TEXT(PRIu64) TEXT(" bytes hashed..."), TEXT(" done\n")), current); + } + fflush(stderr); +} + +/* ------------------------------------------------------------------------ */ +/* Self-test */ +/* ------------------------------------------------------------------------ */ + +typedef struct +{ + size_t iterations; + const char* message; +} +testcase_t; + +static const testcase_t TEST_VECTOR[] = +{ + { 0x0000001, "" }, + { 0x0000001, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, + { 0x0000001, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" }, + { 0x00F4240, "a" }, + { 0x1000000, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno" }, + { 0x1000000, "g4tB,=[TU%/|8lv_c5Y?F9Sqs1PnV#bNO6DW\\0em~p3E7" }, + { 0x1000000, "\xA4\x2C\x55\xA5\xB0\x5E\xD8\x33\xF3\x18\xFB\xA7\x20\xC7\x34\xD7\x1D\x2D\x46\x8D\xCA\x8A\xE7\xFC\x68\x5B\x54\xDA\xF9\xC3\x76\x62\xA9\x3D\x39\xBF\x17\xB7\xB2\x8C\x10\xA2\x1F\xE3\x74\x6A\x4A\x6C\x7A\x92\xD1\x52\xEA\x88\xBA\x6B\xD6\x64\x96\x9E\xE6\x4C\x47\x42\xC5\x51\xF2\x50\xF4\x7B\x4F\xE9\x87\x6D\x94\x4B\x23\xF0\x45\x1A\x9A\xE4\x91\x0F\x3B\xB4\x71\x82\x99\xC9\x49\xE5\xBE\x28\x93\x98\x2A\xD9\x73\x65\x58\xC0\x83\x48\x8F\x03\x14\x40\x1B\x24\x1E\xA6\x3F\xF7\x67\xAB\x37\x06\xAC\xF6\x66\xB6\xDD\x1C\x0A\x35\x9F\x56\x15\xEC\xF1\x2B\x7C\x57\x5D\x02\xED\xA8\x63\x16\x75\xDC\x9B\x5C\x7D\x0D\x5F\xFD\x05\xA0\x6E\x90\x95\x85\xD2\x13\x61\x08\xA3\x01\xC8\xD3\x84\xAA\x09\xF5\x70\x6F\xDE\xB9\x04\xB5\xDB\x30\xBC\x07\x8E\xFE\x89\x60\x26\x4E\x59\xCB\x36\x86\x11\x72\xE2\xC6\xAF\x3A\x8B\x7F\xFA\x41\x38\xDF\xEE\x2F\x32\xA1\x27\x69\x31\x29\x43\xC4\x9C\x77\x21\x44\xB8\x79\xD0\xAD\x97\xE0\xE1\x0E\x19\x2E\x22\xBD\x80\xE8\xB1\xF8\x4D\x3E\xC2\x7E\x0C\xB3\x81\x12\xCC\xC1\x53\xCF\x78\xCE\x3C\xD5\x5A\xBB\x9D\xEB\xEF\xCD\xFF\x0B\x25\xAE\xD4" }, + { 0x1000000, "\xB5\xC8\x9B\xD1\xBA\x66\x29\x19\xD2\x30\xED\x26\x5B\xC4\x91\x4D\x14\xF7\x16\x35\x5A\x69\xFE\x99\xA5\x49\xF1\x94\x2B\xBC\xDC\x4C\xDD\x4F\xCA\x1B\x88\x9C\xA9\xF6\x73\x2F\xFD\x3F\x40\x39\x13\xDA\xB3\x71\xF4\xDE\x7F\x02\x3D\x64\x78\x7A\x17\x0A\x93\xDF\xEB\x9F\x07\x04\x79\x8C\x98\xB8\x28\x80\xAD\x1F\xF2\x96\x6B\xBD\x45\xD9\xFA\x2C\x56\xCE\xF0\x87\x23\x22\xEA\xC5\x27\xD3\x63\xAF\x24\xC7\xB7\x06\xE4\x75\x83\x7B\xBF\x2E\xA4\xEF\xF5\x12\x5D\x60\x95\xA7\x53\x11\x74\xB4\xA0\x9E\xE3\xAE\xBB\x55\x72\x59\xA6\x9D\xD5\x89\x6D\x8F\x4A\x0C\x1D\xCD\x2A\xFB\xEE\xD7\xC3\xF3\x25\x62\x8E\xB0\xB2\xC2\x38\x3C\x6A\x6F\x4E\x3B\x08\xD4\x86\x36\x18\x5C\xE0\x1E\x81\x77\xF8\x68\xDB\x58\x54\xFF\x97\x7E\x61\xC0\x51\xC9\x6C\xE5\x82\xBE\xCF\x32\x43\x01\x3A\x5E\x50\x47\xA1\x34\xCC\x0D\x70\xAC\xC6\x44\x9A\x3E\x10\x0E\xEC\x03\xE2\x6E\xAA\xFC\x7D\x37\x31\x4B\xE6\xB6\xC1\x15\x8B\x05\x85\x8A\x67\xF9\xAB\x8D\xE1\xA2\x48\x1C\xCB\x52\x65\x76\x0F\x1A\x21\xA8\xA3\x42\x41\x90\x92\xD0\x84\x09\x2D\x33\x5F\xD8\x7C\xB1\xB9\x57\xE8\xD6\x0B\x20\xE7\x46\xE9" } +}; + +static const char *const EXPECTED[] = +{ + "d7964fe1bec2b5ecf21ecc88c86ce4f1e89fb1ef3669d52e34eb049d7fd6c42d4b2bbeeeb70d12c3fcaf43dd2229abc9", + "b3f13f534034ae8d645d410e8828673761fe2d697218879f9ea528d976ba2e15a3f7485105e612b9a46cb3988635a70f", + "63703476f4ffce4a8c758d0d3b91a857b9a2e3433ee864f931ba328fa7247b1b0ac9c2e0279243b83051aafac6a7e710", + "c6808aeb911c8837cee2e6867e589ab28526a8153494cf35a40c4bd6e20312da33cac4a390cd3b51a2eb4226e60b53e1", + "bcca6bc8d113dd3fc171d743ac7ad2d3e63163ea7107d3c78517cf5b53ee0b2f4a0fe079e6a74df350c667b7cfe3cf09", + "56770e133b9eb4205f11824ad7280f5c31bc04dd333d1844b3589ab8b94ab95dc09b77be9a8128d7f155fa73de617597", + "9a8579bb88112b2f3285781a61348d7b04a5632fec12a73a7e0e367a556794a24a32ca7bb14da68eaed83e99c2f8f4c0", + "fbf4444b0329f508bfc6cf44920b311a718e5f4c4c1af978e78223ec3579365ff5d15c16bb5a33d69cb36f3d40564757" +}; + +static int self_test(const int upper_case, const int ignore_int, const int show_progress) +{ + int result; + size_t len, index, round, errors = 0U; + uint64_t total_size, bytes_done, tm_curr = 0U, tm_next = 0U; + uint_fast16_t spinner = 0U; + nuhash_t context; + uint8_t digest[NUHASH_BYTES]; + char hex[NUHASH_CHARS]; + + for (index = 0U; index < COUNT_OF(TEST_VECTOR); ++index) + { + len = strlen(TEST_VECTOR[index].message); + total_size = (uint64_t)len * (uint64_t)TEST_VECTOR[index].iterations; + bytes_done = 0U; + + if (show_progress && index) + { + print_progress(total_size, bytes_done, 0); + tm_next = get_mtime() + UPDATE_INTERVAL; + } + + nuhash_init(&context); + + for (round = 0U; round < TEST_VECTOR[index].iterations; ++round) + { + nuhash_update(&context, (const uint8_t*)TEST_VECTOR[index].message, len); + bytes_done += len; + if ((!ignore_int) && g_aborted) + { + FPUTS(PREFIX(show_progress, TEXT("\n"), TEXT("The process has been interrupted!\n")), stderr); + return (-1); + } + if (show_progress && index && (!(++spinner & 0x1F)) && ((tm_curr = get_mtime()) >= tm_next)) + { + print_progress(total_size, bytes_done, 0); + tm_next = tm_curr + UPDATE_INTERVAL; + } + } + + if (show_progress && index) + { + print_progress(total_size, bytes_done, 1); + fflush(stderr); + } + + if (!(result = !strcasecmp(nuhash_tohex(nuhash_final(&context, digest), upper_case, hex), EXPECTED[index]))) + { + errors += 1U; + } + + FPRINTF(stdout, FMT_HCHAR TEXT(" Test#%u - ") FMT_TCHAR TEXT("\n"), hex, (unsigned)(index + 1U), result ? TEXT("OK") : TEXT("Failed!")); + fflush(stdout); + } + + FPUTS(errors ? TEXT("Error: At least one test failed !!!\n") : TEXT("All tests completed successfully.\n"), stderr); + return (!errors); +} + +/* ------------------------------------------------------------------------ */ +/* Stress-test */ +/* ------------------------------------------------------------------------ */ + +#define RUN_STRESS_TEST(TYPE, FORMAT) do \ +{ \ + TYPE value = 0; do \ + { \ + nuhash_compute((uint8_t*)&value, sizeof(TYPE), digest); \ + PRINTF_DIGEST(FORMAT, value); \ + if ((!ignore_int) && g_aborted) { return (-1); } \ + } \ + while (++value); \ +} \ +while (0) + +static int stress_test(const int upper_case, const int binary_mode, const int ignore_int) +{ + uint8_t digest[NUHASH_BYTES]; + char hexstr[NUHASH_CHARS]; + + RUN_STRESS_TEST(uint8_t , TEXT("%02" ) TEXT(PRIX8 )); + RUN_STRESS_TEST(uint16_t, TEXT("%04" ) TEXT(PRIX16)); + RUN_STRESS_TEST(uint32_t, TEXT("%08" ) TEXT(PRIX32)); + RUN_STRESS_TEST(uint64_t, TEXT("%016") TEXT(PRIX64)); + + return 1; +} + +/* ------------------------------------------------------------------------ */ +/* Process File */ +/* ------------------------------------------------------------------------ */ + +#define CHECK_INTERRUPTED(SHOW_PROGRESS) do \ +{ \ + if ((!ignore_int) && g_aborted) \ + { \ + FPUTS(PREFIX((SHOW_PROGRESS), TEXT("\n"), TEXT("The process has been interrupted!\n")), stderr); \ + result = (-1); \ + goto clean_up; \ + } \ +} \ +while (0) + +static int process_file(FILE *const file, const CHAR_T *const name, const int line_mode, const int binary_mode, const int upper_case, const int ignore_int, const int show_progress) +{ + int result = 0; + uint64_t input_size = 0U, bytes_done = 0U, tm_curr = 0U, tm_next = 0U; + uint_fast16_t spinner = 0U; + nuhash_t context; + struct STAT_STRUCT file_stat; + uint8_t buffer[BUFFSIZE], digest[NUHASH_BYTES]; + char hexstr[NUHASH_CHARS]; + + if(!FSTAT(file, &file_stat)) + { + if (FILE_IS_DIR(file_stat.st_mode)) + { + FPRINTF(stderr, TEXT("Error: Input file \"") FMT_TCHAR TEXT("\" is a directory!\n"), name); + goto clean_up; + } + if (FILE_IS_REG(file_stat.st_mode) && (file_stat.st_size > 0)) + { + input_size = (uint64_t)file_stat.st_size; + } + } + + if (!line_mode) + { + if (show_progress) + { + print_progress(input_size, bytes_done, 0); + tm_next = get_mtime() + UPDATE_INTERVAL; + } + + nuhash_init(&context); + + while ((!feof(file)) && (!ferror(file))) + { + const size_t len = fread(buffer, sizeof(uint8_t), BUFFSIZE, file); + if (len > 0U) + { + nuhash_update(&context, buffer, len); + bytes_done += len; + if (show_progress && (!(++spinner & 0x1F)) && ((tm_curr = get_mtime()) >= tm_next)) + { + print_progress(input_size, bytes_done, 0); + tm_next = tm_curr + UPDATE_INTERVAL; + } + } + CHECK_INTERRUPTED(show_progress); + } + + if (!ferror(file)) + { + if (show_progress) + { + print_progress(input_size, bytes_done, 1); + } + nuhash_final(&context, digest); + PRINTF_DIGEST(FMT_TCHAR, name); + } + } + else + { + while (fgets((char*)buffer, BUFFSIZE, file)) + { + size_t len = strlen((char*)buffer); + while ((len > 0U) && ((((char*)buffer)[len - 1U] == '\n') || (((char*)buffer)[len - 1U] == '\r'))) + { + buffer[--len] = 0x00; + } + if (len > 0U) + { + nuhash_compute(buffer, len, digest); + PRINTF_DIGEST(FMT_HCHAR, buffer); + } + CHECK_INTERRUPTED(0); + } + } + + if (ferror(file)) + { + FPUTS(PREFIX(show_progress && (!line_mode), TEXT("\n"), TEXT("Error: Read operation has failed!\n")), stderr); \ + goto clean_up; + } + + result = 1; + +clean_up: + + if ((file != stdin) && (file != stdout) && (file != stderr)) + { + fclose(file); + } + + return result; +} + +/* ------------------------------------------------------------------------ */ +/* Options */ +/* ------------------------------------------------------------------------ */ + +#define OPTION_BINARY 0x001 +#define OPTION_HELP 0x002 +#define OPTION_IGNORE 0x004 +#define OPTION_LINE_MODE 0x008 +#define OPTION_PROGRESS 0x010 +#define OPTION_SELF_TEST 0x020 +#define OPTION_STOP 0x040 +#define OPTION_STRESS 0x080 +#define OPTION_UPPERCASE 0x100 +#define OPTION_VERSION 0x200 + +static const struct +{ + int option; + const CHAR_T short_name, *long_name; +} +OPTIONS[] = +{ + { OPTION_BINARY, TEXT('b'), TEXT("binary") }, + { OPTION_HELP, TEXT('h'), TEXT("help") }, + { OPTION_IGNORE, TEXT('i'), TEXT("ignore") }, + { OPTION_LINE_MODE, TEXT('l'), TEXT("line-mode") }, + { OPTION_PROGRESS, TEXT('p'), TEXT("progress") }, + { OPTION_SELF_TEST, TEXT('t'), TEXT("self-test") }, + { OPTION_STOP, TEXT('s'), TEXT("stop") }, + { OPTION_STRESS, (CHAR_T)0, TEXT("stress") }, + { OPTION_UPPERCASE, TEXT('u'), TEXT("uppercase") }, + { OPTION_VERSION, TEXT('v'), TEXT("version") } +}; + +static int parse_option_short(int *const options, const CHAR_T *arg_str) +{ + while (*arg_str) + { + const CHAR_T c = TOLOWER(*(arg_str++)); + size_t pos; + for (pos = 0U; pos < COUNT_OF(OPTIONS); ++pos) + { + if (c == OPTIONS[pos].short_name) + { + *options |= OPTIONS[pos].option; + goto success; + } + } + return 0; + success:; + } + return 1; +} + +static int parse_option_long(int* const options, const CHAR_T *const arg_str) +{ + size_t pos; + for (pos = 0U; pos < COUNT_OF(OPTIONS); ++pos) + { + if (!STRCASECMP(arg_str, OPTIONS[pos].long_name)) + { + *options |= OPTIONS[pos].option; + return 1; + } + } + return 0; +} + +/* ------------------------------------------------------------------------ */ +/* Help screen */ +/* ------------------------------------------------------------------------ */ + +static void print_helpscreen(FILE *const stream, const int full_info) +{ + uint16_t version[3U]; + char build[12]; + nuhash_version(version, build); + + FPRINTF(stream, TEXT("nuhash ") OS_NAME TEXT("-") CPU_ARCH TEXT(" v%u.%u.%u [") FMT_HCHAR TEXT("]\n"), version[0U], version[1U], version[2U], build); + FPRINTF(stream, TEXT("built on ") FMT_HCHAR TEXT(" at ") FMT_HCHAR TEXT(" with ") COMPILER_FMT TEXT("\n\n"), __DATE__, __TIME__, COMPILER_ARG); + + if (full_info) + { + FPUTS(TEXT("Usage:\n"), stream); + FPUTS(TEXT(" nuhash") EXE_SUFFIX TEXT(" [options] [ [... ]]\n\n"), stream); + FPUTS(TEXT("Options:\n"), stream); + FPUTS(TEXT(" -b --binary Output digest as binary, default is hex-string.\n"), stream); + FPUTS(TEXT(" -h --help Print the help screen and exit.\n"), stream); + FPUTS(TEXT(" -i --ignore Ignore interrupt signals.\n"), stream); + FPUTS(TEXT(" -l --line-mode Process the input file(s) as text, line by line.\n"), stream); + FPUTS(TEXT(" -p --progress Print progress, while computing the hash.\n"), stream); + FPUTS(TEXT(" -s --stop Stop on all errors, default is to keep going.\n"), stream); + FPUTS(TEXT(" -t --self-test Run the built-in self-test.\n"), stream); + FPUTS(TEXT(" -u --uppercase Print digest as uppercase, default is lowercase.\n"), stream); + FPUTS(TEXT(" -v --version Print version information and exit.\n\n"), stream); + } +} + +/* ------------------------------------------------------------------------ */ +/* MAIN */ +/* ------------------------------------------------------------------------ */ + +int MAIN(const int argc, const CHAR_T *const argv[]) +{ + int exit_code = EXIT_SUCCESS, index = 1, options = 0, nostd = 0, result = 0; + + initialize_process(); + SETMODE(stderr, FMODE_TXT); + + if ((argc > 1) && (!STRCASECMP(argv[1], TEXT("/?")))) + { + options |= OPTION_HELP; + index = argc; + } + + while ((index < argc) && (argv[index][0U] == TEXT('-')) && (argv[index][1U] != TEXT('\0'))) + { + const CHAR_T *const arg_str = argv[index++]; + if (arg_str[1U] == TEXT('-')) + { + if (arg_str[2U] == TEXT('\0')) + { + nostd = 1; + break; + } + else if (parse_option_long(&options, arg_str + 2U)) + { + continue; + } + } + else if (parse_option_short(&options, arg_str + 1U)) + { + continue; + } + FPRINTF(stderr, TEXT("Error: Unknown option \"") FMT_TCHAR TEXT("\" encountered!\n"), arg_str); + return EXIT_FAILURE; + } + + if (options & (OPTION_HELP | OPTION_VERSION)) + { + print_helpscreen(stderr, options & OPTION_HELP); + return EXIT_SUCCESS; + } + + if ((options & OPTION_BINARY) && ISATTY(stdout)) + { + FPUTS(TEXT("Error: Binray output is not supported when writing to terminal!\n"), stderr); + return EXIT_FAILURE; + } + + if ((options & (OPTION_SELF_TEST | OPTION_STRESS)) && (index < argc)) + { + FPUTS(TEXT("Warning: Excess command-line argument(s) will be ignored!\n"), stderr); + } + + SETMODE(stdin, FMODE_BIN); + SETMODE(stdout, (options & OPTION_BINARY) ? FMODE_BIN : FMODE_TXT); + + if (options & OPTION_SELF_TEST) + { + result = self_test(options & OPTION_UPPERCASE, options & OPTION_IGNORE, options & OPTION_PROGRESS); + return (result < 1) ? EXIT_FAILURE : EXIT_SUCCESS; + } + + if (options & OPTION_STRESS) + { + result = stress_test(options & OPTION_UPPERCASE, options & OPTION_BINARY, options & OPTION_IGNORE); + return (result < 1) ? EXIT_FAILURE : EXIT_SUCCESS; + } + + if (index < argc) + { + for (; index < argc; ++index) + { + FILE *const input = (nostd || STRCASECMP(argv[index], TEXT("-"))) ? FOPEN(argv[index], TEXT("rb")) : stdin; + if (input) + { + result = process_file(input, argv[index], options & OPTION_LINE_MODE, options & OPTION_BINARY, options & OPTION_UPPERCASE, options & OPTION_IGNORE, options & OPTION_PROGRESS); + if (result < 1) + { + exit_code = EXIT_FAILURE; + } + } + else + { + FPRINTF(stderr, TEXT("Error: Failed to open file \"") FMT_TCHAR TEXT("\" for reading!\n"), argv[index]); + exit_code = EXIT_FAILURE; + } + + if ((result < 0) || ((exit_code != EXIT_SUCCESS) && (options & OPTION_STOP))) + { + break; + } + } + } + else if (!(options & (OPTION_SELF_TEST | OPTION_STRESS))) + { + result = process_file(stdin, TEXT("-"), options & OPTION_LINE_MODE, options & OPTION_BINARY, options & OPTION_UPPERCASE, options & OPTION_IGNORE, options & OPTION_PROGRESS); + if (result < 1) + { + exit_code = EXIT_FAILURE; + } + } + + return exit_code; +} diff --git a/tool/src/platform.c b/tool/src/platform.c new file mode 100644 index 0000000..1c15ac3 --- /dev/null +++ b/tool/src/platform.c @@ -0,0 +1,74 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#include + +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN 1 +# include +#else +# include +# include +# include +#endif + +#define UNUSED(X) ((void)(X)) +#define Q64(X) ((uint64_t)(X).QuadPart) + +volatile int g_aborted = 0; + +#ifdef _WIN32 +static LARGE_INTEGER s_frequency; +#endif + +static void sig_handler(const int signal_no) +{ + UNUSED(signal_no); + g_aborted = 1; +} + +#ifdef _WIN32 +static BOOL WINAPI console_ctrl_handler(const DWORD type) +{ + switch (type) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + case CTRL_CLOSE_EVENT: + sig_handler(2); + return TRUE; + default: + return FALSE; + } +} +#endif + +void initialize_process(void) +{ +#if defined(_WIN32) + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + QueryPerformanceFrequency(&s_frequency); + SetConsoleCtrlHandler(console_ctrl_handler, TRUE); +#else + struct sigaction action; + action.sa_handler = sig_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + sigaction(SIGINT, &action, NULL); +#endif +} + +uint64_t get_mtime(void) +{ +#if defined(_WIN32) + LARGE_INTEGER counter; + QueryPerformanceCounter(&counter); + return ((Q64(counter) / Q64(s_frequency)) * UINT64_C(1000)) + (((Q64(counter) % Q64(s_frequency)) * UINT64_C(1000)) / Q64(s_frequency)); +#else + struct timespec time_stamp; + clock_gettime(CLOCK_MONOTONIC, &time_stamp); + return ((uint64_t)time_stamp.tv_sec * UINT64_C(1000)) + ((uint64_t)time_stamp.tv_nsec / UINT64_C(1000000)); +#endif +} diff --git a/tool/src/platform.h b/tool/src/platform.h new file mode 100644 index 0000000..8bb9c4e --- /dev/null +++ b/tool/src/platform.h @@ -0,0 +1,211 @@ +/******************************************************************************/ +/* NuHash, by LoRd_MuldeR */ +/* This work has been released under the CC0 1.0 Universal license! */ +/******************************************************************************/ + +#ifndef _INC_NUHASH_PLATFORM_H +#define _INC_NUHASH_PLATFORM_H + +/* CRT */ +#include +#include +#include +#include +#include +#include +#include + +/* platform-specific */ +#ifdef _WIN32 +# include +# include +# include +#else +# include +#endif + +/* initialization */ +void initialize_process(void); + +/* monotonic clock */ +uint64_t get_mtime(void); + +/* abort flag */ +extern volatile int g_aborted; + +/* integer types */ +#if !defined(_MSC_VER) || (_MSC_VER >= 1800) +# include +#else +# define PRIX8 "hhX" +# define PRIX16 "hX" +# define PRIX32 "X" +# define PRIX64 "llX" +#endif + +/* Unicode support*/ +#ifdef _WIN32 +# define CHAR_T wchar_t +# define __TEXT(X) L##X +# define TEXT(X) __TEXT(X) +# define MAIN wmain +# define FPRINTF fwprintf +# define FPUTS fputws +# define FOPEN(X,Y) _wfsopen((X),(Y),_SH_SECURE) +# define STRCASECMP _wcsicmp +# define strcasecmp _stricmp +# define TOLOWER(X) towlower((unsigned short)(X)) +# ifndef __USE_MINGW_ANSI_STDIO +# define FMT_TCHAR L"%s" +# define FMT_HCHAR L"%S" +# else +# define FMT_TCHAR L"%ls" +# define FMT_HCHAR L"%hs" +# endif +#else +# define CHAR_T char +# define TEXT(X) X +# define MAIN main +# define FPRINTF fprintf +# define FPUTS fputs +# define FOPEN fopen +# define STRCASECMP strcasecmp +# define TOLOWER(X) tolower((unsigned char)(X)) +# define FMT_TCHAR "%s" +# define FMT_HCHAR "%s" +#endif + +/* CPU arch */ +#if defined(__x86_64__) || defined(__amd64__) || defined(_M_X64) +# define CPU_ARCH TEXT("x64") +#elif defined(__i386__) || defined(_X86_) || defined(_M_IX86) || defined(__IA32__) +# define CPU_ARCH TEXT("x86") +#elif defined(__aarch64__) || defined(_M_ARM64) +# define CPU_ARCH TEXT("arm64") +#elif defined(__arm__) && defined(__ARM_FP) +# define CPU_ARCH TEXT("armhf") +#elif defined(__arm__) && defined(__ARMEL__) +# define CPU_ARCH TEXT("armel") +#elif defined(__arm__) || defined(_M_ARM) +# define CPU_ARCH TEXT("arm") +#elif defined(__mips__) && defined(_MIPS_ARCH_MIPS64R6) && defined(_MIPSEL) +# define CPU_ARCH TEXT("mips64r6el") +#elif defined(__mips__) && defined(_MIPS_ARCH_MIPS64R6) +# define CPU_ARCH TEXT("mips64r6") +#elif defined(__mips__) && defined(_MIPS_ARCH_MIPS32R6) && defined(_MIPSEL) +# define CPU_ARCH TEXT("mipsr6el") +#elif defined(__mips__) && defined(_MIPS_ARCH_MIPS32R6) +# define CPU_ARCH TEXT("mipsr6") +#elif defined(__mips__) && (defined(__mips64) || (__mips == 64)) && defined(_MIPSEL) +# define CPU_ARCH TEXT("mips64el") +#elif defined(__mips__) && (defined(__mips64) || (__mips == 64)) +# define CPU_ARCH TEXT("mips64") +#elif (defined(__mips__) || defined(_mips) || defined(__mips)) && defined(_MIPSEL) +# define CPU_ARCH TEXT("mipsel") +#elif defined(__mips__) || defined(_mips) || defined(__mips) +# define CPU_ARCH TEXT("mips") +#elif defined(__powerpc64__) || defined(__PPC64__) || defined(_ARCH_PPC64) +# define CPU_ARCH TEXT("ppc64") +#elif defined(__powerpc__) || defined(__PPC__) || defined(_ARCH_PPC) +# define CPU_ARCH TEXT("ppc") +#elif defined(__s390x__) || defined(__zarch__) +# define CPU_ARCH TEXT("s390x") +#elif defined(__riscv) && (__riscv_xlen == 64) +# define CPU_ARCH TEXT("riscv64") +#else +# error Unsupported CPU architecture encountered! +#endif + +/* OS family */ +#if defined(__linux__) +# define OS_NAME TEXT("linux") +#elif defined(__gnu_hurd__) +# define OS_NAME TEXT("hurd") +#elif defined(__FreeBSD__) +# define OS_NAME TEXT("freebsd") +#elif defined(__OpenBSD__) +# define OS_NAME TEXT("openbsd") +#elif defined(__NetBSD__) +# define OS_NAME TEXT("netbsd") +#elif defined(__DragonFly__) +# define OS_NAME TEXT("dragonfly") +#elif defined(__illumos__) +# define OS_NAME TEXT("illumos") +#elif defined(__sun) && defined(__svr4__) +# define OS_NAME TEXT("solaris") +#elif defined(__QNX__) +# define OS_NAME TEXT("qnx") +#elif defined(__APPLE__) && defined(__MACH__) +# define OS_NAME TEXT("darwin") +#elif defined(__HAIKU__) +# define OS_NAME TEXT("haiku") +#elif defined(__CYGWIN__) +# define OS_NAME TEXT("cygwin") +#elif defined(_WIN32) +# define OS_NAME TEXT("windows") +#elif defined(__unix__) +# define OS_NAME TEXT("unix") +#else +# error Unsupported operating system encountered! +#endif + +/* Compiler */ +#if defined(__INTEL_LLVM_COMPILER) +# define COMPILER_FMT TEXT("Intel C++ Compiler v%u.%u.%u") +# define COMPILER_ARG __INTEL_LLVM_COMPILER / 10000U, (__INTEL_LLVM_COMPILER % 10000U) / 100U, __INTEL_LLVM_COMPILER % 100U +#elif defined(__clang__) +# define COMPILER_FMT TEXT("Clang v%u.%u.%u") +# define COMPILER_ARG __clang_major__, __clang_minor__, __clang_patchlevel__ +#elif defined(__GNUC__) +# define COMPILER_FMT TEXT("GCC v%u.%u.%u") +# define COMPILER_ARG __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ +#elif defined(_MSC_VER) +# define COMPILER_FMT TEXT("MSVC v%u.%02u.%u") +# define COMPILER_ARG _MSC_VER / 100U, _MSC_VER % 100U, _MSC_FULL_VER % 100000U +#else +# error Unsupported compiler encountered! +#endif + +/* fstat() support */ +#ifdef _WIN32 +# define FSTAT(X,Y) _fstat64(_fileno(X),(Y)) +# define STAT_STRUCT _stat64 +# define FILE_IS_DIR(X) (((X) & _S_IFMT) == _S_IFDIR) +# define FILE_IS_REG(X) (((X) & _S_IFMT) == _S_IFREG) +#else +# define FSTAT(X,Y) fstat(fileno(X),(Y)) +# define STAT_STRUCT stat +# define FILE_IS_DIR(X) S_ISDIR((X)) +# define FILE_IS_REG(X) S_ISREG((X)) +#endif + +/* assert file size */ +#define STATIC_ASSERT(X,Y) typedef char _static_assertion_##X[(Y) ? 1 : (-1)] +STATIC_ASSERT(file_size, sizeof(((struct STAT_STRUCT*)NULL)->st_size) >= 8U); + +/* setmode() support */ +#ifdef _WIN32 +# define FMODE_BIN _O_BINARY +# define FMODE_TXT _O_U8TEXT +# define SETMODE(X,Y) _setmode(_fileno((X)), (Y)) +#else +# define FMODE_BIN 0x1 +# define FMODE_TXT 0x2 +# define SETMODE(X,Y) ((void)0) +#endif + +/* isatty() support */ +#ifdef _WIN32 +# define ISATTY(X) _isatty(_fileno((X))) +#else +# define ISATTY(X) isatty(fileno((X))) +#endif + +/* executable name */ +#ifdef _WIN32 +# define EXE_SUFFIX TEXT(".exe") +#else +# define EXE_SUFFIX +#endif + +#endif /* _INC_NUHASH_PLATFORM_H */