diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ee10dea2e..ed0ec9575 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,7 @@ on: - 'OpenCL/**.cl' - 'include/**.h' - 'src/**.c' + - 'src/**.mk' - 'tools/**' - '**/Makefile' - '.github/workflows/build.yml' @@ -36,6 +37,7 @@ on: - 'OpenCL/**.cl' - 'include/**.h' - 'src/**.c' + - 'src/**.mk' - 'tools/**' - '**/Makefile' - '.github/workflows/build.yml' @@ -74,6 +76,7 @@ jobs: libiconv libiconv-devel make + python - name: Build (Windows) if: matrix.os_name_lowercase == 'windows' diff --git a/.gitignore b/.gitignore index d8ff600bb..6dd2f09f2 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ hashcat.dll *.dSYM kernels/** lib/*.a +bridges/*.dll +bridges/*.so modules/*.dll modules/*.so obj/*/*/*.o @@ -24,3 +26,9 @@ obj/*.o obj/*.a include/CL tools/luks_tests +.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class diff --git a/BUILD.md b/BUILD.md index b552f48bc..a66a75938 100644 --- a/BUILD.md +++ b/BUILD.md @@ -1,87 +1,138 @@ -hashcat build documentation -= -### Revision ### +# Hashcat – Build Documentation -* 1.6 +**Revision**: 1.7 +**Author**: See `docs/credits.txt` -### Author ### +--- -See docs/credits.txt +## ✅ Requirements -### Building hashcat for Linux and macOS ### +- **Python 3.12** or higher -Get a copy of the **hashcat** repository +Check your Python version: +```bash +$ python3 --version +# Expected output: Python 3.13.3 ``` + +If you can't install Python ≥ 3.12 globally, you can use **pyenv**. + +> If you're using `pyenv`, follow **all steps** below. Otherwise, follow only **steps 3 and 5**. + +--- + +## 🛠️ Building Hashcat – Step-by-Step + +### 🔹 Step 1: Install dependencies and pyenv + +#### On Linux + +Install required libraries to build Python: + +```bash +$ sudo apt install libbz2-dev libssl-dev libncurses5-dev libffi-dev libreadline-dev libsqlite3-dev liblzma-dev +``` + +Install `pyenv`: + +```bash +$ curl https://pyenv.run | bash +``` + +> Follow the instructions shown after installation to set up your shell correctly. + +#### On macOS + +Install `pyenv` via Homebrew: + +```bash +$ brew install pyenv +``` + +--- + +### 🔹 Step 2: Install Python using pyenv + +Install Python 3.12 (or newer): + +```bash +$ pyenv install 3.12 +``` + +Check installed versions: + +```bash +$ pyenv versions +# Example: +# * system +# 3.12.11 +``` + +--- + +### 🔹 Step 3: Clone the Hashcat repository + +```bash $ git clone https://github.com/hashcat/hashcat.git +$ cd hashcat ``` -Run "make" +--- -``` -$ make +### 🔹 Step 4: Set the local Python version + +```bash +$ pyenv local 3.12.11 ``` -### Install hashcat for Linux ### +--- -The install target is linux FHS compatible and can be used like this: +### 🔹 Step 5: Build Hashcat +```bash +$ make clean && make ``` + +--- + +### 🔹 Step 6 (Optional): Install Hashcat (Linux only) + +```bash $ make install ``` -If the $HOME/.hashcat folder exists, then: +Hashcat will use the following locations depending on your environment: -- Session related files go to: $HOME/.hashcat/sessions/ -- Cached kernels go to: $HOME/.hashcat/kernels/ -- Potfiles go to: $HOME/.hashcat/ +| Condition | Session Files | Kernel Cache | Potfiles | +|--------------------------------------------|----------------------------------------|---------------------------------------|----------------------------------------| +| `$HOME/.hashcat` exists | `$HOME/.hashcat/sessions/` | `$HOME/.hashcat/kernels/` | `$HOME/.hashcat/` | +| `$XDG_DATA_HOME` and `$XDG_CACHE_HOME` set | `$XDG_DATA_HOME/hashcat/sessions/` | `$XDG_CACHE_HOME/hashcat/kernels/` | `$XDG_DATA_HOME/hashcat/` | +| Only `$XDG_DATA_HOME` set | `$XDG_DATA_HOME/hashcat/sessions/` | `$HOME/.cache/hashcat/` | `$XDG_DATA_HOME/hashcat/` | +| Only `$XDG_CACHE_HOME` set | `$HOME/.local/share/hashcat/sessions/` | `$XDG_CACHE_HOME/hashcat/kernels/` | `$HOME/.local/share/hashcat/` | +| None of the above | `$HOME/.local/share/hashcat/sessions/` | `$HOME/.cache/hashcat/` | `$HOME/.local/share/hashcat/` | -Otherwise, if environment variable XDG_DATA_HOME and XDG_CACHE_HOME exists, then: +--- -- Session related files go to: $XDG_DATA_HOME/hashcat/sessions/ -- Cached kernels go to: $XDG_CACHE_HOME/hashcat/kernels/ -- Potfiles go to: $XDG_DATA_HOME/hashcat/ +## 🐳 Building Hashcat with Docker -Otherwise, if environment variable XDG_DATA_HOME exists, then: +See: [BUILD_Docker.md](BUILD_Docker.md) -- Session related files go to: $XDG_DATA_HOME/hashcat/sessions/ -- Cached kernels go to: $HOME/.cache/hashcat -- Potfiles go to: $XDG_DATA_HOME/hashcat/ +--- -Otherwise, if environment variable XDG_CACHE_HOME exists, then: +## 🪟 Building Hashcat for Windows -- Session related files go to: $HOME/.local/share/hashcat/sessions/ -- Cached kernels go to: $XDG_CACHE_HOME/hashcat/kernels/ -- Potfiles go to: $HOME/.local/share/hashcat/ +| Method | Documentation | +|----------------------------------------|--------------------------------------| +| From macOS | [BUILD_macOS.md](BUILD_macOS.md) | +| Using Windows Subsystem for Linux (WSL)| [BUILD_WSL.md](BUILD_WSL.md) | +| Using Cygwin | [BUILD_CYGWIN.md](BUILD_CYGWIN.md) | +| Using MSYS2 | [BUILD_MSYS2.md](BUILD_MSYS2.md) | +| From Linux | Run: `make win` | -Otherwise: +--- -- Session related files go to: $HOME/.local/share/hashcat/sessions/ -- Cached kernels go to: $HOME/.cache/hashcat -- Potfiles go to: $HOME/.local/share/hashcat/ +## 🎉 Done -### Building hashcat for Windows (using macOS) ### - -Refer to [BUILD_macOS.md](BUILD_macOS.md) - -### Building hashcat for Windows (using Windows Subsystem for Linux) ### - -Refer to [BUILD_WSL.md](BUILD_WSL.md) - -### Building hashcat for Windows (using Cygwin) ### - -Refer to [BUILD_CYGWIN.md](BUILD_CYGWIN.md) - -### Building hashcat for Windows (using MSYS2) ### - -Refer to [BUILD_MSYS2.md](BUILD_MSYS2.md) - -### Building hashcat for Windows from Linux ### - -``` -$ make win -``` - -= -Enjoy your fresh **hashcat** binaries ;) +Enjoy your fresh **Hashcat** binaries! 😎 diff --git a/BUILD_CYGWIN.md b/BUILD_CYGWIN.md index 13b1d2c02..b5719de11 100644 --- a/BUILD_CYGWIN.md +++ b/BUILD_CYGWIN.md @@ -14,6 +14,8 @@ gcc-core gcc-g++ make git +python312 +python312-devel ``` ### Building ### diff --git a/BUILD_Docker.md b/BUILD_Docker.md new file mode 100644 index 000000000..cd957bcc9 --- /dev/null +++ b/BUILD_Docker.md @@ -0,0 +1,40 @@ +# Compiling hashcat binaries with Docker + +To build both Linux and Windows binaries in a clean and reproducible environment a dockerfile is available. +It is not considered to be used as a runtime OS. + +### Building ### + +```bash +docker build -f docker/BinaryPackage.ubuntu20 -t hashcat-binaries . +``` + +This will create a Docker image with all required toolchains and dependencies. + +Optionally you can place custom *.patch or *.diff files into `patches/` folder. They will be applied before compiling. + +### Output ### + +The resulting output package will be located in: `/root/xy/hashcat-.7z`. + +You can copy it to your host with this command: + +```bash +docker run --rm \ + -e HOST_UID=$(id -u) \ + -e HOST_GID=$(id -g) \ + -v $(pwd):/out \ + hashcat-binaries \ + bash -c "cp /root/xy/hashcat-*.7z /out && chown \$HOST_UID:\$HOST_GID /out/hashcat-*.7z" +``` + +The package will be available on your host machine in the `out` directory. + +### Debug ### + +In case you want to play around in the docker, run: + +```bash +docker run --rm -it hashcat-binaries /bin/bash +``` + diff --git a/BUILD_MSYS2.md b/BUILD_MSYS2.md index 09c7b4f1a..bdb2c68a9 100644 --- a/BUILD_MSYS2.md +++ b/BUILD_MSYS2.md @@ -13,6 +13,7 @@ $ pacman -S git $ pacman -S make $ pacman -S gcc $ pacman -S libiconv-devel +$ pacman -S python3 ``` ### Building ### diff --git a/BUILD_WSL.md b/BUILD_WSL.md index 8e0ff1fbc..cd5b6fd5b 100644 --- a/BUILD_WSL.md +++ b/BUILD_WSL.md @@ -1,24 +1,27 @@ -# Compiling hashcat for Windows with Windows Subsystem for Linux. +# Compiling hashcat for Windows with Windows Subsystem for Linux 2. -Tested on Windows 10 x64, should also work to build hashcat for Windows on Linux. +Tested on Windows 11 x64, should also work to build hashcat for Windows on Linux. -I had it tested with WSL2 using Ubuntu_2004.2020.424.0_x64.appx. +I had it tested with WSL2 using "Ubuntu", which at the time of writing is Ubuntu 24.04 Make sure to have the system upgraded after install (otherwise it will fail to find the gcc-mingw-w64-x86-64 package). ### Installation ### -Enable WSL. +Enable WSL2. Press the win + r key on your keyboard simultaneously and in the "Run" popup window type bash and make sure to install additional dependencies necessary for hashcat compilation ```bash -sudo apt install gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 make git +sudo apt install build-essential gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 make git zstd python3-dev cmake git clone https://github.com/hashcat/hashcat git clone https://github.com/win-iconv/win-iconv cd win-iconv/ -cmake -D WIN_ICONV_BUILD_EXECUTABLE=OFF -D CMAKE_INSTALL_PREFIX=/opt/win-iconv-64 -D CMAKE_CXX_COMPILER=$(which x86_64-w64-mingw32-g++) -D CMAKE_C_COMPILER=$(which x86_64-w64-mingw32-gcc) +cmake -D WIN_ICONV_BUILD_EXECUTABLE=OFF -D CMAKE_INSTALL_PREFIX=/opt/win-iconv-64 -D CMAKE_CXX_COMPILER=$(which x86_64-w64-mingw32-g++) -D CMAKE_C_COMPILER=$(which x86_64-w64-mingw32-gcc) -D CMAKE_SYSTEM_NAME=Windows sudo make install cd ../ +wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst +sudo mkdir /opt/win-python +sudo tar --zstd -xf mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst -C /opt/win-python ``` ### Building ### diff --git a/BUILD_macOS.md b/BUILD_macOS.md index 67d09a6bf..9388dd75e 100644 --- a/BUILD_macOS.md +++ b/BUILD_macOS.md @@ -11,9 +11,12 @@ brew install mingw-w64 git clone https://github.com/hashcat/hashcat git clone https://github.com/win-iconv/win-iconv cd win-iconv/ -patch < ../hashcat/tools/win-iconv-64.diff +cmake -D WIN_ICONV_BUILD_EXECUTABLE=OFF -D CMAKE_INSTALL_PREFIX=/opt/win-iconv-64 -D CMAKE_CXX_COMPILER=$(which x86_64-w64-mingw32-g++) -D CMAKE_C_COMPILER=$(which x86_64-w64-mingw32-gcc) -D CMAKE_SYSTEM_NAME=Windows sudo make install cd ../ +wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst +sudo mkdir /opt/win-python +sudo tar --zstd -xf mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst -C /opt/win-python ``` ### Building ### diff --git a/OpenCL/amp_a0.cl b/OpenCL/amp_a0.cl index f39750c54..5e4a1ae55 100644 --- a/OpenCL/amp_a0.cl +++ b/OpenCL/amp_a0.cl @@ -13,7 +13,7 @@ #include M2S(INCLUDE_PATH/inc_amp.h) #endif -KERNEL_FQ void amp (KERN_ATTR_AMP) +KERNEL_FQ KERNEL_FA void amp (KERN_ATTR_AMP) { const u64 gid = get_global_id (0); diff --git a/OpenCL/amp_a1.cl b/OpenCL/amp_a1.cl index 99d91c168..b1cfc1c1d 100644 --- a/OpenCL/amp_a1.cl +++ b/OpenCL/amp_a1.cl @@ -11,7 +11,7 @@ #include M2S(INCLUDE_PATH/inc_amp.h) #endif -KERNEL_FQ void amp (KERN_ATTR_AMP) +KERNEL_FQ KERNEL_FA void amp (KERN_ATTR_AMP) { const u64 gid = get_global_id (0); diff --git a/OpenCL/amp_a3.cl b/OpenCL/amp_a3.cl index abdb3f7a6..a5b74c85f 100644 --- a/OpenCL/amp_a3.cl +++ b/OpenCL/amp_a3.cl @@ -10,7 +10,7 @@ #include M2S(INCLUDE_PATH/inc_amp.h) #endif -KERNEL_FQ void amp (KERN_ATTR_AMP) +KERNEL_FQ KERNEL_FA void amp (KERN_ATTR_AMP) { const u64 gid = get_global_id (0); diff --git a/OpenCL/inc_cipher_rc4.cl b/OpenCL/inc_cipher_rc4.cl index 3ec670511..77dc5daa4 100644 --- a/OpenCL/inc_cipher_rc4.cl +++ b/OpenCL/inc_cipher_rc4.cl @@ -4,6 +4,12 @@ #include "inc_common.h" #include "inc_cipher_rc4.h" +#ifdef IS_HIP +#define RC4_NOINLINE __attribute__ ((noinline)) +#else +#define RC4_NOINLINE +#endif + #ifdef IS_CPU // Pattern linear @@ -390,7 +396,7 @@ DECLSPEC u8 rc4_next_16 (LOCAL_AS u32 *S, const u8 i, const u8 j, PRIVATE_AS con return b; } -DECLSPEC u8 rc4_next_16_global (LOCAL_AS u32 *S, const u8 i, const u8 j, GLOBAL_AS const u32 *in, PRIVATE_AS u32 *out, const u64 lid) +DECLSPEC RC4_NOINLINE u8 rc4_next_16_global (LOCAL_AS u32 *S, const u8 i, const u8 j, GLOBAL_AS const u32 *in, PRIVATE_AS u32 *out, const u64 lid) { u8 a = i; u8 b = j; diff --git a/OpenCL/inc_common.h b/OpenCL/inc_common.h index 03382886e..0b51fbd29 100644 --- a/OpenCL/inc_common.h +++ b/OpenCL/inc_common.h @@ -126,7 +126,8 @@ #define KERN_ATTR_MAIN_PARAMS \ uint hc_gid [[ thread_position_in_grid ]], \ uint hc_lid [[ thread_position_in_threadgroup ]], \ - uint hc_lsz [[ threads_per_threadgroup ]] + uint hc_lsz [[ threads_per_threadgroup ]], \ + uint hc_bid [[ threadgroup_position_in_grid ]] #endif // IS_METAL /* diff --git a/OpenCL/inc_comp_multi_iba.cl b/OpenCL/inc_comp_multi_iba.cl index 9a41cc17c..05d8bf3b1 100644 --- a/OpenCL/inc_comp_multi_iba.cl +++ b/OpenCL/inc_comp_multi_iba.cl @@ -3,7 +3,7 @@ for (int digest_pos = 0; digest_pos < DIGESTS_CNT; digest_pos++) { const u32 final_hash_pos = DIGESTS_OFFSET_HOST + digest_pos; - const digest_t *digest = digests_buf + final_hash_pos; + GLOBAL_AS const digest_t *digest = digests_buf + final_hash_pos; const int invalid_bits = count_bits_32 (digest->digest_buf[0], r0) + count_bits_32 (digest->digest_buf[1], r1) diff --git a/OpenCL/inc_hash_blake2s.cl b/OpenCL/inc_hash_blake2s.cl index 5fb60f979..77ecc02fb 100644 --- a/OpenCL/inc_hash_blake2s.cl +++ b/OpenCL/inc_hash_blake2s.cl @@ -9,6 +9,7 @@ #include "inc_common.h" #include "inc_hash_blake2s.h" + DECLSPEC u32 blake2s_rot16_S (const u32 a) { vconv32_t in; @@ -217,7 +218,7 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * if (pos == 0) { - if (ctx->len > 0) // if new block (pos == 0) AND the (old) len is not zero => transform + if (ctx->len > 0) { blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_UPDATE); } @@ -288,8 +289,6 @@ DECLSPEC void blake2s_update_64 (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS u32 * ctx->m[14] |= w3[2]; ctx->m[15] |= w3[3]; - // len must be a multiple of 64 (not ctx->len) for BLAKE2S_UPDATE: - const u32 cur_len = ((ctx->len + len) / 64) * 64; blake2s_transform (ctx->h, ctx->m, cur_len, BLAKE2S_UPDATE); @@ -424,11 +423,520 @@ DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS co blake2s_update_64 (ctx, w0, w1, w2, w3, len - (u32) pos1); } +DECLSPEC void blake2s_update_swap (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + int pos1; + int pos4; + + for (pos1 = 0, pos4 = 0; pos1 < len - 64; pos1 += 64, pos4 += 16) + { + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + + w0[0] = hc_swap32_S (w0[0]); + w0[1] = hc_swap32_S (w0[1]); + w0[2] = hc_swap32_S (w0[2]); + w0[3] = hc_swap32_S (w0[3]); + w1[0] = hc_swap32_S (w1[0]); + w1[1] = hc_swap32_S (w1[1]); + w1[2] = hc_swap32_S (w1[2]); + w1[3] = hc_swap32_S (w1[3]); + w2[0] = hc_swap32_S (w2[0]); + w2[1] = hc_swap32_S (w2[1]); + w2[2] = hc_swap32_S (w2[2]); + w2[3] = hc_swap32_S (w2[3]); + w3[0] = hc_swap32_S (w3[0]); + w3[1] = hc_swap32_S (w3[1]); + w3[2] = hc_swap32_S (w3[2]); + w3[3] = hc_swap32_S (w3[3]); + + blake2s_update_64 (ctx, w0, w1, w2, w3, 64); + } + + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + + w0[0] = hc_swap32_S (w0[0]); + w0[1] = hc_swap32_S (w0[1]); + w0[2] = hc_swap32_S (w0[2]); + w0[3] = hc_swap32_S (w0[3]); + w1[0] = hc_swap32_S (w1[0]); + w1[1] = hc_swap32_S (w1[1]); + w1[2] = hc_swap32_S (w1[2]); + w1[3] = hc_swap32_S (w1[3]); + w2[0] = hc_swap32_S (w2[0]); + w2[1] = hc_swap32_S (w2[1]); + w2[2] = hc_swap32_S (w2[2]); + w2[3] = hc_swap32_S (w2[3]); + w3[0] = hc_swap32_S (w3[0]); + w3[1] = hc_swap32_S (w3[1]); + w3[2] = hc_swap32_S (w3[2]); + w3[3] = hc_swap32_S (w3[3]); + + blake2s_update_64 (ctx, w0, w1, w2, w3, len - pos1); +} + +DECLSPEC void blake2s_update_global_swap (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + const int limit = (const int) len - 64; // int type needed, could be negative + + int pos1; + int pos4; + + for (pos1 = 0, pos4 = 0; pos1 < limit; pos1 += 64, pos4 += 16) + { + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + + w0[0] = hc_swap32_S (w0[0]); + w0[1] = hc_swap32_S (w0[1]); + w0[2] = hc_swap32_S (w0[2]); + w0[3] = hc_swap32_S (w0[3]); + w1[0] = hc_swap32_S (w1[0]); + w1[1] = hc_swap32_S (w1[1]); + w1[2] = hc_swap32_S (w1[2]); + w1[3] = hc_swap32_S (w1[3]); + w2[0] = hc_swap32_S (w2[0]); + w2[1] = hc_swap32_S (w2[1]); + w2[2] = hc_swap32_S (w2[2]); + w2[3] = hc_swap32_S (w2[3]); + w3[0] = hc_swap32_S (w3[0]); + w3[1] = hc_swap32_S (w3[1]); + w3[2] = hc_swap32_S (w3[2]); + w3[3] = hc_swap32_S (w3[3]); + + blake2s_update_64 (ctx, w0, w1, w2, w3, 64); + } + + w0[0] = w[pos4 + 0]; + w0[1] = w[pos4 + 1]; + w0[2] = w[pos4 + 2]; + w0[3] = w[pos4 + 3]; + w1[0] = w[pos4 + 4]; + w1[1] = w[pos4 + 5]; + w1[2] = w[pos4 + 6]; + w1[3] = w[pos4 + 7]; + w2[0] = w[pos4 + 8]; + w2[1] = w[pos4 + 9]; + w2[2] = w[pos4 + 10]; + w2[3] = w[pos4 + 11]; + w3[0] = w[pos4 + 12]; + w3[1] = w[pos4 + 13]; + w3[2] = w[pos4 + 14]; + w3[3] = w[pos4 + 15]; + + w0[0] = hc_swap32_S (w0[0]); + w0[1] = hc_swap32_S (w0[1]); + w0[2] = hc_swap32_S (w0[2]); + w0[3] = hc_swap32_S (w0[3]); + w1[0] = hc_swap32_S (w1[0]); + w1[1] = hc_swap32_S (w1[1]); + w1[2] = hc_swap32_S (w1[2]); + w1[3] = hc_swap32_S (w1[3]); + w2[0] = hc_swap32_S (w2[0]); + w2[1] = hc_swap32_S (w2[1]); + w2[2] = hc_swap32_S (w2[2]); + w2[3] = hc_swap32_S (w2[3]); + w3[0] = hc_swap32_S (w3[0]); + w3[1] = hc_swap32_S (w3[1]); + w3[2] = hc_swap32_S (w3[2]); + w3[3] = hc_swap32_S (w3[3]); + + blake2s_update_64 (ctx, w0, w1, w2, w3, len - (u32) pos1); +} + + DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx) { blake2s_transform (ctx->h, ctx->m, ctx->len, BLAKE2S_FINAL); } + +DECLSPEC void blake2s_hmac_init_64 (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3) +{ + u32 a0[4]; + u32 a1[4]; + u32 a2[4]; + u32 a3[4]; + + // ipad + + a0[0] = w0[0] ^ 0x36363636; + a0[1] = w0[1] ^ 0x36363636; + a0[2] = w0[2] ^ 0x36363636; + a0[3] = w0[3] ^ 0x36363636; + a1[0] = w1[0] ^ 0x36363636; + a1[1] = w1[1] ^ 0x36363636; + a1[2] = w1[2] ^ 0x36363636; + a1[3] = w1[3] ^ 0x36363636; + a2[0] = w2[0] ^ 0x36363636; + a2[1] = w2[1] ^ 0x36363636; + a2[2] = w2[2] ^ 0x36363636; + a2[3] = w2[3] ^ 0x36363636; + a3[0] = w3[0] ^ 0x36363636; + a3[1] = w3[1] ^ 0x36363636; + a3[2] = w3[2] ^ 0x36363636; + a3[3] = w3[3] ^ 0x36363636; + + blake2s_init (&ctx->ipad); + + blake2s_update_64 (&ctx->ipad, a0, a1, a2, a3, 64); + + // opad + + u32 b0[4]; + u32 b1[4]; + u32 b2[4]; + u32 b3[4]; + + b0[0] = w0[0] ^ 0x5c5c5c5c; + b0[1] = w0[1] ^ 0x5c5c5c5c; + b0[2] = w0[2] ^ 0x5c5c5c5c; + b0[3] = w0[3] ^ 0x5c5c5c5c; + b1[0] = w1[0] ^ 0x5c5c5c5c; + b1[1] = w1[1] ^ 0x5c5c5c5c; + b1[2] = w1[2] ^ 0x5c5c5c5c; + b1[3] = w1[3] ^ 0x5c5c5c5c; + b2[0] = w2[0] ^ 0x5c5c5c5c; + b2[1] = w2[1] ^ 0x5c5c5c5c; + b2[2] = w2[2] ^ 0x5c5c5c5c; + b2[3] = w2[3] ^ 0x5c5c5c5c; + b3[0] = w3[0] ^ 0x5c5c5c5c; + b3[1] = w3[1] ^ 0x5c5c5c5c; + b3[2] = w3[2] ^ 0x5c5c5c5c; + b3[3] = w3[3] ^ 0x5c5c5c5c; + + blake2s_init (&ctx->opad); + + blake2s_update_64 (&ctx->opad, b0, b1, b2, b3, 64); +} + +DECLSPEC void blake2s_hmac_init (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + if (len > 64) + { + blake2s_ctx_t tmp; + + blake2s_init (&tmp); + + blake2s_update (&tmp, w, len); + + blake2s_final (&tmp); + + w0[0] = tmp.h[0]; + w0[1] = tmp.h[1]; + w0[2] = tmp.h[2]; + w0[3] = tmp.h[3]; + w1[0] = tmp.h[4]; + w1[1] = tmp.h[5]; + w1[2] = tmp.h[6]; + w1[3] = tmp.h[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + } + else + { + w0[0] = w[ 0]; + w0[1] = w[ 1]; + w0[2] = w[ 2]; + w0[3] = w[ 3]; + w1[0] = w[ 4]; + w1[1] = w[ 5]; + w1[2] = w[ 6]; + w1[3] = w[ 7]; + w2[0] = w[ 8]; + w2[1] = w[ 9]; + w2[2] = w[10]; + w2[3] = w[11]; + w3[0] = w[12]; + w3[1] = w[13]; + w3[2] = w[14]; + w3[3] = w[15]; + } + + blake2s_hmac_init_64 (ctx, w0, w1, w2, w3); +} + +DECLSPEC void blake2s_hmac_init_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + if (len > 64) + { + blake2s_ctx_t tmp; + + blake2s_init (&tmp); + + blake2s_update_swap (&tmp, w, len); + + blake2s_final (&tmp); + + w0[0] = tmp.h[0]; + w0[1] = tmp.h[1]; + w0[2] = tmp.h[2]; + w0[3] = tmp.h[3]; + w1[0] = tmp.h[4]; + w1[1] = tmp.h[5]; + w1[2] = tmp.h[6]; + w1[3] = tmp.h[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + } + else + { + w0[0] = hc_swap32_S (w[ 0]); + w0[1] = hc_swap32_S (w[ 1]); + w0[2] = hc_swap32_S (w[ 2]); + w0[3] = hc_swap32_S (w[ 3]); + w1[0] = hc_swap32_S (w[ 4]); + w1[1] = hc_swap32_S (w[ 5]); + w1[2] = hc_swap32_S (w[ 6]); + w1[3] = hc_swap32_S (w[ 7]); + w2[0] = hc_swap32_S (w[ 8]); + w2[1] = hc_swap32_S (w[ 9]); + w2[2] = hc_swap32_S (w[10]); + w2[3] = hc_swap32_S (w[11]); + w3[0] = hc_swap32_S (w[12]); + w3[1] = hc_swap32_S (w[13]); + w3[2] = hc_swap32_S (w[14]); + w3[3] = hc_swap32_S (w[15]); + } + + blake2s_hmac_init_64 (ctx, w0, w1, w2, w3); +} + +DECLSPEC void blake2s_hmac_init_global (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + if (len > 64) + { + blake2s_ctx_t tmp; + + blake2s_init (&tmp); + + blake2s_update_global (&tmp, w, len); + + blake2s_final (&tmp); + + w0[0] = tmp.h[0]; + w0[1] = tmp.h[1]; + w0[2] = tmp.h[2]; + w0[3] = tmp.h[3]; + w1[0] = tmp.h[4]; + w1[1] = tmp.h[5]; + w1[2] = tmp.h[6]; + w1[3] = tmp.h[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + } + else + { + w0[0] = w[ 0]; + w0[1] = w[ 1]; + w0[2] = w[ 2]; + w0[3] = w[ 3]; + w1[0] = w[ 4]; + w1[1] = w[ 5]; + w1[2] = w[ 6]; + w1[3] = w[ 7]; + w2[0] = w[ 8]; + w2[1] = w[ 9]; + w2[2] = w[10]; + w2[3] = w[11]; + w3[0] = w[12]; + w3[1] = w[13]; + w3[2] = w[14]; + w3[3] = w[15]; + } + + blake2s_hmac_init_64 (ctx, w0, w1, w2, w3); +} + +DECLSPEC void blake2s_hmac_init_global_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + if (len > 64) + { + blake2s_ctx_t tmp; + + blake2s_init (&tmp); + + blake2s_update_global_swap (&tmp, w, len); + + blake2s_final (&tmp); + + w0[0] = tmp.h[0]; + w0[1] = tmp.h[1]; + w0[2] = tmp.h[2]; + w0[3] = tmp.h[3]; + w1[0] = tmp.h[4]; + w1[1] = tmp.h[5]; + w1[2] = tmp.h[6]; + w1[3] = tmp.h[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + } + else + { + w0[0] = hc_swap32_S (w[ 0]); + w0[1] = hc_swap32_S (w[ 1]); + w0[2] = hc_swap32_S (w[ 2]); + w0[3] = hc_swap32_S (w[ 3]); + w1[0] = hc_swap32_S (w[ 4]); + w1[1] = hc_swap32_S (w[ 5]); + w1[2] = hc_swap32_S (w[ 6]); + w1[3] = hc_swap32_S (w[ 7]); + w2[0] = hc_swap32_S (w[ 8]); + w2[1] = hc_swap32_S (w[ 9]); + w2[2] = hc_swap32_S (w[10]); + w2[3] = hc_swap32_S (w[11]); + w3[0] = hc_swap32_S (w[12]); + w3[1] = hc_swap32_S (w[13]); + w3[2] = hc_swap32_S (w[14]); + w3[3] = hc_swap32_S (w[15]); + } + + blake2s_hmac_init_64 (ctx, w0, w1, w2, w3); +} + +DECLSPEC void blake2s_hmac_update_64 (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len) +{ + blake2s_update_64 (&ctx->ipad, w0, w1, w2, w3, len); +} + +DECLSPEC void blake2s_hmac_update (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + blake2s_update (&ctx->ipad, w, len); +} + +DECLSPEC void blake2s_hmac_update_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len) +{ + blake2s_update_swap (&ctx->ipad, w, len); +} + +DECLSPEC void blake2s_hmac_update_global (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + blake2s_update_global (&ctx->ipad, w, len); +} + +DECLSPEC void blake2s_hmac_update_global_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len) +{ + blake2s_update_global_swap (&ctx->ipad, w, len); +} + +DECLSPEC void blake2s_hmac_final (PRIVATE_AS blake2s_hmac_ctx_t *ctx) +{ + blake2s_final (&ctx->ipad); + + for (int n = 0; n < 8; n += 1) + { + blake2s_update(&ctx->opad, &ctx->ipad.h[n], 4); + } + + ctx->opad.m[8] = 0; + ctx->opad.m[9] = 0; + ctx->opad.m[10]= 0; + ctx->opad.m[11]= 0; + ctx->opad.m[12]= 0; + ctx->opad.m[13]= 0; + ctx->opad.m[14]= 0; + ctx->opad.m[15]= 0; + + blake2s_final (&ctx->opad); +} + DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0) { const u32x t0 = len; @@ -452,6 +960,7 @@ DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32 v[14] = BLAKE2S_IV_06 ^ f0; v[15] = BLAKE2S_IV_07; // ^ f1; + BLAKE2S_ROUND_VECTOR ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); BLAKE2S_ROUND_VECTOR (14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3); BLAKE2S_ROUND_VECTOR (11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4); @@ -700,3 +1209,152 @@ DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx) { blake2s_transform_vector (ctx->h, ctx->m, (u32x) ctx->len, BLAKE2S_FINAL); } + +DECLSPEC void blake2s_hmac_init_vector_64 (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3) +{ + u32x a0[4]; + u32x a1[4]; + u32x a2[4]; + u32x a3[4]; + + // ipad + + a0[0] = w0[0] ^ 0x36363636; + a0[1] = w0[1] ^ 0x36363636; + a0[2] = w0[2] ^ 0x36363636; + a0[3] = w0[3] ^ 0x36363636; + a1[0] = w1[0] ^ 0x36363636; + a1[1] = w1[1] ^ 0x36363636; + a1[2] = w1[2] ^ 0x36363636; + a1[3] = w1[3] ^ 0x36363636; + a2[0] = w2[0] ^ 0x36363636; + a2[1] = w2[1] ^ 0x36363636; + a2[2] = w2[2] ^ 0x36363636; + a2[3] = w2[3] ^ 0x36363636; + a3[0] = w3[0] ^ 0x36363636; + a3[1] = w3[1] ^ 0x36363636; + a3[2] = w3[2] ^ 0x36363636; + a3[3] = w3[3] ^ 0x36363636; + + blake2s_init_vector (&ctx->ipad); + + blake2s_update_vector_64 (&ctx->ipad, a0, a1, a2, a3, 64); + + // opad + + u32x b0[4]; + u32x b1[4]; + u32x b2[4]; + u32x b3[4]; + + b0[0] = w0[0] ^ 0x5c5c5c5c; + b0[1] = w0[1] ^ 0x5c5c5c5c; + b0[2] = w0[2] ^ 0x5c5c5c5c; + b0[3] = w0[3] ^ 0x5c5c5c5c; + b1[0] = w1[0] ^ 0x5c5c5c5c; + b1[1] = w1[1] ^ 0x5c5c5c5c; + b1[2] = w1[2] ^ 0x5c5c5c5c; + b1[3] = w1[3] ^ 0x5c5c5c5c; + b2[0] = w2[0] ^ 0x5c5c5c5c; + b2[1] = w2[1] ^ 0x5c5c5c5c; + b2[2] = w2[2] ^ 0x5c5c5c5c; + b2[3] = w2[3] ^ 0x5c5c5c5c; + b3[0] = w3[0] ^ 0x5c5c5c5c; + b3[1] = w3[1] ^ 0x5c5c5c5c; + b3[2] = w3[2] ^ 0x5c5c5c5c; + b3[3] = w3[3] ^ 0x5c5c5c5c; + + blake2s_init_vector (&ctx->opad); + + blake2s_update_vector_64 (&ctx->opad, b0, b1, b2, b3, 64); +} + + +DECLSPEC void blake2s_hmac_init_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) +{ + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + if (len > 64) + { + blake2s_ctx_vector_t tmp; + + blake2s_init_vector (&tmp); + + blake2s_update_vector (&tmp, w, len); + + blake2s_final_vector (&tmp); + + w0[0] = tmp.h[0]; + w0[1] = tmp.h[1]; + w0[2] = tmp.h[2]; + w0[3] = tmp.h[3]; + w1[0] = tmp.h[4]; + w1[1] = tmp.h[5]; + w1[2] = tmp.h[6]; + w1[3] = tmp.h[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + } + else + { + w0[0] = w[ 0]; + w0[1] = w[ 1]; + w0[2] = w[ 2]; + w0[3] = w[ 3]; + w1[0] = w[ 4]; + w1[1] = w[ 5]; + w1[2] = w[ 6]; + w1[3] = w[ 7]; + w2[0] = w[ 8]; + w2[1] = w[ 9]; + w2[2] = w[10]; + w2[3] = w[11]; + w3[0] = w[12]; + w3[1] = w[13]; + w3[2] = w[14]; + w3[3] = w[15]; + } + + blake2s_hmac_init_vector_64 (ctx, w0, w1, w2, w3); +} + +DECLSPEC void blake2s_hmac_update_vector_64 (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len) +{ + blake2s_update_vector_64 (&ctx->ipad, w0, w1, w2, w3, len); +} + +DECLSPEC void blake2s_hmac_update_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len) +{ + blake2s_update_vector (&ctx->ipad, w, len); +} + +DECLSPEC void blake2s_hmac_final_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx) +{ + + blake2s_final_vector (&ctx->ipad); + + for (int n = 0; n < 8; n += 1) + { + blake2s_update_vector(&ctx->opad, &ctx->ipad.h[n], 4); + } + + ctx->opad.m[8] = 0; + ctx->opad.m[9] = 0; + ctx->opad.m[10]= 0; + ctx->opad.m[11]= 0; + ctx->opad.m[12]= 0; + ctx->opad.m[13]= 0; + ctx->opad.m[14]= 0; + ctx->opad.m[15]= 0; + + blake2s_final_vector (&ctx->opad); +} diff --git a/OpenCL/inc_hash_blake2s.h b/OpenCL/inc_hash_blake2s.h index 63f2942f1..9a13a59c7 100644 --- a/OpenCL/inc_hash_blake2s.h +++ b/OpenCL/inc_hash_blake2s.h @@ -72,6 +72,14 @@ typedef struct blake2s_ctx } blake2s_ctx_t; +typedef struct blake2s_hmac_ctx +{ + blake2s_ctx_t ipad; + blake2s_ctx_t opad; + +} blake2s_hmac_ctx_t; + + typedef struct blake2s_ctx_vector { u32x m[16]; // buffer @@ -81,16 +89,45 @@ typedef struct blake2s_ctx_vector } blake2s_ctx_vector_t; +typedef struct blake2s_hmac_ctx_vector +{ + blake2s_ctx_vector_t ipad; + blake2s_ctx_vector_t opad; + +} blake2s_hmac_ctx_vector_t; + + + + DECLSPEC void blake2s_transform (PRIVATE_AS u32 *h, PRIVATE_AS const u32 *m, const int len, const u32 f0); DECLSPEC void blake2s_init (PRIVATE_AS blake2s_ctx_t *ctx); DECLSPEC void blake2s_update (PRIVATE_AS blake2s_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); DECLSPEC void blake2s_update_global (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_update_global_swap (PRIVATE_AS blake2s_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); DECLSPEC void blake2s_final (PRIVATE_AS blake2s_ctx_t *ctx); +DECLSPEC void blake2s_hmac_init_64 (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3); +DECLSPEC void blake2s_hmac_init (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_init_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_init_global (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_init_global_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_update_64 (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len); +DECLSPEC void blake2s_hmac_update (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_update_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_update_global (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_update_global_swap (PRIVATE_AS blake2s_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); +DECLSPEC void blake2s_hmac_final (PRIVATE_AS blake2s_hmac_ctx_t *ctx); + DECLSPEC void blake2s_transform_vector (PRIVATE_AS u32x *h, PRIVATE_AS const u32x *m, const u32x len, const u32 f0); DECLSPEC void blake2s_init_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx); DECLSPEC void blake2s_init_vector_from_scalar (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS blake2s_ctx_t *ctx0); DECLSPEC void blake2s_update_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); DECLSPEC void blake2s_final_vector (PRIVATE_AS blake2s_ctx_vector_t *ctx); +DECLSPEC void blake2s_hmac_init_vector_64 (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3); +DECLSPEC void blake2s_hmac_init_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); +DECLSPEC void blake2s_hmac_update_vector_64 (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len); +DECLSPEC void blake2s_hmac_update_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx, PRIVATE_AS const u32x *w, const int len); +DECLSPEC void blake2s_hmac_final_vector (PRIVATE_AS blake2s_hmac_ctx_vector_t *ctx); + #endif // INC_HASH_BLAKE2S_H diff --git a/OpenCL/inc_hash_scrypt.cl b/OpenCL/inc_hash_scrypt.cl new file mode 100644 index 000000000..45c054534 --- /dev/null +++ b/OpenCL/inc_hash_scrypt.cl @@ -0,0 +1,511 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "inc_vendor.h" +#include "inc_types.h" +#include "inc_platform.h" +#include "inc_common.h" +#include "inc_hash_scrypt.h" + +#if SCRYPT_R > 1 +DECLSPEC void scrypt_shuffle (PRIVATE_AS u32 *TI) +{ + u32 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = SALSA_CNT4; src_off < STATE_CNT4; dst_off += SALSA_CNT4, src_off += SALSA_CNT4 * 2) + { + for (int j = 0; j < SALSA_CNT4; j++) TT[dst_off + j] = TI[src_off + j]; + } + + for (int dst_off = SALSA_CNT4, src_off = SALSA_CNT4 * 2; src_off < STATE_CNT4; dst_off += SALSA_CNT4, src_off += SALSA_CNT4 * 2) + { + for (int j = 0; j < SALSA_CNT4; j++) TI[dst_off + j] = TI[src_off + j]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += SALSA_CNT4, src_off += SALSA_CNT4) + { + for (int j = 0; j < SALSA_CNT4; j++) TI[dst_off + j] = TT[src_off + j]; + } +} +#endif + +DECLSPEC void salsa_r (PRIVATE_AS u32 *TI) +{ + u32 TT[16]; + + for (int j = 0; j < SALSA_CNT4; j++) TT[j] = TI[STATE_CNT4 - 16 + j]; + + for (int i = 0; i < STATE_CNT4; i += SALSA_CNT4) + { + for (int j = 0; j < SALSA_CNT4; j++) TT[j] ^= TI[i + j]; + + for (int j = 0; j < SALSA_CNT4; j++) TI[i + j] = TT[j]; + + for (int r = 0; r < 4; r++) + { + u32 t0, t1, t2, t3; + + t0 = TT[ 0] + TT[12]; + t1 = TT[ 1] + TT[13]; + t2 = TT[ 2] + TT[14]; + t3 = TT[ 3] + TT[15]; + TT[ 4] ^= hc_rotl32_S (t0, 7); + TT[ 5] ^= hc_rotl32_S (t1, 7); + TT[ 6] ^= hc_rotl32_S (t2, 7); + TT[ 7] ^= hc_rotl32_S (t3, 7); + + t0 = TT[ 4] + TT[ 0]; + t1 = TT[ 5] + TT[ 1]; + t2 = TT[ 6] + TT[ 2]; + t3 = TT[ 7] + TT[ 3]; + TT[ 8] ^= hc_rotl32_S (t0, 9); + TT[ 9] ^= hc_rotl32_S (t1, 9); + TT[10] ^= hc_rotl32_S (t2, 9); + TT[11] ^= hc_rotl32_S (t3, 9); + + t0 = TT[ 8] + TT[ 4]; + t1 = TT[ 9] + TT[ 5]; + t2 = TT[10] + TT[ 6]; + t3 = TT[11] + TT[ 7]; + TT[12] ^= hc_rotl32_S (t0, 13); + TT[13] ^= hc_rotl32_S (t1, 13); + TT[14] ^= hc_rotl32_S (t2, 13); + TT[15] ^= hc_rotl32_S (t3, 13); + + t0 = TT[12] + TT[ 8]; + t1 = TT[13] + TT[ 9]; + t2 = TT[14] + TT[10]; + t3 = TT[15] + TT[11]; + TT[ 0] ^= hc_rotl32_S (t0, 18); + TT[ 1] ^= hc_rotl32_S (t1, 18); + TT[ 2] ^= hc_rotl32_S (t2, 18); + TT[ 3] ^= hc_rotl32_S (t3, 18); + + t0 = TT[ 4]; TT[ 4] = TT[ 7]; TT[ 7] = TT[ 6]; TT[ 6] = TT[ 5]; TT[ 5] = t0; + t0 = TT[ 8]; TT[ 8] = TT[10]; TT[10] = t0; + t0 = TT[ 9]; TT[ 9] = TT[11]; TT[11] = t0; + t0 = TT[12]; TT[12] = TT[13]; TT[13] = TT[14]; TT[14] = TT[15]; TT[15] = t0; + + t0 = TT[ 0] + TT[ 4]; + t1 = TT[ 1] + TT[ 5]; + t2 = TT[ 2] + TT[ 6]; + t3 = TT[ 3] + TT[ 7]; + TT[12] ^= hc_rotl32_S (t0, 7); + TT[13] ^= hc_rotl32_S (t1, 7); + TT[14] ^= hc_rotl32_S (t2, 7); + TT[15] ^= hc_rotl32_S (t3, 7); + + t0 = TT[12] + TT[ 0]; + t1 = TT[13] + TT[ 1]; + t2 = TT[14] + TT[ 2]; + t3 = TT[15] + TT[ 3]; + TT[ 8] ^= hc_rotl32_S (t0, 9); + TT[ 9] ^= hc_rotl32_S (t1, 9); + TT[10] ^= hc_rotl32_S (t2, 9); + TT[11] ^= hc_rotl32_S (t3, 9); + + t0 = TT[ 8] + TT[12]; + t1 = TT[ 9] + TT[13]; + t2 = TT[10] + TT[14]; + t3 = TT[11] + TT[15]; + TT[ 4] ^= hc_rotl32_S (t0, 13); + TT[ 5] ^= hc_rotl32_S (t1, 13); + TT[ 6] ^= hc_rotl32_S (t2, 13); + TT[ 7] ^= hc_rotl32_S (t3, 13); + + t0 = TT[ 4] + TT[ 8]; + t1 = TT[ 5] + TT[ 9]; + t2 = TT[ 6] + TT[10]; + t3 = TT[ 7] + TT[11]; + TT[ 0] ^= hc_rotl32_S (t0, 18); + TT[ 1] ^= hc_rotl32_S (t1, 18); + TT[ 2] ^= hc_rotl32_S (t2, 18); + TT[ 3] ^= hc_rotl32_S (t3, 18); + + t0 = TT[ 4]; TT[ 4] = TT[ 5]; TT[ 5] = TT[ 6]; TT[ 6] = TT[ 7]; TT[ 7] = t0; + t0 = TT[ 8]; TT[ 8] = TT[10]; TT[10] = t0; + t0 = TT[ 9]; TT[ 9] = TT[11]; TT[11] = t0; + t0 = TT[15]; TT[15] = TT[14]; TT[14] = TT[13]; TT[13] = TT[12]; TT[12] = t0; + } + + for (int j = 0; j < SALSA_CNT4; j++) TT[j] += TI[i + j]; + + for (int j = 0; j < SALSA_CNT4; j++) TI[i + j] = TT[j]; + } +} + +DECLSPEC void scrypt_smix_init (GLOBAL_AS u32 *P, PRIVATE_AS u32 *X, GLOBAL_AS void *V0, GLOBAL_AS void *V1, GLOBAL_AS void *V2, GLOBAL_AS void *V3, const u32 gid, const u32 lid, const u32 lsz, const u32 bid) +{ + const u32 ySIZE = SCRYPT_N >> SCRYPT_TMTO; + const u32 zSIZE = STATE_CNT44; + + const u32 xd4 = bid / 4; + const u32 xm4 = bid & 3; + + PRIVATE_AS uint4 *X4 = (PRIVATE_AS uint4 *) X; + + GLOBAL_AS uint4 *V; + + switch (xm4) + { + case 0: V = (GLOBAL_AS uint4 *) V0; break; + case 1: V = (GLOBAL_AS uint4 *) V1; break; + case 2: V = (GLOBAL_AS uint4 *) V2; break; + case 3: V = (GLOBAL_AS uint4 *) V3; break; + } + + GLOBAL_AS uint4 *Vx = V + (xd4 * lsz * ySIZE * zSIZE) + (lid * ySIZE * zSIZE); + + for (u32 i = 0; i < STATE_CNT4; i++) X[i] = P[i]; + + for (u32 y = 0; y < ySIZE; y++) + { + GLOBAL_AS uint4 *Vxx = Vx + (y * zSIZE); + + for (u32 z = 0; z < zSIZE; z++) *Vxx++ = X4[z]; + + for (u32 i = 0; i < (1 << SCRYPT_TMTO); i++) + { + salsa_r (X); + + #if SCRYPT_R > 1 + scrypt_shuffle (X); + #endif + } + } + + for (u32 i = 0; i < STATE_CNT4; i++) P[i] = X[i]; +} + +DECLSPEC void scrypt_smix_loop (GLOBAL_AS u32 *P, PRIVATE_AS u32 *X, PRIVATE_AS u32 *T, GLOBAL_AS void *V0, GLOBAL_AS void *V1, GLOBAL_AS void *V2, GLOBAL_AS void *V3, const u32 gid, const u32 lid, const u32 lsz, const u32 bid) +{ + const u32 ySIZE = SCRYPT_N >> SCRYPT_TMTO; + const u32 zSIZE = STATE_CNT44; + + const u32 xd4 = bid / 4; + const u32 xm4 = bid & 3; + + PRIVATE_AS uint4 *X4 = (PRIVATE_AS uint4 *) X; + PRIVATE_AS uint4 *T4 = (PRIVATE_AS uint4 *) T; + + GLOBAL_AS uint4 *V; + + switch (xm4) + { + case 0: V = (GLOBAL_AS uint4 *) V0; break; + case 1: V = (GLOBAL_AS uint4 *) V1; break; + case 2: V = (GLOBAL_AS uint4 *) V2; break; + case 3: V = (GLOBAL_AS uint4 *) V3; break; + } + + GLOBAL_AS uint4 *Vx = V + (xd4 * lsz * ySIZE * zSIZE) + (lid * ySIZE * zSIZE); + + for (u32 i = 0; i < STATE_CNT4; i++) X[i] = P[i]; + + // note: max 1024 iterations = forced -u 2048 + + const u32 N_max = (SCRYPT_N < 2048) ? SCRYPT_N : 2048; + + for (u32 N_pos = 0; N_pos < N_max; N_pos++) + { + const u32 k = X4[zSIZE - 4].x & (SCRYPT_N - 1); + + const u32 y = k >> SCRYPT_TMTO; + + const u32 km = k - (y << SCRYPT_TMTO); + + GLOBAL_AS uint4 *Vxx = Vx + (y * zSIZE); + + for (u32 z = 0; z < zSIZE; z++) T4[z] = *Vxx++; + + for (u32 i = 0; i < km; i++) + { + salsa_r (T); + + #if SCRYPT_R > 1 + scrypt_shuffle (T); + #endif + } + + for (u32 z = 0; z < zSIZE; z++) X4[z] = X4[z] ^ T4[z]; + + salsa_r (X); + + #if SCRYPT_R > 1 + scrypt_shuffle (X); + #endif + } + + for (u32 i = 0; i < STATE_CNT4; i++) P[i] = X[i]; +} + +DECLSPEC void scrypt_blockmix_in (GLOBAL_AS u32 *in_buf, GLOBAL_AS u32 *out_buf, const int out_len) +{ + for (int i = 0, j = 0; i < out_len; i += SALSA_SZ, j += SALSA_CNT4) + { + u32 X[SALSA_CNT4]; + + X[ 0] = in_buf[j + 0]; + X[ 1] = in_buf[j + 5]; + X[ 2] = in_buf[j + 10]; + X[ 3] = in_buf[j + 15]; + X[ 4] = in_buf[j + 4]; + X[ 5] = in_buf[j + 9]; + X[ 6] = in_buf[j + 14]; + X[ 7] = in_buf[j + 3]; + X[ 8] = in_buf[j + 8]; + X[ 9] = in_buf[j + 13]; + X[10] = in_buf[j + 2]; + X[11] = in_buf[j + 7]; + X[12] = in_buf[j + 12]; + X[13] = in_buf[j + 1]; + X[14] = in_buf[j + 6]; + X[15] = in_buf[j + 11]; + + out_buf[j + 0] = X[ 0]; + out_buf[j + 1] = X[ 1]; + out_buf[j + 2] = X[ 2]; + out_buf[j + 3] = X[ 3]; + out_buf[j + 4] = X[ 4]; + out_buf[j + 5] = X[ 5]; + out_buf[j + 6] = X[ 6]; + out_buf[j + 7] = X[ 7]; + out_buf[j + 8] = X[ 8]; + out_buf[j + 9] = X[ 9]; + out_buf[j + 10] = X[10]; + out_buf[j + 11] = X[11]; + out_buf[j + 12] = X[12]; + out_buf[j + 13] = X[13]; + out_buf[j + 14] = X[14]; + out_buf[j + 15] = X[15]; + } +} + +DECLSPEC void scrypt_blockmix_out (GLOBAL_AS u32 *in_buf, GLOBAL_AS u32 *out_buf, const int out_len) +{ + for (int i = 0, j = 0; i < out_len; i += SALSA_SZ, j += SALSA_CNT4) + { + u32 T[SALSA_CNT4]; + + T[ 0] = in_buf[j + 0]; + T[ 1] = in_buf[j + 13]; + T[ 2] = in_buf[j + 10]; + T[ 3] = in_buf[j + 7]; + T[ 4] = in_buf[j + 4]; + T[ 5] = in_buf[j + 1]; + T[ 6] = in_buf[j + 14]; + T[ 7] = in_buf[j + 11]; + T[ 8] = in_buf[j + 8]; + T[ 9] = in_buf[j + 5]; + T[10] = in_buf[j + 2]; + T[11] = in_buf[j + 15]; + T[12] = in_buf[j + 12]; + T[13] = in_buf[j + 9]; + T[14] = in_buf[j + 6]; + T[15] = in_buf[j + 3]; + + out_buf[j + 0] = T[ 0]; + out_buf[j + 1] = T[ 1]; + out_buf[j + 2] = T[ 2]; + out_buf[j + 3] = T[ 3]; + out_buf[j + 4] = T[ 4]; + out_buf[j + 5] = T[ 5]; + out_buf[j + 6] = T[ 6]; + out_buf[j + 7] = T[ 7]; + out_buf[j + 8] = T[ 8]; + out_buf[j + 9] = T[ 9]; + out_buf[j + 10] = T[10]; + out_buf[j + 11] = T[11]; + out_buf[j + 12] = T[12]; + out_buf[j + 13] = T[13]; + out_buf[j + 14] = T[14]; + out_buf[j + 15] = T[15]; + } +} + +DECLSPEC void scrypt_pbkdf2_body_pp (PRIVATE_AS sha256_hmac_ctx_t *sha256_hmac_ctx, PRIVATE_AS u32 *out_buf, const int out_len) +{ + for (int i = 0, j = 1, k = 0; i < out_len; i += 32, j += 1, k += 8) + { + sha256_hmac_ctx_t sha256_hmac_ctx2 = *sha256_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); + + sha256_hmac_final (&sha256_hmac_ctx2); + + // this will not work if user specifies output length not a multiple of 4 + // probably never happens... + // let's hope the compiler will auto optimize this since out_len is very likely + // a constant at caller level + + if (out_len >= (i + 4)) out_buf[k + 0] = hc_swap32_S (sha256_hmac_ctx2.opad.h[0]); + if (out_len >= (i + 8)) out_buf[k + 1] = hc_swap32_S (sha256_hmac_ctx2.opad.h[1]); + if (out_len >= (i + 12)) out_buf[k + 2] = hc_swap32_S (sha256_hmac_ctx2.opad.h[2]); + if (out_len >= (i + 16)) out_buf[k + 3] = hc_swap32_S (sha256_hmac_ctx2.opad.h[3]); + if (out_len >= (i + 20)) out_buf[k + 4] = hc_swap32_S (sha256_hmac_ctx2.opad.h[4]); + if (out_len >= (i + 24)) out_buf[k + 5] = hc_swap32_S (sha256_hmac_ctx2.opad.h[5]); + if (out_len >= (i + 28)) out_buf[k + 6] = hc_swap32_S (sha256_hmac_ctx2.opad.h[6]); + if (out_len >= (i + 32)) out_buf[k + 7] = hc_swap32_S (sha256_hmac_ctx2.opad.h[7]); + } +} + +DECLSPEC void scrypt_pbkdf2_body_pg (PRIVATE_AS sha256_hmac_ctx_t *sha256_hmac_ctx, GLOBAL_AS u32 *out_buf, const int out_len) +{ + for (int i = 0, j = 1, k = 0; i < out_len; i += 32, j += 1, k += 8) + { + sha256_hmac_ctx_t sha256_hmac_ctx2 = *sha256_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); + + sha256_hmac_final (&sha256_hmac_ctx2); + + // this will not work if user specifies output length not a multiple of 4 + // probably never happens... + // let's hope the compiler will auto optimize this since out_len is very likely + // a constant at caller level + + if (out_len >= (i + 4)) out_buf[k + 0] = hc_swap32_S (sha256_hmac_ctx2.opad.h[0]); + if (out_len >= (i + 8)) out_buf[k + 1] = hc_swap32_S (sha256_hmac_ctx2.opad.h[1]); + if (out_len >= (i + 12)) out_buf[k + 2] = hc_swap32_S (sha256_hmac_ctx2.opad.h[2]); + if (out_len >= (i + 16)) out_buf[k + 3] = hc_swap32_S (sha256_hmac_ctx2.opad.h[3]); + if (out_len >= (i + 20)) out_buf[k + 4] = hc_swap32_S (sha256_hmac_ctx2.opad.h[4]); + if (out_len >= (i + 24)) out_buf[k + 5] = hc_swap32_S (sha256_hmac_ctx2.opad.h[5]); + if (out_len >= (i + 28)) out_buf[k + 6] = hc_swap32_S (sha256_hmac_ctx2.opad.h[6]); + if (out_len >= (i + 32)) out_buf[k + 7] = hc_swap32_S (sha256_hmac_ctx2.opad.h[7]); + } +} + +DECLSPEC void scrypt_pbkdf2_ppp (PRIVATE_AS const u32 *pw_buf, const int pw_len, PRIVATE_AS const u32 *salt_buf, const int salt_len, PRIVATE_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pp (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_pgp (PRIVATE_AS const u32 *pw_buf, const int pw_len, GLOBAL_AS const u32 *salt_buf, const int salt_len, PRIVATE_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pp (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_gpp (GLOBAL_AS const u32 *pw_buf, const int pw_len, PRIVATE_AS const u32 *salt_buf, const int salt_len, PRIVATE_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pp (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_ggp (GLOBAL_AS const u32 *pw_buf, const int pw_len, GLOBAL_AS const u32 *salt_buf, const int salt_len, PRIVATE_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pp (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_ppg (PRIVATE_AS const u32 *pw_buf, const int pw_len, PRIVATE_AS const u32 *salt_buf, const int salt_len, GLOBAL_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pg (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_pgg (PRIVATE_AS const u32 *pw_buf, const int pw_len, GLOBAL_AS const u32 *salt_buf, const int salt_len, GLOBAL_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pg (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_gpg (GLOBAL_AS const u32 *pw_buf, const int pw_len, PRIVATE_AS const u32 *salt_buf, const int salt_len, GLOBAL_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pg (&sha256_hmac_ctx, out_buf, out_len); +} + +DECLSPEC void scrypt_pbkdf2_ggg (GLOBAL_AS const u32 *pw_buf, const int pw_len, GLOBAL_AS const u32 *salt_buf, const int salt_len, GLOBAL_AS u32 *out_buf, const int out_len) +{ + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_swap (&sha256_hmac_ctx, pw_buf, pw_len); + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_buf, salt_len); + + scrypt_pbkdf2_body_pg (&sha256_hmac_ctx, out_buf, out_len); +} + diff --git a/OpenCL/inc_hash_scrypt.h b/OpenCL/inc_hash_scrypt.h new file mode 100644 index 000000000..808661726 --- /dev/null +++ b/OpenCL/inc_hash_scrypt.h @@ -0,0 +1,57 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifndef INC_HASH_SCRYPT_H +#define INC_HASH_SCRYPT_H + +#define GET_SCRYPT_SZ(r,p) (128 * (r) * (p)) +#define GET_STATE_SZ(r) (128 * (r)) + +// _SZ is true sizes as bytes +#define SCRYPT_SZ GET_SCRYPT_SZ (SCRYPT_R, SCRYPT_P) +#define STATE_SZ GET_STATE_SZ (SCRYPT_R) + +// _CNT is size as whatever /X datatype +#define SCRYPT_CNT4 (SCRYPT_SZ / 4) +#define STATE_CNT4 (STATE_SZ / 4) + +// this would be uint4, feels more natural than 16 +#define SCRYPT_CNT44 ((SCRYPT_SZ / 4) / 4) +#define STATE_CNT44 ((STATE_SZ / 4) / 4) + +#define SALSA_SZ 64 +#define SALSA_CNT4 (SALSA_SZ / 4) +#define SALSA_CNT44 ((SALSA_SZ / 4) / 4) + +//#define VIDX(bid4,lsz,lid,ySIZE,zSIZE,y,z) (((bid4) * (lsz) * (ySIZE) * (zSIZE)) + ((lid) * (ySIZE) * (zSIZE)) + ((y) * (zSIZE)) + (z)) + +#if defined IS_CUDA + +DECLSPEC uint4 operator ^ (const uint4 a, const uint4 b) +{ + uint4 r; + + r.x = a.x ^ b.x; + r.y = a.y ^ b.y; + r.z = a.z ^ b.z; + r.w = a.w ^ b.w; + + return r; +} + +#endif + +typedef struct +{ + #ifndef SCRYPT_TMP_ELEM + #define SCRYPT_TMP_ELEM 1 + #endif + + u32 in[SCRYPT_TMP_ELEM / 2]; + u32 out[SCRYPT_TMP_ELEM / 2]; + +} scrypt_tmp_t; + +#endif diff --git a/OpenCL/inc_platform.cl b/OpenCL/inc_platform.cl index 06ba76553..9af10e9ba 100644 --- a/OpenCL/inc_platform.cl +++ b/OpenCL/inc_platform.cl @@ -104,6 +104,11 @@ DECLSPEC u32 hc_atomic_or (GLOBAL_AS u32 *p, volatile const u32 val) return atomicOr (p, val); } +DECLSPEC size_t get_group_id (const u32 dimindx __attribute__((unused))) +{ + return blockIdx.x; +} + DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused))) { return (blockIdx.x * blockDim.x) + threadIdx.x; @@ -122,37 +127,129 @@ DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused))) DECLSPEC u32x rotl32 (const u32x a, const int n) { - return ((a << n) | ((a >> (32 - n)))); + #if VECT_SIZE == 1 + + return rotl32_S (a, n); + + #else + + u32x t = 0; + + #if VECT_SIZE >= 2 + t.s0 = rotl32_S (a.s0, n); + t.s1 = rotl32_S (a.s1, n); + #endif + + #if VECT_SIZE >= 4 + t.s2 = rotl32_S (a.s2, n); + t.s3 = rotl32_S (a.s3, n); + #endif + + #if VECT_SIZE >= 8 + t.s4 = rotl32_S (a.s4, n); + t.s5 = rotl32_S (a.s5, n); + t.s6 = rotl32_S (a.s6, n); + t.s7 = rotl32_S (a.s7, n); + #endif + + #if VECT_SIZE >= 16 + t.s8 = rotl32_S (a.s8, n); + t.s9 = rotl32_S (a.s9, n); + t.sa = rotl32_S (a.sa, n); + t.sb = rotl32_S (a.sb, n); + t.sc = rotl32_S (a.sc, n); + t.sd = rotl32_S (a.sd, n); + t.se = rotl32_S (a.se, n); + t.sf = rotl32_S (a.sf, n); + #endif + + return t; + + #endif } DECLSPEC u32x rotr32 (const u32x a, const int n) { - return ((a >> n) | ((a << (32 - n)))); + #if VECT_SIZE == 1 + + return rotr32_S (a, n); + + #else + + u32x t = 0; + + #if VECT_SIZE >= 2 + t.s0 = rotr32_S (a.s0, n); + t.s1 = rotr32_S (a.s1, n); + #endif + + #if VECT_SIZE >= 4 + t.s2 = rotr32_S (a.s2, n); + t.s3 = rotr32_S (a.s3, n); + #endif + + #if VECT_SIZE >= 8 + t.s4 = rotr32_S (a.s4, n); + t.s5 = rotr32_S (a.s5, n); + t.s6 = rotr32_S (a.s6, n); + t.s7 = rotr32_S (a.s7, n); + #endif + + #if VECT_SIZE >= 16 + t.s8 = rotr32_S (a.s8, n); + t.s9 = rotr32_S (a.s9, n); + t.sa = rotr32_S (a.sa, n); + t.sb = rotr32_S (a.sb, n); + t.sc = rotr32_S (a.sc, n); + t.sd = rotr32_S (a.sd, n); + t.se = rotr32_S (a.se, n); + t.sf = rotr32_S (a.sf, n); + #endif + + return t; + + #endif } DECLSPEC u32 rotl32_S (const u32 a, const int n) { + #ifdef USE_FUNNELSHIFT + return __funnelshift_l (a, a, n); + #else return ((a << n) | ((a >> (32 - n)))); + #endif } DECLSPEC u32 rotr32_S (const u32 a, const int n) { + #ifdef USE_FUNNELSHIFT + return __funnelshift_r (a, a, n); + #else return ((a >> n) | ((a << (32 - n)))); + #endif } DECLSPEC u64x rotl64 (const u64x a, const int n) { + #if VECT_SIZE == 1 + return rotl64_S (a, n); + #else return ((a << n) | ((a >> (64 - n)))); + #endif } DECLSPEC u64x rotr64 (const u64x a, const int n) { + #if VECT_SIZE == 1 + return rotr64_S (a, n); + #else return ((a >> n) | ((a << (64 - n)))); + #endif } DECLSPEC u64 rotl64_S (const u64 a, const int n) { - return ((a << n) | ((a >> (64 - n)))); + return rotr64_S (a, 64 - n); } DECLSPEC u64 rotr64_S (const u64 a, const int n) @@ -208,6 +305,11 @@ DECLSPEC u32 hc_atomic_or (GLOBAL_AS u32 *p, volatile const u32 val) return atomicOr (p, val); } +DECLSPEC size_t get_group_id (const u32 dimindx __attribute__((unused))) +{ + return blockIdx.x; +} + DECLSPEC size_t get_global_id (const u32 dimindx __attribute__((unused))) { return (blockIdx.x * blockDim.x) + threadIdx.x; @@ -226,36 +328,115 @@ DECLSPEC size_t get_local_size (const u32 dimindx __attribute__((unused))) DECLSPEC u32x rotl32 (const u32x a, const int n) { - return ((a << n) | ((a >> (32 - n)))); + #if VECT_SIZE == 1 + + return rotl32_S (a, n); + + #else + + u32x t = 0; + + #if VECT_SIZE >= 2 + t.s0 = rotl32_S (a.s0, n); + t.s1 = rotl32_S (a.s1, n); + #endif + + #if VECT_SIZE >= 4 + t.s2 = rotl32_S (a.s2, n); + t.s3 = rotl32_S (a.s3, n); + #endif + + #if VECT_SIZE >= 8 + t.s4 = rotl32_S (a.s4, n); + t.s5 = rotl32_S (a.s5, n); + t.s6 = rotl32_S (a.s6, n); + t.s7 = rotl32_S (a.s7, n); + #endif + + #if VECT_SIZE >= 16 + t.s8 = rotl32_S (a.s8, n); + t.s9 = rotl32_S (a.s9, n); + t.sa = rotl32_S (a.sa, n); + t.sb = rotl32_S (a.sb, n); + t.sc = rotl32_S (a.sc, n); + t.sd = rotl32_S (a.sd, n); + t.se = rotl32_S (a.se, n); + t.sf = rotl32_S (a.sf, n); + #endif + + return t; + + #endif } DECLSPEC u32x rotr32 (const u32x a, const int n) { - return ((a >> n) | ((a << (32 - n)))); + #if VECT_SIZE == 1 + + return rotr32_S (a, n); + + #else + + u32x t = 0; + + #if VECT_SIZE >= 2 + t.s0 = rotr32_S (a.s0, n); + t.s1 = rotr32_S (a.s1, n); + #endif + + #if VECT_SIZE >= 4 + t.s2 = rotr32_S (a.s2, n); + t.s3 = rotr32_S (a.s3, n); + #endif + + #if VECT_SIZE >= 8 + t.s4 = rotr32_S (a.s4, n); + t.s5 = rotr32_S (a.s5, n); + t.s6 = rotr32_S (a.s6, n); + t.s7 = rotr32_S (a.s7, n); + #endif + + #if VECT_SIZE >= 16 + t.s8 = rotr32_S (a.s8, n); + t.s9 = rotr32_S (a.s9, n); + t.sa = rotr32_S (a.sa, n); + t.sb = rotr32_S (a.sb, n); + t.sc = rotr32_S (a.sc, n); + t.sd = rotr32_S (a.sd, n); + t.se = rotr32_S (a.se, n); + t.sf = rotr32_S (a.sf, n); + #endif + + return t; + + #endif } DECLSPEC u32 rotl32_S (const u32 a, const int n) { + #ifdef USE_FUNNELSHIFT + return __funnelshift_l (a, a, n); + #else return ((a << n) | ((a >> (32 - n)))); + #endif } DECLSPEC u32 rotr32_S (const u32 a, const int n) { + #ifdef USE_FUNNELSHIFT + return __funnelshift_r (a, a, n); + #else return ((a >> n) | ((a << (32 - n)))); + #endif } DECLSPEC u64x rotl64 (const u64x a, const int n) { - return rotr64 (a, 64 - n); -} - -DECLSPEC u32 amd_bitalign_S (const u32 a, const u32 b, const int n) -{ - u32 r = 0; - - __asm__ ("V_ALIGNBIT_B32 %0, %1, %2, %3;" : "=v"(r): "v"(a), "v"(b), "I"(n)); - - return r; + #if VECT_SIZE == 1 + return rotl64_S (a, n); + #else + return ((a << n) | ((a >> (64 - n)))); + #endif } DECLSPEC u64x rotr64 (const u64x a, const int n) @@ -274,6 +455,7 @@ DECLSPEC u64 rotl64_S (const u64 a, const int n) DECLSPEC u64 rotr64_S (const u64 a, const int n) { + #ifdef USE_FUNNELSHIFT vconv64_t in; in.v64 = a; @@ -285,16 +467,19 @@ DECLSPEC u64 rotr64_S (const u64 a, const int n) if (n < 32) { - out.v32.a = amd_bitalign_S (a1, a0, n); - out.v32.b = amd_bitalign_S (a0, a1, n); + out.v32.a = __funnelshift_r (a0, a1, n); + out.v32.b = __funnelshift_r (a1, a0, n); } else { - out.v32.a = amd_bitalign_S (a0, a1, n - 32); - out.v32.b = amd_bitalign_S (a1, a0, n - 32); + out.v32.a = __funnelshift_r (a1, a0, n - 32); + out.v32.b = __funnelshift_r (a0, a1, n - 32); } return out.v64; + #else + return ((a >> n) | ((a << (64 - n)))); + #endif } #define FIXED_THREAD_COUNT(n) __launch_bounds__((n), 0) diff --git a/OpenCL/inc_platform.h b/OpenCL/inc_platform.h index 1e7805290..cc6489afe 100644 --- a/OpenCL/inc_platform.h +++ b/OpenCL/inc_platform.h @@ -74,6 +74,7 @@ DECLSPEC u32 hc_atomic_or (volatile GLOBAL_AS u32 *p, volatile const u32 val); #define get_global_id(param) hc_gid #define get_local_id(param) hc_lid #define get_local_size(param) hc_lsz +#define get_group_id(param) hc_bid DECLSPEC u32x rotl32 (const u32x a, const int n); DECLSPEC u32x rotr32 (const u32x a, const int n); diff --git a/OpenCL/inc_vendor.h b/OpenCL/inc_vendor.h index 52ef8188d..a52b4c899 100644 --- a/OpenCL/inc_vendor.h +++ b/OpenCL/inc_vendor.h @@ -66,6 +66,12 @@ using namespace metal; #define KERNEL_FQ __kernel #endif +#if defined FIXED_LOCAL_SIZE +#define KERNEL_FA FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) +#else +#define KERNEL_FA +#endif + #ifndef MAYBE_UNUSED #define MAYBE_UNUSED #endif @@ -150,8 +156,10 @@ using namespace metal; #if defined IS_AMD && defined IS_GPU #define DECLSPEC HC_INLINE +#elif defined IS_CUDA +#define DECLSPEC __device__ #elif defined IS_HIP -#define DECLSPEC __device__ HC_INLINE +#define DECLSPEC __device__ #else #define DECLSPEC #endif @@ -175,11 +183,13 @@ using namespace metal; #ifdef IS_CUDA #define USE_BITSELECT #define USE_ROTATE +#define USE_FUNNELSHIFT #endif #ifdef IS_HIP #define USE_BITSELECT #define USE_ROTATE +#define USE_FUNNELSHIFT #endif #ifdef IS_ROCM @@ -210,4 +220,9 @@ using namespace metal; #define s3 w #endif +// some algorithms do not like this, eg 150, 1100, ... +#ifdef NO_FUNNELSHIFT +#undef USE_FUNNELSHIFT +#endif + #endif // INC_VENDOR_H diff --git a/OpenCL/m00000_a0-optimized.cl b/OpenCL/m00000_a0-optimized.cl index 366f74bfa..ba6dae580 100644 --- a/OpenCL/m00000_a0-optimized.cl +++ b/OpenCL/m00000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -143,15 +143,15 @@ KERNEL_FQ void m00000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -293,10 +293,10 @@ KERNEL_FQ void m00000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00000_a0-pure.cl b/OpenCL/m00000_a0-pure.cl index 0dafc0653..283aaeead 100644 --- a/OpenCL/m00000_a0-pure.cl +++ b/OpenCL/m00000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m00000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00000_a1-optimized.cl b/OpenCL/m00000_a1-optimized.cl index 17cf06a79..3cf9851c0 100644 --- a/OpenCL/m00000_a1-optimized.cl +++ b/OpenCL/m00000_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -201,15 +201,15 @@ KERNEL_FQ void m00000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -410,10 +410,10 @@ KERNEL_FQ void m00000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00000_a1-pure.cl b/OpenCL/m00000_a1-pure.cl index 9d7dfded8..16bffa5fe 100644 --- a/OpenCL/m00000_a1-pure.cl +++ b/OpenCL/m00000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m00000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00000_a3-optimized.cl b/OpenCL/m00000_a3-optimized.cl index bbe35c2c5..4b22bd0c9 100644 --- a/OpenCL/m00000_a3-optimized.cl +++ b/OpenCL/m00000_a3-optimized.cl @@ -423,7 +423,7 @@ DECLSPEC void m00000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -463,7 +463,7 @@ KERNEL_FQ void m00000_m04 (KERN_ATTR_VECTOR ()) m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m00000_m08 (KERN_ATTR_VECTOR ()) m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -543,7 +543,7 @@ KERNEL_FQ void m00000_m16 (KERN_ATTR_VECTOR ()) m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -583,7 +583,7 @@ KERNEL_FQ void m00000_s04 (KERN_ATTR_VECTOR ()) m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -623,7 +623,7 @@ KERNEL_FQ void m00000_s08 (KERN_ATTR_VECTOR ()) m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00000_a3-pure.cl b/OpenCL/m00000_a3-pure.cl index aae28aa7f..e05d4d292 100644 --- a/OpenCL/m00000_a3-pure.cl +++ b/OpenCL/m00000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00010_a0-optimized.cl b/OpenCL/m00010_a0-optimized.cl index 30c3311e1..5bb64a831 100644 --- a/OpenCL/m00010_a0-optimized.cl +++ b/OpenCL/m00010_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00010_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -217,15 +217,15 @@ KERNEL_FQ void m00010_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00010_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00010_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00010_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -441,10 +441,10 @@ KERNEL_FQ void m00010_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00010_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00010_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00010_a0-pure.cl b/OpenCL/m00010_a0-pure.cl index cbbcd203e..0b9a8472c 100644 --- a/OpenCL/m00010_a0-pure.cl +++ b/OpenCL/m00010_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00010_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00010_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00010_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00010_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00010_a1-optimized.cl b/OpenCL/m00010_a1-optimized.cl index c707d50ce..2d2fdfc82 100644 --- a/OpenCL/m00010_a1-optimized.cl +++ b/OpenCL/m00010_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00010_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -275,15 +275,15 @@ KERNEL_FQ void m00010_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00010_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00010_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00010_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -559,10 +559,10 @@ KERNEL_FQ void m00010_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00010_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00010_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00010_a1-pure.cl b/OpenCL/m00010_a1-pure.cl index 0fdf5de48..7ef618342 100644 --- a/OpenCL/m00010_a1-pure.cl +++ b/OpenCL/m00010_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00010_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m00010_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00010_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00010_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00010_a3-optimized.cl b/OpenCL/m00010_a3-optimized.cl index 84ddc589c..1cad7a5dd 100644 --- a/OpenCL/m00010_a3-optimized.cl +++ b/OpenCL/m00010_a3-optimized.cl @@ -472,7 +472,7 @@ DECLSPEC void m00010s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00010_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -512,7 +512,7 @@ KERNEL_FQ void m00010_m04 (KERN_ATTR_VECTOR ()) m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00010_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m00010_m08 (KERN_ATTR_VECTOR ()) m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00010_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -592,7 +592,7 @@ KERNEL_FQ void m00010_m16 (KERN_ATTR_VECTOR ()) m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00010_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -632,7 +632,7 @@ KERNEL_FQ void m00010_s04 (KERN_ATTR_VECTOR ()) m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00010_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -672,7 +672,7 @@ KERNEL_FQ void m00010_s08 (KERN_ATTR_VECTOR ()) m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00010_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00010_a3-pure.cl b/OpenCL/m00010_a3-pure.cl index fdc18f513..e7f149e4c 100644 --- a/OpenCL/m00010_a3-pure.cl +++ b/OpenCL/m00010_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00010_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m00010_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00010_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00010_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00020_a0-optimized.cl b/OpenCL/m00020_a0-optimized.cl index 6bf430fba..d0947fc7a 100644 --- a/OpenCL/m00020_a0-optimized.cl +++ b/OpenCL/m00020_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00020_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -197,15 +197,15 @@ KERNEL_FQ void m00020_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00020_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00020_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00020_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -401,10 +401,10 @@ KERNEL_FQ void m00020_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00020_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00020_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00020_a0-pure.cl b/OpenCL/m00020_a0-pure.cl index c0721a27b..1e2cb8614 100644 --- a/OpenCL/m00020_a0-pure.cl +++ b/OpenCL/m00020_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00020_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m00020_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00020_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00020_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00020_a1-optimized.cl b/OpenCL/m00020_a1-optimized.cl index 64ca7e34c..8a73ef7f9 100644 --- a/OpenCL/m00020_a1-optimized.cl +++ b/OpenCL/m00020_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00020_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -253,15 +253,15 @@ KERNEL_FQ void m00020_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00020_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00020_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00020_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -515,10 +515,10 @@ KERNEL_FQ void m00020_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00020_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00020_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00020_a1-pure.cl b/OpenCL/m00020_a1-pure.cl index accb063cb..4da56b6a3 100644 --- a/OpenCL/m00020_a1-pure.cl +++ b/OpenCL/m00020_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00020_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m00020_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00020_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00020_a3-optimized.cl b/OpenCL/m00020_a3-optimized.cl index adb7076f4..428ae4221 100644 --- a/OpenCL/m00020_a3-optimized.cl +++ b/OpenCL/m00020_a3-optimized.cl @@ -373,7 +373,7 @@ DECLSPEC void m00020s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00020_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -422,7 +422,7 @@ KERNEL_FQ void m00020_m04 (KERN_ATTR_BASIC ()) m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00020_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -471,7 +471,7 @@ KERNEL_FQ void m00020_m08 (KERN_ATTR_BASIC ()) m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00020_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -520,7 +520,7 @@ KERNEL_FQ void m00020_m16 (KERN_ATTR_BASIC ()) m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00020_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -569,7 +569,7 @@ KERNEL_FQ void m00020_s04 (KERN_ATTR_BASIC ()) m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00020_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -618,7 +618,7 @@ KERNEL_FQ void m00020_s08 (KERN_ATTR_BASIC ()) m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00020_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00020_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00020_a3-pure.cl b/OpenCL/m00020_a3-pure.cl index db1bb450c..b7083fa9a 100644 --- a/OpenCL/m00020_a3-pure.cl +++ b/OpenCL/m00020_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00020_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00020_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m00020_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00020_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00020_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00030_a0-optimized.cl b/OpenCL/m00030_a0-optimized.cl index 10f0e1c4e..9704afb47 100644 --- a/OpenCL/m00030_a0-optimized.cl +++ b/OpenCL/m00030_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00030_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -222,15 +222,15 @@ KERNEL_FQ void m00030_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00030_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00030_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00030_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -451,10 +451,10 @@ KERNEL_FQ void m00030_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00030_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00030_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00030_a0-pure.cl b/OpenCL/m00030_a0-pure.cl index faee2c23b..445fff4ec 100644 --- a/OpenCL/m00030_a0-pure.cl +++ b/OpenCL/m00030_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00030_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00030_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00030_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00030_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00030_a1-optimized.cl b/OpenCL/m00030_a1-optimized.cl index 1d84bc0e7..b00a2e21d 100644 --- a/OpenCL/m00030_a1-optimized.cl +++ b/OpenCL/m00030_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00030_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -280,15 +280,15 @@ KERNEL_FQ void m00030_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00030_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00030_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00030_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -569,10 +569,10 @@ KERNEL_FQ void m00030_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00030_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00030_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00030_a1-pure.cl b/OpenCL/m00030_a1-pure.cl index 7ecbe7a95..8ea89c339 100644 --- a/OpenCL/m00030_a1-pure.cl +++ b/OpenCL/m00030_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00030_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m00030_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00030_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00030_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00030_a3-optimized.cl b/OpenCL/m00030_a3-optimized.cl index fe11425bb..d8dd49c9d 100644 --- a/OpenCL/m00030_a3-optimized.cl +++ b/OpenCL/m00030_a3-optimized.cl @@ -472,7 +472,7 @@ DECLSPEC void m00030s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00030_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -512,7 +512,7 @@ KERNEL_FQ void m00030_m04 (KERN_ATTR_VECTOR ()) m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00030_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m00030_m08 (KERN_ATTR_VECTOR ()) m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00030_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -592,7 +592,7 @@ KERNEL_FQ void m00030_m16 (KERN_ATTR_VECTOR ()) m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00030_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -632,7 +632,7 @@ KERNEL_FQ void m00030_s04 (KERN_ATTR_VECTOR ()) m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00030_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -672,7 +672,7 @@ KERNEL_FQ void m00030_s08 (KERN_ATTR_VECTOR ()) m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00030_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00030_a3-pure.cl b/OpenCL/m00030_a3-pure.cl index 6fd205531..79e2f9058 100644 --- a/OpenCL/m00030_a3-pure.cl +++ b/OpenCL/m00030_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00030_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -96,7 +96,7 @@ KERNEL_FQ void m00030_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00030_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00030_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00040_a0-optimized.cl b/OpenCL/m00040_a0-optimized.cl index 1282eba47..01c2ae417 100644 --- a/OpenCL/m00040_a0-optimized.cl +++ b/OpenCL/m00040_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00040_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -202,15 +202,15 @@ KERNEL_FQ void m00040_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00040_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00040_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00040_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -411,10 +411,10 @@ KERNEL_FQ void m00040_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00040_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00040_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00040_a0-pure.cl b/OpenCL/m00040_a0-pure.cl index 66d556c43..7e58eca6e 100644 --- a/OpenCL/m00040_a0-pure.cl +++ b/OpenCL/m00040_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00040_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m00040_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00040_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00040_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00040_a1-optimized.cl b/OpenCL/m00040_a1-optimized.cl index 6e29d87cd..7c2aa5095 100644 --- a/OpenCL/m00040_a1-optimized.cl +++ b/OpenCL/m00040_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00040_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -258,15 +258,15 @@ KERNEL_FQ void m00040_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00040_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00040_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00040_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -525,10 +525,10 @@ KERNEL_FQ void m00040_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00040_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00040_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00040_a1-pure.cl b/OpenCL/m00040_a1-pure.cl index 488b183eb..97be5b283 100644 --- a/OpenCL/m00040_a1-pure.cl +++ b/OpenCL/m00040_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00040_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m00040_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00040_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00040_a3-optimized.cl b/OpenCL/m00040_a3-optimized.cl index cf87f67d3..43316408a 100644 --- a/OpenCL/m00040_a3-optimized.cl +++ b/OpenCL/m00040_a3-optimized.cl @@ -373,7 +373,7 @@ DECLSPEC void m00040s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00040_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -422,7 +422,7 @@ KERNEL_FQ void m00040_m04 (KERN_ATTR_BASIC ()) m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00040_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -471,7 +471,7 @@ KERNEL_FQ void m00040_m08 (KERN_ATTR_BASIC ()) m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00040_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -520,7 +520,7 @@ KERNEL_FQ void m00040_m16 (KERN_ATTR_BASIC ()) m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00040_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -569,7 +569,7 @@ KERNEL_FQ void m00040_s04 (KERN_ATTR_BASIC ()) m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00040_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -618,7 +618,7 @@ KERNEL_FQ void m00040_s08 (KERN_ATTR_BASIC ()) m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00040_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00040_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00040_a3-pure.cl b/OpenCL/m00040_a3-pure.cl index 6dd3f5cd2..5a7738356 100644 --- a/OpenCL/m00040_a3-pure.cl +++ b/OpenCL/m00040_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00040_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00040_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -87,7 +87,7 @@ KERNEL_FQ void m00040_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00040_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00040_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00050_a0-optimized.cl b/OpenCL/m00050_a0-optimized.cl index 398e4d90a..509d31df4 100644 --- a/OpenCL/m00050_a0-optimized.cl +++ b/OpenCL/m00050_a0-optimized.cl @@ -101,7 +101,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00050_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -206,15 +206,15 @@ KERNEL_FQ void m00050_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00050_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00050_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00050_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -331,10 +331,10 @@ KERNEL_FQ void m00050_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00050_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00050_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00050_a0-pure.cl b/OpenCL/m00050_a0-pure.cl index 2a5d3f089..bb5c811a9 100644 --- a/OpenCL/m00050_a0-pure.cl +++ b/OpenCL/m00050_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00050_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00050_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00050_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00050_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00050_a1-optimized.cl b/OpenCL/m00050_a1-optimized.cl index 1067f8cc1..7413dd42e 100644 --- a/OpenCL/m00050_a1-optimized.cl +++ b/OpenCL/m00050_a1-optimized.cl @@ -99,7 +99,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00050_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -264,15 +264,15 @@ KERNEL_FQ void m00050_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00050_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00050_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00050_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -449,10 +449,10 @@ KERNEL_FQ void m00050_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00050_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00050_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00050_a1-pure.cl b/OpenCL/m00050_a1-pure.cl index 9de09b4bd..f971bdff6 100644 --- a/OpenCL/m00050_a1-pure.cl +++ b/OpenCL/m00050_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00050_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m00050_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00050_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00050_a3-optimized.cl b/OpenCL/m00050_a3-optimized.cl index 0ea68753c..eacd34b81 100644 --- a/OpenCL/m00050_a3-optimized.cl +++ b/OpenCL/m00050_a3-optimized.cl @@ -315,7 +315,7 @@ DECLSPEC void m00050s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00050_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -364,7 +364,7 @@ KERNEL_FQ void m00050_m04 (KERN_ATTR_BASIC ()) m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00050_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -413,7 +413,7 @@ KERNEL_FQ void m00050_m08 (KERN_ATTR_BASIC ()) m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00050_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -462,7 +462,7 @@ KERNEL_FQ void m00050_m16 (KERN_ATTR_BASIC ()) m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00050_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -511,7 +511,7 @@ KERNEL_FQ void m00050_s04 (KERN_ATTR_BASIC ()) m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00050_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -560,7 +560,7 @@ KERNEL_FQ void m00050_s08 (KERN_ATTR_BASIC ()) m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00050_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00050_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00050_a3-pure.cl b/OpenCL/m00050_a3-pure.cl index 9b118a8b5..7b0347976 100644 --- a/OpenCL/m00050_a3-pure.cl +++ b/OpenCL/m00050_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00050_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00050_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m00050_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00050_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00050_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00060_a0-optimized.cl b/OpenCL/m00060_a0-optimized.cl index 578bb7297..35a377d6b 100644 --- a/OpenCL/m00060_a0-optimized.cl +++ b/OpenCL/m00060_a0-optimized.cl @@ -101,7 +101,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00060_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -228,15 +228,15 @@ KERNEL_FQ void m00060_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00060_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00060_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00060_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -375,10 +375,10 @@ KERNEL_FQ void m00060_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00060_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00060_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00060_a0-pure.cl b/OpenCL/m00060_a0-pure.cl index ddfe80a7a..e625e900d 100644 --- a/OpenCL/m00060_a0-pure.cl +++ b/OpenCL/m00060_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00060_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00060_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00060_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00060_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00060_a1-optimized.cl b/OpenCL/m00060_a1-optimized.cl index 8d41540d1..053efe581 100644 --- a/OpenCL/m00060_a1-optimized.cl +++ b/OpenCL/m00060_a1-optimized.cl @@ -99,7 +99,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00060_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -267,15 +267,15 @@ KERNEL_FQ void m00060_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00060_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00060_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00060_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -455,10 +455,10 @@ KERNEL_FQ void m00060_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00060_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00060_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00060_a1-pure.cl b/OpenCL/m00060_a1-pure.cl index 2341e99a9..2da99ce5b 100644 --- a/OpenCL/m00060_a1-pure.cl +++ b/OpenCL/m00060_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00060_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -94,7 +94,7 @@ KERNEL_FQ void m00060_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00060_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00060_a3-optimized.cl b/OpenCL/m00060_a3-optimized.cl index e829b6eb9..70cc97da0 100644 --- a/OpenCL/m00060_a3-optimized.cl +++ b/OpenCL/m00060_a3-optimized.cl @@ -311,7 +311,7 @@ DECLSPEC void m00060s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00060_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -360,7 +360,7 @@ KERNEL_FQ void m00060_m04 (KERN_ATTR_BASIC ()) m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00060_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -409,7 +409,7 @@ KERNEL_FQ void m00060_m08 (KERN_ATTR_BASIC ()) m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00060_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -458,7 +458,7 @@ KERNEL_FQ void m00060_m16 (KERN_ATTR_BASIC ()) m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00060_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m00060_s04 (KERN_ATTR_BASIC ()) m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00060_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -556,7 +556,7 @@ KERNEL_FQ void m00060_s08 (KERN_ATTR_BASIC ()) m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00060_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00060_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00060_a3-pure.cl b/OpenCL/m00060_a3-pure.cl index 9e9f7aa8b..ef34c2124 100644 --- a/OpenCL/m00060_a3-pure.cl +++ b/OpenCL/m00060_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00060_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00060_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m00060_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00060_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00060_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00070_a0-optimized.cl b/OpenCL/m00070_a0-optimized.cl index d866de9ec..870cb50b9 100644 --- a/OpenCL/m00070_a0-optimized.cl +++ b/OpenCL/m00070_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00070_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -152,15 +152,15 @@ KERNEL_FQ void m00070_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00070_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00070_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00070_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -311,10 +311,10 @@ KERNEL_FQ void m00070_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00070_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00070_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00070_a0-pure.cl b/OpenCL/m00070_a0-pure.cl index 0a0c2e6de..a57981059 100644 --- a/OpenCL/m00070_a0-pure.cl +++ b/OpenCL/m00070_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00070_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m00070_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00070_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00070_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00070_a1-optimized.cl b/OpenCL/m00070_a1-optimized.cl index 4376a0f12..0a916e5ed 100644 --- a/OpenCL/m00070_a1-optimized.cl +++ b/OpenCL/m00070_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00070_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -210,15 +210,15 @@ KERNEL_FQ void m00070_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00070_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00070_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00070_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -429,10 +429,10 @@ KERNEL_FQ void m00070_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00070_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00070_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00070_a1-pure.cl b/OpenCL/m00070_a1-pure.cl index f35be6a39..dd6e3e51f 100644 --- a/OpenCL/m00070_a1-pure.cl +++ b/OpenCL/m00070_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00070_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m00070_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00070_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00070_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00070_a3-optimized.cl b/OpenCL/m00070_a3-optimized.cl index 95cf2ac2b..6b9dfc180 100644 --- a/OpenCL/m00070_a3-optimized.cl +++ b/OpenCL/m00070_a3-optimized.cl @@ -426,7 +426,7 @@ DECLSPEC void m00070s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00070_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -466,7 +466,7 @@ KERNEL_FQ void m00070_m04 (KERN_ATTR_VECTOR ()) m00070m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00070_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -506,7 +506,7 @@ KERNEL_FQ void m00070_m08 (KERN_ATTR_VECTOR ()) m00070m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00070_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -546,7 +546,7 @@ KERNEL_FQ void m00070_m16 (KERN_ATTR_VECTOR ()) m00070m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00070_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -586,7 +586,7 @@ KERNEL_FQ void m00070_s04 (KERN_ATTR_VECTOR ()) m00070s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00070_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -626,7 +626,7 @@ KERNEL_FQ void m00070_s08 (KERN_ATTR_VECTOR ()) m00070s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00070_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00070_a3-pure.cl b/OpenCL/m00070_a3-pure.cl index 84a22e63d..9bca35d8a 100644 --- a/OpenCL/m00070_a3-pure.cl +++ b/OpenCL/m00070_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m00070_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -83,7 +83,7 @@ KERNEL_FQ void m00070_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00070_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00070_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00100_a0-optimized.cl b/OpenCL/m00100_a0-optimized.cl index 26d1c1753..fd79e84da 100644 --- a/OpenCL/m00100_a0-optimized.cl +++ b/OpenCL/m00100_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -188,15 +188,15 @@ KERNEL_FQ void m00100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -389,10 +389,10 @@ KERNEL_FQ void m00100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00100_a0-pure.cl b/OpenCL/m00100_a0-pure.cl index 5142cedb3..0bef6afb6 100644 --- a/OpenCL/m00100_a0-pure.cl +++ b/OpenCL/m00100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m00100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00100_a1-optimized.cl b/OpenCL/m00100_a1-optimized.cl index 4b33bbb0b..6f1a15db4 100644 --- a/OpenCL/m00100_a1-optimized.cl +++ b/OpenCL/m00100_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -244,15 +244,15 @@ KERNEL_FQ void m00100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -503,10 +503,10 @@ KERNEL_FQ void m00100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00100_a1-pure.cl b/OpenCL/m00100_a1-pure.cl index 9007a7f9c..95f5e7af1 100644 --- a/OpenCL/m00100_a1-pure.cl +++ b/OpenCL/m00100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m00100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00100_a3-optimized.cl b/OpenCL/m00100_a3-optimized.cl index ceb01ef4f..b3132558c 100644 --- a/OpenCL/m00100_a3-optimized.cl +++ b/OpenCL/m00100_a3-optimized.cl @@ -516,7 +516,7 @@ DECLSPEC void m00100s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00100_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -556,7 +556,7 @@ KERNEL_FQ void m00100_m04 (KERN_ATTR_VECTOR ()) m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00100_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -596,7 +596,7 @@ KERNEL_FQ void m00100_m08 (KERN_ATTR_VECTOR ()) m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00100_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -636,7 +636,7 @@ KERNEL_FQ void m00100_m16 (KERN_ATTR_VECTOR ()) m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00100_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -676,7 +676,7 @@ KERNEL_FQ void m00100_s04 (KERN_ATTR_VECTOR ()) m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00100_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -716,7 +716,7 @@ KERNEL_FQ void m00100_s08 (KERN_ATTR_VECTOR ()) m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00100_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00100_a3-pure.cl b/OpenCL/m00100_a3-pure.cl index 06695068d..206f9271f 100644 --- a/OpenCL/m00100_a3-pure.cl +++ b/OpenCL/m00100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00110_a0-optimized.cl b/OpenCL/m00110_a0-optimized.cl index 7289495de..21de3710e 100644 --- a/OpenCL/m00110_a0-optimized.cl +++ b/OpenCL/m00110_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00110_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -261,15 +261,15 @@ KERNEL_FQ void m00110_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00110_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00110_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00110_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -535,10 +535,10 @@ KERNEL_FQ void m00110_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00110_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00110_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00110_a0-pure.cl b/OpenCL/m00110_a0-pure.cl index 8f5ef2a0e..e1ba326df 100644 --- a/OpenCL/m00110_a0-pure.cl +++ b/OpenCL/m00110_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00110_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00110_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00110_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00110_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00110_a1-optimized.cl b/OpenCL/m00110_a1-optimized.cl index 2591c95d2..52fc35227 100644 --- a/OpenCL/m00110_a1-optimized.cl +++ b/OpenCL/m00110_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00110_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -319,15 +319,15 @@ KERNEL_FQ void m00110_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00110_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00110_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00110_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -653,10 +653,10 @@ KERNEL_FQ void m00110_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00110_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00110_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00110_a1-pure.cl b/OpenCL/m00110_a1-pure.cl index 24b42d999..758c3d672 100644 --- a/OpenCL/m00110_a1-pure.cl +++ b/OpenCL/m00110_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00110_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m00110_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00110_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00110_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00110_a3-optimized.cl b/OpenCL/m00110_a3-optimized.cl index d989e422a..bd00afdec 100644 --- a/OpenCL/m00110_a3-optimized.cl +++ b/OpenCL/m00110_a3-optimized.cl @@ -564,7 +564,7 @@ DECLSPEC void m00110s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00110_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -604,7 +604,7 @@ KERNEL_FQ void m00110_m04 (KERN_ATTR_VECTOR ()) m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00110_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -644,7 +644,7 @@ KERNEL_FQ void m00110_m08 (KERN_ATTR_VECTOR ()) m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00110_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -684,7 +684,7 @@ KERNEL_FQ void m00110_m16 (KERN_ATTR_VECTOR ()) m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00110_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -724,7 +724,7 @@ KERNEL_FQ void m00110_s04 (KERN_ATTR_VECTOR ()) m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00110_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -764,7 +764,7 @@ KERNEL_FQ void m00110_s08 (KERN_ATTR_VECTOR ()) m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00110_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00110_a3-pure.cl b/OpenCL/m00110_a3-pure.cl index 6be13eeb2..0ba65e4cf 100644 --- a/OpenCL/m00110_a3-pure.cl +++ b/OpenCL/m00110_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00110_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m00110_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00110_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00110_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00120_a0-optimized.cl b/OpenCL/m00120_a0-optimized.cl index 86e3df072..9af2d1fae 100644 --- a/OpenCL/m00120_a0-optimized.cl +++ b/OpenCL/m00120_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00120_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -253,15 +253,15 @@ KERNEL_FQ void m00120_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00120_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00120_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00120_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -507,10 +507,10 @@ KERNEL_FQ void m00120_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00120_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00120_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00120_a0-pure.cl b/OpenCL/m00120_a0-pure.cl index e1b9b1e67..35f8b4805 100644 --- a/OpenCL/m00120_a0-pure.cl +++ b/OpenCL/m00120_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00120_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m00120_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00120_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00120_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00120_a1-optimized.cl b/OpenCL/m00120_a1-optimized.cl index 528b4427b..d94b728ba 100644 --- a/OpenCL/m00120_a1-optimized.cl +++ b/OpenCL/m00120_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00120_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -309,15 +309,15 @@ KERNEL_FQ void m00120_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00120_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00120_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00120_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -621,10 +621,10 @@ KERNEL_FQ void m00120_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00120_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00120_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00120_a1-pure.cl b/OpenCL/m00120_a1-pure.cl index de06c0a45..52d4c32d4 100644 --- a/OpenCL/m00120_a1-pure.cl +++ b/OpenCL/m00120_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00120_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m00120_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00120_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00120_a3-optimized.cl b/OpenCL/m00120_a3-optimized.cl index 843ce7179..f3ef7665a 100644 --- a/OpenCL/m00120_a3-optimized.cl +++ b/OpenCL/m00120_a3-optimized.cl @@ -467,7 +467,7 @@ DECLSPEC void m00120s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00120_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -516,7 +516,7 @@ KERNEL_FQ void m00120_m04 (KERN_ATTR_BASIC ()) m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00120_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -565,7 +565,7 @@ KERNEL_FQ void m00120_m08 (KERN_ATTR_BASIC ()) m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00120_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -614,7 +614,7 @@ KERNEL_FQ void m00120_m16 (KERN_ATTR_BASIC ()) m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00120_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -663,7 +663,7 @@ KERNEL_FQ void m00120_s04 (KERN_ATTR_BASIC ()) m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00120_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -712,7 +712,7 @@ KERNEL_FQ void m00120_s08 (KERN_ATTR_BASIC ()) m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00120_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00120_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00120_a3-pure.cl b/OpenCL/m00120_a3-pure.cl index 609c14308..5bf4a7bbc 100644 --- a/OpenCL/m00120_a3-pure.cl +++ b/OpenCL/m00120_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00120_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00120_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m00120_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00120_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00120_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00130_a0-optimized.cl b/OpenCL/m00130_a0-optimized.cl index de71f2af1..35a848780 100644 --- a/OpenCL/m00130_a0-optimized.cl +++ b/OpenCL/m00130_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00130_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -266,15 +266,15 @@ KERNEL_FQ void m00130_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00130_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00130_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00130_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -545,10 +545,10 @@ KERNEL_FQ void m00130_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00130_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00130_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00130_a0-pure.cl b/OpenCL/m00130_a0-pure.cl index d7fcf39a8..8cdc95f11 100644 --- a/OpenCL/m00130_a0-pure.cl +++ b/OpenCL/m00130_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00130_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00130_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00130_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00130_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00130_a1-optimized.cl b/OpenCL/m00130_a1-optimized.cl index 25f84e81f..de94f6571 100644 --- a/OpenCL/m00130_a1-optimized.cl +++ b/OpenCL/m00130_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00130_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -324,15 +324,15 @@ KERNEL_FQ void m00130_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00130_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00130_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00130_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -663,10 +663,10 @@ KERNEL_FQ void m00130_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00130_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00130_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00130_a1-pure.cl b/OpenCL/m00130_a1-pure.cl index c8676867c..58668c131 100644 --- a/OpenCL/m00130_a1-pure.cl +++ b/OpenCL/m00130_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00130_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m00130_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00130_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00130_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00130_a3-optimized.cl b/OpenCL/m00130_a3-optimized.cl index 3ea05c652..f085cca4d 100644 --- a/OpenCL/m00130_a3-optimized.cl +++ b/OpenCL/m00130_a3-optimized.cl @@ -564,7 +564,7 @@ DECLSPEC void m00130s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00130_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -604,7 +604,7 @@ KERNEL_FQ void m00130_m04 (KERN_ATTR_VECTOR ()) m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00130_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -644,7 +644,7 @@ KERNEL_FQ void m00130_m08 (KERN_ATTR_VECTOR ()) m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00130_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -684,7 +684,7 @@ KERNEL_FQ void m00130_m16 (KERN_ATTR_VECTOR ()) m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00130_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -724,7 +724,7 @@ KERNEL_FQ void m00130_s04 (KERN_ATTR_VECTOR ()) m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00130_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -764,7 +764,7 @@ KERNEL_FQ void m00130_s08 (KERN_ATTR_VECTOR ()) m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00130_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00130_a3-pure.cl b/OpenCL/m00130_a3-pure.cl index 733e5a2fd..1ae2cfdfe 100644 --- a/OpenCL/m00130_a3-pure.cl +++ b/OpenCL/m00130_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00130_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m00130_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00130_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00130_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00140_a0-optimized.cl b/OpenCL/m00140_a0-optimized.cl index 0a01ab7cb..5fed269f3 100644 --- a/OpenCL/m00140_a0-optimized.cl +++ b/OpenCL/m00140_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00140_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -246,15 +246,15 @@ KERNEL_FQ void m00140_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00140_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00140_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00140_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -505,10 +505,10 @@ KERNEL_FQ void m00140_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00140_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00140_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00140_a0-pure.cl b/OpenCL/m00140_a0-pure.cl index 3e4a5fd36..ae213125f 100644 --- a/OpenCL/m00140_a0-pure.cl +++ b/OpenCL/m00140_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00140_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m00140_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00140_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00140_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00140_a1-optimized.cl b/OpenCL/m00140_a1-optimized.cl index d0dce68c6..81ddff1f1 100644 --- a/OpenCL/m00140_a1-optimized.cl +++ b/OpenCL/m00140_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00140_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -302,15 +302,15 @@ KERNEL_FQ void m00140_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00140_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00140_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00140_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -619,10 +619,10 @@ KERNEL_FQ void m00140_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00140_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00140_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00140_a1-pure.cl b/OpenCL/m00140_a1-pure.cl index 3bd8223ba..7fadd12bc 100644 --- a/OpenCL/m00140_a1-pure.cl +++ b/OpenCL/m00140_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00140_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m00140_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00140_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00140_a3-optimized.cl b/OpenCL/m00140_a3-optimized.cl index e0ef0076a..baec78f05 100644 --- a/OpenCL/m00140_a3-optimized.cl +++ b/OpenCL/m00140_a3-optimized.cl @@ -467,7 +467,7 @@ DECLSPEC void m00140s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00140_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -516,7 +516,7 @@ KERNEL_FQ void m00140_m04 (KERN_ATTR_BASIC ()) m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00140_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -565,7 +565,7 @@ KERNEL_FQ void m00140_m08 (KERN_ATTR_BASIC ()) m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00140_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -614,7 +614,7 @@ KERNEL_FQ void m00140_m16 (KERN_ATTR_BASIC ()) m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00140_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -663,7 +663,7 @@ KERNEL_FQ void m00140_s04 (KERN_ATTR_BASIC ()) m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00140_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -712,7 +712,7 @@ KERNEL_FQ void m00140_s08 (KERN_ATTR_BASIC ()) m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00140_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00140_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00140_a3-pure.cl b/OpenCL/m00140_a3-pure.cl index dd921714f..aee5f7d5f 100644 --- a/OpenCL/m00140_a3-pure.cl +++ b/OpenCL/m00140_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00140_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00140_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m00140_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00140_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00140_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00150_a0-optimized.cl b/OpenCL/m00150_a0-optimized.cl index 69b7f3ea1..fd981eb51 100644 --- a/OpenCL/m00150_a0-optimized.cl +++ b/OpenCL/m00150_a0-optimized.cl @@ -105,7 +105,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00150_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -219,15 +219,15 @@ KERNEL_FQ void m00150_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00150_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00150_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00150_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -353,10 +353,10 @@ KERNEL_FQ void m00150_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00150_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00150_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00150_a0-pure.cl b/OpenCL/m00150_a0-pure.cl index 29b929c95..4acba3e47 100644 --- a/OpenCL/m00150_a0-pure.cl +++ b/OpenCL/m00150_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00150_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00150_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00150_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00150_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00150_a1-optimized.cl b/OpenCL/m00150_a1-optimized.cl index 3fb66a02f..adc3fc0fb 100644 --- a/OpenCL/m00150_a1-optimized.cl +++ b/OpenCL/m00150_a1-optimized.cl @@ -103,7 +103,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00150_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -285,15 +285,15 @@ KERNEL_FQ void m00150_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00150_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00150_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00150_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -487,10 +487,10 @@ KERNEL_FQ void m00150_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00150_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00150_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00150_a1-pure.cl b/OpenCL/m00150_a1-pure.cl index 7a607e8b7..395244729 100644 --- a/OpenCL/m00150_a1-pure.cl +++ b/OpenCL/m00150_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00150_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m00150_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00150_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00150_a3-optimized.cl b/OpenCL/m00150_a3-optimized.cl index b959bfb8a..de810699e 100644 --- a/OpenCL/m00150_a3-optimized.cl +++ b/OpenCL/m00150_a3-optimized.cl @@ -319,7 +319,7 @@ DECLSPEC void m00150s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00150_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -368,7 +368,7 @@ KERNEL_FQ void m00150_m04 (KERN_ATTR_BASIC ()) m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00150_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -417,7 +417,7 @@ KERNEL_FQ void m00150_m08 (KERN_ATTR_BASIC ()) m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00150_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -466,7 +466,7 @@ KERNEL_FQ void m00150_m16 (KERN_ATTR_BASIC ()) m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00150_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -515,7 +515,7 @@ KERNEL_FQ void m00150_s04 (KERN_ATTR_BASIC ()) m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00150_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -564,7 +564,7 @@ KERNEL_FQ void m00150_s08 (KERN_ATTR_BASIC ()) m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00150_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00150_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00150_a3-pure.cl b/OpenCL/m00150_a3-pure.cl index 789ebb4d5..57674fc54 100644 --- a/OpenCL/m00150_a3-pure.cl +++ b/OpenCL/m00150_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00150_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00150_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m00150_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00150_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00150_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00160_a0-optimized.cl b/OpenCL/m00160_a0-optimized.cl index cf77ebe6b..3b7e295e8 100644 --- a/OpenCL/m00160_a0-optimized.cl +++ b/OpenCL/m00160_a0-optimized.cl @@ -105,7 +105,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00160_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -232,15 +232,15 @@ KERNEL_FQ void m00160_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00160_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00160_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00160_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -379,10 +379,10 @@ KERNEL_FQ void m00160_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00160_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00160_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00160_a0-pure.cl b/OpenCL/m00160_a0-pure.cl index 95648d839..a818239b9 100644 --- a/OpenCL/m00160_a0-pure.cl +++ b/OpenCL/m00160_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00160_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m00160_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00160_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00160_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00160_a1-optimized.cl b/OpenCL/m00160_a1-optimized.cl index 730e29a27..196bfc827 100644 --- a/OpenCL/m00160_a1-optimized.cl +++ b/OpenCL/m00160_a1-optimized.cl @@ -103,7 +103,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m00160_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -290,15 +290,15 @@ KERNEL_FQ void m00160_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00160_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00160_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00160_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -497,10 +497,10 @@ KERNEL_FQ void m00160_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00160_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00160_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00160_a1-pure.cl b/OpenCL/m00160_a1-pure.cl index a5c3830c8..a9d7b13de 100644 --- a/OpenCL/m00160_a1-pure.cl +++ b/OpenCL/m00160_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00160_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -94,7 +94,7 @@ KERNEL_FQ void m00160_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00160_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00160_a3-optimized.cl b/OpenCL/m00160_a3-optimized.cl index d59399df0..ae8ac654b 100644 --- a/OpenCL/m00160_a3-optimized.cl +++ b/OpenCL/m00160_a3-optimized.cl @@ -315,7 +315,7 @@ DECLSPEC void m00160s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00160_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -364,7 +364,7 @@ KERNEL_FQ void m00160_m04 (KERN_ATTR_BASIC ()) m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00160_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -413,7 +413,7 @@ KERNEL_FQ void m00160_m08 (KERN_ATTR_BASIC ()) m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00160_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -462,7 +462,7 @@ KERNEL_FQ void m00160_m16 (KERN_ATTR_BASIC ()) m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00160_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -511,7 +511,7 @@ KERNEL_FQ void m00160_s04 (KERN_ATTR_BASIC ()) m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00160_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -560,7 +560,7 @@ KERNEL_FQ void m00160_s08 (KERN_ATTR_BASIC ()) m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00160_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00160_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00160_a3-pure.cl b/OpenCL/m00160_a3-pure.cl index 907e393c7..45e55bce3 100644 --- a/OpenCL/m00160_a3-pure.cl +++ b/OpenCL/m00160_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00160_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00160_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m00160_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00160_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00160_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00170_a0-optimized.cl b/OpenCL/m00170_a0-optimized.cl index 0eb3ee0bb..2376b88bd 100644 --- a/OpenCL/m00170_a0-optimized.cl +++ b/OpenCL/m00170_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00170_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -193,15 +193,15 @@ KERNEL_FQ void m00170_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00170_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00170_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00170_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -399,10 +399,10 @@ KERNEL_FQ void m00170_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00170_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00170_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00170_a0-pure.cl b/OpenCL/m00170_a0-pure.cl index 624f51f4e..89aed961a 100644 --- a/OpenCL/m00170_a0-pure.cl +++ b/OpenCL/m00170_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00170_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m00170_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00170_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00170_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00170_a1-optimized.cl b/OpenCL/m00170_a1-optimized.cl index b281b9f90..84ea48f4b 100644 --- a/OpenCL/m00170_a1-optimized.cl +++ b/OpenCL/m00170_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00170_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -249,15 +249,15 @@ KERNEL_FQ void m00170_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00170_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00170_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00170_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -513,10 +513,10 @@ KERNEL_FQ void m00170_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00170_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00170_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00170_a1-pure.cl b/OpenCL/m00170_a1-pure.cl index c7c9aa16b..354ed502a 100644 --- a/OpenCL/m00170_a1-pure.cl +++ b/OpenCL/m00170_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00170_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m00170_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00170_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00170_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00170_a3-optimized.cl b/OpenCL/m00170_a3-optimized.cl index a96d1d5a7..77217b348 100644 --- a/OpenCL/m00170_a3-optimized.cl +++ b/OpenCL/m00170_a3-optimized.cl @@ -513,7 +513,7 @@ DECLSPEC void m00170s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00170_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -553,7 +553,7 @@ KERNEL_FQ void m00170_m04 (KERN_ATTR_VECTOR ()) m00170m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00170_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -593,7 +593,7 @@ KERNEL_FQ void m00170_m08 (KERN_ATTR_VECTOR ()) m00170m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00170_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -633,7 +633,7 @@ KERNEL_FQ void m00170_m16 (KERN_ATTR_VECTOR ()) m00170m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00170_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -673,7 +673,7 @@ KERNEL_FQ void m00170_s04 (KERN_ATTR_VECTOR ()) m00170s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00170_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -713,7 +713,7 @@ KERNEL_FQ void m00170_s08 (KERN_ATTR_VECTOR ()) m00170s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00170_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00170_a3-pure.cl b/OpenCL/m00170_a3-pure.cl index efebacac5..a399605ff 100644 --- a/OpenCL/m00170_a3-pure.cl +++ b/OpenCL/m00170_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00170_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00170_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00170_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00170_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00200_a0-optimized.cl b/OpenCL/m00200_a0-optimized.cl index d7b759cf7..713ff7b04 100644 --- a/OpenCL/m00200_a0-optimized.cl +++ b/OpenCL/m00200_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_simd.cl) #endif -KERNEL_FQ void m00200_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -134,15 +134,15 @@ KERNEL_FQ void m00200_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00200_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00200_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00200_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -272,10 +272,10 @@ KERNEL_FQ void m00200_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00200_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00200_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00200_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00200_a1-optimized.cl b/OpenCL/m00200_a1-optimized.cl index 5cc2e46e7..fcef4548a 100644 --- a/OpenCL/m00200_a1-optimized.cl +++ b/OpenCL/m00200_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_simd.cl) #endif -KERNEL_FQ void m00200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -196,15 +196,15 @@ KERNEL_FQ void m00200_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -398,10 +398,10 @@ KERNEL_FQ void m00200_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00200_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00200_a3-optimized.cl b/OpenCL/m00200_a3-optimized.cl index 2de401b84..3c2a6fe3d 100644 --- a/OpenCL/m00200_a3-optimized.cl +++ b/OpenCL/m00200_a3-optimized.cl @@ -340,7 +340,7 @@ DECLSPEC void m00200s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO CODE_POST_S; } -KERNEL_FQ void m00200_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -380,7 +380,7 @@ KERNEL_FQ void m00200_m04 (KERN_ATTR_VECTOR ()) m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00200_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -420,7 +420,7 @@ KERNEL_FQ void m00200_m08 (KERN_ATTR_VECTOR ()) m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00200_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -460,7 +460,7 @@ KERNEL_FQ void m00200_m16 (KERN_ATTR_VECTOR ()) m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00200_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -500,7 +500,7 @@ KERNEL_FQ void m00200_s04 (KERN_ATTR_VECTOR ()) m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00200_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -540,7 +540,7 @@ KERNEL_FQ void m00200_s08 (KERN_ATTR_VECTOR ()) m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00200_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00200_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00300_a0-optimized.cl b/OpenCL/m00300_a0-optimized.cl index 594d190dc..d4f10f46f 100644 --- a/OpenCL/m00300_a0-optimized.cl +++ b/OpenCL/m00300_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -313,15 +313,15 @@ KERNEL_FQ void m00300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -639,10 +639,10 @@ KERNEL_FQ void m00300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00300_a0-pure.cl b/OpenCL/m00300_a0-pure.cl index a328a5e83..7398af811 100644 --- a/OpenCL/m00300_a0-pure.cl +++ b/OpenCL/m00300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -83,7 +83,7 @@ KERNEL_FQ void m00300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00300_a1-optimized.cl b/OpenCL/m00300_a1-optimized.cl index 77b0ffb0c..2206be011 100644 --- a/OpenCL/m00300_a1-optimized.cl +++ b/OpenCL/m00300_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -369,15 +369,15 @@ KERNEL_FQ void m00300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -753,10 +753,10 @@ KERNEL_FQ void m00300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00300_a1-pure.cl b/OpenCL/m00300_a1-pure.cl index 3ba139992..c27282a6e 100644 --- a/OpenCL/m00300_a1-pure.cl +++ b/OpenCL/m00300_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -79,7 +79,7 @@ KERNEL_FQ void m00300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00300_a3-optimized.cl b/OpenCL/m00300_a3-optimized.cl index 185cd9938..b6a5f211a 100644 --- a/OpenCL/m00300_a3-optimized.cl +++ b/OpenCL/m00300_a3-optimized.cl @@ -767,7 +767,7 @@ DECLSPEC void m00300s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00300_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -807,7 +807,7 @@ KERNEL_FQ void m00300_m04 (KERN_ATTR_VECTOR ()) m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00300_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -847,7 +847,7 @@ KERNEL_FQ void m00300_m08 (KERN_ATTR_VECTOR ()) m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00300_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -887,7 +887,7 @@ KERNEL_FQ void m00300_m16 (KERN_ATTR_VECTOR ()) m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00300_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -927,7 +927,7 @@ KERNEL_FQ void m00300_s04 (KERN_ATTR_VECTOR ()) m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00300_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -967,7 +967,7 @@ KERNEL_FQ void m00300_s08 (KERN_ATTR_VECTOR ()) m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00300_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00300_a3-pure.cl b/OpenCL/m00300_a3-pure.cl index dcd9ac736..c7432e0b2 100644 --- a/OpenCL/m00300_a3-pure.cl +++ b/OpenCL/m00300_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m00300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m00300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00400-optimized.cl b/OpenCL/m00400-optimized.cl index 8ddeb789a..993ef9a36 100644 --- a/OpenCL/m00400-optimized.cl +++ b/OpenCL/m00400-optimized.cl @@ -23,7 +23,7 @@ typedef struct phpass_tmp } phpass_tmp_t; -KERNEL_FQ void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * base @@ -120,7 +120,7 @@ KERNEL_FQ void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * base @@ -211,7 +211,7 @@ KERNEL_FQ void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) unpackv (tmps, digest_buf, gid, 3, digest[3]); } -KERNEL_FQ void m00400_comp (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_comp (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * modifier diff --git a/OpenCL/m00400-pure.cl b/OpenCL/m00400-pure.cl index 6fa76b732..20cbc91af 100644 --- a/OpenCL/m00400-pure.cl +++ b/OpenCL/m00400-pure.cl @@ -23,7 +23,7 @@ typedef struct phpass_tmp } phpass_tmp_t; -KERNEL_FQ void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * base @@ -60,7 +60,7 @@ KERNEL_FQ void m00400_init (KERN_ATTR_TMPS (phpass_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * base @@ -161,7 +161,7 @@ KERNEL_FQ void m00400_loop (KERN_ATTR_TMPS (phpass_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00400_comp (KERN_ATTR_TMPS (phpass_tmp_t)) +KERNEL_FQ KERNEL_FA void m00400_comp (KERN_ATTR_TMPS (phpass_tmp_t)) { /** * modifier diff --git a/OpenCL/m00500-optimized.cl b/OpenCL/m00500-optimized.cl index f44294283..d7b7f57d2 100644 --- a/OpenCL/m00500-optimized.cl +++ b/OpenCL/m00500-optimized.cl @@ -659,7 +659,7 @@ DECLSPEC void append_1st (PRIVATE_AS u32 *block0, PRIVATE_AS u32 *block1, PRIVAT } } -KERNEL_FQ void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -822,7 +822,7 @@ KERNEL_FQ void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -1010,7 +1010,7 @@ KERNEL_FQ void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00500_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m00500-pure.cl b/OpenCL/m00500-pure.cl index 6c9700639..bb1605d98 100644 --- a/OpenCL/m00500-pure.cl +++ b/OpenCL/m00500-pure.cl @@ -24,7 +24,7 @@ typedef struct md5crypt_tmp #define md5crypt_magic 0x00243124u -KERNEL_FQ void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -130,7 +130,7 @@ KERNEL_FQ void m00500_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = md5_ctx.h[3]; } -KERNEL_FQ void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -225,7 +225,7 @@ KERNEL_FQ void m00500_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m00500_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m00500_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m00600_a0-optimized.cl b/OpenCL/m00600_a0-optimized.cl index 1402dde1c..b66891bb2 100644 --- a/OpenCL/m00600_a0-optimized.cl +++ b/OpenCL/m00600_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00600_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_m04 (KERN_ATTR_RULES ()) { /** * base @@ -94,15 +94,15 @@ KERNEL_FQ void m00600_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00600_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00600_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00600_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_s04 (KERN_ATTR_RULES ()) { /** * base @@ -192,10 +192,10 @@ KERNEL_FQ void m00600_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00600_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00600_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00600_a0-pure.cl b/OpenCL/m00600_a0-pure.cl index 8324fd1be..686c6e404 100644 --- a/OpenCL/m00600_a0-pure.cl +++ b/OpenCL/m00600_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00600_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_mxx (KERN_ATTR_RULES ()) { /** * base @@ -57,7 +57,7 @@ KERNEL_FQ void m00600_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00600_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00600_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m00600_a1-optimized.cl b/OpenCL/m00600_a1-optimized.cl index 40edd58d3..686ca4547 100644 --- a/OpenCL/m00600_a1-optimized.cl +++ b/OpenCL/m00600_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00600_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -152,15 +152,15 @@ KERNEL_FQ void m00600_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00600_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00600_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00600_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -310,10 +310,10 @@ KERNEL_FQ void m00600_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00600_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00600_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00600_a1-pure.cl b/OpenCL/m00600_a1-pure.cl index bd7fe085a..cf9007fe9 100644 --- a/OpenCL/m00600_a1-pure.cl +++ b/OpenCL/m00600_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00600_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -55,7 +55,7 @@ KERNEL_FQ void m00600_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00600_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00600_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00600_a3-optimized.cl b/OpenCL/m00600_a3-optimized.cl index 8cbdf7a95..a8774830d 100644 --- a/OpenCL/m00600_a3-optimized.cl +++ b/OpenCL/m00600_a3-optimized.cl @@ -186,7 +186,7 @@ DECLSPEC void m00600s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00600_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -226,7 +226,7 @@ KERNEL_FQ void m00600_m04 (KERN_ATTR_VECTOR ()) m00600m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00600_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -266,7 +266,7 @@ KERNEL_FQ void m00600_m08 (KERN_ATTR_VECTOR ()) m00600m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00600_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -306,7 +306,7 @@ KERNEL_FQ void m00600_m16 (KERN_ATTR_VECTOR ()) m00600m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00600_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -346,7 +346,7 @@ KERNEL_FQ void m00600_s04 (KERN_ATTR_VECTOR ()) m00600s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00600_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -386,7 +386,7 @@ KERNEL_FQ void m00600_s08 (KERN_ATTR_VECTOR ()) m00600s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00600_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00600_a3-pure.cl b/OpenCL/m00600_a3-pure.cl index 7b80092bf..93005c627 100644 --- a/OpenCL/m00600_a3-pure.cl +++ b/OpenCL/m00600_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00600_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -66,7 +66,7 @@ KERNEL_FQ void m00600_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00600_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00600_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00610_a0-optimized.cl b/OpenCL/m00610_a0-optimized.cl index 01b29a159..be62aad8e 100644 --- a/OpenCL/m00610_a0-optimized.cl +++ b/OpenCL/m00610_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00610_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_m04 (KERN_ATTR_RULES ()) { /** * base @@ -173,15 +173,15 @@ KERNEL_FQ void m00610_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00610_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00610_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00610_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_s04 (KERN_ATTR_RULES ()) { /** * base @@ -350,11 +350,11 @@ KERNEL_FQ void m00610_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00610_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00610_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00610_a0-pure.cl b/OpenCL/m00610_a0-pure.cl index f3d98ff9e..d126761eb 100644 --- a/OpenCL/m00610_a0-pure.cl +++ b/OpenCL/m00610_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00610_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_mxx (KERN_ATTR_RULES ()) { /** * base @@ -68,7 +68,7 @@ KERNEL_FQ void m00610_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00610_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00610_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m00610_a1-optimized.cl b/OpenCL/m00610_a1-optimized.cl index a6728bce4..246dddef7 100644 --- a/OpenCL/m00610_a1-optimized.cl +++ b/OpenCL/m00610_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00610_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -231,15 +231,15 @@ KERNEL_FQ void m00610_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00610_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00610_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00610_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -468,11 +468,11 @@ KERNEL_FQ void m00610_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00610_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00610_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00610_a1-pure.cl b/OpenCL/m00610_a1-pure.cl index 9eeabb060..b04796a55 100644 --- a/OpenCL/m00610_a1-pure.cl +++ b/OpenCL/m00610_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00610_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -66,7 +66,7 @@ KERNEL_FQ void m00610_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00610_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00610_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00610_a3-optimized.cl b/OpenCL/m00610_a3-optimized.cl index 1ebbffb51..bc9b38266 100644 --- a/OpenCL/m00610_a3-optimized.cl +++ b/OpenCL/m00610_a3-optimized.cl @@ -222,7 +222,7 @@ DECLSPEC void m00610s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00610_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -262,7 +262,7 @@ KERNEL_FQ void m00610_m04 (KERN_ATTR_VECTOR ()) m00610m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00610_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -302,7 +302,7 @@ KERNEL_FQ void m00610_m08 (KERN_ATTR_VECTOR ()) m00610m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00610_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -342,7 +342,7 @@ KERNEL_FQ void m00610_m16 (KERN_ATTR_VECTOR ()) m00610m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00610_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -382,7 +382,7 @@ KERNEL_FQ void m00610_s04 (KERN_ATTR_VECTOR ()) m00610s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00610_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -422,7 +422,7 @@ KERNEL_FQ void m00610_s08 (KERN_ATTR_VECTOR ()) m00610s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00610_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00610_a3-pure.cl b/OpenCL/m00610_a3-pure.cl index d61b6f847..c84377d6c 100644 --- a/OpenCL/m00610_a3-pure.cl +++ b/OpenCL/m00610_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00610_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -79,7 +79,7 @@ KERNEL_FQ void m00610_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00610_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00610_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00620_a0-optimized.cl b/OpenCL/m00620_a0-optimized.cl index 29144dc4a..d6be652b9 100644 --- a/OpenCL/m00620_a0-optimized.cl +++ b/OpenCL/m00620_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00620_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_m04 (KERN_ATTR_RULES ()) { /** * base @@ -151,15 +151,15 @@ KERNEL_FQ void m00620_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00620_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00620_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00620_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_s04 (KERN_ATTR_RULES ()) { /** * base @@ -306,11 +306,11 @@ KERNEL_FQ void m00620_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00620_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00620_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00620_a0-pure.cl b/OpenCL/m00620_a0-pure.cl index bcc056611..d35f3ce76 100644 --- a/OpenCL/m00620_a0-pure.cl +++ b/OpenCL/m00620_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00620_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_mxx (KERN_ATTR_RULES ()) { /** * base @@ -62,7 +62,7 @@ KERNEL_FQ void m00620_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00620_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00620_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m00620_a1-optimized.cl b/OpenCL/m00620_a1-optimized.cl index fa50e5d89..bd4e6ae8e 100644 --- a/OpenCL/m00620_a1-optimized.cl +++ b/OpenCL/m00620_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00620_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -209,15 +209,15 @@ KERNEL_FQ void m00620_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00620_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00620_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00620_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -424,11 +424,11 @@ KERNEL_FQ void m00620_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00620_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00620_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00620_a1-pure.cl b/OpenCL/m00620_a1-pure.cl index 70ffccc8c..25ad2115a 100644 --- a/OpenCL/m00620_a1-pure.cl +++ b/OpenCL/m00620_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00620_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -57,7 +57,7 @@ KERNEL_FQ void m00620_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00620_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00620_a3-optimized.cl b/OpenCL/m00620_a3-optimized.cl index 64cb352c5..e063d7fc1 100644 --- a/OpenCL/m00620_a3-optimized.cl +++ b/OpenCL/m00620_a3-optimized.cl @@ -294,7 +294,7 @@ DECLSPEC void m00620s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m00620_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -343,7 +343,7 @@ KERNEL_FQ void m00620_m04 (KERN_ATTR_BASIC ()) m00620m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00620_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -392,7 +392,7 @@ KERNEL_FQ void m00620_m08 (KERN_ATTR_BASIC ()) m00620m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00620_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -441,7 +441,7 @@ KERNEL_FQ void m00620_m16 (KERN_ATTR_BASIC ()) m00620m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00620_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -490,7 +490,7 @@ KERNEL_FQ void m00620_s04 (KERN_ATTR_BASIC ()) m00620s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00620_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -539,7 +539,7 @@ KERNEL_FQ void m00620_s08 (KERN_ATTR_BASIC ()) m00620s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00620_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00620_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m00620_a3-pure.cl b/OpenCL/m00620_a3-pure.cl index 2b34cd3ba..67b5f0b9e 100644 --- a/OpenCL/m00620_a3-pure.cl +++ b/OpenCL/m00620_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2b.cl) #endif -KERNEL_FQ void m00620_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00620_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -74,7 +74,7 @@ KERNEL_FQ void m00620_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00620_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00620_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m00900_a0-optimized.cl b/OpenCL/m00900_a0-optimized.cl index c11ed77d0..26d63da8a 100644 --- a/OpenCL/m00900_a0-optimized.cl +++ b/OpenCL/m00900_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m00900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -124,15 +124,15 @@ KERNEL_FQ void m00900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -255,10 +255,10 @@ KERNEL_FQ void m00900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m00900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m00900_a0-pure.cl b/OpenCL/m00900_a0-pure.cl index 25cf7f1d9..bf58b7c98 100644 --- a/OpenCL/m00900_a0-pure.cl +++ b/OpenCL/m00900_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m00900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m00900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m00900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m00900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m00900_a1-optimized.cl b/OpenCL/m00900_a1-optimized.cl index af869cb27..826880268 100644 --- a/OpenCL/m00900_a1-optimized.cl +++ b/OpenCL/m00900_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m00900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -181,15 +181,15 @@ KERNEL_FQ void m00900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -371,10 +371,10 @@ KERNEL_FQ void m00900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m00900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m00900_a1-pure.cl b/OpenCL/m00900_a1-pure.cl index 8b1e086a8..a51fe1e85 100644 --- a/OpenCL/m00900_a1-pure.cl +++ b/OpenCL/m00900_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m00900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m00900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m00900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m00900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m00900_a3-optimized.cl b/OpenCL/m00900_a3-optimized.cl index c9b635854..706ff5924 100644 --- a/OpenCL/m00900_a3-optimized.cl +++ b/OpenCL/m00900_a3-optimized.cl @@ -347,7 +347,7 @@ DECLSPEC void m00900s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m00900_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m00900_m04 (KERN_ATTR_VECTOR ()) m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00900_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m00900_m08 (KERN_ATTR_VECTOR ()) m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00900_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m00900_m16 (KERN_ATTR_VECTOR ()) m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00900_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m00900_s04 (KERN_ATTR_VECTOR ()) m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00900_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -547,7 +547,7 @@ KERNEL_FQ void m00900_s08 (KERN_ATTR_VECTOR ()) m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m00900_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m00900_a3-pure.cl b/OpenCL/m00900_a3-pure.cl index beb0f89af..96a375a8c 100644 --- a/OpenCL/m00900_a3-pure.cl +++ b/OpenCL/m00900_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m00900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m00900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m00900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m00900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01000_a0-optimized.cl b/OpenCL/m01000_a0-optimized.cl index a0732dd92..e769e4360 100644 --- a/OpenCL/m01000_a0-optimized.cl +++ b/OpenCL/m01000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -127,15 +127,15 @@ KERNEL_FQ void m01000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -261,10 +261,10 @@ KERNEL_FQ void m01000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01000_a0-pure.cl b/OpenCL/m01000_a0-pure.cl index a85989648..5907bcad6 100644 --- a/OpenCL/m01000_a0-pure.cl +++ b/OpenCL/m01000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m01000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01000_a1-optimized.cl b/OpenCL/m01000_a1-optimized.cl index fc19ea778..954467b3e 100644 --- a/OpenCL/m01000_a1-optimized.cl +++ b/OpenCL/m01000_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -187,15 +187,15 @@ KERNEL_FQ void m01000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -383,10 +383,10 @@ KERNEL_FQ void m01000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01000_a1-pure.cl b/OpenCL/m01000_a1-pure.cl index 2d2d4b510..41b103ea4 100644 --- a/OpenCL/m01000_a1-pure.cl +++ b/OpenCL/m01000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01000_a3-optimized.cl b/OpenCL/m01000_a3-optimized.cl index fa6b86266..4360b62b4 100644 --- a/OpenCL/m01000_a3-optimized.cl +++ b/OpenCL/m01000_a3-optimized.cl @@ -347,7 +347,7 @@ DECLSPEC void m01000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m01000_m04 (KERN_ATTR_VECTOR ()) m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m01000_m08 (KERN_ATTR_VECTOR ()) m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m01000_m16 (KERN_ATTR_VECTOR ()) m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m01000_s04 (KERN_ATTR_VECTOR ()) m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -547,7 +547,7 @@ KERNEL_FQ void m01000_s08 (KERN_ATTR_VECTOR ()) m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01000_a3-pure.cl b/OpenCL/m01000_a3-pure.cl index 4aea55ae1..6cc7b57bc 100644 --- a/OpenCL/m01000_a3-pure.cl +++ b/OpenCL/m01000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -83,7 +83,7 @@ KERNEL_FQ void m01000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01100_a0-optimized.cl b/OpenCL/m01100_a0-optimized.cl index 9c8b4194f..2188b95ad 100644 --- a/OpenCL/m01100_a0-optimized.cl +++ b/OpenCL/m01100_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_m04 (KERN_ATTR_RULES ()) { /** * base @@ -227,15 +227,15 @@ KERNEL_FQ void m01100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_s04 (KERN_ATTR_RULES ()) { /** * base @@ -461,10 +461,10 @@ KERNEL_FQ void m01100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01100_a0-pure.cl b/OpenCL/m01100_a0-pure.cl index 985d7350c..869fc3ab5 100644 --- a/OpenCL/m01100_a0-pure.cl +++ b/OpenCL/m01100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -84,7 +84,7 @@ KERNEL_FQ void m01100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01100_a1-optimized.cl b/OpenCL/m01100_a1-optimized.cl index 72e6d71fa..3abdd43d4 100644 --- a/OpenCL/m01100_a1-optimized.cl +++ b/OpenCL/m01100_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -287,15 +287,15 @@ KERNEL_FQ void m01100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -583,10 +583,10 @@ KERNEL_FQ void m01100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01100_a1-pure.cl b/OpenCL/m01100_a1-pure.cl index ef5b7d142..f8e9fb2a9 100644 --- a/OpenCL/m01100_a1-pure.cl +++ b/OpenCL/m01100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01100_a3-optimized.cl b/OpenCL/m01100_a3-optimized.cl index d26ac1708..d7253f1cc 100644 --- a/OpenCL/m01100_a3-optimized.cl +++ b/OpenCL/m01100_a3-optimized.cl @@ -493,7 +493,7 @@ DECLSPEC void m01100s (LOCAL_AS salt_t *s_salt_buf, PRIVATE_AS u32 *w, const u32 } } -KERNEL_FQ void m01100_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -548,7 +548,7 @@ KERNEL_FQ void m01100_m04 (KERN_ATTR_VECTOR ()) m01100m (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01100_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -603,7 +603,7 @@ KERNEL_FQ void m01100_m08 (KERN_ATTR_VECTOR ()) m01100m (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01100_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -658,7 +658,7 @@ KERNEL_FQ void m01100_m16 (KERN_ATTR_VECTOR ()) m01100m (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01100_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -713,7 +713,7 @@ KERNEL_FQ void m01100_s04 (KERN_ATTR_VECTOR ()) m01100s (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01100_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -768,7 +768,7 @@ KERNEL_FQ void m01100_s08 (KERN_ATTR_VECTOR ()) m01100s (s_salt_buf, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01100_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01100_a3-pure.cl b/OpenCL/m01100_a3-pure.cl index afa425501..5924876d2 100644 --- a/OpenCL/m01100_a3-pure.cl +++ b/OpenCL/m01100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md4.cl) #endif -KERNEL_FQ void m01100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -122,7 +122,7 @@ KERNEL_FQ void m01100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01300_a0-optimized.cl b/OpenCL/m01300_a0-optimized.cl index 695d65c7f..d2785fcd8 100644 --- a/OpenCL/m01300_a0-optimized.cl +++ b/OpenCL/m01300_a0-optimized.cl @@ -29,7 +29,7 @@ g = 0; \ } -KERNEL_FQ void m01300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -176,15 +176,15 @@ KERNEL_FQ void m01300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -362,10 +362,10 @@ KERNEL_FQ void m01300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01300_a0-pure.cl b/OpenCL/m01300_a0-pure.cl index 52f35f9d5..2a798d59f 100644 --- a/OpenCL/m01300_a0-pure.cl +++ b/OpenCL/m01300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha224.cl) #endif -KERNEL_FQ void m01300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m01300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01300_a1-optimized.cl b/OpenCL/m01300_a1-optimized.cl index f1b7fe8c5..141fb139b 100644 --- a/OpenCL/m01300_a1-optimized.cl +++ b/OpenCL/m01300_a1-optimized.cl @@ -27,7 +27,7 @@ g = 0; \ } -KERNEL_FQ void m01300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -232,15 +232,15 @@ KERNEL_FQ void m01300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -476,10 +476,10 @@ KERNEL_FQ void m01300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01300_a1-pure.cl b/OpenCL/m01300_a1-pure.cl index 71da5f570..5cc91ff33 100644 --- a/OpenCL/m01300_a1-pure.cl +++ b/OpenCL/m01300_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha224.cl) #endif -KERNEL_FQ void m01300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01300_a3-optimized.cl b/OpenCL/m01300_a3-optimized.cl index 8b0d065d0..132748c1f 100644 --- a/OpenCL/m01300_a3-optimized.cl +++ b/OpenCL/m01300_a3-optimized.cl @@ -290,7 +290,7 @@ DECLSPEC void m01300s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01300_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -330,7 +330,7 @@ KERNEL_FQ void m01300_m04 (KERN_ATTR_VECTOR ()) m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01300_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -370,7 +370,7 @@ KERNEL_FQ void m01300_m08 (KERN_ATTR_VECTOR ()) m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01300_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -410,7 +410,7 @@ KERNEL_FQ void m01300_m16 (KERN_ATTR_VECTOR ()) m01300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01300_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -450,7 +450,7 @@ KERNEL_FQ void m01300_s04 (KERN_ATTR_VECTOR ()) m01300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01300_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -490,7 +490,7 @@ KERNEL_FQ void m01300_s08 (KERN_ATTR_VECTOR ()) m01300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01300_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01300_a3-pure.cl b/OpenCL/m01300_a3-pure.cl index 2cefefa34..491792ea6 100644 --- a/OpenCL/m01300_a3-pure.cl +++ b/OpenCL/m01300_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha224.cl) #endif -KERNEL_FQ void m01300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01400_a0-optimized.cl b/OpenCL/m01400_a0-optimized.cl index 95fac4e0d..511b15e4f 100644 --- a/OpenCL/m01400_a0-optimized.cl +++ b/OpenCL/m01400_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -177,15 +177,15 @@ KERNEL_FQ void m01400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -365,10 +365,10 @@ KERNEL_FQ void m01400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01400_a0-pure.cl b/OpenCL/m01400_a0-pure.cl index 932a6c33d..002b9cf9b 100644 --- a/OpenCL/m01400_a0-pure.cl +++ b/OpenCL/m01400_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m01400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01400_a1-optimized.cl b/OpenCL/m01400_a1-optimized.cl index ad90577fb..992c36d5c 100644 --- a/OpenCL/m01400_a1-optimized.cl +++ b/OpenCL/m01400_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -233,15 +233,15 @@ KERNEL_FQ void m01400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -479,10 +479,10 @@ KERNEL_FQ void m01400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01400_a1-pure.cl b/OpenCL/m01400_a1-pure.cl index 8ce38c174..868e6f9b6 100644 --- a/OpenCL/m01400_a1-pure.cl +++ b/OpenCL/m01400_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01400_a3-optimized.cl b/OpenCL/m01400_a3-optimized.cl index 6b82987bb..6cec22dae 100644 --- a/OpenCL/m01400_a3-optimized.cl +++ b/OpenCL/m01400_a3-optimized.cl @@ -293,7 +293,7 @@ DECLSPEC void m01400s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01400_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -333,7 +333,7 @@ KERNEL_FQ void m01400_m04 (KERN_ATTR_VECTOR ()) m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01400_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -373,7 +373,7 @@ KERNEL_FQ void m01400_m08 (KERN_ATTR_VECTOR ()) m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01400_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -413,7 +413,7 @@ KERNEL_FQ void m01400_m16 (KERN_ATTR_VECTOR ()) m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01400_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -453,7 +453,7 @@ KERNEL_FQ void m01400_s04 (KERN_ATTR_VECTOR ()) m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01400_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -493,7 +493,7 @@ KERNEL_FQ void m01400_s08 (KERN_ATTR_VECTOR ()) m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01400_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01400_a3-pure.cl b/OpenCL/m01400_a3-pure.cl index 04ebffdbb..c4a457e42 100644 --- a/OpenCL/m01400_a3-pure.cl +++ b/OpenCL/m01400_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01410_a0-optimized.cl b/OpenCL/m01410_a0-optimized.cl index b2e6a2bd5..dc4c2d068 100644 --- a/OpenCL/m01410_a0-optimized.cl +++ b/OpenCL/m01410_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01410_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -250,15 +250,15 @@ KERNEL_FQ void m01410_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01410_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01410_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01410_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -511,10 +511,10 @@ KERNEL_FQ void m01410_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01410_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01410_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01410_a0-pure.cl b/OpenCL/m01410_a0-pure.cl index 81a0b2487..d2b65cb4f 100644 --- a/OpenCL/m01410_a0-pure.cl +++ b/OpenCL/m01410_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01410_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01410_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01410_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01410_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01410_a1-optimized.cl b/OpenCL/m01410_a1-optimized.cl index 287b8da82..e879d80b7 100644 --- a/OpenCL/m01410_a1-optimized.cl +++ b/OpenCL/m01410_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01410_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -308,15 +308,15 @@ KERNEL_FQ void m01410_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01410_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01410_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01410_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -629,10 +629,10 @@ KERNEL_FQ void m01410_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01410_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01410_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01410_a1-pure.cl b/OpenCL/m01410_a1-pure.cl index 01204bc42..a27236812 100644 --- a/OpenCL/m01410_a1-pure.cl +++ b/OpenCL/m01410_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01410_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m01410_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01410_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01410_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01410_a3-optimized.cl b/OpenCL/m01410_a3-optimized.cl index 2574d9fe7..935acdfed 100644 --- a/OpenCL/m01410_a3-optimized.cl +++ b/OpenCL/m01410_a3-optimized.cl @@ -344,7 +344,7 @@ DECLSPEC void m01410s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01410_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -384,7 +384,7 @@ KERNEL_FQ void m01410_m04 (KERN_ATTR_VECTOR ()) m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01410_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -424,7 +424,7 @@ KERNEL_FQ void m01410_m08 (KERN_ATTR_VECTOR ()) m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01410_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -464,7 +464,7 @@ KERNEL_FQ void m01410_m16 (KERN_ATTR_VECTOR ()) m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01410_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -504,7 +504,7 @@ KERNEL_FQ void m01410_s04 (KERN_ATTR_VECTOR ()) m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01410_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -544,7 +544,7 @@ KERNEL_FQ void m01410_s08 (KERN_ATTR_VECTOR ()) m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01410_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01410_a3-pure.cl b/OpenCL/m01410_a3-pure.cl index 7e29bf125..792065f92 100644 --- a/OpenCL/m01410_a3-pure.cl +++ b/OpenCL/m01410_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01410_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01410_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01410_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01410_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01420_a0-optimized.cl b/OpenCL/m01420_a0-optimized.cl index b83b6860e..553d6a5b0 100644 --- a/OpenCL/m01420_a0-optimized.cl +++ b/OpenCL/m01420_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01420_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -230,15 +230,15 @@ KERNEL_FQ void m01420_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01420_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01420_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01420_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -471,10 +471,10 @@ KERNEL_FQ void m01420_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01420_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01420_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01420_a0-pure.cl b/OpenCL/m01420_a0-pure.cl index a021b8cc3..037b6dd85 100644 --- a/OpenCL/m01420_a0-pure.cl +++ b/OpenCL/m01420_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01420_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m01420_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01420_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01420_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01420_a1-optimized.cl b/OpenCL/m01420_a1-optimized.cl index 668cf0969..f7fd380bc 100644 --- a/OpenCL/m01420_a1-optimized.cl +++ b/OpenCL/m01420_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01420_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -286,15 +286,15 @@ KERNEL_FQ void m01420_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01420_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01420_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01420_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -585,10 +585,10 @@ KERNEL_FQ void m01420_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01420_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01420_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01420_a1-pure.cl b/OpenCL/m01420_a1-pure.cl index adf7e44cf..8ac8bdd36 100644 --- a/OpenCL/m01420_a1-pure.cl +++ b/OpenCL/m01420_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01420_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m01420_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01420_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01420_a3-optimized.cl b/OpenCL/m01420_a3-optimized.cl index 42019378a..fd585d33f 100644 --- a/OpenCL/m01420_a3-optimized.cl +++ b/OpenCL/m01420_a3-optimized.cl @@ -443,7 +443,7 @@ DECLSPEC void m01420s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01420_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -492,7 +492,7 @@ KERNEL_FQ void m01420_m04 (KERN_ATTR_BASIC ()) m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01420_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -541,7 +541,7 @@ KERNEL_FQ void m01420_m08 (KERN_ATTR_BASIC ()) m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01420_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -590,7 +590,7 @@ KERNEL_FQ void m01420_m16 (KERN_ATTR_BASIC ()) m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01420_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -639,7 +639,7 @@ KERNEL_FQ void m01420_s04 (KERN_ATTR_BASIC ()) m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01420_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -688,7 +688,7 @@ KERNEL_FQ void m01420_s08 (KERN_ATTR_BASIC ()) m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01420_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01420_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01420_a3-pure.cl b/OpenCL/m01420_a3-pure.cl index 7bf819abe..a8e3eaa1d 100644 --- a/OpenCL/m01420_a3-pure.cl +++ b/OpenCL/m01420_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01420_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01420_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m01420_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01420_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01420_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01430_a0-optimized.cl b/OpenCL/m01430_a0-optimized.cl index 1be82fdad..8107e625e 100644 --- a/OpenCL/m01430_a0-optimized.cl +++ b/OpenCL/m01430_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01430_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -255,15 +255,15 @@ KERNEL_FQ void m01430_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01430_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01430_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01430_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -521,10 +521,10 @@ KERNEL_FQ void m01430_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01430_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01430_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01430_a0-pure.cl b/OpenCL/m01430_a0-pure.cl index 8abd18ca5..a791c0654 100644 --- a/OpenCL/m01430_a0-pure.cl +++ b/OpenCL/m01430_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01430_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01430_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01430_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01430_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01430_a1-optimized.cl b/OpenCL/m01430_a1-optimized.cl index 15f216ae9..6e225dd2f 100644 --- a/OpenCL/m01430_a1-optimized.cl +++ b/OpenCL/m01430_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01430_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -313,15 +313,15 @@ KERNEL_FQ void m01430_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01430_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01430_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01430_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -639,10 +639,10 @@ KERNEL_FQ void m01430_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01430_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01430_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01430_a1-pure.cl b/OpenCL/m01430_a1-pure.cl index b75eb7191..b55c5ab94 100644 --- a/OpenCL/m01430_a1-pure.cl +++ b/OpenCL/m01430_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01430_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m01430_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01430_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01430_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01430_a3-optimized.cl b/OpenCL/m01430_a3-optimized.cl index 4a76b5028..60e56fae7 100644 --- a/OpenCL/m01430_a3-optimized.cl +++ b/OpenCL/m01430_a3-optimized.cl @@ -344,7 +344,7 @@ DECLSPEC void m01430s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01430_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -384,7 +384,7 @@ KERNEL_FQ void m01430_m04 (KERN_ATTR_VECTOR ()) m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01430_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -424,7 +424,7 @@ KERNEL_FQ void m01430_m08 (KERN_ATTR_VECTOR ()) m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01430_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -464,7 +464,7 @@ KERNEL_FQ void m01430_m16 (KERN_ATTR_VECTOR ()) m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01430_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -504,7 +504,7 @@ KERNEL_FQ void m01430_s04 (KERN_ATTR_VECTOR ()) m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01430_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -544,7 +544,7 @@ KERNEL_FQ void m01430_s08 (KERN_ATTR_VECTOR ()) m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01430_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01430_a3-pure.cl b/OpenCL/m01430_a3-pure.cl index 24afd1355..87cd121d8 100644 --- a/OpenCL/m01430_a3-pure.cl +++ b/OpenCL/m01430_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01430_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01430_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01430_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01430_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01440_a0-optimized.cl b/OpenCL/m01440_a0-optimized.cl index 60b369eec..20b619abd 100644 --- a/OpenCL/m01440_a0-optimized.cl +++ b/OpenCL/m01440_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01440_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -235,15 +235,15 @@ KERNEL_FQ void m01440_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01440_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01440_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01440_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -481,10 +481,10 @@ KERNEL_FQ void m01440_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01440_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01440_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01440_a0-pure.cl b/OpenCL/m01440_a0-pure.cl index 8b7e6d8d7..5fe4fd6a1 100644 --- a/OpenCL/m01440_a0-pure.cl +++ b/OpenCL/m01440_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01440_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m01440_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01440_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01440_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01440_a1-optimized.cl b/OpenCL/m01440_a1-optimized.cl index 8dd16407c..3d4408445 100644 --- a/OpenCL/m01440_a1-optimized.cl +++ b/OpenCL/m01440_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01440_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -291,15 +291,15 @@ KERNEL_FQ void m01440_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01440_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01440_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01440_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -595,10 +595,10 @@ KERNEL_FQ void m01440_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01440_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01440_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01440_a1-pure.cl b/OpenCL/m01440_a1-pure.cl index aa16fb9dd..de83b2fd9 100644 --- a/OpenCL/m01440_a1-pure.cl +++ b/OpenCL/m01440_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01440_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m01440_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01440_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01440_a3-optimized.cl b/OpenCL/m01440_a3-optimized.cl index bd3dc0512..2f8b3a06c 100644 --- a/OpenCL/m01440_a3-optimized.cl +++ b/OpenCL/m01440_a3-optimized.cl @@ -443,7 +443,7 @@ DECLSPEC void m01440s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01440_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -492,7 +492,7 @@ KERNEL_FQ void m01440_m04 (KERN_ATTR_BASIC ()) m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01440_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -541,7 +541,7 @@ KERNEL_FQ void m01440_m08 (KERN_ATTR_BASIC ()) m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01440_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -590,7 +590,7 @@ KERNEL_FQ void m01440_m16 (KERN_ATTR_BASIC ()) m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01440_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -639,7 +639,7 @@ KERNEL_FQ void m01440_s04 (KERN_ATTR_BASIC ()) m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01440_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -688,7 +688,7 @@ KERNEL_FQ void m01440_s08 (KERN_ATTR_BASIC ()) m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01440_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01440_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01440_a3-pure.cl b/OpenCL/m01440_a3-pure.cl index 8724e78c1..d20546de8 100644 --- a/OpenCL/m01440_a3-pure.cl +++ b/OpenCL/m01440_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01440_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01440_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m01440_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01440_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01440_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01450_a0-optimized.cl b/OpenCL/m01450_a0-optimized.cl index 262641bf3..bf5043c6e 100644 --- a/OpenCL/m01450_a0-optimized.cl +++ b/OpenCL/m01450_a0-optimized.cl @@ -117,7 +117,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m01450_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -231,15 +231,15 @@ KERNEL_FQ void m01450_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01450_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01450_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01450_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -365,10 +365,10 @@ KERNEL_FQ void m01450_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01450_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01450_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01450_a0-pure.cl b/OpenCL/m01450_a0-pure.cl index b2167e229..1d5edb8dd 100644 --- a/OpenCL/m01450_a0-pure.cl +++ b/OpenCL/m01450_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01450_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01450_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01450_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01450_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01450_a1-optimized.cl b/OpenCL/m01450_a1-optimized.cl index 8b75fcf25..42917ce80 100644 --- a/OpenCL/m01450_a1-optimized.cl +++ b/OpenCL/m01450_a1-optimized.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m01450_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -297,15 +297,15 @@ KERNEL_FQ void m01450_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01450_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01450_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01450_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -499,10 +499,10 @@ KERNEL_FQ void m01450_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01450_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01450_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01450_a1-pure.cl b/OpenCL/m01450_a1-pure.cl index 07bdfac62..fda90f7a1 100644 --- a/OpenCL/m01450_a1-pure.cl +++ b/OpenCL/m01450_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01450_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m01450_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01450_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01450_a3-optimized.cl b/OpenCL/m01450_a3-optimized.cl index a88a84100..dad463cf6 100644 --- a/OpenCL/m01450_a3-optimized.cl +++ b/OpenCL/m01450_a3-optimized.cl @@ -331,7 +331,7 @@ DECLSPEC void m01450s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01450_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -380,7 +380,7 @@ KERNEL_FQ void m01450_m04 (KERN_ATTR_BASIC ()) m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01450_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -429,7 +429,7 @@ KERNEL_FQ void m01450_m08 (KERN_ATTR_BASIC ()) m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01450_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -478,7 +478,7 @@ KERNEL_FQ void m01450_m16 (KERN_ATTR_BASIC ()) m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01450_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -527,7 +527,7 @@ KERNEL_FQ void m01450_s04 (KERN_ATTR_BASIC ()) m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01450_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -576,7 +576,7 @@ KERNEL_FQ void m01450_s08 (KERN_ATTR_BASIC ()) m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01450_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01450_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01450_a3-pure.cl b/OpenCL/m01450_a3-pure.cl index 462a22a0c..4f089698c 100644 --- a/OpenCL/m01450_a3-pure.cl +++ b/OpenCL/m01450_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01450_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01450_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m01450_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01450_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01450_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01460_a0-optimized.cl b/OpenCL/m01460_a0-optimized.cl index d3dea0ceb..fab2a2e5f 100644 --- a/OpenCL/m01460_a0-optimized.cl +++ b/OpenCL/m01460_a0-optimized.cl @@ -117,7 +117,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m01460_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -244,15 +244,15 @@ KERNEL_FQ void m01460_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01460_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01460_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01460_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -391,10 +391,10 @@ KERNEL_FQ void m01460_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01460_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01460_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01460_a0-pure.cl b/OpenCL/m01460_a0-pure.cl index 7cdc49d1b..5dc2ba300 100644 --- a/OpenCL/m01460_a0-pure.cl +++ b/OpenCL/m01460_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01460_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01460_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01460_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01460_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01460_a1-optimized.cl b/OpenCL/m01460_a1-optimized.cl index 5fb3c8a90..0ed4b8a8a 100644 --- a/OpenCL/m01460_a1-optimized.cl +++ b/OpenCL/m01460_a1-optimized.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m01460_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -302,15 +302,15 @@ KERNEL_FQ void m01460_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01460_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01460_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01460_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -509,10 +509,10 @@ KERNEL_FQ void m01460_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01460_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01460_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01460_a1-pure.cl b/OpenCL/m01460_a1-pure.cl index 49f0a3ce6..862fa584a 100644 --- a/OpenCL/m01460_a1-pure.cl +++ b/OpenCL/m01460_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01460_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -94,7 +94,7 @@ KERNEL_FQ void m01460_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01460_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01460_a3-optimized.cl b/OpenCL/m01460_a3-optimized.cl index da5e67a07..10c6053e1 100644 --- a/OpenCL/m01460_a3-optimized.cl +++ b/OpenCL/m01460_a3-optimized.cl @@ -327,7 +327,7 @@ DECLSPEC void m01460s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01460_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -376,7 +376,7 @@ KERNEL_FQ void m01460_m04 (KERN_ATTR_BASIC ()) m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01460_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -425,7 +425,7 @@ KERNEL_FQ void m01460_m08 (KERN_ATTR_BASIC ()) m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01460_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -474,7 +474,7 @@ KERNEL_FQ void m01460_m16 (KERN_ATTR_BASIC ()) m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01460_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -523,7 +523,7 @@ KERNEL_FQ void m01460_s04 (KERN_ATTR_BASIC ()) m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01460_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -572,7 +572,7 @@ KERNEL_FQ void m01460_s08 (KERN_ATTR_BASIC ()) m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01460_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01460_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01460_a3-pure.cl b/OpenCL/m01460_a3-pure.cl index 28b359f1c..967677511 100644 --- a/OpenCL/m01460_a3-pure.cl +++ b/OpenCL/m01460_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01460_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01460_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01460_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01460_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01460_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01470_a0-optimized.cl b/OpenCL/m01470_a0-optimized.cl index fa40cecbf..269e2a6a4 100644 --- a/OpenCL/m01470_a0-optimized.cl +++ b/OpenCL/m01470_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m01470_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -182,15 +182,15 @@ KERNEL_FQ void m01470_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01470_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01470_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01470_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -375,10 +375,10 @@ KERNEL_FQ void m01470_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01470_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01470_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01470_a0-pure.cl b/OpenCL/m01470_a0-pure.cl index 1e43c8245..beefea18a 100644 --- a/OpenCL/m01470_a0-pure.cl +++ b/OpenCL/m01470_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01470_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -62,7 +62,7 @@ KERNEL_FQ void m01470_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01470_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01470_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01470_a1-optimized.cl b/OpenCL/m01470_a1-optimized.cl index 06774618e..c528febf8 100644 --- a/OpenCL/m01470_a1-optimized.cl +++ b/OpenCL/m01470_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m01470_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -238,15 +238,15 @@ KERNEL_FQ void m01470_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01470_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01470_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01470_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -489,10 +489,10 @@ KERNEL_FQ void m01470_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01470_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01470_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01470_a1-pure.cl b/OpenCL/m01470_a1-pure.cl index 18ab9488f..971100e6b 100644 --- a/OpenCL/m01470_a1-pure.cl +++ b/OpenCL/m01470_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01470_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01470_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01470_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01470_a3-optimized.cl b/OpenCL/m01470_a3-optimized.cl index 9c8b1519b..d5e287964 100644 --- a/OpenCL/m01470_a3-optimized.cl +++ b/OpenCL/m01470_a3-optimized.cl @@ -345,7 +345,7 @@ DECLSPEC void m01470s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01470_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -394,7 +394,7 @@ KERNEL_FQ void m01470_m04 (KERN_ATTR_BASIC ()) m01470m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01470_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -443,7 +443,7 @@ KERNEL_FQ void m01470_m08 (KERN_ATTR_BASIC ()) m01470m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01470_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -492,7 +492,7 @@ KERNEL_FQ void m01470_m16 (KERN_ATTR_BASIC ()) m01470m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01470_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -541,7 +541,7 @@ KERNEL_FQ void m01470_s04 (KERN_ATTR_BASIC ()) m01470s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01470_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -590,7 +590,7 @@ KERNEL_FQ void m01470_s08 (KERN_ATTR_BASIC ()) m01470s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01470_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01470_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01470_a3-pure.cl b/OpenCL/m01470_a3-pure.cl index fcf36b2d9..fee6f362f 100644 --- a/OpenCL/m01470_a3-pure.cl +++ b/OpenCL/m01470_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m01470_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01470_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -73,7 +73,7 @@ KERNEL_FQ void m01470_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01470_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01470_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01500_a0-pure.cl b/OpenCL/m01500_a0-pure.cl index 7a95576f9..c4f39f20d 100644 --- a/OpenCL/m01500_a0-pure.cl +++ b/OpenCL/m01500_a0-pure.cl @@ -482,7 +482,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, PRIVATE_AS u32 iv[1] = hc_rotl32 (l, 31); } -KERNEL_FQ void m01500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -566,7 +566,7 @@ KERNEL_FQ void m01500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01500_a1-pure.cl b/OpenCL/m01500_a1-pure.cl index 581e708f8..5c5c4e335 100644 --- a/OpenCL/m01500_a1-pure.cl +++ b/OpenCL/m01500_a1-pure.cl @@ -480,7 +480,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, PRIVATE_AS u32x iv[1] = hc_rotl32 (l, 31); } -KERNEL_FQ void m01500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -643,7 +643,7 @@ KERNEL_FQ void m01500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01500_a3-pure.cl b/OpenCL/m01500_a3-pure.cl index 59606e47f..1feeba9c2 100644 --- a/OpenCL/m01500_a3-pure.cl +++ b/OpenCL/m01500_a3-pure.cl @@ -1885,7 +1885,7 @@ DECLSPEC void transpose32c (PRIVATE_AS u32 *data) // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // -KERNEL_FQ void m01500_tm (KERN_ATTR_TM) +KERNEL_FQ KERNEL_FA void m01500_tm (KERN_ATTR_TM) { const u64 gid = get_global_id (0); @@ -1915,11 +1915,11 @@ KERNEL_FQ void m01500_tm (KERN_ATTR_TM) #ifndef DESCRYPT_SALT -KERNEL_FQ void m01500_sxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m01500_sxx (KERN_ATTR_BITSLICE ()) { } -KERNEL_FQ void m01500_mxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m01500_mxx (KERN_ATTR_BITSLICE ()) { /** * base @@ -2294,7 +2294,7 @@ KERNEL_FQ void m01500_mxx (KERN_ATTR_BITSLICE ()) #else -KERNEL_FQ void m01500_sxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m01500_sxx (KERN_ATTR_BITSLICE ()) { /** * base @@ -2688,7 +2688,7 @@ KERNEL_FQ void m01500_sxx (KERN_ATTR_BITSLICE ()) } } -KERNEL_FQ void m01500_mxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m01500_mxx (KERN_ATTR_BITSLICE ()) { } diff --git a/OpenCL/m01600-optimized.cl b/OpenCL/m01600-optimized.cl index 7f5bd7f5e..d113243e1 100644 --- a/OpenCL/m01600-optimized.cl +++ b/OpenCL/m01600-optimized.cl @@ -674,7 +674,7 @@ DECLSPEC void append_1st (PRIVATE_AS u32 *block0, PRIVATE_AS u32 *block1, PRIVAT } } -KERNEL_FQ void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -837,7 +837,7 @@ KERNEL_FQ void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -1025,7 +1025,7 @@ KERNEL_FQ void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m01600_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m01600-pure.cl b/OpenCL/m01600-pure.cl index ac1722da9..96ee4bbb3 100644 --- a/OpenCL/m01600-pure.cl +++ b/OpenCL/m01600-pure.cl @@ -25,7 +25,7 @@ typedef struct md5crypt_tmp #define md5apr1_magic0 0x72706124u #define md5apr1_magic1 0x00002431u -KERNEL_FQ void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -132,7 +132,7 @@ KERNEL_FQ void m01600_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = md5_ctx.h[3]; } -KERNEL_FQ void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -227,7 +227,7 @@ KERNEL_FQ void m01600_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m01600_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01600_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m01700_a0-optimized.cl b/OpenCL/m01700_a0-optimized.cl index 161a6a603..af7f4f89c 100644 --- a/OpenCL/m01700_a0-optimized.cl +++ b/OpenCL/m01700_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -215,15 +215,15 @@ KERNEL_FQ void m01700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -328,10 +328,10 @@ KERNEL_FQ void m01700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01700_a0-pure.cl b/OpenCL/m01700_a0-pure.cl index 254769c54..e71c37b48 100644 --- a/OpenCL/m01700_a0-pure.cl +++ b/OpenCL/m01700_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m01700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01700_a1-optimized.cl b/OpenCL/m01700_a1-optimized.cl index 1112c25d0..d9d7791c6 100644 --- a/OpenCL/m01700_a1-optimized.cl +++ b/OpenCL/m01700_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -271,15 +271,15 @@ KERNEL_FQ void m01700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -442,10 +442,10 @@ KERNEL_FQ void m01700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01700_a1-pure.cl b/OpenCL/m01700_a1-pure.cl index 904d1f118..91b36c2d4 100644 --- a/OpenCL/m01700_a1-pure.cl +++ b/OpenCL/m01700_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01700_a3-optimized.cl b/OpenCL/m01700_a3-optimized.cl index c7f4eebfb..6e6e179fa 100644 --- a/OpenCL/m01700_a3-optimized.cl +++ b/OpenCL/m01700_a3-optimized.cl @@ -256,7 +256,7 @@ DECLSPEC void m01700s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01700_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -296,7 +296,7 @@ KERNEL_FQ void m01700_m04 (KERN_ATTR_VECTOR ()) m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01700_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -336,7 +336,7 @@ KERNEL_FQ void m01700_m08 (KERN_ATTR_VECTOR ()) m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01700_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -376,7 +376,7 @@ KERNEL_FQ void m01700_m16 (KERN_ATTR_VECTOR ()) m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01700_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -416,7 +416,7 @@ KERNEL_FQ void m01700_s04 (KERN_ATTR_VECTOR ()) m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01700_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -456,7 +456,7 @@ KERNEL_FQ void m01700_s08 (KERN_ATTR_VECTOR ()) m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01700_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01700_a3-pure.cl b/OpenCL/m01700_a3-pure.cl index dd04f3616..78b0dcfe4 100644 --- a/OpenCL/m01700_a3-pure.cl +++ b/OpenCL/m01700_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01710_a0-optimized.cl b/OpenCL/m01710_a0-optimized.cl index fa9a024ea..2ec8f8243 100644 --- a/OpenCL/m01710_a0-optimized.cl +++ b/OpenCL/m01710_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01710_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -288,15 +288,15 @@ KERNEL_FQ void m01710_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01710_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01710_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01710_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -474,10 +474,10 @@ KERNEL_FQ void m01710_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01710_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01710_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01710_a0-pure.cl b/OpenCL/m01710_a0-pure.cl index cdf537ae1..f73767598 100644 --- a/OpenCL/m01710_a0-pure.cl +++ b/OpenCL/m01710_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01710_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01710_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01710_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01710_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01710_a1-optimized.cl b/OpenCL/m01710_a1-optimized.cl index bb395f2ae..32f974b09 100644 --- a/OpenCL/m01710_a1-optimized.cl +++ b/OpenCL/m01710_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -346,15 +346,15 @@ KERNEL_FQ void m01710_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -592,10 +592,10 @@ KERNEL_FQ void m01710_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01710_a1-pure.cl b/OpenCL/m01710_a1-pure.cl index e81e1d7e4..a77c2a8a9 100644 --- a/OpenCL/m01710_a1-pure.cl +++ b/OpenCL/m01710_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01710_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m01710_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01710_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01710_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01710_a3-optimized.cl b/OpenCL/m01710_a3-optimized.cl index e2a8aecbe..6ae9344e5 100644 --- a/OpenCL/m01710_a3-optimized.cl +++ b/OpenCL/m01710_a3-optimized.cl @@ -307,7 +307,7 @@ DECLSPEC void m01710s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01710_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -347,7 +347,7 @@ KERNEL_FQ void m01710_m04 (KERN_ATTR_VECTOR ()) m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01710_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m01710_m08 (KERN_ATTR_VECTOR ()) m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01710_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m01710_m16 (KERN_ATTR_VECTOR ()) m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01710_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m01710_s04 (KERN_ATTR_VECTOR ()) m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01710_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m01710_s08 (KERN_ATTR_VECTOR ()) m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01710_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01710_a3-pure.cl b/OpenCL/m01710_a3-pure.cl index 340e2ece0..f27f6a528 100644 --- a/OpenCL/m01710_a3-pure.cl +++ b/OpenCL/m01710_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01710_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01710_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01710_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01710_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01720_a0-optimized.cl b/OpenCL/m01720_a0-optimized.cl index 669108e88..b82a837c6 100644 --- a/OpenCL/m01720_a0-optimized.cl +++ b/OpenCL/m01720_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01720_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -268,15 +268,15 @@ KERNEL_FQ void m01720_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01720_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01720_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01720_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -434,10 +434,10 @@ KERNEL_FQ void m01720_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01720_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01720_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01720_a0-pure.cl b/OpenCL/m01720_a0-pure.cl index 33c9d16d0..443fea316 100644 --- a/OpenCL/m01720_a0-pure.cl +++ b/OpenCL/m01720_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01720_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m01720_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01720_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01720_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01720_a1-optimized.cl b/OpenCL/m01720_a1-optimized.cl index a6882e1c1..158151798 100644 --- a/OpenCL/m01720_a1-optimized.cl +++ b/OpenCL/m01720_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01720_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -324,15 +324,15 @@ KERNEL_FQ void m01720_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01720_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01720_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01720_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -548,10 +548,10 @@ KERNEL_FQ void m01720_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01720_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01720_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01720_a1-pure.cl b/OpenCL/m01720_a1-pure.cl index aa06164df..ed26b6514 100644 --- a/OpenCL/m01720_a1-pure.cl +++ b/OpenCL/m01720_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01720_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m01720_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01720_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01720_a3-optimized.cl b/OpenCL/m01720_a3-optimized.cl index de40817c2..856c65204 100644 --- a/OpenCL/m01720_a3-optimized.cl +++ b/OpenCL/m01720_a3-optimized.cl @@ -362,7 +362,7 @@ DECLSPEC void m01720s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01720_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -411,7 +411,7 @@ KERNEL_FQ void m01720_m04 (KERN_ATTR_BASIC ()) m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01720_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -460,7 +460,7 @@ KERNEL_FQ void m01720_m08 (KERN_ATTR_BASIC ()) m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01720_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -509,7 +509,7 @@ KERNEL_FQ void m01720_m16 (KERN_ATTR_BASIC ()) m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01720_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -558,7 +558,7 @@ KERNEL_FQ void m01720_s04 (KERN_ATTR_BASIC ()) m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01720_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -607,7 +607,7 @@ KERNEL_FQ void m01720_s08 (KERN_ATTR_BASIC ()) m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01720_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01720_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01720_a3-pure.cl b/OpenCL/m01720_a3-pure.cl index ec7a882d5..26cc51ebf 100644 --- a/OpenCL/m01720_a3-pure.cl +++ b/OpenCL/m01720_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01720_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01720_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m01720_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01720_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01720_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01730_a0-optimized.cl b/OpenCL/m01730_a0-optimized.cl index 7638c39f3..311b4df11 100644 --- a/OpenCL/m01730_a0-optimized.cl +++ b/OpenCL/m01730_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01730_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -293,15 +293,15 @@ KERNEL_FQ void m01730_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01730_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01730_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01730_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -484,10 +484,10 @@ KERNEL_FQ void m01730_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01730_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01730_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01730_a0-pure.cl b/OpenCL/m01730_a0-pure.cl index 3b0cd3ebe..fb7c40184 100644 --- a/OpenCL/m01730_a0-pure.cl +++ b/OpenCL/m01730_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01730_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01730_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01730_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01730_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01730_a1-optimized.cl b/OpenCL/m01730_a1-optimized.cl index d491e077d..ea2821c4f 100644 --- a/OpenCL/m01730_a1-optimized.cl +++ b/OpenCL/m01730_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01730_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -351,15 +351,15 @@ KERNEL_FQ void m01730_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01730_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01730_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01730_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -602,10 +602,10 @@ KERNEL_FQ void m01730_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01730_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01730_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01730_a1-pure.cl b/OpenCL/m01730_a1-pure.cl index 88ae2f6ad..6e38be410 100644 --- a/OpenCL/m01730_a1-pure.cl +++ b/OpenCL/m01730_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01730_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m01730_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01730_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01730_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01730_a3-optimized.cl b/OpenCL/m01730_a3-optimized.cl index ecfc09f94..7ca2a5e0a 100644 --- a/OpenCL/m01730_a3-optimized.cl +++ b/OpenCL/m01730_a3-optimized.cl @@ -307,7 +307,7 @@ DECLSPEC void m01730s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01730_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -347,7 +347,7 @@ KERNEL_FQ void m01730_m04 (KERN_ATTR_VECTOR ()) m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01730_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m01730_m08 (KERN_ATTR_VECTOR ()) m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01730_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m01730_m16 (KERN_ATTR_VECTOR ()) m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01730_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m01730_s04 (KERN_ATTR_VECTOR ()) m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01730_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m01730_s08 (KERN_ATTR_VECTOR ()) m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01730_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01730_a3-pure.cl b/OpenCL/m01730_a3-pure.cl index 9f9e0f2e3..4b6911199 100644 --- a/OpenCL/m01730_a3-pure.cl +++ b/OpenCL/m01730_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01730_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01730_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01730_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01730_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01740_a0-optimized.cl b/OpenCL/m01740_a0-optimized.cl index c384bbd39..57eceb1f3 100644 --- a/OpenCL/m01740_a0-optimized.cl +++ b/OpenCL/m01740_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01740_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -273,15 +273,15 @@ KERNEL_FQ void m01740_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01740_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01740_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01740_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -444,10 +444,10 @@ KERNEL_FQ void m01740_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01740_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01740_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01740_a0-pure.cl b/OpenCL/m01740_a0-pure.cl index 1fd0df2ca..5a33f36e6 100644 --- a/OpenCL/m01740_a0-pure.cl +++ b/OpenCL/m01740_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01740_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m01740_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01740_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01740_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01740_a1-optimized.cl b/OpenCL/m01740_a1-optimized.cl index f6a453911..063ad53d1 100644 --- a/OpenCL/m01740_a1-optimized.cl +++ b/OpenCL/m01740_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01740_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -329,15 +329,15 @@ KERNEL_FQ void m01740_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01740_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01740_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01740_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -558,10 +558,10 @@ KERNEL_FQ void m01740_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01740_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01740_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01740_a1-pure.cl b/OpenCL/m01740_a1-pure.cl index 7144b9ab7..b15ab489c 100644 --- a/OpenCL/m01740_a1-pure.cl +++ b/OpenCL/m01740_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01740_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m01740_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01740_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01740_a3-optimized.cl b/OpenCL/m01740_a3-optimized.cl index df4a1c10d..b1b9f8e47 100644 --- a/OpenCL/m01740_a3-optimized.cl +++ b/OpenCL/m01740_a3-optimized.cl @@ -362,7 +362,7 @@ DECLSPEC void m01740s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01740_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -411,7 +411,7 @@ KERNEL_FQ void m01740_m04 (KERN_ATTR_BASIC ()) m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01740_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -460,7 +460,7 @@ KERNEL_FQ void m01740_m08 (KERN_ATTR_BASIC ()) m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01740_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -509,7 +509,7 @@ KERNEL_FQ void m01740_m16 (KERN_ATTR_BASIC ()) m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01740_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -558,7 +558,7 @@ KERNEL_FQ void m01740_s04 (KERN_ATTR_BASIC ()) m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01740_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -607,7 +607,7 @@ KERNEL_FQ void m01740_s08 (KERN_ATTR_BASIC ()) m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01740_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01740_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01740_a3-pure.cl b/OpenCL/m01740_a3-pure.cl index 4e448f353..48cb4485d 100644 --- a/OpenCL/m01740_a3-pure.cl +++ b/OpenCL/m01740_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01740_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01740_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m01740_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01740_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01740_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01750_a0-optimized.cl b/OpenCL/m01750_a0-optimized.cl index 32a7c5c75..d19cdb97c 100644 --- a/OpenCL/m01750_a0-optimized.cl +++ b/OpenCL/m01750_a0-optimized.cl @@ -191,7 +191,7 @@ DECLSPEC void hmac_sha512_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha512_transform_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m01750_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -310,15 +310,15 @@ KERNEL_FQ void m01750_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01750_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01750_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01750_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -449,10 +449,10 @@ KERNEL_FQ void m01750_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01750_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01750_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01750_a0-pure.cl b/OpenCL/m01750_a0-pure.cl index 7fae20f0b..90f9a0b74 100644 --- a/OpenCL/m01750_a0-pure.cl +++ b/OpenCL/m01750_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01750_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01750_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01750_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01750_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01750_a1-optimized.cl b/OpenCL/m01750_a1-optimized.cl index b6925c871..3c8a21025 100644 --- a/OpenCL/m01750_a1-optimized.cl +++ b/OpenCL/m01750_a1-optimized.cl @@ -189,7 +189,7 @@ DECLSPEC void hmac_sha512_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha512_transform_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m01750_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -376,15 +376,15 @@ KERNEL_FQ void m01750_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01750_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01750_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01750_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -583,10 +583,10 @@ KERNEL_FQ void m01750_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01750_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01750_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01750_a1-pure.cl b/OpenCL/m01750_a1-pure.cl index 4c9e99333..135e50d06 100644 --- a/OpenCL/m01750_a1-pure.cl +++ b/OpenCL/m01750_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01750_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m01750_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01750_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01750_a3-optimized.cl b/OpenCL/m01750_a3-optimized.cl index 196c7e597..e422db63c 100644 --- a/OpenCL/m01750_a3-optimized.cl +++ b/OpenCL/m01750_a3-optimized.cl @@ -415,7 +415,7 @@ DECLSPEC void m01750s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01750_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -464,7 +464,7 @@ KERNEL_FQ void m01750_m04 (KERN_ATTR_BASIC ()) m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01750_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -513,7 +513,7 @@ KERNEL_FQ void m01750_m08 (KERN_ATTR_BASIC ()) m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01750_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -562,7 +562,7 @@ KERNEL_FQ void m01750_m16 (KERN_ATTR_BASIC ()) m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01750_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -611,7 +611,7 @@ KERNEL_FQ void m01750_s04 (KERN_ATTR_BASIC ()) m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01750_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -660,7 +660,7 @@ KERNEL_FQ void m01750_s08 (KERN_ATTR_BASIC ()) m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01750_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01750_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01750_a3-pure.cl b/OpenCL/m01750_a3-pure.cl index 297b0f82e..bcb295bf0 100644 --- a/OpenCL/m01750_a3-pure.cl +++ b/OpenCL/m01750_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01750_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01750_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m01750_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01750_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01750_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01760_a0-optimized.cl b/OpenCL/m01760_a0-optimized.cl index 7ce89b233..4b20511c5 100644 --- a/OpenCL/m01760_a0-optimized.cl +++ b/OpenCL/m01760_a0-optimized.cl @@ -191,7 +191,7 @@ DECLSPEC void hmac_sha512_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha512_transform_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m01760_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -323,15 +323,15 @@ KERNEL_FQ void m01760_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01760_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01760_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01760_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -475,10 +475,10 @@ KERNEL_FQ void m01760_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01760_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01760_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01760_a0-pure.cl b/OpenCL/m01760_a0-pure.cl index a1a2f401f..891b11edd 100644 --- a/OpenCL/m01760_a0-pure.cl +++ b/OpenCL/m01760_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01760_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m01760_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01760_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01760_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01760_a1-optimized.cl b/OpenCL/m01760_a1-optimized.cl index 713ede277..b6a67ddfa 100644 --- a/OpenCL/m01760_a1-optimized.cl +++ b/OpenCL/m01760_a1-optimized.cl @@ -189,7 +189,7 @@ DECLSPEC void hmac_sha512_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha512_transform_transport_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m01760_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -381,15 +381,15 @@ KERNEL_FQ void m01760_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01760_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01760_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01760_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -593,10 +593,10 @@ KERNEL_FQ void m01760_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01760_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01760_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01760_a1-pure.cl b/OpenCL/m01760_a1-pure.cl index 9c44ccd33..398bb97b4 100644 --- a/OpenCL/m01760_a1-pure.cl +++ b/OpenCL/m01760_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01760_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -94,7 +94,7 @@ KERNEL_FQ void m01760_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01760_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01760_a3-optimized.cl b/OpenCL/m01760_a3-optimized.cl index 674fee09f..2d83dd07a 100644 --- a/OpenCL/m01760_a3-optimized.cl +++ b/OpenCL/m01760_a3-optimized.cl @@ -411,7 +411,7 @@ DECLSPEC void m01760s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m01760_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -460,7 +460,7 @@ KERNEL_FQ void m01760_m04 (KERN_ATTR_BASIC ()) m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01760_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -509,7 +509,7 @@ KERNEL_FQ void m01760_m08 (KERN_ATTR_BASIC ()) m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01760_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -558,7 +558,7 @@ KERNEL_FQ void m01760_m16 (KERN_ATTR_BASIC ()) m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01760_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -607,7 +607,7 @@ KERNEL_FQ void m01760_s04 (KERN_ATTR_BASIC ()) m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01760_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -656,7 +656,7 @@ KERNEL_FQ void m01760_s08 (KERN_ATTR_BASIC ()) m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01760_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01760_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m01760_a3-pure.cl b/OpenCL/m01760_a3-pure.cl index a929aaf70..91b43658a 100644 --- a/OpenCL/m01760_a3-pure.cl +++ b/OpenCL/m01760_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01760_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01760_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m01760_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01760_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01760_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01770_a0-optimized.cl b/OpenCL/m01770_a0-optimized.cl index b4a9f3eea..e5cc7f117 100644 --- a/OpenCL/m01770_a0-optimized.cl +++ b/OpenCL/m01770_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01770_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -220,15 +220,15 @@ KERNEL_FQ void m01770_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01770_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01770_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01770_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -338,10 +338,10 @@ KERNEL_FQ void m01770_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01770_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m01770_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m01770_a0-pure.cl b/OpenCL/m01770_a0-pure.cl index 462288df8..4f9e35880 100644 --- a/OpenCL/m01770_a0-pure.cl +++ b/OpenCL/m01770_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01770_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m01770_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m01770_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m01770_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m01770_a1-optimized.cl b/OpenCL/m01770_a1-optimized.cl index 41f6a77df..3d39d2fd3 100644 --- a/OpenCL/m01770_a1-optimized.cl +++ b/OpenCL/m01770_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m01770_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -276,15 +276,15 @@ KERNEL_FQ void m01770_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01770_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01770_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01770_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -452,10 +452,10 @@ KERNEL_FQ void m01770_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01770_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m01770_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m01770_a1-pure.cl b/OpenCL/m01770_a1-pure.cl index 46c56dc12..2f547c660 100644 --- a/OpenCL/m01770_a1-pure.cl +++ b/OpenCL/m01770_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01770_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m01770_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m01770_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m01770_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m01770_a3-optimized.cl b/OpenCL/m01770_a3-optimized.cl index 248e644ec..06bf8f2b0 100644 --- a/OpenCL/m01770_a3-optimized.cl +++ b/OpenCL/m01770_a3-optimized.cl @@ -258,7 +258,7 @@ DECLSPEC void m01770s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m01770_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -298,7 +298,7 @@ KERNEL_FQ void m01770_m04 (KERN_ATTR_VECTOR ()) m01770m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01770_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -338,7 +338,7 @@ KERNEL_FQ void m01770_m08 (KERN_ATTR_VECTOR ()) m01770m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01770_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -378,7 +378,7 @@ KERNEL_FQ void m01770_m16 (KERN_ATTR_VECTOR ()) m01770m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01770_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -418,7 +418,7 @@ KERNEL_FQ void m01770_s04 (KERN_ATTR_VECTOR ()) m01770s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01770_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -458,7 +458,7 @@ KERNEL_FQ void m01770_s08 (KERN_ATTR_VECTOR ()) m01770s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m01770_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m01770_a3-pure.cl b/OpenCL/m01770_a3-pure.cl index 7cd13c39c..67f41b4ff 100644 --- a/OpenCL/m01770_a3-pure.cl +++ b/OpenCL/m01770_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m01770_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m01770_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m01770_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m01770_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m01800-optimized.cl b/OpenCL/m01800-optimized.cl index e994b7985..b7c17ad5d 100644 --- a/OpenCL/m01800-optimized.cl +++ b/OpenCL/m01800-optimized.cl @@ -171,7 +171,7 @@ DECLSPEC void orig_sha512_final (PRIVATE_AS orig_sha512_ctx_t *sha512_ctx) sha512_transform_transport (sha512_ctx->buf, sha512_ctx->state); } -KERNEL_FQ void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base @@ -300,7 +300,7 @@ KERNEL_FQ void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) tmps[gid].l_s_bytes[1] = sha512_ctx.state[1]; } -KERNEL_FQ void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base @@ -477,7 +477,7 @@ KERNEL_FQ void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) tmps[gid].l_alt_result[7] = l_alt_result[7]; } -KERNEL_FQ void m01800_comp (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_comp (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base diff --git a/OpenCL/m01800-pure.cl b/OpenCL/m01800-pure.cl index 77bf38ba5..6a7a7efe0 100644 --- a/OpenCL/m01800-pure.cl +++ b/OpenCL/m01800-pure.cl @@ -28,7 +28,7 @@ typedef struct sha512crypt_tmp } sha512crypt_tmp_t; -KERNEL_FQ void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base @@ -313,7 +313,7 @@ KERNEL_FQ void m01800_init (KERN_ATTR_TMPS (sha512crypt_tmp_t)) for (int i = 0; i < 64; i++) tmps[gid].s_bytes[i] = s_final[i]; } -KERNEL_FQ void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base @@ -397,7 +397,7 @@ KERNEL_FQ void m01800_loop (KERN_ATTR_TMPS (sha512crypt_tmp_t)) for (int i = 0; i < 16; i++) tmps[gid].alt_result[i] = alt_result[i]; } -KERNEL_FQ void m01800_comp (KERN_ATTR_TMPS (sha512crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m01800_comp (KERN_ATTR_TMPS (sha512crypt_tmp_t)) { /** * base diff --git a/OpenCL/m02000_a0-optimized.cl b/OpenCL/m02000_a0-optimized.cl index 7b537538e..0a598feb2 100644 --- a/OpenCL/m02000_a0-optimized.cl +++ b/OpenCL/m02000_a0-optimized.cl @@ -10,26 +10,26 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_m04 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_s04 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02000_a0-pure.cl b/OpenCL/m02000_a0-pure.cl index b902aa2c9..443d84c19 100644 --- a/OpenCL/m02000_a0-pure.cl +++ b/OpenCL/m02000_a0-pure.cl @@ -10,10 +10,10 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_mxx (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02000_sxx (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02000_a1-optimized.cl b/OpenCL/m02000_a1-optimized.cl index 248122e0f..59ba09fe6 100644 --- a/OpenCL/m02000_a1-optimized.cl +++ b/OpenCL/m02000_a1-optimized.cl @@ -10,26 +10,26 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m04 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s04 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02000_a1-pure.cl b/OpenCL/m02000_a1-pure.cl index 71a8c9015..654eeceed 100644 --- a/OpenCL/m02000_a1-pure.cl +++ b/OpenCL/m02000_a1-pure.cl @@ -10,10 +10,10 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_mxx (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_sxx (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02000_a3-optimized.cl b/OpenCL/m02000_a3-optimized.cl index 248122e0f..59ba09fe6 100644 --- a/OpenCL/m02000_a3-optimized.cl +++ b/OpenCL/m02000_a3-optimized.cl @@ -10,26 +10,26 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m04 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s04 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02000_a3-pure.cl b/OpenCL/m02000_a3-pure.cl index 71a8c9015..654eeceed 100644 --- a/OpenCL/m02000_a3-pure.cl +++ b/OpenCL/m02000_a3-pure.cl @@ -10,10 +10,10 @@ #include M2S(INCLUDE_PATH/inc_common.cl) #endif -KERNEL_FQ void m02000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_mxx (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02000_sxx (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02100-pure.cl b/OpenCL/m02100-pure.cl index ec97d1d15..a44f889fd 100644 --- a/OpenCL/m02100-pure.cl +++ b/OpenCL/m02100-pure.cl @@ -65,7 +65,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m02100_init (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m02100_init (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base @@ -180,7 +180,7 @@ KERNEL_FQ void m02100_init (KERN_ATTR_TMPS (dcc2_tmp_t)) tmps[gid].out[3] = tmps[gid].dgst[3]; } -KERNEL_FQ void m02100_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m02100_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base @@ -267,7 +267,7 @@ KERNEL_FQ void m02100_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) unpackv (tmps, out, gid, 3, out[3]); } -KERNEL_FQ void m02100_comp (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m02100_comp (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base diff --git a/OpenCL/m02400_a0-optimized.cl b/OpenCL/m02400_a0-optimized.cl index f10aac5cb..89cbcf525 100644 --- a/OpenCL/m02400_a0-optimized.cl +++ b/OpenCL/m02400_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m02400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -177,15 +177,15 @@ KERNEL_FQ void m02400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -361,10 +361,10 @@ KERNEL_FQ void m02400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02400_a1-optimized.cl b/OpenCL/m02400_a1-optimized.cl index 7ad7bd058..c9a1a23ae 100644 --- a/OpenCL/m02400_a1-optimized.cl +++ b/OpenCL/m02400_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m02400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m02400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -487,10 +487,10 @@ KERNEL_FQ void m02400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02400_a3-optimized.cl b/OpenCL/m02400_a3-optimized.cl index b3b3f6d94..02974d53b 100644 --- a/OpenCL/m02400_a3-optimized.cl +++ b/OpenCL/m02400_a3-optimized.cl @@ -453,7 +453,7 @@ DECLSPEC void m02400s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m02400_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -493,7 +493,7 @@ KERNEL_FQ void m02400_m04 (KERN_ATTR_VECTOR ()) m02400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02400_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -533,7 +533,7 @@ KERNEL_FQ void m02400_m08 (KERN_ATTR_VECTOR ()) m02400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02400_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -573,7 +573,7 @@ KERNEL_FQ void m02400_m16 (KERN_ATTR_VECTOR ()) m02400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02400_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -613,7 +613,7 @@ KERNEL_FQ void m02400_s04 (KERN_ATTR_VECTOR ()) m02400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02400_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -653,7 +653,7 @@ KERNEL_FQ void m02400_s08 (KERN_ATTR_VECTOR ()) m02400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02400_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02400_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m02410_a0-optimized.cl b/OpenCL/m02410_a0-optimized.cl index 84ab9e682..4a702680b 100644 --- a/OpenCL/m02410_a0-optimized.cl +++ b/OpenCL/m02410_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m02410_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -256,15 +256,15 @@ KERNEL_FQ void m02410_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02410_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02410_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02410_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -519,10 +519,10 @@ KERNEL_FQ void m02410_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02410_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02410_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02410_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02410_a1-optimized.cl b/OpenCL/m02410_a1-optimized.cl index 8e0045453..934e0d026 100644 --- a/OpenCL/m02410_a1-optimized.cl +++ b/OpenCL/m02410_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m02410_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -314,15 +314,15 @@ KERNEL_FQ void m02410_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02410_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02410_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02410_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -637,10 +637,10 @@ KERNEL_FQ void m02410_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02410_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02410_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02410_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02410_a3-optimized.cl b/OpenCL/m02410_a3-optimized.cl index c5352aadf..5af9e342f 100644 --- a/OpenCL/m02410_a3-optimized.cl +++ b/OpenCL/m02410_a3-optimized.cl @@ -551,7 +551,7 @@ DECLSPEC void m02410s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m02410_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -591,7 +591,7 @@ KERNEL_FQ void m02410_m04 (KERN_ATTR_VECTOR ()) m02410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02410_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -631,7 +631,7 @@ KERNEL_FQ void m02410_m08 (KERN_ATTR_VECTOR ()) m02410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02410_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -671,7 +671,7 @@ KERNEL_FQ void m02410_m16 (KERN_ATTR_VECTOR ()) m02410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02410_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -711,7 +711,7 @@ KERNEL_FQ void m02410_s04 (KERN_ATTR_VECTOR ()) m02410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02410_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -751,7 +751,7 @@ KERNEL_FQ void m02410_s08 (KERN_ATTR_VECTOR ()) m02410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m02410_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02410_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m02500-pure.cl b/OpenCL/m02500-pure.cl index 80bc26bdc..2a4e84b68 100644 --- a/OpenCL/m02500-pure.cl +++ b/OpenCL/m02500-pure.cl @@ -128,7 +128,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m02500_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { /** * base @@ -236,7 +236,7 @@ KERNEL_FQ void m02500_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t) tmps[gid].out[9] = sha1_hmac_ctx2.opad.h[4]; } -KERNEL_FQ void m02500_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -379,12 +379,12 @@ KERNEL_FQ void m02500_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t) unpackv (tmps, out, gid, 9, out[4]); } -KERNEL_FQ void m02500_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { // not in use here, special case... } -KERNEL_FQ void m02500_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -572,7 +572,7 @@ KERNEL_FQ void m02500_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t) } } -KERNEL_FQ void m02500_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -755,7 +755,7 @@ KERNEL_FQ void m02500_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t) } } -KERNEL_FQ void m02500_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02500_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_eapol_t)) { /** * aes shared diff --git a/OpenCL/m02501-pure.cl b/OpenCL/m02501-pure.cl index 6bb174486..24bd5409c 100644 --- a/OpenCL/m02501-pure.cl +++ b/OpenCL/m02501-pure.cl @@ -3,7 +3,7 @@ * License.....: MIT */ -#define NEW_SIMD_CODE +//#define NEW_SIMD_CODE #ifdef KERNEL_STATIC #include M2S(INCLUDE_PATH/inc_vendor.h) @@ -102,7 +102,7 @@ DECLSPEC void make_kn (u32 *k) k[3] ^= c * 0x87000000; } -KERNEL_FQ void m02501_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -148,19 +148,19 @@ KERNEL_FQ void m02501_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) tmps[gid].out[7] = hc_swap32_S (out[7]); } -KERNEL_FQ void m02501_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; } -KERNEL_FQ void m02501_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { // not in use here, special case... } -KERNEL_FQ void m02501_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -348,7 +348,7 @@ KERNEL_FQ void m02501_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) } } -KERNEL_FQ void m02501_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { const u64 gid = get_global_id (0); @@ -531,7 +531,7 @@ KERNEL_FQ void m02501_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) } } -KERNEL_FQ void m02501_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) +KERNEL_FQ KERNEL_FA void m02501_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_eapol_t)) { /** * aes shared diff --git a/OpenCL/m02610_a0-optimized.cl b/OpenCL/m02610_a0-optimized.cl index 47ccd84a5..253136c4c 100644 --- a/OpenCL/m02610_a0-optimized.cl +++ b/OpenCL/m02610_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02610_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -304,15 +304,15 @@ KERNEL_FQ void m02610_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02610_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02610_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02610_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -603,10 +603,10 @@ KERNEL_FQ void m02610_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02610_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02610_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02610_a0-pure.cl b/OpenCL/m02610_a0-pure.cl index ecd7d3319..101a16095 100644 --- a/OpenCL/m02610_a0-pure.cl +++ b/OpenCL/m02610_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02610_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -131,7 +131,7 @@ KERNEL_FQ void m02610_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02610_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02610_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m02610_a1-optimized.cl b/OpenCL/m02610_a1-optimized.cl index 9f05b58d8..1f402a48f 100644 --- a/OpenCL/m02610_a1-optimized.cl +++ b/OpenCL/m02610_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02610_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -361,15 +361,15 @@ KERNEL_FQ void m02610_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02610_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02610_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02610_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -719,10 +719,10 @@ KERNEL_FQ void m02610_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02610_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02610_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02610_a1-pure.cl b/OpenCL/m02610_a1-pure.cl index 569486bd0..d69d19bd9 100644 --- a/OpenCL/m02610_a1-pure.cl +++ b/OpenCL/m02610_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02610_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -127,7 +127,7 @@ KERNEL_FQ void m02610_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02610_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m02610_a3-optimized.cl b/OpenCL/m02610_a3-optimized.cl index bdbf35318..ceaec427b 100644 --- a/OpenCL/m02610_a3-optimized.cl +++ b/OpenCL/m02610_a3-optimized.cl @@ -552,7 +552,7 @@ DECLSPEC void m02610s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m02610_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -622,7 +622,7 @@ KERNEL_FQ void m02610_m04 (KERN_ATTR_BASIC ()) m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02610_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -692,7 +692,7 @@ KERNEL_FQ void m02610_m08 (KERN_ATTR_BASIC ()) m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02610_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -762,7 +762,7 @@ KERNEL_FQ void m02610_m16 (KERN_ATTR_BASIC ()) m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02610_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -832,7 +832,7 @@ KERNEL_FQ void m02610_s04 (KERN_ATTR_BASIC ()) m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02610_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -902,7 +902,7 @@ KERNEL_FQ void m02610_s08 (KERN_ATTR_BASIC ()) m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02610_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02610_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m02610_a3-pure.cl b/OpenCL/m02610_a3-pure.cl index c9ff5c487..dce67c176 100644 --- a/OpenCL/m02610_a3-pure.cl +++ b/OpenCL/m02610_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02610_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02610_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m02610_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m02610_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02610_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m02630_a0-optimized.cl b/OpenCL/m02630_a0-optimized.cl index ceb71f299..03386c7d8 100644 --- a/OpenCL/m02630_a0-optimized.cl +++ b/OpenCL/m02630_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02630_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -370,15 +370,15 @@ KERNEL_FQ void m02630_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02630_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02630_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02630_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -735,10 +735,10 @@ KERNEL_FQ void m02630_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02630_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02630_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02630_a0-pure.cl b/OpenCL/m02630_a0-pure.cl index 6c691a526..f2a3f285d 100644 --- a/OpenCL/m02630_a0-pure.cl +++ b/OpenCL/m02630_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02630_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -137,7 +137,7 @@ KERNEL_FQ void m02630_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02630_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02630_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m02630_a1-optimized.cl b/OpenCL/m02630_a1-optimized.cl index 7f6971c8d..59b660619 100644 --- a/OpenCL/m02630_a1-optimized.cl +++ b/OpenCL/m02630_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -428,15 +428,15 @@ KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02630_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02630_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -853,10 +853,10 @@ KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02630_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02630_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02630_a1-pure.cl b/OpenCL/m02630_a1-pure.cl index 1157dd7d7..4da81a509 100644 --- a/OpenCL/m02630_a1-pure.cl +++ b/OpenCL/m02630_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02630_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m02630_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02630_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m02630_a3-optimized.cl b/OpenCL/m02630_a3-optimized.cl index aa12d6a94..d51e4fa2c 100644 --- a/OpenCL/m02630_a3-optimized.cl +++ b/OpenCL/m02630_a3-optimized.cl @@ -642,7 +642,7 @@ DECLSPEC void m02630s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -712,7 +712,7 @@ KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02630_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -782,7 +782,7 @@ KERNEL_FQ void m02630_m08 (KERN_ATTR_BASIC ()) m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02630_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -852,7 +852,7 @@ KERNEL_FQ void m02630_m16 (KERN_ATTR_BASIC ()) m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -922,7 +922,7 @@ KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) m02630s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02630_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -992,7 +992,7 @@ KERNEL_FQ void m02630_s08 (KERN_ATTR_BASIC ()) m02630s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02630_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02630_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m02630_a3-pure.cl b/OpenCL/m02630_a3-pure.cl index 51c5fb3af..683e1d180 100644 --- a/OpenCL/m02630_a3-pure.cl +++ b/OpenCL/m02630_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02630_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02630_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m02630_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m02630_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02630_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m02710_a0-optimized.cl b/OpenCL/m02710_a0-optimized.cl index 99fca1af1..ce5d2456b 100644 --- a/OpenCL/m02710_a0-optimized.cl +++ b/OpenCL/m02710_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02710_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -389,15 +389,15 @@ KERNEL_FQ void m02710_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02710_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02710_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02710_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -773,10 +773,10 @@ KERNEL_FQ void m02710_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02710_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02710_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02710_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02710_a1-optimized.cl b/OpenCL/m02710_a1-optimized.cl index 5e8b2d4fe..8414e2160 100644 --- a/OpenCL/m02710_a1-optimized.cl +++ b/OpenCL/m02710_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -446,15 +446,15 @@ KERNEL_FQ void m02710_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -889,10 +889,10 @@ KERNEL_FQ void m02710_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02710_a3-optimized.cl b/OpenCL/m02710_a3-optimized.cl index 3c8404772..c21894f76 100644 --- a/OpenCL/m02710_a3-optimized.cl +++ b/OpenCL/m02710_a3-optimized.cl @@ -721,7 +721,7 @@ DECLSPEC void m02710s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m02710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -791,7 +791,7 @@ KERNEL_FQ void m02710_m04 (KERN_ATTR_BASIC ()) m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -861,7 +861,7 @@ KERNEL_FQ void m02710_m08 (KERN_ATTR_BASIC ()) m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -931,7 +931,7 @@ KERNEL_FQ void m02710_m16 (KERN_ATTR_BASIC ()) m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1001,7 +1001,7 @@ KERNEL_FQ void m02710_s04 (KERN_ATTR_BASIC ()) m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1071,7 +1071,7 @@ KERNEL_FQ void m02710_s08 (KERN_ATTR_BASIC ()) m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02710_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m02810_a0-optimized.cl b/OpenCL/m02810_a0-optimized.cl index 38853d0e2..450a53108 100644 --- a/OpenCL/m02810_a0-optimized.cl +++ b/OpenCL/m02810_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02810_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -388,15 +388,15 @@ KERNEL_FQ void m02810_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02810_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02810_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02810_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -771,10 +771,10 @@ KERNEL_FQ void m02810_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02810_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m02810_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m02810_a0-pure.cl b/OpenCL/m02810_a0-pure.cl index 7beaed972..c90833ed0 100644 --- a/OpenCL/m02810_a0-pure.cl +++ b/OpenCL/m02810_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02810_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -154,7 +154,7 @@ KERNEL_FQ void m02810_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m02810_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m02810_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m02810_a1-optimized.cl b/OpenCL/m02810_a1-optimized.cl index 5b61d0e25..914302e5f 100644 --- a/OpenCL/m02810_a1-optimized.cl +++ b/OpenCL/m02810_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02810_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -445,15 +445,15 @@ KERNEL_FQ void m02810_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02810_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02810_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02810_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -887,10 +887,10 @@ KERNEL_FQ void m02810_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02810_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m02810_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m02810_a1-pure.cl b/OpenCL/m02810_a1-pure.cl index 5aa69a11c..693b02b41 100644 --- a/OpenCL/m02810_a1-pure.cl +++ b/OpenCL/m02810_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02810_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -150,7 +150,7 @@ KERNEL_FQ void m02810_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m02810_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m02810_a3-optimized.cl b/OpenCL/m02810_a3-optimized.cl index 5f80b2be3..989ae8a69 100644 --- a/OpenCL/m02810_a3-optimized.cl +++ b/OpenCL/m02810_a3-optimized.cl @@ -719,7 +719,7 @@ DECLSPEC void m02810s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m02810_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -789,7 +789,7 @@ KERNEL_FQ void m02810_m04 (KERN_ATTR_BASIC ()) m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02810_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -859,7 +859,7 @@ KERNEL_FQ void m02810_m08 (KERN_ATTR_BASIC ()) m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02810_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -929,7 +929,7 @@ KERNEL_FQ void m02810_m16 (KERN_ATTR_BASIC ()) m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02810_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -999,7 +999,7 @@ KERNEL_FQ void m02810_s04 (KERN_ATTR_BASIC ()) m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02810_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1069,7 +1069,7 @@ KERNEL_FQ void m02810_s08 (KERN_ATTR_BASIC ()) m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m02810_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m02810_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m02810_a3-pure.cl b/OpenCL/m02810_a3-pure.cl index e970b166e..36fde14ef 100644 --- a/OpenCL/m02810_a3-pure.cl +++ b/OpenCL/m02810_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m02810_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02810_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -163,7 +163,7 @@ KERNEL_FQ void m02810_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m02810_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m02810_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m03000_a0-pure.cl b/OpenCL/m03000_a0-pure.cl index 58c3e7045..1bf3551ef 100644 --- a/OpenCL/m03000_a0-pure.cl +++ b/OpenCL/m03000_a0-pure.cl @@ -492,7 +492,7 @@ DECLSPEC void transform_netntlmv1_key (const u32 w0, const u32x w1, PRIVATE_AS u | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m03000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -577,7 +577,7 @@ KERNEL_FQ void m03000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03000_a1-pure.cl b/OpenCL/m03000_a1-pure.cl index 35929b974..0b9205628 100644 --- a/OpenCL/m03000_a1-pure.cl +++ b/OpenCL/m03000_a1-pure.cl @@ -490,7 +490,7 @@ DECLSPEC void transform_netntlmv1_key (const u32 w0, const u32x w1, PRIVATE_AS u | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m03000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -654,7 +654,7 @@ KERNEL_FQ void m03000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03000_a3-pure.cl b/OpenCL/m03000_a3-pure.cl index 15c24a43e..4cbbb0234 100644 --- a/OpenCL/m03000_a3-pure.cl +++ b/OpenCL/m03000_a3-pure.cl @@ -1730,7 +1730,7 @@ DECLSPEC void transpose32c (PRIVATE_AS u32 *data) // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // -KERNEL_FQ void m03000_tm (KERN_ATTR_TM) +KERNEL_FQ KERNEL_FA void m03000_tm (KERN_ATTR_TM) { const u64 gid = get_global_id (0); @@ -1754,7 +1754,7 @@ KERNEL_FQ void m03000_tm (KERN_ATTR_TM) } } -KERNEL_FQ void m03000_mxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m03000_mxx (KERN_ATTR_BITSLICE ()) { /** * base @@ -2127,7 +2127,7 @@ KERNEL_FQ void m03000_mxx (KERN_ATTR_BITSLICE ()) } } -KERNEL_FQ void m03000_sxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m03000_sxx (KERN_ATTR_BITSLICE ()) { /** * base diff --git a/OpenCL/m03100_a0-optimized.cl b/OpenCL/m03100_a0-optimized.cl index 9bce4928a..a1a131f1c 100644 --- a/OpenCL/m03100_a0-optimized.cl +++ b/OpenCL/m03100_a0-optimized.cl @@ -17,7 +17,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_des.cl) #endif -KERNEL_FQ void m03100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -241,15 +241,15 @@ KERNEL_FQ void m03100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -485,10 +485,10 @@ KERNEL_FQ void m03100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03100_a1-optimized.cl b/OpenCL/m03100_a1-optimized.cl index d027d2650..547e36ca2 100644 --- a/OpenCL/m03100_a1-optimized.cl +++ b/OpenCL/m03100_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_des.cl) #endif -KERNEL_FQ void m03100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -299,15 +299,15 @@ KERNEL_FQ void m03100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -603,10 +603,10 @@ KERNEL_FQ void m03100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03100_a3-optimized.cl b/OpenCL/m03100_a3-optimized.cl index 5c92c78f5..3579a68f4 100644 --- a/OpenCL/m03100_a3-optimized.cl +++ b/OpenCL/m03100_a3-optimized.cl @@ -382,7 +382,7 @@ DECLSPEC void m03100s (SHM_TYPE u32 (*s_SPtrans)[64], SHM_TYPE u32 (*s_skb)[64], } } -KERNEL_FQ void m03100_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_m04 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -465,7 +465,7 @@ KERNEL_FQ void m03100_m04 (KERN_ATTR_VECTOR ()) m03100m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03100_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_m08 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -548,11 +548,11 @@ KERNEL_FQ void m03100_m08 (KERN_ATTR_VECTOR ()) m03100m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03100_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_m16 (KERN_ATTR_VECTOR ()) { } -KERNEL_FQ void m03100_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_s04 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -635,7 +635,7 @@ KERNEL_FQ void m03100_s04 (KERN_ATTR_VECTOR ()) m03100s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03100_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_s08 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -718,6 +718,6 @@ KERNEL_FQ void m03100_s08 (KERN_ATTR_VECTOR ()) m03100s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03100_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03100_s16 (KERN_ATTR_VECTOR ()) { } diff --git a/OpenCL/m03200-pure.cl b/OpenCL/m03200-pure.cl index 2828908d7..5340015ce 100644 --- a/OpenCL/m03200-pure.cl +++ b/OpenCL/m03200-pure.cl @@ -425,7 +425,7 @@ DECLSPEC void expand_key (PRIVATE_AS u32 *E, PRIVATE_AS u32 *W, const int len) } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m03200_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m03200_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -647,7 +647,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m03200_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m03200_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m03200_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -850,7 +850,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m03200_loop (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m03200_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m03200_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m03500_a0-optimized.cl b/OpenCL/m03500_a0-optimized.cl index b24cdecb0..21104d773 100644 --- a/OpenCL/m03500_a0-optimized.cl +++ b/OpenCL/m03500_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -410,15 +410,15 @@ KERNEL_FQ void m03500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -815,10 +815,10 @@ KERNEL_FQ void m03500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03500_a0-pure.cl b/OpenCL/m03500_a0-pure.cl index bf87330c5..5295405f1 100644 --- a/OpenCL/m03500_a0-pure.cl +++ b/OpenCL/m03500_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -161,7 +161,7 @@ KERNEL_FQ void m03500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03500_a1-optimized.cl b/OpenCL/m03500_a1-optimized.cl index 707718fce..bb2c1c46f 100644 --- a/OpenCL/m03500_a1-optimized.cl +++ b/OpenCL/m03500_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -467,15 +467,15 @@ KERNEL_FQ void m03500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -931,10 +931,10 @@ KERNEL_FQ void m03500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03500_a1-pure.cl b/OpenCL/m03500_a1-pure.cl index 66205828e..ae0cd94b3 100644 --- a/OpenCL/m03500_a1-pure.cl +++ b/OpenCL/m03500_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -157,7 +157,7 @@ KERNEL_FQ void m03500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03500_a3-optimized.cl b/OpenCL/m03500_a3-optimized.cl index 1c7972e41..95f7dccac 100644 --- a/OpenCL/m03500_a3-optimized.cl +++ b/OpenCL/m03500_a3-optimized.cl @@ -764,7 +764,7 @@ DECLSPEC void m03500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m03500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -834,7 +834,7 @@ KERNEL_FQ void m03500_m04 (KERN_ATTR_BASIC ()) m03500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -904,7 +904,7 @@ KERNEL_FQ void m03500_m08 (KERN_ATTR_BASIC ()) m03500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -974,7 +974,7 @@ KERNEL_FQ void m03500_m16 (KERN_ATTR_BASIC ()) m03500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1044,7 +1044,7 @@ KERNEL_FQ void m03500_s04 (KERN_ATTR_BASIC ()) m03500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1114,7 +1114,7 @@ KERNEL_FQ void m03500_s08 (KERN_ATTR_BASIC ()) m03500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03500_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m03500_a3-pure.cl b/OpenCL/m03500_a3-pure.cl index c2200b2a1..42aa475a2 100644 --- a/OpenCL/m03500_a3-pure.cl +++ b/OpenCL/m03500_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -170,7 +170,7 @@ KERNEL_FQ void m03500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m03500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m03610_a0-optimized.cl b/OpenCL/m03610_a0-optimized.cl index 7829bf6fd..9bb77ad5f 100644 --- a/OpenCL/m03610_a0-optimized.cl +++ b/OpenCL/m03610_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -408,15 +408,15 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03610_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03610_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -811,10 +811,10 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03610_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03610_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03610_a0-pure.cl b/OpenCL/m03610_a0-pure.cl index 8eec44092..de94a30eb 100644 --- a/OpenCL/m03610_a0-pure.cl +++ b/OpenCL/m03610_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03610_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -161,7 +161,7 @@ KERNEL_FQ void m03610_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03610_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03610_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03610_a1-optimized.cl b/OpenCL/m03610_a1-optimized.cl index b8ed49a7a..3128d1615 100644 --- a/OpenCL/m03610_a1-optimized.cl +++ b/OpenCL/m03610_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -464,15 +464,15 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03610_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03610_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03610_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -925,10 +925,10 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03610_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03610_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03610_a1-pure.cl b/OpenCL/m03610_a1-pure.cl index 2e412d0dd..72695b1c2 100644 --- a/OpenCL/m03610_a1-pure.cl +++ b/OpenCL/m03610_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03610_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -157,7 +157,7 @@ KERNEL_FQ void m03610_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03610_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03610_a3-optimized.cl b/OpenCL/m03610_a3-optimized.cl index 55a6d7bf5..6bd2c0771 100644 --- a/OpenCL/m03610_a3-optimized.cl +++ b/OpenCL/m03610_a3-optimized.cl @@ -758,7 +758,7 @@ DECLSPEC void m03610s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -828,7 +828,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ()) m03610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03610_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -898,7 +898,7 @@ KERNEL_FQ void m03610_m08 (KERN_ATTR_BASIC ()) m03610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03610_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -968,7 +968,7 @@ KERNEL_FQ void m03610_m16 (KERN_ATTR_BASIC ()) m03610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03610_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1038,7 +1038,7 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_BASIC ()) m03610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03610_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1108,7 +1108,7 @@ KERNEL_FQ void m03610_s08 (KERN_ATTR_BASIC ()) m03610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03610_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03610_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m03610_a3-pure.cl b/OpenCL/m03610_a3-pure.cl index 1e622a413..8b628c92e 100644 --- a/OpenCL/m03610_a3-pure.cl +++ b/OpenCL/m03610_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03610_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03610_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -170,7 +170,7 @@ KERNEL_FQ void m03610_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m03610_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03610_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m03710_a0-optimized.cl b/OpenCL/m03710_a0-optimized.cl index 54498ca59..41087021d 100644 --- a/OpenCL/m03710_a0-optimized.cl +++ b/OpenCL/m03710_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03710_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -335,15 +335,15 @@ KERNEL_FQ void m03710_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03710_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03710_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03710_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -665,10 +665,10 @@ KERNEL_FQ void m03710_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03710_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03710_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03710_a0-pure.cl b/OpenCL/m03710_a0-pure.cl index 0f61a73bf..835ed51e8 100644 --- a/OpenCL/m03710_a0-pure.cl +++ b/OpenCL/m03710_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03710_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -144,7 +144,7 @@ KERNEL_FQ void m03710_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03710_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03710_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03710_a1-optimized.cl b/OpenCL/m03710_a1-optimized.cl index c4254ae8d..e127548f4 100644 --- a/OpenCL/m03710_a1-optimized.cl +++ b/OpenCL/m03710_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -392,15 +392,15 @@ KERNEL_FQ void m03710_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -781,10 +781,10 @@ KERNEL_FQ void m03710_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03710_a1-pure.cl b/OpenCL/m03710_a1-pure.cl index af7e112b8..03771e070 100644 --- a/OpenCL/m03710_a1-pure.cl +++ b/OpenCL/m03710_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03710_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m03710_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03710_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03710_a3-optimized.cl b/OpenCL/m03710_a3-optimized.cl index c2d71c934..6bf63fd0e 100644 --- a/OpenCL/m03710_a3-optimized.cl +++ b/OpenCL/m03710_a3-optimized.cl @@ -613,7 +613,7 @@ DECLSPEC void m03710s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m03710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -683,7 +683,7 @@ KERNEL_FQ void m03710_m04 (KERN_ATTR_BASIC ()) m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -753,7 +753,7 @@ KERNEL_FQ void m03710_m08 (KERN_ATTR_BASIC ()) m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -823,7 +823,7 @@ KERNEL_FQ void m03710_m16 (KERN_ATTR_BASIC ()) m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -893,7 +893,7 @@ KERNEL_FQ void m03710_s04 (KERN_ATTR_BASIC ()) m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -963,7 +963,7 @@ KERNEL_FQ void m03710_s08 (KERN_ATTR_BASIC ()) m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03710_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m03710_a3-pure.cl b/OpenCL/m03710_a3-pure.cl index 553672fc5..1c475a0a7 100644 --- a/OpenCL/m03710_a3-pure.cl +++ b/OpenCL/m03710_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03710_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03710_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -153,7 +153,7 @@ KERNEL_FQ void m03710_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m03710_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03710_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m03730_a0-pure.cl b/OpenCL/m03730_a0-pure.cl index d3713e572..9083bf05d 100644 --- a/OpenCL/m03730_a0-pure.cl +++ b/OpenCL/m03730_a0-pure.cl @@ -38,7 +38,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier @@ -156,7 +156,7 @@ KERNEL_FQ void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m03730_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m03730_a1-pure.cl b/OpenCL/m03730_a1-pure.cl index 779f14fa6..2ad5a9e1d 100644 --- a/OpenCL/m03730_a1-pure.cl +++ b/OpenCL/m03730_a1-pure.cl @@ -36,7 +36,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier @@ -152,7 +152,7 @@ KERNEL_FQ void m03730_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m03730_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m03730_a3-pure.cl b/OpenCL/m03730_a3-pure.cl index 903512e24..ae6b84c9a 100644 --- a/OpenCL/m03730_a3-pure.cl +++ b/OpenCL/m03730_a3-pure.cl @@ -36,7 +36,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m03730_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) { /** * modifier @@ -176,7 +176,7 @@ KERNEL_FQ void m03730_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m03730_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m03730_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m03800_a0-optimized.cl b/OpenCL/m03800_a0-optimized.cl index 07a959c00..145e52c68 100644 --- a/OpenCL/m03800_a0-optimized.cl +++ b/OpenCL/m03800_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m03800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -247,15 +247,15 @@ KERNEL_FQ void m03800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -501,10 +501,10 @@ KERNEL_FQ void m03800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03800_a0-pure.cl b/OpenCL/m03800_a0-pure.cl index 191735f2d..7341cd5a7 100644 --- a/OpenCL/m03800_a0-pure.cl +++ b/OpenCL/m03800_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m03800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m03800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03800_a1-optimized.cl b/OpenCL/m03800_a1-optimized.cl index 8b440155a..70b495e88 100644 --- a/OpenCL/m03800_a1-optimized.cl +++ b/OpenCL/m03800_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m03800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -305,15 +305,15 @@ KERNEL_FQ void m03800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -619,10 +619,10 @@ KERNEL_FQ void m03800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03800_a1-pure.cl b/OpenCL/m03800_a1-pure.cl index 5ea3d9b57..1acee959f 100644 --- a/OpenCL/m03800_a1-pure.cl +++ b/OpenCL/m03800_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m03800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m03800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03800_a3-optimized.cl b/OpenCL/m03800_a3-optimized.cl index 0b421306f..9a7265de8 100644 --- a/OpenCL/m03800_a3-optimized.cl +++ b/OpenCL/m03800_a3-optimized.cl @@ -471,7 +471,7 @@ DECLSPEC void m03800s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m03800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -524,7 +524,7 @@ KERNEL_FQ void m03800_m04 (KERN_ATTR_BASIC ()) m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -577,7 +577,7 @@ KERNEL_FQ void m03800_m08 (KERN_ATTR_BASIC ()) m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -630,7 +630,7 @@ KERNEL_FQ void m03800_m16 (KERN_ATTR_BASIC ()) m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -683,7 +683,7 @@ KERNEL_FQ void m03800_s04 (KERN_ATTR_BASIC ()) m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -736,7 +736,7 @@ KERNEL_FQ void m03800_s08 (KERN_ATTR_BASIC ()) m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m03800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03800_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m03800_a3-pure.cl b/OpenCL/m03800_a3-pure.cl index ca1c599e3..4dd5652ff 100644 --- a/OpenCL/m03800_a3-pure.cl +++ b/OpenCL/m03800_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m03800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m03800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m03800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m03910_a0-optimized.cl b/OpenCL/m03910_a0-optimized.cl index e8a305f72..a13a5f5ea 100644 --- a/OpenCL/m03910_a0-optimized.cl +++ b/OpenCL/m03910_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03910_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -388,15 +388,15 @@ KERNEL_FQ void m03910_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03910_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03910_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03910_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -771,10 +771,10 @@ KERNEL_FQ void m03910_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03910_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m03910_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m03910_a0-pure.cl b/OpenCL/m03910_a0-pure.cl index e178e8bf8..367319814 100644 --- a/OpenCL/m03910_a0-pure.cl +++ b/OpenCL/m03910_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03910_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -154,7 +154,7 @@ KERNEL_FQ void m03910_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m03910_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m03910_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m03910_a1-optimized.cl b/OpenCL/m03910_a1-optimized.cl index c759bde95..6a40fbd76 100644 --- a/OpenCL/m03910_a1-optimized.cl +++ b/OpenCL/m03910_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03910_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -445,15 +445,15 @@ KERNEL_FQ void m03910_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03910_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03910_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03910_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -887,10 +887,10 @@ KERNEL_FQ void m03910_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03910_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m03910_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m03910_a1-pure.cl b/OpenCL/m03910_a1-pure.cl index b9421224c..27748d64c 100644 --- a/OpenCL/m03910_a1-pure.cl +++ b/OpenCL/m03910_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03910_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -150,7 +150,7 @@ KERNEL_FQ void m03910_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m03910_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m03910_a3-optimized.cl b/OpenCL/m03910_a3-optimized.cl index 9137008a4..1b82b961a 100644 --- a/OpenCL/m03910_a3-optimized.cl +++ b/OpenCL/m03910_a3-optimized.cl @@ -719,7 +719,7 @@ DECLSPEC void m03910s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m03910_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -789,7 +789,7 @@ KERNEL_FQ void m03910_m04 (KERN_ATTR_BASIC ()) m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03910_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -859,7 +859,7 @@ KERNEL_FQ void m03910_m08 (KERN_ATTR_BASIC ()) m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03910_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -929,7 +929,7 @@ KERNEL_FQ void m03910_m16 (KERN_ATTR_BASIC ()) m03910m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03910_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -999,7 +999,7 @@ KERNEL_FQ void m03910_s04 (KERN_ATTR_BASIC ()) m03910s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03910_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1069,7 +1069,7 @@ KERNEL_FQ void m03910_s08 (KERN_ATTR_BASIC ()) m03910s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m03910_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m03910_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m03910_a3-pure.cl b/OpenCL/m03910_a3-pure.cl index f9b32de2a..318e86ce0 100644 --- a/OpenCL/m03910_a3-pure.cl +++ b/OpenCL/m03910_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m03910_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03910_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -163,7 +163,7 @@ KERNEL_FQ void m03910_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m03910_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m03910_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04010_a0-optimized.cl b/OpenCL/m04010_a0-optimized.cl index 596fa9a0c..981b4b136 100644 --- a/OpenCL/m04010_a0-optimized.cl +++ b/OpenCL/m04010_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04010_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -361,15 +361,15 @@ KERNEL_FQ void m04010_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04010_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04010_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04010_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -717,10 +717,10 @@ KERNEL_FQ void m04010_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04010_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04010_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04010_a0-pure.cl b/OpenCL/m04010_a0-pure.cl index 6485d70dd..4ec77ff15 100644 --- a/OpenCL/m04010_a0-pure.cl +++ b/OpenCL/m04010_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04010_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m04010_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04010_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04010_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04010_a1-optimized.cl b/OpenCL/m04010_a1-optimized.cl index d50efb929..20cd96844 100644 --- a/OpenCL/m04010_a1-optimized.cl +++ b/OpenCL/m04010_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04010_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -417,15 +417,15 @@ KERNEL_FQ void m04010_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04010_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04010_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04010_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -831,10 +831,10 @@ KERNEL_FQ void m04010_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04010_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04010_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04010_a1-pure.cl b/OpenCL/m04010_a1-pure.cl index 084e85ef0..1e717bbf6 100644 --- a/OpenCL/m04010_a1-pure.cl +++ b/OpenCL/m04010_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04010_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -131,7 +131,7 @@ KERNEL_FQ void m04010_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04010_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04010_a3-optimized.cl b/OpenCL/m04010_a3-optimized.cl index 6a52abb00..8442089be 100644 --- a/OpenCL/m04010_a3-optimized.cl +++ b/OpenCL/m04010_a3-optimized.cl @@ -653,7 +653,7 @@ DECLSPEC void m04010s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04010_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -723,7 +723,7 @@ KERNEL_FQ void m04010_m04 (KERN_ATTR_BASIC ()) m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04010_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -793,7 +793,7 @@ KERNEL_FQ void m04010_m08 (KERN_ATTR_BASIC ()) m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04010_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -863,7 +863,7 @@ KERNEL_FQ void m04010_m16 (KERN_ATTR_BASIC ()) m04010m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04010_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -933,7 +933,7 @@ KERNEL_FQ void m04010_s04 (KERN_ATTR_BASIC ()) m04010s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04010_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1003,7 +1003,7 @@ KERNEL_FQ void m04010_s08 (KERN_ATTR_BASIC ()) m04010s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04010_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04010_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04010_a3-pure.cl b/OpenCL/m04010_a3-pure.cl index 4bff07477..0409b60cb 100644 --- a/OpenCL/m04010_a3-pure.cl +++ b/OpenCL/m04010_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04010_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04010_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m04010_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04010_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04010_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04110_a0-optimized.cl b/OpenCL/m04110_a0-optimized.cl index c2e04ac36..68f99f996 100644 --- a/OpenCL/m04110_a0-optimized.cl +++ b/OpenCL/m04110_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04110_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -406,15 +406,15 @@ KERNEL_FQ void m04110_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04110_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04110_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04110_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -807,10 +807,10 @@ KERNEL_FQ void m04110_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04110_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04110_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04110_a0-pure.cl b/OpenCL/m04110_a0-pure.cl index a4fd4f00c..9a9de7f0e 100644 --- a/OpenCL/m04110_a0-pure.cl +++ b/OpenCL/m04110_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04110_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m04110_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04110_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04110_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04110_a1-optimized.cl b/OpenCL/m04110_a1-optimized.cl index cba0aac04..26457d24c 100644 --- a/OpenCL/m04110_a1-optimized.cl +++ b/OpenCL/m04110_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04110_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -464,15 +464,15 @@ KERNEL_FQ void m04110_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04110_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04110_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04110_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -925,10 +925,10 @@ KERNEL_FQ void m04110_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04110_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04110_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04110_a1-pure.cl b/OpenCL/m04110_a1-pure.cl index a1cab9e20..8d34d8305 100644 --- a/OpenCL/m04110_a1-pure.cl +++ b/OpenCL/m04110_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04110_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -144,7 +144,7 @@ KERNEL_FQ void m04110_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04110_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04110_a3-optimized.cl b/OpenCL/m04110_a3-optimized.cl index c01dfa5ae..f98871708 100644 --- a/OpenCL/m04110_a3-optimized.cl +++ b/OpenCL/m04110_a3-optimized.cl @@ -709,7 +709,7 @@ DECLSPEC void m04110s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04110_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -779,7 +779,7 @@ KERNEL_FQ void m04110_m04 (KERN_ATTR_BASIC ()) m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04110_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -849,7 +849,7 @@ KERNEL_FQ void m04110_m08 (KERN_ATTR_BASIC ()) m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04110_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -919,7 +919,7 @@ KERNEL_FQ void m04110_m16 (KERN_ATTR_BASIC ()) m04110m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04110_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -989,7 +989,7 @@ KERNEL_FQ void m04110_s04 (KERN_ATTR_BASIC ()) m04110s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04110_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1059,7 +1059,7 @@ KERNEL_FQ void m04110_s08 (KERN_ATTR_BASIC ()) m04110s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04110_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04110_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04110_a3-pure.cl b/OpenCL/m04110_a3-pure.cl index b30502e58..c1e02f9d7 100644 --- a/OpenCL/m04110_a3-pure.cl +++ b/OpenCL/m04110_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04110_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04110_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -159,7 +159,7 @@ KERNEL_FQ void m04110_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04110_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04110_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04310_a0-optimized.cl b/OpenCL/m04310_a0-optimized.cl index 3dca3c0a4..4b0e75c7a 100644 --- a/OpenCL/m04310_a0-optimized.cl +++ b/OpenCL/m04310_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04310_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -304,15 +304,15 @@ KERNEL_FQ void m04310_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04310_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04310_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04310_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -603,10 +603,10 @@ KERNEL_FQ void m04310_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04310_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04310_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04310_a0-pure.cl b/OpenCL/m04310_a0-pure.cl index cd6abb254..ae988e45d 100644 --- a/OpenCL/m04310_a0-pure.cl +++ b/OpenCL/m04310_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04310_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -131,7 +131,7 @@ KERNEL_FQ void m04310_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04310_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04310_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04310_a1-optimized.cl b/OpenCL/m04310_a1-optimized.cl index b6128578c..779c1a902 100644 --- a/OpenCL/m04310_a1-optimized.cl +++ b/OpenCL/m04310_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04310_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -361,15 +361,15 @@ KERNEL_FQ void m04310_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04310_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04310_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04310_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -719,10 +719,10 @@ KERNEL_FQ void m04310_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04310_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04310_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04310_a1-pure.cl b/OpenCL/m04310_a1-pure.cl index 7087e597d..34810c5b9 100644 --- a/OpenCL/m04310_a1-pure.cl +++ b/OpenCL/m04310_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04310_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -127,7 +127,7 @@ KERNEL_FQ void m04310_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04310_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04310_a3-optimized.cl b/OpenCL/m04310_a3-optimized.cl index 0e2cb3e45..21ca961fe 100644 --- a/OpenCL/m04310_a3-optimized.cl +++ b/OpenCL/m04310_a3-optimized.cl @@ -552,7 +552,7 @@ DECLSPEC void m04310s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04310_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -622,7 +622,7 @@ KERNEL_FQ void m04310_m04 (KERN_ATTR_BASIC ()) m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04310_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -692,7 +692,7 @@ KERNEL_FQ void m04310_m08 (KERN_ATTR_BASIC ()) m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04310_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -762,7 +762,7 @@ KERNEL_FQ void m04310_m16 (KERN_ATTR_BASIC ()) m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04310_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -832,7 +832,7 @@ KERNEL_FQ void m04310_s04 (KERN_ATTR_BASIC ()) m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04310_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -902,7 +902,7 @@ KERNEL_FQ void m04310_s08 (KERN_ATTR_BASIC ()) m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04310_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04310_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04310_a3-pure.cl b/OpenCL/m04310_a3-pure.cl index 2aa0b01b2..63994c713 100644 --- a/OpenCL/m04310_a3-pure.cl +++ b/OpenCL/m04310_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04310_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04310_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m04310_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04310_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04310_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04400_a0-optimized.cl b/OpenCL/m04400_a0-optimized.cl index 22a622863..891bd8da5 100644 --- a/OpenCL/m04400_a0-optimized.cl +++ b/OpenCL/m04400_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -331,15 +331,15 @@ KERNEL_FQ void m04400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -656,10 +656,10 @@ KERNEL_FQ void m04400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04400_a0-pure.cl b/OpenCL/m04400_a0-pure.cl index 378a66ed0..87cd1f4d7 100644 --- a/OpenCL/m04400_a0-pure.cl +++ b/OpenCL/m04400_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -126,7 +126,7 @@ KERNEL_FQ void m04400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04400_a1-optimized.cl b/OpenCL/m04400_a1-optimized.cl index 152fd04e7..314e9cbed 100644 --- a/OpenCL/m04400_a1-optimized.cl +++ b/OpenCL/m04400_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -387,15 +387,15 @@ KERNEL_FQ void m04400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -770,10 +770,10 @@ KERNEL_FQ void m04400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04400_a1-pure.cl b/OpenCL/m04400_a1-pure.cl index 8fc032c46..208523dae 100644 --- a/OpenCL/m04400_a1-pure.cl +++ b/OpenCL/m04400_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -122,7 +122,7 @@ KERNEL_FQ void m04400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04400_a3-optimized.cl b/OpenCL/m04400_a3-optimized.cl index e53ae6b16..3a03611e1 100644 --- a/OpenCL/m04400_a3-optimized.cl +++ b/OpenCL/m04400_a3-optimized.cl @@ -558,7 +558,7 @@ DECLSPEC void m04400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -628,7 +628,7 @@ KERNEL_FQ void m04400_m04 (KERN_ATTR_BASIC ()) m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -698,7 +698,7 @@ KERNEL_FQ void m04400_m08 (KERN_ATTR_BASIC ()) m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -768,7 +768,7 @@ KERNEL_FQ void m04400_m16 (KERN_ATTR_BASIC ()) m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -838,7 +838,7 @@ KERNEL_FQ void m04400_s04 (KERN_ATTR_BASIC ()) m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -908,7 +908,7 @@ KERNEL_FQ void m04400_s08 (KERN_ATTR_BASIC ()) m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04400_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04400_a3-pure.cl b/OpenCL/m04400_a3-pure.cl index c463e627c..71a917453 100644 --- a/OpenCL/m04400_a3-pure.cl +++ b/OpenCL/m04400_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m04400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04410_a0-optimized.cl b/OpenCL/m04410_a0-optimized.cl index 191e1eddf..32fbfcf5a 100644 --- a/OpenCL/m04410_a0-optimized.cl +++ b/OpenCL/m04410_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04410_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -650,15 +650,15 @@ KERNEL_FQ void m04410_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04410_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04410_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04410_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1294,10 +1294,10 @@ KERNEL_FQ void m04410_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04410_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04410_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04410_a0-pure.cl b/OpenCL/m04410_a0-pure.cl index 52c9d8578..b6e2f26f0 100644 --- a/OpenCL/m04410_a0-pure.cl +++ b/OpenCL/m04410_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04410_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m04410_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04410_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04410_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04410_a1-optimized.cl b/OpenCL/m04410_a1-optimized.cl index 813ad365d..bde1a9ff0 100644 --- a/OpenCL/m04410_a1-optimized.cl +++ b/OpenCL/m04410_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04410_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -706,15 +706,15 @@ KERNEL_FQ void m04410_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04410_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04410_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04410_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1408,10 +1408,10 @@ KERNEL_FQ void m04410_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04410_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04410_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04410_a1-pure.cl b/OpenCL/m04410_a1-pure.cl index 4c08d8eb5..2a9f11531 100644 --- a/OpenCL/m04410_a1-pure.cl +++ b/OpenCL/m04410_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04410_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -144,7 +144,7 @@ KERNEL_FQ void m04410_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04410_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04410_a3-optimized.cl b/OpenCL/m04410_a3-optimized.cl index 584999c7e..1a217562e 100644 --- a/OpenCL/m04410_a3-optimized.cl +++ b/OpenCL/m04410_a3-optimized.cl @@ -1196,7 +1196,7 @@ DECLSPEC void m04410s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04410_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1266,7 +1266,7 @@ KERNEL_FQ void m04410_m04 (KERN_ATTR_BASIC ()) m04410m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04410_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1336,7 +1336,7 @@ KERNEL_FQ void m04410_m08 (KERN_ATTR_BASIC ()) m04410m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04410_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1406,7 +1406,7 @@ KERNEL_FQ void m04410_m16 (KERN_ATTR_BASIC ()) m04410m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04410_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1476,7 +1476,7 @@ KERNEL_FQ void m04410_s04 (KERN_ATTR_BASIC ()) m04410s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04410_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1546,7 +1546,7 @@ KERNEL_FQ void m04410_s08 (KERN_ATTR_BASIC ()) m04410s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04410_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04410_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04410_a3-pure.cl b/OpenCL/m04410_a3-pure.cl index 9e2fa1f80..cfd402b9c 100644 --- a/OpenCL/m04410_a3-pure.cl +++ b/OpenCL/m04410_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04410_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04410_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -157,7 +157,7 @@ KERNEL_FQ void m04410_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04410_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04410_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04420_a0-optimized.cl b/OpenCL/m04420_a0-optimized.cl index e071beef3..d1c49c7a5 100644 --- a/OpenCL/m04420_a0-optimized.cl +++ b/OpenCL/m04420_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04420_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -405,15 +405,15 @@ KERNEL_FQ void m04420_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04420_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04420_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04420_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -804,10 +804,10 @@ KERNEL_FQ void m04420_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04420_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04420_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04420_a0-pure.cl b/OpenCL/m04420_a0-pure.cl index a0114a72c..f9a5f9daf 100644 --- a/OpenCL/m04420_a0-pure.cl +++ b/OpenCL/m04420_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04420_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m04420_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04420_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04420_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04420_a1-optimized.cl b/OpenCL/m04420_a1-optimized.cl index 2f688826e..7a17a98e9 100644 --- a/OpenCL/m04420_a1-optimized.cl +++ b/OpenCL/m04420_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -463,15 +463,15 @@ KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04420_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04420_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -922,10 +922,10 @@ KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04420_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04420_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04420_a1-pure.cl b/OpenCL/m04420_a1-pure.cl index 20b17296c..b8a4fbdce 100644 --- a/OpenCL/m04420_a1-pure.cl +++ b/OpenCL/m04420_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04420_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -144,7 +144,7 @@ KERNEL_FQ void m04420_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04420_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04420_a3-optimized.cl b/OpenCL/m04420_a3-optimized.cl index baef3c6a7..df794dccd 100644 --- a/OpenCL/m04420_a3-optimized.cl +++ b/OpenCL/m04420_a3-optimized.cl @@ -706,7 +706,7 @@ DECLSPEC void m04420s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -776,7 +776,7 @@ KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04420_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -846,7 +846,7 @@ KERNEL_FQ void m04420_m08 (KERN_ATTR_BASIC ()) m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04420_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -916,7 +916,7 @@ KERNEL_FQ void m04420_m16 (KERN_ATTR_BASIC ()) m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -986,7 +986,7 @@ KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) m04420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04420_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1056,7 +1056,7 @@ KERNEL_FQ void m04420_s08 (KERN_ATTR_BASIC ()) m04420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04420_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04420_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04420_a3-pure.cl b/OpenCL/m04420_a3-pure.cl index 37727503e..9e4648f6c 100644 --- a/OpenCL/m04420_a3-pure.cl +++ b/OpenCL/m04420_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04420_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04420_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -157,7 +157,7 @@ KERNEL_FQ void m04420_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04420_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04420_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04430_a0-optimized.cl b/OpenCL/m04430_a0-optimized.cl index 4f809d3ff..b82cc7b73 100644 --- a/OpenCL/m04430_a0-optimized.cl +++ b/OpenCL/m04430_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04430_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -385,15 +385,15 @@ KERNEL_FQ void m04430_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04430_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04430_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04430_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -764,10 +764,10 @@ KERNEL_FQ void m04430_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04430_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04430_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04430_a0-pure.cl b/OpenCL/m04430_a0-pure.cl index 60cfea81b..b54521b65 100644 --- a/OpenCL/m04430_a0-pure.cl +++ b/OpenCL/m04430_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04430_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -141,7 +141,7 @@ KERNEL_FQ void m04430_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04430_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04430_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04430_a1-optimized.cl b/OpenCL/m04430_a1-optimized.cl index 43b94cf73..aa6453ace 100644 --- a/OpenCL/m04430_a1-optimized.cl +++ b/OpenCL/m04430_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -441,15 +441,15 @@ KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04430_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04430_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -877,10 +877,10 @@ KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04430_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04430_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04430_a1-pure.cl b/OpenCL/m04430_a1-pure.cl index 3a801e1a2..b990d90fb 100644 --- a/OpenCL/m04430_a1-pure.cl +++ b/OpenCL/m04430_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04430_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m04430_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04430_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04430_a3-optimized.cl b/OpenCL/m04430_a3-optimized.cl index ccca5001c..0914baccc 100644 --- a/OpenCL/m04430_a3-optimized.cl +++ b/OpenCL/m04430_a3-optimized.cl @@ -702,7 +702,7 @@ DECLSPEC void m04430s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -772,7 +772,7 @@ KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04430_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -842,7 +842,7 @@ KERNEL_FQ void m04430_m08 (KERN_ATTR_BASIC ()) m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04430_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -912,7 +912,7 @@ KERNEL_FQ void m04430_m16 (KERN_ATTR_BASIC ()) m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -982,7 +982,7 @@ KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) m04430s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04430_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1052,7 +1052,7 @@ KERNEL_FQ void m04430_s08 (KERN_ATTR_BASIC ()) m04430s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04430_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04430_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04430_a3-pure.cl b/OpenCL/m04430_a3-pure.cl index 54142aeb3..abeaa803c 100644 --- a/OpenCL/m04430_a3-pure.cl +++ b/OpenCL/m04430_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04430_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04430_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -152,7 +152,7 @@ KERNEL_FQ void m04430_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04430_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04430_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04500_a0-optimized.cl b/OpenCL/m04500_a0-optimized.cl index 1adb1c5a1..a4ada9fb0 100644 --- a/OpenCL/m04500_a0-optimized.cl +++ b/OpenCL/m04500_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -357,15 +357,15 @@ KERNEL_FQ void m04500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -715,10 +715,10 @@ KERNEL_FQ void m04500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04500_a0-pure.cl b/OpenCL/m04500_a0-pure.cl index 2704f3b14..34a9e75d7 100644 --- a/OpenCL/m04500_a0-pure.cl +++ b/OpenCL/m04500_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -125,7 +125,7 @@ KERNEL_FQ void m04500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04500_a1-optimized.cl b/OpenCL/m04500_a1-optimized.cl index cb4a9af2b..27251248a 100644 --- a/OpenCL/m04500_a1-optimized.cl +++ b/OpenCL/m04500_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -413,15 +413,15 @@ KERNEL_FQ void m04500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -829,10 +829,10 @@ KERNEL_FQ void m04500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04500_a1-pure.cl b/OpenCL/m04500_a1-pure.cl index 7a7fefce3..0aac24706 100644 --- a/OpenCL/m04500_a1-pure.cl +++ b/OpenCL/m04500_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -121,7 +121,7 @@ KERNEL_FQ void m04500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04500_a3-optimized.cl b/OpenCL/m04500_a3-optimized.cl index d03a86232..e689f0716 100644 --- a/OpenCL/m04500_a3-optimized.cl +++ b/OpenCL/m04500_a3-optimized.cl @@ -617,7 +617,7 @@ DECLSPEC void m04500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -687,7 +687,7 @@ KERNEL_FQ void m04500_m04 (KERN_ATTR_BASIC ()) m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -757,7 +757,7 @@ KERNEL_FQ void m04500_m08 (KERN_ATTR_BASIC ()) m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -827,7 +827,7 @@ KERNEL_FQ void m04500_m16 (KERN_ATTR_BASIC ()) m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -897,7 +897,7 @@ KERNEL_FQ void m04500_s04 (KERN_ATTR_BASIC ()) m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -967,7 +967,7 @@ KERNEL_FQ void m04500_s08 (KERN_ATTR_BASIC ()) m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04500_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04500_a3-pure.cl b/OpenCL/m04500_a3-pure.cl index 1811b6f18..3517541fc 100644 --- a/OpenCL/m04500_a3-pure.cl +++ b/OpenCL/m04500_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -134,7 +134,7 @@ KERNEL_FQ void m04500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04510_a0-optimized.cl b/OpenCL/m04510_a0-optimized.cl index 59b5994f5..945d341d0 100644 --- a/OpenCL/m04510_a0-optimized.cl +++ b/OpenCL/m04510_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04510_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1024,15 +1024,15 @@ KERNEL_FQ void m04510_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04510_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04510_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04510_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -2045,10 +2045,10 @@ KERNEL_FQ void m04510_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04510_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04510_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04510_a0-pure.cl b/OpenCL/m04510_a0-pure.cl index a3be7b535..f7d2ea92b 100644 --- a/OpenCL/m04510_a0-pure.cl +++ b/OpenCL/m04510_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04510_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -131,7 +131,7 @@ KERNEL_FQ void m04510_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04510_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04510_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04510_a1-optimized.cl b/OpenCL/m04510_a1-optimized.cl index 5c94dbbd1..f4627d4a4 100644 --- a/OpenCL/m04510_a1-optimized.cl +++ b/OpenCL/m04510_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04510_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1079,15 +1079,15 @@ KERNEL_FQ void m04510_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04510_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04510_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04510_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -2157,10 +2157,10 @@ KERNEL_FQ void m04510_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04510_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04510_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04510_a1-pure.cl b/OpenCL/m04510_a1-pure.cl index 885cee178..02f37b99e 100644 --- a/OpenCL/m04510_a1-pure.cl +++ b/OpenCL/m04510_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04510_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -127,7 +127,7 @@ KERNEL_FQ void m04510_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04510_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04510_a3-optimized.cl b/OpenCL/m04510_a3-optimized.cl index 685b6f9a8..c449f79fc 100644 --- a/OpenCL/m04510_a3-optimized.cl +++ b/OpenCL/m04510_a3-optimized.cl @@ -1947,7 +1947,7 @@ DECLSPEC void m04510s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04510_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -2017,7 +2017,7 @@ KERNEL_FQ void m04510_m04 (KERN_ATTR_BASIC ()) m04510m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04510_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -2087,7 +2087,7 @@ KERNEL_FQ void m04510_m08 (KERN_ATTR_BASIC ()) m04510m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04510_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -2157,7 +2157,7 @@ KERNEL_FQ void m04510_m16 (KERN_ATTR_BASIC ()) m04510m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04510_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -2227,7 +2227,7 @@ KERNEL_FQ void m04510_s04 (KERN_ATTR_BASIC ()) m04510s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04510_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -2297,7 +2297,7 @@ KERNEL_FQ void m04510_s08 (KERN_ATTR_BASIC ()) m04510s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04510_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04510_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04510_a3-pure.cl b/OpenCL/m04510_a3-pure.cl index c9d578819..f37739add 100644 --- a/OpenCL/m04510_a3-pure.cl +++ b/OpenCL/m04510_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04510_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04510_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m04510_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04510_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04510_sxx (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m04520_a0-optimized.cl b/OpenCL/m04520_a0-optimized.cl index 52aa26687..eb446e0eb 100644 --- a/OpenCL/m04520_a0-optimized.cl +++ b/OpenCL/m04520_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04520_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_m04 (KERN_ATTR_RULES ()) { /** * base @@ -588,15 +588,15 @@ KERNEL_FQ void m04520_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04520_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04520_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04520_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_s04 (KERN_ATTR_RULES ()) { /** * base @@ -1168,10 +1168,10 @@ KERNEL_FQ void m04520_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04520_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04520_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04520_a0-pure.cl b/OpenCL/m04520_a0-pure.cl index f87c1521b..060a50412 100644 --- a/OpenCL/m04520_a0-pure.cl +++ b/OpenCL/m04520_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04520_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m04520_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04520_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04520_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04520_a1-optimized.cl b/OpenCL/m04520_a1-optimized.cl index 58a4c9fbd..4f430379d 100644 --- a/OpenCL/m04520_a1-optimized.cl +++ b/OpenCL/m04520_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04520_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -644,15 +644,15 @@ KERNEL_FQ void m04520_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04520_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04520_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04520_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1282,10 +1282,10 @@ KERNEL_FQ void m04520_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04520_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04520_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04520_a1-pure.cl b/OpenCL/m04520_a1-pure.cl index 03c5370a2..909120ec4 100644 --- a/OpenCL/m04520_a1-pure.cl +++ b/OpenCL/m04520_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04520_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -136,7 +136,7 @@ KERNEL_FQ void m04520_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04520_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04520_a3-optimized.cl b/OpenCL/m04520_a3-optimized.cl index 563da5b9d..eba840108 100644 --- a/OpenCL/m04520_a3-optimized.cl +++ b/OpenCL/m04520_a3-optimized.cl @@ -1070,7 +1070,7 @@ DECLSPEC void m04520s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04520_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1140,7 +1140,7 @@ KERNEL_FQ void m04520_m04 (KERN_ATTR_BASIC ()) m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04520_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1210,7 +1210,7 @@ KERNEL_FQ void m04520_m08 (KERN_ATTR_BASIC ()) m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04520_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1280,7 +1280,7 @@ KERNEL_FQ void m04520_m16 (KERN_ATTR_BASIC ()) m04520m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04520_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1350,7 +1350,7 @@ KERNEL_FQ void m04520_s04 (KERN_ATTR_BASIC ()) m04520s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04520_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1420,7 +1420,7 @@ KERNEL_FQ void m04520_s08 (KERN_ATTR_BASIC ()) m04520s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04520_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04520_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04520_a3-pure.cl b/OpenCL/m04520_a3-pure.cl index 0ae4e54b4..3b393a9b7 100644 --- a/OpenCL/m04520_a3-pure.cl +++ b/OpenCL/m04520_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04520_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04520_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -151,7 +151,7 @@ KERNEL_FQ void m04520_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04520_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04520_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04700_a0-optimized.cl b/OpenCL/m04700_a0-optimized.cl index d89787e1b..5ebc61e52 100644 --- a/OpenCL/m04700_a0-optimized.cl +++ b/OpenCL/m04700_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -314,15 +314,15 @@ KERNEL_FQ void m04700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -628,10 +628,10 @@ KERNEL_FQ void m04700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04700_a0-pure.cl b/OpenCL/m04700_a0-pure.cl index 32c24fafd..3a48346fe 100644 --- a/OpenCL/m04700_a0-pure.cl +++ b/OpenCL/m04700_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -121,7 +121,7 @@ KERNEL_FQ void m04700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04700_a1-optimized.cl b/OpenCL/m04700_a1-optimized.cl index 54b141681..3cd748109 100644 --- a/OpenCL/m04700_a1-optimized.cl +++ b/OpenCL/m04700_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -367,15 +367,15 @@ KERNEL_FQ void m04700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -736,10 +736,10 @@ KERNEL_FQ void m04700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04700_a1-pure.cl b/OpenCL/m04700_a1-pure.cl index e5f1465a5..beda5345a 100644 --- a/OpenCL/m04700_a1-pure.cl +++ b/OpenCL/m04700_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -117,7 +117,7 @@ KERNEL_FQ void m04700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04700_a3-optimized.cl b/OpenCL/m04700_a3-optimized.cl index 91d329c4b..bbca7ef7c 100644 --- a/OpenCL/m04700_a3-optimized.cl +++ b/OpenCL/m04700_a3-optimized.cl @@ -558,7 +558,7 @@ DECLSPEC void m04700s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -628,7 +628,7 @@ KERNEL_FQ void m04700_m04 (KERN_ATTR_BASIC ()) m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -698,7 +698,7 @@ KERNEL_FQ void m04700_m08 (KERN_ATTR_BASIC ()) m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -768,7 +768,7 @@ KERNEL_FQ void m04700_m16 (KERN_ATTR_BASIC ()) m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -838,7 +838,7 @@ KERNEL_FQ void m04700_s04 (KERN_ATTR_BASIC ()) m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -908,7 +908,7 @@ KERNEL_FQ void m04700_s08 (KERN_ATTR_BASIC ()) m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04700_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04700_a3-pure.cl b/OpenCL/m04700_a3-pure.cl index eadeb2a68..9231b2eec 100644 --- a/OpenCL/m04700_a3-pure.cl +++ b/OpenCL/m04700_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -130,7 +130,7 @@ KERNEL_FQ void m04700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04710_a0-optimized.cl b/OpenCL/m04710_a0-optimized.cl index ea50b7d79..f1066a2e4 100644 --- a/OpenCL/m04710_a0-optimized.cl +++ b/OpenCL/m04710_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04710_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -724,15 +724,15 @@ KERNEL_FQ void m04710_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04710_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04710_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04710_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1443,10 +1443,10 @@ KERNEL_FQ void m04710_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04710_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04710_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04710_a0-pure.cl b/OpenCL/m04710_a0-pure.cl index ddec6b202..21d579855 100644 --- a/OpenCL/m04710_a0-pure.cl +++ b/OpenCL/m04710_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04710_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -146,7 +146,7 @@ KERNEL_FQ void m04710_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04710_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04710_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04710_a1-optimized.cl b/OpenCL/m04710_a1-optimized.cl index 248903fbc..dfa30d855 100644 --- a/OpenCL/m04710_a1-optimized.cl +++ b/OpenCL/m04710_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -777,15 +777,15 @@ KERNEL_FQ void m04710_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1551,10 +1551,10 @@ KERNEL_FQ void m04710_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04710_a1-pure.cl b/OpenCL/m04710_a1-pure.cl index 1c71a09d8..b3566e3b4 100644 --- a/OpenCL/m04710_a1-pure.cl +++ b/OpenCL/m04710_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04710_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -142,7 +142,7 @@ KERNEL_FQ void m04710_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04710_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04710_a3-optimized.cl b/OpenCL/m04710_a3-optimized.cl index 9fad29489..1015e1ea0 100644 --- a/OpenCL/m04710_a3-optimized.cl +++ b/OpenCL/m04710_a3-optimized.cl @@ -1373,7 +1373,7 @@ DECLSPEC void m04710s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1443,7 +1443,7 @@ KERNEL_FQ void m04710_m04 (KERN_ATTR_BASIC ()) m04710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1513,7 +1513,7 @@ KERNEL_FQ void m04710_m08 (KERN_ATTR_BASIC ()) m04710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1583,7 +1583,7 @@ KERNEL_FQ void m04710_m16 (KERN_ATTR_BASIC ()) m04710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1653,7 +1653,7 @@ KERNEL_FQ void m04710_s04 (KERN_ATTR_BASIC ()) m04710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1723,7 +1723,7 @@ KERNEL_FQ void m04710_s08 (KERN_ATTR_BASIC ()) m04710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m04710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04710_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04710_a3-pure.cl b/OpenCL/m04710_a3-pure.cl index f60f385f8..f30c850e1 100644 --- a/OpenCL/m04710_a3-pure.cl +++ b/OpenCL/m04710_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04710_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04710_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -155,7 +155,7 @@ KERNEL_FQ void m04710_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04710_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04710_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04800_a0-optimized.cl b/OpenCL/m04800_a0-optimized.cl index d0142f1f7..7b5f724bb 100644 --- a/OpenCL/m04800_a0-optimized.cl +++ b/OpenCL/m04800_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m04800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -213,15 +213,15 @@ KERNEL_FQ void m04800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -433,10 +433,10 @@ KERNEL_FQ void m04800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04800_a0-pure.cl b/OpenCL/m04800_a0-pure.cl index a8b8549f1..446663598 100644 --- a/OpenCL/m04800_a0-pure.cl +++ b/OpenCL/m04800_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m04800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -77,7 +77,7 @@ KERNEL_FQ void m04800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04800_a1-optimized.cl b/OpenCL/m04800_a1-optimized.cl index 4f09e63ae..06d721f10 100644 --- a/OpenCL/m04800_a1-optimized.cl +++ b/OpenCL/m04800_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m04800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -283,15 +283,15 @@ KERNEL_FQ void m04800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -563,10 +563,10 @@ KERNEL_FQ void m04800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04800_a1-pure.cl b/OpenCL/m04800_a1-pure.cl index 2328b1dbd..daf93e493 100644 --- a/OpenCL/m04800_a1-pure.cl +++ b/OpenCL/m04800_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m04800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m04800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04800_a3-optimized.cl b/OpenCL/m04800_a3-optimized.cl index 9f59e50b8..97f3d4113 100644 --- a/OpenCL/m04800_a3-optimized.cl +++ b/OpenCL/m04800_a3-optimized.cl @@ -391,7 +391,7 @@ DECLSPEC void m04800s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -444,7 +444,7 @@ KERNEL_FQ void m04800_m04 (KERN_ATTR_BASIC ()) m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -497,7 +497,7 @@ KERNEL_FQ void m04800_m08 (KERN_ATTR_BASIC ()) m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -550,7 +550,7 @@ KERNEL_FQ void m04800_m16 (KERN_ATTR_BASIC ()) m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -603,7 +603,7 @@ KERNEL_FQ void m04800_s04 (KERN_ATTR_BASIC ()) m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -656,7 +656,7 @@ KERNEL_FQ void m04800_s08 (KERN_ATTR_BASIC ()) m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04800_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04800_a3-pure.cl b/OpenCL/m04800_a3-pure.cl index 0a7619700..4186e675e 100644 --- a/OpenCL/m04800_a3-pure.cl +++ b/OpenCL/m04800_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m04800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -88,7 +88,7 @@ KERNEL_FQ void m04800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m04900_a0-optimized.cl b/OpenCL/m04900_a0-optimized.cl index 758f48497..d731b60af 100644 --- a/OpenCL/m04900_a0-optimized.cl +++ b/OpenCL/m04900_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m04900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -288,15 +288,15 @@ KERNEL_FQ void m04900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -589,10 +589,10 @@ KERNEL_FQ void m04900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m04900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m04900_a0-pure.cl b/OpenCL/m04900_a0-pure.cl index c16962c10..e393fcea7 100644 --- a/OpenCL/m04900_a0-pure.cl +++ b/OpenCL/m04900_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m04900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m04900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m04900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m04900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m04900_a1-optimized.cl b/OpenCL/m04900_a1-optimized.cl index d14164a89..062e533ca 100644 --- a/OpenCL/m04900_a1-optimized.cl +++ b/OpenCL/m04900_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m04900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -346,15 +346,15 @@ KERNEL_FQ void m04900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -707,10 +707,10 @@ KERNEL_FQ void m04900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m04900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m04900_a1-pure.cl b/OpenCL/m04900_a1-pure.cl index 99ac40da6..fe7ea6bff 100644 --- a/OpenCL/m04900_a1-pure.cl +++ b/OpenCL/m04900_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m04900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m04900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m04900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m04900_a3-optimized.cl b/OpenCL/m04900_a3-optimized.cl index 31e3b3e14..ca4d6f037 100644 --- a/OpenCL/m04900_a3-optimized.cl +++ b/OpenCL/m04900_a3-optimized.cl @@ -563,7 +563,7 @@ DECLSPEC void m04900s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m04900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -616,7 +616,7 @@ KERNEL_FQ void m04900_m04 (KERN_ATTR_BASIC ()) m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -669,7 +669,7 @@ KERNEL_FQ void m04900_m08 (KERN_ATTR_BASIC ()) m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -722,7 +722,7 @@ KERNEL_FQ void m04900_m16 (KERN_ATTR_BASIC ()) m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -775,7 +775,7 @@ KERNEL_FQ void m04900_s04 (KERN_ATTR_BASIC ()) m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -828,7 +828,7 @@ KERNEL_FQ void m04900_s08 (KERN_ATTR_BASIC ()) m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m04900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m04900_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m04900_a3-pure.cl b/OpenCL/m04900_a3-pure.cl index 1b2999879..e3bcd5eeb 100644 --- a/OpenCL/m04900_a3-pure.cl +++ b/OpenCL/m04900_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m04900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m04900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m04900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m04900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m05000_a0-optimized.cl b/OpenCL/m05000_a0-optimized.cl index af98d5922..0c40ac0ca 100644 --- a/OpenCL/m05000_a0-optimized.cl +++ b/OpenCL/m05000_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m05000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -458,15 +458,15 @@ KERNEL_FQ void m05000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -917,10 +917,10 @@ KERNEL_FQ void m05000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m05000_a0-pure.cl b/OpenCL/m05000_a0-pure.cl index 7733bc064..8b37666a9 100644 --- a/OpenCL/m05000_a0-pure.cl +++ b/OpenCL/m05000_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m05000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m05000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m05000_a1-optimized.cl b/OpenCL/m05000_a1-optimized.cl index 84d227e1f..d7ddd83dd 100644 --- a/OpenCL/m05000_a1-optimized.cl +++ b/OpenCL/m05000_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m05000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -516,15 +516,15 @@ KERNEL_FQ void m05000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1035,10 +1035,10 @@ KERNEL_FQ void m05000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m05000_a1-pure.cl b/OpenCL/m05000_a1-pure.cl index d96c0bf90..485299b48 100644 --- a/OpenCL/m05000_a1-pure.cl +++ b/OpenCL/m05000_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m05000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -134,7 +134,7 @@ KERNEL_FQ void m05000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m05000_a3-optimized.cl b/OpenCL/m05000_a3-optimized.cl index 2b7de0385..1337eae0b 100644 --- a/OpenCL/m05000_a3-optimized.cl +++ b/OpenCL/m05000_a3-optimized.cl @@ -855,7 +855,7 @@ DECLSPEC void m05000s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m05000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -921,7 +921,7 @@ KERNEL_FQ void m05000_m04 (KERN_ATTR_BASIC ()) m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m05000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -987,7 +987,7 @@ KERNEL_FQ void m05000_m08 (KERN_ATTR_BASIC ()) m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m05000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1053,7 +1053,7 @@ KERNEL_FQ void m05000_m16 (KERN_ATTR_BASIC ()) m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m05000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1119,7 +1119,7 @@ KERNEL_FQ void m05000_s04 (KERN_ATTR_BASIC ()) m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m05000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1185,7 +1185,7 @@ KERNEL_FQ void m05000_s08 (KERN_ATTR_BASIC ()) m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m05000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05000_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m05000_a3-pure.cl b/OpenCL/m05000_a3-pure.cl index ef86170d6..29db44cca 100644 --- a/OpenCL/m05000_a3-pure.cl +++ b/OpenCL/m05000_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m05000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -151,7 +151,7 @@ KERNEL_FQ void m05000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m05000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m05100_a0-optimized.cl b/OpenCL/m05100_a0-optimized.cl index 17ea18179..365f18153 100644 --- a/OpenCL/m05100_a0-optimized.cl +++ b/OpenCL/m05100_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m05100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -156,15 +156,15 @@ KERNEL_FQ void m05100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -316,10 +316,10 @@ KERNEL_FQ void m05100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m05100_a0-pure.cl b/OpenCL/m05100_a0-pure.cl index 77915b5cf..6dd302f07 100644 --- a/OpenCL/m05100_a0-pure.cl +++ b/OpenCL/m05100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m05100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m05100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m05100_a1-optimized.cl b/OpenCL/m05100_a1-optimized.cl index 33805c09b..b1067f98a 100644 --- a/OpenCL/m05100_a1-optimized.cl +++ b/OpenCL/m05100_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m05100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -209,15 +209,15 @@ KERNEL_FQ void m05100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -424,10 +424,10 @@ KERNEL_FQ void m05100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m05100_a1-pure.cl b/OpenCL/m05100_a1-pure.cl index 630fa692f..450a51554 100644 --- a/OpenCL/m05100_a1-pure.cl +++ b/OpenCL/m05100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m05100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m05100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m05100_a3-optimized.cl b/OpenCL/m05100_a3-optimized.cl index 7bb0ab257..8078f768b 100644 --- a/OpenCL/m05100_a3-optimized.cl +++ b/OpenCL/m05100_a3-optimized.cl @@ -290,7 +290,7 @@ DECLSPEC void m05100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m05100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -339,7 +339,7 @@ KERNEL_FQ void m05100_m04 (KERN_ATTR_BASIC ()) m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -388,7 +388,7 @@ KERNEL_FQ void m05100_m08 (KERN_ATTR_BASIC ()) m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -437,7 +437,7 @@ KERNEL_FQ void m05100_m16 (KERN_ATTR_BASIC ()) m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -486,7 +486,7 @@ KERNEL_FQ void m05100_s04 (KERN_ATTR_BASIC ()) m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -535,7 +535,7 @@ KERNEL_FQ void m05100_s08 (KERN_ATTR_BASIC ()) m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05100_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m05100_a3-pure.cl b/OpenCL/m05100_a3-pure.cl index 559bc5f9c..71751804e 100644 --- a/OpenCL/m05100_a3-pure.cl +++ b/OpenCL/m05100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m05100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -73,7 +73,7 @@ KERNEL_FQ void m05100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m05100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m05200-pure.cl b/OpenCL/m05200-pure.cl index 57aea1a72..2fc06f2b9 100644 --- a/OpenCL/m05200-pure.cl +++ b/OpenCL/m05200-pure.cl @@ -23,7 +23,7 @@ typedef struct pwsafe3_tmp } pwsafe3_tmp_t; -KERNEL_FQ void m05200_init (KERN_ATTR_TMPS (pwsafe3_tmp_t)) +KERNEL_FQ KERNEL_FA void m05200_init (KERN_ATTR_TMPS (pwsafe3_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m05200_init (KERN_ATTR_TMPS (pwsafe3_tmp_t)) tmps[gid].digest_buf[7] = ctx.h[7]; } -KERNEL_FQ void m05200_loop (KERN_ATTR_TMPS (pwsafe3_tmp_t)) +KERNEL_FQ KERNEL_FA void m05200_loop (KERN_ATTR_TMPS (pwsafe3_tmp_t)) { const u64 gid = get_global_id (0); @@ -120,7 +120,7 @@ KERNEL_FQ void m05200_loop (KERN_ATTR_TMPS (pwsafe3_tmp_t)) unpackv (tmps, digest_buf, gid, 7, digest[7]); } -KERNEL_FQ void m05200_comp (KERN_ATTR_TMPS (pwsafe3_tmp_t)) +KERNEL_FQ KERNEL_FA void m05200_comp (KERN_ATTR_TMPS (pwsafe3_tmp_t)) { /** * modifier diff --git a/OpenCL/m05300_a0-optimized.cl b/OpenCL/m05300_a0-optimized.cl index 2d0ed29b9..5ff12ea49 100644 --- a/OpenCL/m05300_a0-optimized.cl +++ b/OpenCL/m05300_a0-optimized.cl @@ -111,7 +111,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05300_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -278,15 +278,15 @@ KERNEL_FQ void m05300_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_m08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_m16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -465,10 +465,10 @@ KERNEL_FQ void m05300_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_s08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_s16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } diff --git a/OpenCL/m05300_a0-pure.cl b/OpenCL/m05300_a0-pure.cl index 689fd0874..1af5de49c 100644 --- a/OpenCL/m05300_a0-pure.cl +++ b/OpenCL/m05300_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05300_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -100,7 +100,7 @@ KERNEL_FQ void m05300_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_sxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_sxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05300_a1-optimized.cl b/OpenCL/m05300_a1-optimized.cl index 784c7db0b..adfc8a698 100644 --- a/OpenCL/m05300_a1-optimized.cl +++ b/OpenCL/m05300_a1-optimized.cl @@ -109,7 +109,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -336,15 +336,15 @@ KERNEL_FQ void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_m08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m08 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_m16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m16 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -583,10 +583,10 @@ KERNEL_FQ void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_s08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s08 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05300_s16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s16 (KERN_ATTR_ESALT (ikepsk_t)) { } diff --git a/OpenCL/m05300_a1-pure.cl b/OpenCL/m05300_a1-pure.cl index c3bdb83a6..702d49e01 100644 --- a/OpenCL/m05300_a1-pure.cl +++ b/OpenCL/m05300_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05300_mxx (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_mxx (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -123,7 +123,7 @@ KERNEL_FQ void m05300_mxx (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_sxx (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_sxx (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05300_a3-optimized.cl b/OpenCL/m05300_a3-optimized.cl index 5917f6c29..b927a26d0 100644 --- a/OpenCL/m05300_a3-optimized.cl +++ b/OpenCL/m05300_a3-optimized.cl @@ -409,7 +409,7 @@ DECLSPEC void m05300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -482,7 +482,7 @@ KERNEL_FQ void m05300_m04 (KERN_ATTR_ESALT (ikepsk_t)) m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05300_m08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m08 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -555,7 +555,7 @@ KERNEL_FQ void m05300_m08 (KERN_ATTR_ESALT (ikepsk_t)) m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05300_m16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_m16 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -628,7 +628,7 @@ KERNEL_FQ void m05300_m16 (KERN_ATTR_ESALT (ikepsk_t)) m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -701,7 +701,7 @@ KERNEL_FQ void m05300_s04 (KERN_ATTR_ESALT (ikepsk_t)) m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05300_s08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s08 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -774,7 +774,7 @@ KERNEL_FQ void m05300_s08 (KERN_ATTR_ESALT (ikepsk_t)) m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05300_s16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_s16 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05300_a3-pure.cl b/OpenCL/m05300_a3-pure.cl index 43dfe10dd..24aa07b9e 100644 --- a/OpenCL/m05300_a3-pure.cl +++ b/OpenCL/m05300_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05300_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) { /** * modifier @@ -109,7 +109,7 @@ KERNEL_FQ void m05300_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05300_sxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05300_sxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05400_a0-optimized.cl b/OpenCL/m05400_a0-optimized.cl index cbe34a58b..10941fe02 100644 --- a/OpenCL/m05400_a0-optimized.cl +++ b/OpenCL/m05400_a0-optimized.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05400_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -291,15 +291,15 @@ KERNEL_FQ void m05400_m04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_m08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_m16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -487,10 +487,10 @@ KERNEL_FQ void m05400_s04 (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_s08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s08 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_s16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s16 (KERN_ATTR_RULES_ESALT (ikepsk_t)) { } diff --git a/OpenCL/m05400_a0-pure.cl b/OpenCL/m05400_a0-pure.cl index 5481144d0..ab1a412f8 100644 --- a/OpenCL/m05400_a0-pure.cl +++ b/OpenCL/m05400_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05400_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier @@ -100,7 +100,7 @@ KERNEL_FQ void m05400_mxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_sxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_sxx (KERN_ATTR_RULES_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05400_a1-optimized.cl b/OpenCL/m05400_a1-optimized.cl index 245580c31..a9bf97330 100644 --- a/OpenCL/m05400_a1-optimized.cl +++ b/OpenCL/m05400_a1-optimized.cl @@ -113,7 +113,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -357,15 +357,15 @@ KERNEL_FQ void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_m08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m08 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_m16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m16 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -621,10 +621,10 @@ KERNEL_FQ void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_s08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s08 (KERN_ATTR_ESALT (ikepsk_t)) { } -KERNEL_FQ void m05400_s16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s16 (KERN_ATTR_ESALT (ikepsk_t)) { } diff --git a/OpenCL/m05400_a1-pure.cl b/OpenCL/m05400_a1-pure.cl index 60679fab5..bd55728f9 100644 --- a/OpenCL/m05400_a1-pure.cl +++ b/OpenCL/m05400_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05400_mxx (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_mxx (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -123,7 +123,7 @@ KERNEL_FQ void m05400_mxx (KERN_ATTR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_sxx (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_sxx (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05400_a3-optimized.cl b/OpenCL/m05400_a3-optimized.cl index b99b970f3..ae69521fb 100644 --- a/OpenCL/m05400_a3-optimized.cl +++ b/OpenCL/m05400_a3-optimized.cl @@ -413,7 +413,7 @@ DECLSPEC void m05400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -486,7 +486,7 @@ KERNEL_FQ void m05400_m04 (KERN_ATTR_ESALT (ikepsk_t)) m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05400_m08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m08 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -559,7 +559,7 @@ KERNEL_FQ void m05400_m08 (KERN_ATTR_ESALT (ikepsk_t)) m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05400_m16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_m16 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -632,7 +632,7 @@ KERNEL_FQ void m05400_m16 (KERN_ATTR_ESALT (ikepsk_t)) m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -705,7 +705,7 @@ KERNEL_FQ void m05400_s04 (KERN_ATTR_ESALT (ikepsk_t)) m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05400_s08 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s08 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier @@ -778,7 +778,7 @@ KERNEL_FQ void m05400_s08 (KERN_ATTR_ESALT (ikepsk_t)) m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_msg_buf, s_nr_buf); } -KERNEL_FQ void m05400_s16 (KERN_ATTR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_s16 (KERN_ATTR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05400_a3-pure.cl b/OpenCL/m05400_a3-pure.cl index c22bdd166..6f7719ca4 100644 --- a/OpenCL/m05400_a3-pure.cl +++ b/OpenCL/m05400_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct ikepsk } ikepsk_t; -KERNEL_FQ void m05400_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) { /** * modifier @@ -109,7 +109,7 @@ KERNEL_FQ void m05400_mxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) } } -KERNEL_FQ void m05400_sxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) +KERNEL_FQ KERNEL_FA void m05400_sxx (KERN_ATTR_VECTOR_ESALT (ikepsk_t)) { /** * modifier diff --git a/OpenCL/m05500_a0-optimized.cl b/OpenCL/m05500_a0-optimized.cl index f3eee1661..989e05c4f 100644 --- a/OpenCL/m05500_a0-optimized.cl +++ b/OpenCL/m05500_a0-optimized.cl @@ -502,7 +502,7 @@ DECLSPEC void transform_netntlmv1_key (const u32x w0, const u32x w1, PRIVATE_AS | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m05500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -716,15 +716,15 @@ KERNEL_FQ void m05500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -952,10 +952,10 @@ KERNEL_FQ void m05500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m05500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m05500_a0-pure.cl b/OpenCL/m05500_a0-pure.cl index 0b65f38dd..6b15c1414 100644 --- a/OpenCL/m05500_a0-pure.cl +++ b/OpenCL/m05500_a0-pure.cl @@ -502,7 +502,7 @@ DECLSPEC void transform_netntlmv1_key (const u32 w0, const u32 w1, PRIVATE_AS u3 | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m05500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -635,7 +635,7 @@ KERNEL_FQ void m05500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m05500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m05500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m05500_a1-optimized.cl b/OpenCL/m05500_a1-optimized.cl index a102db121..619827e06 100644 --- a/OpenCL/m05500_a1-optimized.cl +++ b/OpenCL/m05500_a1-optimized.cl @@ -500,7 +500,7 @@ DECLSPEC void transform_netntlmv1_key (const u32x w0, const u32x w1, PRIVATE_AS | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m05500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -767,15 +767,15 @@ KERNEL_FQ void m05500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1061,10 +1061,10 @@ KERNEL_FQ void m05500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m05500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m05500_a1-pure.cl b/OpenCL/m05500_a1-pure.cl index 1466ce430..57fb3a40d 100644 --- a/OpenCL/m05500_a1-pure.cl +++ b/OpenCL/m05500_a1-pure.cl @@ -500,7 +500,7 @@ DECLSPEC void transform_netntlmv1_key (const u32 w0, const u32 w1, PRIVATE_AS u3 | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m05500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -631,7 +631,7 @@ KERNEL_FQ void m05500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m05500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m05500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m05500_a3-optimized.cl b/OpenCL/m05500_a3-optimized.cl index 421e683ca..08a6bff51 100644 --- a/OpenCL/m05500_a3-optimized.cl +++ b/OpenCL/m05500_a3-optimized.cl @@ -827,7 +827,7 @@ DECLSPEC void m05500s (SHM_TYPE u32 (*s_SPtrans)[64], SHM_TYPE u32 (*s_skb)[64], } } -KERNEL_FQ void m05500_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_m04 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -910,7 +910,7 @@ KERNEL_FQ void m05500_m04 (KERN_ATTR_VECTOR ()) m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05500_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_m08 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -993,7 +993,7 @@ KERNEL_FQ void m05500_m08 (KERN_ATTR_VECTOR ()) m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05500_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_m16 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -1076,7 +1076,7 @@ KERNEL_FQ void m05500_m16 (KERN_ATTR_VECTOR ()) m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05500_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_s04 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -1159,7 +1159,7 @@ KERNEL_FQ void m05500_s04 (KERN_ATTR_VECTOR ()) m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05500_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_s08 (KERN_ATTR_VECTOR ()) { /** * modifier @@ -1242,7 +1242,7 @@ KERNEL_FQ void m05500_s08 (KERN_ATTR_VECTOR ()) m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m05500_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_s16 (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m05500_a3-pure.cl b/OpenCL/m05500_a3-pure.cl index ab19a80bc..4306fc9d8 100644 --- a/OpenCL/m05500_a3-pure.cl +++ b/OpenCL/m05500_a3-pure.cl @@ -500,7 +500,7 @@ DECLSPEC void transform_netntlmv1_key (const u32x w0, const u32x w1, PRIVATE_AS | ((k[7] & 0xff) << 24); } -KERNEL_FQ void m05500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -658,7 +658,7 @@ KERNEL_FQ void m05500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m05500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m05500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m05600_a0-optimized.cl b/OpenCL/m05600_a0-optimized.cl index 5bedcfe2d..4c8408ea1 100644 --- a/OpenCL/m05600_a0-optimized.cl +++ b/OpenCL/m05600_a0-optimized.cl @@ -114,7 +114,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05600_m04 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m04 (KERN_ATTR_RULES_ESALT (netntlm_t)) { /** * modifier @@ -345,15 +345,15 @@ KERNEL_FQ void m05600_m04 (KERN_ATTR_RULES_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_m08 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m08 (KERN_ATTR_RULES_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_m16 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m16 (KERN_ATTR_RULES_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_s04 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s04 (KERN_ATTR_RULES_ESALT (netntlm_t)) { /** * modifier @@ -596,10 +596,10 @@ KERNEL_FQ void m05600_s04 (KERN_ATTR_RULES_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_s08 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s08 (KERN_ATTR_RULES_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_s16 (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s16 (KERN_ATTR_RULES_ESALT (netntlm_t)) { } diff --git a/OpenCL/m05600_a0-pure.cl b/OpenCL/m05600_a0-pure.cl index 257bf949a..7f6affa61 100644 --- a/OpenCL/m05600_a0-pure.cl +++ b/OpenCL/m05600_a0-pure.cl @@ -29,7 +29,7 @@ typedef struct netntlm } netntlm_t; -KERNEL_FQ void m05600_mxx (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_mxx (KERN_ATTR_RULES_ESALT (netntlm_t)) { /** * modifier @@ -128,7 +128,7 @@ KERNEL_FQ void m05600_mxx (KERN_ATTR_RULES_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_sxx (KERN_ATTR_RULES_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_sxx (KERN_ATTR_RULES_ESALT (netntlm_t)) { /** * modifier diff --git a/OpenCL/m05600_a1-optimized.cl b/OpenCL/m05600_a1-optimized.cl index f30fb465d..35939a0b9 100644 --- a/OpenCL/m05600_a1-optimized.cl +++ b/OpenCL/m05600_a1-optimized.cl @@ -112,7 +112,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -401,15 +401,15 @@ KERNEL_FQ void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_m08 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m08 (KERN_ATTR_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_m16 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m16 (KERN_ATTR_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -710,10 +710,10 @@ KERNEL_FQ void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_s08 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s08 (KERN_ATTR_ESALT (netntlm_t)) { } -KERNEL_FQ void m05600_s16 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s16 (KERN_ATTR_ESALT (netntlm_t)) { } diff --git a/OpenCL/m05600_a1-pure.cl b/OpenCL/m05600_a1-pure.cl index 65b8ae4b3..8844eb855 100644 --- a/OpenCL/m05600_a1-pure.cl +++ b/OpenCL/m05600_a1-pure.cl @@ -27,7 +27,7 @@ typedef struct netntlm } netntlm_t; -KERNEL_FQ void m05600_mxx (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_mxx (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -124,7 +124,7 @@ KERNEL_FQ void m05600_mxx (KERN_ATTR_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_sxx (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_sxx (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier diff --git a/OpenCL/m05600_a3-optimized.cl b/OpenCL/m05600_a3-optimized.cl index d2450f86b..76ab35328 100644 --- a/OpenCL/m05600_a3-optimized.cl +++ b/OpenCL/m05600_a3-optimized.cl @@ -530,7 +530,7 @@ DECLSPEC void m05600s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -603,7 +603,7 @@ KERNEL_FQ void m05600_m04 (KERN_ATTR_ESALT (netntlm_t)) m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_userdomain_buf, s_chall_buf); } -KERNEL_FQ void m05600_m08 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m08 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -676,7 +676,7 @@ KERNEL_FQ void m05600_m08 (KERN_ATTR_ESALT (netntlm_t)) m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_userdomain_buf, s_chall_buf); } -KERNEL_FQ void m05600_m16 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_m16 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -749,7 +749,7 @@ KERNEL_FQ void m05600_m16 (KERN_ATTR_ESALT (netntlm_t)) m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_userdomain_buf, s_chall_buf); } -KERNEL_FQ void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -822,7 +822,7 @@ KERNEL_FQ void m05600_s04 (KERN_ATTR_ESALT (netntlm_t)) m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_userdomain_buf, s_chall_buf); } -KERNEL_FQ void m05600_s08 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s08 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier @@ -895,7 +895,7 @@ KERNEL_FQ void m05600_s08 (KERN_ATTR_ESALT (netntlm_t)) m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_userdomain_buf, s_chall_buf); } -KERNEL_FQ void m05600_s16 (KERN_ATTR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_s16 (KERN_ATTR_ESALT (netntlm_t)) { /** * modifier diff --git a/OpenCL/m05600_a3-pure.cl b/OpenCL/m05600_a3-pure.cl index dc7521830..d4e0937fe 100644 --- a/OpenCL/m05600_a3-pure.cl +++ b/OpenCL/m05600_a3-pure.cl @@ -27,7 +27,7 @@ typedef struct netntlm } netntlm_t; -KERNEL_FQ void m05600_mxx (KERN_ATTR_VECTOR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_mxx (KERN_ATTR_VECTOR_ESALT (netntlm_t)) { /** * modifier @@ -137,7 +137,7 @@ KERNEL_FQ void m05600_mxx (KERN_ATTR_VECTOR_ESALT (netntlm_t)) } } -KERNEL_FQ void m05600_sxx (KERN_ATTR_VECTOR_ESALT (netntlm_t)) +KERNEL_FQ KERNEL_FA void m05600_sxx (KERN_ATTR_VECTOR_ESALT (netntlm_t)) { /** * modifier diff --git a/OpenCL/m05800-optimized.cl b/OpenCL/m05800-optimized.cl index 200716a2f..37bbcf883 100644 --- a/OpenCL/m05800-optimized.cl +++ b/OpenCL/m05800-optimized.cl @@ -315,7 +315,7 @@ DECLSPEC void append_salt (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u3 } } -KERNEL_FQ void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) { /** * base @@ -404,7 +404,7 @@ KERNEL_FQ void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) tmps[gid].digest_buf[4] = digest[4]; } -KERNEL_FQ void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) { /** * base @@ -523,7 +523,7 @@ KERNEL_FQ void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) tmps[gid].digest_buf[4] = digest[4]; } -KERNEL_FQ void m05800_comp (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_comp (KERN_ATTR_TMPS (androidpin_tmp_t)) { /** * modifier diff --git a/OpenCL/m05800-pure.cl b/OpenCL/m05800-pure.cl index 313530194..aa8672d09 100644 --- a/OpenCL/m05800-pure.cl +++ b/OpenCL/m05800-pure.cl @@ -188,7 +188,7 @@ CONSTANT_VK u32a c_pc_len[1024] = 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; -KERNEL_FQ void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) { const u64 gid = get_global_id (0); @@ -218,7 +218,7 @@ KERNEL_FQ void m05800_init (KERN_ATTR_TMPS (androidpin_tmp_t)) tmps[gid].digest_buf[4] = ctx.h[4]; } -KERNEL_FQ void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) { /** * base @@ -317,7 +317,7 @@ KERNEL_FQ void m05800_loop (KERN_ATTR_TMPS (androidpin_tmp_t)) tmps[gid].digest_buf[4] = digest[4]; } -KERNEL_FQ void m05800_comp (KERN_ATTR_TMPS (androidpin_tmp_t)) +KERNEL_FQ KERNEL_FA void m05800_comp (KERN_ATTR_TMPS (androidpin_tmp_t)) { /** * modifier diff --git a/OpenCL/m06000_a0-optimized.cl b/OpenCL/m06000_a0-optimized.cl index 79fc22175..23cbb34f5 100644 --- a/OpenCL/m06000_a0-optimized.cl +++ b/OpenCL/m06000_a0-optimized.cl @@ -21,7 +21,7 @@ DECLSPEC void ripemd160_transform_transport_vector (PRIVATE_AS const u32x *w, PR ripemd160_transform_vector (w + 0, w + 4, w + 8, w + 12, dgst); } -KERNEL_FQ void m06000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -103,15 +103,15 @@ KERNEL_FQ void m06000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -205,10 +205,10 @@ KERNEL_FQ void m06000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m06000_a0-pure.cl b/OpenCL/m06000_a0-pure.cl index 799b60e58..7a0f62353 100644 --- a/OpenCL/m06000_a0-pure.cl +++ b/OpenCL/m06000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m06000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m06000_a1-optimized.cl b/OpenCL/m06000_a1-optimized.cl index f1311ce99..7af74d9d1 100644 --- a/OpenCL/m06000_a1-optimized.cl +++ b/OpenCL/m06000_a1-optimized.cl @@ -19,7 +19,7 @@ DECLSPEC void ripemd160_transform_transport_vector (PRIVATE_AS const u32x *w, PR ripemd160_transform_vector (w + 0, w + 4, w + 8, w + 12, dgst); } -KERNEL_FQ void m06000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -159,15 +159,15 @@ KERNEL_FQ void m06000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -319,10 +319,10 @@ KERNEL_FQ void m06000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m06000_a1-pure.cl b/OpenCL/m06000_a1-pure.cl index 80fc12ee9..87e5fafb6 100644 --- a/OpenCL/m06000_a1-pure.cl +++ b/OpenCL/m06000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m06000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m06000_a3-optimized.cl b/OpenCL/m06000_a3-optimized.cl index 4f09bd702..57c65263e 100644 --- a/OpenCL/m06000_a3-optimized.cl +++ b/OpenCL/m06000_a3-optimized.cl @@ -141,7 +141,7 @@ DECLSPEC void m06000s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m06000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -190,7 +190,7 @@ KERNEL_FQ void m06000_m04 (KERN_ATTR_BASIC ()) m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m06000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -239,7 +239,7 @@ KERNEL_FQ void m06000_m08 (KERN_ATTR_BASIC ()) m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m06000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -288,7 +288,7 @@ KERNEL_FQ void m06000_m16 (KERN_ATTR_BASIC ()) m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m06000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -337,7 +337,7 @@ KERNEL_FQ void m06000_s04 (KERN_ATTR_BASIC ()) m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m06000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -386,7 +386,7 @@ KERNEL_FQ void m06000_s08 (KERN_ATTR_BASIC ()) m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m06000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06000_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m06000_a3-pure.cl b/OpenCL/m06000_a3-pure.cl index 60049ccfd..d6a23ea12 100644 --- a/OpenCL/m06000_a3-pure.cl +++ b/OpenCL/m06000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m06000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m06000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m06050_a0-pure.cl b/OpenCL/m06050_a0-pure.cl index 721829c35..1dff54588 100644 --- a/OpenCL/m06050_a0-pure.cl +++ b/OpenCL/m06050_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06050_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06050_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m06050_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06050_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06050_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m06050_a1-pure.cl b/OpenCL/m06050_a1-pure.cl index 8ee9d6a3f..609d9fce8 100644 --- a/OpenCL/m06050_a1-pure.cl +++ b/OpenCL/m06050_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06050_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06050_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m06050_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06050_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06050_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m06050_a3-pure.cl b/OpenCL/m06050_a3-pure.cl index 18bf635ce..cee483653 100644 --- a/OpenCL/m06050_a3-pure.cl +++ b/OpenCL/m06050_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06050_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06050_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m06050_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m06050_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06050_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m06060_a0-pure.cl b/OpenCL/m06060_a0-pure.cl index 2ec330ec9..be76268b6 100644 --- a/OpenCL/m06060_a0-pure.cl +++ b/OpenCL/m06060_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06060_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06060_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m06060_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06060_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06060_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m06060_a1-pure.cl b/OpenCL/m06060_a1-pure.cl index 65113fd08..85bc6766f 100644 --- a/OpenCL/m06060_a1-pure.cl +++ b/OpenCL/m06060_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06060_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06060_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -94,7 +94,7 @@ KERNEL_FQ void m06060_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06060_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06060_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m06060_a3-pure.cl b/OpenCL/m06060_a3-pure.cl index b67daf63b..724590c2f 100644 --- a/OpenCL/m06060_a3-pure.cl +++ b/OpenCL/m06060_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_ripemd160.cl) #endif -KERNEL_FQ void m06060_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06060_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m06060_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m06060_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06060_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m06100_a0-optimized.cl b/OpenCL/m06100_a0-optimized.cl index 478e8caa2..b99efe822 100644 --- a/OpenCL/m06100_a0-optimized.cl +++ b/OpenCL/m06100_a0-optimized.cl @@ -21,7 +21,7 @@ DECLSPEC void whirlpool_transform_transport_vector (PRIVATE_AS const u32x *w, PR whirlpool_transform_vector (w + 0, w + 4, w + 8, w + 12, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -156,15 +156,15 @@ KERNEL_FQ void m06100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -311,10 +311,10 @@ KERNEL_FQ void m06100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m06100_a0-pure.cl b/OpenCL/m06100_a0-pure.cl index f53025d4d..b8de4be0a 100644 --- a/OpenCL/m06100_a0-pure.cl +++ b/OpenCL/m06100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m06100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -103,7 +103,7 @@ KERNEL_FQ void m06100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m06100_a1-optimized.cl b/OpenCL/m06100_a1-optimized.cl index 0ce3769e4..15218383f 100644 --- a/OpenCL/m06100_a1-optimized.cl +++ b/OpenCL/m06100_a1-optimized.cl @@ -19,7 +19,7 @@ DECLSPEC void whirlpool_transform_transport_vector (PRIVATE_AS const u32x *w, PR whirlpool_transform_vector (w + 0, w + 4, w + 8, w + 12, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -212,15 +212,15 @@ KERNEL_FQ void m06100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -425,10 +425,10 @@ KERNEL_FQ void m06100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m06100_a1-pure.cl b/OpenCL/m06100_a1-pure.cl index 95567d1dd..b108ff19d 100644 --- a/OpenCL/m06100_a1-pure.cl +++ b/OpenCL/m06100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m06100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -99,7 +99,7 @@ KERNEL_FQ void m06100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m06100_a3-optimized.cl b/OpenCL/m06100_a3-optimized.cl index 9623ad97e..cd3e84704 100644 --- a/OpenCL/m06100_a3-optimized.cl +++ b/OpenCL/m06100_a3-optimized.cl @@ -163,7 +163,7 @@ DECLSPEC void m06100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m06100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -258,7 +258,7 @@ KERNEL_FQ void m06100_m04 (KERN_ATTR_BASIC ()) m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -353,11 +353,11 @@ KERNEL_FQ void m06100_m08 (KERN_ATTR_BASIC ()) m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -452,7 +452,7 @@ KERNEL_FQ void m06100_s04 (KERN_ATTR_BASIC ()) m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -547,6 +547,6 @@ KERNEL_FQ void m06100_s08 (KERN_ATTR_BASIC ()) m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m06100_a3-pure.cl b/OpenCL/m06100_a3-pure.cl index a54d087e8..24d84465c 100644 --- a/OpenCL/m06100_a3-pure.cl +++ b/OpenCL/m06100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m06100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -112,7 +112,7 @@ KERNEL_FQ void m06100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m06100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m06100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m06211-pure.cl b/OpenCL/m06211-pure.cl index 11e5a5bf4..15b74abe5 100644 --- a/OpenCL/m06211-pure.cl +++ b/OpenCL/m06211-pure.cl @@ -84,7 +84,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06211_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06211_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -214,7 +214,7 @@ KERNEL_FQ void m06211_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06211_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06211_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -299,7 +299,7 @@ KERNEL_FQ void m06211_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06211_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06211_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06212-pure.cl b/OpenCL/m06212-pure.cl index 01dca38c8..7885a0662 100644 --- a/OpenCL/m06212-pure.cl +++ b/OpenCL/m06212-pure.cl @@ -84,7 +84,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06212_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06212_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -214,7 +214,7 @@ KERNEL_FQ void m06212_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06212_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06212_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -299,7 +299,7 @@ KERNEL_FQ void m06212_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06212_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06212_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06213-pure.cl b/OpenCL/m06213-pure.cl index dd51ac790..45172d8bd 100644 --- a/OpenCL/m06213-pure.cl +++ b/OpenCL/m06213-pure.cl @@ -84,7 +84,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06213_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06213_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -214,7 +214,7 @@ KERNEL_FQ void m06213_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06213_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06213_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -299,7 +299,7 @@ KERNEL_FQ void m06213_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06213_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06213_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06221-pure.cl b/OpenCL/m06221-pure.cl index cf03af58b..e1689b874 100644 --- a/OpenCL/m06221-pure.cl +++ b/OpenCL/m06221-pure.cl @@ -106,7 +106,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m06221_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06221_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -268,7 +268,7 @@ KERNEL_FQ void m06221_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06221_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06221_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -394,7 +394,7 @@ KERNEL_FQ void m06221_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06221_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06221_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06222-pure.cl b/OpenCL/m06222-pure.cl index 6187ff2dd..f6ab92797 100644 --- a/OpenCL/m06222-pure.cl +++ b/OpenCL/m06222-pure.cl @@ -106,7 +106,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m06222_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06222_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -268,7 +268,7 @@ KERNEL_FQ void m06222_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06222_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06222_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -394,7 +394,7 @@ KERNEL_FQ void m06222_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06222_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06222_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06223-pure.cl b/OpenCL/m06223-pure.cl index 5e64191df..93caffef4 100644 --- a/OpenCL/m06223-pure.cl +++ b/OpenCL/m06223-pure.cl @@ -106,7 +106,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m06223_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06223_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -268,7 +268,7 @@ KERNEL_FQ void m06223_init (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06223_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06223_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); @@ -394,7 +394,7 @@ KERNEL_FQ void m06223_loop (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) } } -KERNEL_FQ void m06223_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06223_comp (KERN_ATTR_TMPS_ESALT (tc64_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06231-pure.cl b/OpenCL/m06231-pure.cl index 85880b268..ff6eeef70 100644 --- a/OpenCL/m06231-pure.cl +++ b/OpenCL/m06231-pure.cl @@ -144,7 +144,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06231_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06231_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -360,7 +360,7 @@ KERNEL_FQ void m06231_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06231_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06231_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { /** * Whirlpool shared @@ -566,7 +566,7 @@ KERNEL_FQ void m06231_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06231_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06231_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06232-pure.cl b/OpenCL/m06232-pure.cl index 702a1719e..237906b4e 100644 --- a/OpenCL/m06232-pure.cl +++ b/OpenCL/m06232-pure.cl @@ -144,7 +144,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06232_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06232_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -360,7 +360,7 @@ KERNEL_FQ void m06232_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06232_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06232_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { /** * Whirlpool shared @@ -566,7 +566,7 @@ KERNEL_FQ void m06232_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06232_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06232_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06233-pure.cl b/OpenCL/m06233-pure.cl index 446c58327..4d030b294 100644 --- a/OpenCL/m06233-pure.cl +++ b/OpenCL/m06233-pure.cl @@ -144,7 +144,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m06233_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06233_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -360,7 +360,7 @@ KERNEL_FQ void m06233_init (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06233_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06233_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { /** * Whirlpool shared @@ -566,7 +566,7 @@ KERNEL_FQ void m06233_loop (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) } } -KERNEL_FQ void m06233_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) +KERNEL_FQ KERNEL_FA void m06233_comp (KERN_ATTR_TMPS_ESALT (tc_tmp_t, tc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06300-optimized.cl b/OpenCL/m06300-optimized.cl index c8cc8779b..39865927c 100644 --- a/OpenCL/m06300-optimized.cl +++ b/OpenCL/m06300-optimized.cl @@ -573,7 +573,7 @@ DECLSPEC void append_1st (PRIVATE_AS u32 *block0, PRIVATE_AS u32 *block1, PRIVAT } } -KERNEL_FQ void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -731,7 +731,7 @@ KERNEL_FQ void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -919,7 +919,7 @@ KERNEL_FQ void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m06300_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m06300-pure.cl b/OpenCL/m06300-pure.cl index 11a02d988..c0f0465fb 100644 --- a/OpenCL/m06300-pure.cl +++ b/OpenCL/m06300-pure.cl @@ -22,7 +22,7 @@ typedef struct md5crypt_tmp } md5crypt_tmp_t; -KERNEL_FQ void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -122,7 +122,7 @@ KERNEL_FQ void m06300_init (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = md5_ctx.h[3]; } -KERNEL_FQ void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * base @@ -217,7 +217,7 @@ KERNEL_FQ void m06300_loop (KERN_ATTR_TMPS (md5crypt_tmp_t)) tmps[gid].digest_buf[3] = digest[3]; } -KERNEL_FQ void m06300_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m06300_comp (KERN_ATTR_TMPS (md5crypt_tmp_t)) { /** * modifier diff --git a/OpenCL/m06400-pure.cl b/OpenCL/m06400-pure.cl index 9dbbfe7d4..8185a5406 100644 --- a/OpenCL/m06400-pure.cl +++ b/OpenCL/m06400-pure.cl @@ -69,7 +69,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06400_init (KERN_ATTR_TMPS (sha256aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06400_init (KERN_ATTR_TMPS (sha256aix_tmp_t)) { /** * base @@ -153,7 +153,7 @@ KERNEL_FQ void m06400_init (KERN_ATTR_TMPS (sha256aix_tmp_t)) } } -KERNEL_FQ void m06400_loop (KERN_ATTR_TMPS (sha256aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06400_loop (KERN_ATTR_TMPS (sha256aix_tmp_t)) { const u64 gid = get_global_id (0); @@ -259,7 +259,7 @@ KERNEL_FQ void m06400_loop (KERN_ATTR_TMPS (sha256aix_tmp_t)) } } -KERNEL_FQ void m06400_comp (KERN_ATTR_TMPS (sha256aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06400_comp (KERN_ATTR_TMPS (sha256aix_tmp_t)) { /** * base diff --git a/OpenCL/m06500-pure.cl b/OpenCL/m06500-pure.cl index fe8ef3e9a..f3c8f678b 100644 --- a/OpenCL/m06500-pure.cl +++ b/OpenCL/m06500-pure.cl @@ -85,7 +85,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m06500_init (KERN_ATTR_TMPS (sha512aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06500_init (KERN_ATTR_TMPS (sha512aix_tmp_t)) { /** * base @@ -184,7 +184,7 @@ KERNEL_FQ void m06500_init (KERN_ATTR_TMPS (sha512aix_tmp_t)) tmps[gid].out[7] = sha512_hmac_ctx.opad.h[7]; } -KERNEL_FQ void m06500_loop (KERN_ATTR_TMPS (sha512aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06500_loop (KERN_ATTR_TMPS (sha512aix_tmp_t)) { const u64 gid = get_global_id (0); @@ -307,7 +307,7 @@ KERNEL_FQ void m06500_loop (KERN_ATTR_TMPS (sha512aix_tmp_t)) unpack64v (tmps, out, gid, 7, out[7]); } -KERNEL_FQ void m06500_comp (KERN_ATTR_TMPS (sha512aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06500_comp (KERN_ATTR_TMPS (sha512aix_tmp_t)) { /** * base diff --git a/OpenCL/m06600-pure.cl b/OpenCL/m06600-pure.cl index c98902f42..2d67a6e24 100644 --- a/OpenCL/m06600-pure.cl +++ b/OpenCL/m06600-pure.cl @@ -64,7 +64,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06600_init (KERN_ATTR_TMPS (agilekey_tmp_t)) +KERNEL_FQ KERNEL_FA void m06600_init (KERN_ATTR_TMPS (agilekey_tmp_t)) { /** * base @@ -144,7 +144,7 @@ KERNEL_FQ void m06600_init (KERN_ATTR_TMPS (agilekey_tmp_t)) } } -KERNEL_FQ void m06600_loop (KERN_ATTR_TMPS (agilekey_tmp_t)) +KERNEL_FQ KERNEL_FA void m06600_loop (KERN_ATTR_TMPS (agilekey_tmp_t)) { const u64 gid = get_global_id (0); @@ -229,7 +229,7 @@ KERNEL_FQ void m06600_loop (KERN_ATTR_TMPS (agilekey_tmp_t)) } } -KERNEL_FQ void m06600_comp (KERN_ATTR_TMPS (agilekey_tmp_t)) +KERNEL_FQ KERNEL_FA void m06600_comp (KERN_ATTR_TMPS (agilekey_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06700-pure.cl b/OpenCL/m06700-pure.cl index 35d041efa..3bc502cef 100644 --- a/OpenCL/m06700-pure.cl +++ b/OpenCL/m06700-pure.cl @@ -63,7 +63,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06700_init (KERN_ATTR_TMPS (sha1aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06700_init (KERN_ATTR_TMPS (sha1aix_tmp_t)) { /** * base @@ -135,7 +135,7 @@ KERNEL_FQ void m06700_init (KERN_ATTR_TMPS (sha1aix_tmp_t)) } } -KERNEL_FQ void m06700_loop (KERN_ATTR_TMPS (sha1aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06700_loop (KERN_ATTR_TMPS (sha1aix_tmp_t)) { const u64 gid = get_global_id (0); @@ -220,7 +220,7 @@ KERNEL_FQ void m06700_loop (KERN_ATTR_TMPS (sha1aix_tmp_t)) } } -KERNEL_FQ void m06700_comp (KERN_ATTR_TMPS (sha1aix_tmp_t)) +KERNEL_FQ KERNEL_FA void m06700_comp (KERN_ATTR_TMPS (sha1aix_tmp_t)) { /** * base diff --git a/OpenCL/m06800-pure.cl b/OpenCL/m06800-pure.cl index 48efc5306..dd1145a79 100644 --- a/OpenCL/m06800-pure.cl +++ b/OpenCL/m06800-pure.cl @@ -75,7 +75,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m06800_init (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) +KERNEL_FQ KERNEL_FA void m06800_init (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) { /** * base @@ -159,7 +159,7 @@ KERNEL_FQ void m06800_init (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) } } -KERNEL_FQ void m06800_loop (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) +KERNEL_FQ KERNEL_FA void m06800_loop (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) { const u64 gid = get_global_id (0); @@ -265,7 +265,7 @@ KERNEL_FQ void m06800_loop (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) } } -KERNEL_FQ void m06800_comp (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) +KERNEL_FQ KERNEL_FA void m06800_comp (KERN_ATTR_TMPS_ESALT (lastpass_tmp_t, lastpass_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m06900_a0-optimized.cl b/OpenCL/m06900_a0-optimized.cl index 9902bdcee..f9784431c 100644 --- a/OpenCL/m06900_a0-optimized.cl +++ b/OpenCL/m06900_a0-optimized.cl @@ -698,7 +698,7 @@ CONSTANT_VK u32a c_tables[4][256] = R (k, h, s, 6, t); \ } -KERNEL_FQ void m06900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_m04 (KERN_ATTR_RULES ()) { /** * base @@ -906,15 +906,15 @@ KERNEL_FQ void m06900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_s04 (KERN_ATTR_RULES ()) { /** * base @@ -1138,10 +1138,10 @@ KERNEL_FQ void m06900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m06900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m06900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m06900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m06900_a1-optimized.cl b/OpenCL/m06900_a1-optimized.cl index d98dbff79..e42c2a6c3 100644 --- a/OpenCL/m06900_a1-optimized.cl +++ b/OpenCL/m06900_a1-optimized.cl @@ -696,7 +696,7 @@ CONSTANT_VK u32a c_tables[4][256] = R (k, h, s, 6, t); \ } -KERNEL_FQ void m06900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -958,15 +958,15 @@ KERNEL_FQ void m06900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1240,10 +1240,10 @@ KERNEL_FQ void m06900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m06900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m06900_a3-optimized.cl b/OpenCL/m06900_a3-optimized.cl index 1cb46e6ea..d71302d55 100644 --- a/OpenCL/m06900_a3-optimized.cl +++ b/OpenCL/m06900_a3-optimized.cl @@ -1050,7 +1050,7 @@ DECLSPEC void m06900s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m06900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1119,7 +1119,7 @@ KERNEL_FQ void m06900_m04 (KERN_ATTR_BASIC ()) m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_tables); } -KERNEL_FQ void m06900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1188,11 +1188,11 @@ KERNEL_FQ void m06900_m08 (KERN_ATTR_BASIC ()) m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_tables); } -KERNEL_FQ void m06900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m06900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1261,7 +1261,7 @@ KERNEL_FQ void m06900_s04 (KERN_ATTR_BASIC ()) m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_tables); } -KERNEL_FQ void m06900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1330,6 +1330,6 @@ KERNEL_FQ void m06900_s08 (KERN_ATTR_BASIC ()) m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_tables); } -KERNEL_FQ void m06900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m06900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07000_a0-optimized.cl b/OpenCL/m07000_a0-optimized.cl index 4671bdeb9..7e0b71b17 100644 --- a/OpenCL/m07000_a0-optimized.cl +++ b/OpenCL/m07000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m07000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -270,15 +270,15 @@ KERNEL_FQ void m07000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -553,10 +553,10 @@ KERNEL_FQ void m07000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07000_a0-pure.cl b/OpenCL/m07000_a0-pure.cl index f5e083df7..938205612 100644 --- a/OpenCL/m07000_a0-pure.cl +++ b/OpenCL/m07000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m07000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m07000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m07000_a1-optimized.cl b/OpenCL/m07000_a1-optimized.cl index 0e7408918..914761dd6 100644 --- a/OpenCL/m07000_a1-optimized.cl +++ b/OpenCL/m07000_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m07000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -328,15 +328,15 @@ KERNEL_FQ void m07000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -671,10 +671,10 @@ KERNEL_FQ void m07000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07000_a1-pure.cl b/OpenCL/m07000_a1-pure.cl index 5d4440654..434aaa8cf 100644 --- a/OpenCL/m07000_a1-pure.cl +++ b/OpenCL/m07000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m07000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m07000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m07000_a3-optimized.cl b/OpenCL/m07000_a3-optimized.cl index 83bda1931..6a5e9bf86 100644 --- a/OpenCL/m07000_a3-optimized.cl +++ b/OpenCL/m07000_a3-optimized.cl @@ -563,7 +563,7 @@ DECLSPEC void m07000s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -616,7 +616,7 @@ KERNEL_FQ void m07000_m04 (KERN_ATTR_BASIC ()) m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -669,7 +669,7 @@ KERNEL_FQ void m07000_m08 (KERN_ATTR_BASIC ()) m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -722,7 +722,7 @@ KERNEL_FQ void m07000_m16 (KERN_ATTR_BASIC ()) m07000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -775,7 +775,7 @@ KERNEL_FQ void m07000_s04 (KERN_ATTR_BASIC ()) m07000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -828,7 +828,7 @@ KERNEL_FQ void m07000_s08 (KERN_ATTR_BASIC ()) m07000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07000_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m07000_a3-pure.cl b/OpenCL/m07000_a3-pure.cl index f7ac81883..01982d278 100644 --- a/OpenCL/m07000_a3-pure.cl +++ b/OpenCL/m07000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m07000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m07000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -103,7 +103,7 @@ KERNEL_FQ void m07000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m07000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m07000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m07100-pure.cl b/OpenCL/m07100-pure.cl index 55dcdb066..e8add2df6 100644 --- a/OpenCL/m07100-pure.cl +++ b/OpenCL/m07100-pure.cl @@ -91,7 +91,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m07100_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) +KERNEL_FQ KERNEL_FA void m07100_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) { /** * base @@ -195,7 +195,7 @@ KERNEL_FQ void m07100_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m07100_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) +KERNEL_FQ KERNEL_FA void m07100_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) { const u64 gid = get_global_id (0); @@ -321,7 +321,7 @@ KERNEL_FQ void m07100_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m07100_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) +KERNEL_FQ KERNEL_FA void m07100_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_t)) { /** * base diff --git a/OpenCL/m07300_a0-optimized.cl b/OpenCL/m07300_a0-optimized.cl index 0cda75ede..5f6fe0475 100644 --- a/OpenCL/m07300_a0-optimized.cl +++ b/OpenCL/m07300_a0-optimized.cl @@ -112,7 +112,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m07300_m04 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m04 (KERN_ATTR_RULES_ESALT (rakp_t)) { /** * modifier @@ -240,15 +240,15 @@ KERNEL_FQ void m07300_m04 (KERN_ATTR_RULES_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_m08 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m08 (KERN_ATTR_RULES_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_m16 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m16 (KERN_ATTR_RULES_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_s04 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s04 (KERN_ATTR_RULES_ESALT (rakp_t)) { /** * modifier @@ -388,10 +388,10 @@ KERNEL_FQ void m07300_s04 (KERN_ATTR_RULES_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_s08 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s08 (KERN_ATTR_RULES_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_s16 (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s16 (KERN_ATTR_RULES_ESALT (rakp_t)) { } diff --git a/OpenCL/m07300_a0-pure.cl b/OpenCL/m07300_a0-pure.cl index 3bef46d34..4aa9fbf4c 100644 --- a/OpenCL/m07300_a0-pure.cl +++ b/OpenCL/m07300_a0-pure.cl @@ -23,7 +23,7 @@ typedef struct rakp } rakp_t; -KERNEL_FQ void m07300_mxx (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_mxx (KERN_ATTR_RULES_ESALT (rakp_t)) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m07300_mxx (KERN_ATTR_RULES_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_sxx (KERN_ATTR_RULES_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_sxx (KERN_ATTR_RULES_ESALT (rakp_t)) { /** * modifier diff --git a/OpenCL/m07300_a1-optimized.cl b/OpenCL/m07300_a1-optimized.cl index fc2d6ff8a..fad8c8382 100644 --- a/OpenCL/m07300_a1-optimized.cl +++ b/OpenCL/m07300_a1-optimized.cl @@ -110,7 +110,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -306,15 +306,15 @@ KERNEL_FQ void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_m08 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m08 (KERN_ATTR_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_m16 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m16 (KERN_ATTR_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -522,10 +522,10 @@ KERNEL_FQ void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_s08 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s08 (KERN_ATTR_ESALT (rakp_t)) { } -KERNEL_FQ void m07300_s16 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s16 (KERN_ATTR_ESALT (rakp_t)) { } diff --git a/OpenCL/m07300_a1-pure.cl b/OpenCL/m07300_a1-pure.cl index 12016889c..08bfefa03 100644 --- a/OpenCL/m07300_a1-pure.cl +++ b/OpenCL/m07300_a1-pure.cl @@ -21,7 +21,7 @@ typedef struct rakp } rakp_t; -KERNEL_FQ void m07300_mxx (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_mxx (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -90,7 +90,7 @@ KERNEL_FQ void m07300_mxx (KERN_ATTR_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_sxx (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_sxx (KERN_ATTR_ESALT (rakp_t)) { /** * modifier diff --git a/OpenCL/m07300_a3-optimized.cl b/OpenCL/m07300_a3-optimized.cl index e14dcd72b..322f3c06b 100644 --- a/OpenCL/m07300_a3-optimized.cl +++ b/OpenCL/m07300_a3-optimized.cl @@ -336,7 +336,7 @@ DECLSPEC void m07300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -402,7 +402,7 @@ KERNEL_FQ void m07300_m04 (KERN_ATTR_ESALT (rakp_t)) m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_esalt_buf); } -KERNEL_FQ void m07300_m08 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m08 (KERN_ATTR_ESALT (rakp_t)) { /** * modifiers are taken from args @@ -468,7 +468,7 @@ KERNEL_FQ void m07300_m08 (KERN_ATTR_ESALT (rakp_t)) m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_esalt_buf); } -KERNEL_FQ void m07300_m16 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_m16 (KERN_ATTR_ESALT (rakp_t)) { /** * modifiers are taken from args @@ -534,7 +534,7 @@ KERNEL_FQ void m07300_m16 (KERN_ATTR_ESALT (rakp_t)) m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_esalt_buf); } -KERNEL_FQ void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -600,7 +600,7 @@ KERNEL_FQ void m07300_s04 (KERN_ATTR_ESALT (rakp_t)) m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_esalt_buf); } -KERNEL_FQ void m07300_s08 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s08 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier @@ -666,7 +666,7 @@ KERNEL_FQ void m07300_s08 (KERN_ATTR_ESALT (rakp_t)) m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, s_esalt_buf); } -KERNEL_FQ void m07300_s16 (KERN_ATTR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_s16 (KERN_ATTR_ESALT (rakp_t)) { /** * modifier diff --git a/OpenCL/m07300_a3-pure.cl b/OpenCL/m07300_a3-pure.cl index d969ed0f6..4b4a9abf9 100644 --- a/OpenCL/m07300_a3-pure.cl +++ b/OpenCL/m07300_a3-pure.cl @@ -21,7 +21,7 @@ typedef struct rakp } rakp_t; -KERNEL_FQ void m07300_mxx (KERN_ATTR_VECTOR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_mxx (KERN_ATTR_VECTOR_ESALT (rakp_t)) { /** * modifier @@ -76,7 +76,7 @@ KERNEL_FQ void m07300_mxx (KERN_ATTR_VECTOR_ESALT (rakp_t)) } } -KERNEL_FQ void m07300_sxx (KERN_ATTR_VECTOR_ESALT (rakp_t)) +KERNEL_FQ KERNEL_FA void m07300_sxx (KERN_ATTR_VECTOR_ESALT (rakp_t)) { /** * modifier diff --git a/OpenCL/m07350_a0-optimized.cl b/OpenCL/m07350_a0-optimized.cl index 89b557b32..d82add460 100644 --- a/OpenCL/m07350_a0-optimized.cl +++ b/OpenCL/m07350_a0-optimized.cl @@ -74,7 +74,7 @@ DECLSPEC void hmac_md5_pad (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS md5_transform_vector (w0, w1, w2, w3, opad); } -KERNEL_FQ void m07350_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -221,15 +221,15 @@ KERNEL_FQ void m07350_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07350_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07350_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07350_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -388,10 +388,10 @@ KERNEL_FQ void m07350_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07350_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07350_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07350_a0-pure.cl b/OpenCL/m07350_a0-pure.cl index 6d1cac651..0efd0e429 100644 --- a/OpenCL/m07350_a0-pure.cl +++ b/OpenCL/m07350_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m07350_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m07350_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07350_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07350_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m07350_a1-optimized.cl b/OpenCL/m07350_a1-optimized.cl index 058b6411d..3b272e6bb 100644 --- a/OpenCL/m07350_a1-optimized.cl +++ b/OpenCL/m07350_a1-optimized.cl @@ -101,7 +101,7 @@ DECLSPEC void hmac_md5_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS } */ -KERNEL_FQ void m07350_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -358,15 +358,15 @@ KERNEL_FQ void m07350_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07350_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07350_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07350_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -635,10 +635,10 @@ KERNEL_FQ void m07350_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07350_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07350_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07350_a1-pure.cl b/OpenCL/m07350_a1-pure.cl index 09b774141..11ba923f5 100644 --- a/OpenCL/m07350_a1-pure.cl +++ b/OpenCL/m07350_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m07350_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m07350_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07350_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m07350_a3-optimized.cl b/OpenCL/m07350_a3-optimized.cl index 79dde06d5..72728c563 100644 --- a/OpenCL/m07350_a3-optimized.cl +++ b/OpenCL/m07350_a3-optimized.cl @@ -365,7 +365,7 @@ DECLSPEC void m07350s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07350_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -414,7 +414,7 @@ KERNEL_FQ void m07350_m04 (KERN_ATTR_BASIC ()) m07350m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07350_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -463,7 +463,7 @@ KERNEL_FQ void m07350_m08 (KERN_ATTR_BASIC ()) m07350m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07350_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -512,7 +512,7 @@ KERNEL_FQ void m07350_m16 (KERN_ATTR_BASIC ()) m07350m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07350_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -561,7 +561,7 @@ KERNEL_FQ void m07350_s04 (KERN_ATTR_BASIC ()) m07350s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07350_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -610,7 +610,7 @@ KERNEL_FQ void m07350_s08 (KERN_ATTR_BASIC ()) m07350s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07350_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07350_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m07350_a3-pure.cl b/OpenCL/m07350_a3-pure.cl index 908bd51e2..d2702b485 100644 --- a/OpenCL/m07350_a3-pure.cl +++ b/OpenCL/m07350_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m07350_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m07350_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m07350_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m07350_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m07350_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m07400-optimized.cl b/OpenCL/m07400-optimized.cl index 0615d5414..1a3ea413c 100644 --- a/OpenCL/m07400-optimized.cl +++ b/OpenCL/m07400-optimized.cl @@ -1178,7 +1178,7 @@ DECLSPEC u32 memcat24 (PRIVATE_AS u32 *block, const u32 offset, PRIVATE_AS const return offset + append_len; } -KERNEL_FQ void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base @@ -1526,7 +1526,7 @@ KERNEL_FQ void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) tmps[gid].s_bytes[4] = s_bytes[4]; } -KERNEL_FQ void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base @@ -1737,7 +1737,7 @@ KERNEL_FQ void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) tmps[gid].alt_result[7] = alt_result[7]; } -KERNEL_FQ void m07400_comp (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_comp (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base diff --git a/OpenCL/m07400-pure.cl b/OpenCL/m07400-pure.cl index d17aafd9f..e42b07c8d 100644 --- a/OpenCL/m07400-pure.cl +++ b/OpenCL/m07400-pure.cl @@ -24,7 +24,7 @@ typedef struct sha256crypt_tmp } sha256crypt_tmp_t; -KERNEL_FQ void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base @@ -261,7 +261,7 @@ KERNEL_FQ void m07400_init (KERN_ATTR_TMPS (sha256crypt_tmp_t)) for (int i = 0; i < 64; i++) tmps[gid].s_bytes[i] = s_final[i]; } -KERNEL_FQ void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base @@ -345,7 +345,7 @@ KERNEL_FQ void m07400_loop (KERN_ATTR_TMPS (sha256crypt_tmp_t)) tmps[gid].alt_result[7] = alt_result[7]; } -KERNEL_FQ void m07400_comp (KERN_ATTR_TMPS (sha256crypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m07400_comp (KERN_ATTR_TMPS (sha256crypt_tmp_t)) { /** * base diff --git a/OpenCL/m07500_a0-optimized.cl b/OpenCL/m07500_a0-optimized.cl index 2036dd882..659b36c25 100644 --- a/OpenCL/m07500_a0-optimized.cl +++ b/OpenCL/m07500_a0-optimized.cl @@ -273,7 +273,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m07500_m04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { /** * modifier @@ -369,15 +369,15 @@ KERNEL_FQ void m07500_m04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_m08 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m08 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_m16 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m16 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_s04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { /** * modifier @@ -473,10 +473,10 @@ KERNEL_FQ void m07500_s04 (KERN_ATTR_RULES_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_s08 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s08 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_s16 (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s16 (KERN_ATTR_RULES_ESALT (krb5pa_t)) { } diff --git a/OpenCL/m07500_a0-pure.cl b/OpenCL/m07500_a0-pure.cl index 3799e2f30..da773d3cc 100644 --- a/OpenCL/m07500_a0-pure.cl +++ b/OpenCL/m07500_a0-pure.cl @@ -157,7 +157,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check digest[3] = ctx.opad.h[3]; } -KERNEL_FQ void m07500_mxx (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_mxx (KERN_ATTR_RULES_ESALT (krb5pa_t)) { /** * modifier @@ -226,7 +226,7 @@ KERNEL_FQ void m07500_mxx (KERN_ATTR_RULES_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_sxx (KERN_ATTR_RULES_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_sxx (KERN_ATTR_RULES_ESALT (krb5pa_t)) { /** * modifier diff --git a/OpenCL/m07500_a1-optimized.cl b/OpenCL/m07500_a1-optimized.cl index 89935c890..29d350099 100644 --- a/OpenCL/m07500_a1-optimized.cl +++ b/OpenCL/m07500_a1-optimized.cl @@ -271,7 +271,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) { /** * modifier @@ -417,15 +417,15 @@ KERNEL_FQ void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_m08 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m08 (KERN_ATTR_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_m16 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m16 (KERN_ATTR_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) { /** * modifier @@ -571,10 +571,10 @@ KERNEL_FQ void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_s08 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s08 (KERN_ATTR_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_s16 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s16 (KERN_ATTR_ESALT (krb5pa_t)) { } diff --git a/OpenCL/m07500_a1-pure.cl b/OpenCL/m07500_a1-pure.cl index 125757b26..6d51d3928 100644 --- a/OpenCL/m07500_a1-pure.cl +++ b/OpenCL/m07500_a1-pure.cl @@ -155,7 +155,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check digest[3] = ctx.opad.h[3]; } -KERNEL_FQ void m07500_mxx (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_mxx (KERN_ATTR_ESALT (krb5pa_t)) { /** * modifier @@ -222,7 +222,7 @@ KERNEL_FQ void m07500_mxx (KERN_ATTR_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_sxx (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_sxx (KERN_ATTR_ESALT (krb5pa_t)) { /** * modifier diff --git a/OpenCL/m07500_a3-optimized.cl b/OpenCL/m07500_a3-optimized.cl index c85d2d728..392dca645 100644 --- a/OpenCL/m07500_a3-optimized.cl +++ b/OpenCL/m07500_a3-optimized.cl @@ -358,7 +358,7 @@ DECLSPEC void m07500 (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, P } } -KERNEL_FQ void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) { /** * base @@ -409,7 +409,7 @@ KERNEL_FQ void m07500_m04 (KERN_ATTR_ESALT (krb5pa_t)) m07500 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07500_m08 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m08 (KERN_ATTR_ESALT (krb5pa_t)) { /** * base @@ -460,11 +460,11 @@ KERNEL_FQ void m07500_m08 (KERN_ATTR_ESALT (krb5pa_t)) m07500 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07500_m16 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_m16 (KERN_ATTR_ESALT (krb5pa_t)) { } -KERNEL_FQ void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) { /** * base @@ -515,7 +515,7 @@ KERNEL_FQ void m07500_s04 (KERN_ATTR_ESALT (krb5pa_t)) m07500 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07500_s08 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s08 (KERN_ATTR_ESALT (krb5pa_t)) { /** * base @@ -566,6 +566,6 @@ KERNEL_FQ void m07500_s08 (KERN_ATTR_ESALT (krb5pa_t)) m07500 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07500_s16 (KERN_ATTR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_s16 (KERN_ATTR_ESALT (krb5pa_t)) { } diff --git a/OpenCL/m07500_a3-pure.cl b/OpenCL/m07500_a3-pure.cl index 0191426da..cc16e2805 100644 --- a/OpenCL/m07500_a3-pure.cl +++ b/OpenCL/m07500_a3-pure.cl @@ -155,7 +155,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check digest[3] = ctx.opad.h[3]; } -KERNEL_FQ void m07500_mxx (KERN_ATTR_VECTOR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_mxx (KERN_ATTR_VECTOR_ESALT (krb5pa_t)) { /** * modifier @@ -247,7 +247,7 @@ KERNEL_FQ void m07500_mxx (KERN_ATTR_VECTOR_ESALT (krb5pa_t)) } } -KERNEL_FQ void m07500_sxx (KERN_ATTR_VECTOR_ESALT (krb5pa_t)) +KERNEL_FQ KERNEL_FA void m07500_sxx (KERN_ATTR_VECTOR_ESALT (krb5pa_t)) { /** * modifier diff --git a/OpenCL/m07700_a0-optimized.cl b/OpenCL/m07700_a0-optimized.cl index 9d6f7a018..7f46eed87 100644 --- a/OpenCL/m07700_a0-optimized.cl +++ b/OpenCL/m07700_a0-optimized.cl @@ -155,7 +155,7 @@ DECLSPEC u32 walld0rf_magic (PRIVATE_AS const u32 *w0, const u32 pw_len, PRIVATE return sum20; } -KERNEL_FQ void m07700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -311,15 +311,15 @@ KERNEL_FQ void m07700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -487,10 +487,10 @@ KERNEL_FQ void m07700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07700_a1-optimized.cl b/OpenCL/m07700_a1-optimized.cl index 581d4e236..7ce7198d3 100644 --- a/OpenCL/m07700_a1-optimized.cl +++ b/OpenCL/m07700_a1-optimized.cl @@ -146,7 +146,7 @@ DECLSPEC u32 walld0rf_magic (PRIVATE_AS const u32 *w0, const u32 pw_len, PRIVATE return sum20; } -KERNEL_FQ void m07700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -345,15 +345,15 @@ KERNEL_FQ void m07700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -564,10 +564,10 @@ KERNEL_FQ void m07700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07700_a3-optimized.cl b/OpenCL/m07700_a3-optimized.cl index 6af310aca..7505431c4 100644 --- a/OpenCL/m07700_a3-optimized.cl +++ b/OpenCL/m07700_a3-optimized.cl @@ -393,7 +393,7 @@ DECLSPEC void m07700s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -446,7 +446,7 @@ KERNEL_FQ void m07700_m04 (KERN_ATTR_BASIC ()) m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -499,11 +499,11 @@ KERNEL_FQ void m07700_m08 (KERN_ATTR_BASIC ()) m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -556,7 +556,7 @@ KERNEL_FQ void m07700_s04 (KERN_ATTR_BASIC ()) m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -609,6 +609,6 @@ KERNEL_FQ void m07700_s08 (KERN_ATTR_BASIC ()) m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07701_a0-optimized.cl b/OpenCL/m07701_a0-optimized.cl index f673fbba4..bf7a9f6c1 100644 --- a/OpenCL/m07701_a0-optimized.cl +++ b/OpenCL/m07701_a0-optimized.cl @@ -148,7 +148,7 @@ DECLSPEC u32 walld0rf_magic (PRIVATE_AS const u32 *w0, const u32 pw_len, PRIVATE return sum20; } -KERNEL_FQ void m07701_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -304,15 +304,15 @@ KERNEL_FQ void m07701_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07701_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07701_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07701_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -480,10 +480,10 @@ KERNEL_FQ void m07701_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07701_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07701_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07701_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07701_a1-optimized.cl b/OpenCL/m07701_a1-optimized.cl index e3727fe13..97e9a50a4 100644 --- a/OpenCL/m07701_a1-optimized.cl +++ b/OpenCL/m07701_a1-optimized.cl @@ -146,7 +146,7 @@ DECLSPEC u32 walld0rf_magic (PRIVATE_AS const u32 *w0, const u32 pw_len, PRIVATE return sum20; } -KERNEL_FQ void m07701_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -345,15 +345,15 @@ KERNEL_FQ void m07701_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07701_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07701_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07701_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -564,10 +564,10 @@ KERNEL_FQ void m07701_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07701_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07701_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07701_a3-optimized.cl b/OpenCL/m07701_a3-optimized.cl index 3ee03e9a3..830f4af87 100644 --- a/OpenCL/m07701_a3-optimized.cl +++ b/OpenCL/m07701_a3-optimized.cl @@ -393,7 +393,7 @@ DECLSPEC void m07701s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07701_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -446,7 +446,7 @@ KERNEL_FQ void m07701_m04 (KERN_ATTR_BASIC ()) m07701m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07701_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -499,11 +499,11 @@ KERNEL_FQ void m07701_m08 (KERN_ATTR_BASIC ()) m07701m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07701_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07701_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -556,7 +556,7 @@ KERNEL_FQ void m07701_s04 (KERN_ATTR_BASIC ()) m07701s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07701_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -609,6 +609,6 @@ KERNEL_FQ void m07701_s08 (KERN_ATTR_BASIC ()) m07701s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07701_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07701_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07800_a0-optimized.cl b/OpenCL/m07800_a0-optimized.cl index 6344453a2..7bf4bd7a1 100644 --- a/OpenCL/m07800_a0-optimized.cl +++ b/OpenCL/m07800_a0-optimized.cl @@ -54,7 +54,7 @@ DECLSPEC void SETSHIFTEDINT (PRIVATE_AS u32 *a, const int n, const u32 v) a[d + 1] = l32_from_64_S (tmp); } -KERNEL_FQ void m07800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -298,15 +298,15 @@ KERNEL_FQ void m07800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -562,10 +562,10 @@ KERNEL_FQ void m07800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07800_a1-optimized.cl b/OpenCL/m07800_a1-optimized.cl index 79564d7e5..0c72423f7 100644 --- a/OpenCL/m07800_a1-optimized.cl +++ b/OpenCL/m07800_a1-optimized.cl @@ -52,7 +52,7 @@ DECLSPEC void SETSHIFTEDINT (PRIVATE_AS u32 *a, const int n, const u32 v) a[d + 1] = l32_from_64_S (tmp); } -KERNEL_FQ void m07800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -356,15 +356,15 @@ KERNEL_FQ void m07800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -680,10 +680,10 @@ KERNEL_FQ void m07800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07800_a3-optimized.cl b/OpenCL/m07800_a3-optimized.cl index 7ff3ec75a..5b442f6c6 100644 --- a/OpenCL/m07800_a3-optimized.cl +++ b/OpenCL/m07800_a3-optimized.cl @@ -498,7 +498,7 @@ DECLSPEC void m07800s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -553,7 +553,7 @@ KERNEL_FQ void m07800_m04 (KERN_ATTR_BASIC ()) m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -608,11 +608,11 @@ KERNEL_FQ void m07800_m08 (KERN_ATTR_BASIC ()) m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -667,7 +667,7 @@ KERNEL_FQ void m07800_s04 (KERN_ATTR_BASIC ()) m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -722,6 +722,6 @@ KERNEL_FQ void m07800_s08 (KERN_ATTR_BASIC ()) m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07801_a0-optimized.cl b/OpenCL/m07801_a0-optimized.cl index d9033a704..c5f7cb0d5 100644 --- a/OpenCL/m07801_a0-optimized.cl +++ b/OpenCL/m07801_a0-optimized.cl @@ -54,7 +54,7 @@ DECLSPEC void SETSHIFTEDINT (PRIVATE_AS u32 *a, const int n, const u32 v) a[d + 1] = l32_from_64_S (tmp); } -KERNEL_FQ void m07801_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -298,15 +298,15 @@ KERNEL_FQ void m07801_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07801_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07801_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07801_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -562,10 +562,10 @@ KERNEL_FQ void m07801_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m07801_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m07801_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m07801_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m07801_a1-optimized.cl b/OpenCL/m07801_a1-optimized.cl index f9479c906..10608c0ba 100644 --- a/OpenCL/m07801_a1-optimized.cl +++ b/OpenCL/m07801_a1-optimized.cl @@ -52,7 +52,7 @@ DECLSPEC void SETSHIFTEDINT (PRIVATE_AS u32 *a, const int n, const u32 v) a[d + 1] = l32_from_64_S (tmp); } -KERNEL_FQ void m07801_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -356,15 +356,15 @@ KERNEL_FQ void m07801_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07801_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07801_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07801_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -680,10 +680,10 @@ KERNEL_FQ void m07801_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m07801_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07801_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07801_a3-optimized.cl b/OpenCL/m07801_a3-optimized.cl index 169657aad..340aa6258 100644 --- a/OpenCL/m07801_a3-optimized.cl +++ b/OpenCL/m07801_a3-optimized.cl @@ -498,7 +498,7 @@ DECLSPEC void m07801s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m07801_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -553,7 +553,7 @@ KERNEL_FQ void m07801_m04 (KERN_ATTR_BASIC ()) m07801m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07801_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -608,11 +608,11 @@ KERNEL_FQ void m07801_m08 (KERN_ATTR_BASIC ()) m07801m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07801_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m07801_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -667,7 +667,7 @@ KERNEL_FQ void m07801_s04 (KERN_ATTR_BASIC ()) m07801s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07801_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -722,6 +722,6 @@ KERNEL_FQ void m07801_s08 (KERN_ATTR_BASIC ()) m07801s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m07801_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m07801_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m07900-pure.cl b/OpenCL/m07900-pure.cl index 9fdc23cbb..5052ac20c 100644 --- a/OpenCL/m07900-pure.cl +++ b/OpenCL/m07900-pure.cl @@ -20,7 +20,7 @@ typedef struct drupal7_tmp } drupal7_tmp_t; -KERNEL_FQ void m07900_init (KERN_ATTR_TMPS (drupal7_tmp_t)) +KERNEL_FQ KERNEL_FA void m07900_init (KERN_ATTR_TMPS (drupal7_tmp_t)) { /** * base @@ -50,7 +50,7 @@ KERNEL_FQ void m07900_init (KERN_ATTR_TMPS (drupal7_tmp_t)) tmps[gid].digest_buf[7] = ctx.h[7]; } -KERNEL_FQ void m07900_loop (KERN_ATTR_TMPS (drupal7_tmp_t)) +KERNEL_FQ KERNEL_FA void m07900_loop (KERN_ATTR_TMPS (drupal7_tmp_t)) { /** * base @@ -204,7 +204,7 @@ KERNEL_FQ void m07900_loop (KERN_ATTR_TMPS (drupal7_tmp_t)) tmps[gid].digest_buf[7] = digest[7]; } -KERNEL_FQ void m07900_comp (KERN_ATTR_TMPS (drupal7_tmp_t)) +KERNEL_FQ KERNEL_FA void m07900_comp (KERN_ATTR_TMPS (drupal7_tmp_t)) { /** * modifier diff --git a/OpenCL/m08000_a0-optimized.cl b/OpenCL/m08000_a0-optimized.cl index 3a5348531..c40f73a28 100644 --- a/OpenCL/m08000_a0-optimized.cl +++ b/OpenCL/m08000_a0-optimized.cl @@ -218,7 +218,7 @@ DECLSPEC void sha256_transform_s (PRIVATE_AS u32x *digest, LOCAL_AS u32 *w) digest[7] += h; } -KERNEL_FQ void m08000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -381,15 +381,15 @@ KERNEL_FQ void m08000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -564,10 +564,10 @@ KERNEL_FQ void m08000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m08000_a1-optimized.cl b/OpenCL/m08000_a1-optimized.cl index 3565c5fc4..0e9a701d7 100644 --- a/OpenCL/m08000_a1-optimized.cl +++ b/OpenCL/m08000_a1-optimized.cl @@ -216,7 +216,7 @@ DECLSPEC void sha256_transform_s (PRIVATE_AS u32x *digest, LOCAL_AS u32 *w) digest[7] += h; } -KERNEL_FQ void m08000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -433,15 +433,15 @@ KERNEL_FQ void m08000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -670,10 +670,10 @@ KERNEL_FQ void m08000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m08000_a3-optimized.cl b/OpenCL/m08000_a3-optimized.cl index 2e13bd72b..09ce853ca 100644 --- a/OpenCL/m08000_a3-optimized.cl +++ b/OpenCL/m08000_a3-optimized.cl @@ -464,7 +464,7 @@ DECLSPEC void m08000s (LOCAL_AS u32 *w_s1, LOCAL_AS u32 *w_s2, PRIVATE_AS u32 *w } } -KERNEL_FQ void m08000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -505,7 +505,7 @@ KERNEL_FQ void m08000_m04 (KERN_ATTR_VECTOR ()) m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -546,7 +546,7 @@ KERNEL_FQ void m08000_m08 (KERN_ATTR_VECTOR ()) m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -587,7 +587,7 @@ KERNEL_FQ void m08000_m16 (KERN_ATTR_VECTOR ()) m08000m (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -628,7 +628,7 @@ KERNEL_FQ void m08000_s04 (KERN_ATTR_VECTOR ()) m08000s (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -669,7 +669,7 @@ KERNEL_FQ void m08000_s08 (KERN_ATTR_VECTOR ()) m08000s (w_s1, w_s2, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m08100_a0-optimized.cl b/OpenCL/m08100_a0-optimized.cl index cba059b94..0d2c66d68 100644 --- a/OpenCL/m08100_a0-optimized.cl +++ b/OpenCL/m08100_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -220,15 +220,15 @@ KERNEL_FQ void m08100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -453,10 +453,10 @@ KERNEL_FQ void m08100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m08100_a0-pure.cl b/OpenCL/m08100_a0-pure.cl index 63dd1561e..f19f3c1c8 100644 --- a/OpenCL/m08100_a0-pure.cl +++ b/OpenCL/m08100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -68,7 +68,7 @@ KERNEL_FQ void m08100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m08100_a1-optimized.cl b/OpenCL/m08100_a1-optimized.cl index e1ffe5e15..3d4f115c9 100644 --- a/OpenCL/m08100_a1-optimized.cl +++ b/OpenCL/m08100_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -289,15 +289,15 @@ KERNEL_FQ void m08100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -581,10 +581,10 @@ KERNEL_FQ void m08100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m08100_a1-pure.cl b/OpenCL/m08100_a1-pure.cl index 8b46f1fa8..21a103538 100644 --- a/OpenCL/m08100_a1-pure.cl +++ b/OpenCL/m08100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -63,7 +63,7 @@ KERNEL_FQ void m08100_mxx (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m08100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m08100_a3-optimized.cl b/OpenCL/m08100_a3-optimized.cl index 5d2ebec01..dfbf6e20e 100644 --- a/OpenCL/m08100_a3-optimized.cl +++ b/OpenCL/m08100_a3-optimized.cl @@ -351,7 +351,7 @@ DECLSPEC void m08100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m08100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -417,7 +417,7 @@ KERNEL_FQ void m08100_m04 (KERN_ATTR_BASIC ()) m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -491,7 +491,7 @@ KERNEL_FQ void m08100_m08 (KERN_ATTR_BASIC ()) m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -580,7 +580,7 @@ KERNEL_FQ void m08100_m16 (KERN_ATTR_BASIC ()) m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -646,7 +646,7 @@ KERNEL_FQ void m08100_s04 (KERN_ATTR_BASIC ()) m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -720,7 +720,7 @@ KERNEL_FQ void m08100_s08 (KERN_ATTR_BASIC ()) m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08100_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m08100_a3-pure.cl b/OpenCL/m08100_a3-pure.cl index c7b5884b7..499dd9132 100644 --- a/OpenCL/m08100_a3-pure.cl +++ b/OpenCL/m08100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -79,7 +79,7 @@ KERNEL_FQ void m08100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m08100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m08200-pure.cl b/OpenCL/m08200-pure.cl index 49d951cb7..cc54ad2ce 100644 --- a/OpenCL/m08200-pure.cl +++ b/OpenCL/m08200-pure.cl @@ -93,7 +93,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m08200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) +KERNEL_FQ KERNEL_FA void m08200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) { /** * base @@ -197,7 +197,7 @@ KERNEL_FQ void m08200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_ } } -KERNEL_FQ void m08200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) +KERNEL_FQ KERNEL_FA void m08200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) { const u64 gid = get_global_id (0); @@ -323,7 +323,7 @@ KERNEL_FQ void m08200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_ } } -KERNEL_FQ void m08200_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) +KERNEL_FQ KERNEL_FA void m08200_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, cloudkey_t)) { /** * base diff --git a/OpenCL/m08300_a0-optimized.cl b/OpenCL/m08300_a0-optimized.cl index f1265f28b..53f19f614 100644 --- a/OpenCL/m08300_a0-optimized.cl +++ b/OpenCL/m08300_a0-optimized.cl @@ -173,7 +173,7 @@ DECLSPEC u32 replace_dot_by_len (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE out_len.s##n++; \ } -KERNEL_FQ void m08300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -457,15 +457,15 @@ KERNEL_FQ void m08300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -761,10 +761,10 @@ KERNEL_FQ void m08300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m08300_a0-pure.cl b/OpenCL/m08300_a0-pure.cl index 1454c90bf..5b8f3bbdb 100644 --- a/OpenCL/m08300_a0-pure.cl +++ b/OpenCL/m08300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m08300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m08300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m08300_a1-optimized.cl b/OpenCL/m08300_a1-optimized.cl index 690647820..227a865a4 100644 --- a/OpenCL/m08300_a1-optimized.cl +++ b/OpenCL/m08300_a1-optimized.cl @@ -171,7 +171,7 @@ DECLSPEC u32 replace_dot_by_len (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE pw_len.s##n++; \ } -KERNEL_FQ void m08300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -515,15 +515,15 @@ KERNEL_FQ void m08300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -879,10 +879,10 @@ KERNEL_FQ void m08300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m08300_a1-pure.cl b/OpenCL/m08300_a1-pure.cl index 0545f4c93..e9c8c6059 100644 --- a/OpenCL/m08300_a1-pure.cl +++ b/OpenCL/m08300_a1-pure.cl @@ -50,7 +50,7 @@ DECLSPEC const u32 replace_dot_by_len (PRIVATE_AS pw_t *out, GLOBAL_AS const pw_ return cur_len; } -KERNEL_FQ void m08300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -167,7 +167,7 @@ KERNEL_FQ void m08300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m08300_a3-optimized.cl b/OpenCL/m08300_a3-optimized.cl index 2364b0219..dcbec54ce 100644 --- a/OpenCL/m08300_a3-optimized.cl +++ b/OpenCL/m08300_a3-optimized.cl @@ -651,7 +651,7 @@ DECLSPEC void m08300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m08300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -700,7 +700,7 @@ KERNEL_FQ void m08300_m04 (KERN_ATTR_BASIC ()) m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -749,7 +749,7 @@ KERNEL_FQ void m08300_m08 (KERN_ATTR_BASIC ()) m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -798,7 +798,7 @@ KERNEL_FQ void m08300_m16 (KERN_ATTR_BASIC ()) m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -847,7 +847,7 @@ KERNEL_FQ void m08300_s04 (KERN_ATTR_BASIC ()) m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -896,7 +896,7 @@ KERNEL_FQ void m08300_s08 (KERN_ATTR_BASIC ()) m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08300_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m08300_a3-pure.cl b/OpenCL/m08300_a3-pure.cl index 38879aaca..000d2e124 100644 --- a/OpenCL/m08300_a3-pure.cl +++ b/OpenCL/m08300_a3-pure.cl @@ -25,7 +25,7 @@ len.s##n++; \ } -KERNEL_FQ void m08300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -198,7 +198,7 @@ KERNEL_FQ void m08300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m08300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m08400_a0-optimized.cl b/OpenCL/m08400_a0-optimized.cl index ff7f1d720..098d66fa3 100644 --- a/OpenCL/m08400_a0-optimized.cl +++ b/OpenCL/m08400_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m08400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -274,15 +274,15 @@ KERNEL_FQ void m08400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -540,10 +540,10 @@ KERNEL_FQ void m08400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m08400_a0-pure.cl b/OpenCL/m08400_a0-pure.cl index 42adeeb07..a50483266 100644 --- a/OpenCL/m08400_a0-pure.cl +++ b/OpenCL/m08400_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m08400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -179,7 +179,7 @@ KERNEL_FQ void m08400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m08400_a1-optimized.cl b/OpenCL/m08400_a1-optimized.cl index 0cb5adbfd..14e3544df 100644 --- a/OpenCL/m08400_a1-optimized.cl +++ b/OpenCL/m08400_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m08400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -330,15 +330,15 @@ KERNEL_FQ void m08400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -654,10 +654,10 @@ KERNEL_FQ void m08400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m08400_a1-pure.cl b/OpenCL/m08400_a1-pure.cl index 3ec471e72..5d08d0f9c 100644 --- a/OpenCL/m08400_a1-pure.cl +++ b/OpenCL/m08400_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m08400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -175,7 +175,7 @@ KERNEL_FQ void m08400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m08400_a3-optimized.cl b/OpenCL/m08400_a3-optimized.cl index 6b4288fb4..58c56a1db 100644 --- a/OpenCL/m08400_a3-optimized.cl +++ b/OpenCL/m08400_a3-optimized.cl @@ -452,7 +452,7 @@ DECLSPEC void m08400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m08400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -522,7 +522,7 @@ KERNEL_FQ void m08400_m04 (KERN_ATTR_BASIC ()) m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m08400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -592,7 +592,7 @@ KERNEL_FQ void m08400_m08 (KERN_ATTR_BASIC ()) m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m08400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_m16 (KERN_ATTR_BASIC ()) { /** * modifier @@ -662,7 +662,7 @@ KERNEL_FQ void m08400_m16 (KERN_ATTR_BASIC ()) m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m08400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -732,7 +732,7 @@ KERNEL_FQ void m08400_s04 (KERN_ATTR_BASIC ()) m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m08400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -802,7 +802,7 @@ KERNEL_FQ void m08400_s08 (KERN_ATTR_BASIC ()) m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m08400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08400_s16 (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m08400_a3-pure.cl b/OpenCL/m08400_a3-pure.cl index 01db0dcb9..078b69c53 100644 --- a/OpenCL/m08400_a3-pure.cl +++ b/OpenCL/m08400_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m08400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -192,7 +192,7 @@ KERNEL_FQ void m08400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m08400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m08500_a0-pure.cl b/OpenCL/m08500_a0-pure.cl index 0f4fabad9..c3d9f791d 100644 --- a/OpenCL/m08500_a0-pure.cl +++ b/OpenCL/m08500_a0-pure.cl @@ -522,7 +522,7 @@ DECLSPEC void transform_racf_key (const u32 w0, const u32x w1, PRIVATE_AS u32x * | BOX1 (((w1 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; } -KERNEL_FQ void m08500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08500_mxx (KERN_ATTR_RULES ()) { /** * base @@ -620,7 +620,7 @@ KERNEL_FQ void m08500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08500_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m08500_a1-pure.cl b/OpenCL/m08500_a1-pure.cl index 37df9d9df..21f7dc3c0 100644 --- a/OpenCL/m08500_a1-pure.cl +++ b/OpenCL/m08500_a1-pure.cl @@ -520,7 +520,7 @@ DECLSPEC void transform_racf_key (const u32 w0, const u32x w1, PRIVATE_AS u32x * | BOX1 (((w1 >> 24) & 0xff), c_ascii_to_ebcdic_pc) << 24; } -KERNEL_FQ void m08500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08500_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -676,7 +676,7 @@ KERNEL_FQ void m08500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08500_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m08500_a3-pure.cl b/OpenCL/m08500_a3-pure.cl index 9eb48ad2a..29aff1efc 100644 --- a/OpenCL/m08500_a3-pure.cl +++ b/OpenCL/m08500_a3-pure.cl @@ -652,7 +652,7 @@ DECLSPEC void m08500s (LOCAL_AS u32 (*s_SPtrans)[64], LOCAL_AS u32 (*s_skb)[64], } } -KERNEL_FQ void m08500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08500_mxx (KERN_ATTR_VECTOR ()) { /** * base @@ -726,7 +726,7 @@ KERNEL_FQ void m08500_mxx (KERN_ATTR_VECTOR ()) m08500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08500_sxx (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m08600_a0-pure.cl b/OpenCL/m08600_a0-pure.cl index ed65c3ed8..2840a00e8 100644 --- a/OpenCL/m08600_a0-pure.cl +++ b/OpenCL/m08600_a0-pure.cl @@ -265,7 +265,7 @@ DECLSPEC void domino_big_md (PRIVATE_AS const u32 *saved_key, const u32 size, PR mdtransform_norecalc (state, checksum, s_lotus_magic_table); } -KERNEL_FQ void m08600_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08600_mxx (KERN_ATTR_RULES ()) { /** * base @@ -329,7 +329,7 @@ KERNEL_FQ void m08600_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08600_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08600_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m08600_a1-pure.cl b/OpenCL/m08600_a1-pure.cl index 006d46e5e..e50585d39 100644 --- a/OpenCL/m08600_a1-pure.cl +++ b/OpenCL/m08600_a1-pure.cl @@ -263,7 +263,7 @@ DECLSPEC void domino_big_md (PRIVATE_AS const u32 *saved_key, const u32 size, PR mdtransform_norecalc (state, checksum, s_lotus_magic_table); } -KERNEL_FQ void m08600_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08600_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m08600_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08600_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08600_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m08600_a3-pure.cl b/OpenCL/m08600_a3-pure.cl index 1adc4deb4..5a3c801d7 100644 --- a/OpenCL/m08600_a3-pure.cl +++ b/OpenCL/m08600_a3-pure.cl @@ -362,7 +362,7 @@ DECLSPEC void m08600s (LOCAL_AS u32 *s_lotus_magic_table, PRIVATE_AS u32 *w, con } } -KERNEL_FQ void m08600_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08600_mxx (KERN_ATTR_VECTOR ()) { /** * base @@ -419,7 +419,7 @@ KERNEL_FQ void m08600_mxx (KERN_ATTR_VECTOR ()) m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08600_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08600_sxx (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m08700_a0-optimized.cl b/OpenCL/m08700_a0-optimized.cl index 19c75e923..69660d4ca 100644 --- a/OpenCL/m08700_a0-optimized.cl +++ b/OpenCL/m08700_a0-optimized.cl @@ -302,7 +302,7 @@ DECLSPEC void domino_big_md (PRIVATE_AS const u32x *saved_key, const u32 size, P mdtransform_norecalc (state, checksum, s_lotus_magic_table); } -KERNEL_FQ void m08700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_m04 (KERN_ATTR_RULES ()) { /** * base @@ -481,15 +481,15 @@ KERNEL_FQ void m08700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_s04 (KERN_ATTR_RULES ()) { /** * base @@ -680,10 +680,10 @@ KERNEL_FQ void m08700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m08700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m08700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m08700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m08700_a1-optimized.cl b/OpenCL/m08700_a1-optimized.cl index 41d0b368b..6cea71887 100644 --- a/OpenCL/m08700_a1-optimized.cl +++ b/OpenCL/m08700_a1-optimized.cl @@ -300,7 +300,7 @@ DECLSPEC void domino_big_md (PRIVATE_AS const u32x *saved_key, const u32 size, P mdtransform_norecalc (state, checksum, s_lotus_magic_table); } -KERNEL_FQ void m08700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -539,15 +539,15 @@ KERNEL_FQ void m08700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -798,10 +798,10 @@ KERNEL_FQ void m08700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m08700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m08700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m08700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m08700_a3-optimized.cl b/OpenCL/m08700_a3-optimized.cl index b2af8bec9..3fc49c389 100644 --- a/OpenCL/m08700_a3-optimized.cl +++ b/OpenCL/m08700_a3-optimized.cl @@ -573,7 +573,7 @@ DECLSPEC void m08700s (LOCAL_AS u32 *s_lotus_magic_table, LOCAL_AS u32 *l_bin2as } } -KERNEL_FQ void m08700_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -641,7 +641,7 @@ KERNEL_FQ void m08700_m04 (KERN_ATTR_VECTOR ()) m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08700_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -709,7 +709,7 @@ KERNEL_FQ void m08700_m08 (KERN_ATTR_VECTOR ()) m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08700_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -777,7 +777,7 @@ KERNEL_FQ void m08700_m16 (KERN_ATTR_VECTOR ()) m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08700_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -845,7 +845,7 @@ KERNEL_FQ void m08700_s04 (KERN_ATTR_VECTOR ()) m08700s (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08700_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -913,7 +913,7 @@ KERNEL_FQ void m08700_s08 (KERN_ATTR_VECTOR ()) m08700s (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m08700_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m08700_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m08800-pure.cl b/OpenCL/m08800-pure.cl index cbd3a250d..43c1e281a 100644 --- a/OpenCL/m08800-pure.cl +++ b/OpenCL/m08800-pure.cl @@ -68,7 +68,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m08800_init (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) +KERNEL_FQ KERNEL_FA void m08800_init (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) { /** * base @@ -140,7 +140,7 @@ KERNEL_FQ void m08800_init (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t } } -KERNEL_FQ void m08800_loop (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) +KERNEL_FQ KERNEL_FA void m08800_loop (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) { const u64 gid = get_global_id (0); @@ -225,7 +225,7 @@ KERNEL_FQ void m08800_loop (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t } } -KERNEL_FQ void m08800_comp (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) +KERNEL_FQ KERNEL_FA void m08800_comp (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m08900-pure.cl b/OpenCL/m08900-pure.cl index b74b3d9c6..126f421b1 100644 --- a/OpenCL/m08900-pure.cl +++ b/OpenCL/m08900-pure.cl @@ -9,563 +9,72 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #endif #define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) #define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) -typedef struct +KERNEL_FQ KERNEL_FA void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t)) { - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) -{ - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } -} - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4]; - - for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; - - for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - -KERNEL_FQ void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; - sha256_hmac_ctx_t sha256_hmac_ctx; + scrypt_pbkdf2_ggg (pws[gid].i, pws[gid].pw_len, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len, tmps[gid].in, SCRYPT_SZ); - sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); - - sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m08900_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m08900_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m08900_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + u32 X[STATE_CNT4]; - uint4 X[STATE_CNT4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); } -KERNEL_FQ void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m08900_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) { - /** - * base - */ - const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - /** - * 2nd pbkdf2, creates B - */ + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - sha256_hmac_ctx_t ctx; + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} - sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); +KERNEL_FQ KERNEL_FA void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ + const u64 gid = get_global_id (0); - for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) - { - uint4 X[4]; + if (gid >= GID_CNT) return; - const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; + u32 out[4]; - uint4 T[4]; + scrypt_pbkdf2_ggp (pws[gid].i, pws[gid].pw_len, tmps[gid].in, SCRYPT_SZ, out, 16); - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); - - const u32 r0 = hc_swap32_S (ctx.opad.h[DGST_R0]); - const u32 r1 = hc_swap32_S (ctx.opad.h[DGST_R1]); - const u32 r2 = hc_swap32_S (ctx.opad.h[DGST_R2]); - const u32 r3 = hc_swap32_S (ctx.opad.h[DGST_R3]); + const u32 r0 = out[0]; + const u32 r1 = out[1]; + const u32 r2 = out[2]; + const u32 r3 = out[3]; #define il_pos 0 diff --git a/OpenCL/m09000-pure.cl b/OpenCL/m09000-pure.cl index 999f57bfe..d8ef5f6a4 100644 --- a/OpenCL/m09000-pure.cl +++ b/OpenCL/m09000-pure.cl @@ -406,7 +406,7 @@ DECLSPEC inline void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) extern __shared__ u32 S[]; #endif -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m09000_init (KERN_ATTR_TMPS (pwsafe2_tmp_t)) +KERNEL_FQ KERNEL_FA void m09000_init (KERN_ATTR_TMPS (pwsafe2_tmp_t)) { /** * base @@ -636,7 +636,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m09000_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m09000_loop (KERN_ATTR_TMPS (pwsafe2_tmp_t)) +KERNEL_FQ KERNEL_FA void m09000_loop (KERN_ATTR_TMPS (pwsafe2_tmp_t)) { /** * base @@ -705,7 +705,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m09000_loop (KERN_ATTR_TMPS tmps[gid].digest[1] = R0; } -KERNEL_FQ void m09000_comp (KERN_ATTR_TMPS (pwsafe2_tmp_t)) +KERNEL_FQ KERNEL_FA void m09000_comp (KERN_ATTR_TMPS (pwsafe2_tmp_t)) { /** * base diff --git a/OpenCL/m09100-pure.cl b/OpenCL/m09100-pure.cl index 307dcfab8..794e4f971 100644 --- a/OpenCL/m09100-pure.cl +++ b/OpenCL/m09100-pure.cl @@ -424,7 +424,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m09100_init (KERN_ATTR_TMPS (lotus8_tmp_t)) +KERNEL_FQ KERNEL_FA void m09100_init (KERN_ATTR_TMPS (lotus8_tmp_t)) { /** * base @@ -696,7 +696,7 @@ KERNEL_FQ void m09100_init (KERN_ATTR_TMPS (lotus8_tmp_t)) } } -KERNEL_FQ void m09100_loop (KERN_ATTR_TMPS (lotus8_tmp_t)) +KERNEL_FQ KERNEL_FA void m09100_loop (KERN_ATTR_TMPS (lotus8_tmp_t)) { const u64 gid = get_global_id (0); @@ -781,7 +781,7 @@ KERNEL_FQ void m09100_loop (KERN_ATTR_TMPS (lotus8_tmp_t)) } } -KERNEL_FQ void m09100_comp (KERN_ATTR_TMPS (lotus8_tmp_t)) +KERNEL_FQ KERNEL_FA void m09100_comp (KERN_ATTR_TMPS (lotus8_tmp_t)) { /** * base diff --git a/OpenCL/m09400-pure.cl b/OpenCL/m09400-pure.cl index be2626141..523d0f1ca 100644 --- a/OpenCL/m09400-pure.cl +++ b/OpenCL/m09400-pure.cl @@ -33,7 +33,7 @@ typedef struct office2007 } office2007_t; -KERNEL_FQ void m09400_init (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) +KERNEL_FQ KERNEL_FA void m09400_init (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) { /** * base @@ -60,7 +60,7 @@ KERNEL_FQ void m09400_init (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t tmps[gid].out[4] = ctx.h[4]; } -KERNEL_FQ void m09400_loop (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) +KERNEL_FQ KERNEL_FA void m09400_loop (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) { const u64 gid = get_global_id (0); @@ -127,7 +127,7 @@ KERNEL_FQ void m09400_loop (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t unpackv (tmps, out, gid, 4, t4); } -KERNEL_FQ void m09400_comp (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) +KERNEL_FQ KERNEL_FA void m09400_comp (KERN_ATTR_TMPS_ESALT (office2007_tmp_t, office2007_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m09500-pure.cl b/OpenCL/m09500-pure.cl index e009a1b80..03fbe15cf 100644 --- a/OpenCL/m09500-pure.cl +++ b/OpenCL/m09500-pure.cl @@ -31,7 +31,7 @@ typedef struct office2010_tmp } office2010_tmp_t; -KERNEL_FQ void m09500_init (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) +KERNEL_FQ KERNEL_FA void m09500_init (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) { /** * base @@ -58,7 +58,7 @@ KERNEL_FQ void m09500_init (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t tmps[gid].out[4] = ctx.h[4]; } -KERNEL_FQ void m09500_loop (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) +KERNEL_FQ KERNEL_FA void m09500_loop (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) { const u64 gid = get_global_id (0); @@ -125,7 +125,7 @@ KERNEL_FQ void m09500_loop (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t unpackv (tmps, out, gid, 4, t4); } -KERNEL_FQ void m09500_comp (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) +KERNEL_FQ KERNEL_FA void m09500_comp (KERN_ATTR_TMPS_ESALT (office2010_tmp_t, office2010_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m09600-pure.cl b/OpenCL/m09600-pure.cl index aeb397a20..e4c2510ea 100644 --- a/OpenCL/m09600-pure.cl +++ b/OpenCL/m09600-pure.cl @@ -31,7 +31,7 @@ typedef struct office2013 } office2013_t; -KERNEL_FQ void m09600_init (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) +KERNEL_FQ KERNEL_FA void m09600_init (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) { /** * base @@ -61,7 +61,7 @@ KERNEL_FQ void m09600_init (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t tmps[gid].out[7] = ctx.h[7]; } -KERNEL_FQ void m09600_loop (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) +KERNEL_FQ KERNEL_FA void m09600_loop (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) { const u64 gid = get_global_id (0); @@ -171,7 +171,7 @@ KERNEL_FQ void m09600_loop (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t unpack64v (tmps, out, gid, 7, t7); } -KERNEL_FQ void m09600_comp (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) +KERNEL_FQ KERNEL_FA void m09600_comp (KERN_ATTR_TMPS_ESALT (office2013_tmp_t, office2013_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m09700_a0-optimized.cl b/OpenCL/m09700_a0-optimized.cl index 1a1384f3a..cebaa2441 100644 --- a/OpenCL/m09700_a0-optimized.cl +++ b/OpenCL/m09700_a0-optimized.cl @@ -371,7 +371,7 @@ DECLSPEC void gen336 (PRIVATE_AS u32 *digest_pre, PRIVATE_AS u32 *salt_buf, PRIV md5_transform (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m09700_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -548,15 +548,15 @@ KERNEL_FQ void m09700_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09700_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -745,10 +745,10 @@ KERNEL_FQ void m09700_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09700_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09700_a1-optimized.cl b/OpenCL/m09700_a1-optimized.cl index d6a5164cd..5d679a8ef 100644 --- a/OpenCL/m09700_a1-optimized.cl +++ b/OpenCL/m09700_a1-optimized.cl @@ -369,7 +369,7 @@ DECLSPEC void gen336 (PRIVATE_AS u32 *digest_pre, PRIVATE_AS u32 *salt_buf, PRIV md5_transform (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -604,15 +604,15 @@ KERNEL_FQ void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09700_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -859,10 +859,10 @@ KERNEL_FQ void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09700_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09700_a3-optimized.cl b/OpenCL/m09700_a3-optimized.cl index 6e368bc10..3953b3718 100644 --- a/OpenCL/m09700_a3-optimized.cl +++ b/OpenCL/m09700_a3-optimized.cl @@ -828,7 +828,7 @@ DECLSPEC void m09700s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -879,7 +879,7 @@ KERNEL_FQ void m09700_m04 (KERN_ATTR_ESALT (oldoffice01_t)) m09700m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09700_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -930,11 +930,11 @@ KERNEL_FQ void m09700_m08 (KERN_ATTR_ESALT (oldoffice01_t)) m09700m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09700_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -985,7 +985,7 @@ KERNEL_FQ void m09700_s04 (KERN_ATTR_ESALT (oldoffice01_t)) m09700s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09700_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -1036,6 +1036,6 @@ KERNEL_FQ void m09700_s08 (KERN_ATTR_ESALT (oldoffice01_t)) m09700s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09700_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09700_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09710_a0-optimized.cl b/OpenCL/m09710_a0-optimized.cl index 87773002d..3ebd47076 100644 --- a/OpenCL/m09710_a0-optimized.cl +++ b/OpenCL/m09710_a0-optimized.cl @@ -27,7 +27,7 @@ typedef struct oldoffice01 } oldoffice01_t; -KERNEL_FQ void m09710_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -155,15 +155,15 @@ KERNEL_FQ void m09710_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09710_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -303,10 +303,10 @@ KERNEL_FQ void m09710_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09710_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09710_a1-optimized.cl b/OpenCL/m09710_a1-optimized.cl index 04ea2ee80..f6189624e 100644 --- a/OpenCL/m09710_a1-optimized.cl +++ b/OpenCL/m09710_a1-optimized.cl @@ -25,7 +25,7 @@ typedef struct oldoffice01 } oldoffice01_t; -KERNEL_FQ void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -199,15 +199,15 @@ KERNEL_FQ void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09710_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -393,10 +393,10 @@ KERNEL_FQ void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09710_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09710_a3-optimized.cl b/OpenCL/m09710_a3-optimized.cl index dc7c1f6ef..1403d9aa1 100644 --- a/OpenCL/m09710_a3-optimized.cl +++ b/OpenCL/m09710_a3-optimized.cl @@ -237,7 +237,7 @@ DECLSPEC void m09710s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -288,15 +288,15 @@ KERNEL_FQ void m09710_m04 (KERN_ATTR_ESALT (oldoffice01_t)) m09710m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09710_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -347,10 +347,10 @@ KERNEL_FQ void m09710_s04 (KERN_ATTR_ESALT (oldoffice01_t)) m09710s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09710_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09710_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09710_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09720_a0-optimized.cl b/OpenCL/m09720_a0-optimized.cl index 4e58fa2ed..9673787c9 100644 --- a/OpenCL/m09720_a0-optimized.cl +++ b/OpenCL/m09720_a0-optimized.cl @@ -369,7 +369,7 @@ DECLSPEC void gen336 (PRIVATE_AS u32x *digest_pre, PRIVATE_AS u32 *salt_buf, PRI md5_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m09720_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -467,15 +467,15 @@ KERNEL_FQ void m09720_m04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09720_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { /** * modifier @@ -585,10 +585,10 @@ KERNEL_FQ void m09720_s04 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09720_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s08 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s16 (KERN_ATTR_RULES_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09720_a1-optimized.cl b/OpenCL/m09720_a1-optimized.cl index a9c0c53ed..d8ab038ce 100644 --- a/OpenCL/m09720_a1-optimized.cl +++ b/OpenCL/m09720_a1-optimized.cl @@ -367,7 +367,7 @@ DECLSPEC void gen336 (PRIVATE_AS u32x *digest_pre, PRIVATE_AS u32 *salt_buf, PRI md5_transform_vector (w0_t, w1_t, w2_t, w3_t, digest); } -KERNEL_FQ void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -515,15 +515,15 @@ KERNEL_FQ void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09720_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * modifier @@ -683,10 +683,10 @@ KERNEL_FQ void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) } } -KERNEL_FQ void m09720_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09720_a3-optimized.cl b/OpenCL/m09720_a3-optimized.cl index 1102f1222..f35547726 100644 --- a/OpenCL/m09720_a3-optimized.cl +++ b/OpenCL/m09720_a3-optimized.cl @@ -553,7 +553,7 @@ DECLSPEC void m09720s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -602,7 +602,7 @@ KERNEL_FQ void m09720_m04 (KERN_ATTR_ESALT (oldoffice01_t)) m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09720_m08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m08 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -651,11 +651,11 @@ KERNEL_FQ void m09720_m08 (KERN_ATTR_ESALT (oldoffice01_t)) m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09720_m16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_m16 (KERN_ATTR_ESALT (oldoffice01_t)) { } -KERNEL_FQ void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -704,7 +704,7 @@ KERNEL_FQ void m09720_s04 (KERN_ATTR_ESALT (oldoffice01_t)) m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09720_s08 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s08 (KERN_ATTR_ESALT (oldoffice01_t)) { /** * base @@ -753,6 +753,6 @@ KERNEL_FQ void m09720_s08 (KERN_ATTR_ESALT (oldoffice01_t)) m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09720_s16 (KERN_ATTR_ESALT (oldoffice01_t)) +KERNEL_FQ KERNEL_FA void m09720_s16 (KERN_ATTR_ESALT (oldoffice01_t)) { } diff --git a/OpenCL/m09800_a0-optimized.cl b/OpenCL/m09800_a0-optimized.cl index 46b798d1c..f51dfd726 100644 --- a/OpenCL/m09800_a0-optimized.cl +++ b/OpenCL/m09800_a0-optimized.cl @@ -31,7 +31,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09800_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -309,15 +309,15 @@ KERNEL_FQ void m09800_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09800_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -606,10 +606,10 @@ KERNEL_FQ void m09800_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09800_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09800_a1-optimized.cl b/OpenCL/m09800_a1-optimized.cl index 9a27f463d..86759d633 100644 --- a/OpenCL/m09800_a1-optimized.cl +++ b/OpenCL/m09800_a1-optimized.cl @@ -29,7 +29,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -357,15 +357,15 @@ KERNEL_FQ void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -704,10 +704,10 @@ KERNEL_FQ void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09800_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09800_a3-optimized.cl b/OpenCL/m09800_a3-optimized.cl index 53c3b7ef0..534cbad4b 100644 --- a/OpenCL/m09800_a3-optimized.cl +++ b/OpenCL/m09800_a3-optimized.cl @@ -531,7 +531,7 @@ DECLSPEC void m09800s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -582,7 +582,7 @@ KERNEL_FQ void m09800_m04 (KERN_ATTR_ESALT (oldoffice34_t)) m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -633,7 +633,7 @@ KERNEL_FQ void m09800_m08 (KERN_ATTR_ESALT (oldoffice34_t)) m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -684,7 +684,7 @@ KERNEL_FQ void m09800_m16 (KERN_ATTR_ESALT (oldoffice34_t)) m09800m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -735,7 +735,7 @@ KERNEL_FQ void m09800_s04 (KERN_ATTR_ESALT (oldoffice34_t)) m09800s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -786,7 +786,7 @@ KERNEL_FQ void m09800_s08 (KERN_ATTR_ESALT (oldoffice34_t)) m09800s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09800_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09800_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base diff --git a/OpenCL/m09810_a0-optimized.cl b/OpenCL/m09810_a0-optimized.cl index f0f1f15fd..aa3b983e6 100644 --- a/OpenCL/m09810_a0-optimized.cl +++ b/OpenCL/m09810_a0-optimized.cl @@ -29,7 +29,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09810_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -144,15 +144,15 @@ KERNEL_FQ void m09810_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09810_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -279,10 +279,10 @@ KERNEL_FQ void m09810_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09810_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09810_a1-optimized.cl b/OpenCL/m09810_a1-optimized.cl index 7f90cfd0a..cfd0fc883 100644 --- a/OpenCL/m09810_a1-optimized.cl +++ b/OpenCL/m09810_a1-optimized.cl @@ -27,7 +27,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -188,15 +188,15 @@ KERNEL_FQ void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09810_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -369,10 +369,10 @@ KERNEL_FQ void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09810_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09810_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09810_a3-optimized.cl b/OpenCL/m09810_a3-optimized.cl index 902b369bf..ffb7a5e43 100644 --- a/OpenCL/m09810_a3-optimized.cl +++ b/OpenCL/m09810_a3-optimized.cl @@ -209,7 +209,7 @@ DECLSPEC void m09810s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -260,7 +260,7 @@ KERNEL_FQ void m09810_m04 (KERN_ATTR_ESALT (oldoffice34_t)) m09810m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09810_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -311,7 +311,7 @@ KERNEL_FQ void m09810_m08 (KERN_ATTR_ESALT (oldoffice34_t)) m09810m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09810_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -362,7 +362,7 @@ KERNEL_FQ void m09810_m16 (KERN_ATTR_ESALT (oldoffice34_t)) m09810m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -413,7 +413,7 @@ KERNEL_FQ void m09810_s04 (KERN_ATTR_ESALT (oldoffice34_t)) m09810s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09810_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -464,7 +464,7 @@ KERNEL_FQ void m09810_s08 (KERN_ATTR_ESALT (oldoffice34_t)) m09810s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09810_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09810_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base diff --git a/OpenCL/m09820_a0-optimized.cl b/OpenCL/m09820_a0-optimized.cl index b4daf5587..7a5b02956 100644 --- a/OpenCL/m09820_a0-optimized.cl +++ b/OpenCL/m09820_a0-optimized.cl @@ -31,7 +31,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09820_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -253,15 +253,15 @@ KERNEL_FQ void m09820_m04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09820_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { /** * modifier @@ -492,10 +492,10 @@ KERNEL_FQ void m09820_s04 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09820_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s08 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s16 (KERN_ATTR_RULES_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09820_a1-optimized.cl b/OpenCL/m09820_a1-optimized.cl index b8d19f00c..4b04ec596 100644 --- a/OpenCL/m09820_a1-optimized.cl +++ b/OpenCL/m09820_a1-optimized.cl @@ -29,7 +29,7 @@ typedef struct oldoffice34 } oldoffice34_t; -KERNEL_FQ void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -301,15 +301,15 @@ KERNEL_FQ void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09820_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * modifier @@ -590,10 +590,10 @@ KERNEL_FQ void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) } } -KERNEL_FQ void m09820_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { } -KERNEL_FQ void m09820_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { } diff --git a/OpenCL/m09820_a3-optimized.cl b/OpenCL/m09820_a3-optimized.cl index 889268423..c7c846b36 100644 --- a/OpenCL/m09820_a3-optimized.cl +++ b/OpenCL/m09820_a3-optimized.cl @@ -416,7 +416,7 @@ DECLSPEC void m09820s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m09820_m04 (KERN_ATTR_ESALT (oldoffice34_t)) m09820m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09820_m08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -518,7 +518,7 @@ KERNEL_FQ void m09820_m08 (KERN_ATTR_ESALT (oldoffice34_t)) m09820m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09820_m16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_m16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -569,7 +569,7 @@ KERNEL_FQ void m09820_m16 (KERN_ATTR_ESALT (oldoffice34_t)) m09820m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -620,7 +620,7 @@ KERNEL_FQ void m09820_s04 (KERN_ATTR_ESALT (oldoffice34_t)) m09820s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09820_s08 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s08 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base @@ -671,7 +671,7 @@ KERNEL_FQ void m09820_s08 (KERN_ATTR_ESALT (oldoffice34_t)) m09820s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09820_s16 (KERN_ATTR_ESALT (oldoffice34_t)) +KERNEL_FQ KERNEL_FA void m09820_s16 (KERN_ATTR_ESALT (oldoffice34_t)) { /** * base diff --git a/OpenCL/m09900_a0-optimized.cl b/OpenCL/m09900_a0-optimized.cl index 2aa8ae62f..217da7f5c 100644 --- a/OpenCL/m09900_a0-optimized.cl +++ b/OpenCL/m09900_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m09900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -242,15 +242,15 @@ KERNEL_FQ void m09900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m09900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m09900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m09900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -491,10 +491,10 @@ KERNEL_FQ void m09900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m09900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m09900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m09900_a0-pure.cl b/OpenCL/m09900_a0-pure.cl index dc4d9ea92..5679142b8 100644 --- a/OpenCL/m09900_a0-pure.cl +++ b/OpenCL/m09900_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m09900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m09900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m09900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m09900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m09900_a1-optimized.cl b/OpenCL/m09900_a1-optimized.cl index fb52d6aa1..dacdb4ca1 100644 --- a/OpenCL/m09900_a1-optimized.cl +++ b/OpenCL/m09900_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m09900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -300,15 +300,15 @@ KERNEL_FQ void m09900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m09900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m09900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m09900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -609,10 +609,10 @@ KERNEL_FQ void m09900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m09900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m09900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m09900_a1-pure.cl b/OpenCL/m09900_a1-pure.cl index 9be5a5714..69ac972ae 100644 --- a/OpenCL/m09900_a1-pure.cl +++ b/OpenCL/m09900_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m09900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m09900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m09900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m09900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m09900_a3-optimized.cl b/OpenCL/m09900_a3-optimized.cl index c2d7e76b8..ce13b0673 100644 --- a/OpenCL/m09900_a3-optimized.cl +++ b/OpenCL/m09900_a3-optimized.cl @@ -585,7 +585,7 @@ DECLSPEC void m09900s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m09900_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -625,7 +625,7 @@ KERNEL_FQ void m09900_m04 (KERN_ATTR_VECTOR ()) m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09900_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -665,7 +665,7 @@ KERNEL_FQ void m09900_m08 (KERN_ATTR_VECTOR ()) m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09900_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -705,7 +705,7 @@ KERNEL_FQ void m09900_m16 (KERN_ATTR_VECTOR ()) m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09900_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -745,7 +745,7 @@ KERNEL_FQ void m09900_s04 (KERN_ATTR_VECTOR ()) m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09900_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -785,7 +785,7 @@ KERNEL_FQ void m09900_s08 (KERN_ATTR_VECTOR ()) m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m09900_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m09900_a3-pure.cl b/OpenCL/m09900_a3-pure.cl index f76512ed6..d206bd3fd 100644 --- a/OpenCL/m09900_a3-pure.cl +++ b/OpenCL/m09900_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m09900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m09900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m09900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m09900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10100_a0-optimized.cl b/OpenCL/m10100_a0-optimized.cl index 946c47f71..13fe2e72b 100644 --- a/OpenCL/m10100_a0-optimized.cl +++ b/OpenCL/m10100_a0-optimized.cl @@ -85,7 +85,7 @@ DECLSPEC u64x siphash_rot32 (const u64x a) (v1) ^= (v2); \ (v2) = siphash_rot32 ((v2)) -KERNEL_FQ void m10100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -204,15 +204,15 @@ KERNEL_FQ void m10100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -343,10 +343,10 @@ KERNEL_FQ void m10100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10100_a1-optimized.cl b/OpenCL/m10100_a1-optimized.cl index ca7e5b63d..557b919b0 100644 --- a/OpenCL/m10100_a1-optimized.cl +++ b/OpenCL/m10100_a1-optimized.cl @@ -83,7 +83,7 @@ DECLSPEC u64x siphash_rot32 (const u64x a) (v1) ^= (v2); \ (v2) = siphash_rot32 ((v2)) -KERNEL_FQ void m10100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -262,15 +262,15 @@ KERNEL_FQ void m10100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -461,10 +461,10 @@ KERNEL_FQ void m10100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10100_a3-optimized.cl b/OpenCL/m10100_a3-optimized.cl index 26c1e036f..8370fe013 100644 --- a/OpenCL/m10100_a3-optimized.cl +++ b/OpenCL/m10100_a3-optimized.cl @@ -276,7 +276,7 @@ DECLSPEC void m10100s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m10100_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -316,7 +316,7 @@ KERNEL_FQ void m10100_m04 (KERN_ATTR_VECTOR ()) m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10100_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -356,7 +356,7 @@ KERNEL_FQ void m10100_m08 (KERN_ATTR_VECTOR ()) m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10100_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -396,7 +396,7 @@ KERNEL_FQ void m10100_m16 (KERN_ATTR_VECTOR ()) m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10100_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -436,7 +436,7 @@ KERNEL_FQ void m10100_s04 (KERN_ATTR_VECTOR ()) m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10100_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -476,7 +476,7 @@ KERNEL_FQ void m10100_s08 (KERN_ATTR_VECTOR ()) m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10100_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10100_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m10300-pure.cl b/OpenCL/m10300-pure.cl index 8976ad795..ff3cd4c4b 100644 --- a/OpenCL/m10300-pure.cl +++ b/OpenCL/m10300-pure.cl @@ -20,7 +20,7 @@ typedef struct saph_sha1_tmp } saph_sha1_tmp_t; -KERNEL_FQ void m10300_init (KERN_ATTR_TMPS (saph_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m10300_init (KERN_ATTR_TMPS (saph_sha1_tmp_t)) { /** * base @@ -47,7 +47,7 @@ KERNEL_FQ void m10300_init (KERN_ATTR_TMPS (saph_sha1_tmp_t)) tmps[gid].digest_buf[4] = ctx.h[4]; } -KERNEL_FQ void m10300_loop (KERN_ATTR_TMPS (saph_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m10300_loop (KERN_ATTR_TMPS (saph_sha1_tmp_t)) { /** * base @@ -127,7 +127,7 @@ KERNEL_FQ void m10300_loop (KERN_ATTR_TMPS (saph_sha1_tmp_t)) tmps[gid].digest_buf[4] = digest[4]; } -KERNEL_FQ void m10300_comp (KERN_ATTR_TMPS (saph_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m10300_comp (KERN_ATTR_TMPS (saph_sha1_tmp_t)) { /** * modifier diff --git a/OpenCL/m10400_a0-optimized.cl b/OpenCL/m10400_a0-optimized.cl index e442a7e8b..374980daf 100644 --- a/OpenCL/m10400_a0-optimized.cl +++ b/OpenCL/m10400_a0-optimized.cl @@ -41,7 +41,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -223,15 +223,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -425,10 +425,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } diff --git a/OpenCL/m10400_a1-optimized.cl b/OpenCL/m10400_a1-optimized.cl index 3c0165749..f11835643 100644 --- a/OpenCL/m10400_a1-optimized.cl +++ b/OpenCL/m10400_a1-optimized.cl @@ -39,7 +39,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -281,15 +281,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m16 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -543,10 +543,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s16 (KERN_ATTR_ESALT (pdf_t)) { } diff --git a/OpenCL/m10400_a3-optimized.cl b/OpenCL/m10400_a3-optimized.cl index 8687ae809..044752b43 100644 --- a/OpenCL/m10400_a3-optimized.cl +++ b/OpenCL/m10400_a3-optimized.cl @@ -397,7 +397,7 @@ DECLSPEC void m10400s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -448,7 +448,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m04 (KERN_ATTR_ESALT m10400m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -499,7 +499,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m08 (KERN_ATTR_ESALT m10400m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_m16 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -550,7 +550,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_m16 (KERN_ATTR_ESALT m10400m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s04 (KERN_ATTR_ESALT m10400s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -652,7 +652,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10400_s08 (KERN_ATTR_ESALT m10400s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10400_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10400_s16 (KERN_ATTR_ESALT (pdf_t)) { /** * base diff --git a/OpenCL/m10410_a0-optimized.cl b/OpenCL/m10410_a0-optimized.cl index aa1acad0b..28251f827 100644 --- a/OpenCL/m10410_a0-optimized.cl +++ b/OpenCL/m10410_a0-optimized.cl @@ -41,7 +41,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -120,15 +120,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -219,10 +219,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } diff --git a/OpenCL/m10410_a1-optimized.cl b/OpenCL/m10410_a1-optimized.cl index b37624c5b..4ead5106b 100644 --- a/OpenCL/m10410_a1-optimized.cl +++ b/OpenCL/m10410_a1-optimized.cl @@ -39,7 +39,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -187,15 +187,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m16 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -355,10 +355,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s16 (KERN_ATTR_ESALT (pdf_t)) { } diff --git a/OpenCL/m10410_a3-optimized.cl b/OpenCL/m10410_a3-optimized.cl index 5e789cca8..e1bb0f2f5 100644 --- a/OpenCL/m10410_a3-optimized.cl +++ b/OpenCL/m10410_a3-optimized.cl @@ -151,7 +151,7 @@ DECLSPEC void m10410s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -202,7 +202,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m04 (KERN_ATTR_ESALT m10410m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -253,7 +253,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m08 (KERN_ATTR_ESALT m10410m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_m16 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -304,7 +304,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_m16 (KERN_ATTR_ESALT m10410m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -355,7 +355,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s04 (KERN_ATTR_ESALT m10410s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -406,7 +406,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s08 (KERN_ATTR_ESALT m10410s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m10410_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10410_s16 (KERN_ATTR_ESALT (pdf_t)) { /** * base diff --git a/OpenCL/m10420_a0-optimized.cl b/OpenCL/m10420_a0-optimized.cl index 32b1df8c1..981c32385 100644 --- a/OpenCL/m10420_a0-optimized.cl +++ b/OpenCL/m10420_a0-optimized.cl @@ -51,7 +51,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void m10420_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -204,15 +204,15 @@ KERNEL_FQ void m10420_m04 (KERN_ATTR_RULES_ESALT (pdf_t)) } } -KERNEL_FQ void m10420_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) { /** * modifier @@ -377,10 +377,10 @@ KERNEL_FQ void m10420_s04 (KERN_ATTR_RULES_ESALT (pdf_t)) } } -KERNEL_FQ void m10420_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s08 (KERN_ATTR_RULES_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s16 (KERN_ATTR_RULES_ESALT (pdf_t)) { } diff --git a/OpenCL/m10420_a1-optimized.cl b/OpenCL/m10420_a1-optimized.cl index 5c2ef872d..add621053 100644 --- a/OpenCL/m10420_a1-optimized.cl +++ b/OpenCL/m10420_a1-optimized.cl @@ -49,7 +49,7 @@ typedef struct pdf } pdf_t; -KERNEL_FQ void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -262,15 +262,15 @@ KERNEL_FQ void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) } } -KERNEL_FQ void m10420_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m16 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * modifier @@ -495,10 +495,10 @@ KERNEL_FQ void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) } } -KERNEL_FQ void m10420_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s08 (KERN_ATTR_ESALT (pdf_t)) { } -KERNEL_FQ void m10420_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s16 (KERN_ATTR_ESALT (pdf_t)) { } diff --git a/OpenCL/m10420_a3-optimized.cl b/OpenCL/m10420_a3-optimized.cl index 797c7d16b..97769040e 100644 --- a/OpenCL/m10420_a3-optimized.cl +++ b/OpenCL/m10420_a3-optimized.cl @@ -361,7 +361,7 @@ DECLSPEC void m10420s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -410,7 +410,7 @@ KERNEL_FQ void m10420_m04 (KERN_ATTR_ESALT (pdf_t)) m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10420_m08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -459,7 +459,7 @@ KERNEL_FQ void m10420_m08 (KERN_ATTR_ESALT (pdf_t)) m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10420_m16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_m16 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -508,7 +508,7 @@ KERNEL_FQ void m10420_m16 (KERN_ATTR_ESALT (pdf_t)) m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -557,7 +557,7 @@ KERNEL_FQ void m10420_s04 (KERN_ATTR_ESALT (pdf_t)) m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10420_s08 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s08 (KERN_ATTR_ESALT (pdf_t)) { /** * base @@ -606,7 +606,7 @@ KERNEL_FQ void m10420_s08 (KERN_ATTR_ESALT (pdf_t)) m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10420_s16 (KERN_ATTR_ESALT (pdf_t)) +KERNEL_FQ KERNEL_FA void m10420_s16 (KERN_ATTR_ESALT (pdf_t)) { /** * base diff --git a/OpenCL/m10500-pure.cl b/OpenCL/m10500-pure.cl index f45c40d42..dc0d711d2 100644 --- a/OpenCL/m10500-pure.cl +++ b/OpenCL/m10500-pure.cl @@ -45,7 +45,7 @@ typedef struct pdf14_tmp } pdf14_tmp_t; -KERNEL_FQ void m10500_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10500_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { /** * base @@ -232,7 +232,7 @@ KERNEL_FQ void m10500_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) tmps[gid].out[3] = 0; } -KERNEL_FQ void m10500_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10500_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { /** * base @@ -333,7 +333,7 @@ KERNEL_FQ void m10500_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) tmps[gid].out[3] = out[3]; } -KERNEL_FQ void m10500_comp (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10500_comp (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { /** * modifier diff --git a/OpenCL/m10700-optimized.cl b/OpenCL/m10700-optimized.cl index 10ebfcac8..b665dbbf3 100644 --- a/OpenCL/m10700-optimized.cl +++ b/OpenCL/m10700-optimized.cl @@ -563,7 +563,7 @@ DECLSPEC u32 do_round (LOCAL_AS u32 *sc, PRIVATE_AS const u32 *pw, const u32 pw_ return ex; } -KERNEL_FQ void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { /** * base @@ -595,7 +595,7 @@ KERNEL_FQ void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) tmps[gid].W_len = WORDSZ256; } -KERNEL_FQ void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -666,7 +666,7 @@ KERNEL_FQ void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) ctx.dgst_len = tmps[gid].dgst_len; ctx.W_len = tmps[gid].W_len; - LOCAL_VK u32 s_sc[256][PWMAXSZ4 + BLMAXSZ4 + AESSZ4]; + LOCAL_VK u32 s_sc[FIXED_LOCAL_SIZE][PWMAXSZ4 + BLMAXSZ4 + AESSZ4]; u32 ex = 0; @@ -695,7 +695,7 @@ KERNEL_FQ void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) tmps[gid].W_len = ctx.W_len; } -KERNEL_FQ void m10700_comp (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_comp (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { /** * modifier diff --git a/OpenCL/m10700-pure.cl b/OpenCL/m10700-pure.cl index 327c76e71..688caf153 100644 --- a/OpenCL/m10700-pure.cl +++ b/OpenCL/m10700-pure.cl @@ -1167,7 +1167,7 @@ DECLSPEC u32 do_round (PRIVATE_AS const u32 *w, const u32 pw_len, PRIVATE_AS pdf return ex; } -KERNEL_FQ void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { /** * base @@ -1211,7 +1211,7 @@ KERNEL_FQ void m10700_init (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) tmps[gid] = tmp; } -KERNEL_FQ void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -1289,7 +1289,7 @@ KERNEL_FQ void m10700_loop (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) tmps[gid] = tmp; } -KERNEL_FQ void m10700_comp (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m10700_comp (KERN_ATTR_TMPS_ESALT (pdf17l8_tmp_t, pdf_t)) { /** * modifier diff --git a/OpenCL/m10800_a0-optimized.cl b/OpenCL/m10800_a0-optimized.cl index 4825f106d..6182d81d3 100644 --- a/OpenCL/m10800_a0-optimized.cl +++ b/OpenCL/m10800_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -215,15 +215,15 @@ KERNEL_FQ void m10800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -328,10 +328,10 @@ KERNEL_FQ void m10800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10800_a0-pure.cl b/OpenCL/m10800_a0-pure.cl index 665d0fe0c..a1d3ff787 100644 --- a/OpenCL/m10800_a0-pure.cl +++ b/OpenCL/m10800_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m10800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10800_a1-optimized.cl b/OpenCL/m10800_a1-optimized.cl index ad3321401..0dd77c59d 100644 --- a/OpenCL/m10800_a1-optimized.cl +++ b/OpenCL/m10800_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -271,15 +271,15 @@ KERNEL_FQ void m10800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -442,10 +442,10 @@ KERNEL_FQ void m10800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10800_a1-pure.cl b/OpenCL/m10800_a1-pure.cl index 827093244..f2422a392 100644 --- a/OpenCL/m10800_a1-pure.cl +++ b/OpenCL/m10800_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m10800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10800_a3-optimized.cl b/OpenCL/m10800_a3-optimized.cl index 371e024d2..342e46d7f 100644 --- a/OpenCL/m10800_a3-optimized.cl +++ b/OpenCL/m10800_a3-optimized.cl @@ -256,7 +256,7 @@ DECLSPEC void m10800s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m10800_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -296,7 +296,7 @@ KERNEL_FQ void m10800_m04 (KERN_ATTR_VECTOR ()) m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10800_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -336,7 +336,7 @@ KERNEL_FQ void m10800_m08 (KERN_ATTR_VECTOR ()) m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10800_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -376,7 +376,7 @@ KERNEL_FQ void m10800_m16 (KERN_ATTR_VECTOR ()) m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10800_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -416,7 +416,7 @@ KERNEL_FQ void m10800_s04 (KERN_ATTR_VECTOR ()) m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10800_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -456,7 +456,7 @@ KERNEL_FQ void m10800_s08 (KERN_ATTR_VECTOR ()) m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10800_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m10800_a3-pure.cl b/OpenCL/m10800_a3-pure.cl index a1c0213c2..cc4bdf4e5 100644 --- a/OpenCL/m10800_a3-pure.cl +++ b/OpenCL/m10800_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m10800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10810_a0-optimized.cl b/OpenCL/m10810_a0-optimized.cl index 9bee00928..c833aaf14 100644 --- a/OpenCL/m10810_a0-optimized.cl +++ b/OpenCL/m10810_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10810_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -288,15 +288,15 @@ KERNEL_FQ void m10810_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10810_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10810_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10810_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -474,10 +474,10 @@ KERNEL_FQ void m10810_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10810_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10810_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10810_a0-pure.cl b/OpenCL/m10810_a0-pure.cl index 5ba543ff4..dc7bb4739 100644 --- a/OpenCL/m10810_a0-pure.cl +++ b/OpenCL/m10810_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10810_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m10810_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10810_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10810_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10810_a1-optimized.cl b/OpenCL/m10810_a1-optimized.cl index 76c6fc3d1..7834db98e 100644 --- a/OpenCL/m10810_a1-optimized.cl +++ b/OpenCL/m10810_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10810_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -346,15 +346,15 @@ KERNEL_FQ void m10810_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10810_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10810_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10810_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -592,10 +592,10 @@ KERNEL_FQ void m10810_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10810_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10810_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10810_a1-pure.cl b/OpenCL/m10810_a1-pure.cl index 31a34e647..459ee66e3 100644 --- a/OpenCL/m10810_a1-pure.cl +++ b/OpenCL/m10810_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10810_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m10810_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10810_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10810_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10810_a3-optimized.cl b/OpenCL/m10810_a3-optimized.cl index c4be02491..a14ac91ef 100644 --- a/OpenCL/m10810_a3-optimized.cl +++ b/OpenCL/m10810_a3-optimized.cl @@ -307,7 +307,7 @@ DECLSPEC void m10810s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m10810_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -347,7 +347,7 @@ KERNEL_FQ void m10810_m04 (KERN_ATTR_VECTOR ()) m10810m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10810_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m10810_m08 (KERN_ATTR_VECTOR ()) m10810m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10810_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m10810_m16 (KERN_ATTR_VECTOR ()) m10810m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10810_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m10810_s04 (KERN_ATTR_VECTOR ()) m10810s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10810_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m10810_s08 (KERN_ATTR_VECTOR ()) m10810s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10810_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m10810_a3-pure.cl b/OpenCL/m10810_a3-pure.cl index 334370c7b..d9ede0052 100644 --- a/OpenCL/m10810_a3-pure.cl +++ b/OpenCL/m10810_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10810_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m10810_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10810_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10810_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10820_a0-optimized.cl b/OpenCL/m10820_a0-optimized.cl index 2fd131708..2c1b43994 100644 --- a/OpenCL/m10820_a0-optimized.cl +++ b/OpenCL/m10820_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10820_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -268,15 +268,15 @@ KERNEL_FQ void m10820_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10820_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10820_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10820_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -434,10 +434,10 @@ KERNEL_FQ void m10820_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10820_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10820_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10820_a0-pure.cl b/OpenCL/m10820_a0-pure.cl index dcb959972..ca0af920a 100644 --- a/OpenCL/m10820_a0-pure.cl +++ b/OpenCL/m10820_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10820_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m10820_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10820_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10820_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10820_a1-optimized.cl b/OpenCL/m10820_a1-optimized.cl index beb234e13..cfa3f7a35 100644 --- a/OpenCL/m10820_a1-optimized.cl +++ b/OpenCL/m10820_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10820_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -324,15 +324,15 @@ KERNEL_FQ void m10820_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10820_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10820_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10820_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -548,10 +548,10 @@ KERNEL_FQ void m10820_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10820_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10820_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10820_a1-pure.cl b/OpenCL/m10820_a1-pure.cl index a58b437a4..c6bb0daf2 100644 --- a/OpenCL/m10820_a1-pure.cl +++ b/OpenCL/m10820_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10820_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m10820_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10820_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10820_a3-optimized.cl b/OpenCL/m10820_a3-optimized.cl index 3b6ccedd9..f83649e0c 100644 --- a/OpenCL/m10820_a3-optimized.cl +++ b/OpenCL/m10820_a3-optimized.cl @@ -362,7 +362,7 @@ DECLSPEC void m10820s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_BASIC } } -KERNEL_FQ void m10820_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -402,7 +402,7 @@ KERNEL_FQ void m10820_m04 (KERN_ATTR_BASIC ()) m10820m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10820_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -442,7 +442,7 @@ KERNEL_FQ void m10820_m08 (KERN_ATTR_BASIC ()) m10820m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10820_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -482,7 +482,7 @@ KERNEL_FQ void m10820_m16 (KERN_ATTR_BASIC ()) m10820m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10820_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -522,7 +522,7 @@ KERNEL_FQ void m10820_s04 (KERN_ATTR_BASIC ()) m10820s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10820_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -562,7 +562,7 @@ KERNEL_FQ void m10820_s08 (KERN_ATTR_BASIC ()) m10820s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10820_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10820_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m10820_a3-pure.cl b/OpenCL/m10820_a3-pure.cl index 542612a8b..1b0b4bc83 100644 --- a/OpenCL/m10820_a3-pure.cl +++ b/OpenCL/m10820_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10820_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10820_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m10820_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10820_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10820_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10830_a0-optimized.cl b/OpenCL/m10830_a0-optimized.cl index de034f608..22a03dd59 100644 --- a/OpenCL/m10830_a0-optimized.cl +++ b/OpenCL/m10830_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10830_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -293,15 +293,15 @@ KERNEL_FQ void m10830_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10830_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10830_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10830_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -484,10 +484,10 @@ KERNEL_FQ void m10830_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10830_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10830_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10830_a0-pure.cl b/OpenCL/m10830_a0-pure.cl index 9f8c33c07..c40ac5e30 100644 --- a/OpenCL/m10830_a0-pure.cl +++ b/OpenCL/m10830_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10830_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m10830_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10830_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10830_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10830_a1-optimized.cl b/OpenCL/m10830_a1-optimized.cl index a98dca237..38ae65d22 100644 --- a/OpenCL/m10830_a1-optimized.cl +++ b/OpenCL/m10830_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10830_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -351,15 +351,15 @@ KERNEL_FQ void m10830_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10830_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10830_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10830_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -602,10 +602,10 @@ KERNEL_FQ void m10830_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10830_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10830_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10830_a1-pure.cl b/OpenCL/m10830_a1-pure.cl index 23c2954f8..c0376c124 100644 --- a/OpenCL/m10830_a1-pure.cl +++ b/OpenCL/m10830_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10830_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m10830_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10830_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10830_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10830_a3-optimized.cl b/OpenCL/m10830_a3-optimized.cl index 9e1177f40..81e590b10 100644 --- a/OpenCL/m10830_a3-optimized.cl +++ b/OpenCL/m10830_a3-optimized.cl @@ -307,7 +307,7 @@ DECLSPEC void m10830s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m10830_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -347,7 +347,7 @@ KERNEL_FQ void m10830_m04 (KERN_ATTR_VECTOR ()) m10830m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10830_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -387,7 +387,7 @@ KERNEL_FQ void m10830_m08 (KERN_ATTR_VECTOR ()) m10830m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10830_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -427,7 +427,7 @@ KERNEL_FQ void m10830_m16 (KERN_ATTR_VECTOR ()) m10830m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10830_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -467,7 +467,7 @@ KERNEL_FQ void m10830_s04 (KERN_ATTR_VECTOR ()) m10830s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10830_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -507,7 +507,7 @@ KERNEL_FQ void m10830_s08 (KERN_ATTR_VECTOR ()) m10830s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10830_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m10830_a3-pure.cl b/OpenCL/m10830_a3-pure.cl index 052523e08..989133aa1 100644 --- a/OpenCL/m10830_a3-pure.cl +++ b/OpenCL/m10830_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10830_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m10830_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10830_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10830_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10840_a0-optimized.cl b/OpenCL/m10840_a0-optimized.cl index 6629619d2..6ff980fb4 100644 --- a/OpenCL/m10840_a0-optimized.cl +++ b/OpenCL/m10840_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10840_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -273,15 +273,15 @@ KERNEL_FQ void m10840_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10840_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10840_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10840_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -444,10 +444,10 @@ KERNEL_FQ void m10840_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10840_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10840_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10840_a0-pure.cl b/OpenCL/m10840_a0-pure.cl index 531da18b0..22b180ecd 100644 --- a/OpenCL/m10840_a0-pure.cl +++ b/OpenCL/m10840_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10840_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m10840_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10840_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10840_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10840_a1-optimized.cl b/OpenCL/m10840_a1-optimized.cl index 8ec344beb..85eafd57b 100644 --- a/OpenCL/m10840_a1-optimized.cl +++ b/OpenCL/m10840_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10840_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -329,15 +329,15 @@ KERNEL_FQ void m10840_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10840_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10840_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10840_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -558,10 +558,10 @@ KERNEL_FQ void m10840_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10840_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10840_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10840_a1-pure.cl b/OpenCL/m10840_a1-pure.cl index 4dd8ba1c3..62c6c56a7 100644 --- a/OpenCL/m10840_a1-pure.cl +++ b/OpenCL/m10840_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10840_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m10840_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10840_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10840_a3-optimized.cl b/OpenCL/m10840_a3-optimized.cl index 8f05f4bd9..b0e9ed875 100644 --- a/OpenCL/m10840_a3-optimized.cl +++ b/OpenCL/m10840_a3-optimized.cl @@ -362,7 +362,7 @@ DECLSPEC void m10840s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_BASIC } } -KERNEL_FQ void m10840_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -402,7 +402,7 @@ KERNEL_FQ void m10840_m04 (KERN_ATTR_BASIC ()) m10840m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10840_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -442,7 +442,7 @@ KERNEL_FQ void m10840_m08 (KERN_ATTR_BASIC ()) m10840m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10840_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -482,7 +482,7 @@ KERNEL_FQ void m10840_m16 (KERN_ATTR_BASIC ()) m10840m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10840_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -522,7 +522,7 @@ KERNEL_FQ void m10840_s04 (KERN_ATTR_BASIC ()) m10840s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10840_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -562,7 +562,7 @@ KERNEL_FQ void m10840_s08 (KERN_ATTR_BASIC ()) m10840s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10840_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10840_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m10840_a3-pure.cl b/OpenCL/m10840_a3-pure.cl index 4469efe45..6ec9cc3c0 100644 --- a/OpenCL/m10840_a3-pure.cl +++ b/OpenCL/m10840_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10840_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10840_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m10840_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10840_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10840_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10870_a0-optimized.cl b/OpenCL/m10870_a0-optimized.cl index ed2c4b80c..1dfc798f1 100644 --- a/OpenCL/m10870_a0-optimized.cl +++ b/OpenCL/m10870_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10870_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -220,15 +220,15 @@ KERNEL_FQ void m10870_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10870_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10870_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10870_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -338,10 +338,10 @@ KERNEL_FQ void m10870_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10870_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m10870_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m10870_a0-pure.cl b/OpenCL/m10870_a0-pure.cl index aacfffea5..15bd04d9e 100644 --- a/OpenCL/m10870_a0-pure.cl +++ b/OpenCL/m10870_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10870_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m10870_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m10870_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m10870_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m10870_a1-optimized.cl b/OpenCL/m10870_a1-optimized.cl index d4a08c550..a2095ed4e 100644 --- a/OpenCL/m10870_a1-optimized.cl +++ b/OpenCL/m10870_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha384_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = 0; } -KERNEL_FQ void m10870_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -276,15 +276,15 @@ KERNEL_FQ void m10870_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10870_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10870_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10870_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -452,10 +452,10 @@ KERNEL_FQ void m10870_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10870_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m10870_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m10870_a1-pure.cl b/OpenCL/m10870_a1-pure.cl index 659c1c06c..99776d0f6 100644 --- a/OpenCL/m10870_a1-pure.cl +++ b/OpenCL/m10870_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10870_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m10870_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m10870_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m10870_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m10870_a3-optimized.cl b/OpenCL/m10870_a3-optimized.cl index 3a24df3bb..ec1d7e675 100644 --- a/OpenCL/m10870_a3-optimized.cl +++ b/OpenCL/m10870_a3-optimized.cl @@ -256,7 +256,7 @@ DECLSPEC void m10870s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m10870_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -296,7 +296,7 @@ KERNEL_FQ void m10870_m04 (KERN_ATTR_VECTOR ()) m10870m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10870_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -336,7 +336,7 @@ KERNEL_FQ void m10870_m08 (KERN_ATTR_VECTOR ()) m10870m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10870_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -376,7 +376,7 @@ KERNEL_FQ void m10870_m16 (KERN_ATTR_VECTOR ()) m10870m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10870_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -416,7 +416,7 @@ KERNEL_FQ void m10870_s04 (KERN_ATTR_VECTOR ()) m10870s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10870_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -456,7 +456,7 @@ KERNEL_FQ void m10870_s08 (KERN_ATTR_VECTOR ()) m10870s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m10870_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m10870_a3-pure.cl b/OpenCL/m10870_a3-pure.cl index 26dbae7c1..115016dc4 100644 --- a/OpenCL/m10870_a3-pure.cl +++ b/OpenCL/m10870_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha384.cl) #endif -KERNEL_FQ void m10870_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m10870_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m10870_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m10870_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m10900-pure.cl b/OpenCL/m10900-pure.cl index 009715af6..3e19c16a4 100644 --- a/OpenCL/m10900-pure.cl +++ b/OpenCL/m10900-pure.cl @@ -75,7 +75,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m10900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m10900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base @@ -159,7 +159,7 @@ KERNEL_FQ void m10900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m10900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m10900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { const u64 gid = get_global_id (0); @@ -265,7 +265,7 @@ KERNEL_FQ void m10900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m10900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m10900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base diff --git a/OpenCL/m11000_a0-optimized.cl b/OpenCL/m11000_a0-optimized.cl index 05bf90ac3..5103db800 100644 --- a/OpenCL/m11000_a0-optimized.cl +++ b/OpenCL/m11000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m11000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -305,15 +305,15 @@ KERNEL_FQ void m11000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -614,10 +614,10 @@ KERNEL_FQ void m11000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11000_a0-pure.cl b/OpenCL/m11000_a0-pure.cl index 6969c2929..f9d468470 100644 --- a/OpenCL/m11000_a0-pure.cl +++ b/OpenCL/m11000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m11000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m11000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11000_a1-optimized.cl b/OpenCL/m11000_a1-optimized.cl index 2500deba6..5851f5501 100644 --- a/OpenCL/m11000_a1-optimized.cl +++ b/OpenCL/m11000_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m11000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -361,15 +361,15 @@ KERNEL_FQ void m11000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -728,10 +728,10 @@ KERNEL_FQ void m11000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11000_a1-pure.cl b/OpenCL/m11000_a1-pure.cl index 906c5bcfd..9a71ab94d 100644 --- a/OpenCL/m11000_a1-pure.cl +++ b/OpenCL/m11000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m11000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m11000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11000_a3-optimized.cl b/OpenCL/m11000_a3-optimized.cl index a7cb4055a..a35bb460c 100644 --- a/OpenCL/m11000_a3-optimized.cl +++ b/OpenCL/m11000_a3-optimized.cl @@ -550,7 +550,7 @@ DECLSPEC void m11000s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m11000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -599,7 +599,7 @@ KERNEL_FQ void m11000_m04 (KERN_ATTR_BASIC ()) m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -648,7 +648,7 @@ KERNEL_FQ void m11000_m08 (KERN_ATTR_BASIC ()) m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -697,7 +697,7 @@ KERNEL_FQ void m11000_m16 (KERN_ATTR_BASIC ()) m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -746,7 +746,7 @@ KERNEL_FQ void m11000_s04 (KERN_ATTR_BASIC ()) m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -795,7 +795,7 @@ KERNEL_FQ void m11000_s08 (KERN_ATTR_BASIC ()) m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11000_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m11000_a3-pure.cl b/OpenCL/m11000_a3-pure.cl index 21cea2c2d..4892b6af3 100644 --- a/OpenCL/m11000_a3-pure.cl +++ b/OpenCL/m11000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m11000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m11000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11100_a0-optimized.cl b/OpenCL/m11100_a0-optimized.cl index 23ba22a5a..44cd453df 100644 --- a/OpenCL/m11100_a0-optimized.cl +++ b/OpenCL/m11100_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_m04 (KERN_ATTR_RULES ()) { /** * base @@ -354,15 +354,15 @@ KERNEL_FQ void m11100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_s04 (KERN_ATTR_RULES ()) { /** * base @@ -703,10 +703,10 @@ KERNEL_FQ void m11100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11100_a0-pure.cl b/OpenCL/m11100_a0-pure.cl index ed8221ae7..728ad90df 100644 --- a/OpenCL/m11100_a0-pure.cl +++ b/OpenCL/m11100_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m11100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11100_a1-optimized.cl b/OpenCL/m11100_a1-optimized.cl index 015a2fdf4..6b6182bf9 100644 --- a/OpenCL/m11100_a1-optimized.cl +++ b/OpenCL/m11100_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -412,15 +412,15 @@ KERNEL_FQ void m11100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -821,10 +821,10 @@ KERNEL_FQ void m11100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11100_a1-pure.cl b/OpenCL/m11100_a1-pure.cl index e2189be2d..8e485d844 100644 --- a/OpenCL/m11100_a1-pure.cl +++ b/OpenCL/m11100_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -170,7 +170,7 @@ KERNEL_FQ void m11100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11100_a3-optimized.cl b/OpenCL/m11100_a3-optimized.cl index af87664e3..5781e0bfd 100644 --- a/OpenCL/m11100_a3-optimized.cl +++ b/OpenCL/m11100_a3-optimized.cl @@ -645,7 +645,7 @@ DECLSPEC void m11100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m11100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -715,7 +715,7 @@ KERNEL_FQ void m11100_m04 (KERN_ATTR_BASIC ()) m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m11100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -785,7 +785,7 @@ KERNEL_FQ void m11100_m08 (KERN_ATTR_BASIC ()) m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m11100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -855,7 +855,7 @@ KERNEL_FQ void m11100_m16 (KERN_ATTR_BASIC ()) m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m11100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -925,7 +925,7 @@ KERNEL_FQ void m11100_s04 (KERN_ATTR_BASIC ()) m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m11100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -995,7 +995,7 @@ KERNEL_FQ void m11100_s08 (KERN_ATTR_BASIC ()) m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m11100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11100_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m11100_a3-pure.cl b/OpenCL/m11100_a3-pure.cl index cdb063f02..450965776 100644 --- a/OpenCL/m11100_a3-pure.cl +++ b/OpenCL/m11100_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -213,7 +213,7 @@ KERNEL_FQ void m11100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11200_a0-optimized.cl b/OpenCL/m11200_a0-optimized.cl index 9cf4eb094..4898d94ae 100644 --- a/OpenCL/m11200_a0-optimized.cl +++ b/OpenCL/m11200_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m11200_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -470,15 +470,15 @@ KERNEL_FQ void m11200_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11200_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11200_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11200_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -944,10 +944,10 @@ KERNEL_FQ void m11200_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11200_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11200_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11200_a0-pure.cl b/OpenCL/m11200_a0-pure.cl index 8fcb68a08..0fddb9a46 100644 --- a/OpenCL/m11200_a0-pure.cl +++ b/OpenCL/m11200_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m11200_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -132,7 +132,7 @@ KERNEL_FQ void m11200_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11200_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11200_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11200_a1-optimized.cl b/OpenCL/m11200_a1-optimized.cl index 67bd63aef..fe734cf1b 100644 --- a/OpenCL/m11200_a1-optimized.cl +++ b/OpenCL/m11200_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m11200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -526,15 +526,15 @@ KERNEL_FQ void m11200_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1058,10 +1058,10 @@ KERNEL_FQ void m11200_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11200_a1-pure.cl b/OpenCL/m11200_a1-pure.cl index 051348f67..7e0c5c3e7 100644 --- a/OpenCL/m11200_a1-pure.cl +++ b/OpenCL/m11200_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m11200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -128,7 +128,7 @@ KERNEL_FQ void m11200_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11200_a3-optimized.cl b/OpenCL/m11200_a3-optimized.cl index e74a76733..1ce0ff377 100644 --- a/OpenCL/m11200_a3-optimized.cl +++ b/OpenCL/m11200_a3-optimized.cl @@ -880,7 +880,7 @@ DECLSPEC void m11200s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m11200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -933,7 +933,7 @@ KERNEL_FQ void m11200_m04 (KERN_ATTR_BASIC ()) m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -986,7 +986,7 @@ KERNEL_FQ void m11200_m08 (KERN_ATTR_BASIC ()) m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1039,7 +1039,7 @@ KERNEL_FQ void m11200_m16 (KERN_ATTR_BASIC ()) m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1092,7 +1092,7 @@ KERNEL_FQ void m11200_s04 (KERN_ATTR_BASIC ()) m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1145,7 +1145,7 @@ KERNEL_FQ void m11200_s08 (KERN_ATTR_BASIC ()) m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11200_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m11200_a3-pure.cl b/OpenCL/m11200_a3-pure.cl index 79524b5cf..0578f3a56 100644 --- a/OpenCL/m11200_a3-pure.cl +++ b/OpenCL/m11200_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11200_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11200_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -155,7 +155,7 @@ KERNEL_FQ void m11200_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11200_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11200_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11300-pure.cl b/OpenCL/m11300-pure.cl index 074d91797..438f806f7 100644 --- a/OpenCL/m11300-pure.cl +++ b/OpenCL/m11300-pure.cl @@ -89,7 +89,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m11300_init (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) +KERNEL_FQ KERNEL_FA void m11300_init (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) { /** * base @@ -119,7 +119,7 @@ KERNEL_FQ void m11300_init (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_ tmps[gid].dgst[7] = ctx.h[7]; } -KERNEL_FQ void m11300_loop (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) +KERNEL_FQ KERNEL_FA void m11300_loop (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) { const u64 gid = get_global_id (0); @@ -211,7 +211,7 @@ KERNEL_FQ void m11300_loop (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_ unpack64v (tmps, dgst, gid, 7, t7); } -KERNEL_FQ void m11300_comp (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) +KERNEL_FQ KERNEL_FA void m11300_comp (KERN_ATTR_TMPS_ESALT (bitcoin_wallet_tmp_t, bitcoin_wallet_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m11400_a0-pure.cl b/OpenCL/m11400_a0-pure.cl index e0cb1171d..fe3e08c3e 100644 --- a/OpenCL/m11400_a0-pure.cl +++ b/OpenCL/m11400_a0-pure.cl @@ -38,7 +38,7 @@ typedef struct sip #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11400_mxx (KERN_ATTR_RULES_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_mxx (KERN_ATTR_RULES_ESALT (sip_t)) { /** * modifier @@ -136,7 +136,7 @@ KERNEL_FQ void m11400_mxx (KERN_ATTR_RULES_ESALT (sip_t)) } } -KERNEL_FQ void m11400_sxx (KERN_ATTR_RULES_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_sxx (KERN_ATTR_RULES_ESALT (sip_t)) { /** * modifier diff --git a/OpenCL/m11400_a1-pure.cl b/OpenCL/m11400_a1-pure.cl index 253f63d58..823abe3cb 100644 --- a/OpenCL/m11400_a1-pure.cl +++ b/OpenCL/m11400_a1-pure.cl @@ -36,7 +36,7 @@ typedef struct sip #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11400_mxx (KERN_ATTR_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_mxx (KERN_ATTR_ESALT (sip_t)) { /** * modifier @@ -130,7 +130,7 @@ KERNEL_FQ void m11400_mxx (KERN_ATTR_ESALT (sip_t)) } } -KERNEL_FQ void m11400_sxx (KERN_ATTR_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_sxx (KERN_ATTR_ESALT (sip_t)) { /** * modifier diff --git a/OpenCL/m11400_a3-pure.cl b/OpenCL/m11400_a3-pure.cl index cf11f9295..c429e8ff4 100644 --- a/OpenCL/m11400_a3-pure.cl +++ b/OpenCL/m11400_a3-pure.cl @@ -36,7 +36,7 @@ typedef struct sip #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m11400_mxx (KERN_ATTR_VECTOR_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_mxx (KERN_ATTR_VECTOR_ESALT (sip_t)) { /** * modifier @@ -156,7 +156,7 @@ KERNEL_FQ void m11400_mxx (KERN_ATTR_VECTOR_ESALT (sip_t)) } } -KERNEL_FQ void m11400_sxx (KERN_ATTR_VECTOR_ESALT (sip_t)) +KERNEL_FQ KERNEL_FA void m11400_sxx (KERN_ATTR_VECTOR_ESALT (sip_t)) { /** * modifier diff --git a/OpenCL/m11500_a0-optimized.cl b/OpenCL/m11500_a0-optimized.cl index cef66fe88..8ce45c649 100644 --- a/OpenCL/m11500_a0-optimized.cl +++ b/OpenCL/m11500_a0-optimized.cl @@ -135,7 +135,7 @@ DECLSPEC u32x crc32 (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m11500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -215,15 +215,15 @@ KERNEL_FQ void m11500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -315,10 +315,10 @@ KERNEL_FQ void m11500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11500_a0-pure.cl b/OpenCL/m11500_a0-pure.cl index 520975145..4b37034c1 100644 --- a/OpenCL/m11500_a0-pure.cl +++ b/OpenCL/m11500_a0-pure.cl @@ -123,7 +123,7 @@ DECLSPEC u32x crc32 (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m11500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -169,7 +169,7 @@ KERNEL_FQ void m11500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11500_a1-optimized.cl b/OpenCL/m11500_a1-optimized.cl index 0b6ad0808..78ff20370 100644 --- a/OpenCL/m11500_a1-optimized.cl +++ b/OpenCL/m11500_a1-optimized.cl @@ -133,7 +133,7 @@ DECLSPEC u32x crc32 (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m11500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -273,15 +273,15 @@ KERNEL_FQ void m11500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -433,10 +433,10 @@ KERNEL_FQ void m11500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11500_a1-pure.cl b/OpenCL/m11500_a1-pure.cl index 7d6c54eae..4621690ba 100644 --- a/OpenCL/m11500_a1-pure.cl +++ b/OpenCL/m11500_a1-pure.cl @@ -121,7 +121,7 @@ DECLSPEC u32x crc32_g (GLOBAL_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m11500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -163,7 +163,7 @@ KERNEL_FQ void m11500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11500_a3-optimized.cl b/OpenCL/m11500_a3-optimized.cl index 21794b812..5e369be7e 100644 --- a/OpenCL/m11500_a3-optimized.cl +++ b/OpenCL/m11500_a3-optimized.cl @@ -255,7 +255,7 @@ DECLSPEC void m11500s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_BASIC } } -KERNEL_FQ void m11500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -295,7 +295,7 @@ KERNEL_FQ void m11500_m04 (KERN_ATTR_BASIC ()) m11500m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -335,7 +335,7 @@ KERNEL_FQ void m11500_m08 (KERN_ATTR_BASIC ()) m11500m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -375,7 +375,7 @@ KERNEL_FQ void m11500_m16 (KERN_ATTR_BASIC ()) m11500m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -415,7 +415,7 @@ KERNEL_FQ void m11500_s04 (KERN_ATTR_BASIC ()) m11500s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -455,7 +455,7 @@ KERNEL_FQ void m11500_s08 (KERN_ATTR_BASIC ()) m11500s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11500_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m11500_a3-pure.cl b/OpenCL/m11500_a3-pure.cl index 8a64c4cc0..054d61b16 100644 --- a/OpenCL/m11500_a3-pure.cl +++ b/OpenCL/m11500_a3-pure.cl @@ -121,7 +121,7 @@ DECLSPEC u32x crc32 (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m11500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m11500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11600-optimized.cl b/OpenCL/m11600-optimized.cl index 671349d99..2d2eb61d3 100644 --- a/OpenCL/m11600-optimized.cl +++ b/OpenCL/m11600-optimized.cl @@ -40,7 +40,7 @@ typedef struct #define MIN(a,b) (((a) < (b)) ? (a) : (b)) -KERNEL_FQ void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { /** * base @@ -62,7 +62,7 @@ KERNEL_FQ void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hoo tmps[gid].len = 0; } -KERNEL_FQ void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { const u64 gid = get_global_id (0); @@ -178,7 +178,7 @@ KERNEL_FQ void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hoo tmps[gid].h[7] = h[7]; } -KERNEL_FQ void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { const u64 gid = get_global_id (0); @@ -233,7 +233,7 @@ KERNEL_FQ void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_h hooks[gid].ukey[7] = hc_swap32_S (h[7]); } -KERNEL_FQ void m11600_comp (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_comp (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { /** * base diff --git a/OpenCL/m11600-pure.cl b/OpenCL/m11600-pure.cl index 585b1e308..85e59a4da 100644 --- a/OpenCL/m11600-pure.cl +++ b/OpenCL/m11600-pure.cl @@ -140,7 +140,7 @@ DECLSPEC void memcat8c_be (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u3 } } -KERNEL_FQ void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { /** * base @@ -187,7 +187,7 @@ KERNEL_FQ void m11600_init (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hoo tmps[gid].len = ctx.len; } -KERNEL_FQ void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { /** * base @@ -286,7 +286,7 @@ KERNEL_FQ void m11600_loop (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hoo tmps[gid].len = ctx.len; } -KERNEL_FQ void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { const u64 gid = get_global_id (0); @@ -341,7 +341,7 @@ KERNEL_FQ void m11600_hook23 (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_h hooks[gid].ukey[7] = hc_swap32_S (h[7]); } -KERNEL_FQ void m11600_comp (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) +KERNEL_FQ KERNEL_FA void m11600_comp (KERN_ATTR_TMPS_HOOKS (seven_zip_tmp_t, seven_zip_hook_t)) { /** * base diff --git a/OpenCL/m11700_a0-optimized.cl b/OpenCL/m11700_a0-optimized.cl index 55186edd5..72bb1db5e 100644 --- a/OpenCL/m11700_a0-optimized.cl +++ b/OpenCL/m11700_a0-optimized.cl @@ -87,7 +87,7 @@ DECLSPEC void streebog_g (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, LOCAL_AS } } -KERNEL_FQ void m11700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -237,15 +237,15 @@ KERNEL_FQ void m11700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -407,10 +407,10 @@ KERNEL_FQ void m11700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11700_a0-pure.cl b/OpenCL/m11700_a0-pure.cl index 05825df37..d565046eb 100644 --- a/OpenCL/m11700_a0-pure.cl +++ b/OpenCL/m11700_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -89,7 +89,7 @@ KERNEL_FQ void m11700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11700_a1-optimized.cl b/OpenCL/m11700_a1-optimized.cl index 4a0c9e086..9bbbfe1c9 100644 --- a/OpenCL/m11700_a1-optimized.cl +++ b/OpenCL/m11700_a1-optimized.cl @@ -85,7 +85,7 @@ DECLSPEC void streebog_g (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, LOCAL_AS } } -KERNEL_FQ void m11700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -293,15 +293,15 @@ KERNEL_FQ void m11700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -521,10 +521,10 @@ KERNEL_FQ void m11700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11700_a1-pure.cl b/OpenCL/m11700_a1-pure.cl index 5bbe44e30..48346a286 100644 --- a/OpenCL/m11700_a1-pure.cl +++ b/OpenCL/m11700_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -85,7 +85,7 @@ KERNEL_FQ void m11700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11700_a3-optimized.cl b/OpenCL/m11700_a3-optimized.cl index 211b7258e..d98def3d8 100644 --- a/OpenCL/m11700_a3-optimized.cl +++ b/OpenCL/m11700_a3-optimized.cl @@ -248,7 +248,7 @@ DECLSPEC void m11700s (LOCAL_AS u64 (*s_sbob_sl64)[256], PRIVATE_AS u32 *w, cons } } -KERNEL_FQ void m11700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -312,7 +312,7 @@ KERNEL_FQ void m11700_m04 (KERN_ATTR_BASIC ()) m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -376,7 +376,7 @@ KERNEL_FQ void m11700_m08 (KERN_ATTR_BASIC ()) m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_m16 (KERN_ATTR_BASIC ()) { /** * modifier @@ -440,7 +440,7 @@ KERNEL_FQ void m11700_m16 (KERN_ATTR_BASIC ()) m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -504,7 +504,7 @@ KERNEL_FQ void m11700_s04 (KERN_ATTR_BASIC ()) m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -568,7 +568,7 @@ KERNEL_FQ void m11700_s08 (KERN_ATTR_BASIC ()) m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11700_s16 (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11700_a3-pure.cl b/OpenCL/m11700_a3-pure.cl index 3daf08077..66d3e37f9 100644 --- a/OpenCL/m11700_a3-pure.cl +++ b/OpenCL/m11700_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -98,7 +98,7 @@ KERNEL_FQ void m11700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11750_a0-pure.cl b/OpenCL/m11750_a0-pure.cl index 0626330b1..92a7487b2 100644 --- a/OpenCL/m11750_a0-pure.cl +++ b/OpenCL/m11750_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11750_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11750_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -98,7 +98,7 @@ KERNEL_FQ void m11750_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11750_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11750_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11750_a1-pure.cl b/OpenCL/m11750_a1-pure.cl index 96bd210ef..bfa16fda1 100644 --- a/OpenCL/m11750_a1-pure.cl +++ b/OpenCL/m11750_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11750_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11750_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -121,7 +121,7 @@ KERNEL_FQ void m11750_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11750_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11750_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11750_a3-pure.cl b/OpenCL/m11750_a3-pure.cl index 604cdd250..6bd7fb57e 100644 --- a/OpenCL/m11750_a3-pure.cl +++ b/OpenCL/m11750_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11750_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11750_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -107,7 +107,7 @@ KERNEL_FQ void m11750_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11750_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11750_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11760_a0-pure.cl b/OpenCL/m11760_a0-pure.cl index bef4c15ea..1222b9b18 100644 --- a/OpenCL/m11760_a0-pure.cl +++ b/OpenCL/m11760_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11760_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11760_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -100,7 +100,7 @@ KERNEL_FQ void m11760_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11760_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11760_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11760_a1-pure.cl b/OpenCL/m11760_a1-pure.cl index e98ff5ae2..9a9f9c963 100644 --- a/OpenCL/m11760_a1-pure.cl +++ b/OpenCL/m11760_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11760_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11760_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -123,7 +123,7 @@ KERNEL_FQ void m11760_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11760_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11760_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11760_a3-pure.cl b/OpenCL/m11760_a3-pure.cl index a125320b1..89c539460 100644 --- a/OpenCL/m11760_a3-pure.cl +++ b/OpenCL/m11760_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog256.cl) #endif -KERNEL_FQ void m11760_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11760_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -109,7 +109,7 @@ KERNEL_FQ void m11760_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11760_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11760_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11800_a0-optimized.cl b/OpenCL/m11800_a0-optimized.cl index dc0251a00..7b5669204 100644 --- a/OpenCL/m11800_a0-optimized.cl +++ b/OpenCL/m11800_a0-optimized.cl @@ -87,7 +87,7 @@ DECLSPEC void streebog_g (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, LOCAL_AS } } -KERNEL_FQ void m11800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -237,15 +237,15 @@ KERNEL_FQ void m11800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -407,10 +407,10 @@ KERNEL_FQ void m11800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m11800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m11800_a0-pure.cl b/OpenCL/m11800_a0-pure.cl index 09f65c373..202d2c30a 100644 --- a/OpenCL/m11800_a0-pure.cl +++ b/OpenCL/m11800_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -89,7 +89,7 @@ KERNEL_FQ void m11800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11800_a1-optimized.cl b/OpenCL/m11800_a1-optimized.cl index 9f8985346..031ccd4f7 100644 --- a/OpenCL/m11800_a1-optimized.cl +++ b/OpenCL/m11800_a1-optimized.cl @@ -85,7 +85,7 @@ DECLSPEC void streebog_g (PRIVATE_AS u64x *h, PRIVATE_AS const u64x *m, LOCAL_AS } } -KERNEL_FQ void m11800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -293,15 +293,15 @@ KERNEL_FQ void m11800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -521,10 +521,10 @@ KERNEL_FQ void m11800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m11800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m11800_a1-pure.cl b/OpenCL/m11800_a1-pure.cl index 7acd881cd..8de94d8d3 100644 --- a/OpenCL/m11800_a1-pure.cl +++ b/OpenCL/m11800_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -85,7 +85,7 @@ KERNEL_FQ void m11800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11800_a3-optimized.cl b/OpenCL/m11800_a3-optimized.cl index 2b91c9576..7f97b54f9 100644 --- a/OpenCL/m11800_a3-optimized.cl +++ b/OpenCL/m11800_a3-optimized.cl @@ -248,7 +248,7 @@ DECLSPEC void m11800s (LOCAL_AS u64 (*s_sbob_sl64)[256], PRIVATE_AS u32 *w, cons } } -KERNEL_FQ void m11800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -312,7 +312,7 @@ KERNEL_FQ void m11800_m04 (KERN_ATTR_BASIC ()) m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -376,7 +376,7 @@ KERNEL_FQ void m11800_m08 (KERN_ATTR_BASIC ()) m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_m16 (KERN_ATTR_BASIC ()) { /** * modifier @@ -440,7 +440,7 @@ KERNEL_FQ void m11800_m16 (KERN_ATTR_BASIC ()) m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -504,7 +504,7 @@ KERNEL_FQ void m11800_s04 (KERN_ATTR_BASIC ()) m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -568,7 +568,7 @@ KERNEL_FQ void m11800_s08 (KERN_ATTR_BASIC ()) m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m11800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11800_s16 (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11800_a3-pure.cl b/OpenCL/m11800_a3-pure.cl index eb378b6c1..33fde0e74 100644 --- a/OpenCL/m11800_a3-pure.cl +++ b/OpenCL/m11800_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -98,7 +98,7 @@ KERNEL_FQ void m11800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11850_a0-pure.cl b/OpenCL/m11850_a0-pure.cl index 8963e8d24..f9f72fbac 100644 --- a/OpenCL/m11850_a0-pure.cl +++ b/OpenCL/m11850_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11850_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11850_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -98,7 +98,7 @@ KERNEL_FQ void m11850_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11850_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11850_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11850_a1-pure.cl b/OpenCL/m11850_a1-pure.cl index 0f10594d3..8eb3b2a87 100644 --- a/OpenCL/m11850_a1-pure.cl +++ b/OpenCL/m11850_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11850_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11850_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -121,7 +121,7 @@ KERNEL_FQ void m11850_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11850_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11850_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11850_a3-pure.cl b/OpenCL/m11850_a3-pure.cl index ee3f3a050..2804d410d 100644 --- a/OpenCL/m11850_a3-pure.cl +++ b/OpenCL/m11850_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11850_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11850_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -107,7 +107,7 @@ KERNEL_FQ void m11850_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11850_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11850_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11860_a0-pure.cl b/OpenCL/m11860_a0-pure.cl index ab1cc6b98..65f8a1fe5 100644 --- a/OpenCL/m11860_a0-pure.cl +++ b/OpenCL/m11860_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11860_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11860_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -100,7 +100,7 @@ KERNEL_FQ void m11860_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m11860_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m11860_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m11860_a1-pure.cl b/OpenCL/m11860_a1-pure.cl index 2842b9f52..8bd4459ed 100644 --- a/OpenCL/m11860_a1-pure.cl +++ b/OpenCL/m11860_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11860_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11860_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -123,7 +123,7 @@ KERNEL_FQ void m11860_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m11860_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m11860_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m11860_a3-pure.cl b/OpenCL/m11860_a3-pure.cl index 60c72865b..75d3d9129 100644 --- a/OpenCL/m11860_a3-pure.cl +++ b/OpenCL/m11860_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_streebog512.cl) #endif -KERNEL_FQ void m11860_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11860_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -109,7 +109,7 @@ KERNEL_FQ void m11860_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m11860_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m11860_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m11900-pure.cl b/OpenCL/m11900-pure.cl index fee24abc7..d00200784 100644 --- a/OpenCL/m11900-pure.cl +++ b/OpenCL/m11900-pure.cl @@ -67,7 +67,7 @@ DECLSPEC void hmac_md5_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_ md5_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m11900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) +KERNEL_FQ KERNEL_FA void m11900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) { /** * base @@ -135,7 +135,7 @@ KERNEL_FQ void m11900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t } } -KERNEL_FQ void m11900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) +KERNEL_FQ KERNEL_FA void m11900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) { const u64 gid = get_global_id (0); @@ -213,7 +213,7 @@ KERNEL_FQ void m11900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t } } -KERNEL_FQ void m11900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) +KERNEL_FQ KERNEL_FA void m11900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_md5_tmp_t, pbkdf2_md5_t)) { /** * base diff --git a/OpenCL/m12000-pure.cl b/OpenCL/m12000-pure.cl index 5c2385bdf..ae47e1677 100644 --- a/OpenCL/m12000-pure.cl +++ b/OpenCL/m12000-pure.cl @@ -69,7 +69,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m12000_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) +KERNEL_FQ KERNEL_FA void m12000_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) { /** * base @@ -141,7 +141,7 @@ KERNEL_FQ void m12000_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1 } } -KERNEL_FQ void m12000_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) +KERNEL_FQ KERNEL_FA void m12000_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) { const u64 gid = get_global_id (0); @@ -226,7 +226,7 @@ KERNEL_FQ void m12000_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1 } } -KERNEL_FQ void m12000_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) +KERNEL_FQ KERNEL_FA void m12000_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, pbkdf2_sha1_t)) { /** * base diff --git a/OpenCL/m12200-pure.cl b/OpenCL/m12200-pure.cl index 39eb3016e..91d55adaf 100644 --- a/OpenCL/m12200-pure.cl +++ b/OpenCL/m12200-pure.cl @@ -23,7 +23,7 @@ typedef struct ecryptfs_tmp } ecryptfs_tmp_t; -KERNEL_FQ void m12200_init (KERN_ATTR_TMPS (ecryptfs_tmp_t)) +KERNEL_FQ KERNEL_FA void m12200_init (KERN_ATTR_TMPS (ecryptfs_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m12200_init (KERN_ATTR_TMPS (ecryptfs_tmp_t)) tmps[gid].out[7] = ctx.h[7]; } -KERNEL_FQ void m12200_loop (KERN_ATTR_TMPS (ecryptfs_tmp_t)) +KERNEL_FQ KERNEL_FA void m12200_loop (KERN_ATTR_TMPS (ecryptfs_tmp_t)) { const u64 gid = get_global_id (0); @@ -162,7 +162,7 @@ KERNEL_FQ void m12200_loop (KERN_ATTR_TMPS (ecryptfs_tmp_t)) unpack64v (tmps, out, gid, 7, t7); } -KERNEL_FQ void m12200_comp (KERN_ATTR_TMPS (ecryptfs_tmp_t)) +KERNEL_FQ KERNEL_FA void m12200_comp (KERN_ATTR_TMPS (ecryptfs_tmp_t)) { /** * base diff --git a/OpenCL/m12300-pure.cl b/OpenCL/m12300-pure.cl index 32fcafb4b..f5d7318f2 100644 --- a/OpenCL/m12300-pure.cl +++ b/OpenCL/m12300-pure.cl @@ -85,7 +85,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m12300_init (KERN_ATTR_TMPS (oraclet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12300_init (KERN_ATTR_TMPS (oraclet_tmp_t)) { /** * base @@ -224,7 +224,7 @@ KERNEL_FQ void m12300_init (KERN_ATTR_TMPS (oraclet_tmp_t)) } } -KERNEL_FQ void m12300_loop (KERN_ATTR_TMPS (oraclet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12300_loop (KERN_ATTR_TMPS (oraclet_tmp_t)) { const u64 gid = get_global_id (0); @@ -350,7 +350,7 @@ KERNEL_FQ void m12300_loop (KERN_ATTR_TMPS (oraclet_tmp_t)) } } -KERNEL_FQ void m12300_comp (KERN_ATTR_TMPS (oraclet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12300_comp (KERN_ATTR_TMPS (oraclet_tmp_t)) { /** * base diff --git a/OpenCL/m12400-pure.cl b/OpenCL/m12400-pure.cl index e515bc907..19bc2a8ca 100644 --- a/OpenCL/m12400-pure.cl +++ b/OpenCL/m12400-pure.cl @@ -497,7 +497,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, u32 rounds, PRIV iv[1] = l; } -KERNEL_FQ void m12400_init (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m12400_init (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) { /** * base @@ -633,7 +633,7 @@ KERNEL_FQ void m12400_init (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) tmps[gid].iv[1] = 0; } -KERNEL_FQ void m12400_loop (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m12400_loop (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) { /** * base @@ -730,7 +730,7 @@ KERNEL_FQ void m12400_loop (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) tmps[gid].iv[1] = iv[1]; } -KERNEL_FQ void m12400_comp (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m12400_comp (KERN_ATTR_TMPS (bsdicrypt_tmp_t)) { /** * base diff --git a/OpenCL/m12500-optimized.cl b/OpenCL/m12500-optimized.cl index 01abd8805..c0e42f123 100644 --- a/OpenCL/m12500-optimized.cl +++ b/OpenCL/m12500-optimized.cl @@ -31,7 +31,7 @@ typedef struct rar3_tmp } rar3_tmp_t; -KERNEL_FQ void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) { /** * base @@ -48,7 +48,7 @@ KERNEL_FQ void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) tmps[gid].dgst[0][4] = SHA1M_E; } -KERNEL_FQ void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) { const u64 gid = get_global_id (0); @@ -237,7 +237,7 @@ KERNEL_FQ void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) tmps[gid].dgst[init_pos + 1][4] = dgst[4]; } -KERNEL_FQ void m12500_comp (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_comp (KERN_ATTR_TMPS (rar3_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m12500-pure.cl b/OpenCL/m12500-pure.cl index f6101ab8c..9ae20dc50 100644 --- a/OpenCL/m12500-pure.cl +++ b/OpenCL/m12500-pure.cl @@ -728,7 +728,7 @@ DECLSPEC void sha1_update_rar29 (PRIVATE_AS sha1_ctx_t *ctx, PRIVATE_AS u32 *w, } } -KERNEL_FQ void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) { /** * base @@ -796,7 +796,7 @@ KERNEL_FQ void m12500_init (KERN_ATTR_TMPS (rar3_tmp_t)) tmps[gid].iv[3] = 0; } -KERNEL_FQ void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) { const u64 gid = get_global_id (0); @@ -911,7 +911,7 @@ KERNEL_FQ void m12500_loop (KERN_ATTR_TMPS (rar3_tmp_t)) } } -KERNEL_FQ void m12500_comp (KERN_ATTR_TMPS (rar3_tmp_t)) +KERNEL_FQ KERNEL_FA void m12500_comp (KERN_ATTR_TMPS (rar3_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m12600_a0-optimized.cl b/OpenCL/m12600_a0-optimized.cl index 323d8c0e6..ddc22b9b5 100644 --- a/OpenCL/m12600_a0-optimized.cl +++ b/OpenCL/m12600_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m12600_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -361,15 +361,15 @@ KERNEL_FQ void m12600_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m12600_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m12600_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m12600_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -716,10 +716,10 @@ KERNEL_FQ void m12600_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m12600_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m12600_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m12600_a0-pure.cl b/OpenCL/m12600_a0-pure.cl index f4ac84492..5f4d61093 100644 --- a/OpenCL/m12600_a0-pure.cl +++ b/OpenCL/m12600_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m12600_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -165,7 +165,7 @@ KERNEL_FQ void m12600_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m12600_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m12600_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m12600_a1-optimized.cl b/OpenCL/m12600_a1-optimized.cl index 3c5b709a8..5237e904f 100644 --- a/OpenCL/m12600_a1-optimized.cl +++ b/OpenCL/m12600_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_upper8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m12600_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -417,15 +417,15 @@ KERNEL_FQ void m12600_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m12600_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m12600_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m12600_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -830,10 +830,10 @@ KERNEL_FQ void m12600_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m12600_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m12600_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m12600_a1-pure.cl b/OpenCL/m12600_a1-pure.cl index 4f130e1bb..491eb077e 100644 --- a/OpenCL/m12600_a1-pure.cl +++ b/OpenCL/m12600_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m12600_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -161,7 +161,7 @@ KERNEL_FQ void m12600_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m12600_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m12600_a3-optimized.cl b/OpenCL/m12600_a3-optimized.cl index e73899b05..84ca582f7 100644 --- a/OpenCL/m12600_a3-optimized.cl +++ b/OpenCL/m12600_a3-optimized.cl @@ -618,7 +618,7 @@ DECLSPEC void m12600s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m12600_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -688,7 +688,7 @@ KERNEL_FQ void m12600_m04 (KERN_ATTR_BASIC ()) m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m12600_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -758,7 +758,7 @@ KERNEL_FQ void m12600_m08 (KERN_ATTR_BASIC ()) m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m12600_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_m16 (KERN_ATTR_BASIC ()) { /** * modifier @@ -828,7 +828,7 @@ KERNEL_FQ void m12600_m16 (KERN_ATTR_BASIC ()) m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m12600_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -898,7 +898,7 @@ KERNEL_FQ void m12600_s04 (KERN_ATTR_BASIC ()) m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m12600_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -968,7 +968,7 @@ KERNEL_FQ void m12600_s08 (KERN_ATTR_BASIC ()) m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m12600_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m12600_s16 (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m12600_a3-pure.cl b/OpenCL/m12600_a3-pure.cl index 9b4afb1cf..09b0f889f 100644 --- a/OpenCL/m12600_a3-pure.cl +++ b/OpenCL/m12600_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m12600_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m12600_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m12600_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m12600_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m12600_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m12700-pure.cl b/OpenCL/m12700-pure.cl index 497b44a75..39a1cc859 100644 --- a/OpenCL/m12700-pure.cl +++ b/OpenCL/m12700-pure.cl @@ -78,7 +78,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m12700_init (KERN_ATTR_TMPS (mywallet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12700_init (KERN_ATTR_TMPS (mywallet_tmp_t)) { /** * base @@ -167,7 +167,7 @@ KERNEL_FQ void m12700_init (KERN_ATTR_TMPS (mywallet_tmp_t)) } } -KERNEL_FQ void m12700_loop (KERN_ATTR_TMPS (mywallet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12700_loop (KERN_ATTR_TMPS (mywallet_tmp_t)) { const u64 gid = get_global_id (0); @@ -252,7 +252,7 @@ KERNEL_FQ void m12700_loop (KERN_ATTR_TMPS (mywallet_tmp_t)) } } -KERNEL_FQ void m12700_comp (KERN_ATTR_TMPS (mywallet_tmp_t)) +KERNEL_FQ KERNEL_FA void m12700_comp (KERN_ATTR_TMPS (mywallet_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m12800-pure.cl b/OpenCL/m12800-pure.cl index fb8848dcf..4001a8e43 100644 --- a/OpenCL/m12800-pure.cl +++ b/OpenCL/m12800-pure.cl @@ -76,7 +76,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m12800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base @@ -244,7 +244,7 @@ KERNEL_FQ void m12800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m12800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { const u64 gid = get_global_id (0); @@ -350,7 +350,7 @@ KERNEL_FQ void m12800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m12800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base diff --git a/OpenCL/m12900-pure.cl b/OpenCL/m12900-pure.cl index c3c9d4d32..98727c3f9 100644 --- a/OpenCL/m12900-pure.cl +++ b/OpenCL/m12900-pure.cl @@ -75,7 +75,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m12900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base @@ -176,7 +176,7 @@ KERNEL_FQ void m12900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m12900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { const u64 gid = get_global_id (0); @@ -282,7 +282,7 @@ KERNEL_FQ void m12900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m12900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) +KERNEL_FQ KERNEL_FA void m12900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_t)) { /** * base diff --git a/OpenCL/m13000-pure.cl b/OpenCL/m13000-pure.cl index c2ccb8f96..c83223689 100644 --- a/OpenCL/m13000-pure.cl +++ b/OpenCL/m13000-pure.cl @@ -69,7 +69,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13000_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m13000_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) { /** * base @@ -153,7 +153,7 @@ KERNEL_FQ void m13000_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) } } -KERNEL_FQ void m13000_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m13000_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) { const u64 gid = get_global_id (0); @@ -259,7 +259,7 @@ KERNEL_FQ void m13000_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) } } -KERNEL_FQ void m13000_comp (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m13000_comp (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) { /** * base diff --git a/OpenCL/m13100_a0-optimized.cl b/OpenCL/m13100_a0-optimized.cl index a2b653f47..5706ceae9 100644 --- a/OpenCL/m13100_a0-optimized.cl +++ b/OpenCL/m13100_a0-optimized.cl @@ -454,7 +454,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m13100_m04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { /** * modifier @@ -542,15 +542,15 @@ KERNEL_FQ void m13100_m04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_m08 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m08 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_m16 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m16 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_s04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { /** * modifier @@ -638,10 +638,10 @@ KERNEL_FQ void m13100_s04 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_s08 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s08 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_s16 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s16 (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { } diff --git a/OpenCL/m13100_a0-pure.cl b/OpenCL/m13100_a0-pure.cl index 8aaff8389..0eb6e08da 100644 --- a/OpenCL/m13100_a0-pure.cl +++ b/OpenCL/m13100_a0-pure.cl @@ -266,7 +266,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m13100_mxx (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_mxx (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { /** * modifier @@ -326,7 +326,7 @@ KERNEL_FQ void m13100_mxx (KERN_ATTR_RULES_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_sxx (KERN_ATTR_RULES_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_sxx (KERN_ATTR_RULES_ESALT (krb5tgs_t)) { /** * modifier diff --git a/OpenCL/m13100_a1-optimized.cl b/OpenCL/m13100_a1-optimized.cl index 26c8e8111..4f10747a6 100644 --- a/OpenCL/m13100_a1-optimized.cl +++ b/OpenCL/m13100_a1-optimized.cl @@ -452,7 +452,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * modifier @@ -589,15 +589,15 @@ KERNEL_FQ void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_m08 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m08 (KERN_ATTR_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_m16 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m16 (KERN_ATTR_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * modifier @@ -734,10 +734,10 @@ KERNEL_FQ void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_s08 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s08 (KERN_ATTR_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_s16 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s16 (KERN_ATTR_ESALT (krb5tgs_t)) { } diff --git a/OpenCL/m13100_a1-pure.cl b/OpenCL/m13100_a1-pure.cl index 1799a64ee..07cd7fcbc 100644 --- a/OpenCL/m13100_a1-pure.cl +++ b/OpenCL/m13100_a1-pure.cl @@ -264,7 +264,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m13100_mxx (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_mxx (KERN_ATTR_ESALT (krb5tgs_t)) { /** * modifier @@ -322,7 +322,7 @@ KERNEL_FQ void m13100_mxx (KERN_ATTR_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_sxx (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_sxx (KERN_ATTR_ESALT (krb5tgs_t)) { /** * modifier diff --git a/OpenCL/m13100_a3-optimized.cl b/OpenCL/m13100_a3-optimized.cl index 2d2a47efc..ac6de9f82 100644 --- a/OpenCL/m13100_a3-optimized.cl +++ b/OpenCL/m13100_a3-optimized.cl @@ -508,7 +508,7 @@ DECLSPEC void m13100 (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, P } } -KERNEL_FQ void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * base @@ -559,7 +559,7 @@ KERNEL_FQ void m13100_m04 (KERN_ATTR_ESALT (krb5tgs_t)) m13100 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13100_m08 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m08 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * base @@ -610,11 +610,11 @@ KERNEL_FQ void m13100_m08 (KERN_ATTR_ESALT (krb5tgs_t)) m13100 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13100_m16 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_m16 (KERN_ATTR_ESALT (krb5tgs_t)) { } -KERNEL_FQ void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * base @@ -665,7 +665,7 @@ KERNEL_FQ void m13100_s04 (KERN_ATTR_ESALT (krb5tgs_t)) m13100 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13100_s08 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s08 (KERN_ATTR_ESALT (krb5tgs_t)) { /** * base @@ -716,6 +716,6 @@ KERNEL_FQ void m13100_s08 (KERN_ATTR_ESALT (krb5tgs_t)) m13100 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13100_s16 (KERN_ATTR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_s16 (KERN_ATTR_ESALT (krb5tgs_t)) { } diff --git a/OpenCL/m13100_a3-pure.cl b/OpenCL/m13100_a3-pure.cl index 166997b52..960ddadfa 100644 --- a/OpenCL/m13100_a3-pure.cl +++ b/OpenCL/m13100_a3-pure.cl @@ -264,7 +264,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m13100_mxx (KERN_ATTR_VECTOR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_mxx (KERN_ATTR_VECTOR_ESALT (krb5tgs_t)) { /** * modifier @@ -335,7 +335,7 @@ KERNEL_FQ void m13100_mxx (KERN_ATTR_VECTOR_ESALT (krb5tgs_t)) } } -KERNEL_FQ void m13100_sxx (KERN_ATTR_VECTOR_ESALT (krb5tgs_t)) +KERNEL_FQ KERNEL_FA void m13100_sxx (KERN_ATTR_VECTOR_ESALT (krb5tgs_t)) { /** * modifier diff --git a/OpenCL/m13200-pure.cl b/OpenCL/m13200-pure.cl index 06a6856a7..30c697e9b 100644 --- a/OpenCL/m13200-pure.cl +++ b/OpenCL/m13200-pure.cl @@ -20,7 +20,7 @@ typedef struct axcrypt_tmp } axcrypt_tmp_t; -KERNEL_FQ void m13200_init (KERN_ATTR_TMPS (axcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m13200_init (KERN_ATTR_TMPS (axcrypt_tmp_t)) { /** * base @@ -74,7 +74,7 @@ KERNEL_FQ void m13200_init (KERN_ATTR_TMPS (axcrypt_tmp_t)) tmps[gid].cipher[3] = 0; } -KERNEL_FQ void m13200_loop (KERN_ATTR_TMPS (axcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m13200_loop (KERN_ATTR_TMPS (axcrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -211,7 +211,7 @@ KERNEL_FQ void m13200_loop (KERN_ATTR_TMPS (axcrypt_tmp_t)) tmps[gid].cipher[3] = cipher[3]; } -KERNEL_FQ void m13200_comp (KERN_ATTR_TMPS (axcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m13200_comp (KERN_ATTR_TMPS (axcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m13300_a0-optimized.cl b/OpenCL/m13300_a0-optimized.cl index 5110045c3..2d4622911 100644 --- a/OpenCL/m13300_a0-optimized.cl +++ b/OpenCL/m13300_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m13300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -195,15 +195,15 @@ KERNEL_FQ void m13300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -394,10 +394,10 @@ KERNEL_FQ void m13300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m13300_a0-pure.cl b/OpenCL/m13300_a0-pure.cl index 12ccda0b2..bc6da5ee9 100644 --- a/OpenCL/m13300_a0-pure.cl +++ b/OpenCL/m13300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m13300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -62,7 +62,7 @@ KERNEL_FQ void m13300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m13300_a1-optimized.cl b/OpenCL/m13300_a1-optimized.cl index 051eba2db..092d8402c 100644 --- a/OpenCL/m13300_a1-optimized.cl +++ b/OpenCL/m13300_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m13300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -251,15 +251,15 @@ KERNEL_FQ void m13300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -508,10 +508,10 @@ KERNEL_FQ void m13300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m13300_a1-pure.cl b/OpenCL/m13300_a1-pure.cl index b87420eca..48f853213 100644 --- a/OpenCL/m13300_a1-pure.cl +++ b/OpenCL/m13300_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m13300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -58,7 +58,7 @@ KERNEL_FQ void m13300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m13300_a3-optimized.cl b/OpenCL/m13300_a3-optimized.cl index dfeff4acd..1622f8c9a 100644 --- a/OpenCL/m13300_a3-optimized.cl +++ b/OpenCL/m13300_a3-optimized.cl @@ -522,7 +522,7 @@ DECLSPEC void m13300s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m13300_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -562,7 +562,7 @@ KERNEL_FQ void m13300_m04 (KERN_ATTR_VECTOR ()) m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13300_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -602,7 +602,7 @@ KERNEL_FQ void m13300_m08 (KERN_ATTR_VECTOR ()) m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13300_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -642,7 +642,7 @@ KERNEL_FQ void m13300_m16 (KERN_ATTR_VECTOR ()) m13300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13300_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -682,7 +682,7 @@ KERNEL_FQ void m13300_s04 (KERN_ATTR_VECTOR ()) m13300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13300_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -722,7 +722,7 @@ KERNEL_FQ void m13300_s08 (KERN_ATTR_VECTOR ()) m13300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13300_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m13300_a3-pure.cl b/OpenCL/m13300_a3-pure.cl index 10f82fda6..93bace4da 100644 --- a/OpenCL/m13300_a3-pure.cl +++ b/OpenCL/m13300_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m13300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m13300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m13300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m13400-pure.cl b/OpenCL/m13400-pure.cl index 49d52dc21..2d4fc3f02 100644 --- a/OpenCL/m13400-pure.cl +++ b/OpenCL/m13400-pure.cl @@ -45,7 +45,7 @@ typedef struct keepass } keepass_t; -KERNEL_FQ void m13400_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m13400_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { /** * base @@ -164,7 +164,7 @@ KERNEL_FQ void m13400_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) tmps[gid].tmp_digest[7] = digest[7]; } -KERNEL_FQ void m13400_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m13400_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -252,7 +252,7 @@ KERNEL_FQ void m13400_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) tmps[gid].tmp_digest[7] = data1[3]; } -KERNEL_FQ void m13400_comp (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m13400_comp (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13500_a0-optimized.cl b/OpenCL/m13500_a0-optimized.cl index f01a248a7..0b0afedb5 100644 --- a/OpenCL/m13500_a0-optimized.cl +++ b/OpenCL/m13500_a0-optimized.cl @@ -27,7 +27,7 @@ typedef struct pstoken } pstoken_t; -KERNEL_FQ void m13500_m04 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m04 (KERN_ATTR_RULES_ESALT (pstoken_t)) { /** * modifier @@ -444,15 +444,15 @@ KERNEL_FQ void m13500_m04 (KERN_ATTR_RULES_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_m08 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m08 (KERN_ATTR_RULES_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_m16 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m16 (KERN_ATTR_RULES_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_s04 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s04 (KERN_ATTR_RULES_ESALT (pstoken_t)) { /** * modifier @@ -881,10 +881,10 @@ KERNEL_FQ void m13500_s04 (KERN_ATTR_RULES_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_s08 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s08 (KERN_ATTR_RULES_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_s16 (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s16 (KERN_ATTR_RULES_ESALT (pstoken_t)) { } diff --git a/OpenCL/m13500_a0-pure.cl b/OpenCL/m13500_a0-pure.cl index 8ade5504f..4312d3d6a 100644 --- a/OpenCL/m13500_a0-pure.cl +++ b/OpenCL/m13500_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pstoken } pstoken_t; -KERNEL_FQ void m13500_mxx (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_mxx (KERN_ATTR_RULES_ESALT (pstoken_t)) { /** * modifier @@ -101,7 +101,7 @@ KERNEL_FQ void m13500_mxx (KERN_ATTR_RULES_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_sxx (KERN_ATTR_RULES_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_sxx (KERN_ATTR_RULES_ESALT (pstoken_t)) { /** * modifier diff --git a/OpenCL/m13500_a1-optimized.cl b/OpenCL/m13500_a1-optimized.cl index 5fd2ed370..823dcc34d 100644 --- a/OpenCL/m13500_a1-optimized.cl +++ b/OpenCL/m13500_a1-optimized.cl @@ -25,7 +25,7 @@ typedef struct pstoken } pstoken_t; -KERNEL_FQ void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) { /** * modifier @@ -494,15 +494,15 @@ KERNEL_FQ void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_m08 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m08 (KERN_ATTR_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_m16 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m16 (KERN_ATTR_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) { /** * modifier @@ -983,10 +983,10 @@ KERNEL_FQ void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_s08 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s08 (KERN_ATTR_ESALT (pstoken_t)) { } -KERNEL_FQ void m13500_s16 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s16 (KERN_ATTR_ESALT (pstoken_t)) { } diff --git a/OpenCL/m13500_a1-pure.cl b/OpenCL/m13500_a1-pure.cl index 9e8438e15..3851b6fab 100644 --- a/OpenCL/m13500_a1-pure.cl +++ b/OpenCL/m13500_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pstoken } pstoken_t; -KERNEL_FQ void m13500_mxx (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_mxx (KERN_ATTR_ESALT (pstoken_t)) { /** * modifier @@ -95,7 +95,7 @@ KERNEL_FQ void m13500_mxx (KERN_ATTR_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_sxx (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_sxx (KERN_ATTR_ESALT (pstoken_t)) { /** * modifier diff --git a/OpenCL/m13500_a3-optimized.cl b/OpenCL/m13500_a3-optimized.cl index eb334cdac..7a942b224 100644 --- a/OpenCL/m13500_a3-optimized.cl +++ b/OpenCL/m13500_a3-optimized.cl @@ -817,7 +817,7 @@ DECLSPEC void m13500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) { /** * base @@ -866,7 +866,7 @@ KERNEL_FQ void m13500_m04 (KERN_ATTR_ESALT (pstoken_t)) m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13500_m08 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m08 (KERN_ATTR_ESALT (pstoken_t)) { /** * base @@ -915,7 +915,7 @@ KERNEL_FQ void m13500_m08 (KERN_ATTR_ESALT (pstoken_t)) m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13500_m16 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_m16 (KERN_ATTR_ESALT (pstoken_t)) { /** * base @@ -964,7 +964,7 @@ KERNEL_FQ void m13500_m16 (KERN_ATTR_ESALT (pstoken_t)) m13500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) { /** * base @@ -1013,7 +1013,7 @@ KERNEL_FQ void m13500_s04 (KERN_ATTR_ESALT (pstoken_t)) m13500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13500_s08 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s08 (KERN_ATTR_ESALT (pstoken_t)) { /** * base @@ -1062,7 +1062,7 @@ KERNEL_FQ void m13500_s08 (KERN_ATTR_ESALT (pstoken_t)) m13500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13500_s16 (KERN_ATTR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_s16 (KERN_ATTR_ESALT (pstoken_t)) { /** * base diff --git a/OpenCL/m13500_a3-pure.cl b/OpenCL/m13500_a3-pure.cl index 2dee0a358..f66e71239 100644 --- a/OpenCL/m13500_a3-pure.cl +++ b/OpenCL/m13500_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pstoken } pstoken_t; -KERNEL_FQ void m13500_mxx (KERN_ATTR_VECTOR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_mxx (KERN_ATTR_VECTOR_ESALT (pstoken_t)) { /** * modifier @@ -112,7 +112,7 @@ KERNEL_FQ void m13500_mxx (KERN_ATTR_VECTOR_ESALT (pstoken_t)) } } -KERNEL_FQ void m13500_sxx (KERN_ATTR_VECTOR_ESALT (pstoken_t)) +KERNEL_FQ KERNEL_FA void m13500_sxx (KERN_ATTR_VECTOR_ESALT (pstoken_t)) { /** * modifier diff --git a/OpenCL/m13600-pure.cl b/OpenCL/m13600-pure.cl index 5a114304e..a5577bbaa 100644 --- a/OpenCL/m13600-pure.cl +++ b/OpenCL/m13600-pure.cl @@ -79,7 +79,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) +KERNEL_FQ KERNEL_FA void m13600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) { /** * base @@ -188,7 +188,7 @@ KERNEL_FQ void m13600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) } } -KERNEL_FQ void m13600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) +KERNEL_FQ KERNEL_FA void m13600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) { const u64 gid = get_global_id (0); @@ -302,7 +302,7 @@ KERNEL_FQ void m13600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) } } -KERNEL_FQ void m13600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) +KERNEL_FQ KERNEL_FA void m13600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, zip2_t)) { /** * base diff --git a/OpenCL/m13711-pure.cl b/OpenCL/m13711-pure.cl index 36ae740a7..b7f67269f 100644 --- a/OpenCL/m13711-pure.cl +++ b/OpenCL/m13711-pure.cl @@ -124,7 +124,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13711_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13711_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -254,7 +254,7 @@ KERNEL_FQ void m13711_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13711_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13711_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -385,7 +385,7 @@ KERNEL_FQ void m13711_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13711_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13711_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -457,7 +457,7 @@ KERNEL_FQ void m13711_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13711_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13711_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13712-pure.cl b/OpenCL/m13712-pure.cl index 11acc1753..5f3e6f910 100644 --- a/OpenCL/m13712-pure.cl +++ b/OpenCL/m13712-pure.cl @@ -175,7 +175,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13712_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13712_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -305,7 +305,7 @@ KERNEL_FQ void m13712_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13712_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13712_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -436,7 +436,7 @@ KERNEL_FQ void m13712_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13712_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13712_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -513,7 +513,7 @@ KERNEL_FQ void m13712_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13712_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13712_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13713-pure.cl b/OpenCL/m13713-pure.cl index e03a1e86a..7c4296269 100644 --- a/OpenCL/m13713-pure.cl +++ b/OpenCL/m13713-pure.cl @@ -240,7 +240,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13713_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13713_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -370,7 +370,7 @@ KERNEL_FQ void m13713_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13713_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13713_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -501,7 +501,7 @@ KERNEL_FQ void m13713_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13713_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13713_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -583,7 +583,7 @@ KERNEL_FQ void m13713_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13713_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13713_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13721-pure.cl b/OpenCL/m13721-pure.cl index 978497b58..2e7c2dd48 100644 --- a/OpenCL/m13721-pure.cl +++ b/OpenCL/m13721-pure.cl @@ -146,7 +146,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m13721_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13721_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -308,7 +308,7 @@ KERNEL_FQ void m13721_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13721_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13721_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -483,7 +483,7 @@ KERNEL_FQ void m13721_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13721_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13721_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -555,7 +555,7 @@ KERNEL_FQ void m13721_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13721_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13721_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13722-pure.cl b/OpenCL/m13722-pure.cl index 12590f2fb..d8c0eacc8 100644 --- a/OpenCL/m13722-pure.cl +++ b/OpenCL/m13722-pure.cl @@ -197,7 +197,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m13722_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13722_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -359,7 +359,7 @@ KERNEL_FQ void m13722_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13722_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13722_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -534,7 +534,7 @@ KERNEL_FQ void m13722_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13722_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13722_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -611,7 +611,7 @@ KERNEL_FQ void m13722_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13722_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13722_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13723-pure.cl b/OpenCL/m13723-pure.cl index 8d67e7c7a..42e3cf63e 100644 --- a/OpenCL/m13723-pure.cl +++ b/OpenCL/m13723-pure.cl @@ -262,7 +262,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m13723_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13723_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -424,7 +424,7 @@ KERNEL_FQ void m13723_init (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13723_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13723_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -599,7 +599,7 @@ KERNEL_FQ void m13723_loop (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13723_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13723_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -681,7 +681,7 @@ KERNEL_FQ void m13723_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) } } -KERNEL_FQ void m13723_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13723_comp (KERN_ATTR_TMPS_ESALT (vc64_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13731-pure.cl b/OpenCL/m13731-pure.cl index bf6109688..ebd10aecc 100644 --- a/OpenCL/m13731-pure.cl +++ b/OpenCL/m13731-pure.cl @@ -184,7 +184,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m13731_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13731_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -400,7 +400,7 @@ KERNEL_FQ void m13731_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13731_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13731_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -663,7 +663,7 @@ KERNEL_FQ void m13731_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13731_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13731_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -735,7 +735,7 @@ KERNEL_FQ void m13731_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13731_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13731_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13732-pure.cl b/OpenCL/m13732-pure.cl index 5cebed18e..2b981463f 100644 --- a/OpenCL/m13732-pure.cl +++ b/OpenCL/m13732-pure.cl @@ -235,7 +235,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m13732_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13732_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -451,7 +451,7 @@ KERNEL_FQ void m13732_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13732_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13732_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -714,7 +714,7 @@ KERNEL_FQ void m13732_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13732_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13732_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -791,7 +791,7 @@ KERNEL_FQ void m13732_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13732_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13732_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13733-pure.cl b/OpenCL/m13733-pure.cl index a16ee5740..afc129827 100644 --- a/OpenCL/m13733-pure.cl +++ b/OpenCL/m13733-pure.cl @@ -300,7 +300,7 @@ DECLSPEC void hmac_whirlpool_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR whirlpool_transform_vector (w0, w1, w2, w3, digest, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); } -KERNEL_FQ void m13733_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13733_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -516,7 +516,7 @@ KERNEL_FQ void m13733_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13733_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13733_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -779,7 +779,7 @@ KERNEL_FQ void m13733_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13733_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13733_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -861,7 +861,7 @@ KERNEL_FQ void m13733_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13733_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13733_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13751-pure.cl b/OpenCL/m13751-pure.cl index cd7a2dbd8..b504c4c42 100644 --- a/OpenCL/m13751-pure.cl +++ b/OpenCL/m13751-pure.cl @@ -130,7 +130,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13751_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13751_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -276,7 +276,7 @@ KERNEL_FQ void m13751_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13751_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13751_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -460,7 +460,7 @@ KERNEL_FQ void m13751_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13751_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13751_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -532,7 +532,7 @@ KERNEL_FQ void m13751_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13751_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13751_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13752-pure.cl b/OpenCL/m13752-pure.cl index a7a977e31..f823064cd 100644 --- a/OpenCL/m13752-pure.cl +++ b/OpenCL/m13752-pure.cl @@ -181,7 +181,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13752_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13752_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -327,7 +327,7 @@ KERNEL_FQ void m13752_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13752_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13752_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -482,7 +482,7 @@ KERNEL_FQ void m13752_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13752_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13752_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -559,7 +559,7 @@ KERNEL_FQ void m13752_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13752_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13752_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13753-pure.cl b/OpenCL/m13753-pure.cl index 7df35f839..485983b26 100644 --- a/OpenCL/m13753-pure.cl +++ b/OpenCL/m13753-pure.cl @@ -246,7 +246,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m13753_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13753_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -392,7 +392,7 @@ KERNEL_FQ void m13753_init (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13753_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13753_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); @@ -547,7 +547,7 @@ KERNEL_FQ void m13753_loop (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13753_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13753_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -629,7 +629,7 @@ KERNEL_FQ void m13753_loop_extended (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) } } -KERNEL_FQ void m13753_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13753_comp (KERN_ATTR_TMPS_ESALT (vc_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13771-pure.cl b/OpenCL/m13771-pure.cl index e212dfacb..21d9a1824 100644 --- a/OpenCL/m13771-pure.cl +++ b/OpenCL/m13771-pure.cl @@ -176,7 +176,7 @@ DECLSPEC void hmac_streebog512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, streebog512_g_vector (digest, nullbuf, message, s_sbob_sl64); } -KERNEL_FQ void m13771_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13771_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -356,7 +356,7 @@ KERNEL_FQ void m13771_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) } } -KERNEL_FQ void m13771_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13771_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -562,7 +562,7 @@ KERNEL_FQ void m13771_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) } } -KERNEL_FQ void m13771_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13771_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -634,7 +634,7 @@ KERNEL_FQ void m13771_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t } } -KERNEL_FQ void m13771_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13771_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13772-pure.cl b/OpenCL/m13772-pure.cl index c4b870208..f6b7d9402 100644 --- a/OpenCL/m13772-pure.cl +++ b/OpenCL/m13772-pure.cl @@ -227,7 +227,7 @@ DECLSPEC void hmac_streebog512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, streebog512_g_vector (digest, nullbuf, message, s_sbob_sl64); } -KERNEL_FQ void m13772_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13772_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -451,7 +451,7 @@ KERNEL_FQ void m13772_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } -KERNEL_FQ void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -657,7 +657,7 @@ KERNEL_FQ void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) } } -KERNEL_FQ void m13772_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13772_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -734,7 +734,7 @@ KERNEL_FQ void m13772_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t } } -KERNEL_FQ void m13772_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13772_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13773-pure.cl b/OpenCL/m13773-pure.cl index 55f14890c..5b9411215 100644 --- a/OpenCL/m13773-pure.cl +++ b/OpenCL/m13773-pure.cl @@ -292,7 +292,7 @@ DECLSPEC void hmac_streebog512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, streebog512_g_vector (digest, nullbuf, message, s_sbob_sl64); } -KERNEL_FQ void m13773_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13773_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -560,7 +560,7 @@ KERNEL_FQ void m13773_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } -KERNEL_FQ void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -766,7 +766,7 @@ KERNEL_FQ void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) } } -KERNEL_FQ void m13773_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13773_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -848,7 +848,7 @@ KERNEL_FQ void m13773_loop_extended (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t } } -KERNEL_FQ void m13773_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) +KERNEL_FQ KERNEL_FA void m13773_comp (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m13800_a0-optimized.cl b/OpenCL/m13800_a0-optimized.cl index 4da2d1c98..2562fac9b 100644 --- a/OpenCL/m13800_a0-optimized.cl +++ b/OpenCL/m13800_a0-optimized.cl @@ -410,7 +410,7 @@ DECLSPEC void memcat64c_be (PRIVATE_AS u32x *block, const u32 offset, PRIVATE_AS } } -KERNEL_FQ void m13800_m04 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m04 (KERN_ATTR_RULES_ESALT (win8phone_t)) { /** * modifier @@ -598,15 +598,15 @@ KERNEL_FQ void m13800_m04 (KERN_ATTR_RULES_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_m08 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m08 (KERN_ATTR_RULES_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_m16 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m16 (KERN_ATTR_RULES_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_s04 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s04 (KERN_ATTR_RULES_ESALT (win8phone_t)) { /** * modifier @@ -806,10 +806,10 @@ KERNEL_FQ void m13800_s04 (KERN_ATTR_RULES_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_s08 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s08 (KERN_ATTR_RULES_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_s16 (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s16 (KERN_ATTR_RULES_ESALT (win8phone_t)) { } diff --git a/OpenCL/m13800_a0-pure.cl b/OpenCL/m13800_a0-pure.cl index c7a1d0299..ba45d033e 100644 --- a/OpenCL/m13800_a0-pure.cl +++ b/OpenCL/m13800_a0-pure.cl @@ -22,7 +22,7 @@ typedef struct win8phone } win8phone_t; -KERNEL_FQ void m13800_mxx (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_mxx (KERN_ATTR_RULES_ESALT (win8phone_t)) { /** * modifier @@ -68,7 +68,7 @@ KERNEL_FQ void m13800_mxx (KERN_ATTR_RULES_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_sxx (KERN_ATTR_RULES_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_sxx (KERN_ATTR_RULES_ESALT (win8phone_t)) { /** * modifier diff --git a/OpenCL/m13800_a1-optimized.cl b/OpenCL/m13800_a1-optimized.cl index 033f3a98e..2ea23421b 100644 --- a/OpenCL/m13800_a1-optimized.cl +++ b/OpenCL/m13800_a1-optimized.cl @@ -408,7 +408,7 @@ DECLSPEC void memcat64c_be (PRIVATE_AS u32x *block, const u32 offset, PRIVATE_AS } } -KERNEL_FQ void m13800_m04 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m04 (KERN_ATTR_ESALT (win8phone_t)) { /** * modifier @@ -652,15 +652,15 @@ KERNEL_FQ void m13800_m04 (KERN_ATTR_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_m08 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m08 (KERN_ATTR_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_m16 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m16 (KERN_ATTR_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_s04 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s04 (KERN_ATTR_ESALT (win8phone_t)) { /** * modifier @@ -916,10 +916,10 @@ KERNEL_FQ void m13800_s04 (KERN_ATTR_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_s08 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s08 (KERN_ATTR_ESALT (win8phone_t)) { } -KERNEL_FQ void m13800_s16 (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s16 (KERN_ATTR_ESALT (win8phone_t)) { } diff --git a/OpenCL/m13800_a1-pure.cl b/OpenCL/m13800_a1-pure.cl index 5e507e7f4..036086f8a 100644 --- a/OpenCL/m13800_a1-pure.cl +++ b/OpenCL/m13800_a1-pure.cl @@ -20,7 +20,7 @@ typedef struct win8phone } win8phone_t; -KERNEL_FQ void m13800_mxx (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_mxx (KERN_ATTR_ESALT (win8phone_t)) { /** * modifier @@ -64,7 +64,7 @@ KERNEL_FQ void m13800_mxx (KERN_ATTR_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_sxx (KERN_ATTR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_sxx (KERN_ATTR_ESALT (win8phone_t)) { /** * modifier diff --git a/OpenCL/m13800_a3-optimized.cl b/OpenCL/m13800_a3-optimized.cl index 8352ffb4f..d79a9e8f7 100644 --- a/OpenCL/m13800_a3-optimized.cl +++ b/OpenCL/m13800_a3-optimized.cl @@ -709,7 +709,7 @@ DECLSPEC void m13800s (LOCAL_AS u32 *s_esalt, PRIVATE_AS u32 *w, const u32 pw_le } } -KERNEL_FQ void m13800_m04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -766,7 +766,7 @@ KERNEL_FQ void m13800_m04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13800_m08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -823,7 +823,7 @@ KERNEL_FQ void m13800_m08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13800_m16 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_m16 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -880,7 +880,7 @@ KERNEL_FQ void m13800_m16 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) m13800m (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13800_s04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -937,7 +937,7 @@ KERNEL_FQ void m13800_s04 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) m13800s (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13800_s08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -994,7 +994,7 @@ KERNEL_FQ void m13800_s08 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) m13800s (s_esalt, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m13800_s16 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_s16 (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier diff --git a/OpenCL/m13800_a3-pure.cl b/OpenCL/m13800_a3-pure.cl index 47ad0f431..6e433819c 100644 --- a/OpenCL/m13800_a3-pure.cl +++ b/OpenCL/m13800_a3-pure.cl @@ -20,7 +20,7 @@ typedef struct win8phone } win8phone_t; -KERNEL_FQ void m13800_mxx (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_mxx (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m13800_mxx (KERN_ATTR_VECTOR_ESALT (win8phone_t)) } } -KERNEL_FQ void m13800_sxx (KERN_ATTR_VECTOR_ESALT (win8phone_t)) +KERNEL_FQ KERNEL_FA void m13800_sxx (KERN_ATTR_VECTOR_ESALT (win8phone_t)) { /** * modifier diff --git a/OpenCL/m13900_a0-optimized.cl b/OpenCL/m13900_a0-optimized.cl index b24b610e5..7f7a5b891 100644 --- a/OpenCL/m13900_a0-optimized.cl +++ b/OpenCL/m13900_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m13900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -247,15 +247,15 @@ KERNEL_FQ void m13900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -486,10 +486,10 @@ KERNEL_FQ void m13900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m13900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m13900_a0-pure.cl b/OpenCL/m13900_a0-pure.cl index df2afe2e9..a62859e7c 100644 --- a/OpenCL/m13900_a0-pure.cl +++ b/OpenCL/m13900_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m13900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -179,7 +179,7 @@ KERNEL_FQ void m13900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m13900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m13900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m13900_a1-optimized.cl b/OpenCL/m13900_a1-optimized.cl index 22e59655a..6dbac3ab0 100644 --- a/OpenCL/m13900_a1-optimized.cl +++ b/OpenCL/m13900_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m13900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -303,15 +303,15 @@ KERNEL_FQ void m13900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -600,10 +600,10 @@ KERNEL_FQ void m13900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m13900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m13900_a1-pure.cl b/OpenCL/m13900_a1-pure.cl index 2da14f898..bb7f5fa34 100644 --- a/OpenCL/m13900_a1-pure.cl +++ b/OpenCL/m13900_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m13900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -175,7 +175,7 @@ KERNEL_FQ void m13900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m13900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m13900_a3-optimized.cl b/OpenCL/m13900_a3-optimized.cl index e0292604e..50bfc8ebf 100644 --- a/OpenCL/m13900_a3-optimized.cl +++ b/OpenCL/m13900_a3-optimized.cl @@ -409,7 +409,7 @@ DECLSPEC void m13900s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m13900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -479,7 +479,7 @@ KERNEL_FQ void m13900_m04 (KERN_ATTR_BASIC ()) m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m13900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -549,7 +549,7 @@ KERNEL_FQ void m13900_m08 (KERN_ATTR_BASIC ()) m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m13900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_m16 (KERN_ATTR_BASIC ()) { /** * modifier @@ -619,7 +619,7 @@ KERNEL_FQ void m13900_m16 (KERN_ATTR_BASIC ()) m13900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m13900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -689,7 +689,7 @@ KERNEL_FQ void m13900_s04 (KERN_ATTR_BASIC ()) m13900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m13900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s08 (KERN_ATTR_BASIC ()) { /** * modifier @@ -759,7 +759,7 @@ KERNEL_FQ void m13900_s08 (KERN_ATTR_BASIC ()) m13900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m13900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m13900_s16 (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m13900_a3-pure.cl b/OpenCL/m13900_a3-pure.cl index 42a93b689..e200881a9 100644 --- a/OpenCL/m13900_a3-pure.cl +++ b/OpenCL/m13900_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m13900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -192,7 +192,7 @@ KERNEL_FQ void m13900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m13900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m13900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m14000_a0-pure.cl b/OpenCL/m14000_a0-pure.cl index 6f53c5fc0..61c443477 100644 --- a/OpenCL/m14000_a0-pure.cl +++ b/OpenCL/m14000_a0-pure.cl @@ -497,7 +497,7 @@ DECLSPEC void _des_crypt_keysetup (u32 c, u32 d, PRIVATE_AS u32 *Kc, PRIVATE_AS } } -KERNEL_FQ void m14000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14000_mxx (KERN_ATTR_RULES ()) { /** * base @@ -602,7 +602,7 @@ KERNEL_FQ void m14000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14000_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m14000_a1-pure.cl b/OpenCL/m14000_a1-pure.cl index 2615a66d4..5ef0b3ef7 100644 --- a/OpenCL/m14000_a1-pure.cl +++ b/OpenCL/m14000_a1-pure.cl @@ -487,7 +487,7 @@ DECLSPEC void _des_crypt_keysetup (u32 c, u32 d, PRIVATE_AS u32 *Kc, PRIVATE_AS } } -KERNEL_FQ void m14000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14000_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -635,7 +635,7 @@ KERNEL_FQ void m14000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14000_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m14000_a3-pure.cl b/OpenCL/m14000_a3-pure.cl index 6b020b286..28931f4dd 100644 --- a/OpenCL/m14000_a3-pure.cl +++ b/OpenCL/m14000_a3-pure.cl @@ -1730,7 +1730,7 @@ DECLSPEC void transpose32c (PRIVATE_AS u32 *data) // transpose bitslice mod : attention race conditions, need different buffers for *in and *out // -KERNEL_FQ void m14000_tm (KERN_ATTR_TM) +KERNEL_FQ KERNEL_FA void m14000_tm (KERN_ATTR_TM) { const u64 gid = get_global_id (0); @@ -1756,7 +1756,7 @@ KERNEL_FQ void m14000_tm (KERN_ATTR_TM) } } -KERNEL_FQ void m14000_mxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m14000_mxx (KERN_ATTR_BITSLICE ()) { /** * base @@ -2200,7 +2200,7 @@ KERNEL_FQ void m14000_mxx (KERN_ATTR_BITSLICE ()) } } -KERNEL_FQ void m14000_sxx (KERN_ATTR_BITSLICE ()) +KERNEL_FQ KERNEL_FA void m14000_sxx (KERN_ATTR_BITSLICE ()) { /** * base diff --git a/OpenCL/m14100_a0-pure.cl b/OpenCL/m14100_a0-pure.cl index 5466ce60d..61a533806 100644 --- a/OpenCL/m14100_a0-pure.cl +++ b/OpenCL/m14100_a0-pure.cl @@ -541,7 +541,7 @@ DECLSPEC void _des_crypt_keysetup (u32 c, u32 d, PRIVATE_AS u32 *Kc, PRIVATE_AS } } -KERNEL_FQ void m14100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14100_mxx (KERN_ATTR_RULES ()) { /** * base @@ -676,7 +676,7 @@ KERNEL_FQ void m14100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14100_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m14100_a1-pure.cl b/OpenCL/m14100_a1-pure.cl index cd35004a4..6656793ae 100644 --- a/OpenCL/m14100_a1-pure.cl +++ b/OpenCL/m14100_a1-pure.cl @@ -531,7 +531,7 @@ DECLSPEC void _des_crypt_keysetup (u32 c, u32 d, PRIVATE_AS u32 *Kc, PRIVATE_AS } } -KERNEL_FQ void m14100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14100_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -714,7 +714,7 @@ KERNEL_FQ void m14100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14100_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m14100_a3-pure.cl b/OpenCL/m14100_a3-pure.cl index 2686f2599..2ba0a471a 100644 --- a/OpenCL/m14100_a3-pure.cl +++ b/OpenCL/m14100_a3-pure.cl @@ -730,7 +730,7 @@ DECLSPEC void m14100s (LOCAL_AS u32 (*s_SPtrans)[64], LOCAL_AS u32 (*s_skb)[64], } } -KERNEL_FQ void m14100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14100_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -804,7 +804,7 @@ KERNEL_FQ void m14100_mxx (KERN_ATTR_BASIC ()) m14100m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m14100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14100_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m14400_a0-optimized.cl b/OpenCL/m14400_a0-optimized.cl index c7a9cd640..db149eda5 100644 --- a/OpenCL/m14400_a0-optimized.cl +++ b/OpenCL/m14400_a0-optimized.cl @@ -118,7 +118,7 @@ DECLSPEC void shift_2 (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w w0[0] = 0 | w0[0] << 16; } -KERNEL_FQ void m14400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -381,15 +381,15 @@ KERNEL_FQ void m14400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -664,10 +664,10 @@ KERNEL_FQ void m14400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m14400_a0-pure.cl b/OpenCL/m14400_a0-pure.cl index 9e4814289..71bea1413 100644 --- a/OpenCL/m14400_a0-pure.cl +++ b/OpenCL/m14400_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m14400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -275,7 +275,7 @@ KERNEL_FQ void m14400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m14400_a1-optimized.cl b/OpenCL/m14400_a1-optimized.cl index b2d7bf2f9..68fbac6ea 100644 --- a/OpenCL/m14400_a1-optimized.cl +++ b/OpenCL/m14400_a1-optimized.cl @@ -118,7 +118,7 @@ DECLSPEC void shift_2 (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w w0[0] = 0 | w0[0] << 16; } -KERNEL_FQ void m14400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -445,15 +445,15 @@ KERNEL_FQ void m14400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -792,10 +792,10 @@ KERNEL_FQ void m14400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m14400_a1-pure.cl b/OpenCL/m14400_a1-pure.cl index 4410dbf46..f66976563 100644 --- a/OpenCL/m14400_a1-pure.cl +++ b/OpenCL/m14400_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m14400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -271,7 +271,7 @@ KERNEL_FQ void m14400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m14400_a3-optimized.cl b/OpenCL/m14400_a3-optimized.cl index 4598a7632..9e4903c1b 100644 --- a/OpenCL/m14400_a3-optimized.cl +++ b/OpenCL/m14400_a3-optimized.cl @@ -622,7 +622,7 @@ DECLSPEC void m14400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m14400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -692,7 +692,7 @@ KERNEL_FQ void m14400_m04 (KERN_ATTR_BASIC ()) m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m14400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -762,7 +762,7 @@ KERNEL_FQ void m14400_m08 (KERN_ATTR_BASIC ()) m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m14400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -832,7 +832,7 @@ KERNEL_FQ void m14400_m16 (KERN_ATTR_BASIC ()) m14400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m14400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -902,7 +902,7 @@ KERNEL_FQ void m14400_s04 (KERN_ATTR_BASIC ()) m14400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m14400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -972,7 +972,7 @@ KERNEL_FQ void m14400_s08 (KERN_ATTR_BASIC ()) m14400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m14400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14400_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m14400_a3-pure.cl b/OpenCL/m14400_a3-pure.cl index 853044e05..05e33c017 100644 --- a/OpenCL/m14400_a3-pure.cl +++ b/OpenCL/m14400_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m14400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m14400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -296,7 +296,7 @@ KERNEL_FQ void m14400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m14400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m14400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m14511_a0-pure.cl b/OpenCL/m14511_a0-pure.cl index 201ea1de8..9a93ea18f 100644 --- a/OpenCL/m14511_a0-pure.cl +++ b/OpenCL/m14511_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14511_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -200,7 +200,7 @@ KERNEL_FQ void m14511_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14511_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14511_a1-pure.cl b/OpenCL/m14511_a1-pure.cl index 869d38946..03afc331e 100644 --- a/OpenCL/m14511_a1-pure.cl +++ b/OpenCL/m14511_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14511_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -210,7 +210,7 @@ KERNEL_FQ void m14511_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14511_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14511_a3-pure.cl b/OpenCL/m14511_a3-pure.cl index 507bf490c..a3527efc8 100644 --- a/OpenCL/m14511_a3-pure.cl +++ b/OpenCL/m14511_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14511_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -203,7 +203,7 @@ KERNEL_FQ void m14511_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14511_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14511_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14512_a0-pure.cl b/OpenCL/m14512_a0-pure.cl index 2120c87c2..0c4d80651 100644 --- a/OpenCL/m14512_a0-pure.cl +++ b/OpenCL/m14512_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14512_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -164,7 +164,7 @@ KERNEL_FQ void m14512_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14512_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14512_a1-pure.cl b/OpenCL/m14512_a1-pure.cl index 597231930..73cf1ee56 100644 --- a/OpenCL/m14512_a1-pure.cl +++ b/OpenCL/m14512_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14512_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m14512_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14512_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14512_a3-pure.cl b/OpenCL/m14512_a3-pure.cl index ace236029..611689dfd 100644 --- a/OpenCL/m14512_a3-pure.cl +++ b/OpenCL/m14512_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14512_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -167,7 +167,7 @@ KERNEL_FQ void m14512_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14512_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14512_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14513_a0-pure.cl b/OpenCL/m14513_a0-pure.cl index 281921530..4a476d997 100644 --- a/OpenCL/m14513_a0-pure.cl +++ b/OpenCL/m14513_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14513_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -165,7 +165,7 @@ KERNEL_FQ void m14513_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14513_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14513_a1-pure.cl b/OpenCL/m14513_a1-pure.cl index 71f9f9ade..d96d6c55f 100644 --- a/OpenCL/m14513_a1-pure.cl +++ b/OpenCL/m14513_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14513_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -175,7 +175,7 @@ KERNEL_FQ void m14513_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14513_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14513_a3-pure.cl b/OpenCL/m14513_a3-pure.cl index bace1952c..43fbfbd51 100644 --- a/OpenCL/m14513_a3-pure.cl +++ b/OpenCL/m14513_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14513_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -168,7 +168,7 @@ KERNEL_FQ void m14513_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14513_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14513_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14521_a0-pure.cl b/OpenCL/m14521_a0-pure.cl index 44f5ba90d..79621b104 100644 --- a/OpenCL/m14521_a0-pure.cl +++ b/OpenCL/m14521_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14521_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -181,7 +181,7 @@ KERNEL_FQ void m14521_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14521_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14521_a1-pure.cl b/OpenCL/m14521_a1-pure.cl index f42b48c26..333115adb 100644 --- a/OpenCL/m14521_a1-pure.cl +++ b/OpenCL/m14521_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14521_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -177,7 +177,7 @@ KERNEL_FQ void m14521_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14521_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14521_a3-pure.cl b/OpenCL/m14521_a3-pure.cl index 82dfecbf6..fffff55c1 100644 --- a/OpenCL/m14521_a3-pure.cl +++ b/OpenCL/m14521_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14521_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -190,7 +190,7 @@ KERNEL_FQ void m14521_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14521_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14521_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14522_a0-pure.cl b/OpenCL/m14522_a0-pure.cl index a39b10993..7cd0bb2d3 100644 --- a/OpenCL/m14522_a0-pure.cl +++ b/OpenCL/m14522_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14522_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -145,7 +145,7 @@ KERNEL_FQ void m14522_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14522_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14522_a1-pure.cl b/OpenCL/m14522_a1-pure.cl index 44d50f9b5..aa5303193 100644 --- a/OpenCL/m14522_a1-pure.cl +++ b/OpenCL/m14522_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14522_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -141,7 +141,7 @@ KERNEL_FQ void m14522_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14522_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14522_a3-pure.cl b/OpenCL/m14522_a3-pure.cl index 633a71e1a..efc78c2cc 100644 --- a/OpenCL/m14522_a3-pure.cl +++ b/OpenCL/m14522_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14522_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -154,7 +154,7 @@ KERNEL_FQ void m14522_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14522_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14522_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14523_a0-pure.cl b/OpenCL/m14523_a0-pure.cl index a9ff6de68..78730c2b4 100644 --- a/OpenCL/m14523_a0-pure.cl +++ b/OpenCL/m14523_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14523_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -146,7 +146,7 @@ KERNEL_FQ void m14523_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14523_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14523_a1-pure.cl b/OpenCL/m14523_a1-pure.cl index 557c6d9b7..4b12f749e 100644 --- a/OpenCL/m14523_a1-pure.cl +++ b/OpenCL/m14523_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14523_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -142,7 +142,7 @@ KERNEL_FQ void m14523_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14523_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14523_a3-pure.cl b/OpenCL/m14523_a3-pure.cl index b3086a558..375e738b2 100644 --- a/OpenCL/m14523_a3-pure.cl +++ b/OpenCL/m14523_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14523_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -155,7 +155,7 @@ KERNEL_FQ void m14523_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14523_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14523_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14531_a0-pure.cl b/OpenCL/m14531_a0-pure.cl index 9ebed2d37..555912185 100644 --- a/OpenCL/m14531_a0-pure.cl +++ b/OpenCL/m14531_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14531_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -181,7 +181,7 @@ KERNEL_FQ void m14531_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14531_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14531_a1-pure.cl b/OpenCL/m14531_a1-pure.cl index e9c1e686b..d4175e226 100644 --- a/OpenCL/m14531_a1-pure.cl +++ b/OpenCL/m14531_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14531_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -177,7 +177,7 @@ KERNEL_FQ void m14531_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14531_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14531_a3-pure.cl b/OpenCL/m14531_a3-pure.cl index ddeb1210b..3ae49a255 100644 --- a/OpenCL/m14531_a3-pure.cl +++ b/OpenCL/m14531_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14531_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -190,7 +190,7 @@ KERNEL_FQ void m14531_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14531_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14531_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14532_a0-pure.cl b/OpenCL/m14532_a0-pure.cl index 4ff993369..5235a3f26 100644 --- a/OpenCL/m14532_a0-pure.cl +++ b/OpenCL/m14532_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14532_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -145,7 +145,7 @@ KERNEL_FQ void m14532_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14532_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14532_a1-pure.cl b/OpenCL/m14532_a1-pure.cl index 46ea468d8..6e0efe3a0 100644 --- a/OpenCL/m14532_a1-pure.cl +++ b/OpenCL/m14532_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14532_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -141,7 +141,7 @@ KERNEL_FQ void m14532_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14532_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14532_a3-pure.cl b/OpenCL/m14532_a3-pure.cl index d2115cb96..593a5c299 100644 --- a/OpenCL/m14532_a3-pure.cl +++ b/OpenCL/m14532_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14532_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -154,7 +154,7 @@ KERNEL_FQ void m14532_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14532_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14532_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14533_a0-pure.cl b/OpenCL/m14533_a0-pure.cl index c22abe168..b4fe23cd1 100644 --- a/OpenCL/m14533_a0-pure.cl +++ b/OpenCL/m14533_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14533_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -146,7 +146,7 @@ KERNEL_FQ void m14533_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14533_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14533_a1-pure.cl b/OpenCL/m14533_a1-pure.cl index 2ce1e6c37..e3c0d9032 100644 --- a/OpenCL/m14533_a1-pure.cl +++ b/OpenCL/m14533_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14533_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -142,7 +142,7 @@ KERNEL_FQ void m14533_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14533_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14533_a3-pure.cl b/OpenCL/m14533_a3-pure.cl index 294e8fb74..df7fbe92c 100644 --- a/OpenCL/m14533_a3-pure.cl +++ b/OpenCL/m14533_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14533_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -155,7 +155,7 @@ KERNEL_FQ void m14533_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14533_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14533_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14541_a0-pure.cl b/OpenCL/m14541_a0-pure.cl index d04e0e96d..ee7344489 100644 --- a/OpenCL/m14541_a0-pure.cl +++ b/OpenCL/m14541_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14541_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -200,7 +200,7 @@ KERNEL_FQ void m14541_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14541_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14541_a1-pure.cl b/OpenCL/m14541_a1-pure.cl index 822edab4b..27bcf929f 100644 --- a/OpenCL/m14541_a1-pure.cl +++ b/OpenCL/m14541_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14541_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -210,7 +210,7 @@ KERNEL_FQ void m14541_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14541_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14541_a3-pure.cl b/OpenCL/m14541_a3-pure.cl index 826768b8e..cf51c0ad3 100644 --- a/OpenCL/m14541_a3-pure.cl +++ b/OpenCL/m14541_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14541_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -203,7 +203,7 @@ KERNEL_FQ void m14541_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14541_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14541_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14542_a0-pure.cl b/OpenCL/m14542_a0-pure.cl index 9231a7d81..82b05a70a 100644 --- a/OpenCL/m14542_a0-pure.cl +++ b/OpenCL/m14542_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14542_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -164,7 +164,7 @@ KERNEL_FQ void m14542_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14542_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14542_a1-pure.cl b/OpenCL/m14542_a1-pure.cl index d25a00920..a75335c00 100644 --- a/OpenCL/m14542_a1-pure.cl +++ b/OpenCL/m14542_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14542_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m14542_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14542_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14542_a3-pure.cl b/OpenCL/m14542_a3-pure.cl index 2e167c5e1..4308ef6f8 100644 --- a/OpenCL/m14542_a3-pure.cl +++ b/OpenCL/m14542_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14542_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -167,7 +167,7 @@ KERNEL_FQ void m14542_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14542_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14542_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14543_a0-pure.cl b/OpenCL/m14543_a0-pure.cl index 5fcd0c681..10713ca4b 100644 --- a/OpenCL/m14543_a0-pure.cl +++ b/OpenCL/m14543_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14543_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -165,7 +165,7 @@ KERNEL_FQ void m14543_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14543_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14543_a1-pure.cl b/OpenCL/m14543_a1-pure.cl index aea17884c..e969805ce 100644 --- a/OpenCL/m14543_a1-pure.cl +++ b/OpenCL/m14543_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14543_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -175,7 +175,7 @@ KERNEL_FQ void m14543_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14543_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14543_a3-pure.cl b/OpenCL/m14543_a3-pure.cl index b40223c38..ba9694bf8 100644 --- a/OpenCL/m14543_a3-pure.cl +++ b/OpenCL/m14543_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14543_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -168,7 +168,7 @@ KERNEL_FQ void m14543_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14543_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14543_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14551_a0-pure.cl b/OpenCL/m14551_a0-pure.cl index e8a8ee9c3..aa8920792 100644 --- a/OpenCL/m14551_a0-pure.cl +++ b/OpenCL/m14551_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14551_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -208,7 +208,7 @@ KERNEL_FQ void m14551_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14551_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14551_a1-pure.cl b/OpenCL/m14551_a1-pure.cl index 402a40494..e2e48c52f 100644 --- a/OpenCL/m14551_a1-pure.cl +++ b/OpenCL/m14551_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14551_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -204,7 +204,7 @@ KERNEL_FQ void m14551_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14551_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14551_a3-pure.cl b/OpenCL/m14551_a3-pure.cl index 7069505e8..8fc4534ae 100644 --- a/OpenCL/m14551_a3-pure.cl +++ b/OpenCL/m14551_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14551_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -217,7 +217,7 @@ KERNEL_FQ void m14551_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14551_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14551_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14552_a0-pure.cl b/OpenCL/m14552_a0-pure.cl index 70ea01567..c77be4763 100644 --- a/OpenCL/m14552_a0-pure.cl +++ b/OpenCL/m14552_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14552_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -190,7 +190,7 @@ KERNEL_FQ void m14552_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14552_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14552_a1-pure.cl b/OpenCL/m14552_a1-pure.cl index dd7ce6f30..848a69d9c 100644 --- a/OpenCL/m14552_a1-pure.cl +++ b/OpenCL/m14552_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14552_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -186,7 +186,7 @@ KERNEL_FQ void m14552_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14552_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14552_a3-pure.cl b/OpenCL/m14552_a3-pure.cl index b42e8d2f3..ec7993a89 100644 --- a/OpenCL/m14552_a3-pure.cl +++ b/OpenCL/m14552_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14552_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -199,7 +199,7 @@ KERNEL_FQ void m14552_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14552_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14552_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14553_a0-pure.cl b/OpenCL/m14553_a0-pure.cl index 0ee833a6d..c2658b110 100644 --- a/OpenCL/m14553_a0-pure.cl +++ b/OpenCL/m14553_a0-pure.cl @@ -24,7 +24,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14553_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier @@ -191,7 +191,7 @@ KERNEL_FQ void m14553_mxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14553_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_sxx (KERN_ATTR_RULES_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14553_a1-pure.cl b/OpenCL/m14553_a1-pure.cl index 0aca6847a..bd000b4c3 100644 --- a/OpenCL/m14553_a1-pure.cl +++ b/OpenCL/m14553_a1-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14553_mxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_mxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier @@ -187,7 +187,7 @@ KERNEL_FQ void m14553_mxx (KERN_ATTR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14553_sxx (KERN_ATTR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_sxx (KERN_ATTR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14553_a3-pure.cl b/OpenCL/m14553_a3-pure.cl index 62048e1ed..e8348f472 100644 --- a/OpenCL/m14553_a3-pure.cl +++ b/OpenCL/m14553_a3-pure.cl @@ -22,7 +22,7 @@ typedef struct cryptoapi } cryptoapi_t; -KERNEL_FQ void m14553_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier @@ -200,7 +200,7 @@ KERNEL_FQ void m14553_mxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) } } -KERNEL_FQ void m14553_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) +KERNEL_FQ KERNEL_FA void m14553_sxx (KERN_ATTR_VECTOR_ESALT (cryptoapi_t)) { /** * modifier diff --git a/OpenCL/m14611-pure.cl b/OpenCL/m14611-pure.cl index 7d9c6742a..bdef8c740 100644 --- a/OpenCL/m14611-pure.cl +++ b/OpenCL/m14611-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14611_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14611_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14611_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14611_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14611_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14611_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14611_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14611_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14612-pure.cl b/OpenCL/m14612-pure.cl index d00cca68f..0ab2ac8f0 100644 --- a/OpenCL/m14612-pure.cl +++ b/OpenCL/m14612-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14612_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14612_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14612_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14612_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14612_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14612_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14612_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14612_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14613-pure.cl b/OpenCL/m14613-pure.cl index d1788d9bc..c234a239f 100644 --- a/OpenCL/m14613-pure.cl +++ b/OpenCL/m14613-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14613_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14613_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14613_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14613_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14613_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14613_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14613_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14613_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14621-pure.cl b/OpenCL/m14621-pure.cl index 6789f606c..1eefdbf8b 100644 --- a/OpenCL/m14621-pure.cl +++ b/OpenCL/m14621-pure.cl @@ -142,7 +142,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14621_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14621_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -228,7 +228,7 @@ KERNEL_FQ void m14621_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14621_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14621_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -336,7 +336,7 @@ KERNEL_FQ void m14621_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14621_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14621_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14622-pure.cl b/OpenCL/m14622-pure.cl index 0921fbde4..105195198 100644 --- a/OpenCL/m14622-pure.cl +++ b/OpenCL/m14622-pure.cl @@ -142,7 +142,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14622_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14622_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -228,7 +228,7 @@ KERNEL_FQ void m14622_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14622_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14622_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -336,7 +336,7 @@ KERNEL_FQ void m14622_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14622_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14622_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14623-pure.cl b/OpenCL/m14623-pure.cl index 98884e25e..0912d706f 100644 --- a/OpenCL/m14623-pure.cl +++ b/OpenCL/m14623-pure.cl @@ -142,7 +142,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14623_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14623_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -228,7 +228,7 @@ KERNEL_FQ void m14623_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14623_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14623_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -336,7 +336,7 @@ KERNEL_FQ void m14623_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14623_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14623_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14631-pure.cl b/OpenCL/m14631-pure.cl index f42f215c4..bd282089f 100644 --- a/OpenCL/m14631-pure.cl +++ b/OpenCL/m14631-pure.cl @@ -158,7 +158,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m14631_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14631_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -264,7 +264,7 @@ KERNEL_FQ void m14631_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14631_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14631_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -392,7 +392,7 @@ KERNEL_FQ void m14631_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14631_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14631_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14632-pure.cl b/OpenCL/m14632-pure.cl index 50ba38a64..e2a3a7e11 100644 --- a/OpenCL/m14632-pure.cl +++ b/OpenCL/m14632-pure.cl @@ -158,7 +158,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m14632_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14632_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -264,7 +264,7 @@ KERNEL_FQ void m14632_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14632_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14632_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -392,7 +392,7 @@ KERNEL_FQ void m14632_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14632_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14632_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14633-pure.cl b/OpenCL/m14633-pure.cl index 1e008e8dd..beb5f8657 100644 --- a/OpenCL/m14633-pure.cl +++ b/OpenCL/m14633-pure.cl @@ -158,7 +158,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m14633_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14633_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -264,7 +264,7 @@ KERNEL_FQ void m14633_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14633_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14633_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -392,7 +392,7 @@ KERNEL_FQ void m14633_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14633_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14633_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14641-pure.cl b/OpenCL/m14641-pure.cl index 2c32013c6..ca75aa00d 100644 --- a/OpenCL/m14641-pure.cl +++ b/OpenCL/m14641-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14641_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14641_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14641_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14641_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14641_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14641_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14641_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14641_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14642-pure.cl b/OpenCL/m14642-pure.cl index e8ab9919d..08cfaff70 100644 --- a/OpenCL/m14642-pure.cl +++ b/OpenCL/m14642-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14642_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14642_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14642_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14642_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14642_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14642_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14642_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14642_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14643-pure.cl b/OpenCL/m14643-pure.cl index cc48d85e0..d5ace42bb 100644 --- a/OpenCL/m14643-pure.cl +++ b/OpenCL/m14643-pure.cl @@ -136,7 +136,7 @@ DECLSPEC void hmac_ripemd160_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PR ripemd160_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14643_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14643_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m14643_init (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14643_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14643_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m14643_loop (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) } } -KERNEL_FQ void m14643_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) +KERNEL_FQ KERNEL_FA void m14643_comp (KERN_ATTR_TMPS_ESALT (luks_tmp_t, luks_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m14700-pure.cl b/OpenCL/m14700-pure.cl index fc5acfd8d..a795e8e22 100644 --- a/OpenCL/m14700-pure.cl +++ b/OpenCL/m14700-pure.cl @@ -71,7 +71,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14700_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14700_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) { /** * base @@ -143,7 +143,7 @@ KERNEL_FQ void m14700_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_back } } -KERNEL_FQ void m14700_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14700_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) { const u64 gid = get_global_id (0); @@ -228,7 +228,7 @@ KERNEL_FQ void m14700_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_back } } -KERNEL_FQ void m14700_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14700_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, itunes_backup_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14800-pure.cl b/OpenCL/m14800-pure.cl index 6d7322e92..e7cac034d 100644 --- a/OpenCL/m14800-pure.cl +++ b/OpenCL/m14800-pure.cl @@ -111,7 +111,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m14800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) { /** * base @@ -212,7 +212,7 @@ KERNEL_FQ void m14800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_ba } } -KERNEL_FQ void m14800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) { const u64 gid = get_global_id (0); @@ -318,7 +318,7 @@ KERNEL_FQ void m14800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_ba } } -KERNEL_FQ void m14800_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14800_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) { /** * base @@ -407,7 +407,7 @@ KERNEL_FQ void m14800_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_b } } -KERNEL_FQ void m14800_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14800_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) { const u64 gid = get_global_id (0); @@ -492,7 +492,7 @@ KERNEL_FQ void m14800_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_b } } -KERNEL_FQ void m14800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) +KERNEL_FQ KERNEL_FA void m14800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, itunes_backup_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m14900_a0-optimized.cl b/OpenCL/m14900_a0-optimized.cl index b835dd776..9255b0940 100644 --- a/OpenCL/m14900_a0-optimized.cl +++ b/OpenCL/m14900_a0-optimized.cl @@ -105,7 +105,7 @@ DECLSPEC u32 skip32 (LOCAL_AS u8 *s_ftable, const u32 KP, PRIVATE_AS const u32 * return r; } -KERNEL_FQ void m14900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -188,15 +188,15 @@ KERNEL_FQ void m14900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -291,10 +291,10 @@ KERNEL_FQ void m14900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m14900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m14900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m14900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m14900_a1-optimized.cl b/OpenCL/m14900_a1-optimized.cl index 3b47cb5de..27bfc7568 100644 --- a/OpenCL/m14900_a1-optimized.cl +++ b/OpenCL/m14900_a1-optimized.cl @@ -103,7 +103,7 @@ DECLSPEC u32 skip32 (LOCAL_AS u8 *s_ftable, const u32 KP, PRIVATE_AS const u32 * return r; } -KERNEL_FQ void m14900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -250,15 +250,15 @@ KERNEL_FQ void m14900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -417,10 +417,10 @@ KERNEL_FQ void m14900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m14900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m14900_a3-optimized.cl b/OpenCL/m14900_a3-optimized.cl index b902b40c1..fb79ab712 100644 --- a/OpenCL/m14900_a3-optimized.cl +++ b/OpenCL/m14900_a3-optimized.cl @@ -205,7 +205,7 @@ DECLSPEC void m14900s (LOCAL_AS u8 *s_ftable, PRIVATE_AS u32 *w0, PRIVATE_AS u32 } } -KERNEL_FQ void m14900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -271,15 +271,15 @@ KERNEL_FQ void m14900_m04 (KERN_ATTR_BASIC ()) m14900m (s_ftable, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m14900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -345,10 +345,10 @@ KERNEL_FQ void m14900_s04 (KERN_ATTR_BASIC ()) m14900s (s_ftable, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m14900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m14900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m14900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m15000_a0-optimized.cl b/OpenCL/m15000_a0-optimized.cl index 404a0418a..154ebbd97 100644 --- a/OpenCL/m15000_a0-optimized.cl +++ b/OpenCL/m15000_a0-optimized.cl @@ -115,7 +115,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m15000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -312,15 +312,15 @@ KERNEL_FQ void m15000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -529,10 +529,10 @@ KERNEL_FQ void m15000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m15000_a0-pure.cl b/OpenCL/m15000_a0-pure.cl index bfc61e2e6..87b9f02bb 100644 --- a/OpenCL/m15000_a0-pure.cl +++ b/OpenCL/m15000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m15000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m15000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m15000_a1-optimized.cl b/OpenCL/m15000_a1-optimized.cl index 609a5fa3a..419ee07d3 100644 --- a/OpenCL/m15000_a1-optimized.cl +++ b/OpenCL/m15000_a1-optimized.cl @@ -113,7 +113,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m15000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -370,15 +370,15 @@ KERNEL_FQ void m15000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -647,10 +647,10 @@ KERNEL_FQ void m15000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m15000_a1-pure.cl b/OpenCL/m15000_a1-pure.cl index 412858add..a4a086e38 100644 --- a/OpenCL/m15000_a1-pure.cl +++ b/OpenCL/m15000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m15000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -67,7 +67,7 @@ KERNEL_FQ void m15000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m15000_a3-optimized.cl b/OpenCL/m15000_a3-optimized.cl index 6715ab4d0..274b64265 100644 --- a/OpenCL/m15000_a3-optimized.cl +++ b/OpenCL/m15000_a3-optimized.cl @@ -437,7 +437,7 @@ DECLSPEC void m15000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m15000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -477,7 +477,7 @@ KERNEL_FQ void m15000_m04 (KERN_ATTR_VECTOR ()) m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -517,7 +517,7 @@ KERNEL_FQ void m15000_m08 (KERN_ATTR_VECTOR ()) m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -557,7 +557,7 @@ KERNEL_FQ void m15000_m16 (KERN_ATTR_VECTOR ()) m15000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -597,7 +597,7 @@ KERNEL_FQ void m15000_s04 (KERN_ATTR_VECTOR ()) m15000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -637,7 +637,7 @@ KERNEL_FQ void m15000_s08 (KERN_ATTR_VECTOR ()) m15000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m15000_a3-pure.cl b/OpenCL/m15000_a3-pure.cl index 59e983719..76c88b2ff 100644 --- a/OpenCL/m15000_a3-pure.cl +++ b/OpenCL/m15000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m15000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -80,7 +80,7 @@ KERNEL_FQ void m15000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m15000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m15100-pure.cl b/OpenCL/m15100-pure.cl index 97138fc42..fbba7afc1 100644 --- a/OpenCL/m15100-pure.cl +++ b/OpenCL/m15100-pure.cl @@ -64,7 +64,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m15100_init (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m15100_init (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) { /** * base @@ -101,7 +101,7 @@ KERNEL_FQ void m15100_init (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) tmps[gid].out[4] = sha1_hmac_ctx.opad.h[4]; } -KERNEL_FQ void m15100_loop (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m15100_loop (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) { const u64 gid = get_global_id (0); @@ -164,7 +164,7 @@ KERNEL_FQ void m15100_loop (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) unpackv (tmps, out, gid, 4, out[4]); } -KERNEL_FQ void m15100_comp (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m15100_comp (KERN_ATTR_TMPS (pbkdf1_sha1_tmp_t)) { /** * base diff --git a/OpenCL/m15300-pure.cl b/OpenCL/m15300-pure.cl index 64869baa7..8deb497a0 100644 --- a/OpenCL/m15300-pure.cl +++ b/OpenCL/m15300-pure.cl @@ -86,7 +86,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m15300_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15300_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { /** * base @@ -283,7 +283,7 @@ KERNEL_FQ void m15300_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15300_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15300_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { /** * base @@ -372,7 +372,7 @@ KERNEL_FQ void m15300_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15300_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15300_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m15310-pure.cl b/OpenCL/m15310-pure.cl index bf8c53947..e0036942e 100644 --- a/OpenCL/m15310-pure.cl +++ b/OpenCL/m15310-pure.cl @@ -130,7 +130,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m15310_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15310_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { /** * base @@ -252,7 +252,7 @@ KERNEL_FQ void m15310_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15310_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15310_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { const u64 gid = get_global_id (0); @@ -358,7 +358,7 @@ KERNEL_FQ void m15310_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15310_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15310_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { /** * base @@ -599,7 +599,7 @@ KERNEL_FQ void m15310_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15310_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15310_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { /** * base @@ -688,7 +688,7 @@ KERNEL_FQ void m15310_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) } } -KERNEL_FQ void m15310_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15310_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v1_t, dpapimk_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m15400_a0-optimized.cl b/OpenCL/m15400_a0-optimized.cl index 86363977a..d2df7d4f9 100644 --- a/OpenCL/m15400_a0-optimized.cl +++ b/OpenCL/m15400_a0-optimized.cl @@ -238,7 +238,7 @@ DECLSPEC void chacha20_transform (PRIVATE_AS const u32x *w0, PRIVATE_AS const u3 } } -KERNEL_FQ void m15400_m04 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m04 (KERN_ATTR_RULES_ESALT (chacha20_t)) { /** * modifier @@ -308,15 +308,15 @@ KERNEL_FQ void m15400_m04 (KERN_ATTR_RULES_ESALT (chacha20_t)) } } -KERNEL_FQ void m15400_m08 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m08 (KERN_ATTR_RULES_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_m16 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m16 (KERN_ATTR_RULES_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_s04 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s04 (KERN_ATTR_RULES_ESALT (chacha20_t)) { /** * modifier @@ -398,10 +398,10 @@ KERNEL_FQ void m15400_s04 (KERN_ATTR_RULES_ESALT (chacha20_t)) } } -KERNEL_FQ void m15400_s08 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s08 (KERN_ATTR_RULES_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_s16 (KERN_ATTR_RULES_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s16 (KERN_ATTR_RULES_ESALT (chacha20_t)) { } diff --git a/OpenCL/m15400_a1-optimized.cl b/OpenCL/m15400_a1-optimized.cl index cf9017ce6..c140058df 100644 --- a/OpenCL/m15400_a1-optimized.cl +++ b/OpenCL/m15400_a1-optimized.cl @@ -236,7 +236,7 @@ DECLSPEC void chacha20_transform (PRIVATE_AS const u32x *w0, PRIVATE_AS const u3 } } -KERNEL_FQ void m15400_m04 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m04 (KERN_ATTR_ESALT (chacha20_t)) { /** * modifier @@ -357,15 +357,15 @@ KERNEL_FQ void m15400_m04 (KERN_ATTR_ESALT (chacha20_t)) } } -KERNEL_FQ void m15400_m08 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m08 (KERN_ATTR_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_m16 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m16 (KERN_ATTR_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_s04 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s04 (KERN_ATTR_ESALT (chacha20_t)) { /** * modifier @@ -498,10 +498,10 @@ KERNEL_FQ void m15400_s04 (KERN_ATTR_ESALT (chacha20_t)) } } -KERNEL_FQ void m15400_s08 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s08 (KERN_ATTR_ESALT (chacha20_t)) { } -KERNEL_FQ void m15400_s16 (KERN_ATTR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s16 (KERN_ATTR_ESALT (chacha20_t)) { } diff --git a/OpenCL/m15400_a3-optimized.cl b/OpenCL/m15400_a3-optimized.cl index 2eaa0ea40..a0f856bac 100644 --- a/OpenCL/m15400_a3-optimized.cl +++ b/OpenCL/m15400_a3-optimized.cl @@ -236,17 +236,17 @@ DECLSPEC void chacha20_transform (PRIVATE_AS const u32x *w0, PRIVATE_AS const u3 } } -KERNEL_FQ void m15400_m04 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m04 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { // fixed size 32 } -KERNEL_FQ void m15400_m08 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m08 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { // fixed size 32 } -KERNEL_FQ void m15400_m16 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_m16 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { /** * modifier @@ -326,17 +326,17 @@ KERNEL_FQ void m15400_m16 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) } } -KERNEL_FQ void m15400_s04 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s04 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { // fixed size 32 } -KERNEL_FQ void m15400_s08 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s08 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { // fixed size 32 } -KERNEL_FQ void m15400_s16 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) +KERNEL_FQ KERNEL_FA void m15400_s16 (KERN_ATTR_VECTOR_ESALT (chacha20_t)) { /** * modifier diff --git a/OpenCL/m15500_a0-optimized.cl b/OpenCL/m15500_a0-optimized.cl index 55d5cf935..e3ea59427 100644 --- a/OpenCL/m15500_a0-optimized.cl +++ b/OpenCL/m15500_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m15500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -264,15 +264,15 @@ KERNEL_FQ void m15500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -532,10 +532,10 @@ KERNEL_FQ void m15500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m15500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m15500_a0-pure.cl b/OpenCL/m15500_a0-pure.cl index 5190cf4ea..d2c568e3e 100644 --- a/OpenCL/m15500_a0-pure.cl +++ b/OpenCL/m15500_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m15500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -77,7 +77,7 @@ KERNEL_FQ void m15500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m15500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m15500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m15500_a1-optimized.cl b/OpenCL/m15500_a1-optimized.cl index 6d253ba54..3c11ee2a1 100644 --- a/OpenCL/m15500_a1-optimized.cl +++ b/OpenCL/m15500_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m15500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -322,15 +322,15 @@ KERNEL_FQ void m15500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -650,10 +650,10 @@ KERNEL_FQ void m15500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m15500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m15500_a1-pure.cl b/OpenCL/m15500_a1-pure.cl index 457a9e982..d98047710 100644 --- a/OpenCL/m15500_a1-pure.cl +++ b/OpenCL/m15500_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m15500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -73,7 +73,7 @@ KERNEL_FQ void m15500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m15500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m15500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m15500_a3-optimized.cl b/OpenCL/m15500_a3-optimized.cl index f6d37dd9f..2a99be21d 100644 --- a/OpenCL/m15500_a3-optimized.cl +++ b/OpenCL/m15500_a3-optimized.cl @@ -580,7 +580,7 @@ DECLSPEC void m15500s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m15500_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -620,7 +620,7 @@ KERNEL_FQ void m15500_m04 (KERN_ATTR_VECTOR ()) m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15500_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -660,7 +660,7 @@ KERNEL_FQ void m15500_m08 (KERN_ATTR_VECTOR ()) m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15500_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -700,7 +700,7 @@ KERNEL_FQ void m15500_m16 (KERN_ATTR_VECTOR ()) m15500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15500_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -740,7 +740,7 @@ KERNEL_FQ void m15500_s04 (KERN_ATTR_VECTOR ()) m15500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15500_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -780,7 +780,7 @@ KERNEL_FQ void m15500_s08 (KERN_ATTR_VECTOR ()) m15500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m15500_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m15500_a3-pure.cl b/OpenCL/m15500_a3-pure.cl index 1805eb526..b838b8ad2 100644 --- a/OpenCL/m15500_a3-pure.cl +++ b/OpenCL/m15500_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m15500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m15500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m15500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m15500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m15600-pure.cl b/OpenCL/m15600-pure.cl index 391bdf13c..08d05e039 100644 --- a/OpenCL/m15600-pure.cl +++ b/OpenCL/m15600-pure.cl @@ -205,7 +205,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m15600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) +KERNEL_FQ KERNEL_FA void m15600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) { /** * base @@ -289,7 +289,7 @@ KERNEL_FQ void m15600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_ } } -KERNEL_FQ void m15600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) +KERNEL_FQ KERNEL_FA void m15600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) { const u64 gid = get_global_id (0); @@ -395,7 +395,7 @@ KERNEL_FQ void m15600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_ } } -KERNEL_FQ void m15600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) +KERNEL_FQ KERNEL_FA void m15600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_pbkdf2_t)) { /** * base diff --git a/OpenCL/m15700-pure.cl b/OpenCL/m15700-pure.cl index d435883ce..2e9e1bf45 100644 --- a/OpenCL/m15700-pure.cl +++ b/OpenCL/m15700-pure.cl @@ -9,21 +9,12 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #endif #define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) #define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) -typedef struct -{ - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - typedef struct ethereum_scrypt { u32 salt_buf[16]; @@ -31,273 +22,6 @@ typedef struct ethereum_scrypt } ethereum_scrypt_t; -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) -{ - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } -} - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4]; - - for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; - - for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - #ifndef KECCAK_ROUNDS #define KECCAK_ROUNDS 24 #endif @@ -427,277 +151,61 @@ DECLSPEC void keccak_transform_S (PRIVATE_AS u64 *st) } } -KERNEL_FQ void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_t)) +KERNEL_FQ KERNEL_FA void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_t)) { - /** - * base - */ - const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; - sha256_hmac_ctx_t sha256_hmac_ctx; + scrypt_pbkdf2_ggg (pws[gid].i, pws[gid].pw_len, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len, tmps[gid].in, SCRYPT_SZ); - sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); - - sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m15700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m15700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m15700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + u32 X[STATE_CNT4]; - uint4 X[STATE_CNT4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); } -KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_t)) +KERNEL_FQ KERNEL_FA void m15700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) { - /** - * base - */ - const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - /** - * 2nd pbkdf2, creates B - */ + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - sha256_hmac_ctx_t ctx; + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} - sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); +KERNEL_FQ KERNEL_FA void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_t)) +{ + const u64 gid = get_global_id (0); + if (gid >= GID_CNT) return; - for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) - { - uint4 X[4]; + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + u32 out[8]; - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; - - uint4 T[4]; - - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); + scrypt_pbkdf2_ggp (pws[gid].i, pws[gid].pw_len, tmps[gid].in, SCRYPT_SZ, out, 32); /** * keccak @@ -716,10 +224,10 @@ KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ u32 key[4]; - key[0] = hc_swap32_S (ctx.opad.h[4]); - key[1] = hc_swap32_S (ctx.opad.h[5]); - key[2] = hc_swap32_S (ctx.opad.h[6]); - key[3] = hc_swap32_S (ctx.opad.h[7]); + key[0] = out[4]; + key[1] = out[5]; + key[2] = out[6]; + key[3] = out[7]; u64 st[25]; diff --git a/OpenCL/m15900-pure.cl b/OpenCL/m15900-pure.cl index 025c50f0d..a5c2ada6b 100644 --- a/OpenCL/m15900-pure.cl +++ b/OpenCL/m15900-pure.cl @@ -109,7 +109,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m15900_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15900_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { /** * base @@ -371,7 +371,7 @@ KERNEL_FQ void m15900_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15900_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15900_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { /** * base @@ -501,7 +501,7 @@ KERNEL_FQ void m15900_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15900_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15900_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m15910-pure.cl b/OpenCL/m15910-pure.cl index d9c781911..6f080d699 100644 --- a/OpenCL/m15910-pure.cl +++ b/OpenCL/m15910-pure.cl @@ -159,7 +159,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m15910_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15910_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { /** * base @@ -281,7 +281,7 @@ KERNEL_FQ void m15910_init (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15910_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15910_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { const u64 gid = get_global_id (0); @@ -387,7 +387,7 @@ KERNEL_FQ void m15910_loop (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15910_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15910_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { /** * base @@ -693,7 +693,7 @@ KERNEL_FQ void m15910_init2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15910_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15910_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { /** * base @@ -823,7 +823,7 @@ KERNEL_FQ void m15910_loop2 (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) } } -KERNEL_FQ void m15910_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) +KERNEL_FQ KERNEL_FA void m15910_comp (KERN_ATTR_TMPS_ESALT (dpapimk_tmp_v2_t, dpapimk_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m16000_a0-pure.cl b/OpenCL/m16000_a0-pure.cl index 9abeee3ce..5207544fd 100644 --- a/OpenCL/m16000_a0-pure.cl +++ b/OpenCL/m16000_a0-pure.cl @@ -494,7 +494,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, PRIVATE_AS u32x iv[1] = hc_rotl32 (l, 31); } -KERNEL_FQ void m16000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -587,7 +587,7 @@ KERNEL_FQ void m16000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m16000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m16000_a1-pure.cl b/OpenCL/m16000_a1-pure.cl index e076a5f24..1ac5c55e0 100644 --- a/OpenCL/m16000_a1-pure.cl +++ b/OpenCL/m16000_a1-pure.cl @@ -492,7 +492,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, PRIVATE_AS u32x iv[1] = hc_rotl32 (l, 31); } -KERNEL_FQ void m16000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -664,7 +664,7 @@ KERNEL_FQ void m16000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m16000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m16000_a3-pure.cl b/OpenCL/m16000_a3-pure.cl index 25d1cf776..cea8b57fa 100644 --- a/OpenCL/m16000_a3-pure.cl +++ b/OpenCL/m16000_a3-pure.cl @@ -492,7 +492,7 @@ DECLSPEC void _des_crypt_encrypt (PRIVATE_AS u32 *iv, u32 mask, PRIVATE_AS u32x iv[1] = hc_rotl32 (l, 31); } -KERNEL_FQ void m16000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -613,7 +613,7 @@ KERNEL_FQ void m16000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m16000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m16100_a0-optimized.cl b/OpenCL/m16100_a0-optimized.cl index 8e068c96b..d808d97e2 100644 --- a/OpenCL/m16100_a0-optimized.cl +++ b/OpenCL/m16100_a0-optimized.cl @@ -27,7 +27,7 @@ typedef struct tacacs_plus } tacacs_plus_t; -KERNEL_FQ void m16100_m04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { /** * modifier @@ -304,15 +304,15 @@ KERNEL_FQ void m16100_m04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_m08 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m08 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_m16 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m16 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_s04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { /** * modifier @@ -589,10 +589,10 @@ KERNEL_FQ void m16100_s04 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_s08 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s08 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_s16 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s16 (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { } diff --git a/OpenCL/m16100_a0-pure.cl b/OpenCL/m16100_a0-pure.cl index 24e0289d9..ebc316e9c 100644 --- a/OpenCL/m16100_a0-pure.cl +++ b/OpenCL/m16100_a0-pure.cl @@ -27,7 +27,7 @@ typedef struct tacacs_plus } tacacs_plus_t; -KERNEL_FQ void m16100_mxx (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_mxx (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { /** * modifier @@ -189,7 +189,7 @@ KERNEL_FQ void m16100_mxx (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_sxx (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_sxx (KERN_ATTR_RULES_ESALT (tacacs_plus_t)) { /** * modifier diff --git a/OpenCL/m16100_a1-optimized.cl b/OpenCL/m16100_a1-optimized.cl index b950b2a41..8de440e95 100644 --- a/OpenCL/m16100_a1-optimized.cl +++ b/OpenCL/m16100_a1-optimized.cl @@ -25,7 +25,7 @@ typedef struct tacacs_plus } tacacs_plus_t; -KERNEL_FQ void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * modifier @@ -363,15 +363,15 @@ KERNEL_FQ void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_m08 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m08 (KERN_ATTR_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_m16 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m16 (KERN_ATTR_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * modifier @@ -709,10 +709,10 @@ KERNEL_FQ void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_s08 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s08 (KERN_ATTR_ESALT (tacacs_plus_t)) { } -KERNEL_FQ void m16100_s16 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s16 (KERN_ATTR_ESALT (tacacs_plus_t)) { } diff --git a/OpenCL/m16100_a1-pure.cl b/OpenCL/m16100_a1-pure.cl index d27663ec2..7470968f8 100644 --- a/OpenCL/m16100_a1-pure.cl +++ b/OpenCL/m16100_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct tacacs_plus } tacacs_plus_t; -KERNEL_FQ void m16100_mxx (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_mxx (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * modifier @@ -182,7 +182,7 @@ KERNEL_FQ void m16100_mxx (KERN_ATTR_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_sxx (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_sxx (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * modifier diff --git a/OpenCL/m16100_a3-optimized.cl b/OpenCL/m16100_a3-optimized.cl index 9353f977d..ccd88c0e1 100644 --- a/OpenCL/m16100_a3-optimized.cl +++ b/OpenCL/m16100_a3-optimized.cl @@ -525,7 +525,7 @@ DECLSPEC void m16100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base @@ -574,7 +574,7 @@ KERNEL_FQ void m16100_m04 (KERN_ATTR_ESALT (tacacs_plus_t)) m16100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16100_m08 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m08 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base @@ -623,7 +623,7 @@ KERNEL_FQ void m16100_m08 (KERN_ATTR_ESALT (tacacs_plus_t)) m16100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16100_m16 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_m16 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base @@ -672,7 +672,7 @@ KERNEL_FQ void m16100_m16 (KERN_ATTR_ESALT (tacacs_plus_t)) m16100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base @@ -721,7 +721,7 @@ KERNEL_FQ void m16100_s04 (KERN_ATTR_ESALT (tacacs_plus_t)) m16100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16100_s08 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s08 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base @@ -770,7 +770,7 @@ KERNEL_FQ void m16100_s08 (KERN_ATTR_ESALT (tacacs_plus_t)) m16100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16100_s16 (KERN_ATTR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_s16 (KERN_ATTR_ESALT (tacacs_plus_t)) { /** * base diff --git a/OpenCL/m16100_a3-pure.cl b/OpenCL/m16100_a3-pure.cl index a55774438..9908831c5 100644 --- a/OpenCL/m16100_a3-pure.cl +++ b/OpenCL/m16100_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct tacacs_plus } tacacs_plus_t; -KERNEL_FQ void m16100_mxx (KERN_ATTR_VECTOR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_mxx (KERN_ATTR_VECTOR_ESALT (tacacs_plus_t)) { /** * modifier @@ -199,7 +199,7 @@ KERNEL_FQ void m16100_mxx (KERN_ATTR_VECTOR_ESALT (tacacs_plus_t)) } } -KERNEL_FQ void m16100_sxx (KERN_ATTR_VECTOR_ESALT (tacacs_plus_t)) +KERNEL_FQ KERNEL_FA void m16100_sxx (KERN_ATTR_VECTOR_ESALT (tacacs_plus_t)) { /** * modifier diff --git a/OpenCL/m16200-pure.cl b/OpenCL/m16200-pure.cl index 85cc819b3..5bb9e772d 100644 --- a/OpenCL/m16200-pure.cl +++ b/OpenCL/m16200-pure.cl @@ -79,7 +79,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m16200_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m16200_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { /** * base @@ -163,7 +163,7 @@ KERNEL_FQ void m16200_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, appl } } -KERNEL_FQ void m16200_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m16200_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { const u64 gid = get_global_id (0); @@ -269,7 +269,7 @@ KERNEL_FQ void m16200_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, appl } } -KERNEL_FQ void m16200_comp (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m16200_comp (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m16300-pure.cl b/OpenCL/m16300-pure.cl index 2ec4c9152..a65cac579 100644 --- a/OpenCL/m16300-pure.cl +++ b/OpenCL/m16300-pure.cl @@ -207,7 +207,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m16300_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) +KERNEL_FQ KERNEL_FA void m16300_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) { /** * base @@ -291,7 +291,7 @@ KERNEL_FQ void m16300_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_ } } -KERNEL_FQ void m16300_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) +KERNEL_FQ KERNEL_FA void m16300_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) { const u64 gid = get_global_id (0); @@ -397,7 +397,7 @@ KERNEL_FQ void m16300_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_ } } -KERNEL_FQ void m16300_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) +KERNEL_FQ KERNEL_FA void m16300_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ethereum_presale_t)) { /** * base diff --git a/OpenCL/m16400_a0-optimized.cl b/OpenCL/m16400_a0-optimized.cl index f7c254928..b863b036d 100644 --- a/OpenCL/m16400_a0-optimized.cl +++ b/OpenCL/m16400_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m16400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -155,15 +155,15 @@ KERNEL_FQ void m16400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m16400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m16400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m16400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -317,10 +317,10 @@ KERNEL_FQ void m16400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m16400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m16400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m16400_a0-pure.cl b/OpenCL/m16400_a0-pure.cl index 59e4dc2d5..af25ddee5 100644 --- a/OpenCL/m16400_a0-pure.cl +++ b/OpenCL/m16400_a0-pure.cl @@ -176,7 +176,7 @@ DECLSPEC void cram_md5_final (PRIVATE_AS md5_ctx_t *ctx) cram_md5_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } -KERNEL_FQ void m16400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -220,7 +220,7 @@ KERNEL_FQ void m16400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m16400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m16400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m16400_a1-optimized.cl b/OpenCL/m16400_a1-optimized.cl index 3fbb16a87..da143dbe6 100644 --- a/OpenCL/m16400_a1-optimized.cl +++ b/OpenCL/m16400_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m16400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -201,15 +201,15 @@ KERNEL_FQ void m16400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m16400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m16400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m16400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -410,10 +410,10 @@ KERNEL_FQ void m16400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m16400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m16400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m16400_a1-pure.cl b/OpenCL/m16400_a1-pure.cl index 18b460d81..3247cc36b 100644 --- a/OpenCL/m16400_a1-pure.cl +++ b/OpenCL/m16400_a1-pure.cl @@ -174,7 +174,7 @@ DECLSPEC void cram_md5_final (PRIVATE_AS md5_ctx_t *ctx) cram_md5_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } -KERNEL_FQ void m16400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -216,7 +216,7 @@ KERNEL_FQ void m16400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m16400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m16400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m16400_a3-optimized.cl b/OpenCL/m16400_a3-optimized.cl index d51ac6319..366664c42 100644 --- a/OpenCL/m16400_a3-optimized.cl +++ b/OpenCL/m16400_a3-optimized.cl @@ -463,7 +463,7 @@ DECLSPEC void m16400s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m16400_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m16400_m04 (KERN_ATTR_VECTOR ()) m16400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16400_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -543,7 +543,7 @@ KERNEL_FQ void m16400_m08 (KERN_ATTR_VECTOR ()) m16400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16400_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -583,7 +583,7 @@ KERNEL_FQ void m16400_m16 (KERN_ATTR_VECTOR ()) m16400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16400_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -623,7 +623,7 @@ KERNEL_FQ void m16400_s04 (KERN_ATTR_VECTOR ()) m16400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16400_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -663,7 +663,7 @@ KERNEL_FQ void m16400_s08 (KERN_ATTR_VECTOR ()) m16400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16400_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m16400_a3-pure.cl b/OpenCL/m16400_a3-pure.cl index d6c5bcb49..acc6ab6f6 100644 --- a/OpenCL/m16400_a3-pure.cl +++ b/OpenCL/m16400_a3-pure.cl @@ -175,7 +175,7 @@ DECLSPEC void cram_md5_final_vector (PRIVATE_AS md5_ctx_vector_t *ctx) cram_md5_transform_vector (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } -KERNEL_FQ void m16400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -230,7 +230,7 @@ KERNEL_FQ void m16400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m16400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m16400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m16511_a0-pure.cl b/OpenCL/m16511_a0-pure.cl index cce108270..d84519877 100644 --- a/OpenCL/m16511_a0-pure.cl +++ b/OpenCL/m16511_a0-pure.cl @@ -25,7 +25,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16511_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m16511_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) } } -KERNEL_FQ void m16511_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16511_a1-pure.cl b/OpenCL/m16511_a1-pure.cl index 022548e40..39f466d11 100644 --- a/OpenCL/m16511_a1-pure.cl +++ b/OpenCL/m16511_a1-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16511_mxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_mxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m16511_mxx (KERN_ATTR_ESALT (jwt_t)) } } -KERNEL_FQ void m16511_sxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_sxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16511_a3-pure.cl b/OpenCL/m16511_a3-pure.cl index aebd2dead..a2ee8414f 100644 --- a/OpenCL/m16511_a3-pure.cl +++ b/OpenCL/m16511_a3-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16511_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m16511_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) } } -KERNEL_FQ void m16511_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16511_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16512_a0-pure.cl b/OpenCL/m16512_a0-pure.cl index 9f612b6e4..89e87de4f 100644 --- a/OpenCL/m16512_a0-pure.cl +++ b/OpenCL/m16512_a0-pure.cl @@ -25,7 +25,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16512_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m16512_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) } } -KERNEL_FQ void m16512_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16512_a1-pure.cl b/OpenCL/m16512_a1-pure.cl index 857bf28da..a55529392 100644 --- a/OpenCL/m16512_a1-pure.cl +++ b/OpenCL/m16512_a1-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16512_mxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_mxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m16512_mxx (KERN_ATTR_ESALT (jwt_t)) } } -KERNEL_FQ void m16512_sxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_sxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16512_a3-pure.cl b/OpenCL/m16512_a3-pure.cl index f89e03844..34aab0b2c 100644 --- a/OpenCL/m16512_a3-pure.cl +++ b/OpenCL/m16512_a3-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16512_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m16512_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) } } -KERNEL_FQ void m16512_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16512_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16513_a0-pure.cl b/OpenCL/m16513_a0-pure.cl index 2eed0e12a..733070149 100644 --- a/OpenCL/m16513_a0-pure.cl +++ b/OpenCL/m16513_a0-pure.cl @@ -25,7 +25,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16513_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m16513_mxx (KERN_ATTR_RULES_ESALT (jwt_t)) } } -KERNEL_FQ void m16513_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_sxx (KERN_ATTR_RULES_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16513_a1-pure.cl b/OpenCL/m16513_a1-pure.cl index 53fd8f41f..4159757b4 100644 --- a/OpenCL/m16513_a1-pure.cl +++ b/OpenCL/m16513_a1-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16513_mxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_mxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m16513_mxx (KERN_ATTR_ESALT (jwt_t)) } } -KERNEL_FQ void m16513_sxx (KERN_ATTR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_sxx (KERN_ATTR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16513_a3-pure.cl b/OpenCL/m16513_a3-pure.cl index f3f9bbd1e..56c7f5444 100644 --- a/OpenCL/m16513_a3-pure.cl +++ b/OpenCL/m16513_a3-pure.cl @@ -23,7 +23,7 @@ typedef struct jwt } jwt_t; -KERNEL_FQ void m16513_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier @@ -78,7 +78,7 @@ KERNEL_FQ void m16513_mxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) } } -KERNEL_FQ void m16513_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) +KERNEL_FQ KERNEL_FA void m16513_sxx (KERN_ATTR_VECTOR_ESALT (jwt_t)) { /** * modifier diff --git a/OpenCL/m16600_a0-optimized.cl b/OpenCL/m16600_a0-optimized.cl index 27842d1c8..1d3b4871f 100644 --- a/OpenCL/m16600_a0-optimized.cl +++ b/OpenCL/m16600_a0-optimized.cl @@ -25,7 +25,7 @@ typedef struct electrum_wallet } electrum_wallet_t; -KERNEL_FQ void m16600_m04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { /** * base @@ -429,15 +429,15 @@ KERNEL_FQ void m16600_m04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_m08 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m08 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_m16 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m16 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_s04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { /** * base @@ -841,10 +841,10 @@ KERNEL_FQ void m16600_s04 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_s08 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s08 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_s16 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s16 (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { } diff --git a/OpenCL/m16600_a0-pure.cl b/OpenCL/m16600_a0-pure.cl index c13319564..40655d3b6 100644 --- a/OpenCL/m16600_a0-pure.cl +++ b/OpenCL/m16600_a0-pure.cl @@ -25,7 +25,7 @@ typedef struct electrum_wallet } electrum_wallet_t; -KERNEL_FQ void m16600_mxx (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_mxx (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { /** * base @@ -243,7 +243,7 @@ KERNEL_FQ void m16600_mxx (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_sxx (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_sxx (KERN_ATTR_RULES_ESALT (electrum_wallet_t)) { /** * base diff --git a/OpenCL/m16600_a1-optimized.cl b/OpenCL/m16600_a1-optimized.cl index 9ee0b7b85..0a51cd748 100644 --- a/OpenCL/m16600_a1-optimized.cl +++ b/OpenCL/m16600_a1-optimized.cl @@ -23,7 +23,7 @@ typedef struct electrum_wallet } electrum_wallet_t; -KERNEL_FQ void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -485,15 +485,15 @@ KERNEL_FQ void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_m08 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m08 (KERN_ATTR_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_m16 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m16 (KERN_ATTR_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -955,10 +955,10 @@ KERNEL_FQ void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_s08 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s08 (KERN_ATTR_ESALT (electrum_wallet_t)) { } -KERNEL_FQ void m16600_s16 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s16 (KERN_ATTR_ESALT (electrum_wallet_t)) { } diff --git a/OpenCL/m16600_a1-pure.cl b/OpenCL/m16600_a1-pure.cl index b62608b09..b654820c4 100644 --- a/OpenCL/m16600_a1-pure.cl +++ b/OpenCL/m16600_a1-pure.cl @@ -23,7 +23,7 @@ typedef struct electrum_wallet } electrum_wallet_t; -KERNEL_FQ void m16600_mxx (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_mxx (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -239,7 +239,7 @@ KERNEL_FQ void m16600_mxx (KERN_ATTR_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_sxx (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_sxx (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base diff --git a/OpenCL/m16600_a3-optimized.cl b/OpenCL/m16600_a3-optimized.cl index b12391b6e..45760ab33 100644 --- a/OpenCL/m16600_a3-optimized.cl +++ b/OpenCL/m16600_a3-optimized.cl @@ -204,7 +204,7 @@ DECLSPEC void m16600 (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -299,7 +299,7 @@ KERNEL_FQ void m16600_m04 (KERN_ATTR_ESALT (electrum_wallet_t)) m16600 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16600_m08 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m08 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -394,7 +394,7 @@ KERNEL_FQ void m16600_m08 (KERN_ATTR_ESALT (electrum_wallet_t)) m16600 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16600_m16 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_m16 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -489,7 +489,7 @@ KERNEL_FQ void m16600_m16 (KERN_ATTR_ESALT (electrum_wallet_t)) m16600 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -584,7 +584,7 @@ KERNEL_FQ void m16600_s04 (KERN_ATTR_ESALT (electrum_wallet_t)) m16600 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16600_s08 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s08 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base @@ -679,7 +679,7 @@ KERNEL_FQ void m16600_s08 (KERN_ATTR_ESALT (electrum_wallet_t)) m16600 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m16600_s16 (KERN_ATTR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_s16 (KERN_ATTR_ESALT (electrum_wallet_t)) { /** * base diff --git a/OpenCL/m16600_a3-pure.cl b/OpenCL/m16600_a3-pure.cl index 906a4b56a..a611b6759 100644 --- a/OpenCL/m16600_a3-pure.cl +++ b/OpenCL/m16600_a3-pure.cl @@ -23,7 +23,7 @@ typedef struct electrum_wallet } electrum_wallet_t; -KERNEL_FQ void m16600_mxx (KERN_ATTR_VECTOR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_mxx (KERN_ATTR_VECTOR_ESALT (electrum_wallet_t)) { /** * base @@ -252,7 +252,7 @@ KERNEL_FQ void m16600_mxx (KERN_ATTR_VECTOR_ESALT (electrum_wallet_t)) } } -KERNEL_FQ void m16600_sxx (KERN_ATTR_VECTOR_ESALT (electrum_wallet_t)) +KERNEL_FQ KERNEL_FA void m16600_sxx (KERN_ATTR_VECTOR_ESALT (electrum_wallet_t)) { /** * base diff --git a/OpenCL/m16800-pure.cl b/OpenCL/m16800-pure.cl index e4752e21c..f6d24a330 100644 --- a/OpenCL/m16800-pure.cl +++ b/OpenCL/m16800-pure.cl @@ -81,7 +81,7 @@ DECLSPEC void hmac_sha1_run_V (u32x *w0, u32x *w1, u32x *w2, u32x *w3, const u32 sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m16800_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16800_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) { /** * base @@ -189,7 +189,7 @@ KERNEL_FQ void m16800_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t) tmps[gid].out[9] = sha1_hmac_ctx2.opad.h[4]; } -KERNEL_FQ void m16800_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16800_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) { const u64 gid = get_global_id (0); @@ -332,12 +332,12 @@ KERNEL_FQ void m16800_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t) unpackv (tmps, out, gid, 9, out[4]); } -KERNEL_FQ void m16800_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16800_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) { // not in use here, special case... } -KERNEL_FQ void m16800_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16800_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_pmkid_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m16801-pure.cl b/OpenCL/m16801-pure.cl index a98ad6424..daf6f0f23 100644 --- a/OpenCL/m16801-pure.cl +++ b/OpenCL/m16801-pure.cl @@ -3,7 +3,7 @@ * License.....: MIT */ -#define NEW_SIMD_CODE +//#define NEW_SIMD_CODE #ifdef KERNEL_STATIC #include M2S(INCLUDE_PATH/inc_vendor.h) @@ -58,7 +58,7 @@ DECLSPEC u8 hex_to_u8 (const u8 *hex) } #endif -KERNEL_FQ void m16801_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16801_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) { const u64 gid = get_global_id (0); @@ -104,19 +104,19 @@ KERNEL_FQ void m16801_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) tmps[gid].out[7] = hc_swap32_S (out[7]); } -KERNEL_FQ void m16801_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16801_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) { const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; } -KERNEL_FQ void m16801_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16801_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) { // not in use here, special case... } -KERNEL_FQ void m16801_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) +KERNEL_FQ KERNEL_FA void m16801_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_pmkid_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m16900-pure.cl b/OpenCL/m16900-pure.cl index 88bde3454..985c23093 100644 --- a/OpenCL/m16900-pure.cl +++ b/OpenCL/m16900-pure.cl @@ -78,7 +78,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m16900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) +KERNEL_FQ KERNEL_FA void m16900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) { /** * base @@ -162,7 +162,7 @@ KERNEL_FQ void m16900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_v } } -KERNEL_FQ void m16900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) +KERNEL_FQ KERNEL_FA void m16900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) { const u64 gid = get_global_id (0); @@ -268,7 +268,7 @@ KERNEL_FQ void m16900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_v } } -KERNEL_FQ void m16900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) +KERNEL_FQ KERNEL_FA void m16900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, ansible_vault_t)) { /** * base diff --git a/OpenCL/m17010-pure.cl b/OpenCL/m17010-pure.cl index 406c35aa2..4c4e41571 100644 --- a/OpenCL/m17010-pure.cl +++ b/OpenCL/m17010-pure.cl @@ -211,7 +211,7 @@ DECLSPEC int check_decoded_data (PRIVATE_AS u32 *decoded_data, const u32 decoded && (expected_sha1[4] == hc_swap32_S (ctx.h[4])); } -KERNEL_FQ void m17010_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -260,7 +260,7 @@ KERNEL_FQ void m17010_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17010_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -286,7 +286,7 @@ KERNEL_FQ void m17010_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = SALT_REPEAT; } -KERNEL_FQ void m17010_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -358,12 +358,12 @@ KERNEL_FQ void m17010_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = ctx.len; } -KERNEL_FQ void m17010_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { // not in use here, special case... } -KERNEL_FQ void m17010_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier @@ -433,7 +433,7 @@ KERNEL_FQ void m17010_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) } } -KERNEL_FQ void m17010_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17010_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier diff --git a/OpenCL/m17020-pure.cl b/OpenCL/m17020-pure.cl index d8b112a13..29fda3bfa 100644 --- a/OpenCL/m17020-pure.cl +++ b/OpenCL/m17020-pure.cl @@ -216,7 +216,7 @@ DECLSPEC int check_decoded_data (PRIVATE_AS u32 *decoded_data, const u32 decoded && (expected_sha1[4] == hc_swap32_S (ctx.h[4])); } -KERNEL_FQ void m17020_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -266,7 +266,7 @@ KERNEL_FQ void m17020_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17020_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -308,7 +308,7 @@ KERNEL_FQ void m17020_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17020_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -386,12 +386,12 @@ KERNEL_FQ void m17020_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = ctx.len; } -KERNEL_FQ void m17020_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { // not in use here, special case... } -KERNEL_FQ void m17020_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier @@ -464,7 +464,7 @@ KERNEL_FQ void m17020_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) } } -KERNEL_FQ void m17020_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17020_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier diff --git a/OpenCL/m17030-pure.cl b/OpenCL/m17030-pure.cl index e04ac6398..b31f2eeb2 100644 --- a/OpenCL/m17030-pure.cl +++ b/OpenCL/m17030-pure.cl @@ -212,7 +212,7 @@ DECLSPEC int check_decoded_data (PRIVATE_AS u32 *decoded_data, const u32 decoded && (expected_sha1[4] == hc_swap32_S (ctx.h[4])); } -KERNEL_FQ void m17030_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -262,7 +262,7 @@ KERNEL_FQ void m17030_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17030_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -288,7 +288,7 @@ KERNEL_FQ void m17030_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17030_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -358,12 +358,12 @@ KERNEL_FQ void m17030_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = ctx.len; } -KERNEL_FQ void m17030_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { // not in use here, special case... } -KERNEL_FQ void m17030_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier @@ -436,7 +436,7 @@ KERNEL_FQ void m17030_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) } } -KERNEL_FQ void m17030_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17030_aux2 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier diff --git a/OpenCL/m17040-pure.cl b/OpenCL/m17040-pure.cl index feeae009f..020ab6b64 100644 --- a/OpenCL/m17040-pure.cl +++ b/OpenCL/m17040-pure.cl @@ -193,7 +193,7 @@ DECLSPEC int check_decoded_data (PRIVATE_AS u32 *decoded_data, const u32 decoded && (expected_sha1[4] == hc_swap32_S (ctx.h[4])); } -KERNEL_FQ void m17040_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17040_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -242,7 +242,7 @@ KERNEL_FQ void m17040_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17040_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17040_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); @@ -279,7 +279,7 @@ KERNEL_FQ void m17040_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = 0; } -KERNEL_FQ void m17040_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17040_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -336,12 +336,12 @@ KERNEL_FQ void m17040_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) tmps[gid].len = ctx.len; } -KERNEL_FQ void m17040_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17040_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { // not in use here, special case... } -KERNEL_FQ void m17040_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +KERNEL_FQ KERNEL_FA void m17040_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) { /** * modifier diff --git a/OpenCL/m17200_a0-pure.cl b/OpenCL/m17200_a0-pure.cl index 1fdc1c069..cc85a10c9 100644 --- a/OpenCL/m17200_a0-pure.cl +++ b/OpenCL/m17200_a0-pure.cl @@ -529,7 +529,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17200_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier @@ -767,7 +767,7 @@ KERNEL_FQ void m17200_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) } } -KERNEL_FQ void m17200_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17200_a1-pure.cl b/OpenCL/m17200_a1-pure.cl index c8ed0d5bc..7943ee531 100644 --- a/OpenCL/m17200_a1-pure.cl +++ b/OpenCL/m17200_a1-pure.cl @@ -527,7 +527,7 @@ DECLSPEC int check_inflate_code1 (PRIVATE_AS u8 *next, int left) } } -KERNEL_FQ void m17200_sxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_sxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier @@ -769,7 +769,7 @@ KERNEL_FQ void m17200_sxx (KERN_ATTR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17200_mxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_mxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17200_a3-pure.cl b/OpenCL/m17200_a3-pure.cl index 1820c38e6..a370910a5 100644 --- a/OpenCL/m17200_a3-pure.cl +++ b/OpenCL/m17200_a3-pure.cl @@ -528,7 +528,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17200_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier @@ -782,7 +782,7 @@ KERNEL_FQ void m17200_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17200_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17200_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17210_a0-pure.cl b/OpenCL/m17210_a0-pure.cl index 093a62d6b..6ad437ac4 100644 --- a/OpenCL/m17210_a0-pure.cl +++ b/OpenCL/m17210_a0-pure.cl @@ -220,7 +220,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier @@ -459,7 +459,7 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) } } -KERNEL_FQ void m17210_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17210_a1-pure.cl b/OpenCL/m17210_a1-pure.cl index a2d7d4984..5ecdd74e5 100644 --- a/OpenCL/m17210_a1-pure.cl +++ b/OpenCL/m17210_a1-pure.cl @@ -218,7 +218,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17210_sxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_sxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier @@ -459,7 +459,7 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17210_mxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_mxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17210_a3-pure.cl b/OpenCL/m17210_a3-pure.cl index 829f06644..49859cd31 100644 --- a/OpenCL/m17210_a3-pure.cl +++ b/OpenCL/m17210_a3-pure.cl @@ -218,7 +218,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier @@ -471,7 +471,7 @@ KERNEL_FQ void m17210_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17210_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17210_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17220_a0-pure.cl b/OpenCL/m17220_a0-pure.cl index a7300768d..1c7d0155c 100644 --- a/OpenCL/m17220_a0-pure.cl +++ b/OpenCL/m17220_a0-pure.cl @@ -527,7 +527,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17220_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier @@ -792,7 +792,7 @@ KERNEL_FQ void m17220_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) } } -KERNEL_FQ void m17220_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17220_a1-pure.cl b/OpenCL/m17220_a1-pure.cl index 7755ee5a8..a0256b90e 100644 --- a/OpenCL/m17220_a1-pure.cl +++ b/OpenCL/m17220_a1-pure.cl @@ -525,7 +525,7 @@ DECLSPEC int check_inflate_code1 (PRIVATE_AS u8 *next, int left) } } -KERNEL_FQ void m17220_sxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_sxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier @@ -792,7 +792,7 @@ KERNEL_FQ void m17220_sxx (KERN_ATTR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17220_mxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_mxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17220_a3-pure.cl b/OpenCL/m17220_a3-pure.cl index 2145540af..a0bd659db 100644 --- a/OpenCL/m17220_a3-pure.cl +++ b/OpenCL/m17220_a3-pure.cl @@ -525,7 +525,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17220_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier @@ -804,7 +804,7 @@ KERNEL_FQ void m17220_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17220_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17220_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17225_a0-pure.cl b/OpenCL/m17225_a0-pure.cl index 868ffc8dd..487aa2823 100644 --- a/OpenCL/m17225_a0-pure.cl +++ b/OpenCL/m17225_a0-pure.cl @@ -527,7 +527,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17225_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier @@ -855,7 +855,7 @@ KERNEL_FQ void m17225_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) } } -KERNEL_FQ void m17225_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17225_a1-pure.cl b/OpenCL/m17225_a1-pure.cl index a4f04f253..cf6cae8b9 100644 --- a/OpenCL/m17225_a1-pure.cl +++ b/OpenCL/m17225_a1-pure.cl @@ -525,7 +525,7 @@ DECLSPEC int check_inflate_code1 (PRIVATE_AS u8 *next, int left) } } -KERNEL_FQ void m17225_sxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_sxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier @@ -854,7 +854,7 @@ KERNEL_FQ void m17225_sxx (KERN_ATTR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17225_mxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_mxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17225_a3-pure.cl b/OpenCL/m17225_a3-pure.cl index 1704eb848..f563a1aee 100644 --- a/OpenCL/m17225_a3-pure.cl +++ b/OpenCL/m17225_a3-pure.cl @@ -525,7 +525,7 @@ DECLSPEC int check_inflate_code1 (u8 *next, int left) } } -KERNEL_FQ void m17225_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier @@ -866,7 +866,7 @@ KERNEL_FQ void m17225_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17225_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17225_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17230_a0-pure.cl b/OpenCL/m17230_a0-pure.cl index b9d8e60ed..39d1e022f 100644 --- a/OpenCL/m17230_a0-pure.cl +++ b/OpenCL/m17230_a0-pure.cl @@ -220,7 +220,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier @@ -390,7 +390,7 @@ KERNEL_FQ void m17230_sxx (KERN_ATTR_RULES_ESALT (pkzip_t)) } } -KERNEL_FQ void m17230_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_mxx (KERN_ATTR_RULES_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17230_a1-pure.cl b/OpenCL/m17230_a1-pure.cl index ebeb48768..08dc09322 100644 --- a/OpenCL/m17230_a1-pure.cl +++ b/OpenCL/m17230_a1-pure.cl @@ -218,7 +218,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17230_sxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_sxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier @@ -390,7 +390,7 @@ KERNEL_FQ void m17230_sxx (KERN_ATTR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17230_mxx (KERN_ATTR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_mxx (KERN_ATTR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17230_a3-pure.cl b/OpenCL/m17230_a3-pure.cl index a52dec658..42215c69a 100644 --- a/OpenCL/m17230_a3-pure.cl +++ b/OpenCL/m17230_a3-pure.cl @@ -218,7 +218,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier @@ -404,7 +404,7 @@ KERNEL_FQ void m17230_sxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) } } -KERNEL_FQ void m17230_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) +KERNEL_FQ KERNEL_FA void m17230_mxx (KERN_ATTR_VECTOR_ESALT (pkzip_t)) { /** * modifier diff --git a/OpenCL/m17300_a0-optimized.cl b/OpenCL/m17300_a0-optimized.cl index 0140de8fb..d47fba4c2 100644 --- a/OpenCL/m17300_a0-optimized.cl +++ b/OpenCL/m17300_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17300_a1-optimized.cl b/OpenCL/m17300_a1-optimized.cl index 04d70395a..4e5e9e1fc 100644 --- a/OpenCL/m17300_a1-optimized.cl +++ b/OpenCL/m17300_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17300_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17300_a3-optimized.cl b/OpenCL/m17300_a3-optimized.cl index 4f3c1649e..23f32510c 100644 --- a/OpenCL/m17300_a3-optimized.cl +++ b/OpenCL/m17300_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17300_m04 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17300_m08 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17300_m16 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17300_s04 (KERN_ATTR_BASIC ()) m17300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17300_s08 (KERN_ATTR_BASIC ()) m17300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17300_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17400_a0-optimized.cl b/OpenCL/m17400_a0-optimized.cl index ad517f2dd..b2fb8ce70 100644 --- a/OpenCL/m17400_a0-optimized.cl +++ b/OpenCL/m17400_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17400_a1-optimized.cl b/OpenCL/m17400_a1-optimized.cl index 47b771a47..d20988369 100644 --- a/OpenCL/m17400_a1-optimized.cl +++ b/OpenCL/m17400_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17400_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17400_a3-optimized.cl b/OpenCL/m17400_a3-optimized.cl index ae79bfb14..23e561f36 100644 --- a/OpenCL/m17400_a3-optimized.cl +++ b/OpenCL/m17400_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17400_m04 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17400_m08 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17400_m16 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17400_s04 (KERN_ATTR_BASIC ()) m17400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17400_s08 (KERN_ATTR_BASIC ()) m17400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17400_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17500_a0-optimized.cl b/OpenCL/m17500_a0-optimized.cl index c1f24e1cc..5071b90e7 100644 --- a/OpenCL/m17500_a0-optimized.cl +++ b/OpenCL/m17500_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17500_a1-optimized.cl b/OpenCL/m17500_a1-optimized.cl index cd8ebcef9..eed7bb6c3 100644 --- a/OpenCL/m17500_a1-optimized.cl +++ b/OpenCL/m17500_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17500_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17500_a3-optimized.cl b/OpenCL/m17500_a3-optimized.cl index 488b92236..3103985a7 100644 --- a/OpenCL/m17500_a3-optimized.cl +++ b/OpenCL/m17500_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17500_m04 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17500_m08 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17500_m16 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17500_s04 (KERN_ATTR_BASIC ()) m17500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17500_s08 (KERN_ATTR_BASIC ()) m17500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17500_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17600_a0-optimized.cl b/OpenCL/m17600_a0-optimized.cl index 4a9282398..e34a3607a 100644 --- a/OpenCL/m17600_a0-optimized.cl +++ b/OpenCL/m17600_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17600_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17600_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17600_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17600_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17600_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17600_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17600_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17600_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17600_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17600_a1-optimized.cl b/OpenCL/m17600_a1-optimized.cl index d6ff92ee7..ebf3fc6e8 100644 --- a/OpenCL/m17600_a1-optimized.cl +++ b/OpenCL/m17600_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17600_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17600_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17600_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17600_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17600_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17600_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17600_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17600_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17600_a3-optimized.cl b/OpenCL/m17600_a3-optimized.cl index 13d47d69d..942fdb507 100644 --- a/OpenCL/m17600_a3-optimized.cl +++ b/OpenCL/m17600_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17600s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17600_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17600_m04 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17600_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17600_m08 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17600_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17600_m16 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17600_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17600_s04 (KERN_ATTR_BASIC ()) m17600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17600_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17600_s08 (KERN_ATTR_BASIC ()) m17600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17600_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17600_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17700_a0-optimized.cl b/OpenCL/m17700_a0-optimized.cl index 7d7066f3b..a6b285ca8 100644 --- a/OpenCL/m17700_a0-optimized.cl +++ b/OpenCL/m17700_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17700_a1-optimized.cl b/OpenCL/m17700_a1-optimized.cl index 1a8cf659b..eab16275e 100644 --- a/OpenCL/m17700_a1-optimized.cl +++ b/OpenCL/m17700_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17700_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17700_a3-optimized.cl b/OpenCL/m17700_a3-optimized.cl index 4f2ae86bf..d62f67c91 100644 --- a/OpenCL/m17700_a3-optimized.cl +++ b/OpenCL/m17700_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17700_m04 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17700_m08 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17700_m16 (KERN_ATTR_BASIC ()) m17300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17700_s04 (KERN_ATTR_BASIC ()) m17300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17700_s08 (KERN_ATTR_BASIC ()) m17300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17700_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17800_a0-optimized.cl b/OpenCL/m17800_a0-optimized.cl index ca898956d..53d5dfa50 100644 --- a/OpenCL/m17800_a0-optimized.cl +++ b/OpenCL/m17800_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17800_a1-optimized.cl b/OpenCL/m17800_a1-optimized.cl index 33a90169f..d33b5744f 100644 --- a/OpenCL/m17800_a1-optimized.cl +++ b/OpenCL/m17800_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17800_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17800_a3-optimized.cl b/OpenCL/m17800_a3-optimized.cl index e073b1910..455db7ecd 100644 --- a/OpenCL/m17800_a3-optimized.cl +++ b/OpenCL/m17800_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17400s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17800_m04 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17800_m08 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17800_m16 (KERN_ATTR_BASIC ()) m17400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17800_s04 (KERN_ATTR_BASIC ()) m17400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17800_s08 (KERN_ATTR_BASIC ()) m17400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17800_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m17900_a0-optimized.cl b/OpenCL/m17900_a0-optimized.cl index 42c9e970a..ccd5339eb 100644 --- a/OpenCL/m17900_a0-optimized.cl +++ b/OpenCL/m17900_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m17900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m17900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m17900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m17900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m17900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m17900_a1-optimized.cl b/OpenCL/m17900_a1-optimized.cl index 7c4047ed4..d82ba8721 100644 --- a/OpenCL/m17900_a1-optimized.cl +++ b/OpenCL/m17900_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m17900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m17900_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m17900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m17900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m17900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m17900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m17900_a3-optimized.cl b/OpenCL/m17900_a3-optimized.cl index 58b0211ae..833821819 100644 --- a/OpenCL/m17900_a3-optimized.cl +++ b/OpenCL/m17900_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m17900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m17900_m04 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m17900_m08 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m17900_m16 (KERN_ATTR_BASIC ()) m17500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m17900_s04 (KERN_ATTR_BASIC ()) m17500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m17900_s08 (KERN_ATTR_BASIC ()) m17500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m17900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m17900_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m18000_a0-optimized.cl b/OpenCL/m18000_a0-optimized.cl index 88b9f51d2..e19fbfe35 100644 --- a/OpenCL/m18000_a0-optimized.cl +++ b/OpenCL/m18000_a0-optimized.cl @@ -29,7 +29,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m18000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -239,15 +239,15 @@ KERNEL_FQ void m18000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -469,10 +469,10 @@ KERNEL_FQ void m18000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m18000_a1-optimized.cl b/OpenCL/m18000_a1-optimized.cl index 8600c0f29..3e7108512 100644 --- a/OpenCL/m18000_a1-optimized.cl +++ b/OpenCL/m18000_a1-optimized.cl @@ -27,7 +27,7 @@ CONSTANT_VK u64a keccakf_rndc[24] = #define KECCAK_ROUNDS 24 #endif -KERNEL_FQ void m18000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,15 +296,15 @@ KERNEL_FQ void m18000_m04 (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m18000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -584,10 +584,10 @@ KERNEL_FQ void m18000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m18000_a3-optimized.cl b/OpenCL/m18000_a3-optimized.cl index bb83ec067..c7fec3218 100644 --- a/OpenCL/m18000_a3-optimized.cl +++ b/OpenCL/m18000_a3-optimized.cl @@ -405,7 +405,7 @@ DECLSPEC void m17600s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m18000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -454,7 +454,7 @@ KERNEL_FQ void m18000_m04 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -503,7 +503,7 @@ KERNEL_FQ void m18000_m08 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -552,7 +552,7 @@ KERNEL_FQ void m18000_m16 (KERN_ATTR_BASIC ()) m17600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -601,7 +601,7 @@ KERNEL_FQ void m18000_s04 (KERN_ATTR_BASIC ()) m17600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -650,7 +650,7 @@ KERNEL_FQ void m18000_s08 (KERN_ATTR_BASIC ()) m17600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18000_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m18100_a0-pure.cl b/OpenCL/m18100_a0-pure.cl index 9c8f047a9..4450254ad 100644 --- a/OpenCL/m18100_a0-pure.cl +++ b/OpenCL/m18100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m18100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -93,7 +93,7 @@ KERNEL_FQ void m18100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m18100_a1-pure.cl b/OpenCL/m18100_a1-pure.cl index a596894ca..513080220 100644 --- a/OpenCL/m18100_a1-pure.cl +++ b/OpenCL/m18100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m18100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -116,7 +116,7 @@ KERNEL_FQ void m18100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m18100_a3-pure.cl b/OpenCL/m18100_a3-pure.cl index 70235ce95..b219cf37d 100644 --- a/OpenCL/m18100_a3-pure.cl +++ b/OpenCL/m18100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m18100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -103,7 +103,7 @@ KERNEL_FQ void m18100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m18100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m18200_a0-optimized.cl b/OpenCL/m18200_a0-optimized.cl index 4eee77861..1192c2f87 100644 --- a/OpenCL/m18200_a0-optimized.cl +++ b/OpenCL/m18200_a0-optimized.cl @@ -452,7 +452,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m18200_m04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { /** * modifier @@ -540,15 +540,15 @@ KERNEL_FQ void m18200_m04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_m08 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m08 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_m16 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m16 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_s04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { /** * modifier @@ -636,10 +636,10 @@ KERNEL_FQ void m18200_s04 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_s08 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s08 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_s16 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s16 (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { } diff --git a/OpenCL/m18200_a0-pure.cl b/OpenCL/m18200_a0-pure.cl index f86a48fef..430170c45 100644 --- a/OpenCL/m18200_a0-pure.cl +++ b/OpenCL/m18200_a0-pure.cl @@ -264,7 +264,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m18200_mxx (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_mxx (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { /** * modifier @@ -324,7 +324,7 @@ KERNEL_FQ void m18200_mxx (KERN_ATTR_RULES_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_sxx (KERN_ATTR_RULES_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_sxx (KERN_ATTR_RULES_ESALT (krb5asrep_t)) { /** * modifier diff --git a/OpenCL/m18200_a1-optimized.cl b/OpenCL/m18200_a1-optimized.cl index c710bcbe8..41b6daeb5 100644 --- a/OpenCL/m18200_a1-optimized.cl +++ b/OpenCL/m18200_a1-optimized.cl @@ -450,7 +450,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); } -KERNEL_FQ void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * modifier @@ -587,15 +587,15 @@ KERNEL_FQ void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_m16 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m16 (KERN_ATTR_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * modifier @@ -732,10 +732,10 @@ KERNEL_FQ void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_s16 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s16 (KERN_ATTR_ESALT (krb5asrep_t)) { } diff --git a/OpenCL/m18200_a1-pure.cl b/OpenCL/m18200_a1-pure.cl index 987afb360..9f6023a0d 100644 --- a/OpenCL/m18200_a1-pure.cl +++ b/OpenCL/m18200_a1-pure.cl @@ -262,7 +262,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m18200_mxx (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_mxx (KERN_ATTR_ESALT (krb5asrep_t)) { /** * modifier @@ -320,7 +320,7 @@ KERNEL_FQ void m18200_mxx (KERN_ATTR_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_sxx (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_sxx (KERN_ATTR_ESALT (krb5asrep_t)) { /** * modifier diff --git a/OpenCL/m18200_a3-optimized.cl b/OpenCL/m18200_a3-optimized.cl index c2c2eee7b..5c767e2f5 100644 --- a/OpenCL/m18200_a3-optimized.cl +++ b/OpenCL/m18200_a3-optimized.cl @@ -506,7 +506,7 @@ DECLSPEC void m18200 (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, P } } -KERNEL_FQ void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * base @@ -557,7 +557,7 @@ KERNEL_FQ void m18200_m04 (KERN_ATTR_ESALT (krb5asrep_t)) m18200 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * base @@ -608,11 +608,11 @@ KERNEL_FQ void m18200_m08 (KERN_ATTR_ESALT (krb5asrep_t)) m18200 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18200_m16 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_m16 (KERN_ATTR_ESALT (krb5asrep_t)) { } -KERNEL_FQ void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * base @@ -663,7 +663,7 @@ KERNEL_FQ void m18200_s04 (KERN_ATTR_ESALT (krb5asrep_t)) m18200 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t)) { /** * base @@ -714,6 +714,6 @@ KERNEL_FQ void m18200_s08 (KERN_ATTR_ESALT (krb5asrep_t)) m18200 (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18200_s16 (KERN_ATTR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_s16 (KERN_ATTR_ESALT (krb5asrep_t)) { } diff --git a/OpenCL/m18200_a3-pure.cl b/OpenCL/m18200_a3-pure.cl index b5015406b..30eb42eea 100644 --- a/OpenCL/m18200_a3-pure.cl +++ b/OpenCL/m18200_a3-pure.cl @@ -262,7 +262,7 @@ DECLSPEC void kerb_prepare (PRIVATE_AS const u32 *K, PRIVATE_AS const u32 *check K2[3] = ctx1.opad.h[3]; } -KERNEL_FQ void m18200_mxx (KERN_ATTR_VECTOR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_mxx (KERN_ATTR_VECTOR_ESALT (krb5asrep_t)) { /** * modifier @@ -333,7 +333,7 @@ KERNEL_FQ void m18200_mxx (KERN_ATTR_VECTOR_ESALT (krb5asrep_t)) } } -KERNEL_FQ void m18200_sxx (KERN_ATTR_VECTOR_ESALT (krb5asrep_t)) +KERNEL_FQ KERNEL_FA void m18200_sxx (KERN_ATTR_VECTOR_ESALT (krb5asrep_t)) { /** * modifier diff --git a/OpenCL/m18300-pure.cl b/OpenCL/m18300-pure.cl index d2ecaa88a..1da6951cb 100644 --- a/OpenCL/m18300-pure.cl +++ b/OpenCL/m18300-pure.cl @@ -79,7 +79,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m18300_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m18300_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { /** * base @@ -163,7 +163,7 @@ KERNEL_FQ void m18300_init (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, appl } } -KERNEL_FQ void m18300_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m18300_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { const u64 gid = get_global_id (0); @@ -269,7 +269,7 @@ KERNEL_FQ void m18300_loop (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, appl } } -KERNEL_FQ void m18300_comp (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) +KERNEL_FQ KERNEL_FA void m18300_comp (KERN_ATTR_TMPS_ESALT (apple_secure_notes_tmp_t, apple_secure_notes_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m18400-pure.cl b/OpenCL/m18400-pure.cl index 36c1411f1..59c22df6e 100644 --- a/OpenCL/m18400-pure.cl +++ b/OpenCL/m18400-pure.cl @@ -75,7 +75,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m18400_init (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) +KERNEL_FQ KERNEL_FA void m18400_init (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) { /** * base @@ -180,7 +180,7 @@ KERNEL_FQ void m18400_init (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) } } -KERNEL_FQ void m18400_loop (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) +KERNEL_FQ KERNEL_FA void m18400_loop (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) { const u64 gid = get_global_id (0); @@ -266,7 +266,7 @@ KERNEL_FQ void m18400_loop (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) } } -KERNEL_FQ void m18400_comp (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) +KERNEL_FQ KERNEL_FA void m18400_comp (KERN_ATTR_TMPS_ESALT (odf12_tmp_t, odf12_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m18500_a0-pure.cl b/OpenCL/m18500_a0-pure.cl index dd952ba2e..9d2742b26 100644 --- a/OpenCL/m18500_a0-pure.cl +++ b/OpenCL/m18500_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m18500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -145,7 +145,7 @@ KERNEL_FQ void m18500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m18500_a1-pure.cl b/OpenCL/m18500_a1-pure.cl index a0093926a..0344ef3e7 100644 --- a/OpenCL/m18500_a1-pure.cl +++ b/OpenCL/m18500_a1-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m18500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -144,7 +144,7 @@ KERNEL_FQ void m18500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m18500_a3-pure.cl b/OpenCL/m18500_a3-pure.cl index 9191affa6..ba342c963 100644 --- a/OpenCL/m18500_a3-pure.cl +++ b/OpenCL/m18500_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m18500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -154,7 +154,7 @@ KERNEL_FQ void m18500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m18500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m18600-pure.cl b/OpenCL/m18600-pure.cl index 1e00f6628..54bba75d7 100644 --- a/OpenCL/m18600-pure.cl +++ b/OpenCL/m18600-pure.cl @@ -452,7 +452,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m18600_init (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) +KERNEL_FQ KERNEL_FA void m18600_init (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) { /** * base @@ -554,7 +554,7 @@ KERNEL_FQ void m18600_init (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) tmps[gid].out[4] = tmps[gid].dgst[4]; } -KERNEL_FQ void m18600_loop (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) +KERNEL_FQ KERNEL_FA void m18600_loop (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) { const u64 gid = get_global_id (0); @@ -636,7 +636,7 @@ KERNEL_FQ void m18600_loop (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE_COMP) m18600_comp (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) +KERNEL_FQ KERNEL_FA void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE_COMP) m18600_comp (KERN_ATTR_TMPS_ESALT (odf11_tmp_t, odf11_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m18700_a0-optimized.cl b/OpenCL/m18700_a0-optimized.cl index 0daed2a10..960079b8f 100644 --- a/OpenCL/m18700_a0-optimized.cl +++ b/OpenCL/m18700_a0-optimized.cl @@ -53,7 +53,7 @@ DECLSPEC u32 hashCode (const u32 init, PRIVATE_AS const u32 *w, const u32 pw_len return hash; } -KERNEL_FQ void m18700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -104,15 +104,15 @@ KERNEL_FQ void m18700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -175,10 +175,10 @@ KERNEL_FQ void m18700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m18700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m18700_a0-pure.cl b/OpenCL/m18700_a0-pure.cl index c1841f3c0..d95902f5c 100644 --- a/OpenCL/m18700_a0-pure.cl +++ b/OpenCL/m18700_a0-pure.cl @@ -54,7 +54,7 @@ DECLSPEC u32 hashCode (const u32 init, PRIVATE_AS const u32 *w, const u32 pw_len return hash; } -KERNEL_FQ void m18700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m18700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m18700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m18700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m18700_a1-optimized.cl b/OpenCL/m18700_a1-optimized.cl index 873a601cf..d8c549a0e 100644 --- a/OpenCL/m18700_a1-optimized.cl +++ b/OpenCL/m18700_a1-optimized.cl @@ -53,7 +53,7 @@ DECLSPEC u32 hashCode_g (const u32 init, GLOBAL_AS const u32 *w, const u32 pw_le return hash; } -KERNEL_FQ void m18700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -97,15 +97,15 @@ KERNEL_FQ void m18700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -161,10 +161,10 @@ KERNEL_FQ void m18700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m18700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m18700_a1-pure.cl b/OpenCL/m18700_a1-pure.cl index e8f8f9988..3f16de698 100644 --- a/OpenCL/m18700_a1-pure.cl +++ b/OpenCL/m18700_a1-pure.cl @@ -52,7 +52,7 @@ DECLSPEC u32 hashCode_g (const u32 init, GLOBAL_AS const u32 *w, const u32 pw_le return hash; } -KERNEL_FQ void m18700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -91,7 +91,7 @@ KERNEL_FQ void m18700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m18700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m18700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m18700_a3-optimized.cl b/OpenCL/m18700_a3-optimized.cl index e3aa57ecf..4a3e7b47d 100644 --- a/OpenCL/m18700_a3-optimized.cl +++ b/OpenCL/m18700_a3-optimized.cl @@ -140,7 +140,7 @@ DECLSPEC void m18700s (PRIVATE_AS const u32 *w, const u32 pw_len, KERN_ATTR_FUNC } } -KERNEL_FQ void m18700_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -180,7 +180,7 @@ KERNEL_FQ void m18700_m04 (KERN_ATTR_VECTOR ()) m18700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18700_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -220,7 +220,7 @@ KERNEL_FQ void m18700_m08 (KERN_ATTR_VECTOR ()) m18700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18700_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -260,7 +260,7 @@ KERNEL_FQ void m18700_m16 (KERN_ATTR_VECTOR ()) m18700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18700_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -300,7 +300,7 @@ KERNEL_FQ void m18700_s04 (KERN_ATTR_VECTOR ()) m18700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18700_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -340,7 +340,7 @@ KERNEL_FQ void m18700_s08 (KERN_ATTR_VECTOR ()) m18700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m18700_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m18700_a3-pure.cl b/OpenCL/m18700_a3-pure.cl index cb1407e94..52d2fcd66 100644 --- a/OpenCL/m18700_a3-pure.cl +++ b/OpenCL/m18700_a3-pure.cl @@ -70,7 +70,7 @@ DECLSPEC u32x hashCode_w0 (const u32x init, const u32x w0, PRIVATE_AS const u32 return hash; } -KERNEL_FQ void m18700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -117,7 +117,7 @@ KERNEL_FQ void m18700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m18700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m18700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m18800-pure.cl b/OpenCL/m18800-pure.cl index 93ebf5aca..17c7d1c51 100644 --- a/OpenCL/m18800-pure.cl +++ b/OpenCL/m18800-pure.cl @@ -23,7 +23,7 @@ typedef struct bsp_tmp } bsp_tmp_t; -KERNEL_FQ void m18800_init (KERN_ATTR_TMPS (bsp_tmp_t)) +KERNEL_FQ KERNEL_FA void m18800_init (KERN_ATTR_TMPS (bsp_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m18800_init (KERN_ATTR_TMPS (bsp_tmp_t)) tmps[gid].hash[7] = ctx.h[7]; } -KERNEL_FQ void m18800_loop (KERN_ATTR_TMPS (bsp_tmp_t)) +KERNEL_FQ KERNEL_FA void m18800_loop (KERN_ATTR_TMPS (bsp_tmp_t)) { const u64 gid = get_global_id (0); @@ -116,7 +116,7 @@ KERNEL_FQ void m18800_loop (KERN_ATTR_TMPS (bsp_tmp_t)) unpackv (tmps, hash, gid, 7, digest[7]); } -KERNEL_FQ void m18800_comp (KERN_ATTR_TMPS (bsp_tmp_t)) +KERNEL_FQ KERNEL_FA void m18800_comp (KERN_ATTR_TMPS (bsp_tmp_t)) { /** * modifier diff --git a/OpenCL/m18900-pure.cl b/OpenCL/m18900-pure.cl index 707ba438c..d88f31e01 100644 --- a/OpenCL/m18900-pure.cl +++ b/OpenCL/m18900-pure.cl @@ -76,7 +76,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m18900_init (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) +KERNEL_FQ KERNEL_FA void m18900_init (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) { /** * base @@ -148,7 +148,7 @@ KERNEL_FQ void m18900_init (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_ } } -KERNEL_FQ void m18900_loop (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) +KERNEL_FQ KERNEL_FA void m18900_loop (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) { const u64 gid = get_global_id (0); @@ -233,7 +233,7 @@ KERNEL_FQ void m18900_loop (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_ } } -KERNEL_FQ void m18900_comp (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) +KERNEL_FQ KERNEL_FA void m18900_comp (KERN_ATTR_TMPS_ESALT (android_backup_tmp_t, android_backup_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m19000-pure.cl b/OpenCL/m19000-pure.cl index 42ee3dd54..fc234dc1a 100644 --- a/OpenCL/m19000-pure.cl +++ b/OpenCL/m19000-pure.cl @@ -23,7 +23,7 @@ typedef struct qnx_md5_tmp } qnx_md5_tmp_t; -KERNEL_FQ void m19000_init (KERN_ATTR_TMPS (qnx_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m19000_init (KERN_ATTR_TMPS (qnx_md5_tmp_t)) { /** * base @@ -37,18 +37,36 @@ KERNEL_FQ void m19000_init (KERN_ATTR_TMPS (qnx_md5_tmp_t)) * init */ + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + md5_ctx_t md5_ctx; md5_init (&md5_ctx); - md5_update_global (&md5_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + md5_update (&md5_ctx, s, salt_len); - md5_update_global (&md5_ctx, pws[gid].i, pws[gid].pw_len); + md5_update (&md5_ctx, w, pw_len); tmps[gid].md5_ctx = md5_ctx; } -KERNEL_FQ void m19000_loop (KERN_ATTR_TMPS (qnx_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m19000_loop (KERN_ATTR_TMPS (qnx_md5_tmp_t)) { /** * base @@ -58,17 +76,26 @@ KERNEL_FQ void m19000_loop (KERN_ATTR_TMPS (qnx_md5_tmp_t)) if (gid >= GID_CNT) return; + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + md5_ctx_t md5_ctx = tmps[gid].md5_ctx; for (u32 i = 0; i < LOOP_CNT; i++) { - md5_update_global (&md5_ctx, pws[gid].i, pws[gid].pw_len); + md5_update (&md5_ctx, w, pw_len); } tmps[gid].md5_ctx = md5_ctx; } -KERNEL_FQ void m19000_comp (KERN_ATTR_TMPS (qnx_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m19000_comp (KERN_ATTR_TMPS (qnx_md5_tmp_t)) { /** * modifier diff --git a/OpenCL/m19100-pure.cl b/OpenCL/m19100-pure.cl index 64b402b6e..f94d0464a 100644 --- a/OpenCL/m19100-pure.cl +++ b/OpenCL/m19100-pure.cl @@ -23,7 +23,7 @@ typedef struct qnx_sha256_tmp } qnx_sha256_tmp_t; -KERNEL_FQ void m19100_init (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m19100_init (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) { /** * base @@ -37,18 +37,36 @@ KERNEL_FQ void m19100_init (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) * init */ + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = hc_swap32_S (pws[gid].i[idx]); + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + sha256_ctx_t sha256_ctx; sha256_init (&sha256_ctx); - sha256_update_global_swap (&sha256_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + sha256_update (&sha256_ctx, s, salt_len); - sha256_update_global_swap (&sha256_ctx, pws[gid].i, pws[gid].pw_len); + sha256_update (&sha256_ctx, w, pw_len); tmps[gid].sha256_ctx = sha256_ctx; } -KERNEL_FQ void m19100_loop (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m19100_loop (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) { /** * base @@ -58,17 +76,26 @@ KERNEL_FQ void m19100_loop (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) if (gid >= GID_CNT) return; + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = hc_swap32_S (pws[gid].i[idx]); + } + sha256_ctx_t sha256_ctx = tmps[gid].sha256_ctx; for (u32 i = 0; i < LOOP_CNT; i++) { - sha256_update_global_swap (&sha256_ctx, pws[gid].i, pws[gid].pw_len); + sha256_update (&sha256_ctx, w, pw_len); } tmps[gid].sha256_ctx = sha256_ctx; } -KERNEL_FQ void m19100_comp (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m19100_comp (KERN_ATTR_TMPS (qnx_sha256_tmp_t)) { /** * modifier diff --git a/OpenCL/m19200-pure.cl b/OpenCL/m19200-pure.cl index 4d62da229..58eb69d1c 100644 --- a/OpenCL/m19200-pure.cl +++ b/OpenCL/m19200-pure.cl @@ -155,7 +155,7 @@ DECLSPEC u32 sha512_update_128_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, PRIVATE_AS return sav; } -DECLSPEC u32 sha512_update_global_swap_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len, u32 sav) +DECLSPEC u32 sha512_update_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len, u32 sav) { u32 w0[4]; u32 w1[4]; @@ -204,39 +204,6 @@ DECLSPEC u32 sha512_update_global_swap_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, GLO w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; - w0[0] = hc_swap32_S (w0[0]); - w0[1] = hc_swap32_S (w0[1]); - w0[2] = hc_swap32_S (w0[2]); - w0[3] = hc_swap32_S (w0[3]); - w1[0] = hc_swap32_S (w1[0]); - w1[1] = hc_swap32_S (w1[1]); - w1[2] = hc_swap32_S (w1[2]); - w1[3] = hc_swap32_S (w1[3]); - w2[0] = hc_swap32_S (w2[0]); - w2[1] = hc_swap32_S (w2[1]); - w2[2] = hc_swap32_S (w2[2]); - w2[3] = hc_swap32_S (w2[3]); - w3[0] = hc_swap32_S (w3[0]); - w3[1] = hc_swap32_S (w3[1]); - w3[2] = hc_swap32_S (w3[2]); - w3[3] = hc_swap32_S (w3[3]); - w4[0] = hc_swap32_S (w4[0]); - w4[1] = hc_swap32_S (w4[1]); - w4[2] = hc_swap32_S (w4[2]); - w4[3] = hc_swap32_S (w4[3]); - w5[0] = hc_swap32_S (w5[0]); - w5[1] = hc_swap32_S (w5[1]); - w5[2] = hc_swap32_S (w5[2]); - w5[3] = hc_swap32_S (w5[3]); - w6[0] = hc_swap32_S (w6[0]); - w6[1] = hc_swap32_S (w6[1]); - w6[2] = hc_swap32_S (w6[2]); - w6[3] = hc_swap32_S (w6[3]); - w7[0] = hc_swap32_S (w7[0]); - w7[1] = hc_swap32_S (w7[1]); - w7[2] = hc_swap32_S (w7[2]); - w7[3] = hc_swap32_S (w7[3]); - sav = sha512_update_128_qnxbug (ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128, sav); } @@ -273,39 +240,6 @@ DECLSPEC u32 sha512_update_global_swap_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, GLO w7[2] = w[pos4 + 30]; w7[3] = w[pos4 + 31]; - w0[0] = hc_swap32_S (w0[0]); - w0[1] = hc_swap32_S (w0[1]); - w0[2] = hc_swap32_S (w0[2]); - w0[3] = hc_swap32_S (w0[3]); - w1[0] = hc_swap32_S (w1[0]); - w1[1] = hc_swap32_S (w1[1]); - w1[2] = hc_swap32_S (w1[2]); - w1[3] = hc_swap32_S (w1[3]); - w2[0] = hc_swap32_S (w2[0]); - w2[1] = hc_swap32_S (w2[1]); - w2[2] = hc_swap32_S (w2[2]); - w2[3] = hc_swap32_S (w2[3]); - w3[0] = hc_swap32_S (w3[0]); - w3[1] = hc_swap32_S (w3[1]); - w3[2] = hc_swap32_S (w3[2]); - w3[3] = hc_swap32_S (w3[3]); - w4[0] = hc_swap32_S (w4[0]); - w4[1] = hc_swap32_S (w4[1]); - w4[2] = hc_swap32_S (w4[2]); - w4[3] = hc_swap32_S (w4[3]); - w5[0] = hc_swap32_S (w5[0]); - w5[1] = hc_swap32_S (w5[1]); - w5[2] = hc_swap32_S (w5[2]); - w5[3] = hc_swap32_S (w5[3]); - w6[0] = hc_swap32_S (w6[0]); - w6[1] = hc_swap32_S (w6[1]); - w6[2] = hc_swap32_S (w6[2]); - w6[3] = hc_swap32_S (w6[3]); - w7[0] = hc_swap32_S (w7[0]); - w7[1] = hc_swap32_S (w7[1]); - w7[2] = hc_swap32_S (w7[2]); - w7[3] = hc_swap32_S (w7[3]); - sav = sha512_update_128_qnxbug (ctx, w0, w1, w2, w3, w4, w5, w6, w7, len - pos1, sav); return sav; @@ -364,7 +298,7 @@ DECLSPEC void sha512_final_qnxbug (PRIVATE_AS sha512_ctx_t *ctx, u32 sav) sha512_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->w4, ctx->w5, ctx->w6, ctx->w7, ctx->h); } -KERNEL_FQ void m19200_init (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m19200_init (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) { /** * base @@ -382,15 +316,33 @@ KERNEL_FQ void m19200_init (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) sha512_init (&sha512_ctx); - sha512_update_global_swap (&sha512_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + const u32 pw_len = pws[gid].pw_len; - sha512_update_global_swap (&sha512_ctx, pws[gid].i, pws[gid].pw_len); + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = hc_swap32_S (pws[gid].i[idx]); + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha512_update (&sha512_ctx, s, salt_len); + + sha512_update (&sha512_ctx, w, pw_len); tmps[gid].sha512_ctx = sha512_ctx; tmps[gid].sav = 0; } -KERNEL_FQ void m19200_loop (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m19200_loop (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) { /** * base @@ -400,19 +352,28 @@ KERNEL_FQ void m19200_loop (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) if (gid >= GID_CNT) return; + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = hc_swap32_S (pws[gid].i[idx]); + } + sha512_ctx_t sha512_ctx = tmps[gid].sha512_ctx; u32 sav = tmps[gid].sav; for (u32 i = 0; i < LOOP_CNT; i++) { - sav = sha512_update_global_swap_qnxbug (&sha512_ctx, pws[gid].i, pws[gid].pw_len, sav); + sav = sha512_update_qnxbug (&sha512_ctx, w, pw_len, sav); } tmps[gid].sha512_ctx = sha512_ctx; tmps[gid].sav = sav; } -KERNEL_FQ void m19200_comp (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m19200_comp (KERN_ATTR_TMPS (qnx_sha512_tmp_t)) { /** * modifier diff --git a/OpenCL/m19300_a0-pure.cl b/OpenCL/m19300_a0-pure.cl index a08b85c9e..2461ebc46 100644 --- a/OpenCL/m19300_a0-pure.cl +++ b/OpenCL/m19300_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m19300_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) { /** * modifier @@ -85,7 +85,7 @@ KERNEL_FQ void m19300_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m19300_sxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_sxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m19300_a1-pure.cl b/OpenCL/m19300_a1-pure.cl index 236844816..0aede4dce 100644 --- a/OpenCL/m19300_a1-pure.cl +++ b/OpenCL/m19300_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m19300_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) { /** * modifier @@ -79,7 +79,7 @@ KERNEL_FQ void m19300_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m19300_sxx (KERN_ATTR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_sxx (KERN_ATTR_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m19300_a3-pure.cl b/OpenCL/m19300_a3-pure.cl index 2ad916d35..bfea266e9 100644 --- a/OpenCL/m19300_a3-pure.cl +++ b/OpenCL/m19300_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m19300_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) { /** * modifier @@ -96,7 +96,7 @@ KERNEL_FQ void m19300_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m19300_sxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m19300_sxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m19500_a0-pure.cl b/OpenCL/m19500_a0-pure.cl index 01c8b2279..d28bbc7aa 100644 --- a/OpenCL/m19500_a0-pure.cl +++ b/OpenCL/m19500_a0-pure.cl @@ -38,7 +38,7 @@ typedef struct devise_hash #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m19500_mxx (KERN_ATTR_RULES_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_mxx (KERN_ATTR_RULES_ESALT (devise_hash_t)) { /** * modifier @@ -173,7 +173,7 @@ KERNEL_FQ void m19500_mxx (KERN_ATTR_RULES_ESALT (devise_hash_t)) } } -KERNEL_FQ void m19500_sxx (KERN_ATTR_RULES_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_sxx (KERN_ATTR_RULES_ESALT (devise_hash_t)) { /** * modifier diff --git a/OpenCL/m19500_a1-pure.cl b/OpenCL/m19500_a1-pure.cl index 5b5afaadd..62c6f60f2 100644 --- a/OpenCL/m19500_a1-pure.cl +++ b/OpenCL/m19500_a1-pure.cl @@ -36,7 +36,7 @@ typedef struct devise_hash #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m19500_mxx (KERN_ATTR_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_mxx (KERN_ATTR_ESALT (devise_hash_t)) { /** * modifier @@ -167,7 +167,7 @@ KERNEL_FQ void m19500_mxx (KERN_ATTR_ESALT (devise_hash_t)) } } -KERNEL_FQ void m19500_sxx (KERN_ATTR_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_sxx (KERN_ATTR_ESALT (devise_hash_t)) { /** * modifier diff --git a/OpenCL/m19500_a3-pure.cl b/OpenCL/m19500_a3-pure.cl index 1efdb7af2..1e63bf291 100644 --- a/OpenCL/m19500_a3-pure.cl +++ b/OpenCL/m19500_a3-pure.cl @@ -36,7 +36,7 @@ typedef struct devise_hash #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m19500_mxx (KERN_ATTR_VECTOR_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_mxx (KERN_ATTR_VECTOR_ESALT (devise_hash_t)) { /** * modifier @@ -182,7 +182,7 @@ KERNEL_FQ void m19500_mxx (KERN_ATTR_VECTOR_ESALT (devise_hash_t)) } } -KERNEL_FQ void m19500_sxx (KERN_ATTR_VECTOR_ESALT (devise_hash_t)) +KERNEL_FQ KERNEL_FA void m19500_sxx (KERN_ATTR_VECTOR_ESALT (devise_hash_t)) { /** * modifier diff --git a/OpenCL/m19600-pure.cl b/OpenCL/m19600-pure.cl index 916b79a84..d5924dc7e 100644 --- a/OpenCL/m19600-pure.cl +++ b/OpenCL/m19600-pure.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m19600_init (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) +KERNEL_FQ KERNEL_FA void m19600_init (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m19600_init (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t } } -KERNEL_FQ void m19600_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) +KERNEL_FQ KERNEL_FA void m19600_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) { /** * base @@ -281,7 +281,7 @@ KERNEL_FQ void m19600_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t } } -KERNEL_FQ void m19600_comp (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) +KERNEL_FQ KERNEL_FA void m19600_comp (KERN_ATTR_TMPS_ESALT (krb5tgs_17_tmp_t, krb5tgs_17_t)) { /** * base diff --git a/OpenCL/m19700-pure.cl b/OpenCL/m19700-pure.cl index c3346bdc5..4584ff380 100644 --- a/OpenCL/m19700-pure.cl +++ b/OpenCL/m19700-pure.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m19700_init (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) +KERNEL_FQ KERNEL_FA void m19700_init (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m19700_init (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t } } -KERNEL_FQ void m19700_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) +KERNEL_FQ KERNEL_FA void m19700_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) { /** * base @@ -281,7 +281,7 @@ KERNEL_FQ void m19700_loop (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t } } -KERNEL_FQ void m19700_comp (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) +KERNEL_FQ KERNEL_FA void m19700_comp (KERN_ATTR_TMPS_ESALT (krb5tgs_18_tmp_t, krb5tgs_18_t)) { /** * base diff --git a/OpenCL/m19800-pure.cl b/OpenCL/m19800-pure.cl index 91ec5592c..c3d0d6129 100644 --- a/OpenCL/m19800-pure.cl +++ b/OpenCL/m19800-pure.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m19800_init (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) +KERNEL_FQ KERNEL_FA void m19800_init (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m19800_init (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) } } -KERNEL_FQ void m19800_loop (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) +KERNEL_FQ KERNEL_FA void m19800_loop (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) { /** * base @@ -281,7 +281,7 @@ KERNEL_FQ void m19800_loop (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) } } -KERNEL_FQ void m19800_comp (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) +KERNEL_FQ KERNEL_FA void m19800_comp (KERN_ATTR_TMPS_ESALT (krb5pa_17_tmp_t, krb5pa_17_t)) { /** * base diff --git a/OpenCL/m19900-pure.cl b/OpenCL/m19900-pure.cl index 05579ee15..301939dde 100644 --- a/OpenCL/m19900-pure.cl +++ b/OpenCL/m19900-pure.cl @@ -115,7 +115,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m19900_init (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) +KERNEL_FQ KERNEL_FA void m19900_init (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m19900_init (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) } } -KERNEL_FQ void m19900_loop (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) +KERNEL_FQ KERNEL_FA void m19900_loop (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) { /** * base @@ -282,7 +282,7 @@ KERNEL_FQ void m19900_loop (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) } } -KERNEL_FQ void m19900_comp (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) +KERNEL_FQ KERNEL_FA void m19900_comp (KERN_ATTR_TMPS_ESALT (krb5pa_18_tmp_t, krb5pa_18_t)) { /** * base diff --git a/OpenCL/m20011-pure.cl b/OpenCL/m20011-pure.cl index dc40f80c3..ca1e785c8 100644 --- a/OpenCL/m20011-pure.cl +++ b/OpenCL/m20011-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m20011_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20011_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { /** * base @@ -196,7 +196,7 @@ KERNEL_FQ void m20011_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20011_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20011_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); @@ -322,7 +322,7 @@ KERNEL_FQ void m20011_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20011_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20011_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m20012-pure.cl b/OpenCL/m20012-pure.cl index 8966e60ca..f5cb9fff5 100644 --- a/OpenCL/m20012-pure.cl +++ b/OpenCL/m20012-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m20012_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20012_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { /** * base @@ -196,7 +196,7 @@ KERNEL_FQ void m20012_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20012_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20012_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); @@ -322,7 +322,7 @@ KERNEL_FQ void m20012_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20012_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20012_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m20013-pure.cl b/OpenCL/m20013-pure.cl index a26269980..ebb610504 100644 --- a/OpenCL/m20013-pure.cl +++ b/OpenCL/m20013-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m20013_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20013_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { /** * base @@ -196,7 +196,7 @@ KERNEL_FQ void m20013_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20013_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20013_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); @@ -322,7 +322,7 @@ KERNEL_FQ void m20013_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcrypt } } -KERNEL_FQ void m20013_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) +KERNEL_FQ KERNEL_FA void m20013_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, diskcryptor_esalt_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m20500_a0-pure.cl b/OpenCL/m20500_a0-pure.cl index 7ab1ca4fa..f9a112314 100644 --- a/OpenCL/m20500_a0-pure.cl +++ b/OpenCL/m20500_a0-pure.cl @@ -151,7 +151,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m20500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20500_sxx (KERN_ATTR_RULES ()) { /** * modifier @@ -225,7 +225,7 @@ KERNEL_FQ void m20500_sxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20500_mxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20500_a1-pure.cl b/OpenCL/m20500_a1-pure.cl index 541b3cc6b..687d6d2f8 100644 --- a/OpenCL/m20500_a1-pure.cl +++ b/OpenCL/m20500_a1-pure.cl @@ -149,7 +149,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m20500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20500_sxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -225,7 +225,7 @@ KERNEL_FQ void m20500_sxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20500_mxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20500_a3-pure.cl b/OpenCL/m20500_a3-pure.cl index e7a9f137c..eb33dda6d 100644 --- a/OpenCL/m20500_a3-pure.cl +++ b/OpenCL/m20500_a3-pure.cl @@ -245,7 +245,7 @@ CONSTANT_VK u32a crc32tab[256] = 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; -KERNEL_FQ void m20500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -359,7 +359,7 @@ KERNEL_FQ void m20500_sxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20510_a0-pure.cl b/OpenCL/m20510_a0-pure.cl index 59f088764..aa031c31a 100644 --- a/OpenCL/m20510_a0-pure.cl +++ b/OpenCL/m20510_a0-pure.cl @@ -465,7 +465,7 @@ DECLSPEC int derivelast6bytes (const u32x k0, const u32x k1, const u32x k2, PRIV return 0; } -KERNEL_FQ void m20510_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20510_sxx (KERN_ATTR_RULES ()) { /** * modifier @@ -581,7 +581,7 @@ KERNEL_FQ void m20510_sxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20510_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20510_mxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20510_a1-pure.cl b/OpenCL/m20510_a1-pure.cl index d0dc121fe..80d97e94f 100644 --- a/OpenCL/m20510_a1-pure.cl +++ b/OpenCL/m20510_a1-pure.cl @@ -463,7 +463,7 @@ DECLSPEC int derivelast6bytes (const u32x k0, const u32x k1, const u32x k2, PRIV return 0; } -KERNEL_FQ void m20510_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20510_sxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -585,7 +585,7 @@ KERNEL_FQ void m20510_sxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20510_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20510_mxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20510_a3-pure.cl b/OpenCL/m20510_a3-pure.cl index e2c6fc406..34ea3c6c4 100644 --- a/OpenCL/m20510_a3-pure.cl +++ b/OpenCL/m20510_a3-pure.cl @@ -463,7 +463,7 @@ DECLSPEC int derivelast6bytes (const u32x k0, const u32x k1, const u32x k2, PRIV return 0; } -KERNEL_FQ void m20510_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20510_sxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -604,7 +604,7 @@ KERNEL_FQ void m20510_sxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20510_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20510_mxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20600-pure.cl b/OpenCL/m20600-pure.cl index 1373bb96c..1927af091 100644 --- a/OpenCL/m20600-pure.cl +++ b/OpenCL/m20600-pure.cl @@ -25,7 +25,7 @@ typedef struct omt_sha256_tmp } omt_sha256_tmp_t; -KERNEL_FQ void m20600_init (KERN_ATTR_TMPS (omt_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m20600_init (KERN_ATTR_TMPS (omt_sha256_tmp_t)) { /** * base @@ -59,7 +59,7 @@ KERNEL_FQ void m20600_init (KERN_ATTR_TMPS (omt_sha256_tmp_t)) tmps[gid].digest_buf[7] = sha256_ctx.h[7]; } -KERNEL_FQ void m20600_loop (KERN_ATTR_TMPS (omt_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m20600_loop (KERN_ATTR_TMPS (omt_sha256_tmp_t)) { /** * base @@ -135,7 +135,7 @@ KERNEL_FQ void m20600_loop (KERN_ATTR_TMPS (omt_sha256_tmp_t)) unpackv (tmps, digest_buf, gid, 7, digest[7]); } -KERNEL_FQ void m20600_comp (KERN_ATTR_TMPS (omt_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m20600_comp (KERN_ATTR_TMPS (omt_sha256_tmp_t)) { /** * modifier diff --git a/OpenCL/m20710_a0-optimized.cl b/OpenCL/m20710_a0-optimized.cl index f5385d316..ebf87bf3e 100644 --- a/OpenCL/m20710_a0-optimized.cl +++ b/OpenCL/m20710_a0-optimized.cl @@ -42,7 +42,7 @@ h = 0; \ } -KERNEL_FQ void m20710_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -620,15 +620,15 @@ KERNEL_FQ void m20710_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20710_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20710_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20710_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1224,10 +1224,10 @@ KERNEL_FQ void m20710_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20710_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20710_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m20710_a0-pure.cl b/OpenCL/m20710_a0-pure.cl index 47ef8c683..a70bb5527 100644 --- a/OpenCL/m20710_a0-pure.cl +++ b/OpenCL/m20710_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20710_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m20710_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20710_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20710_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20710_a1-optimized.cl b/OpenCL/m20710_a1-optimized.cl index 044720593..7fb3745af 100644 --- a/OpenCL/m20710_a1-optimized.cl +++ b/OpenCL/m20710_a1-optimized.cl @@ -40,7 +40,7 @@ h = 0; \ } -KERNEL_FQ void m20710_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -676,15 +676,15 @@ KERNEL_FQ void m20710_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20710_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20710_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20710_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1338,10 +1338,10 @@ KERNEL_FQ void m20710_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20710_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20710_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m20710_a1-pure.cl b/OpenCL/m20710_a1-pure.cl index f2a6ac7d8..e79ea916a 100644 --- a/OpenCL/m20710_a1-pure.cl +++ b/OpenCL/m20710_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20710_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -136,7 +136,7 @@ KERNEL_FQ void m20710_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20710_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20710_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20710_a3-optimized.cl b/OpenCL/m20710_a3-optimized.cl index ab959ef93..3f85a2413 100644 --- a/OpenCL/m20710_a3-optimized.cl +++ b/OpenCL/m20710_a3-optimized.cl @@ -1123,7 +1123,7 @@ DECLSPEC void m20710s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m20710_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -1184,7 +1184,7 @@ KERNEL_FQ void m20710_m04 (KERN_ATTR_VECTOR ()) m20710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20710_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -1245,7 +1245,7 @@ KERNEL_FQ void m20710_m08 (KERN_ATTR_VECTOR ()) m20710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20710_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -1306,7 +1306,7 @@ KERNEL_FQ void m20710_m16 (KERN_ATTR_VECTOR ()) m20710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20710_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -1367,7 +1367,7 @@ KERNEL_FQ void m20710_s04 (KERN_ATTR_VECTOR ()) m20710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20710_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -1428,7 +1428,7 @@ KERNEL_FQ void m20710_s08 (KERN_ATTR_VECTOR ()) m20710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20710_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m20710_a3-pure.cl b/OpenCL/m20710_a3-pure.cl index e17cb76e9..08bc4157a 100644 --- a/OpenCL/m20710_a3-pure.cl +++ b/OpenCL/m20710_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20710_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -149,7 +149,7 @@ KERNEL_FQ void m20710_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20710_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20710_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20712_a0-optimized.cl b/OpenCL/m20712_a0-optimized.cl index 48f5e9463..3ff867c7f 100644 --- a/OpenCL/m20712_a0-optimized.cl +++ b/OpenCL/m20712_a0-optimized.cl @@ -42,7 +42,7 @@ h = 0; \ } -KERNEL_FQ void m20712_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -620,15 +620,15 @@ KERNEL_FQ void m20712_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20712_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20712_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20712_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1224,10 +1224,10 @@ KERNEL_FQ void m20712_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20712_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20712_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m20712_a0-pure.cl b/OpenCL/m20712_a0-pure.cl index 4ec9014e3..ae9cadb18 100644 --- a/OpenCL/m20712_a0-pure.cl +++ b/OpenCL/m20712_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20712_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m20712_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20712_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20712_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20712_a1-optimized.cl b/OpenCL/m20712_a1-optimized.cl index b1088a630..3979e8e73 100644 --- a/OpenCL/m20712_a1-optimized.cl +++ b/OpenCL/m20712_a1-optimized.cl @@ -40,7 +40,7 @@ h = 0; \ } -KERNEL_FQ void m20712_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -676,15 +676,15 @@ KERNEL_FQ void m20712_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20712_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20712_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20712_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1338,10 +1338,10 @@ KERNEL_FQ void m20712_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20712_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20712_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m20712_a1-pure.cl b/OpenCL/m20712_a1-pure.cl index b713e2eca..8bb18c4c1 100644 --- a/OpenCL/m20712_a1-pure.cl +++ b/OpenCL/m20712_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20712_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -136,7 +136,7 @@ KERNEL_FQ void m20712_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20712_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20712_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20712_a3-optimized.cl b/OpenCL/m20712_a3-optimized.cl index 2814cbe69..8008a7a93 100644 --- a/OpenCL/m20712_a3-optimized.cl +++ b/OpenCL/m20712_a3-optimized.cl @@ -1123,7 +1123,7 @@ DECLSPEC void m20712s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m20712_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -1184,7 +1184,7 @@ KERNEL_FQ void m20712_m04 (KERN_ATTR_VECTOR ()) m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20712_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -1245,7 +1245,7 @@ KERNEL_FQ void m20712_m08 (KERN_ATTR_VECTOR ()) m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20712_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -1306,7 +1306,7 @@ KERNEL_FQ void m20712_m16 (KERN_ATTR_VECTOR ()) m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20712_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -1367,7 +1367,7 @@ KERNEL_FQ void m20712_s04 (KERN_ATTR_VECTOR ()) m20712s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20712_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -1428,7 +1428,7 @@ KERNEL_FQ void m20712_s08 (KERN_ATTR_VECTOR ()) m20712s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20712_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m20712_a3-pure.cl b/OpenCL/m20712_a3-pure.cl index 908b8ca2d..715441e84 100644 --- a/OpenCL/m20712_a3-pure.cl +++ b/OpenCL/m20712_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20712_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -149,7 +149,7 @@ KERNEL_FQ void m20712_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20712_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20712_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20720_a0-pure.cl b/OpenCL/m20720_a0-pure.cl index a25d65181..558f4f298 100644 --- a/OpenCL/m20720_a0-pure.cl +++ b/OpenCL/m20720_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20720_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20720_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m20720_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20720_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20720_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20720_a1-pure.cl b/OpenCL/m20720_a1-pure.cl index 82ebdb8d2..534b2b46b 100644 --- a/OpenCL/m20720_a1-pure.cl +++ b/OpenCL/m20720_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20720_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20720_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -136,7 +136,7 @@ KERNEL_FQ void m20720_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20720_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20720_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20720_a3-pure.cl b/OpenCL/m20720_a3-pure.cl index 0caa7bd4f..0a02220e5 100644 --- a/OpenCL/m20720_a3-pure.cl +++ b/OpenCL/m20720_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20720_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20720_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -149,7 +149,7 @@ KERNEL_FQ void m20720_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20720_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20720_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20730_a0-pure.cl b/OpenCL/m20730_a0-pure.cl index 76589f18a..e87187d91 100644 --- a/OpenCL/m20730_a0-pure.cl +++ b/OpenCL/m20730_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20730_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20730_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -134,7 +134,7 @@ KERNEL_FQ void m20730_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20730_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20730_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20730_a1-pure.cl b/OpenCL/m20730_a1-pure.cl index 1bc541c88..1971c359f 100644 --- a/OpenCL/m20730_a1-pure.cl +++ b/OpenCL/m20730_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20730_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20730_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m20730_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20730_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20730_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20730_a3-pure.cl b/OpenCL/m20730_a3-pure.cl index 4f1f670c9..9c1b3654a 100644 --- a/OpenCL/m20730_a3-pure.cl +++ b/OpenCL/m20730_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20730_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20730_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -148,7 +148,7 @@ KERNEL_FQ void m20730_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20730_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20730_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20800_a0-optimized.cl b/OpenCL/m20800_a0-optimized.cl index 2eca0f810..bc46b754c 100644 --- a/OpenCL/m20800_a0-optimized.cl +++ b/OpenCL/m20800_a0-optimized.cl @@ -43,7 +43,7 @@ h = 0; \ } -KERNEL_FQ void m20800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -306,15 +306,15 @@ KERNEL_FQ void m20800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -610,10 +610,10 @@ KERNEL_FQ void m20800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m20800_a0-pure.cl b/OpenCL/m20800_a0-pure.cl index c9254e633..69aad87a1 100644 --- a/OpenCL/m20800_a0-pure.cl +++ b/OpenCL/m20800_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -130,7 +130,7 @@ KERNEL_FQ void m20800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20800_a1-optimized.cl b/OpenCL/m20800_a1-optimized.cl index fa01e62d3..8af3c5d8f 100644 --- a/OpenCL/m20800_a1-optimized.cl +++ b/OpenCL/m20800_a1-optimized.cl @@ -41,7 +41,7 @@ h = 0; \ } -KERNEL_FQ void m20800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -359,15 +359,15 @@ KERNEL_FQ void m20800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -718,10 +718,10 @@ KERNEL_FQ void m20800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m20800_a1-pure.cl b/OpenCL/m20800_a1-pure.cl index b2594147b..b7141405e 100644 --- a/OpenCL/m20800_a1-pure.cl +++ b/OpenCL/m20800_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -126,7 +126,7 @@ KERNEL_FQ void m20800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20800_a3-optimized.cl b/OpenCL/m20800_a3-optimized.cl index 3523584a9..8953d20a1 100644 --- a/OpenCL/m20800_a3-optimized.cl +++ b/OpenCL/m20800_a3-optimized.cl @@ -540,7 +540,7 @@ DECLSPEC void m20800s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m20800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -610,7 +610,7 @@ KERNEL_FQ void m20800_m04 (KERN_ATTR_BASIC ()) m20800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -680,7 +680,7 @@ KERNEL_FQ void m20800_m08 (KERN_ATTR_BASIC ()) m20800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -750,7 +750,7 @@ KERNEL_FQ void m20800_m16 (KERN_ATTR_BASIC ()) m20800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -820,7 +820,7 @@ KERNEL_FQ void m20800_s04 (KERN_ATTR_BASIC ()) m20800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -890,7 +890,7 @@ KERNEL_FQ void m20800_s08 (KERN_ATTR_BASIC ()) m20800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20800_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m20800_a3-pure.cl b/OpenCL/m20800_a3-pure.cl index f0bb42691..0295e6a8e 100644 --- a/OpenCL/m20800_a3-pure.cl +++ b/OpenCL/m20800_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -139,7 +139,7 @@ KERNEL_FQ void m20800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m20900_a0-optimized.cl b/OpenCL/m20900_a0-optimized.cl index 3ab829071..428a2ee3d 100644 --- a/OpenCL/m20900_a0-optimized.cl +++ b/OpenCL/m20900_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -731,15 +731,15 @@ KERNEL_FQ void m20900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1456,10 +1456,10 @@ KERNEL_FQ void m20900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m20900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m20900_a0-pure.cl b/OpenCL/m20900_a0-pure.cl index 556d41cf6..7bd06863f 100644 --- a/OpenCL/m20900_a0-pure.cl +++ b/OpenCL/m20900_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -209,7 +209,7 @@ KERNEL_FQ void m20900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m20900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m20900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m20900_a1-optimized.cl b/OpenCL/m20900_a1-optimized.cl index c50b619f8..b6fe3c802 100644 --- a/OpenCL/m20900_a1-optimized.cl +++ b/OpenCL/m20900_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -787,15 +787,15 @@ KERNEL_FQ void m20900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1570,10 +1570,10 @@ KERNEL_FQ void m20900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m20900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m20900_a1-pure.cl b/OpenCL/m20900_a1-pure.cl index 0b4f0f898..b115c6ef4 100644 --- a/OpenCL/m20900_a1-pure.cl +++ b/OpenCL/m20900_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -209,7 +209,7 @@ KERNEL_FQ void m20900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m20900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m20900_a3-optimized.cl b/OpenCL/m20900_a3-optimized.cl index adeb2b1e6..e3c0d74b7 100644 --- a/OpenCL/m20900_a3-optimized.cl +++ b/OpenCL/m20900_a3-optimized.cl @@ -1358,7 +1358,7 @@ DECLSPEC void m20900s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m20900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1428,7 +1428,7 @@ KERNEL_FQ void m20900_m04 (KERN_ATTR_BASIC ()) m20900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1498,7 +1498,7 @@ KERNEL_FQ void m20900_m08 (KERN_ATTR_BASIC ()) m20900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1568,7 +1568,7 @@ KERNEL_FQ void m20900_m16 (KERN_ATTR_BASIC ()) m20900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1638,7 +1638,7 @@ KERNEL_FQ void m20900_s04 (KERN_ATTR_BASIC ()) m20900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1708,7 +1708,7 @@ KERNEL_FQ void m20900_s08 (KERN_ATTR_BASIC ()) m20900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m20900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m20900_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m20900_a3-pure.cl b/OpenCL/m20900_a3-pure.cl index 23443d5ea..dc172f931 100644 --- a/OpenCL/m20900_a3-pure.cl +++ b/OpenCL/m20900_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m20900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -218,7 +218,7 @@ KERNEL_FQ void m20900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m20900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m20900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21000_a0-optimized.cl b/OpenCL/m21000_a0-optimized.cl index fe3305d8c..50689b2a6 100644 --- a/OpenCL/m21000_a0-optimized.cl +++ b/OpenCL/m21000_a0-optimized.cl @@ -125,7 +125,7 @@ DECLSPEC void sha512_transform_opt (PRIVATE_AS const u32x *w0, PRIVATE_AS const digest[7] = h; } -KERNEL_FQ void m21000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -266,15 +266,15 @@ KERNEL_FQ void m21000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -427,10 +427,10 @@ KERNEL_FQ void m21000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m21000_a0-pure.cl b/OpenCL/m21000_a0-pure.cl index c66ee9b83..353fa154d 100644 --- a/OpenCL/m21000_a0-pure.cl +++ b/OpenCL/m21000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m21000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -87,7 +87,7 @@ KERNEL_FQ void m21000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21000_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21000_a1-optimized.cl b/OpenCL/m21000_a1-optimized.cl index b0f4b364b..65f71f146 100644 --- a/OpenCL/m21000_a1-optimized.cl +++ b/OpenCL/m21000_a1-optimized.cl @@ -218,7 +218,7 @@ DECLSPEC void sha512_transform_opt (PRIVATE_AS const u32x *w0, PRIVATE_AS const digest[7] = h; } -KERNEL_FQ void m21000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -397,15 +397,15 @@ KERNEL_FQ void m21000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -596,10 +596,10 @@ KERNEL_FQ void m21000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m21000_a1-pure.cl b/OpenCL/m21000_a1-pure.cl index cf0667973..ca52a9518 100644 --- a/OpenCL/m21000_a1-pure.cl +++ b/OpenCL/m21000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m21000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -83,7 +83,7 @@ KERNEL_FQ void m21000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21000_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21000_a3-optimized.cl b/OpenCL/m21000_a3-optimized.cl index 4096c2e25..0ae103080 100644 --- a/OpenCL/m21000_a3-optimized.cl +++ b/OpenCL/m21000_a3-optimized.cl @@ -410,7 +410,7 @@ DECLSPEC void m21000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m21000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -450,7 +450,7 @@ KERNEL_FQ void m21000_m04 (KERN_ATTR_VECTOR ()) m21000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -490,7 +490,7 @@ KERNEL_FQ void m21000_m08 (KERN_ATTR_VECTOR ()) m21000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -530,7 +530,7 @@ KERNEL_FQ void m21000_m16 (KERN_ATTR_VECTOR ()) m21000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -570,7 +570,7 @@ KERNEL_FQ void m21000_s04 (KERN_ATTR_VECTOR ()) m21000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -610,7 +610,7 @@ KERNEL_FQ void m21000_s08 (KERN_ATTR_VECTOR ()) m21000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m21000_a3-pure.cl b/OpenCL/m21000_a3-pure.cl index 17854b263..48393a4b6 100644 --- a/OpenCL/m21000_a3-pure.cl +++ b/OpenCL/m21000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m21000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -96,7 +96,7 @@ KERNEL_FQ void m21000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21100_a0-optimized.cl b/OpenCL/m21100_a0-optimized.cl index 6c6654355..9536e3d7e 100644 --- a/OpenCL/m21100_a0-optimized.cl +++ b/OpenCL/m21100_a0-optimized.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -386,15 +386,15 @@ KERNEL_FQ void m21100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -772,10 +772,10 @@ KERNEL_FQ void m21100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m21100_a0-pure.cl b/OpenCL/m21100_a0-pure.cl index b59d5a31a..625ebd1d9 100644 --- a/OpenCL/m21100_a0-pure.cl +++ b/OpenCL/m21100_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -146,7 +146,7 @@ KERNEL_FQ void m21100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21100_a1-optimized.cl b/OpenCL/m21100_a1-optimized.cl index 4a20328c3..7155fb117 100644 --- a/OpenCL/m21100_a1-optimized.cl +++ b/OpenCL/m21100_a1-optimized.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -442,15 +442,15 @@ KERNEL_FQ void m21100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -886,10 +886,10 @@ KERNEL_FQ void m21100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m21100_a1-pure.cl b/OpenCL/m21100_a1-pure.cl index 9c6019504..04cb75709 100644 --- a/OpenCL/m21100_a1-pure.cl +++ b/OpenCL/m21100_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -142,7 +142,7 @@ KERNEL_FQ void m21100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21100_a3-optimized.cl b/OpenCL/m21100_a3-optimized.cl index e5b0e86ce..ce58cf443 100644 --- a/OpenCL/m21100_a3-optimized.cl +++ b/OpenCL/m21100_a3-optimized.cl @@ -634,7 +634,7 @@ DECLSPEC void m21100s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m21100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -704,7 +704,7 @@ KERNEL_FQ void m21100_m04 (KERN_ATTR_BASIC ()) m21100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -774,7 +774,7 @@ KERNEL_FQ void m21100_m08 (KERN_ATTR_BASIC ()) m21100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -844,7 +844,7 @@ KERNEL_FQ void m21100_m16 (KERN_ATTR_BASIC ()) m21100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -914,7 +914,7 @@ KERNEL_FQ void m21100_s04 (KERN_ATTR_BASIC ()) m21100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -984,7 +984,7 @@ KERNEL_FQ void m21100_s08 (KERN_ATTR_BASIC ()) m21100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21100_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m21100_a3-pure.cl b/OpenCL/m21100_a3-pure.cl index 90d39999f..021798167 100644 --- a/OpenCL/m21100_a3-pure.cl +++ b/OpenCL/m21100_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -155,7 +155,7 @@ KERNEL_FQ void m21100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21200_a0-optimized.cl b/OpenCL/m21200_a0-optimized.cl index c3764aa87..3a2c9578f 100644 --- a/OpenCL/m21200_a0-optimized.cl +++ b/OpenCL/m21200_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21200_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -442,15 +442,15 @@ KERNEL_FQ void m21200_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21200_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21200_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21200_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -879,10 +879,10 @@ KERNEL_FQ void m21200_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21200_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21200_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m21200_a0-pure.cl b/OpenCL/m21200_a0-pure.cl index 31a05eafe..96fe90131 100644 --- a/OpenCL/m21200_a0-pure.cl +++ b/OpenCL/m21200_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21200_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -166,7 +166,7 @@ KERNEL_FQ void m21200_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21200_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21200_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21200_a1-optimized.cl b/OpenCL/m21200_a1-optimized.cl index 00289dc1f..260e537df 100644 --- a/OpenCL/m21200_a1-optimized.cl +++ b/OpenCL/m21200_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -498,15 +498,15 @@ KERNEL_FQ void m21200_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -993,10 +993,10 @@ KERNEL_FQ void m21200_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m21200_a1-pure.cl b/OpenCL/m21200_a1-pure.cl index 9c75b2ba5..5aaa9dc74 100644 --- a/OpenCL/m21200_a1-pure.cl +++ b/OpenCL/m21200_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -162,7 +162,7 @@ KERNEL_FQ void m21200_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21200_a3-optimized.cl b/OpenCL/m21200_a3-optimized.cl index 74292b4f1..521c5b811 100644 --- a/OpenCL/m21200_a3-optimized.cl +++ b/OpenCL/m21200_a3-optimized.cl @@ -781,7 +781,7 @@ DECLSPEC void m21200s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m21200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -851,7 +851,7 @@ KERNEL_FQ void m21200_m04 (KERN_ATTR_BASIC ()) m21200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -921,7 +921,7 @@ KERNEL_FQ void m21200_m08 (KERN_ATTR_BASIC ()) m21200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -991,7 +991,7 @@ KERNEL_FQ void m21200_m16 (KERN_ATTR_BASIC ()) m21200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1061,7 +1061,7 @@ KERNEL_FQ void m21200_s04 (KERN_ATTR_BASIC ()) m21200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1131,7 +1131,7 @@ KERNEL_FQ void m21200_s08 (KERN_ATTR_BASIC ()) m21200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m21200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21200_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m21200_a3-pure.cl b/OpenCL/m21200_a3-pure.cl index efd900e8d..6b6702b46 100644 --- a/OpenCL/m21200_a3-pure.cl +++ b/OpenCL/m21200_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21200_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21200_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -173,7 +173,7 @@ KERNEL_FQ void m21200_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21200_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21200_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21300_a0-pure.cl b/OpenCL/m21300_a0-pure.cl index 31eeea607..acad2e499 100644 --- a/OpenCL/m21300_a0-pure.cl +++ b/OpenCL/m21300_a0-pure.cl @@ -29,7 +29,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -146,7 +146,7 @@ KERNEL_FQ void m21300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21300_a1-pure.cl b/OpenCL/m21300_a1-pure.cl index a1c1c8f75..97a5a5d5c 100644 --- a/OpenCL/m21300_a1-pure.cl +++ b/OpenCL/m21300_a1-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m21300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21300_a3-pure.cl b/OpenCL/m21300_a3-pure.cl index 5f92bb90a..8fa0bb5af 100644 --- a/OpenCL/m21300_a3-pure.cl +++ b/OpenCL/m21300_a3-pure.cl @@ -27,7 +27,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m21300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -159,7 +159,7 @@ KERNEL_FQ void m21300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21310_a0-pure.cl b/OpenCL/m21310_a0-pure.cl index dba86ea7d..154f3030d 100644 --- a/OpenCL/m21310_a0-pure.cl +++ b/OpenCL/m21310_a0-pure.cl @@ -39,7 +39,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m21310_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m21310_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) { /** * modifier @@ -153,7 +153,7 @@ KERNEL_FQ void m21310_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m21310_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m21310_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m21310_a1-pure.cl b/OpenCL/m21310_a1-pure.cl index be8285e50..512c460cc 100644 --- a/OpenCL/m21310_a1-pure.cl +++ b/OpenCL/m21310_a1-pure.cl @@ -37,7 +37,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m21310_mxx (KERN_ATTR_ESALT (md5_double_salt)) +KERNEL_FQ KERNEL_FA void m21310_mxx (KERN_ATTR_ESALT (md5_double_salt)) { /** * modifier @@ -149,7 +149,7 @@ KERNEL_FQ void m21310_mxx (KERN_ATTR_ESALT (md5_double_salt)) } } -KERNEL_FQ void m21310_sxx (KERN_ATTR_ESALT (md5_double_salt)) +KERNEL_FQ KERNEL_FA void m21310_sxx (KERN_ATTR_ESALT (md5_double_salt)) { /** * modifier diff --git a/OpenCL/m21310_a3-pure.cl b/OpenCL/m21310_a3-pure.cl index 546e7defb..5837f74b7 100644 --- a/OpenCL/m21310_a3-pure.cl +++ b/OpenCL/m21310_a3-pure.cl @@ -37,7 +37,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m21310_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) +KERNEL_FQ KERNEL_FA void m21310_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) { /** * modifier @@ -168,7 +168,7 @@ KERNEL_FQ void m21310_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) } } -KERNEL_FQ void m21310_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) +KERNEL_FQ KERNEL_FA void m21310_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) { /** * modifier diff --git a/OpenCL/m21400_a0-optimized.cl b/OpenCL/m21400_a0-optimized.cl index 7148b8aa0..9b76e15ce 100644 --- a/OpenCL/m21400_a0-optimized.cl +++ b/OpenCL/m21400_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m21400_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -277,15 +277,15 @@ KERNEL_FQ void m21400_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21400_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21400_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21400_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -565,10 +565,10 @@ KERNEL_FQ void m21400_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21400_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m21400_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m21400_a0-pure.cl b/OpenCL/m21400_a0-pure.cl index c16f3c6c1..e00e4e67f 100644 --- a/OpenCL/m21400_a0-pure.cl +++ b/OpenCL/m21400_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21400_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -91,7 +91,7 @@ KERNEL_FQ void m21400_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21400_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21400_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21400_a1-optimized.cl b/OpenCL/m21400_a1-optimized.cl index c71550a34..d767ac996 100644 --- a/OpenCL/m21400_a1-optimized.cl +++ b/OpenCL/m21400_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m21400_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -333,15 +333,15 @@ KERNEL_FQ void m21400_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -679,10 +679,10 @@ KERNEL_FQ void m21400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m21400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m21400_a1-pure.cl b/OpenCL/m21400_a1-pure.cl index 68b1d47e8..49c1761c4 100644 --- a/OpenCL/m21400_a1-pure.cl +++ b/OpenCL/m21400_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21400_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -87,7 +87,7 @@ KERNEL_FQ void m21400_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21400_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21400_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21400_a3-optimized.cl b/OpenCL/m21400_a3-optimized.cl index 8fbbeb2b5..158fe8cde 100644 --- a/OpenCL/m21400_a3-optimized.cl +++ b/OpenCL/m21400_a3-optimized.cl @@ -493,7 +493,7 @@ DECLSPEC void m21400s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m21400_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -533,7 +533,7 @@ KERNEL_FQ void m21400_m04 (KERN_ATTR_VECTOR ()) m21400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21400_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -573,7 +573,7 @@ KERNEL_FQ void m21400_m08 (KERN_ATTR_VECTOR ()) m21400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21400_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -613,7 +613,7 @@ KERNEL_FQ void m21400_m16 (KERN_ATTR_VECTOR ()) m21400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21400_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -653,7 +653,7 @@ KERNEL_FQ void m21400_s04 (KERN_ATTR_VECTOR ()) m21400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21400_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -693,7 +693,7 @@ KERNEL_FQ void m21400_s08 (KERN_ATTR_VECTOR ()) m21400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m21400_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m21400_a3-pure.cl b/OpenCL/m21400_a3-pure.cl index b14318fe5..25ec481ef 100644 --- a/OpenCL/m21400_a3-pure.cl +++ b/OpenCL/m21400_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21400_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -100,7 +100,7 @@ KERNEL_FQ void m21400_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21400_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21400_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21420_a0-pure.cl b/OpenCL/m21420_a0-pure.cl index 06c7dad00..557de6769 100644 --- a/OpenCL/m21420_a0-pure.cl +++ b/OpenCL/m21420_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21420_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21420_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -111,7 +111,7 @@ KERNEL_FQ void m21420_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m21420_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m21420_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m21420_a1-pure.cl b/OpenCL/m21420_a1-pure.cl index 720b189a1..4c0aca32a 100644 --- a/OpenCL/m21420_a1-pure.cl +++ b/OpenCL/m21420_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21420_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21420_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -107,7 +107,7 @@ KERNEL_FQ void m21420_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m21420_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m21420_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m21420_a3-pure.cl b/OpenCL/m21420_a3-pure.cl index 9d81389b9..4a513a9ac 100644 --- a/OpenCL/m21420_a3-pure.cl +++ b/OpenCL/m21420_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m21420_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21420_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -120,7 +120,7 @@ KERNEL_FQ void m21420_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m21420_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m21420_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m21500-pure.cl b/OpenCL/m21500-pure.cl index a181cc4a6..5b069bb1b 100644 --- a/OpenCL/m21500-pure.cl +++ b/OpenCL/m21500-pure.cl @@ -70,7 +70,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m21500_init (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) +KERNEL_FQ KERNEL_FA void m21500_init (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) { /** * base @@ -142,7 +142,7 @@ KERNEL_FQ void m21500_init (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t } } -KERNEL_FQ void m21500_loop (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) +KERNEL_FQ KERNEL_FA void m21500_loop (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) { const u64 gid = get_global_id (0); @@ -227,7 +227,7 @@ KERNEL_FQ void m21500_loop (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t } } -KERNEL_FQ void m21500_comp (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) +KERNEL_FQ KERNEL_FA void m21500_comp (KERN_ATTR_TMPS_ESALT (solarwinds_tmp_t, solarwinds_t)) { /** * base diff --git a/OpenCL/m21600-pure.cl b/OpenCL/m21600-pure.cl index 8852a3c4a..e49d14b30 100644 --- a/OpenCL/m21600-pure.cl +++ b/OpenCL/m21600-pure.cl @@ -85,7 +85,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m21600_init (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m21600_init (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) { /** * base @@ -189,7 +189,7 @@ KERNEL_FQ void m21600_init (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) } } -KERNEL_FQ void m21600_loop (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m21600_loop (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) { const u64 gid = get_global_id (0); @@ -315,7 +315,7 @@ KERNEL_FQ void m21600_loop (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) } } -KERNEL_FQ void m21600_comp (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m21600_comp (KERN_ATTR_TMPS (web2py_sha512_tmp_t)) { /** * base diff --git a/OpenCL/m21700-pure.cl b/OpenCL/m21700-pure.cl index 554dcfbdf..6ad2488ca 100644 --- a/OpenCL/m21700-pure.cl +++ b/OpenCL/m21700-pure.cl @@ -95,7 +95,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m21700_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21700_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { /** * base @@ -192,7 +192,7 @@ KERNEL_FQ void m21700_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) tmps[gid].out[7] = tmps[gid].dgst[7]; } -KERNEL_FQ void m21700_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21700_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { const u64 gid = get_global_id (0); @@ -315,7 +315,7 @@ KERNEL_FQ void m21700_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) unpack64v (tmps, out, gid, 7, out[7]); } -KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { /** * base diff --git a/OpenCL/m21800-pure.cl b/OpenCL/m21800-pure.cl index fd301671b..a9b2bf635 100644 --- a/OpenCL/m21800-pure.cl +++ b/OpenCL/m21800-pure.cl @@ -96,7 +96,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m21800_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21800_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m21800_init (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) tmps[gid].out[7] = tmps[gid].dgst[7]; } -KERNEL_FQ void m21800_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21800_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { const u64 gid = get_global_id (0); @@ -316,7 +316,7 @@ KERNEL_FQ void m21800_loop (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) unpack64v (tmps, out, gid, 7, out[7]); } -KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) +KERNEL_FQ KERNEL_FA void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22000-pure.cl b/OpenCL/m22000-pure.cl index 5fc836f89..f6462637c 100644 --- a/OpenCL/m22000-pure.cl +++ b/OpenCL/m22000-pure.cl @@ -145,7 +145,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m22000_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { /** * base @@ -253,7 +253,7 @@ KERNEL_FQ void m22000_init (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) tmps[gid].out[9] = sha1_hmac_ctx2.opad.h[4]; } -KERNEL_FQ void m22000_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -396,12 +396,12 @@ KERNEL_FQ void m22000_loop (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) unpackv (tmps, out, gid, 9, out[4]); } -KERNEL_FQ void m22000_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_comp (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { // not in use here, special case... } -KERNEL_FQ void m22000_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -594,7 +594,7 @@ KERNEL_FQ void m22000_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) } } -KERNEL_FQ void m22000_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -777,7 +777,7 @@ KERNEL_FQ void m22000_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) } } -KERNEL_FQ void m22000_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { /** * aes shared @@ -1071,7 +1071,7 @@ KERNEL_FQ void m22000_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) } } -KERNEL_FQ void m22000_aux4 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22000_aux4 (KERN_ATTR_TMPS_ESALT (wpa_pbkdf2_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m22001-pure.cl b/OpenCL/m22001-pure.cl index 9034abded..d26a276f1 100644 --- a/OpenCL/m22001-pure.cl +++ b/OpenCL/m22001-pure.cl @@ -158,7 +158,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m22001_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -203,17 +203,17 @@ KERNEL_FQ void m22001_init (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) tmps[gid].out[7] = hc_swap32_S (out[7]); } -KERNEL_FQ void m22001_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_loop (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { // not in use here, special case... } -KERNEL_FQ void m22001_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_comp (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { // not in use here, special case... } -KERNEL_FQ void m22001_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -406,7 +406,7 @@ KERNEL_FQ void m22001_aux1 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) } } -KERNEL_FQ void m22001_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); @@ -589,7 +589,7 @@ KERNEL_FQ void m22001_aux2 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) } } -KERNEL_FQ void m22001_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { /** * aes shared @@ -883,7 +883,7 @@ KERNEL_FQ void m22001_aux3 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) } } -KERNEL_FQ void m22001_aux4 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) +KERNEL_FQ KERNEL_FA void m22001_aux4 (KERN_ATTR_TMPS_ESALT (wpa_pmk_tmp_t, wpa_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m22100-pure.cl b/OpenCL/m22100-pure.cl index 15747015c..36930325e 100644 --- a/OpenCL/m22100-pure.cl +++ b/OpenCL/m22100-pure.cl @@ -133,7 +133,7 @@ DECLSPEC void sha256_transform_vector_pc (PRIVATE_AS const u32x *w0, PRIVATE_AS digest[7] += h; } -KERNEL_FQ void m22100_init (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) +KERNEL_FQ KERNEL_FA void m22100_init (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m22100_init (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) tmps[gid].last_hash[7] = 0; } -KERNEL_FQ void m22100_loop (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) +KERNEL_FQ KERNEL_FA void m22100_loop (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -347,7 +347,7 @@ KERNEL_FQ void m22100_loop (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) unpackv (tmps, last_hash, gid, 7, w1[3]); } -KERNEL_FQ void m22100_comp (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) +KERNEL_FQ KERNEL_FA void m22100_comp (KERN_ATTR_TMPS_ESALT (bitlocker_tmp_t, bitlocker_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22200_a0-optimized.cl b/OpenCL/m22200_a0-optimized.cl index fc7c9406b..73ae7e9aa 100644 --- a/OpenCL/m22200_a0-optimized.cl +++ b/OpenCL/m22200_a0-optimized.cl @@ -122,7 +122,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m22200_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -237,15 +237,15 @@ KERNEL_FQ void m22200_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22200_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22200_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22200_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -373,10 +373,10 @@ KERNEL_FQ void m22200_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22200_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22200_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m22200_a0-pure.cl b/OpenCL/m22200_a0-pure.cl index 75d20c990..8c1338596 100644 --- a/OpenCL/m22200_a0-pure.cl +++ b/OpenCL/m22200_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m22200_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -68,7 +68,7 @@ KERNEL_FQ void m22200_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22200_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22200_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m22200_a1-optimized.cl b/OpenCL/m22200_a1-optimized.cl index 9c426666a..7ce510ba9 100644 --- a/OpenCL/m22200_a1-optimized.cl +++ b/OpenCL/m22200_a1-optimized.cl @@ -120,7 +120,7 @@ DECLSPEC void sha512_transform_intern (PRIVATE_AS const u32x *w0, PRIVATE_AS con digest[7] = h; } -KERNEL_FQ void m22200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -307,15 +307,15 @@ KERNEL_FQ void m22200_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -502,10 +502,10 @@ KERNEL_FQ void m22200_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m22200_a1-pure.cl b/OpenCL/m22200_a1-pure.cl index 82af2556d..aad1d3179 100644 --- a/OpenCL/m22200_a1-pure.cl +++ b/OpenCL/m22200_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m22200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -63,7 +63,7 @@ KERNEL_FQ void m22200_mxx (KERN_ATTR_BASIC ()) } -KERNEL_FQ void m22200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m22200_a3-optimized.cl b/OpenCL/m22200_a3-optimized.cl index c26d3977c..feae41218 100644 --- a/OpenCL/m22200_a3-optimized.cl +++ b/OpenCL/m22200_a3-optimized.cl @@ -282,7 +282,7 @@ DECLSPEC void m22200s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m22200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -348,7 +348,7 @@ KERNEL_FQ void m22200_m04 (KERN_ATTR_BASIC ()) m22200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -422,7 +422,7 @@ KERNEL_FQ void m22200_m08 (KERN_ATTR_BASIC ()) m22200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -511,7 +511,7 @@ KERNEL_FQ void m22200_m16 (KERN_ATTR_BASIC ()) m22200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -577,7 +577,7 @@ KERNEL_FQ void m22200_s04 (KERN_ATTR_BASIC ()) m22200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -651,7 +651,7 @@ KERNEL_FQ void m22200_s08 (KERN_ATTR_BASIC ()) m22200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22200_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m22200_a3-pure.cl b/OpenCL/m22200_a3-pure.cl index 4df3d0c63..a06b6c4e6 100644 --- a/OpenCL/m22200_a3-pure.cl +++ b/OpenCL/m22200_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m22200_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22200_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -79,7 +79,7 @@ KERNEL_FQ void m22200_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m22200_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22200_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m22300_a0-optimized.cl b/OpenCL/m22300_a0-optimized.cl index 78178a00c..4d22d3e16 100644 --- a/OpenCL/m22300_a0-optimized.cl +++ b/OpenCL/m22300_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m22300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -277,15 +277,15 @@ KERNEL_FQ void m22300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -565,10 +565,10 @@ KERNEL_FQ void m22300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m22300_a0-pure.cl b/OpenCL/m22300_a0-pure.cl index 729ac56e0..338608d14 100644 --- a/OpenCL/m22300_a0-pure.cl +++ b/OpenCL/m22300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m22300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -75,7 +75,7 @@ KERNEL_FQ void m22300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m22300_a1-optimized.cl b/OpenCL/m22300_a1-optimized.cl index f57a8c2a1..3d1614871 100644 --- a/OpenCL/m22300_a1-optimized.cl +++ b/OpenCL/m22300_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m22300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -335,15 +335,15 @@ KERNEL_FQ void m22300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -683,10 +683,10 @@ KERNEL_FQ void m22300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m22300_a1-pure.cl b/OpenCL/m22300_a1-pure.cl index 65af3eb13..a71525f1f 100644 --- a/OpenCL/m22300_a1-pure.cl +++ b/OpenCL/m22300_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m22300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m22300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m22300_a3-optimized.cl b/OpenCL/m22300_a3-optimized.cl index 4293778df..e4c06bf76 100644 --- a/OpenCL/m22300_a3-optimized.cl +++ b/OpenCL/m22300_a3-optimized.cl @@ -537,7 +537,7 @@ DECLSPEC void m22300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m22300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -586,7 +586,7 @@ KERNEL_FQ void m22300_m04 (KERN_ATTR_BASIC ()) m22300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -635,7 +635,7 @@ KERNEL_FQ void m22300_m08 (KERN_ATTR_BASIC ()) m22300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -684,7 +684,7 @@ KERNEL_FQ void m22300_m16 (KERN_ATTR_BASIC ()) m22300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -733,7 +733,7 @@ KERNEL_FQ void m22300_s04 (KERN_ATTR_BASIC ()) m22300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -782,7 +782,7 @@ KERNEL_FQ void m22300_s08 (KERN_ATTR_BASIC ()) m22300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22300_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m22300_a3-pure.cl b/OpenCL/m22300_a3-pure.cl index dfe7fa169..c34bc3a0a 100644 --- a/OpenCL/m22300_a3-pure.cl +++ b/OpenCL/m22300_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m22300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m22300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m22300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m22400-pure.cl b/OpenCL/m22400-pure.cl index f7da3a4ba..6daf00114 100644 --- a/OpenCL/m22400-pure.cl +++ b/OpenCL/m22400-pure.cl @@ -31,7 +31,7 @@ typedef struct aescrypt_tmp } aescrypt_tmp_t; -KERNEL_FQ void m22400_init (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) +KERNEL_FQ KERNEL_FA void m22400_init (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) { /** * base @@ -110,7 +110,7 @@ KERNEL_FQ void m22400_init (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) tmps[gid].len = final_len; } -KERNEL_FQ void m22400_loop (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) +KERNEL_FQ KERNEL_FA void m22400_loop (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) { const u64 gid = get_global_id (0); @@ -214,7 +214,7 @@ KERNEL_FQ void m22400_loop (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) tmps[gid].pass[7] = w[7]; } -KERNEL_FQ void m22400_comp (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) +KERNEL_FQ KERNEL_FA void m22400_comp (KERN_ATTR_TMPS_ESALT (aescrypt_tmp_t, aescrypt_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m22500_a0-optimized.cl b/OpenCL/m22500_a0-optimized.cl index 12e14e48d..7b8ecf5a7 100644 --- a/OpenCL/m22500_a0-optimized.cl +++ b/OpenCL/m22500_a0-optimized.cl @@ -29,7 +29,7 @@ DECLSPEC int is_valid_bitcoinj_8 (const u8 v) return 1; } -KERNEL_FQ void m22500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -616,15 +616,15 @@ KERNEL_FQ void m22500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -1211,10 +1211,10 @@ KERNEL_FQ void m22500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m22500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m22500_a0-pure.cl b/OpenCL/m22500_a0-pure.cl index e2c51c557..1d67a95d7 100644 --- a/OpenCL/m22500_a0-pure.cl +++ b/OpenCL/m22500_a0-pure.cl @@ -29,7 +29,7 @@ DECLSPEC int is_valid_bitcoinj_8 (const u8 v) return 1; } -KERNEL_FQ void m22500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -325,7 +325,7 @@ KERNEL_FQ void m22500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m22500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m22500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m22500_a1-optimized.cl b/OpenCL/m22500_a1-optimized.cl index 9eb8a54c5..fdd78ba1a 100644 --- a/OpenCL/m22500_a1-optimized.cl +++ b/OpenCL/m22500_a1-optimized.cl @@ -28,7 +28,7 @@ DECLSPEC int is_valid_bitcoinj_8 (const u8 v) return 1; } -KERNEL_FQ void m22500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -675,15 +675,15 @@ KERNEL_FQ void m22500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1330,10 +1330,10 @@ KERNEL_FQ void m22500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m22500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m22500_a1-pure.cl b/OpenCL/m22500_a1-pure.cl index 07b11a97f..fb3c210d4 100644 --- a/OpenCL/m22500_a1-pure.cl +++ b/OpenCL/m22500_a1-pure.cl @@ -27,7 +27,7 @@ DECLSPEC int is_valid_bitcoinj_8 (const u8 v) return 1; } -KERNEL_FQ void m22500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -329,7 +329,7 @@ KERNEL_FQ void m22500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m22500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m22500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m22500_a3-optimized.cl b/OpenCL/m22500_a3-optimized.cl index a16415b0b..e7466d88e 100644 --- a/OpenCL/m22500_a3-optimized.cl +++ b/OpenCL/m22500_a3-optimized.cl @@ -602,7 +602,7 @@ DECLSPEC void m22500 (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m22500_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -697,7 +697,7 @@ KERNEL_FQ void m22500_m04 (KERN_ATTR_VECTOR ()) m22500 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22500_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -792,7 +792,7 @@ KERNEL_FQ void m22500_m08 (KERN_ATTR_VECTOR ()) m22500 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22500_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -887,7 +887,7 @@ KERNEL_FQ void m22500_m16 (KERN_ATTR_VECTOR ()) m22500 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22500_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -982,7 +982,7 @@ KERNEL_FQ void m22500_s04 (KERN_ATTR_VECTOR ()) m22500 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22500_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -1077,7 +1077,7 @@ KERNEL_FQ void m22500_s08 (KERN_ATTR_VECTOR ()) m22500 (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m22500_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m22500_a3-pure.cl b/OpenCL/m22500_a3-pure.cl index d11b78493..5b9d85287 100644 --- a/OpenCL/m22500_a3-pure.cl +++ b/OpenCL/m22500_a3-pure.cl @@ -27,7 +27,7 @@ DECLSPEC int is_valid_bitcoinj_8 (const u8 v) return 1; } -KERNEL_FQ void m22500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -338,7 +338,7 @@ KERNEL_FQ void m22500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m22500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m22500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m22600-pure.cl b/OpenCL/m22600-pure.cl index 04558549b..30fd96fd7 100644 --- a/OpenCL/m22600-pure.cl +++ b/OpenCL/m22600-pure.cl @@ -108,7 +108,7 @@ DECLSPEC void sha1_run (PRIVATE_AS u32 *w, PRIVATE_AS u32 *res) res[4] = digest[4]; } -KERNEL_FQ void m22600_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m22600_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { /** * base @@ -182,7 +182,7 @@ KERNEL_FQ void m22600_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) } } -KERNEL_FQ void m22600_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m22600_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { const u64 gid = get_global_id (0); @@ -267,7 +267,7 @@ KERNEL_FQ void m22600_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) } } -KERNEL_FQ void m22600_comp (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m22600_comp (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { /** * base diff --git a/OpenCL/m22700-pure.cl b/OpenCL/m22700-pure.cl index 303e5e334..981880169 100644 --- a/OpenCL/m22700-pure.cl +++ b/OpenCL/m22700-pure.cl @@ -9,6 +9,7 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif @@ -25,16 +26,6 @@ #define MULTIBIT_IV2 0x16865429 #define MULTIBIT_IV3 0x3e7289c4 -typedef struct -{ - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - DECLSPEC int is_valid_bitcoinj_8 (const u8 v) { // .abcdefghijklmnopqrstuvwxyz @@ -72,279 +63,8 @@ DECLSPEC int is_valid_bitcoinj (PRIVATE_AS const u32 *w) return 1; } -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) +KERNEL_FQ KERNEL_FA void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) { - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } -} - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4]; - - for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; - - for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - -KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; @@ -366,173 +86,50 @@ KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) | ((w[j] << 8) & 0xff00ff00); } - sha256_hmac_ctx_t sha256_hmac_ctx; + u32 s[16] = { 0 }; - sha256_hmac_init_swap (&sha256_hmac_ctx, w, w_len); + s[0] = hc_swap32_S (MULTIBIT_S0); + s[1] = hc_swap32_S (MULTIBIT_S1); - u32 x0[4] = { 0 }; - u32 x1[4] = { 0 }; - u32 x2[4] = { 0 }; - u32 x3[4] = { 0 }; + scrypt_pbkdf2_ppg (w, w_len, s, 8, tmps[gid].in, SCRYPT_SZ); - x0[0] = MULTIBIT_S0; - x0[1] = MULTIBIT_S1; - - sha256_hmac_update_64 (&sha256_hmac_ctx, x0, x1, x2, x3, 8); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m22700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m22700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m22700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + u32 X[STATE_CNT4]; - uint4 X[STATE_CNT4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); } -KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m22700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); + + if (gid >= GID_CNT) return; + + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; + + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); + + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} + +KERNEL_FQ KERNEL_FA void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -612,112 +209,31 @@ KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) | ((w[j] << 8) & 0xff00ff00); } - sha256_hmac_ctx_t ctx; - sha256_hmac_init_swap (&ctx, w, w_len); + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32 out[8]; - for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) - { - uint4 X[4]; - - const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); - - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; - - uint4 T[4]; - - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); + scrypt_pbkdf2_pgp (w, w_len, tmps[gid].in, SCRYPT_SZ, out, 32); // AES256-CBC decrypt with IV from salt buffer (dynamic, alternative 1): u32 key[8]; - key[0] = ctx.opad.h[0]; - key[1] = ctx.opad.h[1]; - key[2] = ctx.opad.h[2]; - key[3] = ctx.opad.h[3]; - key[4] = ctx.opad.h[4]; - key[5] = ctx.opad.h[5]; - key[6] = ctx.opad.h[6]; - key[7] = ctx.opad.h[7]; + key[0] = out[0]; + key[1] = out[1]; + key[2] = out[2]; + key[3] = out[3]; + key[4] = out[4]; + key[5] = out[5]; + key[6] = out[6]; + key[7] = out[7]; #define KEYLEN 60 u32 ks[KEYLEN]; - AES256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + aes256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); u32 iv[4]; diff --git a/OpenCL/m22911_a0-pure.cl b/OpenCL/m22911_a0-pure.cl index 400c28c6f..c79750b3c 100644 --- a/OpenCL/m22911_a0-pure.cl +++ b/OpenCL/m22911_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22911_mxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_mxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -236,7 +236,7 @@ KERNEL_FQ void m22911_mxx (KERN_ATTR_RULES_ESALT (pem_t)) } } -KERNEL_FQ void m22911_sxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_sxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22911_a1-pure.cl b/OpenCL/m22911_a1-pure.cl index 2ca92d8aa..7d52a8ab5 100644 --- a/OpenCL/m22911_a1-pure.cl +++ b/OpenCL/m22911_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22911_mxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_mxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -232,7 +232,7 @@ KERNEL_FQ void m22911_mxx (KERN_ATTR_ESALT (pem_t)) } } -KERNEL_FQ void m22911_sxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_sxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22911_a3-pure.cl b/OpenCL/m22911_a3-pure.cl index 3536db5be..485964606 100644 --- a/OpenCL/m22911_a3-pure.cl +++ b/OpenCL/m22911_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22911_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -115,7 +115,7 @@ KERNEL_FQ void m22911_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { @@ -249,7 +249,7 @@ KERNEL_FQ void m22911_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) } } -KERNEL_FQ void m22911_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22911_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -340,7 +340,7 @@ KERNEL_FQ void m22911_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { diff --git a/OpenCL/m22921_a0-pure.cl b/OpenCL/m22921_a0-pure.cl index 028ada437..7be554f4a 100644 --- a/OpenCL/m22921_a0-pure.cl +++ b/OpenCL/m22921_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22921_mxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_mxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -203,7 +203,7 @@ KERNEL_FQ void m22921_mxx (KERN_ATTR_RULES_ESALT (pem_t)) } } -KERNEL_FQ void m22921_sxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_sxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22921_a1-pure.cl b/OpenCL/m22921_a1-pure.cl index e84989d9a..ccdb2d09e 100644 --- a/OpenCL/m22921_a1-pure.cl +++ b/OpenCL/m22921_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22921_mxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_mxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -197,7 +197,7 @@ KERNEL_FQ void m22921_mxx (KERN_ATTR_ESALT (pem_t)) } } -KERNEL_FQ void m22921_sxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_sxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22921_a3-pure.cl b/OpenCL/m22921_a3-pure.cl index 60d13976f..8bc06cdcb 100644 --- a/OpenCL/m22921_a3-pure.cl +++ b/OpenCL/m22921_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22921_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -115,7 +115,7 @@ KERNEL_FQ void m22921_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { @@ -217,7 +217,7 @@ KERNEL_FQ void m22921_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) } -KERNEL_FQ void m22921_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22921_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -308,7 +308,7 @@ KERNEL_FQ void m22921_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { diff --git a/OpenCL/m22931_a0-pure.cl b/OpenCL/m22931_a0-pure.cl index c40cbd597..25fcc6d13 100644 --- a/OpenCL/m22931_a0-pure.cl +++ b/OpenCL/m22931_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22931_mxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_mxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -237,7 +237,7 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_RULES_ESALT (pem_t)) } } -KERNEL_FQ void m22931_sxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_sxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22931_a1-pure.cl b/OpenCL/m22931_a1-pure.cl index ebcda1156..549dc49e6 100644 --- a/OpenCL/m22931_a1-pure.cl +++ b/OpenCL/m22931_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22931_mxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_mxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -231,7 +231,7 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_ESALT (pem_t)) } } -KERNEL_FQ void m22931_sxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_sxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22931_a3-pure.cl b/OpenCL/m22931_a3-pure.cl index 6933a2e7e..21ccd1ee3 100644 --- a/OpenCL/m22931_a3-pure.cl +++ b/OpenCL/m22931_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -139,7 +139,7 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { @@ -250,7 +250,7 @@ KERNEL_FQ void m22931_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) } } -KERNEL_FQ void m22931_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22931_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -365,7 +365,7 @@ KERNEL_FQ void m22931_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { diff --git a/OpenCL/m22941_a0-pure.cl b/OpenCL/m22941_a0-pure.cl index 9bbd7cf19..791727f95 100644 --- a/OpenCL/m22941_a0-pure.cl +++ b/OpenCL/m22941_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22941_mxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_mxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -257,7 +257,7 @@ KERNEL_FQ void m22941_mxx (KERN_ATTR_RULES_ESALT (pem_t)) } } -KERNEL_FQ void m22941_sxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_sxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22941_a1-pure.cl b/OpenCL/m22941_a1-pure.cl index 11817d48f..4826f2a3d 100644 --- a/OpenCL/m22941_a1-pure.cl +++ b/OpenCL/m22941_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22941_mxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_mxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -253,7 +253,7 @@ KERNEL_FQ void m22941_mxx (KERN_ATTR_ESALT (pem_t)) } } -KERNEL_FQ void m22941_sxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_sxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22941_a3-pure.cl b/OpenCL/m22941_a3-pure.cl index 20d9a2735..799552d97 100644 --- a/OpenCL/m22941_a3-pure.cl +++ b/OpenCL/m22941_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22941_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -139,7 +139,7 @@ KERNEL_FQ void m22941_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { @@ -270,7 +270,7 @@ KERNEL_FQ void m22941_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) } } -KERNEL_FQ void m22941_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22941_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -385,7 +385,7 @@ KERNEL_FQ void m22941_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { diff --git a/OpenCL/m22951_a0-pure.cl b/OpenCL/m22951_a0-pure.cl index 8e6b1e615..4b9821177 100644 --- a/OpenCL/m22951_a0-pure.cl +++ b/OpenCL/m22951_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22951_mxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_mxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -261,7 +261,7 @@ KERNEL_FQ void m22951_mxx (KERN_ATTR_RULES_ESALT (pem_t)) } } -KERNEL_FQ void m22951_sxx (KERN_ATTR_RULES_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_sxx (KERN_ATTR_RULES_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22951_a1-pure.cl b/OpenCL/m22951_a1-pure.cl index 357627ec5..18f2b1fb5 100644 --- a/OpenCL/m22951_a1-pure.cl +++ b/OpenCL/m22951_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22951_mxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_mxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -257,7 +257,7 @@ KERNEL_FQ void m22951_mxx (KERN_ATTR_ESALT (pem_t)) } } -KERNEL_FQ void m22951_sxx (KERN_ATTR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_sxx (KERN_ATTR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m22951_a3-pure.cl b/OpenCL/m22951_a3-pure.cl index 47e103d0b..01b06914f 100644 --- a/OpenCL/m22951_a3-pure.cl +++ b/OpenCL/m22951_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct pem } pem_t; -KERNEL_FQ void m22951_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -139,7 +139,7 @@ KERNEL_FQ void m22951_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { @@ -274,7 +274,7 @@ KERNEL_FQ void m22951_mxx (KERN_ATTR_VECTOR_ESALT (pem_t)) } } -KERNEL_FQ void m22951_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) +KERNEL_FQ KERNEL_FA void m22951_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -389,7 +389,7 @@ KERNEL_FQ void m22951_sxx (KERN_ATTR_VECTOR_ESALT (pem_t)) const u32 pw_len = pws[gid].pw_len; - u32x w[64] = { 0 }; + u32x w[32] = { 0 }; for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) { diff --git a/OpenCL/m23001_a0-optimized.cl b/OpenCL/m23001_a0-optimized.cl index b9e4555b0..33a896ec8 100644 --- a/OpenCL/m23001_a0-optimized.cl +++ b/OpenCL/m23001_a0-optimized.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23001_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -352,15 +352,15 @@ KERNEL_FQ void m23001_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -686,10 +686,10 @@ KERNEL_FQ void m23001_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } diff --git a/OpenCL/m23001_a0-pure.cl b/OpenCL/m23001_a0-pure.cl index 332893e12..08b2b4994 100644 --- a/OpenCL/m23001_a0-pure.cl +++ b/OpenCL/m23001_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23001_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -218,7 +218,7 @@ KERNEL_FQ void m23001_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23001_a1-optimized.cl b/OpenCL/m23001_a1-optimized.cl index 8df639eb4..dc0663c0d 100644 --- a/OpenCL/m23001_a1-optimized.cl +++ b/OpenCL/m23001_a1-optimized.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23001_m04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -408,15 +408,15 @@ KERNEL_FQ void m23001_m04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_m08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_m16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m16 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_s04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -800,10 +800,10 @@ KERNEL_FQ void m23001_s04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_s08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23001_s16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s16 (KERN_ATTR_ESALT (securezip_t)) { } diff --git a/OpenCL/m23001_a1-pure.cl b/OpenCL/m23001_a1-pure.cl index 5a5d009c5..99eeb98ae 100644 --- a/OpenCL/m23001_a1-pure.cl +++ b/OpenCL/m23001_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23001_mxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_mxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -214,7 +214,7 @@ KERNEL_FQ void m23001_mxx (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_sxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_sxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23001_a3-optimized.cl b/OpenCL/m23001_a3-optimized.cl index b8fb0b748..e38d3bb0c 100644 --- a/OpenCL/m23001_a3-optimized.cl +++ b/OpenCL/m23001_a3-optimized.cl @@ -728,7 +728,7 @@ DECLSPEC void m23001s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m23001_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -819,7 +819,7 @@ KERNEL_FQ void m23001_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23001m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23001_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -910,7 +910,7 @@ KERNEL_FQ void m23001_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23001m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23001_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1001,7 +1001,7 @@ KERNEL_FQ void m23001_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23001m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23001_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1092,7 +1092,7 @@ KERNEL_FQ void m23001_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23001s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23001_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1183,7 +1183,7 @@ KERNEL_FQ void m23001_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23001s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23001_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base diff --git a/OpenCL/m23001_a3-pure.cl b/OpenCL/m23001_a3-pure.cl index 538106f76..2b0659135 100644 --- a/OpenCL/m23001_a3-pure.cl +++ b/OpenCL/m23001_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23001_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -227,7 +227,7 @@ KERNEL_FQ void m23001_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) } } -KERNEL_FQ void m23001_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23001_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23002_a0-optimized.cl b/OpenCL/m23002_a0-optimized.cl index 02deb7d1d..30e239339 100644 --- a/OpenCL/m23002_a0-optimized.cl +++ b/OpenCL/m23002_a0-optimized.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23002_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -405,15 +405,15 @@ KERNEL_FQ void m23002_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -792,10 +792,10 @@ KERNEL_FQ void m23002_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } diff --git a/OpenCL/m23002_a0-pure.cl b/OpenCL/m23002_a0-pure.cl index 142053dd6..d49f1badc 100644 --- a/OpenCL/m23002_a0-pure.cl +++ b/OpenCL/m23002_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23002_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -271,7 +271,7 @@ KERNEL_FQ void m23002_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23002_a1-optimized.cl b/OpenCL/m23002_a1-optimized.cl index 5ca39b3f9..4cad747f0 100644 --- a/OpenCL/m23002_a1-optimized.cl +++ b/OpenCL/m23002_a1-optimized.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23002_m04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -461,15 +461,15 @@ KERNEL_FQ void m23002_m04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_m08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_m16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m16 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_s04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -906,10 +906,10 @@ KERNEL_FQ void m23002_s04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_s08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23002_s16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s16 (KERN_ATTR_ESALT (securezip_t)) { } diff --git a/OpenCL/m23002_a1-pure.cl b/OpenCL/m23002_a1-pure.cl index ca1931c14..acab135e1 100644 --- a/OpenCL/m23002_a1-pure.cl +++ b/OpenCL/m23002_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23002_mxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_mxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -267,7 +267,7 @@ KERNEL_FQ void m23002_mxx (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_sxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_sxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23002_a3-optimized.cl b/OpenCL/m23002_a3-optimized.cl index c5dd6af46..ddf04dcc0 100644 --- a/OpenCL/m23002_a3-optimized.cl +++ b/OpenCL/m23002_a3-optimized.cl @@ -834,7 +834,7 @@ DECLSPEC void m23002s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m23002_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -925,7 +925,7 @@ KERNEL_FQ void m23002_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23002m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23002_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1016,7 +1016,7 @@ KERNEL_FQ void m23002_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23002m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23002_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1107,7 +1107,7 @@ KERNEL_FQ void m23002_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23002m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23002_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1198,7 +1198,7 @@ KERNEL_FQ void m23002_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23002s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23002_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1289,7 +1289,7 @@ KERNEL_FQ void m23002_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23002s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23002_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base diff --git a/OpenCL/m23002_a3-pure.cl b/OpenCL/m23002_a3-pure.cl index 99e99fb2e..4c1399268 100644 --- a/OpenCL/m23002_a3-pure.cl +++ b/OpenCL/m23002_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23002_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -280,7 +280,7 @@ KERNEL_FQ void m23002_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) } } -KERNEL_FQ void m23002_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23002_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23003_a0-optimized.cl b/OpenCL/m23003_a0-optimized.cl index 6a3c918de..508372f1e 100644 --- a/OpenCL/m23003_a0-optimized.cl +++ b/OpenCL/m23003_a0-optimized.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23003_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -407,15 +407,15 @@ KERNEL_FQ void m23003_m04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -796,10 +796,10 @@ KERNEL_FQ void m23003_s04 (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s08 (KERN_ATTR_RULES_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s16 (KERN_ATTR_RULES_ESALT (securezip_t)) { } diff --git a/OpenCL/m23003_a0-pure.cl b/OpenCL/m23003_a0-pure.cl index 123fbda71..ed121ce49 100644 --- a/OpenCL/m23003_a0-pure.cl +++ b/OpenCL/m23003_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23003_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -273,7 +273,7 @@ KERNEL_FQ void m23003_mxx (KERN_ATTR_RULES_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_sxx (KERN_ATTR_RULES_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23003_a1-optimized.cl b/OpenCL/m23003_a1-optimized.cl index de9ad1db1..c5637a0cb 100644 --- a/OpenCL/m23003_a1-optimized.cl +++ b/OpenCL/m23003_a1-optimized.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23003_m04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -463,15 +463,15 @@ KERNEL_FQ void m23003_m04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_m08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_m16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m16 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_s04 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s04 (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -910,10 +910,10 @@ KERNEL_FQ void m23003_s04 (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_s08 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s08 (KERN_ATTR_ESALT (securezip_t)) { } -KERNEL_FQ void m23003_s16 (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s16 (KERN_ATTR_ESALT (securezip_t)) { } diff --git a/OpenCL/m23003_a1-pure.cl b/OpenCL/m23003_a1-pure.cl index bc26fad52..cf2196505 100644 --- a/OpenCL/m23003_a1-pure.cl +++ b/OpenCL/m23003_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23003_mxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_mxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -269,7 +269,7 @@ KERNEL_FQ void m23003_mxx (KERN_ATTR_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_sxx (KERN_ATTR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_sxx (KERN_ATTR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23003_a3-optimized.cl b/OpenCL/m23003_a3-optimized.cl index 1d32074c3..b42f99255 100644 --- a/OpenCL/m23003_a3-optimized.cl +++ b/OpenCL/m23003_a3-optimized.cl @@ -838,7 +838,7 @@ DECLSPEC void m23003s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m23003_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -929,7 +929,7 @@ KERNEL_FQ void m23003_m04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23003m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23003_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1020,7 +1020,7 @@ KERNEL_FQ void m23003_m08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23003m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23003_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1111,7 +1111,7 @@ KERNEL_FQ void m23003_m16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23003m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23003_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1202,7 +1202,7 @@ KERNEL_FQ void m23003_s04 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23003s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23003_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base @@ -1293,7 +1293,7 @@ KERNEL_FQ void m23003_s08 (KERN_ATTR_VECTOR_ESALT (securezip_t)) m23003s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m23003_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_s16 (KERN_ATTR_VECTOR_ESALT (securezip_t)) { /** * base diff --git a/OpenCL/m23003_a3-pure.cl b/OpenCL/m23003_a3-pure.cl index 4c9d79332..0ef8191af 100644 --- a/OpenCL/m23003_a3-pure.cl +++ b/OpenCL/m23003_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct securezip } securezip_t; -KERNEL_FQ void m23003_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -282,7 +282,7 @@ KERNEL_FQ void m23003_mxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) } } -KERNEL_FQ void m23003_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) +KERNEL_FQ KERNEL_FA void m23003_sxx (KERN_ATTR_VECTOR_ESALT (securezip_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23100-pure.cl b/OpenCL/m23100-pure.cl index bdc03f0dc..72944c449 100644 --- a/OpenCL/m23100-pure.cl +++ b/OpenCL/m23100-pure.cl @@ -68,7 +68,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m23100_init (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) +KERNEL_FQ KERNEL_FA void m23100_init (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) { /** * base @@ -140,7 +140,7 @@ KERNEL_FQ void m23100_init (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) } } -KERNEL_FQ void m23100_loop (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) +KERNEL_FQ KERNEL_FA void m23100_loop (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) { const u64 gid = get_global_id (0); @@ -225,7 +225,7 @@ KERNEL_FQ void m23100_loop (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) } } -KERNEL_FQ void m23100_comp (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) +KERNEL_FQ KERNEL_FA void m23100_comp (KERN_ATTR_TMPS_ESALT (keychain_tmp_t, keychain_t)) { /** * base diff --git a/OpenCL/m23200-pure.cl b/OpenCL/m23200-pure.cl index eebe40906..21c8c1e5a 100644 --- a/OpenCL/m23200-pure.cl +++ b/OpenCL/m23200-pure.cl @@ -63,7 +63,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m23200_init (KERN_ATTR_TMPS (xmpp_tmp_t)) +KERNEL_FQ KERNEL_FA void m23200_init (KERN_ATTR_TMPS (xmpp_tmp_t)) { /** * base @@ -135,7 +135,7 @@ KERNEL_FQ void m23200_init (KERN_ATTR_TMPS (xmpp_tmp_t)) } } -KERNEL_FQ void m23200_loop (KERN_ATTR_TMPS (xmpp_tmp_t)) +KERNEL_FQ KERNEL_FA void m23200_loop (KERN_ATTR_TMPS (xmpp_tmp_t)) { const u64 gid = get_global_id (0); @@ -220,7 +220,7 @@ KERNEL_FQ void m23200_loop (KERN_ATTR_TMPS (xmpp_tmp_t)) } } -KERNEL_FQ void m23200_comp (KERN_ATTR_TMPS (xmpp_tmp_t)) +KERNEL_FQ KERNEL_FA void m23200_comp (KERN_ATTR_TMPS (xmpp_tmp_t)) { /** * base diff --git a/OpenCL/m23300-pure.cl b/OpenCL/m23300-pure.cl index 485340612..385fdd6d1 100644 --- a/OpenCL/m23300-pure.cl +++ b/OpenCL/m23300-pure.cl @@ -69,7 +69,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m23300_init (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) +KERNEL_FQ KERNEL_FA void m23300_init (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) { /** * base @@ -158,7 +158,7 @@ KERNEL_FQ void m23300_init (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) } } -KERNEL_FQ void m23300_loop (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) +KERNEL_FQ KERNEL_FA void m23300_loop (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) { const u64 gid = get_global_id (0); @@ -243,7 +243,7 @@ KERNEL_FQ void m23300_loop (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) } } -KERNEL_FQ void m23300_comp (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) +KERNEL_FQ KERNEL_FA void m23300_comp (KERN_ATTR_TMPS_ESALT (iwork_tmp_t, iwork_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23400-pure.cl b/OpenCL/m23400-pure.cl index 091dc8ca6..6a0ae1f11 100644 --- a/OpenCL/m23400-pure.cl +++ b/OpenCL/m23400-pure.cl @@ -69,7 +69,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m23400_init (KERN_ATTR_TMPS (bitwarden_tmp_t)) +KERNEL_FQ KERNEL_FA void m23400_init (KERN_ATTR_TMPS (bitwarden_tmp_t)) { /** * base @@ -150,7 +150,7 @@ KERNEL_FQ void m23400_init (KERN_ATTR_TMPS (bitwarden_tmp_t)) tmps[gid].out[7] = tmps[gid].dgst[7]; } -KERNEL_FQ void m23400_loop (KERN_ATTR_TMPS (bitwarden_tmp_t)) +KERNEL_FQ KERNEL_FA void m23400_loop (KERN_ATTR_TMPS (bitwarden_tmp_t)) { const u64 gid = get_global_id (0); @@ -253,7 +253,7 @@ KERNEL_FQ void m23400_loop (KERN_ATTR_TMPS (bitwarden_tmp_t)) unpackv (tmps, out, gid, 7, out[7]); } -KERNEL_FQ void m23400_init2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) +KERNEL_FQ KERNEL_FA void m23400_init2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) { /** * base @@ -345,7 +345,7 @@ KERNEL_FQ void m23400_init2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) tmps[gid].out[7] = tmps[gid].dgst[7]; } -KERNEL_FQ void m23400_loop2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) +KERNEL_FQ KERNEL_FA void m23400_loop2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) { const u64 gid = get_global_id (0); @@ -448,7 +448,7 @@ KERNEL_FQ void m23400_loop2 (KERN_ATTR_TMPS (bitwarden_tmp_t)) unpackv (tmps, out, gid, 7, out[7]); } -KERNEL_FQ void m23400_comp (KERN_ATTR_TMPS (bitwarden_tmp_t)) +KERNEL_FQ KERNEL_FA void m23400_comp (KERN_ATTR_TMPS (bitwarden_tmp_t)) { /** * base diff --git a/OpenCL/m23500-pure.cl b/OpenCL/m23500-pure.cl index 23def62fe..e4c1a3d10 100644 --- a/OpenCL/m23500-pure.cl +++ b/OpenCL/m23500-pure.cl @@ -93,7 +93,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m23500_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23500_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -197,7 +197,7 @@ KERNEL_FQ void m23500_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23500_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23500_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { const u64 gid = get_global_id (0); @@ -323,7 +323,7 @@ KERNEL_FQ void m23500_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23500_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23500_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -377,7 +377,7 @@ KERNEL_FQ void m23500_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23500_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23500_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -498,7 +498,7 @@ KERNEL_FQ void m23500_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23500_comp (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23500_comp (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base diff --git a/OpenCL/m23600-pure.cl b/OpenCL/m23600-pure.cl index 41f31a873..a1258681b 100644 --- a/OpenCL/m23600-pure.cl +++ b/OpenCL/m23600-pure.cl @@ -93,7 +93,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m23600_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23600_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -197,7 +197,7 @@ KERNEL_FQ void m23600_init (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23600_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23600_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { const u64 gid = get_global_id (0); @@ -323,7 +323,7 @@ KERNEL_FQ void m23600_loop (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23600_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23600_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -389,7 +389,7 @@ KERNEL_FQ void m23600_init2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23600_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23600_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base @@ -514,7 +514,7 @@ KERNEL_FQ void m23600_loop2 (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) } } -KERNEL_FQ void m23600_comp (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) +KERNEL_FQ KERNEL_FA void m23600_comp (KERN_ATTR_TMPS_ESALT (axcrypt2_tmp_t, axcrypt2_t)) { /** * base diff --git a/OpenCL/m23700-optimized.cl b/OpenCL/m23700-optimized.cl index c3c823464..ca5b565d0 100644 --- a/OpenCL/m23700-optimized.cl +++ b/OpenCL/m23700-optimized.cl @@ -137,7 +137,7 @@ DECLSPEC u32 round_crc32_16 (const u32 crc32, PRIVATE_AS const u32 *buf, const u return c; } -KERNEL_FQ void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { /** * base @@ -155,7 +155,7 @@ KERNEL_FQ void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) } /* -KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { const u64 gid = get_global_id (0); @@ -490,7 +490,7 @@ KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) } */ -KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { const u64 gid = get_global_id (0); @@ -679,7 +679,7 @@ KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) tmps[gid].dgst[init_pos + 1][4] = dgst[4]; } -KERNEL_FQ void m23700_comp (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_comp (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23700-pure.cl b/OpenCL/m23700-pure.cl index 468711e2f..4e520a5cd 100644 --- a/OpenCL/m23700-pure.cl +++ b/OpenCL/m23700-pure.cl @@ -836,7 +836,7 @@ DECLSPEC void sha1_update_rar29 (PRIVATE_AS sha1_ctx_t *ctx, PRIVATE_AS u32 *w, } } -KERNEL_FQ void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { /** * base @@ -904,7 +904,7 @@ KERNEL_FQ void m23700_init (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) tmps[gid].iv[3] = 0; } -KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { const u64 gid = get_global_id (0); @@ -1020,7 +1020,7 @@ KERNEL_FQ void m23700_loop (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) } } -KERNEL_FQ void m23700_comp (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23700_comp (KERN_ATTR_TMPS_ESALT (rar3_tmp_t, rar3_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m23800-optimized.cl b/OpenCL/m23800-optimized.cl index 2d7bc57e6..5551cf0cd 100644 --- a/OpenCL/m23800-optimized.cl +++ b/OpenCL/m23800-optimized.cl @@ -44,11 +44,13 @@ typedef struct rar3_hook u32 first_block_decrypted[4]; + u32 unpack_failed; + u32 crc32; } rar3_hook_t; -KERNEL_FQ void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { /** * base @@ -65,7 +67,7 @@ KERNEL_FQ void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, tmps[gid].dgst[0][4] = SHA1M_E; } -KERNEL_FQ void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { const u64 gid = get_global_id (0); @@ -254,7 +256,7 @@ KERNEL_FQ void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, tmps[gid].dgst[init_pos + 1][4] = dgst[4]; } -KERNEL_FQ void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -485,7 +487,7 @@ KERNEL_FQ void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_ hooks[gid].first_block_decrypted[3] = hc_swap32_S (out[3]); } -KERNEL_FQ void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { /** * base @@ -495,6 +497,8 @@ KERNEL_FQ void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, if (gid >= GID_CNT) return; + if (hooks[gid].unpack_failed == 1) return; + u32 crc32 = hooks[gid].crc32; const u32 r0 = crc32; diff --git a/OpenCL/m23800-pure.cl b/OpenCL/m23800-pure.cl index 2db5f69a1..71bd9a50f 100644 --- a/OpenCL/m23800-pure.cl +++ b/OpenCL/m23800-pure.cl @@ -42,6 +42,8 @@ typedef struct rar3_hook u32 first_block_decrypted[4]; + u32 unpack_failed; + u32 crc32; } rar3_hook_t; @@ -747,7 +749,7 @@ DECLSPEC void sha1_update_rar29 (PRIVATE_AS sha1_ctx_t *ctx, PRIVATE_AS u32 *w, } } -KERNEL_FQ void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { /** * base @@ -815,7 +817,7 @@ KERNEL_FQ void m23800_init (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, tmps[gid].iv[3] = 0; } -KERNEL_FQ void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { const u64 gid = get_global_id (0); @@ -931,7 +933,7 @@ KERNEL_FQ void m23800_loop (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, } } -KERNEL_FQ void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -1086,7 +1088,7 @@ KERNEL_FQ void m23800_hook23 (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_ hooks[gid].first_block_decrypted[3] = hc_swap32_S (out[3]); } -KERNEL_FQ void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) +KERNEL_FQ KERNEL_FA void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, rar3_t)) { /** * base @@ -1096,6 +1098,8 @@ KERNEL_FQ void m23800_comp (KERN_ATTR_TMPS_HOOKS_ESALT (rar3_tmp_t, rar3_hook_t, if (gid >= GID_CNT) return; + if (hooks[gid].unpack_failed == 1) return; + u32 crc32 = hooks[gid].crc32; const u32 r0 = crc32; diff --git a/OpenCL/m23900-pure.cl b/OpenCL/m23900-pure.cl index bc99e371d..415acbede 100644 --- a/OpenCL/m23900-pure.cl +++ b/OpenCL/m23900-pure.cl @@ -29,7 +29,7 @@ typedef struct bestcrypt } bestcrypt_t; -KERNEL_FQ void m23900_init (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) +KERNEL_FQ KERNEL_FA void m23900_init (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) { const u64 gid = get_global_id (0); @@ -103,7 +103,7 @@ KERNEL_FQ void m23900_init (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) } } -KERNEL_FQ void m23900_loop (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) +KERNEL_FQ KERNEL_FA void m23900_loop (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) { const u64 gid = get_global_id (0); @@ -251,7 +251,7 @@ KERNEL_FQ void m23900_loop (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) tmps[gid].out[7] = digest[7]; } -KERNEL_FQ void m23900_comp (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) +KERNEL_FQ KERNEL_FA void m23900_comp (KERN_ATTR_TMPS_ESALT (bestcrypt_tmp_t, bestcrypt_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24000-pure.cl b/OpenCL/m24000-pure.cl index 37e219e2c..a80607187 100644 --- a/OpenCL/m24000-pure.cl +++ b/OpenCL/m24000-pure.cl @@ -9,22 +9,13 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #include M2S(INCLUDE_PATH/inc_cipher_twofish.cl) #include M2S(INCLUDE_PATH/inc_cipher_serpent.cl) #include M2S(INCLUDE_PATH/inc_cipher_camellia.cl) #endif -typedef struct -{ - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - typedef struct bestcrypt_scrypt { u32 salt_buf[24]; @@ -33,284 +24,6 @@ typedef struct bestcrypt_scrypt } bestcrypt_scrypt_t; -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) -{ - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define SALSA20_8_XOR() \ -{ \ - R0 = R0 ^ Y0; \ - R1 = R1 ^ Y1; \ - R2 = R2 ^ Y2; \ - R3 = R3 ^ Y3; \ - \ - uint4 X0 = R0; \ - uint4 X1 = R1; \ - uint4 X2 = R2; \ - uint4 X3 = R3; \ - \ - SALSA20_2R (); \ - SALSA20_2R (); \ - SALSA20_2R (); \ - SALSA20_2R (); \ - \ - R0 = R0 + X0; \ - R1 = R1 + X1; \ - R2 = R2 + X2; \ - R3 = R3 + X3; \ -} - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - uint4 TO[STATE_CNT4]; - - int idx_y = 0; - int idx_r1 = 0; - int idx_r2 = SCRYPT_R * 4; - - for (int i = 0; i < SCRYPT_R; i++) - { - uint4 Y0; - uint4 Y1; - uint4 Y2; - uint4 Y3; - - Y0 = TI[idx_y++]; - Y1 = TI[idx_y++]; - Y2 = TI[idx_y++]; - Y3 = TI[idx_y++]; - - SALSA20_8_XOR (); - - TO[idx_r1++] = R0; - TO[idx_r1++] = R1; - TO[idx_r1++] = R2; - TO[idx_r1++] = R3; - - Y0 = TI[idx_y++]; - Y1 = TI[idx_y++]; - Y2 = TI[idx_y++]; - Y3 = TI[idx_y++]; - - SALSA20_8_XOR (); - - TO[idx_r2++] = R0; - TO[idx_r2++] = R1; - TO[idx_r2++] = R2; - TO[idx_r2++] = R3; - } - - #pragma unroll - for (int i = 0; i < STATE_CNT4; i++) - { - TI[i] = TO[i]; - } -} - -DECLSPEC void scrypt_smix (PRIVATE_AS uint4 *X, PRIVATE_AS uint4 *T, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - #define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) - #define CO Coord(xd4,y,z) - - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #ifdef _unroll - #pragma unroll - #endif - for (u32 i = 0; i < STATE_CNT4; i += 4) - { - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[i + 0].x, X[i + 1].y, X[i + 2].z, X[i + 3].w); - T[1] = make_uint4 (X[i + 1].x, X[i + 2].y, X[i + 3].z, X[i + 0].w); - T[2] = make_uint4 (X[i + 2].x, X[i + 3].y, X[i + 0].z, X[i + 1].w); - T[3] = make_uint4 (X[i + 3].x, X[i + 0].y, X[i + 1].z, X[i + 2].w); - #elif defined IS_METAL - T[0] = uint4 (X[i + 0].x, X[i + 1].y, X[i + 2].z, X[i + 3].w); - T[1] = uint4 (X[i + 1].x, X[i + 2].y, X[i + 3].z, X[i + 0].w); - T[2] = uint4 (X[i + 2].x, X[i + 3].y, X[i + 0].z, X[i + 1].w); - T[3] = uint4 (X[i + 3].x, X[i + 0].y, X[i + 1].z, X[i + 2].w); - #else - T[0] = (uint4) (X[i + 0].x, X[i + 1].y, X[i + 2].z, X[i + 3].w); - T[1] = (uint4) (X[i + 1].x, X[i + 2].y, X[i + 3].z, X[i + 0].w); - T[2] = (uint4) (X[i + 2].x, X[i + 3].y, X[i + 0].z, X[i + 1].w); - T[3] = (uint4) (X[i + 3].x, X[i + 0].y, X[i + 1].z, X[i + 2].w); - #endif - - X[i + 0] = T[0]; - X[i + 1] = T[1]; - X[i + 2] = T[2]; - X[i + 3] = T[3]; - } - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } - - for (u32 i = 0; i < SCRYPT_N; i++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } - - #ifdef _unroll - #pragma unroll - #endif - for (u32 i = 0; i < STATE_CNT4; i += 4) - { - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[i + 0].x, X[i + 3].y, X[i + 2].z, X[i + 1].w); - T[1] = make_uint4 (X[i + 1].x, X[i + 0].y, X[i + 3].z, X[i + 2].w); - T[2] = make_uint4 (X[i + 2].x, X[i + 1].y, X[i + 0].z, X[i + 3].w); - T[3] = make_uint4 (X[i + 3].x, X[i + 2].y, X[i + 1].z, X[i + 0].w); - #elif defined IS_METAL - T[0] = uint4 (X[i + 0].x, X[i + 3].y, X[i + 2].z, X[i + 1].w); - T[1] = uint4 (X[i + 1].x, X[i + 0].y, X[i + 3].z, X[i + 2].w); - T[2] = uint4 (X[i + 2].x, X[i + 1].y, X[i + 0].z, X[i + 3].w); - T[3] = uint4 (X[i + 3].x, X[i + 2].y, X[i + 1].z, X[i + 0].w); - #else - T[0] = (uint4) (X[i + 0].x, X[i + 3].y, X[i + 2].z, X[i + 1].w); - T[1] = (uint4) (X[i + 1].x, X[i + 0].y, X[i + 3].z, X[i + 2].w); - T[2] = (uint4) (X[i + 2].x, X[i + 1].y, X[i + 0].z, X[i + 3].w); - T[3] = (uint4) (X[i + 3].x, X[i + 2].y, X[i + 1].z, X[i + 0].w); - #endif - - X[i + 0] = T[0]; - X[i + 1] = T[1]; - X[i + 2] = T[2]; - X[i + 3] = T[3]; - } -} - #ifndef KECCAK_ROUNDS #define KECCAK_ROUNDS 24 #endif @@ -442,118 +155,51 @@ DECLSPEC void keccak_transform_S (PRIVATE_AS u64 *st) } } -KERNEL_FQ void m24000_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - - if (gid >= GID_CNT) return; - - sha256_hmac_ctx_t sha256_hmac_ctx; - - sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); - - sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } -} - -KERNEL_FQ void m24000_loop (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) +KERNEL_FQ KERNEL_FA void m24000_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) { const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + scrypt_pbkdf2_ggg (pws[gid].i, pws[gid].pw_len, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len, tmps[gid].in, SCRYPT_SZ); - uint4 X[STATE_CNT4]; - uint4 T[STATE_CNT4]; - - #ifdef _unroll - #pragma unroll - #endif - for (int z = 0; z < STATE_CNT4; z++) X[z] = hc_swap32_4 (tmps[gid].P[z]); - - scrypt_smix (X, T, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - #ifdef _unroll - #pragma unroll - #endif - for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[z] = hc_swap32_4 (X[z]); - - #if SCRYPT_P >= 1 - for (int i = STATE_CNT4; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (int z = 0; z < STATE_CNT4; z++) X[z] = hc_swap32_4 (tmps[gid].P[i + z]); - - scrypt_smix (X, T, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) tmps[gid].P[i + z] = hc_swap32_4 (X[z]); - } - #endif + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) +KERNEL_FQ KERNEL_FA void m24000_loop_prepare (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); + + if (gid >= GID_CNT) return; + + u32 X[STATE_CNT4]; + + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); + + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} + +KERNEL_FQ KERNEL_FA void m24000_loop (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); + + if (gid >= GID_CNT) return; + + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; + + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); + + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} + +KERNEL_FQ KERNEL_FA void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt_t)) { /** * base @@ -613,80 +259,13 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt CONSTANT_AS u32a *s_te4 = te4; #endif - /** - * AES part - */ - if (gid >= GID_CNT) return; - /** - * 2nd pbkdf2, creates B - */ + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32 out[8]; - sha256_hmac_ctx_t ctx; - - sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 tmp; - - tmp = tmps[gid].P[l + 0]; - - w0[0] = tmp.x; - w0[1] = tmp.y; - w0[2] = tmp.z; - w0[3] = tmp.w; - - tmp = tmps[gid].P[l + 1]; - - w1[0] = tmp.x; - w1[1] = tmp.y; - w1[2] = tmp.z; - w1[3] = tmp.w; - - tmp = tmps[gid].P[l + 2]; - - w2[0] = tmp.x; - w2[1] = tmp.y; - w2[2] = tmp.z; - w2[3] = tmp.w; - - tmp = tmps[gid].P[l + 3]; - - w3[0] = tmp.x; - w3[1] = tmp.y; - w3[2] = tmp.z; - w3[3] = tmp.w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); + scrypt_pbkdf2_ggp (pws[gid].i, pws[gid].pw_len, tmps[gid].in, SCRYPT_SZ, out, 32); u32 version = esalt_bufs[DIGESTS_OFFSET_HOST].version; @@ -694,14 +273,24 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt u32 res[20]; // full would be 24 x u32 (96 bytes) + u32 key[8]; + + key[0] = out[0]; + key[1] = out[1]; + key[2] = out[2]; + key[3] = out[3]; + key[4] = out[4]; + key[5] = out[5]; + key[6] = out[6]; + key[7] = out[7]; + if (version == 0x38) //0x38 is char for '8' which is the crypto type passed in position 3 of hash ( $08$ ) { - #define KEYLEN 60 u32 ks[KEYLEN]; - AES256_set_decrypt_key (ks, ctx.opad.h, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + aes256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); for (u32 i = 0; i < 20; i += 4) // 96 bytes output would contain the full 32 byte checksum { @@ -728,22 +317,12 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt } } - if (version == 0x39) //0x39 is char for '9' which is the crypto type passed in position 3 of hash ( $09$ ) { u32 sk[4]; u32 lk[40]; - ctx.opad.h[0] = hc_swap32_S (ctx.opad.h[0]); - ctx.opad.h[1] = hc_swap32_S (ctx.opad.h[1]); - ctx.opad.h[2] = hc_swap32_S (ctx.opad.h[2]); - ctx.opad.h[3] = hc_swap32_S (ctx.opad.h[3]); - ctx.opad.h[4] = hc_swap32_S (ctx.opad.h[4]); - ctx.opad.h[5] = hc_swap32_S (ctx.opad.h[5]); - ctx.opad.h[6] = hc_swap32_S (ctx.opad.h[6]); - ctx.opad.h[7] = hc_swap32_S (ctx.opad.h[7]); - - twofish256_set_key (sk, lk, ctx.opad.h); + twofish256_set_key (sk, lk, key); for (u32 i = 0; i < 20; i += 4) // 96 bytes output would contain the full 32 byte checksum { @@ -754,7 +333,6 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt data[2] = esalt_bufs[DIGESTS_OFFSET_HOST].ciphertext[i + 2]; data[3] = esalt_bufs[DIGESTS_OFFSET_HOST].ciphertext[i + 3]; - u32 out[4]; twofish256_decrypt (sk, lk, data, out); @@ -775,16 +353,7 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt { u32 ks_serpent[140]; - ctx.opad.h[0] = hc_swap32_S (ctx.opad.h[0]); - ctx.opad.h[1] = hc_swap32_S (ctx.opad.h[1]); - ctx.opad.h[2] = hc_swap32_S (ctx.opad.h[2]); - ctx.opad.h[3] = hc_swap32_S (ctx.opad.h[3]); - ctx.opad.h[4] = hc_swap32_S (ctx.opad.h[4]); - ctx.opad.h[5] = hc_swap32_S (ctx.opad.h[5]); - ctx.opad.h[6] = hc_swap32_S (ctx.opad.h[6]); - ctx.opad.h[7] = hc_swap32_S (ctx.opad.h[7]); - - serpent256_set_key (ks_serpent, ctx.opad.h); + serpent256_set_key (ks_serpent, key); for (u32 i = 0; i < 20; i += 4) // 96 bytes output would contain the full 32 byte checksum { @@ -816,16 +385,7 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt { u32 ks_camellia[68]; - ctx.opad.h[0] = hc_swap32_S (ctx.opad.h[0]); - ctx.opad.h[1] = hc_swap32_S (ctx.opad.h[1]); - ctx.opad.h[2] = hc_swap32_S (ctx.opad.h[2]); - ctx.opad.h[3] = hc_swap32_S (ctx.opad.h[3]); - ctx.opad.h[4] = hc_swap32_S (ctx.opad.h[4]); - ctx.opad.h[5] = hc_swap32_S (ctx.opad.h[5]); - ctx.opad.h[6] = hc_swap32_S (ctx.opad.h[6]); - ctx.opad.h[7] = hc_swap32_S (ctx.opad.h[7]); - - camellia256_set_key (ks_camellia, ctx.opad.h); + camellia256_set_key (ks_camellia, key); for (u32 i = 0; i < 20; i += 4) // 96 bytes output would contain the full 32 byte checksum { @@ -864,6 +424,11 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt digest[6] = SHA256M_G; digest[7] = SHA256M_H; + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + w0[0] = res[ 0]; w0[1] = res[ 1]; w0[2] = res[ 2]; @@ -915,3 +480,4 @@ KERNEL_FQ void m24000_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, bestcrypt_scrypt return; } } + diff --git a/OpenCL/m24100-pure.cl b/OpenCL/m24100-pure.cl index 8f8842e7c..79adf0f62 100644 --- a/OpenCL/m24100-pure.cl +++ b/OpenCL/m24100-pure.cl @@ -73,7 +73,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24100_init (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) +KERNEL_FQ KERNEL_FA void m24100_init (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) { /** * modifier @@ -199,7 +199,7 @@ KERNEL_FQ void m24100_init (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sh } } -KERNEL_FQ void m24100_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) +KERNEL_FQ KERNEL_FA void m24100_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) { const u64 gid = get_global_id (0); @@ -284,7 +284,7 @@ KERNEL_FQ void m24100_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sh } } -KERNEL_FQ void m24100_comp (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) +KERNEL_FQ KERNEL_FA void m24100_comp (KERN_ATTR_TMPS_ESALT (mongodb_sha1_tmp_t, mongodb_sha1_t)) { /** * base diff --git a/OpenCL/m24200-pure.cl b/OpenCL/m24200-pure.cl index 6cf9e8a79..a1ec3e140 100644 --- a/OpenCL/m24200-pure.cl +++ b/OpenCL/m24200-pure.cl @@ -78,7 +78,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24200_init (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) +KERNEL_FQ KERNEL_FA void m24200_init (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) { /** * base @@ -162,7 +162,7 @@ KERNEL_FQ void m24200_init (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_ } } -KERNEL_FQ void m24200_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) +KERNEL_FQ KERNEL_FA void m24200_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) { const u64 gid = get_global_id (0); @@ -268,7 +268,7 @@ KERNEL_FQ void m24200_loop (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_ } } -KERNEL_FQ void m24200_comp (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) +KERNEL_FQ KERNEL_FA void m24200_comp (KERN_ATTR_TMPS_ESALT (mongodb_sha256_tmp_t, mongodb_sha256_t)) { /** * base diff --git a/OpenCL/m24300_a0-optimized.cl b/OpenCL/m24300_a0-optimized.cl index 5f595ac64..afb2e0179 100644 --- a/OpenCL/m24300_a0-optimized.cl +++ b/OpenCL/m24300_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m24300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_m04 (KERN_ATTR_RULES ()) { /** * base @@ -635,15 +635,15 @@ KERNEL_FQ void m24300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_s04 (KERN_ATTR_RULES ()) { /** * base @@ -1263,10 +1263,10 @@ KERNEL_FQ void m24300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m24300_a0-pure.cl b/OpenCL/m24300_a0-pure.cl index f4d9ea8ba..9fa7ba09e 100644 --- a/OpenCL/m24300_a0-pure.cl +++ b/OpenCL/m24300_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m24300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -142,7 +142,7 @@ KERNEL_FQ void m24300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m24300_a1-optimized.cl b/OpenCL/m24300_a1-optimized.cl index 153ba475a..27fece6e3 100644 --- a/OpenCL/m24300_a1-optimized.cl +++ b/OpenCL/m24300_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m24300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -689,15 +689,15 @@ KERNEL_FQ void m24300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1372,10 +1372,10 @@ KERNEL_FQ void m24300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m24300_a1-pure.cl b/OpenCL/m24300_a1-pure.cl index d5d00c6eb..84f2cf3e7 100644 --- a/OpenCL/m24300_a1-pure.cl +++ b/OpenCL/m24300_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m24300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -138,7 +138,7 @@ KERNEL_FQ void m24300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m24300_a3-optimized.cl b/OpenCL/m24300_a3-optimized.cl index c48755420..a3125ea93 100644 --- a/OpenCL/m24300_a3-optimized.cl +++ b/OpenCL/m24300_a3-optimized.cl @@ -1162,7 +1162,7 @@ DECLSPEC void m24300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m24300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -1232,7 +1232,7 @@ KERNEL_FQ void m24300_m04 (KERN_ATTR_BASIC ()) m24300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m24300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1302,7 +1302,7 @@ KERNEL_FQ void m24300_m08 (KERN_ATTR_BASIC ()) m24300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m24300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1372,7 +1372,7 @@ KERNEL_FQ void m24300_m16 (KERN_ATTR_BASIC ()) m24300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m24300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1442,7 +1442,7 @@ KERNEL_FQ void m24300_s04 (KERN_ATTR_BASIC ()) m24300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m24300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1512,7 +1512,7 @@ KERNEL_FQ void m24300_s08 (KERN_ATTR_BASIC ()) m24300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m24300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24300_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m24300_a3-pure.cl b/OpenCL/m24300_a3-pure.cl index 776d6dfaa..fdd1da566 100644 --- a/OpenCL/m24300_a3-pure.cl +++ b/OpenCL/m24300_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m24300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -162,7 +162,7 @@ KERNEL_FQ void m24300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m24300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m24410-pure.cl b/OpenCL/m24410-pure.cl index d0553cb40..7d19c4023 100644 --- a/OpenCL/m24410-pure.cl +++ b/OpenCL/m24410-pure.cl @@ -90,7 +90,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24410_init (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24410_init (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) { /** * base @@ -169,7 +169,7 @@ KERNEL_FQ void m24410_init (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) } } -KERNEL_FQ void m24410_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24410_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) { const u64 gid = get_global_id (0); @@ -261,7 +261,7 @@ KERNEL_FQ void m24410_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) } } -KERNEL_FQ void m24410_comp (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24410_comp (KERN_ATTR_TMPS_ESALT (pkcs_sha1_tmp_t, pkcs_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24420-pure.cl b/OpenCL/m24420-pure.cl index 2da61b238..613d03862 100644 --- a/OpenCL/m24420-pure.cl +++ b/OpenCL/m24420-pure.cl @@ -89,7 +89,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24420_init (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24420_init (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) { /** * base @@ -173,7 +173,7 @@ KERNEL_FQ void m24420_init (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) } } -KERNEL_FQ void m24420_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24420_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) { const u64 gid = get_global_id (0); @@ -279,7 +279,7 @@ KERNEL_FQ void m24420_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) } } -KERNEL_FQ void m24420_comp (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +KERNEL_FQ KERNEL_FA void m24420_comp (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24500-pure.cl b/OpenCL/m24500-pure.cl index 2eaf5e8c8..6a926cccc 100644 --- a/OpenCL/m24500-pure.cl +++ b/OpenCL/m24500-pure.cl @@ -131,7 +131,7 @@ DECLSPEC void sha1_run (PRIVATE_AS u32 *w, PRIVATE_AS u32 *res) res[4] = digest[4]; } -KERNEL_FQ void m24500_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m24500_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { /** * base @@ -266,7 +266,7 @@ KERNEL_FQ void m24500_init (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) } } -KERNEL_FQ void m24500_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m24500_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { const u64 gid = get_global_id (0); @@ -392,7 +392,7 @@ KERNEL_FQ void m24500_loop (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) } } -KERNEL_FQ void m24500_comp (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) +KERNEL_FQ KERNEL_FA void m24500_comp (KERN_ATTR_TMPS_ESALT (telegram_tmp_t, telegram_t)) { /** * base diff --git a/OpenCL/m24610-pure.cl b/OpenCL/m24610-pure.cl index 798070ddb..a21bff789 100644 --- a/OpenCL/m24610-pure.cl +++ b/OpenCL/m24610-pure.cl @@ -73,7 +73,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24610_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24610_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) { /** * base @@ -145,7 +145,7 @@ KERNEL_FQ void m24610_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlciphe } } -KERNEL_FQ void m24610_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24610_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); @@ -230,7 +230,7 @@ KERNEL_FQ void m24610_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlciphe } } -KERNEL_FQ void m24610_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24610_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha1_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24620-pure.cl b/OpenCL/m24620-pure.cl index 863e9cc31..dd794ee87 100644 --- a/OpenCL/m24620-pure.cl +++ b/OpenCL/m24620-pure.cl @@ -79,7 +79,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24620_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24620_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) { /** * base @@ -163,7 +163,7 @@ KERNEL_FQ void m24620_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcip } } -KERNEL_FQ void m24620_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24620_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); @@ -269,7 +269,7 @@ KERNEL_FQ void m24620_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcip } } -KERNEL_FQ void m24620_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24620_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha256_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24630-pure.cl b/OpenCL/m24630-pure.cl index d1c26a400..fc868004a 100644 --- a/OpenCL/m24630-pure.cl +++ b/OpenCL/m24630-pure.cl @@ -95,7 +95,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m24630_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24630_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) { /** * base @@ -199,7 +199,7 @@ KERNEL_FQ void m24630_init (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcip } } -KERNEL_FQ void m24630_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24630_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); @@ -325,7 +325,7 @@ KERNEL_FQ void m24630_loop (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcip } } -KERNEL_FQ void m24630_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) +KERNEL_FQ KERNEL_FA void m24630_comp (KERN_ATTR_TMPS_ESALT (sqlcipher_sha512_tmp_t, sqlcipher_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m24700_a0-optimized.cl b/OpenCL/m24700_a0-optimized.cl index 8a351fb6f..107bd2c25 100644 --- a/OpenCL/m24700_a0-optimized.cl +++ b/OpenCL/m24700_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -240,15 +240,15 @@ KERNEL_FQ void m24700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -487,10 +487,10 @@ KERNEL_FQ void m24700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m24700_a0-pure.cl b/OpenCL/m24700_a0-pure.cl index afffe62cf..f714f31d4 100644 --- a/OpenCL/m24700_a0-pure.cl +++ b/OpenCL/m24700_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -73,7 +73,7 @@ KERNEL_FQ void m24700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m24700_a1-optimized.cl b/OpenCL/m24700_a1-optimized.cl index 65f3bd1ac..e6938e04c 100644 --- a/OpenCL/m24700_a1-optimized.cl +++ b/OpenCL/m24700_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -297,15 +297,15 @@ KERNEL_FQ void m24700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -603,10 +603,10 @@ KERNEL_FQ void m24700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m24700_a1-pure.cl b/OpenCL/m24700_a1-pure.cl index 35c81b748..9e2edac7b 100644 --- a/OpenCL/m24700_a1-pure.cl +++ b/OpenCL/m24700_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m24700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m24700_a3-optimized.cl b/OpenCL/m24700_a3-optimized.cl index 231f129de..1530b4ee0 100644 --- a/OpenCL/m24700_a3-optimized.cl +++ b/OpenCL/m24700_a3-optimized.cl @@ -473,7 +473,7 @@ DECLSPEC void m24700s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m24700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -526,7 +526,7 @@ KERNEL_FQ void m24700_m04 (KERN_ATTR_BASIC ()) m24700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -579,7 +579,7 @@ KERNEL_FQ void m24700_m08 (KERN_ATTR_BASIC ()) m24700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -632,7 +632,7 @@ KERNEL_FQ void m24700_m16 (KERN_ATTR_BASIC ()) m24700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -685,7 +685,7 @@ KERNEL_FQ void m24700_s04 (KERN_ATTR_BASIC ()) m24700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -738,7 +738,7 @@ KERNEL_FQ void m24700_s08 (KERN_ATTR_BASIC ()) m24700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24700_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m24700_a3-pure.cl b/OpenCL/m24700_a3-pure.cl index 081c2bc22..3becd9709 100644 --- a/OpenCL/m24700_a3-pure.cl +++ b/OpenCL/m24700_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -82,7 +82,7 @@ KERNEL_FQ void m24700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m24700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m24800_a0-optimized.cl b/OpenCL/m24800_a0-optimized.cl index 23be925b2..a7e2132a6 100644 --- a/OpenCL/m24800_a0-optimized.cl +++ b/OpenCL/m24800_a0-optimized.cl @@ -105,7 +105,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -219,15 +219,15 @@ KERNEL_FQ void m24800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -353,10 +353,10 @@ KERNEL_FQ void m24800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m24800_a0-pure.cl b/OpenCL/m24800_a0-pure.cl index 512ecec1c..2afaff370 100644 --- a/OpenCL/m24800_a0-pure.cl +++ b/OpenCL/m24800_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m24800_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -72,7 +72,7 @@ KERNEL_FQ void m24800_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24800_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24800_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m24800_a1-optimized.cl b/OpenCL/m24800_a1-optimized.cl index fe26c52ca..18d96b694 100644 --- a/OpenCL/m24800_a1-optimized.cl +++ b/OpenCL/m24800_a1-optimized.cl @@ -103,7 +103,7 @@ DECLSPEC void hmac_sha1_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_A sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m24800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -269,15 +269,15 @@ KERNEL_FQ void m24800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -455,10 +455,10 @@ KERNEL_FQ void m24800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m24800_a1-pure.cl b/OpenCL/m24800_a1-pure.cl index a1b2766f7..e427e4ef3 100644 --- a/OpenCL/m24800_a1-pure.cl +++ b/OpenCL/m24800_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m24800_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -95,7 +95,7 @@ KERNEL_FQ void m24800_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24800_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m24800_a3-optimized.cl b/OpenCL/m24800_a3-optimized.cl index 80a8c5b2b..adedf6a26 100644 --- a/OpenCL/m24800_a3-optimized.cl +++ b/OpenCL/m24800_a3-optimized.cl @@ -323,7 +323,7 @@ DECLSPEC void m24800s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m24800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -372,7 +372,7 @@ KERNEL_FQ void m24800_m04 (KERN_ATTR_BASIC ()) m24800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -421,7 +421,7 @@ KERNEL_FQ void m24800_m08 (KERN_ATTR_BASIC ()) m24800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -470,7 +470,7 @@ KERNEL_FQ void m24800_m16 (KERN_ATTR_BASIC ()) m24800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -519,7 +519,7 @@ KERNEL_FQ void m24800_s04 (KERN_ATTR_BASIC ()) m24800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -568,7 +568,7 @@ KERNEL_FQ void m24800_s08 (KERN_ATTR_BASIC ()) m24800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24800_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m24800_a3-pure.cl b/OpenCL/m24800_a3-pure.cl index cb76326ec..791eb85ca 100644 --- a/OpenCL/m24800_a3-pure.cl +++ b/OpenCL/m24800_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m24800_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24800_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -81,7 +81,7 @@ KERNEL_FQ void m24800_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m24800_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m24800_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m24900_a0-optimized.cl b/OpenCL/m24900_a0-optimized.cl index f22a0c59b..0e69cb252 100644 --- a/OpenCL/m24900_a0-optimized.cl +++ b/OpenCL/m24900_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -162,15 +162,15 @@ KERNEL_FQ void m24900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -328,10 +328,10 @@ KERNEL_FQ void m24900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m24900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m24900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m24900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m24900_a1-optimized.cl b/OpenCL/m24900_a1-optimized.cl index 9bff24186..b0315f681 100644 --- a/OpenCL/m24900_a1-optimized.cl +++ b/OpenCL/m24900_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m24900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -220,15 +220,15 @@ KERNEL_FQ void m24900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -445,10 +445,10 @@ KERNEL_FQ void m24900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m24900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m24900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m24900_a3-optimized.cl b/OpenCL/m24900_a3-optimized.cl index 432dab27b..04bdbe539 100644 --- a/OpenCL/m24900_a3-optimized.cl +++ b/OpenCL/m24900_a3-optimized.cl @@ -310,7 +310,7 @@ DECLSPEC void m24900s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m24900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -359,7 +359,7 @@ KERNEL_FQ void m24900_m04 (KERN_ATTR_BASIC ()) m24900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -408,7 +408,7 @@ KERNEL_FQ void m24900_m08 (KERN_ATTR_BASIC ()) m24900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -457,7 +457,7 @@ KERNEL_FQ void m24900_m16 (KERN_ATTR_BASIC ()) m24900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -506,7 +506,7 @@ KERNEL_FQ void m24900_s04 (KERN_ATTR_BASIC ()) m24900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -555,7 +555,7 @@ KERNEL_FQ void m24900_s08 (KERN_ATTR_BASIC ()) m24900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m24900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m24900_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m25000-pure.cl b/OpenCL/m25000-pure.cl index a6325c37a..8efb6366c 100644 --- a/OpenCL/m25000-pure.cl +++ b/OpenCL/m25000-pure.cl @@ -59,7 +59,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m25000_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25000_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * modifier @@ -165,7 +165,7 @@ KERNEL_FQ void m25000_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) tmps[gid].h_sha1[4] = SHA1M_E; } -KERNEL_FQ void m25000_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25000_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * base @@ -337,7 +337,7 @@ KERNEL_FQ void m25000_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) tmps[gid].h_sha1[4] = h_sha1[4]; } -KERNEL_FQ void m25000_comp (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25000_comp (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m25100-pure.cl b/OpenCL/m25100-pure.cl index 63fdebd20..a8555530c 100644 --- a/OpenCL/m25100-pure.cl +++ b/OpenCL/m25100-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m25100_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25100_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * modifier @@ -131,7 +131,7 @@ KERNEL_FQ void m25100_init (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) tmps[gid].h[3] = MD5M_D; } -KERNEL_FQ void m25100_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25100_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * base @@ -228,7 +228,7 @@ KERNEL_FQ void m25100_loop (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) tmps[gid].h[3] = h[3]; } -KERNEL_FQ void m25100_comp (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25100_comp (KERN_ATTR_TMPS_ESALT (hmac_md5_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m25200-pure.cl b/OpenCL/m25200-pure.cl index 82ae963dc..e4bcea075 100644 --- a/OpenCL/m25200-pure.cl +++ b/OpenCL/m25200-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m25200_init (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25200_init (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) { /** * modifier @@ -132,7 +132,7 @@ KERNEL_FQ void m25200_init (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) tmps[gid].h[4] = SHA1M_E; } -KERNEL_FQ void m25200_loop (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25200_loop (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) { /** * base @@ -231,7 +231,7 @@ KERNEL_FQ void m25200_loop (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) tmps[gid].h[4] = h[4]; } -KERNEL_FQ void m25200_comp (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m25200_comp (KERN_ATTR_TMPS_ESALT (hmac_sha1_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m25300-pure.cl b/OpenCL/m25300-pure.cl index b7f6ebceb..04c2ca6f1 100644 --- a/OpenCL/m25300-pure.cl +++ b/OpenCL/m25300-pure.cl @@ -23,7 +23,7 @@ typedef struct office2016_tmp } office2016_tmp_t; -KERNEL_FQ void m25300_init (KERN_ATTR_TMPS (office2016_tmp_t)) +KERNEL_FQ KERNEL_FA void m25300_init (KERN_ATTR_TMPS (office2016_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m25300_init (KERN_ATTR_TMPS (office2016_tmp_t)) tmps[gid].out[7] = ctx.h[7]; } -KERNEL_FQ void m25300_loop (KERN_ATTR_TMPS (office2016_tmp_t)) +KERNEL_FQ KERNEL_FA void m25300_loop (KERN_ATTR_TMPS (office2016_tmp_t)) { const u64 gid = get_global_id (0); @@ -163,7 +163,7 @@ KERNEL_FQ void m25300_loop (KERN_ATTR_TMPS (office2016_tmp_t)) unpack64v (tmps, out, gid, 7, t7); } -KERNEL_FQ void m25300_comp (KERN_ATTR_TMPS (office2016_tmp_t)) +KERNEL_FQ KERNEL_FA void m25300_comp (KERN_ATTR_TMPS (office2016_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m25400-pure.cl b/OpenCL/m25400-pure.cl index 6ad2d1034..ae10ebc42 100644 --- a/OpenCL/m25400-pure.cl +++ b/OpenCL/m25400-pure.cl @@ -49,7 +49,7 @@ typedef struct pdf14_tmp } pdf14_tmp_t; -KERNEL_FQ void m25400_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m25400_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { /** * base @@ -191,7 +191,7 @@ KERNEL_FQ void m25400_init (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) tmps[gid].out[7] = 0; // we only need the size of out for the plaintext check } -KERNEL_FQ void m25400_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m25400_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { /** * base @@ -315,7 +315,7 @@ KERNEL_FQ void m25400_loop (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) tmps[gid].digest[3] = digest[3]; } -KERNEL_FQ void m25400_comp (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) +KERNEL_FQ KERNEL_FA void m25400_comp (KERN_ATTR_TMPS_ESALT (pdf14_tmp_t, pdf_t)) { const u32 digest[4] = { diff --git a/OpenCL/m25500-pure.cl b/OpenCL/m25500-pure.cl index f5c72c3de..9bb47f474 100644 --- a/OpenCL/m25500-pure.cl +++ b/OpenCL/m25500-pure.cl @@ -81,7 +81,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m25500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m25500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { /** * base @@ -165,7 +165,7 @@ KERNEL_FQ void m25500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m25500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m25500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); @@ -271,7 +271,7 @@ KERNEL_FQ void m25500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -407,7 +407,7 @@ KERNEL_FQ void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh /* Optimized GCM: No real speed benefit. For documentation purpose -KERNEL_FQ void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m25600-pure.cl b/OpenCL/m25600-pure.cl index 98151b7bf..80f9eb9d7 100644 --- a/OpenCL/m25600-pure.cl +++ b/OpenCL/m25600-pure.cl @@ -447,7 +447,7 @@ DECLSPEC u32 u16_bin_to_u32_hex (const u32 v) | ((v1 < 10) ? '0' + v1 : 'a' - 10 + v1) << 0; } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25600_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25600_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -686,7 +686,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25600_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25600_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25600_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -889,7 +889,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25600_loop (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25600_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25600_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m25700_a0-optimized.cl b/OpenCL/m25700_a0-optimized.cl index a83272714..82d7e8924 100644 --- a/OpenCL/m25700_a0-optimized.cl +++ b/OpenCL/m25700_a0-optimized.cl @@ -51,7 +51,7 @@ DECLSPEC u32 MurmurHash (const u32 seed, PRIVATE_AS const u32 *w, const u32 pw_l return hash; } -KERNEL_FQ void m25700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -108,15 +108,15 @@ KERNEL_FQ void m25700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m25700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m25700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m25700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -185,10 +185,10 @@ KERNEL_FQ void m25700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m25700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m25700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m25700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m25700_a1-optimized.cl b/OpenCL/m25700_a1-optimized.cl index 029a79506..163ed4741 100644 --- a/OpenCL/m25700_a1-optimized.cl +++ b/OpenCL/m25700_a1-optimized.cl @@ -50,7 +50,7 @@ DECLSPEC u32 MurmurHash (const u32 seed, PRIVATE_AS const u32 *w, const u32 pw_l return hash; } -KERNEL_FQ void m25700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -163,15 +163,15 @@ KERNEL_FQ void m25700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m25700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m25700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m25700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -296,10 +296,10 @@ KERNEL_FQ void m25700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m25700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m25700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m25700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m25700_a3-optimized.cl b/OpenCL/m25700_a3-optimized.cl index 69b96f987..6541c12a8 100644 --- a/OpenCL/m25700_a3-optimized.cl +++ b/OpenCL/m25700_a3-optimized.cl @@ -182,7 +182,7 @@ DECLSPEC void m25700s (PRIVATE_AS const u32 *data, const u32 pw_len, KERN_ATTR_F } } -KERNEL_FQ void m25700_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -222,7 +222,7 @@ KERNEL_FQ void m25700_m04 (KERN_ATTR_VECTOR ()) m25700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m25700_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -262,7 +262,7 @@ KERNEL_FQ void m25700_m08 (KERN_ATTR_VECTOR ()) m25700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m25700_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -302,7 +302,7 @@ KERNEL_FQ void m25700_m16 (KERN_ATTR_VECTOR ()) m25700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m25700_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -342,7 +342,7 @@ KERNEL_FQ void m25700_s04 (KERN_ATTR_VECTOR ()) m25700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m25700_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -382,7 +382,7 @@ KERNEL_FQ void m25700_s08 (KERN_ATTR_VECTOR ()) m25700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m25700_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m25700_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m25800-pure.cl b/OpenCL/m25800-pure.cl index 2c3d581ec..9bfa5583e 100644 --- a/OpenCL/m25800-pure.cl +++ b/OpenCL/m25800-pure.cl @@ -443,7 +443,7 @@ DECLSPEC u32 u16_bin_to_u32_hex (const u32 v) | ((v1 < 10) ? '0' + v1 : 'a' - 10 + v1) << 0; } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25800_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25800_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -685,7 +685,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25800_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25800_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25800_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -888,7 +888,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25800_loop (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m25800_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m25800_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m25900-pure.cl b/OpenCL/m25900-pure.cl index 00c2637ed..04b66242b 100644 --- a/OpenCL/m25900-pure.cl +++ b/OpenCL/m25900-pure.cl @@ -100,7 +100,7 @@ DECLSPEC void aes128_encrypt_cbc (PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 * aes_iv[3] = out[3]; } -KERNEL_FQ void m25900_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m25900_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) { /** * base @@ -184,7 +184,7 @@ KERNEL_FQ void m25900_init (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) } } -KERNEL_FQ void m25900_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m25900_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) { const u64 gid = get_global_id(0); @@ -290,7 +290,7 @@ KERNEL_FQ void m25900_loop (KERN_ATTR_TMPS (pbkdf2_sha256_tmp_t)) } } -KERNEL_FQ void m25900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, blocks_t)) +KERNEL_FQ KERNEL_FA void m25900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, blocks_t)) { /** * base diff --git a/OpenCL/m26000_a0-pure.cl b/OpenCL/m26000_a0-pure.cl index adaf0100d..e5eb380e7 100644 --- a/OpenCL/m26000_a0-pure.cl +++ b/OpenCL/m26000_a0-pure.cl @@ -23,7 +23,7 @@ typedef struct mozilla_3des } mozilla_3des_t; -KERNEL_FQ void m26000_mxx (KERN_ATTR_RULES_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_mxx (KERN_ATTR_RULES_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -365,7 +365,7 @@ KERNEL_FQ void m26000_mxx (KERN_ATTR_RULES_ESALT (mozilla_3des_t)) } } -KERNEL_FQ void m26000_sxx (KERN_ATTR_RULES_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_sxx (KERN_ATTR_RULES_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26000_a1-pure.cl b/OpenCL/m26000_a1-pure.cl index 577bbdc08..5f178d8b5 100644 --- a/OpenCL/m26000_a1-pure.cl +++ b/OpenCL/m26000_a1-pure.cl @@ -21,7 +21,7 @@ typedef struct mozilla_3des } mozilla_3des_t; -KERNEL_FQ void m26000_mxx (KERN_ATTR_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_mxx (KERN_ATTR_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -388,7 +388,7 @@ KERNEL_FQ void m26000_mxx (KERN_ATTR_ESALT (mozilla_3des_t)) } } -KERNEL_FQ void m26000_sxx (KERN_ATTR_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_sxx (KERN_ATTR_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26000_a3-pure.cl b/OpenCL/m26000_a3-pure.cl index b7993154b..77d395de6 100644 --- a/OpenCL/m26000_a3-pure.cl +++ b/OpenCL/m26000_a3-pure.cl @@ -21,7 +21,7 @@ typedef struct mozilla_3des } mozilla_3des_t; -KERNEL_FQ void m26000_mxx (KERN_ATTR_VECTOR_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_mxx (KERN_ATTR_VECTOR_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -374,7 +374,7 @@ KERNEL_FQ void m26000_mxx (KERN_ATTR_VECTOR_ESALT (mozilla_3des_t)) } } -KERNEL_FQ void m26000_sxx (KERN_ATTR_VECTOR_ESALT (mozilla_3des_t)) +KERNEL_FQ KERNEL_FA void m26000_sxx (KERN_ATTR_VECTOR_ESALT (mozilla_3des_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26100-pure.cl b/OpenCL/m26100-pure.cl index 83cba94e4..03f7dd0e7 100644 --- a/OpenCL/m26100-pure.cl +++ b/OpenCL/m26100-pure.cl @@ -78,7 +78,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m26100_init (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) +KERNEL_FQ KERNEL_FA void m26100_init (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) { /** * base @@ -203,7 +203,7 @@ KERNEL_FQ void m26100_init (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes } } -KERNEL_FQ void m26100_loop (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) +KERNEL_FQ KERNEL_FA void m26100_loop (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) { const u64 gid = get_global_id (0); @@ -309,7 +309,7 @@ KERNEL_FQ void m26100_loop (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes } } -KERNEL_FQ void m26100_comp (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) +KERNEL_FQ KERNEL_FA void m26100_comp (KERN_ATTR_TMPS_ESALT (mozilla_aes_tmp_t, mozilla_aes_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26200_a0-pure.cl b/OpenCL/m26200_a0-pure.cl index b38ae40bf..e37a59969 100644 --- a/OpenCL/m26200_a0-pure.cl +++ b/OpenCL/m26200_a0-pure.cl @@ -35,7 +35,7 @@ CONSTANT_VK u32a PE_CONST[256] = 17408, 33985, 34177, 17728, 34561, 18368, 18048, 34369, 33281, 17088, 17280, 33601, 16640, 33217, 32897, 16448 }; -KERNEL_FQ void m26200_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26200_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -128,7 +128,7 @@ KERNEL_FQ void m26200_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26200_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26200_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m26200_a1-pure.cl b/OpenCL/m26200_a1-pure.cl index 3b84dfba5..d22b2e009 100644 --- a/OpenCL/m26200_a1-pure.cl +++ b/OpenCL/m26200_a1-pure.cl @@ -33,7 +33,7 @@ CONSTANT_VK u32a PE_CONST[256] = 17408, 33985, 34177, 17728, 34561, 18368, 18048, 34369, 33281, 17088, 17280, 33601, 16640, 33217, 32897, 16448 }; -KERNEL_FQ void m26200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -193,7 +193,7 @@ KERNEL_FQ void m26200_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m26200_a3-pure.cl b/OpenCL/m26200_a3-pure.cl index 447771260..5bc2a9cc1 100644 --- a/OpenCL/m26200_a3-pure.cl +++ b/OpenCL/m26200_a3-pure.cl @@ -33,7 +33,7 @@ CONSTANT_VK u32a PE_CONST[256] = 17408, 33985, 34177, 17728, 34561, 18368, 18048, 34369, 33281, 17088, 17280, 33601, 16640, 33217, 32897, 16448 }; -KERNEL_FQ void m26200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -137,7 +137,7 @@ KERNEL_FQ void m26200_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m26300_a0-pure.cl b/OpenCL/m26300_a0-pure.cl index 2020035b1..3f590d5f0 100644 --- a/OpenCL/m26300_a0-pure.cl +++ b/OpenCL/m26300_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m26300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -92,7 +92,7 @@ KERNEL_FQ void m26300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m26300_a1-pure.cl b/OpenCL/m26300_a1-pure.cl index cf0ab137c..85a45006f 100644 --- a/OpenCL/m26300_a1-pure.cl +++ b/OpenCL/m26300_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m26300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -86,7 +86,7 @@ KERNEL_FQ void m26300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m26300_a3-pure.cl b/OpenCL/m26300_a3-pure.cl index b4224857b..c2f8ba348 100644 --- a/OpenCL/m26300_a3-pure.cl +++ b/OpenCL/m26300_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m26300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -103,7 +103,7 @@ KERNEL_FQ void m26300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m26300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m26401_a0-optimized.cl b/OpenCL/m26401_a0-optimized.cl index e22fe2fbe..3c4958b6c 100644 --- a/OpenCL/m26401_a0-optimized.cl +++ b/OpenCL/m26401_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26401_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_m04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -142,15 +142,15 @@ KERNEL_FQ void m26401_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26401_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26401_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26401_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_s04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -288,10 +288,10 @@ KERNEL_FQ void m26401_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26401_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26401_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26401_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m26401_a1-optimized.cl b/OpenCL/m26401_a1-optimized.cl index 8138ab9a4..105d103cf 100644 --- a/OpenCL/m26401_a1-optimized.cl +++ b/OpenCL/m26401_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26401_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_m04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -194,15 +194,15 @@ KERNEL_FQ void m26401_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26401_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26401_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26401_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_s04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -393,10 +393,10 @@ KERNEL_FQ void m26401_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26401_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26401_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26401_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m26401_a3-optimized.cl b/OpenCL/m26401_a3-optimized.cl index c2bbcaadd..c756216ae 100644 --- a/OpenCL/m26401_a3-optimized.cl +++ b/OpenCL/m26401_a3-optimized.cl @@ -136,7 +136,7 @@ DECLSPEC void m26401s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m26401_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_m04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -227,7 +227,7 @@ KERNEL_FQ void m26401_m04 (KERN_ATTR_VECTOR ()) m26401m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26401_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_m08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -318,11 +318,11 @@ KERNEL_FQ void m26401_m08 (KERN_ATTR_VECTOR ()) m26401m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26401_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_m16 (KERN_ATTR_VECTOR ()) { } -KERNEL_FQ void m26401_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_s04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -413,7 +413,7 @@ KERNEL_FQ void m26401_s04 (KERN_ATTR_VECTOR ()) m26401s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26401_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_s08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -504,6 +504,6 @@ KERNEL_FQ void m26401_s08 (KERN_ATTR_VECTOR ()) m26401s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26401_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26401_s16 (KERN_ATTR_VECTOR ()) { } diff --git a/OpenCL/m26402_a0-optimized.cl b/OpenCL/m26402_a0-optimized.cl index 0b27c2baa..bfc1e3a0c 100644 --- a/OpenCL/m26402_a0-optimized.cl +++ b/OpenCL/m26402_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26402_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_m04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -144,15 +144,15 @@ KERNEL_FQ void m26402_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26402_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26402_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26402_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_s04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -292,10 +292,10 @@ KERNEL_FQ void m26402_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26402_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26402_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26402_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m26402_a1-optimized.cl b/OpenCL/m26402_a1-optimized.cl index 68b788251..bc8fec95b 100644 --- a/OpenCL/m26402_a1-optimized.cl +++ b/OpenCL/m26402_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26402_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_m04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -200,15 +200,15 @@ KERNEL_FQ void m26402_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26402_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26402_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26402_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_s04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -405,10 +405,10 @@ KERNEL_FQ void m26402_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26402_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26402_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26402_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m26402_a3-optimized.cl b/OpenCL/m26402_a3-optimized.cl index add930bec..5a4e0f7e4 100644 --- a/OpenCL/m26402_a3-optimized.cl +++ b/OpenCL/m26402_a3-optimized.cl @@ -140,7 +140,7 @@ DECLSPEC void m26402s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m26402_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_m04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -231,7 +231,7 @@ KERNEL_FQ void m26402_m04 (KERN_ATTR_VECTOR ()) m26402m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26402_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_m08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -322,11 +322,11 @@ KERNEL_FQ void m26402_m08 (KERN_ATTR_VECTOR ()) m26402m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26402_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_m16 (KERN_ATTR_VECTOR ()) { } -KERNEL_FQ void m26402_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_s04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -417,7 +417,7 @@ KERNEL_FQ void m26402_s04 (KERN_ATTR_VECTOR ()) m26402s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26402_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_s08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -508,6 +508,6 @@ KERNEL_FQ void m26402_s08 (KERN_ATTR_VECTOR ()) m26402s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26402_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26402_s16 (KERN_ATTR_VECTOR ()) { } diff --git a/OpenCL/m26403_a0-optimized.cl b/OpenCL/m26403_a0-optimized.cl index 1fae8e779..ea019a16d 100644 --- a/OpenCL/m26403_a0-optimized.cl +++ b/OpenCL/m26403_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26403_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_m04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -146,15 +146,15 @@ KERNEL_FQ void m26403_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26403_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26403_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26403_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_s04 (KERN_ATTR_RULES ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -296,10 +296,10 @@ KERNEL_FQ void m26403_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m26403_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m26403_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m26403_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m26403_a1-optimized.cl b/OpenCL/m26403_a1-optimized.cl index 107ba9218..b8502d9c3 100644 --- a/OpenCL/m26403_a1-optimized.cl +++ b/OpenCL/m26403_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -KERNEL_FQ void m26403_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_m04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -206,15 +206,15 @@ KERNEL_FQ void m26403_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26403_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26403_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26403_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_s04 (KERN_ATTR_BASIC ()) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -417,10 +417,10 @@ KERNEL_FQ void m26403_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m26403_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m26403_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m26403_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m26403_a3-optimized.cl b/OpenCL/m26403_a3-optimized.cl index 76de06b78..b123f3e15 100644 --- a/OpenCL/m26403_a3-optimized.cl +++ b/OpenCL/m26403_a3-optimized.cl @@ -144,7 +144,7 @@ DECLSPEC void m26403s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m26403_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_m04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -235,7 +235,7 @@ KERNEL_FQ void m26403_m04 (KERN_ATTR_VECTOR ()) m26403m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26403_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_m08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -326,7 +326,7 @@ KERNEL_FQ void m26403_m08 (KERN_ATTR_VECTOR ()) m26403m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26403_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_m16 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -417,7 +417,7 @@ KERNEL_FQ void m26403_m16 (KERN_ATTR_VECTOR ()) m26403m (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26403_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_s04 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -508,7 +508,7 @@ KERNEL_FQ void m26403_s04 (KERN_ATTR_VECTOR ()) m26403s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26403_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_s08 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); @@ -599,7 +599,7 @@ KERNEL_FQ void m26403_s08 (KERN_ATTR_VECTOR ()) m26403s (s_te0, s_te1, s_te2, s_te3, s_te4, s_td0, s_td1, s_td2, s_td3, s_td4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m26403_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m26403_s16 (KERN_ATTR_VECTOR ()) { const u64 lid = get_local_id (0); const u64 gid = get_global_id (0); diff --git a/OpenCL/m26500-pure.cl b/OpenCL/m26500-pure.cl index 7e73390e4..7061ec738 100644 --- a/OpenCL/m26500-pure.cl +++ b/OpenCL/m26500-pure.cl @@ -73,7 +73,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m26500_init (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) +KERNEL_FQ KERNEL_FA void m26500_init (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) { /** * base @@ -167,7 +167,7 @@ KERNEL_FQ void m26500_init (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_ tmps[gid].iv[3] = 0; } -KERNEL_FQ void m26500_loop (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) +KERNEL_FQ KERNEL_FA void m26500_loop (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -298,7 +298,7 @@ KERNEL_FQ void m26500_loop (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_ tmps[gid].iv[3] = iv[3]; } -KERNEL_FQ void m26500_comp (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) +KERNEL_FQ KERNEL_FA void m26500_comp (KERN_ATTR_TMPS_ESALT (iphone_passcode_tmp_t, iphone_passcode_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26600-pure.cl b/OpenCL/m26600-pure.cl index 6f1d1f4f4..0ed264a28 100644 --- a/OpenCL/m26600-pure.cl +++ b/OpenCL/m26600-pure.cl @@ -81,7 +81,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m26600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { /** * base @@ -165,7 +165,7 @@ KERNEL_FQ void m26600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m26600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); @@ -271,7 +271,7 @@ KERNEL_FQ void m26600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m26600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26610-pure.cl b/OpenCL/m26610-pure.cl index abd476395..8ca397629 100644 --- a/OpenCL/m26610-pure.cl +++ b/OpenCL/m26610-pure.cl @@ -81,7 +81,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m26610_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26610_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { /** * base @@ -165,7 +165,7 @@ KERNEL_FQ void m26610_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m26610_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26610_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); @@ -271,7 +271,7 @@ KERNEL_FQ void m26610_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m26610_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) +KERNEL_FQ KERNEL_FA void m26610_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sha256_aes_gcm_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m26700-pure.cl b/OpenCL/m26700-pure.cl index 74bb30284..14be99636 100644 --- a/OpenCL/m26700-pure.cl +++ b/OpenCL/m26700-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m26700_init (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26700_init (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m26700_init (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) tmps[gid].h[7] = SHA224M_H; } -KERNEL_FQ void m26700_loop (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26700_loop (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) { /** * base @@ -240,7 +240,7 @@ KERNEL_FQ void m26700_loop (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) tmps[gid].h[7] = h[7]; } -KERNEL_FQ void m26700_comp (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26700_comp (KERN_ATTR_TMPS_ESALT (hmac_sha224_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m26800-pure.cl b/OpenCL/m26800-pure.cl index 9fa5ce34d..d0906f532 100644 --- a/OpenCL/m26800-pure.cl +++ b/OpenCL/m26800-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m26800_init (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26800_init (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) { /** * modifier @@ -135,7 +135,7 @@ KERNEL_FQ void m26800_init (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) tmps[gid].h[7] = SHA256M_H; } -KERNEL_FQ void m26800_loop (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26800_loop (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) { /** * base @@ -240,7 +240,7 @@ KERNEL_FQ void m26800_loop (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) tmps[gid].h[7] = h[7]; } -KERNEL_FQ void m26800_comp (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26800_comp (KERN_ATTR_TMPS_ESALT (hmac_sha256_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m26900-pure.cl b/OpenCL/m26900-pure.cl index 616a3c5c1..d5a48d653 100644 --- a/OpenCL/m26900-pure.cl +++ b/OpenCL/m26900-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m26900_init (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26900_init (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) { /** * modifier @@ -151,7 +151,7 @@ KERNEL_FQ void m26900_init (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) tmps[gid].h[7] = SHA384M_H; } -KERNEL_FQ void m26900_loop (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26900_loop (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) { /** * base @@ -296,7 +296,7 @@ KERNEL_FQ void m26900_loop (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) tmps[gid].h[7] = h[7]; } -KERNEL_FQ void m26900_comp (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m26900_comp (KERN_ATTR_TMPS_ESALT (hmac_sha384_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m27000-pure.cl b/OpenCL/m27000-pure.cl index 5f85c8f2b..60ca8a322 100644 --- a/OpenCL/m27000-pure.cl +++ b/OpenCL/m27000-pure.cl @@ -528,7 +528,7 @@ typedef struct netntlm_tmp } netntlm_tmp_t; -KERNEL_FQ void m27000_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27000_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { /** * modifier @@ -572,12 +572,12 @@ KERNEL_FQ void m27000_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) } -KERNEL_FQ void m27000_loop (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27000_loop (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { } -KERNEL_FQ void m27000_comp (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27000_comp (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { /** * modifier diff --git a/OpenCL/m27100-pure.cl b/OpenCL/m27100-pure.cl index d3cb273f5..e15531cec 100644 --- a/OpenCL/m27100-pure.cl +++ b/OpenCL/m27100-pure.cl @@ -56,7 +56,7 @@ typedef struct netntlmv2_tmp } netntlm_tmp_t; -KERNEL_FQ void m27100_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27100_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { /** * modifier @@ -100,13 +100,13 @@ KERNEL_FQ void m27100_init (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) } -KERNEL_FQ void m27100_loop (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27100_loop (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { } -KERNEL_FQ void m27100_comp (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) +KERNEL_FQ KERNEL_FA void m27100_comp (KERN_ATTR_TMPS_ESALT (netntlm_tmp_t, netntlm_t)) { /** * modifier diff --git a/OpenCL/m27200_a0-optimized.cl b/OpenCL/m27200_a0-optimized.cl index 5ec604632..fd45f4b28 100644 --- a/OpenCL/m27200_a0-optimized.cl +++ b/OpenCL/m27200_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m27200_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -251,15 +251,15 @@ KERNEL_FQ void m27200_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27200_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27200_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27200_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -504,10 +504,10 @@ KERNEL_FQ void m27200_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27200_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27200_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m27200_a0-pure.cl b/OpenCL/m27200_a0-pure.cl index 41abbf189..b95164fc4 100644 --- a/OpenCL/m27200_a0-pure.cl +++ b/OpenCL/m27200_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m27200_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -72,7 +72,7 @@ KERNEL_FQ void m27200_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27200_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27200_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m27200_a1-optimized.cl b/OpenCL/m27200_a1-optimized.cl index 2e04d23a0..0c53527f7 100644 --- a/OpenCL/m27200_a1-optimized.cl +++ b/OpenCL/m27200_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m27200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -309,15 +309,15 @@ KERNEL_FQ void m27200_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -621,10 +621,10 @@ KERNEL_FQ void m27200_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m27200_a1-pure.cl b/OpenCL/m27200_a1-pure.cl index cf5cca506..4ab4907e4 100644 --- a/OpenCL/m27200_a1-pure.cl +++ b/OpenCL/m27200_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m27200_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -66,7 +66,7 @@ KERNEL_FQ void m27200_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27200_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m27200_a3-optimized.cl b/OpenCL/m27200_a3-optimized.cl index f7bc79d58..6189293ad 100644 --- a/OpenCL/m27200_a3-optimized.cl +++ b/OpenCL/m27200_a3-optimized.cl @@ -539,7 +539,7 @@ DECLSPEC void m27200s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m27200_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -588,7 +588,7 @@ KERNEL_FQ void m27200_m04 (KERN_ATTR_BASIC ()) m27200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27200_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -637,7 +637,7 @@ KERNEL_FQ void m27200_m08 (KERN_ATTR_BASIC ()) m27200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27200_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -686,7 +686,7 @@ KERNEL_FQ void m27200_m16 (KERN_ATTR_BASIC ()) m27200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27200_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -735,7 +735,7 @@ KERNEL_FQ void m27200_s04 (KERN_ATTR_BASIC ()) m27200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27200_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -784,7 +784,7 @@ KERNEL_FQ void m27200_s08 (KERN_ATTR_BASIC ()) m27200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27200_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27200_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m27200_a3-pure.cl b/OpenCL/m27200_a3-pure.cl index 9b976ee15..822555cac 100644 --- a/OpenCL/m27200_a3-pure.cl +++ b/OpenCL/m27200_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m27200_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27200_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -85,7 +85,7 @@ KERNEL_FQ void m27200_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m27200_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27200_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m27300-pure.cl b/OpenCL/m27300-pure.cl index 6d21ba03c..71f767071 100644 --- a/OpenCL/m27300-pure.cl +++ b/OpenCL/m27300-pure.cl @@ -54,7 +54,7 @@ typedef struct snmpv3 } snmpv3_t; -KERNEL_FQ void m27300_init (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m27300_init (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) { /** * modifier @@ -151,7 +151,7 @@ KERNEL_FQ void m27300_init (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) tmps[gid].h[7] = SHA512M_H; } -KERNEL_FQ void m27300_loop (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m27300_loop (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) { /** * base @@ -296,7 +296,7 @@ KERNEL_FQ void m27300_loop (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) tmps[gid].h[7] = h[7]; } -KERNEL_FQ void m27300_comp (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) +KERNEL_FQ KERNEL_FA void m27300_comp (KERN_ATTR_TMPS_ESALT (hmac_sha512_tmp_t, snmpv3_t)) { /** * modifier diff --git a/OpenCL/m27400-pure.cl b/OpenCL/m27400-pure.cl index d86b95d6c..bdbf272fb 100644 --- a/OpenCL/m27400-pure.cl +++ b/OpenCL/m27400-pure.cl @@ -72,7 +72,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m27400_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) +KERNEL_FQ KERNEL_FA void m27400_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) { /** * base @@ -144,7 +144,7 @@ KERNEL_FQ void m27400_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_ } } -KERNEL_FQ void m27400_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) +KERNEL_FQ KERNEL_FA void m27400_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) { const u64 gid = get_global_id (0); @@ -229,7 +229,7 @@ KERNEL_FQ void m27400_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_ } } -KERNEL_FQ void m27400_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) +KERNEL_FQ KERNEL_FA void m27400_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, vmware_vmx_t)) { /** * base diff --git a/OpenCL/m27500-pure.cl b/OpenCL/m27500-pure.cl index e4120dd15..3ff56cc61 100644 --- a/OpenCL/m27500-pure.cl +++ b/OpenCL/m27500-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void xts_mul2 (PRIVATE_AS u32 *in, PRIVATE_AS u32 *out) out[0] ^= c * 0x87; } -KERNEL_FQ void m27500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { /** * base @@ -176,7 +176,7 @@ KERNEL_FQ void m27500_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); @@ -282,7 +282,7 @@ KERNEL_FQ void m27500_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27500_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27500_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -538,7 +538,7 @@ KERNEL_FQ void m27500_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27500_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27500_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); @@ -644,7 +644,7 @@ KERNEL_FQ void m27500_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m27600-pure.cl b/OpenCL/m27600-pure.cl index 0825425ad..553a46bd9 100644 --- a/OpenCL/m27600-pure.cl +++ b/OpenCL/m27600-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void xts_mul2 (PRIVATE_AS u32 *in, PRIVATE_AS u32 *out) out[0] ^= c * 0x87; } -KERNEL_FQ void m27600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { /** * base @@ -176,7 +176,7 @@ KERNEL_FQ void m27600_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); @@ -282,7 +282,7 @@ KERNEL_FQ void m27600_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27600_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27600_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -616,7 +616,7 @@ KERNEL_FQ void m27600_init2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27600_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27600_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); @@ -722,7 +722,7 @@ KERNEL_FQ void m27600_loop2 (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) } } -KERNEL_FQ void m27600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) +KERNEL_FQ KERNEL_FA void m27600_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, vbox_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m27700-pure.cl b/OpenCL/m27700-pure.cl index d9bf11510..c1f930ebc 100644 --- a/OpenCL/m27700-pure.cl +++ b/OpenCL/m27700-pure.cl @@ -9,292 +9,12 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #endif -typedef struct +KERNEL_FQ KERNEL_FA void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) { - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) -{ - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } -} - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4]; - - for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; - - for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - -KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; @@ -310,180 +30,56 @@ KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) if (w_len == -1) return; // utf16le to utf16be - for (int i = 0, j = 0; i < w_len; i += 4, j += 1) { w[j] = ((w[j] >> 8) & 0x00ff00ff) | ((w[j] << 8) & 0xff00ff00); } - sha256_hmac_ctx_t sha256_hmac_ctx; + u32 s[16] = { 0 }; - sha256_hmac_init_swap (&sha256_hmac_ctx, w, w_len); + s[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[0]); + s[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[1]); - u32 x0[4] = { 0 }; - u32 x1[4] = { 0 }; - u32 x2[4] = { 0 }; - u32 x3[4] = { 0 }; + scrypt_pbkdf2_ppg (w, w_len, s, 8, tmps[gid].in, SCRYPT_SZ); - x0[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; - x0[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; - - sha256_hmac_update_64 (&sha256_hmac_ctx, x0, x1, x2, x3, 8); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m27700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m27700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m27700_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + u32 X[STATE_CNT4]; - uint4 X[STATE_CNT4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); } -KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m27700_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); + + if (gid >= GID_CNT) return; + + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; + + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); + + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} + +KERNEL_FQ KERNEL_FA void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -557,119 +153,36 @@ KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) if (w_len == -1) return; // utf16le to utf16be - for (int i = 0, j = 0; i < w_len; i += 4, j += 1) { w[j] = ((w[j] >> 8) & 0x00ff00ff) | ((w[j] << 8) & 0xff00ff00); } - sha256_hmac_ctx_t ctx; + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - sha256_hmac_init_swap (&ctx, w, w_len); + u32 out[8]; - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) - { - uint4 X[4]; - - const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); - - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; - - uint4 T[4]; - - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); + scrypt_pbkdf2_pgp (w, w_len, tmps[gid].in, SCRYPT_SZ, out, 32); // AES256-CBC decrypt u32 key[8]; - key[0] = ctx.opad.h[0]; - key[1] = ctx.opad.h[1]; - key[2] = ctx.opad.h[2]; - key[3] = ctx.opad.h[3]; - key[4] = ctx.opad.h[4]; - key[5] = ctx.opad.h[5]; - key[6] = ctx.opad.h[6]; - key[7] = ctx.opad.h[7]; + key[0] = out[0]; + key[1] = out[1]; + key[2] = out[2]; + key[3] = out[3]; + key[4] = out[4]; + key[5] = out[5]; + key[6] = out[6]; + key[7] = out[7]; #define KEYLEN 60 u32 ks[KEYLEN]; - AES256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + aes256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); u32 iv[4]; diff --git a/OpenCL/m27800_a0-optimized.cl b/OpenCL/m27800_a0-optimized.cl index fc4017a50..81d70d10b 100644 --- a/OpenCL/m27800_a0-optimized.cl +++ b/OpenCL/m27800_a0-optimized.cl @@ -55,7 +55,7 @@ DECLSPEC u32 MurmurHash3 (const u32 seed, PRIVATE_AS const u32 *data, const u32 return checksum ^ (checksum >> 16); } -KERNEL_FQ void m27800_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -112,15 +112,15 @@ KERNEL_FQ void m27800_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27800_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27800_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27800_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -189,10 +189,10 @@ KERNEL_FQ void m27800_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27800_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27800_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27800_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m27800_a1-optimized.cl b/OpenCL/m27800_a1-optimized.cl index 28f8dfb45..66927e35f 100644 --- a/OpenCL/m27800_a1-optimized.cl +++ b/OpenCL/m27800_a1-optimized.cl @@ -53,7 +53,7 @@ DECLSPEC u32 MurmurHash3 (const u32 seed, PRIVATE_AS const u32 *data, const u32 return checksum ^ (checksum >> 16); } -KERNEL_FQ void m27800_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -166,15 +166,15 @@ KERNEL_FQ void m27800_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27800_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27800_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27800_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -299,10 +299,10 @@ KERNEL_FQ void m27800_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27800_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27800_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27800_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m27800_a3-optimized.cl b/OpenCL/m27800_a3-optimized.cl index d0e04eae0..da67f0df3 100644 --- a/OpenCL/m27800_a3-optimized.cl +++ b/OpenCL/m27800_a3-optimized.cl @@ -185,7 +185,7 @@ DECLSPEC void m27800s (PRIVATE_AS const u32 *data, const u32 pw_len, KERN_ATTR_F } } -KERNEL_FQ void m27800_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -225,7 +225,7 @@ KERNEL_FQ void m27800_m04 (KERN_ATTR_VECTOR ()) m27800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27800_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -265,7 +265,7 @@ KERNEL_FQ void m27800_m08 (KERN_ATTR_VECTOR ()) m27800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27800_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -305,7 +305,7 @@ KERNEL_FQ void m27800_m16 (KERN_ATTR_VECTOR ()) m27800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27800_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -345,7 +345,7 @@ KERNEL_FQ void m27800_s04 (KERN_ATTR_VECTOR ()) m27800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27800_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -385,7 +385,7 @@ KERNEL_FQ void m27800_s08 (KERN_ATTR_VECTOR ()) m27800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27800_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27800_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m27900_a0-optimized.cl b/OpenCL/m27900_a0-optimized.cl index fac6a7799..955eda573 100644 --- a/OpenCL/m27900_a0-optimized.cl +++ b/OpenCL/m27900_a0-optimized.cl @@ -135,7 +135,7 @@ DECLSPEC u32x crc32c (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m27900_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -215,15 +215,15 @@ KERNEL_FQ void m27900_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27900_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27900_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27900_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -315,10 +315,10 @@ KERNEL_FQ void m27900_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27900_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m27900_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m27900_a0-pure.cl b/OpenCL/m27900_a0-pure.cl index c378ee5c6..a321907b3 100644 --- a/OpenCL/m27900_a0-pure.cl +++ b/OpenCL/m27900_a0-pure.cl @@ -123,7 +123,7 @@ DECLSPEC u32x crc32c (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m27900_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -169,7 +169,7 @@ KERNEL_FQ void m27900_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m27900_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m27900_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m27900_a1-optimized.cl b/OpenCL/m27900_a1-optimized.cl index 240d7c050..209ffe13c 100644 --- a/OpenCL/m27900_a1-optimized.cl +++ b/OpenCL/m27900_a1-optimized.cl @@ -133,7 +133,7 @@ DECLSPEC u32x crc32c (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m27900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -273,15 +273,15 @@ KERNEL_FQ void m27900_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -433,10 +433,10 @@ KERNEL_FQ void m27900_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m27900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m27900_a1-pure.cl b/OpenCL/m27900_a1-pure.cl index 11c41b8be..542da85ca 100644 --- a/OpenCL/m27900_a1-pure.cl +++ b/OpenCL/m27900_a1-pure.cl @@ -121,7 +121,7 @@ DECLSPEC u32x crc32c_g (GLOBAL_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m27900_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -163,7 +163,7 @@ KERNEL_FQ void m27900_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m27900_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m27900_a3-optimized.cl b/OpenCL/m27900_a3-optimized.cl index 2f9e7ce2a..9e90fed1d 100644 --- a/OpenCL/m27900_a3-optimized.cl +++ b/OpenCL/m27900_a3-optimized.cl @@ -255,7 +255,7 @@ DECLSPEC void m27900s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_BASIC } } -KERNEL_FQ void m27900_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -295,7 +295,7 @@ KERNEL_FQ void m27900_m04 (KERN_ATTR_BASIC ()) m27900m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27900_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -335,7 +335,7 @@ KERNEL_FQ void m27900_m08 (KERN_ATTR_BASIC ()) m27900m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27900_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -375,7 +375,7 @@ KERNEL_FQ void m27900_m16 (KERN_ATTR_BASIC ()) m27900m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27900_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -415,7 +415,7 @@ KERNEL_FQ void m27900_s04 (KERN_ATTR_BASIC ()) m27900s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27900_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -455,7 +455,7 @@ KERNEL_FQ void m27900_s08 (KERN_ATTR_BASIC ()) m27900s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m27900_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m27900_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m27900_a3-pure.cl b/OpenCL/m27900_a3-pure.cl index 90e8777c8..e3d3048e5 100644 --- a/OpenCL/m27900_a3-pure.cl +++ b/OpenCL/m27900_a3-pure.cl @@ -121,7 +121,7 @@ DECLSPEC u32x crc32c (PRIVATE_AS const u32x *w, const u32 pw_len, const u32 iv) return ~a; } -KERNEL_FQ void m27900_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27900_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -174,7 +174,7 @@ KERNEL_FQ void m27900_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m27900_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m27900_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m28000_a0-optimized.cl b/OpenCL/m28000_a0-optimized.cl index 275a195e7..a8861d117 100644 --- a/OpenCL/m28000_a0-optimized.cl +++ b/OpenCL/m28000_a0-optimized.cl @@ -195,7 +195,7 @@ DECLSPEC u64 crc64jones (PRIVATE_AS const u32 *w, const u32 pw_len, const u64 iv return a; } -KERNEL_FQ void m28000_m04 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m04 (KERN_ATTR_RULES_ESALT (crc64_t)) { /** * modifier @@ -299,15 +299,15 @@ KERNEL_FQ void m28000_m04 (KERN_ATTR_RULES_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_m08 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m08 (KERN_ATTR_RULES_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_m16 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m16 (KERN_ATTR_RULES_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_s04 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s04 (KERN_ATTR_RULES_ESALT (crc64_t)) { /** * modifier @@ -423,10 +423,10 @@ KERNEL_FQ void m28000_s04 (KERN_ATTR_RULES_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_s08 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s08 (KERN_ATTR_RULES_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_s16 (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s16 (KERN_ATTR_RULES_ESALT (crc64_t)) { } diff --git a/OpenCL/m28000_a0-pure.cl b/OpenCL/m28000_a0-pure.cl index 75abc8c0d..5e8805555 100644 --- a/OpenCL/m28000_a0-pure.cl +++ b/OpenCL/m28000_a0-pure.cl @@ -183,7 +183,7 @@ DECLSPEC u64 crc64jones (PRIVATE_AS const u32 *w, const u32 pw_len, const u64 iv return a; } -KERNEL_FQ void m28000_mxx (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_mxx (KERN_ATTR_RULES_ESALT (crc64_t)) { /** * modifier @@ -253,7 +253,7 @@ KERNEL_FQ void m28000_mxx (KERN_ATTR_RULES_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_sxx (KERN_ATTR_RULES_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_sxx (KERN_ATTR_RULES_ESALT (crc64_t)) { /** * modifier diff --git a/OpenCL/m28000_a1-optimized.cl b/OpenCL/m28000_a1-optimized.cl index 16e840868..25aa706f1 100644 --- a/OpenCL/m28000_a1-optimized.cl +++ b/OpenCL/m28000_a1-optimized.cl @@ -193,7 +193,7 @@ DECLSPEC u64 crc64jones (PRIVATE_AS const u32 *w, const u32 pw_len, const u64 iv return a; } -KERNEL_FQ void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -357,15 +357,15 @@ KERNEL_FQ void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_m08 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m08 (KERN_ATTR_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_m16 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m16 (KERN_ATTR_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -541,10 +541,10 @@ KERNEL_FQ void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_s08 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s08 (KERN_ATTR_ESALT (crc64_t)) { } -KERNEL_FQ void m28000_s16 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s16 (KERN_ATTR_ESALT (crc64_t)) { } diff --git a/OpenCL/m28000_a1-pure.cl b/OpenCL/m28000_a1-pure.cl index b07ca2c0f..e27654c85 100644 --- a/OpenCL/m28000_a1-pure.cl +++ b/OpenCL/m28000_a1-pure.cl @@ -181,7 +181,7 @@ DECLSPEC u64 crc64jones_g (GLOBAL_AS const u32 *w, const u32 pw_len, const u64 i return a; } -KERNEL_FQ void m28000_mxx (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_mxx (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -243,7 +243,7 @@ KERNEL_FQ void m28000_mxx (KERN_ATTR_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_sxx (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_sxx (KERN_ATTR_ESALT (crc64_t)) { /** * modifier diff --git a/OpenCL/m28000_a3-optimized.cl b/OpenCL/m28000_a3-optimized.cl index b304d64f2..6f1185ada 100644 --- a/OpenCL/m28000_a3-optimized.cl +++ b/OpenCL/m28000_a3-optimized.cl @@ -321,7 +321,7 @@ DECLSPEC void m28000s (SHM_TYPE u64 *s_crc64jonestab, PRIVATE_AS u32 *w, const u } } -KERNEL_FQ void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -386,7 +386,7 @@ KERNEL_FQ void m28000_m04 (KERN_ATTR_ESALT (crc64_t)) m28000m (s_crc64jonestab, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28000_m08 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m08 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -451,7 +451,7 @@ KERNEL_FQ void m28000_m08 (KERN_ATTR_ESALT (crc64_t)) m28000m (s_crc64jonestab, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28000_m16 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_m16 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -516,7 +516,7 @@ KERNEL_FQ void m28000_m16 (KERN_ATTR_ESALT (crc64_t)) m28000m (s_crc64jonestab, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -581,7 +581,7 @@ KERNEL_FQ void m28000_s04 (KERN_ATTR_ESALT (crc64_t)) m28000s (s_crc64jonestab, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28000_s08 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s08 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier @@ -646,7 +646,7 @@ KERNEL_FQ void m28000_s08 (KERN_ATTR_ESALT (crc64_t)) m28000s (s_crc64jonestab, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28000_s16 (KERN_ATTR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_s16 (KERN_ATTR_ESALT (crc64_t)) { /** * modifier diff --git a/OpenCL/m28000_a3-pure.cl b/OpenCL/m28000_a3-pure.cl index f0aac2e14..bc6edf3f8 100644 --- a/OpenCL/m28000_a3-pure.cl +++ b/OpenCL/m28000_a3-pure.cl @@ -181,7 +181,7 @@ DECLSPEC u64 crc64jones (PRIVATE_AS const u32 *w, const u32 pw_len, const u64 iv return a; } -KERNEL_FQ void m28000_mxx (KERN_ATTR_VECTOR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_mxx (KERN_ATTR_VECTOR_ESALT (crc64_t)) { /** * modifier @@ -254,7 +254,7 @@ KERNEL_FQ void m28000_mxx (KERN_ATTR_VECTOR_ESALT (crc64_t)) } } -KERNEL_FQ void m28000_sxx (KERN_ATTR_VECTOR_ESALT (crc64_t)) +KERNEL_FQ KERNEL_FA void m28000_sxx (KERN_ATTR_VECTOR_ESALT (crc64_t)) { /** * modifier diff --git a/OpenCL/m28100-pure.cl b/OpenCL/m28100-pure.cl index 46d707055..0dfa4924d 100644 --- a/OpenCL/m28100-pure.cl +++ b/OpenCL/m28100-pure.cl @@ -88,7 +88,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28100_init (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) +KERNEL_FQ KERNEL_FA void m28100_init (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) { /** * base @@ -203,7 +203,7 @@ KERNEL_FQ void m28100_init (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) } } -KERNEL_FQ void m28100_loop (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) +KERNEL_FQ KERNEL_FA void m28100_loop (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) { const u64 gid = get_global_id (0); @@ -309,7 +309,7 @@ KERNEL_FQ void m28100_loop (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) } } -KERNEL_FQ void m28100_comp (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) +KERNEL_FQ KERNEL_FA void m28100_comp (KERN_ATTR_TMPS_ESALT (winhello_tmp_t, winhello_t)) { /** * base diff --git a/OpenCL/m28200-pure.cl b/OpenCL/m28200-pure.cl index 58106a007..92b7a2434 100644 --- a/OpenCL/m28200-pure.cl +++ b/OpenCL/m28200-pure.cl @@ -9,6 +9,7 @@ #include M2S(INCLUDE_PATH/inc_platform.cl) #include M2S(INCLUDE_PATH/inc_common.cl) #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_hash_scrypt.cl) #include M2S(INCLUDE_PATH/inc_cipher_aes.cl) #include M2S(INCLUDE_PATH/inc_cipher_aes-gcm.cl) #endif @@ -16,16 +17,6 @@ #define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) #define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) -typedef struct exodus_tmp -{ - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} exodus_tmp_t; - typedef struct exodus { u32 iv[4]; @@ -34,443 +25,51 @@ typedef struct exodus } exodus_t; -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) +KERNEL_FQ KERNEL_FA void m28200_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, exodus_t)) { - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } -} - - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4]; - - for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; - - for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) - { - X[dst_off + 0] = TT[src_off + 0]; - X[dst_off + 1] = TT[src_off + 1]; - X[dst_off + 2] = TT[src_off + 2]; - X[dst_off + 3] = TT[src_off + 3]; - } - - #endif - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - -KERNEL_FQ void m28200_init (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) -{ - /** - * base - */ - const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; - sha256_hmac_ctx_t sha256_hmac_ctx; + scrypt_pbkdf2_ggg (pws[gid].i, pws[gid].pw_len, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len, tmps[gid].in, SCRYPT_SZ); - sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); - - sha256_hmac_update_global (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } + scrypt_blockmix_in (tmps[gid].in, tmps[gid].out, SCRYPT_SZ); } -KERNEL_FQ void m28200_loop_prepare (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m28200_loop (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) +KERNEL_FQ KERNEL_FA void m28200_loop_prepare (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, exodus_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); if (gid >= GID_CNT) return; - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; + u32 X[STATE_CNT4]; - uint4 X[STATE_CNT4]; + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; + scrypt_smix_init (P, X, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); } -KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) +KERNEL_FQ KERNEL_FA void m28200_loop (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, exodus_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + const u64 bid = get_group_id (0); + + if (gid >= GID_CNT) return; + + u32 X[STATE_CNT4]; + u32 T[STATE_CNT4]; + + GLOBAL_AS u32 *P = tmps[gid].out + (SALT_REPEAT * STATE_CNT4); + + scrypt_smix_loop (P, X, T, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, gid, lid, lsz, bid); +} + +KERNEL_FQ KERNEL_FA void m28200_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, exodus_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -529,110 +128,24 @@ KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) if (gid >= GID_CNT) return; - /** - * 2nd pbkdf2, creates B - */ + scrypt_blockmix_out (tmps[gid].out, tmps[gid].in, SCRYPT_SZ); - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32 out[8]; - sha256_hmac_ctx_t ctx; - - sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); - - for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) - { - for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) - { - uint4 X[4]; - - const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); - - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; - - uint4 T[4]; - - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); + scrypt_pbkdf2_ggp (pws[gid].i, pws[gid].pw_len, tmps[gid].in, SCRYPT_SZ, out, 32); // GCM stuff u32 ukey[8]; - ukey[0] = ctx.opad.h[0]; - ukey[1] = ctx.opad.h[1]; - ukey[2] = ctx.opad.h[2]; - ukey[3] = ctx.opad.h[3]; - ukey[4] = ctx.opad.h[4]; - ukey[5] = ctx.opad.h[5]; - ukey[6] = ctx.opad.h[6]; - ukey[7] = ctx.opad.h[7]; + ukey[0] = hc_swap32_S (out[0]); + ukey[1] = hc_swap32_S (out[1]); + ukey[2] = hc_swap32_S (out[2]); + ukey[3] = hc_swap32_S (out[3]); + ukey[4] = hc_swap32_S (out[4]); + ukey[5] = hc_swap32_S (out[5]); + ukey[6] = hc_swap32_S (out[6]); + ukey[7] = hc_swap32_S (out[7]); u32 key[60] = { 0 }; u32 subKey[4] = { 0 }; diff --git a/OpenCL/m28300_a0-pure.cl b/OpenCL/m28300_a0-pure.cl index 8551fd776..a6c78bd07 100644 --- a/OpenCL/m28300_a0-pure.cl +++ b/OpenCL/m28300_a0-pure.cl @@ -36,7 +36,7 @@ CONSTANT_VK u32 bin2base64[0x40] = #define int_to_base64(c) make_u32x (s_bin2base64[(c).s0], s_bin2base64[(c).s1], s_bin2base64[(c).s2], s_bin2base64[(c).s3], s_bin2base64[(c).s4], s_bin2base64[(c).s5], s_bin2base64[(c).s6], s_bin2base64[(c).s7], s_bin2base64[(c).s8], s_bin2base64[(c).s9], s_bin2base64[(c).sa], s_bin2base64[(c).sb], s_bin2base64[(c).sc], s_bin2base64[(c).sd], s_bin2base64[(c).se], s_bin2base64[(c).sf]) #endif -KERNEL_FQ void m28300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28300_mxx (KERN_ATTR_RULES ()) { /** * base @@ -184,7 +184,7 @@ KERNEL_FQ void m28300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m28300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28300_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m28300_a1-pure.cl b/OpenCL/m28300_a1-pure.cl index 5924ad59d..7535c3b07 100644 --- a/OpenCL/m28300_a1-pure.cl +++ b/OpenCL/m28300_a1-pure.cl @@ -34,7 +34,7 @@ CONSTANT_VK u32 bin2base64[0x40] = #define int_to_base64(c) make_u32x (s_bin2base64[(c).s0], s_bin2base64[(c).s1], s_bin2base64[(c).s2], s_bin2base64[(c).s3], s_bin2base64[(c).s4], s_bin2base64[(c).s5], s_bin2base64[(c).s6], s_bin2base64[(c).s7], s_bin2base64[(c).s8], s_bin2base64[(c).s9], s_bin2base64[(c).sa], s_bin2base64[(c).sb], s_bin2base64[(c).sc], s_bin2base64[(c).sd], s_bin2base64[(c).se], s_bin2base64[(c).sf]) #endif -KERNEL_FQ void m28300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28300_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -180,7 +180,7 @@ KERNEL_FQ void m28300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m28300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28300_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m28300_a3-pure.cl b/OpenCL/m28300_a3-pure.cl index 0734fcf5e..29b1e21ba 100644 --- a/OpenCL/m28300_a3-pure.cl +++ b/OpenCL/m28300_a3-pure.cl @@ -34,7 +34,7 @@ CONSTANT_VK u32 bin2base64[0x40] = #define int_to_base64(c) make_u32x (s_bin2base64[(c).s0], s_bin2base64[(c).s1], s_bin2base64[(c).s2], s_bin2base64[(c).s3], s_bin2base64[(c).s4], s_bin2base64[(c).s5], s_bin2base64[(c).s6], s_bin2base64[(c).s7], s_bin2base64[(c).s8], s_bin2base64[(c).s9], s_bin2base64[(c).sa], s_bin2base64[(c).sb], s_bin2base64[(c).sc], s_bin2base64[(c).sd], s_bin2base64[(c).se], s_bin2base64[(c).sf]) #endif -KERNEL_FQ void m28300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28300_mxx (KERN_ATTR_VECTOR ()) { /** * base @@ -193,7 +193,7 @@ KERNEL_FQ void m28300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m28300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28300_sxx (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m28400-pure.cl b/OpenCL/m28400-pure.cl index 2fec71c5b..3d8af6ae7 100644 --- a/OpenCL/m28400-pure.cl +++ b/OpenCL/m28400-pure.cl @@ -423,7 +423,7 @@ DECLSPEC u32 u16_bin_to_u32_hex (const u32 v) | ((v1 < 10) ? '0' + v1 : 'a' - 10 + v1) << 0; } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m28400_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m28400_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -659,7 +659,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m28400_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m28400_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m28400_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -862,7 +862,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m28400_loop (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m28400_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m28400_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m28501_a0-pure.cl b/OpenCL/m28501_a0-pure.cl index a04f0db9c..9f0d8c197 100644 --- a/OpenCL/m28501_a0-pure.cl +++ b/OpenCL/m28501_a0-pure.cl @@ -21,7 +21,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28501_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28501_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -162,7 +162,7 @@ KERNEL_FQ void m28501_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m28501_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28501_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m28501_a1-pure.cl b/OpenCL/m28501_a1-pure.cl index 23146d63a..b078b0bc3 100644 --- a/OpenCL/m28501_a1-pure.cl +++ b/OpenCL/m28501_a1-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28501_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28501_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -200,7 +200,7 @@ KERNEL_FQ void m28501_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m28501_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28501_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m28501_a3-pure.cl b/OpenCL/m28501_a3-pure.cl index 960a1c431..30ba29601 100644 --- a/OpenCL/m28501_a3-pure.cl +++ b/OpenCL/m28501_a3-pure.cl @@ -61,7 +61,7 @@ // } // }; -KERNEL_FQ void m28501_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28501_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -220,7 +220,7 @@ KERNEL_FQ void m28501_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m28501_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28501_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m28502_a0-pure.cl b/OpenCL/m28502_a0-pure.cl index 19f5e4af8..44a8fa9c4 100644 --- a/OpenCL/m28502_a0-pure.cl +++ b/OpenCL/m28502_a0-pure.cl @@ -21,7 +21,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28502_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28502_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -163,7 +163,7 @@ KERNEL_FQ void m28502_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m28502_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28502_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m28502_a1-pure.cl b/OpenCL/m28502_a1-pure.cl index fdbe644aa..442ec2f25 100644 --- a/OpenCL/m28502_a1-pure.cl +++ b/OpenCL/m28502_a1-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28502_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28502_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -201,7 +201,7 @@ KERNEL_FQ void m28502_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m28502_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28502_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m28502_a3-pure.cl b/OpenCL/m28502_a3-pure.cl index 080e86bc7..cfdd43275 100644 --- a/OpenCL/m28502_a3-pure.cl +++ b/OpenCL/m28502_a3-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28502_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28502_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -179,7 +179,7 @@ KERNEL_FQ void m28502_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m28502_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28502_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m28505_a0-pure.cl b/OpenCL/m28505_a0-pure.cl index 94d90874b..a44a13eac 100644 --- a/OpenCL/m28505_a0-pure.cl +++ b/OpenCL/m28505_a0-pure.cl @@ -21,7 +21,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28505_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28505_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -186,7 +186,7 @@ KERNEL_FQ void m28505_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m28505_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28505_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m28505_a1-pure.cl b/OpenCL/m28505_a1-pure.cl index 38fd02d32..32ba42a3a 100644 --- a/OpenCL/m28505_a1-pure.cl +++ b/OpenCL/m28505_a1-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28505_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28505_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -224,7 +224,7 @@ KERNEL_FQ void m28505_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m28505_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28505_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m28505_a3-pure.cl b/OpenCL/m28505_a3-pure.cl index d0f0ca899..8b26928b9 100644 --- a/OpenCL/m28505_a3-pure.cl +++ b/OpenCL/m28505_a3-pure.cl @@ -20,7 +20,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28505_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28505_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -203,7 +203,7 @@ KERNEL_FQ void m28505_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m28505_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28505_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m28506_a0-pure.cl b/OpenCL/m28506_a0-pure.cl index 31361c813..90426a852 100644 --- a/OpenCL/m28506_a0-pure.cl +++ b/OpenCL/m28506_a0-pure.cl @@ -21,7 +21,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28506_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28506_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -187,7 +187,7 @@ KERNEL_FQ void m28506_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m28506_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m28506_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m28506_a1-pure.cl b/OpenCL/m28506_a1-pure.cl index f26707e1a..9d3cbd471 100644 --- a/OpenCL/m28506_a1-pure.cl +++ b/OpenCL/m28506_a1-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28506_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28506_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -225,7 +225,7 @@ KERNEL_FQ void m28506_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m28506_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m28506_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m28506_a3-pure.cl b/OpenCL/m28506_a3-pure.cl index 1c31c5563..daf409411 100644 --- a/OpenCL/m28506_a3-pure.cl +++ b/OpenCL/m28506_a3-pure.cl @@ -19,7 +19,7 @@ #include M2S(INCLUDE_PATH/inc_ecc_secp256k1.cl) #endif -KERNEL_FQ void m28506_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28506_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -203,7 +203,7 @@ KERNEL_FQ void m28506_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m28506_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m28506_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m28600-pure.cl b/OpenCL/m28600-pure.cl index 9b534a4d5..e119404e2 100644 --- a/OpenCL/m28600-pure.cl +++ b/OpenCL/m28600-pure.cl @@ -79,7 +79,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28600_init (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) +KERNEL_FQ KERNEL_FA void m28600_init (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) { /** * base @@ -163,7 +163,7 @@ KERNEL_FQ void m28600_init (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgre } } -KERNEL_FQ void m28600_loop (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) +KERNEL_FQ KERNEL_FA void m28600_loop (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) { const u64 gid = get_global_id (0); @@ -269,7 +269,7 @@ KERNEL_FQ void m28600_loop (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgre } } -KERNEL_FQ void m28600_comp (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) +KERNEL_FQ KERNEL_FA void m28600_comp (KERN_ATTR_TMPS_ESALT (postgres_sha256_tmp_t, postgres_sha256_t)) { /** * base diff --git a/OpenCL/m28700_a0-optimized.cl b/OpenCL/m28700_a0-optimized.cl index f32c69ccb..d946fdd59 100644 --- a/OpenCL/m28700_a0-optimized.cl +++ b/OpenCL/m28700_a0-optimized.cl @@ -139,7 +139,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28700_m04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -431,15 +431,15 @@ KERNEL_FQ void m28700_m04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_m08 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m08 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_m16 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m16 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_s04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -743,10 +743,10 @@ KERNEL_FQ void m28700_s04 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_s08 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s08 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_s16 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s16 (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { } diff --git a/OpenCL/m28700_a0-pure.cl b/OpenCL/m28700_a0-pure.cl index 65583b2b0..2fb4615eb 100644 --- a/OpenCL/m28700_a0-pure.cl +++ b/OpenCL/m28700_a0-pure.cl @@ -38,7 +38,7 @@ typedef struct aws4_sig_v4 } aws4_sig_v4_t; -KERNEL_FQ void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -264,7 +264,7 @@ KERNEL_FQ void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_sxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_sxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier diff --git a/OpenCL/m28700_a1-optimized.cl b/OpenCL/m28700_a1-optimized.cl index 5458783f2..9de44dfc9 100644 --- a/OpenCL/m28700_a1-optimized.cl +++ b/OpenCL/m28700_a1-optimized.cl @@ -137,7 +137,7 @@ DECLSPEC void hmac_sha256_run (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -498,15 +498,15 @@ KERNEL_FQ void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_m08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_m16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -879,10 +879,10 @@ KERNEL_FQ void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_s08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { } -KERNEL_FQ void m28700_s16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { } diff --git a/OpenCL/m28700_a1-pure.cl b/OpenCL/m28700_a1-pure.cl index 2cb8cca7a..b64ae5e79 100644 --- a/OpenCL/m28700_a1-pure.cl +++ b/OpenCL/m28700_a1-pure.cl @@ -36,7 +36,7 @@ typedef struct aws4_sig_v4 } aws4_sig_v4_t; -KERNEL_FQ void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -285,7 +285,7 @@ KERNEL_FQ void m28700_mxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_sxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_sxx (KERN_ATTR_RULES_ESALT (aws4_sig_v4_t)) { /** * modifier diff --git a/OpenCL/m28700_a3-optimized.cl b/OpenCL/m28700_a3-optimized.cl index 4dff8f5b9..e3d66daa8 100644 --- a/OpenCL/m28700_a3-optimized.cl +++ b/OpenCL/m28700_a3-optimized.cl @@ -701,7 +701,7 @@ DECLSPEC void m28700s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base @@ -750,7 +750,7 @@ KERNEL_FQ void m28700_m04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) m28700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28700_m08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base @@ -799,7 +799,7 @@ KERNEL_FQ void m28700_m08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) m28700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28700_m16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_m16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base @@ -848,7 +848,7 @@ KERNEL_FQ void m28700_m16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) m28700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base @@ -897,7 +897,7 @@ KERNEL_FQ void m28700_s04 (KERN_ATTR_ESALT (aws4_sig_v4_t)) m28700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28700_s08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base @@ -946,7 +946,7 @@ KERNEL_FQ void m28700_s08 (KERN_ATTR_ESALT (aws4_sig_v4_t)) m28700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m28700_s16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_s16 (KERN_ATTR_ESALT (aws4_sig_v4_t)) { /** * base diff --git a/OpenCL/m28700_a3-pure.cl b/OpenCL/m28700_a3-pure.cl index d6111755d..11abdb800 100644 --- a/OpenCL/m28700_a3-pure.cl +++ b/OpenCL/m28700_a3-pure.cl @@ -36,7 +36,7 @@ typedef struct aws4_sig_v4 } aws4_sig_v4_t; -KERNEL_FQ void m28700_mxx (KERN_ATTR_VECTOR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_mxx (KERN_ATTR_VECTOR_ESALT (aws4_sig_v4_t)) { /** * modifier @@ -246,7 +246,7 @@ KERNEL_FQ void m28700_mxx (KERN_ATTR_VECTOR_ESALT (aws4_sig_v4_t)) } } -KERNEL_FQ void m28700_sxx (KERN_ATTR_VECTOR_ESALT (aws4_sig_v4_t)) +KERNEL_FQ KERNEL_FA void m28700_sxx (KERN_ATTR_VECTOR_ESALT (aws4_sig_v4_t)) { /** * modifier diff --git a/OpenCL/m28800-pure.cl b/OpenCL/m28800-pure.cl index ed167af6d..b822a17b8 100644 --- a/OpenCL/m28800-pure.cl +++ b/OpenCL/m28800-pure.cl @@ -114,7 +114,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28800_init (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) +KERNEL_FQ KERNEL_FA void m28800_init (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) { /** * base @@ -192,7 +192,7 @@ KERNEL_FQ void m28800_init (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) } } -KERNEL_FQ void m28800_loop (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) +KERNEL_FQ KERNEL_FA void m28800_loop (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) { /** * base @@ -280,7 +280,7 @@ KERNEL_FQ void m28800_loop (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) } } -KERNEL_FQ void m28800_comp (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) +KERNEL_FQ KERNEL_FA void m28800_comp (KERN_ATTR_TMPS_ESALT (krb5db_17_tmp_t, krb5db_17_t)) { /** * base diff --git a/OpenCL/m28900-pure.cl b/OpenCL/m28900-pure.cl index 075ed4e94..9c018bd7e 100644 --- a/OpenCL/m28900-pure.cl +++ b/OpenCL/m28900-pure.cl @@ -114,7 +114,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m28900_init (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) +KERNEL_FQ KERNEL_FA void m28900_init (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) { /** * base @@ -192,7 +192,7 @@ KERNEL_FQ void m28900_init (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) } } -KERNEL_FQ void m28900_loop (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) +KERNEL_FQ KERNEL_FA void m28900_loop (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) { /** * base @@ -280,7 +280,7 @@ KERNEL_FQ void m28900_loop (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) } } -KERNEL_FQ void m28900_comp (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) +KERNEL_FQ KERNEL_FA void m28900_comp (KERN_ATTR_TMPS_ESALT (krb5db_18_tmp_t, krb5db_18_t)) { /** * base diff --git a/OpenCL/m29000_a0-pure.cl b/OpenCL/m29000_a0-pure.cl index b2685c9ca..30c774b91 100644 --- a/OpenCL/m29000_a0-pure.cl +++ b/OpenCL/m29000_a0-pure.cl @@ -26,7 +26,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m29000_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) { /** * modifier @@ -112,7 +112,7 @@ KERNEL_FQ void m29000_mxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m29000_sxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_sxx (KERN_ATTR_RULES_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m29000_a1-pure.cl b/OpenCL/m29000_a1-pure.cl index eb7efadd1..0e4ef3265 100644 --- a/OpenCL/m29000_a1-pure.cl +++ b/OpenCL/m29000_a1-pure.cl @@ -24,7 +24,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m29000_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) { /** * modifier @@ -115,7 +115,7 @@ KERNEL_FQ void m29000_mxx (KERN_ATTR_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m29000_sxx (KERN_ATTR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_sxx (KERN_ATTR_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m29000_a3-pure.cl b/OpenCL/m29000_a3-pure.cl index 2d7eb194f..19823bfcd 100644 --- a/OpenCL/m29000_a3-pure.cl +++ b/OpenCL/m29000_a3-pure.cl @@ -24,7 +24,7 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -KERNEL_FQ void m29000_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) { /** * modifier @@ -121,7 +121,7 @@ KERNEL_FQ void m29000_mxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) } } -KERNEL_FQ void m29000_sxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) +KERNEL_FQ KERNEL_FA void m29000_sxx (KERN_ATTR_VECTOR_ESALT (sha1_double_salt_t)) { /** * modifier diff --git a/OpenCL/m29100_a0-pure.cl b/OpenCL/m29100_a0-pure.cl index 1d53b0036..6176de75d 100644 --- a/OpenCL/m29100_a0-pure.cl +++ b/OpenCL/m29100_a0-pure.cl @@ -17,7 +17,7 @@ #endif -KERNEL_FQ void m29100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m29100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -104,7 +104,7 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m29100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m29100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m29100_a1-pure.cl b/OpenCL/m29100_a1-pure.cl index e6bb17319..de8f95da2 100644 --- a/OpenCL/m29100_a1-pure.cl +++ b/OpenCL/m29100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m29100_mxx (KERN_ATTR_BASIC ()) { /** @@ -124,7 +124,7 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m29100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m29100_sxx (KERN_ATTR_BASIC ()) { /** diff --git a/OpenCL/m29100_a3-pure.cl b/OpenCL/m29100_a3-pure.cl index 94c38d7da..d8aff6810 100644 --- a/OpenCL/m29100_a3-pure.cl +++ b/OpenCL/m29100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha1.cl) #endif -KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m29100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -110,7 +110,7 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m29100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m29100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m29200_a0-pure.cl b/OpenCL/m29200_a0-pure.cl index 017fc1c8e..e16fd9f2e 100644 --- a/OpenCL/m29200_a0-pure.cl +++ b/OpenCL/m29200_a0-pure.cl @@ -32,7 +32,7 @@ typedef struct radmin3 } radmin3_t; -KERNEL_FQ void m29200_mxx (KERN_ATTR_RULES_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_mxx (KERN_ATTR_RULES_ESALT (radmin3_t)) { /** * modifier @@ -288,7 +288,7 @@ KERNEL_FQ void m29200_mxx (KERN_ATTR_RULES_ESALT (radmin3_t)) } } -KERNEL_FQ void m29200_sxx (KERN_ATTR_RULES_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_sxx (KERN_ATTR_RULES_ESALT (radmin3_t)) { /** * modifier diff --git a/OpenCL/m29200_a1-pure.cl b/OpenCL/m29200_a1-pure.cl index 9a44a3efe..d0d30a1e9 100644 --- a/OpenCL/m29200_a1-pure.cl +++ b/OpenCL/m29200_a1-pure.cl @@ -30,7 +30,7 @@ typedef struct radmin3 } radmin3_t; -KERNEL_FQ void m29200_mxx (KERN_ATTR_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_mxx (KERN_ATTR_ESALT (radmin3_t)) { /** * modifier @@ -291,7 +291,7 @@ KERNEL_FQ void m29200_mxx (KERN_ATTR_ESALT (radmin3_t)) } } -KERNEL_FQ void m29200_sxx (KERN_ATTR_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_sxx (KERN_ATTR_ESALT (radmin3_t)) { /** * modifier diff --git a/OpenCL/m29200_a3-pure.cl b/OpenCL/m29200_a3-pure.cl index 1757589da..e8ea5b85b 100644 --- a/OpenCL/m29200_a3-pure.cl +++ b/OpenCL/m29200_a3-pure.cl @@ -30,7 +30,7 @@ typedef struct radmin3 } radmin3_t; -KERNEL_FQ void m29200_mxx (KERN_ATTR_VECTOR_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_mxx (KERN_ATTR_VECTOR_ESALT (radmin3_t)) { /** * modifier @@ -298,7 +298,7 @@ KERNEL_FQ void m29200_mxx (KERN_ATTR_VECTOR_ESALT (radmin3_t)) } } -KERNEL_FQ void m29200_sxx (KERN_ATTR_VECTOR_ESALT (radmin3_t)) +KERNEL_FQ KERNEL_FA void m29200_sxx (KERN_ATTR_VECTOR_ESALT (radmin3_t)) { /** * modifier diff --git a/OpenCL/m29600-pure.cl b/OpenCL/m29600-pure.cl index 85406f53e..e07a0637e 100644 --- a/OpenCL/m29600-pure.cl +++ b/OpenCL/m29600-pure.cl @@ -75,7 +75,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m29600_init (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) +KERNEL_FQ KERNEL_FA void m29600_init (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) { const u64 gid = get_global_id (0); if (gid >= GID_CNT) return; @@ -155,7 +155,7 @@ KERNEL_FQ void m29600_init (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) } } -KERNEL_FQ void m29600_loop (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) +KERNEL_FQ KERNEL_FA void m29600_loop (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) { const u64 gid = get_global_id (0); @@ -241,7 +241,7 @@ KERNEL_FQ void m29600_loop (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) } } -KERNEL_FQ void m29600_comp (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) +KERNEL_FQ KERNEL_FA void m29600_comp (KERN_ATTR_TMPS_ESALT (pbkdf_sha1_tmp_t,terra_t)) { /** * base diff --git a/OpenCL/m29700-pure.cl b/OpenCL/m29700-pure.cl index 8eaf8ae03..61171e391 100644 --- a/OpenCL/m29700-pure.cl +++ b/OpenCL/m29700-pure.cl @@ -45,7 +45,7 @@ typedef struct keepass } keepass_t; -KERNEL_FQ void m29700_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m29700_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { /** * base @@ -84,7 +84,7 @@ KERNEL_FQ void m29700_init (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) tmps[gid].tmp_digest[7] = digest[7]; } -KERNEL_FQ void m29700_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m29700_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); @@ -172,7 +172,7 @@ KERNEL_FQ void m29700_loop (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) tmps[gid].tmp_digest[7] = data1[3]; } -KERNEL_FQ void m29700_comp (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) +KERNEL_FQ KERNEL_FA void m29700_comp (KERN_ATTR_TMPS_ESALT (keepass_tmp_t, keepass_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m29800-pure.cl b/OpenCL/m29800-pure.cl deleted file mode 100644 index c72f5c267..000000000 --- a/OpenCL/m29800-pure.cl +++ /dev/null @@ -1,680 +0,0 @@ -/** - * Author......: See docs/credits.txt - * License.....: MIT - */ - -#ifdef KERNEL_STATIC -#include M2S(INCLUDE_PATH/inc_vendor.h) -#include M2S(INCLUDE_PATH/inc_types.h) -#include M2S(INCLUDE_PATH/inc_platform.cl) -#include M2S(INCLUDE_PATH/inc_common.cl) -#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) -#include M2S(INCLUDE_PATH/inc_cipher_aes.cl) -#endif - -typedef struct -{ - #ifndef SCRYPT_TMP_ELEM - #define SCRYPT_TMP_ELEM 1 - #endif - - uint4 P[SCRYPT_TMP_ELEM]; - -} scrypt_tmp_t; - -#if defined IS_CUDA || defined IS_HIP - -inline __device__ uint4 operator & (const uint4 a, const u32 b) { return make_uint4 ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } -inline __device__ uint4 operator << (const uint4 a, const u32 b) { return make_uint4 ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } -inline __device__ uint4 operator >> (const uint4 a, const u32 b) { return make_uint4 ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } -inline __device__ uint4 operator + (const uint4 a, const uint4 b) { return make_uint4 ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } -inline __device__ uint4 operator ^ (const uint4 a, const uint4 b) { return make_uint4 ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } -inline __device__ uint4 operator | (const uint4 a, const uint4 b) { return make_uint4 ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } -inline __device__ void operator ^= ( uint4 &a, const uint4 b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } - -inline __device__ uint4 rotate (const uint4 a, const int n) -{ - return ((a << n) | ((a >> (32 - n)))); -} - -#endif - -DECLSPEC uint4 hc_swap32_4 (uint4 v) -{ - return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); -} - -#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) -#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) -#define GET_STATE_CNT(r) (2 * (r) * 16) - -#define SCRYPT_CNT GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P) -#define SCRYPT_CNT4 (SCRYPT_CNT / 4) -#define STATE_CNT GET_STATE_CNT (SCRYPT_R) -#define STATE_CNT4 (STATE_CNT / 4) - -#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); - -#if defined IS_CUDA || defined IS_HIP - -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = make_uint4 (X1.w, X1.x, X1.y, X1.z); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.y, X3.z, X3.w, X3.x); \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = make_uint4 (X1.y, X1.z, X1.w, X1.x); \ - X2 = make_uint4 (X2.z, X2.w, X2.x, X2.y); \ - X3 = make_uint4 (X3.w, X3.x, X3.y, X3.z); \ -} -#elif defined IS_METAL -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.wxyz; \ - X2 = X2.zwxy; \ - X3 = X3.yzwx; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.yzwx; \ - X2 = X2.zwxy; \ - X3 = X3.wxyz; \ -} -#else -#define SALSA20_2R() \ -{ \ - ADD_ROTATE_XOR (X1, X0, X3, 7); \ - ADD_ROTATE_XOR (X2, X1, X0, 9); \ - ADD_ROTATE_XOR (X3, X2, X1, 13); \ - ADD_ROTATE_XOR (X0, X3, X2, 18); \ - \ - X1 = X1.s3012; \ - X2 = X2.s2301; \ - X3 = X3.s1230; \ - \ - ADD_ROTATE_XOR (X3, X0, X1, 7); \ - ADD_ROTATE_XOR (X2, X3, X0, 9); \ - ADD_ROTATE_XOR (X1, X2, X3, 13); \ - ADD_ROTATE_XOR (X0, X1, X2, 18); \ - \ - X1 = X1.s1230; \ - X2 = X2.s2301; \ - X3 = X3.s3012; \ -} -#endif - -#define Coord(xd4,y,z) (((xd4) * ySIZE * zSIZE) + ((y) * zSIZE) + (z)) -#define CO Coord(xd4,y,z) - -DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) -{ - uint4 R0 = TI[STATE_CNT4 - 4]; - uint4 R1 = TI[STATE_CNT4 - 3]; - uint4 R2 = TI[STATE_CNT4 - 2]; - uint4 R3 = TI[STATE_CNT4 - 1]; - - for (int i = 0; i < STATE_CNT4; i += 4) - { - uint4 Y0 = TI[i + 0]; - uint4 Y1 = TI[i + 1]; - uint4 Y2 = TI[i + 2]; - uint4 Y3 = TI[i + 3]; - - R0 = R0 ^ Y0; - R1 = R1 ^ Y1; - R2 = R2 ^ Y2; - R3 = R3 ^ Y3; - - uint4 X0 = R0; - uint4 X1 = R1; - uint4 X2 = R2; - uint4 X3 = R3; - - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - SALSA20_2R (); - - R0 = R0 + X0; - R1 = R1 + X1; - R2 = R2 + X2; - R3 = R3 + X3; - - TI[i + 0] = R0; - TI[i + 1] = R1; - TI[i + 2] = R2; - TI[i + 3] = R3; - } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif -} - -DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - for (u32 y = 0; y < ySIZE; y++) - { - for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; - - for (u32 i = 0; i < SCRYPT_TMTO; i++) salsa_r (X); - } -} - -DECLSPEC void scrypt_smix_loop (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) -{ - const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; - const u32 zSIZE = STATE_CNT4; - - const u32 x = (u32) gid; - - const u32 xd4 = x / 4; - const u32 xm4 = x & 3; - - GLOBAL_AS uint4 *V; - - switch (xm4) - { - case 0: V = V0; break; - case 1: V = V1; break; - case 2: V = V2; break; - case 3: V = V3; break; - } - - // note: fixed 1024 iterations = forced -u 1024 - - for (u32 N_pos = 0; N_pos < 1024; N_pos++) - { - const u32 k = X[zSIZE - 4].x & (SCRYPT_N - 1); - - const u32 y = k / SCRYPT_TMTO; - - const u32 km = k - (y * SCRYPT_TMTO); - - uint4 T[STATE_CNT4]; - - for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; - - for (u32 i = 0; i < km; i++) salsa_r (T); - - for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; - - salsa_r (X); - } -} - -KERNEL_FQ void m29800_init (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - - if (gid >= GID_CNT) return; - - u32 w[128] = { 0 }; - - hc_enc_t hc_enc; - - hc_enc_init (&hc_enc); - - const int w_len = hc_enc_next_global (&hc_enc, pws[gid].i, pws[gid].pw_len, 256, w, sizeof (w)); - - if (w_len == -1) return; - - // utf16le to utf16be - - for (int i = 0, j = 0; i < w_len; i += 4, j += 1) - { - w[j] = ((w[j] >> 8) & 0x00ff00ff) - | ((w[j] << 8) & 0xff00ff00); - } - - sha256_hmac_ctx_t sha256_hmac_ctx; - - sha256_hmac_init_swap (&sha256_hmac_ctx, w, w_len); - - u32 x0[4] = { 0 }; - u32 x1[4] = { 0 }; - u32 x2[4] = { 0 }; - u32 x3[4] = { 0 }; - - x0[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; - x0[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; - - sha256_hmac_update_64 (&sha256_hmac_ctx, x0, x1, x2, x3, 8); - - for (u32 i = 0, j = 1, k = 0; i < SCRYPT_CNT; i += 8, j += 1, k += 2) - { - sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); - - sha256_hmac_final (&sha256_hmac_ctx2); - - u32 digest[8]; - - digest[0] = sha256_hmac_ctx2.opad.h[0]; - digest[1] = sha256_hmac_ctx2.opad.h[1]; - digest[2] = sha256_hmac_ctx2.opad.h[2]; - digest[3] = sha256_hmac_ctx2.opad.h[3]; - digest[4] = sha256_hmac_ctx2.opad.h[4]; - digest[5] = sha256_hmac_ctx2.opad.h[5]; - digest[6] = sha256_hmac_ctx2.opad.h[6]; - digest[7] = sha256_hmac_ctx2.opad.h[7]; - - #if defined IS_CUDA || defined IS_HIP - const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); - #elif defined IS_METAL - const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); - #else - const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); - const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); - #endif - - tmps[gid].P[k + 0] = tmp0; - tmps[gid].P[k + 1] = tmp1; - } - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 T[4]; - - T[0] = tmps[gid].P[l + 0]; - T[1] = tmps[gid].P[l + 1]; - T[2] = tmps[gid].P[l + 2]; - T[3] = tmps[gid].P[l + 3]; - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - uint4 X[4]; - - #if defined IS_CUDA || defined IS_HIP - X[0] = make_uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #elif defined IS_METAL - X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); - #else - X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); - X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); - X[2] = (uint4) (T[2].x, T[3].y, T[0].z, T[1].w); - X[3] = (uint4) (T[3].x, T[0].y, T[1].z, T[2].w); - #endif - - tmps[gid].P[l + 0] = X[0]; - tmps[gid].P[l + 1] = X[1]; - tmps[gid].P[l + 2] = X[2]; - tmps[gid].P[l + 3] = X[3]; - } -} - -KERNEL_FQ void m29800_loop_prepare (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - /** - * base - */ - - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - // SCRYPT part, init V - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_init (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m29800_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - - if (gid >= GID_CNT) return; - - GLOBAL_AS uint4 *d_scrypt0_buf = (GLOBAL_AS uint4 *) d_extra0_buf; - GLOBAL_AS uint4 *d_scrypt1_buf = (GLOBAL_AS uint4 *) d_extra1_buf; - GLOBAL_AS uint4 *d_scrypt2_buf = (GLOBAL_AS uint4 *) d_extra2_buf; - GLOBAL_AS uint4 *d_scrypt3_buf = (GLOBAL_AS uint4 *) d_extra3_buf; - - uint4 X[STATE_CNT4]; - - const u32 P_offset = SALT_REPEAT * STATE_CNT4; - - GLOBAL_AS uint4 *P = tmps[gid].P + P_offset; - - for (int z = 0; z < STATE_CNT4; z++) X[z] = P[z]; - - scrypt_smix_loop (X, d_scrypt0_buf, d_scrypt1_buf, d_scrypt2_buf, d_scrypt3_buf, gid); - - for (int z = 0; z < STATE_CNT4; z++) P[z] = X[z]; -} - -KERNEL_FQ void m29800_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) -{ - const u64 gid = get_global_id (0); - const u64 lid = get_local_id (0); - const u64 lsz = get_local_size (0); - - /** - * aes shared - */ - - #ifdef REAL_SHM - - LOCAL_VK u32 s_td0[256]; - LOCAL_VK u32 s_td1[256]; - LOCAL_VK u32 s_td2[256]; - LOCAL_VK u32 s_td3[256]; - LOCAL_VK u32 s_td4[256]; - - LOCAL_VK u32 s_te0[256]; - LOCAL_VK u32 s_te1[256]; - LOCAL_VK u32 s_te2[256]; - LOCAL_VK u32 s_te3[256]; - LOCAL_VK u32 s_te4[256]; - - for (u32 i = lid; i < 256; i += lsz) - { - s_td0[i] = td0[i]; - s_td1[i] = td1[i]; - s_td2[i] = td2[i]; - s_td3[i] = td3[i]; - s_td4[i] = td4[i]; - - s_te0[i] = te0[i]; - s_te1[i] = te1[i]; - s_te2[i] = te2[i]; - s_te3[i] = te3[i]; - s_te4[i] = te4[i]; - } - - SYNC_THREADS (); - - #else - - CONSTANT_AS u32a *s_td0 = td0; - CONSTANT_AS u32a *s_td1 = td1; - CONSTANT_AS u32a *s_td2 = td2; - CONSTANT_AS u32a *s_td3 = td3; - CONSTANT_AS u32a *s_td4 = td4; - - CONSTANT_AS u32a *s_te0 = te0; - CONSTANT_AS u32a *s_te1 = te1; - CONSTANT_AS u32a *s_te2 = te2; - CONSTANT_AS u32a *s_te3 = te3; - CONSTANT_AS u32a *s_te4 = te4; - - #endif - - if (gid >= GID_CNT) return; - - /** - * 2nd pbkdf2, creates B - */ - - u32 w[128] = { 0 }; - - hc_enc_t hc_enc; - - hc_enc_init (&hc_enc); - - const int w_len = hc_enc_next_global (&hc_enc, pws[gid].i, pws[gid].pw_len, 256, w, sizeof (w)); - - if (w_len == -1) return; - - // utf16le to utf16be - - for (int i = 0, j = 0; i < w_len; i += 4, j += 1) - { - w[j] = ((w[j] >> 8) & 0x00ff00ff) - | ((w[j] << 8) & 0xff00ff00); - } - - sha256_hmac_ctx_t ctx; - - sha256_hmac_init_swap (&ctx, w, w_len); - - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; - - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) - { - uint4 X[4]; - - X[0] = tmps[gid].P[l + 0]; - X[1] = tmps[gid].P[l + 1]; - X[2] = tmps[gid].P[l + 2]; - X[3] = tmps[gid].P[l + 3]; - - uint4 T[4]; - - #if defined IS_CUDA || defined IS_HIP - T[0] = make_uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #elif defined IS_METAL - T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); - #else - T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); - T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); - T[2] = (uint4) (X[2].x, X[1].y, X[0].z, X[3].w); - T[3] = (uint4) (X[3].x, X[2].y, X[1].z, X[0].w); - #endif - - T[0] = hc_swap32_4 (T[0]); - T[1] = hc_swap32_4 (T[1]); - T[2] = hc_swap32_4 (T[2]); - T[3] = hc_swap32_4 (T[3]); - - w0[0] = T[0].x; - w0[1] = T[0].y; - w0[2] = T[0].z; - w0[3] = T[0].w; - w1[0] = T[1].x; - w1[1] = T[1].y; - w1[2] = T[1].z; - w1[3] = T[1].w; - w2[0] = T[2].x; - w2[1] = T[2].y; - w2[2] = T[2].z; - w2[3] = T[2].w; - w3[0] = T[3].x; - w3[1] = T[3].y; - w3[2] = T[3].z; - w3[3] = T[3].w; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); - } - - w0[0] = 1; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; - - sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); - - sha256_hmac_final (&ctx); - - // AES256-CBC decrypt - - u32 key[8]; - - key[0] = ctx.opad.h[0]; - key[1] = ctx.opad.h[1]; - key[2] = ctx.opad.h[2]; - key[3] = ctx.opad.h[3]; - key[4] = ctx.opad.h[4]; - key[5] = ctx.opad.h[5]; - key[6] = ctx.opad.h[6]; - key[7] = ctx.opad.h[7]; - - #define KEYLEN 60 - - u32 ks[KEYLEN]; - - AES256_set_decrypt_key (ks, key, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); - - u32 iv[4]; - - iv[0] = salt_bufs[SALT_POS_HOST].salt_buf[2]; - iv[1] = salt_bufs[SALT_POS_HOST].salt_buf[3]; - iv[2] = salt_bufs[SALT_POS_HOST].salt_buf[4]; - iv[3] = salt_bufs[SALT_POS_HOST].salt_buf[5]; - - u32 enc[4]; - - enc[0] = salt_bufs[SALT_POS_HOST].salt_buf[6]; - enc[1] = salt_bufs[SALT_POS_HOST].salt_buf[7]; - enc[2] = salt_bufs[SALT_POS_HOST].salt_buf[8]; - enc[3] = salt_bufs[SALT_POS_HOST].salt_buf[9]; - - u32 dec[4]; - - aes256_decrypt (ks, enc, dec, s_td0, s_td1, s_td2, s_td3, s_td4); - - dec[0] ^= iv[0]; - dec[1] ^= iv[1]; - dec[2] ^= iv[2]; - dec[3] ^= iv[3]; - - if ((dec[0] == 0x10101010) && - (dec[1] == 0x10101010) && - (dec[2] == 0x10101010) && - (dec[3] == 0x10101010)) - { - if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0) - { - mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, 0, 0, 0); - } - - return; - } -} diff --git a/OpenCL/m29910-pure.cl b/OpenCL/m29910-pure.cl index 2d8c0954d..9bd893ebe 100644 --- a/OpenCL/m29910-pure.cl +++ b/OpenCL/m29910-pure.cl @@ -87,7 +87,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m29910_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29910_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { /** * base @@ -173,7 +173,7 @@ KERNEL_FQ void m29910_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau } } -KERNEL_FQ void m29910_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29910_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); @@ -281,7 +281,7 @@ KERNEL_FQ void m29910_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau } } -KERNEL_FQ void m29910_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29910_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m29920-pure.cl b/OpenCL/m29920-pure.cl index a44d6c6a1..15317afeb 100644 --- a/OpenCL/m29920-pure.cl +++ b/OpenCL/m29920-pure.cl @@ -87,7 +87,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m29920_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29920_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { /** * base @@ -173,7 +173,7 @@ KERNEL_FQ void m29920_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau } } -KERNEL_FQ void m29920_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29920_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); @@ -281,7 +281,7 @@ KERNEL_FQ void m29920_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau } } -KERNEL_FQ void m29920_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29920_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m29930-pure.cl b/OpenCL/m29930-pure.cl index 9a1f842d6..d3284a718 100644 --- a/OpenCL/m29930-pure.cl +++ b/OpenCL/m29930-pure.cl @@ -52,7 +52,7 @@ CONSTANT_VK u32a default_salts[32] = 0xeae3f44e, 0xaf4a8f84, 0xf1fab308, 0x8569bef8 }; -KERNEL_FQ void m29930_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29930_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { /** * base @@ -81,7 +81,7 @@ KERNEL_FQ void m29930_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau tmps[gid].out_buf[3] = 0; } -KERNEL_FQ void m29930_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29930_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); @@ -154,7 +154,7 @@ KERNEL_FQ void m29930_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau unpackv (tmps, out_buf, gid, 3, out[3]); } -KERNEL_FQ void m29930_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29930_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m29940-pure.cl b/OpenCL/m29940-pure.cl index e93708b9b..d321c2bfc 100644 --- a/OpenCL/m29940-pure.cl +++ b/OpenCL/m29940-pure.cl @@ -52,7 +52,7 @@ CONSTANT_VK u32a default_salts[32] = 0xeae3f44e, 0xaf4a8f84, 0xf1fab308, 0x8569bef8 }; -KERNEL_FQ void m29940_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29940_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { /** * base @@ -81,7 +81,7 @@ KERNEL_FQ void m29940_init (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau tmps[gid].out_buf[3] = 0; } -KERNEL_FQ void m29940_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29940_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); @@ -154,7 +154,7 @@ KERNEL_FQ void m29940_loop (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavau unpackv (tmps, out_buf, gid, 3, out[3]); } -KERNEL_FQ void m29940_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) +KERNEL_FQ KERNEL_FA void m29940_comp (KERN_ATTR_TMPS_ESALT (encdatavault_tmp_t, encdatavault_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m30420_a0-optimized.cl b/OpenCL/m30420_a0-optimized.cl index ac0c46ec5..9da71c166 100644 --- a/OpenCL/m30420_a0-optimized.cl +++ b/OpenCL/m30420_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30420_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -163,15 +163,15 @@ KERNEL_FQ void m30420_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30420_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30420_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30420_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -330,10 +330,10 @@ KERNEL_FQ void m30420_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30420_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30420_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m30420_a0-pure.cl b/OpenCL/m30420_a0-pure.cl index ef049b6a7..52728b163 100644 --- a/OpenCL/m30420_a0-pure.cl +++ b/OpenCL/m30420_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30420_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m30420_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30420_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30420_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30420_a1-optimized.cl b/OpenCL/m30420_a1-optimized.cl index 2ce78c612..7ca50d36a 100644 --- a/OpenCL/m30420_a1-optimized.cl +++ b/OpenCL/m30420_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30420_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -219,15 +219,15 @@ KERNEL_FQ void m30420_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30420_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30420_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30420_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -444,10 +444,10 @@ KERNEL_FQ void m30420_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30420_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30420_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m30420_a1-pure.cl b/OpenCL/m30420_a1-pure.cl index 135ce78df..9d803f2e5 100644 --- a/OpenCL/m30420_a1-pure.cl +++ b/OpenCL/m30420_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30420_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m30420_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30420_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30420_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30420_a3-optimized.cl b/OpenCL/m30420_a3-optimized.cl index ed59e5277..5a2fd1195 100644 --- a/OpenCL/m30420_a3-optimized.cl +++ b/OpenCL/m30420_a3-optimized.cl @@ -258,7 +258,7 @@ DECLSPEC void m30420s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m30420_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -298,7 +298,7 @@ KERNEL_FQ void m30420_m04 (KERN_ATTR_VECTOR ()) m30420m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30420_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -338,7 +338,7 @@ KERNEL_FQ void m30420_m08 (KERN_ATTR_VECTOR ()) m30420m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30420_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -378,7 +378,7 @@ KERNEL_FQ void m30420_m16 (KERN_ATTR_VECTOR ()) m30420m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30420_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -418,7 +418,7 @@ KERNEL_FQ void m30420_s04 (KERN_ATTR_VECTOR ()) m30420s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30420_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -458,7 +458,7 @@ KERNEL_FQ void m30420_s08 (KERN_ATTR_VECTOR ()) m30420s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30420_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m30420_a3-pure.cl b/OpenCL/m30420_a3-pure.cl index a2698f5b3..509eb453d 100644 --- a/OpenCL/m30420_a3-pure.cl +++ b/OpenCL/m30420_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30420_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m30420_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30420_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30420_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30500_a0-optimized.cl b/OpenCL/m30500_a0-optimized.cl index 115409f48..21a8f69b5 100644 --- a/OpenCL/m30500_a0-optimized.cl +++ b/OpenCL/m30500_a0-optimized.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m30500_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -492,15 +492,15 @@ KERNEL_FQ void m30500_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30500_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30500_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30500_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -979,10 +979,10 @@ KERNEL_FQ void m30500_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30500_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30500_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m30500_a0-pure.cl b/OpenCL/m30500_a0-pure.cl index e78e6c708..f37f85576 100644 --- a/OpenCL/m30500_a0-pure.cl +++ b/OpenCL/m30500_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m30500_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -184,7 +184,7 @@ KERNEL_FQ void m30500_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30500_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30500_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30500_a1-optimized.cl b/OpenCL/m30500_a1-optimized.cl index c77a0c341..327db8db8 100644 --- a/OpenCL/m30500_a1-optimized.cl +++ b/OpenCL/m30500_a1-optimized.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m30500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -549,15 +549,15 @@ KERNEL_FQ void m30500_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -1095,10 +1095,10 @@ KERNEL_FQ void m30500_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m30500_a1-pure.cl b/OpenCL/m30500_a1-pure.cl index 18bed013f..2c13c2262 100644 --- a/OpenCL/m30500_a1-pure.cl +++ b/OpenCL/m30500_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m30500_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -180,7 +180,7 @@ KERNEL_FQ void m30500_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30500_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30500_a3-optimized.cl b/OpenCL/m30500_a3-optimized.cl index 2326eb1c3..1f7d44408 100644 --- a/OpenCL/m30500_a3-optimized.cl +++ b/OpenCL/m30500_a3-optimized.cl @@ -929,7 +929,7 @@ DECLSPEC void m30500s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m30500_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -999,7 +999,7 @@ KERNEL_FQ void m30500_m04 (KERN_ATTR_BASIC ()) m30500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m30500_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m08 (KERN_ATTR_BASIC ()) { /** * base @@ -1069,7 +1069,7 @@ KERNEL_FQ void m30500_m08 (KERN_ATTR_BASIC ()) m30500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m30500_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_m16 (KERN_ATTR_BASIC ()) { /** * base @@ -1139,7 +1139,7 @@ KERNEL_FQ void m30500_m16 (KERN_ATTR_BASIC ()) m30500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m30500_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -1209,7 +1209,7 @@ KERNEL_FQ void m30500_s04 (KERN_ATTR_BASIC ()) m30500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m30500_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s08 (KERN_ATTR_BASIC ()) { /** * base @@ -1279,7 +1279,7 @@ KERNEL_FQ void m30500_s08 (KERN_ATTR_BASIC ()) m30500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m30500_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30500_s16 (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m30500_a3-pure.cl b/OpenCL/m30500_a3-pure.cl index ad3e5da9f..86508df81 100644 --- a/OpenCL/m30500_a3-pure.cl +++ b/OpenCL/m30500_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m30500_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30500_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -193,7 +193,7 @@ KERNEL_FQ void m30500_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30500_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30500_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30600-pure.cl b/OpenCL/m30600-pure.cl index 140514465..dc1ebbe2d 100644 --- a/OpenCL/m30600-pure.cl +++ b/OpenCL/m30600-pure.cl @@ -444,7 +444,7 @@ DECLSPEC u32 u16_bin_to_u32_hex (const u32 v) | ((v1 < 10) ? '0' + v1 : 'a' - 10 + v1) << 0; } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m30600_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m30600_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -695,7 +695,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m30600_init (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m30600_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m30600_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base @@ -898,7 +898,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m30600_loop (KERN_ATTR_TMPS } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m30600_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +KERNEL_FQ KERNEL_FA void m30600_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) { /** * base diff --git a/OpenCL/m30700_a0-optimized.cl b/OpenCL/m30700_a0-optimized.cl index 88f6cd29b..30d18fbe2 100644 --- a/OpenCL/m30700_a0-optimized.cl +++ b/OpenCL/m30700_a0-optimized.cl @@ -30,7 +30,7 @@ h = 0; \ } -KERNEL_FQ void m30700_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -186,15 +186,15 @@ KERNEL_FQ void m30700_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30700_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30700_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30700_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -383,10 +383,10 @@ KERNEL_FQ void m30700_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30700_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m30700_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m30700_a0-pure.cl b/OpenCL/m30700_a0-pure.cl index 72eab9d86..2fca62245 100644 --- a/OpenCL/m30700_a0-pure.cl +++ b/OpenCL/m30700_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30700_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -71,7 +71,7 @@ KERNEL_FQ void m30700_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30700_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30700_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30700_a1-optimized.cl b/OpenCL/m30700_a1-optimized.cl index 873c96b5f..d03e60628 100644 --- a/OpenCL/m30700_a1-optimized.cl +++ b/OpenCL/m30700_a1-optimized.cl @@ -28,7 +28,7 @@ h = 0; \ } -KERNEL_FQ void m30700_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -242,15 +242,15 @@ KERNEL_FQ void m30700_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30700_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30700_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30700_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -497,10 +497,10 @@ KERNEL_FQ void m30700_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30700_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m30700_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m30700_a1-pure.cl b/OpenCL/m30700_a1-pure.cl index 146f543ac..3ba191501 100644 --- a/OpenCL/m30700_a1-pure.cl +++ b/OpenCL/m30700_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30700_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -65,7 +65,7 @@ KERNEL_FQ void m30700_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30700_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30700_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30700_a3-optimized.cl b/OpenCL/m30700_a3-optimized.cl index 54b769776..a72d1559d 100644 --- a/OpenCL/m30700_a3-optimized.cl +++ b/OpenCL/m30700_a3-optimized.cl @@ -311,7 +311,7 @@ DECLSPEC void m30700s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m30700_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -351,7 +351,7 @@ KERNEL_FQ void m30700_m04 (KERN_ATTR_VECTOR ()) m30700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30700_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -391,7 +391,7 @@ KERNEL_FQ void m30700_m08 (KERN_ATTR_VECTOR ()) m30700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30700_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -431,7 +431,7 @@ KERNEL_FQ void m30700_m16 (KERN_ATTR_VECTOR ()) m30700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30700_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -471,7 +471,7 @@ KERNEL_FQ void m30700_s04 (KERN_ATTR_VECTOR ()) m30700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30700_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -511,7 +511,7 @@ KERNEL_FQ void m30700_s08 (KERN_ATTR_VECTOR ()) m30700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m30700_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m30700_a3-pure.cl b/OpenCL/m30700_a3-pure.cl index 910e54f9c..08d9ba797 100644 --- a/OpenCL/m30700_a3-pure.cl +++ b/OpenCL/m30700_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha256.cl) #endif -KERNEL_FQ void m30700_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -82,7 +82,7 @@ KERNEL_FQ void m30700_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30700_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30700_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30901_a0-pure.cl b/OpenCL/m30901_a0-pure.cl index 0709c22d2..4dd177a04 100644 --- a/OpenCL/m30901_a0-pure.cl +++ b/OpenCL/m30901_a0-pure.cl @@ -42,7 +42,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30901_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30901_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -161,7 +161,7 @@ KERNEL_FQ void m30901_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30901_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30901_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30901_a1-pure.cl b/OpenCL/m30901_a1-pure.cl index 097351c8d..a577f6669 100644 --- a/OpenCL/m30901_a1-pure.cl +++ b/OpenCL/m30901_a1-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30901_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30901_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -187,7 +187,7 @@ KERNEL_FQ void m30901_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30901_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30901_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30901_a3-pure.cl b/OpenCL/m30901_a3-pure.cl index 6df675272..66b7557cf 100644 --- a/OpenCL/m30901_a3-pure.cl +++ b/OpenCL/m30901_a3-pure.cl @@ -82,7 +82,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30901_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30901_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -217,7 +217,7 @@ KERNEL_FQ void m30901_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30901_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30901_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30902_a0-pure.cl b/OpenCL/m30902_a0-pure.cl index 570f54fb4..4ceef3158 100644 --- a/OpenCL/m30902_a0-pure.cl +++ b/OpenCL/m30902_a0-pure.cl @@ -42,7 +42,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30902_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30902_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -167,7 +167,7 @@ KERNEL_FQ void m30902_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30902_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30902_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30902_a1-pure.cl b/OpenCL/m30902_a1-pure.cl index d1e478296..55f090e62 100644 --- a/OpenCL/m30902_a1-pure.cl +++ b/OpenCL/m30902_a1-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30902_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30902_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -193,7 +193,7 @@ KERNEL_FQ void m30902_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30902_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30902_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30902_a3-pure.cl b/OpenCL/m30902_a3-pure.cl index 13f949bab..36a7191c4 100644 --- a/OpenCL/m30902_a3-pure.cl +++ b/OpenCL/m30902_a3-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30902_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30902_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -181,7 +181,7 @@ KERNEL_FQ void m30902_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30902_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30902_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30905_a0-pure.cl b/OpenCL/m30905_a0-pure.cl index d72376414..b60085021 100644 --- a/OpenCL/m30905_a0-pure.cl +++ b/OpenCL/m30905_a0-pure.cl @@ -42,7 +42,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30905_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30905_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -185,7 +185,7 @@ KERNEL_FQ void m30905_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30905_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30905_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30905_a1-pure.cl b/OpenCL/m30905_a1-pure.cl index 2493a1741..5da3ed631 100644 --- a/OpenCL/m30905_a1-pure.cl +++ b/OpenCL/m30905_a1-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30905_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30905_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -211,7 +211,7 @@ KERNEL_FQ void m30905_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30905_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30905_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30905_a3-pure.cl b/OpenCL/m30905_a3-pure.cl index 624d21ec6..2efe255bb 100644 --- a/OpenCL/m30905_a3-pure.cl +++ b/OpenCL/m30905_a3-pure.cl @@ -41,7 +41,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30905_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30905_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -200,7 +200,7 @@ KERNEL_FQ void m30905_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30905_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30905_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m30906_a0-pure.cl b/OpenCL/m30906_a0-pure.cl index 95549f36a..1812284e1 100644 --- a/OpenCL/m30906_a0-pure.cl +++ b/OpenCL/m30906_a0-pure.cl @@ -42,7 +42,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30906_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30906_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -191,7 +191,7 @@ KERNEL_FQ void m30906_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m30906_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m30906_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m30906_a1-pure.cl b/OpenCL/m30906_a1-pure.cl index fd76b12c4..46b12eb3b 100644 --- a/OpenCL/m30906_a1-pure.cl +++ b/OpenCL/m30906_a1-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30906_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30906_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -217,7 +217,7 @@ KERNEL_FQ void m30906_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m30906_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m30906_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m30906_a3-pure.cl b/OpenCL/m30906_a3-pure.cl index 033d9e1c4..e2a5a341f 100644 --- a/OpenCL/m30906_a3-pure.cl +++ b/OpenCL/m30906_a3-pure.cl @@ -40,7 +40,7 @@ DECLSPEC u32 hex_u32_to_u32 (PRIVATE_AS const u32 hex0, PRIVATE_AS const u32 hex return (v); } -KERNEL_FQ void m30906_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30906_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -205,7 +205,7 @@ KERNEL_FQ void m30906_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m30906_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m30906_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m31000_a0-optimized.cl b/OpenCL/m31000_a0-optimized.cl index 52d4d7852..7c06fb4f2 100644 --- a/OpenCL/m31000_a0-optimized.cl +++ b/OpenCL/m31000_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m31000_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_m04 (KERN_ATTR_RULES ()) { /** * base @@ -92,15 +92,15 @@ KERNEL_FQ void m31000_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31000_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31000_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31000_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_s04 (KERN_ATTR_RULES ()) { /** * base @@ -188,10 +188,10 @@ KERNEL_FQ void m31000_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31000_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31000_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m31000_a0-pure.cl b/OpenCL/m31000_a0-pure.cl index 81919e0ff..6792d0d89 100644 --- a/OpenCL/m31000_a0-pure.cl +++ b/OpenCL/m31000_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m31000_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_mxx (KERN_ATTR_RULES ()) { /** * base @@ -57,7 +57,7 @@ KERNEL_FQ void m31000_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31000_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31000_sxx (KERN_ATTR_RULES ()) { /** * base diff --git a/OpenCL/m31000_a1-optimized.cl b/OpenCL/m31000_a1-optimized.cl index 8bb154729..22aa3b11b 100644 --- a/OpenCL/m31000_a1-optimized.cl +++ b/OpenCL/m31000_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m31000_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_m04 (KERN_ATTR_BASIC ()) { /** * base @@ -152,15 +152,15 @@ KERNEL_FQ void m31000_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31000_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31000_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31000_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_s04 (KERN_ATTR_BASIC ()) { /** * base @@ -311,10 +311,10 @@ KERNEL_FQ void m31000_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31000_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31000_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m31000_a1-pure.cl b/OpenCL/m31000_a1-pure.cl index e90aa0d46..c9d3c2be6 100644 --- a/OpenCL/m31000_a1-pure.cl +++ b/OpenCL/m31000_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m31000_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_mxx (KERN_ATTR_BASIC ()) { /** * base @@ -55,7 +55,7 @@ KERNEL_FQ void m31000_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31000_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31000_sxx (KERN_ATTR_BASIC ()) { /** * base diff --git a/OpenCL/m31000_a3-optimized.cl b/OpenCL/m31000_a3-optimized.cl index 085873422..451104801 100644 --- a/OpenCL/m31000_a3-optimized.cl +++ b/OpenCL/m31000_a3-optimized.cl @@ -142,7 +142,7 @@ DECLSPEC void m31000s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m31000_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -182,7 +182,7 @@ KERNEL_FQ void m31000_m04 (KERN_ATTR_VECTOR ()) m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31000_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -222,7 +222,7 @@ KERNEL_FQ void m31000_m08 (KERN_ATTR_VECTOR ()) m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31000_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -262,7 +262,7 @@ KERNEL_FQ void m31000_m16 (KERN_ATTR_VECTOR ()) m31000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31000_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -302,7 +302,7 @@ KERNEL_FQ void m31000_s04 (KERN_ATTR_VECTOR ()) m31000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31000_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -342,7 +342,7 @@ KERNEL_FQ void m31000_s08 (KERN_ATTR_VECTOR ()) m31000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31000_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m31000_a3-pure.cl b/OpenCL/m31000_a3-pure.cl index 24ce691db..9456dcde4 100644 --- a/OpenCL/m31000_a3-pure.cl +++ b/OpenCL/m31000_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) #endif -KERNEL_FQ void m31000_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -66,7 +66,7 @@ KERNEL_FQ void m31000_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m31000_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31000_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m31100_a0-optimized.cl b/OpenCL/m31100_a0-optimized.cl index c42b3f18e..9cbeeacac 100644 --- a/OpenCL/m31100_a0-optimized.cl +++ b/OpenCL/m31100_a0-optimized.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sm3.cl) #endif -KERNEL_FQ void m31100_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -163,15 +163,15 @@ KERNEL_FQ void m31100_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31100_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31100_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31100_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -335,10 +335,10 @@ KERNEL_FQ void m31100_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31100_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31100_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m31100_a0-pure.cl b/OpenCL/m31100_a0-pure.cl index 18c1e2795..9b8f4b2ff 100644 --- a/OpenCL/m31100_a0-pure.cl +++ b/OpenCL/m31100_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sm3.cl) #endif -KERNEL_FQ void m31100_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -60,7 +60,7 @@ KERNEL_FQ void m31100_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31100_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31100_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m31100_a1-optimized.cl b/OpenCL/m31100_a1-optimized.cl index 5ed4672ec..2ff8ca04d 100644 --- a/OpenCL/m31100_a1-optimized.cl +++ b/OpenCL/m31100_a1-optimized.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sm3.cl) #endif -KERNEL_FQ void m31100_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -219,15 +219,15 @@ KERNEL_FQ void m31100_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31100_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31100_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31100_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -449,10 +449,10 @@ KERNEL_FQ void m31100_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31100_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31100_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m31100_a1-pure.cl b/OpenCL/m31100_a1-pure.cl index 43d42204a..474962708 100644 --- a/OpenCL/m31100_a1-pure.cl +++ b/OpenCL/m31100_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sm3.cl) #endif -KERNEL_FQ void m31100_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -56,7 +56,7 @@ KERNEL_FQ void m31100_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31100_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31100_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m31100_a3-optimized.cl b/OpenCL/m31100_a3-optimized.cl index c5f61fceb..8ec75e45f 100644 --- a/OpenCL/m31100_a3-optimized.cl +++ b/OpenCL/m31100_a3-optimized.cl @@ -498,7 +498,7 @@ DECLSPEC void m31100s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } */ -KERNEL_FQ void m31100_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -538,7 +538,7 @@ KERNEL_FQ void m31100_m04 (KERN_ATTR_VECTOR ()) m31100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31100_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -578,7 +578,7 @@ KERNEL_FQ void m31100_m08 (KERN_ATTR_VECTOR ()) m31100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31100_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -618,7 +618,7 @@ KERNEL_FQ void m31100_m16 (KERN_ATTR_VECTOR ()) m31100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31100_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -658,7 +658,7 @@ KERNEL_FQ void m31100_s04 (KERN_ATTR_VECTOR ()) m31100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31100_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -698,7 +698,7 @@ KERNEL_FQ void m31100_s08 (KERN_ATTR_VECTOR ()) m31100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31100_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m31100_a3-pure.cl b/OpenCL/m31100_a3-pure.cl index 01dea33eb..9db1e470a 100644 --- a/OpenCL/m31100_a3-pure.cl +++ b/OpenCL/m31100_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sm3.cl) #endif -KERNEL_FQ void m31100_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -69,7 +69,7 @@ KERNEL_FQ void m31100_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m31100_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31100_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m31200-pure.cl b/OpenCL/m31200-pure.cl index 4cbe28053..ef634ca11 100644 --- a/OpenCL/m31200-pure.cl +++ b/OpenCL/m31200-pure.cl @@ -70,7 +70,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m31200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) +KERNEL_FQ KERNEL_FA void m31200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) { /** * base @@ -142,7 +142,7 @@ KERNEL_FQ void m31200_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t } } -KERNEL_FQ void m31200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) +KERNEL_FQ KERNEL_FA void m31200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) { const u64 gid = get_global_id (0); @@ -227,7 +227,7 @@ KERNEL_FQ void m31200_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t } } -KERNEL_FQ void m31200_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) +KERNEL_FQ KERNEL_FA void m31200_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha1_tmp_t, veeam_vbk_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m31300_a0-optimized.cl b/OpenCL/m31300_a0-optimized.cl index 11b3061c5..abd3c540a 100644 --- a/OpenCL/m31300_a0-optimized.cl +++ b/OpenCL/m31300_a0-optimized.cl @@ -17,7 +17,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m31300_m04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_m04 (KERN_ATTR_RULES ()) { /** * modifier @@ -343,15 +343,15 @@ KERNEL_FQ void m31300_m04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31300_s04 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_s04 (KERN_ATTR_RULES ()) { /** * modifier @@ -689,10 +689,10 @@ KERNEL_FQ void m31300_s04 (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m31300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m31300_a0-pure.cl b/OpenCL/m31300_a0-pure.cl index ef3cac65a..6e50e7223 100644 --- a/OpenCL/m31300_a0-pure.cl +++ b/OpenCL/m31300_a0-pure.cl @@ -17,7 +17,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m31300_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -114,7 +114,7 @@ KERNEL_FQ void m31300_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m31300_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m31300_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m31300_a1-optimized.cl b/OpenCL/m31300_a1-optimized.cl index 604554925..f120c456e 100644 --- a/OpenCL/m31300_a1-optimized.cl +++ b/OpenCL/m31300_a1-optimized.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m31300_m04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_m04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -403,15 +403,15 @@ KERNEL_FQ void m31300_m04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31300_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -812,10 +812,10 @@ KERNEL_FQ void m31300_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m31300_a1-pure.cl b/OpenCL/m31300_a1-pure.cl index a6c964152..db42e61ea 100644 --- a/OpenCL/m31300_a1-pure.cl +++ b/OpenCL/m31300_a1-pure.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m31300_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -110,7 +110,7 @@ KERNEL_FQ void m31300_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31300_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31300_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m31300_a3-optimized.cl b/OpenCL/m31300_a3-optimized.cl index e305df2c5..d8f64aaaf 100644 --- a/OpenCL/m31300_a3-optimized.cl +++ b/OpenCL/m31300_a3-optimized.cl @@ -725,7 +725,7 @@ DECLSPEC void m31300s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTO } } -KERNEL_FQ void m31300_m04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_m04 (KERN_ATTR_VECTOR ()) { /** * base @@ -765,7 +765,7 @@ KERNEL_FQ void m31300_m04 (KERN_ATTR_VECTOR ()) m31300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31300_m08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_m08 (KERN_ATTR_VECTOR ()) { /** * base @@ -805,7 +805,7 @@ KERNEL_FQ void m31300_m08 (KERN_ATTR_VECTOR ()) m31300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31300_m16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_m16 (KERN_ATTR_VECTOR ()) { /** * base @@ -845,7 +845,7 @@ KERNEL_FQ void m31300_m16 (KERN_ATTR_VECTOR ()) m31300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31300_s04 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_s04 (KERN_ATTR_VECTOR ()) { /** * base @@ -885,7 +885,7 @@ KERNEL_FQ void m31300_s04 (KERN_ATTR_VECTOR ()) m31300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31300_s08 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_s08 (KERN_ATTR_VECTOR ()) { /** * base @@ -925,7 +925,7 @@ KERNEL_FQ void m31300_s08 (KERN_ATTR_VECTOR ()) m31300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31300_s16 (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_s16 (KERN_ATTR_VECTOR ()) { /** * base diff --git a/OpenCL/m31300_a3-pure.cl b/OpenCL/m31300_a3-pure.cl index 2296f9b68..d6dd0a02e 100644 --- a/OpenCL/m31300_a3-pure.cl +++ b/OpenCL/m31300_a3-pure.cl @@ -15,7 +15,7 @@ #include M2S(INCLUDE_PATH/inc_hash_md5.cl) #endif -KERNEL_FQ void m31300_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -165,7 +165,7 @@ KERNEL_FQ void m31300_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m31300_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m31300_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m31400_a0-optimized.cl b/OpenCL/m31400_a0-optimized.cl index 3ebf076da..3d386cb7c 100644 --- a/OpenCL/m31400_a0-optimized.cl +++ b/OpenCL/m31400_a0-optimized.cl @@ -303,15 +303,15 @@ DECLSPEC void aes256_scrt_format_VV (PRIVATE_AS u32 *aes_ks, PRIVATE_AS u32x *w, #endif } -KERNEL_FQ void m31400_m16 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m16 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { } -KERNEL_FQ void m31400_m08 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m08 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { } -KERNEL_FQ void m31400_m04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { /** * modifier @@ -520,15 +520,15 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) } } -KERNEL_FQ void m31400_s16 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s16 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { } -KERNEL_FQ void m31400_s08 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s08 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { } -KERNEL_FQ void m31400_s04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) { /** * modifier diff --git a/OpenCL/m31400_a0-pure.cl b/OpenCL/m31400_a0-pure.cl index 28cd2c51a..50a005e33 100644 --- a/OpenCL/m31400_a0-pure.cl +++ b/OpenCL/m31400_a0-pure.cl @@ -3,7 +3,7 @@ * License.....: MIT */ -#define NEW_SIMD_CODE +//#define NEW_SIMD_CODE #ifdef KERNEL_STATIC #include M2S(INCLUDE_PATH/inc_vendor.h) @@ -135,7 +135,7 @@ DECLSPEC void aes256_scrt_format (PRIVATE_AS u32 *aes_ks, PRIVATE_AS u32 *pw, co AES256_encrypt (aes_ks, hash, out, s_te0, s_te1, s_te2, s_te3, s_te4); } -KERNEL_FQ void m31400_mxx (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_mxx (KERN_ATTR_RULES_ESALT (scrtv2_t)) { /** * modifier @@ -219,7 +219,7 @@ KERNEL_FQ void m31400_mxx (KERN_ATTR_RULES_ESALT (scrtv2_t)) } } -KERNEL_FQ void m31400_sxx (KERN_ATTR_RULES_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_sxx (KERN_ATTR_RULES_ESALT (scrtv2_t)) { /** * modifier diff --git a/OpenCL/m31400_a1-optimized.cl b/OpenCL/m31400_a1-optimized.cl index e6b266a23..aba0ad4fa 100644 --- a/OpenCL/m31400_a1-optimized.cl +++ b/OpenCL/m31400_a1-optimized.cl @@ -300,7 +300,7 @@ DECLSPEC void aes256_scrt_format_VV (PRIVATE_AS u32 *aes_ks, PRIVATE_AS u32x *w, #endif } -KERNEL_FQ void m31400_m04 (KERN_ATTR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m04 (KERN_ATTR_ESALT (scrtv2_t)) { /** * modifier @@ -586,15 +586,15 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_ESALT (scrtv2_t)) } } -KERNEL_FQ void m31400_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31400_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31400_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31400_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31400_s04 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31400_s04 (KERN_ATTR_BASIC ()) { /** * modifier @@ -892,10 +892,10 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m31400_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31400_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m31400_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m31400_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m31400_a1-pure.cl b/OpenCL/m31400_a1-pure.cl index 390bc8bf3..96774ca7b 100644 --- a/OpenCL/m31400_a1-pure.cl +++ b/OpenCL/m31400_a1-pure.cl @@ -3,7 +3,7 @@ * License.....: MIT */ -#define NEW_SIMD_CODE +//#define NEW_SIMD_CODE #ifdef KERNEL_STATIC #include M2S(INCLUDE_PATH/inc_vendor.h) @@ -135,7 +135,7 @@ DECLSPEC void aes256_scrt_format (PRIVATE_AS u32 *aes_ks, PRIVATE_AS u32 *pw, co AES256_encrypt (aes_ks, hash, out, s_te0, s_te1, s_te2, s_te3, s_te4); } -KERNEL_FQ void m31400_mxx (KERN_ATTR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_mxx (KERN_ATTR_ESALT (scrtv2_t)) { /** * modifier @@ -225,7 +225,7 @@ KERNEL_FQ void m31400_mxx (KERN_ATTR_ESALT (scrtv2_t)) } } -KERNEL_FQ void m31400_sxx (KERN_ATTR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_sxx (KERN_ATTR_ESALT (scrtv2_t)) { /** * modifier diff --git a/OpenCL/m31400_a3-optimized.cl b/OpenCL/m31400_a3-optimized.cl index a9c43e961..bc30d42c3 100644 --- a/OpenCL/m31400_a3-optimized.cl +++ b/OpenCL/m31400_a3-optimized.cl @@ -478,7 +478,7 @@ DECLSPEC void m31400m (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m31400_m04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base @@ -551,7 +551,7 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) m31400m (s_te0, s_te1, s_te2, s_te3, s_te4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31400_m08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base @@ -624,7 +624,7 @@ KERNEL_FQ void m31400_m08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) m31400m (s_te0, s_te1, s_te2, s_te3, s_te4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31400_m16 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_m16 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base @@ -885,7 +885,7 @@ DECLSPEC void m31400s (SHM_TYPE u32a *s_te0, SHM_TYPE u32a *s_te1, SHM_TYPE u32a } } -KERNEL_FQ void m31400_s04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base @@ -957,7 +957,7 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) m31400s (s_te0, s_te1, s_te2, s_te3, s_te4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31400_s08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base @@ -1030,7 +1030,7 @@ KERNEL_FQ void m31400_s08 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) m31400s (s_te0, s_te1, s_te2, s_te3, s_te4, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void m31400_s16 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_s16 (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * base diff --git a/OpenCL/m31400_a3-pure.cl b/OpenCL/m31400_a3-pure.cl index 7baacb913..09d450df9 100644 --- a/OpenCL/m31400_a3-pure.cl +++ b/OpenCL/m31400_a3-pure.cl @@ -305,7 +305,7 @@ DECLSPEC void aes256_scrt_format_VV (PRIVATE_AS u32 *aes_ks, PRIVATE_AS u32x *w, #endif } -KERNEL_FQ void m31400_mxx (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_mxx (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * modifier @@ -400,7 +400,7 @@ KERNEL_FQ void m31400_mxx (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) } } -KERNEL_FQ void m31400_sxx (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) +KERNEL_FQ KERNEL_FA void m31400_sxx (KERN_ATTR_VECTOR_ESALT (scrtv2_t)) { /** * modifier diff --git a/OpenCL/m31500-pure.cl b/OpenCL/m31500-pure.cl index 9797dfcff..4911c632a 100644 --- a/OpenCL/m31500-pure.cl +++ b/OpenCL/m31500-pure.cl @@ -41,7 +41,7 @@ typedef struct dcc_tmp } dcc_tmp_t; -KERNEL_FQ void m31500_init (KERN_ATTR_TMPS (dcc_tmp_t)) +KERNEL_FQ KERNEL_FA void m31500_init (KERN_ATTR_TMPS (dcc_tmp_t)) { /** * modifier @@ -79,12 +79,12 @@ KERNEL_FQ void m31500_init (KERN_ATTR_TMPS (dcc_tmp_t)) tmps[gid].digest_buf[3] = out[3]; } -KERNEL_FQ void m31500_loop (KERN_ATTR_TMPS (dcc_tmp_t)) +KERNEL_FQ KERNEL_FA void m31500_loop (KERN_ATTR_TMPS (dcc_tmp_t)) { } -KERNEL_FQ void m31500_comp (KERN_ATTR_TMPS (dcc_tmp_t)) +KERNEL_FQ KERNEL_FA void m31500_comp (KERN_ATTR_TMPS (dcc_tmp_t)) { /** * modifier diff --git a/OpenCL/m31600-pure.cl b/OpenCL/m31600-pure.cl index 40af858f4..93925cb4c 100644 --- a/OpenCL/m31600-pure.cl +++ b/OpenCL/m31600-pure.cl @@ -82,7 +82,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m31600_init (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m31600_init (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base @@ -210,7 +210,7 @@ KERNEL_FQ void m31600_init (KERN_ATTR_TMPS (dcc2_tmp_t)) tmps[gid].out[3] = tmps[gid].dgst[3]; } -KERNEL_FQ void m31600_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m31600_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base @@ -297,7 +297,7 @@ KERNEL_FQ void m31600_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) unpackv (tmps, out, gid, 3, out[3]); } -KERNEL_FQ void m31600_comp (KERN_ATTR_TMPS (dcc2_tmp_t)) +KERNEL_FQ KERNEL_FA void m31600_comp (KERN_ATTR_TMPS (dcc2_tmp_t)) { /** * base diff --git a/OpenCL/m31700_a0-pure.cl b/OpenCL/m31700_a0-pure.cl index f56df6f88..551ab69b0 100644 --- a/OpenCL/m31700_a0-pure.cl +++ b/OpenCL/m31700_a0-pure.cl @@ -38,7 +38,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m31700_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) { /** * modifier @@ -180,7 +180,7 @@ KERNEL_FQ void m31700_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m31700_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m31700_a1-pure.cl b/OpenCL/m31700_a1-pure.cl index 3b07f7e55..06b2e22af 100644 --- a/OpenCL/m31700_a1-pure.cl +++ b/OpenCL/m31700_a1-pure.cl @@ -36,7 +36,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m31700_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier @@ -176,7 +176,7 @@ KERNEL_FQ void m31700_mxx (KERN_ATTR_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m31700_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_sxx (KERN_ATTR_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m31700_a3-pure.cl b/OpenCL/m31700_a3-pure.cl index 9a9db3047..487179006 100644 --- a/OpenCL/m31700_a3-pure.cl +++ b/OpenCL/m31700_a3-pure.cl @@ -36,7 +36,7 @@ typedef struct md5_double_salt } md5_double_salt_t; -KERNEL_FQ void m31700_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) { /** * modifier @@ -189,7 +189,7 @@ KERNEL_FQ void m31700_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) } } -KERNEL_FQ void m31700_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) +KERNEL_FQ KERNEL_FA void m31700_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt_t)) { /** * modifier diff --git a/OpenCL/m31800-pure.cl b/OpenCL/m31800-pure.cl index 55ec89ddf..ec89c7e1a 100644 --- a/OpenCL/m31800-pure.cl +++ b/OpenCL/m31800-pure.cl @@ -88,7 +88,7 @@ DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha256_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m31800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) +KERNEL_FQ KERNEL_FA void m31800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) { /** * base @@ -191,7 +191,7 @@ KERNEL_FQ void m31800_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepasswo } } -KERNEL_FQ void m31800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) +KERNEL_FQ KERNEL_FA void m31800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) { const u64 gid = get_global_id (0); @@ -297,7 +297,7 @@ KERNEL_FQ void m31800_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepasswo } } -KERNEL_FQ void m31800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) +KERNEL_FQ KERNEL_FA void m31800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepassword8_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m31900-pure.cl b/OpenCL/m31900-pure.cl index fca9b423d..a68c1702d 100644 --- a/OpenCL/m31900-pure.cl +++ b/OpenCL/m31900-pure.cl @@ -96,7 +96,7 @@ DECLSPEC void hmac_sha512_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVA sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, digest); } -KERNEL_FQ void m31900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) +KERNEL_FQ KERNEL_FA void m31900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) { /** * base @@ -200,7 +200,7 @@ KERNEL_FQ void m31900_init (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m31900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) +KERNEL_FQ KERNEL_FA void m31900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) { const u64 gid = get_global_id (0); @@ -326,7 +326,7 @@ KERNEL_FQ void m31900_loop (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh } } -KERNEL_FQ void m31900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) +KERNEL_FQ KERNEL_FA void m31900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sha512_aes_cbc_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m32000-pure.cl b/OpenCL/m32000-pure.cl index e7d985b52..8257eda4a 100644 --- a/OpenCL/m32000-pure.cl +++ b/OpenCL/m32000-pure.cl @@ -23,7 +23,7 @@ typedef struct netiq_sspr_md5_tmp } netiq_sspr_md5_tmp_t; -KERNEL_FQ void m32000_init (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m32000_init (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) { /** * base @@ -47,7 +47,7 @@ KERNEL_FQ void m32000_init (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) tmps[gid].dgst[3] = ctx.h[3]; } -KERNEL_FQ void m32000_loop (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m32000_loop (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) { const u64 gid = get_global_id (0); @@ -108,7 +108,7 @@ KERNEL_FQ void m32000_loop (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) } } -KERNEL_FQ void m32000_comp (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +KERNEL_FQ KERNEL_FA void m32000_comp (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m32010-pure.cl b/OpenCL/m32010-pure.cl index c806dce13..08a9a44a4 100644 --- a/OpenCL/m32010-pure.cl +++ b/OpenCL/m32010-pure.cl @@ -23,7 +23,7 @@ typedef struct netiq_sspr_sha1_tmp } netiq_sspr_sha1_tmp_t; -KERNEL_FQ void m32010_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32010_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { /** * base @@ -48,7 +48,7 @@ KERNEL_FQ void m32010_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) tmps[gid].dgst[4] = ctx.h[4]; } -KERNEL_FQ void m32010_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32010_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { const u64 gid = get_global_id (0); @@ -113,7 +113,7 @@ KERNEL_FQ void m32010_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) } } -KERNEL_FQ void m32010_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32010_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m32020-pure.cl b/OpenCL/m32020-pure.cl index b779676e2..dccaf8f91 100644 --- a/OpenCL/m32020-pure.cl +++ b/OpenCL/m32020-pure.cl @@ -23,7 +23,7 @@ typedef struct netiq_sspr_sha1_tmp } netiq_sspr_sha1_tmp_t; -KERNEL_FQ void m32020_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32020_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { /** * base @@ -50,7 +50,7 @@ KERNEL_FQ void m32020_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) tmps[gid].dgst[4] = ctx.h[4]; } -KERNEL_FQ void m32020_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32020_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { const u64 gid = get_global_id (0); @@ -115,7 +115,7 @@ KERNEL_FQ void m32020_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) } } -KERNEL_FQ void m32020_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32020_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m32030-pure.cl b/OpenCL/m32030-pure.cl index 78ea30d56..358d01165 100644 --- a/OpenCL/m32030-pure.cl +++ b/OpenCL/m32030-pure.cl @@ -23,7 +23,7 @@ typedef struct netiq_sspr_sha256_tmp } netiq_sspr_sha256_tmp_t; -KERNEL_FQ void m32030_init (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m32030_init (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m32030_init (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) tmps[gid].dgst[7] = ctx.h[7]; } -KERNEL_FQ void m32030_loop (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m32030_loop (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) { const u64 gid = get_global_id (0); @@ -130,7 +130,7 @@ KERNEL_FQ void m32030_loop (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) } } -KERNEL_FQ void m32030_comp (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +KERNEL_FQ KERNEL_FA void m32030_comp (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m32040-pure.cl b/OpenCL/m32040-pure.cl index 66611bd98..73b0d2b55 100644 --- a/OpenCL/m32040-pure.cl +++ b/OpenCL/m32040-pure.cl @@ -23,7 +23,7 @@ typedef struct netiq_sspr_sha512_tmp } netiq_sspr_sha512_tmp_t; -KERNEL_FQ void m32040_init (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m32040_init (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) { /** * base @@ -53,7 +53,7 @@ KERNEL_FQ void m32040_init (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) tmps[gid].dgst[7] = ctx.h[7]; } -KERNEL_FQ void m32040_loop (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m32040_loop (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) { const u64 gid = get_global_id (0); @@ -150,7 +150,7 @@ KERNEL_FQ void m32040_loop (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) } } -KERNEL_FQ void m32040_comp (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +KERNEL_FQ KERNEL_FA void m32040_comp (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) { const u64 gid = get_global_id (0); const u64 lid = get_local_id (0); diff --git a/OpenCL/m32100-pure.cl b/OpenCL/m32100-pure.cl index a1e9fe227..57e4272c8 100644 --- a/OpenCL/m32100-pure.cl +++ b/OpenCL/m32100-pure.cl @@ -116,7 +116,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m32100_init (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +KERNEL_FQ KERNEL_FA void m32100_init (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) { /** * base @@ -194,7 +194,7 @@ KERNEL_FQ void m32100_init (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_ } } -KERNEL_FQ void m32100_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +KERNEL_FQ KERNEL_FA void m32100_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) { /** * base @@ -282,7 +282,7 @@ KERNEL_FQ void m32100_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_ } } -KERNEL_FQ void m32100_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +KERNEL_FQ KERNEL_FA void m32100_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) { /** * base diff --git a/OpenCL/m32200-pure.cl b/OpenCL/m32200-pure.cl index 9a9d999ae..76a8c07a6 100644 --- a/OpenCL/m32200-pure.cl +++ b/OpenCL/m32200-pure.cl @@ -116,7 +116,7 @@ DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE sha1_transform_vector (w0, w1, w2, w3, digest); } -KERNEL_FQ void m32200_init (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +KERNEL_FQ KERNEL_FA void m32200_init (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) { /** * base @@ -194,7 +194,7 @@ KERNEL_FQ void m32200_init (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_ } } -KERNEL_FQ void m32200_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +KERNEL_FQ KERNEL_FA void m32200_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) { /** * base @@ -282,7 +282,7 @@ KERNEL_FQ void m32200_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_ } } -KERNEL_FQ void m32200_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +KERNEL_FQ KERNEL_FA void m32200_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) { /** * base diff --git a/OpenCL/m32300_a0-optimized.cl b/OpenCL/m32300_a0-optimized.cl index 76400a61e..5d0b3eeee 100644 --- a/OpenCL/m32300_a0-optimized.cl +++ b/OpenCL/m32300_a0-optimized.cl @@ -41,7 +41,7 @@ typedef struct md5_triple_salt } md5_triple_salt_t; -KERNEL_FQ void m32300_m04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_m04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) { /** * modifier @@ -413,15 +413,15 @@ KERNEL_FQ void m32300_m04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_m08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32300_m08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m32300_m16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32300_m16 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m32300_s04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_s04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) { /** * modifier @@ -804,10 +804,10 @@ KERNEL_FQ void m32300_s04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_s08 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32300_s08 (KERN_ATTR_RULES ()) { } -KERNEL_FQ void m32300_s16 (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32300_s16 (KERN_ATTR_RULES ()) { } diff --git a/OpenCL/m32300_a0-pure.cl b/OpenCL/m32300_a0-pure.cl index 59c177abc..a0a663bff 100644 --- a/OpenCL/m32300_a0-pure.cl +++ b/OpenCL/m32300_a0-pure.cl @@ -41,7 +41,7 @@ typedef struct md5_triple_salt } md5_triple_salt_t; -KERNEL_FQ void m32300_mxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_mxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) { /** * modifier @@ -208,7 +208,7 @@ KERNEL_FQ void m32300_mxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_sxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_sxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) { /** * modifier diff --git a/OpenCL/m32300_a1-optimized.cl b/OpenCL/m32300_a1-optimized.cl index 371cb2d99..d3a9d2efe 100644 --- a/OpenCL/m32300_a1-optimized.cl +++ b/OpenCL/m32300_a1-optimized.cl @@ -39,7 +39,7 @@ typedef struct md5_triple_salt } md5_triple_salt_t; -KERNEL_FQ void m32300_m04 (KERN_ATTR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_m04 (KERN_ATTR_ESALT (md5_triple_salt_t)) { /** * modifier @@ -466,15 +466,15 @@ KERNEL_FQ void m32300_m04 (KERN_ATTR_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_m08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32300_m08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m32300_m16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32300_m16 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m32300_s04 (KERN_ATTR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_s04 (KERN_ATTR_ESALT (md5_triple_salt_t)) { /** * modifier @@ -916,10 +916,10 @@ KERNEL_FQ void m32300_s04 (KERN_ATTR_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_s08 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32300_s08 (KERN_ATTR_BASIC ()) { } -KERNEL_FQ void m32300_s16 (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32300_s16 (KERN_ATTR_BASIC ()) { } diff --git a/OpenCL/m32300_a1-pure.cl b/OpenCL/m32300_a1-pure.cl index 132db135a..47dd89d72 100644 --- a/OpenCL/m32300_a1-pure.cl +++ b/OpenCL/m32300_a1-pure.cl @@ -39,7 +39,7 @@ typedef struct md5_triple_salt } md5_triple_salt_t; -KERNEL_FQ void m32300_mxx (KERN_ATTR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_mxx (KERN_ATTR_ESALT (md5_triple_salt_t)) { /** * modifier @@ -204,7 +204,7 @@ KERNEL_FQ void m32300_mxx (KERN_ATTR_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_sxx (KERN_ATTR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_sxx (KERN_ATTR_ESALT (md5_triple_salt_t)) { /** * modifier diff --git a/OpenCL/m32300_a3-optimized.cl b/OpenCL/m32300_a3-optimized.cl index 74a051cf5..603dbcdbc 100644 --- a/OpenCL/m32300_a3-optimized.cl +++ b/OpenCL/m32300_a3-optimized.cl @@ -748,7 +748,7 @@ DECLSPEC void m32300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w } } -KERNEL_FQ void m32300_m04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_m04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base @@ -818,7 +818,7 @@ KERNEL_FQ void m32300_m04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m32300_m08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_m08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base @@ -888,7 +888,7 @@ KERNEL_FQ void m32300_m08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m32300_m16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_m16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base @@ -958,7 +958,7 @@ KERNEL_FQ void m32300_m16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m32300_s04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_s04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base @@ -1028,7 +1028,7 @@ KERNEL_FQ void m32300_s04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) m32300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m32300_s08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_s08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base @@ -1098,7 +1098,7 @@ KERNEL_FQ void m32300_s08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) m32300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); } -KERNEL_FQ void m32300_s16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_s16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * base diff --git a/OpenCL/m32300_a3-pure.cl b/OpenCL/m32300_a3-pure.cl index 1345df59d..87ce4ca12 100644 --- a/OpenCL/m32300_a3-pure.cl +++ b/OpenCL/m32300_a3-pure.cl @@ -39,7 +39,7 @@ typedef struct md5_triple_salt } md5_triple_salt_t; -KERNEL_FQ void m32300_mxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_mxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * modifier @@ -217,7 +217,7 @@ KERNEL_FQ void m32300_mxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) } } -KERNEL_FQ void m32300_sxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +KERNEL_FQ KERNEL_FA void m32300_sxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) { /** * modifier diff --git a/OpenCL/m32410_a0-pure.cl b/OpenCL/m32410_a0-pure.cl index 864468195..79ca3d5c6 100644 --- a/OpenCL/m32410_a0-pure.cl +++ b/OpenCL/m32410_a0-pure.cl @@ -28,7 +28,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m32410_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32410_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -192,7 +192,7 @@ KERNEL_FQ void m32410_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m32410_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32410_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m32410_a1-pure.cl b/OpenCL/m32410_a1-pure.cl index 65dccc7d6..c94d252a8 100644 --- a/OpenCL/m32410_a1-pure.cl +++ b/OpenCL/m32410_a1-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m32410_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32410_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -188,7 +188,7 @@ KERNEL_FQ void m32410_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m32410_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32410_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m32410_a3-pure.cl b/OpenCL/m32410_a3-pure.cl index 32b0c17d9..e58b8c94a 100644 --- a/OpenCL/m32410_a3-pure.cl +++ b/OpenCL/m32410_a3-pure.cl @@ -26,7 +26,7 @@ #define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) #endif -KERNEL_FQ void m32410_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32410_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -201,7 +201,7 @@ KERNEL_FQ void m32410_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m32410_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32410_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m32420_a0-pure.cl b/OpenCL/m32420_a0-pure.cl index 79a7c2712..11159cb07 100644 --- a/OpenCL/m32420_a0-pure.cl +++ b/OpenCL/m32420_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m32420_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32420_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -122,7 +122,7 @@ KERNEL_FQ void m32420_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m32420_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32420_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m32420_a1-pure.cl b/OpenCL/m32420_a1-pure.cl index 1835d4fba..8a5ab0976 100644 --- a/OpenCL/m32420_a1-pure.cl +++ b/OpenCL/m32420_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m32420_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32420_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -118,7 +118,7 @@ KERNEL_FQ void m32420_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m32420_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32420_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m32420_a3-pure.cl b/OpenCL/m32420_a3-pure.cl index ae4575e1b..e67961591 100644 --- a/OpenCL/m32420_a3-pure.cl +++ b/OpenCL/m32420_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_sha512.cl) #endif -KERNEL_FQ void m32420_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32420_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -140,7 +140,7 @@ KERNEL_FQ void m32420_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m32420_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32420_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m32500-pure.cl b/OpenCL/m32500-pure.cl index a40ed2481..9a0a5a08d 100644 --- a/OpenCL/m32500-pure.cl +++ b/OpenCL/m32500-pure.cl @@ -127,7 +127,7 @@ DECLSPEC void base64_encode_sha256 (u32 *out, const u32 *in) } //--------------------------------------------------------------------------------------- -KERNEL_FQ void m32500_init (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +KERNEL_FQ KERNEL_FA void m32500_init (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) { const u64 gid = get_global_id (0); @@ -220,7 +220,7 @@ KERNEL_FQ void m32500_init (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) } -KERNEL_FQ void m32500_loop (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +KERNEL_FQ KERNEL_FA void m32500_loop (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) { //pbkdf2hmac here @@ -328,7 +328,7 @@ KERNEL_FQ void m32500_loop (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) } } -KERNEL_FQ void m32500_comp (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +KERNEL_FQ KERNEL_FA void m32500_comp (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) { /** * base diff --git a/OpenCL/m32600_a0-pure.cl b/OpenCL/m32600_a0-pure.cl index b3200f1cf..c15b27ee9 100644 --- a/OpenCL/m32600_a0-pure.cl +++ b/OpenCL/m32600_a0-pure.cl @@ -16,7 +16,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m32600_mxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32600_mxx (KERN_ATTR_RULES ()) { /** * modifier @@ -118,7 +118,7 @@ KERNEL_FQ void m32600_mxx (KERN_ATTR_RULES ()) } } -KERNEL_FQ void m32600_sxx (KERN_ATTR_RULES ()) +KERNEL_FQ KERNEL_FA void m32600_sxx (KERN_ATTR_RULES ()) { /** * modifier diff --git a/OpenCL/m32600_a1-pure.cl b/OpenCL/m32600_a1-pure.cl index 40289ed35..05e5da59c 100644 --- a/OpenCL/m32600_a1-pure.cl +++ b/OpenCL/m32600_a1-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m32600_mxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32600_mxx (KERN_ATTR_BASIC ()) { /** * modifier @@ -112,7 +112,7 @@ KERNEL_FQ void m32600_mxx (KERN_ATTR_BASIC ()) } } -KERNEL_FQ void m32600_sxx (KERN_ATTR_BASIC ()) +KERNEL_FQ KERNEL_FA void m32600_sxx (KERN_ATTR_BASIC ()) { /** * modifier diff --git a/OpenCL/m32600_a3-pure.cl b/OpenCL/m32600_a3-pure.cl index 173ba4381..bd5580bd0 100644 --- a/OpenCL/m32600_a3-pure.cl +++ b/OpenCL/m32600_a3-pure.cl @@ -14,7 +14,7 @@ #include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) #endif -KERNEL_FQ void m32600_mxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32600_mxx (KERN_ATTR_VECTOR ()) { /** * modifier @@ -127,7 +127,7 @@ KERNEL_FQ void m32600_mxx (KERN_ATTR_VECTOR ()) } } -KERNEL_FQ void m32600_sxx (KERN_ATTR_VECTOR ()) +KERNEL_FQ KERNEL_FA void m32600_sxx (KERN_ATTR_VECTOR ()) { /** * modifier diff --git a/OpenCL/m32700-pure.cl b/OpenCL/m32700-pure.cl index 4f25d3020..1779c1be6 100644 --- a/OpenCL/m32700-pure.cl +++ b/OpenCL/m32700-pure.cl @@ -120,7 +120,7 @@ DECLSPEC void sha1_final_32700 (PRIVATE_AS sha1_ctx_t *ctx) sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); } -KERNEL_FQ void m32700_init (KERN_ATTR_TMPS (sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32700_init (KERN_ATTR_TMPS (sha1_tmp_t)) { const u64 gid = get_global_id (0); @@ -161,7 +161,7 @@ KERNEL_FQ void m32700_init (KERN_ATTR_TMPS (sha1_tmp_t)) } } -KERNEL_FQ void m32700_loop (KERN_ATTR_TMPS (sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32700_loop (KERN_ATTR_TMPS (sha1_tmp_t)) { const u64 gid = get_global_id (0); @@ -193,7 +193,7 @@ KERNEL_FQ void m32700_loop (KERN_ATTR_TMPS (sha1_tmp_t)) } } -KERNEL_FQ void m32700_comp (KERN_ATTR_TMPS (sha1_tmp_t)) +KERNEL_FQ KERNEL_FA void m32700_comp (KERN_ATTR_TMPS (sha1_tmp_t)) { const u64 gid = get_global_id (0); diff --git a/OpenCL/m33300_a0-pure.cl b/OpenCL/m33300_a0-pure.cl new file mode 100644 index 000000000..eade1317c --- /dev/null +++ b/OpenCL/m33300_a0-pure.cl @@ -0,0 +1,135 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ KERNEL_FA void m33300_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + blake2s_hmac_ctx_t ctx; + + blake2s_hmac_init (&ctx, tmp.i, tmp.pw_len); + + blake2s_hmac_update (&ctx, s, salt_len); + + blake2s_hmac_final (&ctx); + + const u32 r0 = ctx.opad.h[DGST_R0]; + const u32 r1 = ctx.opad.h[DGST_R1]; + const u32 r2 = ctx.opad.h[DGST_R2]; + const u32 r3 = ctx.opad.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ KERNEL_FA void m33300_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + blake2s_hmac_ctx_t ctx; + + blake2s_hmac_init (&ctx, tmp.i, tmp.pw_len); + + blake2s_hmac_update (&ctx, s, salt_len); + + blake2s_hmac_final (&ctx); + + const u32 r0 = ctx.opad.h[DGST_R0]; + const u32 r1 = ctx.opad.h[DGST_R1]; + const u32 r2 = ctx.opad.h[DGST_R2]; + const u32 r3 = ctx.opad.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m33300_a1-pure.cl b/OpenCL/m33300_a1-pure.cl new file mode 100644 index 000000000..53d7496a5 --- /dev/null +++ b/OpenCL/m33300_a1-pure.cl @@ -0,0 +1,183 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ KERNEL_FA void m33300_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + const u32 comb_len = combs_buf[il_pos].pw_len; + + u32 c[64]; + + #ifdef _unroll + #pragma unroll + #endif + for (int idx = 0; idx < 64; idx++) + { + c[idx] = combs_buf[il_pos].i[idx]; + } + + switch_buffer_by_offset_1x64_le_S (c, pw_len); + + #ifdef _unroll + #pragma unroll + #endif + for (int i = 0; i < 64; i++) + { + c[i] |= w[i]; + } + + blake2s_hmac_ctx_t ctx; + + blake2s_hmac_init (&ctx, c, pw_len + comb_len); + + blake2s_hmac_update (&ctx, s, salt_len); + + blake2s_hmac_final (&ctx); + + const u32 r0 = ctx.opad.h[DGST_R0]; + const u32 r1 = ctx.opad.h[DGST_R1]; + const u32 r2 = ctx.opad.h[DGST_R2]; + const u32 r3 = ctx.opad.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ KERNEL_FA void m33300_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32 w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + const u32 comb_len = combs_buf[il_pos].pw_len; + + u32 c[64]; + + #ifdef _unroll + #pragma unroll + #endif + for (int idx = 0; idx < 64; idx++) + { + c[idx] = combs_buf[il_pos].i[idx]; + } + + switch_buffer_by_offset_1x64_le_S (c, pw_len); + + #ifdef _unroll + #pragma unroll + #endif + for (int i = 0; i < 64; i++) + { + c[i] |= w[i]; + } + + blake2s_hmac_ctx_t ctx; + + blake2s_hmac_init (&ctx, c, pw_len + comb_len); + + blake2s_hmac_update (&ctx, s, salt_len); + + blake2s_hmac_final (&ctx); + + const u32 r0 = ctx.opad.h[DGST_R0]; + const u32 r1 = ctx.opad.h[DGST_R1]; + const u32 r2 = ctx.opad.h[DGST_R2]; + const u32 r3 = ctx.opad.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m33300_a3-pure.cl b/OpenCL/m33300_a3-pure.cl new file mode 100644 index 000000000..a1ae75885 --- /dev/null +++ b/OpenCL/m33300_a3-pure.cl @@ -0,0 +1,156 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_blake2s.cl) +#endif + +KERNEL_FQ KERNEL_FA void m33300_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + blake2s_hmac_ctx_vector_t ctx; + + blake2s_hmac_init_vector (&ctx, w, pw_len); + + blake2s_hmac_update_vector (&ctx, s, salt_len); + + blake2s_hmac_final_vector (&ctx); + + const u32x r0 = ctx.opad.h[DGST_R0]; + const u32x r1 = ctx.opad.h[DGST_R1]; + const u32x r2 = ctx.opad.h[DGST_R2]; + const u32x r3 = ctx.opad.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ KERNEL_FA void m33300_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + blake2s_hmac_ctx_vector_t ctx; + + blake2s_hmac_init_vector (&ctx, w, pw_len); + + blake2s_hmac_update_vector (&ctx, s, salt_len); + + blake2s_hmac_final_vector (&ctx); + + const u32x r0 = ctx.opad.h[DGST_R0]; + const u32x r1 = ctx.opad.h[DGST_R1]; + const u32x r2 = ctx.opad.h[DGST_R2]; + const u32x r3 = ctx.opad.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } + +} diff --git a/OpenCL/m33500_a0-optimized.cl b/OpenCL/m33500_a0-optimized.cl index 4f7332db6..dc8684b7d 100644 --- a/OpenCL/m33500_a0-optimized.cl +++ b/OpenCL/m33500_a0-optimized.cl @@ -40,7 +40,7 @@ CONSTANT_VK u32 pt_masks[8] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -123,15 +123,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -230,10 +230,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } diff --git a/OpenCL/m33500_a1-optimized.cl b/OpenCL/m33500_a1-optimized.cl index 1a116c145..b2b091bc6 100644 --- a/OpenCL/m33500_a1-optimized.cl +++ b/OpenCL/m33500_a1-optimized.cl @@ -38,7 +38,7 @@ CONSTANT_VK u32 pt_masks[8] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -172,15 +172,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m16 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -326,10 +326,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s16 (KERN_ATTR_ESALT (rc4_t)) { } diff --git a/OpenCL/m33500_a3-optimized.cl b/OpenCL/m33500_a3-optimized.cl index 38cebda6e..db49a047d 100644 --- a/OpenCL/m33500_a3-optimized.cl +++ b/OpenCL/m33500_a3-optimized.cl @@ -180,7 +180,7 @@ DECLSPEC void m33500s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -231,7 +231,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m04 (KERN_ATTR_ESALT m33500m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -282,7 +282,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m08 (KERN_ATTR_ESALT m33500m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_m16 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -333,7 +333,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_m16 (KERN_ATTR_ESALT m33500m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -384,7 +384,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s04 (KERN_ATTR_ESALT m33500s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -435,7 +435,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s08 (KERN_ATTR_ESALT m33500s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33500_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33500_s16 (KERN_ATTR_ESALT (rc4_t)) { /** * base diff --git a/OpenCL/m33501_a0-optimized.cl b/OpenCL/m33501_a0-optimized.cl index 4e9196869..ff691591f 100644 --- a/OpenCL/m33501_a0-optimized.cl +++ b/OpenCL/m33501_a0-optimized.cl @@ -44,7 +44,7 @@ CONSTANT_VK u32 pt_masks[12] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -137,15 +137,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -254,10 +254,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } diff --git a/OpenCL/m33501_a1-optimized.cl b/OpenCL/m33501_a1-optimized.cl index 21abdee29..267f7cfb7 100644 --- a/OpenCL/m33501_a1-optimized.cl +++ b/OpenCL/m33501_a1-optimized.cl @@ -42,7 +42,7 @@ CONSTANT_VK u32 pt_masks[12] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -186,15 +186,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m16 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -350,10 +350,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s16 (KERN_ATTR_ESALT (rc4_t)) { } diff --git a/OpenCL/m33501_a3-optimized.cl b/OpenCL/m33501_a3-optimized.cl index 33b2ff258..19378d768 100644 --- a/OpenCL/m33501_a3-optimized.cl +++ b/OpenCL/m33501_a3-optimized.cl @@ -202,7 +202,7 @@ DECLSPEC void m33501s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -253,7 +253,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m04 (KERN_ATTR_ESALT m33501m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -304,7 +304,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m08 (KERN_ATTR_ESALT m33501m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_m16 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -355,7 +355,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_m16 (KERN_ATTR_ESALT m33501m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -406,7 +406,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s04 (KERN_ATTR_ESALT m33501s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -457,7 +457,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s08 (KERN_ATTR_ESALT m33501s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33501_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33501_s16 (KERN_ATTR_ESALT (rc4_t)) { /** * base diff --git a/OpenCL/m33502_a0-optimized.cl b/OpenCL/m33502_a0-optimized.cl index 4dc0012db..85de1d900 100644 --- a/OpenCL/m33502_a0-optimized.cl +++ b/OpenCL/m33502_a0-optimized.cl @@ -48,7 +48,7 @@ CONSTANT_VK u32 pt_masks[16] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -148,15 +148,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s04 (KERN_ATTR_RULES_ESALT (rc4_t)) { /** * base @@ -272,10 +272,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_RULES_ } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s08 (KERN_ATTR_RULES_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s16 (KERN_ATTR_RULES_ESALT (rc4_t)) { } diff --git a/OpenCL/m33502_a1-optimized.cl b/OpenCL/m33502_a1-optimized.cl index 12babaeac..8aca6d8e4 100644 --- a/OpenCL/m33502_a1-optimized.cl +++ b/OpenCL/m33502_a1-optimized.cl @@ -46,7 +46,7 @@ CONSTANT_VK u32 pt_masks[16] = 0 }; -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -197,15 +197,15 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m16 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -368,10 +368,10 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_ESALT } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s08 (KERN_ATTR_ESALT (rc4_t)) { } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s16 (KERN_ATTR_ESALT (rc4_t)) { } diff --git a/OpenCL/m33502_a3-optimized.cl b/OpenCL/m33502_a3-optimized.cl index 65a0c8438..8042776ce 100644 --- a/OpenCL/m33502_a3-optimized.cl +++ b/OpenCL/m33502_a3-optimized.cl @@ -220,7 +220,7 @@ DECLSPEC void m33502s (LOCAL_AS u32 *S, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, } } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -271,7 +271,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m04 (KERN_ATTR_ESALT m33502m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -322,7 +322,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m08 (KERN_ATTR_ESALT m33502m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_m16 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -373,7 +373,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_m16 (KERN_ATTR_ESALT m33502m (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s04 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -424,7 +424,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s04 (KERN_ATTR_ESALT m33502s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s08 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s08 (KERN_ATTR_ESALT (rc4_t)) { /** * base @@ -475,7 +475,7 @@ KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s08 (KERN_ATTR_ESALT m33502s (S, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz); } -KERNEL_FQ void FIXED_THREAD_COUNT(FIXED_LOCAL_SIZE) m33502_s16 (KERN_ATTR_ESALT (rc4_t)) +KERNEL_FQ KERNEL_FA void m33502_s16 (KERN_ATTR_ESALT (rc4_t)) { /** * base diff --git a/OpenCL/m33700-pure.cl b/OpenCL/m33700-pure.cl new file mode 100644 index 000000000..7811340ea --- /dev/null +++ b/OpenCL/m33700-pure.cl @@ -0,0 +1,392 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_cipher_aes.cl) +#include M2S(INCLUDE_PATH/inc_cipher_des.cl) +#endif + +typedef struct pkcs_sha256_tmp +{ + u32 ipad[8]; + u32 opad[8]; + + u32 dgst[32]; + u32 out[32]; + +} pkcs_sha256_tmp_t; + +typedef struct pkcs +{ + u32 data_buf[8]; + int data_len; + +} pkcs_t; + +DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform_vector (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform_vector (w0, w1, w2, w3, digest); +} + +KERNEL_FQ KERNEL_FA void m33700_init (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_utf16le_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); + + tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; + tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; + tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; + tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; + tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; + tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; + tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; + tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; + + tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; + tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; + tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; + tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; + tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; + tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; + tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; + tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); + + sha256_hmac_final (&sha256_hmac_ctx2); + + tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; + tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; + tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; + tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; + tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; + tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; + tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; + tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; + } +} + +KERNEL_FQ KERNEL_FA void m33700_loop (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = packv (tmps, ipad, gid, 0); + ipad[1] = packv (tmps, ipad, gid, 1); + ipad[2] = packv (tmps, ipad, gid, 2); + ipad[3] = packv (tmps, ipad, gid, 3); + ipad[4] = packv (tmps, ipad, gid, 4); + ipad[5] = packv (tmps, ipad, gid, 5); + ipad[6] = packv (tmps, ipad, gid, 6); + ipad[7] = packv (tmps, ipad, gid, 7); + + opad[0] = packv (tmps, opad, gid, 0); + opad[1] = packv (tmps, opad, gid, 1); + opad[2] = packv (tmps, opad, gid, 2); + opad[3] = packv (tmps, opad, gid, 3); + opad[4] = packv (tmps, opad, gid, 4); + opad[5] = packv (tmps, opad, gid, 5); + opad[6] = packv (tmps, opad, gid, 6); + opad[7] = packv (tmps, opad, gid, 7); + + for (u32 i = 0; i < 8; i += 8) + { + u32x dgst[8]; + u32x out[8]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + dgst[5] = packv (tmps, dgst, gid, i + 5); + dgst[6] = packv (tmps, dgst, gid, i + 6); + dgst[7] = packv (tmps, dgst, gid, i + 7); + + out[0] = packv (tmps, out, gid, i + 0); + out[1] = packv (tmps, out, gid, i + 1); + out[2] = packv (tmps, out, gid, i + 2); + out[3] = packv (tmps, out, gid, i + 3); + out[4] = packv (tmps, out, gid, i + 4); + out[5] = packv (tmps, out, gid, i + 5); + out[6] = packv (tmps, out, gid, i + 6); + out[7] = packv (tmps, out, gid, i + 7); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run_V (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + unpackv (tmps, dgst, gid, i + 5, dgst[5]); + unpackv (tmps, dgst, gid, i + 6, dgst[6]); + unpackv (tmps, dgst, gid, i + 7, dgst[7]); + + unpackv (tmps, out, gid, i + 0, out[0]); + unpackv (tmps, out, gid, i + 1, out[1]); + unpackv (tmps, out, gid, i + 2, out[2]); + unpackv (tmps, out, gid, i + 3, out[3]); + unpackv (tmps, out, gid, i + 4, out[4]); + unpackv (tmps, out, gid, i + 5, out[5]); + unpackv (tmps, out, gid, i + 6, out[6]); + unpackv (tmps, out, gid, i + 7, out[7]); + } +} + +KERNEL_FQ KERNEL_FA void m33700_comp (KERN_ATTR_TMPS_ESALT (pkcs_sha256_tmp_t, pkcs_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * aes shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u32 s_td0[256]; + LOCAL_VK u32 s_td1[256]; + LOCAL_VK u32 s_td2[256]; + LOCAL_VK u32 s_td3[256]; + LOCAL_VK u32 s_td4[256]; + + LOCAL_VK u32 s_te0[256]; + LOCAL_VK u32 s_te1[256]; + LOCAL_VK u32 s_te2[256]; + LOCAL_VK u32 s_te3[256]; + LOCAL_VK u32 s_te4[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_td0[i] = td0[i]; + s_td1[i] = td1[i]; + s_td2[i] = td2[i]; + s_td3[i] = td3[i]; + s_td4[i] = td4[i]; + + s_te0[i] = te0[i]; + s_te1[i] = te1[i]; + s_te2[i] = te2[i]; + s_te3[i] = te3[i]; + s_te4[i] = te4[i]; + } + + LOCAL_VK u32 s_SPtrans[8][64]; + LOCAL_VK u32 s_skb[8][64]; + + for (u32 i = lid; i < 64; i += lsz) + { + s_SPtrans[0][i] = c_SPtrans[0][i]; + s_SPtrans[1][i] = c_SPtrans[1][i]; + s_SPtrans[2][i] = c_SPtrans[2][i]; + s_SPtrans[3][i] = c_SPtrans[3][i]; + s_SPtrans[4][i] = c_SPtrans[4][i]; + s_SPtrans[5][i] = c_SPtrans[5][i]; + s_SPtrans[6][i] = c_SPtrans[6][i]; + s_SPtrans[7][i] = c_SPtrans[7][i]; + + s_skb[0][i] = c_skb[0][i]; + s_skb[1][i] = c_skb[1][i]; + s_skb[2][i] = c_skb[2][i]; + s_skb[3][i] = c_skb[3][i]; + s_skb[4][i] = c_skb[4][i]; + s_skb[5][i] = c_skb[5][i]; + s_skb[6][i] = c_skb[6][i]; + s_skb[7][i] = c_skb[7][i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u32a *s_td0 = td0; + CONSTANT_AS u32a *s_td1 = td1; + CONSTANT_AS u32a *s_td2 = td2; + CONSTANT_AS u32a *s_td3 = td3; + CONSTANT_AS u32a *s_td4 = td4; + + CONSTANT_AS u32a *s_te0 = te0; + CONSTANT_AS u32a *s_te1 = te1; + CONSTANT_AS u32a *s_te2 = te2; + CONSTANT_AS u32a *s_te3 = te3; + CONSTANT_AS u32a *s_te4 = te4; + + CONSTANT_AS u32a (*s_SPtrans)[64] = c_SPtrans; + CONSTANT_AS u32a (*s_skb)[64] = c_skb; + + #endif + + if (gid >= GID_CNT) return; + + u32 ukey[8]; + + ukey[0] = tmps[gid].out[0]; + ukey[1] = tmps[gid].out[1]; + ukey[2] = tmps[gid].out[2]; + ukey[3] = tmps[gid].out[3]; + ukey[4] = tmps[gid].out[4]; + ukey[5] = tmps[gid].out[5]; + ukey[6] = tmps[gid].out[6]; + ukey[7] = tmps[gid].out[7]; + + // decrypt first block + + u32 enc[4]; + u32 dec[4]; + + enc[0] = esalt_bufs[DIGESTS_OFFSET_HOST].data_buf[0]; + enc[1] = esalt_bufs[DIGESTS_OFFSET_HOST].data_buf[1]; + enc[2] = esalt_bufs[DIGESTS_OFFSET_HOST].data_buf[2]; + enc[3] = esalt_bufs[DIGESTS_OFFSET_HOST].data_buf[3]; + + u32 ks[60]; + + AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + + aes256_decrypt (ks, enc, dec, s_td0, s_td1, s_td2, s_td3, s_td4); + + dec[0] ^= 0x00000000; + + if (dec[0] != 0x00000000) return; + + dec[1] ^= 0x00000000; + + if (dec[1] != 0x00000001) return; + + if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0) + { + #define il_pos 0 + mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, il_pos, 0, 0); + } +} diff --git a/OpenCL/m33800-pure.cl b/OpenCL/m33800-pure.cl new file mode 100644 index 000000000..646a68c7b --- /dev/null +++ b/OpenCL/m33800-pure.cl @@ -0,0 +1,1308 @@ +/** + * based on 3200 + * + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct bcrypt_tmp +{ + u32 E[18]; + + u32 P[18]; + + u32 S0[256]; + u32 S1[256]; + u32 S2[256]; + u32 S3[256]; + +} bcrypt_tmp_t; + +// http://www.schneier.com/code/constants.txt + +CONSTANT_VK u32a c_sbox0[256] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +}; + +CONSTANT_VK u32a c_sbox1[256] = +{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +}; + +CONSTANT_VK u32a c_sbox2[256] = +{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +}; + +CONSTANT_VK u32a c_sbox3[256] = +{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +}; + +CONSTANT_VK u32a c_pbox[18] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b +}; + +CONSTANT_VK u8 c_bcrypt_base64_alphabet[64] = +{ + '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' +}; + +// Yes, works only with CUDA atm + +#ifdef DYNAMIC_LOCAL +#define BCRYPT_AVOID_BANK_CONFLICTS +#endif + +#ifdef BCRYPT_AVOID_BANK_CONFLICTS + +// access pattern: minimize bank ID based on thread ID but thread ID is not saved from computation + +#define KEY32(lid,key) (((key) * FIXED_LOCAL_SIZE) + (lid)) + +DECLSPEC u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) +{ + const u64 lid = get_local_id (0); + + return S[KEY32 (lid, key)]; +} + +DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) +{ + const u64 lid = get_local_id (0); + + S[KEY32 (lid, key)] = val; +} + +#undef KEY32 + +#else + +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation +// makes sense if there are not thread ID's (for instance on CPU) + +DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) +{ + return S[key]; +} + +DECLSPEC inline void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) +{ + S[key] = val; +} + +#endif + +#define BF_ROUND(L,R,N) \ +{ \ + u32 tmp; \ + \ + const u32 r0 = unpack_v8d_from_v32_S ((L)); \ + const u32 r1 = unpack_v8c_from_v32_S ((L)); \ + const u32 r2 = unpack_v8b_from_v32_S ((L)); \ + const u32 r3 = unpack_v8a_from_v32_S ((L)); \ + \ + tmp = GET_KEY32 (S0, r0); \ + tmp += GET_KEY32 (S1, r1); \ + tmp ^= GET_KEY32 (S2, r2); \ + tmp += GET_KEY32 (S3, r3); \ + \ + (R) ^= tmp ^ P[(N)]; \ +} + +#define BF_ENCRYPT(L,R) \ +{ \ + L ^= P[0]; \ + \ + BF_ROUND (L, R, 1); \ + BF_ROUND (R, L, 2); \ + BF_ROUND (L, R, 3); \ + BF_ROUND (R, L, 4); \ + BF_ROUND (L, R, 5); \ + BF_ROUND (R, L, 6); \ + BF_ROUND (L, R, 7); \ + BF_ROUND (R, L, 8); \ + BF_ROUND (L, R, 9); \ + BF_ROUND (R, L, 10); \ + BF_ROUND (L, R, 11); \ + BF_ROUND (R, L, 12); \ + BF_ROUND (L, R, 13); \ + BF_ROUND (R, L, 14); \ + BF_ROUND (L, R, 15); \ + BF_ROUND (R, L, 16); \ + \ + u32 tmp; \ + \ + tmp = R; \ + R = L; \ + L = tmp; \ + \ + L ^= P[17]; \ +} + +#ifdef DYNAMIC_LOCAL +extern __shared__ u32 S[]; +#endif + +DECLSPEC void expand_key (PRIVATE_AS u32 *E, PRIVATE_AS u32 *W, const int len) +{ + PRIVATE_AS u8 *E_ptr = (PRIVATE_AS u8 *) E; + PRIVATE_AS u8 *W_ptr = (PRIVATE_AS u8 *) W; + + for (int pos = 0; pos < 72; pos++) // pos++ is not a bug, we actually want that zero byte here + { + const int left = 72 - pos; + + const int sz = (len < left) ? len : left; // should be MIN() + + for (int i = 0; i < sz; i++) + { + E_ptr[pos + i] = W_ptr[i]; + } + + pos += sz; + } +} + +KERNEL_FQ KERNEL_FA void m33800_init (KERN_ATTR_TMPS (bcrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = pws[gid].pw_len; + + u32 w[18]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + w[16] = pws[gid].i[16]; + w[17] = pws[gid].i[17]; + + u32 E[18] = { 0 }; + + expand_key (E, w, pw_len); + + E[ 0] = hc_swap32_S (E[ 0]); + E[ 1] = hc_swap32_S (E[ 1]); + E[ 2] = hc_swap32_S (E[ 2]); + E[ 3] = hc_swap32_S (E[ 3]); + E[ 4] = hc_swap32_S (E[ 4]); + E[ 5] = hc_swap32_S (E[ 5]); + E[ 6] = hc_swap32_S (E[ 6]); + E[ 7] = hc_swap32_S (E[ 7]); + E[ 8] = hc_swap32_S (E[ 8]); + E[ 9] = hc_swap32_S (E[ 9]); + E[10] = hc_swap32_S (E[10]); + E[11] = hc_swap32_S (E[11]); + E[12] = hc_swap32_S (E[12]); + E[13] = hc_swap32_S (E[13]); + E[14] = hc_swap32_S (E[14]); + E[15] = hc_swap32_S (E[15]); + E[16] = hc_swap32_S (E[16]); + E[17] = hc_swap32_S (E[17]); + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].E[i] = E[i]; + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; + salt_buf[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; + salt_buf[2] = salt_bufs[SALT_POS_HOST].salt_buf[2]; + salt_buf[3] = salt_bufs[SALT_POS_HOST].salt_buf[3]; + + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + #ifdef DYNAMIC_LOCAL + // from host + #else + LOCAL_VK u32 S0_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S1_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S2_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S3_all[FIXED_LOCAL_SIZE][256]; + #endif + + #ifdef BCRYPT_AVOID_BANK_CONFLICTS + LOCAL_AS u32 *S0 = S + (FIXED_LOCAL_SIZE * 256 * 0); + LOCAL_AS u32 *S1 = S + (FIXED_LOCAL_SIZE * 256 * 1); + LOCAL_AS u32 *S2 = S + (FIXED_LOCAL_SIZE * 256 * 2); + LOCAL_AS u32 *S3 = S + (FIXED_LOCAL_SIZE * 256 * 3); + #else + LOCAL_AS u32 *S0 = S0_all[lid]; + LOCAL_AS u32 *S1 = S1_all[lid]; + LOCAL_AS u32 *S2 = S2_all[lid]; + LOCAL_AS u32 *S3 = S3_all[lid]; + #endif + + for (u32 i = 0; i < 256; i++) + { + SET_KEY32 (S0, i, c_sbox0[i]); + SET_KEY32 (S1, i, c_sbox1[i]); + SET_KEY32 (S2, i, c_sbox2[i]); + SET_KEY32 (S3, i, c_sbox3[i]); + } + + // expandstate + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + u32 L0 = 0; + u32 R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + L0 ^= salt_buf[(i & 2) + 0]; + R0 ^= salt_buf[(i & 2) + 1]; + + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 0, L0); + SET_KEY32 (S0, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 2, L0); + SET_KEY32 (S0, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 0, L0); + SET_KEY32 (S1, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 2, L0); + SET_KEY32 (S1, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 0, L0); + SET_KEY32 (S2, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 2, L0); + SET_KEY32 (S2, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 0, L0); + SET_KEY32 (S3, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 2, L0); + SET_KEY32 (S3, i + 3, R0); + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = GET_KEY32 (S0, i); + tmps[gid].S1[i] = GET_KEY32 (S1, i); + tmps[gid].S2[i] = GET_KEY32 (S2, i); + tmps[gid].S3[i] = GET_KEY32 (S3, i); + } +} + +KERNEL_FQ KERNEL_FA void m33800_loop (KERN_ATTR_TMPS (bcrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + // load + + u32 E[18]; + + for (u32 i = 0; i < 18; i++) + { + E[i] = tmps[gid].E[i]; + } + + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + #ifdef DYNAMIC_LOCAL + // from host + #else + LOCAL_VK u32 S0_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S1_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S2_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S3_all[FIXED_LOCAL_SIZE][256]; + #endif + + #ifdef BCRYPT_AVOID_BANK_CONFLICTS + LOCAL_AS u32 *S0 = S + (FIXED_LOCAL_SIZE * 256 * 0); + LOCAL_AS u32 *S1 = S + (FIXED_LOCAL_SIZE * 256 * 1); + LOCAL_AS u32 *S2 = S + (FIXED_LOCAL_SIZE * 256 * 2); + LOCAL_AS u32 *S3 = S + (FIXED_LOCAL_SIZE * 256 * 3); + #else + LOCAL_AS u32 *S0 = S0_all[lid]; + LOCAL_AS u32 *S1 = S1_all[lid]; + LOCAL_AS u32 *S2 = S2_all[lid]; + LOCAL_AS u32 *S3 = S3_all[lid]; + #endif + + for (u32 i = 0; i < 256; i++) + { + SET_KEY32 (S0, i, tmps[gid].S0[i]); + SET_KEY32 (S1, i, tmps[gid].S1[i]); + SET_KEY32 (S2, i, tmps[gid].S2[i]); + SET_KEY32 (S3, i, tmps[gid].S3[i]); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; + salt_buf[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; + salt_buf[2] = salt_bufs[SALT_POS_HOST].salt_buf[2]; + salt_buf[3] = salt_bufs[SALT_POS_HOST].salt_buf[3]; + + /** + * main loop + */ + + u32 L0; + u32 R0; + + for (u32 i = 0; i < LOOP_CNT; i++) + { + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2 + 0] = L0; + P[i * 2 + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 0, L0); + SET_KEY32 (S0, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 0, L0); + SET_KEY32 (S1, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 0, L0); + SET_KEY32 (S2, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 0, L0); + SET_KEY32 (S3, i + 1, R0); + } + + P[ 0] ^= salt_buf[0]; + P[ 1] ^= salt_buf[1]; + P[ 2] ^= salt_buf[2]; + P[ 3] ^= salt_buf[3]; + P[ 4] ^= salt_buf[0]; + P[ 5] ^= salt_buf[1]; + P[ 6] ^= salt_buf[2]; + P[ 7] ^= salt_buf[3]; + P[ 8] ^= salt_buf[0]; + P[ 9] ^= salt_buf[1]; + P[10] ^= salt_buf[2]; + P[11] ^= salt_buf[3]; + P[12] ^= salt_buf[0]; + P[13] ^= salt_buf[1]; + P[14] ^= salt_buf[2]; + P[15] ^= salt_buf[3]; + P[16] ^= salt_buf[0]; + P[17] ^= salt_buf[1]; + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2 + 0] = L0; + P[i * 2 + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 0, L0); + SET_KEY32 (S0, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 0, L0); + SET_KEY32 (S1, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 0, L0); + SET_KEY32 (S2, i + 1, R0); + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 0, L0); + SET_KEY32 (S3, i + 1, R0); + } + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = GET_KEY32 (S0, i); + tmps[gid].S1[i] = GET_KEY32 (S1, i); + tmps[gid].S2[i] = GET_KEY32 (S2, i); + tmps[gid].S3[i] = GET_KEY32 (S3, i); + } +} + +KERNEL_FQ KERNEL_FA void m33800_init2 (KERN_ATTR_TMPS (bcrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = 60; + + /** + * calculate final inner/first bcrypt + */ + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + #ifdef DYNAMIC_LOCAL + // from host + #else + LOCAL_VK u32 S0_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S1_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S2_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S3_all[FIXED_LOCAL_SIZE][256]; + #endif + + #ifdef BCRYPT_AVOID_BANK_CONFLICTS + LOCAL_AS u32 *S0 = S + (FIXED_LOCAL_SIZE * 256 * 0); + LOCAL_AS u32 *S1 = S + (FIXED_LOCAL_SIZE * 256 * 1); + LOCAL_AS u32 *S2 = S + (FIXED_LOCAL_SIZE * 256 * 2); + LOCAL_AS u32 *S3 = S + (FIXED_LOCAL_SIZE * 256 * 3); + #else + LOCAL_AS u32 *S0 = S0_all[lid]; + LOCAL_AS u32 *S1 = S1_all[lid]; + LOCAL_AS u32 *S2 = S2_all[lid]; + LOCAL_AS u32 *S3 = S3_all[lid]; + #endif + + for (u32 i = 0; i < 256; i++) + { + SET_KEY32 (S0, i, tmps[gid].S0[i]); + SET_KEY32 (S1, i, tmps[gid].S1[i]); + SET_KEY32 (S2, i, tmps[gid].S2[i]); + SET_KEY32 (S3, i, tmps[gid].S3[i]); + } + + u32 L0; + u32 R0; + + L0 = BCRYPTM_0; + R0 = BCRYPTM_1; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32 r0 = L0; + const u32 r1 = R0; + + L0 = BCRYPTM_2; + R0 = BCRYPTM_3; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32 r2 = L0; + const u32 r3 = R0; + + L0 = BCRYPTM_4; + R0 = BCRYPTM_5; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32 r4 = L0; + const u32 r5 = R0; + + u32 w[18]; + + /** + * set first bcrypt as input for second bcrypt + */ + + //put in the saved beginning and salt of original hash + w[ 0] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 0]; + w[ 1] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 1]; + w[ 2] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 2]; + w[ 3] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 3]; + w[ 4] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 4]; + w[ 5] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 5]; + w[ 6] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 6]; + //w[ 7] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 7]; //here for logic (overwritten in next step) + + //now fill in base64; last Byte is zeroed (--> 0x00000F00 not 0x00000FC0) + w[ 7] = salt_bufs[SALT_POS_HOST].salt_buf_pc[ 7] ^ (c_bcrypt_base64_alphabet[(r0&0xFC000000)>>26] << 8) ^ (c_bcrypt_base64_alphabet[(r0&0x03F00000)>> 20] << 16) ^ (c_bcrypt_base64_alphabet[(r0&0x000FC000)>>14] << 24); + w[ 8] = c_bcrypt_base64_alphabet[(r0&0x00003F00)>> 8] ^ (c_bcrypt_base64_alphabet[(r0&0x000000FC)>> 2] << 8) ^ (c_bcrypt_base64_alphabet[(r0&0x00000003)<< 4 ^ (r1&0xF0000000)>>28] << 16) ^ (c_bcrypt_base64_alphabet[(r1&0x0FC00000)>>22] << 24); + w[ 9] = c_bcrypt_base64_alphabet[(r1&0x003F0000)>>16] ^ (c_bcrypt_base64_alphabet[(r1&0x0000FC00)>>10] << 8) ^ (c_bcrypt_base64_alphabet[(r1&0x000003F0)>> 4] << 16) ^ (c_bcrypt_base64_alphabet[(r1&0x0000000F)<< 2 ^ (r2&0xC0000000)>>30] << 24); + w[10] = c_bcrypt_base64_alphabet[(r2&0x3F000000)>>24] ^ (c_bcrypt_base64_alphabet[(r2&0x00FC0000)>>18] << 8) ^ (c_bcrypt_base64_alphabet[(r2&0x0003F000)>>12] << 16) ^ (c_bcrypt_base64_alphabet[(r2&0x00000FC0)>> 6] << 24); + w[11] = c_bcrypt_base64_alphabet[(r2&0x0000003F) ] ^ (c_bcrypt_base64_alphabet[(r3&0xFC000000)>>26] << 8) ^ (c_bcrypt_base64_alphabet[(r3&0x03F00000)>>20] << 16) ^ (c_bcrypt_base64_alphabet[(r3&0x000FC000)>>14] << 24); + w[12] = c_bcrypt_base64_alphabet[(r3&0x00003F00)>> 8] ^ (c_bcrypt_base64_alphabet[(r3&0x000000FC)>> 2] << 8) ^ (c_bcrypt_base64_alphabet[(r3&0x00000003)<< 4 ^ (r4&0xF0000000)>>28] << 16) ^ (c_bcrypt_base64_alphabet[(r4&0x0FC00000)>>22] << 24); + w[13] = c_bcrypt_base64_alphabet[(r4&0x003F0000)>>16] ^ (c_bcrypt_base64_alphabet[(r4&0x0000FC00)>>10] << 8) ^ (c_bcrypt_base64_alphabet[(r4&0x000003F0)>> 4] << 16) ^ (c_bcrypt_base64_alphabet[(r4&0x0000000F)<< 2 ^ (r5&0xC0000000)>>30] << 24); + w[14] = c_bcrypt_base64_alphabet[(r5&0x3F000000)>>24] ^ (c_bcrypt_base64_alphabet[(r5&0x00FC0000)>>18] << 8) ^ (c_bcrypt_base64_alphabet[(r5&0x0003F000)>>12] << 16) ^ (c_bcrypt_base64_alphabet[(r5&0x00000F00)>> 6] << 24); + w[15] = 0; + w[16] = 0; + w[17] = 0; + + u32 E[18] = { 0 }; + + expand_key (E, w, pw_len); + + E[ 0] = hc_swap32_S (E[ 0]); + E[ 1] = hc_swap32_S (E[ 1]); + E[ 2] = hc_swap32_S (E[ 2]); + E[ 3] = hc_swap32_S (E[ 3]); + E[ 4] = hc_swap32_S (E[ 4]); + E[ 5] = hc_swap32_S (E[ 5]); + E[ 6] = hc_swap32_S (E[ 6]); + E[ 7] = hc_swap32_S (E[ 7]); + E[ 8] = hc_swap32_S (E[ 8]); + E[ 9] = hc_swap32_S (E[ 9]); + E[10] = hc_swap32_S (E[10]); + E[11] = hc_swap32_S (E[11]); + E[12] = hc_swap32_S (E[12]); + E[13] = hc_swap32_S (E[13]); + E[14] = hc_swap32_S (E[14]); + E[15] = hc_swap32_S (E[15]); + E[16] = hc_swap32_S (E[16]); + E[17] = hc_swap32_S (E[17]); + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].E[i] = E[i]; + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; + salt_buf[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; + salt_buf[2] = salt_bufs[SALT_POS_HOST].salt_buf[2]; + salt_buf[3] = salt_bufs[SALT_POS_HOST].salt_buf[3]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + + #ifdef BCRYPT_AVOID_BANK_CONFLICTS + S0 = S + (FIXED_LOCAL_SIZE * 256 * 0); + S1 = S + (FIXED_LOCAL_SIZE * 256 * 1); + S2 = S + (FIXED_LOCAL_SIZE * 256 * 2); + S3 = S + (FIXED_LOCAL_SIZE * 256 * 3); + #else + S0 = S0_all[lid]; + S1 = S1_all[lid]; + S2 = S2_all[lid]; + S3 = S3_all[lid]; + #endif + + for (u32 i = 0; i < 256; i++) + { + SET_KEY32 (S0, i, c_sbox0[i]); + SET_KEY32 (S1, i, c_sbox1[i]); + SET_KEY32 (S2, i, c_sbox2[i]); + SET_KEY32 (S3, i, c_sbox3[i]); + } + + // expandstate + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + L0 ^= salt_buf[(i & 2) + 0]; + R0 ^= salt_buf[(i & 2) + 1]; + + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 0, L0); + SET_KEY32 (S0, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S0, i + 2, L0); + SET_KEY32 (S0, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 0, L0); + SET_KEY32 (S1, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S1, i + 2, L0); + SET_KEY32 (S1, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 0, L0); + SET_KEY32 (S2, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S2, i + 2, L0); + SET_KEY32 (S2, i + 3, R0); + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 0, L0); + SET_KEY32 (S3, i + 1, R0); + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + SET_KEY32 (S3, i + 2, L0); + SET_KEY32 (S3, i + 3, R0); + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = GET_KEY32 (S0, i); + tmps[gid].S1[i] = GET_KEY32 (S1, i); + tmps[gid].S2[i] = GET_KEY32 (S2, i); + tmps[gid].S3[i] = GET_KEY32 (S3, i); + } +} + +KERNEL_FQ KERNEL_FA void m33800_loop2 (KERN_ATTR_TMPS (bcrypt_tmp_t)) +{ + // the second loop is the same as the first one, only different "password" in init2 +#if defined IS_CUDA || defined IS_HIP + m33800_loop( + pws, + g_rules_buf, + combs_buf, + g_bfs_buf, + tmps, + hooks, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + plains_buf, + digests_buf, + hashes_shown, + salt_bufs, + esalt_bufs, + d_return_buf, + d_extra0_buf, + d_extra1_buf, + d_extra2_buf, + d_extra3_buf, + kernel_param + ); +#else + m33800_loop( + pws, + rules_buf, + combs_buf, + bfs_buf, + tmps, + hooks, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + plains_buf, + digests_buf, + hashes_shown, + salt_bufs, + esalt_bufs, + d_return_buf, + d_extra0_buf, + d_extra1_buf, + d_extra2_buf, + d_extra3_buf, + kernel_param + ); +#endif +} + +KERNEL_FQ KERNEL_FA void m33800_comp (KERN_ATTR_TMPS (bcrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + // load + + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + #ifdef DYNAMIC_LOCAL + // from host + #else + LOCAL_VK u32 S0_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S1_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S2_all[FIXED_LOCAL_SIZE][256]; + LOCAL_VK u32 S3_all[FIXED_LOCAL_SIZE][256]; + #endif + + #ifdef BCRYPT_AVOID_BANK_CONFLICTS + LOCAL_AS u32 *S0 = S + (FIXED_LOCAL_SIZE * 256 * 0); + LOCAL_AS u32 *S1 = S + (FIXED_LOCAL_SIZE * 256 * 1); + LOCAL_AS u32 *S2 = S + (FIXED_LOCAL_SIZE * 256 * 2); + LOCAL_AS u32 *S3 = S + (FIXED_LOCAL_SIZE * 256 * 3); + #else + LOCAL_AS u32 *S0 = S0_all[lid]; + LOCAL_AS u32 *S1 = S1_all[lid]; + LOCAL_AS u32 *S2 = S2_all[lid]; + LOCAL_AS u32 *S3 = S3_all[lid]; + #endif + + for (u32 i = 0; i < 256; i++) + { + SET_KEY32 (S0, i, tmps[gid].S0[i]); + SET_KEY32 (S1, i, tmps[gid].S1[i]); + SET_KEY32 (S2, i, tmps[gid].S2[i]); + SET_KEY32 (S3, i, tmps[gid].S3[i]); + } + + /** + * main + */ + + u32 L0; + u32 R0; + + L0 = BCRYPTM_0; + R0 = BCRYPTM_1; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32 r0 = L0; + const u32 r1 = R0; + + L0 = BCRYPTM_2; + R0 = BCRYPTM_3; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32 r2 = L0; + const u32 r3 = R0; + + /* + e = L0; + f = R0; + + f &= ~0xff; // its just 23 not 24 ! + */ + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m70000-pure.cl b/OpenCL/m70000-pure.cl new file mode 100644 index 000000000..70bfd8d61 --- /dev/null +++ b/OpenCL/m70000-pure.cl @@ -0,0 +1,69 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 h[64]; + +} argon2_reference_tmp_t; + +KERNEL_FQ KERNEL_FA void m70000_init (KERN_ATTR_TMPS (argon2_reference_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = pws[gid].pw_len; + + for (u32 idx = 0; idx < 64; idx++) + { + tmps[gid].pw_buf[idx] = pws[gid].i[idx]; + } + + tmps[gid].pw_len = pw_len; +} + +KERNEL_FQ KERNEL_FA void m70000_loop (KERN_ATTR_TMPS (argon2_reference_tmp_t)) +{ +} + +KERNEL_FQ KERNEL_FA void m70000_comp (KERN_ATTR_TMPS (argon2_reference_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 r0 = tmps[gid].h[0]; + const u32 r1 = tmps[gid].h[1]; + const u32 r2 = tmps[gid].h[2]; + const u32 r3 = tmps[gid].h[3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m70100-pure.cl b/OpenCL/m70100-pure.cl new file mode 100644 index 000000000..38b603457 --- /dev/null +++ b/OpenCL/m70100-pure.cl @@ -0,0 +1,192 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +#define SCRYPT_R_MAX 16 +#define SCRYPT_P_MAX 16 + +#define SCRYPT_TMP_SIZE (128ULL * SCRYPT_R_MAX * SCRYPT_P_MAX) +#define SCRYPT_TMP_SIZE4 (SCRYPT_TMP_SIZE / 4) + +typedef struct +{ + u32 P[SCRYPT_TMP_SIZE4]; + +} scrypt_tmp_t; + +KERNEL_FQ KERNEL_FA void m70100_init (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init_global_swap (&sha256_hmac_ctx, pws[gid].i, pws[gid].pw_len); + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + u32 r = salt_bufs[SALT_POS_HOST].scrypt_r; + u32 p = salt_bufs[SALT_POS_HOST].scrypt_p; + + u32 chunk_bytes = 64 * r * 2; + + u32 x_bytes = chunk_bytes * p; + + for (u32 i = 0, j = 0, k = 1; i < x_bytes; i += 32, j += 8, k += 1) + { + sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = k; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); + + sha256_hmac_final (&sha256_hmac_ctx2); + + u32 digest[8]; + + digest[0] = sha256_hmac_ctx2.opad.h[0]; + digest[1] = sha256_hmac_ctx2.opad.h[1]; + digest[2] = sha256_hmac_ctx2.opad.h[2]; + digest[3] = sha256_hmac_ctx2.opad.h[3]; + digest[4] = sha256_hmac_ctx2.opad.h[4]; + digest[5] = sha256_hmac_ctx2.opad.h[5]; + digest[6] = sha256_hmac_ctx2.opad.h[6]; + digest[7] = sha256_hmac_ctx2.opad.h[7]; + + tmps[gid].P[j + 0] = hc_swap32_S (digest[0]); + tmps[gid].P[j + 1] = hc_swap32_S (digest[1]); + tmps[gid].P[j + 2] = hc_swap32_S (digest[2]); + tmps[gid].P[j + 3] = hc_swap32_S (digest[3]); + tmps[gid].P[j + 4] = hc_swap32_S (digest[4]); + tmps[gid].P[j + 5] = hc_swap32_S (digest[5]); + tmps[gid].P[j + 6] = hc_swap32_S (digest[6]); + tmps[gid].P[j + 7] = hc_swap32_S (digest[7]); + } +} + +KERNEL_FQ KERNEL_FA void m70100_loop (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ +} + +KERNEL_FQ KERNEL_FA void m70100_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + /** + * 2nd pbkdf2, creates B + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + sha256_hmac_ctx_t ctx; + + sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + + u32 r = salt_bufs[SALT_POS_HOST].scrypt_r; + u32 p = salt_bufs[SALT_POS_HOST].scrypt_p; + + u32 chunk_bytes = 64 * r * 2; + + u32 x_bytes = chunk_bytes * p; + + for (u32 i = 0, j = 0; i < x_bytes; i += 64, j += 16) + { + w0[0] = hc_swap32_S (tmps[gid].P[j + 0]); + w0[1] = hc_swap32_S (tmps[gid].P[j + 1]); + w0[2] = hc_swap32_S (tmps[gid].P[j + 2]); + w0[3] = hc_swap32_S (tmps[gid].P[j + 3]); + w1[0] = hc_swap32_S (tmps[gid].P[j + 4]); + w1[1] = hc_swap32_S (tmps[gid].P[j + 5]); + w1[2] = hc_swap32_S (tmps[gid].P[j + 6]); + w1[3] = hc_swap32_S (tmps[gid].P[j + 7]); + w2[0] = hc_swap32_S (tmps[gid].P[j + 8]); + w2[1] = hc_swap32_S (tmps[gid].P[j + 9]); + w2[2] = hc_swap32_S (tmps[gid].P[j + 10]); + w2[3] = hc_swap32_S (tmps[gid].P[j + 11]); + w3[0] = hc_swap32_S (tmps[gid].P[j + 12]); + w3[1] = hc_swap32_S (tmps[gid].P[j + 13]); + w3[2] = hc_swap32_S (tmps[gid].P[j + 14]); + w3[3] = hc_swap32_S (tmps[gid].P[j + 15]); + + sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } + + w0[0] = 1; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 4); + + sha256_hmac_final (&ctx); + + const u32 r0 = hc_swap32_S (ctx.opad.h[DGST_R0]); + const u32 r1 = hc_swap32_S (ctx.opad.h[DGST_R1]); + const u32 r2 = hc_swap32_S (ctx.opad.h[DGST_R2]); + const u32 r3 = hc_swap32_S (ctx.opad.h[DGST_R3]); + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m72000-pure.cl b/OpenCL/m72000-pure.cl new file mode 100644 index 000000000..340b88ff3 --- /dev/null +++ b/OpenCL/m72000-pure.cl @@ -0,0 +1,79 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_hash_md4.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +KERNEL_FQ KERNEL_FA void m72000_init (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = pws[gid].pw_len; + + for (u32 idx = 0; idx < 64; idx++) + { + tmps[gid].pw_buf[idx] = pws[gid].i[idx]; + } + + tmps[gid].pw_len = pw_len; +} + +KERNEL_FQ KERNEL_FA void m72000_loop (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ +} + +KERNEL_FQ KERNEL_FA void m72000_comp (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + md4_ctx_t ctx0; + + md4_init (&ctx0); + + md4_update_global (&ctx0, tmps[gid].out_buf, tmps[gid].out_len); + + md4_final (&ctx0); + + const u32 r0 = ctx0.h[0]; + const u32 r1 = ctx0.h[1]; + const u32 r2 = ctx0.h[2]; + const u32 r3 = ctx0.h[3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m73000-pure.cl b/OpenCL/m73000-pure.cl new file mode 100644 index 000000000..bfb95c7d3 --- /dev/null +++ b/OpenCL/m73000-pure.cl @@ -0,0 +1,79 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_hash_md4.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +KERNEL_FQ KERNEL_FA void m73000_init (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = pws[gid].pw_len; + + for (u32 idx = 0; idx < 64; idx++) + { + tmps[gid].pw_buf[idx] = pws[gid].i[idx]; + } + + tmps[gid].pw_len = pw_len; +} + +KERNEL_FQ KERNEL_FA void m73000_loop (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ +} + +KERNEL_FQ KERNEL_FA void m73000_comp (KERN_ATTR_TMPS (generic_io_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + md4_ctx_t ctx0; + + md4_init (&ctx0); + + md4_update_global (&ctx0, tmps[gid].out_buf, tmps[gid].out_len); + + md4_final (&ctx0); + + const u32 r0 = ctx0.h[0]; + const u32 r1 = ctx0.h[1]; + const u32 r2 = ctx0.h[2]; + const u32 r3 = ctx0.h[3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/markov_be.cl b/OpenCL/markov_be.cl index 0c4dc7d17..fb5ac8549 100644 --- a/OpenCL/markov_be.cl +++ b/OpenCL/markov_be.cl @@ -47,7 +47,7 @@ DECLSPEC void generate_pw (PRIVATE_AS u32 *pw_buf, GLOBAL_AS const cs_t *root_cs if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; } -KERNEL_FQ void l_markov (KERN_ATTR_L_MARKOV) +KERNEL_FQ KERNEL_FA void l_markov (KERN_ATTR_L_MARKOV) { const u64 gid = get_global_id (0); @@ -128,7 +128,7 @@ KERNEL_FQ void l_markov (KERN_ATTR_L_MARKOV) pws_buf_l[gid] = pw; } -KERNEL_FQ void r_markov (KERN_ATTR_R_MARKOV) +KERNEL_FQ KERNEL_FA void r_markov (KERN_ATTR_R_MARKOV) { const u64 gid = get_global_id (0); @@ -206,7 +206,7 @@ KERNEL_FQ void r_markov (KERN_ATTR_R_MARKOV) pws_buf_r[gid].i = pw.i[0]; } -KERNEL_FQ void C_markov (KERN_ATTR_C_MARKOV) +KERNEL_FQ KERNEL_FA void C_markov (KERN_ATTR_C_MARKOV) { const u64 gid = get_global_id (0); diff --git a/OpenCL/markov_le.cl b/OpenCL/markov_le.cl index 49da843aa..57e1e2ae6 100644 --- a/OpenCL/markov_le.cl +++ b/OpenCL/markov_le.cl @@ -47,7 +47,7 @@ DECLSPEC void generate_pw (PRIVATE_AS u32 *pw_buf, GLOBAL_AS const cs_t *root_cs if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; } -KERNEL_FQ void l_markov (KERN_ATTR_L_MARKOV) +KERNEL_FQ KERNEL_FA void l_markov (KERN_ATTR_L_MARKOV) { const u64 gid = get_global_id (0); @@ -127,7 +127,7 @@ KERNEL_FQ void l_markov (KERN_ATTR_L_MARKOV) pws_buf_l[gid] = pw; } -KERNEL_FQ void r_markov (KERN_ATTR_R_MARKOV) +KERNEL_FQ KERNEL_FA void r_markov (KERN_ATTR_R_MARKOV) { const u64 gid = get_global_id (0); @@ -205,7 +205,7 @@ KERNEL_FQ void r_markov (KERN_ATTR_R_MARKOV) pws_buf_r[gid].i = pw.i[0]; } -KERNEL_FQ void C_markov (KERN_ATTR_C_MARKOV) +KERNEL_FQ KERNEL_FA void C_markov (KERN_ATTR_C_MARKOV) { const u64 gid = get_global_id (0); diff --git a/OpenCL/shared.cl b/OpenCL/shared.cl index 7b8939ded..ef06f856d 100644 --- a/OpenCL/shared.cl +++ b/OpenCL/shared.cl @@ -94,7 +94,7 @@ DECLSPEC void gpu_decompress_entry (GLOBAL_AS pw_idx_t *pws_idx, GLOBAL_AS u32 * *buf = pw; } -KERNEL_FQ void gpu_decompress (KERN_ATTR_GPU_DECOMPRESS) +KERNEL_FQ KERNEL_FA void gpu_decompress (KERN_ATTR_GPU_DECOMPRESS) { const u64 gid = get_global_id (0); @@ -107,7 +107,7 @@ KERNEL_FQ void gpu_decompress (KERN_ATTR_GPU_DECOMPRESS) pws_buf[gid] = pw; } -KERNEL_FQ void gpu_memset (KERN_ATTR_GPU_MEMSET) +KERNEL_FQ KERNEL_FA void gpu_memset (KERN_ATTR_GPU_MEMSET) { const u64 gid = get_global_id (0); @@ -139,7 +139,7 @@ KERNEL_FQ void gpu_memset (KERN_ATTR_GPU_MEMSET) buf[gid] = r; } -KERNEL_FQ void gpu_bzero (KERN_ATTR_GPU_BZERO) +KERNEL_FQ KERNEL_FA void gpu_bzero (KERN_ATTR_GPU_BZERO) { const u64 gid = get_global_id (0); @@ -171,7 +171,7 @@ KERNEL_FQ void gpu_bzero (KERN_ATTR_GPU_BZERO) buf[gid] = r; } -KERNEL_FQ void gpu_atinit (KERN_ATTR_GPU_ATINIT) +KERNEL_FQ KERNEL_FA void gpu_atinit (KERN_ATTR_GPU_ATINIT) { const u64 gid = get_global_id (0); @@ -253,7 +253,7 @@ KERNEL_FQ void gpu_atinit (KERN_ATTR_GPU_ATINIT) buf[gid] = pw; } -KERNEL_FQ void gpu_utf8_to_utf16 (KERN_ATTR_GPU_UTF8_TO_UTF16) +KERNEL_FQ KERNEL_FA void gpu_utf8_to_utf16 (KERN_ATTR_GPU_UTF8_TO_UTF16) { const u64 gid = get_global_id (0); diff --git a/Python/generic_hash_mp.py b/Python/generic_hash_mp.py new file mode 100644 index 000000000..53c00f6b4 --- /dev/null +++ b/Python/generic_hash_mp.py @@ -0,0 +1,68 @@ +import sys +import struct +import hashlib +import hcshared +import hcmp + +ST_HASH = "33522b0fd9812aa68586f66dba7c17a8ce64344137f9c7d8b11f32a6921c22de*9348746780603343" +ST_PASS = "hashcat" + +# In theory, you only have to implement this function... + +def calc_hash(password: bytes, salt: dict) -> str: + salt_buf = hcshared.get_salt_buf(salt) + hash = hashlib.sha256(salt_buf + password) + for i in range(10000): + hash = hashlib.sha256(hash.digest()) + return hash.hexdigest() + +# ...except when using an esalt. The esalt void* structure is both dynamic and specific to a hash mode. +# If you use an esalt, you must convert its contents into Python datatypes. +# If you don't use esalt, just return [] +# For this example hash-mode, we kept it very general and pushed all salt data in a generic format of generic sizes +# As such, it has to go into esalt + +def extract_esalts(esalts_buf): + esalts=[] + for hash_buf, hash_len, salt_buf, salt_len in struct.iter_unpack("65536s I 65536s I", esalts_buf): + hash_buf = hash_buf[0:hash_len] + salt_buf = salt_buf[0:salt_len] + esalts.append({ "hash_buf": hash_buf, "salt_buf": salt_buf }) + return esalts + +# From here you really can leave things as they are +# The init function is good for converting the hashcat data type because it is only called once + +def kernel_loop(ctx,passwords,salt_id,is_selftest): + return hcmp.handle_queue(ctx,passwords,salt_id,is_selftest) + +def init(ctx): + hcmp.init(ctx,extract_esalts) + +def term(ctx): + hcmp.term(ctx) + +# This code is only intended to enable debugging via a standalone Python interpreter. +# It makes development easier as you don't have to use a hashcat to test your changes. +# Read passwords from stdin + +if __name__ == '__main__': + ctx = { + "salts_buf": bytes(568), + "esalts_buf": bytes(131080), + "st_salts_buf": bytes(568), + "st_esalts_buf": bytes(131080), + "parallelism": 4 + } + init(ctx) + hashcat_passwords = 256 + passwords = [] + for line in sys.stdin: + passwords.append(bytes(line.rstrip(), 'utf-8')) + if(len(passwords) == hashcat_passwords): + hashes = kernel_loop(ctx,passwords,0,False) + passwords.clear() + hashes = kernel_loop(ctx,passwords,0,False) ## remaining entries + if hashes: + print(hashes[-1]) + term(ctx) diff --git a/Python/generic_hash_sp.py b/Python/generic_hash_sp.py new file mode 100644 index 000000000..d985b1693 --- /dev/null +++ b/Python/generic_hash_sp.py @@ -0,0 +1,69 @@ +import sys +import struct +import hashlib +import hcshared +import hcsp + +ST_HASH = "33522b0fd9812aa68586f66dba7c17a8ce64344137f9c7d8b11f32a6921c22de*9348746780603343" +ST_PASS = "hashcat" + +# In theory, you only have to implement this function... + +def calc_hash(password: bytes, salt: dict) -> str: + salt_buf = hcshared.get_salt_buf(salt) + hash = hashlib.sha256(salt_buf + password) + for i in range(10000): + hash = hashlib.sha256(hash.digest()) + return hash.hexdigest() + +# ...except when using an esalt. The esalt void* structure is both dynamic and specific to a hash mode. +# If you use an esalt, you must convert its contents into Python datatypes. +# If you don't use esalt, just return [] +# For this example hash-mode, we kept it very general and pushed all salt data in a generic format of generic sizes +# As such, it has to go into esalt + +def extract_esalts(esalts_buf): + esalts=[] + for hash_buf, hash_len, salt_buf, salt_len in struct.iter_unpack("65536s I 65536s I", esalts_buf): + hash_buf = hash_buf[0:hash_len] + salt_buf = salt_buf[0:salt_len] + esalts.append({ "hash_buf": hash_buf, "salt_buf": salt_buf }) + return esalts + +# From here you really can leave things as they are +# The init function is good for converting the hashcat data type because it is only called once + +def kernel_loop(ctx,passwords,salt_id,is_selftest): + return hcsp.handle_queue(ctx,passwords,salt_id,is_selftest) + +def init(ctx): + hcsp.init(ctx,extract_esalts) + +def term(ctx): + hcsp.term(ctx) + +# This code is only intended to enable debugging via a standalone Python interpreter. +# It makes development easier as you don't have to use a hashcat to test your changes. +# Read passwords from stdin + +if __name__ == '__main__': + ctx = { + "salts_buf": bytes(568), + "esalts_buf": bytes(131080), + "st_salts_buf": bytes(568), + "st_esalts_buf": bytes(131080), + "parallelism": 1 + } + init(ctx) + hashcat_passwords = 256 + passwords = [] + for line in sys.stdin: + passwords.append(bytes(line.rstrip(), 'utf-8')) + if len(passwords) == hashcat_passwords: + hashes = kernel_loop(ctx,passwords,0,False) + passwords.clear() + hashes = kernel_loop(ctx,passwords,0,False) ## remaining entries + if hashes: + print(hashes[-1]) + term(ctx) + diff --git a/Python/hcmp.py b/Python/hcmp.py new file mode 100644 index 000000000..60af98b16 --- /dev/null +++ b/Python/hcmp.py @@ -0,0 +1,58 @@ +import importlib +import multiprocessing +import hcshared + +def _worker_batch(chunk, salt_id, is_selftest, module_name, salts, st_salts): + user_module = importlib.import_module(module_name) + calc_hash = getattr(user_module, "calc_hash") + return hcshared._worker_batch(chunk, salt_id, is_selftest, calc_hash, salts, st_salts) + +def init(ctx: dict, extract_esalts): + # Extract and merge salts and esalts + salts = hcshared.extract_salts(ctx["salts_buf"]) + esalts = extract_esalts(ctx["esalts_buf"]) + for salt, esalt in zip(salts, esalts): + salt["esalt"] = esalt + + st_salts = hcshared.extract_salts(ctx["st_salts_buf"]) + st_esalts = extract_esalts(ctx["st_esalts_buf"]) + for salt, esalt in zip(st_salts, st_esalts): + salt["esalt"] = esalt + + # Save in ctx + ctx["salts"] = salts + ctx["st_salts"] = st_salts + ctx["module_name"] = ctx.get("module_name", "__main__") + + ctx["pool"] = multiprocessing.Pool(processes=ctx["parallelism"]) + return + +def handle_queue(ctx: dict, passwords: list, salt_id: int, is_selftest: bool) -> list: + pool = ctx["pool"] + salts = ctx["salts"] + st_salts = ctx["st_salts"] + module_name = ctx["module_name"] + parallelism = ctx["parallelism"] + + chunk_size = (len(passwords) + parallelism - 1) // parallelism + chunks = [passwords[i:i + chunk_size] for i in range(0, len(passwords), chunk_size)] + + jobs = [] + for chunk in chunks: + if chunk: + jobs.append(pool.apply_async( + _worker_batch, + args=(chunk, salt_id, is_selftest, module_name, salts, st_salts) + )) + + hashes = [] + for job in jobs: + hashes.extend(job.get()) + return hashes + +def term(ctx: dict): + if "pool" in ctx: + ctx["pool"].close() + ctx["pool"].join() + del ctx["pool"] + return diff --git a/Python/hcshared.py b/Python/hcshared.py new file mode 100644 index 000000000..2fcf56c70 --- /dev/null +++ b/Python/hcshared.py @@ -0,0 +1,73 @@ +import struct +import sys + +# Extract a blob that is a list of salt_t entries and convert it to a list of dictionaries +# The salt_t is a fixed data-type so we can handle it here + +def extract_salts(salts_buf) -> list: + salts=[] + for salt_buf, salt_buf_pc, salt_len, salt_len_pc, salt_iter, salt_iter2, salt_sign, salt_repeats, orig_pos, digests_cnt, digests_done, digests_offset, scrypt_N, scrypt_r, scrypt_p in struct.iter_unpack("256s 256s I I I I 8s I I I I I I I I", salts_buf): + salt_buf = salt_buf[0:salt_len] + salt_buf_pc = salt_buf_pc[0:salt_len_pc] + salts.append({ "salt_buf": salt_buf, \ + "salt_buf_pc": salt_buf_pc, \ + "salt_iter": salt_iter, \ + "salt_iter2": salt_iter2, \ + "salt_sign": salt_sign, \ + "salt_repeats": salt_repeats, \ + "orig_pos": orig_pos, \ + "digests_cnt": digests_cnt, \ + "digests_done": digests_done, \ + "scrypt_N": scrypt_N, \ + "scrypt_r": scrypt_r, \ + "scrypt_p": scrypt_p, \ + "esalt": None }) + return salts + +def get_salt_buf(salt: dict) -> bytes: + return salt["esalt"]["salt_buf"] + +def get_salt_buf_pc(salt: dict) -> bytes: + return salt["esalt"]["salt_buf_pc"] + +def get_salt_iter(salt: dict) -> int: + return salt["esalt"]["salt_iter"] + +def get_salt_iter2(salt: dict) -> int: + return salt["esalt"]["salt_iter2"] + +def get_salt_sign(salt: dict) -> bytes: + return salt["esalt"]["salt_sign"] + +def get_salt_repeats(salt: dict) -> int: + return salt["esalt"]["salt_repeats"] + +def get_orig_pos(salt: dict) -> int: + return salt["esalt"]["orig_pos"] + +def get_digests_cnt(salt: dict) -> int: + return salt["esalt"]["digests_cnt"] + +def get_digests_done(salt: dict) -> int: + return salt["esalt"]["digests_done"] + +def get_digests_offset(salt: dict) -> int: + return salt["esalt"]["digests_offset"] + +def get_scrypt_N(salt: dict) -> int: + return salt["esalt"]["scrypt_N"] + +def get_scrypt_r(salt: dict) -> int: + return salt["esalt"]["scrypt_r"] + +def _worker_batch(passwords, salt_id, is_selftest, user_fn, salts, st_salts): + salt = st_salts[salt_id] if is_selftest else salts[salt_id] + hashes = [] + for pw in passwords: + try: + hash=user_fn(pw, salt) + hashes.append(hash) + except Exception as e: + print(e, file=sys.stderr) + hashes.append("invalid-password") + return hashes diff --git a/Python/hcsp.py b/Python/hcsp.py new file mode 100644 index 000000000..792674e74 --- /dev/null +++ b/Python/hcsp.py @@ -0,0 +1,33 @@ +import importlib +import hcshared + +def handle_queue(ctx: dict, passwords: list, salt_id: int, is_selftest: bool) -> list: + user_module = importlib.import_module(ctx["module_name"]) + calc_hash = getattr(user_module, "calc_hash") + + salts = ctx["salts"] + st_salts = ctx["st_salts"] + + return hcshared._worker_batch(passwords, salt_id, is_selftest, calc_hash, salts, st_salts) + +def init(ctx: dict, extract_esalts): + # Extract and merge salts and esalts + salts = hcshared.extract_salts(ctx["salts_buf"]) + esalts = extract_esalts(ctx["esalts_buf"]) + for salt, esalt in zip(salts, esalts): + salt["esalt"] = esalt + + st_salts = hcshared.extract_salts(ctx["st_salts_buf"]) + st_esalts = extract_esalts(ctx["st_esalts_buf"]) + for salt, esalt in zip(st_salts, st_esalts): + salt["esalt"] = esalt + + # Store final state + ctx["salts"] = salts + ctx["st_salts"] = st_salts + ctx["module_name"] = ctx.get("module_name", "__main__") + + return + +def term(ctx: dict): + return diff --git a/modules/.lock b/bridges/.gitkeep similarity index 100% rename from modules/.lock rename to bridges/.gitkeep diff --git a/deps/phc-winner-argon2-20190702/Argon2.sln b/deps/phc-winner-argon2-20190702/Argon2.sln new file mode 100644 index 000000000..b16cda080 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/Argon2.sln @@ -0,0 +1,158 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2OptTestCI", "vs2015\Argon2OptTestCI\Argon2OptTestCI.vcxproj", "{12956597-5E42-433A-93F3-D4EFF50AA207}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2RefTestCI", "vs2015\Argon2RefTestCI\Argon2RefTestCI.vcxproj", "{8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2OptGenKAT", "vs2015\Argon2OptGenKAT\Argon2OptGenKAT.vcxproj", "{DBBAAAE6-4560-4D11-8280-30A6650A82EF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2RefGenKAT", "vs2015\Argon2RefGenKAT\Argon2RefGenKAT.vcxproj", "{71921B4C-A795-4A37-95A3-99D600E01211}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2Opt", "vs2015\Argon2Opt\Argon2Opt.vcxproj", "{CAA75C57-998C-494E-B8A5-5894EF0FC528}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2Ref", "vs2015\Argon2Ref\Argon2Ref.vcxproj", "{B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2OptBench", "vs2015\Argon2OptBench\Argon2OptBench.vcxproj", "{B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2RefBench", "vs2015\Argon2RefBench\Argon2RefBench.vcxproj", "{99203F6A-6E8C-42FC-8C7C-C07E8913D539}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2OptDll", "vs2015\Argon2OptDll\Argon2OptDll.vcxproj", "{3A898DD8-ACAE-4269-ADFE-EB7260D71583}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Argon2RefDll", "vs2015\Argon2RefDll\Argon2RefDll.vcxproj", "{19D911A1-533C-4475-B313-F372481A35D4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + ReleaseStatic|x64 = ReleaseStatic|x64 + ReleaseStatic|x86 = ReleaseStatic|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {12956597-5E42-433A-93F3-D4EFF50AA207}.Debug|x64.ActiveCfg = Debug|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Debug|x64.Build.0 = Debug|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Debug|x86.ActiveCfg = Debug|Win32 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Debug|x86.Build.0 = Debug|Win32 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Release|x64.ActiveCfg = Release|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Release|x64.Build.0 = Release|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Release|x86.ActiveCfg = Release|Win32 + {12956597-5E42-433A-93F3-D4EFF50AA207}.Release|x86.Build.0 = Release|Win32 + {12956597-5E42-433A-93F3-D4EFF50AA207}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {12956597-5E42-433A-93F3-D4EFF50AA207}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {12956597-5E42-433A-93F3-D4EFF50AA207}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Debug|x64.ActiveCfg = Debug|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Debug|x64.Build.0 = Debug|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Debug|x86.ActiveCfg = Debug|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Debug|x86.Build.0 = Debug|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Release|x64.ActiveCfg = Release|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Release|x64.Build.0 = Release|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Release|x86.ActiveCfg = Release|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.Release|x86.Build.0 = Release|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Debug|x64.ActiveCfg = Debug|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Debug|x64.Build.0 = Debug|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Debug|x86.ActiveCfg = Debug|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Debug|x86.Build.0 = Debug|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Release|x64.ActiveCfg = Release|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Release|x64.Build.0 = Release|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Release|x86.ActiveCfg = Release|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.Release|x86.Build.0 = Release|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {DBBAAAE6-4560-4D11-8280-30A6650A82EF}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.Debug|x64.ActiveCfg = Debug|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.Debug|x64.Build.0 = Debug|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.Debug|x86.ActiveCfg = Debug|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.Debug|x86.Build.0 = Debug|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.Release|x64.ActiveCfg = Release|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.Release|x64.Build.0 = Release|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.Release|x86.ActiveCfg = Release|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.Release|x86.Build.0 = Release|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {71921B4C-A795-4A37-95A3-99D600E01211}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {71921B4C-A795-4A37-95A3-99D600E01211}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Debug|x64.ActiveCfg = Debug|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Debug|x64.Build.0 = Debug|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Debug|x86.ActiveCfg = Debug|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Debug|x86.Build.0 = Debug|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Release|x64.ActiveCfg = Release|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Release|x64.Build.0 = Release|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Release|x86.ActiveCfg = Release|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.Release|x86.Build.0 = Release|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {CAA75C57-998C-494E-B8A5-5894EF0FC528}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Debug|x64.ActiveCfg = Debug|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Debug|x64.Build.0 = Debug|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Debug|x86.ActiveCfg = Debug|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Debug|x86.Build.0 = Debug|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Release|x64.ActiveCfg = Release|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Release|x64.Build.0 = Release|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Release|x86.ActiveCfg = Release|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.Release|x86.Build.0 = Release|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Debug|x64.ActiveCfg = Debug|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Debug|x64.Build.0 = Debug|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Debug|x86.ActiveCfg = Debug|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Debug|x86.Build.0 = Debug|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Release|x64.ActiveCfg = Release|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Release|x64.Build.0 = Release|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Release|x86.ActiveCfg = Release|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.Release|x86.Build.0 = Release|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Debug|x64.ActiveCfg = Debug|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Debug|x64.Build.0 = Debug|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Debug|x86.ActiveCfg = Debug|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Debug|x86.Build.0 = Debug|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Release|x64.ActiveCfg = Release|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Release|x64.Build.0 = Release|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Release|x86.ActiveCfg = Release|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.Release|x86.Build.0 = Release|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {99203F6A-6E8C-42FC-8C7C-C07E8913D539}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Debug|x64.ActiveCfg = Debug|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Debug|x64.Build.0 = Debug|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Debug|x86.ActiveCfg = Debug|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Debug|x86.Build.0 = Debug|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Release|x64.ActiveCfg = Release|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Release|x64.Build.0 = Release|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Release|x86.ActiveCfg = Release|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.Release|x86.Build.0 = Release|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {3A898DD8-ACAE-4269-ADFE-EB7260D71583}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.Debug|x64.ActiveCfg = Debug|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.Debug|x64.Build.0 = Debug|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.Debug|x86.ActiveCfg = Debug|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.Debug|x86.Build.0 = Debug|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.Release|x64.ActiveCfg = Release|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.Release|x64.Build.0 = Release|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.Release|x86.ActiveCfg = Release|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.Release|x86.Build.0 = Release|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64 + {19D911A1-533C-4475-B313-F372481A35D4}.ReleaseStatic|x86.ActiveCfg = ReleaseStatic|Win32 + {19D911A1-533C-4475-B313-F372481A35D4}.ReleaseStatic|x86.Build.0 = ReleaseStatic|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/deps/phc-winner-argon2-20190702/CHANGELOG.md b/deps/phc-winner-argon2-20190702/CHANGELOG.md new file mode 100644 index 000000000..0578fde27 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/CHANGELOG.md @@ -0,0 +1,32 @@ +# 20171227 +* Added ABI version number +* AVX2/AVX-512F optimizations of BLAMKA +* Set Argon2 version number from the command line +* New bindings +* Minor bug and warning fixes (no security issue) + +# 20161029 + +* Argon2id added +* Better documentation +* Dual licensing CC0 / Apache 2.0 +* Minor bug fixes (no security issue) + +# 20160406 + +* Version 1.3 of Argon2 +* Version number in encoded hash +* Refactored low-level API +* Visibility control for library symbols +* Microsoft Visual Studio solution +* New bindings +* Minor bug and warning fixes (no security issue) + + +# 20151206 + +* Python bindings +* Password read from stdin, instead of being an argument +* Compatibility FreeBSD, NetBSD, OpenBSD +* Constant-time verification +* Minor bug and warning fixes (no security issue) diff --git a/deps/phc-winner-argon2-20190702/LICENSE b/deps/phc-winner-argon2-20190702/LICENSE new file mode 100644 index 000000000..fa611f7ac --- /dev/null +++ b/deps/phc-winner-argon2-20190702/LICENSE @@ -0,0 +1,314 @@ +Argon2 reference source code package - reference C implementations + +Copyright 2015 +Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + +You may use this work under the terms of a Creative Commons CC0 1.0 +License/Waiver or the Apache Public License 2.0, at your option. The terms of +these licenses can be found at: + +- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 +- Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + +The terms of the licenses are reproduced below. + +-------------------------------------------------------------------------------- + +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. + +-------------------------------------------------------------------------------- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. diff --git a/deps/phc-winner-argon2-20190702/Makefile b/deps/phc-winner-argon2-20190702/Makefile new file mode 100644 index 000000000..837e7f7f3 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/Makefile @@ -0,0 +1,253 @@ +# +# Argon2 reference source code package - reference C implementations +# +# Copyright 2015 +# Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves +# +# You may use this work under the terms of a Creative Commons CC0 1.0 +# License/Waiver or the Apache Public License 2.0, at your option. The terms of +# these licenses can be found at: +# +# - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 +# - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 +# +# You should have received a copy of both of these licenses along with this +# software. If not, they may be obtained at the above URLs. +# + +RUN = argon2 +BENCH = bench +GENKAT = genkat +ARGON2_VERSION ?= ZERO + +# installation parameters for staging area and final installation path +# Note; if Linux and not Debian/Ubuntu version also add lib override to make command-line +# for RedHat/Fedora, add: LIBRARY_REL=lib64 +DESTDIR ?= +PREFIX ?= /usr + +# Increment on an ABI breaking change +ABI_VERSION = 1 + +DIST = phc-winner-argon2 + +SRC = src/argon2.c src/core.c src/blake2/blake2b.c src/thread.c src/encoding.c +SRC_RUN = src/run.c +SRC_BENCH = src/bench.c +SRC_GENKAT = src/genkat.c +OBJ = $(SRC:.c=.o) + +CFLAGS += -std=c89 -O3 -Wall -g -Iinclude -Isrc + +ifeq ($(NO_THREADS), 1) +CFLAGS += -DARGON2_NO_THREADS +else +CFLAGS += -pthread +endif + +CI_CFLAGS := $(CFLAGS) -Werror=declaration-after-statement -D_FORTIFY_SOURCE=2 \ + -Wextra -Wno-type-limits -Werror -coverage -DTEST_LARGE_RAM + +OPTTARGET ?= native +OPTTEST := $(shell $(CC) -Iinclude -Isrc -march=$(OPTTARGET) src/opt.c -c \ + -o /dev/null 2>/dev/null; echo $$?) +# Detect compatible platform +ifneq ($(OPTTEST), 0) +$(info Building without optimizations) + SRC += src/ref.c +else +$(info Building with optimizations for $(OPTTARGET)) + CFLAGS += -march=$(OPTTARGET) + SRC += src/opt.c +endif + +BUILD_PATH := $(shell pwd) +KERNEL_NAME := $(shell uname -s) +MACHINE_NAME := $(shell uname -m) + +LIB_NAME = argon2 +PC_NAME = lib$(LIB_NAME).pc +PC_SRC = $(PC_NAME).in + +ifeq ($(KERNEL_NAME), Linux) + LIB_EXT := so.$(ABI_VERSION) + LIB_CFLAGS := -shared -fPIC -fvisibility=hidden -DA2_VISCTL=1 + SO_LDFLAGS := -Wl,-soname,lib$(LIB_NAME).$(LIB_EXT) + LINKED_LIB_EXT := so + PC_EXTRA_LIBS ?= -lrt -ldl +endif +ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD NetBSD OpenBSD)) + LIB_EXT := so + LIB_CFLAGS := -shared -fPIC + PC_EXTRA_LIBS ?= +endif +ifeq ($(KERNEL_NAME), Darwin) + LIB_EXT := $(ABI_VERSION).dylib + LIB_CFLAGS := -dynamiclib -install_name @rpath/lib$(LIB_NAME).$(LIB_EXT) + LINKED_LIB_EXT := dylib + PC_EXTRA_LIBS ?= +endif +ifeq ($(findstring CYGWIN, $(KERNEL_NAME)), CYGWIN) + LIB_EXT := dll + LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a + PC_EXTRA_LIBS ?= +endif +ifeq ($(findstring MINGW, $(KERNEL_NAME)), MINGW) + LIB_EXT := dll + LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a + PC_EXTRA_LIBS ?= +endif +ifeq ($(findstring MSYS, $(KERNEL_NAME)), MSYS) + LIB_EXT := dll + LIB_CFLAGS := -shared -Wl,--out-implib,lib$(LIB_NAME).$(LIB_EXT).a + PC_EXTRA_LIBS ?= +endif +ifeq ($(KERNEL_NAME), SunOS) + CC := gcc + CFLAGS += -D_REENTRANT + LIB_EXT := so + LIB_CFLAGS := -shared -fPIC + PC_EXTRA_LIBS ?= +endif + +ifeq ($(KERNEL_NAME), Linux) +ifeq ($(CC), clang) + CI_CFLAGS += -fsanitize=address -fsanitize=undefined +endif +endif + +LIB_SH := lib$(LIB_NAME).$(LIB_EXT) +LIB_ST := lib$(LIB_NAME).a + +ifdef LINKED_LIB_EXT +LINKED_LIB_SH := lib$(LIB_NAME).$(LINKED_LIB_EXT) +endif + + +LIBRARIES = $(LIB_SH) $(LIB_ST) +HEADERS = include/argon2.h + +INSTALL = install + +# relative paths for different OS +ifeq ($(KERNEL_NAME), $(filter $(KERNEL_NAME),DragonFly FreeBSD)) + +# default for FreeBSD +BINARY_REL ?= bin +INCLUDE_REL ?= include +LIBRARY_REL ?= lib +PKGCONFIG_REL ?= libdata + +else ifeq ($(KERNEL_NAME)-$(MACHINE_NAME), Linux-x86_64) + +# default for Debian/Ubuntu x86_64 +BINARY_REL ?= bin +INCLUDE_REL ?= include +LIBRARY_REL ?= lib/x86_64-linux-gnu +PKGCONFIG_REL ?= $(LIBRARY_REL) + +else + +# NetBSD, ... and Linux64/Linux32 variants that use plain lib directory +BINARY_REL ?= bin +INCLUDE_REL ?= include +LIBRARY_REL ?= lib +PKGCONFIG_REL ?= $(LIBRARY_REL) + +endif + +# absolute paths to staging area +INST_INCLUDE = $(DESTDIR)$(PREFIX)/$(INCLUDE_REL) +INST_LIBRARY = $(DESTDIR)$(PREFIX)/$(LIBRARY_REL) +INST_BINARY = $(DESTDIR)$(PREFIX)/$(BINARY_REL) +INST_PKGCONFIG = $(DESTDIR)$(PREFIX)/$(PKGCONFIG_REL)/pkgconfig + +# main target +.PHONY: all +all: $(RUN) libs + +.PHONY: libs +libs: $(LIBRARIES) $(PC_NAME) + +$(RUN): $(SRC) $(SRC_RUN) + $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ + +$(BENCH): $(SRC) $(SRC_BENCH) + $(CC) $(CFLAGS) $^ -o $@ + +$(GENKAT): $(SRC) $(SRC_GENKAT) + $(CC) $(CFLAGS) $^ -o $@ -DGENKAT + +$(LIB_SH): $(SRC) + $(CC) $(CFLAGS) $(LIB_CFLAGS) $(LDFLAGS) $(SO_LDFLAGS) $^ -o $@ + +$(LIB_ST): $(OBJ) + ar rcs $@ $^ + +.PHONY: clean +clean: + rm -f '$(RUN)' '$(BENCH)' '$(GENKAT)' + rm -f '$(LIB_SH)' '$(LIB_ST)' kat-argon2* '$(PC_NAME)' + rm -f testcase + rm -rf *.dSYM + cd src/ && rm -f *.o + cd src/blake2/ && rm -f *.o + cd kats/ && rm -f kat-* diff* run_* make_* + + +# all substitutions to pc template +SED_COMMANDS = /^\#\#.*$$/d; +SED_COMMANDS += s\#@PREFIX@\#$(PREFIX)\#g; +SED_COMMANDS += s\#@EXTRA_LIBS@\#$(PC_EXTRA_LIBS)\#g; +SED_COMMANDS += s\#@UPSTREAM_VER@\#$(ARGON2_VERSION)\#g; +SED_COMMANDS += s\#@HOST_MULTIARCH@\#$(LIBRARY_REL)\#g; +SED_COMMANDS += s\#@INCLUDE@\#$(INCLUDE_REL)\#g; + +# substitute PREFIX and PC_EXTRA_LIBS into pkgconfig pc file +$(PC_NAME): $(PC_SRC) + sed '$(SED_COMMANDS)' < '$(PC_SRC)' > '$@' + + +.PHONY: dist +dist: + cd ..; \ + tar -c --exclude='.??*' -z -f $(DIST)-`date "+%Y%m%d"`.tgz $(DIST)/* + +.PHONY: test +test: $(SRC) src/test.c + $(CC) $(CFLAGS) -Wextra -Wno-type-limits $^ -o testcase + @sh kats/test.sh + ./testcase + +.PHONY: testci +testci: $(SRC) src/test.c + $(CC) $(CI_CFLAGS) $^ -o testcase + @sh kats/test.sh + ./testcase + + +.PHONY: format +format: + clang-format -style="{BasedOnStyle: llvm, IndentWidth: 4}" \ + -i include/*.h src/*.c src/*.h src/blake2/*.c src/blake2/*.h + +.PHONY: install +install: $(RUN) libs + $(INSTALL) -d $(INST_INCLUDE) + $(INSTALL) -m 0644 $(HEADERS) $(INST_INCLUDE) + $(INSTALL) -d $(INST_LIBRARY) + $(INSTALL) -m 0644 $(LIBRARIES) $(INST_LIBRARY) +ifdef LINKED_LIB_SH + cd $(INST_LIBRARY) && ln -s $(notdir $(LIB_SH) $(LINKED_LIB_SH)) +endif + $(INSTALL) -d $(INST_BINARY) + $(INSTALL) $(RUN) $(INST_BINARY) + $(INSTALL) -d $(INST_PKGCONFIG) + $(INSTALL) -m 0644 $(PC_NAME) $(INST_PKGCONFIG) + +.PHONY: uninstall +uninstall: + cd $(INST_INCLUDE) && rm -f $(notdir $(HEADERS)) + cd $(INST_LIBRARY) && rm -f $(notdir $(LIBRARIES) $(LINKED_LIB_SH)) + cd $(INST_BINARY) && rm -f $(notdir $(RUN)) + cd $(INST_PKG_CONFIG) && rm -f $(notdir $(PC_NAME)) diff --git a/deps/phc-winner-argon2-20190702/README.md b/deps/phc-winner-argon2-20190702/README.md new file mode 100644 index 000000000..9f2d17c37 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/README.md @@ -0,0 +1,297 @@ +# Argon2 + +[![Build Status](https://travis-ci.org/P-H-C/phc-winner-argon2.svg?branch=master)](https://travis-ci.org/P-H-C/phc-winner-argon2) +[![Build status](https://ci.appveyor.com/api/projects/status/8nfwuwq55sgfkele?svg=true)](https://ci.appveyor.com/project/P-H-C/phc-winner-argon2) +[![codecov.io](https://codecov.io/github/P-H-C/phc-winner-argon2/coverage.svg?branch=master)](https://codecov.io/github/P-H-C/phc-winner-argon2?branch=master) + +This is the reference C implementation of Argon2, the password-hashing +function that won the [Password Hashing Competition +(PHC)](https://password-hashing.net). + +Argon2 is a password-hashing function that summarizes the state of the +art in the design of memory-hard functions and can be used to hash +passwords for credential storage, key derivation, or other applications. + +It has a simple design aimed at the highest memory filling rate and +effective use of multiple computing units, while still providing defense +against tradeoff attacks (by exploiting the cache and memory organization +of the recent processors). + +Argon2 has three variants: Argon2i, Argon2d, and Argon2id. Argon2d is faster +and uses data-depending memory access, which makes it highly resistant +against GPU cracking attacks and suitable for applications with no threats +from side-channel timing attacks (eg. cryptocurrencies). Argon2i instead +uses data-independent memory access, which is preferred for password +hashing and password-based key derivation, but it is slower as it makes +more passes over the memory to protect from tradeoff attacks. Argon2id is a +hybrid of Argon2i and Argon2d, using a combination of data-depending and +data-independent memory accesses, which gives some of Argon2i's resistance to +side-channel cache timing attacks and much of Argon2d's resistance to GPU +cracking attacks. + +Argon2i, Argon2d, and Argon2id are parametrized by: + +* A **time** cost, which defines the amount of computation realized and + therefore the execution time, given in number of iterations +* A **memory** cost, which defines the memory usage, given in kibibytes +* A **parallelism** degree, which defines the number of parallel threads + +The [Argon2 document](argon2-specs.pdf) gives detailed specs and design +rationale. + +Please report bugs as issues on this repository. + +## Usage + +`make` builds the executable `argon2`, the static library `libargon2.a`, +and the shared library `libargon2.so` (or `libargon2.dylib` on OSX). +Make sure to run `make test` to verify that your build produces valid +results. `make install PREFIX=/usr` installs it to your system. + +### Command-line utility + +`argon2` is a command-line utility to test specific Argon2 instances +on your system. To show usage instructions, run +`./argon2 -h` as +``` +Usage: ./argon2 [-h] salt [-i|-d|-id] [-t iterations] [-m memory] [-p parallelism] [-l hash length] [-e|-r] [-v (10|13)] + Password is read from stdin +Parameters: + salt The salt to use, at least 8 characters + -i Use Argon2i (this is the default) + -d Use Argon2d instead of Argon2i + -id Use Argon2id instead of Argon2i + -t N Sets the number of iterations to N (default = 3) + -m N Sets the memory usage of 2^N KiB (default 12) + -p N Sets parallelism to N threads (default 1) + -l N Sets hash output length to N bytes (default 32) + -e Output only encoded hash + -r Output only the raw bytes of the hash + -v (10|13) Argon2 version (defaults to the most recent version, currently 13) + -h Print argon2 usage +``` +For example, to hash "password" using "somesalt" as a salt and doing 2 +iterations, consuming 64 MiB, using four parallel threads and an output hash +of 24 bytes +``` +$ echo -n "password" | ./argon2 somesalt -t 2 -m 16 -p 4 -l 24 +Type: Argon2i +Iterations: 2 +Memory: 65536 KiB +Parallelism: 4 +Hash: 45d7ac72e76f242b20b77b9bf9bf9d5915894e669a24e6c6 +Encoded: $argon2i$v=19$m=65536,t=2,p=4$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG +0.188 seconds +Verification ok +``` + +### Library + +`libargon2` provides an API to both low-level and high-level functions +for using Argon2. + +The example program below hashes the string "password" with Argon2i +using the high-level API and then using the low-level API. While the +high-level API takes the three cost parameters (time, memory, and +parallelism), the password input buffer, the salt input buffer, and the +output buffers, the low-level API takes in these and additional parameters +, as defined in [`include/argon2.h`](include/argon2.h). + +There are many additional parameters, but we will highlight three of them here. + +1. The `secret` parameter, which is used for [keyed hashing]( + https://en.wikipedia.org/wiki/Hash-based_message_authentication_code). + This allows a secret key to be input at hashing time (from some external + location) and be folded into the value of the hash. This means that even if + your salts and hashes are compromized, an attacker cannot brute-force to find + the password without the key. + +2. The `ad` parameter, which is used to fold any additional data into the hash + value. Functionally, this behaves almost exactly like the `secret` or `salt` + parameters; the `ad` parameter is folding into the value of the hash. + However, this parameter is used for different data. The `salt` should be a + random string stored alongside your password. The `secret` should be a random + key only usable at hashing time. The `ad` is for any other data. + +3. The `flags` parameter, which determines which memory should be securely + erased. This is useful if you want to securly delete the `pwd` or `secret` + fields right after they are used. To do this set `flags` to either + `ARGON2_FLAG_CLEAR_PASSWORD` or `ARGON2_FLAG_CLEAR_SECRET`. To change how + internal memory is cleared, change the global flag + `FLAG_clear_internal_memory` (defaults to clearing internal memory). + +Here the time cost `t_cost` is set to 2 iterations, the +memory cost `m_cost` is set to 216 kibibytes (64 mebibytes), +and parallelism is set to 1 (single-thread). + +Compile for example as `gcc test.c libargon2.a -Isrc -o test`, if the program +below is named `test.c` and placed in the project's root directory. + +```c +#include "argon2.h" +#include +#include +#include + +#define HASHLEN 32 +#define SALTLEN 16 +#define PWD "password" + +int main(void) +{ + uint8_t hash1[HASHLEN]; + uint8_t hash2[HASHLEN]; + + uint8_t salt[SALTLEN]; + memset( salt, 0x00, SALTLEN ); + + uint8_t *pwd = (uint8_t *)strdup(PWD); + uint32_t pwdlen = strlen((char *)pwd); + + uint32_t t_cost = 2; // 1-pass computation + uint32_t m_cost = (1<<16); // 64 mebibytes memory usage + uint32_t parallelism = 1; // number of threads and lanes + + // high-level API + argon2i_hash_raw(t_cost, m_cost, parallelism, pwd, pwdlen, salt, SALTLEN, hash1, HASHLEN); + + // low-level API + argon2_context context = { + hash2, /* output array, at least HASHLEN in size */ + HASHLEN, /* digest length */ + pwd, /* password array */ + pwdlen, /* password length */ + salt, /* salt array */ + SALTLEN, /* salt length */ + NULL, 0, /* optional secret data */ + NULL, 0, /* optional associated data */ + t_cost, m_cost, parallelism, parallelism, + ARGON2_VERSION_13, /* algorithm version */ + NULL, NULL, /* custom memory allocation / deallocation functions */ + /* by default only internal memory is cleared (pwd is not wiped) */ + ARGON2_DEFAULT_FLAGS + }; + + int rc = argon2i_ctx( &context ); + if(ARGON2_OK != rc) { + printf("Error: %s\n", argon2_error_message(rc)); + exit(1); + } + free(pwd); + + for( int i=0; i +#include +#include + +#include "argon2.h" +#include "core.h" + + + +int argon2_ctx(argon2_context *context, argon2_type type) { + /* 1. Validate all inputs */ + + uint32_t memory_blocks, segment_length; + argon2_instance_t instance; + + /* 2. Align memory size */ + /* Minimum memory_blocks = 8L blocks, where L is the number of lanes */ + memory_blocks = context->m_cost; + + if (memory_blocks < 2 * ARGON2_SYNC_POINTS * context->lanes) { + memory_blocks = 2 * ARGON2_SYNC_POINTS * context->lanes; + } + + segment_length = memory_blocks / (context->lanes * ARGON2_SYNC_POINTS); + /* Ensure that all segments have equal length */ + memory_blocks = segment_length * (context->lanes * ARGON2_SYNC_POINTS); + + instance.version = context->version; + instance.memory = NULL; + instance.passes = context->t_cost; + instance.memory_blocks = memory_blocks; + instance.segment_length = segment_length; + instance.lane_length = segment_length * ARGON2_SYNC_POINTS; + instance.lanes = context->lanes; + instance.threads = context->threads; + instance.type = type; + + if (instance.threads > instance.lanes) { + instance.threads = instance.lanes; + } + + /* 3. Initialization: Hashing inputs, allocating memory, filling first + * blocks + */ + initialize(&instance, context); + + /* 4. Filling memory */ + fill_memory_blocks(&instance); + + /* 5. Finalization */ + finalize(context, &instance); + + return ARGON2_OK; +} diff --git a/deps/phc-winner-argon2-20190702/_hashcat/argon2.h b/deps/phc-winner-argon2-20190702/_hashcat/argon2.h new file mode 100644 index 000000000..fdc251040 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/argon2.h @@ -0,0 +1,440 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_H +#define ARGON2_H + +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Symbols visibility control */ +#ifdef A2_VISCTL +#define ARGON2_PUBLIC __attribute__((visibility("default"))) +#define ARGON2_LOCAL __attribute__ ((visibility ("hidden"))) +#elif _MSC_VER +#define ARGON2_PUBLIC __declspec(dllexport) +#define ARGON2_LOCAL +#else +#define ARGON2_PUBLIC +#define ARGON2_LOCAL +#endif + +/* + * Argon2 input parameter restrictions + */ + +/* Minimum and maximum number of lanes (degree of parallelism) */ +#define ARGON2_MIN_LANES UINT32_C(1) +#define ARGON2_MAX_LANES UINT32_C(0xFFFFFF) + +/* Minimum and maximum number of threads */ +#define ARGON2_MIN_THREADS UINT32_C(1) +#define ARGON2_MAX_THREADS UINT32_C(0xFFFFFF) + +/* Number of synchronization points between lanes per pass */ +#define ARGON2_SYNC_POINTS UINT32_C(4) + +/* Minimum and maximum digest size in bytes */ +#define ARGON2_MIN_OUTLEN UINT32_C(4) +#define ARGON2_MAX_OUTLEN UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum number of memory blocks (each of BLOCK_SIZE bytes) */ +#define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) /* 2 blocks per slice */ + +#define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b)) +/* Max memory size is addressing-space/2, topping at 2^32 blocks (4 TB) */ +#define ARGON2_MAX_MEMORY_BITS \ + ARGON2_MIN(UINT32_C(32), (sizeof(void *) * CHAR_BIT - 10 - 1)) +#define ARGON2_MAX_MEMORY \ + ARGON2_MIN(UINT32_C(0xFFFFFFFF), UINT64_C(1) << ARGON2_MAX_MEMORY_BITS) + +/* Minimum and maximum number of passes */ +#define ARGON2_MIN_TIME UINT32_C(1) +#define ARGON2_MAX_TIME UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum password length in bytes */ +#define ARGON2_MIN_PWD_LENGTH UINT32_C(0) +#define ARGON2_MAX_PWD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum associated data length in bytes */ +#define ARGON2_MIN_AD_LENGTH UINT32_C(0) +#define ARGON2_MAX_AD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum salt length in bytes */ +#define ARGON2_MIN_SALT_LENGTH UINT32_C(8) +#define ARGON2_MAX_SALT_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum key length in bytes */ +#define ARGON2_MIN_SECRET UINT32_C(0) +#define ARGON2_MAX_SECRET UINT32_C(0xFFFFFFFF) + +/* Flags to determine which fields are securely wiped (default = no wipe). */ +#define ARGON2_DEFAULT_FLAGS UINT32_C(0) +#define ARGON2_FLAG_CLEAR_PASSWORD (UINT32_C(1) << 0) +#define ARGON2_FLAG_CLEAR_SECRET (UINT32_C(1) << 1) + +/* Global flag to determine if we are wiping internal memory buffers. This flag + * is defined in core.c and defaults to 1 (wipe internal memory). */ +extern int FLAG_clear_internal_memory; + +/* Error codes */ +typedef enum Argon2_ErrorCodes { + ARGON2_OK = 0, + + ARGON2_OUTPUT_PTR_NULL = -1, + + ARGON2_OUTPUT_TOO_SHORT = -2, + ARGON2_OUTPUT_TOO_LONG = -3, + + ARGON2_PWD_TOO_SHORT = -4, + ARGON2_PWD_TOO_LONG = -5, + + ARGON2_SALT_TOO_SHORT = -6, + ARGON2_SALT_TOO_LONG = -7, + + ARGON2_AD_TOO_SHORT = -8, + ARGON2_AD_TOO_LONG = -9, + + ARGON2_SECRET_TOO_SHORT = -10, + ARGON2_SECRET_TOO_LONG = -11, + + ARGON2_TIME_TOO_SMALL = -12, + ARGON2_TIME_TOO_LARGE = -13, + + ARGON2_MEMORY_TOO_LITTLE = -14, + ARGON2_MEMORY_TOO_MUCH = -15, + + ARGON2_LANES_TOO_FEW = -16, + ARGON2_LANES_TOO_MANY = -17, + + ARGON2_PWD_PTR_MISMATCH = -18, /* NULL ptr with non-zero length */ + ARGON2_SALT_PTR_MISMATCH = -19, /* NULL ptr with non-zero length */ + ARGON2_SECRET_PTR_MISMATCH = -20, /* NULL ptr with non-zero length */ + ARGON2_AD_PTR_MISMATCH = -21, /* NULL ptr with non-zero length */ + + ARGON2_MEMORY_ALLOCATION_ERROR = -22, + + ARGON2_FREE_MEMORY_CBK_NULL = -23, + ARGON2_ALLOCATE_MEMORY_CBK_NULL = -24, + + ARGON2_INCORRECT_PARAMETER = -25, + ARGON2_INCORRECT_TYPE = -26, + + ARGON2_OUT_PTR_MISMATCH = -27, + + ARGON2_THREADS_TOO_FEW = -28, + ARGON2_THREADS_TOO_MANY = -29, + + ARGON2_MISSING_ARGS = -30, + + ARGON2_ENCODING_FAIL = -31, + + ARGON2_DECODING_FAIL = -32, + + ARGON2_THREAD_FAIL = -33, + + ARGON2_DECODING_LENGTH_FAIL = -34, + + ARGON2_VERIFY_MISMATCH = -35 +} argon2_error_codes; + +/* Memory allocator types --- for external allocation */ +typedef int (*allocate_fptr)(uint8_t **memory, size_t bytes_to_allocate); +typedef void (*deallocate_fptr)(uint8_t *memory, size_t bytes_to_allocate); + +/* Argon2 external data structures */ + +/* + ***** + * Context: structure to hold Argon2 inputs: + * output array and its length, + * password and its length, + * salt and its length, + * secret and its length, + * associated data and its length, + * number of passes, amount of used memory (in KBytes, can be rounded up a bit) + * number of parallel threads that will be run. + * All the parameters above affect the output hash value. + * Additionally, two function pointers can be provided to allocate and + * deallocate the memory (if NULL, memory will be allocated internally). + * Also, three flags indicate whether to erase password, secret as soon as they + * are pre-hashed (and thus not needed anymore), and the entire memory + ***** + * Simplest situation: you have output array out[8], password is stored in + * pwd[32], salt is stored in salt[16], you do not have keys nor associated + * data. You need to spend 1 GB of RAM and you run 5 passes of Argon2d with + * 4 parallel lanes. + * You want to erase the password, but you're OK with last pass not being + * erased. You want to use the default memory allocator. + * Then you initialize: + Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false) + */ +typedef struct Argon2_Context { + uint8_t *out; /* output array */ + uint32_t outlen; /* digest length */ + + uint8_t *pwd; /* password array */ + uint32_t pwdlen; /* password length */ + + uint8_t *salt; /* salt array */ + uint32_t saltlen; /* salt length */ + + uint8_t *secret; /* key array */ + uint32_t secretlen; /* key length */ + + uint8_t *ad; /* associated data array */ + uint32_t adlen; /* associated data length */ + + uint32_t t_cost; /* number of passes */ + uint32_t m_cost; /* amount of memory requested (KB) */ + uint32_t lanes; /* number of lanes */ + uint32_t threads; /* maximum number of threads */ + + uint32_t version; /* version number */ + + allocate_fptr allocate_cbk; /* pointer to memory allocator */ + deallocate_fptr free_cbk; /* pointer to memory deallocator */ + + uint32_t flags; /* array of bool options */ + + void *memory; + +} argon2_context; + +/* Argon2 primitive type */ +typedef enum Argon2_type { + Argon2_d = 0, + Argon2_i = 1, + Argon2_id = 2 +} argon2_type; + +/* Version of the algorithm */ +typedef enum Argon2_version { + ARGON2_VERSION_10 = 0x10, + ARGON2_VERSION_13 = 0x13, + ARGON2_VERSION_NUMBER = ARGON2_VERSION_13 +} argon2_version; + +/* + * Function that gives the string representation of an argon2_type. + * @param type The argon2_type that we want the string for + * @param uppercase Whether the string should have the first letter uppercase + * @return NULL if invalid type, otherwise the string representation. + */ +ARGON2_PUBLIC const char *argon2_type2string(argon2_type type, int uppercase); + +/* + * Function that performs memory-hard hashing with certain degree of parallelism + * @param context Pointer to the Argon2 internal structure + * @return Error code if smth is wrong, ARGON2_OK otherwise + */ +ARGON2_PUBLIC int argon2_ctx(argon2_context *context, argon2_type type); + +/** + * Hashes a password with Argon2i, producing an encoded hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hashlen Desired length of the hash in bytes + * @param encoded Buffer where to write the encoded hash + * @param encodedlen Size of the buffer (thus max size of the encoded hash) + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +/** + * Hashes a password with Argon2i, producing a raw hash at @hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hash Buffer where to write the raw hash - updated by the function + * @param hashlen Desired length of the hash in bytes + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2d_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2id_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2id_hash_raw(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_hash(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen, char *encoded, + const size_t encodedlen, argon2_type type, + const uint32_t version); + +/** + * Verifies a password against an encoded string + * Encoded string is restricted as in validate_inputs() + * @param encoded String encoding parameters, salt, hash + * @param pwd Pointer to password + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2id_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, + const size_t pwdlen, argon2_type type); + +/** + * Argon2d: Version of Argon2 that picks memory blocks depending + * on the password and salt. Only for side-channel-free + * environment!! + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_ctx(argon2_context *context); + +/** + * Argon2i: Version of Argon2 that picks memory blocks + * independent on the password and salt. Good for side-channels, + * but worse w.r.t. tradeoff attacks if only one pass is used. + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_ctx(argon2_context *context); + +/** + * Argon2id: Version of Argon2 where the first half-pass over memory is + * password-independent, the rest are password-dependent (on the password and + * salt). OK against side channels (they reduce to 1/2-pass Argon2i), and + * better with w.r.t. tradeoff attacks (similar to Argon2d). + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_ctx(argon2_context *context); + +/** + * Verify if a given password is correct for Argon2d hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2i hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2id hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_verify_ctx(argon2_context *context, + const char *hash); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify_ctx(argon2_context *context, const char *hash, + argon2_type type); + +/** + * Get the associated error message for given error code + * @return The error message associated with the given error code + */ +ARGON2_PUBLIC const char *argon2_error_message(int error_code); + +/** + * Returns the encoded hash length for the given input parameters + * @param t_cost Number of iterations + * @param m_cost Memory usage in kibibytes + * @param parallelism Number of threads; used to compute lanes + * @param saltlen Salt size in bytes + * @param hashlen Hash size in bytes + * @param type The argon2_type that we want the encoded length for + * @return The encoded hash length in bytes + */ +ARGON2_PUBLIC size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, + uint32_t parallelism, uint32_t saltlen, + uint32_t hashlen, argon2_type type); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2-impl.h b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2-impl.h new file mode 100644 index 000000000..241f0beb3 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2-impl.h @@ -0,0 +1,156 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef PORTABLE_BLAKE2_IMPL_H +#define PORTABLE_BLAKE2_IMPL_H + +#include +#include + +#if defined(_MSC_VER) +#define BLAKE2_INLINE __inline +#elif defined(__GNUC__) || defined(__clang__) +#define BLAKE2_INLINE __inline__ +#else +#define BLAKE2_INLINE +#endif + +/* Argon2 Team - Begin Code */ +/* + Not an exhaustive list, but should cover the majority of modern platforms + Additionally, the code will always be correct---this is only a performance + tweak. +*/ +#if (defined(__BYTE_ORDER__) && \ + (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) || \ + defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__MIPSEL__) || \ + defined(__AARCH64EL__) || defined(__amd64__) || defined(__i386__) || \ + defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || \ + defined(_M_ARM) +#define NATIVE_LITTLE_ENDIAN +#endif +/* Argon2 Team - End Code */ + +static BLAKE2_INLINE uint32_t load32(const void *src) { +#if defined(NATIVE_LITTLE_ENDIAN) + uint32_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = (const uint8_t *)src; + uint32_t w = *p++; + w |= (uint32_t)(*p++) << 8; + w |= (uint32_t)(*p++) << 16; + w |= (uint32_t)(*p++) << 24; + return w; +#endif +} + +static BLAKE2_INLINE uint64_t load64(const void *src) { +#if defined(NATIVE_LITTLE_ENDIAN) + uint64_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = (const uint8_t *)src; + uint64_t w = *p++; + w |= (uint64_t)(*p++) << 8; + w |= (uint64_t)(*p++) << 16; + w |= (uint64_t)(*p++) << 24; + w |= (uint64_t)(*p++) << 32; + w |= (uint64_t)(*p++) << 40; + w |= (uint64_t)(*p++) << 48; + w |= (uint64_t)(*p++) << 56; + return w; +#endif +} + +static BLAKE2_INLINE void store32(void *dst, uint32_t w) { +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +#endif +} + +static BLAKE2_INLINE void store64(void *dst, uint64_t w) { +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +#endif +} + +static BLAKE2_INLINE uint64_t load48(const void *src) { + const uint8_t *p = (const uint8_t *)src; + uint64_t w = *p++; + w |= (uint64_t)(*p++) << 8; + w |= (uint64_t)(*p++) << 16; + w |= (uint64_t)(*p++) << 24; + w |= (uint64_t)(*p++) << 32; + w |= (uint64_t)(*p++) << 40; + return w; +} + +static BLAKE2_INLINE void store48(void *dst, uint64_t w) { + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +} + +static BLAKE2_INLINE uint32_t rotr32(const uint32_t w, const unsigned c) { + return (w >> c) | (w << (32 - c)); +} + +static BLAKE2_INLINE uint64_t rotr64(const uint64_t w, const unsigned c) { + return (w >> c) | (w << (64 - c)); +} + +void clear_internal_memory(void *v, size_t n); + +#endif diff --git a/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2.h b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2.h new file mode 100644 index 000000000..eeb45bedf --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2.h @@ -0,0 +1,87 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef PORTABLE_BLAKE2_H +#define PORTABLE_BLAKE2_H + +#if defined(__cplusplus) +extern "C" { +#endif + +enum blake2b_constant { + BLAKE2B_BLOCKBYTES = 128, + BLAKE2B_OUTBYTES = 64, + BLAKE2B_KEYBYTES = 64, + BLAKE2B_SALTBYTES = 16, + BLAKE2B_PERSONALBYTES = 16 +}; + +#pragma pack(push, 1) +typedef struct __blake2b_param { + uint8_t digest_length; /* 1 */ + uint8_t key_length; /* 2 */ + uint8_t fanout; /* 3 */ + uint8_t depth; /* 4 */ + uint32_t leaf_length; /* 8 */ + uint64_t node_offset; /* 16 */ + uint8_t node_depth; /* 17 */ + uint8_t inner_length; /* 18 */ + uint8_t reserved[14]; /* 32 */ + uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ + uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ +} blake2b_param; +#pragma pack(pop) + +typedef struct __blake2b_state { + uint64_t h[8]; + uint64_t t[2]; + uint64_t f[2]; + uint8_t buf[BLAKE2B_BLOCKBYTES]; + unsigned buflen; + unsigned outlen; + uint8_t last_node; +} blake2b_state; + +/* Ensure param structs have not been wrongly padded */ +/* Poor man's static_assert */ +enum { + blake2_size_check_0 = 1 / !!(CHAR_BIT == 8), + blake2_size_check_2 = + 1 / !!(sizeof(blake2b_param) == sizeof(uint64_t) * CHAR_BIT) +}; + +/* Streaming API */ +ARGON2_LOCAL int blake2b_init(blake2b_state *S, size_t outlen); +ARGON2_LOCAL int blake2b_init_key(blake2b_state *S, size_t outlen, const void *key, + size_t keylen); +ARGON2_LOCAL int blake2b_init_param(blake2b_state *S, const blake2b_param *P); +ARGON2_LOCAL int blake2b_update(blake2b_state *S, const void *in, size_t inlen); +ARGON2_LOCAL int blake2b_final(blake2b_state *S, void *out, size_t outlen); + +/* Simple API */ +ARGON2_LOCAL int blake2b(void *out, size_t outlen, const void *in, size_t inlen, + const void *key, size_t keylen); + +/* Argon2 Team - Begin Code */ +ARGON2_LOCAL int blake2b_long(void *out, size_t outlen, const void *in, size_t inlen); +/* Argon2 Team - End Code */ + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2b.c b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2b.c new file mode 100644 index 000000000..370eccf8d --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blake2b.c @@ -0,0 +1,390 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +static const uint64_t blake2b_IV[8] = { + UINT64_C(0x6a09e667f3bcc908), UINT64_C(0xbb67ae8584caa73b), + UINT64_C(0x3c6ef372fe94f82b), UINT64_C(0xa54ff53a5f1d36f1), + UINT64_C(0x510e527fade682d1), UINT64_C(0x9b05688c2b3e6c1f), + UINT64_C(0x1f83d9abfb41bd6b), UINT64_C(0x5be0cd19137e2179)}; + +static const unsigned int blake2b_sigma[12][16] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, + {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4}, + {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8}, + {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13}, + {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9}, + {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11}, + {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10}, + {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5}, + {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, +}; + +static BLAKE2_INLINE void blake2b_set_lastnode(blake2b_state *S) { + S->f[1] = (uint64_t)-1; +} + +static BLAKE2_INLINE void blake2b_set_lastblock(blake2b_state *S) { + if (S->last_node) { + blake2b_set_lastnode(S); + } + S->f[0] = (uint64_t)-1; +} + +static BLAKE2_INLINE void blake2b_increment_counter(blake2b_state *S, + uint64_t inc) { + S->t[0] += inc; + S->t[1] += (S->t[0] < inc); +} + +static BLAKE2_INLINE void blake2b_invalidate_state(blake2b_state *S) { +// clear_internal_memory(S, sizeof(*S)); /* wipe */ + blake2b_set_lastblock(S); /* invalidate for further use */ +} + +static BLAKE2_INLINE void blake2b_init0(blake2b_state *S) { + memset(S, 0, sizeof(*S)); + memcpy(S->h, blake2b_IV, sizeof(S->h)); +} + +int blake2b_init_param(blake2b_state *S, const blake2b_param *P) { + const unsigned char *p = (const unsigned char *)P; + unsigned int i; + + if (NULL == P || NULL == S) { + return -1; + } + + blake2b_init0(S); + /* IV XOR Parameter Block */ + for (i = 0; i < 8; ++i) { + S->h[i] ^= load64(&p[i * sizeof(S->h[i])]); + } + S->outlen = P->digest_length; + return 0; +} + +/* Sequential blake2b initialization */ +int blake2b_init(blake2b_state *S, size_t outlen) { + blake2b_param P; + + if (S == NULL) { + return -1; + } + + if ((outlen == 0) || (outlen > BLAKE2B_OUTBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + /* Setup Parameter Block for unkeyed BLAKE2 */ + P.digest_length = (uint8_t)outlen; + P.key_length = 0; + P.fanout = 1; + P.depth = 1; + P.leaf_length = 0; + P.node_offset = 0; + P.node_depth = 0; + P.inner_length = 0; + memset(P.reserved, 0, sizeof(P.reserved)); + memset(P.salt, 0, sizeof(P.salt)); + memset(P.personal, 0, sizeof(P.personal)); + + return blake2b_init_param(S, &P); +} + +int blake2b_init_key(blake2b_state *S, size_t outlen, const void *key, + size_t keylen) { + blake2b_param P; + + if (S == NULL) { + return -1; + } + + if ((outlen == 0) || (outlen > BLAKE2B_OUTBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + if ((key == 0) || (keylen == 0) || (keylen > BLAKE2B_KEYBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + /* Setup Parameter Block for keyed BLAKE2 */ + P.digest_length = (uint8_t)outlen; + P.key_length = (uint8_t)keylen; + P.fanout = 1; + P.depth = 1; + P.leaf_length = 0; + P.node_offset = 0; + P.node_depth = 0; + P.inner_length = 0; + memset(P.reserved, 0, sizeof(P.reserved)); + memset(P.salt, 0, sizeof(P.salt)); + memset(P.personal, 0, sizeof(P.personal)); + + if (blake2b_init_param(S, &P) < 0) { + blake2b_invalidate_state(S); + return -1; + } + + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset(block, 0, BLAKE2B_BLOCKBYTES); + memcpy(block, key, keylen); + blake2b_update(S, block, BLAKE2B_BLOCKBYTES); + /* Burn the key from stack */ +// clear_internal_memory(block, BLAKE2B_BLOCKBYTES); + } + return 0; +} + +static void blake2b_compress(blake2b_state *S, const uint8_t *block) { + uint64_t m[16]; + uint64_t v[16]; + unsigned int i, r; + + for (i = 0; i < 16; ++i) { + m[i] = load64(block + i * sizeof(m[i])); + } + + for (i = 0; i < 8; ++i) { + v[i] = S->h[i]; + } + + v[8] = blake2b_IV[0]; + v[9] = blake2b_IV[1]; + v[10] = blake2b_IV[2]; + v[11] = blake2b_IV[3]; + v[12] = blake2b_IV[4] ^ S->t[0]; + v[13] = blake2b_IV[5] ^ S->t[1]; + v[14] = blake2b_IV[6] ^ S->f[0]; + v[15] = blake2b_IV[7] ^ S->f[1]; + +#define G(r, i, a, b, c, d) \ + do { \ + a = a + b + m[blake2b_sigma[r][2 * i + 0]]; \ + d = rotr64(d ^ a, 32); \ + c = c + d; \ + b = rotr64(b ^ c, 24); \ + a = a + b + m[blake2b_sigma[r][2 * i + 1]]; \ + d = rotr64(d ^ a, 16); \ + c = c + d; \ + b = rotr64(b ^ c, 63); \ + } while ((void)0, 0) + +#define ROUND(r) \ + do { \ + G(r, 0, v[0], v[4], v[8], v[12]); \ + G(r, 1, v[1], v[5], v[9], v[13]); \ + G(r, 2, v[2], v[6], v[10], v[14]); \ + G(r, 3, v[3], v[7], v[11], v[15]); \ + G(r, 4, v[0], v[5], v[10], v[15]); \ + G(r, 5, v[1], v[6], v[11], v[12]); \ + G(r, 6, v[2], v[7], v[8], v[13]); \ + G(r, 7, v[3], v[4], v[9], v[14]); \ + } while ((void)0, 0) + + for (r = 0; r < 12; ++r) { + ROUND(r); + } + + for (i = 0; i < 8; ++i) { + S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; + } + +#undef G +#undef ROUND +} + +int blake2b_update(blake2b_state *S, const void *in, size_t inlen) { + const uint8_t *pin = (const uint8_t *)in; + + if (inlen == 0) { + return 0; + } + + /* Sanity check */ + if (S == NULL || in == NULL) { + return -1; + } + + /* Is this a reused state? */ + if (S->f[0] != 0) { + return -1; + } + + if (S->buflen + inlen > BLAKE2B_BLOCKBYTES) { + /* Complete current block */ + size_t left = S->buflen; + size_t fill = BLAKE2B_BLOCKBYTES - left; + memcpy(&S->buf[left], pin, fill); + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress(S, S->buf); + S->buflen = 0; + inlen -= fill; + pin += fill; + /* Avoid buffer copies when possible */ + while (inlen > BLAKE2B_BLOCKBYTES) { + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress(S, pin); + inlen -= BLAKE2B_BLOCKBYTES; + pin += BLAKE2B_BLOCKBYTES; + } + } + memcpy(&S->buf[S->buflen], pin, inlen); + S->buflen += (unsigned int)inlen; + return 0; +} + +int blake2b_final(blake2b_state *S, void *out, size_t outlen) { + uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; + unsigned int i; + + /* Sanity checks */ + if (S == NULL || out == NULL || outlen < S->outlen) { + return -1; + } + + /* Is this a reused state? */ + if (S->f[0] != 0) { + return -1; + } + + blake2b_increment_counter(S, S->buflen); + blake2b_set_lastblock(S); + memset(&S->buf[S->buflen], 0, BLAKE2B_BLOCKBYTES - S->buflen); /* Padding */ + blake2b_compress(S, S->buf); + + for (i = 0; i < 8; ++i) { /* Output full hash to temp buffer */ + store64(buffer + sizeof(S->h[i]) * i, S->h[i]); + } + + memcpy(out, buffer, S->outlen); +// clear_internal_memory(buffer, sizeof(buffer)); +// clear_internal_memory(S->buf, sizeof(S->buf)); +// clear_internal_memory(S->h, sizeof(S->h)); + return 0; +} + +int blake2b(void *out, size_t outlen, const void *in, size_t inlen, + const void *key, size_t keylen) { + blake2b_state S; + int ret = -1; + + /* Verify parameters */ + if (NULL == in && inlen > 0) { + goto fail; + } + + if (NULL == out || outlen == 0 || outlen > BLAKE2B_OUTBYTES) { + goto fail; + } + + if ((NULL == key && keylen > 0) || keylen > BLAKE2B_KEYBYTES) { + goto fail; + } + + if (keylen > 0) { + if (blake2b_init_key(&S, outlen, key, keylen) < 0) { + goto fail; + } + } else { + if (blake2b_init(&S, outlen) < 0) { + goto fail; + } + } + + if (blake2b_update(&S, in, inlen) < 0) { + goto fail; + } + ret = blake2b_final(&S, out, outlen); + +fail: +// clear_internal_memory(&S, sizeof(S)); + return ret; +} + +/* Argon2 Team - Begin Code */ +int blake2b_long(void *pout, size_t outlen, const void *in, size_t inlen) { + uint8_t *out = (uint8_t *)pout; + blake2b_state blake_state; + uint8_t outlen_bytes[sizeof(uint32_t)] = {0}; + int ret = -1; + + if (outlen > UINT32_MAX) { + goto fail; + } + + /* Ensure little-endian byte order! */ + store32(outlen_bytes, (uint32_t)outlen); + +#define TRY(statement) \ + do { \ + ret = statement; \ + if (ret < 0) { \ + goto fail; \ + } \ + } while ((void)0, 0) + + if (outlen <= BLAKE2B_OUTBYTES) { + TRY(blake2b_init(&blake_state, outlen)); + TRY(blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes))); + TRY(blake2b_update(&blake_state, in, inlen)); + TRY(blake2b_final(&blake_state, out, outlen)); + } else { + uint32_t toproduce; + uint8_t out_buffer[BLAKE2B_OUTBYTES]; + uint8_t in_buffer[BLAKE2B_OUTBYTES]; + TRY(blake2b_init(&blake_state, BLAKE2B_OUTBYTES)); + TRY(blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes))); + TRY(blake2b_update(&blake_state, in, inlen)); + TRY(blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES)); + memcpy(out, out_buffer, BLAKE2B_OUTBYTES / 2); + out += BLAKE2B_OUTBYTES / 2; + toproduce = (uint32_t)outlen - BLAKE2B_OUTBYTES / 2; + + while (toproduce > BLAKE2B_OUTBYTES) { + memcpy(in_buffer, out_buffer, BLAKE2B_OUTBYTES); + TRY(blake2b(out_buffer, BLAKE2B_OUTBYTES, in_buffer, + BLAKE2B_OUTBYTES, NULL, 0)); + memcpy(out, out_buffer, BLAKE2B_OUTBYTES / 2); + out += BLAKE2B_OUTBYTES / 2; + toproduce -= BLAKE2B_OUTBYTES / 2; + } + + memcpy(in_buffer, out_buffer, BLAKE2B_OUTBYTES); + TRY(blake2b(out_buffer, toproduce, in_buffer, BLAKE2B_OUTBYTES, NULL, + 0)); + memcpy(out, out_buffer, toproduce); + } +fail: +// clear_internal_memory(&blake_state, sizeof(blake_state)); + return ret; +#undef TRY +} +/* Argon2 Team - End Code */ diff --git a/deps/phc-winner-argon2-20190702/_hashcat/blake2/blamka-round-opt.h b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blamka-round-opt.h new file mode 100644 index 000000000..37a9e7eb2 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/blake2/blamka-round-opt.h @@ -0,0 +1,476 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef BLAKE_ROUND_MKA_OPT_H +#define BLAKE_ROUND_MKA_OPT_H + +#include "blake2-impl.h" + +#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) +#include +#elif defined(__aarch64__) +#include +#endif + +#if defined(__SSSE3__) +#include /* for _mm_shuffle_epi8 and _mm_alignr_epi8 */ +#endif + +#if defined(__XOP__) && (defined(__GNUC__) || defined(__clang__)) +#include +#endif + +#if !defined(__AVX512F__) +#if !defined(__AVX2__) +#if !defined(__XOP__) +#if defined(__SSSE3__) +#define r16 \ + (_mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) +#define r24 \ + (_mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) +#define _mm_roti_epi64(x, c) \ + (-(c) == 32) \ + ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1)) \ + : (-(c) == 24) \ + ? _mm_shuffle_epi8((x), r24) \ + : (-(c) == 16) \ + ? _mm_shuffle_epi8((x), r16) \ + : (-(c) == 63) \ + ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ + _mm_add_epi64((x), (x))) \ + : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ + _mm_slli_epi64((x), 64 - (-(c)))) +#else /* defined(__SSE2__) */ +#define _mm_roti_epi64(r, c) \ + _mm_xor_si128(_mm_srli_epi64((r), -(c)), _mm_slli_epi64((r), 64 - (-(c)))) +#endif +#else +#endif + +static BLAKE2_INLINE __m128i fBlaMka(__m128i x, __m128i y) { + const __m128i z = _mm_mul_epu32(x, y); + return _mm_add_epi64(_mm_add_epi64(x, y), _mm_add_epi64(z, z)); +} + +#define G1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = fBlaMka(A0, B0); \ + A1 = fBlaMka(A1, B1); \ + \ + D0 = _mm_xor_si128(D0, A0); \ + D1 = _mm_xor_si128(D1, A1); \ + \ + D0 = _mm_roti_epi64(D0, -32); \ + D1 = _mm_roti_epi64(D1, -32); \ + \ + C0 = fBlaMka(C0, D0); \ + C1 = fBlaMka(C1, D1); \ + \ + B0 = _mm_xor_si128(B0, C0); \ + B1 = _mm_xor_si128(B1, C1); \ + \ + B0 = _mm_roti_epi64(B0, -24); \ + B1 = _mm_roti_epi64(B1, -24); \ + } while ((void)0, 0) + +#define G2(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = fBlaMka(A0, B0); \ + A1 = fBlaMka(A1, B1); \ + \ + D0 = _mm_xor_si128(D0, A0); \ + D1 = _mm_xor_si128(D1, A1); \ + \ + D0 = _mm_roti_epi64(D0, -16); \ + D1 = _mm_roti_epi64(D1, -16); \ + \ + C0 = fBlaMka(C0, D0); \ + C1 = fBlaMka(C1, D1); \ + \ + B0 = _mm_xor_si128(B0, C0); \ + B1 = _mm_xor_si128(B1, C1); \ + \ + B0 = _mm_roti_epi64(B0, -63); \ + B1 = _mm_roti_epi64(B1, -63); \ + } while ((void)0, 0) + +#if defined(__SSSE3__) +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = _mm_alignr_epi8(B1, B0, 8); \ + __m128i t1 = _mm_alignr_epi8(B0, B1, 8); \ + B0 = t0; \ + B1 = t1; \ + \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + \ + t0 = _mm_alignr_epi8(D1, D0, 8); \ + t1 = _mm_alignr_epi8(D0, D1, 8); \ + D0 = t1; \ + D1 = t0; \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = _mm_alignr_epi8(B0, B1, 8); \ + __m128i t1 = _mm_alignr_epi8(B1, B0, 8); \ + B0 = t0; \ + B1 = t1; \ + \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + \ + t0 = _mm_alignr_epi8(D0, D1, 8); \ + t1 = _mm_alignr_epi8(D1, D0, 8); \ + D0 = t1; \ + D1 = t0; \ + } while ((void)0, 0) +#else /* SSE2 */ +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = D0; \ + __m128i t1 = B0; \ + D0 = C0; \ + C0 = C1; \ + C1 = D0; \ + D0 = _mm_unpackhi_epi64(D1, _mm_unpacklo_epi64(t0, t0)); \ + D1 = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(D1, D1)); \ + B0 = _mm_unpackhi_epi64(B0, _mm_unpacklo_epi64(B1, B1)); \ + B1 = _mm_unpackhi_epi64(B1, _mm_unpacklo_epi64(t1, t1)); \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0, t1; \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + t0 = B0; \ + t1 = D0; \ + B0 = _mm_unpackhi_epi64(B1, _mm_unpacklo_epi64(B0, B0)); \ + B1 = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(B1, B1)); \ + D0 = _mm_unpackhi_epi64(D0, _mm_unpacklo_epi64(D1, D1)); \ + D1 = _mm_unpackhi_epi64(D1, _mm_unpacklo_epi64(t1, t1)); \ + } while ((void)0, 0) +#endif + +#define BLAKE2_ROUND(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + } while ((void)0, 0) +#else /* __AVX2__ */ + +#include + +#define rotr32(x) _mm256_shuffle_epi32(x, _MM_SHUFFLE(2, 3, 0, 1)) +#define rotr24(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10, 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) +#define rotr16(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9, 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) +#define rotr63(x) _mm256_xor_si256(_mm256_srli_epi64((x), 63), _mm256_add_epi64((x), (x))) + +#define G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i ml = _mm256_mul_epu32(A0, B0); \ + ml = _mm256_add_epi64(ml, ml); \ + A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ + D0 = _mm256_xor_si256(D0, A0); \ + D0 = rotr32(D0); \ + \ + ml = _mm256_mul_epu32(C0, D0); \ + ml = _mm256_add_epi64(ml, ml); \ + C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ + \ + B0 = _mm256_xor_si256(B0, C0); \ + B0 = rotr24(B0); \ + \ + ml = _mm256_mul_epu32(A1, B1); \ + ml = _mm256_add_epi64(ml, ml); \ + A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ + D1 = _mm256_xor_si256(D1, A1); \ + D1 = rotr32(D1); \ + \ + ml = _mm256_mul_epu32(C1, D1); \ + ml = _mm256_add_epi64(ml, ml); \ + C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ + \ + B1 = _mm256_xor_si256(B1, C1); \ + B1 = rotr24(B1); \ + } while((void)0, 0); + +#define G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i ml = _mm256_mul_epu32(A0, B0); \ + ml = _mm256_add_epi64(ml, ml); \ + A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ + D0 = _mm256_xor_si256(D0, A0); \ + D0 = rotr16(D0); \ + \ + ml = _mm256_mul_epu32(C0, D0); \ + ml = _mm256_add_epi64(ml, ml); \ + C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ + B0 = _mm256_xor_si256(B0, C0); \ + B0 = rotr63(B0); \ + \ + ml = _mm256_mul_epu32(A1, B1); \ + ml = _mm256_add_epi64(ml, ml); \ + A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ + D1 = _mm256_xor_si256(D1, A1); \ + D1 = rotr16(D1); \ + \ + ml = _mm256_mul_epu32(C1, D1); \ + ml = _mm256_add_epi64(ml, ml); \ + C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ + B1 = _mm256_xor_si256(B1, C1); \ + B1 = rotr63(B1); \ + } while((void)0, 0); + +#define DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ + C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ + \ + B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ + C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ + D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ + } while((void)0, 0); + +#define DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ + __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ + B1 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + B0 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + \ + tmp1 = C0; \ + C0 = C1; \ + C1 = tmp1; \ + \ + tmp1 = _mm256_blend_epi32(D0, D1, 0xCC); \ + tmp2 = _mm256_blend_epi32(D0, D1, 0x33); \ + D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + } while(0); + +#define UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ + C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ + \ + B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ + C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ + D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ + } while((void)0, 0); + +#define UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ + __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ + B0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + B1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + \ + tmp1 = C0; \ + C0 = C1; \ + C1 = tmp1; \ + \ + tmp1 = _mm256_blend_epi32(D0, D1, 0x33); \ + tmp2 = _mm256_blend_epi32(D0, D1, 0xCC); \ + D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + } while((void)0, 0); + +#define BLAKE2_ROUND_1(A0, A1, B0, B1, C0, C1, D0, D1) \ + do{ \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + } while((void)0, 0); + +#define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do{ \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + } while((void)0, 0); + +#endif /* __AVX2__ */ + +#else /* __AVX512F__ */ + +#include + +#define ror64(x, n) _mm512_ror_epi64((x), (n)) + +static __m512i muladd(__m512i x, __m512i y) +{ + __m512i z = _mm512_mul_epu32(x, y); + return _mm512_add_epi64(_mm512_add_epi64(x, y), _mm512_add_epi64(z, z)); +} + +#define G1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = muladd(A0, B0); \ + A1 = muladd(A1, B1); \ +\ + D0 = _mm512_xor_si512(D0, A0); \ + D1 = _mm512_xor_si512(D1, A1); \ +\ + D0 = ror64(D0, 32); \ + D1 = ror64(D1, 32); \ +\ + C0 = muladd(C0, D0); \ + C1 = muladd(C1, D1); \ +\ + B0 = _mm512_xor_si512(B0, C0); \ + B1 = _mm512_xor_si512(B1, C1); \ +\ + B0 = ror64(B0, 24); \ + B1 = ror64(B1, 24); \ + } while ((void)0, 0) + +#define G2(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = muladd(A0, B0); \ + A1 = muladd(A1, B1); \ +\ + D0 = _mm512_xor_si512(D0, A0); \ + D1 = _mm512_xor_si512(D1, A1); \ +\ + D0 = ror64(D0, 16); \ + D1 = ror64(D1, 16); \ +\ + C0 = muladd(C0, D0); \ + C1 = muladd(C1, D1); \ +\ + B0 = _mm512_xor_si512(B0, C0); \ + B1 = _mm512_xor_si512(B1, C1); \ +\ + B0 = ror64(B0, 63); \ + B1 = ror64(B1, 63); \ + } while ((void)0, 0) + +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ + B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ +\ + C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ +\ + D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ + D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ + B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ +\ + C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ +\ + D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ + D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ + } while ((void)0, 0) + +#define BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + } while ((void)0, 0) + +#define SWAP_HALVES(A0, A1) \ + do { \ + __m512i t0, t1; \ + t0 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(1, 0, 1, 0)); \ + t1 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(3, 2, 3, 2)); \ + A0 = t0; \ + A1 = t1; \ + } while((void)0, 0) + +#define SWAP_QUARTERS(A0, A1) \ + do { \ + SWAP_HALVES(A0, A1); \ + A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ + A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ + } while((void)0, 0) + +#define UNSWAP_QUARTERS(A0, A1) \ + do { \ + A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ + A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ + SWAP_HALVES(A0, A1); \ + } while((void)0, 0) + +#define BLAKE2_ROUND_1(A0, C0, B0, D0, A1, C1, B1, D1) \ + do { \ + SWAP_HALVES(A0, B0); \ + SWAP_HALVES(C0, D0); \ + SWAP_HALVES(A1, B1); \ + SWAP_HALVES(C1, D1); \ + BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ + SWAP_HALVES(A0, B0); \ + SWAP_HALVES(C0, D0); \ + SWAP_HALVES(A1, B1); \ + SWAP_HALVES(C1, D1); \ + } while ((void)0, 0) + +#define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + SWAP_QUARTERS(A0, A1); \ + SWAP_QUARTERS(B0, B1); \ + SWAP_QUARTERS(C0, C1); \ + SWAP_QUARTERS(D0, D1); \ + BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ + UNSWAP_QUARTERS(A0, A1); \ + UNSWAP_QUARTERS(B0, B1); \ + UNSWAP_QUARTERS(C0, C1); \ + UNSWAP_QUARTERS(D0, D1); \ + } while ((void)0, 0) + +#endif /* __AVX512F__ */ +#endif /* BLAKE_ROUND_MKA_OPT_H */ diff --git a/deps/phc-winner-argon2-20190702/_hashcat/core.c b/deps/phc-winner-argon2-20190702/_hashcat/core.c new file mode 100644 index 000000000..456a78e6f --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/core.c @@ -0,0 +1,320 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +/*For memory wiping*/ +#ifdef _MSC_VER +#include +#include /* For SecureZeroMemory */ +#endif +#if defined __STDC_LIB_EXT1__ +#define __STDC_WANT_LIB_EXT1__ 1 +#endif +#define VC_GE_2005(version) (version >= 1400) + +/* for explicit_bzero() on glibc */ +#define _DEFAULT_SOURCE + +#include +#include +#include + +#include "core.h" + +#include "blake2/blake2.h" +#include "blake2/blake2-impl.h" + + + +#if defined(__clang__) +#if __has_attribute(optnone) +#define NOT_OPTIMIZED __attribute__((optnone)) +#endif +#elif defined(__GNUC__) +#define GCC_VERSION \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#if GCC_VERSION >= 40400 +#define NOT_OPTIMIZED __attribute__((optimize("O0"))) +#endif +#endif +#ifndef NOT_OPTIMIZED +#define NOT_OPTIMIZED +#endif + +/***************Instance and Position constructors**********/ +void init_block_value(block *b, uint8_t in) { memset(b->v, in, sizeof(b->v)); } + +void copy_block(block *dst, const block *src) { + memcpy(dst->v, src->v, sizeof(uint64_t) * ARGON2_QWORDS_IN_BLOCK); +} + +void xor_block(block *dst, const block *src) { + int i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + dst->v[i] ^= src->v[i]; + } +} + +static void load_block(block *dst, const void *input) { + unsigned i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + dst->v[i] = load64((const uint8_t *)input + i * sizeof(dst->v[i])); + } +} + +static void store_block(void *output, const block *src) { + unsigned i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + store64((uint8_t *)output + i * sizeof(src->v[i]), src->v[i]); + } +} + +/***************Memory functions*****************/ + + + +void finalize(const argon2_context *context, argon2_instance_t *instance) { + if (context != NULL && instance != NULL) { + block blockhash; + uint32_t l; + + copy_block(&blockhash, instance->memory + instance->lane_length - 1); + + /* XOR the last blocks */ + for (l = 1; l < instance->lanes; ++l) { + uint32_t last_block_in_lane = + l * instance->lane_length + (instance->lane_length - 1); + xor_block(&blockhash, instance->memory + last_block_in_lane); + } + + /* Hash the result */ + { + uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; + store_block(blockhash_bytes, &blockhash); + blake2b_long(context->out, context->outlen, blockhash_bytes, + ARGON2_BLOCK_SIZE); + + } + + + } +} + +uint32_t index_alpha(const argon2_instance_t *instance, + const argon2_position_t *position, uint32_t pseudo_rand, + int same_lane) { + /* + * Pass 0: + * This lane : all already finished segments plus already constructed + * blocks in this segment + * Other lanes : all already finished segments + * Pass 1+: + * This lane : (SYNC_POINTS - 1) last segments plus already constructed + * blocks in this segment + * Other lanes : (SYNC_POINTS - 1) last segments + */ + uint32_t reference_area_size; + uint64_t relative_position; + uint32_t start_position, absolute_position; + + if (0 == position->pass) { + /* First pass */ + if (0 == position->slice) { + /* First slice */ + reference_area_size = + position->index - 1; /* all but the previous */ + } else { + if (same_lane) { + /* The same lane => add current segment */ + reference_area_size = + position->slice * instance->segment_length + + position->index - 1; + } else { + reference_area_size = + position->slice * instance->segment_length + + ((position->index == 0) ? (-1) : 0); + } + } + } else { + /* Second pass */ + if (same_lane) { + reference_area_size = instance->lane_length - + instance->segment_length + position->index - + 1; + } else { + reference_area_size = instance->lane_length - + instance->segment_length + + ((position->index == 0) ? (-1) : 0); + } + } + + /* 1.2.4. Mapping pseudo_rand to 0.. and produce + * relative position */ + relative_position = pseudo_rand; + relative_position = relative_position * relative_position >> 32; + relative_position = reference_area_size - 1 - + (reference_area_size * relative_position >> 32); + + /* 1.2.5 Computing starting position */ + start_position = 0; + + if (0 != position->pass) { + start_position = (position->slice == ARGON2_SYNC_POINTS - 1) + ? 0 + : (position->slice + 1) * instance->segment_length; + } + + /* 1.2.6. Computing absolute position */ + absolute_position = (start_position + relative_position) % + instance->lane_length; /* absolute position */ + return absolute_position; +} + +/* Single-threaded version for p=1 case */ +int fill_memory_blocks(argon2_instance_t *instance) { + uint32_t r, s, l; + + for (r = 0; r < instance->passes; ++r) { + for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { + for (l = 0; l < instance->lanes; ++l) { + argon2_position_t position = {r, l, (uint8_t)s, 0}; + fill_segment(instance, position); + } + } + + } + return ARGON2_OK; +} + + + +void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) { + uint32_t l; + /* Make the first and second block in each lane as G(H0||0||i) or + G(H0||1||i) */ + uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; + for (l = 0; l < instance->lanes; ++l) { + + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0); + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l); + blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, + ARGON2_PREHASH_SEED_LENGTH); + load_block(&instance->memory[l * instance->lane_length + 0], + blockhash_bytes); + + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1); + blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, + ARGON2_PREHASH_SEED_LENGTH); + load_block(&instance->memory[l * instance->lane_length + 1], + blockhash_bytes); + } + +} + +void initial_hash(uint8_t *blockhash, argon2_context *context, + argon2_type type) { + blake2b_state BlakeHash; + uint8_t value[sizeof(uint32_t)]; + + if (NULL == context || NULL == blockhash) { + return; + } + + blake2b_init(&BlakeHash, ARGON2_PREHASH_DIGEST_LENGTH); + + store32(&value, context->lanes); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->outlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->m_cost); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->t_cost); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->version); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, (uint32_t)type); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->pwdlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->pwd != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->pwd, + context->pwdlen); + + + } + + store32(&value, context->saltlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->salt != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->salt, + context->saltlen); + } + + store32(&value, context->secretlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->secret != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->secret, + context->secretlen); + + + } + + store32(&value, context->adlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->ad != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->ad, + context->adlen); + } + + blake2b_final(&BlakeHash, blockhash, ARGON2_PREHASH_DIGEST_LENGTH); +} + +int initialize(argon2_instance_t *instance, argon2_context *context) { + uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; + + + + instance->context_ptr = context; + + /* 1. Memory allocation */ + + instance->memory = context->memory; + + + /* 2. Initial hashing */ + /* H_0 + 8 extra bytes to produce the first blocks */ + /* uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; */ + /* Hashing all inputs */ + initial_hash(blockhash, context, instance->type); + /* Zeroing 8 extra bytes */ + + + /* 3. Creating first blocks, we always have at least two blocks in a slice + */ + fill_first_blocks(blockhash, instance); + + return ARGON2_OK; +} diff --git a/deps/phc-winner-argon2-20190702/_hashcat/core.h b/deps/phc-winner-argon2-20190702/_hashcat/core.h new file mode 100644 index 000000000..78000ba9e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/core.h @@ -0,0 +1,228 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_CORE_H +#define ARGON2_CORE_H + +#include "argon2.h" + +#define CONST_CAST(x) (x)(uintptr_t) + +/**********************Argon2 internal constants*******************************/ + +enum argon2_core_constants { + /* Memory block size in bytes */ + ARGON2_BLOCK_SIZE = 1024, + ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 8, + ARGON2_OWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 16, + ARGON2_HWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 32, + ARGON2_512BIT_WORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 64, + + /* Number of pseudo-random values generated by one call to Blake in Argon2i + to + generate reference block positions */ + ARGON2_ADDRESSES_IN_BLOCK = 128, + + /* Pre-hashing digest length and its extension*/ + ARGON2_PREHASH_DIGEST_LENGTH = 64, + ARGON2_PREHASH_SEED_LENGTH = 72 +}; + +/*************************Argon2 internal data types***********************/ + +/* + * Structure for the (1KB) memory block implemented as 128 64-bit words. + * Memory blocks can be copied, XORed. Internal words can be accessed by [] (no + * bounds checking). + */ +typedef struct block_ { uint64_t v[ARGON2_QWORDS_IN_BLOCK]; } block; + +/*****************Functions that work with the block******************/ + +/* Initialize each byte of the block with @in */ +void init_block_value(block *b, uint8_t in); + +/* Copy block @src to block @dst */ +void copy_block(block *dst, const block *src); + +/* XOR @src onto @dst bytewise */ +void xor_block(block *dst, const block *src); + +/* + * Argon2 instance: memory pointer, number of passes, amount of memory, type, + * and derived values. + * Used to evaluate the number and location of blocks to construct in each + * thread + */ +typedef struct Argon2_instance_t { + block *memory; /* Memory pointer */ + uint32_t version; + uint32_t passes; /* Number of passes */ + uint32_t memory_blocks; /* Number of blocks in memory */ + uint32_t segment_length; + uint32_t lane_length; + uint32_t lanes; + uint32_t threads; + argon2_type type; + int print_internals; /* whether to print the memory blocks */ + argon2_context *context_ptr; /* points back to original context */ +} argon2_instance_t; + +/* + * Argon2 position: where we construct the block right now. Used to distribute + * work between threads. + */ +typedef struct Argon2_position_t { + uint32_t pass; + uint32_t lane; + uint8_t slice; + uint32_t index; +} argon2_position_t; + +/*Struct that holds the inputs for thread handling FillSegment*/ +typedef struct Argon2_thread_data { + argon2_instance_t *instance_ptr; + argon2_position_t pos; +} argon2_thread_data; + +/*************************Argon2 core functions********************************/ + +/* Allocates memory to the given pointer, uses the appropriate allocator as + * specified in the context. Total allocated memory is num*size. + * @param context argon2_context which specifies the allocator + * @param memory pointer to the pointer to the memory + * @param size the size in bytes for each element to be allocated + * @param num the number of elements to be allocated + * @return ARGON2_OK if @memory is a valid pointer and memory is allocated + */ +int allocate_memory(const argon2_context *context, uint8_t **memory, + size_t num, size_t size); + +/* + * Frees memory at the given pointer, uses the appropriate deallocator as + * specified in the context. Also cleans the memory using clear_internal_memory. + * @param context argon2_context which specifies the deallocator + * @param memory pointer to buffer to be freed + * @param size the size in bytes for each element to be deallocated + * @param num the number of elements to be deallocated + */ +void free_memory(const argon2_context *context, uint8_t *memory, + size_t num, size_t size); + +/* Function that securely cleans the memory. This ignores any flags set + * regarding clearing memory. Usually one just calls clear_internal_memory. + * @param mem Pointer to the memory + * @param s Memory size in bytes + */ +void secure_wipe_memory(void *v, size_t n); + +/* Function that securely clears the memory if FLAG_clear_internal_memory is + * set. If the flag isn't set, this function does nothing. + * @param mem Pointer to the memory + * @param s Memory size in bytes + */ +void clear_internal_memory(void *v, size_t n); + +/* + * Computes absolute position of reference block in the lane following a skewed + * distribution and using a pseudo-random value as input + * @param instance Pointer to the current instance + * @param position Pointer to the current position + * @param pseudo_rand 32-bit pseudo-random value used to determine the position + * @param same_lane Indicates if the block will be taken from the current lane. + * If so we can reference the current segment + * @pre All pointers must be valid + */ +uint32_t index_alpha(const argon2_instance_t *instance, + const argon2_position_t *position, uint32_t pseudo_rand, + int same_lane); + +/* + * Function that validates all inputs against predefined restrictions and return + * an error code + * @param context Pointer to current Argon2 context + * @return ARGON2_OK if everything is all right, otherwise one of error codes + * (all defined in + */ +int validate_inputs(const argon2_context *context); + +/* + * Hashes all the inputs into @a blockhash[PREHASH_DIGEST_LENGTH], clears + * password and secret if needed + * @param context Pointer to the Argon2 internal structure containing memory + * pointer, and parameters for time and space requirements. + * @param blockhash Buffer for pre-hashing digest + * @param type Argon2 type + * @pre @a blockhash must have at least @a PREHASH_DIGEST_LENGTH bytes + * allocated + */ +void initial_hash(uint8_t *blockhash, argon2_context *context, + argon2_type type); + +/* + * Function creates first 2 blocks per lane + * @param instance Pointer to the current instance + * @param blockhash Pointer to the pre-hashing digest + * @pre blockhash must point to @a PREHASH_SEED_LENGTH allocated values + */ +void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance); + +/* + * Function allocates memory, hashes the inputs with Blake, and creates first + * two blocks. Returns the pointer to the main memory with 2 blocks per lane + * initialized + * @param context Pointer to the Argon2 internal structure containing memory + * pointer, and parameters for time and space requirements. + * @param instance Current Argon2 instance + * @return Zero if successful, -1 if memory failed to allocate. @context->state + * will be modified if successful. + */ +int initialize(argon2_instance_t *instance, argon2_context *context); + +/* + * XORing the last block of each lane, hashing it, making the tag. Deallocates + * the memory. + * @param context Pointer to current Argon2 context (use only the out parameters + * from it) + * @param instance Pointer to current instance of Argon2 + * @pre instance->state must point to necessary amount of memory + * @pre context->out must point to outlen bytes of memory + * @pre if context->free_cbk is not NULL, it should point to a function that + * deallocates memory + */ +void finalize(const argon2_context *context, argon2_instance_t *instance); + +/* + * Function that fills the segment using previous segments also from other + * threads + * @param context current context + * @param instance Pointer to the current instance + * @param position Current position + * @pre all block pointers must be valid + */ +void fill_segment(const argon2_instance_t *instance, + argon2_position_t position); + +/* + * Function that fills the entire memory t_cost times based on the first two + * blocks in each lane + * @param instance Pointer to the current instance + * @return ARGON2_OK if successful, @context->state + */ +int fill_memory_blocks(argon2_instance_t *instance); + +#endif diff --git a/deps/phc-winner-argon2-20190702/_hashcat/opt.c b/deps/phc-winner-argon2-20190702/_hashcat/opt.c new file mode 100644 index 000000000..f6c20528e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/_hashcat/opt.c @@ -0,0 +1,283 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "argon2.h" +#include "core.h" + +#include "blake2/blake2.h" +#include "blake2/blamka-round-opt.h" + +/* + * Function fills a new memory block and optionally XORs the old block over the new one. + * Memory must be initialized. + * @param state Pointer to the just produced block. Content will be updated(!) + * @param ref_block Pointer to the reference block + * @param next_block Pointer to the block to be XORed over. May coincide with @ref_block + * @param with_xor Whether to XOR into the new block (1) or just overwrite (0) + * @pre all block pointers must be valid + */ +#if defined(__AVX512F__) +static void fill_block(__m512i *state, const block *ref_block, + block *next_block, int with_xor) { + __m512i block_XY[ARGON2_512BIT_WORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + state[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)ref_block->v + i)); + block_XY[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)ref_block->v + i)); + } + } + + for (i = 0; i < 2; ++i) { + BLAKE2_ROUND_1( + state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], state[8 * i + 3], + state[8 * i + 4], state[8 * i + 5], state[8 * i + 6], state[8 * i + 7]); + } + + for (i = 0; i < 2; ++i) { + BLAKE2_ROUND_2( + state[2 * 0 + i], state[2 * 1 + i], state[2 * 2 + i], state[2 * 3 + i], + state[2 * 4 + i], state[2 * 5 + i], state[2 * 6 + i], state[2 * 7 + i]); + } + + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + state[i] = _mm512_xor_si512(state[i], block_XY[i]); + _mm512_storeu_si512((__m512i *)next_block->v + i, state[i]); + } +} +#elif defined(__AVX2__) +static void fill_block(__m256i *state, const block *ref_block, + block *next_block, int with_xor) { + __m256i block_XY[ARGON2_HWORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + state[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)ref_block->v + i)); + block_XY[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)ref_block->v + i)); + } + } + + for (i = 0; i < 4; ++i) { + BLAKE2_ROUND_1(state[8 * i + 0], state[8 * i + 4], state[8 * i + 1], state[8 * i + 5], + state[8 * i + 2], state[8 * i + 6], state[8 * i + 3], state[8 * i + 7]); + } + + for (i = 0; i < 4; ++i) { + BLAKE2_ROUND_2(state[ 0 + i], state[ 4 + i], state[ 8 + i], state[12 + i], + state[16 + i], state[20 + i], state[24 + i], state[28 + i]); + } + + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + state[i] = _mm256_xor_si256(state[i], block_XY[i]); + _mm256_storeu_si256((__m256i *)next_block->v + i, state[i]); + } +} +#else +static void fill_block(__m128i *state, const block *ref_block, + block *next_block, int with_xor) { + __m128i block_XY[ARGON2_OWORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + state[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)ref_block->v + i)); + block_XY[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)ref_block->v + i)); + } + } + + for (i = 0; i < 8; ++i) { + BLAKE2_ROUND(state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], + state[8 * i + 3], state[8 * i + 4], state[8 * i + 5], + state[8 * i + 6], state[8 * i + 7]); + } + + for (i = 0; i < 8; ++i) { + BLAKE2_ROUND(state[8 * 0 + i], state[8 * 1 + i], state[8 * 2 + i], + state[8 * 3 + i], state[8 * 4 + i], state[8 * 5 + i], + state[8 * 6 + i], state[8 * 7 + i]); + } + + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + state[i] = _mm_xor_si128(state[i], block_XY[i]); + _mm_storeu_si128((__m128i *)next_block->v + i, state[i]); + } +} +#endif + +static void next_addresses(block *address_block, block *input_block) { + /*Temporary zero-initialized blocks*/ +#if defined(__AVX512F__) + __m512i zero_block[ARGON2_512BIT_WORDS_IN_BLOCK]; + __m512i zero2_block[ARGON2_512BIT_WORDS_IN_BLOCK]; +#elif defined(__AVX2__) + __m256i zero_block[ARGON2_HWORDS_IN_BLOCK]; + __m256i zero2_block[ARGON2_HWORDS_IN_BLOCK]; +#else + __m128i zero_block[ARGON2_OWORDS_IN_BLOCK]; + __m128i zero2_block[ARGON2_OWORDS_IN_BLOCK]; +#endif + + memset(zero_block, 0, sizeof(zero_block)); + memset(zero2_block, 0, sizeof(zero2_block)); + + /*Increasing index counter*/ + input_block->v[6]++; + + /*First iteration of G*/ + fill_block(zero_block, input_block, address_block, 0); + + /*Second iteration of G*/ + fill_block(zero2_block, address_block, address_block, 0); +} + +void fill_segment(const argon2_instance_t *instance, + argon2_position_t position) { + block *ref_block = NULL, *curr_block = NULL; + block address_block, input_block; + uint64_t pseudo_rand, ref_index, ref_lane; + uint32_t prev_offset, curr_offset; + uint32_t starting_index, i; +#if defined(__AVX512F__) + __m512i state[ARGON2_512BIT_WORDS_IN_BLOCK]; +#elif defined(__AVX2__) + __m256i state[ARGON2_HWORDS_IN_BLOCK]; +#else + __m128i state[ARGON2_OWORDS_IN_BLOCK]; +#endif + int data_independent_addressing; + + if (instance == NULL) { + return; + } + + data_independent_addressing = + (instance->type == Argon2_i) || + (instance->type == Argon2_id && (position.pass == 0) && + (position.slice < ARGON2_SYNC_POINTS / 2)); + + if (data_independent_addressing) { + init_block_value(&input_block, 0); + + input_block.v[0] = position.pass; + input_block.v[1] = position.lane; + input_block.v[2] = position.slice; + input_block.v[3] = instance->memory_blocks; + input_block.v[4] = instance->passes; + input_block.v[5] = instance->type; + } + + starting_index = 0; + + if ((0 == position.pass) && (0 == position.slice)) { + starting_index = 2; /* we have already generated the first two blocks */ + + /* Don't forget to generate the first block of addresses: */ + if (data_independent_addressing) { + next_addresses(&address_block, &input_block); + } + } + + /* Offset of the current block */ + curr_offset = position.lane * instance->lane_length + + position.slice * instance->segment_length + starting_index; + + if (0 == curr_offset % instance->lane_length) { + /* Last block in this lane */ + prev_offset = curr_offset + instance->lane_length - 1; + } else { + /* Previous block */ + prev_offset = curr_offset - 1; + } + + memcpy(state, ((instance->memory + prev_offset)->v), ARGON2_BLOCK_SIZE); + + for (i = starting_index; i < instance->segment_length; + ++i, ++curr_offset, ++prev_offset) { + /*1.1 Rotating prev_offset if needed */ + if (curr_offset % instance->lane_length == 1) { + prev_offset = curr_offset - 1; + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + if (data_independent_addressing) { + if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { + next_addresses(&address_block, &input_block); + } + pseudo_rand = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; + } else { + pseudo_rand = instance->memory[prev_offset].v[0]; + } + + /* 1.2.2 Computing the lane of the reference block */ + ref_lane = ((pseudo_rand >> 32)) % instance->lanes; + + if ((position.pass == 0) && (position.slice == 0)) { + /* Can not reference other lanes yet */ + ref_lane = position.lane; + } + + /* 1.2.3 Computing the number of possible reference block within the + * lane. + */ + position.index = i; + ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, + ref_lane == position.lane); + + /* 2 Creating a new block */ + ref_block = + instance->memory + instance->lane_length * ref_lane + ref_index; + curr_block = instance->memory + curr_offset; + if (ARGON2_VERSION_10 == instance->version) { + /* version 1.2.1 and earlier: overwrite, not XOR */ + fill_block(state, ref_block, curr_block, 0); + } else { + if(0 == position.pass) { + fill_block(state, ref_block, curr_block, 0); + } else { + fill_block(state, ref_block, curr_block, 1); + } + } + } +} diff --git a/deps/phc-winner-argon2-20190702/argon2-specs.pdf b/deps/phc-winner-argon2-20190702/argon2-specs.pdf new file mode 100644 index 000000000..220b3f8df --- /dev/null +++ b/deps/phc-winner-argon2-20190702/argon2-specs.pdf @@ -0,0 +1,1366 @@ +Argon2: the memory-hard function for password hashing and other + applications + + Designers: Alex Biryukov, Daniel Dinu, and Dmitry Khovratovich + University of Luxembourg, Luxembourg + + alex.biryukov@uni.lu, dumitru-daniel.dinu@uni.lu, khovratovich@gmail.com + + https://www.cryptolux.org/index.php/Argon2 + https://github.com/P-H-C/phc-winner-argon2 + + https://github.com/khovratovich/Argon2 + + Version 1.3 of Argon2: PHC release + March 24, 2017 + +Contents + +1 Introduction 2 + +2 Definitions 3 + +2.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 + +2.2 Model for memory-hard functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + +3 Specification of Argon2 4 + +3.1 Inputs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 + +3.2 Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 + +3.3 Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 + +3.4 Compression function G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 + +4 Features 8 + +4.1 Available features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 + +4.2 Possible future extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 + +5 Security analysis 9 + +5.1 Ranking tradeoff attack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 + +5.2 Memory optimization attack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 + +5.3 Attack on iterative compression function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 + +5.4 Security of Argon2 to generic attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 + +5.5 Security of Argon2 to ranking tradeoff attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 + +5.6 Security of Argon2i to generic tradeoff attacks on random graphs . . . . . . . . . . . . . . . . . . 12 + +5.7 Summary of tradeoff attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 + +6 Design rationale 12 + +6.1 Indexing function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 + +6.2 Implementing parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 + +6.3 Compression function design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 + +6.3.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 + +6.3.2 Design criteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 + +6.4 User-controlled parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 + +7 Performance 16 + +7.1 x86 architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 + +8 Applications 16 + + 1 + 9 Recommended parameters 17 + +10 Conclusion 17 + +A Permutation P 18 + +B Additional functionality 19 + +C Change log 20 + +C.1 v.1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 + +C.2 v1.2.1 – February 1st, 2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 + +C.3 v1.2 – 21th June, 2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 + +C.4 v1.1 – 6th February, 2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 + +1 Introduction + +Passwords, despite all their drawbacks, remain the primary form of authentication on various web-services. +Passwords are usually stored in a hashed form in a server’s database. These databases are quite often captured +by the adversaries, who then apply dictionary attacks since passwords tend to have low entropy. Protocol +designers use a number of tricks to mitigate these issues. Starting from the late 70’s, a password is hashed +together with a random salt value to prevent detection of identical passwords across different users and services. +The hash function computations, which became faster and faster due to Moore’s law have been called multiple +times to increase the cost of password trial for the attacker. + + In the meanwhile, the password crackers migrated to new architectures, such as FPGAs, multiple-core GPUs +and dedicated ASIC modules, where the amortized cost of a multiple-iterated hash function is much lower. It +was quickly noted that these new environments are great when the computation is almost memoryless, but they +experience difficulties when operating on a large amount of memory. The defenders responded by designing +memory-hard functions, which require a large amount of memory to be computed, and impose computational +penalties if less memory is used. The password hashing scheme scrypt [15] is an instance of such function. + + Memory-hard schemes also have other applications. They can be used for key derivation from low-entropy +sources. Memory-hard schemes are also welcome in cryptocurrency designs [13] if a creator wants to demotivate +the use of GPUs and ASICs for mining and promote the use of standard desktops. + +Problems of existing schemes A trivial solution for password hashing is a keyed hash function such as +HMAC. If the protocol designer prefers hashing without secret keys to avoid all the problems with key generation, +storage, and update, then he has few alternatives: the generic mode PBKDF2, the Blowfish-based bcrypt, and +scrypt. Among those, only scrypt aims for high memory, but the existence of a trivial time-memory tradeoff [8] +allows compact implementations with the same energy cost. + + Design of a memory-hard function proved to be a tough problem. Since early 80’s it has been known +that many cryptographic problems that seemingly require large memory actually allow for a time-memory +tradeoff [11], where the adversary can trade memory for time and do his job on fast hardware with low memory. +In application to password-hashing schemes, this means that the password crackers can still be implemented on +a dedicated hardware even though at some additional cost. + + Another problem with the existing schemes is their complexity. The same scrypt calls a stack of subproce- +dures, whose design rationale has not been fully motivated (e.g, scrypt calls SMix, which calls ROMix, which +calls BlockMix, which calls Salsa20/8 etc.). It is hard to analyze and, moreover, hard to achieve confidence. +Finally, it is not flexible in separating time and memory costs. At the same time, the story of cryptographic +competitions [14, 17] has demonstrated that the most secure designs come with simplicity, where every element +is well motivated and a cryptanalyst has as few entry points as possible. + + The Password Hashing Competition, which started in 2014, highlighted the following problems: + + • Should the memory addressing (indexing functions) be input-independent or input-dependent, or hybrid? + The first type of schemes, where the memory read location are known in advance, is immediately vulnerable + to time-space tradeoff attacks, since an adversary can precompute the missing block by the time it is + needed [4]. In turn, the input-dependent schemes are vulnerable to side-channel attacks [16], as the + timing information allows for much faster password search. + + • Is it better to fill more memory but suffer from time-space tradeoffs, or make more passes over the memory + to be more robust? This question was quite difficult to answer due to absence of generic tradeoff tools, + which would analyze the security against tradeoff attacks, and the absence of unified metric to measure + adversary’s costs. + + 2 + • How should the input-independent addresses be computed? Several seemingly secure options have been + attacked [4]. + + • How large a single memory block should be? Reading smaller random-placed blocks is slower (in cycles + per byte) due to the spacial locality principle of the CPU cache. In turn, larger blocks are difficult to + process due to the limited number of long registers. + + • If the block is large, how to choose the internal compression function? Should it be cryptographically + secure or more lightweight, providing only basic mixing of the inputs? Many candidates simply proposed + an iterative construction and argued against cryptographically strong transformations. + + • How to exploit multiple cores of modern CPUs, when they are available? Parallelizing calls to the hashing + function without any interaction is subject to simple tradeoff attacks. + +Our solution We offer a hashing scheme called Argon2. Argon2 summarizes the state of the art in the design +of memory-hard functions. It is a streamlined and simple design. It aims at the highest memory filling rate +and effective use of multiple computing units, while still providing defense against tradeoff attacks. Argon2 +is optimized for the x86 architecture and exploits the cache and memory organization of the recent Intel and +AMD processors. Argon2 has two variants: Argon2d and Argon2i. Argon2d is faster and uses data-depending +memory access, which makes it suitable for cryptocurrencies and applications with no threats from side-channel +timing attacks. Argon2i uses data-independent memory access, which is preferred for password hashing and +password-based key derivation. Argon2i is slower as it makes more passes over the memory to protect from +tradeoff attacks. + + We recommend Argon2 for the applications that aim for high performance. Both versions of Argon2 allow +to fill 1 GB of RAM in a fraction of second, and smaller amounts even faster. It scales easily to the arbitrary +number of parallel computing units. Its design is also optimized for clarity to ease analysis and implementation. + + Our scheme provides more features and better tradeoff resilience than pre-PHC designs and equals in per- +formance with the PHC finalists [5]. + +2 Definitions + +2.1 Motivation + +We aim to maximize the cost of password cracking on ASICs. There can be different approaches to measure +this cost, but we turn to one of the most popular – the time-area product [3, 18]. We assume that the password +P is hashed with salt S but without secret keys, and the hashes may leak to the adversaries together with salts: + + Tag ← H(P, S); + Cracker ← {(Tagi, Si)}. + +In the case of the password hashing, we suppose that the defender allocates certain amount of time (e.g., 1 + +second) per password and a certain number of CPU cores (e.g., 4 cores). Then he hashes the password using the + +maximum amount M of memory. This memory size translates to certain ASIC area A. The running ASIC time + +T is determined by the length of the longest computational chain and by the ASIC memory latency. Therefore, + +we maximize the value AT . The other usecases follow a similar procedure. + +Suppose that an ASIC designer that wants to reduce the memory and thus the area wants to compute H + +using αM memory only for some α < 1. Using some tradeoff specific to H, he has to spend C(α) times as much + +computation and his running time increases by at least the factor D(α). Therefore, the maximum possible gain + +E in the time-area product is + + Emax = max 1 . + αD(α) + α + +The hash function is called memory-hard if D(α) > 1/α as α → 0. Clearly, in this case the time-area product +does not decrease. Moreover, the following aspects may further increase it: + +• Computing cores needed to implement the C(α) penalty may occupy significant area. + +• If the tradeoff requires significant communication between the computing cores, the memory bandwidth + limits may impose additional restrictions on the running time. + + In the following text, we will not attempt to estimate time and area with large precision. However, an +interested reader may use the following implementations as reference: + + • The 50-nm DRAM implementation [9] takes 550 mm2 per GByte; + + 3 + • The Blake2b implementation in the 65-nm process should take about 0.1 mm2 (using Blake-512 imple- + mentation in [10]); + +• The maximum memory bandwidth achieved by modern GPUs is around 400 GB/sec. + +2.2 Model for memory-hard functions + +The memory-hard functions that we explore use the following mode of operation. The memory array B[] is +filled with the compression function G: + +B[0] = H(P, S); + +for j from 1 to t (1) + +B[j] = G B[φ1(j)], B[φ2(j)], · · · , B[φk(j)] , + +where φi() are some indexing functions. + We distinguish two types of indexing functions: + +• Independent of the password and salt, but possibly dependent on other public parameters (thus called + data-independent). The addresses can be calculated by the memory-saving adversaries. We suppose that + the dedicated hardware can handle parallel memory access, so that the cracker can prefetch the data + from the memory. Moreover, if she implements a time-space tradeoff, then the missing blocks can be also + precomputed without losing time. Let the single G core occupy the area equivalent to the β of the entire + memory. Then if we use αM memory, then the gain in the time-area product is + + E (α) = α + 1 . + C (α)β + +• Dependent on the password (data-dependent), in our case: φ(j) = g(B[j − 1]). This choice prevents the + adversary from prefetching and precomputing missing data. The adversary figures out what he has to + recompute only at the time the element is needed. If an element is recomputed as a tree of F calls of + average depth D, then the total processing time is multiplied by D. The gain in the time-area product is + +E (α) = (α + 1 . + C (α)β )D(α) + + The maximum bandwidth Bwmax is a hypothetical upper bound on the memory bandwidth on the adver- +sary’s architecture. Suppose that for each call to G an adversary has to load R(α) blocks from the memory on +average. Therefore, the adversary can keep the execution time the same as long as + + R(α)Bw ≤ Bwmax, + +where Bw is the bandwidth achieved by a full-space implementation. In the tradeoff attacks that we apply the +following holds: + + R(α) = C(α). + +3 Specification of Argon2 + +There are two flavors of Argon2 – Argon2d and Argon2i. The former one uses data-dependent memory access to +thwart tradeoff attacks. However, this makes it vulnerable for side-channel attacks, so Argon2d is recommended +primarily for cryptocurrencies and backend servers. Argon2i uses data-independent memory access, which is +recommended for password hashing and password-based key derivation. + +3.1 Inputs + +Argon2 has two types of inputs: primary inputs and secondary inputs, or parameters. Primary inputs are +message P and nonce S, which are password and salt, respectively, for the password hashing. Primary inputs +must always be given by the user such that + + • Message P may have any length from 0 to 232 − 1 bytes; + • Nonce S may have any length from 8 to 232 − 1 bytes (16 bytes is recommended for password hashing). + +Secondary inputs have the following restrictions: + + 4 + • Degree of parallelism p determines how many independent (but synchronizing) computational chains can + be run. It may take any integer value from 1 to 224 − 1. + + • Tag length τ may be any integer number of bytes from 4 to 232 − 1. + + • Memory size m can be any integer number of kilobytes from 8p to 232 − 1. The actual number of blocks + is m , which is m rounded down to the nearest multiple of 4p. + + • Number of iterations t (used to tune the running time independently of the memory size) can be any + integer number from 1 to 232 − 1; + + • Version number v is one byte 0x13; + + • Secret value K (serves as key if necessary, but we do not assume any key use by default) may have any + length from 0 to 232 − 1 bytes. + + • Associated data X may have any length from 0 to 232 − 1 bytes. + + • Type y of Argon2: 0 for Argon2d, 1 for Argon2i, 2 for Argon2id. + + Argon2 uses internal compression function G with two 1024-byte inputs and a 1024-byte output, and internal +hash function H. Here H is the Blake2b hash function, and G is based on its internal permutation. The mode +of operation of Argon2 is quite simple when no parallelism is used: function G is iterated m times. At step i a +block with index φ(i) < i is taken from the memory (Figure 1), where φ(i) is either determined by the previous +block in Argon2d, or is a fixed value in Argon2i. + + G G G + + φ(i) φ(i + 1) i−1 i i+1 + + Figure 1: Argon2 mode of operation with no parallelism. + +3.2 Operation + +Argon2 follows the extract-then-expand concept. First, it extracts entropy from message and nonce by hashing +it. All the other parameters are also added to the input. The variable length inputs P, S, K, X are prepended +with their lengths: + + H0 = H(p, τ, m, t, v, y, P , P, S , S, K , K, X , X). + +Here H0 is 64-byte value, and the parameters p, τ, m, t, v, y, P , S , K , X are treated as little-endian 32-bit + +integers. + +Argon2 then fills the memory with m = m · 4p 1024-byte blocks. For tunable parallelism with p threads, + 4p + +the memory is organized in a matrix B[i][j] of blocks with p rows (lanes) and q = m /p columns. We denote + +the block produced in pass t by Bt[i][j], t > 0. Blocks are computed as follows: + + B1[i][0] = H (H0|| 0 || i ), 0 ≤ i < p; + + 4 bytes 4 bytes + + B1[i][1] = H (H0|| 1 || i ), 0 ≤ i < p; + + 4 bytes 4 bytes + + B1[i][j] = G(B1[i][j − 1], B1[i ][j ]), 0 ≤ i < p, 2 ≤ j < q. + +where block index [i ][j ] is determined differently for Argon2d/2ds and Argon2i, G is the compression function, +and H is a variable-length hash function built upon H. Both G and H will be fully defined in the further text. + + 5 + If t > 1, we repeat the procedure, but we XOR the new blocks to the old ones instead of overwriting them. + + Bt[i][0] = G(Bt−1[i][q − 1], B[i ][j ]) ⊕ Bt−1[i][0]; + Bt[i][j] = G(Bt[i][j − 1], B[i ][j ]) ⊕ Bt−1[i][j]. + +Here the block B[i ][j ] may be either Bt[i ][j ] for j < j or Bt−1[i ][j ] for j > j . + After we have done T iterations over the memory, we compute the final block Bfinal as the XOR of the last + +column: + Bfinal = BT [0][q − 1] ⊕ BT [1][q − 1] ⊕ · · · ⊕ BT [p − 1][q − 1]. + +Then we apply H to Bfinal to get the output tag. + + Tag ← H (Bfinal). + +Variable-length hash function. Let Hx be a hash function with x-byte output (in our case Hx is Blake2b, + +which supports 1 ≤ x ≤ 64). We define H as follows. Let Vi be a 64-byte block, and Ai be its first 32 bytes, +and τ < 232 be the 32-bit tag length (viewed little-endian) in bytes. Then we define + + if τ ≤ 64 H (X) d=ef Hτ (τ ||X). + else + r = τ /32 − 2; + V1 ← H64(τ ||X); + V2 ← H64(V1); + ··· + Vr ← H64(Vr−1), + Vr+1 ← Hτ−32r(Vr). + H (X) d=ef A1||A2|| . . . Ar||Vr+1. + + 4 slices + + B[0][0] p lanes + H + message + nonce + +parameters + + B[p − 1][0] + + H H H + + Tag + + Figure 2: Single-pass Argon2 with p lanes and 4 slices. + +3.3 Indexing + +To enable parallel block computation, we further partition the memory matrix into S = 4 vertical slices. The +intersection of a slice and a lane is a segment of length q/S. Segments of the same slice are computed in +parallel, and may not reference blocks from each other. All other blocks can be referenced, and now we explain +the procedure in detail. + +Getting two 32-bit values. In Argon2d we select the first 32 bits of block B[i][j − 1] and denote this value +by J1. Then we take the next 32 bits of B[i][j − 1] and denote this value by J2. In Argon2i we run G2 — the +2-round compression function G — in the counter mode, where the first input is all-zero block, and the second +input is constructed as + + ( r || l || s || m || t || x || i || 0 ), + + 8 bytes 8 bytes 8 bytes 8 bytes 8 bytes 8 bytes 8 bytes 968 bytes + +where + + 6 + • r is the pass number; + • l is the lane number; + • s is the slice number; + • m is the total number of memory blocks; + • t is the total number of passes; + • x is the type of the Argon function (equals 1 for Argon2i); + • i is the counter starting in each segment from 1. +All the numbers are put as little-endian. We increase the counter so that each application of G2 gives 128 64-bit +values J1||J2. + +Mapping J1, J2 to the reference block index The value l = J2 mod p determines the index of the lane +from which the block will be taken. If we work with the first slice and the first pass (r = s = 0), then l is set +to the current lane index. + + Then we determine the set of indices R that can be referenced for given [i][j] according to the following +rules: + +1. If l is the current lane, then R includes all blocks computed in this lane, that are not overwritten yet, + excluding B[i][j − 1]. + +2. If l is not the current lane, then R includes all blocks in the last S − 1 = 3 segments computed and finished + in lane l. If B[i][j] is the first block of a segment, then the very last block from R is excluded. + +We are going to take a block from R with a non-uniform distribution over [0..|R|): + +J1 ∈ [0..232) → |R| 1 − (J1)2 . + 264 + +To avoid floating-point computation, we use the following integer approximation: + +x = (J1)2/232; +y = (|R| ∗ x)/232; +z = |R| − 1 − y. + +Then we enumerate the blocks in R in the order of construction and select z-th block from it as the reference +block. + +3.4 Compression function G + +Compression function G is built upon the Blake2b round function P (fully defined in Section A). P operates +on the 128-byte input, which can be viewed as 8 16-byte registers (see details below): + + P(A0, A1, . . . , A7) = (B0, B1, . . . , B7). + + Compression function G(X, Y ) operates on two 1024-byte blocks X and Y . It first computes R = X ⊕ Y . +Then R is viewed as a 8 × 8-matrix of 16-byte registers R0, R1, . . . , R63. Then P is first applied rowwise, and +then columnwise to get Z: + + (Q0, Q1, . . . , Q7) ← P(R0, R1, . . . , R7); + (Q8, Q9, . . . , Q15) ← P(R8, R9, . . . , R15); + + ... + (Q56, Q57, . . . , Q63) ← P(R56, R57, . . . , R63); + + (Z0, Z8, Z16, . . . , Z56) ← P(Q0, Q8, Q16, . . . , Q56); + (Z1, Z9, Z17, . . . , Z57) ← P(Q1, Q9, Q17, . . . , Q57); + + ... + (Z7, Z15, Z23, . . . , Z63) ← P(Q7, Q15, Q23, . . . , Q63). + +Finally, G outputs Z ⊕ R: + + G : (X, Y ) → R = X ⊕ Y −P→ Q −P→ Z → Z ⊕ R. + +7 + X Y + + R + + P Blake2b + round + + P + + P + + Q + + PP P + + Z + + Figure 3: Argon2 compression function G. + +4 Features + +Argon2 is a multi-purpose family of hashing schemes, which is suitable for password hashing, key derivation, +cryptocurrencies and other applications that require provably high memory use. Argon2 is optimized for the x86 +architecture, but it does not slow much on older processors. The key feature of Argon2 is its performance and +the ability to use multiple computational cores in a way that prohibits time-memory tradeoffs. Several features +are not included into this version, but can be easily added later. + +4.1 Available features + +Now we provide an extensive list of features of Argon2. + Performance. Argon2 fills memory very fast, thus increasing the area multiplier in the time-area product + +for ASIC-equipped adversaries. Data-independent version Argon2i securely fills the memory spending about 2 +CPU cycles per byte, and Argon2d is three times as fast. This makes it suitable for applications that need +memory-hardness but can not allow much CPU time, like cryptocurrency peer software. + + Tradeoff resilience. Despite high performance, Argon2 provides reasonable level of tradeoff resilience. Our +tradeoff attacks previously applied to Catena and Lyra2 show the following. With default number of passes over +memory (1 for Argon2d, 3 for Argon2i, an ASIC-equipped adversary can not decrease the time-area product if +the memory is reduced by the factor of 4 or more. Much higher penalties apply if more passes over the memory +are made. + + Scalability. Argon2 is scalable both in time and memory dimensions. Both parameters can be changed +independently provided that a certain amount of time is always needed to fill the memory. + + Parallelism. Argon2 may use up to 224 threads in parallel, although in our experiments 8 threads already +exhaust the available bandwidth and computing power of the machine. + + GPU/FPGA/ASIC-unfriendly. Argon2 is heavily optimized for the x86 architecture, so that imple- +menting it on dedicated cracking hardware should be neither cheaper nor faster. Even specialized ASICs would +require significant area and would not allow reduction in the time-area product. + + Additional input support. Argon2 supports additional input, which is syntactically separated from the +message and nonce, such as secret key, environment parameters, user data, etc.. + + 8 + 4.2 Possible future extensions + +Argon2 can be rather easily tuned to support other compression functions, hash functions and block sizes. ROM +can be easily integrated into Argon2 by simply including it into the area where the blocks are referenced from. + +5 Security analysis + +All the attacks detailed below apply to one-lane version of Argon2, but can be carried to the multi-lane version +with the same efficiency. + +5.1 Ranking tradeoff attack + +To figure out the costs of the ASIC-equipped adversary, we first need to calculate the time-space tradeoffs for +Argon2. To the best of our knowledge, the first generic tradeoffs attacks were reported in [4], and they apply to +both data-dependent and data-independent schemes. The idea of the ranking method [4] is as follows. When +we generate a memory block B[l], we make a decision, to store it or not. If we do not store it, we calculate the +access complexity of this block — the number of calls to F needed to compute the block, which is based on the +access complexity of B[l − 1] and B[φ(l)]. The detailed strategy is as follows: + + 1. Select an integer q (for the sake of simplicity let q divide T ). + + 2. Store B[kq] for all k; + + 3. Store all ri and all access complexities; + + 4. Store the T /q highest access complexities. If B[i] refers to a vertex from this top, we store B[i]. + +The memory reduction is a probabilistic function of q. We applied the algorithm to the indexing function of +Argon2 and obtained the results in Table 1. Each recomputation is a tree of certain depth, also given in the +table. + + We conclude that for data-dependent one-pass schemes the adversary is always able to reduce the memory +by the factor of 3 and still keep the time-area product the same. + + α 1 1 1 1 1 1 +C (α) +D(α) 2 3 4 5 6 7 + + 1.5 4 20.2 344 4660 218 + + 1.5 2.8 5.5 10.3 17 27 + +Table 1: Time and computation penalties for the ranking tradeoff attack for the Argon2 indexing function. + +5.2 Memory optimization attack + +As reported in [6], it is possible to optimize the memory use in the earlier version 1.2.1 of Argon2, concretely for + +Argon2i. The memory blocks produced in the version 1.2.1 at second and later passes replaced, not overwrote +the blocks at earlier passes. Therefore, for each block B[i] there is a time gap (let us call it a no-use gap) +between the moment the block is used for the last time (as a reference or as a fresh new block) and the moment +it is overwritten. We formalize this issue as follows. Let us denote by φr(i) the reference block index for block +B r [i]. + +• For t-pass Argon2i the block Br[i], r < t is not used between step lir = max i, maxφ(jr)=i j and step i of + pass r + 1, where it is overwritten. + +• For t-pass Argon2i the block Bt[i] is not used between step lit = max i, maxφ(jr)=i j and step m of pass + t, where it is discarded. + + Since addresses li can be precomputed, an attacker can figure out for each block Br[i] when it can be +discarded. A separate data structure will be needed though to keep the address of newly produced blocks as +they land up at pseudo-random locations at the memory. + + This saving strategy uses the fraction + + Lt = 1 − lit + m + i + + 9 + of memory for the last pass, and + + Lr = m + i − lir + m + i + +for the previous passes. Our experiments show that in 1-pass Argon2i L1 ≈ 0.15, i.e. on average 1/7-th of +memory is used. Since in the straightforward application on average 1/2 of memory is used, the advantage in +the time-area product is about 3.5. For t > 1 this strategy uses 0.25 of memory on average, so the time-area +product advantage is close to 4. If we use the peak memory amount in the time-area calculations, then the +advantage would be 5 and 2.7, respectively. + + The version 1.3 of Argon2 replaces overwriting operation with the XOR. This gives minimal overhead on the +performance: for memory requirements of 8 MB and higher the performance difference is between 5% and 15% +depending on the operating system and hardware. For instance, the highest speed of 3-pass Argon2d v.1.2.1 on +1.8 GHz CPU with Ubuntu is 1.61 cycles per byte, whereas for v.1.3 it is 1.7 cpb (both measured for 2 GB of +RAM, 4 threads). + + In the version 1.3 this saving strategy applies to the one-pass Argon2i only, where it brings the same time- +area product advantage. The multi-pass versions are safe as all the blocks have to be kept in memory till the +overwrite. + +5.3 Attack on iterative compression function + +Let us consider the following structure of the compression function F (X, Y ), where X and Y are input blocks: + + • The input blocks of size t are divided into shorter subblocks of length t (for instance, 128 bits) X0, X1, + X2, . . . and Y0, Y1, Y2, . . .. + + • The output block Z is computed subblockwise: + + Z0 = G(X0, Y0); + Zi = G(Xi, Yi, Zi−1), i > 0. + +This scheme resembles the duplex authenticated encryption mode, which is secure under certain assumptions + +on G. However, it is totally insecure against tradeoff adversaries, as shown below. + Suppose that an adversary computes Z = F (X, Y ) but Y is not stored. Suppose that Y is a tree function + +of stored elements of depth D. The adversary starts with computing Z0, which requires only Y0. In turn, +Y0 = G(X0, Y0 ) for some X , Y . Therefore, the adversary computes the tree of the same depth D, but with +the function G instead of F . Z1 is then a tree function of depth D + 1, Z2 of depth D + 2, etc. In total, +the recomputation takes (D + s)LG time, where s is the number of subblocks and LG is the latency of G. +This should be compared to the full-space implementation, which takes time sLG. Therefore, if the memory is +reduced by the factor q, then the time-area product is changed as + + ATnew = D(q) + s AT. + sq + +Therefore, if + + D(q) ≤ s(q − 1), (2) + +the adversary wins. + One may think of using the Zm−1[l−1] as input to computing Z0[l]. Clearly, this changes little in adversary’s + +strategy, who could simply store all Zm−1, which is feasible for large m. In concrete proposals, s can be 64, +128, 256 and even larger. + + We conclude that F with an iterative structure is insecure. We note that this attack applies also to other +PHC candidates with iterative compression function. + +5.4 Security of Argon2 to generic attacks + +Now we consider preimage and collision resistance of both versions of Argon2. Variable-length inputs are +prepended with their lengths, which shall ensure the absence of equal input strings. Inputs are processed by a +cryptographic hash function, so no collisions should occur at this stage. + + 10 + Internal collision resistance. The compression function G is not claimed to be collision resistant, so it may +happen that distinct inputs produce identical outputs. Recall that G works as follows: + + G(X, Y ) = P (Z) ⊕ (Z), Z = X ⊕ Y. + +where P is a permutation based on the 2-round Blake2b permutation. Let us prove that all Z are different +under certain assumptions. + +Theorem 1. Let Π be Argon2d or Argon2i with d lanes, s slices, and t passes over memory. Assume that + + • P (Z) ⊕ Z is collision-resistant, i.e. it is hard to find a, b such that P (a) ⊕ a = P (b) ⊕ b. + + • P (Z) ⊕ Z is 4-generalized-birthday-resistant, i.e. it is hard to find distinct a, b, c, d such that P (a) ⊕ P (b) ⊕ + P (c) ⊕ P (d) = a ⊕ b ⊕ c ⊕ d. + +Then all the blocks B[i] generated in those t passes are different. + +Proof. By specification, the value of Z is different for the first two blocks of each segment in the first slice in +the first pass. Consider the other blocks. + + Let us enumerate the blocks according to the moment they are computed. Within a slice, where segments +can be computed in parallel, we enumerate lane 0 fully first, then lane 1, etc.. Slices are then computed and +enumerated sequentially. Suppose the proposition is wrong, and let (B[x], B[y]) be a block collision such that +x < y and y is the smallest among all such collisions. As F (Z) ⊕ Z is collision resistant, the collision occurs in +Z, i.e. + + Zx = Zy. +Let rx, ry be reference block indices for B[x] and B[y], respectively, and let px, py be previous block indices for +B[x], B[y]. Then we get + + B[rx] ⊕ B[px] = B[ry] ⊕ B[py]. + +As we assume 4-generalized-birthday-resistance, some arguments are equal. Consider three cases: + + • rx = px. This is forbidden by the rule 3 in Section 3.3. + + • rx = ry. We get B[px] = B[py]. As px, py < y, and y is the smallest yielding such a collision, we get + px = py. However, by construction px = py for x = y. + + • rx = py. Then we get B[ry] = B[px]. As ry < y and px < x < y, we obtain ry = px. Since py = rx < x < y, + we get that x and y are in the same slice, we have two options: + + – py is the last block of a segment. Then y is the first block of a segment in the next slice. Since rx + is the last block of a segment, and x < y, x must be in the same slice as y, and x can not be the + first block in a segment by the rule 4 in Section 3.3. Therefore, ry = px = x − 1. However, this is + impossible, as ry can not belong to the same slice as y. + + – py is not the last block of a segment. Then rx = py = y − 1, which implies that rx ≥ x. The latter + is forbidden. + +Thus we get a contradiction in all cases. This ends the proof. + + The compression function G is not claimed to be collision resistant nor preimage-resistant. However, as the +attacker has no control over its input, the collisions are highly unlikely. We only take care that the starting +blocks are not identical by producing the first two blocks with a counter and forbidding to reference from the +memory the last block as (pseudo)random. + + Argon2d does not overwrite the memory, hence it is vulnerable to garbage-collector attacks and similar ones, +and is not recommended to use in the setting where these threats are possible. Argon2i with 3 passes overwrites +the memory twice, thus thwarting the memory-leak attacks. Even if the entire working memory of Argon2i is +leaked after the hash is computed, the adversary would have to compute two passes over the memory to try the +password. + +5.5 Security of Argon2 to ranking tradeoff attacks + +Time and computational penalties for 1-pass Argon2d are given in Table 1. It suggests that the adversary can +reduce memory by the factor of 3 at most while keeping the time-area product the same. + + Argon2i is more vulnerable to tradeoff attacks due to its data-independent addressing scheme. We applied +the ranking algorithm to 3-pass Argon2i to calculate time and computational penalties. We found out that the +memory reduction by the factor of 3 already gives the computational penalty of around 214. The 214 Blake2b +cores would take more area than 1 GB of RAM (Section 2.1), thus prohibiting the adversary to further reduce +the time-area product. We conclude that the time-area product cost for Argon2i can be reduced by 3 at best. + + 11 + 5.6 Security of Argon2i to generic tradeoff attacks on random graphs + +The recent paper by Alwen and Blocki [1] reports an improved attack on Argon2i (all versions) as an instance +of hash functions based on random graphs. + + For t-pass Argon2i, Alwen and Blocki explicitly construct a set of O(T 3/4) nodes so that removing these +nodes from the computation graph yields the so called sandwich graph with O(T 1/4) layers and O(T 1/2) depth +and size. The computation proceeds as follows: + + • Mark certain v = O(T 3/4) blocks as to be stored. + + • For every segment of length T 3/4: + + – Compute the reference blocks of the segment blocks in parallel. + + – Compute the segment blocks consecutively, store blocks that needs storing. + +Using O(T 1/2) cores, the segment computation takes time O(T 3/4) and the total time is O(T ). The cores are +used only for O(T 1/2) time, so it is possible to amortize costs computing O(T 1/4) instances using these cores +in the round-robin fashion. The memory complexity of each step is about to T log T . + + A precise formula for the time-area complexity using this tradeoff strategy is given in Corollary1 5.6 of [1]: + + ATnew = 2T 7/4 5 + t + ln T , + 8 + +Since the memory consumption in the standard implementation is M = T /t, the standard AT value is T 2/t and +the time-area advantage of the Alwen-Blocki attack is + +E = AT = T 1/4 ln T ) ≤ 2t3/4(5 + M 1/4 + 0.125 ln M ) . + ATnew 2t(5 + (ln t)/2 + 8 0.625 ln t + +For t ≥ 3 we get that E ≤ M 1/4/36. Therefore, for M up to 220 (1 GB) the advantage is smaller than 1 (i.e. the +attack is not beneficial to the adversary at all), and for M up to 224 (16 GB) it is smaller than 2. Therefore, +this approach is not better than the ranking attack. However, it is a subject of active research and we’ll update + +this documents if improvements appear. + +5.7 Summary of tradeoff attacks + +The best attack on the 1- and 2-pass Argon2i (v.1.3) is the low-storage attack from [6], which reduces the +time-area product (using the peak memory value) by the factor of 5. + + The best attack for t-pass (t > 2) Argon2i is the ranking tradeoff attack, which reduces the time-area product +by the factor of 3. + + The best attack on the t-pass Argon2d is the ranking tradeoff attack, which reduces the time-area product +by the factor 1.33. + +6 Design rationale + +Argon2 was designed with the following primary goal: to maximize the cost of exhaustive search on non-x86 +architectures, so that the switch even to dedicated ASICs would not give significant advantage over doing the +exhaustive search on defender’s machine. + +6.1 Indexing function + +The basic scheme (1) was extended to implement: + + • Tunable parallelism; + + • Several passes over memory. + + For the data-dependent addressing we set φ(l) = g(B[l]), where g simply truncates the block and takes the +result modulo l − 1. We considered taking the address not from the block B[l − 1] but from the block B[l − 2], +which should have allowed to prefetch the block earlier. However, not only the gain in our implementations is +limited, but also this benefit can be exploited by the adversary. Indeed, the efficient depth D(q) is now reduced +to D(q) − 1, since the adversary has one extra timeslot. Table 1 implies that then the adversary would be able + + 1the authors denote the total number of blocks by n and the number of passes by k. + + 12 + to reduce the memory by the factor of 5 without increasing the time-area product (which is a 25% increase in +the reduction factor compared to the standard approach). + + For the data-independent addressing we use a simple PRNG, in particular the compression function G in the +counter mode. Due to its long output, one call (or two consecutive calls) would produce hundreds of addresses, +thus minimizing the overhead. This approach does not give provable tradeoff bounds, but instead allows the +analysis with the tradeoff algorithms suited for data-dependent addressing. + +Motivation for our indexing functions Initially, we considered uniform selection of referenced blocks, but +then we considered a more generic case: + + φ ← (264 − (J1)γ ) · |Rl|/264 + + We tried to choose the γ which would maximize the adversary’s costs if he applies the tradeoff based on +the ranking method. We also attempted to make the reference block distribution close to uniform, so that each +memory block is referenced similar number of times. + + For each 1 ≤ γ ≤ 5 with step 0.1 we applied the ranking method with sliding window and selected the +best available tradeoffs. We obtained a set of time penalties {Dγ(α)} and computational penalties {Cγ(α)} for +0.01 < α < 1. We also calculated the reference block distribution for all possible γ. We considered two possible +metrics: + +1. Minimum time-area product + + ATγ = min{α · Dγ (α)}. + + α + +2. Maximum memory reduction which reduces the time-area product compared to the original: + + αγ = min{α | Dγ(α) < α}. + + α + +3. The goodness-of-fit value of the reference block distribution w.r.t. the uniform distribution with n bins: + + χ2 = (pi − 1 )2 , + n + 1 + + i n + +where pi is the average probability of the block from i-th bin to be referenced. For example, if p3 = +0.2, n = 10 and there are 1000 blocks, then blocks from 201 to 300 are referenced 1000 · 0.2 = 200 times + +throughout the computation. + +We got the following results for n = 10: + + γ ATγ αγ χ2 + 1 0.78 3.95 0.89 + 2 0.72 3.2 0.35 + 3 0.67 3.48 0.2 + 4 0.63 3.9 0.13 + 5 0.59 4.38 0.09 + +We conclude that the time-area product achievable by the attacker slowly decreases as γ grows. However, the +difference between γ = 1 and γ = 5 is only the factor of 1.3. We also see that the time-area product can be +kept below the original up to q = 3.2 for γ = 2, whereas for γ = 4 and γ = 1 such q is close to 4. To avoid +floating-point computations, we restrict to integer γ. Thus the optimal values are γ = 2 and γ = 3, where the + +former is slightly better in the first two metrics. + + However, if we consider the reference block uniformity, the situation favors larger γ considerably. We see +that the χ2 value is decreased by the factor of 2.5 when going from γ = 1 to γ = 2, and by the factor of 1.8 +further to γ = 3. In concrete probabilities (see also Figure 4), the first 20% of blocks accumulate 40% of all +reference hits for γ = 2 and 32% for γ = 3 (23.8% vs 19.3% hit for the first 10% of blocks). + + To summarize, γ = 2 and γ = 3 both are better against one specific attacker and slightly worse against the +other. We take γ = 2 as the value that minimizes the AT gain, as we consider this metric more important. + +6.2 Implementing parallelism + +As modern CPUs have several cores possibly available for hashing, it is tempting to use these cores to increase +the bandwidth, the amount of filled memory, and the CPU load. The cores of the recent Intel CPU share +the L3 cache and the entire memory, which both have large latencies (100 cycles and more). Therefore, the +inter-processor communication should be minimal to avoid delays. + + 13 + Memory fraction (1/q) 1 1 1 1 1 + γ=1 + γ=2 2 3 4 5 6 + γ=3 + 1.6 2.9 7.3 16.4 59 + + 1.5 4 20.2 344 4700 + + 1.4 4.3 28.1 1040 217 + +Table 2: Computational penalties for the ranking tradeoff attack with a sliding window, 1 pass. + + Memory fraction (1/q) 1 1 1 1 1 + γ=1 + γ=2 2 3 4 5 6 + γ=3 + 1.6 2.5 4 5.8 8.7 + + 1.5 2.6 5.4 10.7 17 + + 1.3 2.5 5.3 10.1 18 + + Table 3: Depth penalties for the ranking tradeoff attack with a sliding window, 1 pass. + +The simplest way to use p parallel cores is to compute and XOR p independent calls to H: + + H (P, S) = H(P, S, 0) ⊕ H(P, S, 1) ⊕ · · · ⊕ H(P, S, p − 1). + +If a single call uses m memory units, then p calls use pm units. However, this method admits a trivial tradeoff: +an adversary just makes p sequential calls to H using only m memory in total, which keeps the time-area +product constant. + + We suggest the following solution for p cores: the entire memory is split into p lanes of l equal slices each, +which can be viewed as elements of a (p × l)-matrix Q[i][j]. Consider the class of schemes given by Equation (1). +We modify it as follows: + +• p invocations to H run in parallel on the first column Q[∗][0] of the memory matrix. Their indexing + functions refer to their own slices only; + +• For each column j > 0, l invocations to H continue to run in parallel, but the indexing functions now may + refer not only to their own slice, but also to all jp slices of previous columns Q[∗][0], Q[∗][1], . . . , Q[∗][j −1]. + +• The last blocks produced in each slice of the last column are XORed. + +This idea is easily implemented in software with p threads and l joining points. It is easy to see that the adversary + +can use less memory when computing the last column, for instance by computing the slices sequentially and + +storing only the slice which is currently computed. Then his time is multiplied by (1 + p−1 ), whereas the + l + p−1 +memory use is multiplied by (1 − pl ), so the time-area product is modified as + + ATnew = AT 1 − p − 1 p−1 . + pl 1+ l + +For 2 ≤ p, l ≤ 10 this value is always between 1.05 and 3. We have selected l = 4 as this value gives low +synchronisation overhead while imposing time-area penalties on the adversary who reduces the memory even +by the factor 3/4. We note that values l = 8 or l = 16 could be chosen. + + If the compression function is collision-resistant, then one may easily prove that block collisions are highly +unlikely. However, we employ a weaker compression function, for which the following holds: + + G(X, Y ) = F (X ⊕ Y ), + +Figure 4: Access frequency for different memory segments (10%-buckets) and different exponents (from γ = 1 +to γ = 5) in the indexing functions. + + 14 + which is invariant to swap of inputs and is not collision-free. We take special care to ensure that the mode of +operation does not allow such collisions by introducing additional rule: + + • First block of a segment can not refer to the last block of any segment in the previous slice. +We prove that block collisions are unlikely under reasonable conditions on F in Section 5.4. + +6.3 Compression function design + +6.3.1 Overview + +In contrast to attacks on regular hash functions, the adversary does not control inputs to the compression +function G in our scheme. Intuitively, this should relax the cryptographic properties required from the compres- +sion function and allow for a faster primitive. To avoid being the bottleneck, the compression function ideally +should be on par with the performance of memcpy() or similar function, which may run at 0.1 cycle per byte +or even faster. This much faster than ordinary stream ciphers or hash functions, but we might not need strong +properties of those primitives. + + However, we first have to determine the optimal block size. When we request a block from a random location +in the memory, we most likely get a cache miss. The first bytes would arrive at the CPU from RAM within +at best 10 ns, which accounts for 30 cycles. In practice, the latency of a single load instruction may reach 100 +cycles and more. However, this number can be amortized if we request a large block of sequentially stored bytes. +When the first bytes are requested, the CPU stores the next ones in the L1 cache, automatically or using the +prefetch instruction. The data from the L1 cache can be loaded as fast as 64 bytes per cycle on the Haswell +architecture, though we did not manage to reach this speed in our application. + + Therefore, the larger the block is, the higher the throughput is. We have made a series of experiments with +a non-cryptographic compression function, which does little beyond simple XOR of its inputs, and achieved the +performance of around 0.7 cycles per byte per core with block sizes of 1024 bits and larger. + +6.3.2 Design criteria + +It was demonstrated that a compression function with a large block size may be vulnerable to tradeoff attacks +if it has a simple iterative structure, like modes of operation for a blockcipher [4] (some details in Section 5.3). + + Thus we formulate the following design criteria: + + • The compression function must require about t bits of storage (excluding inputs) to compute any output + bit. + +• Each output byte of F must be a nonlinear function of all input bytes, so that the function has differential + +probability below certain level, for example 1 . + 4 + +These criteria ensure that the attacker is unable to compute an output bit using only a few input bits or a few + +stored bits. Moreover, the output bits should not be (almost) linear functions of input bits, as otherwise the + +function tree would collapse. + +We have not found any generic design strategy for such large-block compression functions. It is difficult to + +maintain diffusion on large memory blocks due to the lack of CPU instructions that interleave many registers + +at once. A naive approach would be to apply a linear transformation with certain branch number. However, +even if we operate on 16-byte registers, a 1024-byte block would consist of 64 elements. A 64 × 64-matrix would + +require 32 XORs per register to implement, which gives a penalty about 2 cycles per byte. + +Instead, we propose to build the compression function on the top of a transformation P that already mixes + +several registers. We apply P in parallel (having a P-box), then shuffle the output registers and apply it again. +If P handles p registers, then the compression function may transform a block of p2 registers with 2 rounds of + +P-boxes. We do not have to manually shuffle the data, we just change the inputs to P-boxes. As an example, + +an implementation of the Blake2b [2] permutation processes 8 128-bit registers, so with 2 rounds of Blake2b we + +can design a compression function that mixes the 8192-bit block. We stress that this approach is not possible + +with dedicated AES instructions. Even though they are very fast, they apply only to the 128-bit block, and we + +still have to diffuse its content across other blocks. + +We replace the original Blake2b round function with its modification BlaMka [12], where the modular + +additions in G are combined with 32-bit multiplications. Our motivation was to increase the circuit depth (and + +thus the running time) of a potential ASIC implementation while having roughly the same running time on CPU + +thanks to parallelism and pipelining. Extra multiplications in the scheme serve well, as the best addition-based + +circuits for multiplication have latency about 4-5 times the addition latency for 32-bit multiplication (or roughly + +logn for n-bit multiplication). + As a result, any output 64-bit word of P is implemented by a chain of additions, multiplications, XORs, and + +rotations. The shortest possible chain for the 1 KB-block (e.g, from v0 to v0) consists of 12 MULs, 12 XORs, +and 12 rotations. + + 15 + Argon2d (1 pass) Argon2i (3 passes) + +Processor Threads Cycles/Byte Bandwidth Cycles/Byte Bandwidth + + (GB/s) (GB/s) + +i7-4500U 1 1.3 2.5 4.7 2.6 + +i7-4500U 2 0.9 3.8 2.8 4.5 + +i7-4500U 4 0.6 5.4 2 5.4 + +i7-4500U 8 0.6 5.4 1.9 5.8 + +Table 4: Speed and memory bandwidth of Argon2(d/i) measured on 1 GB memory filled. Core i7-4500U — +Intel Haswell 1.8 GHz, 4 cores + +6.4 User-controlled parameters + +We have made a number of design choices, which we consider optimal for a wide range of applications. Some +parameters can be altered, some should be kept as is. We give a user full control over: + + • Amount M of memory filled by algorithm. This value, evidently, depends on the application and the + environment. There is no ”insecure” value for this parameter, though clearly the more memory the + better. + + • Number T of passes over the memory. The running time depends linearly on this parameter. We expect + that the user chooses this number according to the time constraints on the application. Again, there is + no ”insecure value” for T . + + • Degree d of parallelism. This number determines the number of threads used by an optimized implemen- + tation of Argon2. We expect that the user is restricted by a number of CPU cores (or half-cores) that can + be devoted to the hash function, and chooses d accordingly (double the number of cores). + + • Length of password/message, salt/nonce, and tag (except for some low, insecure values for salt and tag + lengths). + + We allow to choose another compression function G, hash function H, block size b, and number of slices l. +However, we do not provide this flexibility in a reference implementation as we guess that the vast majority of +the users would prefer as few parameters as possible. + +7 Performance + +7.1 x86 architecture + +To optimize the data load and store from/to memory, the memory that will be processed has to be alligned on +16-byte boundary when loaded/stored into/from 128-bit registers and on 32-byte boundary when loaded/stored +into/from 256-bit registers. If the memory is not aligned on the specified boundaries, then each memory +operation may take one extra CPU cycle, which may cause consistent penalties for many memory accesses. + + The results presented are obtained using the gcc 4.8.2 compiler with the following options: -m64 -mavx +-std=c++11 -pthread -O3. The cycle count value was measured using the rdtscp Intel intrinsics C function +which inlines the RDTSCP assembly instruction that returns the 64-bit Time Stamp Counter (TSC) value. The +instruction waits for prevoius instruction to finish and then is executed, but meanwhile the next instructions may +begin before the value is read. Although this shortcoming, we used this method because it is the most realiable +handy method to measure the execution time and also it is widely used in other cryptographic operations +benchmarking. + +8 Applications + +Argon2d is optimized for settings where the adversary does not get regular access to system memory or CPU, +i.e. he can not run side-channel attacks based on the timing information, nor he can recover the password much +faster using garbage collection [7]. These settings are more typical for backend servers and cryptocurrency +minings. For practice we suggest the following settings: + + • Cryptocurrency mining, that takes 0.1 seconds on a 2 Ghz CPU using 1 core — Argon2d with 2 lanes and + 250 MB of RAM; + + 16 + • Backend server authentication, that takes 0.5 seconds on a 2 GHz CPU using 4 cores — Argon2d with 8 + lanes and 4 GB of RAM. + + Argon2i is optimized for more dangerous settings, where the adversary possibly can access the same machine, +use its CPU or mount cold-boot attacks. We use three passes to get rid entirely of the password in the memory. +We suggest the following settings: + + • Key derivation for hard-drive encryption, that takes 3 seconds on a 2 GHz CPU using 2 cores — Argon2i + with 4 lanes and 6 GB of RAM; + + • Frontend server authentication, that takes 0.5 seconds on a 2 GHz CPU using 2 cores — Argon2i with 4 + lanes and 1 GB of RAM. + +9 Recommended parameters + +We recommend the following procedure to select the type and the parameters for practical use of Argon2: + 1. Select the type y. If you do not know the difference between them or you consider side-channel attacks + as viable threat, choose Argon2i. Otherwise any choice is fine, including optional types. + 2. Figure out the maximum number h of threads that can be initiated by each call to Argon2. + 3. Figure out the maximum amount m of memory that each call can afford. + 4. Figure out the maximum amount x of time (in seconds) that each call can afford. + + 5. Select the salt length. 128 bits is sufficient for all applications, but can be reduced to 64 bits in the case + of space constraints. + + 6. Select the tag length. 128 bits is sufficient for most applications, including key derivation. If longer keys + are needed, select longer tags. + + 7. If side-channel attacks is a viable threat, enable the memory wiping option in the library call. + 8. Run the scheme of type y, memory m and h lanes and threads, using different number of passes t. Figure + + out the maximum t such that the running time does not exceed x. If it exceeds x even for t = 1, reduce + m accordingly. + 9. Hash all the passwords with the just determined values m, h, and t. + +10 Conclusion + +We presented the memory-hard function Argon2, which maximizes the ASIC implementation costs for given +CPU computing time. We aimed to make the design clear and compact, so that any feature and operation has +certain rationale. The clarity and brevity of the Argon2 design has been confirmed by its eventual selection as +the PHC winner. + + Further development of tradeoff attacks with dedication to Argon2 is the subject of future work. It also +remains to be seen how Argon2 withstands GPU cracking with low memory requirements. + +References + + [1] J. Alwen and J. Blocki, “Efficiently computing data-independent memory-hard functions,” IACR Cryptol- + ogy ePrint Archive, vol. 2016, p. 115, 2016. + + [2] J. Aumasson, S. Neves, Z. Wilcox-O’Hearn, and C. Winnerlein, “BLAKE2: simpler, smaller, fast as MD5,” + in ACNS’13, ser. Lecture Notes in Computer Science, vol. 7954. Springer, 2013, pp. 119–135. + + [3] D. J. Bernstein and T. Lange, “Non-uniform cracks in the concrete: The power of free precomputation,” + in ASIACRYPT’13, ser. Lecture Notes in Computer Science, vol. 8270. Springer, 2013, pp. 321–340. + + [4] A. Biryukov and D. Khovratovich, “Tradeoff cryptanalysis of memory-hard functions,” in Advances in + Cryptology - ASIACRYPT 2015, ser. Lecture Notes in Computer Science, T. Iwata and J. H. Cheon, Eds., + vol. 9453. Springer, 2015, pp. 633–657. + + 17 + [5] M. Broz, “Phc benchmarks,” 2015, https://github.com/mbroz/PHCtest/blob/master/output/phc round2. + pdf . + + [6] H. Corrigan-Gibbs, D. Boneh, and S. E. Schechter, “Balloon hashing: Provably space-hard hash functions + with data-independent access patterns,” IACR Cryptology ePrint Archive, vol. 2016, p. 27, 2016. + + [7] C. Forler, E. List, S. Lucks, and J. Wenzel, “Overview of the candidates for the password hashing competi- + tion - and their resistance against garbage-collector attacks,” Cryptology ePrint Archive, Report 2014/881, + 2014, http://eprint.iacr.org/. + + [8] C. Forler, S. Lucks, and J. Wenzel, “Memory-demanding password scrambling,” in ASIACRYPT’14, ser. + Lecture Notes in Computer Science, vol. 8874. Springer, 2014, pp. 289–305, tweaked version of [?]. + + [9] B. Giridhar, M. Cieslak, D. Duggal, R. G. Dreslinski, H. M. Chen, R. Patti, B. Hold, C. Chakrabarti, T. N. + Mudge, and D. Blaauw, “Exploring DRAM organizations for energy-efficient and resilient exascale mem- + ories,” in International Conference for High Performance Computing, Networking, Storage and Analysis + (SC 2013). ACM, 2013, pp. 23–35. + +[10] F. Gu¨rkaynak, K. Gaj, B. Muheim, E. Homsirikamol, C. Keller, M. Rogawski, H. Kaeslin, and J.-P. Kaps, + “Lessons learned from designing a 65nm ASIC for evaluating third round SHA-3 candidates,” in Third + SHA-3 Candidate Conference, Mar. 2012. + +[11] M. E. Hellman, “A cryptanalytic time-memory trade-off,” Information Theory, IEEE Transactions on, + vol. 26, no. 4, pp. 401–406, 1980. + +[12] M. A. S. Jr., L. C. Almeida, E. R. Andrade, P. C. F. dos Santos, and P. S. L. M. Barreto, “Lyra2: + Password hashing scheme with improved security against time-memory trade-offs,” Cryptology ePrint + Archive, Report 2015/136, 2015, http://eprint.iacr.org/. + +[13] C. Lee, “Litecoin - open source p2p digital currency,” https://bitcointalk.org/index.php?topic=47417.0, + 2011, https://litecoin.org/. + +[14] NIST, SHA-3 competition, 2007, http://csrc.nist.gov/groups/ST/hash/sha-3/index.html. + +[15] C. Percival, “Stronger key derivation via sequential memory-hard functions,” 2009, http://www.tarsnap. + com/scrypt/scrypt.pdf . + +[16] T. Ristenpart, E. Tromer, H. Shacham, and S. Savage, “Hey, you, get off of my cloud: exploring information + leakage in third-party compute clouds,” in ACM CCS’09, 2009, pp. 199–212. + +[17] M. Robshaw and O. Billet, New stream cipher designs: the eSTREAM finalists. Springer, 2008, vol. 4986. + +[18] C. D. Thompson, “Area-time complexity for VLSI,” in STOC’79. ACM, 1979, pp. 81–88. + +A Permutation P + +Permutation P is based on the round function of Blake2b and works as follows. Its 8 16-byte inputs S0, S1, . . . , S7 +are viewed as a 4 × 4-matrix of 64-bit words, where Si = (v2i+1||v2i): + +  v0 v1 v2 v3  + +  v4 v5 v6 v7  + +  v8 v9 v10 v11 +  + + v12 v13 v14 v15 + +Then we do + + G(v0, v4, v8, v12) G(v1, v5, v9, v13) + G(v2, v6, v10, v14) G(v3, v7, v11, v15) + G(v0, v5, v10, v15) G(v1, v6, v11, v12) + + G(v2, v7, v8, v13) G(v3, v4, v9, v14), + + 18 + where G applies to (a, b, c, d) as follows: + + a ← a + b + 2 ∗ aL ∗ bL; + d ← (d ⊕ a) ≫ 32; + c ← c + d + 2 ∗ cL ∗ dL; + b ← (b ⊕ c) ≫ 24; + + (3) + a ← a + b + 2 ∗ aL ∗ bL; + d ← (d ⊕ a) ≫ 16; + c ← c + d + 2 ∗ cL ∗ dL; + b ← (b ⊕ c) ≫ 63; + +Here + are additions modulo 264 and ≫ are 64-bit rotations to the right. xL is the 64-bit integer x truncated +to the 32 least significant bits. The modular additions in G are combined with 64-bit multiplications (that is +the only difference to the original Blake2 design). + + Our motivation in adding multiplications is to increase the circuit depth (and thus the running time) of +a potential ASIC implementation while having roughly the same running time on CPU thanks to parallelism +and pipelining. Extra multiplications in the scheme serve well, as the best addition-based circuits for multi- +plication have latency about 4-5 times the addition latency for 32-bit multiplication (or roughly logn for n-bit +multiplication). + + As a result, any output 64-bit word of P is implemented by a chain of additions, multiplications, XORs, and +rotations. The shortest possible chain for the 1 KB-block (e.g, from v0 to v0) consists of 12 MULs, 12 XORs, +and 12 rotations. + +B Additional functionality + +The following functionality is enabled in the extended implementation2 but is not officially included in the PHC +release3: + + • Hybrid construction Argon2id, which has type y = 2 (used in the pre-hashing and address generation). + In the first two slices of the first pass it generates reference addresses data-independently as in Argon2i, + whereas in later slices and next passes it generates them data-dependently as in Argon2d. + + • Sbox-hardened version Argon2ds, which has type y = 4. In this version the compression function G + includes the 64-bit transformation T , which is a chain of S-boxes, multiplications, and additions. In terms + of Section 3.4, we additionally compute + + W = LSB64(R0 ⊕ R63); + Z0+ = T (W ); + Z63+ = T (W ) 32. + + The transformation T , on the 64-bit word W is defined as follows: + + – Repeat 96 times: + 1. y ← S[W [8 : 0]]; + 2. z ← S[512 + W [40 : 32]]; + 3. W ← ((W [31 : 0] ◦ W [63 : 32]) + y) ⊕ z. + + – T (W ) ← W . + + All the operations are performed modulo 264. ◦ is the 64-bit multiplication, S[] is the Sbox (lookup table) + that maps 10-bit indices to 64-bit values. W [i : j] is the subset of bits of W from i to j inclusive. + The S-box is generated in the start of every pass in the following procedure. In total we specify 210 · 8 + bytes, or 8 KBytes. We take block B[0][0] and apply F (the core of G) to it 16 times. After each two + iterations we use the entire 1024-byte value and initialize 128 lookup values. + The properties of T and its initialization procedure is subject to change. + + 2https://github.com/khovratovich/Argon2 + 3https://github.com/P-H-C/phc-winner-argon2 + + 19 + C Change log + +C.1 v.1.3 + + • The blocks are XORed with, not overwritten in the second pass and later; + • The version number byte is now 0x13. + +C.2 v1.2.1 – February 1st, 2016 + + • The total number of blocks can reach 232 − 1; + • The reference block index now requires 64 bits; the lane number is computed separately. + • New modes Argon2id and Argon2ds are added as optional. +The specification of v1.2.1 released on 26th August, 2015, had incorrect description of the first block generation. +The version released on 2d September, 2015, had incorrect description of the counter used in generating addresses +for Argon2i. The version released on September 8th, 2015, lacked the ”Recommended parameters” section. The +version released on October 1st, 2015, had the maximal parallelism level of 255 lanes. The version released on +November 3d, 2015, had a typo. The versions released on November 5th and December 26th, had incorrect +description of the first block generation and the variable-length hash function. + +C.3 v1.2 – 21th June, 2015 + +Non-uniform indexing rule, the compression function gets multiplications. + +C.4 v1.1 – 6th February, 2015 + + • New indexing rule added to avoid collision with a proof. + • New rule to generate first two blocks in each lane. + • Non-zero constant added to the input block used to generate addresses in Argon2i. + + 20 + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/include/argon2.h b/deps/phc-winner-argon2-20190702/include/argon2.h new file mode 100644 index 000000000..fc8682c2d --- /dev/null +++ b/deps/phc-winner-argon2-20190702/include/argon2.h @@ -0,0 +1,437 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_H +#define ARGON2_H + +#include +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Symbols visibility control */ +#ifdef A2_VISCTL +#define ARGON2_PUBLIC __attribute__((visibility("default"))) +#define ARGON2_LOCAL __attribute__ ((visibility ("hidden"))) +#elif _MSC_VER +#define ARGON2_PUBLIC __declspec(dllexport) +#define ARGON2_LOCAL +#else +#define ARGON2_PUBLIC +#define ARGON2_LOCAL +#endif + +/* + * Argon2 input parameter restrictions + */ + +/* Minimum and maximum number of lanes (degree of parallelism) */ +#define ARGON2_MIN_LANES UINT32_C(1) +#define ARGON2_MAX_LANES UINT32_C(0xFFFFFF) + +/* Minimum and maximum number of threads */ +#define ARGON2_MIN_THREADS UINT32_C(1) +#define ARGON2_MAX_THREADS UINT32_C(0xFFFFFF) + +/* Number of synchronization points between lanes per pass */ +#define ARGON2_SYNC_POINTS UINT32_C(4) + +/* Minimum and maximum digest size in bytes */ +#define ARGON2_MIN_OUTLEN UINT32_C(4) +#define ARGON2_MAX_OUTLEN UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum number of memory blocks (each of BLOCK_SIZE bytes) */ +#define ARGON2_MIN_MEMORY (2 * ARGON2_SYNC_POINTS) /* 2 blocks per slice */ + +#define ARGON2_MIN(a, b) ((a) < (b) ? (a) : (b)) +/* Max memory size is addressing-space/2, topping at 2^32 blocks (4 TB) */ +#define ARGON2_MAX_MEMORY_BITS \ + ARGON2_MIN(UINT32_C(32), (sizeof(void *) * CHAR_BIT - 10 - 1)) +#define ARGON2_MAX_MEMORY \ + ARGON2_MIN(UINT32_C(0xFFFFFFFF), UINT64_C(1) << ARGON2_MAX_MEMORY_BITS) + +/* Minimum and maximum number of passes */ +#define ARGON2_MIN_TIME UINT32_C(1) +#define ARGON2_MAX_TIME UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum password length in bytes */ +#define ARGON2_MIN_PWD_LENGTH UINT32_C(0) +#define ARGON2_MAX_PWD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum associated data length in bytes */ +#define ARGON2_MIN_AD_LENGTH UINT32_C(0) +#define ARGON2_MAX_AD_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum salt length in bytes */ +#define ARGON2_MIN_SALT_LENGTH UINT32_C(8) +#define ARGON2_MAX_SALT_LENGTH UINT32_C(0xFFFFFFFF) + +/* Minimum and maximum key length in bytes */ +#define ARGON2_MIN_SECRET UINT32_C(0) +#define ARGON2_MAX_SECRET UINT32_C(0xFFFFFFFF) + +/* Flags to determine which fields are securely wiped (default = no wipe). */ +#define ARGON2_DEFAULT_FLAGS UINT32_C(0) +#define ARGON2_FLAG_CLEAR_PASSWORD (UINT32_C(1) << 0) +#define ARGON2_FLAG_CLEAR_SECRET (UINT32_C(1) << 1) + +/* Global flag to determine if we are wiping internal memory buffers. This flag + * is defined in core.c and defaults to 1 (wipe internal memory). */ +extern int FLAG_clear_internal_memory; + +/* Error codes */ +typedef enum Argon2_ErrorCodes { + ARGON2_OK = 0, + + ARGON2_OUTPUT_PTR_NULL = -1, + + ARGON2_OUTPUT_TOO_SHORT = -2, + ARGON2_OUTPUT_TOO_LONG = -3, + + ARGON2_PWD_TOO_SHORT = -4, + ARGON2_PWD_TOO_LONG = -5, + + ARGON2_SALT_TOO_SHORT = -6, + ARGON2_SALT_TOO_LONG = -7, + + ARGON2_AD_TOO_SHORT = -8, + ARGON2_AD_TOO_LONG = -9, + + ARGON2_SECRET_TOO_SHORT = -10, + ARGON2_SECRET_TOO_LONG = -11, + + ARGON2_TIME_TOO_SMALL = -12, + ARGON2_TIME_TOO_LARGE = -13, + + ARGON2_MEMORY_TOO_LITTLE = -14, + ARGON2_MEMORY_TOO_MUCH = -15, + + ARGON2_LANES_TOO_FEW = -16, + ARGON2_LANES_TOO_MANY = -17, + + ARGON2_PWD_PTR_MISMATCH = -18, /* NULL ptr with non-zero length */ + ARGON2_SALT_PTR_MISMATCH = -19, /* NULL ptr with non-zero length */ + ARGON2_SECRET_PTR_MISMATCH = -20, /* NULL ptr with non-zero length */ + ARGON2_AD_PTR_MISMATCH = -21, /* NULL ptr with non-zero length */ + + ARGON2_MEMORY_ALLOCATION_ERROR = -22, + + ARGON2_FREE_MEMORY_CBK_NULL = -23, + ARGON2_ALLOCATE_MEMORY_CBK_NULL = -24, + + ARGON2_INCORRECT_PARAMETER = -25, + ARGON2_INCORRECT_TYPE = -26, + + ARGON2_OUT_PTR_MISMATCH = -27, + + ARGON2_THREADS_TOO_FEW = -28, + ARGON2_THREADS_TOO_MANY = -29, + + ARGON2_MISSING_ARGS = -30, + + ARGON2_ENCODING_FAIL = -31, + + ARGON2_DECODING_FAIL = -32, + + ARGON2_THREAD_FAIL = -33, + + ARGON2_DECODING_LENGTH_FAIL = -34, + + ARGON2_VERIFY_MISMATCH = -35 +} argon2_error_codes; + +/* Memory allocator types --- for external allocation */ +typedef int (*allocate_fptr)(uint8_t **memory, size_t bytes_to_allocate); +typedef void (*deallocate_fptr)(uint8_t *memory, size_t bytes_to_allocate); + +/* Argon2 external data structures */ + +/* + ***** + * Context: structure to hold Argon2 inputs: + * output array and its length, + * password and its length, + * salt and its length, + * secret and its length, + * associated data and its length, + * number of passes, amount of used memory (in KBytes, can be rounded up a bit) + * number of parallel threads that will be run. + * All the parameters above affect the output hash value. + * Additionally, two function pointers can be provided to allocate and + * deallocate the memory (if NULL, memory will be allocated internally). + * Also, three flags indicate whether to erase password, secret as soon as they + * are pre-hashed (and thus not needed anymore), and the entire memory + ***** + * Simplest situation: you have output array out[8], password is stored in + * pwd[32], salt is stored in salt[16], you do not have keys nor associated + * data. You need to spend 1 GB of RAM and you run 5 passes of Argon2d with + * 4 parallel lanes. + * You want to erase the password, but you're OK with last pass not being + * erased. You want to use the default memory allocator. + * Then you initialize: + Argon2_Context(out,8,pwd,32,salt,16,NULL,0,NULL,0,5,1<<20,4,4,NULL,NULL,true,false,false,false) + */ +typedef struct Argon2_Context { + uint8_t *out; /* output array */ + uint32_t outlen; /* digest length */ + + uint8_t *pwd; /* password array */ + uint32_t pwdlen; /* password length */ + + uint8_t *salt; /* salt array */ + uint32_t saltlen; /* salt length */ + + uint8_t *secret; /* key array */ + uint32_t secretlen; /* key length */ + + uint8_t *ad; /* associated data array */ + uint32_t adlen; /* associated data length */ + + uint32_t t_cost; /* number of passes */ + uint32_t m_cost; /* amount of memory requested (KB) */ + uint32_t lanes; /* number of lanes */ + uint32_t threads; /* maximum number of threads */ + + uint32_t version; /* version number */ + + allocate_fptr allocate_cbk; /* pointer to memory allocator */ + deallocate_fptr free_cbk; /* pointer to memory deallocator */ + + uint32_t flags; /* array of bool options */ +} argon2_context; + +/* Argon2 primitive type */ +typedef enum Argon2_type { + Argon2_d = 0, + Argon2_i = 1, + Argon2_id = 2 +} argon2_type; + +/* Version of the algorithm */ +typedef enum Argon2_version { + ARGON2_VERSION_10 = 0x10, + ARGON2_VERSION_13 = 0x13, + ARGON2_VERSION_NUMBER = ARGON2_VERSION_13 +} argon2_version; + +/* + * Function that gives the string representation of an argon2_type. + * @param type The argon2_type that we want the string for + * @param uppercase Whether the string should have the first letter uppercase + * @return NULL if invalid type, otherwise the string representation. + */ +ARGON2_PUBLIC const char *argon2_type2string(argon2_type type, int uppercase); + +/* + * Function that performs memory-hard hashing with certain degree of parallelism + * @param context Pointer to the Argon2 internal structure + * @return Error code if smth is wrong, ARGON2_OK otherwise + */ +ARGON2_PUBLIC int argon2_ctx(argon2_context *context, argon2_type type); + +/** + * Hashes a password with Argon2i, producing an encoded hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hashlen Desired length of the hash in bytes + * @param encoded Buffer where to write the encoded hash + * @param encodedlen Size of the buffer (thus max size of the encoded hash) + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +/** + * Hashes a password with Argon2i, producing a raw hash at @hash + * @param t_cost Number of iterations + * @param m_cost Sets memory usage to m_cost kibibytes + * @param parallelism Number of threads and compute lanes + * @param pwd Pointer to password + * @param pwdlen Password size in bytes + * @param salt Pointer to salt + * @param saltlen Salt size in bytes + * @param hash Buffer where to write the raw hash - updated by the function + * @param hashlen Desired length of the hash in bytes + * @pre Different parallelism levels will give different results + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2d_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +ARGON2_PUBLIC int argon2id_hash_encoded(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, + const void *pwd, const size_t pwdlen, + const void *salt, const size_t saltlen, + const size_t hashlen, char *encoded, + const size_t encodedlen); + +ARGON2_PUBLIC int argon2id_hash_raw(const uint32_t t_cost, + const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_hash(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, + const size_t hashlen, char *encoded, + const size_t encodedlen, argon2_type type, + const uint32_t version); + +/** + * Verifies a password against an encoded string + * Encoded string is restricted as in validate_inputs() + * @param encoded String encoding parameters, salt, hash + * @param pwd Pointer to password + * @pre Returns ARGON2_OK if successful + */ +ARGON2_PUBLIC int argon2i_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2d_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +ARGON2_PUBLIC int argon2id_verify(const char *encoded, const void *pwd, + const size_t pwdlen); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify(const char *encoded, const void *pwd, + const size_t pwdlen, argon2_type type); + +/** + * Argon2d: Version of Argon2 that picks memory blocks depending + * on the password and salt. Only for side-channel-free + * environment!! + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_ctx(argon2_context *context); + +/** + * Argon2i: Version of Argon2 that picks memory blocks + * independent on the password and salt. Good for side-channels, + * but worse w.r.t. tradeoff attacks if only one pass is used. + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_ctx(argon2_context *context); + +/** + * Argon2id: Version of Argon2 where the first half-pass over memory is + * password-independent, the rest are password-dependent (on the password and + * salt). OK against side channels (they reduce to 1/2-pass Argon2i), and + * better with w.r.t. tradeoff attacks (similar to Argon2d). + ***** + * @param context Pointer to current Argon2 context + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_ctx(argon2_context *context); + +/** + * Verify if a given password is correct for Argon2d hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2d_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2i hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2i_verify_ctx(argon2_context *context, const char *hash); + +/** + * Verify if a given password is correct for Argon2id hashing + * @param context Pointer to current Argon2 context + * @param hash The password hash to verify. The length of the hash is + * specified by the context outlen member + * @return Zero if successful, a non zero error code otherwise + */ +ARGON2_PUBLIC int argon2id_verify_ctx(argon2_context *context, + const char *hash); + +/* generic function underlying the above ones */ +ARGON2_PUBLIC int argon2_verify_ctx(argon2_context *context, const char *hash, + argon2_type type); + +/** + * Get the associated error message for given error code + * @return The error message associated with the given error code + */ +ARGON2_PUBLIC const char *argon2_error_message(int error_code); + +/** + * Returns the encoded hash length for the given input parameters + * @param t_cost Number of iterations + * @param m_cost Memory usage in kibibytes + * @param parallelism Number of threads; used to compute lanes + * @param saltlen Salt size in bytes + * @param hashlen Hash size in bytes + * @param type The argon2_type that we want the encoded length for + * @return The encoded hash length in bytes + */ +ARGON2_PUBLIC size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, + uint32_t parallelism, uint32_t saltlen, + uint32_t hashlen, argon2_type type); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/deps/phc-winner-argon2-20190702/kats/argon2d b/deps/phc-winner-argon2-20190702/kats/argon2d new file mode 100644 index 000000000..760cd3154 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2d @@ -0,0 +1,12304 @@ +======================================= +Argon2d version number 19 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: b8 81 97 91 a0 35 96 60 bb 77 09 c8 5f a4 8f 04 d5 d8 2c 05 c5 f2 15 cc db 88 54 91 71 7c f7 57 08 2c 28 b9 51 be 38 14 10 b5 fc 2e b7 27 40 33 b9 fd c7 ae 67 2b ca ac 5d 17 90 97 a4 af 31 09 + + After pass 0: +Block 0000 [ 0]: db2fea6b2c6f5c8a +Block 0000 [ 1]: 719413be00f82634 +Block 0000 [ 2]: a1e3f6dd42aa25cc +Block 0000 [ 3]: 3ea8efd4d55ac0d1 +Block 0000 [ 4]: 1278849d789aa327 +Block 0000 [ 5]: 54ec500e01cb4887 +Block 0000 [ 6]: 96c5956594a99199 +Block 0000 [ 7]: 54ef81c17e9b4b85 +Block 0000 [ 8]: baed2f6297b02ec0 +Block 0000 [ 9]: 4aaabe9242c77d92 +Block 0000 [ 10]: 77ee20571b300aba +Block 0000 [ 11]: f3eb71a1198a6329 +Block 0000 [ 12]: 426d5f6ae87a9437 +Block 0000 [ 13]: 6da602fb6e9da76f +Block 0000 [ 14]: 6cd3a4c30d15d1c8 +Block 0000 [ 15]: 5d2b71f0503a6081 +Block 0000 [ 16]: 5546d897e9ff2979 +Block 0000 [ 17]: 3f4dfa67e5766a1e +Block 0000 [ 18]: 4124d05b5a90526c +Block 0000 [ 19]: 7fdf2f081232cf92 +Block 0000 [ 20]: 5966a32b400ba845 +Block 0000 [ 21]: 1bc8d3001e30b570 +Block 0000 [ 22]: ab4f59b1db7de22c +Block 0000 [ 23]: c8c3b695f2999d99 +Block 0000 [ 24]: ed809c6fb5b3e08b +Block 0000 [ 25]: a35525b5cdb05508 +Block 0000 [ 26]: be72096c694a09a5 +Block 0000 [ 27]: e64fb95af6124cdb +Block 0000 [ 28]: 1283aca69967b329 +Block 0000 [ 29]: 573a3c93e1c4d2d0 +Block 0000 [ 30]: 4fe159afa866e46a +Block 0000 [ 31]: e1613f8cea969fb2 +Block 0000 [ 32]: 337f483e3cc6d5ff +Block 0000 [ 33]: 3434681c54e6162b +Block 0000 [ 34]: a02a65f1c3451133 +Block 0000 [ 35]: 9b5f838814d81637 +Block 0000 [ 36]: 52327c997c05bd67 +Block 0000 [ 37]: 49ceb51f96966824 +Block 0000 [ 38]: 589749ef2ded3cef +Block 0000 [ 39]: 369a0a5a280aceef +Block 0000 [ 40]: 53d2c8db35d546df +Block 0000 [ 41]: 437a8603e4c91a8b +Block 0000 [ 42]: 4a4642967b88dcda +Block 0000 [ 43]: 4b67d8a64d98ce65 +Block 0000 [ 44]: 7a51353e30a4d18c +Block 0000 [ 45]: ecfb8e818ddb5e3a +Block 0000 [ 46]: 687554e011af89b3 +Block 0000 [ 47]: 754ef2b08241903f +Block 0000 [ 48]: 898ed0d448d9bf80 +Block 0000 [ 49]: f98e7b29f668f39d +Block 0000 [ 50]: 1593baefbd91bcef +Block 0000 [ 51]: 9f48d75f063a4247 +Block 0000 [ 52]: b44c4730eb25dbde +Block 0000 [ 53]: ab1984298888f3be +Block 0000 [ 54]: 99636cee27f6ff9c +Block 0000 [ 55]: d771122043a2bcf5 +Block 0000 [ 56]: 99b7cdcb1768b8fc +Block 0000 [ 57]: c784bfc27e55790d +Block 0000 [ 58]: 587a90b47c57f0ee +Block 0000 [ 59]: c114a05eba21ff32 +Block 0000 [ 60]: 7fdceebe6889d888 +Block 0000 [ 61]: 1cbcf477efde21b7 +Block 0000 [ 62]: 4d9c10146cc32cc1 +Block 0000 [ 63]: 6fd032cd8f4bad32 +Block 0000 [ 64]: 05d46657a397048c +Block 0000 [ 65]: 5b4d561105d0db07 +Block 0000 [ 66]: c97ac2acc721fc88 +Block 0000 [ 67]: 93320ace2a54681d +Block 0000 [ 68]: 43dae71f04080ccf +Block 0000 [ 69]: 39f3a8dcbfa87912 +Block 0000 [ 70]: 27425b8b6f328d71 +Block 0000 [ 71]: 514b4457fe7aba28 +Block 0000 [ 72]: 258a430d30f0bc9f +Block 0000 [ 73]: 8d02b571f1c44624 +Block 0000 [ 74]: 296d7de559b099b0 +Block 0000 [ 75]: dbf8f772a054c3c1 +Block 0000 [ 76]: 19ec7cacf3967d0b +Block 0000 [ 77]: a40ba6bb7cbde791 +Block 0000 [ 78]: 43e99ec3f241aab7 +Block 0000 [ 79]: 12201cfde1128feb +Block 0000 [ 80]: 08b7689bb28fbeb7 +Block 0000 [ 81]: 2e96cc1546add647 +Block 0000 [ 82]: 65f12262aec7f677 +Block 0000 [ 83]: 462f640439ce4d40 +Block 0000 [ 84]: f2bc0d2e1b36d570 +Block 0000 [ 85]: 768cc6c87b6301e0 +Block 0000 [ 86]: bc4723908e88ff53 +Block 0000 [ 87]: 7887e378709a8b42 +Block 0000 [ 88]: de34544f59b8c144 +Block 0000 [ 89]: 84f7bb9129ea343a +Block 0000 [ 90]: f375bae1f1471e11 +Block 0000 [ 91]: 05c203052706f0dc +Block 0000 [ 92]: 627c32574d945282 +Block 0000 [ 93]: 5ff520c44d1cca7e +Block 0000 [ 94]: 06488dc3ccb24791 +Block 0000 [ 95]: 380fd531ccc2bc8d +Block 0000 [ 96]: 44d564d042d8a8e1 +Block 0000 [ 97]: ed01c6baed1cfd77 +Block 0000 [ 98]: 09e03973e4c4e8d0 +Block 0000 [ 99]: 0e814a59b8165a88 +Block 0000 [100]: 3ecd0fbe0196bb77 +Block 0000 [101]: 7fc4b520e11e8e47 +Block 0000 [102]: b77b6f2a5d754c6a +Block 0000 [103]: cd7869cb41b4e93d +Block 0000 [104]: b33588ab98af17a7 +Block 0000 [105]: 4667595e8112205d +Block 0000 [106]: 7fb587f723c62728 +Block 0000 [107]: e1f5311b30106b58 +Block 0000 [108]: f289ca11b2e3df4f +Block 0000 [109]: d50eab9479264fcc +Block 0000 [110]: 320bd31fa0ae830e +Block 0000 [111]: 458d7359106a0631 +Block 0000 [112]: c579ebd5456d59ea +Block 0000 [113]: 7de55d003eaaa255 +Block 0000 [114]: 7177eaaf395d9c67 +Block 0000 [115]: 9714192984bce397 +Block 0000 [116]: 16facb8107b05308 +Block 0000 [117]: 21d794cd54c9b151 +Block 0000 [118]: c9f71fa973d25883 +Block 0000 [119]: fdf9f60a11255ce8 +Block 0000 [120]: ae921043f61ba204 +Block 0000 [121]: 5636e1c68a2db5a5 +Block 0000 [122]: 6359770f48a1970f +Block 0000 [123]: e5ccffd488d54ca1 +Block 0000 [124]: 89e89ce9a892a965 +Block 0000 [125]: 11a1d552040e9f67 +Block 0000 [126]: 921a0dd7aead4224 +Block 0000 [127]: 8b298b5c367f7b39 +Block 0001 [ 0]: f7180a33ba9d571c +Block 0001 [ 1]: a34284b17ff613ff +Block 0001 [ 2]: 88fb62505306e91b +Block 0001 [ 3]: 99182c1bbe35a905 +Block 0001 [ 4]: b22b57179b3b38cb +Block 0001 [ 5]: 7dd134b46391e700 +Block 0001 [ 6]: cfa78494d6edc163 +Block 0001 [ 7]: d6e11db6febc3b53 +Block 0001 [ 8]: 3a1182fff056748a +Block 0001 [ 9]: 4a546d640288712c +Block 0001 [ 10]: 2574029c58ef3efd +Block 0001 [ 11]: 34c73cddabec3e98 +Block 0001 [ 12]: ed1138549ca015b4 +Block 0001 [ 13]: af132ca0de9e5e4d +Block 0001 [ 14]: c3800df9c81a2654 +Block 0001 [ 15]: b07f5cac8decb77e +Block 0001 [ 16]: 3bf88cbd16fac9a5 +Block 0001 [ 17]: 01e8b1c2acde7da5 +Block 0001 [ 18]: 5cc42f01d1ca339b +Block 0001 [ 19]: e808119da64d5035 +Block 0001 [ 20]: 27f2dc395d740631 +Block 0001 [ 21]: 3435bb42bcf41e3f +Block 0001 [ 22]: efd51e8fd8f75262 +Block 0001 [ 23]: 0218cd8cb64d7666 +Block 0001 [ 24]: 8751a679668aaaa0 +Block 0001 [ 25]: df274353f81f7884 +Block 0001 [ 26]: a0b214e15caa0ad5 +Block 0001 [ 27]: b6fdbdee571b01b4 +Block 0001 [ 28]: 72246eb1622ec154 +Block 0001 [ 29]: 4c1c25982d6f2dab +Block 0001 [ 30]: 05b9f3e0ad168986 +Block 0001 [ 31]: 27bff0a68798a1d0 +Block 0001 [ 32]: 1f44db82c1c7e7fe +Block 0001 [ 33]: ffb3bdab65bc7d2c +Block 0001 [ 34]: 450d02c9a8dd071d +Block 0001 [ 35]: a88d77a0da1d2dd9 +Block 0001 [ 36]: 50c6a8c821450618 +Block 0001 [ 37]: 5fb848148850ad38 +Block 0001 [ 38]: a192eab246a0d110 +Block 0001 [ 39]: 22b17b7a5626f975 +Block 0001 [ 40]: fb31ad45afb66ba4 +Block 0001 [ 41]: a7ec0feb0c44495e +Block 0001 [ 42]: 3405f81d4bbf5aef +Block 0001 [ 43]: b00e2aae495a4bc4 +Block 0001 [ 44]: b15206a8c175cb1f +Block 0001 [ 45]: 8096bb72edfd1cfd +Block 0001 [ 46]: 2deb7c3265f94a3a +Block 0001 [ 47]: 3248bbee1e385785 +Block 0001 [ 48]: 96697465d6c51a2d +Block 0001 [ 49]: f46460debf517212 +Block 0001 [ 50]: 8194fc09854dd60b +Block 0001 [ 51]: 66a7a5738655b4d8 +Block 0001 [ 52]: 04148cf4680acf01 +Block 0001 [ 53]: 8fdee6c9070506cb +Block 0001 [ 54]: 456e54d5edc02b52 +Block 0001 [ 55]: d3c3e074fa5c58d6 +Block 0001 [ 56]: 9144d1c46832b26c +Block 0001 [ 57]: 765be92b893ee7a6 +Block 0001 [ 58]: d3639b2617c63271 +Block 0001 [ 59]: 34dbc7ed83967845 +Block 0001 [ 60]: 59f7b9d2e55f9ad8 +Block 0001 [ 61]: e861b20bbc3bc7cc +Block 0001 [ 62]: 69ef1a8b7352058f +Block 0001 [ 63]: 1c4557528f2ff680 +Block 0001 [ 64]: f1272b295306297c +Block 0001 [ 65]: be1b32fdcdac3f89 +Block 0001 [ 66]: bfff0baee51735ac +Block 0001 [ 67]: badb585f9cacf724 +Block 0001 [ 68]: ba38493300e4c942 +Block 0001 [ 69]: 430dff3571065a0a +Block 0001 [ 70]: af2a00e52bd7ec7e +Block 0001 [ 71]: 675229a78358e776 +Block 0001 [ 72]: a81efa39233ddd81 +Block 0001 [ 73]: 32f0b4679eb2dbdd +Block 0001 [ 74]: e1b46c89f5a2691e +Block 0001 [ 75]: a81885bd728f95fd +Block 0001 [ 76]: b1e8fc4fac462cf9 +Block 0001 [ 77]: be28523020ce0b37 +Block 0001 [ 78]: 2b9b38ffae3df39f +Block 0001 [ 79]: d2e3a40120592659 +Block 0001 [ 80]: 083ae5a798856693 +Block 0001 [ 81]: 14fefaad3bbe20b1 +Block 0001 [ 82]: 7ccac041eca182df +Block 0001 [ 83]: 8e876b4533ba59a1 +Block 0001 [ 84]: 5050743b0198dcc4 +Block 0001 [ 85]: 6425fc13b0a6cb97 +Block 0001 [ 86]: edde0a4351adcbe9 +Block 0001 [ 87]: 643dc67ddccebeb8 +Block 0001 [ 88]: 1d06ff28237de139 +Block 0001 [ 89]: 695b7cfdb1cc33e8 +Block 0001 [ 90]: e5d1775842a51de5 +Block 0001 [ 91]: dd8925515ad2950b +Block 0001 [ 92]: 389f14e2e2ab7033 +Block 0001 [ 93]: 41f3a503fb7a542f +Block 0001 [ 94]: 29f6e2d8120e935d +Block 0001 [ 95]: 5ecee71853759564 +Block 0001 [ 96]: 0d2c0e7325f39d1d +Block 0001 [ 97]: 79549a2458b19519 +Block 0001 [ 98]: 595af605c0a319ea +Block 0001 [ 99]: 3fdad667164a1aeb +Block 0001 [100]: c0664af6ef191a7c +Block 0001 [101]: a5ba28896955c8b8 +Block 0001 [102]: da00aa274bdb05ec +Block 0001 [103]: 3e15c6cbcb67b2be +Block 0001 [104]: 85f2be2974588e9d +Block 0001 [105]: d9f37bb0e736a36f +Block 0001 [106]: dce4bc3edd830140 +Block 0001 [107]: 6151537aaa93f696 +Block 0001 [108]: 42beb3252800334a +Block 0001 [109]: 3b58a554b8973b60 +Block 0001 [110]: 6ef0f8dda98652ef +Block 0001 [111]: 2fadd0a1930dd7c3 +Block 0001 [112]: 06b2ce7bc4b8b503 +Block 0001 [113]: 66e4e2c48bcbf641 +Block 0001 [114]: d24e0268ad250901 +Block 0001 [115]: 7d4595caf0fa8581 +Block 0001 [116]: 2be6d7e0c8869901 +Block 0001 [117]: f75aec50f13b97fe +Block 0001 [118]: 2e090b419d1d2ff3 +Block 0001 [119]: 99ef2bbc132c7155 +Block 0001 [120]: 5f9196f038304a92 +Block 0001 [121]: 7152b4c3f11df557 +Block 0001 [122]: 03df91b1ddc97e7f +Block 0001 [123]: bb0e53bdfc8fb73c +Block 0001 [124]: cba896c6ecc4bee5 +Block 0001 [125]: fecc10891efb9caf +Block 0001 [126]: ec052df7554e2e7b +Block 0001 [127]: 4924c3dc10d8fd85 +Block 0002 [ 0]: dd269d6d1fe274bd +Block 0002 [ 1]: eaf87fd713312aeb +Block 0002 [ 2]: 8d4ba63951096c16 +Block 0002 [ 3]: 426a1231958f05d5 +Block 0002 [ 4]: 3b8b0f1949550baa +Block 0002 [ 5]: 8f61aad93507eb55 +Block 0002 [ 6]: 677e1f8f34ce88f2 +Block 0002 [ 7]: c4b1c172380afc85 +Block 0002 [ 8]: 6e3aa0bfda9f3090 +Block 0002 [ 9]: 7cab00b1179c425b +Block 0002 [ 10]: f97da6d4297c917d +Block 0002 [ 11]: ac4a2bca1203dc84 +Block 0002 [ 12]: bb3163556d3ecc3e +Block 0002 [ 13]: 3458c59f278ef520 +Block 0002 [ 14]: 4549b4a48a89f736 +Block 0002 [ 15]: 9c3356014b48be9d +Block 0002 [ 16]: a92c3171216be701 +Block 0002 [ 17]: b7c00ce80fb29dae +Block 0002 [ 18]: da49b7a803cfd49b +Block 0002 [ 19]: d6565369d2052776 +Block 0002 [ 20]: 6cfe1feda4d9c1fd +Block 0002 [ 21]: 8c8913c30028cc74 +Block 0002 [ 22]: bb866e6957a36aef +Block 0002 [ 23]: 5cb63399402b4668 +Block 0002 [ 24]: 1b5456d4cb6636de +Block 0002 [ 25]: c8fa9edf08541cef +Block 0002 [ 26]: 58832e65eda9309d +Block 0002 [ 27]: 143fde9eaacfc468 +Block 0002 [ 28]: 1ea0be670283ac5e +Block 0002 [ 29]: db0aa713e7be541b +Block 0002 [ 30]: 4c5fa13cec7b9957 +Block 0002 [ 31]: e40be01efef834fc +Block 0002 [ 32]: ee247ad65634a5d3 +Block 0002 [ 33]: 3dbb2e31d2ccfa7d +Block 0002 [ 34]: 0a910887da788607 +Block 0002 [ 35]: 94afaa1f565ad409 +Block 0002 [ 36]: de8c385415b7c6e9 +Block 0002 [ 37]: 9d70874bf5eba118 +Block 0002 [ 38]: 6c07b9fa57d5bc8f +Block 0002 [ 39]: 86c2e0eb098d1eba +Block 0002 [ 40]: 2e9cad031109ec88 +Block 0002 [ 41]: 54e83cba6599e437 +Block 0002 [ 42]: 16f1cd22843661be +Block 0002 [ 43]: d628ed0e9ee3d343 +Block 0002 [ 44]: fa8d3b772d22f922 +Block 0002 [ 45]: e4ea1efae60bb099 +Block 0002 [ 46]: 3f8abd4f93844c49 +Block 0002 [ 47]: 72e39e393fc65f19 +Block 0002 [ 48]: 70b3c48abd5ebefe +Block 0002 [ 49]: a251c297f3c9f146 +Block 0002 [ 50]: b6e8da00c83218fb +Block 0002 [ 51]: 502a5e772bac9098 +Block 0002 [ 52]: c717742be58356a3 +Block 0002 [ 53]: afca5b096967d6ab +Block 0002 [ 54]: e97c55d4c7dad2a1 +Block 0002 [ 55]: 452751179df9ea88 +Block 0002 [ 56]: 0789c627ffdbb196 +Block 0002 [ 57]: afa3e13bc2d20692 +Block 0002 [ 58]: c4a9f186650522d8 +Block 0002 [ 59]: a639b0ac85816a68 +Block 0002 [ 60]: a7e813fdfcdb17e0 +Block 0002 [ 61]: 6b9072999b6c766b +Block 0002 [ 62]: c8723a14860af1bc +Block 0002 [ 63]: 175f7fcaf3e3efad +Block 0002 [ 64]: b5dff4ca01082962 +Block 0002 [ 65]: ebf7904697e3e152 +Block 0002 [ 66]: 238a9ceb07db6e94 +Block 0002 [ 67]: dc6c845e0fb7b398 +Block 0002 [ 68]: b5c6122ec3ad1ced +Block 0002 [ 69]: 18f1239a9c6258b6 +Block 0002 [ 70]: 889553b3e5186020 +Block 0002 [ 71]: e46d535f909cff62 +Block 0002 [ 72]: 782fc6a6da899195 +Block 0002 [ 73]: d66602106655e56f +Block 0002 [ 74]: 92b3cea5bda0d657 +Block 0002 [ 75]: ceeac95de2189f8b +Block 0002 [ 76]: cf7d9de3742c540a +Block 0002 [ 77]: 709e7e293a012642 +Block 0002 [ 78]: a07915b0f1ebe100 +Block 0002 [ 79]: b07e80cc2b5dd3e3 +Block 0002 [ 80]: 20ac6fdb448fa0b2 +Block 0002 [ 81]: 94b9942695cbcbb8 +Block 0002 [ 82]: 311f8aaad789bf73 +Block 0002 [ 83]: caf04e5284e0c654 +Block 0002 [ 84]: 9300c30779fe56e4 +Block 0002 [ 85]: f8522aa857490cb1 +Block 0002 [ 86]: 4541922c719d65b4 +Block 0002 [ 87]: a8fe52948c78bea0 +Block 0002 [ 88]: 05c64d5df890f39a +Block 0002 [ 89]: 616ed72012588251 +Block 0002 [ 90]: e0b43de5aaa660e6 +Block 0002 [ 91]: d3531c2cc462424d +Block 0002 [ 92]: 8925e663e8112ab0 +Block 0002 [ 93]: 6e0c51f4b5123b69 +Block 0002 [ 94]: b9a46e0bbaf718c6 +Block 0002 [ 95]: 354c84845c1ea679 +Block 0002 [ 96]: f938f8aeb1dac4aa +Block 0002 [ 97]: 9ce45e15a40dabc0 +Block 0002 [ 98]: 05a443a6d5c0070d +Block 0002 [ 99]: 58de4d3dd78a1f71 +Block 0002 [100]: 7f46561d7b1884b4 +Block 0002 [101]: 3afa62f2f1882385 +Block 0002 [102]: a8242521b2a2dd09 +Block 0002 [103]: e9dd6211f0edc6b1 +Block 0002 [104]: 3684ae9600a661ee +Block 0002 [105]: 3c493b527698fa4a +Block 0002 [106]: acdf8c0ae547bf39 +Block 0002 [107]: cced5db75028ec30 +Block 0002 [108]: e592a369b0df07a2 +Block 0002 [109]: 1447b2d76a0d8b57 +Block 0002 [110]: 8d47814289002e20 +Block 0002 [111]: 8a6cebabe4bfa78c +Block 0002 [112]: b8d5c24d475de52d +Block 0002 [113]: b43ad32ce94d37dc +Block 0002 [114]: 21eca5ff11480da7 +Block 0002 [115]: 13fd97e3efa96b0d +Block 0002 [116]: 8a12187717976abd +Block 0002 [117]: 1a2bc270ca0f2856 +Block 0002 [118]: b836d6475e15f2e2 +Block 0002 [119]: 04f88dfdfd8b2a72 +Block 0002 [120]: ff9c5c6d0d288ad7 +Block 0002 [121]: e177fc6eef6599d8 +Block 0002 [122]: 6b4cb722482ae069 +Block 0002 [123]: aa3b58c166564292 +Block 0002 [124]: 75284d7db7495afa +Block 0002 [125]: a2223c5243a84893 +Block 0002 [126]: e980aaf0fc08301c +Block 0002 [127]: 07e96a224564f561 +Block 0003 [ 0]: 4a5f33e4aa0f4b24 +Block 0003 [ 1]: 74b1599a751a0e40 +Block 0003 [ 2]: 7648bcbafa8fde0e +Block 0003 [ 3]: 472fbc3e7f818be3 +Block 0003 [ 4]: 56a81d1eb0f4e388 +Block 0003 [ 5]: 822b3f5e6b6b1730 +Block 0003 [ 6]: ba45580cb101f4cc +Block 0003 [ 7]: 290754d62e6cce7a +Block 0003 [ 8]: 948f647900b662a2 +Block 0003 [ 9]: 57cfc6df71cf71a0 +Block 0003 [ 10]: 1722ac5aa4429df7 +Block 0003 [ 11]: 2bd56131730893d5 +Block 0003 [ 12]: 3b0fac05fe49310f +Block 0003 [ 13]: 59b94558676c1875 +Block 0003 [ 14]: 712fbccf992c1cfd +Block 0003 [ 15]: ab4c1e67173c95b7 +Block 0003 [ 16]: ca78ac3f3ec05fe1 +Block 0003 [ 17]: 4329991ad1d32531 +Block 0003 [ 18]: 67a577f45b95df88 +Block 0003 [ 19]: 2620b3d3889afff5 +Block 0003 [ 20]: b62732e9b207855c +Block 0003 [ 21]: ec4bac9eff014e78 +Block 0003 [ 22]: d936c2876fc1d56f +Block 0003 [ 23]: 41b37f7919dafd36 +Block 0003 [ 24]: 34f5bfc510b6f1bd +Block 0003 [ 25]: 700780640ab9aa78 +Block 0003 [ 26]: d16e7c95b49d7362 +Block 0003 [ 27]: 6544429cd2615175 +Block 0003 [ 28]: dabf343588eaf771 +Block 0003 [ 29]: d72449a5b3ab5873 +Block 0003 [ 30]: d9b9ca7d55747d23 +Block 0003 [ 31]: 2ece4be1cf5a2e99 +Block 0003 [ 32]: c6cdbc8cd725a922 +Block 0003 [ 33]: b139079c53fcbfd0 +Block 0003 [ 34]: 1e88db198f64fbd3 +Block 0003 [ 35]: 125b55f14ba51789 +Block 0003 [ 36]: 6f96b80b90a7fa45 +Block 0003 [ 37]: 406198e24a0ba096 +Block 0003 [ 38]: a29105896050b5e0 +Block 0003 [ 39]: 945d9788677d3391 +Block 0003 [ 40]: 802e7d305cd63255 +Block 0003 [ 41]: daacbbd0c7393898 +Block 0003 [ 42]: 2610a8d13ebdbe60 +Block 0003 [ 43]: d5953fef56fcf812 +Block 0003 [ 44]: f711a340a8c0c1f2 +Block 0003 [ 45]: d9c066e38168c679 +Block 0003 [ 46]: 6517a2cf0f0ea78c +Block 0003 [ 47]: 48985cd46ec3b306 +Block 0003 [ 48]: 6dc9a39170160a16 +Block 0003 [ 49]: f647600f302a0941 +Block 0003 [ 50]: 04102af1501b521b +Block 0003 [ 51]: 28c50bb275ef128c +Block 0003 [ 52]: c3e7d482090ce9e2 +Block 0003 [ 53]: b6879bee4977d1cf +Block 0003 [ 54]: 8b9d6ef567071bee +Block 0003 [ 55]: 2b02981d3c7fce71 +Block 0003 [ 56]: 1ada3aea276be7af +Block 0003 [ 57]: dd145aeadac33204 +Block 0003 [ 58]: ab18e04356a208a0 +Block 0003 [ 59]: d6e184c97d4b3864 +Block 0003 [ 60]: 3a7507d44c2d6917 +Block 0003 [ 61]: 64bd5b00012136ce +Block 0003 [ 62]: ed77dbf556e054a6 +Block 0003 [ 63]: dca248d800bc89ba +Block 0003 [ 64]: 8f74a5e29933e192 +Block 0003 [ 65]: 59b0460e3583e5ab +Block 0003 [ 66]: ed815fb3133ec6c7 +Block 0003 [ 67]: 151bdbadc9630fc2 +Block 0003 [ 68]: 6096f9a38b0bfdc6 +Block 0003 [ 69]: eaf65100a3cf5c50 +Block 0003 [ 70]: a9f4151b1b900586 +Block 0003 [ 71]: a695457135b20cd3 +Block 0003 [ 72]: ef6c6aac3a3a5497 +Block 0003 [ 73]: e0bb4329cc078888 +Block 0003 [ 74]: 1891f398b5d96011 +Block 0003 [ 75]: fa649c2bca16084d +Block 0003 [ 76]: 1c67e25f5fc82933 +Block 0003 [ 77]: 40b9806b0dee3332 +Block 0003 [ 78]: d91d9eab04d8e05b +Block 0003 [ 79]: 4bfca65c71cae454 +Block 0003 [ 80]: b276a2157bab9cbb +Block 0003 [ 81]: b87f21190c7825f6 +Block 0003 [ 82]: 5d1c99da2395a803 +Block 0003 [ 83]: e456839908106a2e +Block 0003 [ 84]: 42a7a74f484e7b88 +Block 0003 [ 85]: 6547ab46ab3f8e5b +Block 0003 [ 86]: 8e987511f85ca889 +Block 0003 [ 87]: 695238f363bf6cd2 +Block 0003 [ 88]: c6dcf17f6cb7bbc3 +Block 0003 [ 89]: c9f8509c8e84637a +Block 0003 [ 90]: eb517ec83c056f8a +Block 0003 [ 91]: 15b9cdb7f1dfdcae +Block 0003 [ 92]: 2e1194e754a4a2be +Block 0003 [ 93]: 3f6a3a58140e0f45 +Block 0003 [ 94]: 10b1cc31af190c0a +Block 0003 [ 95]: cf73be0f8afd8412 +Block 0003 [ 96]: 9766ec755228c4b2 +Block 0003 [ 97]: 637c3c5b06ca31f6 +Block 0003 [ 98]: 905da5bd011ddc3e +Block 0003 [ 99]: 410f3899cce9eaa5 +Block 0003 [100]: 59150e9b04b4a69d +Block 0003 [101]: bf512fb2757b16e2 +Block 0003 [102]: 94b12f119da458aa +Block 0003 [103]: a1a44cd6b831666d +Block 0003 [104]: a830ff1cee8f2557 +Block 0003 [105]: 2e881fd489a3f707 +Block 0003 [106]: a5868b29b028b67e +Block 0003 [107]: b0d8af6c48ce2cb6 +Block 0003 [108]: d85eecd25d77c1ad +Block 0003 [109]: cbc4a44882e12480 +Block 0003 [110]: 544dbc39292f2f33 +Block 0003 [111]: 8001372dd8c0854d +Block 0003 [112]: cd8de45f5e68497f +Block 0003 [113]: 42800cfa8e9de3b0 +Block 0003 [114]: 4b8db48b1bafa9c5 +Block 0003 [115]: 59c5db08b1255705 +Block 0003 [116]: a7f2bde359a2f516 +Block 0003 [117]: ef96aa9ed9da4791 +Block 0003 [118]: 599f81ad309e3794 +Block 0003 [119]: dbad21c8881f076f +Block 0003 [120]: 31f4ea7cad26f00b +Block 0003 [121]: 33c751b29e8ba961 +Block 0003 [122]: 120e5ac357fde45c +Block 0003 [123]: 5889c87f995ef82e +Block 0003 [124]: d06930cc570bb484 +Block 0003 [125]: 1314f624551afa5d +Block 0003 [126]: 49bccae63ff3135a +Block 0003 [127]: 68aeb82ef612c90b +Block 0004 [ 0]: 75cf7f435057da05 +Block 0004 [ 1]: 5fa9a015edecc3b1 +Block 0004 [ 2]: b3325174a5d45f4b +Block 0004 [ 3]: ac045dd7aa070547 +Block 0004 [ 4]: 760a3bde801efd61 +Block 0004 [ 5]: 29ba53ce7573d56c +Block 0004 [ 6]: 24d2101f7bf4f639 +Block 0004 [ 7]: 83f3556e5e8eb43f +Block 0004 [ 8]: 3cc66877e8d5016a +Block 0004 [ 9]: eb1c35540d8e9906 +Block 0004 [ 10]: f00b55c5c1e06e26 +Block 0004 [ 11]: d6a5165b6c1885a3 +Block 0004 [ 12]: d2811b93f9ab834f +Block 0004 [ 13]: 9d0557258f61edb2 +Block 0004 [ 14]: 07f8255621fc9618 +Block 0004 [ 15]: ae4b586c014f9ec6 +Block 0004 [ 16]: ec3836014f77e3c2 +Block 0004 [ 17]: b9911ef80161aa64 +Block 0004 [ 18]: 9ca62c3dcbc62020 +Block 0004 [ 19]: 3ffb28d86e7ec0e0 +Block 0004 [ 20]: 175679fa7fea816f +Block 0004 [ 21]: 30a6b89d44c8edbb +Block 0004 [ 22]: 48819b0e7f2bcd59 +Block 0004 [ 23]: 525858f7772e2bdb +Block 0004 [ 24]: ef5901d7b18b36a4 +Block 0004 [ 25]: 63bd442f2b3d6340 +Block 0004 [ 26]: 7a6f3878cbb89d56 +Block 0004 [ 27]: ad89aa9f7bf232cc +Block 0004 [ 28]: eeb77b64dcf9a009 +Block 0004 [ 29]: bc7e56339fced56f +Block 0004 [ 30]: 492fe116aefe8020 +Block 0004 [ 31]: 40ef14c0c916f44a +Block 0004 [ 32]: 27c6316e378a82a7 +Block 0004 [ 33]: ce5c0b7e763703a9 +Block 0004 [ 34]: 92c81bd10b1e008d +Block 0004 [ 35]: f6960dd9b508a3ad +Block 0004 [ 36]: 7401e08c33c802b5 +Block 0004 [ 37]: 018100c9dc56b87f +Block 0004 [ 38]: 150a5f6f10b10f8b +Block 0004 [ 39]: 1c284e29c18d225b +Block 0004 [ 40]: a27e542d5db0c667 +Block 0004 [ 41]: ee90318a26046e6c +Block 0004 [ 42]: d765ead85a540399 +Block 0004 [ 43]: 56533db96e0e1eb8 +Block 0004 [ 44]: 58ed5ee5629b9090 +Block 0004 [ 45]: 42e8ab0e460b8d17 +Block 0004 [ 46]: 11213401090ad8bd +Block 0004 [ 47]: bfc4823efc51914b +Block 0004 [ 48]: 134d198b80ce5571 +Block 0004 [ 49]: 6787fd9123ad4f2a +Block 0004 [ 50]: 42d6db3fbbab62cf +Block 0004 [ 51]: 56d6ac42819c8c1c +Block 0004 [ 52]: aea2608b849e88df +Block 0004 [ 53]: 984d22e7422a30db +Block 0004 [ 54]: 52efb62155fb0da7 +Block 0004 [ 55]: 370039ea938625bd +Block 0004 [ 56]: bd24fc01e0675a4b +Block 0004 [ 57]: 42404e268d028fe7 +Block 0004 [ 58]: 67f160abebebfa1d +Block 0004 [ 59]: 94a7b3eee4fb9f4e +Block 0004 [ 60]: f850f2a4d4db2b49 +Block 0004 [ 61]: 22a358c6251e3899 +Block 0004 [ 62]: 96eecea0930a4af7 +Block 0004 [ 63]: d75bce7e1bcaca47 +Block 0004 [ 64]: b80fedcc87eadb1b +Block 0004 [ 65]: 54b96798da68bd16 +Block 0004 [ 66]: b05b9a6dd3622c50 +Block 0004 [ 67]: e58fd5a7cc70ad72 +Block 0004 [ 68]: 1939f6f737bb007a +Block 0004 [ 69]: 08b8ed3e75fd711d +Block 0004 [ 70]: b6bfae0c877fe824 +Block 0004 [ 71]: d9d9e942c5dac552 +Block 0004 [ 72]: 542d87997ff6ab9c +Block 0004 [ 73]: 7f538deeb9e80b2d +Block 0004 [ 74]: 0a937577adc459e3 +Block 0004 [ 75]: 000509503fd7cf32 +Block 0004 [ 76]: f3a1eed284977fde +Block 0004 [ 77]: a8c91bac6a2c33a4 +Block 0004 [ 78]: 5932cd606b8c8e3c +Block 0004 [ 79]: cbd972f41417be96 +Block 0004 [ 80]: e0a5c3151fa6a03c +Block 0004 [ 81]: 10f4fb5b0458fe8a +Block 0004 [ 82]: 61023811aa937552 +Block 0004 [ 83]: d9fee5af6772fec0 +Block 0004 [ 84]: 40de55b55e4fcd16 +Block 0004 [ 85]: 6602ad68ac923126 +Block 0004 [ 86]: 8dd7e22e25f8fade +Block 0004 [ 87]: bdb66972663f2300 +Block 0004 [ 88]: 239ef85d83b8be0c +Block 0004 [ 89]: ae1d7173584d48d8 +Block 0004 [ 90]: 7b8b13ce97966729 +Block 0004 [ 91]: 44e87ba0b1f03d38 +Block 0004 [ 92]: b301ef27465f07ce +Block 0004 [ 93]: d67f6c2b925fc93a +Block 0004 [ 94]: 242668515882aa48 +Block 0004 [ 95]: 22c97753b467a139 +Block 0004 [ 96]: 7997dffb6ad65417 +Block 0004 [ 97]: ea18a9f6c2ed6336 +Block 0004 [ 98]: a73fff3e769afbd8 +Block 0004 [ 99]: e72f037a4d012e3b +Block 0004 [100]: dca1070c025d75a2 +Block 0004 [101]: d7fbf671f67dabb0 +Block 0004 [102]: 8240cb9987def406 +Block 0004 [103]: b5b655582720e251 +Block 0004 [104]: 95f052307724a402 +Block 0004 [105]: 898f694ec2f5d350 +Block 0004 [106]: 13d5949336179f40 +Block 0004 [107]: ab68ce11e05463b3 +Block 0004 [108]: 2a2a87ef1105b426 +Block 0004 [109]: a4a08a1950eb41f3 +Block 0004 [110]: 8d71e5193558fcbd +Block 0004 [111]: 75cbf21dfd1e84a0 +Block 0004 [112]: ba73cfd523a4d584 +Block 0004 [113]: d1468e7bff3d9dcb +Block 0004 [114]: f5b94e5888e3d071 +Block 0004 [115]: b5518abe5e84b654 +Block 0004 [116]: 826fda2d333407cf +Block 0004 [117]: 782db37d070a46b3 +Block 0004 [118]: e44c94bb1a87918e +Block 0004 [119]: ff802d7ff84fd6ac +Block 0004 [120]: ef0b4f377b6ffb0d +Block 0004 [121]: 5f7b900b8e883994 +Block 0004 [122]: d4a14d45b09f8a82 +Block 0004 [123]: 0285e5ddea5b8895 +Block 0004 [124]: 654d6b7867a3338e +Block 0004 [125]: 2df4c15c765b0038 +Block 0004 [126]: eda9ab30d67e4d72 +Block 0004 [127]: 828ee8d236f3dd62 +Block 0005 [ 0]: ce0d36af5fbd6f68 +Block 0005 [ 1]: d77f31b3a4e7f26a +Block 0005 [ 2]: bc8f82dc032a61b1 +Block 0005 [ 3]: 185c441b32babe3a +Block 0005 [ 4]: 1b0a2f90bb29c71c +Block 0005 [ 5]: 1ba919a1a30c9f76 +Block 0005 [ 6]: 2ab39ce0fe493b79 +Block 0005 [ 7]: aee4dc7120a2eecc +Block 0005 [ 8]: 0aa0166037779c01 +Block 0005 [ 9]: 5a242262af9161c4 +Block 0005 [ 10]: 3842cee480356cc8 +Block 0005 [ 11]: ace5c18c115a0327 +Block 0005 [ 12]: 1b242b83c275eb74 +Block 0005 [ 13]: eca18f8e399b2a1b +Block 0005 [ 14]: 9b9767106ea36294 +Block 0005 [ 15]: affd307d6c599270 +Block 0005 [ 16]: ab908e05a95ea728 +Block 0005 [ 17]: 020dcb8c9cad6b76 +Block 0005 [ 18]: 3f29b44c94eeb378 +Block 0005 [ 19]: c74e4becadf080e1 +Block 0005 [ 20]: 3d8a0c09cd8f4063 +Block 0005 [ 21]: 098a3627cc110c01 +Block 0005 [ 22]: 09e91371c95fa227 +Block 0005 [ 23]: d432d7e00528de20 +Block 0005 [ 24]: 4e1b531b205d00e5 +Block 0005 [ 25]: da647659ea08a347 +Block 0005 [ 26]: 75b817075757f562 +Block 0005 [ 27]: 14b2f6fd9ac456ed +Block 0005 [ 28]: e6e6582ad4b42a53 +Block 0005 [ 29]: fa73557a5e1f5a62 +Block 0005 [ 30]: a0ce5eac87b98730 +Block 0005 [ 31]: 5a8ebbf9c6c089b2 +Block 0005 [ 32]: db1b26c427ac7c7e +Block 0005 [ 33]: d9975deef1b77f4b +Block 0005 [ 34]: 0d346a2c877d9431 +Block 0005 [ 35]: d7fdc6e8f9f3b134 +Block 0005 [ 36]: 9430657f2d4551b9 +Block 0005 [ 37]: 7007133cb4cdd3e5 +Block 0005 [ 38]: 707fb7ed2ae55c59 +Block 0005 [ 39]: 93294988cc295c48 +Block 0005 [ 40]: e9bf4db5fbc1cea2 +Block 0005 [ 41]: 1ecb55c4f21a53ea +Block 0005 [ 42]: 9a4a75f979e2dd00 +Block 0005 [ 43]: 2a8e365046889bdc +Block 0005 [ 44]: 0fcfb36e8eb4ab8e +Block 0005 [ 45]: db5d5172030eee7b +Block 0005 [ 46]: ce170097bdb89426 +Block 0005 [ 47]: 56b169d594b09c15 +Block 0005 [ 48]: 225f10a91cdb02c6 +Block 0005 [ 49]: c39861e986249fcf +Block 0005 [ 50]: 7ae7c8c9932bac9b +Block 0005 [ 51]: de703a7cc7ef319b +Block 0005 [ 52]: 03874a532f07feed +Block 0005 [ 53]: a0c2e485d54df77c +Block 0005 [ 54]: b6fc72e0b5716a87 +Block 0005 [ 55]: 0cd89797a6753d97 +Block 0005 [ 56]: 475e735510d86da4 +Block 0005 [ 57]: 39a48e77b0b648d2 +Block 0005 [ 58]: 1bae8bad0cdbc64d +Block 0005 [ 59]: 060b290ffba35f12 +Block 0005 [ 60]: f586c88e2346baaa +Block 0005 [ 61]: 5f689663126ba25f +Block 0005 [ 62]: efe488f8ad30f968 +Block 0005 [ 63]: 653a3374e8cdb567 +Block 0005 [ 64]: 2412dd4b6fcf38fe +Block 0005 [ 65]: 43fdc2554c479aa3 +Block 0005 [ 66]: 4e4ccf4932b4e036 +Block 0005 [ 67]: b91582ee3161d432 +Block 0005 [ 68]: fcd95071b5e8fe01 +Block 0005 [ 69]: cd7523a9dc26c4c7 +Block 0005 [ 70]: 58bf47eadbe043b1 +Block 0005 [ 71]: c493a84069e6d701 +Block 0005 [ 72]: 1310593696022ce3 +Block 0005 [ 73]: a2d3749808a27627 +Block 0005 [ 74]: 4aa81c8265e45a75 +Block 0005 [ 75]: 1d9f43b9c5f2fdd4 +Block 0005 [ 76]: b2d53b7ba81b8c22 +Block 0005 [ 77]: ec6dec5fa3e97412 +Block 0005 [ 78]: ff11b2aa790499a6 +Block 0005 [ 79]: a5d7d7b3d0441fd2 +Block 0005 [ 80]: 92edbafa959a6550 +Block 0005 [ 81]: eb4e74ea7830d355 +Block 0005 [ 82]: 10b0f97c699177ad +Block 0005 [ 83]: 6e774e8e3b84c655 +Block 0005 [ 84]: 884612bf751ae947 +Block 0005 [ 85]: d8844041305209e2 +Block 0005 [ 86]: 4f5519c0b806f42c +Block 0005 [ 87]: ef4f16ef4caca11a +Block 0005 [ 88]: ce1d2390a9426430 +Block 0005 [ 89]: 4a282050ec3e0201 +Block 0005 [ 90]: ffd19c1157afa0c6 +Block 0005 [ 91]: 8fe0b8c890c386fe +Block 0005 [ 92]: 96e12bf8b1f76726 +Block 0005 [ 93]: 7fdd3df6053fb344 +Block 0005 [ 94]: 54abc965a92ee4ac +Block 0005 [ 95]: f02f6ea5f10b439a +Block 0005 [ 96]: 88b14772e5215a3f +Block 0005 [ 97]: 0c9e496f79c5e17a +Block 0005 [ 98]: bc99c4bc45caf42d +Block 0005 [ 99]: 1a7705997987c8a8 +Block 0005 [100]: 474ef0af0b85dfc8 +Block 0005 [101]: 69440fdaeed68cfa +Block 0005 [102]: a119edce664da081 +Block 0005 [103]: 942460fce9bc6f67 +Block 0005 [104]: 56edd7c43e735395 +Block 0005 [105]: e556ef2efa442d4f +Block 0005 [106]: 0ce0161e7944bb2a +Block 0005 [107]: 4a71159f4725f2a2 +Block 0005 [108]: 943a5a97403b8b7e +Block 0005 [109]: e9934b98a50821b1 +Block 0005 [110]: f6f93c625e714a0f +Block 0005 [111]: 0358af71f5f3d707 +Block 0005 [112]: 6513df4363dcd708 +Block 0005 [113]: 45cf7fb3ab28f915 +Block 0005 [114]: f0ecc3fabcbd07e3 +Block 0005 [115]: cf4de4bdad049eaf +Block 0005 [116]: 35594a058df4b18e +Block 0005 [117]: 2b25c1cd2a176af2 +Block 0005 [118]: 45a71cfa08b35c00 +Block 0005 [119]: 6ccb7f53cca788c7 +Block 0005 [120]: 25cb96798577f4dd +Block 0005 [121]: 913c54b058ab1709 +Block 0005 [122]: 2e324b5d5b7df67a +Block 0005 [123]: 6133fac505d62790 +Block 0005 [124]: 1fba4d2401f9870f +Block 0005 [125]: 002139471981c5f4 +Block 0005 [126]: c352642eea37f541 +Block 0005 [127]: dfe6bd2e638fa315 +Block 0006 [ 0]: afc3cb5d24d78ee8 +Block 0006 [ 1]: 659554bb4ec96f7b +Block 0006 [ 2]: a5d0225b10a29e3b +Block 0006 [ 3]: 7c637d0f2afb6e27 +Block 0006 [ 4]: 588aea062939b944 +Block 0006 [ 5]: 38c8afd4744672bc +Block 0006 [ 6]: dab595d8bb4cdffb +Block 0006 [ 7]: bbbef393ca71f32f +Block 0006 [ 8]: f5d45f05109d63d7 +Block 0006 [ 9]: 7a5c3d262c526c0b +Block 0006 [ 10]: da8bafd35e5069b6 +Block 0006 [ 11]: 918297d17ee797fb +Block 0006 [ 12]: 39320d32cf8d4ec6 +Block 0006 [ 13]: 1b70f9daf8e8f854 +Block 0006 [ 14]: 0bd5ef35f6de0a17 +Block 0006 [ 15]: e3723be9854d2946 +Block 0006 [ 16]: dc1939a2b8ddf140 +Block 0006 [ 17]: 08decf3387f67396 +Block 0006 [ 18]: c9627e4527095c6a +Block 0006 [ 19]: b7bea9f784c9c990 +Block 0006 [ 20]: 41e7f8e6b01ba679 +Block 0006 [ 21]: b0e5feb867d6deeb +Block 0006 [ 22]: d7df0a6deb6d443f +Block 0006 [ 23]: 61d7ac33ba0ae2a0 +Block 0006 [ 24]: 93ac174a57b2a517 +Block 0006 [ 25]: 1f3f6b66ae964272 +Block 0006 [ 26]: 2e305f0a1d1518b1 +Block 0006 [ 27]: 823ec4233a6317b1 +Block 0006 [ 28]: 2d43f0617675db3f +Block 0006 [ 29]: aa5cee5075e7aafb +Block 0006 [ 30]: 3451358e5b428d20 +Block 0006 [ 31]: 2e9c26ff065a27ec +Block 0006 [ 32]: 076e96e4f57cb9c4 +Block 0006 [ 33]: d24834ee48497064 +Block 0006 [ 34]: 7619dc9233d449b5 +Block 0006 [ 35]: 85b7ffae30372874 +Block 0006 [ 36]: 3f5c51e637cc3154 +Block 0006 [ 37]: b13ca9971d205e65 +Block 0006 [ 38]: 8947882913f53f2f +Block 0006 [ 39]: 97a68cde46209cae +Block 0006 [ 40]: a74855b63f7fbc78 +Block 0006 [ 41]: 44587edf73bcdf03 +Block 0006 [ 42]: d4135ee125b0d171 +Block 0006 [ 43]: 02306d041dd8846d +Block 0006 [ 44]: 60556ffadf0bea48 +Block 0006 [ 45]: 906d716ee211ead0 +Block 0006 [ 46]: 260d15cb9df34b8d +Block 0006 [ 47]: 13f2447cbbc686e6 +Block 0006 [ 48]: d7b0d80bd9444cee +Block 0006 [ 49]: fe37f87b31ed9190 +Block 0006 [ 50]: c8ffc3ccf7ea129e +Block 0006 [ 51]: 4299090758524b05 +Block 0006 [ 52]: 8b1e449c8aa11c60 +Block 0006 [ 53]: 01205e1c45ae3419 +Block 0006 [ 54]: cc59437963d7ae9b +Block 0006 [ 55]: 5ef5f570555fef01 +Block 0006 [ 56]: 299db72b400c78a5 +Block 0006 [ 57]: c895058e40b1fff2 +Block 0006 [ 58]: c4646d110490c1e9 +Block 0006 [ 59]: 391fc3b24f0db416 +Block 0006 [ 60]: d2f1e8d1b167a8bf +Block 0006 [ 61]: 591fb9b0fa5a1f7c +Block 0006 [ 62]: 313fab10223645fa +Block 0006 [ 63]: 7af43d95e6a1d595 +Block 0006 [ 64]: fe2ca7ee3dbc077b +Block 0006 [ 65]: 21387e44601ec9f9 +Block 0006 [ 66]: 1e00d189c00480cb +Block 0006 [ 67]: dba0f1b11cbe3c7f +Block 0006 [ 68]: 159f5c62e20ac794 +Block 0006 [ 69]: 843053d4f1876f95 +Block 0006 [ 70]: ac74ea56574f4461 +Block 0006 [ 71]: 0cbba62c01911fdf +Block 0006 [ 72]: 9ea785e198bb40d0 +Block 0006 [ 73]: e7e1b5ebde02baf7 +Block 0006 [ 74]: 9093879586663275 +Block 0006 [ 75]: 595241bc3ecebd8a +Block 0006 [ 76]: 3661789351fc4808 +Block 0006 [ 77]: 384847b49b26a1bb +Block 0006 [ 78]: cba3e34a38b91022 +Block 0006 [ 79]: 282e394edb58cc8c +Block 0006 [ 80]: 5ea53580559e126f +Block 0006 [ 81]: dbf2425682255163 +Block 0006 [ 82]: be2fd91a7dbd236c +Block 0006 [ 83]: 2787d4789ad70026 +Block 0006 [ 84]: 9985c2acadfd5b92 +Block 0006 [ 85]: af63c3ed508d8a17 +Block 0006 [ 86]: 900947553bec9649 +Block 0006 [ 87]: 41e3845ffc2ee3fb +Block 0006 [ 88]: f5f2d613417c6091 +Block 0006 [ 89]: 652a905d54d23008 +Block 0006 [ 90]: 696dcba75a422c33 +Block 0006 [ 91]: fbae4a9e644a972b +Block 0006 [ 92]: 56377880c80b7b98 +Block 0006 [ 93]: cdd849ac3456c35d +Block 0006 [ 94]: 06f0c0ea2066d717 +Block 0006 [ 95]: 664c6e9621fe116b +Block 0006 [ 96]: af7aea28925e0b1b +Block 0006 [ 97]: 26e2bfa2ecb4fa8b +Block 0006 [ 98]: 4f2762b4774c8ecf +Block 0006 [ 99]: 9d73f8f4bef65087 +Block 0006 [100]: 90a67f5dc176c8af +Block 0006 [101]: 826ab7e61a3d3bd3 +Block 0006 [102]: 31a4c60bcdbc3a49 +Block 0006 [103]: 58f8320c580548b5 +Block 0006 [104]: 5cd5fb246ce9e50d +Block 0006 [105]: 10e35b24687425ba +Block 0006 [106]: 8b063cb4f7c5f477 +Block 0006 [107]: ac102106f4f45fdb +Block 0006 [108]: a5ced9abd4084b5a +Block 0006 [109]: 14daf22aeed1864f +Block 0006 [110]: 2e6700b8254ed26a +Block 0006 [111]: 58f36abe5aaf3857 +Block 0006 [112]: 8e2fa216babf4555 +Block 0006 [113]: fbfc95b5816ac03f +Block 0006 [114]: c3cf9c67383fb870 +Block 0006 [115]: 099596b7b2291d51 +Block 0006 [116]: 41a2d68d62b26966 +Block 0006 [117]: 371d37c69b85757a +Block 0006 [118]: d6aa71abd42733c0 +Block 0006 [119]: 7695f0121903fa3d +Block 0006 [120]: f99b75a67ba99543 +Block 0006 [121]: febdd604f0037284 +Block 0006 [122]: 68f0e100a0f45435 +Block 0006 [123]: 540f71cbd6879829 +Block 0006 [124]: 3686fecabc98739c +Block 0006 [125]: 9d677f7cbc7f0d15 +Block 0006 [126]: f2d9ba6f91ea7db9 +Block 0006 [127]: 2e97a12d80d19209 +Block 0007 [ 0]: 313f8267b05460dc +Block 0007 [ 1]: a5944cec2d194084 +Block 0007 [ 2]: c46e817919e6c81d +Block 0007 [ 3]: 97473d5f834f53a6 +Block 0007 [ 4]: 2a0723d18d904edd +Block 0007 [ 5]: 00bd2b0cd3ab0226 +Block 0007 [ 6]: 21dfd141814191bb +Block 0007 [ 7]: 90e3842b2e821913 +Block 0007 [ 8]: 552fa8e34c66cd9e +Block 0007 [ 9]: 065ffdbe87182934 +Block 0007 [ 10]: 7da305f47d8112a8 +Block 0007 [ 11]: b93da7a36c47e48b +Block 0007 [ 12]: 423aeb9cd7fcdaeb +Block 0007 [ 13]: 9ff079b2504337ac +Block 0007 [ 14]: 8c300fd256c14597 +Block 0007 [ 15]: 3d2c1c9072e07d2c +Block 0007 [ 16]: 44be13fb2abf1073 +Block 0007 [ 17]: a29c794f375e3bb7 +Block 0007 [ 18]: 49968e31e443d5b9 +Block 0007 [ 19]: 639cc152b7609b35 +Block 0007 [ 20]: 14f8ecb663683555 +Block 0007 [ 21]: 416426eb03dff4f9 +Block 0007 [ 22]: cb0355359f15364e +Block 0007 [ 23]: 14ad1c0b2df92f7b +Block 0007 [ 24]: e9550350c3d61952 +Block 0007 [ 25]: 1f63f70ab40027d7 +Block 0007 [ 26]: 2d43fd0c34cb5b16 +Block 0007 [ 27]: 870999cf969d244a +Block 0007 [ 28]: d63f27cb25e40145 +Block 0007 [ 29]: 1a68af16c9be8706 +Block 0007 [ 30]: 409fb5a60bdf3f5d +Block 0007 [ 31]: 94b232386d591829 +Block 0007 [ 32]: 6319fce6d8a2e6b9 +Block 0007 [ 33]: 97a7b7d0cc7c702d +Block 0007 [ 34]: f0d42918d62b6b78 +Block 0007 [ 35]: 7f95fa2cb797d904 +Block 0007 [ 36]: 209d161fac787ffd +Block 0007 [ 37]: 02161ec72c97ff65 +Block 0007 [ 38]: 5e7491e14b169df3 +Block 0007 [ 39]: 563374e7d14a8f27 +Block 0007 [ 40]: 5cb922cc003e7056 +Block 0007 [ 41]: 83cb96ed64ec843b +Block 0007 [ 42]: ec234b3079e44cc8 +Block 0007 [ 43]: adcb5ba59126d544 +Block 0007 [ 44]: 17d147dd97d4e23e +Block 0007 [ 45]: 800991ca73676481 +Block 0007 [ 46]: ea217a52d19952de +Block 0007 [ 47]: 54e18406e4cc7a8b +Block 0007 [ 48]: 05a862e2e7c772e8 +Block 0007 [ 49]: ad5338c9b9f048b6 +Block 0007 [ 50]: 03e7e379bddb0b14 +Block 0007 [ 51]: 7664afc5d7182dab +Block 0007 [ 52]: 5889d9abb800ee03 +Block 0007 [ 53]: 270c52be464c969d +Block 0007 [ 54]: b03ea59a36910cf6 +Block 0007 [ 55]: 84490f20cf223065 +Block 0007 [ 56]: ee81c65507c78efc +Block 0007 [ 57]: e43da10193dc297e +Block 0007 [ 58]: dd30e335cf68d444 +Block 0007 [ 59]: 69914459c3a59be3 +Block 0007 [ 60]: d7266930c9431f0b +Block 0007 [ 61]: e5ec3e6ea6fa86d7 +Block 0007 [ 62]: 07514caf186ffcba +Block 0007 [ 63]: 7db93dd390ddd186 +Block 0007 [ 64]: a09363d83dee989a +Block 0007 [ 65]: 03df627b1d06fbb0 +Block 0007 [ 66]: 8789a381901384a8 +Block 0007 [ 67]: 08b1ae57f82eae0a +Block 0007 [ 68]: 17f8a362efd8fabb +Block 0007 [ 69]: 0688a79b5d0518ed +Block 0007 [ 70]: 563715746b7cb426 +Block 0007 [ 71]: ab4e46660c304515 +Block 0007 [ 72]: a5f8b5462c4f2a35 +Block 0007 [ 73]: 10e109ba109355ad +Block 0007 [ 74]: f6060f3af89fbe5a +Block 0007 [ 75]: f4d782b55ef091ec +Block 0007 [ 76]: 12be85979c4a838f +Block 0007 [ 77]: ae34eba057515205 +Block 0007 [ 78]: cc0f83c65aa0aa33 +Block 0007 [ 79]: 0633ad5fa544f189 +Block 0007 [ 80]: acced57d705d2199 +Block 0007 [ 81]: 7b35f04f46cac58b +Block 0007 [ 82]: 416d7d82a9bdda0b +Block 0007 [ 83]: c318e3316990307b +Block 0007 [ 84]: c6d55f8e8c00bb70 +Block 0007 [ 85]: 686a412a85992ee4 +Block 0007 [ 86]: 073a5260e237b1f4 +Block 0007 [ 87]: 798249a43be5ef1d +Block 0007 [ 88]: 42aa6e6192ae7cc2 +Block 0007 [ 89]: c360216deaacd3bf +Block 0007 [ 90]: 52c8ab5f0fe4d5c0 +Block 0007 [ 91]: 5a9ee91c1e177a41 +Block 0007 [ 92]: e0b07ff5ce08eb69 +Block 0007 [ 93]: a6d4dd4bcfaafb16 +Block 0007 [ 94]: 1163452af40450b3 +Block 0007 [ 95]: 4e704596475cb453 +Block 0007 [ 96]: ca0f153a0686e2d3 +Block 0007 [ 97]: 882c0b2a380c36ec +Block 0007 [ 98]: 7c29c813bcf409b3 +Block 0007 [ 99]: e4e2b640cfe0d86b +Block 0007 [100]: dbc2cfae7a3a4231 +Block 0007 [101]: fa731843d27f5080 +Block 0007 [102]: 816ad332d19cd0f3 +Block 0007 [103]: db09ce87e9ceb166 +Block 0007 [104]: d2b7b680d5032a8b +Block 0007 [105]: 3adb05a1ccf7ef1c +Block 0007 [106]: 25d8504aee3430bf +Block 0007 [107]: d659f93f8db423ac +Block 0007 [108]: d9aa66776bbdcfc4 +Block 0007 [109]: 8b14098e6561628e +Block 0007 [110]: 69fb649b5db962b1 +Block 0007 [111]: 7665d436fb3b4f77 +Block 0007 [112]: 782c9789e833c68d +Block 0007 [113]: 4817adea4076d69f +Block 0007 [114]: 73e8e6cc802bf100 +Block 0007 [115]: d40c51e9c159a5fc +Block 0007 [116]: 630a7a4dfd286539 +Block 0007 [117]: dc6f3f63c56c265e +Block 0007 [118]: 9a0085dca381888f +Block 0007 [119]: 97b4ff695cbaab3c +Block 0007 [120]: abf4698a130ff8b4 +Block 0007 [121]: 3e226eb60f065ea3 +Block 0007 [122]: faf78a890f83a873 +Block 0007 [123]: c6a292eb570af3c3 +Block 0007 [124]: 7b2d2fa8016553bf +Block 0007 [125]: ae6a78024fc32785 +Block 0007 [126]: 948ba97e8fd28478 +Block 0007 [127]: a7e6438070fcdf5c +Block 0008 [ 0]: 2e9cc9c3e6b135b3 +Block 0008 [ 1]: d20ed84956a6ee5b +Block 0008 [ 2]: 824a4f18130361bd +Block 0008 [ 3]: 2720ec65b42dc705 +Block 0008 [ 4]: 55cf668c6a6858dc +Block 0008 [ 5]: e4edaa3e7f4c0ae5 +Block 0008 [ 6]: b3690f0b517be35d +Block 0008 [ 7]: aab603dab5401cd5 +Block 0008 [ 8]: 9734fd526765de8e +Block 0008 [ 9]: f8a7c8e208c74505 +Block 0008 [ 10]: 3bff0939b8ba936f +Block 0008 [ 11]: 0497f8f783147616 +Block 0008 [ 12]: 35b88fca5c5e8d6f +Block 0008 [ 13]: e63ed3a90c4651d3 +Block 0008 [ 14]: b7c80fdad434b54a +Block 0008 [ 15]: 84036657d5cfbb7c +Block 0008 [ 16]: c5d725fc3f6b8c1e +Block 0008 [ 17]: 17a6efe7658421c6 +Block 0008 [ 18]: f9887ee4c64ade59 +Block 0008 [ 19]: 299efe5dc6bc3dc9 +Block 0008 [ 20]: 389b0a0b9022f882 +Block 0008 [ 21]: 35611ff88c03a5ae +Block 0008 [ 22]: e1a07d24aff18d97 +Block 0008 [ 23]: 4c0bb87a929863dd +Block 0008 [ 24]: 6bc6dbabe096f75f +Block 0008 [ 25]: 9530f345d9303e2e +Block 0008 [ 26]: 088d5ece04da7145 +Block 0008 [ 27]: e8d38ebb18126f0a +Block 0008 [ 28]: b8bd223ef1931cbe +Block 0008 [ 29]: 4978886f78fbea5c +Block 0008 [ 30]: 3bf1ef2947a7252a +Block 0008 [ 31]: 3d1020e7790b3852 +Block 0008 [ 32]: 862a689a33fd5bb7 +Block 0008 [ 33]: 528ecc556a8f8b8c +Block 0008 [ 34]: 92176be498db9417 +Block 0008 [ 35]: 5e8a2a7380544773 +Block 0008 [ 36]: 494309297e14ebc5 +Block 0008 [ 37]: a5713c39d411a1d5 +Block 0008 [ 38]: 7106f6b61968c8ef +Block 0008 [ 39]: 90ffdb92e45e4271 +Block 0008 [ 40]: 6835a84ca857d06c +Block 0008 [ 41]: 7d739c7fca38d272 +Block 0008 [ 42]: a992806a13fb22fc +Block 0008 [ 43]: cecfa6cb668369c9 +Block 0008 [ 44]: 65aa1b4a582bc615 +Block 0008 [ 45]: bbeb50f2709e1070 +Block 0008 [ 46]: a6201dff1dc19643 +Block 0008 [ 47]: bf451423a2dbf1ea +Block 0008 [ 48]: 8836e2fc20b1da97 +Block 0008 [ 49]: 5bcc7001abab5b2c +Block 0008 [ 50]: 6cbff3d65dfdf5b1 +Block 0008 [ 51]: d1dc33283811de18 +Block 0008 [ 52]: 7af1be34e2641ab4 +Block 0008 [ 53]: 3c1ba04e93be61b9 +Block 0008 [ 54]: d4273abf36466331 +Block 0008 [ 55]: 8b35892319de5443 +Block 0008 [ 56]: f9d3ebbdb63cc92f +Block 0008 [ 57]: 5b7e5ef5bddb3c4f +Block 0008 [ 58]: 5259a3dd695c7c6c +Block 0008 [ 59]: db7d68d97cd1b706 +Block 0008 [ 60]: 04fa49a377111938 +Block 0008 [ 61]: 0529a32ae4f9f7fb +Block 0008 [ 62]: b259b442507c105d +Block 0008 [ 63]: 4603efd5764f9460 +Block 0008 [ 64]: 8d25e825f8d56ede +Block 0008 [ 65]: 186e7e8e08895229 +Block 0008 [ 66]: 1d3d7c07ed3b419c +Block 0008 [ 67]: 326baad7ed02fd0d +Block 0008 [ 68]: d8dac3bb50bf67ff +Block 0008 [ 69]: f770b9cab9866625 +Block 0008 [ 70]: 47c3a771429039fb +Block 0008 [ 71]: aac9a678cc80f2c6 +Block 0008 [ 72]: b942f416e5bc48e5 +Block 0008 [ 73]: 2a2d0b0958417b30 +Block 0008 [ 74]: 842d6cf63b07316f +Block 0008 [ 75]: 854f397563c6bdbf +Block 0008 [ 76]: 5d44be1127880a5a +Block 0008 [ 77]: 1766a2b7ffea324c +Block 0008 [ 78]: 61c6bcf062aa12e1 +Block 0008 [ 79]: db9130986d8233fa +Block 0008 [ 80]: 3cae9e52f7517619 +Block 0008 [ 81]: 6bc06914ce32e1cd +Block 0008 [ 82]: 3fc450fdbe333575 +Block 0008 [ 83]: 27a458fd8b358a5f +Block 0008 [ 84]: 8a7f7426828352b8 +Block 0008 [ 85]: bb0c8daac96bc54a +Block 0008 [ 86]: e51721bf776f4385 +Block 0008 [ 87]: c27c103839a47828 +Block 0008 [ 88]: 615902453eae7e54 +Block 0008 [ 89]: 065769df53b50ae9 +Block 0008 [ 90]: e2cdb8c440cd666c +Block 0008 [ 91]: 0a9e983f8bb2c395 +Block 0008 [ 92]: a8ed136a220ffba2 +Block 0008 [ 93]: 4c2104b8a3106274 +Block 0008 [ 94]: f79cd4843458b671 +Block 0008 [ 95]: ca3ab237d1bcd885 +Block 0008 [ 96]: 9208ca5b017118f6 +Block 0008 [ 97]: 542d8219fe025cb5 +Block 0008 [ 98]: ea8b039748259027 +Block 0008 [ 99]: 3ae845cde600d61c +Block 0008 [100]: b97f83cf358075b3 +Block 0008 [101]: 43a916fe6ec08054 +Block 0008 [102]: 955ad4f7f4678783 +Block 0008 [103]: d0b88886cc986d6d +Block 0008 [104]: 7bb2acbb38bfe037 +Block 0008 [105]: eae9e9899b5ddd82 +Block 0008 [106]: cde20f402a22050d +Block 0008 [107]: d72b190fc5bfe98c +Block 0008 [108]: 3b735764df8431ac +Block 0008 [109]: 2ad92f81f927f307 +Block 0008 [110]: 4637052793914f43 +Block 0008 [111]: 7c36bb6fd25addfa +Block 0008 [112]: 826cfbda99be0b03 +Block 0008 [113]: ddf3ced5fc302d83 +Block 0008 [114]: fb8c8449e0910102 +Block 0008 [115]: 8463ff3f92a3292a +Block 0008 [116]: 05bf45d8d32c0aa3 +Block 0008 [117]: 1cf076a04b88d512 +Block 0008 [118]: 6e2d7b51e84ee979 +Block 0008 [119]: a302ddea68252da2 +Block 0008 [120]: 9abde3e462398515 +Block 0008 [121]: e64d3cc9f21b3bbe +Block 0008 [122]: 3dace2ec24cc0c2b +Block 0008 [123]: 88483a20ea38dd8f +Block 0008 [124]: 620ae53ee928d46b +Block 0008 [125]: c7fa0fd20b9ee233 +Block 0008 [126]: cf0b70565fa8d1c0 +Block 0008 [127]: dde107597004f663 +Block 0009 [ 0]: 209a347fd29977e2 +Block 0009 [ 1]: c061a9725908f6cf +Block 0009 [ 2]: 81353c3151dfb6d6 +Block 0009 [ 3]: 926ce448a5ce1128 +Block 0009 [ 4]: 72ef7d779de2768b +Block 0009 [ 5]: cc2e3e7abb982d1c +Block 0009 [ 6]: 6f7bcf77b7858e5c +Block 0009 [ 7]: 4c07d89badf8b0c6 +Block 0009 [ 8]: 0e2098ba415db491 +Block 0009 [ 9]: ba5aab87359547ec +Block 0009 [ 10]: 9f39ce7624c3fa13 +Block 0009 [ 11]: b94ed628f9a619e6 +Block 0009 [ 12]: a96ec7cad41eb137 +Block 0009 [ 13]: 4d7365b0dcac29a9 +Block 0009 [ 14]: 93db4a5f9510ea21 +Block 0009 [ 15]: c2182ccd6366da14 +Block 0009 [ 16]: df49f804b43e7999 +Block 0009 [ 17]: cabc390bd13b9bc8 +Block 0009 [ 18]: b186f52b3846ab6d +Block 0009 [ 19]: ded1bcd95e907934 +Block 0009 [ 20]: 38bf831c2af9e788 +Block 0009 [ 21]: 5346d0899e8a8fca +Block 0009 [ 22]: 16ee9287d6cddb15 +Block 0009 [ 23]: 3f7e53e659f5e0d2 +Block 0009 [ 24]: 4c44d3fac07ced70 +Block 0009 [ 25]: d2839ed10e988d59 +Block 0009 [ 26]: e2276469f6c2c7c5 +Block 0009 [ 27]: f757916ef5395c35 +Block 0009 [ 28]: 6586225cc5ef9ffd +Block 0009 [ 29]: cdee0721f56ae49f +Block 0009 [ 30]: 51cf5ef7a119b1df +Block 0009 [ 31]: 859e7e63b5a143d0 +Block 0009 [ 32]: ae99a2c00c9161b1 +Block 0009 [ 33]: fa3823d62a0374a5 +Block 0009 [ 34]: 3d3c5017570dbf86 +Block 0009 [ 35]: 92639ce301f1b81f +Block 0009 [ 36]: 5523d0e458c01d63 +Block 0009 [ 37]: cb8ddedc266abc88 +Block 0009 [ 38]: 1c7d9f9322dcccf2 +Block 0009 [ 39]: 1c03d8e6b11d883d +Block 0009 [ 40]: 32e030be8b96956b +Block 0009 [ 41]: c840202ff4c8471b +Block 0009 [ 42]: c6730e4209cb0592 +Block 0009 [ 43]: 987560f61edc458e +Block 0009 [ 44]: 54654778d2957045 +Block 0009 [ 45]: 34a83c65a88871e5 +Block 0009 [ 46]: a09e9bbb2df3eb9f +Block 0009 [ 47]: 74490e2824445378 +Block 0009 [ 48]: fe3e62b849649981 +Block 0009 [ 49]: 043556a6df5185b7 +Block 0009 [ 50]: b571d3e4d2e56472 +Block 0009 [ 51]: 43d7d84fbb688f5b +Block 0009 [ 52]: c0a7901239238809 +Block 0009 [ 53]: d6e84ae5d888446f +Block 0009 [ 54]: 15c3cce6a4cccb0c +Block 0009 [ 55]: 6373f9fca0709283 +Block 0009 [ 56]: 51b9bbba928409de +Block 0009 [ 57]: bd7804ec7b8b9b4f +Block 0009 [ 58]: 6e9d64dc2121f5da +Block 0009 [ 59]: f49cddfc3833f51c +Block 0009 [ 60]: a9ebbe0c83c98f3b +Block 0009 [ 61]: dc3efed4e44c0e24 +Block 0009 [ 62]: f16bf46a8082429e +Block 0009 [ 63]: 27b9b38f767ba4c8 +Block 0009 [ 64]: 03ee25cd3f3189d1 +Block 0009 [ 65]: 592af46a525096c8 +Block 0009 [ 66]: e0f410df25491dae +Block 0009 [ 67]: bd2be5e6fb441dc5 +Block 0009 [ 68]: abf8b268d7024d16 +Block 0009 [ 69]: 0fc232b72879a229 +Block 0009 [ 70]: 02ae0ba2bce5cdb1 +Block 0009 [ 71]: 295723bd5f13bf22 +Block 0009 [ 72]: 31c65623d3437798 +Block 0009 [ 73]: 790854810b9f981f +Block 0009 [ 74]: 46ea67f43d9d3b3a +Block 0009 [ 75]: f52a39d525541d8a +Block 0009 [ 76]: 99c295f0ee707df0 +Block 0009 [ 77]: 34fb0aa05c400015 +Block 0009 [ 78]: 97a7e3a1aa073e56 +Block 0009 [ 79]: ea0011e85f251e9a +Block 0009 [ 80]: 93866a3475fd84e9 +Block 0009 [ 81]: bb1b0f3e6c6b3fb0 +Block 0009 [ 82]: 6d29acab032d43f7 +Block 0009 [ 83]: 121cbf273badebae +Block 0009 [ 84]: 58ded818809f6630 +Block 0009 [ 85]: e578892283ff24f1 +Block 0009 [ 86]: 219235a5d502224c +Block 0009 [ 87]: a139fc5f39ac8d65 +Block 0009 [ 88]: 6ec265516ae92429 +Block 0009 [ 89]: b302315a209bae25 +Block 0009 [ 90]: 3f9d17f0357f3139 +Block 0009 [ 91]: 0466be553530b887 +Block 0009 [ 92]: ef804d6297e6b404 +Block 0009 [ 93]: 27049c1938ef9fd9 +Block 0009 [ 94]: f74f27e6a0f7169b +Block 0009 [ 95]: e97a5a3036228ec3 +Block 0009 [ 96]: c1bc91ae9ed2b008 +Block 0009 [ 97]: f00bf18399d36951 +Block 0009 [ 98]: 600cb47d4e4a55ad +Block 0009 [ 99]: 934299f5e7a3d825 +Block 0009 [100]: 4787e7d716a3d9b5 +Block 0009 [101]: e9bcaf5f2d451670 +Block 0009 [102]: ad5e13ee0b217a5a +Block 0009 [103]: dac4ae25e1c6cf3c +Block 0009 [104]: 18e1559471376622 +Block 0009 [105]: 234197f39be8711b +Block 0009 [106]: 0a2b9482ba98ca71 +Block 0009 [107]: b7eddfebd7b2ce53 +Block 0009 [108]: e60c8b75e72b1569 +Block 0009 [109]: ab8b6471bd07c0d9 +Block 0009 [110]: 4d29ef0b49b6b176 +Block 0009 [111]: 87e02204f0af0d6d +Block 0009 [112]: 6da9d35faa1a0990 +Block 0009 [113]: f9b5f5d5f03c1a49 +Block 0009 [114]: a81da4419bd23c36 +Block 0009 [115]: e270cfa27ae3703c +Block 0009 [116]: 6d0a394cab7bc4b5 +Block 0009 [117]: 34785b08faace8c3 +Block 0009 [118]: 20185431d252ad2e +Block 0009 [119]: 66d44ae9078a1741 +Block 0009 [120]: e3e6295ad1bca0d1 +Block 0009 [121]: 33b0dbaa494681d7 +Block 0009 [122]: 61f5dab90b66f2d9 +Block 0009 [123]: 43a6e3bed2cc71e7 +Block 0009 [124]: bf75bc3f9bb5bb02 +Block 0009 [125]: 0d2e74e50ff9f296 +Block 0009 [126]: 5973b5959b00ea90 +Block 0009 [127]: 52a775ae400e714b +Block 0010 [ 0]: 10b705da8395f04c +Block 0010 [ 1]: 3a64c95eb697fc3c +Block 0010 [ 2]: 7586175e549038e1 +Block 0010 [ 3]: 56de6895cef27b26 +Block 0010 [ 4]: e702d37714afa28d +Block 0010 [ 5]: 1629970faf4bfbd5 +Block 0010 [ 6]: 028d51b5e7ca4680 +Block 0010 [ 7]: f9a6b66093100143 +Block 0010 [ 8]: b15dd726704428dd +Block 0010 [ 9]: 4582611de10e16da +Block 0010 [ 10]: e040ed664fd0cd3a +Block 0010 [ 11]: 8bf64cbab6fcf4a0 +Block 0010 [ 12]: 837daa67d2904ba2 +Block 0010 [ 13]: 8045a33944a1fd35 +Block 0010 [ 14]: d4dbd734ec2aa4a6 +Block 0010 [ 15]: 362cbe03aab89d82 +Block 0010 [ 16]: 02d30b08962cde66 +Block 0010 [ 17]: 77602b3de395dd11 +Block 0010 [ 18]: 9d92a45283ff4ca3 +Block 0010 [ 19]: 1e49ca4b9d7df723 +Block 0010 [ 20]: 0c55389b0df259f4 +Block 0010 [ 21]: ffc74e25199d26ba +Block 0010 [ 22]: 646f73d902384812 +Block 0010 [ 23]: 1571d94c86994393 +Block 0010 [ 24]: a640762502fe113b +Block 0010 [ 25]: 6861536ff90a4f1d +Block 0010 [ 26]: 35d5c406d0c930a3 +Block 0010 [ 27]: a4da70145cd20828 +Block 0010 [ 28]: 8e4b4a16c16fc390 +Block 0010 [ 29]: 50d9c0355fa52b2b +Block 0010 [ 30]: 52ca5b52bddfc8ad +Block 0010 [ 31]: c5e896e214b9e11b +Block 0010 [ 32]: e117033bcd9625ef +Block 0010 [ 33]: 100e49c8268d8f2f +Block 0010 [ 34]: 2a958d58b325efdc +Block 0010 [ 35]: a2395a37949ff556 +Block 0010 [ 36]: 4c1e874bca55d04c +Block 0010 [ 37]: 5f1bc5262644b343 +Block 0010 [ 38]: ad11e453e038deaa +Block 0010 [ 39]: 287b94b109d7df97 +Block 0010 [ 40]: 0c424aca407f8984 +Block 0010 [ 41]: 62079d33ca943d72 +Block 0010 [ 42]: e4530fa28668e2d5 +Block 0010 [ 43]: e6daf6dd8a6be133 +Block 0010 [ 44]: a1a3dfd0125ede58 +Block 0010 [ 45]: 760feb30830ae154 +Block 0010 [ 46]: 077ef34a416f5886 +Block 0010 [ 47]: 31687239a635eae0 +Block 0010 [ 48]: 95fd0087afc7c838 +Block 0010 [ 49]: 87ca60d36dd7df36 +Block 0010 [ 50]: dffda96d886a96f4 +Block 0010 [ 51]: f8ad397459b0ad94 +Block 0010 [ 52]: 58097d9ddc18e114 +Block 0010 [ 53]: 0ef111b195052ba1 +Block 0010 [ 54]: 01f720c2f276a54a +Block 0010 [ 55]: 6e1f1243af57995a +Block 0010 [ 56]: 3eb65ece378c1197 +Block 0010 [ 57]: d6fff89c6d4f6bee +Block 0010 [ 58]: 1ee850f36749e874 +Block 0010 [ 59]: 44a84ef91de9cc29 +Block 0010 [ 60]: d4228cc0a1ded059 +Block 0010 [ 61]: 8265ec768f3c31cb +Block 0010 [ 62]: 52d0a6c81f7d7e25 +Block 0010 [ 63]: 60f8f34e0ee51912 +Block 0010 [ 64]: 7e296a5588063666 +Block 0010 [ 65]: d7c340360acfb706 +Block 0010 [ 66]: 5c38e604a7d84d65 +Block 0010 [ 67]: 9394c554e95ef046 +Block 0010 [ 68]: 2ebb479ae3059c4b +Block 0010 [ 69]: 079e88c1483363ca +Block 0010 [ 70]: 720ac22598be7958 +Block 0010 [ 71]: 794417526d2982b5 +Block 0010 [ 72]: 752252a5603ec066 +Block 0010 [ 73]: d62d4cc0b661537d +Block 0010 [ 74]: 8687304a5ce5183c +Block 0010 [ 75]: 8ca8c10b032e3fa8 +Block 0010 [ 76]: c29c11ff6853939c +Block 0010 [ 77]: cae1bae35ceaf6c5 +Block 0010 [ 78]: b2584a08cbf87502 +Block 0010 [ 79]: 1a07c00c94b6e96d +Block 0010 [ 80]: 5ba02dc60341bb67 +Block 0010 [ 81]: 5f3c3c068ff5925a +Block 0010 [ 82]: 310a1f867714e882 +Block 0010 [ 83]: e27e7e95a6030227 +Block 0010 [ 84]: 7eae41077b7cfa57 +Block 0010 [ 85]: e6f885645efb251c +Block 0010 [ 86]: 4afcdde9189673a5 +Block 0010 [ 87]: a8359776d73a509c +Block 0010 [ 88]: 53fbc97624693850 +Block 0010 [ 89]: c5cb54d8681267bd +Block 0010 [ 90]: 94a91156c3ad818c +Block 0010 [ 91]: 486788a97f9eed9c +Block 0010 [ 92]: f1e80bd47e1bead9 +Block 0010 [ 93]: 6c0c8789e7ae2b7f +Block 0010 [ 94]: 2e9fcba124e00bb7 +Block 0010 [ 95]: 14ab4120e959cbb0 +Block 0010 [ 96]: e886072019cdb34b +Block 0010 [ 97]: a5e7dd581c669d1e +Block 0010 [ 98]: c3020e7807e0b773 +Block 0010 [ 99]: d20e054b8604e5af +Block 0010 [100]: fbf072c54ee3a4bd +Block 0010 [101]: f32a5a150b1703e5 +Block 0010 [102]: 25c471f04a072cec +Block 0010 [103]: a59dedf5884094e5 +Block 0010 [104]: 6210d174ecf94984 +Block 0010 [105]: f0c39b9f4040914e +Block 0010 [106]: 210f2b657dd53eda +Block 0010 [107]: 8632ff56c33e7b87 +Block 0010 [108]: 7239c0bbdadfe813 +Block 0010 [109]: 32ec7541d19960d5 +Block 0010 [110]: d85ff9b490aeb9b1 +Block 0010 [111]: 2416348a4822a40a +Block 0010 [112]: e4baef241d563a56 +Block 0010 [113]: 7b378fbc2beb24ba +Block 0010 [114]: a7c65c31bb5bb666 +Block 0010 [115]: d46629a61124fc0b +Block 0010 [116]: d49c3abb0210183d +Block 0010 [117]: d1974949b75ccc07 +Block 0010 [118]: 19329244871efd55 +Block 0010 [119]: c45e9eb14a2eb1ec +Block 0010 [120]: e870bcf4d438375d +Block 0010 [121]: 0359d1c2cb62f251 +Block 0010 [122]: e12903a40147d90e +Block 0010 [123]: c549cd1a1f8a229d +Block 0010 [124]: 3a85f379d1c5f7fe +Block 0010 [125]: 11221154382972bc +Block 0010 [126]: e655c58b7b41b104 +Block 0010 [127]: 22846d513c8c4c61 +Block 0011 [ 0]: 087c4a60f7fdcc8a +Block 0011 [ 1]: a16751907a1c9062 +Block 0011 [ 2]: e5307c613784d75e +Block 0011 [ 3]: 642c9cc06f4e67d4 +Block 0011 [ 4]: c8da783b1213b284 +Block 0011 [ 5]: cc6fb6a6d80b3797 +Block 0011 [ 6]: 3f1398684def9ae4 +Block 0011 [ 7]: 24260a2da339bccf +Block 0011 [ 8]: 8dd645b474415c70 +Block 0011 [ 9]: acfa4ba58a001598 +Block 0011 [ 10]: 9c0b110f98c3afb6 +Block 0011 [ 11]: abbecf2c6893ec40 +Block 0011 [ 12]: 77c8c41012fc9a92 +Block 0011 [ 13]: 610f88076839c41c +Block 0011 [ 14]: 6f082b5261f7e38e +Block 0011 [ 15]: c75e62720817a4d4 +Block 0011 [ 16]: a49ab7174523b5b2 +Block 0011 [ 17]: 63393cc05061577d +Block 0011 [ 18]: ff624379436a6cb2 +Block 0011 [ 19]: a71b7407b4ec74b1 +Block 0011 [ 20]: 044a0eb1dc46b867 +Block 0011 [ 21]: 95ee8cab74458e8b +Block 0011 [ 22]: 1ae75464926aee1b +Block 0011 [ 23]: b0449f73ce98b3a4 +Block 0011 [ 24]: 925483abc8bd86f0 +Block 0011 [ 25]: cc0a60e8210b1eee +Block 0011 [ 26]: 21736abdade24267 +Block 0011 [ 27]: 39bed01022945311 +Block 0011 [ 28]: 273eb86173f1b0ba +Block 0011 [ 29]: 4e74e045d26408a6 +Block 0011 [ 30]: 9bd1d32674b4418b +Block 0011 [ 31]: 5f2db619452b3e6c +Block 0011 [ 32]: 2d2b1b7dc990bcab +Block 0011 [ 33]: 6975d2169d1e64a0 +Block 0011 [ 34]: ac08dec82fb69f97 +Block 0011 [ 35]: 8d86ab2cb64b5743 +Block 0011 [ 36]: 6e52666b53ebb4e1 +Block 0011 [ 37]: 05d9ed8353359686 +Block 0011 [ 38]: 4d8e726410069c75 +Block 0011 [ 39]: 3047edc384cd7ad0 +Block 0011 [ 40]: 5927a66a3693b292 +Block 0011 [ 41]: ec4ddaa0d1062c01 +Block 0011 [ 42]: 56a76e0424f3431b +Block 0011 [ 43]: ff180425a253e617 +Block 0011 [ 44]: aef38fa44093c20f +Block 0011 [ 45]: d9ea2788a5f4b33f +Block 0011 [ 46]: c5ee5f8214eeadd3 +Block 0011 [ 47]: ae26aa6379355549 +Block 0011 [ 48]: 342cf009717a3cf9 +Block 0011 [ 49]: b249d52df9974c94 +Block 0011 [ 50]: daca199ea5162793 +Block 0011 [ 51]: 504440e9f34f2ea4 +Block 0011 [ 52]: 6e4a0ee45733522f +Block 0011 [ 53]: bc002a2d103dafb9 +Block 0011 [ 54]: 21453d25757b20ab +Block 0011 [ 55]: 6de3ec6e8c583fc4 +Block 0011 [ 56]: ba35f66cd858aac1 +Block 0011 [ 57]: cab68224bb07850e +Block 0011 [ 58]: ffd62d859483fbf5 +Block 0011 [ 59]: bddf886f53ae98af +Block 0011 [ 60]: c9c9db7f51294b61 +Block 0011 [ 61]: 2f17b8ac8f19838d +Block 0011 [ 62]: bea386a3c0f2b883 +Block 0011 [ 63]: 5cc8a9bc30b44f60 +Block 0011 [ 64]: f6b8420f06031880 +Block 0011 [ 65]: 6e550e89ed69a4f2 +Block 0011 [ 66]: 0f20af55db3a61f5 +Block 0011 [ 67]: 13d66a8892f20f94 +Block 0011 [ 68]: eca0cb483c58a3c9 +Block 0011 [ 69]: 39f79cfa748dfacb +Block 0011 [ 70]: d30c012a7af33e12 +Block 0011 [ 71]: 082c1ca2b8130ecc +Block 0011 [ 72]: c85e54db0d0637a7 +Block 0011 [ 73]: 01041626ef5c7864 +Block 0011 [ 74]: 8227dfea66b11bf6 +Block 0011 [ 75]: b7d475e79564f7ce +Block 0011 [ 76]: dbd9e472d5cb5511 +Block 0011 [ 77]: 3974a73be4c3e651 +Block 0011 [ 78]: a0dc6811417a4ddf +Block 0011 [ 79]: 91dd84cea94e45e8 +Block 0011 [ 80]: 70b31d33b3591da6 +Block 0011 [ 81]: 08687f898128f78e +Block 0011 [ 82]: 1ba4f787284e0c64 +Block 0011 [ 83]: fc3605e8516c988f +Block 0011 [ 84]: 9e33611951c7459b +Block 0011 [ 85]: e26fbc9ca703c2f3 +Block 0011 [ 86]: ddc8a9b6c1d5b390 +Block 0011 [ 87]: 21b21e9b65a0f690 +Block 0011 [ 88]: 27446f75da28067b +Block 0011 [ 89]: 0320b4243ea5cd7c +Block 0011 [ 90]: 98ddcc6855ee3b8a +Block 0011 [ 91]: 99d70a73cb919721 +Block 0011 [ 92]: c9a802b4526d366a +Block 0011 [ 93]: 9ed10168b49b54ba +Block 0011 [ 94]: f49780fa64c29aa9 +Block 0011 [ 95]: fc8f149967071a63 +Block 0011 [ 96]: 242033b18a01351e +Block 0011 [ 97]: d5d20ee36d53a3a5 +Block 0011 [ 98]: 0def71eae139449c +Block 0011 [ 99]: f48b3ab19e312f27 +Block 0011 [100]: 04d14ab2e4c96da2 +Block 0011 [101]: caf020d484d724e3 +Block 0011 [102]: 3b47556e5f91133a +Block 0011 [103]: 06a6e66d4024926c +Block 0011 [104]: 26b4a90b3a7babff +Block 0011 [105]: da6deb49c640617e +Block 0011 [106]: a0f431571ce0cdf4 +Block 0011 [107]: a7f4018c8028af61 +Block 0011 [108]: 2b9be19108c53caa +Block 0011 [109]: 37dc3ef56277ecf3 +Block 0011 [110]: cb1f1519f7f6409a +Block 0011 [111]: b673f3aa13b9c3bb +Block 0011 [112]: bbf051ef2ef41554 +Block 0011 [113]: 779a335c4687271a +Block 0011 [114]: fcb5e2d10d07cc1e +Block 0011 [115]: 409c972b93d2f0b5 +Block 0011 [116]: 4e1221d61d60556b +Block 0011 [117]: a7171d38abb1b56c +Block 0011 [118]: 22c1e97d366a0242 +Block 0011 [119]: e2d3e159746843b7 +Block 0011 [120]: 4d591a5e23730cc3 +Block 0011 [121]: 903a4842eb68247a +Block 0011 [122]: c4aa3fa64636ef53 +Block 0011 [123]: 7f92f99f0aa91b22 +Block 0011 [124]: 873f5c9e82cfbdf0 +Block 0011 [125]: ac3b0c40f4317688 +Block 0011 [126]: 830675a89d335e0e +Block 0011 [127]: d93df64ab91dfdc9 +Block 0012 [ 0]: 1ad345df4db50eb2 +Block 0012 [ 1]: 7f2a991f509130e9 +Block 0012 [ 2]: 5b11b82461502f75 +Block 0012 [ 3]: d2502b2312475a91 +Block 0012 [ 4]: 235a1b1b8fbaaca7 +Block 0012 [ 5]: 54300afb3c272e47 +Block 0012 [ 6]: c83d4ed5e93d04ea +Block 0012 [ 7]: 92c7e0dab1b161a0 +Block 0012 [ 8]: e391fef7324fedb2 +Block 0012 [ 9]: da51ed473e82976b +Block 0012 [ 10]: da7cf42297440604 +Block 0012 [ 11]: 39c532ece6e4c67e +Block 0012 [ 12]: 2e8ec6fba2b43181 +Block 0012 [ 13]: e4c0272e6a3a7b2b +Block 0012 [ 14]: 61e5121d987d4bfb +Block 0012 [ 15]: 1efc1de2eb195832 +Block 0012 [ 16]: 83ea202c2677629d +Block 0012 [ 17]: 4d553ee685791054 +Block 0012 [ 18]: 9908af39367d6f42 +Block 0012 [ 19]: 0ed9a6e98a863475 +Block 0012 [ 20]: 4fd7b7f0611df61b +Block 0012 [ 21]: 1a215453a7773bab +Block 0012 [ 22]: ca5f63603c63523b +Block 0012 [ 23]: 2e0ca98c896f42b6 +Block 0012 [ 24]: ef33ee178de5e931 +Block 0012 [ 25]: 78a3d15a99e7c46d +Block 0012 [ 26]: 986097342bb0b51b +Block 0012 [ 27]: b79d38b577ef3bd0 +Block 0012 [ 28]: 4c04efe735ee9aa3 +Block 0012 [ 29]: 4408ee8ac6cc9b03 +Block 0012 [ 30]: a964e18a98feebca +Block 0012 [ 31]: e9980c96d51d78a4 +Block 0012 [ 32]: b030a343e1fed12f +Block 0012 [ 33]: af98cd31d6e5f2ae +Block 0012 [ 34]: 37c3268c71d35630 +Block 0012 [ 35]: bdfb0ad9f749f0ba +Block 0012 [ 36]: 4f3e2bf11096123f +Block 0012 [ 37]: 17879701cb4a1a6a +Block 0012 [ 38]: ee36d707bb272a6d +Block 0012 [ 39]: bc80e260e49601e9 +Block 0012 [ 40]: 7864867c5fbcaca2 +Block 0012 [ 41]: 5de9d72cc44e465e +Block 0012 [ 42]: c0610768400af1f7 +Block 0012 [ 43]: d3bfe5033cedf36d +Block 0012 [ 44]: 734de7e52fbc8edf +Block 0012 [ 45]: aca5cdb35f89215c +Block 0012 [ 46]: d9f8cc9d80ad3f5e +Block 0012 [ 47]: a62a68de189b641c +Block 0012 [ 48]: 7c7ca4dadf0d3e57 +Block 0012 [ 49]: 6e5abd429ad14d50 +Block 0012 [ 50]: 02719e587143939b +Block 0012 [ 51]: 00ceef42af11c7e0 +Block 0012 [ 52]: f1c5f4ed527a2440 +Block 0012 [ 53]: eeb79837ce3a0e21 +Block 0012 [ 54]: ad2d4df530faa7f5 +Block 0012 [ 55]: 13687cab0e868fc9 +Block 0012 [ 56]: d22f8dfc671eeae7 +Block 0012 [ 57]: 70e6519287e17172 +Block 0012 [ 58]: 64f0bcd93ce1195c +Block 0012 [ 59]: e863a76e5b71fb30 +Block 0012 [ 60]: 4395c0d11c924dcb +Block 0012 [ 61]: 9f56bb6bf9506f7a +Block 0012 [ 62]: 2afdf7d2ef3c22fb +Block 0012 [ 63]: e77a668d06f5f5f9 +Block 0012 [ 64]: 952ae073e7174ccf +Block 0012 [ 65]: 6c68dd56660ac7ca +Block 0012 [ 66]: 2ff187f2cebb916d +Block 0012 [ 67]: b5381748e6c0350d +Block 0012 [ 68]: 257094c2b57bf7ee +Block 0012 [ 69]: e2e15bc30698034b +Block 0012 [ 70]: c0a07bdbab7b6861 +Block 0012 [ 71]: fc6965990b7123e4 +Block 0012 [ 72]: 1a09c34714985d6c +Block 0012 [ 73]: 66c61d78f3fa0901 +Block 0012 [ 74]: 45b8bd1699612eaf +Block 0012 [ 75]: 6337d206d8f6a1c6 +Block 0012 [ 76]: 1c6e6a883a316d7b +Block 0012 [ 77]: 8e2520966a3f5393 +Block 0012 [ 78]: 28328a2d7ffbd5d8 +Block 0012 [ 79]: 7a13afae5090f487 +Block 0012 [ 80]: dc9e54d596385074 +Block 0012 [ 81]: 7b2a19c9b048959c +Block 0012 [ 82]: 6fa578ecc65e441a +Block 0012 [ 83]: 0e05de01a70a6559 +Block 0012 [ 84]: fe202d50eb104a91 +Block 0012 [ 85]: 7564eb93f410f212 +Block 0012 [ 86]: f242236f542072cb +Block 0012 [ 87]: 262a216932431387 +Block 0012 [ 88]: 269636433d40f862 +Block 0012 [ 89]: 1c297b358273dcea +Block 0012 [ 90]: e4d99ff9affa34c6 +Block 0012 [ 91]: 8aaea2d759ab7f9c +Block 0012 [ 92]: 527932b0e8b922f8 +Block 0012 [ 93]: 3366937699d3cdbe +Block 0012 [ 94]: d80974a91ac0a0b4 +Block 0012 [ 95]: db086bfd83ddf51f +Block 0012 [ 96]: 604078a09efb7a74 +Block 0012 [ 97]: 5785dc0086b89269 +Block 0012 [ 98]: 859596be9c142de9 +Block 0012 [ 99]: 492ca15c36f63554 +Block 0012 [100]: eab20093faab6936 +Block 0012 [101]: 65b2e8dd2926e710 +Block 0012 [102]: d9afd0da91abcf83 +Block 0012 [103]: 2b1ea3e0f35d8b3c +Block 0012 [104]: 8c1cfa61d92384de +Block 0012 [105]: 076752406e32e99c +Block 0012 [106]: 5bb249c53a792191 +Block 0012 [107]: fc8cee3fa34790e5 +Block 0012 [108]: 8549d1fea8dd8798 +Block 0012 [109]: e06853678f64e142 +Block 0012 [110]: f63402296b31f24a +Block 0012 [111]: 26ea2832acb17e48 +Block 0012 [112]: f1a60fdef2a3e415 +Block 0012 [113]: 1326bd0d6192ed1c +Block 0012 [114]: 1b99169d3bf2e65a +Block 0012 [115]: d8f4c1a60f882992 +Block 0012 [116]: 7b02d30fc580dd08 +Block 0012 [117]: 9f56c86fea37b1c5 +Block 0012 [118]: ff8f6119deb1d6b2 +Block 0012 [119]: 9f7d344af36658b9 +Block 0012 [120]: 635732acba33b90c +Block 0012 [121]: bf44366219c55c4a +Block 0012 [122]: 15bbff300adcf605 +Block 0012 [123]: 2bcde7efb0fa12a1 +Block 0012 [124]: 4823d0fc36dc9fa3 +Block 0012 [125]: 61d737e414cbdb5a +Block 0012 [126]: d0ad0e2902139a09 +Block 0012 [127]: 707eb8916b627127 +Block 0013 [ 0]: f5b25a4acd8eac85 +Block 0013 [ 1]: ee959cf39d3c4644 +Block 0013 [ 2]: 78d7bfa8de372b87 +Block 0013 [ 3]: 31d07e82e6e9e4a6 +Block 0013 [ 4]: 53317a8b03edbd30 +Block 0013 [ 5]: 4df04dc0850df577 +Block 0013 [ 6]: 489794583f20cb0b +Block 0013 [ 7]: 15b684ebce4f4fc8 +Block 0013 [ 8]: 493f8ddb94fc6f8e +Block 0013 [ 9]: 5c28a522d742021d +Block 0013 [ 10]: 9ae7e6a23a8f400d +Block 0013 [ 11]: 11454491ba4a02f4 +Block 0013 [ 12]: 87b5a0821f6a8e20 +Block 0013 [ 13]: 220ba016407d5c90 +Block 0013 [ 14]: 153e626fd2d674a7 +Block 0013 [ 15]: 622ff968c50d21ef +Block 0013 [ 16]: 47fde8ffcbe1f793 +Block 0013 [ 17]: 7b503a6b4527e62f +Block 0013 [ 18]: ecd0b784fd42ee2d +Block 0013 [ 19]: e9f295e0c9618983 +Block 0013 [ 20]: d60bd7403ca015d9 +Block 0013 [ 21]: 88edd56f2c209ba1 +Block 0013 [ 22]: 9c0db046364ac775 +Block 0013 [ 23]: f1b38a5f55895ebc +Block 0013 [ 24]: 3fb1e9fb4ce2a19b +Block 0013 [ 25]: e185c2ed252ff095 +Block 0013 [ 26]: 583c36eb1c2895e6 +Block 0013 [ 27]: d496049eea1f17ee +Block 0013 [ 28]: d2388fc090f49393 +Block 0013 [ 29]: e8643bf2a54cccbf +Block 0013 [ 30]: cdeac9a1398b57a2 +Block 0013 [ 31]: 839a73661c2872c0 +Block 0013 [ 32]: 09cc4949586308ba +Block 0013 [ 33]: 24dee87aceef390c +Block 0013 [ 34]: beab4e57f06e1427 +Block 0013 [ 35]: 00204629e891b870 +Block 0013 [ 36]: 657ee461e9159696 +Block 0013 [ 37]: be041415db73f231 +Block 0013 [ 38]: 247f4b5377d4ca7c +Block 0013 [ 39]: 70d415da5bb36bea +Block 0013 [ 40]: 313a1179f617093b +Block 0013 [ 41]: 41bcffd8350e1754 +Block 0013 [ 42]: 2c4f76024e43f645 +Block 0013 [ 43]: 1994dbd3c51e1c31 +Block 0013 [ 44]: 221ad24959953a4c +Block 0013 [ 45]: aa40bbd20a4016c6 +Block 0013 [ 46]: d6bf58116a751602 +Block 0013 [ 47]: 24734bf7a5d389bf +Block 0013 [ 48]: 928f777444bd7d68 +Block 0013 [ 49]: 465cf35d4417a49d +Block 0013 [ 50]: 2f3c687a1bbdaf2f +Block 0013 [ 51]: fd2eb5b5a73f1419 +Block 0013 [ 52]: 5a2cc27e60b1798d +Block 0013 [ 53]: d93a4af5c2492231 +Block 0013 [ 54]: c7a4258fd56c5df3 +Block 0013 [ 55]: e83d9db8ea4ba71d +Block 0013 [ 56]: d7752996d109d14a +Block 0013 [ 57]: ef45b6603c9edf8a +Block 0013 [ 58]: 0efbb174225721de +Block 0013 [ 59]: d2642ac42b528890 +Block 0013 [ 60]: bc6040869673b79b +Block 0013 [ 61]: fc4b0c4ee58ad868 +Block 0013 [ 62]: ded3ebbf16f440da +Block 0013 [ 63]: 75625237408a7862 +Block 0013 [ 64]: 601d8af508992764 +Block 0013 [ 65]: 2132ec3f36fd592b +Block 0013 [ 66]: 4990b4750222cfd0 +Block 0013 [ 67]: c9abaa67cbe284b3 +Block 0013 [ 68]: 597dee2f5ea8ccfd +Block 0013 [ 69]: 7679ae1f07cdfc36 +Block 0013 [ 70]: 1c13c154abf5cb34 +Block 0013 [ 71]: ebe9cc030f0b1a9b +Block 0013 [ 72]: 71cae6255cf82411 +Block 0013 [ 73]: 83708a47b6689ebb +Block 0013 [ 74]: d7cb99b8d8bfe518 +Block 0013 [ 75]: b98021e9f611c058 +Block 0013 [ 76]: fb37596c497e3c88 +Block 0013 [ 77]: a16ac0a883ced256 +Block 0013 [ 78]: b29aaf06bf1d2469 +Block 0013 [ 79]: 1dc488b3457a3f32 +Block 0013 [ 80]: 46402961371a034e +Block 0013 [ 81]: 7877d9505be77805 +Block 0013 [ 82]: 5078ade761e50cfa +Block 0013 [ 83]: 7ec4cd853f9b0335 +Block 0013 [ 84]: a14b957a670d405f +Block 0013 [ 85]: 1722084e87827637 +Block 0013 [ 86]: 15e8e2e3159dccc7 +Block 0013 [ 87]: 0ac1283e5aaada10 +Block 0013 [ 88]: 38a0e878c2a1ce0a +Block 0013 [ 89]: 566bc9d400a99ff4 +Block 0013 [ 90]: 509edd600055f6c3 +Block 0013 [ 91]: a57c5b4f94d5728b +Block 0013 [ 92]: c4b0df787e20289d +Block 0013 [ 93]: 24b30c1d65cf2d27 +Block 0013 [ 94]: 21a6c6fa045f0f88 +Block 0013 [ 95]: 3dd681b3a08f3773 +Block 0013 [ 96]: 725eeb9947bfcd95 +Block 0013 [ 97]: ad56a88e51d68125 +Block 0013 [ 98]: 35caf5c18f20a731 +Block 0013 [ 99]: 2ddd6ec2de7b9fd8 +Block 0013 [100]: 6295f275afd2977a +Block 0013 [101]: e85d4045aa9da6f0 +Block 0013 [102]: 473cc44a01350486 +Block 0013 [103]: 80d86fa1fc760a9a +Block 0013 [104]: 0b7e4a76a6b30ca3 +Block 0013 [105]: 9b0c415641abb4ad +Block 0013 [106]: a58f46926db36f37 +Block 0013 [107]: 9558bb81a088fbf8 +Block 0013 [108]: 20ab2645bfcd5707 +Block 0013 [109]: 41459b186702a0a2 +Block 0013 [110]: f01bcb9dd08ef05e +Block 0013 [111]: 91613230b930f3d7 +Block 0013 [112]: bd0c9a81312cf8bf +Block 0013 [113]: 3b521db4eda40f02 +Block 0013 [114]: 5f99993d710e0150 +Block 0013 [115]: 2efe9490a78cd199 +Block 0013 [116]: c29b3bc4d52109cc +Block 0013 [117]: cc9a7182f55cd6ab +Block 0013 [118]: fc674176b0dc3548 +Block 0013 [119]: d33b6146b3f1ab1a +Block 0013 [120]: 5531827ddf03bf29 +Block 0013 [121]: a301b4d782e7f83d +Block 0013 [122]: 8fe1e8d8657cd51c +Block 0013 [123]: abdecfdafada2c2e +Block 0013 [124]: e94378ab518f1d8a +Block 0013 [125]: 18c0089c7d48b989 +Block 0013 [126]: 91aefb6654bfba5c +Block 0013 [127]: 727fe8bdc1d2a601 +Block 0014 [ 0]: 10b1676c40244bb4 +Block 0014 [ 1]: 0ab039140f617e39 +Block 0014 [ 2]: dd79402081be7e8a +Block 0014 [ 3]: 79cee37643926e99 +Block 0014 [ 4]: f195ac2b27bae925 +Block 0014 [ 5]: f2a52f91848f0b1a +Block 0014 [ 6]: 55874c67614a346c +Block 0014 [ 7]: 0365bb7b50200a78 +Block 0014 [ 8]: 06421ea996b48809 +Block 0014 [ 9]: 2c28753bde627a8e +Block 0014 [ 10]: 2bf761bc6e2851be +Block 0014 [ 11]: e61da0f18228ce08 +Block 0014 [ 12]: 1c909989f8ff4a0c +Block 0014 [ 13]: b4c9f8b096bd52e1 +Block 0014 [ 14]: e0a3710feca1e3cc +Block 0014 [ 15]: acd36c867bedbb5b +Block 0014 [ 16]: 06bb06ddcd6997c3 +Block 0014 [ 17]: 5049d60c6e65e147 +Block 0014 [ 18]: 59a58a1ccff02b1a +Block 0014 [ 19]: 2d813ae8f5e627b8 +Block 0014 [ 20]: f7a3b8e855dfeb31 +Block 0014 [ 21]: 95a144f33b8d6865 +Block 0014 [ 22]: 48608e431db16dff +Block 0014 [ 23]: 5603d21bea9814e1 +Block 0014 [ 24]: 29a0395b87dfa45f +Block 0014 [ 25]: 94ba29202947a04a +Block 0014 [ 26]: add8292182af9466 +Block 0014 [ 27]: 3133c1ea696e1492 +Block 0014 [ 28]: fc4c66d16b34541a +Block 0014 [ 29]: d07d4bd572129296 +Block 0014 [ 30]: 21fabcc60cd7579b +Block 0014 [ 31]: 108a4ec2c3736878 +Block 0014 [ 32]: 1a7c4bd5f871ee74 +Block 0014 [ 33]: 59de5a617bf3f1db +Block 0014 [ 34]: 6d42b9e076aa6f5b +Block 0014 [ 35]: 4f44e6b995e08524 +Block 0014 [ 36]: 884b59cf9e61d728 +Block 0014 [ 37]: b63870e49d382a8e +Block 0014 [ 38]: e9f2a844db92cd51 +Block 0014 [ 39]: 7b47ba589406327c +Block 0014 [ 40]: 889bde34d1a312d2 +Block 0014 [ 41]: 0afbd1c0acc0fc19 +Block 0014 [ 42]: 7fc655169f230234 +Block 0014 [ 43]: 52c31ef06c1bef89 +Block 0014 [ 44]: 3fda04354e8054bc +Block 0014 [ 45]: 6060cdf695c598b4 +Block 0014 [ 46]: 07717cf2e169176e +Block 0014 [ 47]: 8e20cddb52f2cce8 +Block 0014 [ 48]: 88c93460aa78072d +Block 0014 [ 49]: 919f9fe662867b98 +Block 0014 [ 50]: b0a0f9f25b168bb8 +Block 0014 [ 51]: aa62d17fc6d9e630 +Block 0014 [ 52]: b5c64f4551eeeb17 +Block 0014 [ 53]: 451de645c0be63d8 +Block 0014 [ 54]: 16a451d91dc56ce6 +Block 0014 [ 55]: d47a79d435d0c6b3 +Block 0014 [ 56]: d36e1bc27b66b211 +Block 0014 [ 57]: 5a0412bcba3f0648 +Block 0014 [ 58]: d63998a31aa4403d +Block 0014 [ 59]: 0b6890275cd12195 +Block 0014 [ 60]: f41dc35ba2ee18dd +Block 0014 [ 61]: e52134ebb9407340 +Block 0014 [ 62]: e30e8684808a8207 +Block 0014 [ 63]: 6873a33cd17b1d42 +Block 0014 [ 64]: 2f6d2bc803375757 +Block 0014 [ 65]: 4c865ecb4981f520 +Block 0014 [ 66]: a4c88995838907d1 +Block 0014 [ 67]: a7c3e8d3c26c8a7e +Block 0014 [ 68]: 0f9f7be519c491b5 +Block 0014 [ 69]: ff2778b2dbb8b68d +Block 0014 [ 70]: 40c257be8af04112 +Block 0014 [ 71]: 4774c5f446e5ec29 +Block 0014 [ 72]: 16b8e4ea48ce6762 +Block 0014 [ 73]: 1b8bf07b5c72d62f +Block 0014 [ 74]: f957fbafcf0203f1 +Block 0014 [ 75]: 280aba1ffcf5548c +Block 0014 [ 76]: 78c193e68f2279fe +Block 0014 [ 77]: 32ad8f36dca6bc0a +Block 0014 [ 78]: 99df6ce337faa989 +Block 0014 [ 79]: 9c7b79fc62ed39bf +Block 0014 [ 80]: 5c48affa90dc91d6 +Block 0014 [ 81]: d902824f2de78b36 +Block 0014 [ 82]: ca800b35c6c4a3d7 +Block 0014 [ 83]: a2a0e389d67b2219 +Block 0014 [ 84]: 84abe64d24cda2fa +Block 0014 [ 85]: 3b8fee610918ae1c +Block 0014 [ 86]: 4807e19d49d2620e +Block 0014 [ 87]: 8a4daac02dd5a1f1 +Block 0014 [ 88]: 84193ecf9397a8ac +Block 0014 [ 89]: 3a878d3c7143626d +Block 0014 [ 90]: fefa2fea15776bed +Block 0014 [ 91]: b5b3aff0e3764326 +Block 0014 [ 92]: bb6cf890ad7bdd93 +Block 0014 [ 93]: 05db7bbb378d5b4a +Block 0014 [ 94]: ef536b5401914b3c +Block 0014 [ 95]: 1669cea05508ca6d +Block 0014 [ 96]: c6fa5dcd69b2289c +Block 0014 [ 97]: 81c4f6e588e88828 +Block 0014 [ 98]: f79df208f6a28f72 +Block 0014 [ 99]: eff01bd909548eaa +Block 0014 [100]: f3aadefe5fa688f7 +Block 0014 [101]: 5eb8f34faad19615 +Block 0014 [102]: 76e2160b0f8a3be3 +Block 0014 [103]: 384d6f6d12bf33dd +Block 0014 [104]: e19b1a15721e64ec +Block 0014 [105]: 56fe02cb2dd6bff7 +Block 0014 [106]: ea4740f275b38022 +Block 0014 [107]: 22c0fe908d71be63 +Block 0014 [108]: bbbb17d83f8ceaac +Block 0014 [109]: b4131310f114b478 +Block 0014 [110]: a30b7094283ce815 +Block 0014 [111]: f37b55dab3f0111a +Block 0014 [112]: 50b86270bad3f5cd +Block 0014 [113]: d8712d30644285da +Block 0014 [114]: 6a98fade890e4928 +Block 0014 [115]: 7ea0752485687df3 +Block 0014 [116]: dee516c8e6167ea6 +Block 0014 [117]: d6d6fdf505410090 +Block 0014 [118]: b32bc9d8ca917423 +Block 0014 [119]: 2d9f32b5bbdb1ccf +Block 0014 [120]: 35da94c8a2408b96 +Block 0014 [121]: f65500bffa03086c +Block 0014 [122]: 88b0596f10ff559e +Block 0014 [123]: 5cb9a2dedceb1a38 +Block 0014 [124]: 72360e96f822afd8 +Block 0014 [125]: 395b93cc58ec538a +Block 0014 [126]: 8d974a371c3f3083 +Block 0014 [127]: bca4da67b8208cca +Block 0015 [ 0]: f189eac80b130e98 +Block 0015 [ 1]: 33f6733a94d003dd +Block 0015 [ 2]: a6ac8be5d69abb9c +Block 0015 [ 3]: 9284f0e1ff25fa3e +Block 0015 [ 4]: 974c173009f23b54 +Block 0015 [ 5]: f039f84eac6c7176 +Block 0015 [ 6]: 6eeb055e842f01a6 +Block 0015 [ 7]: f4b998946c13fd7e +Block 0015 [ 8]: f9a6bd32f6917a3f +Block 0015 [ 9]: 123d884226b23a95 +Block 0015 [ 10]: dbcfa8deb02bde7a +Block 0015 [ 11]: 19e40500041dff85 +Block 0015 [ 12]: 98a779869b36095b +Block 0015 [ 13]: f1a4665aa48df2aa +Block 0015 [ 14]: f12aee1bbe71e754 +Block 0015 [ 15]: 2832355f0859ae9f +Block 0015 [ 16]: e36f3ac620b21342 +Block 0015 [ 17]: 18d5d719e771ef0a +Block 0015 [ 18]: 7071360728fb35b8 +Block 0015 [ 19]: 7f0d4cd2b1a2dbfc +Block 0015 [ 20]: e66f2beca141c0c2 +Block 0015 [ 21]: 633620378d948360 +Block 0015 [ 22]: 09bf7ab13b7b8113 +Block 0015 [ 23]: cb30b7662b21ab38 +Block 0015 [ 24]: 2edc4731d2308a7e +Block 0015 [ 25]: 4e49a895a5ef98f6 +Block 0015 [ 26]: db34f4043edc554c +Block 0015 [ 27]: 30697edc4c093bfb +Block 0015 [ 28]: 5797f671e7bc95f7 +Block 0015 [ 29]: d74bd8d2d1a1e1b0 +Block 0015 [ 30]: f583913e4ff8009e +Block 0015 [ 31]: 10281ef2dca1f23d +Block 0015 [ 32]: 8127bd68bf85332f +Block 0015 [ 33]: e6ff6cbc20158925 +Block 0015 [ 34]: 98ab39f4f1d48bef +Block 0015 [ 35]: e25a5306cb2675a8 +Block 0015 [ 36]: 2b2562295968c33c +Block 0015 [ 37]: 6358a7dfcf36d573 +Block 0015 [ 38]: 8cbd7034d97fd867 +Block 0015 [ 39]: f06ab20be6ace852 +Block 0015 [ 40]: 53b92749e6daba84 +Block 0015 [ 41]: 13a93af10eb8a565 +Block 0015 [ 42]: 84d658b873d03cc4 +Block 0015 [ 43]: b02815931e125a52 +Block 0015 [ 44]: fffc1b1cdf95d195 +Block 0015 [ 45]: ee73a37dadb40b39 +Block 0015 [ 46]: 9e4e88a2ae5dc686 +Block 0015 [ 47]: 1385cd88e6425087 +Block 0015 [ 48]: 4d772741406ee491 +Block 0015 [ 49]: 6e9e9271fb4edf7a +Block 0015 [ 50]: 5b02a5717a3acaf7 +Block 0015 [ 51]: 24882157db0dcda3 +Block 0015 [ 52]: 4a1688e4d711fd76 +Block 0015 [ 53]: ad144c4d2eea708a +Block 0015 [ 54]: 8aa4f446306360c7 +Block 0015 [ 55]: bf677939988d20e0 +Block 0015 [ 56]: c664e88326639846 +Block 0015 [ 57]: 97b47955a332e498 +Block 0015 [ 58]: 43b7457f3a89c803 +Block 0015 [ 59]: 15f108424f133523 +Block 0015 [ 60]: 60ef61eab9430dc0 +Block 0015 [ 61]: 41978abdc34630ca +Block 0015 [ 62]: 80fdee0a502c933a +Block 0015 [ 63]: 40aeb6bcf72a83dd +Block 0015 [ 64]: c34873b79f92feda +Block 0015 [ 65]: 93b287cc7f2d6576 +Block 0015 [ 66]: a5e423046b37f7b5 +Block 0015 [ 67]: 3e45cc879804f363 +Block 0015 [ 68]: 8089be076d83ec63 +Block 0015 [ 69]: 7f942e9341bfef64 +Block 0015 [ 70]: fc36f40b2c23727c +Block 0015 [ 71]: 88f59f1b7aab23f6 +Block 0015 [ 72]: 6cd961e20b46cf04 +Block 0015 [ 73]: af8daa17307ece9f +Block 0015 [ 74]: 55c8a732a5024405 +Block 0015 [ 75]: 493351c9d90f5dca +Block 0015 [ 76]: e383eb9d2b702083 +Block 0015 [ 77]: 3531d76a907ff09b +Block 0015 [ 78]: 8b948c1f1adf708c +Block 0015 [ 79]: f60219e3c20f81bf +Block 0015 [ 80]: fdef7e1d0096ae36 +Block 0015 [ 81]: 0023848ed3244880 +Block 0015 [ 82]: ae70ea7e1e56bf11 +Block 0015 [ 83]: 6e32bdb76fe2ca3c +Block 0015 [ 84]: 269abe8ddbe52a74 +Block 0015 [ 85]: 2850442d72280b43 +Block 0015 [ 86]: 22d905fb996b5ab9 +Block 0015 [ 87]: 287e2018200cad12 +Block 0015 [ 88]: 6a1fe428bd732e3f +Block 0015 [ 89]: 4eb723cfea7bb304 +Block 0015 [ 90]: 530dbd634dd3efe3 +Block 0015 [ 91]: 74800758ff2daba1 +Block 0015 [ 92]: 90e457d82488bb2f +Block 0015 [ 93]: 1830be721f3ef8f8 +Block 0015 [ 94]: 5ccb3fab432a940a +Block 0015 [ 95]: b6ea244a748381a3 +Block 0015 [ 96]: b52aa1d526514b32 +Block 0015 [ 97]: 56337c73fe59a3bd +Block 0015 [ 98]: 823e910e9955c22f +Block 0015 [ 99]: 828b237a8aca3c43 +Block 0015 [100]: 805565bdb4eaf460 +Block 0015 [101]: 68cd5ca7e6a0f2fc +Block 0015 [102]: 2932126750b1bf54 +Block 0015 [103]: d96142902c6521c5 +Block 0015 [104]: bdba35f039f09c7d +Block 0015 [105]: d90d774b89e2fa8c +Block 0015 [106]: af4b578a109f3cbb +Block 0015 [107]: e7780dd887a4e339 +Block 0015 [108]: 1fd0a50762a32802 +Block 0015 [109]: 50daa087e523e884 +Block 0015 [110]: 3e94bce39aaeefbf +Block 0015 [111]: 99807216aaa83931 +Block 0015 [112]: 7fe25144749c8f9f +Block 0015 [113]: abbada9b71d20f73 +Block 0015 [114]: a6c6d5de3a4c4eab +Block 0015 [115]: 4238c5b727ddab36 +Block 0015 [116]: 65013e9f62f9c1e2 +Block 0015 [117]: 2e3ba5a1d874ac1c +Block 0015 [118]: 14b6ead39de6c35d +Block 0015 [119]: a59f40506f9bfde1 +Block 0015 [120]: 12d16d162b0cb94c +Block 0015 [121]: 87beca102f670103 +Block 0015 [122]: 84f177dddbb32ccf +Block 0015 [123]: fb7aed944a854935 +Block 0015 [124]: 70eb5f312639686f +Block 0015 [125]: 303f408c14c9e843 +Block 0015 [126]: fb6ba597191585b2 +Block 0015 [127]: 1e824a1b47167883 +Block 0016 [ 0]: e1ddeb06fb830a30 +Block 0016 [ 1]: d9ceeeb4dc057082 +Block 0016 [ 2]: 464dfdb178004fc9 +Block 0016 [ 3]: 98bccedb76dddac2 +Block 0016 [ 4]: da66667814cbf9c2 +Block 0016 [ 5]: b5f24d697ddbd51f +Block 0016 [ 6]: 54ef6a4c43dba9a8 +Block 0016 [ 7]: 1e525968c22632cb +Block 0016 [ 8]: 8bef045bd2e18cf4 +Block 0016 [ 9]: b592f422d19ec71e +Block 0016 [ 10]: 7690ed8e96aced5b +Block 0016 [ 11]: 6126a2deb2a336f1 +Block 0016 [ 12]: a3fa671528218d61 +Block 0016 [ 13]: 41c3390dc61f4dd2 +Block 0016 [ 14]: cdae2748aa147504 +Block 0016 [ 15]: 0dee773c929709ea +Block 0016 [ 16]: 413ae9680850dcd0 +Block 0016 [ 17]: 7ed328cf552481d4 +Block 0016 [ 18]: b66e178fb368811a +Block 0016 [ 19]: 251b75d20032bf7a +Block 0016 [ 20]: 545e1f4ef50e1fd8 +Block 0016 [ 21]: 2c91fc1f70cbdf5d +Block 0016 [ 22]: fc950316eb56d1a5 +Block 0016 [ 23]: 57f2ac7ad2d8e7c4 +Block 0016 [ 24]: 254bc347e7938b20 +Block 0016 [ 25]: 241ac053e0b11fac +Block 0016 [ 26]: 54fe9568bdb48368 +Block 0016 [ 27]: 5b1df834c305aaab +Block 0016 [ 28]: 0b6677fe6f663d73 +Block 0016 [ 29]: 2a58d4e0d23987bf +Block 0016 [ 30]: eed5f52ba9cfbeee +Block 0016 [ 31]: e901a61d3ac59b61 +Block 0016 [ 32]: a1b047e2d37cd3b1 +Block 0016 [ 33]: b1932b38a69fd47e +Block 0016 [ 34]: 67a1438ad6a91e4c +Block 0016 [ 35]: 47747d87352a5176 +Block 0016 [ 36]: 89b3e43ee9466ab2 +Block 0016 [ 37]: 7d1bf0dad3286e44 +Block 0016 [ 38]: ff2505d940b11463 +Block 0016 [ 39]: 08da9591c67460e2 +Block 0016 [ 40]: 66f29fc0597f157f +Block 0016 [ 41]: 4819aff7a4691283 +Block 0016 [ 42]: 5a8b617bacc4ad46 +Block 0016 [ 43]: ebefc29bd65b838f +Block 0016 [ 44]: 05ff5dd1e5b3ab2e +Block 0016 [ 45]: 626c0f1ec1e47007 +Block 0016 [ 46]: 7a7b03b162769bec +Block 0016 [ 47]: 2e34537f239786fe +Block 0016 [ 48]: cb19fa94cc202fe2 +Block 0016 [ 49]: 31434f64bee338d2 +Block 0016 [ 50]: ba1eb78fb1b860fe +Block 0016 [ 51]: af72f1fe3ca7be85 +Block 0016 [ 52]: e5707ea32838fa1f +Block 0016 [ 53]: 69370e3f3c439886 +Block 0016 [ 54]: 373aa92fe81eff81 +Block 0016 [ 55]: 4f19d93514ca2f6d +Block 0016 [ 56]: c45314514c999c2c +Block 0016 [ 57]: 48636e71fbb8e2e2 +Block 0016 [ 58]: 6fd04c75f37d7cf5 +Block 0016 [ 59]: 535fffc75b2845af +Block 0016 [ 60]: 116f083a20faf1ea +Block 0016 [ 61]: a6b9cb30c10f4d7d +Block 0016 [ 62]: f65f50637963ed64 +Block 0016 [ 63]: ef45e24b1895a1e0 +Block 0016 [ 64]: 3cf86c8f7c86c83c +Block 0016 [ 65]: 7bb329c554448bc9 +Block 0016 [ 66]: b654af05945ffba9 +Block 0016 [ 67]: 05d3a07ecf3e821b +Block 0016 [ 68]: 2df71ff3f80362a7 +Block 0016 [ 69]: 79127958922bcbb3 +Block 0016 [ 70]: 622d190346b38432 +Block 0016 [ 71]: bf2dc65337296ccd +Block 0016 [ 72]: d6def66a26196560 +Block 0016 [ 73]: 122c98a535332c4d +Block 0016 [ 74]: 3b1169fcbf2e9411 +Block 0016 [ 75]: 9db2f647a52b8fe1 +Block 0016 [ 76]: f37e7eaf346c6c92 +Block 0016 [ 77]: 4aec23b4617cbd25 +Block 0016 [ 78]: 12cc694713dcd514 +Block 0016 [ 79]: 15a22d24f142459b +Block 0016 [ 80]: 8ec4e9db5dd2a88e +Block 0016 [ 81]: a4451dc90a8d2b75 +Block 0016 [ 82]: f92f552a4edc9084 +Block 0016 [ 83]: 233e0e15607eede6 +Block 0016 [ 84]: 3856b3e05a6c9904 +Block 0016 [ 85]: e3f46537f77c0332 +Block 0016 [ 86]: 24bc337ec13085f5 +Block 0016 [ 87]: 8ccdb10b7dd2de17 +Block 0016 [ 88]: 151b7ae5357d3e4b +Block 0016 [ 89]: f19457cb407fe87d +Block 0016 [ 90]: 6ea7efee69876066 +Block 0016 [ 91]: 51bb185a42a9ceb1 +Block 0016 [ 92]: 014c91e31f516f65 +Block 0016 [ 93]: 321202000b51bffd +Block 0016 [ 94]: 0b70e28615347b98 +Block 0016 [ 95]: ea6794917d1a9560 +Block 0016 [ 96]: fdd5631f8f8f3323 +Block 0016 [ 97]: d51704a4a308cfe2 +Block 0016 [ 98]: 65c17ee053a0e313 +Block 0016 [ 99]: 1ecd108d43490cdc +Block 0016 [100]: 8f6b57024c6aa782 +Block 0016 [101]: 161a22a97dbf0ad4 +Block 0016 [102]: 774aff9e1b3f6cdd +Block 0016 [103]: e588f347ad869391 +Block 0016 [104]: 4c2eee9fb6c6c0fc +Block 0016 [105]: 5834b8b51e701a47 +Block 0016 [106]: d4526cbb4d9bf681 +Block 0016 [107]: 0cadec8e56b0c70a +Block 0016 [108]: e1419c694af58241 +Block 0016 [109]: 2b51d757e16bb60b +Block 0016 [110]: a709cc9e3ac3cba5 +Block 0016 [111]: d500ae924ab9d656 +Block 0016 [112]: 4ef55d95efef9c67 +Block 0016 [113]: f4928cc63b92c4f7 +Block 0016 [114]: 201936d80b3bd3c2 +Block 0016 [115]: 367bfa07ca4c2aa8 +Block 0016 [116]: 7dcf97e3f616bfea +Block 0016 [117]: 09a9c5b8fbba724a +Block 0016 [118]: 4be5048497c65e6b +Block 0016 [119]: a38719b4833e8880 +Block 0016 [120]: 6fbb2b72f13bb81e +Block 0016 [121]: c0373061dbe0377e +Block 0016 [122]: 2c963162f790bbd5 +Block 0016 [123]: dfd2bc34bb295f3f +Block 0016 [124]: 4ccef74b9fab3a08 +Block 0016 [125]: d1bdf49c5e2397e5 +Block 0016 [126]: 43fc92247bddea27 +Block 0016 [127]: e3e79824dace601e +Block 0017 [ 0]: f8c0d8dbd83c6a93 +Block 0017 [ 1]: cbd22848e9e04bef +Block 0017 [ 2]: 8df51e47313583dd +Block 0017 [ 3]: 4e8920fa638fb77d +Block 0017 [ 4]: d5eb6e73d621f8ec +Block 0017 [ 5]: 8118af023e35d71c +Block 0017 [ 6]: 23ccdde7874145db +Block 0017 [ 7]: 33fbe77067316647 +Block 0017 [ 8]: 3554a4f1579eb0e1 +Block 0017 [ 9]: 9b783e2c31916c6d +Block 0017 [ 10]: 749b91c44deb5b1d +Block 0017 [ 11]: 8f34a76a9abfde3b +Block 0017 [ 12]: f288d5114f2cdd30 +Block 0017 [ 13]: b0eaa31bf934816a +Block 0017 [ 14]: 45dc0133186af561 +Block 0017 [ 15]: bee61e5d7de2b407 +Block 0017 [ 16]: 9cd877b670a9f7dc +Block 0017 [ 17]: 3d799d42cbcdabd8 +Block 0017 [ 18]: 2adc8fa64b275533 +Block 0017 [ 19]: 5a8555c5a474b462 +Block 0017 [ 20]: 294f076d4ae34d2d +Block 0017 [ 21]: e8765e154b60b76e +Block 0017 [ 22]: fced1cb25770df34 +Block 0017 [ 23]: 3f5eddfa13d36537 +Block 0017 [ 24]: f09d5a7587f1f135 +Block 0017 [ 25]: 94a43ea2088173e4 +Block 0017 [ 26]: f4647c28a56d3def +Block 0017 [ 27]: 8cbca4eb5f78d8fd +Block 0017 [ 28]: 9f24ca461a660dbd +Block 0017 [ 29]: 2f11b3dc4b162b34 +Block 0017 [ 30]: 15be4b6787f72d78 +Block 0017 [ 31]: 689415a8565fc6a3 +Block 0017 [ 32]: ba16470d503687a4 +Block 0017 [ 33]: b05c65f6b504dc3d +Block 0017 [ 34]: 202bc24f335a9aad +Block 0017 [ 35]: 1f93f1c5745c3fa2 +Block 0017 [ 36]: 308f4467e0ef4c7c +Block 0017 [ 37]: 987f2c7f7741543a +Block 0017 [ 38]: 0cb3223416b7e971 +Block 0017 [ 39]: 030c8741b1db2412 +Block 0017 [ 40]: 420d90a459271a6c +Block 0017 [ 41]: a3ee8a93febbd0ce +Block 0017 [ 42]: 8e1a9f2aad5ddf4b +Block 0017 [ 43]: e31ef7e016d6e5d4 +Block 0017 [ 44]: 69817e2130fa7bf9 +Block 0017 [ 45]: 42ecdc96fe63f7f7 +Block 0017 [ 46]: 75f217a3d588f719 +Block 0017 [ 47]: ea1110e25bab55aa +Block 0017 [ 48]: 17d6eee2bfd1fc92 +Block 0017 [ 49]: 770ba296808b3d1f +Block 0017 [ 50]: ebe66bd4b4e209d9 +Block 0017 [ 51]: 2856c4111e42c984 +Block 0017 [ 52]: 4f3a2c8cb161439c +Block 0017 [ 53]: 931c9fab713a4362 +Block 0017 [ 54]: 59bcd09f39ee5245 +Block 0017 [ 55]: 2f72987bc8cb90ac +Block 0017 [ 56]: a94531dc789bf64b +Block 0017 [ 57]: d556a056d5eca922 +Block 0017 [ 58]: 1c8c8e2607265fbf +Block 0017 [ 59]: ce05b759e48d786a +Block 0017 [ 60]: 0cf70e6b71b6b087 +Block 0017 [ 61]: 3905b0f10c5753e5 +Block 0017 [ 62]: 204c0e23f983b729 +Block 0017 [ 63]: eea30fffb591692a +Block 0017 [ 64]: 2092e319f719acf4 +Block 0017 [ 65]: 303114a5662660ae +Block 0017 [ 66]: 0aa60806230aaea5 +Block 0017 [ 67]: 5daaf906c740ef37 +Block 0017 [ 68]: 43174da93c1899bd +Block 0017 [ 69]: 55eefb2ffa06c6d1 +Block 0017 [ 70]: e3f36fdfe0ec5692 +Block 0017 [ 71]: 13c15a1a05e1a107 +Block 0017 [ 72]: e051fabc5e0d43f8 +Block 0017 [ 73]: 7df93f40edd1fa91 +Block 0017 [ 74]: e55805cce70493d0 +Block 0017 [ 75]: 07c1351fd7576c60 +Block 0017 [ 76]: d053915e4a55bba5 +Block 0017 [ 77]: 9b8d03ca70afa1b6 +Block 0017 [ 78]: dc9aa7a607b68164 +Block 0017 [ 79]: ec3abd6f5fcb70f3 +Block 0017 [ 80]: 5fded738f31f9b5f +Block 0017 [ 81]: daadb148ef52da6b +Block 0017 [ 82]: 2931a672df2e5e9c +Block 0017 [ 83]: bddd0d5d7a314df0 +Block 0017 [ 84]: a962d2f797da997f +Block 0017 [ 85]: aaaec1c3a4e7402f +Block 0017 [ 86]: 2a069d415ba940f7 +Block 0017 [ 87]: 5c1915a6dd37a3fb +Block 0017 [ 88]: af295da329360919 +Block 0017 [ 89]: 2704a39402efad8c +Block 0017 [ 90]: 81d3c2b0ea7230d4 +Block 0017 [ 91]: a90a2b8791cf17a2 +Block 0017 [ 92]: 7bca0e2cb4532c12 +Block 0017 [ 93]: 286e51161ff47347 +Block 0017 [ 94]: dce682ef46ce8926 +Block 0017 [ 95]: deaa896bfaf85484 +Block 0017 [ 96]: 84b8dfd1e71d76dd +Block 0017 [ 97]: eefd07b5eab683c0 +Block 0017 [ 98]: 9f3c8e987d506cf9 +Block 0017 [ 99]: 129112d058177710 +Block 0017 [100]: 85c12d6275744ae3 +Block 0017 [101]: 1a32ce9834a94da9 +Block 0017 [102]: 55c47e8dd9e026df +Block 0017 [103]: 5d40e159b07e97a2 +Block 0017 [104]: 834c6bd420bab8fe +Block 0017 [105]: 0a53f14dd39d8ebb +Block 0017 [106]: 48fdb70b92100de9 +Block 0017 [107]: 82dbac2e655058bd +Block 0017 [108]: 59772c79fdc45cc0 +Block 0017 [109]: ee7b3f05d26ed6fc +Block 0017 [110]: 9ad113092d4e2f6c +Block 0017 [111]: f9959f9f69a733d8 +Block 0017 [112]: 4eacd5578cc7b2b9 +Block 0017 [113]: 107381cd15b9f5db +Block 0017 [114]: 62ab4703795a6f01 +Block 0017 [115]: 05e6fc31906fba7a +Block 0017 [116]: 88258c5f311e914a +Block 0017 [117]: 9288c816aa7c111e +Block 0017 [118]: 3624485540cc2cf4 +Block 0017 [119]: 94af9fe90ae22a71 +Block 0017 [120]: 0bcdc699892b3fa7 +Block 0017 [121]: cb5c6c5298ccc4d4 +Block 0017 [122]: 2648f01cf5322a4d +Block 0017 [123]: 6d6e80d62493a5ec +Block 0017 [124]: cb46cc606d710890 +Block 0017 [125]: fa63666adfb0c7d8 +Block 0017 [126]: 9d7a5d6d313966a3 +Block 0017 [127]: 9dca2d40ecf3caf9 +Block 0018 [ 0]: 41d8eba2b27e8ffb +Block 0018 [ 1]: ddff1e14d97eafc5 +Block 0018 [ 2]: d6521ada6762a59a +Block 0018 [ 3]: 75ec7d924ed612fe +Block 0018 [ 4]: a5e33611406ed95e +Block 0018 [ 5]: 23a98ec1e96ae57c +Block 0018 [ 6]: 5f9fd3d229c24c83 +Block 0018 [ 7]: 76fa60f7d8c8998f +Block 0018 [ 8]: 5c030f75c22fcd89 +Block 0018 [ 9]: 534ac5f50eb44fca +Block 0018 [ 10]: a739bd10713b8b97 +Block 0018 [ 11]: 4e6f87176e72e398 +Block 0018 [ 12]: 6e0d2a49f9aa5dc3 +Block 0018 [ 13]: 6cbc16f8383af2c9 +Block 0018 [ 14]: 8f5a5cce393406ad +Block 0018 [ 15]: b7b0df795df78383 +Block 0018 [ 16]: 32ac85c1b3afb835 +Block 0018 [ 17]: 5322dfb0eb9caf98 +Block 0018 [ 18]: 7a1de529f2f636f5 +Block 0018 [ 19]: 5b9ace630dc336df +Block 0018 [ 20]: 29d91addab9bdff3 +Block 0018 [ 21]: 1f84a68592a1862c +Block 0018 [ 22]: a3fc3835fe84d8af +Block 0018 [ 23]: ea35a61b06b43d45 +Block 0018 [ 24]: 5f41f2b0836bfab8 +Block 0018 [ 25]: 769f922caed6e9f0 +Block 0018 [ 26]: 8ef2cc29fbbc35b6 +Block 0018 [ 27]: d1ec004e64b184bd +Block 0018 [ 28]: e30664f43e049be0 +Block 0018 [ 29]: 2ca44a1dc6d8d4a3 +Block 0018 [ 30]: 8f59369926d5e973 +Block 0018 [ 31]: 26399ac675daed1e +Block 0018 [ 32]: c9ecf425a6f8ea3a +Block 0018 [ 33]: b108f214f96adfad +Block 0018 [ 34]: 25fbe09109ed920f +Block 0018 [ 35]: 14c5a9e69e48beeb +Block 0018 [ 36]: 03a28f26f088774e +Block 0018 [ 37]: 242853b73545ab1f +Block 0018 [ 38]: edf3c093f44adc92 +Block 0018 [ 39]: b64b1e909d8ae53e +Block 0018 [ 40]: e6cebbd27a8a1823 +Block 0018 [ 41]: a5f0395142c18539 +Block 0018 [ 42]: e0f5d5665927e888 +Block 0018 [ 43]: 7a683bbac488c694 +Block 0018 [ 44]: 3534c4247936f396 +Block 0018 [ 45]: 20eeb0deffa9b7d8 +Block 0018 [ 46]: 76f68bd31fc40cc3 +Block 0018 [ 47]: 56d5211ed2076486 +Block 0018 [ 48]: 3ae860a16080d1e5 +Block 0018 [ 49]: 9bb9aeaf8ff539de +Block 0018 [ 50]: 92bbd2ed06a94dd6 +Block 0018 [ 51]: b670108883c32507 +Block 0018 [ 52]: 043ac5bc24bd7023 +Block 0018 [ 53]: 9a26fd657901d39b +Block 0018 [ 54]: 001505488513a271 +Block 0018 [ 55]: e0f52e9ee43d5acb +Block 0018 [ 56]: 207c9951a27e8d42 +Block 0018 [ 57]: d1a024de5a287d4d +Block 0018 [ 58]: 7339d8810c9752ad +Block 0018 [ 59]: 50c291efea09790e +Block 0018 [ 60]: 413952cfc7f4d524 +Block 0018 [ 61]: 97a796f4ba686a1e +Block 0018 [ 62]: a5d3b36326136c79 +Block 0018 [ 63]: c83d34934cff9bce +Block 0018 [ 64]: d647ed0ab4f70fb0 +Block 0018 [ 65]: cb3b129980d593c5 +Block 0018 [ 66]: 2daeeb3b7a32c464 +Block 0018 [ 67]: 3d11ca2eaa3129dc +Block 0018 [ 68]: 69918f90199141fc +Block 0018 [ 69]: 4a966b9201c121aa +Block 0018 [ 70]: fcd187be4ddd30ec +Block 0018 [ 71]: a9ffdcf157639d51 +Block 0018 [ 72]: 57c44134d9ede65e +Block 0018 [ 73]: 2969a0b45033e193 +Block 0018 [ 74]: 578504557677f544 +Block 0018 [ 75]: c72f9a3106f1840d +Block 0018 [ 76]: 1817a772dac99295 +Block 0018 [ 77]: a7c3e3c25780f8f1 +Block 0018 [ 78]: 25088cced1cecb19 +Block 0018 [ 79]: fb0f74cfbeb475a7 +Block 0018 [ 80]: 7521f5a566fbc53b +Block 0018 [ 81]: eb43e619fe7627be +Block 0018 [ 82]: bfc0451e97bb2c09 +Block 0018 [ 83]: 2a9a8e551e19412d +Block 0018 [ 84]: 72c355f26e74cdf9 +Block 0018 [ 85]: 812b95f0e42905c3 +Block 0018 [ 86]: e47fbc58e7a23e8e +Block 0018 [ 87]: 8287cfa4dbf6b4f1 +Block 0018 [ 88]: edd351257983dcc7 +Block 0018 [ 89]: 6f2d7e6268c46c70 +Block 0018 [ 90]: 8873e4d627217a6c +Block 0018 [ 91]: dadb6fb73483f950 +Block 0018 [ 92]: 96c0f1f56ef916cf +Block 0018 [ 93]: 8ae137ba396c5b51 +Block 0018 [ 94]: c5623d376dc44ff0 +Block 0018 [ 95]: 468744eec4787edb +Block 0018 [ 96]: 541c9a809d09ad87 +Block 0018 [ 97]: 12c06624677a34c0 +Block 0018 [ 98]: 65a9f78b9721ab68 +Block 0018 [ 99]: c0fce7c5f3c14e4b +Block 0018 [100]: 220ff8d8bc2c9aa8 +Block 0018 [101]: d8b873796ec7c116 +Block 0018 [102]: 0270437041c8097c +Block 0018 [103]: adf5866d0ab4d935 +Block 0018 [104]: bf01ece42754ef4c +Block 0018 [105]: e2c36d1246558b3b +Block 0018 [106]: b65d2e98ef5cd6bf +Block 0018 [107]: 9b93da55732f8f35 +Block 0018 [108]: 0074ddefd19ad665 +Block 0018 [109]: 4a3e02e5f328c4fb +Block 0018 [110]: 9ac2195c1da0dca1 +Block 0018 [111]: 475dcad3d814a6b1 +Block 0018 [112]: 6988288e956f5c14 +Block 0018 [113]: fc836a01bb8ca4a3 +Block 0018 [114]: b8d217fa56dad448 +Block 0018 [115]: 06727706c59a4a6a +Block 0018 [116]: 94cc16f7239d205e +Block 0018 [117]: b9c84c3c7718ea3e +Block 0018 [118]: b2304a46173492bc +Block 0018 [119]: 1c0f38ecb6f1cd07 +Block 0018 [120]: 3722bd0642232c72 +Block 0018 [121]: bc4f0e23d2022839 +Block 0018 [122]: 4cf310c54cfee088 +Block 0018 [123]: dd4dcee5f70e9a6e +Block 0018 [124]: 4c3d4fbd3aa75015 +Block 0018 [125]: 87ba959de0f63169 +Block 0018 [126]: 5c1e8fd799894a1c +Block 0018 [127]: 865447d77e4b2e13 +Block 0019 [ 0]: eabae49e13df33ac +Block 0019 [ 1]: 386269d795a8f899 +Block 0019 [ 2]: 1a1d30373d0c4905 +Block 0019 [ 3]: abbe30aec1ac09dc +Block 0019 [ 4]: f67470f8729cc26b +Block 0019 [ 5]: db68c7d8a44b4d5f +Block 0019 [ 6]: 3d513341faae4e19 +Block 0019 [ 7]: dcf3e0974e76be86 +Block 0019 [ 8]: a3c5a352c9fbf4d0 +Block 0019 [ 9]: e4e34f59a33d54e6 +Block 0019 [ 10]: 81470205f725bc1d +Block 0019 [ 11]: 743bb43a01c90b8f +Block 0019 [ 12]: ac231cbb51f86d7f +Block 0019 [ 13]: 76a54de1db9a2d49 +Block 0019 [ 14]: ce92d6a9fa205255 +Block 0019 [ 15]: be195b17682d7ba3 +Block 0019 [ 16]: fba4f7b8cb7cb499 +Block 0019 [ 17]: d6df894fabf3682f +Block 0019 [ 18]: 8b54ace58eba1262 +Block 0019 [ 19]: 30247e3c460bce00 +Block 0019 [ 20]: f6b7e6b2938e97d4 +Block 0019 [ 21]: 5d68ef5ec31b8518 +Block 0019 [ 22]: 2abcae4d72aeddfe +Block 0019 [ 23]: 57141fa0f14c98a5 +Block 0019 [ 24]: 293cec5f696540ff +Block 0019 [ 25]: b57fd404b2bbc3e6 +Block 0019 [ 26]: 1b1fe64e4d2e5982 +Block 0019 [ 27]: bb7c3161fe94c152 +Block 0019 [ 28]: cdfe146e99217225 +Block 0019 [ 29]: 53b945e98283d4e5 +Block 0019 [ 30]: 07406d1f09e99c7c +Block 0019 [ 31]: 9420f9136e228ce3 +Block 0019 [ 32]: 7bb1709ddccf5482 +Block 0019 [ 33]: 5be06e97ad22b8ec +Block 0019 [ 34]: 8fd822c429336371 +Block 0019 [ 35]: 708ff63d3cdee345 +Block 0019 [ 36]: 3be6b50763010552 +Block 0019 [ 37]: 3b5b31627020868f +Block 0019 [ 38]: ed8e108725e4a36a +Block 0019 [ 39]: c9e00b22f7ee55a0 +Block 0019 [ 40]: ab10cc8e2124e3b0 +Block 0019 [ 41]: 680b39f254c17357 +Block 0019 [ 42]: bb3f25cf9dec09bf +Block 0019 [ 43]: 9cded1b385da5a5c +Block 0019 [ 44]: a8824f4dde37cae2 +Block 0019 [ 45]: 640741dc69e5d6f6 +Block 0019 [ 46]: 3943126660d3ab0b +Block 0019 [ 47]: d035bafd210ac487 +Block 0019 [ 48]: 1329d8bc8de0280a +Block 0019 [ 49]: 294ee403668a24a4 +Block 0019 [ 50]: b9371e440144702d +Block 0019 [ 51]: 4d83f8a6a76e04e5 +Block 0019 [ 52]: f0ecca30f442c18b +Block 0019 [ 53]: 1b05e7da5a2a7708 +Block 0019 [ 54]: 206b24859e3b7817 +Block 0019 [ 55]: 3f48f4fba18a722a +Block 0019 [ 56]: f6b9ea739daec77d +Block 0019 [ 57]: e0646a6e2f3d7888 +Block 0019 [ 58]: b16c17c22375a7d6 +Block 0019 [ 59]: 89fc35a3719b82ed +Block 0019 [ 60]: c1b372d596d55826 +Block 0019 [ 61]: 122c39ffa8304b19 +Block 0019 [ 62]: d59a7a685c911edf +Block 0019 [ 63]: 0d9530abb61832ef +Block 0019 [ 64]: ac58dca00e9fce01 +Block 0019 [ 65]: f5962c53929d8c31 +Block 0019 [ 66]: 0d78b7ff701fe901 +Block 0019 [ 67]: a0f021b918b06bb3 +Block 0019 [ 68]: 9c5d043e9d746ae8 +Block 0019 [ 69]: 3f5e29d072761db1 +Block 0019 [ 70]: c3ee3470217337bf +Block 0019 [ 71]: 4125236e2528aa90 +Block 0019 [ 72]: 40c3a08d6c07650b +Block 0019 [ 73]: 71ad98ff1278387a +Block 0019 [ 74]: ab60b3e13af4a91b +Block 0019 [ 75]: 2014763714f5a399 +Block 0019 [ 76]: 1311f2de0099b0d4 +Block 0019 [ 77]: c740e9ed79e3adcf +Block 0019 [ 78]: fae29a8949a373b2 +Block 0019 [ 79]: 9656ccc5932cf87f +Block 0019 [ 80]: 80e5d6fd6d78ecc7 +Block 0019 [ 81]: 63881ea17dbd6af8 +Block 0019 [ 82]: 27031c2db85a88c9 +Block 0019 [ 83]: 225fcd42ace4217d +Block 0019 [ 84]: 630d473ffe3ea3fa +Block 0019 [ 85]: b930183e630ee15a +Block 0019 [ 86]: 99b0a373d0700de4 +Block 0019 [ 87]: ac67d86ade7a0ff3 +Block 0019 [ 88]: 960346c43a4274b0 +Block 0019 [ 89]: 07bd044bcccec75a +Block 0019 [ 90]: ec1032137ca21709 +Block 0019 [ 91]: 46bf9749f28f7d1a +Block 0019 [ 92]: 9b1c7277bb9d5ab1 +Block 0019 [ 93]: e0c200f2bc1ddb26 +Block 0019 [ 94]: e31376b9283d63ed +Block 0019 [ 95]: 26dfa5fe7517caab +Block 0019 [ 96]: eb6f2eb775379ad0 +Block 0019 [ 97]: ee0f910cf9f8f31a +Block 0019 [ 98]: 06b5103d17d2989d +Block 0019 [ 99]: a9008a2572950c2b +Block 0019 [100]: 62d96078e0e320a6 +Block 0019 [101]: df7bf4070f3a1530 +Block 0019 [102]: 892d3bdbd986be5d +Block 0019 [103]: e64a5e43fb9f6b4a +Block 0019 [104]: 620297da0ccae536 +Block 0019 [105]: ea388ef4cbd46326 +Block 0019 [106]: 70a971c66a94fadc +Block 0019 [107]: 30d6ed877a5d8484 +Block 0019 [108]: 90066a6e95d77f87 +Block 0019 [109]: 46170065f3945fcc +Block 0019 [110]: 5eec3c145bcc73ad +Block 0019 [111]: 9ed9b4503bd9bd18 +Block 0019 [112]: b7b6bdfed4116990 +Block 0019 [113]: 418511a8dda758e3 +Block 0019 [114]: 8e79e8268e4f28b4 +Block 0019 [115]: cd76ba2354acc3f7 +Block 0019 [116]: c2ea82d31473fbad +Block 0019 [117]: 44f19f11aa6c6eec +Block 0019 [118]: 5317b3b060485c0c +Block 0019 [119]: 1a8cf52343a2f35f +Block 0019 [120]: 54245b8759ac29f8 +Block 0019 [121]: 1d446c77f484be94 +Block 0019 [122]: 30b3ce2ea67ccda1 +Block 0019 [123]: 7f86cadfd8d2e406 +Block 0019 [124]: 03a748ad48712800 +Block 0019 [125]: 98e39c608dce89b7 +Block 0019 [126]: 89467383917bcab9 +Block 0019 [127]: 679a4a7f7a32645b +Block 0020 [ 0]: 269b4f54d5b6ea86 +Block 0020 [ 1]: 3e8f0e7bfa7f9b18 +Block 0020 [ 2]: 3c24ba9a51fae5a4 +Block 0020 [ 3]: 710ea18a16c6b046 +Block 0020 [ 4]: 68e94ffbde56ad2f +Block 0020 [ 5]: 86da1a6a88291d99 +Block 0020 [ 6]: 8cfaac3fe27fc668 +Block 0020 [ 7]: eed4b933fab3a449 +Block 0020 [ 8]: f71c3da612229377 +Block 0020 [ 9]: 3368fca33417690e +Block 0020 [ 10]: 0122102ca85016da +Block 0020 [ 11]: 787753a175ccb6e9 +Block 0020 [ 12]: be72a2fb1a353c25 +Block 0020 [ 13]: 04141fca4af1d143 +Block 0020 [ 14]: d5ff0e4f8bf7083b +Block 0020 [ 15]: c9414c9628e8b42a +Block 0020 [ 16]: 2c715fb098bccba6 +Block 0020 [ 17]: 4f503c04dc96c4a7 +Block 0020 [ 18]: 410e1febb9942559 +Block 0020 [ 19]: 1cf639f21af783da +Block 0020 [ 20]: 1c1435c8a6f82db2 +Block 0020 [ 21]: f1cd6ac7f46302f0 +Block 0020 [ 22]: 642393e4685039cd +Block 0020 [ 23]: 337e7cdd34a96b5d +Block 0020 [ 24]: 69d74b6ed0058f4c +Block 0020 [ 25]: 5a7f2ae1c692eaaf +Block 0020 [ 26]: 4492c035073d26af +Block 0020 [ 27]: e8a02ecc89abe328 +Block 0020 [ 28]: 3bc9c8c5dadda071 +Block 0020 [ 29]: cdfb2fcf7e0cd089 +Block 0020 [ 30]: 2e6cae86d961e86a +Block 0020 [ 31]: bb4c8da8c790e028 +Block 0020 [ 32]: ad0eeb7a7acbfb5f +Block 0020 [ 33]: e87a8fb9e2adbb04 +Block 0020 [ 34]: 6321586882426a05 +Block 0020 [ 35]: 74f28496cb02d128 +Block 0020 [ 36]: 1eb5bfd4db4a9a6c +Block 0020 [ 37]: 2ac3a783b8d8270f +Block 0020 [ 38]: a0d668f390021153 +Block 0020 [ 39]: c24108c03011b66d +Block 0020 [ 40]: 051fdb3e3f3aed34 +Block 0020 [ 41]: 484bc346942d1cbc +Block 0020 [ 42]: 9872e0ba4d324643 +Block 0020 [ 43]: 634e78730386b24b +Block 0020 [ 44]: 0d45f77882cac20a +Block 0020 [ 45]: 2563d91cdc8769ee +Block 0020 [ 46]: d15ce3d51e52a2a7 +Block 0020 [ 47]: a2fe0729f7ac8808 +Block 0020 [ 48]: 8e25f4fe2233ece5 +Block 0020 [ 49]: 39ed8579f13d1a19 +Block 0020 [ 50]: dd377af4aea398aa +Block 0020 [ 51]: 7515ba75210832ff +Block 0020 [ 52]: 0575630fd37e1f53 +Block 0020 [ 53]: 6f9912cf58d98dc6 +Block 0020 [ 54]: ef86cc11eb440d76 +Block 0020 [ 55]: ca50b1e8f855acf7 +Block 0020 [ 56]: 893c938d4e382afa +Block 0020 [ 57]: 7ca5580e9832a0bc +Block 0020 [ 58]: b375c7ea7d45fb66 +Block 0020 [ 59]: 836875f69d7226b0 +Block 0020 [ 60]: ffe41d0d91068504 +Block 0020 [ 61]: 989828f2ea37d7e1 +Block 0020 [ 62]: 43dd0fef0eb1ec0b +Block 0020 [ 63]: 77f86256c1d7b23b +Block 0020 [ 64]: 46b433077021cc67 +Block 0020 [ 65]: 7f7e8e5b69c96716 +Block 0020 [ 66]: 4165168edff2204c +Block 0020 [ 67]: 08c41002eed0d2d1 +Block 0020 [ 68]: f1cb8faed68a26f0 +Block 0020 [ 69]: 0065ca90c981a82f +Block 0020 [ 70]: 3ba799f102db0422 +Block 0020 [ 71]: e820f5f562ea5ef4 +Block 0020 [ 72]: 8f43af626790b9f1 +Block 0020 [ 73]: a6a51921588adc5c +Block 0020 [ 74]: cbeb139bd0a91bb2 +Block 0020 [ 75]: d82f0cf77c8e41b7 +Block 0020 [ 76]: 3d06e68f63323b5f +Block 0020 [ 77]: 91b6755b9db0d038 +Block 0020 [ 78]: e8c6f6c0cc63a663 +Block 0020 [ 79]: 7d94ea6a2ee23a2f +Block 0020 [ 80]: c245f840027ccbd2 +Block 0020 [ 81]: 46ff208f126d520d +Block 0020 [ 82]: 01f8167f979679d9 +Block 0020 [ 83]: 2a9d18db600ec858 +Block 0020 [ 84]: 11bbdca37897fcad +Block 0020 [ 85]: 141a41ff68571e1f +Block 0020 [ 86]: 390c617bb94bea7e +Block 0020 [ 87]: 556aa8fed6a96cf1 +Block 0020 [ 88]: fc21092d05f38a09 +Block 0020 [ 89]: e56ef53df73a4f96 +Block 0020 [ 90]: da9cbd854a3cffc9 +Block 0020 [ 91]: 5cf4c3ad805e9f91 +Block 0020 [ 92]: 431bf9648a49612c +Block 0020 [ 93]: 2663d89c48654b6e +Block 0020 [ 94]: e79521d0d32cdf99 +Block 0020 [ 95]: 4f1ceca1c344f7bf +Block 0020 [ 96]: 89330e4f55dbf4fc +Block 0020 [ 97]: f4338c691915e196 +Block 0020 [ 98]: 26b1101246f9bcdc +Block 0020 [ 99]: f8432055e31fc4a8 +Block 0020 [100]: 3266a7a5c4dad24c +Block 0020 [101]: 94c854dd76241f0d +Block 0020 [102]: 99bee1ce63474a15 +Block 0020 [103]: 74bb4aa98d4eb3a1 +Block 0020 [104]: 3cfc2ac312e1c45c +Block 0020 [105]: 6b883da6c5ddc9c4 +Block 0020 [106]: 0743f1fdce6a56ee +Block 0020 [107]: 7c69a5e1a0dcf03e +Block 0020 [108]: fa66426c585f3464 +Block 0020 [109]: 99a8ec507bc26e0d +Block 0020 [110]: 7a28ca634a80f5fe +Block 0020 [111]: 600fba11d691a99c +Block 0020 [112]: d67094eac4f48e31 +Block 0020 [113]: 80376da2f9893c8e +Block 0020 [114]: 8d13887a2e6e16f7 +Block 0020 [115]: 64edf8096260ecec +Block 0020 [116]: 36c2885b38e52b20 +Block 0020 [117]: 459b84990d0598e5 +Block 0020 [118]: 3db3b437866cfec5 +Block 0020 [119]: 294035be518d3bbb +Block 0020 [120]: b9dfc1c086e87c0a +Block 0020 [121]: 510eaff39735d8bc +Block 0020 [122]: ab9ced4efc23c16d +Block 0020 [123]: ed0985c99ce8f77d +Block 0020 [124]: e862b3f058619ddd +Block 0020 [125]: 457d0d4ceca5cb31 +Block 0020 [126]: 1bb73497b80c8610 +Block 0020 [127]: 1156041f667292ff +Block 0021 [ 0]: 17b4c2abe86f2897 +Block 0021 [ 1]: cbb482190938ccd8 +Block 0021 [ 2]: 09e6454421255c7b +Block 0021 [ 3]: 34ea66797350bbf4 +Block 0021 [ 4]: b08b039be403c4fb +Block 0021 [ 5]: c12bb73dac7934ae +Block 0021 [ 6]: 3fd05c8a944dfebc +Block 0021 [ 7]: 7d9e0e6c0c0c1c46 +Block 0021 [ 8]: ca45c30e190203b8 +Block 0021 [ 9]: a50382d342a306f4 +Block 0021 [ 10]: 304f0a3f51cee32a +Block 0021 [ 11]: 9bd7ec4d41224ebc +Block 0021 [ 12]: 3644bd6b37a9c65e +Block 0021 [ 13]: 318da00f1ed8c6e6 +Block 0021 [ 14]: da2d235e81557df5 +Block 0021 [ 15]: b78edb91572aaac6 +Block 0021 [ 16]: 74a9d0e5cb2001bf +Block 0021 [ 17]: d92bf9e32a07b0fc +Block 0021 [ 18]: 52dffb55b33e624a +Block 0021 [ 19]: 490e48183d213f68 +Block 0021 [ 20]: e28ec7a2771feebc +Block 0021 [ 21]: 9fb9637f8be653dc +Block 0021 [ 22]: c99bbc6df1e6c0a7 +Block 0021 [ 23]: ba1e24ed83829bd8 +Block 0021 [ 24]: 8abe8cd81b291831 +Block 0021 [ 25]: a5d3f6aebf6cd859 +Block 0021 [ 26]: 98dda64e3d33c005 +Block 0021 [ 27]: 97be589257c84bf5 +Block 0021 [ 28]: e27a06b1ff130d3a +Block 0021 [ 29]: 6ec7117cea210b36 +Block 0021 [ 30]: 111acd56ac355eba +Block 0021 [ 31]: a8eef71b826e7eab +Block 0021 [ 32]: 4ec68125a7cfb615 +Block 0021 [ 33]: 932bd9ca8390c775 +Block 0021 [ 34]: 51b4107894563221 +Block 0021 [ 35]: 4f9bd56272c5d569 +Block 0021 [ 36]: 1124c4abc2802bd7 +Block 0021 [ 37]: ab9d5b19efca80bc +Block 0021 [ 38]: be9e5035c3d260a1 +Block 0021 [ 39]: 27e7df352e918662 +Block 0021 [ 40]: d18118afc14e3bd3 +Block 0021 [ 41]: 4f1ba18852decdd1 +Block 0021 [ 42]: 7cf79363017d4911 +Block 0021 [ 43]: 17a5cc740117b5a1 +Block 0021 [ 44]: d2477f7f3d5d028b +Block 0021 [ 45]: 4ca5cd043721ebde +Block 0021 [ 46]: fddbb22550b51849 +Block 0021 [ 47]: 97ae58c4799ca750 +Block 0021 [ 48]: 452df8cca9a156bd +Block 0021 [ 49]: fb11d84264de9b30 +Block 0021 [ 50]: fd3b057638165488 +Block 0021 [ 51]: 0d813d621a3366c9 +Block 0021 [ 52]: 4756062fd3bd46f8 +Block 0021 [ 53]: 696bca682db5bb74 +Block 0021 [ 54]: 32d80dfe2be958d3 +Block 0021 [ 55]: 1f6c4037c090c687 +Block 0021 [ 56]: 9139c4d021534fac +Block 0021 [ 57]: 43311d46e08c4c88 +Block 0021 [ 58]: e0f4a375ef393912 +Block 0021 [ 59]: bf1db582f22ffc4f +Block 0021 [ 60]: 0a71ec4c54667179 +Block 0021 [ 61]: 6eb26d0a6f9d40d9 +Block 0021 [ 62]: 022f4fc9d70b674b +Block 0021 [ 63]: 366694b68ac94113 +Block 0021 [ 64]: 87c49c593c614f27 +Block 0021 [ 65]: cb7691ade7b4e3db +Block 0021 [ 66]: 9ab50d350f3b76c5 +Block 0021 [ 67]: 963e8b4ba65faf26 +Block 0021 [ 68]: c8b6caeaadec21b0 +Block 0021 [ 69]: f39f45a19bd109e8 +Block 0021 [ 70]: 2366f4f4cde23673 +Block 0021 [ 71]: 757a9d6c2cac7ca8 +Block 0021 [ 72]: 2096a46aca98ef6f +Block 0021 [ 73]: 5c8928a3be29c46e +Block 0021 [ 74]: a8658d5f9bb9ac48 +Block 0021 [ 75]: a2f678d6c78f2bea +Block 0021 [ 76]: b5ca9f573fd46c28 +Block 0021 [ 77]: 1c4c588ffeaa7304 +Block 0021 [ 78]: 22fe1ea2e21f58dd +Block 0021 [ 79]: 0383af29fc89c577 +Block 0021 [ 80]: 4cd4d3d68dde2827 +Block 0021 [ 81]: d50342ac6da4265c +Block 0021 [ 82]: 4ef2fc0217047481 +Block 0021 [ 83]: 9b4abfcae05f45ec +Block 0021 [ 84]: 65aa951feacbd437 +Block 0021 [ 85]: 86c133b88597ed58 +Block 0021 [ 86]: 3b363bce9f4ee3ec +Block 0021 [ 87]: 7acbee487ed5446b +Block 0021 [ 88]: 942b1703ff00610f +Block 0021 [ 89]: b105c6a5ed4196b5 +Block 0021 [ 90]: d70d811c3f30d240 +Block 0021 [ 91]: 29ddada97ea6101b +Block 0021 [ 92]: 99819a3ffdbd958a +Block 0021 [ 93]: e023fb3f4d4ad3d6 +Block 0021 [ 94]: baab5aef9e588c17 +Block 0021 [ 95]: dce51988a7418b79 +Block 0021 [ 96]: 48fdadbac5a11a65 +Block 0021 [ 97]: 42b7b66efffb8f5e +Block 0021 [ 98]: c7c8f3f6f7bc5d85 +Block 0021 [ 99]: 0a7738cd6a5fad47 +Block 0021 [100]: 8b3a03f8fb566033 +Block 0021 [101]: 49723e452bb29a70 +Block 0021 [102]: 98e32b7a5f4f8471 +Block 0021 [103]: 1696713cf1cfeca5 +Block 0021 [104]: 42c3ba036c3e764f +Block 0021 [105]: 0907d697be28fdbf +Block 0021 [106]: b172dcbf1332c5f6 +Block 0021 [107]: bc90c713f8d177ab +Block 0021 [108]: c74b2b83df4a3fb4 +Block 0021 [109]: 806796945f7970ee +Block 0021 [110]: 50996835394d4221 +Block 0021 [111]: 02476eb09a0a98dc +Block 0021 [112]: 5f9af4ebce5aab37 +Block 0021 [113]: 60c1de13240a58d0 +Block 0021 [114]: 332cb5d422cf7df9 +Block 0021 [115]: 2c210191386ec581 +Block 0021 [116]: a38b29631d4127a4 +Block 0021 [117]: c4b6459d55cfb424 +Block 0021 [118]: a925a87f6510e076 +Block 0021 [119]: 6d39268556f0a2c7 +Block 0021 [120]: 716f35a0f2749fa7 +Block 0021 [121]: aa80e7f9ebf68e6d +Block 0021 [122]: 57ab564f64cd5fac +Block 0021 [123]: 58019bb64c24d659 +Block 0021 [124]: b86acb9911e8e025 +Block 0021 [125]: a8aee8d75e91cc71 +Block 0021 [126]: 6ab7210d4ddcf8b2 +Block 0021 [127]: 4311b77316be2c79 +Block 0022 [ 0]: 61a6ff51085e1dfe +Block 0022 [ 1]: 1f5bf5edca141a25 +Block 0022 [ 2]: 0eb22ca5c3fc8bfd +Block 0022 [ 3]: 096be76c523a2ca8 +Block 0022 [ 4]: e9fe3f7d5ac67faf +Block 0022 [ 5]: 5acadc120ef7884d +Block 0022 [ 6]: ec49fda5c88742b3 +Block 0022 [ 7]: 902b13afbb4107be +Block 0022 [ 8]: 744d2922934d0beb +Block 0022 [ 9]: e6d72c7f5d1c532a +Block 0022 [ 10]: ec6356952d67f6dd +Block 0022 [ 11]: 3d4aa12d18e8352e +Block 0022 [ 12]: ff896a193a375011 +Block 0022 [ 13]: b3b4883dccf68953 +Block 0022 [ 14]: 4a620343cf266a7c +Block 0022 [ 15]: 5404bc64195b1f4f +Block 0022 [ 16]: 69494f69154fcb1d +Block 0022 [ 17]: 947db329bbdb4cd8 +Block 0022 [ 18]: 486a729f03eab8df +Block 0022 [ 19]: 9c570aa48dbdd34b +Block 0022 [ 20]: c71e71a0b0f41441 +Block 0022 [ 21]: d09d043418ee3ecd +Block 0022 [ 22]: 73fe1423a65144c3 +Block 0022 [ 23]: fbd495d2d82df0aa +Block 0022 [ 24]: ed4617c1bc87968c +Block 0022 [ 25]: 5ec6eaf86871340e +Block 0022 [ 26]: 97329b3572e7f3ba +Block 0022 [ 27]: 08fe3a910411f8e8 +Block 0022 [ 28]: d2d92688687f769f +Block 0022 [ 29]: 0572673de37c3623 +Block 0022 [ 30]: 6baeb3fad387399a +Block 0022 [ 31]: 03b6857fbade033b +Block 0022 [ 32]: dec7d2fb4389a1f4 +Block 0022 [ 33]: 62bf9de8caeef073 +Block 0022 [ 34]: 3535db8501d42797 +Block 0022 [ 35]: 426148dffb8b6c6c +Block 0022 [ 36]: cfdbf603331aa1ba +Block 0022 [ 37]: d526ff87d8bbf7d8 +Block 0022 [ 38]: ec27978a3066ffa8 +Block 0022 [ 39]: 07c5d9f1ac3504eb +Block 0022 [ 40]: 03e4290511b51612 +Block 0022 [ 41]: 65709c94ef2664ca +Block 0022 [ 42]: 4c2794cee1ca9dea +Block 0022 [ 43]: b3f53335e16434aa +Block 0022 [ 44]: ce63271edf85caf7 +Block 0022 [ 45]: 459b724ef24ef009 +Block 0022 [ 46]: 1c5e9e9668b3ba6a +Block 0022 [ 47]: 3d76a5f2e85365af +Block 0022 [ 48]: bbff41578ebc089a +Block 0022 [ 49]: 8c3e3d9e30f82118 +Block 0022 [ 50]: 154541c874a970d5 +Block 0022 [ 51]: e28b76c2f1255dfe +Block 0022 [ 52]: 857d0590f8d33c50 +Block 0022 [ 53]: d631fe61e5af784a +Block 0022 [ 54]: 7b45c83168fd3457 +Block 0022 [ 55]: af5e354071395c20 +Block 0022 [ 56]: d6e032527c5e42ae +Block 0022 [ 57]: 209888f062668f8e +Block 0022 [ 58]: b8d138d8fcb57269 +Block 0022 [ 59]: 22a9ab6cc0c1a912 +Block 0022 [ 60]: 704a6260aebf0689 +Block 0022 [ 61]: 65819c67058eeedb +Block 0022 [ 62]: 1156016eaaa2c028 +Block 0022 [ 63]: 07ab5e27a7ee85f1 +Block 0022 [ 64]: ca06f6545486bc04 +Block 0022 [ 65]: 6d5e5e4685da6424 +Block 0022 [ 66]: 2d8b6e05f2e649f4 +Block 0022 [ 67]: e1bb5e3165663da1 +Block 0022 [ 68]: cfae06b12eb26241 +Block 0022 [ 69]: 30368e8c03d0f6cb +Block 0022 [ 70]: ea9e4e5a1a15220b +Block 0022 [ 71]: 0ced69387046c774 +Block 0022 [ 72]: 32bd0f765f6d2e90 +Block 0022 [ 73]: a537a0cf7a48de71 +Block 0022 [ 74]: 40f7ad34f549721d +Block 0022 [ 75]: 16f48f8c860c255c +Block 0022 [ 76]: 9aaddbc5643bf9fd +Block 0022 [ 77]: 4fc5670d938c4060 +Block 0022 [ 78]: d9930f3b78aa29d0 +Block 0022 [ 79]: d4e43d6280ab3b51 +Block 0022 [ 80]: da10e01944beb383 +Block 0022 [ 81]: f08884432d877b53 +Block 0022 [ 82]: ec57f639f4d371b9 +Block 0022 [ 83]: 904a2ea3a5d0307c +Block 0022 [ 84]: 2d49f8d9f9b6dce1 +Block 0022 [ 85]: e6da1ba672b7bcef +Block 0022 [ 86]: b2d22296480d6b8f +Block 0022 [ 87]: f78b659c7b32b534 +Block 0022 [ 88]: be564c07566930fb +Block 0022 [ 89]: 16d4223b5cbadf2f +Block 0022 [ 90]: 06d18d9da6c73ee6 +Block 0022 [ 91]: 3e44dcfd7da27d18 +Block 0022 [ 92]: 217bc24e2bae57f7 +Block 0022 [ 93]: 49a8a3f1152c7037 +Block 0022 [ 94]: b63c0c5729d5261b +Block 0022 [ 95]: 317ad8dec554eb1e +Block 0022 [ 96]: 1cd40e3803488528 +Block 0022 [ 97]: e93ffc3a78bedcb7 +Block 0022 [ 98]: f28c842c550d2ab1 +Block 0022 [ 99]: 4d311be4c8a29098 +Block 0022 [100]: 9c5cf9159c8eb3fc +Block 0022 [101]: 1e58e5b4bb1b28a9 +Block 0022 [102]: 27337340376d8e81 +Block 0022 [103]: 6ced8f7b00504dc5 +Block 0022 [104]: c3e20cdbe90d1d09 +Block 0022 [105]: fa4436423628b433 +Block 0022 [106]: 5574d238558a591e +Block 0022 [107]: ebddbd36bdb1415b +Block 0022 [108]: df5cda5812a18e7c +Block 0022 [109]: 9f9aade1bb756c3a +Block 0022 [110]: 33d27b3747e16282 +Block 0022 [111]: ffb19eeed77e0f70 +Block 0022 [112]: 7e06ba7933616246 +Block 0022 [113]: 94b313c4b145defb +Block 0022 [114]: 8df180f62502dd74 +Block 0022 [115]: 5181f971e6917593 +Block 0022 [116]: 16c113e1c1b916a7 +Block 0022 [117]: 915bfbe0cea5c438 +Block 0022 [118]: 9195ba860ffd4924 +Block 0022 [119]: 084b15c7884b460b +Block 0022 [120]: b85902697f1fbf9d +Block 0022 [121]: b9a66a8ac079ab07 +Block 0022 [122]: 5a715fed9ba3ebf2 +Block 0022 [123]: 42ce627af9462ed0 +Block 0022 [124]: e49799409e744ba0 +Block 0022 [125]: 9f54148151c32bae +Block 0022 [126]: 6532db4062d5cae5 +Block 0022 [127]: 1c6ae63866aca622 +Block 0023 [ 0]: 71b6b6aca18b78a6 +Block 0023 [ 1]: 00ba35d5c7a24fe8 +Block 0023 [ 2]: 23b225256d68661e +Block 0023 [ 3]: 49648a8cac7875c8 +Block 0023 [ 4]: 052e7d601ff9c1f8 +Block 0023 [ 5]: 7fba093144801e1f +Block 0023 [ 6]: 7927b854cfd88de7 +Block 0023 [ 7]: a11ea2bc81caf36b +Block 0023 [ 8]: b7e7ae76ae03126d +Block 0023 [ 9]: 60d0807e48e5db71 +Block 0023 [ 10]: ddf1d2beef8a2dee +Block 0023 [ 11]: b9924481df9d2cd3 +Block 0023 [ 12]: d0b26e2edeadd78e +Block 0023 [ 13]: 6913abfc0351b6b4 +Block 0023 [ 14]: cad416dcaf5dd5fb +Block 0023 [ 15]: a43f1deada1a802b +Block 0023 [ 16]: 2150535e28518ddc +Block 0023 [ 17]: 9ab467acbf91fd64 +Block 0023 [ 18]: 9afb5ba8ebaa158b +Block 0023 [ 19]: 743713b59576c89f +Block 0023 [ 20]: 40a9b9dfd096ed85 +Block 0023 [ 21]: b0563463bb53de6e +Block 0023 [ 22]: a2a02b23689dca10 +Block 0023 [ 23]: 7fabf80d6e78eed6 +Block 0023 [ 24]: 0fa6d2177a605bc0 +Block 0023 [ 25]: ed6766d412cf1e54 +Block 0023 [ 26]: bb0480e3b472ba6b +Block 0023 [ 27]: da084b05e5454f0f +Block 0023 [ 28]: 83a895c52c11834f +Block 0023 [ 29]: 07a7edef2841be43 +Block 0023 [ 30]: d612d8cee619b42d +Block 0023 [ 31]: d9b8fe0ca5898f99 +Block 0023 [ 32]: 70f2724814542a4a +Block 0023 [ 33]: 5920b6bc3b6b3caa +Block 0023 [ 34]: 144b26a1e650a6d4 +Block 0023 [ 35]: d91a86c85aa62ca4 +Block 0023 [ 36]: 8d99b9be60c56aec +Block 0023 [ 37]: 227e477f539aeb59 +Block 0023 [ 38]: d364dd616cc3b90f +Block 0023 [ 39]: 38f9643fb6637388 +Block 0023 [ 40]: 1d394841225a0066 +Block 0023 [ 41]: ec35e6b57868aa4f +Block 0023 [ 42]: 8ff8e59354814fa3 +Block 0023 [ 43]: 75d87416cd0225db +Block 0023 [ 44]: f16a8d875e127f26 +Block 0023 [ 45]: e92a4d13dc6b4d72 +Block 0023 [ 46]: a8ad1696cea7b54a +Block 0023 [ 47]: 8b3f716ce03aa77f +Block 0023 [ 48]: f6e70eb1fb494101 +Block 0023 [ 49]: 58e27c7dc8a70aa5 +Block 0023 [ 50]: 493f01c81a9b6b27 +Block 0023 [ 51]: 023efca7911d5bc7 +Block 0023 [ 52]: e33e448c98a97f10 +Block 0023 [ 53]: b0261944d98e2c31 +Block 0023 [ 54]: 9593200f81e7972f +Block 0023 [ 55]: 4f66e5a211c0ebce +Block 0023 [ 56]: 54ba34f05b2d3546 +Block 0023 [ 57]: dfd889d802536436 +Block 0023 [ 58]: 9abd4e9759d11d54 +Block 0023 [ 59]: b4752150d4f62535 +Block 0023 [ 60]: f1e9f64b7b3b60df +Block 0023 [ 61]: 81d184500bfa18c6 +Block 0023 [ 62]: bcd72f47ef6b9fe0 +Block 0023 [ 63]: 140c4f355bc6b553 +Block 0023 [ 64]: 8d4f7f8418330c7c +Block 0023 [ 65]: 6e3afc414724d608 +Block 0023 [ 66]: bc267a035071bc1a +Block 0023 [ 67]: 156fae6c712c065b +Block 0023 [ 68]: f9c57277382a1f89 +Block 0023 [ 69]: 0299652c21ba7eae +Block 0023 [ 70]: 3cb2859906a40ced +Block 0023 [ 71]: 53f71c9235df76b5 +Block 0023 [ 72]: 2df91f772efc52c4 +Block 0023 [ 73]: c796cad57787e135 +Block 0023 [ 74]: 9f578feb31fd77d6 +Block 0023 [ 75]: c09bd264239bc205 +Block 0023 [ 76]: cb44da110cb5b368 +Block 0023 [ 77]: 3bff59dfcccb50a4 +Block 0023 [ 78]: 0ab31a2ef1b93b29 +Block 0023 [ 79]: aa27612628dc4b4f +Block 0023 [ 80]: 641a26e82e94dd36 +Block 0023 [ 81]: 7e078b59d2827af7 +Block 0023 [ 82]: 3b5010c0fffb9674 +Block 0023 [ 83]: 7a7cfbcf82144d03 +Block 0023 [ 84]: e1f531fe11ae9627 +Block 0023 [ 85]: 4ee64eb4df28757a +Block 0023 [ 86]: ed0f36bcc988bd97 +Block 0023 [ 87]: 60dc8c5ae0338b1d +Block 0023 [ 88]: 5c4371dc7476482c +Block 0023 [ 89]: 2e1477181780fb98 +Block 0023 [ 90]: 33032e2d91f913af +Block 0023 [ 91]: 73ae22f0311ba5d8 +Block 0023 [ 92]: 83d30b9409e6b567 +Block 0023 [ 93]: a22134803a423a9a +Block 0023 [ 94]: 2546765a58acab4a +Block 0023 [ 95]: 45140ea710d5b1eb +Block 0023 [ 96]: 3fefc60626708193 +Block 0023 [ 97]: c49989661e0967cc +Block 0023 [ 98]: 956cb9090041edf0 +Block 0023 [ 99]: 85ce994e449272b1 +Block 0023 [100]: 77cbb274fd8546a3 +Block 0023 [101]: 820222b05ac04e86 +Block 0023 [102]: 9de2fb4747dd05cc +Block 0023 [103]: e47f6957d7bd52b5 +Block 0023 [104]: 453b5ebf33f91b87 +Block 0023 [105]: 666fd007ad7896f9 +Block 0023 [106]: 2786f30e5c14a822 +Block 0023 [107]: 161a849e41872871 +Block 0023 [108]: 79b0cfded556359e +Block 0023 [109]: 7c2f3eda92ba20d3 +Block 0023 [110]: 1440b52c7e60d1f8 +Block 0023 [111]: dc8134fc1139d38d +Block 0023 [112]: 99f47f609a2842c6 +Block 0023 [113]: cf71b12956787955 +Block 0023 [114]: 923f3c21d2b602eb +Block 0023 [115]: ef0eb85a0f0044d0 +Block 0023 [116]: d2d7cd413a3734a7 +Block 0023 [117]: 52c792c0299769ef +Block 0023 [118]: 87cfe0b332479275 +Block 0023 [119]: 09ae791666a1e1d7 +Block 0023 [120]: 5c6fe74964c18a98 +Block 0023 [121]: 65fc39dad202ef2a +Block 0023 [122]: d238f7673a7fc116 +Block 0023 [123]: 2c59c0ee6153643b +Block 0023 [124]: c808636d1c65d472 +Block 0023 [125]: 519346986007bb4e +Block 0023 [126]: 927c3fa1ea477d77 +Block 0023 [127]: 37c224071d594e0d +Block 0024 [ 0]: 9956a13b1b49a85e +Block 0024 [ 1]: eb4f6e16f84345b4 +Block 0024 [ 2]: 34f6ca61e8c33636 +Block 0024 [ 3]: 6619df465c5f5c38 +Block 0024 [ 4]: 26bee849a293cd26 +Block 0024 [ 5]: d935f8ce2a13010a +Block 0024 [ 6]: 520924f2c511c492 +Block 0024 [ 7]: 05c9abfd72f2ca8a +Block 0024 [ 8]: 734bd3d20a147017 +Block 0024 [ 9]: 680c0da85f1852db +Block 0024 [ 10]: 113faf1a430babd9 +Block 0024 [ 11]: 15e983b8123560c2 +Block 0024 [ 12]: bf5688b1cd7981a7 +Block 0024 [ 13]: 5db814aafe1ed2bf +Block 0024 [ 14]: 14cd28c8b2cf7803 +Block 0024 [ 15]: dcc18e8bd28e55d5 +Block 0024 [ 16]: 46e43400f0591055 +Block 0024 [ 17]: 2841dc8cb0d8cf95 +Block 0024 [ 18]: 58158a74bb3c194c +Block 0024 [ 19]: d0306f7ad12acb75 +Block 0024 [ 20]: 8dd0ccd0618c6944 +Block 0024 [ 21]: e292b0011d5d135d +Block 0024 [ 22]: c5ec0e7363dfb996 +Block 0024 [ 23]: 76d0e59bae0dcaa6 +Block 0024 [ 24]: b3582ae0d8f07720 +Block 0024 [ 25]: f08264f0e63f22ec +Block 0024 [ 26]: e5e831ae374d05d5 +Block 0024 [ 27]: 5a2e612598c01d0d +Block 0024 [ 28]: 3fba5724c4b5b898 +Block 0024 [ 29]: e833e8d79e08d5b7 +Block 0024 [ 30]: f427b869f5c1f3fc +Block 0024 [ 31]: 4b7d2b43fedf05de +Block 0024 [ 32]: a5e8d8d68f802ecd +Block 0024 [ 33]: 005f86378c842d77 +Block 0024 [ 34]: a4110ab6ae4dbdb4 +Block 0024 [ 35]: 0ad3d04b3a846de7 +Block 0024 [ 36]: 66f3472239cf48fa +Block 0024 [ 37]: 225ee0eb863c5474 +Block 0024 [ 38]: 7464f3987d5d780e +Block 0024 [ 39]: f02a6163175bdcc8 +Block 0024 [ 40]: 06e837a1ac826f07 +Block 0024 [ 41]: 63759540df7a5a2a +Block 0024 [ 42]: d804b31c5f48feda +Block 0024 [ 43]: 15390632d3e458c6 +Block 0024 [ 44]: 83c4211a657fa871 +Block 0024 [ 45]: e5b2232c95dbca6f +Block 0024 [ 46]: 3e99d6d6151e5169 +Block 0024 [ 47]: 80d9d65d4a9fc135 +Block 0024 [ 48]: 81ef675d5a8d33d7 +Block 0024 [ 49]: d791ecaf1a8c00b8 +Block 0024 [ 50]: 6d237b0014b9f4f3 +Block 0024 [ 51]: e2e8796d6cc66289 +Block 0024 [ 52]: d8f6d1f343c2aaaa +Block 0024 [ 53]: 7385abc47311c98d +Block 0024 [ 54]: ca72576fbe6eaea2 +Block 0024 [ 55]: 2d5f7c84c051a65a +Block 0024 [ 56]: a752e21c12698852 +Block 0024 [ 57]: f781ab22ef0001df +Block 0024 [ 58]: a5c09dfb70ee58d5 +Block 0024 [ 59]: b861372d101ff470 +Block 0024 [ 60]: 5da08c8421df97ab +Block 0024 [ 61]: 76c2459521edf83a +Block 0024 [ 62]: 7ea6c0dbac13c4e4 +Block 0024 [ 63]: 8f669c059c89658f +Block 0024 [ 64]: 901e1cb70e5bdada +Block 0024 [ 65]: 595e1291e3cbab62 +Block 0024 [ 66]: 4201eaf65a5494b4 +Block 0024 [ 67]: 6bfdb634efea5e73 +Block 0024 [ 68]: d4cce6cfd93349c7 +Block 0024 [ 69]: 3f3bf90f1ccf7d43 +Block 0024 [ 70]: d57d37b02100a068 +Block 0024 [ 71]: ec9a67f508dd0a5b +Block 0024 [ 72]: f353c388db97240a +Block 0024 [ 73]: b54d96369fd7e18f +Block 0024 [ 74]: 7cf8073613299bc6 +Block 0024 [ 75]: d34b71de098a5c34 +Block 0024 [ 76]: 8896dc90580c9acb +Block 0024 [ 77]: f3d2e7edc21e6d17 +Block 0024 [ 78]: 0aa32dff469c42f4 +Block 0024 [ 79]: d84d6bd84a3f5704 +Block 0024 [ 80]: 592d29696aa1611b +Block 0024 [ 81]: 4c769b1a91910e3c +Block 0024 [ 82]: d9181ac139052fa7 +Block 0024 [ 83]: 7bf07944f4e78370 +Block 0024 [ 84]: a13c3bb0f9367b49 +Block 0024 [ 85]: 3c4bf4c3b33b4414 +Block 0024 [ 86]: 9408f64ba6cbb2af +Block 0024 [ 87]: 9e572c0ab8a66682 +Block 0024 [ 88]: 05146fe0279cc63a +Block 0024 [ 89]: 392e3a7f2ff4c0af +Block 0024 [ 90]: 6cb1b4abc10f26a8 +Block 0024 [ 91]: a97380cef9f9c1d7 +Block 0024 [ 92]: a39611d6f966761d +Block 0024 [ 93]: a1be82dfbebdc6f6 +Block 0024 [ 94]: ab962e96f1066c7d +Block 0024 [ 95]: 427b91b8b9a1f976 +Block 0024 [ 96]: 3c6fb8f326956c60 +Block 0024 [ 97]: 52263ae65140b3c5 +Block 0024 [ 98]: 4b21f82c2026b56d +Block 0024 [ 99]: 9b6689849e05f482 +Block 0024 [100]: 1898c9348c12d11a +Block 0024 [101]: 95da7290a7784974 +Block 0024 [102]: 0f025fba1a081ef6 +Block 0024 [103]: d2212444055affa3 +Block 0024 [104]: 3d0b9a0e26ba4c60 +Block 0024 [105]: a96f202adbb1dcc0 +Block 0024 [106]: 5f2d801ffbe742a8 +Block 0024 [107]: 398b83e5c3b82ec6 +Block 0024 [108]: 9bb98a30513045e0 +Block 0024 [109]: 9e49507f75e0e273 +Block 0024 [110]: b6167732adb9ace3 +Block 0024 [111]: 14c51dd25c3b0711 +Block 0024 [112]: d23719bfb63c813f +Block 0024 [113]: 466f1d49562849ea +Block 0024 [114]: 5f65af04730f1d3d +Block 0024 [115]: 4ae36efe0c348731 +Block 0024 [116]: 3b1cf728f294dcc1 +Block 0024 [117]: 8afc9d93b01daac7 +Block 0024 [118]: fb5387bac10ba1fe +Block 0024 [119]: 5600926e4360daf7 +Block 0024 [120]: 910a656b9b23d68b +Block 0024 [121]: 400469d9842f7c37 +Block 0024 [122]: ae81a2f8022e7b9a +Block 0024 [123]: 55124c8da08f7aab +Block 0024 [124]: d792973dc799ad1a +Block 0024 [125]: 46a5fbef3053ef4d +Block 0024 [126]: 54dd3ef21014e501 +Block 0024 [127]: 874e921013f3b13d +Block 0025 [ 0]: f40ac8f5845def30 +Block 0025 [ 1]: 1f4296441bbd6779 +Block 0025 [ 2]: 65f2730864a5a27c +Block 0025 [ 3]: 41cee44733d6a4eb +Block 0025 [ 4]: 37972b4e9c1337f0 +Block 0025 [ 5]: 0da94ac748ecfccc +Block 0025 [ 6]: d00ec56bd42ab356 +Block 0025 [ 7]: 9995be2379853fce +Block 0025 [ 8]: 5e133846cb0874c8 +Block 0025 [ 9]: d6aa81a7f7fe4116 +Block 0025 [ 10]: 5c23e4d73838297b +Block 0025 [ 11]: de4046378b228598 +Block 0025 [ 12]: 82033a1812a810b7 +Block 0025 [ 13]: 36d19a02b1197e62 +Block 0025 [ 14]: 27847cf3eb8fed8c +Block 0025 [ 15]: ca441892fd7a3298 +Block 0025 [ 16]: e7d1ee4610813059 +Block 0025 [ 17]: e95b1311a07e4d59 +Block 0025 [ 18]: 9a74bbad3499e48b +Block 0025 [ 19]: 3fa0ce3260f1c2a2 +Block 0025 [ 20]: 2c02959f4e1baf3c +Block 0025 [ 21]: c681e7d24a07ed41 +Block 0025 [ 22]: 865fde98d28f65c6 +Block 0025 [ 23]: cd7ecc6a328adea8 +Block 0025 [ 24]: 7a84b37001af50da +Block 0025 [ 25]: 49e511ec6f403431 +Block 0025 [ 26]: 5a69a0ddbf783485 +Block 0025 [ 27]: 578f49f8c13f2d16 +Block 0025 [ 28]: 5695e8d9cb8d4a0d +Block 0025 [ 29]: 85a7a121175fc91b +Block 0025 [ 30]: e437059a8c03b9e2 +Block 0025 [ 31]: bab846561467bc3e +Block 0025 [ 32]: c281376ed6bc4f21 +Block 0025 [ 33]: 7cd34007c72e99a7 +Block 0025 [ 34]: 969adb28d883462c +Block 0025 [ 35]: 71763c3e19cfd5b7 +Block 0025 [ 36]: 8388042bbb291add +Block 0025 [ 37]: a29b5a461d706d9a +Block 0025 [ 38]: b4f60478fad36637 +Block 0025 [ 39]: 260fd795fa3fac08 +Block 0025 [ 40]: 73c8ef82f97dacec +Block 0025 [ 41]: d26b5e8add1ec2ac +Block 0025 [ 42]: 3d6f281924c49974 +Block 0025 [ 43]: 99a45ea9a1da887a +Block 0025 [ 44]: 1eb184eb695585c8 +Block 0025 [ 45]: 510c194fb94a8610 +Block 0025 [ 46]: acc7ebcd8b3819d9 +Block 0025 [ 47]: 4fe39efc1efe8096 +Block 0025 [ 48]: 1066a79624bc93b7 +Block 0025 [ 49]: a6d83c9fbbcde211 +Block 0025 [ 50]: a0078f9f08d55000 +Block 0025 [ 51]: 3a51a4ad52307cfd +Block 0025 [ 52]: 7650dc6bf608bb68 +Block 0025 [ 53]: 6bf46dd79e2e379f +Block 0025 [ 54]: b3c98c3f49ebdea6 +Block 0025 [ 55]: 4634c08aff58b2cb +Block 0025 [ 56]: 66b7637206c1241d +Block 0025 [ 57]: 97c04418a19c7a10 +Block 0025 [ 58]: 572a0c8d5e97bc3d +Block 0025 [ 59]: 2c0c4bcc9a8b913f +Block 0025 [ 60]: 2d42eb8a5c89595e +Block 0025 [ 61]: a490f7f31b5a32f2 +Block 0025 [ 62]: 3456ab2f7b9f5153 +Block 0025 [ 63]: a90cf3f0015e90e3 +Block 0025 [ 64]: 4081d7690d2b09f4 +Block 0025 [ 65]: 8170b2e0f6724b15 +Block 0025 [ 66]: bfa2c86fcf51d13d +Block 0025 [ 67]: cf4026c87fc36b50 +Block 0025 [ 68]: a19eeb309e0ed951 +Block 0025 [ 69]: 94968a68e780bb82 +Block 0025 [ 70]: fd06b14cb0e244d3 +Block 0025 [ 71]: 1a5df1d3bd1da7bd +Block 0025 [ 72]: cf92c12d5501b592 +Block 0025 [ 73]: 33dfcade68dcf782 +Block 0025 [ 74]: 3c34c8de434cd8a0 +Block 0025 [ 75]: 583fd5fa9cdc334b +Block 0025 [ 76]: a561a5771600760d +Block 0025 [ 77]: 5bfff03f2074662c +Block 0025 [ 78]: 9a3cab09c49296a2 +Block 0025 [ 79]: c56e377afb6b9ac7 +Block 0025 [ 80]: 98e2570ecb9f0e9a +Block 0025 [ 81]: cc934d5b70c73d3e +Block 0025 [ 82]: e69d1e00bb93731e +Block 0025 [ 83]: 8fc0c795dc74ebb9 +Block 0025 [ 84]: 220b46e546584007 +Block 0025 [ 85]: c74519effd86d175 +Block 0025 [ 86]: 5ab87fef552bc8e3 +Block 0025 [ 87]: cc959be70d739717 +Block 0025 [ 88]: 17f1b7bc5d39f702 +Block 0025 [ 89]: 762ebc3e921b84ee +Block 0025 [ 90]: 888a1d4dc4c3380f +Block 0025 [ 91]: db8f9235f7204500 +Block 0025 [ 92]: 503d9ddadb99fd67 +Block 0025 [ 93]: 62409e9cde17fe73 +Block 0025 [ 94]: e9ca642a2880194a +Block 0025 [ 95]: 6f4c703d8fd584f9 +Block 0025 [ 96]: b10fc66cf1416e64 +Block 0025 [ 97]: 91e9eba3834f82e9 +Block 0025 [ 98]: 20ab216a2cc0113a +Block 0025 [ 99]: bd621abe0b12ccb8 +Block 0025 [100]: 0c1c7cd2b30bfd1c +Block 0025 [101]: 200b79e1e90ee82b +Block 0025 [102]: 6a6287dc3b913eff +Block 0025 [103]: fc0b87e1ad118bc3 +Block 0025 [104]: 9a6b87099c4706ed +Block 0025 [105]: 373fabb9b76bf6ed +Block 0025 [106]: 536e17be7870998e +Block 0025 [107]: 2c18f19b85c54d1c +Block 0025 [108]: 5169df225240c0be +Block 0025 [109]: e653baf950d6b0b5 +Block 0025 [110]: 3d7977cb7e63fa91 +Block 0025 [111]: b3ffcdd7e3d15e58 +Block 0025 [112]: 00d16dcf47a61b68 +Block 0025 [113]: 8d1c4f35e4354ea8 +Block 0025 [114]: 5b7920f6270c732e +Block 0025 [115]: 6da654051829a7f3 +Block 0025 [116]: fc7ec3060f200354 +Block 0025 [117]: 7bc527041bc699aa +Block 0025 [118]: 36e804a3bce47567 +Block 0025 [119]: 5078a05b3689ccb0 +Block 0025 [120]: cd36db69ab1452d0 +Block 0025 [121]: 2ffbb1267bda416f +Block 0025 [122]: 5afe4953b0b8abec +Block 0025 [123]: 62e953030ae41e09 +Block 0025 [124]: 59c2d3acda8e7210 +Block 0025 [125]: b3148cae31588dda +Block 0025 [126]: 7d3d2d2a62e66584 +Block 0025 [127]: 7d1bc1dd3f23304f +Block 0026 [ 0]: aa12cd00fc19aa98 +Block 0026 [ 1]: 4baa3e2f0d2d9965 +Block 0026 [ 2]: cccc9d36f2b22bd7 +Block 0026 [ 3]: 66262feec7d5ca74 +Block 0026 [ 4]: 5ca622cdf216866e +Block 0026 [ 5]: 30811834a878128e +Block 0026 [ 6]: 1831ac788a613c33 +Block 0026 [ 7]: 7c5431da91e89887 +Block 0026 [ 8]: 002b8a6bfcca3171 +Block 0026 [ 9]: 563ea3cefeb34181 +Block 0026 [ 10]: 27b5d3695d8acea2 +Block 0026 [ 11]: bfefe32924482e29 +Block 0026 [ 12]: dbb1691432b6f222 +Block 0026 [ 13]: 5cdd96afe1e34f32 +Block 0026 [ 14]: 6d7e8399851e95f4 +Block 0026 [ 15]: 43294203e112bcb9 +Block 0026 [ 16]: 8337ce689d3e9caa +Block 0026 [ 17]: 7c26a7ef08e470d7 +Block 0026 [ 18]: 759a31d3fa1e8236 +Block 0026 [ 19]: 2149cc4365689b19 +Block 0026 [ 20]: 3b6bb146c1904fce +Block 0026 [ 21]: c3f0fa1dd9bbd53d +Block 0026 [ 22]: 337b92787d57be4c +Block 0026 [ 23]: 5402836eede6ed17 +Block 0026 [ 24]: 7c297b0511fc2afe +Block 0026 [ 25]: 30cc08a100c263a4 +Block 0026 [ 26]: 3be7c204b7169815 +Block 0026 [ 27]: e506d93b81a75733 +Block 0026 [ 28]: 1a36cf3c96c7000a +Block 0026 [ 29]: abf78cb4e62a9c9d +Block 0026 [ 30]: bfe1d6bc3d4ad847 +Block 0026 [ 31]: a9b8d174fb0a5b58 +Block 0026 [ 32]: 7c01f62ac035bfb3 +Block 0026 [ 33]: 792b16e8761a2231 +Block 0026 [ 34]: e33ae23d15dd49ff +Block 0026 [ 35]: 81e01c580bb42aa4 +Block 0026 [ 36]: 0b7854b34b42b26e +Block 0026 [ 37]: e5f3890795c8fd3f +Block 0026 [ 38]: 1d32f3cd092c011d +Block 0026 [ 39]: bb846e08144af8c9 +Block 0026 [ 40]: 529c328a0fd6be1c +Block 0026 [ 41]: 1838e4cc3b1e1bee +Block 0026 [ 42]: 0f8daadca7ece815 +Block 0026 [ 43]: e6744a102f363ba5 +Block 0026 [ 44]: ec0180f97f8dc01a +Block 0026 [ 45]: b7875db887d8fa98 +Block 0026 [ 46]: 0e14703884e20016 +Block 0026 [ 47]: 51e7d6f8f33eb75e +Block 0026 [ 48]: e4996dbaa2737503 +Block 0026 [ 49]: cadb50fe0ae56e79 +Block 0026 [ 50]: 572aa6d3ed950c8e +Block 0026 [ 51]: 9b8c0a7a8dbc04d3 +Block 0026 [ 52]: 6059cb549441ca18 +Block 0026 [ 53]: 9500848c02cd176a +Block 0026 [ 54]: 5db9764a7ced5cdb +Block 0026 [ 55]: 325d4e51b05d23fb +Block 0026 [ 56]: f9884df02768f572 +Block 0026 [ 57]: 0aa40c7b5503989e +Block 0026 [ 58]: d817a371209c118b +Block 0026 [ 59]: e22bf07992f26ca9 +Block 0026 [ 60]: 690d3e6005735450 +Block 0026 [ 61]: 0070329e2156498a +Block 0026 [ 62]: 04f5e9b53490b84c +Block 0026 [ 63]: dc854d01c6d9638d +Block 0026 [ 64]: e3fc2193160c9c54 +Block 0026 [ 65]: 1d8550c266bb484b +Block 0026 [ 66]: b42ad34afd366dbb +Block 0026 [ 67]: 9744998468bc6ac9 +Block 0026 [ 68]: 3a5f729463a09383 +Block 0026 [ 69]: eca7bd87f12a5180 +Block 0026 [ 70]: 6122ed0517cc3b62 +Block 0026 [ 71]: cc72077761614624 +Block 0026 [ 72]: d88a25deabb1eea7 +Block 0026 [ 73]: 1028ffb6d1792abe +Block 0026 [ 74]: 92d03b7f00202965 +Block 0026 [ 75]: 02214bddf45887be +Block 0026 [ 76]: 946fa7bd3f16134e +Block 0026 [ 77]: 3bb05c80eb7b9e13 +Block 0026 [ 78]: 3fa6da973455eef9 +Block 0026 [ 79]: 77fd6d705dc5eae9 +Block 0026 [ 80]: 590461cd09e0b05c +Block 0026 [ 81]: a41d33a709dac06d +Block 0026 [ 82]: f51cc50323f5dd76 +Block 0026 [ 83]: 691aedf3966aec4c +Block 0026 [ 84]: 28128ef432e02aa2 +Block 0026 [ 85]: 197d1d0322f6b647 +Block 0026 [ 86]: c455c6c29400221b +Block 0026 [ 87]: 9fd4cd9eda0a1ef4 +Block 0026 [ 88]: a52e7e396e31ea48 +Block 0026 [ 89]: 10e4dfc62a716c6d +Block 0026 [ 90]: 1cea0672ccab61ba +Block 0026 [ 91]: 083c605e2d85fb34 +Block 0026 [ 92]: 369d098dde8ae9e0 +Block 0026 [ 93]: aad473e6d8dd7bd5 +Block 0026 [ 94]: b96bc5b048b796af +Block 0026 [ 95]: 11ed0ca89be26340 +Block 0026 [ 96]: 1599fc597339eb3a +Block 0026 [ 97]: 468fae3ebe64843b +Block 0026 [ 98]: efcc60fa3d14c8ee +Block 0026 [ 99]: 65a32ce3a18bdcf3 +Block 0026 [100]: af9208773e96aab2 +Block 0026 [101]: 8e1af05387165864 +Block 0026 [102]: 5ddff1b588aa14c9 +Block 0026 [103]: f8639e1aba07adda +Block 0026 [104]: e5395cd2d12320aa +Block 0026 [105]: 7759c07513d7f662 +Block 0026 [106]: 48377f83e29b778d +Block 0026 [107]: 19e70cfcfc8c2607 +Block 0026 [108]: 886bac7d24ca1f81 +Block 0026 [109]: e4e3f70544723cf7 +Block 0026 [110]: 6ca3eb985bb1ec17 +Block 0026 [111]: b8b4e578e5eb7856 +Block 0026 [112]: 3b3b7c449c27a4dd +Block 0026 [113]: defe515fcc6e2cc7 +Block 0026 [114]: 8a373232c3f9efa4 +Block 0026 [115]: 17a870a8636beec7 +Block 0026 [116]: 7d8903416c9f1320 +Block 0026 [117]: ecc207884b932101 +Block 0026 [118]: 18bf11e41267b18a +Block 0026 [119]: b4b347da9a7cb8ac +Block 0026 [120]: aecfcd3642ffea30 +Block 0026 [121]: 5122a78e0ca8816b +Block 0026 [122]: 6bbfce230920d8b3 +Block 0026 [123]: 161a2c5ea15a0e0b +Block 0026 [124]: c2d4801fb452e4ac +Block 0026 [125]: 82fd4d7b2d2fe2e8 +Block 0026 [126]: 854257a01b287eba +Block 0026 [127]: 334a677fd1ec9fda +Block 0027 [ 0]: 5be3fe13bdce08c7 +Block 0027 [ 1]: b0a7a8a8ade045e3 +Block 0027 [ 2]: 06df886512fe5392 +Block 0027 [ 3]: 9af2bf3676906d07 +Block 0027 [ 4]: 88e2cc40b8a4e76f +Block 0027 [ 5]: de37cbf63f3a44bc +Block 0027 [ 6]: a35ba64d6ddc8be7 +Block 0027 [ 7]: 511a834bc9aa1cc2 +Block 0027 [ 8]: f4e669ed4f8cb89d +Block 0027 [ 9]: d07308fc0ed46a4f +Block 0027 [ 10]: 7491f695a47aa04a +Block 0027 [ 11]: 31a11a9b71441773 +Block 0027 [ 12]: f0503c89f24fa682 +Block 0027 [ 13]: 75c12f9832ced304 +Block 0027 [ 14]: 54bde80d94f2cf24 +Block 0027 [ 15]: 550375f77d8be0af +Block 0027 [ 16]: 5696378300c055d2 +Block 0027 [ 17]: f2779fe23b85677a +Block 0027 [ 18]: 073405dcbbf97024 +Block 0027 [ 19]: 9013e7655de698aa +Block 0027 [ 20]: 2d44241faee0b9ef +Block 0027 [ 21]: ec51c8714f062da1 +Block 0027 [ 22]: 23d915c0aaaceb88 +Block 0027 [ 23]: d165697c18914924 +Block 0027 [ 24]: 24e554f22f933aa4 +Block 0027 [ 25]: 60d0782fc7ee202e +Block 0027 [ 26]: 63618eed5b6db134 +Block 0027 [ 27]: fd50ebe0567c4e6a +Block 0027 [ 28]: 95cb587105016157 +Block 0027 [ 29]: 6906ac0146770772 +Block 0027 [ 30]: 86031f68bbcbcf07 +Block 0027 [ 31]: 237b74293c87ed16 +Block 0027 [ 32]: 28b1d41aec829c34 +Block 0027 [ 33]: d84033367d075335 +Block 0027 [ 34]: c1b1440ee98abbfc +Block 0027 [ 35]: b338f834ceb27aa7 +Block 0027 [ 36]: cba740aed97e8d1d +Block 0027 [ 37]: a542c6a851d2a483 +Block 0027 [ 38]: 0799a8e55015b1f7 +Block 0027 [ 39]: c819a6146209f768 +Block 0027 [ 40]: cf8f88793592c941 +Block 0027 [ 41]: b822c49796097152 +Block 0027 [ 42]: 1fc839bfaf3e2f0c +Block 0027 [ 43]: 94cf66e5cacb5150 +Block 0027 [ 44]: 023c2713d277b7da +Block 0027 [ 45]: 42c9af54b7467477 +Block 0027 [ 46]: 06c87780cd1390fe +Block 0027 [ 47]: 4df89f800ac57ce4 +Block 0027 [ 48]: da72cf9ca4d8bf76 +Block 0027 [ 49]: 31bbd9520371297c +Block 0027 [ 50]: 5d99b61c5c43683d +Block 0027 [ 51]: 10bf4476116ac309 +Block 0027 [ 52]: c7abf37c2087b657 +Block 0027 [ 53]: 813a4a75afa0e07f +Block 0027 [ 54]: 06f8edc535913caa +Block 0027 [ 55]: 0e4836f75e413c0d +Block 0027 [ 56]: fbdc28f079ab6844 +Block 0027 [ 57]: ae5e53895c5e7a1a +Block 0027 [ 58]: 9712100247309cfe +Block 0027 [ 59]: 0be03ed03e7eb934 +Block 0027 [ 60]: 96104af9ad7e935f +Block 0027 [ 61]: b6ac1142ab06b5cc +Block 0027 [ 62]: c9e4cb50733efba1 +Block 0027 [ 63]: 74ea5251be8ca509 +Block 0027 [ 64]: f83778625640b346 +Block 0027 [ 65]: 11215e4e29240901 +Block 0027 [ 66]: d8f9a392f74ab538 +Block 0027 [ 67]: d0ac6f59d243531d +Block 0027 [ 68]: 8d63dd236aa37568 +Block 0027 [ 69]: 03bf34c4868d649e +Block 0027 [ 70]: df8e57df569aa85d +Block 0027 [ 71]: 71dfb145215c570b +Block 0027 [ 72]: 88d8eda9ee1a1ccb +Block 0027 [ 73]: 775f02960e9c8f91 +Block 0027 [ 74]: 42848838d08ab650 +Block 0027 [ 75]: 050183f31a1958ea +Block 0027 [ 76]: 134ca64846003950 +Block 0027 [ 77]: 1e2f30784e021a33 +Block 0027 [ 78]: 5fd720a5f4a10263 +Block 0027 [ 79]: 70c2c08cc82c6e5d +Block 0027 [ 80]: 68d0124851ad816c +Block 0027 [ 81]: 5930bd7ddc05735b +Block 0027 [ 82]: b8df3438977d79e5 +Block 0027 [ 83]: 7158f5c748d0dd09 +Block 0027 [ 84]: 60e53a3cfb9a75e5 +Block 0027 [ 85]: fb0cc38694941195 +Block 0027 [ 86]: 5536cf36b8ed3ba8 +Block 0027 [ 87]: 5aaae223caec9458 +Block 0027 [ 88]: fcd688ba2023d937 +Block 0027 [ 89]: 2b23815894329792 +Block 0027 [ 90]: edef6c1e61c71e64 +Block 0027 [ 91]: 0e57b6aac7894345 +Block 0027 [ 92]: 14ebf95eec26c84d +Block 0027 [ 93]: 1a748bb411e49be8 +Block 0027 [ 94]: dbd73d86a6520c4a +Block 0027 [ 95]: 38436185c244b69d +Block 0027 [ 96]: 3712f093d0292f34 +Block 0027 [ 97]: 32813df121b4155d +Block 0027 [ 98]: 6ad496d0b7522951 +Block 0027 [ 99]: 851fe36a165d38f7 +Block 0027 [100]: 145751d01f5fe0b5 +Block 0027 [101]: 2eff47cf3e629eb1 +Block 0027 [102]: 811a787ec3369198 +Block 0027 [103]: 563945cc33943766 +Block 0027 [104]: a6abe4655beb1d8b +Block 0027 [105]: dafd2224158188a5 +Block 0027 [106]: 18c78fb93d7eb7f8 +Block 0027 [107]: 0cd57cc01b3a80f0 +Block 0027 [108]: 04d2ec2408194328 +Block 0027 [109]: 44a6ccf18a1db45e +Block 0027 [110]: 5561ffd2d09051af +Block 0027 [111]: 52d51f6943763516 +Block 0027 [112]: 52f1b6ccc089f896 +Block 0027 [113]: f83184008f9b70b1 +Block 0027 [114]: 47d67a0849c7fde3 +Block 0027 [115]: 7e9f8078e4be0c14 +Block 0027 [116]: 1c4a3cdd84be40c0 +Block 0027 [117]: f9916cedc43bd59b +Block 0027 [118]: 9bc4380d0351e854 +Block 0027 [119]: 00cfbceb39e15f88 +Block 0027 [120]: 7f5f41a71976be18 +Block 0027 [121]: 5c6b7b42ec0a93ee +Block 0027 [122]: eac2b68d34c73688 +Block 0027 [123]: a7ddbf2bfc4be3ef +Block 0027 [124]: 49d47531d67094a9 +Block 0027 [125]: a6eaf85645fb6eae +Block 0027 [126]: 77a99a8bd0ea288d +Block 0027 [127]: d54c07bcb55f92d7 +Block 0028 [ 0]: ea035ea2040b86fa +Block 0028 [ 1]: 2e16a6ff91268b3e +Block 0028 [ 2]: c33278f3f2568bcd +Block 0028 [ 3]: 4e7a49242419fea0 +Block 0028 [ 4]: 6762092f26336892 +Block 0028 [ 5]: a346752d8aaf6445 +Block 0028 [ 6]: 397328788712c7c7 +Block 0028 [ 7]: 340ec72f35291f80 +Block 0028 [ 8]: 9b9a3f1443fdf705 +Block 0028 [ 9]: b642da5d981d9f96 +Block 0028 [ 10]: 78bb8d36eadc7cd6 +Block 0028 [ 11]: daf5dcf74717e45c +Block 0028 [ 12]: b2ad870532880376 +Block 0028 [ 13]: 3567026ef751358a +Block 0028 [ 14]: 93d5566d1fe4ec35 +Block 0028 [ 15]: afdee647c2fca6f4 +Block 0028 [ 16]: 7016d9708eb7df00 +Block 0028 [ 17]: 201c3ad2a8a7c3c6 +Block 0028 [ 18]: 25d14750df3d239b +Block 0028 [ 19]: 70bafb70600a8c04 +Block 0028 [ 20]: 46ce039305fb1a7b +Block 0028 [ 21]: 7984538abbfadcd6 +Block 0028 [ 22]: 64aecb8107d681bf +Block 0028 [ 23]: 496cf0f56bff4df1 +Block 0028 [ 24]: f065187755f8cb53 +Block 0028 [ 25]: b3ea311b5f67abbc +Block 0028 [ 26]: 2a828b7595500d4b +Block 0028 [ 27]: 34f0a68a4e6119f5 +Block 0028 [ 28]: 004c38fd036b5024 +Block 0028 [ 29]: aa526730ee10da64 +Block 0028 [ 30]: d39d0fac773bafcb +Block 0028 [ 31]: b11607e91b9f5a00 +Block 0028 [ 32]: c7f3de33f5f4cf6a +Block 0028 [ 33]: 266f646f53cbea7c +Block 0028 [ 34]: cd80be78d7225cb8 +Block 0028 [ 35]: 3ab994a40c96cd3f +Block 0028 [ 36]: 946f570038bb1774 +Block 0028 [ 37]: 348efca8d38658cf +Block 0028 [ 38]: dd737ec2d7011280 +Block 0028 [ 39]: a9670f393e9bc143 +Block 0028 [ 40]: 7487a7eee9bc3abb +Block 0028 [ 41]: af350b815c13205b +Block 0028 [ 42]: af5d5d6b18eeb661 +Block 0028 [ 43]: df325329eb54cc34 +Block 0028 [ 44]: 95eea5b85bf729f1 +Block 0028 [ 45]: 8cc4861ad9ae97c2 +Block 0028 [ 46]: d8fa96de59d1c36d +Block 0028 [ 47]: d83a13b1285ba019 +Block 0028 [ 48]: 06f15b3e227b12e2 +Block 0028 [ 49]: 89eff8ca5feb5b54 +Block 0028 [ 50]: 2965b0ae039dc693 +Block 0028 [ 51]: b053ce0a9639b9e2 +Block 0028 [ 52]: 6b1294b3b911d087 +Block 0028 [ 53]: cb8ed5a39f69a591 +Block 0028 [ 54]: f401f0d2325dc6f0 +Block 0028 [ 55]: 52702e2f4fd6cc0f +Block 0028 [ 56]: 552fafd12d308c6d +Block 0028 [ 57]: fc3930e1e07015b0 +Block 0028 [ 58]: ded4395a07ef93d5 +Block 0028 [ 59]: 352d277d5f9aa883 +Block 0028 [ 60]: f1e65e32dfda026e +Block 0028 [ 61]: d06fa1b780055d65 +Block 0028 [ 62]: 3d91dedd8322ab05 +Block 0028 [ 63]: 6c54b369bd42086d +Block 0028 [ 64]: b63e977354277451 +Block 0028 [ 65]: e51466e99f6cc354 +Block 0028 [ 66]: 5fa67b6b41447bbb +Block 0028 [ 67]: 733e4305ce6154db +Block 0028 [ 68]: 1421bedf364b1955 +Block 0028 [ 69]: 38a036084d175daf +Block 0028 [ 70]: 4dc377e4411fd24f +Block 0028 [ 71]: abb4fda7705ed57f +Block 0028 [ 72]: 3844dec4d4f399fc +Block 0028 [ 73]: 44d53f09c35e3822 +Block 0028 [ 74]: d2bcd61705007948 +Block 0028 [ 75]: 39cd9df9f7e059bc +Block 0028 [ 76]: f0ac2ab3385517d4 +Block 0028 [ 77]: b8c0a4141d077e38 +Block 0028 [ 78]: b83aaaddc5ead1cf +Block 0028 [ 79]: 56c73f9d8cf69fef +Block 0028 [ 80]: 979d31a4ed576dd6 +Block 0028 [ 81]: 9a8d33932d334fcb +Block 0028 [ 82]: 5943ca7be3e1a9ab +Block 0028 [ 83]: 8aeeee3a3e71e088 +Block 0028 [ 84]: b304d443b00f4aa6 +Block 0028 [ 85]: 16882d4404bd747d +Block 0028 [ 86]: 8af608fd07a6a83a +Block 0028 [ 87]: 22bb9dfc7f464419 +Block 0028 [ 88]: 0754bb3c27a00864 +Block 0028 [ 89]: 8cee6891c9c53736 +Block 0028 [ 90]: fadd02c16c0e8a2c +Block 0028 [ 91]: 3a6029c10bd05df1 +Block 0028 [ 92]: e87d999067440344 +Block 0028 [ 93]: 861b32010d72a2d4 +Block 0028 [ 94]: 7a05572de09a1c5a +Block 0028 [ 95]: cabea168c4a214c5 +Block 0028 [ 96]: 3cff347defdadd78 +Block 0028 [ 97]: 2843cb0790f9e480 +Block 0028 [ 98]: b0df9bce712bbf4d +Block 0028 [ 99]: f6a2c8e92ebebd7f +Block 0028 [100]: 4f0a9e32dc2630ae +Block 0028 [101]: 294af970066eae49 +Block 0028 [102]: 5325be741ea3470d +Block 0028 [103]: 9c7f2e03fe4a5b58 +Block 0028 [104]: c2d8f4da0903a91f +Block 0028 [105]: 9b70790583419a59 +Block 0028 [106]: a6d9d7c679a4d90a +Block 0028 [107]: fa61e1d94dae1846 +Block 0028 [108]: 818fde1c5b259df4 +Block 0028 [109]: f6fb171cd4d98e0f +Block 0028 [110]: b43ad75705f2ef0f +Block 0028 [111]: 59a5eb3f9a5fe96f +Block 0028 [112]: 08b6d1cc904187ae +Block 0028 [113]: c8218eae71884346 +Block 0028 [114]: e17951439c57259b +Block 0028 [115]: 669f4548595914ff +Block 0028 [116]: 982e95a55f69f9a4 +Block 0028 [117]: e228afc8f89d45fb +Block 0028 [118]: 47099aed1a722d5a +Block 0028 [119]: f83cefa338551daa +Block 0028 [120]: 2c21f9a015a8a516 +Block 0028 [121]: d2ec752a4d981f6b +Block 0028 [122]: 146521d7a2f009a2 +Block 0028 [123]: 071014e51af69e26 +Block 0028 [124]: 5f82eae58d2972a5 +Block 0028 [125]: 966eb97f7e0f60a1 +Block 0028 [126]: 308ce93e852a62bc +Block 0028 [127]: efc36d7416e66af6 +Block 0029 [ 0]: 3bdabd48605c830d +Block 0029 [ 1]: 301ed6564cd8adec +Block 0029 [ 2]: df374c730df57a03 +Block 0029 [ 3]: fad6e7bdacbbcf17 +Block 0029 [ 4]: e92e32543552cbe4 +Block 0029 [ 5]: 29447af54f3ee354 +Block 0029 [ 6]: 452121662a1e7130 +Block 0029 [ 7]: e7e398737b41d189 +Block 0029 [ 8]: a1117ca5f5c3c5fa +Block 0029 [ 9]: d76ab9d95a081eec +Block 0029 [ 10]: 5301a2721f0df1eb +Block 0029 [ 11]: 95200fbff6ad0d78 +Block 0029 [ 12]: 195f9faddea81f3e +Block 0029 [ 13]: bd7534410b5bd10d +Block 0029 [ 14]: 6327d0b34d6a447a +Block 0029 [ 15]: db196f244badd93d +Block 0029 [ 16]: 7d62585524f47b6b +Block 0029 [ 17]: 2013c6d5df94b708 +Block 0029 [ 18]: d5e8d62b1af8df38 +Block 0029 [ 19]: f89f1563c6372121 +Block 0029 [ 20]: 50b7efa2fbdfdd40 +Block 0029 [ 21]: 656eef73963c5266 +Block 0029 [ 22]: 3da1eacc8baf2460 +Block 0029 [ 23]: 390a9769d20ddf52 +Block 0029 [ 24]: 23d923f21eed6aa5 +Block 0029 [ 25]: 173dc145e6d0171f +Block 0029 [ 26]: 6c72b0739a4ee6c0 +Block 0029 [ 27]: 0f1acedbf79b41b4 +Block 0029 [ 28]: 40b950241d55ce76 +Block 0029 [ 29]: b59e3bd42c1e5a78 +Block 0029 [ 30]: e6be2f76812aa447 +Block 0029 [ 31]: f37036ff225bbbda +Block 0029 [ 32]: 351f3c43a983b318 +Block 0029 [ 33]: 3c63ce438fa5e84f +Block 0029 [ 34]: e0a56205e09aa574 +Block 0029 [ 35]: b50f7850346b47d6 +Block 0029 [ 36]: b0a19b67c2ed5b8e +Block 0029 [ 37]: 8f50feafdaea26ec +Block 0029 [ 38]: cdc0bc350397fde4 +Block 0029 [ 39]: b824e50d70d878b8 +Block 0029 [ 40]: 20c2852ed5fc9e9b +Block 0029 [ 41]: d260cc25828b18cc +Block 0029 [ 42]: 97f0a84ee15612ea +Block 0029 [ 43]: 48afdb506f6251df +Block 0029 [ 44]: 461c26175b8ae4ef +Block 0029 [ 45]: 216dbe3ccbb14768 +Block 0029 [ 46]: 594bbcb744f7b638 +Block 0029 [ 47]: c9af82003c6890bb +Block 0029 [ 48]: 62536e8df9755acf +Block 0029 [ 49]: b7ef0918894031d2 +Block 0029 [ 50]: 7a453d700fbb40cd +Block 0029 [ 51]: 71ad7f2a5729d489 +Block 0029 [ 52]: 20691da8478b2dde +Block 0029 [ 53]: 9f0a0c8183f30200 +Block 0029 [ 54]: a6d136280e231439 +Block 0029 [ 55]: ba8aaf65340929ec +Block 0029 [ 56]: c80f137c575e21a0 +Block 0029 [ 57]: b9a819a536b2975b +Block 0029 [ 58]: 5d767f30e753f9cb +Block 0029 [ 59]: c5c8b4e9285ab45f +Block 0029 [ 60]: 104063c24eda0f34 +Block 0029 [ 61]: fb3993aa2b39c1cb +Block 0029 [ 62]: 47d27cc72c649216 +Block 0029 [ 63]: b1e6d9348be399b3 +Block 0029 [ 64]: a6d723637e610f54 +Block 0029 [ 65]: 5a122ebb3829ce5d +Block 0029 [ 66]: b0686b38d9c9dd43 +Block 0029 [ 67]: 47c31e82b95419b9 +Block 0029 [ 68]: 9f05eca085d6e86e +Block 0029 [ 69]: 7e13c02e53b4e999 +Block 0029 [ 70]: f02db46b55a65df6 +Block 0029 [ 71]: 77896aea6c63fa83 +Block 0029 [ 72]: 8b9f53272e5b2ee1 +Block 0029 [ 73]: ac843be226b3579c +Block 0029 [ 74]: 82b7b66c3fa114a9 +Block 0029 [ 75]: 72fee33e9be86f50 +Block 0029 [ 76]: dc27b4a5de1906c8 +Block 0029 [ 77]: e3c2039d4303a548 +Block 0029 [ 78]: 15e3b3a7892b0d8f +Block 0029 [ 79]: 61d89048357716ce +Block 0029 [ 80]: 0e7ccb48edb01b41 +Block 0029 [ 81]: 31fa10f63f19067c +Block 0029 [ 82]: 6e12ca8d56c07bdf +Block 0029 [ 83]: c96238b43ce281a7 +Block 0029 [ 84]: ea92aabec561c97c +Block 0029 [ 85]: 5b30055449d1b10a +Block 0029 [ 86]: 6bc365c220fa363a +Block 0029 [ 87]: e80070c1d31570ae +Block 0029 [ 88]: f000f70cb7f68723 +Block 0029 [ 89]: 616e9af618594d1f +Block 0029 [ 90]: acbf4d18a682c25c +Block 0029 [ 91]: 14cdcd57ca47433d +Block 0029 [ 92]: a428accbefb4d001 +Block 0029 [ 93]: 895c764190262d06 +Block 0029 [ 94]: 64b93e0add42e93f +Block 0029 [ 95]: 26235c89252710a9 +Block 0029 [ 96]: e743ecadafb28d0c +Block 0029 [ 97]: 0c8bb00bbbe17d45 +Block 0029 [ 98]: bdb9e60a72a82689 +Block 0029 [ 99]: 59ac39145a7ae1c1 +Block 0029 [100]: cb5419e28b5f6009 +Block 0029 [101]: 8a9b807b28c6b546 +Block 0029 [102]: 13f5c91565058303 +Block 0029 [103]: 630b1263788776e1 +Block 0029 [104]: f89193742379c81e +Block 0029 [105]: 9b3fb899f09b4cb1 +Block 0029 [106]: 40fd48829eb77bd7 +Block 0029 [107]: 477d964d41c8d9d0 +Block 0029 [108]: 2a797b8d5a2f0702 +Block 0029 [109]: 366689716914f34d +Block 0029 [110]: 4d0c98ad9d485725 +Block 0029 [111]: 4fcca43a76ba9ea2 +Block 0029 [112]: d8b9ebf080d6b155 +Block 0029 [113]: b6b9b9bed4dc8ecd +Block 0029 [114]: 84c306ea62699a25 +Block 0029 [115]: 0de49041213208e6 +Block 0029 [116]: ef61d4ee82187557 +Block 0029 [117]: 0a8f1d03285d95ec +Block 0029 [118]: c25f5ffb0f4df0a9 +Block 0029 [119]: ade24bb8321c6aa1 +Block 0029 [120]: 674fd09cc02b1746 +Block 0029 [121]: 251cd54c44f9e1ce +Block 0029 [122]: fa4e3ef002c99ebd +Block 0029 [123]: 7f9595eccb3636cf +Block 0029 [124]: 4ac562e87d01c37d +Block 0029 [125]: b48318bac585fbc2 +Block 0029 [126]: 42b91d62b469afec +Block 0029 [127]: adf8ebc72e5180ce +Block 0030 [ 0]: 78ebb0cc500cfd23 +Block 0030 [ 1]: c460a52a939b100f +Block 0030 [ 2]: 413797d113559097 +Block 0030 [ 3]: 24097f4a72aa4d7a +Block 0030 [ 4]: 7fd192dc686f9dd1 +Block 0030 [ 5]: 1403f9433f94c680 +Block 0030 [ 6]: 2888ddca7026222f +Block 0030 [ 7]: d8de309eb8eea83a +Block 0030 [ 8]: 7ddbc393ee013ca4 +Block 0030 [ 9]: eab9f37fc71f9c64 +Block 0030 [ 10]: d67184afa449b483 +Block 0030 [ 11]: b34365013ef6f697 +Block 0030 [ 12]: 7d3c26cc8eed80f6 +Block 0030 [ 13]: 8cdd8df5db037fe7 +Block 0030 [ 14]: 0ac112d54d43168e +Block 0030 [ 15]: 74e4494bcc9636a3 +Block 0030 [ 16]: 0edf89b34fad5868 +Block 0030 [ 17]: b1e24de77dccf693 +Block 0030 [ 18]: d92f485e04babc84 +Block 0030 [ 19]: 8c91873ed76e45d7 +Block 0030 [ 20]: fa777c8e222f5d7b +Block 0030 [ 21]: fdac371cbe360dbb +Block 0030 [ 22]: db06c1b81b37310d +Block 0030 [ 23]: 839d563b33c36c0c +Block 0030 [ 24]: c6b15e0f746c4c94 +Block 0030 [ 25]: 2891ba5e8b3fdf6f +Block 0030 [ 26]: 838e406c57fd4d90 +Block 0030 [ 27]: 8247d5267df0762e +Block 0030 [ 28]: 7cc4c5a7cf99d0ea +Block 0030 [ 29]: 1bc549cdfdb8f404 +Block 0030 [ 30]: a749161c3abfbd15 +Block 0030 [ 31]: 634640ab3dba42e9 +Block 0030 [ 32]: 4f66bff1a5599b37 +Block 0030 [ 33]: 77fca844c066144b +Block 0030 [ 34]: 73174973c64ba79a +Block 0030 [ 35]: 47ce5a1c3de46611 +Block 0030 [ 36]: 0b2417e4adbb9c4a +Block 0030 [ 37]: 56f91835257a8ab2 +Block 0030 [ 38]: a947a800c9ae0adc +Block 0030 [ 39]: dfba4ce0ca8a9022 +Block 0030 [ 40]: 7fd0c982518c8bc3 +Block 0030 [ 41]: 0e38079a66f607c9 +Block 0030 [ 42]: bb13ce39ce7c838d +Block 0030 [ 43]: 301a331b613c173f +Block 0030 [ 44]: 6de35dd0db47a4a4 +Block 0030 [ 45]: f4061faea81daff5 +Block 0030 [ 46]: fa1b99d63c7b81d0 +Block 0030 [ 47]: ebbc817d664c3b5d +Block 0030 [ 48]: ed08b9868c781530 +Block 0030 [ 49]: 7ebc4ab09b5f9f8c +Block 0030 [ 50]: 428f35ba0da0fb8d +Block 0030 [ 51]: 3cc4dd39deb4b916 +Block 0030 [ 52]: ef85cca2918123aa +Block 0030 [ 53]: e9b923891414adb5 +Block 0030 [ 54]: 990078e6307bf03d +Block 0030 [ 55]: 46293fa01ab6eba6 +Block 0030 [ 56]: 88c1973464f2a740 +Block 0030 [ 57]: 29f30f34cbdb32f9 +Block 0030 [ 58]: 6e0c364377a98b5a +Block 0030 [ 59]: 4a608ade6a63b04b +Block 0030 [ 60]: c4d07ec581c6e110 +Block 0030 [ 61]: c6e38c532d112754 +Block 0030 [ 62]: c7404f3f4c5ca81d +Block 0030 [ 63]: b2399b4108208e93 +Block 0030 [ 64]: 6cf803e9c511a589 +Block 0030 [ 65]: 21bede8cc081d6cb +Block 0030 [ 66]: 0f31881b96348c43 +Block 0030 [ 67]: 208a6a3f6b5a6aea +Block 0030 [ 68]: d96f9a9b3d38498a +Block 0030 [ 69]: fe12c848b152f88b +Block 0030 [ 70]: ba37377989634bbe +Block 0030 [ 71]: f87f306d4e55fc58 +Block 0030 [ 72]: 6e3af73d61e5acb6 +Block 0030 [ 73]: 01ebb62867ae7346 +Block 0030 [ 74]: 34f9f3f14540d8a0 +Block 0030 [ 75]: a0530a04a4fed871 +Block 0030 [ 76]: 8aab51aa2699c2d7 +Block 0030 [ 77]: 8cc1c112302e9c0a +Block 0030 [ 78]: 66d2c4c1b0f369ca +Block 0030 [ 79]: 5881e8885f7618aa +Block 0030 [ 80]: ece8ee07d5a526c8 +Block 0030 [ 81]: 5b8be9aec2f46490 +Block 0030 [ 82]: aacfa3b578ffc40b +Block 0030 [ 83]: 90b2be8bbc0b5982 +Block 0030 [ 84]: e7baaa8858cc81ff +Block 0030 [ 85]: f7995581dc6bcb96 +Block 0030 [ 86]: 624c813678edc943 +Block 0030 [ 87]: 2275455d12b12b0b +Block 0030 [ 88]: eb45b6b9fe5718a9 +Block 0030 [ 89]: 0df81b2d8f23c101 +Block 0030 [ 90]: a6cf10ca19e15f80 +Block 0030 [ 91]: 405a403a54f6ea58 +Block 0030 [ 92]: e07f299250a4083b +Block 0030 [ 93]: a3b82fe32687fced +Block 0030 [ 94]: bfd23f20d69d4dc6 +Block 0030 [ 95]: 2a476b8e3de7b369 +Block 0030 [ 96]: 20826b265857d295 +Block 0030 [ 97]: 1c347a083c6d2644 +Block 0030 [ 98]: fe1e1d3de266875c +Block 0030 [ 99]: 3332fe21e25d8b24 +Block 0030 [100]: 809711549430ae58 +Block 0030 [101]: d384c8613f965dd7 +Block 0030 [102]: 7a3ece3e88c6e242 +Block 0030 [103]: ca520dd2aaff2c07 +Block 0030 [104]: 5ed1157c64803562 +Block 0030 [105]: ab10c5653f8a0834 +Block 0030 [106]: e673d52089c309c3 +Block 0030 [107]: f8337353fe6934f6 +Block 0030 [108]: 294de71aba166af5 +Block 0030 [109]: feec046f98dbb7f7 +Block 0030 [110]: d217e0685afd51f5 +Block 0030 [111]: 675996cc4f1738e3 +Block 0030 [112]: f19f120722f24321 +Block 0030 [113]: d64b4a71899b2cc0 +Block 0030 [114]: b7e02717d1dad185 +Block 0030 [115]: 9aec98d8ecfaf56a +Block 0030 [116]: d1b145c263d02309 +Block 0030 [117]: bc5338fbc3d7782d +Block 0030 [118]: 335b5ad99aeb80df +Block 0030 [119]: a68c507da4296764 +Block 0030 [120]: b68e6e3cb8332116 +Block 0030 [121]: aabcdc1e36e7aab6 +Block 0030 [122]: 7059fdcb44c4449e +Block 0030 [123]: d0a07c2ae3431bae +Block 0030 [124]: ad3824b96e5d8871 +Block 0030 [125]: 4a08dc8d052e9081 +Block 0030 [126]: 27bef794993fe81b +Block 0030 [127]: 5bba260ee5d913ce +Block 0031 [ 0]: 8056a89f8ad77396 +Block 0031 [ 1]: 0acbf994ee770d14 +Block 0031 [ 2]: d72a158734769c8a +Block 0031 [ 3]: 96616da2ec8ed518 +Block 0031 [ 4]: d26d683efb269aba +Block 0031 [ 5]: 9e77187292137456 +Block 0031 [ 6]: d3c5abc61cfba5f0 +Block 0031 [ 7]: da2c4be29800e8d4 +Block 0031 [ 8]: 1424a710054dbaff +Block 0031 [ 9]: e5960c0dd23f2e1a +Block 0031 [ 10]: 2cadcb97d3fe1953 +Block 0031 [ 11]: 0ccd24845599050a +Block 0031 [ 12]: 7320274c7126640a +Block 0031 [ 13]: 7cd8472ac2aaaddd +Block 0031 [ 14]: e5bacffb3c811f52 +Block 0031 [ 15]: 10fbda16e9eeb4ce +Block 0031 [ 16]: 1500a7ea6b4a94d2 +Block 0031 [ 17]: a1ba7e4b8aa528e9 +Block 0031 [ 18]: db1a5f54d44181fc +Block 0031 [ 19]: 1fd19ef893ef2e0a +Block 0031 [ 20]: 62040393e33ade1d +Block 0031 [ 21]: 31e3ec9bf63dfcb9 +Block 0031 [ 22]: c1992e801e8345c8 +Block 0031 [ 23]: 950b6603fce64375 +Block 0031 [ 24]: a658a546d46a6dd5 +Block 0031 [ 25]: 99ba119e73bf2451 +Block 0031 [ 26]: ca77d7ef039f066c +Block 0031 [ 27]: 0f87eecf64bde053 +Block 0031 [ 28]: cdb9d6e10e55a108 +Block 0031 [ 29]: d21eedb708db5c2f +Block 0031 [ 30]: 20d14163de3ea6e6 +Block 0031 [ 31]: 993f46dd66cf0e88 +Block 0031 [ 32]: c3546c4fccc13367 +Block 0031 [ 33]: 0484e711add96774 +Block 0031 [ 34]: a1a1debc1c40712b +Block 0031 [ 35]: 096825b113b5d71c +Block 0031 [ 36]: c95554f8f54b1b48 +Block 0031 [ 37]: 26a1af38ace06794 +Block 0031 [ 38]: 66df71657d902bf6 +Block 0031 [ 39]: bbd767041fc32fac +Block 0031 [ 40]: 3ece0676c3ae967e +Block 0031 [ 41]: 6d1bf9cfbe754e01 +Block 0031 [ 42]: 72203d494509b05e +Block 0031 [ 43]: af6cd4272b298bcc +Block 0031 [ 44]: 40317a0ca1d316bb +Block 0031 [ 45]: fec590ce7045da13 +Block 0031 [ 46]: ce9ea146364d5e3f +Block 0031 [ 47]: 3c2cce0a903c1b26 +Block 0031 [ 48]: 6f3dbc07470ccc2f +Block 0031 [ 49]: 6351893a222bd8cf +Block 0031 [ 50]: 0cd4d72b32b918e8 +Block 0031 [ 51]: 29cd14a678355e28 +Block 0031 [ 52]: a10bef462977255b +Block 0031 [ 53]: 6ebfb703429b51e8 +Block 0031 [ 54]: 9943623f765c7658 +Block 0031 [ 55]: 90638f6e666bead3 +Block 0031 [ 56]: da55186b2cb868bf +Block 0031 [ 57]: c0a953f05ca97440 +Block 0031 [ 58]: 991e5450713fa2d0 +Block 0031 [ 59]: 9f1117bc7a25c8ab +Block 0031 [ 60]: b1cab74a81011a00 +Block 0031 [ 61]: 24717ae307ffa148 +Block 0031 [ 62]: 49778268b7e5b98c +Block 0031 [ 63]: 1082ca8e9d07a245 +Block 0031 [ 64]: 4cecb2326330d454 +Block 0031 [ 65]: e116f69e48d7663d +Block 0031 [ 66]: dd6fc7fb20eeed81 +Block 0031 [ 67]: 467086efaa6c70a5 +Block 0031 [ 68]: 06374063912b5d23 +Block 0031 [ 69]: d15fbd1c5b678f13 +Block 0031 [ 70]: f8c29343528d1ec7 +Block 0031 [ 71]: 76089db7b8607221 +Block 0031 [ 72]: 711c36ee0a3bfc0d +Block 0031 [ 73]: 2c04c97ec81d3aeb +Block 0031 [ 74]: 47d14e368861ca0c +Block 0031 [ 75]: 8b77572fe7c02210 +Block 0031 [ 76]: 3a93283ad7ec4394 +Block 0031 [ 77]: bf65a5f5dcdf5a7c +Block 0031 [ 78]: 02e56c288b5e017a +Block 0031 [ 79]: 7a130bec028a12a2 +Block 0031 [ 80]: 4373299ae5c00617 +Block 0031 [ 81]: fe15f92f01ae432e +Block 0031 [ 82]: c385eacaba89938d +Block 0031 [ 83]: b3dc4616fd72c200 +Block 0031 [ 84]: e453bb3534da09bf +Block 0031 [ 85]: b00fec3805b83138 +Block 0031 [ 86]: 95c96ef7d22e4ad9 +Block 0031 [ 87]: 93f8f5bbc6a8c31f +Block 0031 [ 88]: 06bfe5c4d32f03bc +Block 0031 [ 89]: f3e2d02a807ed7f2 +Block 0031 [ 90]: 883c84bfb046e7fd +Block 0031 [ 91]: b9f1c7ad0a7b4b9b +Block 0031 [ 92]: 77ccbca2abcc81fb +Block 0031 [ 93]: 3bb00a769cf2ebcc +Block 0031 [ 94]: 8f178ea513f83875 +Block 0031 [ 95]: 07e289f5760a5695 +Block 0031 [ 96]: 7d447ccb68d68fec +Block 0031 [ 97]: b1d4e8e9888d051e +Block 0031 [ 98]: 447e71ca682102e9 +Block 0031 [ 99]: f590ffeb8bef018f +Block 0031 [100]: d54559d0ab3b6afc +Block 0031 [101]: caf7649dbe8fde6a +Block 0031 [102]: c39efa41c6fb669f +Block 0031 [103]: 5b796db29d271d39 +Block 0031 [104]: dabaecc9fa05b4ad +Block 0031 [105]: 3cc6c412e203762b +Block 0031 [106]: 999eaf1a774d5a56 +Block 0031 [107]: 66ccd06d248b67c4 +Block 0031 [108]: 940273840c36b61e +Block 0031 [109]: 60845cfb3553ce08 +Block 0031 [110]: 499847123467e401 +Block 0031 [111]: c3e46f4ac502aba6 +Block 0031 [112]: 1a416510f69fc5b4 +Block 0031 [113]: 4a4786d118b23383 +Block 0031 [114]: ad4d126ee991f3ad +Block 0031 [115]: 59281ed002081934 +Block 0031 [116]: 1ccae3345cb54ae8 +Block 0031 [117]: 773e9b04ce3a1f7e +Block 0031 [118]: 3259c02c69346830 +Block 0031 [119]: 03d2e98b455ee4e9 +Block 0031 [120]: 0ab0c6a934464e66 +Block 0031 [121]: 7963df0df1398154 +Block 0031 [122]: af67b262a61c36b5 +Block 0031 [123]: 32bca7aa219f2e78 +Block 0031 [124]: 28d17914aea9734c +Block 0031 [125]: 6a4622176522e398 +Block 0031 [126]: 951aa08aeecb2c05 +Block 0031 [127]: 6a6c49d2cb75d5b6 + + After pass 1: +Block 0000 [ 0]: d3801200410f8c0d +Block 0000 [ 1]: 0bf9e8a6e442ba6d +Block 0000 [ 2]: e2ca92fe9c541fcc +Block 0000 [ 3]: 6269fe6db177a388 +Block 0000 [ 4]: 54697b2f25faeed4 +Block 0000 [ 5]: ca4dcbdcd4eefcae +Block 0000 [ 6]: 869f43f14f6ae784 +Block 0000 [ 7]: 6b157abf5710f387 +Block 0000 [ 8]: dccc9f665cc70060 +Block 0000 [ 9]: 0c5edcc99fa61403 +Block 0000 [ 10]: f29303c301980249 +Block 0000 [ 11]: 5988c1bbd30d834c +Block 0000 [ 12]: 39e364b591bdfe22 +Block 0000 [ 13]: 416a7a66289539fe +Block 0000 [ 14]: aeac3509f8c8e956 +Block 0000 [ 15]: bbc521663bf6a8e2 +Block 0000 [ 16]: bef194b164ce3e99 +Block 0000 [ 17]: fd49e154856ac494 +Block 0000 [ 18]: 4ce1a25b28624fde +Block 0000 [ 19]: 0ceb5695cf3204b4 +Block 0000 [ 20]: 5401064c72926583 +Block 0000 [ 21]: c1ae83b9ffa27e61 +Block 0000 [ 22]: 16eaaa854054e945 +Block 0000 [ 23]: c17a5724ee8d1bb1 +Block 0000 [ 24]: 4bf3658090d191f3 +Block 0000 [ 25]: b4d5b6e3db79c5e0 +Block 0000 [ 26]: d4e0b7e7a3688394 +Block 0000 [ 27]: 4bd8b5a50ccef493 +Block 0000 [ 28]: 4142a58a18979b33 +Block 0000 [ 29]: c14bb56255a035e6 +Block 0000 [ 30]: ce21b973b1c42d32 +Block 0000 [ 31]: e5882618965206a1 +Block 0000 [ 32]: 289232b90dfc00a7 +Block 0000 [ 33]: f6eb11683430d228 +Block 0000 [ 34]: e31a02277106ef3e +Block 0000 [ 35]: d80de6836272b387 +Block 0000 [ 36]: 5c09d4e606638b96 +Block 0000 [ 37]: 58895feb876e41ab +Block 0000 [ 38]: 5cf9d44568297c87 +Block 0000 [ 39]: eed0050361734627 +Block 0000 [ 40]: 4ea00fe53450879a +Block 0000 [ 41]: b3064d067f9f262e +Block 0000 [ 42]: ca87f9054518759f +Block 0000 [ 43]: b2608daa5232463a +Block 0000 [ 44]: ca741245ec6e2b97 +Block 0000 [ 45]: a9f1625a9355e35f +Block 0000 [ 46]: 77f2764d0f0dc02b +Block 0000 [ 47]: 9a5e8e24f351f5a8 +Block 0000 [ 48]: 016be699c579a7be +Block 0000 [ 49]: 93398aca060014c5 +Block 0000 [ 50]: 0d47df3cafd4d82e +Block 0000 [ 51]: 395a20bf86d0abed +Block 0000 [ 52]: 75b7482c7b8e5671 +Block 0000 [ 53]: 1ff48f393668b7a4 +Block 0000 [ 54]: d49085c4afe25a0e +Block 0000 [ 55]: 136fde4497f52b21 +Block 0000 [ 56]: 3b370889aa35ed71 +Block 0000 [ 57]: cc8c190f1c472520 +Block 0000 [ 58]: 3693124a7e8386d9 +Block 0000 [ 59]: 297d10d970645437 +Block 0000 [ 60]: 993a29d9e20d578a +Block 0000 [ 61]: be2a4c09ff56ddf9 +Block 0000 [ 62]: 5d419a2b8f618cf0 +Block 0000 [ 63]: e040f440ec86b82d +Block 0000 [ 64]: 07774dfca51e71ad +Block 0000 [ 65]: 4976a68a18d53aef +Block 0000 [ 66]: ab97b1a63c81a71d +Block 0000 [ 67]: bd73fa31f2bb5ebd +Block 0000 [ 68]: a52da172b97961d0 +Block 0000 [ 69]: 3d2ced1687fca2ac +Block 0000 [ 70]: c79a95caa247ebe5 +Block 0000 [ 71]: 65300100024c12d3 +Block 0000 [ 72]: 20f12fa6508f8063 +Block 0000 [ 73]: 267c109454fbc217 +Block 0000 [ 74]: fe9568ba884d417b +Block 0000 [ 75]: bfde126a9ba3a56a +Block 0000 [ 76]: 601281f62f846c59 +Block 0000 [ 77]: 2bac2b0e29765653 +Block 0000 [ 78]: 9e7b7041901f6621 +Block 0000 [ 79]: d9163f3a5a6d65d8 +Block 0000 [ 80]: a3ffed8a7445715c +Block 0000 [ 81]: e06888305780966c +Block 0000 [ 82]: 7f500d7bdf4912e3 +Block 0000 [ 83]: 00004ac96e78ef85 +Block 0000 [ 84]: ff02aabd39208163 +Block 0000 [ 85]: da2ddc922d9c7de3 +Block 0000 [ 86]: 6dc4aa44c0f6444f +Block 0000 [ 87]: 53c918eceabb95b2 +Block 0000 [ 88]: 2d86fbf1d0d4f513 +Block 0000 [ 89]: 755a0e402d9f2ef3 +Block 0000 [ 90]: 266280dc98e6bee1 +Block 0000 [ 91]: 82efb4e4b9ef9703 +Block 0000 [ 92]: d0fa8b78e7c3511d +Block 0000 [ 93]: a93cad157a39bd8e +Block 0000 [ 94]: a0f66af8bffe6691 +Block 0000 [ 95]: 87b9cfcdac11cacd +Block 0000 [ 96]: 7c62fe7cb7ab47cf +Block 0000 [ 97]: 7081003ec1e06f77 +Block 0000 [ 98]: 64154c14edc0996f +Block 0000 [ 99]: 58bfa58059732347 +Block 0000 [100]: 42dd823b7b3d9d3e +Block 0000 [101]: 57fd57d0ce388b8b +Block 0000 [102]: 7d562a38ef9e3fbb +Block 0000 [103]: f99001a3ad511bd3 +Block 0000 [104]: 5b61a9ac870c859b +Block 0000 [105]: 8f099adec5730a51 +Block 0000 [106]: d80dbca4c6846746 +Block 0000 [107]: 00678617d7cee9a1 +Block 0000 [108]: 207fe5ad05cc1e50 +Block 0000 [109]: 3adee7a9a8c821cb +Block 0000 [110]: 01f1e835d06f9c01 +Block 0000 [111]: 237cdc3267368609 +Block 0000 [112]: 6f872d1adc8473a3 +Block 0000 [113]: c8ea6cae26f32a04 +Block 0000 [114]: f641027f4ff79c7f +Block 0000 [115]: 0acba686f655d7d3 +Block 0000 [116]: d2d3613a0eb5a76c +Block 0000 [117]: 44b37e72dca1ef1c +Block 0000 [118]: f026dca86e752f36 +Block 0000 [119]: b1c2cddd938aed8a +Block 0000 [120]: b8abac934f3180aa +Block 0000 [121]: cd8d3861ca00c527 +Block 0000 [122]: 4efb238110b5fb03 +Block 0000 [123]: b99922a3d81cb223 +Block 0000 [124]: fada8c89e3243fd3 +Block 0000 [125]: 13d87d5f1a2654bf +Block 0000 [126]: aac80c5e2476391a +Block 0000 [127]: e52f1c839b7e7263 +Block 0001 [ 0]: 1945bd92227552e0 +Block 0001 [ 1]: 3fe9fff6337fd477 +Block 0001 [ 2]: a731a2d7c491e874 +Block 0001 [ 3]: 3f9009bc4b0a32d8 +Block 0001 [ 4]: 1d5401dab8c8d9c0 +Block 0001 [ 5]: 430468ea6cf08e6f +Block 0001 [ 6]: 0616282f31428559 +Block 0001 [ 7]: d288d4efb6ad143b +Block 0001 [ 8]: a6b4019d2075bdff +Block 0001 [ 9]: f9ebc4b5f9ce2914 +Block 0001 [ 10]: 5341c6e85c21fca3 +Block 0001 [ 11]: c8ed550770e49a23 +Block 0001 [ 12]: 4627d43a4ac34db1 +Block 0001 [ 13]: 566a676e9510f48b +Block 0001 [ 14]: 78122727319284ab +Block 0001 [ 15]: a978f1042a8863c7 +Block 0001 [ 16]: c83efaf192023550 +Block 0001 [ 17]: 0d28a82f3db7bc03 +Block 0001 [ 18]: 1f8f3377c446ecda +Block 0001 [ 19]: 54d175c08b8d9eda +Block 0001 [ 20]: e0767ab01740a973 +Block 0001 [ 21]: e80f906cfbd20ee5 +Block 0001 [ 22]: faee549cd23e1c39 +Block 0001 [ 23]: 7779da9131534517 +Block 0001 [ 24]: d264688eb5eb4330 +Block 0001 [ 25]: a8afe053886f0bfc +Block 0001 [ 26]: a50b8e2503af3118 +Block 0001 [ 27]: d2d69c9234ecb4f0 +Block 0001 [ 28]: 14be320d2ae7813e +Block 0001 [ 29]: e2fb5f4eeb9dd171 +Block 0001 [ 30]: f8f5deccc87825eb +Block 0001 [ 31]: 582e0e0d97aefade +Block 0001 [ 32]: bd3cfbc46403045e +Block 0001 [ 33]: 0c67956254623ad2 +Block 0001 [ 34]: 5f90bde837bdeaab +Block 0001 [ 35]: d70cda7b6fe733b0 +Block 0001 [ 36]: 56eca4b0ace51877 +Block 0001 [ 37]: d92b6b6f3023fa7c +Block 0001 [ 38]: c21b2b9b865910a6 +Block 0001 [ 39]: 9863c770c0c38e0e +Block 0001 [ 40]: 656751169a661bbd +Block 0001 [ 41]: 97bf4f460e616ee0 +Block 0001 [ 42]: 2f98d464de04bb49 +Block 0001 [ 43]: c13647628f0acb3b +Block 0001 [ 44]: 92a96fa4ca62be7c +Block 0001 [ 45]: 92e69ce54fb41d93 +Block 0001 [ 46]: 06158c62c277c079 +Block 0001 [ 47]: 090f39247ffd50b7 +Block 0001 [ 48]: a0e56ea21f34f0a8 +Block 0001 [ 49]: ed1ef87602a07da6 +Block 0001 [ 50]: 497c9c19f2e34039 +Block 0001 [ 51]: 92f5cdb6e0ffc12b +Block 0001 [ 52]: 22b5b9756f3eef75 +Block 0001 [ 53]: f25efed27d000764 +Block 0001 [ 54]: bf9fb608b6e8e627 +Block 0001 [ 55]: 6cbf05cce0bdaf97 +Block 0001 [ 56]: 123c2a4d0b848602 +Block 0001 [ 57]: 52f9e2d84442b089 +Block 0001 [ 58]: e976ff506e1a80f9 +Block 0001 [ 59]: 8bf09d1b927c2d76 +Block 0001 [ 60]: b87219fd5c8ee8a0 +Block 0001 [ 61]: 713bd1d4eb7d8973 +Block 0001 [ 62]: 8492d5a39e7259ff +Block 0001 [ 63]: 5f5edf1d3c733f98 +Block 0001 [ 64]: 0246a25b84769963 +Block 0001 [ 65]: 286741bf3049d3c8 +Block 0001 [ 66]: 1636132789273cd3 +Block 0001 [ 67]: 9c613f569067aa59 +Block 0001 [ 68]: f5898e3a316a42f6 +Block 0001 [ 69]: 5b4c8006a01b9c06 +Block 0001 [ 70]: 66552db224c38815 +Block 0001 [ 71]: cf9749c91c42aa45 +Block 0001 [ 72]: ce7c98b8f4af9ffc +Block 0001 [ 73]: 68cf6a2b40f09c3b +Block 0001 [ 74]: 0905f46812a05b3f +Block 0001 [ 75]: 015cbead12bc8397 +Block 0001 [ 76]: 6d418c8d90ab5614 +Block 0001 [ 77]: d0b15b9a1ac9d73a +Block 0001 [ 78]: 887a93b384c035c7 +Block 0001 [ 79]: a29bcd852552c96d +Block 0001 [ 80]: 1d05609538a8b284 +Block 0001 [ 81]: 87662540dde6a878 +Block 0001 [ 82]: 6b1ae84769074ea0 +Block 0001 [ 83]: 6fbb58e7443b5f6f +Block 0001 [ 84]: 40fa72222a87e13a +Block 0001 [ 85]: b1e8a120d2800327 +Block 0001 [ 86]: a5476fd807667282 +Block 0001 [ 87]: ba68e2e45c8c0419 +Block 0001 [ 88]: 2e805d7dd9f3e7cd +Block 0001 [ 89]: 6c84b78c64307ecc +Block 0001 [ 90]: 2eaf6655fbf22f5d +Block 0001 [ 91]: 66602192bb412f8a +Block 0001 [ 92]: e34baf74015205ca +Block 0001 [ 93]: 39202b9ffa5c994f +Block 0001 [ 94]: 6d16e568327a9c2f +Block 0001 [ 95]: 085fae46b4269f70 +Block 0001 [ 96]: 999ad58b0a117bc4 +Block 0001 [ 97]: ce15de3d2e5826b8 +Block 0001 [ 98]: c03c2d06ffb5b99f +Block 0001 [ 99]: 84c6ba4f13458353 +Block 0001 [100]: beb6c09a3a5194cc +Block 0001 [101]: 34394fa0ff1091ab +Block 0001 [102]: fa11be98a4e8ee53 +Block 0001 [103]: b62f437abb79b7fe +Block 0001 [104]: 561bff03009cddfd +Block 0001 [105]: 171359698cc75e4a +Block 0001 [106]: 4c24145a2adc9229 +Block 0001 [107]: 8992e622258ef17e +Block 0001 [108]: 3a909d2299d4593e +Block 0001 [109]: c9965a227170be63 +Block 0001 [110]: 17741a4490c4af3c +Block 0001 [111]: 170c431f5463ee9f +Block 0001 [112]: 0df53bf18ea7ce09 +Block 0001 [113]: 4ccd25b38f8839e6 +Block 0001 [114]: b9c84384dadc8dd2 +Block 0001 [115]: e446ab27c623ecba +Block 0001 [116]: c4698296ed168df1 +Block 0001 [117]: ce98040ace2e51f3 +Block 0001 [118]: 2a305189d1de6c40 +Block 0001 [119]: 604bda6551a184dd +Block 0001 [120]: ce73633f7037c144 +Block 0001 [121]: 9e26b774ac1bdeff +Block 0001 [122]: e402d8dc15d6e1f7 +Block 0001 [123]: 72aaab45896934bc +Block 0001 [124]: f3ce458f876b08a7 +Block 0001 [125]: e4cbd63c9cb6522f +Block 0001 [126]: 0b499bbe86150fd8 +Block 0001 [127]: d13c062f33d4c833 +Block 0002 [ 0]: ba91b55bbcc9c44b +Block 0002 [ 1]: ef4e99f999dae035 +Block 0002 [ 2]: d8aa1c505b46ab7d +Block 0002 [ 3]: 161365f459855e5b +Block 0002 [ 4]: b59ce6a7276c0313 +Block 0002 [ 5]: b6bbfbe6c3a4ccd9 +Block 0002 [ 6]: 592972bf9bf98c94 +Block 0002 [ 7]: 5da354b04f15f821 +Block 0002 [ 8]: fa1006fa6a96df9b +Block 0002 [ 9]: 6263146aa513f00d +Block 0002 [ 10]: 0d811087fb7afb0e +Block 0002 [ 11]: 7e6e21016a92a8c2 +Block 0002 [ 12]: 45f09b0f30befd10 +Block 0002 [ 13]: 87a59e630c107ff3 +Block 0002 [ 14]: b723de6f0f63977b +Block 0002 [ 15]: 338d3e44d5e16d0b +Block 0002 [ 16]: 5ef7898fa708e2c4 +Block 0002 [ 17]: a6cbc1bab7a2544f +Block 0002 [ 18]: 8a036c0f36e22fe8 +Block 0002 [ 19]: 7cd77b1a3ad76405 +Block 0002 [ 20]: 07cf084d96f9e8ce +Block 0002 [ 21]: 19eecfa89fd77725 +Block 0002 [ 22]: b0c19b5d40941581 +Block 0002 [ 23]: 827182feebd76922 +Block 0002 [ 24]: 40ee3d84069c3a31 +Block 0002 [ 25]: c0489f64169a76ec +Block 0002 [ 26]: 53c889b64969b287 +Block 0002 [ 27]: adfbbb1914ca4759 +Block 0002 [ 28]: 2ba3aea68b7e970a +Block 0002 [ 29]: ca9d0cb6c1d00d60 +Block 0002 [ 30]: 72a72acc38c1fc7d +Block 0002 [ 31]: f8f027e04b16ade3 +Block 0002 [ 32]: ca75618529c9562b +Block 0002 [ 33]: fb8aff1638783021 +Block 0002 [ 34]: c6d05939d2f83537 +Block 0002 [ 35]: e0e251f3454d020f +Block 0002 [ 36]: c79a6f14d3dd3974 +Block 0002 [ 37]: 6493ede738fab09b +Block 0002 [ 38]: 210487350fa557c0 +Block 0002 [ 39]: d2dcede8fcd00251 +Block 0002 [ 40]: b88578fb1e583c32 +Block 0002 [ 41]: 460f7c6f933a805b +Block 0002 [ 42]: b48a1953360954f3 +Block 0002 [ 43]: c0f9d6d5f451df28 +Block 0002 [ 44]: d89207b92d8f9ba7 +Block 0002 [ 45]: e69a38a67a54f5c8 +Block 0002 [ 46]: 11f75a0109d257db +Block 0002 [ 47]: 19bd04eacdcfaafe +Block 0002 [ 48]: 8d4d532b061fceb1 +Block 0002 [ 49]: a0a79bc1d110c780 +Block 0002 [ 50]: a8e94cac065b310f +Block 0002 [ 51]: 97e43b3770c87ad3 +Block 0002 [ 52]: d0a77f2b7bc888eb +Block 0002 [ 53]: fdf7376f17f6b5e2 +Block 0002 [ 54]: 11f502100246cef9 +Block 0002 [ 55]: ad1a13d0aa5acd01 +Block 0002 [ 56]: d68613c11793b88f +Block 0002 [ 57]: 2ac95bcd120c8c32 +Block 0002 [ 58]: 935adb1cc9b686ab +Block 0002 [ 59]: 2d79c88d33ca29dc +Block 0002 [ 60]: 726453fd936c6ef4 +Block 0002 [ 61]: 990570ccb4919d9e +Block 0002 [ 62]: 69d0b6440d8e3183 +Block 0002 [ 63]: 6712b294bba95869 +Block 0002 [ 64]: 1eb00d8d33b41a7f +Block 0002 [ 65]: 2ee451e9ff0e71b3 +Block 0002 [ 66]: f9ffd27bee51d5b2 +Block 0002 [ 67]: 4d15fc6e5f3e5dae +Block 0002 [ 68]: a6899eff879f2a74 +Block 0002 [ 69]: 0806eb87bbee41a4 +Block 0002 [ 70]: 1c9f8648ec062246 +Block 0002 [ 71]: 56c2b32194d047b3 +Block 0002 [ 72]: 1f1a5896372ccbb6 +Block 0002 [ 73]: 1435a02c33ad89df +Block 0002 [ 74]: 9f938145231a369a +Block 0002 [ 75]: 3d72686ac66459b2 +Block 0002 [ 76]: 2e0222a2f9916308 +Block 0002 [ 77]: 9ed37e9132a8b19a +Block 0002 [ 78]: c24917158db12ce7 +Block 0002 [ 79]: 103588d94fc7757d +Block 0002 [ 80]: 2caf0fe9acf3ec0b +Block 0002 [ 81]: b61c96f3a96426d8 +Block 0002 [ 82]: 05de68a8c3ee42f1 +Block 0002 [ 83]: ec1f82f8af1d903b +Block 0002 [ 84]: 253fadbd87952312 +Block 0002 [ 85]: 1de5945b574001f0 +Block 0002 [ 86]: 03872fb2d6941330 +Block 0002 [ 87]: 32358ba499959926 +Block 0002 [ 88]: 9b28ce180b92a1a7 +Block 0002 [ 89]: a229f2616047a544 +Block 0002 [ 90]: 3c874b9946795967 +Block 0002 [ 91]: b8a26bd8e577f4a9 +Block 0002 [ 92]: e798d879adf569c8 +Block 0002 [ 93]: 6e23b3170dc7a258 +Block 0002 [ 94]: a0076913112ec88f +Block 0002 [ 95]: dda7a83d40ef7d5c +Block 0002 [ 96]: 1611deda81abcac5 +Block 0002 [ 97]: 074ccadbeea42d4a +Block 0002 [ 98]: 6ea2c5707adb8f45 +Block 0002 [ 99]: 80da00c20d4bb11e +Block 0002 [100]: dc96adbec42f44a7 +Block 0002 [101]: 5da32b2f6f13baa0 +Block 0002 [102]: ca8e52f587863a8b +Block 0002 [103]: 865a1d8964d6a636 +Block 0002 [104]: 729c4b71bc3f9ba4 +Block 0002 [105]: 38f394888711ad72 +Block 0002 [106]: 0e091de912e1a945 +Block 0002 [107]: 75ca35d28beaf076 +Block 0002 [108]: 798bdabc47914a36 +Block 0002 [109]: 1cb78eae0084f6e5 +Block 0002 [110]: 869c5d43fac72e43 +Block 0002 [111]: 7124df3e72e5055c +Block 0002 [112]: d9d6dee51ac44d5b +Block 0002 [113]: ef1f60c3aef1eb52 +Block 0002 [114]: deb93e3180de04f2 +Block 0002 [115]: e6f805543d0bce6e +Block 0002 [116]: 894cba70645c746f +Block 0002 [117]: 2fa8dfad858cfb19 +Block 0002 [118]: 43f65744789bd8fa +Block 0002 [119]: c43f4efa7614c598 +Block 0002 [120]: 2aa22dd068fe3e8c +Block 0002 [121]: 9c18388f5b00cbae +Block 0002 [122]: a9105c8405b24c5e +Block 0002 [123]: bae5b6ce43c5a9df +Block 0002 [124]: 0819dc402397abb4 +Block 0002 [125]: ead7908e2e7b1ead +Block 0002 [126]: 7c49e028000bef0a +Block 0002 [127]: 22cd0e710d3607f1 +Block 0003 [ 0]: dcc0ded548f10ae1 +Block 0003 [ 1]: 1d2e18366b7da0ca +Block 0003 [ 2]: e2de5a320056a6c4 +Block 0003 [ 3]: f9462a22af7c11e4 +Block 0003 [ 4]: af27d3d2b8650e71 +Block 0003 [ 5]: 532a58a92dd0f8f2 +Block 0003 [ 6]: b56b0087681d06fe +Block 0003 [ 7]: 78bbf2dd701c058e +Block 0003 [ 8]: 1dbddf25cec077ee +Block 0003 [ 9]: c812af1bdd8e26c6 +Block 0003 [ 10]: 177996cf3f1f819a +Block 0003 [ 11]: 6cd659e433485c29 +Block 0003 [ 12]: ac5ec15d9920127f +Block 0003 [ 13]: facf6ce5cb2d959f +Block 0003 [ 14]: cb487aaf1811e764 +Block 0003 [ 15]: 062071fcb5ffe047 +Block 0003 [ 16]: 71e3503a0e6df8a1 +Block 0003 [ 17]: 24775f27efc9ba78 +Block 0003 [ 18]: c6f1fb1f6b771d35 +Block 0003 [ 19]: 734fd5b47aaa319f +Block 0003 [ 20]: 2d8a40514d0f2027 +Block 0003 [ 21]: 6eb0e0c6562ecbf1 +Block 0003 [ 22]: beb6d3a66bdd7159 +Block 0003 [ 23]: 46d2e4eb9b3e5a34 +Block 0003 [ 24]: dc4c8bce2ca70df5 +Block 0003 [ 25]: 68d7472e72ce3eef +Block 0003 [ 26]: 18c267da346f3dc5 +Block 0003 [ 27]: a3fb91802385fc4d +Block 0003 [ 28]: 16e151f8930c0dc4 +Block 0003 [ 29]: 60585b77a71f4a7b +Block 0003 [ 30]: 620480b715921164 +Block 0003 [ 31]: 4609561ad34203f3 +Block 0003 [ 32]: d6970f63f27ed566 +Block 0003 [ 33]: 2516ff93960c7fe1 +Block 0003 [ 34]: e941af020fbf31c9 +Block 0003 [ 35]: f96d31e5bc2f9316 +Block 0003 [ 36]: 5585f2cbaf1b86af +Block 0003 [ 37]: f64a713997c5e5d0 +Block 0003 [ 38]: 7b32d6946b093c50 +Block 0003 [ 39]: 4b218a214ddc2548 +Block 0003 [ 40]: a679a8e777d60ef9 +Block 0003 [ 41]: dcec0857f3037b8a +Block 0003 [ 42]: 8ecde17ce4c21efb +Block 0003 [ 43]: ac79fed000ea2ced +Block 0003 [ 44]: f7663aeefdc36bed +Block 0003 [ 45]: 70c85d47ef60d769 +Block 0003 [ 46]: b73a6f9aa78acb29 +Block 0003 [ 47]: aaf447cfa5d92a7b +Block 0003 [ 48]: 7643418bfb8a731c +Block 0003 [ 49]: 4ebb46031677c4dc +Block 0003 [ 50]: 94d54d967c54291c +Block 0003 [ 51]: 76828c28b720d958 +Block 0003 [ 52]: c8b1025ca0206cda +Block 0003 [ 53]: 419c457ab3179aa9 +Block 0003 [ 54]: fdb0e83a8981ed63 +Block 0003 [ 55]: a48511be8c943210 +Block 0003 [ 56]: fa4a08568d0b2622 +Block 0003 [ 57]: 5ad1b56c9a8f97a4 +Block 0003 [ 58]: 16eb45c9c3c514c4 +Block 0003 [ 59]: 2735ab930271e048 +Block 0003 [ 60]: 00f8788ccc61d627 +Block 0003 [ 61]: a25d45d035893152 +Block 0003 [ 62]: 17f47f46131f888c +Block 0003 [ 63]: 9743f2b2ff11465f +Block 0003 [ 64]: 61f750aaf9c5026d +Block 0003 [ 65]: df0f25aaf5b74f1a +Block 0003 [ 66]: 0547223f8179b53a +Block 0003 [ 67]: a6a8dcabb1b433fb +Block 0003 [ 68]: 8a7e4041f55d8df2 +Block 0003 [ 69]: 76b1422ea39d47ef +Block 0003 [ 70]: 7c079885eddc7b66 +Block 0003 [ 71]: e3caf2a31d4946b6 +Block 0003 [ 72]: 09feca87c0fb72aa +Block 0003 [ 73]: e23465b2f7e56deb +Block 0003 [ 74]: ace65aeef77d812a +Block 0003 [ 75]: 8a8b2c97e8d229ba +Block 0003 [ 76]: f300a0a7f213a50c +Block 0003 [ 77]: 714bd30614b4bf2b +Block 0003 [ 78]: 38e78a67080d973c +Block 0003 [ 79]: c44ffe682b0b92e1 +Block 0003 [ 80]: 0a0dc7ad40a8cb31 +Block 0003 [ 81]: 328ad7a9c6aa3b94 +Block 0003 [ 82]: 722f8491e660bf19 +Block 0003 [ 83]: a947d1a8682da13f +Block 0003 [ 84]: 6625e609734bda42 +Block 0003 [ 85]: 374f7df0f39cac38 +Block 0003 [ 86]: 23118aea1aea8558 +Block 0003 [ 87]: 795944fa000fc32e +Block 0003 [ 88]: 5c0cc56ec4d36876 +Block 0003 [ 89]: b9a1a09c507a2f15 +Block 0003 [ 90]: a557c2b1be1df79f +Block 0003 [ 91]: b9b900f964885aee +Block 0003 [ 92]: 70d410b5dccc0cb6 +Block 0003 [ 93]: 2dfbdfb73da5cd7b +Block 0003 [ 94]: d64cb3edc647361e +Block 0003 [ 95]: e77cb0e072deb80b +Block 0003 [ 96]: 14b3f216a2e67b3d +Block 0003 [ 97]: 574fc539722db295 +Block 0003 [ 98]: 7a16f80eca5e7e11 +Block 0003 [ 99]: 76c8fea99b70aaa6 +Block 0003 [100]: fe0300268d802b45 +Block 0003 [101]: 86035e342b596a22 +Block 0003 [102]: eb5b48ad2d79cf70 +Block 0003 [103]: 424330100a9bc87c +Block 0003 [104]: d3ae2fa20e07bd7e +Block 0003 [105]: 357f0e5a5ebca41f +Block 0003 [106]: 4c86d4b417f49e3d +Block 0003 [107]: 86b060563b328b08 +Block 0003 [108]: 98e9754e35c1b4b6 +Block 0003 [109]: 8a4916af20b73399 +Block 0003 [110]: 63b6ca9dbe064f8b +Block 0003 [111]: 1ce064c5c3257af6 +Block 0003 [112]: c5ddc58ad0d6c4f3 +Block 0003 [113]: a06a361f0a442eef +Block 0003 [114]: 79256fae0347e4fe +Block 0003 [115]: 4fa9aef5835679ba +Block 0003 [116]: f0a58f6646413011 +Block 0003 [117]: 46b532af9df91ac9 +Block 0003 [118]: 1280b739029c7543 +Block 0003 [119]: 5d88e4ea2058889f +Block 0003 [120]: 3719c1706570dec9 +Block 0003 [121]: afa81e2d57d77489 +Block 0003 [122]: 18b3b64205efae40 +Block 0003 [123]: ee5fa7f06db1a8f7 +Block 0003 [124]: 83688896c9a489c7 +Block 0003 [125]: d9b1bbde14d95efe +Block 0003 [126]: f2259de115d64f0f +Block 0003 [127]: 710ec82f945eaadf +Block 0004 [ 0]: ea1fe2ab7a7036b2 +Block 0004 [ 1]: 85c6477a85f91236 +Block 0004 [ 2]: 05c5a08666d2931b +Block 0004 [ 3]: 41a7c68f43da7c7d +Block 0004 [ 4]: 0defb4961f1694da +Block 0004 [ 5]: d0304b7d3063a446 +Block 0004 [ 6]: 8c46ea68904e29d3 +Block 0004 [ 7]: d38da6c07cacb5ce +Block 0004 [ 8]: a603b0c600e9f236 +Block 0004 [ 9]: 5fc25b4c401b835c +Block 0004 [ 10]: 9bb577e3984fe6f9 +Block 0004 [ 11]: 021984c7e342b9e3 +Block 0004 [ 12]: cba1d5481629e4cf +Block 0004 [ 13]: 43fc94ea9a713a11 +Block 0004 [ 14]: e6af00ea4d897083 +Block 0004 [ 15]: b401ed470c0e1a4f +Block 0004 [ 16]: 231856f0c98b75b5 +Block 0004 [ 17]: 509380f041608001 +Block 0004 [ 18]: 7ddb7b55c3f7a32c +Block 0004 [ 19]: ab538267f69eb583 +Block 0004 [ 20]: fbc7aefaa0564964 +Block 0004 [ 21]: 7f158c8a60784aeb +Block 0004 [ 22]: 4648999ce4911e3c +Block 0004 [ 23]: 980beec1366efcba +Block 0004 [ 24]: 8759ff4a7082eae0 +Block 0004 [ 25]: 18a37bc4e3593613 +Block 0004 [ 26]: 9e0c3ab54634e89f +Block 0004 [ 27]: 0756ddc71ba6e41b +Block 0004 [ 28]: ce331883216a9055 +Block 0004 [ 29]: cbb90e3c5d30711c +Block 0004 [ 30]: 4a3391e02cb7e881 +Block 0004 [ 31]: 6b3a78414d4ab4df +Block 0004 [ 32]: 499ad48ed83fc044 +Block 0004 [ 33]: 72a9b10916d398c3 +Block 0004 [ 34]: ae72073814b44109 +Block 0004 [ 35]: bee50180bc61074a +Block 0004 [ 36]: 1690a81ebd7559d0 +Block 0004 [ 37]: 71085e55a036400a +Block 0004 [ 38]: 92fe8eec29736019 +Block 0004 [ 39]: cf735a813a92080a +Block 0004 [ 40]: 88252967ae06ad1b +Block 0004 [ 41]: 4150b41ba673b2e1 +Block 0004 [ 42]: 6889e1a8078d6d67 +Block 0004 [ 43]: dcebc07ddf63aba6 +Block 0004 [ 44]: e22b522bae7679fc +Block 0004 [ 45]: 52fc15ac981c648b +Block 0004 [ 46]: 4802cdc7906fe4cf +Block 0004 [ 47]: 19d42d9ff6b6d21a +Block 0004 [ 48]: 5ca85a0807f9dd5e +Block 0004 [ 49]: 8f48ad6e6ee76c50 +Block 0004 [ 50]: e2a894bc918e6f69 +Block 0004 [ 51]: d1fffa8c4c48fde2 +Block 0004 [ 52]: e627611dfdfb333f +Block 0004 [ 53]: c6c349ab4fdbc238 +Block 0004 [ 54]: 7da9f80b464ef8ea +Block 0004 [ 55]: 067d55581ee7e3c2 +Block 0004 [ 56]: fbe9b0ee4bf31aaf +Block 0004 [ 57]: a44b7b7efdd0e193 +Block 0004 [ 58]: 5e0db34b73b8ef2b +Block 0004 [ 59]: 88c8f30f1acc503e +Block 0004 [ 60]: e2cac47ce0fb4347 +Block 0004 [ 61]: a16f6d7841887932 +Block 0004 [ 62]: 219778816b0aa3f8 +Block 0004 [ 63]: a932db70e4feb4f4 +Block 0004 [ 64]: 075c7ef6126bc9a3 +Block 0004 [ 65]: 08245933a277dbe1 +Block 0004 [ 66]: eda3c6f55d8dec61 +Block 0004 [ 67]: c5e72f83f91d9ef0 +Block 0004 [ 68]: e6d401a4acb97d8f +Block 0004 [ 69]: f499338f8e2a6f25 +Block 0004 [ 70]: 5725ea1e9a7c9a40 +Block 0004 [ 71]: 78015cf40fd43146 +Block 0004 [ 72]: 8e53780ce8cc04b9 +Block 0004 [ 73]: 1a1c458d1d05af9e +Block 0004 [ 74]: 7a576ff157948c64 +Block 0004 [ 75]: 7c9f6f165d136062 +Block 0004 [ 76]: a038ea9b75a1f436 +Block 0004 [ 77]: 858043a7ad2aa121 +Block 0004 [ 78]: bfc610d9724d4325 +Block 0004 [ 79]: 659d18f29c4f7995 +Block 0004 [ 80]: 18049b3c80c77175 +Block 0004 [ 81]: 8060c37bc1f03a74 +Block 0004 [ 82]: bbc7c274ecf6a8d6 +Block 0004 [ 83]: a487c7e4734d3b39 +Block 0004 [ 84]: 681167693061d9a7 +Block 0004 [ 85]: ff6f7a17112ffb87 +Block 0004 [ 86]: 83df04decd05742a +Block 0004 [ 87]: 086f57c9ffc40003 +Block 0004 [ 88]: d9e31cb73edac6e7 +Block 0004 [ 89]: 93a8cf45366a874c +Block 0004 [ 90]: cee20eb0ca470904 +Block 0004 [ 91]: e7e0ace92d9b3d61 +Block 0004 [ 92]: b3ae86ff91d9f0fb +Block 0004 [ 93]: 6f227e57ae9e4c80 +Block 0004 [ 94]: 8a01ab3a4678eb6f +Block 0004 [ 95]: 80da3c6a719c0209 +Block 0004 [ 96]: a91c8edea57913af +Block 0004 [ 97]: ea6ab28a0e2f37f7 +Block 0004 [ 98]: 3f795b47ebeead2a +Block 0004 [ 99]: 5e1505078f12cff1 +Block 0004 [100]: ecba75be892e25ef +Block 0004 [101]: 6d3feef41567ae8a +Block 0004 [102]: 4517a0804df1ecc0 +Block 0004 [103]: 58bc996afd6c0712 +Block 0004 [104]: ba12c78acd45132e +Block 0004 [105]: 7ee89654818197a7 +Block 0004 [106]: 514ecbc9845bd37c +Block 0004 [107]: 11d29359991ee6ff +Block 0004 [108]: fe713242d737c3a3 +Block 0004 [109]: 32f84914ce2fdaf9 +Block 0004 [110]: 974ecb6b51e80ae7 +Block 0004 [111]: ed9c92603ca0e403 +Block 0004 [112]: a5058b1cdf5edd52 +Block 0004 [113]: 45ad7579118ccbfd +Block 0004 [114]: 964fc1432cf81d8e +Block 0004 [115]: a862bd5e512696af +Block 0004 [116]: 9b49f72e01622b4c +Block 0004 [117]: e72a25dad57c482a +Block 0004 [118]: 61e0eba167cca8f9 +Block 0004 [119]: 366294652d3cf919 +Block 0004 [120]: 5e58ea40ddbd5196 +Block 0004 [121]: 8aa2db0a693790b2 +Block 0004 [122]: c31566392c57c1ec +Block 0004 [123]: 8394c122b6d01178 +Block 0004 [124]: fb42ac99a450a533 +Block 0004 [125]: e6a9cff5060f1e82 +Block 0004 [126]: 60e2a713bde568b6 +Block 0004 [127]: 83e1282e71de5848 +Block 0005 [ 0]: c8a00942e6fab217 +Block 0005 [ 1]: 5f3900cc396002cb +Block 0005 [ 2]: c2098b6274dcc746 +Block 0005 [ 3]: 663ce4aa4874678f +Block 0005 [ 4]: 5792103890802ed5 +Block 0005 [ 5]: 93fa06bdc66fe195 +Block 0005 [ 6]: e0d6c790decb7cc5 +Block 0005 [ 7]: 0a81879d52836a92 +Block 0005 [ 8]: 0e52d7de3cde3cbb +Block 0005 [ 9]: 105ff6f967a4f460 +Block 0005 [ 10]: 40c3229e477af434 +Block 0005 [ 11]: b3c5128c5940310f +Block 0005 [ 12]: 139836a039ff17fd +Block 0005 [ 13]: bc1bf0e49c651fa7 +Block 0005 [ 14]: f1d26434c506cc0c +Block 0005 [ 15]: 0b02fbf0a0471f31 +Block 0005 [ 16]: 4ccdacb55b294a21 +Block 0005 [ 17]: 1ee8df23ccf5342a +Block 0005 [ 18]: 0e9456d3e7903d56 +Block 0005 [ 19]: b3f6794f08b15886 +Block 0005 [ 20]: fd65389bd69c17e2 +Block 0005 [ 21]: 9c26848be1617f55 +Block 0005 [ 22]: 78bc8f5c4a21097d +Block 0005 [ 23]: ff93a642f914134b +Block 0005 [ 24]: 39ea6e448d04d4ea +Block 0005 [ 25]: 708148a8d39a0745 +Block 0005 [ 26]: 0fbf4da1da80b844 +Block 0005 [ 27]: 61ae114a155d5ae4 +Block 0005 [ 28]: 0ef079afd2959963 +Block 0005 [ 29]: 54abcd41a84c0a5c +Block 0005 [ 30]: 9db495b2a6f908f3 +Block 0005 [ 31]: 9ce42afa31af3158 +Block 0005 [ 32]: 1eade628e9b7172c +Block 0005 [ 33]: 3439ac345c0e50f9 +Block 0005 [ 34]: 53d4b4a87da6c3cb +Block 0005 [ 35]: be412590435a41b3 +Block 0005 [ 36]: 2b72d2c74275ca6c +Block 0005 [ 37]: 64bdba533fc452f6 +Block 0005 [ 38]: 6b78aef20e0afdda +Block 0005 [ 39]: 0676838cbbf73829 +Block 0005 [ 40]: 78b240089f718c68 +Block 0005 [ 41]: 0a6bcb165c8ca245 +Block 0005 [ 42]: 5cbfbf1a7b7ceb7b +Block 0005 [ 43]: 1f5b4c47ce730d9d +Block 0005 [ 44]: 029cee169ab2033f +Block 0005 [ 45]: 4bf62feafb239c79 +Block 0005 [ 46]: ecb412518681a909 +Block 0005 [ 47]: 3aa3bb1e4f34c2fa +Block 0005 [ 48]: 27cc3db9b21b7193 +Block 0005 [ 49]: 189d495529dc5853 +Block 0005 [ 50]: 1b96e2533620e1ca +Block 0005 [ 51]: 00caee4e87e09b8a +Block 0005 [ 52]: 473818a7322b984c +Block 0005 [ 53]: 4edd73d65bbc1721 +Block 0005 [ 54]: 0ffede59ded70af0 +Block 0005 [ 55]: 49dc058fd59587bf +Block 0005 [ 56]: e86b8c9fc4e64fd7 +Block 0005 [ 57]: 16bb898549ee3a82 +Block 0005 [ 58]: 1f858fcea6c3cb44 +Block 0005 [ 59]: 56b71eaac6ded63a +Block 0005 [ 60]: 5d1be7993b9e5d43 +Block 0005 [ 61]: 6eea32343ea4be5b +Block 0005 [ 62]: 7a8a3e23abafbd1e +Block 0005 [ 63]: db0a8eff9415fab7 +Block 0005 [ 64]: 514e5db61cedb6bc +Block 0005 [ 65]: fa2f4ddb28d56882 +Block 0005 [ 66]: 9eb643cf6be83890 +Block 0005 [ 67]: 9ef39e62be287dad +Block 0005 [ 68]: 114a029159dd0e77 +Block 0005 [ 69]: c3c6258532250025 +Block 0005 [ 70]: 182987e1a9f9c56f +Block 0005 [ 71]: 7ae2aa48e9595ccb +Block 0005 [ 72]: c5b4a0f5c6297318 +Block 0005 [ 73]: 76b5455e463ac9b6 +Block 0005 [ 74]: abbdb2271a03b410 +Block 0005 [ 75]: 77d3c85d31fb0a50 +Block 0005 [ 76]: 4b37d5a3a36b5c2f +Block 0005 [ 77]: 45e4cb2d76d87e68 +Block 0005 [ 78]: 9da1636691c616a0 +Block 0005 [ 79]: d9f77c6c249f650e +Block 0005 [ 80]: 72d7afbfe8262971 +Block 0005 [ 81]: 3b35df52da5feabe +Block 0005 [ 82]: 7696b93b21273e02 +Block 0005 [ 83]: db4fc3efd9e8c0b5 +Block 0005 [ 84]: 78fb9a87cfc22f47 +Block 0005 [ 85]: 95dfe8b7f66af8ce +Block 0005 [ 86]: a489ea3ec00d689e +Block 0005 [ 87]: 7b428b52d1e5a706 +Block 0005 [ 88]: 1dc435d48476bbae +Block 0005 [ 89]: 9601f814fd53536f +Block 0005 [ 90]: ddc3b64730bb0dd6 +Block 0005 [ 91]: d5f14040203b4b69 +Block 0005 [ 92]: a35b17db080c898a +Block 0005 [ 93]: 9a42d2cc0cabd88d +Block 0005 [ 94]: d2ad2bc6b4cc79fd +Block 0005 [ 95]: 5a438d9a2d8060e7 +Block 0005 [ 96]: 19c6a90f24108aeb +Block 0005 [ 97]: a67eb012ba11cd90 +Block 0005 [ 98]: a6a96f8cebd4ad0d +Block 0005 [ 99]: e14f7c290a284bc1 +Block 0005 [100]: 7a08c29453764b2d +Block 0005 [101]: d06f68f4751b5e34 +Block 0005 [102]: 8e80c5dbbaf8ffe8 +Block 0005 [103]: 6b1e41c36c114373 +Block 0005 [104]: 49d830c4906de0fe +Block 0005 [105]: b0ee513791cad520 +Block 0005 [106]: ab9e60e0968d3a0a +Block 0005 [107]: 2284da3cb1f7c309 +Block 0005 [108]: 17a689e78674644d +Block 0005 [109]: bd9e41f8e2f85fce +Block 0005 [110]: 1c98dec77ed6cfc7 +Block 0005 [111]: 69f9539b6e1938cc +Block 0005 [112]: 2413ed5967171c23 +Block 0005 [113]: f52bb67788b17c5d +Block 0005 [114]: 9c58d36c1a0e4d9c +Block 0005 [115]: 986158f9bc6da22a +Block 0005 [116]: 6668746a8ab7701f +Block 0005 [117]: 395c1277a648bfcd +Block 0005 [118]: aa1f79834a1cd936 +Block 0005 [119]: d8888d13fd202ad5 +Block 0005 [120]: 925e9a3c90e002ca +Block 0005 [121]: fd773ff418bfd642 +Block 0005 [122]: 30253479ba10d167 +Block 0005 [123]: 90075643c6a2cdb3 +Block 0005 [124]: 65ce7cd429906ce3 +Block 0005 [125]: d045c0f7cc934b3a +Block 0005 [126]: 15610c6b2e28b0ff +Block 0005 [127]: 4e39efce679d8906 +Block 0006 [ 0]: 1e325ed2212387d1 +Block 0006 [ 1]: 3d0e385b3df2f34c +Block 0006 [ 2]: f5e9da41d473a50c +Block 0006 [ 3]: 6c41f75b09633114 +Block 0006 [ 4]: e5c40b0a5c3c3d3c +Block 0006 [ 5]: 70390c2060d02d5b +Block 0006 [ 6]: 13cfcc8f3a87a4e8 +Block 0006 [ 7]: 694cc08eb1cc357a +Block 0006 [ 8]: 066bd7778e34c240 +Block 0006 [ 9]: 02546d4e08d48cf1 +Block 0006 [ 10]: 667ac555c19f4fd9 +Block 0006 [ 11]: e2f0f49161bba1a1 +Block 0006 [ 12]: 46bcd9c803861439 +Block 0006 [ 13]: 6cf465b0d8236f95 +Block 0006 [ 14]: 12ace71d5959aad3 +Block 0006 [ 15]: aeeb352782be85af +Block 0006 [ 16]: 5a021e2205f64f63 +Block 0006 [ 17]: 3fbdb9434dc71254 +Block 0006 [ 18]: 8234a650879d7645 +Block 0006 [ 19]: 070f81fae6f2be5a +Block 0006 [ 20]: 1fd9b2c5f14d41d4 +Block 0006 [ 21]: 159455a467f28d58 +Block 0006 [ 22]: a0bddae8748dcd60 +Block 0006 [ 23]: 343aded618ecffcd +Block 0006 [ 24]: 97bff7d40fdcab71 +Block 0006 [ 25]: 32dc2e9bd0365fd1 +Block 0006 [ 26]: 4aa3dc7bb9c27451 +Block 0006 [ 27]: be3c25443096c335 +Block 0006 [ 28]: d73fae835d16832f +Block 0006 [ 29]: 82c5fe5db9b50422 +Block 0006 [ 30]: 5c822dec966da5d9 +Block 0006 [ 31]: d3cd392b9ce27b79 +Block 0006 [ 32]: c8baed6dabb7aef4 +Block 0006 [ 33]: 048770c6881afd15 +Block 0006 [ 34]: f122e8cfe8f76764 +Block 0006 [ 35]: 107168691e3f9738 +Block 0006 [ 36]: d65b69f4799b6db0 +Block 0006 [ 37]: 974445327044eebc +Block 0006 [ 38]: 50467387ff2d4696 +Block 0006 [ 39]: 838c29b0b0d34e28 +Block 0006 [ 40]: 436cd94c81c96b56 +Block 0006 [ 41]: 996ab1aa9f53b25c +Block 0006 [ 42]: cb76b9da4e401489 +Block 0006 [ 43]: 1f63bf42233b63ca +Block 0006 [ 44]: 6f123ceaa4ead5c6 +Block 0006 [ 45]: 2f4c070f4618f760 +Block 0006 [ 46]: 97ab4ea49e241fc4 +Block 0006 [ 47]: 37801e0034f0c0dd +Block 0006 [ 48]: b7161fda13bcd2da +Block 0006 [ 49]: ebe6cbe0e9b75f52 +Block 0006 [ 50]: b1ceca181c16a480 +Block 0006 [ 51]: e806183b1bf6b766 +Block 0006 [ 52]: 5880a473e2ac3d17 +Block 0006 [ 53]: 68c7e161cddca8ef +Block 0006 [ 54]: 21ce049e22ee28e4 +Block 0006 [ 55]: 94a98f294503b9b2 +Block 0006 [ 56]: 0f193763b7ad5b27 +Block 0006 [ 57]: 2d0702f236454417 +Block 0006 [ 58]: d40d19c0290b48bf +Block 0006 [ 59]: 42e5ab63638e87ad +Block 0006 [ 60]: 18120e37f9af0de5 +Block 0006 [ 61]: 14c510336c1373d1 +Block 0006 [ 62]: c6407562b0bbf1b9 +Block 0006 [ 63]: f1c2f7fa6181d9dd +Block 0006 [ 64]: bae064f2705158b4 +Block 0006 [ 65]: fcdc22a1aad7bf8c +Block 0006 [ 66]: b4f7dfd2a6ef95f8 +Block 0006 [ 67]: 15da42f7b3828d9e +Block 0006 [ 68]: 63861e4623edd926 +Block 0006 [ 69]: 0c9fb5d206786c38 +Block 0006 [ 70]: cc9197e49df2d79c +Block 0006 [ 71]: dd7237d89fb311e2 +Block 0006 [ 72]: b18667c1f5f22fd1 +Block 0006 [ 73]: 36a6df076e50f7fc +Block 0006 [ 74]: 3aabee6b302d1288 +Block 0006 [ 75]: 8892f49ba624e8fe +Block 0006 [ 76]: 4a2ced3a274ec188 +Block 0006 [ 77]: 187f7da5461e9b81 +Block 0006 [ 78]: fac3f4ca90050a52 +Block 0006 [ 79]: 2ffd193f6716cdef +Block 0006 [ 80]: 11cc9006d842b575 +Block 0006 [ 81]: e44268924819c35c +Block 0006 [ 82]: 725257733df64b91 +Block 0006 [ 83]: f7fdb2b0649f4a80 +Block 0006 [ 84]: 9087d12ba4d0c2bd +Block 0006 [ 85]: a494ade254d09b36 +Block 0006 [ 86]: 7ec3b1fc9e451974 +Block 0006 [ 87]: accba2d0e221af9c +Block 0006 [ 88]: c519f5c987806dc3 +Block 0006 [ 89]: 2f010a3439a00b8c +Block 0006 [ 90]: d48826af110704a7 +Block 0006 [ 91]: 5232aad8b79c6af4 +Block 0006 [ 92]: ca5d0256e2b35d0b +Block 0006 [ 93]: 10c295f5c2e46f19 +Block 0006 [ 94]: 8281197973bb9bb4 +Block 0006 [ 95]: df9f65ae49b5f93c +Block 0006 [ 96]: 7dfe5b4fa339d915 +Block 0006 [ 97]: 7965a0eafe0305bc +Block 0006 [ 98]: 7e734063819b7ca5 +Block 0006 [ 99]: 87005587175739ed +Block 0006 [100]: 985b7218bbd1e0df +Block 0006 [101]: a5c4aaad731e9e52 +Block 0006 [102]: 94f8576241e6a93e +Block 0006 [103]: e76117d948600c60 +Block 0006 [104]: 5fe8da4b25406121 +Block 0006 [105]: 14ee0178a8daba6b +Block 0006 [106]: 53226d7eab9099d9 +Block 0006 [107]: 9e6a09e237cff17f +Block 0006 [108]: bc7879f71ef775a9 +Block 0006 [109]: 04e5eb3b91e265d2 +Block 0006 [110]: dcfc2adf3b5553b6 +Block 0006 [111]: 7e4063b07d077a2f +Block 0006 [112]: fee54d9875bceac1 +Block 0006 [113]: c100d4e93dd98cca +Block 0006 [114]: 89f574f2e045e6ee +Block 0006 [115]: 03ed7984ab4ab699 +Block 0006 [116]: edb7c889baea7dce +Block 0006 [117]: 6b8250649f5b1668 +Block 0006 [118]: d41c7ee32201babf +Block 0006 [119]: d2922482c1e04578 +Block 0006 [120]: fcf0c6413ae4722b +Block 0006 [121]: b3b784a4c136f5c6 +Block 0006 [122]: 24e170a067979de6 +Block 0006 [123]: 4ef268adf91d6949 +Block 0006 [124]: 491e4adbc870f18b +Block 0006 [125]: e71f2fb4840b8c21 +Block 0006 [126]: bb0f5afaa1613284 +Block 0006 [127]: 4dd594b381688dc7 +Block 0007 [ 0]: 02054cdda9ac52e9 +Block 0007 [ 1]: 74c8c9e85b5e02f4 +Block 0007 [ 2]: 792716474cd648e9 +Block 0007 [ 3]: f6823e73b2025209 +Block 0007 [ 4]: abc2801a85f23f90 +Block 0007 [ 5]: fd6a18603579e622 +Block 0007 [ 6]: 0796b3f23d0f0cbb +Block 0007 [ 7]: af154a25aeb75835 +Block 0007 [ 8]: 172767f4ab83b39c +Block 0007 [ 9]: 1820af02c9f8c438 +Block 0007 [ 10]: 71b304192b469ba4 +Block 0007 [ 11]: 0733625d1f0b07ae +Block 0007 [ 12]: 5f3fb92e7b81e28f +Block 0007 [ 13]: 7f51f85692c08278 +Block 0007 [ 14]: e04d383c8d9e3cb4 +Block 0007 [ 15]: a808e2901eda05e8 +Block 0007 [ 16]: 95d18dffcd956e3f +Block 0007 [ 17]: c495bf92cc1eb2c3 +Block 0007 [ 18]: e4b5068e15c6237d +Block 0007 [ 19]: 038ebdd28a2f5e1f +Block 0007 [ 20]: e8a78fec794b374f +Block 0007 [ 21]: 49cf5128ad356c6c +Block 0007 [ 22]: 3a81503f52bb1d32 +Block 0007 [ 23]: b5e7a0c5e054f041 +Block 0007 [ 24]: f03d87e4f633fea8 +Block 0007 [ 25]: 35c905a45ed6f147 +Block 0007 [ 26]: 778b682178f753b0 +Block 0007 [ 27]: c11bd927fa19d8bf +Block 0007 [ 28]: 6f55f1e70164debb +Block 0007 [ 29]: 5b25d7d0ebae2719 +Block 0007 [ 30]: 4334711eeb4e61f0 +Block 0007 [ 31]: 8f25b6e85f26f5a5 +Block 0007 [ 32]: 99a59b735700c91c +Block 0007 [ 33]: ecbde758ee3d44a9 +Block 0007 [ 34]: 8beb7e8b0796896e +Block 0007 [ 35]: c776e92c6eace265 +Block 0007 [ 36]: 7b482447cdbb7923 +Block 0007 [ 37]: d066cf62481bd85d +Block 0007 [ 38]: 3760107b555f164d +Block 0007 [ 39]: bd2ed42b3469118a +Block 0007 [ 40]: b3b93ec089fa9570 +Block 0007 [ 41]: a3b83ac726cebc90 +Block 0007 [ 42]: f5a5f6ba7520d94c +Block 0007 [ 43]: 669acf3b099d0044 +Block 0007 [ 44]: 0c17fbece76f2cdb +Block 0007 [ 45]: 20c269cc5957f277 +Block 0007 [ 46]: 1cedb1bdfe8fd7b5 +Block 0007 [ 47]: 668576fe733972f0 +Block 0007 [ 48]: eb8ecef9caa76a30 +Block 0007 [ 49]: 545f45145682a434 +Block 0007 [ 50]: fd6d43e9e4053104 +Block 0007 [ 51]: 191be545a61fa7f5 +Block 0007 [ 52]: f55a49467b6d56bc +Block 0007 [ 53]: d16adb69a1271e48 +Block 0007 [ 54]: 135a7ad9f44cf075 +Block 0007 [ 55]: a6ee7d2c5de58c94 +Block 0007 [ 56]: 30629407d7baf044 +Block 0007 [ 57]: fd609a1f539a7ded +Block 0007 [ 58]: b2bd283aa38b095c +Block 0007 [ 59]: 63d7c3ebc0d760eb +Block 0007 [ 60]: f5985ffcbfdd3499 +Block 0007 [ 61]: aaf55572963fba6e +Block 0007 [ 62]: 3c9832957188c10e +Block 0007 [ 63]: c68df92e57b25f71 +Block 0007 [ 64]: 919fba1782add59b +Block 0007 [ 65]: 0af703d15bdafd30 +Block 0007 [ 66]: 56af9ba05fb32915 +Block 0007 [ 67]: 69504d9eef0b609e +Block 0007 [ 68]: 2c56d65a473495d7 +Block 0007 [ 69]: b799808d50d74b7e +Block 0007 [ 70]: 40face41b3f9b58b +Block 0007 [ 71]: 68f24c272359346d +Block 0007 [ 72]: 43371f1865cf7c3d +Block 0007 [ 73]: 94bbb9681e012ca5 +Block 0007 [ 74]: 99cf6f595e669bcd +Block 0007 [ 75]: b4eb393b2032bf37 +Block 0007 [ 76]: 2a609a846f0b45d1 +Block 0007 [ 77]: 00d3614b72e4e9e4 +Block 0007 [ 78]: 687d33b89c4af490 +Block 0007 [ 79]: 03801094658884a6 +Block 0007 [ 80]: aeac1d0951d7ac95 +Block 0007 [ 81]: 515de863fd8c5ae2 +Block 0007 [ 82]: e0b567e683019ee6 +Block 0007 [ 83]: 158ad01affa22539 +Block 0007 [ 84]: 80198398eadd3d4d +Block 0007 [ 85]: 30d23f755c4bdd55 +Block 0007 [ 86]: 707473e977a255b8 +Block 0007 [ 87]: ab3bf25f1921ebc9 +Block 0007 [ 88]: 87714bfba3c105bc +Block 0007 [ 89]: 07801fab91f7ead0 +Block 0007 [ 90]: e7a2ab5b12011c2e +Block 0007 [ 91]: 985187b1fe217d3a +Block 0007 [ 92]: 3c06fe12f45194c0 +Block 0007 [ 93]: 906b2d6ae3e5d42a +Block 0007 [ 94]: 7b4da55d949793fa +Block 0007 [ 95]: 496565ae57757dc3 +Block 0007 [ 96]: 2464c2638aa0dae9 +Block 0007 [ 97]: be41ced962625b10 +Block 0007 [ 98]: 1c0785d7518b9398 +Block 0007 [ 99]: 5621b3bde815f5fc +Block 0007 [100]: a24047d86c344073 +Block 0007 [101]: 440ec2f91f946f60 +Block 0007 [102]: c96a0decfc8fa5f7 +Block 0007 [103]: d1b64811d448ba49 +Block 0007 [104]: 48cb56cbd461f112 +Block 0007 [105]: 418a7ecf1da71421 +Block 0007 [106]: 0fc7bb85c55dde6f +Block 0007 [107]: 3e69bb8a9a749ec4 +Block 0007 [108]: 2cd764dd85558988 +Block 0007 [109]: 086a9a71dcc47efc +Block 0007 [110]: 8c633ed6465c6cb1 +Block 0007 [111]: aef902ed6cf036c7 +Block 0007 [112]: 435cd6832c6e226f +Block 0007 [113]: cf6da02414411184 +Block 0007 [114]: 3ac15ddfa8ccaf45 +Block 0007 [115]: 9bedcfc4d61d8144 +Block 0007 [116]: 9cfdb2843dec6e4c +Block 0007 [117]: 3789d674e283e722 +Block 0007 [118]: 7df19105095e5bba +Block 0007 [119]: 4838d5ba7017a5f2 +Block 0007 [120]: ecde583dff0051d7 +Block 0007 [121]: 39956b97b9fa4c14 +Block 0007 [122]: 5ea6bf784ecb1b42 +Block 0007 [123]: 198f7d4505405412 +Block 0007 [124]: 01bcf2435403b8f6 +Block 0007 [125]: e448fd363f0771ea +Block 0007 [126]: f2398b53dd97db61 +Block 0007 [127]: 54ff44b6be8d86a7 +Block 0008 [ 0]: 00ddd74226547ee8 +Block 0008 [ 1]: 24159266aff1280e +Block 0008 [ 2]: 8eadb32d57990290 +Block 0008 [ 3]: cf1b40ac0c8a5c8c +Block 0008 [ 4]: b7cf03c731e5b992 +Block 0008 [ 5]: f2dac041171f38bb +Block 0008 [ 6]: 69076dcccfb46ea3 +Block 0008 [ 7]: 5651dbed1100bfde +Block 0008 [ 8]: 53dceb417238cbc1 +Block 0008 [ 9]: 0b0744892b164cf3 +Block 0008 [ 10]: e35a3105fb950399 +Block 0008 [ 11]: 0dd91d7e71c2183e +Block 0008 [ 12]: 612d867f2effaab8 +Block 0008 [ 13]: 3080d3b0f71bb081 +Block 0008 [ 14]: 6d2bd684c1b15ede +Block 0008 [ 15]: 38420dfdc7bde3a5 +Block 0008 [ 16]: 509a5aec595434ae +Block 0008 [ 17]: 8fe411bf400f0853 +Block 0008 [ 18]: a4e7ef66ee576adf +Block 0008 [ 19]: f95c6ca90cfe8c0d +Block 0008 [ 20]: b8293e4db0f1ab2c +Block 0008 [ 21]: 92415d9ceeb88885 +Block 0008 [ 22]: 33201e020f8f673d +Block 0008 [ 23]: 225de785d2ad17bb +Block 0008 [ 24]: eb51e2cddb968254 +Block 0008 [ 25]: abcedb7f11da17d2 +Block 0008 [ 26]: 048be2d856275271 +Block 0008 [ 27]: 81c4b42d8e334881 +Block 0008 [ 28]: 20f23fba874aa617 +Block 0008 [ 29]: 554d738888d0c78a +Block 0008 [ 30]: 1e04ac9bdd6e31f2 +Block 0008 [ 31]: aa1eb35d3815a484 +Block 0008 [ 32]: 462c5af1abcc9cff +Block 0008 [ 33]: 57e47b4ef3f56bce +Block 0008 [ 34]: 91fd0882fb9f93ee +Block 0008 [ 35]: 75d4d9890062a2ae +Block 0008 [ 36]: 35d3aaaecdca0d36 +Block 0008 [ 37]: b20cb6d0461d42e2 +Block 0008 [ 38]: ea6a187ef41badd5 +Block 0008 [ 39]: 3a437dccfcb3b3f7 +Block 0008 [ 40]: ef7f28c8865b58ec +Block 0008 [ 41]: 43f1f573a75017a7 +Block 0008 [ 42]: f5124a1edbdf4cb9 +Block 0008 [ 43]: db8b81c93502b6fc +Block 0008 [ 44]: 19efaa7f870b165f +Block 0008 [ 45]: bdacffd1774061b1 +Block 0008 [ 46]: cbf97601989fc422 +Block 0008 [ 47]: dbdf79c7cb4e49e0 +Block 0008 [ 48]: 42565c17ab4572aa +Block 0008 [ 49]: 5a9516fed8a4eea5 +Block 0008 [ 50]: 40ad887a8ab8b545 +Block 0008 [ 51]: 4ae0d7ad030b2fb1 +Block 0008 [ 52]: dab076f1a9cf3cc2 +Block 0008 [ 53]: d0b1f467452016e2 +Block 0008 [ 54]: 8b10a4bb5d001dd5 +Block 0008 [ 55]: 9d44cb7201468d39 +Block 0008 [ 56]: fa24a3bebbb521eb +Block 0008 [ 57]: 144327403d115894 +Block 0008 [ 58]: ee982acd08e54537 +Block 0008 [ 59]: acc789d4f7e62797 +Block 0008 [ 60]: eae6f48d56b37821 +Block 0008 [ 61]: 2bff8aa7a8499a95 +Block 0008 [ 62]: 257e7a09e4176354 +Block 0008 [ 63]: dbb72295972e9ac9 +Block 0008 [ 64]: ea0b8135e233bcb3 +Block 0008 [ 65]: ff9c535a76808ac3 +Block 0008 [ 66]: 1c703b1b4c728f8c +Block 0008 [ 67]: 4ae21bc7002f7893 +Block 0008 [ 68]: c40b1fd090b0e033 +Block 0008 [ 69]: c35fc5717bbaffba +Block 0008 [ 70]: 0868adcb35c16d4a +Block 0008 [ 71]: cd17ecfca6479f03 +Block 0008 [ 72]: 46648f40bd72d80d +Block 0008 [ 73]: 77f2fad0fc87b479 +Block 0008 [ 74]: 31f2b2ba0b7ccfa5 +Block 0008 [ 75]: 5b85cd1c91ee5f74 +Block 0008 [ 76]: 0fec78845097ce3f +Block 0008 [ 77]: 088adaac9e7dc5cd +Block 0008 [ 78]: dccc6c3a857a4ba9 +Block 0008 [ 79]: 5a19f83b98b444cf +Block 0008 [ 80]: 9b5124cfed3ce26f +Block 0008 [ 81]: 38ddc9403b6d081d +Block 0008 [ 82]: da528afe93f665ef +Block 0008 [ 83]: 68845aca943ea5ea +Block 0008 [ 84]: 64847160c5dcc4ef +Block 0008 [ 85]: 8b4bee768926418c +Block 0008 [ 86]: 9cff834458860832 +Block 0008 [ 87]: 29193c32427c8a8b +Block 0008 [ 88]: 033acac495ed117e +Block 0008 [ 89]: 4a4172c01aef8ea6 +Block 0008 [ 90]: e14551ad4f04ca04 +Block 0008 [ 91]: 2da9c7411b038405 +Block 0008 [ 92]: fe6fdb9a710ad45e +Block 0008 [ 93]: ad63b771789e3e5c +Block 0008 [ 94]: 8ac32bef70c99599 +Block 0008 [ 95]: 6f507ae99b983a6e +Block 0008 [ 96]: ba5628d85986c214 +Block 0008 [ 97]: 725d58c7f6c6c1ce +Block 0008 [ 98]: 1a8214c75a42dba6 +Block 0008 [ 99]: 545d28f9455fc511 +Block 0008 [100]: 7b64a2e365a1d275 +Block 0008 [101]: 63fe760a1c262dd4 +Block 0008 [102]: c0b03d9d02ad5fcd +Block 0008 [103]: 901db491ff2f9d56 +Block 0008 [104]: d63c43b99276870d +Block 0008 [105]: 4cea375449b08481 +Block 0008 [106]: 8f32d81540fbca4a +Block 0008 [107]: f70a8336ac731f08 +Block 0008 [108]: 20508e588bde2fea +Block 0008 [109]: fa33830f6aca3567 +Block 0008 [110]: 51467149c89a20df +Block 0008 [111]: 2a33e0af1afb0909 +Block 0008 [112]: 44b0dd9cf07a759f +Block 0008 [113]: 4ae0823ba2849505 +Block 0008 [114]: 0e7000eba4682c1b +Block 0008 [115]: 0601a32520c29e86 +Block 0008 [116]: 1acef2bfed1a2490 +Block 0008 [117]: f56433c4b77ba5fd +Block 0008 [118]: 249169f9ebac36b3 +Block 0008 [119]: 3dff8073c16c9ddd +Block 0008 [120]: 2d3fa1047c8481af +Block 0008 [121]: a8da96ca08141a8b +Block 0008 [122]: 93da560820064f1e +Block 0008 [123]: 8394940dc494de93 +Block 0008 [124]: af1b5d8150fe7d3b +Block 0008 [125]: 9e57bfe48024e642 +Block 0008 [126]: 84193e6ca6daccc5 +Block 0008 [127]: 825d98f10fbae8e5 +Block 0009 [ 0]: 6116f146783633c9 +Block 0009 [ 1]: 8935acf007f9a42f +Block 0009 [ 2]: 363327a94a365cda +Block 0009 [ 3]: 40145736eab8bdcf +Block 0009 [ 4]: 63a805bfdac5881a +Block 0009 [ 5]: 56469b1c1503b144 +Block 0009 [ 6]: a68f19d26e9641a4 +Block 0009 [ 7]: 9a2ad1cfa5a780d2 +Block 0009 [ 8]: 94314d76f0e5e4cf +Block 0009 [ 9]: 4f53793011ffa6c0 +Block 0009 [ 10]: b29d9b3204ffb826 +Block 0009 [ 11]: 7f610c5d2a235cde +Block 0009 [ 12]: 192f89d97731c461 +Block 0009 [ 13]: 8fe626843baebd22 +Block 0009 [ 14]: 89880c978f68a70c +Block 0009 [ 15]: b6ae708839d63a02 +Block 0009 [ 16]: 3e693ff12084a6b0 +Block 0009 [ 17]: 171f108f0848032d +Block 0009 [ 18]: 6a0f5bafd20043f4 +Block 0009 [ 19]: 4b6de51ba2a9d7cf +Block 0009 [ 20]: 6895a0816b97bceb +Block 0009 [ 21]: 9abf256ba172eb74 +Block 0009 [ 22]: 88bf934006c0f404 +Block 0009 [ 23]: 23d290612e4455a3 +Block 0009 [ 24]: 57f6883f4db1f04d +Block 0009 [ 25]: 9988574cb4c3bc93 +Block 0009 [ 26]: 032ae161e8a24562 +Block 0009 [ 27]: 61b10a42786c20cb +Block 0009 [ 28]: 78c77004760ee74d +Block 0009 [ 29]: 8480f5a9ff0cad99 +Block 0009 [ 30]: 351f1f1f476c01a6 +Block 0009 [ 31]: 53020a75e59b9f0a +Block 0009 [ 32]: 06bd0455ae0f3a87 +Block 0009 [ 33]: 512dde0965bc4a52 +Block 0009 [ 34]: e4999a84b0df4686 +Block 0009 [ 35]: 1a9c16b4710e9310 +Block 0009 [ 36]: cc499906b76f2b9b +Block 0009 [ 37]: f983199dfc547586 +Block 0009 [ 38]: 10cd35c318c8b898 +Block 0009 [ 39]: fe08ee0f007d4bd5 +Block 0009 [ 40]: 50d7d98ac62b0ecc +Block 0009 [ 41]: 04f80f9b011117e6 +Block 0009 [ 42]: d99f3a076e400edd +Block 0009 [ 43]: d5bf5a4b773344e9 +Block 0009 [ 44]: be8168893cd26b55 +Block 0009 [ 45]: 1952cf7c98b3134f +Block 0009 [ 46]: a918b9de5d2e8664 +Block 0009 [ 47]: 853ccc7da2424092 +Block 0009 [ 48]: 2ec713fbf107b8fb +Block 0009 [ 49]: 2d119d176cc4ccf6 +Block 0009 [ 50]: ad257df871b099ce +Block 0009 [ 51]: 33b8904b2ca92680 +Block 0009 [ 52]: bbf1814327b90017 +Block 0009 [ 53]: 2fcfe327f39b8b1c +Block 0009 [ 54]: 5986f6465a96540d +Block 0009 [ 55]: a252fa4d75a1d09e +Block 0009 [ 56]: a8042efac888810b +Block 0009 [ 57]: 4d62fbc776a24f76 +Block 0009 [ 58]: d1066a2a4ec27d26 +Block 0009 [ 59]: 3420e65ecf597b18 +Block 0009 [ 60]: ff251e6526185035 +Block 0009 [ 61]: 6f19e43f1628cac9 +Block 0009 [ 62]: b24d9869cf6c2f90 +Block 0009 [ 63]: 6e37a79565716f96 +Block 0009 [ 64]: 3d94a95786eb2014 +Block 0009 [ 65]: 73086d129e94e92d +Block 0009 [ 66]: cbee49880781e87b +Block 0009 [ 67]: 61371356af82274f +Block 0009 [ 68]: 29b8c37cd53ad57a +Block 0009 [ 69]: 324733f2b5cdfa62 +Block 0009 [ 70]: ea13180259aa70a4 +Block 0009 [ 71]: e505a2f059c46d54 +Block 0009 [ 72]: 8110a82788ecaab9 +Block 0009 [ 73]: 2f85dc978a4929d3 +Block 0009 [ 74]: 9f1d14a079a20fcb +Block 0009 [ 75]: 54d18ce87ef37756 +Block 0009 [ 76]: f708cb5851c5d102 +Block 0009 [ 77]: 8fa3eb7e87e6619c +Block 0009 [ 78]: f93fd1f75756e8d4 +Block 0009 [ 79]: a6f3b595905af386 +Block 0009 [ 80]: 25efb720353451c1 +Block 0009 [ 81]: 80f8094683879e59 +Block 0009 [ 82]: 072ff09d395c9640 +Block 0009 [ 83]: f2f63b7020693ae5 +Block 0009 [ 84]: 6a42ab0c39e29403 +Block 0009 [ 85]: 27a9334f38dd7bad +Block 0009 [ 86]: 4fd11b325797f410 +Block 0009 [ 87]: cc2020b56cd3c7a4 +Block 0009 [ 88]: c54140df15111cd0 +Block 0009 [ 89]: a8a2482dadd5ff2c +Block 0009 [ 90]: 7f9d62d9890db82b +Block 0009 [ 91]: 4c3bb8918fef6957 +Block 0009 [ 92]: 739da007f3401e45 +Block 0009 [ 93]: 014441b4fc664f16 +Block 0009 [ 94]: ae2d8cdbec8a5b61 +Block 0009 [ 95]: 2546bd681965ce57 +Block 0009 [ 96]: c8dd35fbba2daeaa +Block 0009 [ 97]: 00ecc682b149ffa5 +Block 0009 [ 98]: 761a96f6d52275d3 +Block 0009 [ 99]: c881827304e78734 +Block 0009 [100]: 2a9dd8664f879242 +Block 0009 [101]: 715b472bf254b68d +Block 0009 [102]: 6ceff5a995f00cec +Block 0009 [103]: ec55ef14d6b8a520 +Block 0009 [104]: d314bc12ccb8b902 +Block 0009 [105]: 9b863e7e00226537 +Block 0009 [106]: c52fbf34d7e75d59 +Block 0009 [107]: e849c03be5b2da05 +Block 0009 [108]: b38e0205f0528189 +Block 0009 [109]: 7c97db54a80221f9 +Block 0009 [110]: c546349847005e72 +Block 0009 [111]: 376ec10d06843bda +Block 0009 [112]: c5cbd62cf9e43405 +Block 0009 [113]: e6cc6877ce17773f +Block 0009 [114]: 7613897fcd047e34 +Block 0009 [115]: ec48eae7984efc9c +Block 0009 [116]: eaa7f881f7f7c89c +Block 0009 [117]: 256fc2ebe98ef0da +Block 0009 [118]: 29dd9bd56a02a843 +Block 0009 [119]: f1d5b4e674d8c52f +Block 0009 [120]: fdc4eac9b3d350ef +Block 0009 [121]: 7261f2450e8f66a5 +Block 0009 [122]: efad51924a77e9d3 +Block 0009 [123]: fa96bf4dcb96faac +Block 0009 [124]: 4f6330cdbb2cc9b8 +Block 0009 [125]: 8da60af9c7d48e56 +Block 0009 [126]: ee4d25f5d0731762 +Block 0009 [127]: b034c742e982a237 +Block 0010 [ 0]: 1581550dad35e99a +Block 0010 [ 1]: 05d9fb5dd139072e +Block 0010 [ 2]: 4a750673a7a39cd8 +Block 0010 [ 3]: 5dd25947128cb63e +Block 0010 [ 4]: 3c70a199d2289f50 +Block 0010 [ 5]: cb5b05d366cac5cf +Block 0010 [ 6]: 6ec9d18e4f699e96 +Block 0010 [ 7]: 7ef94df9822d067e +Block 0010 [ 8]: cc0154b55089ed53 +Block 0010 [ 9]: 6cdff108c72c740b +Block 0010 [ 10]: 1922a63692a7ad69 +Block 0010 [ 11]: c5e57600387ec72d +Block 0010 [ 12]: ba8606b14cbf7795 +Block 0010 [ 13]: e8149dc812f3f495 +Block 0010 [ 14]: 1b7cd4786cdb1489 +Block 0010 [ 15]: 54b072f64b65506f +Block 0010 [ 16]: e468892cabab73b4 +Block 0010 [ 17]: 8c23f8b762b983d1 +Block 0010 [ 18]: 3379165a16599e67 +Block 0010 [ 19]: 251d4a02152ab9cd +Block 0010 [ 20]: 3ae70d9f24fd7f7b +Block 0010 [ 21]: 9031d6c71cc1df7a +Block 0010 [ 22]: 74ee35696178dbb1 +Block 0010 [ 23]: 74e72d75ca52359b +Block 0010 [ 24]: a084ac9759f74dba +Block 0010 [ 25]: 9023bbb7b6dad75f +Block 0010 [ 26]: 2cd8b7a9d6a0d0bf +Block 0010 [ 27]: 43632bfc53fef602 +Block 0010 [ 28]: 932c3ce043b9d5a5 +Block 0010 [ 29]: dd424acccc7f3426 +Block 0010 [ 30]: 6a00dafeb648d626 +Block 0010 [ 31]: 559e29b3670ae181 +Block 0010 [ 32]: 7cdb59d67e7b0847 +Block 0010 [ 33]: 9112fc484c1856ef +Block 0010 [ 34]: 6330d32dac31fc9c +Block 0010 [ 35]: f4cc8b585269d45b +Block 0010 [ 36]: 3ed4bad64f8d15b6 +Block 0010 [ 37]: 7d28923e599082d3 +Block 0010 [ 38]: 489779a0484a8a87 +Block 0010 [ 39]: 29f5ad3ea2de0e03 +Block 0010 [ 40]: 9e71cab15323b5ec +Block 0010 [ 41]: c778e291423650ee +Block 0010 [ 42]: d9fab25b79472568 +Block 0010 [ 43]: be31604f2b51db18 +Block 0010 [ 44]: 2c6b307dcd80a198 +Block 0010 [ 45]: dc4972e5fa1a6b8e +Block 0010 [ 46]: 1c9c9151b237a79f +Block 0010 [ 47]: d296b9c11e54dc49 +Block 0010 [ 48]: 061a87b483254066 +Block 0010 [ 49]: 9181748c91e61093 +Block 0010 [ 50]: 7f0245daa712fca3 +Block 0010 [ 51]: c31cd3af5e3c325a +Block 0010 [ 52]: 883f4f752fc1ed6a +Block 0010 [ 53]: 8e8a6b2ad2e9f78b +Block 0010 [ 54]: a6828c7b9ae69793 +Block 0010 [ 55]: 5fd21d7e09c07e76 +Block 0010 [ 56]: d46460dc13aea5d6 +Block 0010 [ 57]: 7837284a5f7fa560 +Block 0010 [ 58]: a67d348980d25e9e +Block 0010 [ 59]: 7105db7bc3a185eb +Block 0010 [ 60]: b640219f27d0a87d +Block 0010 [ 61]: 1cdbf6e6bcb96342 +Block 0010 [ 62]: 518a9db055b4caf6 +Block 0010 [ 63]: 6d9580534ef590f5 +Block 0010 [ 64]: c62f771deb9c4d44 +Block 0010 [ 65]: 86500c646cfe0cb7 +Block 0010 [ 66]: c5b986115fada57a +Block 0010 [ 67]: 8754d87c1c255f00 +Block 0010 [ 68]: a007aff8deb8ce6e +Block 0010 [ 69]: 19c17a24d62c3670 +Block 0010 [ 70]: 53051a43f12bcbd5 +Block 0010 [ 71]: 347d012a37ca3b7d +Block 0010 [ 72]: 0f26ed5326fe4a2f +Block 0010 [ 73]: 48d50db051744ec6 +Block 0010 [ 74]: e47219b32d675659 +Block 0010 [ 75]: 494134100b4fb7b6 +Block 0010 [ 76]: cd4e658c5c461b92 +Block 0010 [ 77]: 869f79190a5435eb +Block 0010 [ 78]: 935b606d09833496 +Block 0010 [ 79]: df9e265f08a00697 +Block 0010 [ 80]: c8fd59cd5b8a8b0e +Block 0010 [ 81]: 81281454bf7a1b4a +Block 0010 [ 82]: f0e94eefcdd74473 +Block 0010 [ 83]: 557c0ee5cfadfaed +Block 0010 [ 84]: c1e76d9b70f5085c +Block 0010 [ 85]: f326a4044566e114 +Block 0010 [ 86]: 2a3487f29b575895 +Block 0010 [ 87]: 47508a14bd6769ce +Block 0010 [ 88]: 161645c30267ebf9 +Block 0010 [ 89]: be3385c7c63566a0 +Block 0010 [ 90]: 52efbda144902dba +Block 0010 [ 91]: bd3ef2a4b859e30a +Block 0010 [ 92]: edd3aeea5b7b0d76 +Block 0010 [ 93]: f3742851032d0706 +Block 0010 [ 94]: 065c8a5ca189571a +Block 0010 [ 95]: 38073ab2b43d4fc5 +Block 0010 [ 96]: fff19498f099d9d8 +Block 0010 [ 97]: 76eb0ebbbfa4b030 +Block 0010 [ 98]: 2b467d2766ae5093 +Block 0010 [ 99]: e0d0fcf033eb16e2 +Block 0010 [100]: 455941faca082d2e +Block 0010 [101]: eb0ebc8001c0ee88 +Block 0010 [102]: 014ef8e92fdf1609 +Block 0010 [103]: a45754ecab977f21 +Block 0010 [104]: 8851e7729875e24c +Block 0010 [105]: 24eb03f9f64bd274 +Block 0010 [106]: 0ae3cce50b82f30b +Block 0010 [107]: 7d568c148cb4c4d8 +Block 0010 [108]: 29c6b592b88c18b3 +Block 0010 [109]: e6e17ec5b18be1d2 +Block 0010 [110]: f9454e53c4c0d899 +Block 0010 [111]: bca482e99dbc8b54 +Block 0010 [112]: bf43d5b658c4d900 +Block 0010 [113]: c1a5fa13cfdb425e +Block 0010 [114]: 514f21e92dd1bb69 +Block 0010 [115]: 605acc73c7d5d8bb +Block 0010 [116]: bb8057c50072ab70 +Block 0010 [117]: 1f9ffdab48f0ca58 +Block 0010 [118]: d535f7d811f5b7a7 +Block 0010 [119]: 98bd18ecc347eefc +Block 0010 [120]: 1e69ba6f3a7f4fd0 +Block 0010 [121]: e1e2a7af5e7e361a +Block 0010 [122]: 3df786477ee6f7f7 +Block 0010 [123]: c2f3d9ea7feb0ec3 +Block 0010 [124]: 50bd7d5499aaca90 +Block 0010 [125]: e38fb4acdcf1b6ac +Block 0010 [126]: 4f92cefd6ebb0794 +Block 0010 [127]: f275a4842c740714 +Block 0011 [ 0]: f9d07509503819bd +Block 0011 [ 1]: 7ce6341ac752d873 +Block 0011 [ 2]: cf4550cbedff3a5e +Block 0011 [ 3]: 8768db6544d9c977 +Block 0011 [ 4]: 4fbd5c2b0a7036c1 +Block 0011 [ 5]: ee474ae73d0e3156 +Block 0011 [ 6]: 478b517b17c70aee +Block 0011 [ 7]: d67f67db907587b7 +Block 0011 [ 8]: 98623377f34cc9fa +Block 0011 [ 9]: 517221fb649687ff +Block 0011 [ 10]: 035cc4b9754f3cea +Block 0011 [ 11]: d172d1d16e842534 +Block 0011 [ 12]: 126ba6d66dc03c10 +Block 0011 [ 13]: ef2bff64caeafb53 +Block 0011 [ 14]: a8d87ec45b71adef +Block 0011 [ 15]: c0fc912f4cb97dbb +Block 0011 [ 16]: d461a1fe274d00ea +Block 0011 [ 17]: b3c91d2c2b561f50 +Block 0011 [ 18]: d9d15e51315c1662 +Block 0011 [ 19]: 237314480e44d2f6 +Block 0011 [ 20]: cd1666524d9908be +Block 0011 [ 21]: 399c98b7b390fc51 +Block 0011 [ 22]: 711e961e04711c5a +Block 0011 [ 23]: 4039879c114b23c1 +Block 0011 [ 24]: a5fbd0eb93a342fe +Block 0011 [ 25]: 3f859f3ddc5e8819 +Block 0011 [ 26]: 93dcfe098f9de5aa +Block 0011 [ 27]: f3d3afe76a718bd6 +Block 0011 [ 28]: 752df2d429465e81 +Block 0011 [ 29]: bd4a4f26d19791f4 +Block 0011 [ 30]: 4c57242e5f0b55aa +Block 0011 [ 31]: 01275075e4f8a4e1 +Block 0011 [ 32]: 3a37199950dce330 +Block 0011 [ 33]: 2e41aafd16cf1b05 +Block 0011 [ 34]: 92243d071386ab20 +Block 0011 [ 35]: d869ba9a984d4bde +Block 0011 [ 36]: 6be491e7a3be8d9f +Block 0011 [ 37]: acef9890cec1a375 +Block 0011 [ 38]: e232f0287c136279 +Block 0011 [ 39]: d95325c0d7ab9a82 +Block 0011 [ 40]: 90d8b5b0c8c6afa1 +Block 0011 [ 41]: 5bb67f83bf5f1a83 +Block 0011 [ 42]: 75affbe23953fd5b +Block 0011 [ 43]: d43a2db1ac58dec5 +Block 0011 [ 44]: 0af8868fbcd3ebe0 +Block 0011 [ 45]: 6f0cf6609fbc2a32 +Block 0011 [ 46]: 1b4a24795691fda7 +Block 0011 [ 47]: e6e032b6720d0903 +Block 0011 [ 48]: 8b4a5e1ac40c6d53 +Block 0011 [ 49]: f09c4457e757d976 +Block 0011 [ 50]: d5eb3b17dbbf75e2 +Block 0011 [ 51]: 74ee41b96ce4915d +Block 0011 [ 52]: f5a6c444f6c7dab4 +Block 0011 [ 53]: a6dd992782c12a9b +Block 0011 [ 54]: 82ab2f6c6abd9c4b +Block 0011 [ 55]: 24dbb03795c538e2 +Block 0011 [ 56]: b703785f0aa21442 +Block 0011 [ 57]: 1911ce525bff5d72 +Block 0011 [ 58]: edc77bb56a4ab0c1 +Block 0011 [ 59]: 84ad7caa4e66e14c +Block 0011 [ 60]: 660aa6a2745246a4 +Block 0011 [ 61]: d0531eb0c94d2835 +Block 0011 [ 62]: e07ea2345379ad0d +Block 0011 [ 63]: 499700d903192292 +Block 0011 [ 64]: 595e9750f70bbf3f +Block 0011 [ 65]: 3ec2b0d5546008ce +Block 0011 [ 66]: 1e9afbafb3fe7892 +Block 0011 [ 67]: 051889a2e3b3c12e +Block 0011 [ 68]: a47cf414a9c2e3ee +Block 0011 [ 69]: ad75a5ec9388091b +Block 0011 [ 70]: e6c48f94041c6d16 +Block 0011 [ 71]: ac4d0e7ad884428c +Block 0011 [ 72]: 222e82f8af709648 +Block 0011 [ 73]: 33b376379cc8d21e +Block 0011 [ 74]: 97ed5f80b3ab3a65 +Block 0011 [ 75]: ca903f8faa0a9f3a +Block 0011 [ 76]: 766d650d4f88ad10 +Block 0011 [ 77]: 49004a3e3d5a0cec +Block 0011 [ 78]: 80fe987f05769c43 +Block 0011 [ 79]: e7ab3340c8480b4f +Block 0011 [ 80]: eb4b06163cbd2966 +Block 0011 [ 81]: 18256d0b24389063 +Block 0011 [ 82]: c39c1550f3fda74e +Block 0011 [ 83]: 254f94232ffc456f +Block 0011 [ 84]: 7a07379880f898c1 +Block 0011 [ 85]: 10bcbb1e56036b64 +Block 0011 [ 86]: aa13e477412afb1b +Block 0011 [ 87]: c9efe5bd72b75944 +Block 0011 [ 88]: e721be1923769258 +Block 0011 [ 89]: 2d85f117a10321c9 +Block 0011 [ 90]: 6830c4cbc6b34147 +Block 0011 [ 91]: 407cb2e8b2e35046 +Block 0011 [ 92]: 610d429a7aa7bc01 +Block 0011 [ 93]: a87b6f3066bd4f95 +Block 0011 [ 94]: 15c058703f06b644 +Block 0011 [ 95]: 4e3bdd301ec7a0f1 +Block 0011 [ 96]: 5e726da6a1338bba +Block 0011 [ 97]: ce3bc3a123db3655 +Block 0011 [ 98]: 77225e3ff6f31055 +Block 0011 [ 99]: 0656971d13d67e7c +Block 0011 [100]: 7c05554b1068393c +Block 0011 [101]: 4810197934d77904 +Block 0011 [102]: 349cc06be7997ef9 +Block 0011 [103]: d00b3ded2d522f5e +Block 0011 [104]: 227acc01f569ca9e +Block 0011 [105]: 977c0a71d22f2cd7 +Block 0011 [106]: 8017ecfa54e3d7a8 +Block 0011 [107]: 3d1aaf609a4a527b +Block 0011 [108]: a62db92347317e92 +Block 0011 [109]: 063b9b695ce07f42 +Block 0011 [110]: 7e6c285a42777ae4 +Block 0011 [111]: 57c8f2a7a0fb2918 +Block 0011 [112]: 920ee3f0d6bc0111 +Block 0011 [113]: 9c3aa6dad4a6741c +Block 0011 [114]: 858bcf22afea1c1f +Block 0011 [115]: efde8bec8729ea86 +Block 0011 [116]: fb858be9ffe79d1f +Block 0011 [117]: df4d290f94188e6b +Block 0011 [118]: d15a924c44977496 +Block 0011 [119]: 96b0d68c74b98b21 +Block 0011 [120]: 45123713a09a64ce +Block 0011 [121]: 7adb89ae11063d09 +Block 0011 [122]: 3957bcb1cadfb4db +Block 0011 [123]: 86e2fb643a1f1b25 +Block 0011 [124]: 70ccb8e27170d6d2 +Block 0011 [125]: 72b9f822beed7313 +Block 0011 [126]: d3a930c21c4a2956 +Block 0011 [127]: 8273bb90c3b5600e +Block 0012 [ 0]: 8806f36d35c1423b +Block 0012 [ 1]: 14653c73ccf5bc88 +Block 0012 [ 2]: 4207fc5b55d55fda +Block 0012 [ 3]: efbdfa4d752b6918 +Block 0012 [ 4]: a4a2d8f6065b95d5 +Block 0012 [ 5]: 97ae0bd93615b75e +Block 0012 [ 6]: ea30d4b1d695e231 +Block 0012 [ 7]: 0f0ca5ca8152e942 +Block 0012 [ 8]: 383566c45510b12b +Block 0012 [ 9]: a0ae9a21d1a1df6b +Block 0012 [ 10]: 71353b98020fb2f4 +Block 0012 [ 11]: 14defb047ecd1cfc +Block 0012 [ 12]: 6f8d61281e48d8d3 +Block 0012 [ 13]: 4e68a4a4107f1cbf +Block 0012 [ 14]: 82ac58dc69bed136 +Block 0012 [ 15]: 082cf1a328c9d60a +Block 0012 [ 16]: cd7c6c4269625174 +Block 0012 [ 17]: dc4e7de5e2132891 +Block 0012 [ 18]: 605722ef953732bb +Block 0012 [ 19]: ef28c8050fb1ffbb +Block 0012 [ 20]: 8b6d0fab9e173cd4 +Block 0012 [ 21]: a9f69ac0b87c3248 +Block 0012 [ 22]: b00898c9abd03a75 +Block 0012 [ 23]: 743e6179354ef1d4 +Block 0012 [ 24]: ecc061362554bb3d +Block 0012 [ 25]: 9ac900bdfe1342cb +Block 0012 [ 26]: 39a9deeb4bd618ac +Block 0012 [ 27]: ea98a8de1ba57756 +Block 0012 [ 28]: d72d9b53c6e21291 +Block 0012 [ 29]: e711b901b297e96e +Block 0012 [ 30]: 9762d95e177c4f1f +Block 0012 [ 31]: c55051fa55ba56b3 +Block 0012 [ 32]: 5d73ae3e34932185 +Block 0012 [ 33]: 248c4c499a5d1382 +Block 0012 [ 34]: 1bde77252efbe61f +Block 0012 [ 35]: da398389113e48ac +Block 0012 [ 36]: 251b9f0f957ff7bb +Block 0012 [ 37]: 9ecc553346dcd262 +Block 0012 [ 38]: 9cb0cb2499323e09 +Block 0012 [ 39]: 196608d377614970 +Block 0012 [ 40]: ad301f3b39eab9eb +Block 0012 [ 41]: 07292fb5039b5a0c +Block 0012 [ 42]: b8c242fde0656a78 +Block 0012 [ 43]: de2ffbe33e4255f4 +Block 0012 [ 44]: ef88307c4af2465f +Block 0012 [ 45]: 8130e319111c7e12 +Block 0012 [ 46]: d30446203591a7f0 +Block 0012 [ 47]: 92d9a9c97962de12 +Block 0012 [ 48]: 81ffb8785be950b8 +Block 0012 [ 49]: dd7a8f4f4f1be7fc +Block 0012 [ 50]: ae16a8611e2fab24 +Block 0012 [ 51]: 274ae59677ed5cde +Block 0012 [ 52]: 9ee2a215fc45877d +Block 0012 [ 53]: 44c02472b9d4865e +Block 0012 [ 54]: 7a99faae6ce71424 +Block 0012 [ 55]: 9f14ec3364b617b5 +Block 0012 [ 56]: 4e5f21c0f9fa5cdb +Block 0012 [ 57]: 8581be6ff99ff6e9 +Block 0012 [ 58]: 286a475c94d8531b +Block 0012 [ 59]: 5829a37f5059aba7 +Block 0012 [ 60]: 63966f77f572f1fa +Block 0012 [ 61]: 2b385db8fdd63b29 +Block 0012 [ 62]: 7f19c5dfa2d51b19 +Block 0012 [ 63]: e6c7faac63fd8be9 +Block 0012 [ 64]: 20978fded5ed200c +Block 0012 [ 65]: 3d7f27000be3bf33 +Block 0012 [ 66]: 424c8604e3439841 +Block 0012 [ 67]: c7c17415eea225fd +Block 0012 [ 68]: 119ad57ef17db880 +Block 0012 [ 69]: 7c5ec22d1e8246f4 +Block 0012 [ 70]: 02aaff890ed6a0d8 +Block 0012 [ 71]: 38885a315c9cb170 +Block 0012 [ 72]: 9bdea427f4331556 +Block 0012 [ 73]: 0b9d377ac4a053ee +Block 0012 [ 74]: ae093cbad8ebfd1f +Block 0012 [ 75]: da9a129e658ed6d5 +Block 0012 [ 76]: 5fc18fb4ede1183c +Block 0012 [ 77]: 03ac6cc465a317d6 +Block 0012 [ 78]: 90216f4e34b94195 +Block 0012 [ 79]: 7374632b8bfa4ed2 +Block 0012 [ 80]: 3f01f0d5c1d11263 +Block 0012 [ 81]: ce97cb17f8470c45 +Block 0012 [ 82]: 48446e58576c981b +Block 0012 [ 83]: 3af83ee98ee746f7 +Block 0012 [ 84]: e036c677e9d4f210 +Block 0012 [ 85]: 15e75b241dadf152 +Block 0012 [ 86]: 6414a2ac0b3d0934 +Block 0012 [ 87]: 3e2bbf6a7f90858e +Block 0012 [ 88]: a8db21963b8e39f3 +Block 0012 [ 89]: fd73cb703b0ac5ce +Block 0012 [ 90]: 2f34ee7be12306e7 +Block 0012 [ 91]: c24f9ac5f72fd067 +Block 0012 [ 92]: cc2171bb74a68e15 +Block 0012 [ 93]: 80834464ea81f238 +Block 0012 [ 94]: d2344c88383cfd55 +Block 0012 [ 95]: e8241e72f2d88c34 +Block 0012 [ 96]: 7510928f8266427e +Block 0012 [ 97]: fb57a7823a65cb28 +Block 0012 [ 98]: d30dd5b6d6bfc46a +Block 0012 [ 99]: 1350828149e5ee7d +Block 0012 [100]: 944087103d17187e +Block 0012 [101]: 72c9e02ae3037f35 +Block 0012 [102]: aae68c10254df726 +Block 0012 [103]: 3c72bcac4a61afae +Block 0012 [104]: ce0501cd931819df +Block 0012 [105]: 426e32d58167fbfb +Block 0012 [106]: 9e5dc832972aa924 +Block 0012 [107]: 848b3f39861c3eb5 +Block 0012 [108]: ed871992cfd6e2e3 +Block 0012 [109]: 1843a4cebb0d19ac +Block 0012 [110]: 6b59416e812adc5b +Block 0012 [111]: ff7753e7dd87cb07 +Block 0012 [112]: d85a0a1902640928 +Block 0012 [113]: 5a770deeb225fbce +Block 0012 [114]: 7246a7c49bf20941 +Block 0012 [115]: c0e9edc2c5b87ffa +Block 0012 [116]: fae6521ac53f5836 +Block 0012 [117]: 9eca1d246c821c14 +Block 0012 [118]: 6ec6ced3960fef2c +Block 0012 [119]: 9af70f8caf586a52 +Block 0012 [120]: 5f30942072110be3 +Block 0012 [121]: bfc7df63c519ee08 +Block 0012 [122]: 012890af79b89e65 +Block 0012 [123]: 17c6a29fd7ea0fca +Block 0012 [124]: 9284e78adc31e53b +Block 0012 [125]: 56d34c2e48b5e556 +Block 0012 [126]: 6f7c8fa37870b55e +Block 0012 [127]: 64d5549f6eb29b2f +Block 0013 [ 0]: e72efbcee6e1fcc2 +Block 0013 [ 1]: 41c9fa08bec04f71 +Block 0013 [ 2]: afdff9477d9dd990 +Block 0013 [ 3]: 847e1b15aee75dd3 +Block 0013 [ 4]: 51a5faf1e49312e4 +Block 0013 [ 5]: 98bcc5a1b36fcb8d +Block 0013 [ 6]: d4d840de4f9c632b +Block 0013 [ 7]: 5c9caaea2214b8ad +Block 0013 [ 8]: dfb03ae68b0b3a54 +Block 0013 [ 9]: 1d791e93ae70eff7 +Block 0013 [ 10]: 9924c218180bca12 +Block 0013 [ 11]: 5cabe42dcc8eceb6 +Block 0013 [ 12]: 3aadd556303df415 +Block 0013 [ 13]: a2e90919b4a888ff +Block 0013 [ 14]: ea9096263ccf5466 +Block 0013 [ 15]: 230bcadd55c5d8cf +Block 0013 [ 16]: 72b74072cfd88278 +Block 0013 [ 17]: 99287c1741b988a4 +Block 0013 [ 18]: 9261d65b6402547a +Block 0013 [ 19]: 95fd4b54d8291fd5 +Block 0013 [ 20]: fbf7d4b4962449ba +Block 0013 [ 21]: bd89c24c92cdabd6 +Block 0013 [ 22]: 1773376e4f1cb495 +Block 0013 [ 23]: f196d1f575cfef2e +Block 0013 [ 24]: 5d443966d2508d3c +Block 0013 [ 25]: df929f9765749018 +Block 0013 [ 26]: 4e98bda4c9aa91d6 +Block 0013 [ 27]: 3b74998d38c6f9a9 +Block 0013 [ 28]: a69472986a031370 +Block 0013 [ 29]: 55999e6cbb50ffe9 +Block 0013 [ 30]: df955f1fc8cebba6 +Block 0013 [ 31]: 7f9090b065d11439 +Block 0013 [ 32]: f522cab9b83ca10e +Block 0013 [ 33]: 27644ea4cb350062 +Block 0013 [ 34]: ff6d1db5e34d9eee +Block 0013 [ 35]: 0a03ae8f8fde0222 +Block 0013 [ 36]: 8d71db40f234b291 +Block 0013 [ 37]: 93dc4ec94a65e856 +Block 0013 [ 38]: 23169228ab00ccb9 +Block 0013 [ 39]: 92f2b127f4ffa819 +Block 0013 [ 40]: 36260a0ad39d896a +Block 0013 [ 41]: cb46dfcf38f9487d +Block 0013 [ 42]: 71351268c905ab11 +Block 0013 [ 43]: 8a726ed65034f3dd +Block 0013 [ 44]: 6ff7b9cd220b4b25 +Block 0013 [ 45]: d09bb2bbdadda776 +Block 0013 [ 46]: 14f63b5e2576d304 +Block 0013 [ 47]: 2012e78d9f11d05f +Block 0013 [ 48]: 84c4c6327aba9915 +Block 0013 [ 49]: 64bd4339a6f4730e +Block 0013 [ 50]: e8db6637f982ba64 +Block 0013 [ 51]: 80426b505ab9b659 +Block 0013 [ 52]: 7b183c8d992d6e89 +Block 0013 [ 53]: 27be6d49797c8929 +Block 0013 [ 54]: c2ce4c1f3bc4bc85 +Block 0013 [ 55]: 10f597203eb06167 +Block 0013 [ 56]: b337d265c1ffbae5 +Block 0013 [ 57]: 2cb28d5998618cb2 +Block 0013 [ 58]: 3694423e3dce42ee +Block 0013 [ 59]: a4f273033178e7c3 +Block 0013 [ 60]: c3046ec981137bb3 +Block 0013 [ 61]: 1009e948b01acf67 +Block 0013 [ 62]: cf8ff3786b295ab4 +Block 0013 [ 63]: c326444756ddd088 +Block 0013 [ 64]: e6319be1c3024f8d +Block 0013 [ 65]: 7ea1cdbcab9d1e37 +Block 0013 [ 66]: 5a278a8c214dffc3 +Block 0013 [ 67]: e1e3096f9467c652 +Block 0013 [ 68]: 5ca93fb559033a8f +Block 0013 [ 69]: 6e94c69f7f3833be +Block 0013 [ 70]: 0f28fd96ca3fbe9d +Block 0013 [ 71]: f45a753a250f8885 +Block 0013 [ 72]: 85596b79d2b69dc5 +Block 0013 [ 73]: 668a8092d5936a81 +Block 0013 [ 74]: ca8f2365d51addcf +Block 0013 [ 75]: b6d7f0efd51024da +Block 0013 [ 76]: eae27ca92101b01d +Block 0013 [ 77]: 41a31214dff85a05 +Block 0013 [ 78]: cefc4a5bc9e160b6 +Block 0013 [ 79]: b2ec3b0af6d0cfad +Block 0013 [ 80]: eaf8ccbae405a96a +Block 0013 [ 81]: bf80f0cb8290672b +Block 0013 [ 82]: 1d354282bfb867b0 +Block 0013 [ 83]: defd9743a6ed5ec4 +Block 0013 [ 84]: b9f7e89081a83de9 +Block 0013 [ 85]: 475a016e71f52c7b +Block 0013 [ 86]: 9200fa2b3e510c1c +Block 0013 [ 87]: 722dbf069e3bb00a +Block 0013 [ 88]: 4456a0288267d739 +Block 0013 [ 89]: 9bb0deec79a73b28 +Block 0013 [ 90]: 5668f034f9593324 +Block 0013 [ 91]: 716f5609d579186c +Block 0013 [ 92]: d3885db0ca291647 +Block 0013 [ 93]: 7362a661049f019a +Block 0013 [ 94]: 2a3af104bfdf5f9d +Block 0013 [ 95]: 12e8f6e36733c9b1 +Block 0013 [ 96]: 771fb14c5e514301 +Block 0013 [ 97]: 7253c7e989875dc3 +Block 0013 [ 98]: 0169faf6582e95ad +Block 0013 [ 99]: a78686d559d37864 +Block 0013 [100]: 3ed327acc1ca2d97 +Block 0013 [101]: d4df3ae4a05987c6 +Block 0013 [102]: 734086ace6f3ba89 +Block 0013 [103]: c014cbeb31bd5fe5 +Block 0013 [104]: 8773bbe012dc88b4 +Block 0013 [105]: a4364d36a4a0ec5c +Block 0013 [106]: c3080f5baa28264d +Block 0013 [107]: c74122c7d560f312 +Block 0013 [108]: df4eebdca740a2e1 +Block 0013 [109]: 415708c10d8419a5 +Block 0013 [110]: d2e8f4acb6c9229b +Block 0013 [111]: 31405c89ee5f9078 +Block 0013 [112]: dcb5a58709568836 +Block 0013 [113]: f9adc209054ca3cd +Block 0013 [114]: 8f54dd7f1e576e69 +Block 0013 [115]: 90200596f5f31919 +Block 0013 [116]: a51bb22209110112 +Block 0013 [117]: 395c30fc016b08fa +Block 0013 [118]: 984e30e11239af0e +Block 0013 [119]: 0c01cf9e1b6c375e +Block 0013 [120]: 1dc8cb664c66b463 +Block 0013 [121]: 42e8e6591fa02520 +Block 0013 [122]: 1556177ba9cfe1b5 +Block 0013 [123]: 7c8383f4db999495 +Block 0013 [124]: 0b4446b852033798 +Block 0013 [125]: e364b9e50c65e807 +Block 0013 [126]: 22c2b338400fa40e +Block 0013 [127]: 197b3e06a9b9b35d +Block 0014 [ 0]: 8d14eda116d8b174 +Block 0014 [ 1]: f0ed99cc6e9bad1f +Block 0014 [ 2]: aa681b19cb2aa856 +Block 0014 [ 3]: 51b9371d6db9a704 +Block 0014 [ 4]: fd4e067c50a82bf1 +Block 0014 [ 5]: b84fe88cef8f8ce1 +Block 0014 [ 6]: e005bbdea12c5cce +Block 0014 [ 7]: 8921662cb47324d5 +Block 0014 [ 8]: 19b0df7e73fedfb0 +Block 0014 [ 9]: eb2e94f27c2c08d6 +Block 0014 [ 10]: c6c93a91e4ff2395 +Block 0014 [ 11]: 78ca8005a838af79 +Block 0014 [ 12]: 832134055a083e60 +Block 0014 [ 13]: e2baab535beeaca9 +Block 0014 [ 14]: 6cb6415b356f9c6b +Block 0014 [ 15]: 4d188011ab14c17a +Block 0014 [ 16]: 4eb9bbf6642e83fe +Block 0014 [ 17]: b11101eb0f96d3c3 +Block 0014 [ 18]: 49bd14abcacc79c2 +Block 0014 [ 19]: 908454e7efcf67aa +Block 0014 [ 20]: 0c6bd3e1d0d1a801 +Block 0014 [ 21]: a6fd600f4d316505 +Block 0014 [ 22]: c6b3b58a099b0132 +Block 0014 [ 23]: 1fd168a48e08af81 +Block 0014 [ 24]: 7d0abf0de858e6c9 +Block 0014 [ 25]: e1c1ec6fccf881b0 +Block 0014 [ 26]: 66c26e61d80a5717 +Block 0014 [ 27]: 30d88fc6f4fcfb1c +Block 0014 [ 28]: f4bef017c2aa3d69 +Block 0014 [ 29]: 54ec842d96c65623 +Block 0014 [ 30]: 3dd02da54acc953e +Block 0014 [ 31]: 6c9a5523129d0a12 +Block 0014 [ 32]: e80101c9a3eb28af +Block 0014 [ 33]: 5e5012733c54de06 +Block 0014 [ 34]: 14a6fc541b76f2c4 +Block 0014 [ 35]: ae2aaa5d9de0a5a8 +Block 0014 [ 36]: d0e66232ba166660 +Block 0014 [ 37]: fb5ce73d6e6f73a0 +Block 0014 [ 38]: 1d430c477c21b0a4 +Block 0014 [ 39]: a047b3225665765b +Block 0014 [ 40]: 6629b699bffc7016 +Block 0014 [ 41]: 986241e23222e465 +Block 0014 [ 42]: 67f53ba71892b9f3 +Block 0014 [ 43]: cca9cd5a1b010cca +Block 0014 [ 44]: d963121f56ae7d48 +Block 0014 [ 45]: 314021d79e98d3a9 +Block 0014 [ 46]: c33fb6dba4174783 +Block 0014 [ 47]: c50d1c6765478c78 +Block 0014 [ 48]: e83173786e25b7ec +Block 0014 [ 49]: 1bea0e1d495317ad +Block 0014 [ 50]: ea5c6380f39600f8 +Block 0014 [ 51]: 5e4ae1400406c36e +Block 0014 [ 52]: 1755aea74cf69384 +Block 0014 [ 53]: 2571f5cb87a57586 +Block 0014 [ 54]: cd88b273efb66357 +Block 0014 [ 55]: fd404e9cdcd9c9fe +Block 0014 [ 56]: 15031c81ff4f7d59 +Block 0014 [ 57]: 67c01cb57dc56faa +Block 0014 [ 58]: 8fc3faf1a58630fc +Block 0014 [ 59]: 4a2fea71ed6905fa +Block 0014 [ 60]: 4176ea688e1a9bff +Block 0014 [ 61]: 0baf1e600ebba90f +Block 0014 [ 62]: d4c62bedc6c17c5a +Block 0014 [ 63]: fe82cc4b18777fbb +Block 0014 [ 64]: 8c94dd054153a818 +Block 0014 [ 65]: aa31581716fef7e5 +Block 0014 [ 66]: b42153e50e973f5a +Block 0014 [ 67]: d652f8ae8b6207f3 +Block 0014 [ 68]: e06432d955b0ab86 +Block 0014 [ 69]: f92dbd0e338f8ccb +Block 0014 [ 70]: 562ba0d2b04549ef +Block 0014 [ 71]: 29a231a4c57a3de1 +Block 0014 [ 72]: 7e2145921fee5493 +Block 0014 [ 73]: 20a340d5895bcd9a +Block 0014 [ 74]: e2e354ca5272b509 +Block 0014 [ 75]: abcdee5c5bb2cfa3 +Block 0014 [ 76]: d371f81a8be84f1d +Block 0014 [ 77]: 8220ea4b6cbe82fc +Block 0014 [ 78]: a58ce51218a79494 +Block 0014 [ 79]: f635a38fce84fed0 +Block 0014 [ 80]: 0b408788ad40eba1 +Block 0014 [ 81]: 30d60016156bd242 +Block 0014 [ 82]: 81d0c5358dddce93 +Block 0014 [ 83]: 4f7908a5cb8bb7d5 +Block 0014 [ 84]: 14b529212b6530c4 +Block 0014 [ 85]: 33044b35a9337d9a +Block 0014 [ 86]: c8fde54e83feb1c5 +Block 0014 [ 87]: 3be5432e49aec1bb +Block 0014 [ 88]: f98a1e3a999a4f79 +Block 0014 [ 89]: 75045dbaa4dca89e +Block 0014 [ 90]: 294bddf0db98b8ac +Block 0014 [ 91]: a7d8b2a1daaecbc7 +Block 0014 [ 92]: c2abce3a81f24c50 +Block 0014 [ 93]: f76054fadd7e4cfe +Block 0014 [ 94]: 86af8192d73f1e4c +Block 0014 [ 95]: ae1e37842e18f6d7 +Block 0014 [ 96]: f771f980b278b4d5 +Block 0014 [ 97]: 1c5bf21c38eee556 +Block 0014 [ 98]: e62a9a43d1945340 +Block 0014 [ 99]: 9cb9a94b5edcdfa3 +Block 0014 [100]: 2ef34979f56f344b +Block 0014 [101]: 31dbbd3b49048f01 +Block 0014 [102]: c39b10dfc2141dcc +Block 0014 [103]: ede638cecaa47945 +Block 0014 [104]: 47a56d23f46fb7c1 +Block 0014 [105]: 72b848fd7517cd75 +Block 0014 [106]: 321312e6606d202b +Block 0014 [107]: fccb2896a973930e +Block 0014 [108]: a95b5677fe9bb5e7 +Block 0014 [109]: cc196e39010d655b +Block 0014 [110]: 92836ef9898b94ca +Block 0014 [111]: dbe8aeb97154968b +Block 0014 [112]: ec80ac4ed462dd58 +Block 0014 [113]: f1899ab7707e7d66 +Block 0014 [114]: 537c431765423717 +Block 0014 [115]: 2577e7bc01750f96 +Block 0014 [116]: f70bb7875341ccba +Block 0014 [117]: 17fd2d1068f6f10f +Block 0014 [118]: 9092c995c5a598da +Block 0014 [119]: 3c4712e895e00263 +Block 0014 [120]: 81302387429d318b +Block 0014 [121]: 0ad80f67bfc1effa +Block 0014 [122]: 715791caef2d1725 +Block 0014 [123]: e19080e37dedbba4 +Block 0014 [124]: faef540798e35c43 +Block 0014 [125]: 4ab3f59b7018e628 +Block 0014 [126]: 054b4d0e9c328acf +Block 0014 [127]: 61b4b091403df82c +Block 0015 [ 0]: 779fdc9d92242706 +Block 0015 [ 1]: 9a258d936a6fad08 +Block 0015 [ 2]: 6c393c4981d158b7 +Block 0015 [ 3]: c15ab151d5d4c946 +Block 0015 [ 4]: 4a202feb1c0ccf11 +Block 0015 [ 5]: dd2665b2c7d60c1c +Block 0015 [ 6]: 3d4ccf48ef10e923 +Block 0015 [ 7]: 9c5a9c7cbf6e3401 +Block 0015 [ 8]: 65ce6f9d46877ee2 +Block 0015 [ 9]: 81f60dd9637a027c +Block 0015 [ 10]: 26028b3cbb08ed0b +Block 0015 [ 11]: 14eba36c0d9d3afc +Block 0015 [ 12]: c17a2d030b8b69ba +Block 0015 [ 13]: b7e3fcba56fd92b4 +Block 0015 [ 14]: 55590ed2d6873531 +Block 0015 [ 15]: 1dd55802c3af0284 +Block 0015 [ 16]: 627b98d51e7d1a7c +Block 0015 [ 17]: e29afac9fbac4919 +Block 0015 [ 18]: bbf2da6ff5909bb1 +Block 0015 [ 19]: 3b32e7edbe95f4b8 +Block 0015 [ 20]: cb079b6aab21f5f6 +Block 0015 [ 21]: 249766d55216f91b +Block 0015 [ 22]: 73f12b90f2141fb4 +Block 0015 [ 23]: 9bce2173ff2c4648 +Block 0015 [ 24]: b8c9fc1983ce5225 +Block 0015 [ 25]: 518bd4b370df77d1 +Block 0015 [ 26]: fe3ef246f24fbe85 +Block 0015 [ 27]: 2a55a2c25d1e8092 +Block 0015 [ 28]: 3175467c6b826aad +Block 0015 [ 29]: 542eecc9f9329ddc +Block 0015 [ 30]: 6d578ceeffd6443f +Block 0015 [ 31]: 36957998d6304ca0 +Block 0015 [ 32]: f38e5b60db371ba3 +Block 0015 [ 33]: adcd63e573d6d1d6 +Block 0015 [ 34]: e0b3241d8998c718 +Block 0015 [ 35]: e975d85c9ed509b1 +Block 0015 [ 36]: 43400dc263942f07 +Block 0015 [ 37]: bbd70c7d2d975ff6 +Block 0015 [ 38]: 08f6a406873f1c3d +Block 0015 [ 39]: 2c2c43a20f7094b8 +Block 0015 [ 40]: 2fc707898b9c426e +Block 0015 [ 41]: cc26a970aeb682f6 +Block 0015 [ 42]: 3200da0a96adedf8 +Block 0015 [ 43]: 10472bb55cef7373 +Block 0015 [ 44]: 7a434a0b29b2840f +Block 0015 [ 45]: f4cbd065866cd338 +Block 0015 [ 46]: 6d4a6cec78e4060e +Block 0015 [ 47]: d2cb64f0f26bd67c +Block 0015 [ 48]: 61944777d05d951e +Block 0015 [ 49]: f26d818850c7677c +Block 0015 [ 50]: 40d774d58b5bd2bd +Block 0015 [ 51]: 06de2e113d247652 +Block 0015 [ 52]: d65d143565d2a655 +Block 0015 [ 53]: 415bf9a3fbcd058c +Block 0015 [ 54]: c7c8463a62c2f5c1 +Block 0015 [ 55]: 1f28341958af298b +Block 0015 [ 56]: 815d6569ad4d8ad3 +Block 0015 [ 57]: 65572ea3e5ad177d +Block 0015 [ 58]: cd2e5a09bec730bf +Block 0015 [ 59]: c34b3aa86255aba8 +Block 0015 [ 60]: 6562cf377b9a4afb +Block 0015 [ 61]: 4617ea9bbd4958fa +Block 0015 [ 62]: 2495d4cbf49e49de +Block 0015 [ 63]: 630506139887c342 +Block 0015 [ 64]: 7625ad38357a61d2 +Block 0015 [ 65]: bb8190ead706d07e +Block 0015 [ 66]: 9bdc83c71765309e +Block 0015 [ 67]: a7d137f733a27b67 +Block 0015 [ 68]: 54fafb19769caaa1 +Block 0015 [ 69]: c19c792f768ca925 +Block 0015 [ 70]: d8bea44c81c7658f +Block 0015 [ 71]: a6eb6215c6a59748 +Block 0015 [ 72]: fd15d732c1b31ebf +Block 0015 [ 73]: dfdb5b469b911033 +Block 0015 [ 74]: c66c55a55b87dd6a +Block 0015 [ 75]: e0d409cd710f43c1 +Block 0015 [ 76]: c4b643585e9e14f2 +Block 0015 [ 77]: 30265a5a01666abe +Block 0015 [ 78]: b822366f9b7f61fd +Block 0015 [ 79]: 5f6805b698a28154 +Block 0015 [ 80]: a5097b0cb31eff3e +Block 0015 [ 81]: 1dd47a154c05ea75 +Block 0015 [ 82]: 36d0a7a0a3ebe6de +Block 0015 [ 83]: ceae8ceb45cba297 +Block 0015 [ 84]: 1bace6b5856e12c9 +Block 0015 [ 85]: 36c73df6ddf75167 +Block 0015 [ 86]: f7d174736c6e676a +Block 0015 [ 87]: e60790c5d7e71a98 +Block 0015 [ 88]: dfe970afb98d7efe +Block 0015 [ 89]: 11192bffd60dc4ab +Block 0015 [ 90]: 7779c3b5819f97bf +Block 0015 [ 91]: 5cb53f840af6bdcd +Block 0015 [ 92]: 44ae27f6098c1f9e +Block 0015 [ 93]: 62835545eee575fd +Block 0015 [ 94]: 68fc7b52043d33a3 +Block 0015 [ 95]: 6212f393295bf32b +Block 0015 [ 96]: 956cf671200d8e76 +Block 0015 [ 97]: d535cf9a699971a6 +Block 0015 [ 98]: 6ea0dd8db2cd5795 +Block 0015 [ 99]: be774dbb1d3f838b +Block 0015 [100]: 603318927cc24df5 +Block 0015 [101]: 4306aeba83fa65c2 +Block 0015 [102]: 971f4603b634e6a4 +Block 0015 [103]: 08df12318be15bd4 +Block 0015 [104]: 78c916bc9c8af835 +Block 0015 [105]: 7a79893be28af6e3 +Block 0015 [106]: aa1565cf39e71f57 +Block 0015 [107]: a2518fef8f40884a +Block 0015 [108]: 4f50a2512b883063 +Block 0015 [109]: 224db521097e45b0 +Block 0015 [110]: ad2090c5df88b115 +Block 0015 [111]: 914c7ae4bb49a7ad +Block 0015 [112]: 13afbd9f5140d4a8 +Block 0015 [113]: e67f553ff5c7ffe6 +Block 0015 [114]: e0ea9cb29843527d +Block 0015 [115]: 4bcbc626e3ce3149 +Block 0015 [116]: 79e87f100ff4065e +Block 0015 [117]: 8091cbbfedea39a7 +Block 0015 [118]: 1ca3fa2f4899954c +Block 0015 [119]: aab5b8c150686443 +Block 0015 [120]: 64b7688a862fd4da +Block 0015 [121]: b6eb832a658ebd2a +Block 0015 [122]: 17979d3dcb358c74 +Block 0015 [123]: 6c7321e6ad62d763 +Block 0015 [124]: 454a5b778dad5e71 +Block 0015 [125]: 06f95cb760f63eac +Block 0015 [126]: cc520a4b29a88c88 +Block 0015 [127]: fe4b8f09014dff9f +Block 0016 [ 0]: 6b6b8299b7544ec8 +Block 0016 [ 1]: 2dbb57599a674be3 +Block 0016 [ 2]: 159b18bbb6ecc6a3 +Block 0016 [ 3]: 660a4a24394333c7 +Block 0016 [ 4]: d4601f439a2be46c +Block 0016 [ 5]: ecd216468c5463eb +Block 0016 [ 6]: fd9ce03453659fb6 +Block 0016 [ 7]: 78df3460997ba0e5 +Block 0016 [ 8]: b4c5d2709bb12a53 +Block 0016 [ 9]: 828fdfaeed6df627 +Block 0016 [ 10]: 09f6b577c2837324 +Block 0016 [ 11]: c66268994523b9bc +Block 0016 [ 12]: ccf7c3dc16831a70 +Block 0016 [ 13]: 209e46cce63b0dd5 +Block 0016 [ 14]: 22d9cfc02bab8310 +Block 0016 [ 15]: 731881b7af38c587 +Block 0016 [ 16]: fd47a81306380ccd +Block 0016 [ 17]: 0c0b9997a6796403 +Block 0016 [ 18]: 7c6cb0650780c844 +Block 0016 [ 19]: 4bc29837890a4f0f +Block 0016 [ 20]: 16b02858d67a4009 +Block 0016 [ 21]: a3794b3d0ee899af +Block 0016 [ 22]: 8564e1126ff91d30 +Block 0016 [ 23]: 09a4d961e7f0607e +Block 0016 [ 24]: 7d12bc7afbdfe937 +Block 0016 [ 25]: dbbf0fb80558efa3 +Block 0016 [ 26]: 3c73c66093bef941 +Block 0016 [ 27]: 6ee549f6c199bca2 +Block 0016 [ 28]: 5ac1d438db0194d6 +Block 0016 [ 29]: 7d2ed2b822df8076 +Block 0016 [ 30]: 7926528f7a19cf79 +Block 0016 [ 31]: 77ab595784cf2d3e +Block 0016 [ 32]: 74508b5b98db1802 +Block 0016 [ 33]: 5ad6e824297985d3 +Block 0016 [ 34]: a68a904fe8e766b9 +Block 0016 [ 35]: 2bc4f691c9348864 +Block 0016 [ 36]: 35223aef0a5cc8f2 +Block 0016 [ 37]: 3555eead6e8818fc +Block 0016 [ 38]: d842744228cb5744 +Block 0016 [ 39]: b4ab1d1a94e7f2f3 +Block 0016 [ 40]: 9a91ba199294fcb2 +Block 0016 [ 41]: b5cebefdf0f53e3b +Block 0016 [ 42]: b922a39e9ebbb6f2 +Block 0016 [ 43]: 017622ef687cf8c8 +Block 0016 [ 44]: e1946a2b6dd4a289 +Block 0016 [ 45]: 89f5ecc8a5bc50c2 +Block 0016 [ 46]: 5e44eabe9a78220f +Block 0016 [ 47]: af7dad98882c8ea5 +Block 0016 [ 48]: cded7b67851ac70a +Block 0016 [ 49]: 8f0a5d94c2bf7581 +Block 0016 [ 50]: cf759794cf82f5c4 +Block 0016 [ 51]: 52ec8b0b7930341b +Block 0016 [ 52]: b7f5f830b5041631 +Block 0016 [ 53]: 40557ff24816836b +Block 0016 [ 54]: 4924cc34b3c38777 +Block 0016 [ 55]: fb183663b0910a7a +Block 0016 [ 56]: 5688b0ed5a3694c5 +Block 0016 [ 57]: 4e6b6866ff7be69f +Block 0016 [ 58]: a5bbdda0972ef80b +Block 0016 [ 59]: 7f9602dc2786130b +Block 0016 [ 60]: 6f90952e6fd32e9e +Block 0016 [ 61]: 2976c5d47709830a +Block 0016 [ 62]: 369242fc7db856c6 +Block 0016 [ 63]: badcb263ff876336 +Block 0016 [ 64]: 5e1ae252cf7c660a +Block 0016 [ 65]: a6659303195743dc +Block 0016 [ 66]: 856f50f369e04d85 +Block 0016 [ 67]: b87f07258403769a +Block 0016 [ 68]: 33992b9b25d692bd +Block 0016 [ 69]: 4a0b5d6218a41006 +Block 0016 [ 70]: 3c37317fe37662bf +Block 0016 [ 71]: 1baba6fed257c4c8 +Block 0016 [ 72]: f0cd28f6bb911cf8 +Block 0016 [ 73]: e5761b0cc3f4a001 +Block 0016 [ 74]: 768b71c52a70eab0 +Block 0016 [ 75]: 7db5ed7f4c1ef039 +Block 0016 [ 76]: 78d38d1a4d9f6010 +Block 0016 [ 77]: 42149147a519d29f +Block 0016 [ 78]: 10274d8b80ef4a84 +Block 0016 [ 79]: 1bcb4169f9f5eca5 +Block 0016 [ 80]: 8080874425722c0f +Block 0016 [ 81]: d30f56e184749fbf +Block 0016 [ 82]: 13c9ec5c3d4211f5 +Block 0016 [ 83]: 336b9f7a4e19b359 +Block 0016 [ 84]: d117bda81fcf17ab +Block 0016 [ 85]: 55857cb4924b5bb5 +Block 0016 [ 86]: 7b00db4bcf2ace67 +Block 0016 [ 87]: efa6e895257c9dd7 +Block 0016 [ 88]: 5139fb4c4b935b24 +Block 0016 [ 89]: 2feaf6f70f9fc604 +Block 0016 [ 90]: ee9c2dd9c238232a +Block 0016 [ 91]: a85201b5e8ef1918 +Block 0016 [ 92]: b05201dfaf17a564 +Block 0016 [ 93]: 878cc2037453c301 +Block 0016 [ 94]: 98ecda8b2afe34e5 +Block 0016 [ 95]: 6262816e83d8dc79 +Block 0016 [ 96]: 7d77e2bceb694e30 +Block 0016 [ 97]: ad3b4a848289b4ab +Block 0016 [ 98]: 712fd94ed41ce643 +Block 0016 [ 99]: 35297c592ee58baf +Block 0016 [100]: d36c6b3c14a64c28 +Block 0016 [101]: e95d95c3720d633f +Block 0016 [102]: 89b8341d64e6cc30 +Block 0016 [103]: 628d4402248e242d +Block 0016 [104]: cf352f1abb75d74b +Block 0016 [105]: 111c71103148d99e +Block 0016 [106]: 0ae63ebb34a344f1 +Block 0016 [107]: 14aaed20bd8b8291 +Block 0016 [108]: aab94fc361a452b7 +Block 0016 [109]: f331f918ab5ee676 +Block 0016 [110]: 4b642391284c6ed8 +Block 0016 [111]: 42e1197aee18fb4f +Block 0016 [112]: 976b5714f428a15b +Block 0016 [113]: c520ddb7da18def8 +Block 0016 [114]: 07f7f2acea09e1d8 +Block 0016 [115]: fb2d08080e33afbb +Block 0016 [116]: cf65922568a8119a +Block 0016 [117]: 4eb17eca9ba107d0 +Block 0016 [118]: b0375b3187f0a9b0 +Block 0016 [119]: 6c7041bef30e3b40 +Block 0016 [120]: 308f7fd4baf2a106 +Block 0016 [121]: 51d5c01ce50b57df +Block 0016 [122]: 2d9965e67ef469e8 +Block 0016 [123]: 50bca96e25dc1e94 +Block 0016 [124]: fc66e8f3903164ee +Block 0016 [125]: f2c7dcf89787e187 +Block 0016 [126]: 663bba6642f4329a +Block 0016 [127]: d3c267a2da821e5a +Block 0017 [ 0]: fcfdc3df1c946197 +Block 0017 [ 1]: 6d3a7f8b138b68b7 +Block 0017 [ 2]: e8c5fd655d0f8fb7 +Block 0017 [ 3]: 0240b93cca7ec55f +Block 0017 [ 4]: e78c58c267172d23 +Block 0017 [ 5]: 3fe304db80db7083 +Block 0017 [ 6]: fa3860b74b1868e9 +Block 0017 [ 7]: 0d784d59a6fa4f0e +Block 0017 [ 8]: c1e151c95455076a +Block 0017 [ 9]: 5feb20e609a58be8 +Block 0017 [ 10]: 8093301a607a4b84 +Block 0017 [ 11]: 1667dae45ba06926 +Block 0017 [ 12]: b416d57b17811d86 +Block 0017 [ 13]: acbce71ff949098d +Block 0017 [ 14]: 77a0cd27521206f2 +Block 0017 [ 15]: e5a9f80eda0e2d6c +Block 0017 [ 16]: b4d7a75fee54f8e5 +Block 0017 [ 17]: fe86b8dcca89692d +Block 0017 [ 18]: 8361819f8e48814b +Block 0017 [ 19]: 996dcd01c5ddea4e +Block 0017 [ 20]: 8fd62784132a601a +Block 0017 [ 21]: 38ba7e7ac1c175ed +Block 0017 [ 22]: dfb306c54cf71426 +Block 0017 [ 23]: 00967a5af80d646c +Block 0017 [ 24]: a255c76fea4d0609 +Block 0017 [ 25]: 462b07780caa6d81 +Block 0017 [ 26]: 84b08d3b74ff87ca +Block 0017 [ 27]: d0562df36fd7c6d2 +Block 0017 [ 28]: 6d1a47eed84ddb02 +Block 0017 [ 29]: 6238a05d0116d9a2 +Block 0017 [ 30]: 6d29b2173a807c05 +Block 0017 [ 31]: fd87f368e8965a70 +Block 0017 [ 32]: 90f3e8279034ac89 +Block 0017 [ 33]: 8497a7b5e99eae27 +Block 0017 [ 34]: ae40662b4abc0132 +Block 0017 [ 35]: 6885d2f92cacfebe +Block 0017 [ 36]: d86eac1dba8b2822 +Block 0017 [ 37]: 64da53ae09100afd +Block 0017 [ 38]: 671f21aac24550f9 +Block 0017 [ 39]: 27258e7d1f12748a +Block 0017 [ 40]: 64bcd532eca9903c +Block 0017 [ 41]: c43d4f5d599a450e +Block 0017 [ 42]: b4e2b1ffaee50dba +Block 0017 [ 43]: 190338b27bfca99f +Block 0017 [ 44]: 64528d8b69004613 +Block 0017 [ 45]: d48293de39ac0e6e +Block 0017 [ 46]: 25c238dde29f05a0 +Block 0017 [ 47]: ccddfeea898b0b31 +Block 0017 [ 48]: ea1c6839dd274cdf +Block 0017 [ 49]: 2fa7e6ddccc9c005 +Block 0017 [ 50]: 7d2d05e2d93e6e37 +Block 0017 [ 51]: 2f0ffc8c74ed3fc6 +Block 0017 [ 52]: 996c6e452180fa46 +Block 0017 [ 53]: e877e033c2758860 +Block 0017 [ 54]: 6bfd51bac35e1dc4 +Block 0017 [ 55]: a06551f72fe3a0e7 +Block 0017 [ 56]: cfbfb75ea65b4774 +Block 0017 [ 57]: daa545f34527a9f1 +Block 0017 [ 58]: a56f2c7bb59fd56a +Block 0017 [ 59]: 0865420cffd781c2 +Block 0017 [ 60]: cd0d74d18e97ef59 +Block 0017 [ 61]: 2d1b5a4a080a4a04 +Block 0017 [ 62]: 0323cb2335ad4259 +Block 0017 [ 63]: cfe0ef15e403e696 +Block 0017 [ 64]: cda2bf85e5c1d3c3 +Block 0017 [ 65]: e35648924e2e166e +Block 0017 [ 66]: c18265bbb84c09ea +Block 0017 [ 67]: 26fbc2832f7742a7 +Block 0017 [ 68]: fc91a5047cbe7065 +Block 0017 [ 69]: 06ac77aba6a36972 +Block 0017 [ 70]: a54b48b2c521529c +Block 0017 [ 71]: bff56e3103927512 +Block 0017 [ 72]: aa56df749934c277 +Block 0017 [ 73]: e4cbc3eb16580852 +Block 0017 [ 74]: 605985b507b8a17c +Block 0017 [ 75]: 5b49a190ef882cde +Block 0017 [ 76]: 9556eedf7b110989 +Block 0017 [ 77]: 5a837ddf8991603d +Block 0017 [ 78]: 62f928de75fbb9e2 +Block 0017 [ 79]: 87ccfff3728e7e4f +Block 0017 [ 80]: cd0081aa3eef7d91 +Block 0017 [ 81]: 3e1f7753627235c2 +Block 0017 [ 82]: ee7eead4d40598d4 +Block 0017 [ 83]: fd2ad86ece0e4d93 +Block 0017 [ 84]: 7511e10b5b4abe92 +Block 0017 [ 85]: 7cc7b0493ce49e28 +Block 0017 [ 86]: 9b0caf208e867909 +Block 0017 [ 87]: ec70b4e586a3dce4 +Block 0017 [ 88]: 7461b2471fde9e63 +Block 0017 [ 89]: 52dc1872c33e2273 +Block 0017 [ 90]: 5a793766c52e8c82 +Block 0017 [ 91]: f42cf278970327f5 +Block 0017 [ 92]: beb03ae0d86eb797 +Block 0017 [ 93]: e4e73466fb304d15 +Block 0017 [ 94]: e9658ed6be6f6081 +Block 0017 [ 95]: e12fa6cca1cc02fd +Block 0017 [ 96]: 9f57cae8c852f2d1 +Block 0017 [ 97]: 123c5896fa6814db +Block 0017 [ 98]: b0c9148dfbed76a2 +Block 0017 [ 99]: 46410406d1af9473 +Block 0017 [100]: fae3e7941e5beb9f +Block 0017 [101]: edb066d11372355f +Block 0017 [102]: 6a6cb2ce8df9fa25 +Block 0017 [103]: 283e06e02cee0bc6 +Block 0017 [104]: d7105a3c22517163 +Block 0017 [105]: 911a160616853a57 +Block 0017 [106]: 5989406740b373cb +Block 0017 [107]: 4c9483a19b057503 +Block 0017 [108]: ebb7b709242d8fac +Block 0017 [109]: c0a6f69ce7099f04 +Block 0017 [110]: 191a7a033cb52c1b +Block 0017 [111]: 91f9b8e107f40569 +Block 0017 [112]: 9f1b4416b2b3e3bb +Block 0017 [113]: 79cad712977dc9a5 +Block 0017 [114]: b073ef8ce6768e7c +Block 0017 [115]: 45ec92a6d569c94f +Block 0017 [116]: faf83f399b5188cf +Block 0017 [117]: d67394ddcc90be8b +Block 0017 [118]: 4a0ccd308297588e +Block 0017 [119]: 65afc3485290a1ae +Block 0017 [120]: 875bf5efb8c4135b +Block 0017 [121]: 0325974e7c089ce9 +Block 0017 [122]: 833655a2a7093406 +Block 0017 [123]: 60e8577d82cdfcfc +Block 0017 [124]: 4047226b5fea5e12 +Block 0017 [125]: e4f2c4185dce67dc +Block 0017 [126]: 8dc296b99cd157ed +Block 0017 [127]: d06c5a12cc83f875 +Block 0018 [ 0]: 506b9dff8f66dfc9 +Block 0018 [ 1]: 77ebc8f2b790b075 +Block 0018 [ 2]: 5f6b43fa7674a697 +Block 0018 [ 3]: 2c5180ec36e6e9f9 +Block 0018 [ 4]: eea72969852a0b14 +Block 0018 [ 5]: 5b9ba92ef08a91ca +Block 0018 [ 6]: e44afbd53674fa86 +Block 0018 [ 7]: c751b97cd72874d0 +Block 0018 [ 8]: 98e2cfceaaf5b987 +Block 0018 [ 9]: 59e7c20104d52b86 +Block 0018 [ 10]: fe9783d8f50e8564 +Block 0018 [ 11]: ec2ff6e16517d28c +Block 0018 [ 12]: 2ccc3bad6621a17d +Block 0018 [ 13]: a177b2be6b2fecdb +Block 0018 [ 14]: 703922963cc27392 +Block 0018 [ 15]: 466f05721fe0afb5 +Block 0018 [ 16]: 66aaeb6b2b42733b +Block 0018 [ 17]: ba33703147105331 +Block 0018 [ 18]: 67946b26659261f0 +Block 0018 [ 19]: 82e8278754222efb +Block 0018 [ 20]: e508acd54b0b5386 +Block 0018 [ 21]: 835d1e501fa5c24b +Block 0018 [ 22]: fb337e256303eeb5 +Block 0018 [ 23]: 01a9432585bbcb92 +Block 0018 [ 24]: e714b55e218ec12b +Block 0018 [ 25]: 26f6d3b38162143f +Block 0018 [ 26]: 52c4b662a35d8518 +Block 0018 [ 27]: e591f3bd01a0f260 +Block 0018 [ 28]: be97dfe523580591 +Block 0018 [ 29]: e87de0ecafea4e2b +Block 0018 [ 30]: 8c50573e84c5dbac +Block 0018 [ 31]: a104c4fa704fef54 +Block 0018 [ 32]: b31e99ab31889f9b +Block 0018 [ 33]: 2a5bae12c632ed66 +Block 0018 [ 34]: 3131689530cb91f8 +Block 0018 [ 35]: 86ecc03640aec2f2 +Block 0018 [ 36]: 360d5c87abde1d98 +Block 0018 [ 37]: 87628cc7a9c7e439 +Block 0018 [ 38]: bdec97daaf4fbed1 +Block 0018 [ 39]: cb135fa0dd1401b6 +Block 0018 [ 40]: 5d3498e58bd5cdaf +Block 0018 [ 41]: b21a2e740b18d3f3 +Block 0018 [ 42]: 04a56c431529e670 +Block 0018 [ 43]: 6dfc2e1b8a624915 +Block 0018 [ 44]: 4807e0a62fa02d8f +Block 0018 [ 45]: 045d5ee489190cbf +Block 0018 [ 46]: de6f7133d497b091 +Block 0018 [ 47]: 0d29ac253d7cf301 +Block 0018 [ 48]: 5d017136a4bf6d4b +Block 0018 [ 49]: 273bea5c28ef2afa +Block 0018 [ 50]: aa3380fd789085b7 +Block 0018 [ 51]: 06184d12fb6e646f +Block 0018 [ 52]: 9e8e7be60ce7be29 +Block 0018 [ 53]: da4b77cac5e3a44a +Block 0018 [ 54]: f18f7d0282e3ff2f +Block 0018 [ 55]: ffdf17f661f5a782 +Block 0018 [ 56]: baee89cd6027332d +Block 0018 [ 57]: e750340705b997f0 +Block 0018 [ 58]: 8d6d0c0638a27b0d +Block 0018 [ 59]: 8370de31338de210 +Block 0018 [ 60]: d19afe6daf1f6c6a +Block 0018 [ 61]: 6ca9730711d17695 +Block 0018 [ 62]: 28b287d8094da73d +Block 0018 [ 63]: d53cfc855e567583 +Block 0018 [ 64]: 0528fa8214051972 +Block 0018 [ 65]: e4326c77e19bc8e3 +Block 0018 [ 66]: 566e44790f3ff080 +Block 0018 [ 67]: 7a5fecedb6ac443e +Block 0018 [ 68]: f8d783bf81737ea2 +Block 0018 [ 69]: f328ef1493e09ad4 +Block 0018 [ 70]: 014d01edb2f1fec2 +Block 0018 [ 71]: 56090da3432688f0 +Block 0018 [ 72]: 756a65d5d144e7ab +Block 0018 [ 73]: b0387d690442e8ca +Block 0018 [ 74]: bcdc99a6c9701d94 +Block 0018 [ 75]: eb07a08cbfa32e3d +Block 0018 [ 76]: bea66981aba9da32 +Block 0018 [ 77]: 53437e3ee89e8180 +Block 0018 [ 78]: 1216da56618bf2a0 +Block 0018 [ 79]: 02dcbade81e80fef +Block 0018 [ 80]: fa9c42aa06f8dc27 +Block 0018 [ 81]: 143b6085501c079b +Block 0018 [ 82]: 3a7d6e1fbe910f7b +Block 0018 [ 83]: 84c10aa8f298dff1 +Block 0018 [ 84]: 6e7b1471d59c528b +Block 0018 [ 85]: bef312137a52bb94 +Block 0018 [ 86]: ef0fd8e81e404951 +Block 0018 [ 87]: 09d61611c24f84bf +Block 0018 [ 88]: f4bc2dc495584550 +Block 0018 [ 89]: eca233aae56be950 +Block 0018 [ 90]: 7c99caec1b8fbdfb +Block 0018 [ 91]: 28fe5488cc443c00 +Block 0018 [ 92]: f6987d2cb9da913e +Block 0018 [ 93]: 182e7544698569a9 +Block 0018 [ 94]: 80dbf54b72f5becb +Block 0018 [ 95]: 79a6c4c1318f7efb +Block 0018 [ 96]: 1dbff052ca33d753 +Block 0018 [ 97]: 4882194ca6f60741 +Block 0018 [ 98]: 770609181b43290f +Block 0018 [ 99]: fc262452312f6f79 +Block 0018 [100]: a4bcf7f51f733216 +Block 0018 [101]: c0ce7300a630e981 +Block 0018 [102]: f70d856b7f98cb0b +Block 0018 [103]: d287a4e4efc61485 +Block 0018 [104]: ad1be4004f9b4d90 +Block 0018 [105]: cafbf67a7a6c972f +Block 0018 [106]: 348471e3fe197c24 +Block 0018 [107]: ff5e95a969c83de6 +Block 0018 [108]: 409e12a717ca4b5a +Block 0018 [109]: 44cba534a035fbe9 +Block 0018 [110]: e97071f5b82453bc +Block 0018 [111]: b81fffd5e3411461 +Block 0018 [112]: fc18781ee372ab3f +Block 0018 [113]: b0693a61adddcbbd +Block 0018 [114]: 195c25844390b153 +Block 0018 [115]: 8f3e3ca6db496b51 +Block 0018 [116]: 69e2431f8f101f99 +Block 0018 [117]: 9228889034350cca +Block 0018 [118]: ebb7804d727feb62 +Block 0018 [119]: 498247e41ed29b72 +Block 0018 [120]: 32a24f0ac18beca9 +Block 0018 [121]: 09a432090643383b +Block 0018 [122]: 53e59d3caece1007 +Block 0018 [123]: 7b921f24930ac8dc +Block 0018 [124]: 17429db79612b532 +Block 0018 [125]: 32e4ccf3a816a341 +Block 0018 [126]: 53b02b523e641324 +Block 0018 [127]: 0929ccfcd333ef75 +Block 0019 [ 0]: 33e8d34b96a01194 +Block 0019 [ 1]: 456c32397eb0894c +Block 0019 [ 2]: 65f01bdf2b710523 +Block 0019 [ 3]: 1dc93d65920c5bab +Block 0019 [ 4]: 42c36f92c0ffd279 +Block 0019 [ 5]: a10d02d32c435128 +Block 0019 [ 6]: daa8fd35e22e7b0d +Block 0019 [ 7]: b3ef2ff8a04c3286 +Block 0019 [ 8]: 49496b0690707e8c +Block 0019 [ 9]: 8cae1bddf0b87419 +Block 0019 [ 10]: 34af6f0f333b6a73 +Block 0019 [ 11]: 9bc57b3ca9ad1aae +Block 0019 [ 12]: 4a84296458f08564 +Block 0019 [ 13]: 0382cdf60c0d61e6 +Block 0019 [ 14]: 383ffd993ca3a949 +Block 0019 [ 15]: d63f97665f89336b +Block 0019 [ 16]: 7770de57cc5c502d +Block 0019 [ 17]: 463aa97d108ea115 +Block 0019 [ 18]: 207e1c3c04d2f1c5 +Block 0019 [ 19]: 044e34d20ee5533d +Block 0019 [ 20]: 2d97f42d289e2be7 +Block 0019 [ 21]: 4c9ffb0c99dbd232 +Block 0019 [ 22]: 360d6c2d9242376b +Block 0019 [ 23]: d1a2d9f5c38b2196 +Block 0019 [ 24]: d59b5ecb66fa715d +Block 0019 [ 25]: d891f9b36c4cd181 +Block 0019 [ 26]: 9233c0d197b1e01b +Block 0019 [ 27]: 880e6ab061a568bf +Block 0019 [ 28]: 751bf0b45c77097c +Block 0019 [ 29]: f5efc6d5aed55271 +Block 0019 [ 30]: afef1f697de4cc72 +Block 0019 [ 31]: 47bc3efeacfb1d8d +Block 0019 [ 32]: 452c5045d2f478ab +Block 0019 [ 33]: ef0e422a51a4df0a +Block 0019 [ 34]: d5820f7da222bf7c +Block 0019 [ 35]: 1a33e2dbc09e14b8 +Block 0019 [ 36]: 182abf3da51c3790 +Block 0019 [ 37]: eb43140f75787e50 +Block 0019 [ 38]: 83ee465fb1646fd7 +Block 0019 [ 39]: b0974362ea612ca8 +Block 0019 [ 40]: 6ecf1aed4945275b +Block 0019 [ 41]: b2b61e5feffc7da5 +Block 0019 [ 42]: 256afa7a9e79a9e7 +Block 0019 [ 43]: b8700d5519ea31b9 +Block 0019 [ 44]: f9705c5c75795590 +Block 0019 [ 45]: c985bdee35ef9975 +Block 0019 [ 46]: 2704e5851930ef96 +Block 0019 [ 47]: 1a0fab98a8eeb146 +Block 0019 [ 48]: 2b3f8e80c613ab04 +Block 0019 [ 49]: 50eb91eab2776883 +Block 0019 [ 50]: 5e84a7b8972ac0b9 +Block 0019 [ 51]: 912f4062a68db567 +Block 0019 [ 52]: 18d2895a53a5921a +Block 0019 [ 53]: 72b6255c917acc9d +Block 0019 [ 54]: ca6cbff869322dd0 +Block 0019 [ 55]: eef952be691a20f5 +Block 0019 [ 56]: 6f705f130dfb1557 +Block 0019 [ 57]: bf412cc1f48530d8 +Block 0019 [ 58]: 058cc43ca302c665 +Block 0019 [ 59]: 632f5f954bc426bc +Block 0019 [ 60]: 216b8ee983257087 +Block 0019 [ 61]: 729d14711002bfba +Block 0019 [ 62]: 8cb7a6c5b30b023f +Block 0019 [ 63]: eb895614190db8e6 +Block 0019 [ 64]: 00f6b51593d0001c +Block 0019 [ 65]: c9c6c2f0de55bd01 +Block 0019 [ 66]: 90930dbe0fd64cb7 +Block 0019 [ 67]: 23259875ae38f2cf +Block 0019 [ 68]: 0ba1b821cbdaf400 +Block 0019 [ 69]: 512916bec94d30f5 +Block 0019 [ 70]: 4cbe59d184551f56 +Block 0019 [ 71]: 1b4758db954f1af2 +Block 0019 [ 72]: 428689d6d6e69a0e +Block 0019 [ 73]: 52551a4b2d531690 +Block 0019 [ 74]: 6f77b382d7139995 +Block 0019 [ 75]: d56cc7dc1d2a8ebe +Block 0019 [ 76]: d188bc8c7e0976b6 +Block 0019 [ 77]: 04d67c02573fe79b +Block 0019 [ 78]: 8b87e81756afe094 +Block 0019 [ 79]: 6406121e3bce2c3a +Block 0019 [ 80]: d23e625bbb09019c +Block 0019 [ 81]: 1bee10418eb08329 +Block 0019 [ 82]: 7be1dc14844c01e7 +Block 0019 [ 83]: 91962c941bd83082 +Block 0019 [ 84]: 640a363630d4772b +Block 0019 [ 85]: f63c927e04a4ba60 +Block 0019 [ 86]: eb69466de921d59c +Block 0019 [ 87]: ed7b4721c81f09e2 +Block 0019 [ 88]: c80be87f1549bd5f +Block 0019 [ 89]: a14a421ac5647f3b +Block 0019 [ 90]: 0b5a9db32d7fe7b1 +Block 0019 [ 91]: c00d02fa54401973 +Block 0019 [ 92]: 6c39bdb781e2a2fb +Block 0019 [ 93]: 36cec55cd30d0f07 +Block 0019 [ 94]: 2cf36013bcd3c69c +Block 0019 [ 95]: 5e4f2edb6657692c +Block 0019 [ 96]: 091ea4bc2a7b809b +Block 0019 [ 97]: f3cb77b9e1af72d1 +Block 0019 [ 98]: ee5ff9dc0fd47a05 +Block 0019 [ 99]: dfcd6c3dc2bfcc56 +Block 0019 [100]: f144bf7c7971f6cb +Block 0019 [101]: c3bc32b647c6116b +Block 0019 [102]: da51fbd339bb8629 +Block 0019 [103]: e0f5104e1e073f52 +Block 0019 [104]: 80eabe1f52fac945 +Block 0019 [105]: b3e50ec9dd215058 +Block 0019 [106]: 841fb9a746f218b5 +Block 0019 [107]: 97b5ab9e6340c839 +Block 0019 [108]: 0f58c48d1c8dfc7d +Block 0019 [109]: e775d0923861572f +Block 0019 [110]: f6a445b60873fd29 +Block 0019 [111]: 321d5c299f3a792a +Block 0019 [112]: 167f87905283f049 +Block 0019 [113]: d3a020474f4fb545 +Block 0019 [114]: bab29108eb5c88d3 +Block 0019 [115]: 3a20e0370a1b8925 +Block 0019 [116]: 798fe12f9b6900aa +Block 0019 [117]: ab6c723abdfce5eb +Block 0019 [118]: 02ca78dfbdd788fb +Block 0019 [119]: 4bb50c93fc01969f +Block 0019 [120]: b2370576435c57b9 +Block 0019 [121]: 487a9abad653352f +Block 0019 [122]: bce2e11433162789 +Block 0019 [123]: 803a8adad602226f +Block 0019 [124]: 4e7fb4ec6b000d6f +Block 0019 [125]: c2fe3f7c260f6f0d +Block 0019 [126]: 21ff5ba529b232ee +Block 0019 [127]: 13400b66c4f76b82 +Block 0020 [ 0]: 89e2081ab56e78b2 +Block 0020 [ 1]: 9d963e394a7fb51b +Block 0020 [ 2]: c70adaee1eea37a9 +Block 0020 [ 3]: 69a9c964557a3b79 +Block 0020 [ 4]: c9f94cb30f3f58e2 +Block 0020 [ 5]: f0b2b2f23b6a6e85 +Block 0020 [ 6]: 42a4ab31999785bd +Block 0020 [ 7]: 8e9c274e43e9b45e +Block 0020 [ 8]: de3e2ceae9a6fe03 +Block 0020 [ 9]: da1b6677984cdfe8 +Block 0020 [ 10]: f48a0d27047fb866 +Block 0020 [ 11]: fc08a550adc9d9de +Block 0020 [ 12]: abf2c0384cbb0323 +Block 0020 [ 13]: 293cd3700767b4be +Block 0020 [ 14]: fc5d6f6596e7c186 +Block 0020 [ 15]: 8803591e7d0dbf4e +Block 0020 [ 16]: f97659a838f29b36 +Block 0020 [ 17]: d972e1b0be0d4aab +Block 0020 [ 18]: 4b2b7dfe0b815a55 +Block 0020 [ 19]: dc27f9ee2b42d875 +Block 0020 [ 20]: b3cba9ebfff5b2c9 +Block 0020 [ 21]: aa62216b5929178e +Block 0020 [ 22]: 84f2c8289ad8f965 +Block 0020 [ 23]: 9e7b7d736f2ac92d +Block 0020 [ 24]: fbefb819d94b2750 +Block 0020 [ 25]: df3f3904db85a3ff +Block 0020 [ 26]: 8016900bfb6445da +Block 0020 [ 27]: c16dece77f8c7e00 +Block 0020 [ 28]: a330a89ec3a5567f +Block 0020 [ 29]: a59a7c9114a83803 +Block 0020 [ 30]: 26fa6bdaca72d62b +Block 0020 [ 31]: ffcedf85d5126dd4 +Block 0020 [ 32]: 1cd608003aeac1e5 +Block 0020 [ 33]: c10289c6d8f9d74e +Block 0020 [ 34]: 554a650031d37d60 +Block 0020 [ 35]: e49707264df0b4b0 +Block 0020 [ 36]: 9c9b855d35883c29 +Block 0020 [ 37]: 7639c20cdf1a73fc +Block 0020 [ 38]: c7b98180b14d8b44 +Block 0020 [ 39]: bcca9a6a5ff0e814 +Block 0020 [ 40]: 934da896cc350c97 +Block 0020 [ 41]: 4a7fd6c54c483639 +Block 0020 [ 42]: 03c35c2d2f3d1bb9 +Block 0020 [ 43]: 91aefa9f69fca3f6 +Block 0020 [ 44]: a6b57e87ac0557bc +Block 0020 [ 45]: c734e8728042bf42 +Block 0020 [ 46]: ce8619b03a4fc81b +Block 0020 [ 47]: 1b2e4653286bd5a2 +Block 0020 [ 48]: 566a7ec3ffc55b63 +Block 0020 [ 49]: 3095290ad086d2ab +Block 0020 [ 50]: b7b900312f0d43ff +Block 0020 [ 51]: 4e59f9f7952cc456 +Block 0020 [ 52]: 2ae68fbd3c6898dd +Block 0020 [ 53]: f61aa0d9522ba762 +Block 0020 [ 54]: 908d6dc5774d9795 +Block 0020 [ 55]: 34a6f69f331e26ec +Block 0020 [ 56]: 1e358c8e233d737a +Block 0020 [ 57]: ef28c27583088746 +Block 0020 [ 58]: 8c0c1c359e4cf564 +Block 0020 [ 59]: e92e6baae855892e +Block 0020 [ 60]: 601707524fce7966 +Block 0020 [ 61]: ef1c20a0839a335f +Block 0020 [ 62]: bfa44ce166bbf8c9 +Block 0020 [ 63]: 75778fd2c93656ef +Block 0020 [ 64]: 4c9a92d24230b4e3 +Block 0020 [ 65]: 7393ba1c3f34f583 +Block 0020 [ 66]: def43e4128851116 +Block 0020 [ 67]: 1d0343325dd9afda +Block 0020 [ 68]: 77a184c56dd2daf1 +Block 0020 [ 69]: fa52d0755ef66fd6 +Block 0020 [ 70]: 19b6bfb6fc17b332 +Block 0020 [ 71]: 6023968314c86cf1 +Block 0020 [ 72]: e6ae971aa6ec62cf +Block 0020 [ 73]: 85c7ad07e1a21687 +Block 0020 [ 74]: 626397687c030509 +Block 0020 [ 75]: 423282a89b49ac4f +Block 0020 [ 76]: e37c8c15c1eaed62 +Block 0020 [ 77]: 3a40363589cb1bcb +Block 0020 [ 78]: 38896537a90b4de3 +Block 0020 [ 79]: a9453dd305d96c0c +Block 0020 [ 80]: e39cae1ab2e1286b +Block 0020 [ 81]: 3841a9433a6efbf3 +Block 0020 [ 82]: 6cc65c960c0d9c45 +Block 0020 [ 83]: 8241839366333155 +Block 0020 [ 84]: 928eff87a269246d +Block 0020 [ 85]: 732878e0f9bad41e +Block 0020 [ 86]: d6a1bfa526acb7a1 +Block 0020 [ 87]: 8ab9f839b3c056b0 +Block 0020 [ 88]: c4e6fbad32d6205d +Block 0020 [ 89]: 92ee8c80415b2c23 +Block 0020 [ 90]: d2298d8920afcf84 +Block 0020 [ 91]: b7663bbf35af559f +Block 0020 [ 92]: 24182e3fb8239f5f +Block 0020 [ 93]: 17b6bbbd54d66105 +Block 0020 [ 94]: d0dc543bd229a489 +Block 0020 [ 95]: a87c8ddf7e5eccc9 +Block 0020 [ 96]: f4ccea782545035d +Block 0020 [ 97]: 31b2c512d0e9b274 +Block 0020 [ 98]: 5ab11954f1112d4a +Block 0020 [ 99]: 36dd53c7b85c3853 +Block 0020 [100]: 0cdf8048a452cd87 +Block 0020 [101]: bcbe5c1dfc5ea36d +Block 0020 [102]: 8ed3c84091965d94 +Block 0020 [103]: 84a7ac74afd99f64 +Block 0020 [104]: cea3b16c8e688a0d +Block 0020 [105]: bab4db3705dc5573 +Block 0020 [106]: 679ba8e94cb1c0ee +Block 0020 [107]: 6ef5f18ba4f0e3ff +Block 0020 [108]: 8c4984673fc2ce2f +Block 0020 [109]: 60530f588bd74c30 +Block 0020 [110]: 48cb0a9a28b64c84 +Block 0020 [111]: 3c10b3d5beb4a79c +Block 0020 [112]: 7ff26d639992cf37 +Block 0020 [113]: 720aec460b083524 +Block 0020 [114]: 1e09d19b0e1a00dd +Block 0020 [115]: 8fe278ba6d1a9b20 +Block 0020 [116]: 68baf4f5d15623aa +Block 0020 [117]: 63bfc00118aad83a +Block 0020 [118]: 9d25e1848491d360 +Block 0020 [119]: 6cb99c493aefb52e +Block 0020 [120]: e2eee4f83fe4f010 +Block 0020 [121]: e5e0cef422585a9f +Block 0020 [122]: a19e517ec6959e25 +Block 0020 [123]: abf4475aa22fc3ce +Block 0020 [124]: bcad2f12feb07911 +Block 0020 [125]: 453c5d52011365de +Block 0020 [126]: 69897cc10d44fcaf +Block 0020 [127]: b95f9117d2fa4bfc +Block 0021 [ 0]: 2e53af0ffcf72453 +Block 0021 [ 1]: f4d2ee09bf6e68fa +Block 0021 [ 2]: 0309586ec4f1b841 +Block 0021 [ 3]: 04a6ee34c1719365 +Block 0021 [ 4]: ad8c7240f5745491 +Block 0021 [ 5]: cfadccd354d621e8 +Block 0021 [ 6]: 1fb50aa51f24373a +Block 0021 [ 7]: a0eaa951533cdbfc +Block 0021 [ 8]: 88e80be14fb09e20 +Block 0021 [ 9]: 5956e4b9a89aec1e +Block 0021 [ 10]: f23b6614d091d565 +Block 0021 [ 11]: a8d6810b1fd7b35b +Block 0021 [ 12]: d48796a1dcb92c52 +Block 0021 [ 13]: 3e38c2720cf8d123 +Block 0021 [ 14]: 497df05177535211 +Block 0021 [ 15]: 6987feb6811a5d13 +Block 0021 [ 16]: 40ffa042f1343f14 +Block 0021 [ 17]: cd8423bb29575e16 +Block 0021 [ 18]: b2f2250cadf6ee42 +Block 0021 [ 19]: cd9436ad7a906a5b +Block 0021 [ 20]: a4caba8291763463 +Block 0021 [ 21]: c0450b96a40e1d6f +Block 0021 [ 22]: 922df81edfc8672c +Block 0021 [ 23]: 19fd391d5149a693 +Block 0021 [ 24]: 274659cf928be9ac +Block 0021 [ 25]: f13f9c76b5e1e8b9 +Block 0021 [ 26]: 462a09302c07589f +Block 0021 [ 27]: 6233cce4bcb9604c +Block 0021 [ 28]: 5ada3f773b0a022e +Block 0021 [ 29]: d9824f52f60414bb +Block 0021 [ 30]: fd7d2b394bc7f935 +Block 0021 [ 31]: c652630acaa12963 +Block 0021 [ 32]: b87a925784883817 +Block 0021 [ 33]: 871730bf13fa35e3 +Block 0021 [ 34]: 75d410f433cf9075 +Block 0021 [ 35]: fc9d0f2388fb0755 +Block 0021 [ 36]: 637c2fbdc29699b3 +Block 0021 [ 37]: dcfc58f0240aab69 +Block 0021 [ 38]: 47f63e317ae148a8 +Block 0021 [ 39]: 6e85d5c81fabb692 +Block 0021 [ 40]: 6bbd7a0d80dceece +Block 0021 [ 41]: 5e8763c6ba1dfb3f +Block 0021 [ 42]: 2b67b9b1ee74cae6 +Block 0021 [ 43]: 44556e23b6a12a9c +Block 0021 [ 44]: da67accd90528c8e +Block 0021 [ 45]: c8d64e5987dbf1b8 +Block 0021 [ 46]: a4d299e996095736 +Block 0021 [ 47]: 45cecf89612ed432 +Block 0021 [ 48]: a9e0104756d4ed0a +Block 0021 [ 49]: 96bd5b592d58f449 +Block 0021 [ 50]: a1d4d76c43899d99 +Block 0021 [ 51]: ac92a47c2c3bb722 +Block 0021 [ 52]: a4b54abd56bef9ac +Block 0021 [ 53]: 145584fd48b6e654 +Block 0021 [ 54]: e2b2b5a236df9e1a +Block 0021 [ 55]: 78f71ca730c345f5 +Block 0021 [ 56]: c6653be2c128b6fc +Block 0021 [ 57]: 2b02761b0c1fa9f0 +Block 0021 [ 58]: d7d0ccaf5b6a4ef1 +Block 0021 [ 59]: 4eddcaf6ae19c5d6 +Block 0021 [ 60]: 986f18a1622df37e +Block 0021 [ 61]: 63fe2eafcfaa88ed +Block 0021 [ 62]: 697bb686eb310b15 +Block 0021 [ 63]: 4d36cbe576e44e76 +Block 0021 [ 64]: ecace5129f458bda +Block 0021 [ 65]: f8111733fa1c8bdb +Block 0021 [ 66]: c1b84cac574f86bb +Block 0021 [ 67]: d3c632fa66f74c20 +Block 0021 [ 68]: 3f443c021f0ccb3d +Block 0021 [ 69]: 68e6932baf806b66 +Block 0021 [ 70]: 58cddbf112d26752 +Block 0021 [ 71]: 540b5a73ebf324de +Block 0021 [ 72]: a6f78cb47fa04966 +Block 0021 [ 73]: 05dbc3e897e88dbb +Block 0021 [ 74]: 5400e9f8c028c0d1 +Block 0021 [ 75]: 3c70a7f46bd02139 +Block 0021 [ 76]: 110c4ae844cddb35 +Block 0021 [ 77]: bfa7d83241c23818 +Block 0021 [ 78]: edcaad25b8daf0a8 +Block 0021 [ 79]: 4e25f39c672fd3dd +Block 0021 [ 80]: f73c7d57898cbf89 +Block 0021 [ 81]: 68188c1c0cf25a53 +Block 0021 [ 82]: 2a9faf31cf04b569 +Block 0021 [ 83]: f9431287814fe37e +Block 0021 [ 84]: 243be3b90b38ba25 +Block 0021 [ 85]: 2ff865d3aabd376f +Block 0021 [ 86]: 517977a3c9ab4721 +Block 0021 [ 87]: 1344eb09e10d836d +Block 0021 [ 88]: 22352ab596708b45 +Block 0021 [ 89]: 70318e312b45713b +Block 0021 [ 90]: f1776ae5cdbb977c +Block 0021 [ 91]: 98ecf492f39168d7 +Block 0021 [ 92]: bd6eee889a309d69 +Block 0021 [ 93]: 42c87318994b9192 +Block 0021 [ 94]: e75487bdc5d5fc17 +Block 0021 [ 95]: f56246095cd3d83c +Block 0021 [ 96]: 95d38b3a2bee0e00 +Block 0021 [ 97]: eb854d1b0ae99bfa +Block 0021 [ 98]: 882415de5094207f +Block 0021 [ 99]: e7d79d750bb5a919 +Block 0021 [100]: ce6fac74067139d9 +Block 0021 [101]: 2e1e4eb6ba0bff7f +Block 0021 [102]: 6fd197b1fc11fbb7 +Block 0021 [103]: b50b9c7241ea857f +Block 0021 [104]: c5055a1cc6627673 +Block 0021 [105]: d10ef73892c24811 +Block 0021 [106]: 5fdece9bf5a0922c +Block 0021 [107]: d72210546b9ed17e +Block 0021 [108]: 67bc46392660cb91 +Block 0021 [109]: b9e5e47d1700a0a5 +Block 0021 [110]: 3cfc03ee00186042 +Block 0021 [111]: 79c5e50b190fef69 +Block 0021 [112]: ef4c795b859d9da3 +Block 0021 [113]: 2d35cec5c1107fe7 +Block 0021 [114]: c5af4ae73a397b8b +Block 0021 [115]: 991371cf40815432 +Block 0021 [116]: 14eb4ce84a65d07b +Block 0021 [117]: d59def0e00fdf27e +Block 0021 [118]: bf6a452ac1bdcaa9 +Block 0021 [119]: 2c8c674766f0864e +Block 0021 [120]: 5aacb9ad7aae4664 +Block 0021 [121]: e3bb57f7b3fdc1ef +Block 0021 [122]: 63ff45b42def5846 +Block 0021 [123]: 1fd1958c4fd3db2a +Block 0021 [124]: 1cc4429b52fe74f4 +Block 0021 [125]: 177bc5006d309d61 +Block 0021 [126]: df06b53a2374935f +Block 0021 [127]: 846f56c0e0199b09 +Block 0022 [ 0]: f0055544a8a66da3 +Block 0022 [ 1]: cdacd919de93783e +Block 0022 [ 2]: 97f4db38d37eeb63 +Block 0022 [ 3]: bbc6005afe3b391f +Block 0022 [ 4]: 39453f1a16a99f6e +Block 0022 [ 5]: de60a9e4640d8d2a +Block 0022 [ 6]: 62458a8a90a3d3cb +Block 0022 [ 7]: e1a0a8dddfd694e3 +Block 0022 [ 8]: f1910aa3624bd380 +Block 0022 [ 9]: be922abb3b4e3611 +Block 0022 [ 10]: 80c904701bfd133a +Block 0022 [ 11]: 3928fead5a645d9e +Block 0022 [ 12]: 4cc74f7f222d03ed +Block 0022 [ 13]: d0bc3853685a26f1 +Block 0022 [ 14]: 2f0fe1f6a7f76173 +Block 0022 [ 15]: dbcf422aa98d10d7 +Block 0022 [ 16]: 90e21ad1620963bb +Block 0022 [ 17]: db51c68d42dba8a1 +Block 0022 [ 18]: fafbae7409259cb2 +Block 0022 [ 19]: 52b69193864cc071 +Block 0022 [ 20]: 469d7827ed811032 +Block 0022 [ 21]: 14b2829c68b218b5 +Block 0022 [ 22]: 988892a5cb23313e +Block 0022 [ 23]: 7c5dca957c103b98 +Block 0022 [ 24]: df4bbc097a837981 +Block 0022 [ 25]: 2011417f5d39bd07 +Block 0022 [ 26]: eb9431f73df35f3d +Block 0022 [ 27]: 2009d2e8ac8ef52f +Block 0022 [ 28]: 8dab9e07d07f1b42 +Block 0022 [ 29]: 8e6a29c7f42c8637 +Block 0022 [ 30]: 3d1190f642641e80 +Block 0022 [ 31]: fced87abd38c315d +Block 0022 [ 32]: 04c4a8db5579b4fe +Block 0022 [ 33]: ea0cb649d964d9d7 +Block 0022 [ 34]: 70dd1c19230a475f +Block 0022 [ 35]: df22428fcc8f233e +Block 0022 [ 36]: 67cc6440482ef9a4 +Block 0022 [ 37]: ab95961940393dea +Block 0022 [ 38]: 7254b13ee0a68318 +Block 0022 [ 39]: f7b9c47a884d55cb +Block 0022 [ 40]: 189fbf3c55d2e89b +Block 0022 [ 41]: 9bd08c8067c10b08 +Block 0022 [ 42]: 597b3fbb3b1acb52 +Block 0022 [ 43]: 9f26e9bf7054c44c +Block 0022 [ 44]: ba90c0be3b113827 +Block 0022 [ 45]: 7ccf834cd647176a +Block 0022 [ 46]: f5e7f7c012401b91 +Block 0022 [ 47]: fb8bb2c9f8ee3a18 +Block 0022 [ 48]: bf00c504ea2160de +Block 0022 [ 49]: a9b185b64b2d534b +Block 0022 [ 50]: f9de1b7d13834000 +Block 0022 [ 51]: cc1b7969b3e035e0 +Block 0022 [ 52]: e6217156fbab7f7f +Block 0022 [ 53]: 286de6b5d5201f7f +Block 0022 [ 54]: cf012128fb6319ff +Block 0022 [ 55]: 76666fd989324c40 +Block 0022 [ 56]: 4ea7259afae53efb +Block 0022 [ 57]: 87a5ed4f0a8fff9b +Block 0022 [ 58]: 587c0fcfaad8121d +Block 0022 [ 59]: b97d07e01372cb75 +Block 0022 [ 60]: f2427574f2bd08a4 +Block 0022 [ 61]: c73ed9aa0a72f689 +Block 0022 [ 62]: 0e5b7d2cbd12bf6f +Block 0022 [ 63]: 257263442e299978 +Block 0022 [ 64]: 46c0b8d4fdbab0ee +Block 0022 [ 65]: 53a37a6e716a6747 +Block 0022 [ 66]: 7148161554525e66 +Block 0022 [ 67]: e29136a0ef2fca6c +Block 0022 [ 68]: b2495652b43df870 +Block 0022 [ 69]: d328dcac872d5623 +Block 0022 [ 70]: f025f96d1fe7181c +Block 0022 [ 71]: d857f1856f5821a9 +Block 0022 [ 72]: d0d1f3a0a6a3bfd2 +Block 0022 [ 73]: a394175356089b4a +Block 0022 [ 74]: dcb547e12b9f51dd +Block 0022 [ 75]: 03e89f2d8832bcd0 +Block 0022 [ 76]: 3fcf81ea646ffdec +Block 0022 [ 77]: 9811080c51ed8898 +Block 0022 [ 78]: 7f1955428a5ab71c +Block 0022 [ 79]: 904c1d262f4697fe +Block 0022 [ 80]: 71e299786f4153af +Block 0022 [ 81]: 03bf7656a59378d0 +Block 0022 [ 82]: 134e3117146b0ec3 +Block 0022 [ 83]: b5a105a68f0e0285 +Block 0022 [ 84]: 8e332c18345792c0 +Block 0022 [ 85]: 1c8a1b9311af8035 +Block 0022 [ 86]: da7ba0f9ddfe3ca6 +Block 0022 [ 87]: 7b3f169f787ad5fd +Block 0022 [ 88]: 1eee01d5233b877d +Block 0022 [ 89]: bdad3fa8e33afa81 +Block 0022 [ 90]: 9bbc15b8f5fb7063 +Block 0022 [ 91]: 432f6b4d1905ec3f +Block 0022 [ 92]: f2d2365eca7ba1b9 +Block 0022 [ 93]: 97e2f5a82b925ba0 +Block 0022 [ 94]: fbc0fadc13d4564a +Block 0022 [ 95]: b2ad0bee976cc199 +Block 0022 [ 96]: 17f8c2b7bdbb67ff +Block 0022 [ 97]: be69957d7a56dbe9 +Block 0022 [ 98]: 79ea684556110c84 +Block 0022 [ 99]: 907836169c0a3ed0 +Block 0022 [100]: 529cfcde28e86278 +Block 0022 [101]: ec6c52c7c521e753 +Block 0022 [102]: 6d4b0089b66db0f7 +Block 0022 [103]: 8f52889ca92d1ca1 +Block 0022 [104]: 712b763cf1461916 +Block 0022 [105]: c2f0e7bcab362673 +Block 0022 [106]: 7e37c9354c58c3c6 +Block 0022 [107]: e92e77e0fb03dd9c +Block 0022 [108]: af01ae66d8933069 +Block 0022 [109]: c177af2038666fb7 +Block 0022 [110]: ef8d51bd9f8fc316 +Block 0022 [111]: 8fc7ad7cd464e4db +Block 0022 [112]: 77b2c5d08e22e032 +Block 0022 [113]: 45b7b9a307de1b30 +Block 0022 [114]: 799e4a09a2567d1b +Block 0022 [115]: 48aefad5c1d4b969 +Block 0022 [116]: 81bd46d517aa797f +Block 0022 [117]: 863d3836c0c64d38 +Block 0022 [118]: a80930810c4b2661 +Block 0022 [119]: bb01f4029f69250a +Block 0022 [120]: 0886cc90560770cc +Block 0022 [121]: 42f0f28407b02147 +Block 0022 [122]: bbeb300621e965a5 +Block 0022 [123]: dc517baac3ca7837 +Block 0022 [124]: ea2d75283572876b +Block 0022 [125]: acc64495739e7ca9 +Block 0022 [126]: 549e0c6ecc48dbb2 +Block 0022 [127]: 5116a7094206d198 +Block 0023 [ 0]: 35a67e548212b65a +Block 0023 [ 1]: 47a597dd7729d580 +Block 0023 [ 2]: 4f4d6c3d73cd4492 +Block 0023 [ 3]: 6fea5e56611b0a46 +Block 0023 [ 4]: a0dba662fd6b63eb +Block 0023 [ 5]: 0f01e27d84bee3dc +Block 0023 [ 6]: 4870943c3036e680 +Block 0023 [ 7]: 20b20c677c15275c +Block 0023 [ 8]: 6f01bc825322649f +Block 0023 [ 9]: 4110d224d880ec5c +Block 0023 [ 10]: d7973558f1e07cb4 +Block 0023 [ 11]: 511e22e748073a68 +Block 0023 [ 12]: b7bc8abedf5d7251 +Block 0023 [ 13]: 4f64508c05105c35 +Block 0023 [ 14]: 62bbf36b6d1ff161 +Block 0023 [ 15]: 4bde3ecb4471ae65 +Block 0023 [ 16]: ead26f76d51554b6 +Block 0023 [ 17]: 7b3458dff62b800f +Block 0023 [ 18]: a084ba6ce74c1eb9 +Block 0023 [ 19]: df609dbb8ab6265d +Block 0023 [ 20]: d2ae1cdce8efdf99 +Block 0023 [ 21]: d806c82cfc649816 +Block 0023 [ 22]: c3ed6017e8689558 +Block 0023 [ 23]: 2a415ef2d37108f9 +Block 0023 [ 24]: 2175b37e3691c307 +Block 0023 [ 25]: 73b750467289ce4c +Block 0023 [ 26]: 2f839c6ddaacbdf5 +Block 0023 [ 27]: 011e1736ccb05edc +Block 0023 [ 28]: ab899953fb5935c7 +Block 0023 [ 29]: d8ffcb98d41f8f2f +Block 0023 [ 30]: f0f9066153f1709b +Block 0023 [ 31]: 8b37d3c770e07bed +Block 0023 [ 32]: 617653ad907f68c2 +Block 0023 [ 33]: 9f2e89d721331c2f +Block 0023 [ 34]: b3fdbe13e5c5475b +Block 0023 [ 35]: 5014a37260ef1027 +Block 0023 [ 36]: 44ebc51f31d5648f +Block 0023 [ 37]: cf1e345a2278c411 +Block 0023 [ 38]: 9527cdb440d9d570 +Block 0023 [ 39]: fc1c61d0d22f0234 +Block 0023 [ 40]: dc170707a41d02bc +Block 0023 [ 41]: 4f20a8a6b536d6a6 +Block 0023 [ 42]: c9d1d992c5177320 +Block 0023 [ 43]: b2d08f4e16e0ead0 +Block 0023 [ 44]: 644e66e97d0a76a7 +Block 0023 [ 45]: 932b1d6b4bf97250 +Block 0023 [ 46]: 8553d2e3f36287ab +Block 0023 [ 47]: e66ee506aeff7310 +Block 0023 [ 48]: e2df446fadcc1bbc +Block 0023 [ 49]: 4e68292d5e271c1e +Block 0023 [ 50]: 82d3a1669e44216b +Block 0023 [ 51]: 7fe477b396245eaa +Block 0023 [ 52]: d64caf9f56a25d4f +Block 0023 [ 53]: 168cad48469c2814 +Block 0023 [ 54]: cf80d1426fd4d12f +Block 0023 [ 55]: 438c56732fb88f97 +Block 0023 [ 56]: 95be9d4df9078f11 +Block 0023 [ 57]: 2c324be70809d4b0 +Block 0023 [ 58]: 6526998522b6a01e +Block 0023 [ 59]: e2bd9aa42195e196 +Block 0023 [ 60]: b40d71d74220de38 +Block 0023 [ 61]: d6e5b4ab8bd94e50 +Block 0023 [ 62]: ed4fae73a1bcfcd8 +Block 0023 [ 63]: b00f6d5d13555317 +Block 0023 [ 64]: 99740378ef630c6d +Block 0023 [ 65]: f6a7e5b72e6aa9ec +Block 0023 [ 66]: 4c5048997311b874 +Block 0023 [ 67]: 62da86a8e0bc516c +Block 0023 [ 68]: 3ef48da188d9c901 +Block 0023 [ 69]: 8eb3ac3b10af96f0 +Block 0023 [ 70]: d4a7c9a80237d4fa +Block 0023 [ 71]: 2a92923febbe2b1e +Block 0023 [ 72]: 957330d6817f55bb +Block 0023 [ 73]: bcd4fee916ef8197 +Block 0023 [ 74]: 92b3dae57a69e496 +Block 0023 [ 75]: 44ce49a2c22b1985 +Block 0023 [ 76]: 10a8624ca831fe9a +Block 0023 [ 77]: ac59a462bc479f25 +Block 0023 [ 78]: 06e0f2b14d9de57d +Block 0023 [ 79]: f7ebe6eb30b76c91 +Block 0023 [ 80]: a290cc65e72977b8 +Block 0023 [ 81]: c53025ea87d0d76d +Block 0023 [ 82]: 8b1d31e588f27e7e +Block 0023 [ 83]: 85e3b5998e045553 +Block 0023 [ 84]: e5ef1b6888c1ede3 +Block 0023 [ 85]: d3682fe7748090c6 +Block 0023 [ 86]: 18121bcf94337603 +Block 0023 [ 87]: c0f5aa67be8bdd90 +Block 0023 [ 88]: 0f97bb8a07aa0937 +Block 0023 [ 89]: 98aca43aae3d20a3 +Block 0023 [ 90]: 6daeb804404c39a2 +Block 0023 [ 91]: 2373de1540bba42a +Block 0023 [ 92]: 8d9d3261981ecae3 +Block 0023 [ 93]: af3e00f0032cc72e +Block 0023 [ 94]: 4ce3496aa0fb8655 +Block 0023 [ 95]: ad07c56975938caf +Block 0023 [ 96]: 88e0b8c9d2b54f50 +Block 0023 [ 97]: c427840539ee5821 +Block 0023 [ 98]: 6717c698b370aec4 +Block 0023 [ 99]: d1e341823d56df4c +Block 0023 [100]: 82c29686c67b57ab +Block 0023 [101]: 7819999440faf2c7 +Block 0023 [102]: 4bc4c03f6165ed12 +Block 0023 [103]: ec6aeb644e48ddaa +Block 0023 [104]: 5a008d97e36f737d +Block 0023 [105]: 428d8b4bd1b95382 +Block 0023 [106]: f3221d2ae6f23867 +Block 0023 [107]: d92f795d6158a7e4 +Block 0023 [108]: eda1169cacd46e8e +Block 0023 [109]: 275acbab7e64c866 +Block 0023 [110]: cb4ecb99b9940ea1 +Block 0023 [111]: c3c77f0efcf1e959 +Block 0023 [112]: 41928e20fb40d811 +Block 0023 [113]: e08e5064a84575e0 +Block 0023 [114]: aec4b3870e8be76b +Block 0023 [115]: 3530333223726e1f +Block 0023 [116]: f8d3bf85e583ffde +Block 0023 [117]: 0171584e95f38c8e +Block 0023 [118]: 5d06a52835a771bd +Block 0023 [119]: e97b95f46a318115 +Block 0023 [120]: 08fcd8dbb4b5dc88 +Block 0023 [121]: 684999374c097e8f +Block 0023 [122]: 35ea6d01484a577d +Block 0023 [123]: fb01d73e1d552919 +Block 0023 [124]: a1490ccf830745c5 +Block 0023 [125]: b0bbef60d9833111 +Block 0023 [126]: 477c02fd95e838d6 +Block 0023 [127]: 8baa884f5ed6c02b +Block 0024 [ 0]: d061ed936e1a32d3 +Block 0024 [ 1]: 541a30c0b95ffea7 +Block 0024 [ 2]: 1928de5e1f440c51 +Block 0024 [ 3]: c9f14c74dac24ab2 +Block 0024 [ 4]: fe4f84507d62789a +Block 0024 [ 5]: c331d363c2c8c0a9 +Block 0024 [ 6]: e747c23cec188011 +Block 0024 [ 7]: b78f6b4cbbdd4934 +Block 0024 [ 8]: 28581eafaca26cba +Block 0024 [ 9]: 44b5ae30d6118faa +Block 0024 [ 10]: 7bcf55d440d2688a +Block 0024 [ 11]: 51ca3b4d6b156519 +Block 0024 [ 12]: e5666e5b1b35e022 +Block 0024 [ 13]: dfddbfab40c9ff3a +Block 0024 [ 14]: 188654eef14df41c +Block 0024 [ 15]: 55600accb5cac797 +Block 0024 [ 16]: 4fc9cc2498403e32 +Block 0024 [ 17]: 00e5021cbb66d69d +Block 0024 [ 18]: 364c7398079d7de6 +Block 0024 [ 19]: 849b9218651c4338 +Block 0024 [ 20]: ac1740598af70ad2 +Block 0024 [ 21]: 0799297570e3afa3 +Block 0024 [ 22]: 2732b513a96712de +Block 0024 [ 23]: dc13860cf73ff7b3 +Block 0024 [ 24]: 45b81cea5644bbe4 +Block 0024 [ 25]: 2bac4d9df968b6d7 +Block 0024 [ 26]: 1c2c19f0a424895d +Block 0024 [ 27]: 743629acd72ee78f +Block 0024 [ 28]: 6938084dd1a25f3c +Block 0024 [ 29]: 5d8fdef799f3a7a7 +Block 0024 [ 30]: 32c9dd570ee7f229 +Block 0024 [ 31]: 635275210d4dcc60 +Block 0024 [ 32]: 0b6a30a0f9d8cd62 +Block 0024 [ 33]: 325b6147f91b93d2 +Block 0024 [ 34]: 5693c3b83d29486d +Block 0024 [ 35]: 9ae916389575f4dc +Block 0024 [ 36]: a9ac27bdf4920386 +Block 0024 [ 37]: fb2b943c71b1f651 +Block 0024 [ 38]: b3439452a404a424 +Block 0024 [ 39]: d7ca3d322ddd0d34 +Block 0024 [ 40]: cfb81600244f133f +Block 0024 [ 41]: c4fc0f63568bc898 +Block 0024 [ 42]: 40e4716f08a63a3b +Block 0024 [ 43]: c0e487f16e9e4031 +Block 0024 [ 44]: 240146e7c19878bf +Block 0024 [ 45]: 0e41626ba08e23a5 +Block 0024 [ 46]: 9f195c84461c825b +Block 0024 [ 47]: 9c3f6c6a2966f0a8 +Block 0024 [ 48]: 45853ff7c0b93daf +Block 0024 [ 49]: 7db484a6bfbe0427 +Block 0024 [ 50]: ae168d723e3413fd +Block 0024 [ 51]: 070dd51541ac7eea +Block 0024 [ 52]: d52cdead741239e7 +Block 0024 [ 53]: b0fcd63276cb4aea +Block 0024 [ 54]: 8c967ddb1d15730f +Block 0024 [ 55]: dd469e509bd1432e +Block 0024 [ 56]: 624a5f0f28028f6e +Block 0024 [ 57]: 2d4963cd135783d7 +Block 0024 [ 58]: 459365718bb4c0df +Block 0024 [ 59]: 9ee458e2ebfb4331 +Block 0024 [ 60]: 774ab6c8d85d0c23 +Block 0024 [ 61]: 9386c117e41e29b7 +Block 0024 [ 62]: 45cce696de9d97e8 +Block 0024 [ 63]: b678a357a46dbd0c +Block 0024 [ 64]: 2d0923ed6e8904ef +Block 0024 [ 65]: ff4b8d2913c5114e +Block 0024 [ 66]: dc05ff473012b91b +Block 0024 [ 67]: b817c71405fa2b47 +Block 0024 [ 68]: c1b8451cc37ca669 +Block 0024 [ 69]: b53274d2bc303d21 +Block 0024 [ 70]: 0b585e8da0c28ec0 +Block 0024 [ 71]: 96d1c3f9b6316fd0 +Block 0024 [ 72]: 9d751e17ddb84b92 +Block 0024 [ 73]: 15cd8f9877d08621 +Block 0024 [ 74]: 31427e152ae1f228 +Block 0024 [ 75]: 58c308b9049a1a35 +Block 0024 [ 76]: a7c6d337bea4cd79 +Block 0024 [ 77]: c74a3612bb6c2920 +Block 0024 [ 78]: bcd995a490138eca +Block 0024 [ 79]: 3ab8aa80102b731c +Block 0024 [ 80]: 12ca895d089a075d +Block 0024 [ 81]: 90ca0070cac5d46c +Block 0024 [ 82]: 79cf2adead63539a +Block 0024 [ 83]: aa2b9edc6e245007 +Block 0024 [ 84]: b85174b8df690554 +Block 0024 [ 85]: a714f0d57ded76c1 +Block 0024 [ 86]: eee45ed25c8026a0 +Block 0024 [ 87]: 7ffceacdb23db6d5 +Block 0024 [ 88]: d081599d922b548e +Block 0024 [ 89]: bdc6c423c6dfbd46 +Block 0024 [ 90]: ac97234b39a66ea0 +Block 0024 [ 91]: 8354643289ab2777 +Block 0024 [ 92]: 7768471ee706bcfc +Block 0024 [ 93]: d5d5558b0f65d5e8 +Block 0024 [ 94]: 4fcccd6440c9993f +Block 0024 [ 95]: e2349553b73474a8 +Block 0024 [ 96]: 2298b2c517299e44 +Block 0024 [ 97]: 5c71ae34b1646e7c +Block 0024 [ 98]: bb2f21e33ef80226 +Block 0024 [ 99]: c1d6744c0daa4ec1 +Block 0024 [100]: d1c2045ba1c82a86 +Block 0024 [101]: d827935d52f05a26 +Block 0024 [102]: 641bc1718fbdd804 +Block 0024 [103]: 1e93f35ba580c78d +Block 0024 [104]: 38dcd866d4ba60b0 +Block 0024 [105]: c569e6c978d6370f +Block 0024 [106]: 665b6de1b84e4d1e +Block 0024 [107]: 59e8c6d2e0ef07b3 +Block 0024 [108]: 1019324ba6f47ddf +Block 0024 [109]: bf453a53194efe17 +Block 0024 [110]: 740c895bd04b3212 +Block 0024 [111]: 279d7d4e8a17205a +Block 0024 [112]: bf0562156ec46599 +Block 0024 [113]: f4cfe480afee6fd0 +Block 0024 [114]: 6dc65fde295bc25c +Block 0024 [115]: 608aa55b507597a1 +Block 0024 [116]: 10bad16db28743f2 +Block 0024 [117]: 16b24343b9778d3f +Block 0024 [118]: f94e6c6b43502e95 +Block 0024 [119]: 048837063d6a0f2f +Block 0024 [120]: 6010c23f59e2b3be +Block 0024 [121]: 33051c610ff7a8e3 +Block 0024 [122]: 456dd3fb90581e01 +Block 0024 [123]: 61f13604e9cba016 +Block 0024 [124]: 5abbea569a465d20 +Block 0024 [125]: e099ef641551a3b3 +Block 0024 [126]: 34f9bda1ee9bdb9f +Block 0024 [127]: cbe1f2c55812a488 +Block 0025 [ 0]: 70ebd121a7257a28 +Block 0025 [ 1]: ee4c2ac9909ac584 +Block 0025 [ 2]: adfaf99676dc4eff +Block 0025 [ 3]: 5bb604144163d732 +Block 0025 [ 4]: 04ba77fee44bca6d +Block 0025 [ 5]: 117632540e9a1351 +Block 0025 [ 6]: 821fd24564be611b +Block 0025 [ 7]: ee6d3854f8aa8e6a +Block 0025 [ 8]: bd5d0386e54bf100 +Block 0025 [ 9]: 5fd6ff010f7ffccf +Block 0025 [ 10]: 6280ead5f8ce3ce8 +Block 0025 [ 11]: 8fefeea8a3ecfeea +Block 0025 [ 12]: 568373e8752d762d +Block 0025 [ 13]: c7aeb28c1a22213f +Block 0025 [ 14]: 135ac6f83c51250a +Block 0025 [ 15]: e0351d9290e44c26 +Block 0025 [ 16]: 721d1f259e59b608 +Block 0025 [ 17]: 9e75d7f84f0bc4d8 +Block 0025 [ 18]: 77f1351a7349e3de +Block 0025 [ 19]: bd90c3924bafa69f +Block 0025 [ 20]: 894a4d6baa341ef8 +Block 0025 [ 21]: e9507179545ecad6 +Block 0025 [ 22]: 71d116328734e1af +Block 0025 [ 23]: d8098eaea09439a8 +Block 0025 [ 24]: 5d991df3c678bb33 +Block 0025 [ 25]: 667e9c87829af175 +Block 0025 [ 26]: f1f640695d856a45 +Block 0025 [ 27]: ea5c53d6c2c5ee2c +Block 0025 [ 28]: a0ac38bbb6105a03 +Block 0025 [ 29]: 312001c836009739 +Block 0025 [ 30]: 626988741f041169 +Block 0025 [ 31]: c04eb57fcdc6dc28 +Block 0025 [ 32]: 8631d3c1eae8d8a1 +Block 0025 [ 33]: b86a0341a6aace14 +Block 0025 [ 34]: c1ee46fe54acb220 +Block 0025 [ 35]: e010f93accc68429 +Block 0025 [ 36]: 3059b9d96afd0981 +Block 0025 [ 37]: 55107999b1e215cd +Block 0025 [ 38]: 6f8efceccadf69ca +Block 0025 [ 39]: f949524531c51bbc +Block 0025 [ 40]: 7d72a929f74af045 +Block 0025 [ 41]: 7672dc7082c41bab +Block 0025 [ 42]: f3def1f446699d0a +Block 0025 [ 43]: d4814bce24153b17 +Block 0025 [ 44]: e216945683f065f7 +Block 0025 [ 45]: 576411a7012ca38d +Block 0025 [ 46]: 723090d9c993b2ee +Block 0025 [ 47]: 4d823fefc8f9035c +Block 0025 [ 48]: cf0f4589118758a4 +Block 0025 [ 49]: b1d4460fa64aa621 +Block 0025 [ 50]: 94e82983b5173949 +Block 0025 [ 51]: ee5d570d4e61dcb1 +Block 0025 [ 52]: 357d37a1ae5df910 +Block 0025 [ 53]: 11f0a3fb6b7421c8 +Block 0025 [ 54]: 0aca0f137cfa300a +Block 0025 [ 55]: dd6d6f5bec942848 +Block 0025 [ 56]: 66d79c4704c0c2cf +Block 0025 [ 57]: ffe19bb80d92656a +Block 0025 [ 58]: c1bd6d50fa655462 +Block 0025 [ 59]: 4839837755a6182c +Block 0025 [ 60]: c20dfc55eaa2b63d +Block 0025 [ 61]: aefdf12048445e78 +Block 0025 [ 62]: 732fde83bd73a479 +Block 0025 [ 63]: db9e3a074d14bc35 +Block 0025 [ 64]: 5086f3fe923e5c95 +Block 0025 [ 65]: d12d3f7ff1b1447a +Block 0025 [ 66]: a6b5e44c58356eb0 +Block 0025 [ 67]: 472b0aa28e7d6b9b +Block 0025 [ 68]: 0f8dd423906ccf22 +Block 0025 [ 69]: a8295f1a3a00bcca +Block 0025 [ 70]: 76c5f59eea1920b0 +Block 0025 [ 71]: 5ae795cdbf364338 +Block 0025 [ 72]: 23952cc743c68ba3 +Block 0025 [ 73]: 5810730a92bfd13f +Block 0025 [ 74]: f956febc1edb9e2f +Block 0025 [ 75]: 55e31c195108a36f +Block 0025 [ 76]: e02b758b63004a43 +Block 0025 [ 77]: 60497305b0cd869d +Block 0025 [ 78]: b18c2987b2938143 +Block 0025 [ 79]: a49174eb08fa5d31 +Block 0025 [ 80]: e3b098abb1b7ecc7 +Block 0025 [ 81]: 0f057184a4fa53d4 +Block 0025 [ 82]: 57b34bf21444321c +Block 0025 [ 83]: 607c182ca523340b +Block 0025 [ 84]: 804edac2f1b00605 +Block 0025 [ 85]: 101a6b49ceaca684 +Block 0025 [ 86]: 447a34a4fb951403 +Block 0025 [ 87]: dbc1eb36865c36a2 +Block 0025 [ 88]: af4abc94ba557920 +Block 0025 [ 89]: 1d698533ab769326 +Block 0025 [ 90]: 5c3426b817abb8f0 +Block 0025 [ 91]: f38cecd553c531d2 +Block 0025 [ 92]: ef3694fcc3d99451 +Block 0025 [ 93]: 53bfda338a59ab41 +Block 0025 [ 94]: c6f5fb7b6029de2d +Block 0025 [ 95]: e3fc04c1f36144a8 +Block 0025 [ 96]: 820737f3b4eacb98 +Block 0025 [ 97]: 85cec89abce81975 +Block 0025 [ 98]: 745271c6bc864740 +Block 0025 [ 99]: 1c0811cf1c431e19 +Block 0025 [100]: 4d99ff91c0c64d1a +Block 0025 [101]: 979cb0118168a9fb +Block 0025 [102]: d53fa0291a3d76e0 +Block 0025 [103]: 1ce5fbd785ad370a +Block 0025 [104]: 6d7049f9344ec655 +Block 0025 [105]: 53f7839ff27c66c7 +Block 0025 [106]: fc9a2098d2211301 +Block 0025 [107]: f5f926c8bd4c4d01 +Block 0025 [108]: 3b058a18e77f9bb1 +Block 0025 [109]: ca320ef75bca7535 +Block 0025 [110]: 79339df3ec05b866 +Block 0025 [111]: c816026a714092bd +Block 0025 [112]: b82d81735606531e +Block 0025 [113]: d8268ae55a6131ce +Block 0025 [114]: 4f268372782968b5 +Block 0025 [115]: a3062a5aeb9384dd +Block 0025 [116]: 65dcc349c62b4191 +Block 0025 [117]: 85f5779531f46af1 +Block 0025 [118]: 43787b67d0c1778c +Block 0025 [119]: 73f5ed29f3e61e5d +Block 0025 [120]: 449b111b7e54e5e0 +Block 0025 [121]: 8f880be186dee777 +Block 0025 [122]: 3ab3a6d0e2493169 +Block 0025 [123]: 95852a5bee3d5164 +Block 0025 [124]: 90b38d7051960232 +Block 0025 [125]: 936e413aeae9d225 +Block 0025 [126]: 54774428cd567644 +Block 0025 [127]: 14be833fb3c1ac88 +Block 0026 [ 0]: fb487be18df7eb8d +Block 0026 [ 1]: 2412501be404fb4e +Block 0026 [ 2]: d7b2c081d9131080 +Block 0026 [ 3]: 0a581196251f1831 +Block 0026 [ 4]: bded1e5259f76500 +Block 0026 [ 5]: 6016730d78d0bc53 +Block 0026 [ 6]: 52f90543516e0fb9 +Block 0026 [ 7]: d02d45cd3f1a17b5 +Block 0026 [ 8]: a0d5c083921cbaa6 +Block 0026 [ 9]: eb736849ae0115bb +Block 0026 [ 10]: 38499c85645ea09f +Block 0026 [ 11]: 073a5dba363f3553 +Block 0026 [ 12]: 59b34c2590679624 +Block 0026 [ 13]: 5e2de51bca2407a9 +Block 0026 [ 14]: aac20d25a2b2ed15 +Block 0026 [ 15]: 244859ec8edc3cbb +Block 0026 [ 16]: 618a3558f289a76f +Block 0026 [ 17]: 40f3419b8ed0524d +Block 0026 [ 18]: d868a3a6e0a5d7df +Block 0026 [ 19]: 6f96de68338ea557 +Block 0026 [ 20]: 870fb44e701b4404 +Block 0026 [ 21]: 61c567f8db2a6ce5 +Block 0026 [ 22]: 169cdd5f6449f530 +Block 0026 [ 23]: e9810f4bcc425020 +Block 0026 [ 24]: 3152e7edc348cf7a +Block 0026 [ 25]: 9eac974a1e5b0350 +Block 0026 [ 26]: 99c7a8f313578337 +Block 0026 [ 27]: c724d4256fc1241a +Block 0026 [ 28]: 3ee0245454922982 +Block 0026 [ 29]: c6441c8af990ced6 +Block 0026 [ 30]: dbac5d89ef4f3e2a +Block 0026 [ 31]: 414aa7cd0f754e55 +Block 0026 [ 32]: 489bc0760eda7b07 +Block 0026 [ 33]: fd383b765fb81891 +Block 0026 [ 34]: 4d852ceed348635c +Block 0026 [ 35]: 811cb9f91082156e +Block 0026 [ 36]: aa7fcfdf2c355044 +Block 0026 [ 37]: 9f35f2708fd615b6 +Block 0026 [ 38]: 3321a64e9ed24a5f +Block 0026 [ 39]: 4fe9684a31256a87 +Block 0026 [ 40]: 0f583fe70d6982a0 +Block 0026 [ 41]: a6755d33ea305335 +Block 0026 [ 42]: 2263c8affb70cd87 +Block 0026 [ 43]: 6d582e490d23613d +Block 0026 [ 44]: d3f6775090e90406 +Block 0026 [ 45]: 8cf43fe930e2f86e +Block 0026 [ 46]: fe4542378bbd625c +Block 0026 [ 47]: 8d660ec74c5a6c6e +Block 0026 [ 48]: 9f7c3ff4997a8c11 +Block 0026 [ 49]: 44256d91adf7b314 +Block 0026 [ 50]: 857e5e379b306054 +Block 0026 [ 51]: 28a4891ccbd52570 +Block 0026 [ 52]: fa3ee9dad4f01df4 +Block 0026 [ 53]: 18f98918c7f237b9 +Block 0026 [ 54]: 294fd5c947a31bab +Block 0026 [ 55]: 06295a7262a12b86 +Block 0026 [ 56]: 5a5a7a7eba41739d +Block 0026 [ 57]: 4d98727eb9f6bcf9 +Block 0026 [ 58]: 49e3cb6ab07fec0e +Block 0026 [ 59]: 962e2140c0a21b25 +Block 0026 [ 60]: 86069730a4abf3ed +Block 0026 [ 61]: fc22af18ec18d2c4 +Block 0026 [ 62]: 5fa009f2eaad07c6 +Block 0026 [ 63]: 08c58faf884a793f +Block 0026 [ 64]: 986adc48582ffb12 +Block 0026 [ 65]: dc77fa6a85a5e76d +Block 0026 [ 66]: c29359fe2f1ee366 +Block 0026 [ 67]: 23087c88088978ca +Block 0026 [ 68]: 7c1c4bb1f4297c1e +Block 0026 [ 69]: ef501ae32f369047 +Block 0026 [ 70]: 8a79d9699334e928 +Block 0026 [ 71]: aab7b483178735ff +Block 0026 [ 72]: 622ec4e95fbe36bd +Block 0026 [ 73]: eb0bf85db3bc78a8 +Block 0026 [ 74]: f44be5060f166f98 +Block 0026 [ 75]: 6255bfff5f971965 +Block 0026 [ 76]: 52f61bc236ac1b65 +Block 0026 [ 77]: f23b70892420cefe +Block 0026 [ 78]: 6e8f53f9674910e6 +Block 0026 [ 79]: d7132b9c00a6ad7c +Block 0026 [ 80]: 020bc2685469901d +Block 0026 [ 81]: 108cd38e30f23200 +Block 0026 [ 82]: f450098cfe218776 +Block 0026 [ 83]: 4f67e9fc7039a747 +Block 0026 [ 84]: 37eba43f2fa0d31b +Block 0026 [ 85]: f0f42e8fe6ac612f +Block 0026 [ 86]: 1f376340d44ab901 +Block 0026 [ 87]: d77f62728aca121d +Block 0026 [ 88]: ac1072995fc2ff37 +Block 0026 [ 89]: e7069948a84a3977 +Block 0026 [ 90]: b33c06e54ab93729 +Block 0026 [ 91]: 39e0af0be89603dd +Block 0026 [ 92]: d22f84dfd99dcc8a +Block 0026 [ 93]: 88ac4c95d7937a2a +Block 0026 [ 94]: 0cf2539c4243d967 +Block 0026 [ 95]: 34e8d12e0b92aaea +Block 0026 [ 96]: e15df1069c6ef442 +Block 0026 [ 97]: 40f35bc356fc0c3d +Block 0026 [ 98]: 0e071590cf2db74a +Block 0026 [ 99]: e387d14f6bdd296b +Block 0026 [100]: 73fb9acc7733fab5 +Block 0026 [101]: 4266f8cc2efa280b +Block 0026 [102]: b3d909ebafc201c9 +Block 0026 [103]: e5412fc8412e7fc9 +Block 0026 [104]: 02210cc87412d5a3 +Block 0026 [105]: 54f130c0554c6ac3 +Block 0026 [106]: 68a7b73bc65cf9e4 +Block 0026 [107]: 307263b13f5b963a +Block 0026 [108]: 7596dd4e7d1db393 +Block 0026 [109]: 6f139dfd1be30627 +Block 0026 [110]: 1d3ef50a50ceaed6 +Block 0026 [111]: eb88fda3b09b1296 +Block 0026 [112]: 4c3b8e2b4ca2e1f7 +Block 0026 [113]: 57ce38c178027833 +Block 0026 [114]: ce45c95b2532bbdd +Block 0026 [115]: bf634de9141dfe76 +Block 0026 [116]: 1ba389024f54f36b +Block 0026 [117]: 3ac1f8ae10577c81 +Block 0026 [118]: 814252a3e5652404 +Block 0026 [119]: 3322ff859d6b20d5 +Block 0026 [120]: bf7ee00ef0fe69b3 +Block 0026 [121]: b3ef0667ff20b60f +Block 0026 [122]: 79fe044ee99570bb +Block 0026 [123]: 5c03a6ffb98c6c3d +Block 0026 [124]: fc3e251d52c216ea +Block 0026 [125]: 274c5148e90c511b +Block 0026 [126]: 3eafcafba246f626 +Block 0026 [127]: 935a2ec2b3396f23 +Block 0027 [ 0]: 159e40334396333d +Block 0027 [ 1]: 35debd9f9e959a3b +Block 0027 [ 2]: e1fbc7a924a625fe +Block 0027 [ 3]: 90ad1340b58c1e89 +Block 0027 [ 4]: 67b4cd3e612f9c38 +Block 0027 [ 5]: 61a7596c0b4d1b21 +Block 0027 [ 6]: 587fcd006c063e9f +Block 0027 [ 7]: b0f4588fbe2fe388 +Block 0027 [ 8]: 5047302d958a2dbe +Block 0027 [ 9]: 959582f80834b214 +Block 0027 [ 10]: e4b8921bcf7453d3 +Block 0027 [ 11]: cef065b8fe85471f +Block 0027 [ 12]: 4c28967e6e845806 +Block 0027 [ 13]: 95097bd7a3f1b357 +Block 0027 [ 14]: 4cc838f128fdb9a5 +Block 0027 [ 15]: e763538ff7bf6905 +Block 0027 [ 16]: e8bc164923715cd5 +Block 0027 [ 17]: 1aab15c51709863d +Block 0027 [ 18]: f916024c0fd94f60 +Block 0027 [ 19]: bb805c2ff026f601 +Block 0027 [ 20]: 39a4e6570eea2e20 +Block 0027 [ 21]: 356a1aba03e1d831 +Block 0027 [ 22]: c74e8ec0aa6532b8 +Block 0027 [ 23]: ba610ecdf6d64405 +Block 0027 [ 24]: 9e70622f149a89b9 +Block 0027 [ 25]: 345b1a805f2b69c6 +Block 0027 [ 26]: ab9cac31ce78f811 +Block 0027 [ 27]: 95dc637304bfd01e +Block 0027 [ 28]: c3c85afe6db662b6 +Block 0027 [ 29]: 1147079a0ee70d38 +Block 0027 [ 30]: 9aa8571b4c12ab3a +Block 0027 [ 31]: 0c5bc0316ffbb5da +Block 0027 [ 32]: 8e6d03850ebf0c6b +Block 0027 [ 33]: 16d56a59f5c9d9ed +Block 0027 [ 34]: 6c9d8fc35506be7b +Block 0027 [ 35]: 1b1bb9e6da78719d +Block 0027 [ 36]: b6adeb5a05127a11 +Block 0027 [ 37]: 6f8b8e355e4940dd +Block 0027 [ 38]: e1c3e8f1a0f554b6 +Block 0027 [ 39]: c5eb3dff6c043572 +Block 0027 [ 40]: 9a86baac2419994e +Block 0027 [ 41]: c9c44c781da2e1c3 +Block 0027 [ 42]: 639000af64968df2 +Block 0027 [ 43]: 1c4c7ec41762744a +Block 0027 [ 44]: e768397942510cf9 +Block 0027 [ 45]: 434bbca62243dab6 +Block 0027 [ 46]: 786480067546a5f6 +Block 0027 [ 47]: d749591161b87446 +Block 0027 [ 48]: e1563d5a486c87c3 +Block 0027 [ 49]: 9f0c7700273b813e +Block 0027 [ 50]: 304836e556914ec0 +Block 0027 [ 51]: f65ef06f782ba50f +Block 0027 [ 52]: 5b965ee1f01ef44f +Block 0027 [ 53]: 6338cc24f6ea3230 +Block 0027 [ 54]: 593a3771c1e7a207 +Block 0027 [ 55]: 5ab77e5059a9a160 +Block 0027 [ 56]: 49e72d762260501c +Block 0027 [ 57]: 4ae2e5a7a667142a +Block 0027 [ 58]: b64d7c61f720ba52 +Block 0027 [ 59]: 5c04d5b69f09ddee +Block 0027 [ 60]: 6424491f6cbe7e74 +Block 0027 [ 61]: 34edd83bf282bb4c +Block 0027 [ 62]: ba7d59f9fe2cb25c +Block 0027 [ 63]: c24cb5e01a00ef27 +Block 0027 [ 64]: 2a3a486c959977c1 +Block 0027 [ 65]: ed0da6827836de25 +Block 0027 [ 66]: 7042248ab660371d +Block 0027 [ 67]: afd8cf2fa335245c +Block 0027 [ 68]: 1b4e226a51d82d6a +Block 0027 [ 69]: dd05266199543763 +Block 0027 [ 70]: 689c0b986a2d93d8 +Block 0027 [ 71]: 0a8271d7de2878a7 +Block 0027 [ 72]: 9f44d2816b1b50df +Block 0027 [ 73]: 1719aea0e7e3eaa9 +Block 0027 [ 74]: e106c5709673b01f +Block 0027 [ 75]: b04fcb886a18ae63 +Block 0027 [ 76]: e8f3d9b2308eef93 +Block 0027 [ 77]: db65d3dd6473325a +Block 0027 [ 78]: c659d81491aed1e9 +Block 0027 [ 79]: e12cff0492e843c0 +Block 0027 [ 80]: 7403b7de484abbd7 +Block 0027 [ 81]: 1fbaa3c23d8f4b7c +Block 0027 [ 82]: a854cdf30488f6a9 +Block 0027 [ 83]: eccdd64e58074056 +Block 0027 [ 84]: d65f8859f44ff969 +Block 0027 [ 85]: a230cd84cd2588a0 +Block 0027 [ 86]: ff2bc0e01e574048 +Block 0027 [ 87]: a56bb59d3ddc7e38 +Block 0027 [ 88]: db383d2ea5f60f4a +Block 0027 [ 89]: 02f70a87053f54b9 +Block 0027 [ 90]: 106c65eb3d0a0ef7 +Block 0027 [ 91]: 779a3d3e70076a46 +Block 0027 [ 92]: ab63c42176583636 +Block 0027 [ 93]: cfd08c6d8ebb1703 +Block 0027 [ 94]: b7bb88525417a838 +Block 0027 [ 95]: eb118a9673be378e +Block 0027 [ 96]: 39ed8faae4710682 +Block 0027 [ 97]: d4ba3147a41ba3d2 +Block 0027 [ 98]: a0a701460ad6804d +Block 0027 [ 99]: 3a67a2c71a8cce3b +Block 0027 [100]: 0102b5ef646994b2 +Block 0027 [101]: 19dcffd9c433deef +Block 0027 [102]: f0939e375d416a48 +Block 0027 [103]: a26a910720ceb122 +Block 0027 [104]: c377d599215ce2b5 +Block 0027 [105]: 7e30dc33a90a37b1 +Block 0027 [106]: fc335a52fe857c07 +Block 0027 [107]: 3b5d0455b3860a76 +Block 0027 [108]: cec5a9162e644993 +Block 0027 [109]: 2cfe25839dd15ab7 +Block 0027 [110]: 9b156e7837236a75 +Block 0027 [111]: d6eb2e3a281a5cdb +Block 0027 [112]: 42c6565b34cba6af +Block 0027 [113]: d66060382243dc0b +Block 0027 [114]: 486d5bc00554a4b1 +Block 0027 [115]: 458ad595a0269bc7 +Block 0027 [116]: 2968c320d059d4cd +Block 0027 [117]: bd84bd47e559db51 +Block 0027 [118]: 3c4e312783b9859a +Block 0027 [119]: 6e49857079e4c504 +Block 0027 [120]: a7777b7394e65639 +Block 0027 [121]: 230be5f469a8b638 +Block 0027 [122]: 0728f719aa188543 +Block 0027 [123]: ff9963971241708c +Block 0027 [124]: 0ace11603796535c +Block 0027 [125]: cd2788157711e0a8 +Block 0027 [126]: 375f1148708a76c0 +Block 0027 [127]: 7a825f3267910e33 +Block 0028 [ 0]: 0849f26117e82e69 +Block 0028 [ 1]: d5f71170afc0cd99 +Block 0028 [ 2]: 337cf42a1f9aa6ed +Block 0028 [ 3]: 8b3ee65b0fa2ee71 +Block 0028 [ 4]: 08e5f029da386cf5 +Block 0028 [ 5]: 56faaaa1bd86acb1 +Block 0028 [ 6]: c5b50eef97e1aaf2 +Block 0028 [ 7]: 44fb3096543f68b5 +Block 0028 [ 8]: a49b5724cabeaade +Block 0028 [ 9]: c9984984f42d456d +Block 0028 [ 10]: 86087eb21aa86362 +Block 0028 [ 11]: 7c26cd8835fe070a +Block 0028 [ 12]: df7893c4c3184f26 +Block 0028 [ 13]: 213ef3aff6a570d1 +Block 0028 [ 14]: 2e6d52b63938f7b2 +Block 0028 [ 15]: 2d40ede261919ac2 +Block 0028 [ 16]: 3a5db1e8c3d48c18 +Block 0028 [ 17]: bd96321cef252f19 +Block 0028 [ 18]: 5fa45329ce5fe729 +Block 0028 [ 19]: 3108fa03894aa4e6 +Block 0028 [ 20]: e3760737d9e8436f +Block 0028 [ 21]: 22f767c73cfb6d1a +Block 0028 [ 22]: d3752b7eccedb8bf +Block 0028 [ 23]: 90151508c3540bcb +Block 0028 [ 24]: e42592301a636512 +Block 0028 [ 25]: e70ee12d7216f4e9 +Block 0028 [ 26]: aad05fb9c5894f49 +Block 0028 [ 27]: 0bee7b256f071ab4 +Block 0028 [ 28]: 92ce045f4138a3be +Block 0028 [ 29]: 7f7065c75a435f24 +Block 0028 [ 30]: a431b3b6e0c59cae +Block 0028 [ 31]: ef20bc3f22350a04 +Block 0028 [ 32]: b275f5fa1e04cb09 +Block 0028 [ 33]: 370630d3d9a41d2b +Block 0028 [ 34]: 4dafe30055bdb07e +Block 0028 [ 35]: 834f9a112778a3a7 +Block 0028 [ 36]: 4f3f222636687ea1 +Block 0028 [ 37]: 5d56952ee08e0a6a +Block 0028 [ 38]: 26a59314ae105696 +Block 0028 [ 39]: d16327fc3f66f2ca +Block 0028 [ 40]: 1a14f45ff2619475 +Block 0028 [ 41]: afb1cd011f1d190a +Block 0028 [ 42]: 4b193be4e955e2d9 +Block 0028 [ 43]: 112011bd408e324f +Block 0028 [ 44]: 982c98964b0baca7 +Block 0028 [ 45]: 7d93cc6551a4fd9d +Block 0028 [ 46]: ee58c96acfc8c064 +Block 0028 [ 47]: 68c962a88a2a51c9 +Block 0028 [ 48]: 905d84e0e7b066c0 +Block 0028 [ 49]: 8e2a80dbf5dadd98 +Block 0028 [ 50]: ba8e81f0dce0c3d3 +Block 0028 [ 51]: c0eeaf524cdc1a9a +Block 0028 [ 52]: e2f2b0a38d8bb527 +Block 0028 [ 53]: 30ca19c0bcc47ce5 +Block 0028 [ 54]: a51213f07e89eee5 +Block 0028 [ 55]: 96f72b7410c329bd +Block 0028 [ 56]: b97493bbe5136439 +Block 0028 [ 57]: 89717556a6753782 +Block 0028 [ 58]: d4cfb003fc67c9f5 +Block 0028 [ 59]: 541dc2a89c9e400e +Block 0028 [ 60]: 4251b6717b98dc3d +Block 0028 [ 61]: 1cfab5fc275fa115 +Block 0028 [ 62]: 814f8d19cb4fbb3a +Block 0028 [ 63]: 132f7ef88079c208 +Block 0028 [ 64]: 833cd31cacb85c65 +Block 0028 [ 65]: d4bb68949f3df570 +Block 0028 [ 66]: 92bcae2eac5e7765 +Block 0028 [ 67]: c7f23e8397ddaf35 +Block 0028 [ 68]: b566b8e8adff82e7 +Block 0028 [ 69]: 0a2162802341b685 +Block 0028 [ 70]: 73bce590f290184f +Block 0028 [ 71]: 8ff6a187a4def08c +Block 0028 [ 72]: 584577ed0490bc21 +Block 0028 [ 73]: ac4406c4137dfee9 +Block 0028 [ 74]: f4fbf4110f495a81 +Block 0028 [ 75]: 08f5780ba9cc43d9 +Block 0028 [ 76]: 75c168632ff3dfce +Block 0028 [ 77]: 3dee16456c07ebcd +Block 0028 [ 78]: 036c0730b8f60056 +Block 0028 [ 79]: 6b9d6a60d9cc1975 +Block 0028 [ 80]: 6f374b04e4e75fe5 +Block 0028 [ 81]: 01da5a909d9e0d78 +Block 0028 [ 82]: 0c6fbe7746f25058 +Block 0028 [ 83]: bd91552984f5ac9f +Block 0028 [ 84]: f385b64acabaa0c6 +Block 0028 [ 85]: 0eee4367c6323e93 +Block 0028 [ 86]: 702ecb0bde5c9096 +Block 0028 [ 87]: 040a6edea15014bd +Block 0028 [ 88]: 09409b7a46a09515 +Block 0028 [ 89]: 593ffbb45922881e +Block 0028 [ 90]: 93d1b8eddbeb3779 +Block 0028 [ 91]: 20e543ddff978938 +Block 0028 [ 92]: ab067161ec9a6b01 +Block 0028 [ 93]: b3ba38bc824538ee +Block 0028 [ 94]: 9c56eb38eb4431f6 +Block 0028 [ 95]: 3fb4fcd01732e6da +Block 0028 [ 96]: d78ce9b0a9fbdad2 +Block 0028 [ 97]: 156975f6f8233d48 +Block 0028 [ 98]: f436a80f86e2cb90 +Block 0028 [ 99]: d0f1e1209cf6049f +Block 0028 [100]: f32f5e2f8024c792 +Block 0028 [101]: 29b30130eaf52b55 +Block 0028 [102]: 37e560fe3a1696c8 +Block 0028 [103]: c331eadc24d9beca +Block 0028 [104]: d5b8368f1a774c9b +Block 0028 [105]: 03f3c0bd89abcadb +Block 0028 [106]: f455906baa4fb0ba +Block 0028 [107]: e80fe133ffbab8bd +Block 0028 [108]: 577157827c027d91 +Block 0028 [109]: 4a08fe8ba548fa0b +Block 0028 [110]: 0b66ee4cb9c7ea4e +Block 0028 [111]: 8fdbed3184ee5d52 +Block 0028 [112]: ddd779a1731696ee +Block 0028 [113]: d96141b193a21297 +Block 0028 [114]: 6a81beb51328863d +Block 0028 [115]: db461e53677de07c +Block 0028 [116]: f2f8671327ceeb4c +Block 0028 [117]: 7c904037691f33ba +Block 0028 [118]: 96fb37b562e4c9b8 +Block 0028 [119]: 05fcd6da00353939 +Block 0028 [120]: 0f596ac66bc611c0 +Block 0028 [121]: af26b7fa3530572f +Block 0028 [122]: 18c3afbee2dd6326 +Block 0028 [123]: 5385c318968ff79c +Block 0028 [124]: 74ff24b87493af07 +Block 0028 [125]: 5c194c0a50cb046e +Block 0028 [126]: 73022d716b6a6d1b +Block 0028 [127]: caa125ca87182882 +Block 0029 [ 0]: fc0960a67b7ec1a8 +Block 0029 [ 1]: 6d7bd2f98e6a5ffe +Block 0029 [ 2]: d9ecf72f70549a6a +Block 0029 [ 3]: 47805459f5c4fbd6 +Block 0029 [ 4]: 72fecd2e969f8bb8 +Block 0029 [ 5]: 726a7d27060c41f6 +Block 0029 [ 6]: 2876b25d393f7e10 +Block 0029 [ 7]: 3b1bc55ae5474c0d +Block 0029 [ 8]: 61edce506daea986 +Block 0029 [ 9]: 3e8a6bc466ff959d +Block 0029 [ 10]: 19a6c7d4ac26c129 +Block 0029 [ 11]: 16ad302ec06d236b +Block 0029 [ 12]: 0f34685a73e16ceb +Block 0029 [ 13]: c782e2fd258b4df3 +Block 0029 [ 14]: 35971b0d4ec5b3e2 +Block 0029 [ 15]: c76d6c071c4f0b16 +Block 0029 [ 16]: 6b74e316b38c6bd2 +Block 0029 [ 17]: da9a635a7a35e375 +Block 0029 [ 18]: eedcd0af08112474 +Block 0029 [ 19]: c4e3c5b62f518d59 +Block 0029 [ 20]: 07a9045032534a34 +Block 0029 [ 21]: 8e86baf9d908a2b5 +Block 0029 [ 22]: a12823e5e8d33cc6 +Block 0029 [ 23]: aecdaed64f20ce64 +Block 0029 [ 24]: cf81e3c1bd174f2a +Block 0029 [ 25]: 9b66257654f67fb7 +Block 0029 [ 26]: f3d9816877c71ade +Block 0029 [ 27]: 5e5d7109eb946b0f +Block 0029 [ 28]: cfabf5385167b3e7 +Block 0029 [ 29]: f10e7285325a928d +Block 0029 [ 30]: 179038a47687b7fa +Block 0029 [ 31]: 1209ab7eaf12118d +Block 0029 [ 32]: 2770efce7650bfa0 +Block 0029 [ 33]: 0d8622cfc8311eb0 +Block 0029 [ 34]: 4c83e4b1401e10ee +Block 0029 [ 35]: e7a9bf81a99de5e4 +Block 0029 [ 36]: 3bc5037d75e60ea5 +Block 0029 [ 37]: 9661e829b7a7ba4a +Block 0029 [ 38]: 9d33f0ff44e5bf07 +Block 0029 [ 39]: 522cd22f151397cc +Block 0029 [ 40]: 6b6272068e7fcbfc +Block 0029 [ 41]: fd58176e4a1bbd63 +Block 0029 [ 42]: 8daa234502905ad3 +Block 0029 [ 43]: 3efa160297920c1e +Block 0029 [ 44]: 25effc8c223c842e +Block 0029 [ 45]: 33bc726de3e9e93b +Block 0029 [ 46]: b9e9a801c48e3e99 +Block 0029 [ 47]: 2bc381b9ef4d5a2f +Block 0029 [ 48]: 6837fa8901fdc454 +Block 0029 [ 49]: f23ba3cee006be2b +Block 0029 [ 50]: 0255aaa71fec0b30 +Block 0029 [ 51]: 93ff41644f070fed +Block 0029 [ 52]: 1c1bc44a784a3ed4 +Block 0029 [ 53]: c430d3f39922e831 +Block 0029 [ 54]: 0923d42873597fc9 +Block 0029 [ 55]: cceb977535285fb3 +Block 0029 [ 56]: 8ca0c8994ffc8298 +Block 0029 [ 57]: 24c5d796e0394e74 +Block 0029 [ 58]: 2379800cd30f75d0 +Block 0029 [ 59]: 0f5eaf10e0976ac1 +Block 0029 [ 60]: 76c68cecfee565b8 +Block 0029 [ 61]: 0b647de2dd4f60eb +Block 0029 [ 62]: b9d97be8b9d383a1 +Block 0029 [ 63]: f904b1c9eccef85e +Block 0029 [ 64]: cca9c2c31c4231be +Block 0029 [ 65]: 5e48ce618e385e9f +Block 0029 [ 66]: 9c06a0eebfebca2f +Block 0029 [ 67]: 8180caaa86a0e64a +Block 0029 [ 68]: 5cf18413a32f2966 +Block 0029 [ 69]: c59a9dda2ba89f4d +Block 0029 [ 70]: 69338caebbfb57ec +Block 0029 [ 71]: b2209df6c60fd644 +Block 0029 [ 72]: 2ae1fd8436562fcd +Block 0029 [ 73]: e9bd61cae08d2451 +Block 0029 [ 74]: a4b3defce71b8b2c +Block 0029 [ 75]: 7f1d2047b6298ae2 +Block 0029 [ 76]: cdb72c0cd885af3b +Block 0029 [ 77]: 01d3fd9d4a69b3a4 +Block 0029 [ 78]: 43302b20f168c76c +Block 0029 [ 79]: 1580f91718fbd7c3 +Block 0029 [ 80]: 0f094d8bda5145ed +Block 0029 [ 81]: 4431891cc01a6d4f +Block 0029 [ 82]: c81674848264747c +Block 0029 [ 83]: de3b7800eb2e952a +Block 0029 [ 84]: 285f74d9190aa9e4 +Block 0029 [ 85]: 2cd143aff3fcec91 +Block 0029 [ 86]: 5579ad6b7db95d5a +Block 0029 [ 87]: 21749b437208eae9 +Block 0029 [ 88]: 7ef65a417893a6a9 +Block 0029 [ 89]: b4ceb7fa75463c39 +Block 0029 [ 90]: 3331cf19e3458714 +Block 0029 [ 91]: 6535e001a8a19f13 +Block 0029 [ 92]: aa68097aa9ff3e76 +Block 0029 [ 93]: 74eb5b4fdbe6f9a0 +Block 0029 [ 94]: d05996b9585d7a1d +Block 0029 [ 95]: 5601726c8d72a7ed +Block 0029 [ 96]: dfce7f302b2f05ff +Block 0029 [ 97]: 7dd1f91852f35728 +Block 0029 [ 98]: 1f8698b22c96ed8a +Block 0029 [ 99]: fca4b98cac2e9ece +Block 0029 [100]: 7fb9b24de99a5e85 +Block 0029 [101]: 2f8e30a8ce7c2e01 +Block 0029 [102]: ce1e83f07b07e303 +Block 0029 [103]: b134093842c631ac +Block 0029 [104]: 2c34cfdf69eb3afc +Block 0029 [105]: 4a9877b224c738af +Block 0029 [106]: 34af8d0d9f0f1ff3 +Block 0029 [107]: 2895793c87c52173 +Block 0029 [108]: 1dd6e52d77529937 +Block 0029 [109]: a05ece635779c143 +Block 0029 [110]: d262438d4c71f022 +Block 0029 [111]: 095bfd122b580ac3 +Block 0029 [112]: 24756361b5a5153a +Block 0029 [113]: e6ceee958b68a91d +Block 0029 [114]: cd728e6ee76a6551 +Block 0029 [115]: 8de4480de3e706dc +Block 0029 [116]: 58d1e5aaadaa81ea +Block 0029 [117]: 5bd443fcb025a311 +Block 0029 [118]: 2447b45da523cd5b +Block 0029 [119]: 770d3f8864efbbdb +Block 0029 [120]: bc11cfa12135a788 +Block 0029 [121]: cbf9d333493841c2 +Block 0029 [122]: 78ee18e0ce8f6acb +Block 0029 [123]: fd65bce63ab57899 +Block 0029 [124]: 18c1e72c8b937615 +Block 0029 [125]: 0315f5261511b26a +Block 0029 [126]: 2b3dab20a993a7d1 +Block 0029 [127]: 0b9feaeeee468d2f +Block 0030 [ 0]: b2052ef0dd8f768a +Block 0030 [ 1]: b2b2234ce1973cc3 +Block 0030 [ 2]: 143d19226de29046 +Block 0030 [ 3]: e97211989dedab2e +Block 0030 [ 4]: 2422d9d75bb5bb2c +Block 0030 [ 5]: 305d57c1db2a6865 +Block 0030 [ 6]: e24070b4a268131a +Block 0030 [ 7]: c195f3bc8374f60f +Block 0030 [ 8]: d22ec1870be3b450 +Block 0030 [ 9]: 4559d92ad988b95a +Block 0030 [ 10]: b048f80baa657118 +Block 0030 [ 11]: 0e528a71fad655a3 +Block 0030 [ 12]: 511d78d7d4fc0f33 +Block 0030 [ 13]: 27d7316835672471 +Block 0030 [ 14]: 8cf3ac78da4f354d +Block 0030 [ 15]: b14bb0436ba7bde1 +Block 0030 [ 16]: 8c1bcffac0305930 +Block 0030 [ 17]: a48e003e06294fab +Block 0030 [ 18]: 1c4b57890adaf5e6 +Block 0030 [ 19]: be8aacd556831ec0 +Block 0030 [ 20]: 9a31b07f36eee8ef +Block 0030 [ 21]: 7e290e793e182e2f +Block 0030 [ 22]: 34f7a70e1c71e3ee +Block 0030 [ 23]: ea7bd765e8889914 +Block 0030 [ 24]: 73bb2edb8aade3d4 +Block 0030 [ 25]: cc489b76677d6524 +Block 0030 [ 26]: ace427159176b2b6 +Block 0030 [ 27]: c7ba07529cafa00d +Block 0030 [ 28]: 92ba84640725a577 +Block 0030 [ 29]: 53db5e65e62f40eb +Block 0030 [ 30]: 997c21e63f59c0be +Block 0030 [ 31]: 21a008e41804b69a +Block 0030 [ 32]: 17565f5deec66b24 +Block 0030 [ 33]: a4aecbe8d7e6c344 +Block 0030 [ 34]: 77322670bb8d123d +Block 0030 [ 35]: ff8796a180f48928 +Block 0030 [ 36]: 21d4f5b662279278 +Block 0030 [ 37]: e2203839dab8f281 +Block 0030 [ 38]: 2038dc2c363f8b6a +Block 0030 [ 39]: 1d5a096ca3d83a43 +Block 0030 [ 40]: ceab1bcb187e1696 +Block 0030 [ 41]: bcc01d99df65815b +Block 0030 [ 42]: e1c41fc7fbe1733f +Block 0030 [ 43]: ba7bd22a99fbfc93 +Block 0030 [ 44]: 3bf9adbca3d5aa1e +Block 0030 [ 45]: 5f306633205050cd +Block 0030 [ 46]: 2f352fc9dc50c917 +Block 0030 [ 47]: d7e450f208ba7fed +Block 0030 [ 48]: 44b89f076c0a8e32 +Block 0030 [ 49]: 0222879a3652e295 +Block 0030 [ 50]: 758a6bdb8c865426 +Block 0030 [ 51]: f4cbb242a24e88a0 +Block 0030 [ 52]: c9b5bc6c1d0aa4e8 +Block 0030 [ 53]: cb7a79143dd740f4 +Block 0030 [ 54]: 26b7dda4e33fa82a +Block 0030 [ 55]: b265116b6b7f5fdc +Block 0030 [ 56]: 9d98fa4388b3b1d2 +Block 0030 [ 57]: 63613dd863ffad59 +Block 0030 [ 58]: 5d260e364270c1b5 +Block 0030 [ 59]: 7926ce139af5724f +Block 0030 [ 60]: d491f878ace5751d +Block 0030 [ 61]: cb3e3414137aacf3 +Block 0030 [ 62]: 062ce6f69e6855f9 +Block 0030 [ 63]: 0062e1c94c9fe256 +Block 0030 [ 64]: 92caa34b0ef94118 +Block 0030 [ 65]: dbc5f3073dc30f08 +Block 0030 [ 66]: be3d40036d538186 +Block 0030 [ 67]: 4fbcd8cd79b5052a +Block 0030 [ 68]: 2335944f5b2bf43f +Block 0030 [ 69]: d3a81c3cf09ec276 +Block 0030 [ 70]: 3c82254099597e83 +Block 0030 [ 71]: 60ed028842e9c82b +Block 0030 [ 72]: e10eec69b48c3384 +Block 0030 [ 73]: 1c70f1994eae3be1 +Block 0030 [ 74]: ad67e9cbb7398a34 +Block 0030 [ 75]: dacf3aa8a4a0ba0c +Block 0030 [ 76]: f93343c03119b360 +Block 0030 [ 77]: 667246ada6958ce2 +Block 0030 [ 78]: b3edc34acaf5bbd2 +Block 0030 [ 79]: 3a0309b96bc4f5b6 +Block 0030 [ 80]: 07cfe170c526dfed +Block 0030 [ 81]: a7ea925aa63371f8 +Block 0030 [ 82]: 71f7658e621ebfb7 +Block 0030 [ 83]: 3912f92e486900cd +Block 0030 [ 84]: aedf0645dccfdb9f +Block 0030 [ 85]: 5fd59b9193f61ffc +Block 0030 [ 86]: 1d1885d2ee2a09ea +Block 0030 [ 87]: 54525cea48c434d4 +Block 0030 [ 88]: fde50a79628501e3 +Block 0030 [ 89]: d2bdb7791728bc8c +Block 0030 [ 90]: f47623128330618a +Block 0030 [ 91]: d386f78c8135ba7f +Block 0030 [ 92]: 83508d04d7acdbb2 +Block 0030 [ 93]: d72bec03760e0396 +Block 0030 [ 94]: 797e03273a488905 +Block 0030 [ 95]: 4436818cd7d1722a +Block 0030 [ 96]: 3f7b2a6b2c71efa7 +Block 0030 [ 97]: df843ca2b4d35c43 +Block 0030 [ 98]: bb8b8dcfd2b319dc +Block 0030 [ 99]: 37036a2b2eedf738 +Block 0030 [100]: b090f8e2d304969d +Block 0030 [101]: 650cccfd275c64b6 +Block 0030 [102]: dcfee0436658a01e +Block 0030 [103]: a551a617a6b6a03b +Block 0030 [104]: 12658c3efa5b96f0 +Block 0030 [105]: 4bf8704cdadb4120 +Block 0030 [106]: 91f163a47f8f6d0c +Block 0030 [107]: d67877cafce702cd +Block 0030 [108]: 3c9cf393dfd17fc3 +Block 0030 [109]: 503f28c42762fb95 +Block 0030 [110]: f2c82fa39d46da89 +Block 0030 [111]: 037acff46f38e827 +Block 0030 [112]: 7d6edb0bb6ed18b0 +Block 0030 [113]: 0ae509fab7d47c9b +Block 0030 [114]: 82f725b5acdecd8e +Block 0030 [115]: 9a30b79e16b1477f +Block 0030 [116]: 87d77f42cdeb213c +Block 0030 [117]: b18c6f2b9c1919d2 +Block 0030 [118]: b915794dffc5501f +Block 0030 [119]: 0c6b77c723ca40cf +Block 0030 [120]: 19ca061467c3b5c2 +Block 0030 [121]: 9eb33654b6244029 +Block 0030 [122]: 8583a9d82347931c +Block 0030 [123]: c04fa36a94647b18 +Block 0030 [124]: f886d82796d3d215 +Block 0030 [125]: 25d68dbad584ebe4 +Block 0030 [126]: 1d1de84c4e7bb0e0 +Block 0030 [127]: 12964c6a8e3c24c5 +Block 0031 [ 0]: 1a2c8c1bcaabe68b +Block 0031 [ 1]: b7fd776c18f9b862 +Block 0031 [ 2]: f45b25d204f536c6 +Block 0031 [ 3]: 0e1ec1d884b332ec +Block 0031 [ 4]: 85ba1f4bdbad8499 +Block 0031 [ 5]: 0f32370a51cd3bc1 +Block 0031 [ 6]: f9a8d18784762055 +Block 0031 [ 7]: 6033bc1c026256ae +Block 0031 [ 8]: 7c2ecce01d0d64c9 +Block 0031 [ 9]: 651628e8f822d4f6 +Block 0031 [ 10]: 93b7ce3adf7b86d2 +Block 0031 [ 11]: 95f87ed6efb293db +Block 0031 [ 12]: c5432aefa2fd457f +Block 0031 [ 13]: 00c5907d79fa6b5e +Block 0031 [ 14]: 330562160036c2c1 +Block 0031 [ 15]: 9095bbddb1b6e02e +Block 0031 [ 16]: 37336fa02074432c +Block 0031 [ 17]: 2f74cc26c2050fe7 +Block 0031 [ 18]: 06e2b942aa0b29a3 +Block 0031 [ 19]: c1b41019bdc69a34 +Block 0031 [ 20]: de7010f1e1e1313f +Block 0031 [ 21]: eb0fc0f48840d290 +Block 0031 [ 22]: bdbd37932788c629 +Block 0031 [ 23]: 1d42b93ecf1c2bbd +Block 0031 [ 24]: e42e70e9cb70832b +Block 0031 [ 25]: e652991b2aa76029 +Block 0031 [ 26]: 23fb258e4e7fee36 +Block 0031 [ 27]: 674d3ac465bddc12 +Block 0031 [ 28]: 56a17a87b3e7fdc4 +Block 0031 [ 29]: b10fafba31785f46 +Block 0031 [ 30]: bd16e3f7c623e5fb +Block 0031 [ 31]: 50dffab4fa9ff60e +Block 0031 [ 32]: 94d9b2ce9a522f3f +Block 0031 [ 33]: 80c610c5aec3601e +Block 0031 [ 34]: 40209cc4c5430d7c +Block 0031 [ 35]: 11af15192ea2bac0 +Block 0031 [ 36]: ccbd3b3c53528d22 +Block 0031 [ 37]: 29c6b992555c2df7 +Block 0031 [ 38]: 7a3d9aec341eb2d2 +Block 0031 [ 39]: 7cf7e40e94efc19a +Block 0031 [ 40]: ffcbeb96f181a60c +Block 0031 [ 41]: a9e7fc1c04eaaf72 +Block 0031 [ 42]: 7a11028ec5f57bd3 +Block 0031 [ 43]: ac50d9103f4a38a7 +Block 0031 [ 44]: 62c2ab00c9050c55 +Block 0031 [ 45]: 19ace5b13e02ef92 +Block 0031 [ 46]: 15805e1aa8d6d234 +Block 0031 [ 47]: a83da175fd667938 +Block 0031 [ 48]: 599544fe52cccc3c +Block 0031 [ 49]: 7328d9fa3a03bdd2 +Block 0031 [ 50]: e99f9beec2239b0e +Block 0031 [ 51]: e2665d5afd9bf4cd +Block 0031 [ 52]: f18fdbec632ad538 +Block 0031 [ 53]: c0f2934c37d59988 +Block 0031 [ 54]: 063d57b42ce3fe55 +Block 0031 [ 55]: 59cef85aa100303c +Block 0031 [ 56]: b804c6444c2a37fd +Block 0031 [ 57]: a0a46c89999cce7d +Block 0031 [ 58]: bd02136cdd2729b0 +Block 0031 [ 59]: 47895d4bc230b5b2 +Block 0031 [ 60]: 72dcd1e60d596ace +Block 0031 [ 61]: d3de8808628f18db +Block 0031 [ 62]: f5314a77dc38704e +Block 0031 [ 63]: ddd68c71a56ef2fc +Block 0031 [ 64]: 467bc2e5455c1ae7 +Block 0031 [ 65]: c9ea376dbeb55719 +Block 0031 [ 66]: e5034a450818a9cc +Block 0031 [ 67]: 1cfe70d8e73160fe +Block 0031 [ 68]: 81bd4568141b1161 +Block 0031 [ 69]: 52e25159c99a81e1 +Block 0031 [ 70]: 7b0584c6185b2ca7 +Block 0031 [ 71]: bcaa6093048ce033 +Block 0031 [ 72]: d3e27332ed086c0d +Block 0031 [ 73]: 9c93d42ba384372d +Block 0031 [ 74]: e7f690faa06d23d2 +Block 0031 [ 75]: 4cdd9f1007f7021b +Block 0031 [ 76]: 6be8fb6a4861435f +Block 0031 [ 77]: 048206d822bb042f +Block 0031 [ 78]: fd158dcb8c5ffda6 +Block 0031 [ 79]: 751d0f0b4a45bf77 +Block 0031 [ 80]: 862179d699217e2a +Block 0031 [ 81]: 7137c108e8207ff4 +Block 0031 [ 82]: 9849386ad51ebd49 +Block 0031 [ 83]: 2b1dc6fd29b4de8c +Block 0031 [ 84]: e9572bf08ff72695 +Block 0031 [ 85]: 595505301c056fe7 +Block 0031 [ 86]: 01adcab40f77fe14 +Block 0031 [ 87]: 9192080456546a10 +Block 0031 [ 88]: afceb66af9c8b1ad +Block 0031 [ 89]: ca3828fa65c64bb9 +Block 0031 [ 90]: fecd07d3146ea570 +Block 0031 [ 91]: b3066118394c1441 +Block 0031 [ 92]: 54d3a1d691bc0001 +Block 0031 [ 93]: f9117f8477ab3070 +Block 0031 [ 94]: 6cf7675acdbf390a +Block 0031 [ 95]: 1a24b03a02cc2cc1 +Block 0031 [ 96]: 9665f44bcee15e0c +Block 0031 [ 97]: ee19c0e5b5dadc4e +Block 0031 [ 98]: 0f14abfed1b8a0a5 +Block 0031 [ 99]: a4767e7d6c36a1aa +Block 0031 [100]: f53b35d3fc79f49b +Block 0031 [101]: 91a1f89fbd7bb719 +Block 0031 [102]: e960e8c3c6bf7be5 +Block 0031 [103]: b9a6f3159aa3bf7b +Block 0031 [104]: 58864d1643b857f7 +Block 0031 [105]: 4b6cdc649b45b4a2 +Block 0031 [106]: 84a895724ac0a7b5 +Block 0031 [107]: dde4c935479d6403 +Block 0031 [108]: 903dd11f8c11cf0c +Block 0031 [109]: 9f58c04ce66c1b7f +Block 0031 [110]: 62f18bed8942b0d0 +Block 0031 [111]: 205921ed45b35441 +Block 0031 [112]: 975afa8726547dd7 +Block 0031 [113]: 44b535af11791774 +Block 0031 [114]: 91344f7802210472 +Block 0031 [115]: 3209a717e8b8a883 +Block 0031 [116]: 0d970f1c82784832 +Block 0031 [117]: 450ab7ef353a856e +Block 0031 [118]: d8268f9ea2dc02f6 +Block 0031 [119]: f986c5ffcb996a13 +Block 0031 [120]: e34469a95b305c6b +Block 0031 [121]: d246ee673527bddb +Block 0031 [122]: e28ab4d42c75568e +Block 0031 [123]: 645ed1164314f06c +Block 0031 [124]: 9eacfcfbdb3ce0fc +Block 0031 [125]: 07dedaeb0aee71ac +Block 0031 [126]: 074435fad91548f4 +Block 0031 [127]: 2dbfff23f31b5883 + + After pass 2: +Block 0000 [ 0]: 5f047b575c5ff4d2 +Block 0000 [ 1]: f06985dbf11c91a8 +Block 0000 [ 2]: 89efb2759f9a8964 +Block 0000 [ 3]: 7486a73f62f9b142 +Block 0000 [ 4]: 04510925420c66ee +Block 0000 [ 5]: 02ec38228c37c5c1 +Block 0000 [ 6]: e6ab2b457912bab8 +Block 0000 [ 7]: 7a7302160f813d0b +Block 0000 [ 8]: 85196983c6a99c88 +Block 0000 [ 9]: 793919b5d4d2fe3f +Block 0000 [ 10]: 4174ca650bf22cbf +Block 0000 [ 11]: 73d33705a47001a6 +Block 0000 [ 12]: 10eb4382afcc83c8 +Block 0000 [ 13]: 52fed27577f0d80f +Block 0000 [ 14]: 36d1c95b87f653da +Block 0000 [ 15]: 6f9e5acbdb49a453 +Block 0000 [ 16]: b8262734f13b4a90 +Block 0000 [ 17]: a8f02f5e522cc67c +Block 0000 [ 18]: fff3ae5438debcf9 +Block 0000 [ 19]: e60bf91cdef498bc +Block 0000 [ 20]: 92ec94d4802a8bf1 +Block 0000 [ 21]: 0a2d24b6e655dc7d +Block 0000 [ 22]: 7d1d0fb920dd0459 +Block 0000 [ 23]: dedd69551c04b7c1 +Block 0000 [ 24]: 3511aededd90af82 +Block 0000 [ 25]: a1c6ec50f1a3ee01 +Block 0000 [ 26]: 28740d043e641129 +Block 0000 [ 27]: b28aa3b94d3c62eb +Block 0000 [ 28]: 953f8ce4563fefc9 +Block 0000 [ 29]: 64480ac4c555dc1c +Block 0000 [ 30]: 30948d009ba6d9d0 +Block 0000 [ 31]: b12e34f4768d5ab1 +Block 0000 [ 32]: ea79366a5c411c94 +Block 0000 [ 33]: 3820909417b535b2 +Block 0000 [ 34]: a60b56c5d8e47c14 +Block 0000 [ 35]: 6d64419df3c1657b +Block 0000 [ 36]: 4e60fe0e68fdc370 +Block 0000 [ 37]: 6b34d1e7ffd1f58f +Block 0000 [ 38]: a2618e2a71782401 +Block 0000 [ 39]: 2e0ebd59471df5f1 +Block 0000 [ 40]: afca46f9e6c7a3a8 +Block 0000 [ 41]: 0afc976edd5eef13 +Block 0000 [ 42]: 8d57326fca2940a7 +Block 0000 [ 43]: 4b0896a7e28a8009 +Block 0000 [ 44]: ba9b97a085d9944f +Block 0000 [ 45]: 86dc7b027eb5239d +Block 0000 [ 46]: a1adb7eea4de8f4b +Block 0000 [ 47]: e14b47fb17ee94a0 +Block 0000 [ 48]: 0673a2ded047d48a +Block 0000 [ 49]: 8018a5b24996b8b8 +Block 0000 [ 50]: 550adaf7002459f4 +Block 0000 [ 51]: 619740442a82e646 +Block 0000 [ 52]: 841d26f23222d87e +Block 0000 [ 53]: a5bda4a6c6ebef40 +Block 0000 [ 54]: 1d35886ff0994a0a +Block 0000 [ 55]: 9f2efe245a9a0f6d +Block 0000 [ 56]: da834952d4054492 +Block 0000 [ 57]: 79b44cfc747e6e35 +Block 0000 [ 58]: 454f45b843148ea7 +Block 0000 [ 59]: fe4e7e8d6ee284d4 +Block 0000 [ 60]: 81bfeb6930e92f50 +Block 0000 [ 61]: c5a8c22323c3329e +Block 0000 [ 62]: b7a4075886e814f7 +Block 0000 [ 63]: 38485da04db198a4 +Block 0000 [ 64]: fffa92db07389636 +Block 0000 [ 65]: 4079321de7a249f7 +Block 0000 [ 66]: 9150351d5a078294 +Block 0000 [ 67]: fe6da74e90e55b56 +Block 0000 [ 68]: d151fdb37e488be9 +Block 0000 [ 69]: 222fcdcaa2951d4a +Block 0000 [ 70]: cf7466f1e72ce6a6 +Block 0000 [ 71]: 270d3da26dca1c5b +Block 0000 [ 72]: 567e57efd070a016 +Block 0000 [ 73]: 2786865e1820fb18 +Block 0000 [ 74]: adabab3af194dcc3 +Block 0000 [ 75]: 9b41d5ba67787de2 +Block 0000 [ 76]: 931f4d8a86aca9e1 +Block 0000 [ 77]: d9bca2e97b0d4c9e +Block 0000 [ 78]: 62f0c0bb37535905 +Block 0000 [ 79]: 5776709c1ead9801 +Block 0000 [ 80]: 6ee4546f7151d0e3 +Block 0000 [ 81]: f6884c2886809927 +Block 0000 [ 82]: 2137d2b78baa5334 +Block 0000 [ 83]: 52861e17e6b0be52 +Block 0000 [ 84]: 3c7331786635fddc +Block 0000 [ 85]: 25d2804d3b22f999 +Block 0000 [ 86]: ef36e6d7d49fbb86 +Block 0000 [ 87]: afe8278e58dce088 +Block 0000 [ 88]: 9922e9f924c3588c +Block 0000 [ 89]: 0171a37fc1ef9c4d +Block 0000 [ 90]: a7841e6d2dfa7d6a +Block 0000 [ 91]: e1f0fdfae60f66ba +Block 0000 [ 92]: 29009786b06cd61b +Block 0000 [ 93]: 9c4dfe4cc81fc529 +Block 0000 [ 94]: 35d9e9d3af62794f +Block 0000 [ 95]: 34b057c385eb4fa3 +Block 0000 [ 96]: b3064864a0abf7a0 +Block 0000 [ 97]: e8fbd585908f564a +Block 0000 [ 98]: 5dadf05c04c6e76f +Block 0000 [ 99]: ad0e98068b35bf8b +Block 0000 [100]: e3256c1b7cd320ff +Block 0000 [101]: 8e7673b95838317e +Block 0000 [102]: d8e8331b4fd1f648 +Block 0000 [103]: 2bb6651719c89e56 +Block 0000 [104]: 6110bfa919d8c5ef +Block 0000 [105]: aad86681411c2ac7 +Block 0000 [106]: afbd14609f1d924b +Block 0000 [107]: d568c327bd96e968 +Block 0000 [108]: 8d810ddc42ede14c +Block 0000 [109]: a70d18be3ce495e6 +Block 0000 [110]: 1e38926e13748064 +Block 0000 [111]: ee37b89b52fc73fd +Block 0000 [112]: 96157ab6dc1e04dc +Block 0000 [113]: bb0a05f04288cc31 +Block 0000 [114]: 7134bfe5ce3962a3 +Block 0000 [115]: b25e1793c8803d91 +Block 0000 [116]: 2dffadb73a9c092a +Block 0000 [117]: 934b6dccfa3f7461 +Block 0000 [118]: 509ac15213826b45 +Block 0000 [119]: 21bb0bd5cc719fe5 +Block 0000 [120]: 150184fdbddd607f +Block 0000 [121]: 7d177f7f6b568b47 +Block 0000 [122]: cf69c346b4077ed5 +Block 0000 [123]: 1646908bd3cfd3a7 +Block 0000 [124]: d3198f31d64ab429 +Block 0000 [125]: ea0fd99cc5edcf8f +Block 0000 [126]: b008b065b82a72bc +Block 0000 [127]: 505fd35d1e4ccef7 +Block 0001 [ 0]: e23fe02dfece0288 +Block 0001 [ 1]: 7a7047500e615340 +Block 0001 [ 2]: afd8a4beaf7eecbe +Block 0001 [ 3]: 3853b52881b4d557 +Block 0001 [ 4]: 3a0726b2611e576c +Block 0001 [ 5]: 164de228aef03411 +Block 0001 [ 6]: e0ef04f35c1b90bf +Block 0001 [ 7]: 8a24c8c277606abb +Block 0001 [ 8]: 15a9a3833a46cd66 +Block 0001 [ 9]: 3479e3154cbd781b +Block 0001 [ 10]: cee2576a3ea0a445 +Block 0001 [ 11]: 71c742512ce7dfe7 +Block 0001 [ 12]: 374bb75c47786552 +Block 0001 [ 13]: 630b3b5d99fcd3e7 +Block 0001 [ 14]: 846e9694385dcb34 +Block 0001 [ 15]: 5be2868061e80aa0 +Block 0001 [ 16]: 0e16b6de661c36fc +Block 0001 [ 17]: 0e0d73e8f72a85cf +Block 0001 [ 18]: 662e527420484106 +Block 0001 [ 19]: fcbe0420b0c32a2f +Block 0001 [ 20]: 89e98ddc25ef2d06 +Block 0001 [ 21]: 5caa597bcb7ba3e7 +Block 0001 [ 22]: 8e03cf25508e979f +Block 0001 [ 23]: 363bd2a52521a8f2 +Block 0001 [ 24]: c1f3534d80f3aeeb +Block 0001 [ 25]: b3eb770ff7cb18db +Block 0001 [ 26]: 2c7aa5f0da8ac2e7 +Block 0001 [ 27]: 15e9bdb364864ddc +Block 0001 [ 28]: 255c874b1c6a9018 +Block 0001 [ 29]: b5ba03b749263dbf +Block 0001 [ 30]: e2ed6f93e61f5697 +Block 0001 [ 31]: a78394dcc822edab +Block 0001 [ 32]: c08c2ac9e1443d09 +Block 0001 [ 33]: b88b9991ebef2207 +Block 0001 [ 34]: fcd15d6715225a8f +Block 0001 [ 35]: a9133bf21b326cd9 +Block 0001 [ 36]: eb9e37c6a7389f4a +Block 0001 [ 37]: e512d3c8e4461442 +Block 0001 [ 38]: 43ea6edbdfee43da +Block 0001 [ 39]: 7732be0a715b4fe1 +Block 0001 [ 40]: b7f665f9497beedf +Block 0001 [ 41]: dec2cc2b22055132 +Block 0001 [ 42]: c453e83a35577b22 +Block 0001 [ 43]: 0bec3a763bd104fe +Block 0001 [ 44]: 8b3bae725e3cd134 +Block 0001 [ 45]: ee59014b976308ab +Block 0001 [ 46]: f87ad095fb5c97cf +Block 0001 [ 47]: 0ae0eaceb2778e2f +Block 0001 [ 48]: 723bd2b7767936c5 +Block 0001 [ 49]: f49d4c733715ef4e +Block 0001 [ 50]: d3c7f66d314946ea +Block 0001 [ 51]: b4d09df6006617bd +Block 0001 [ 52]: 7cacc786cae67a7f +Block 0001 [ 53]: cb7c92aa113c6456 +Block 0001 [ 54]: 00beca54428b7dfc +Block 0001 [ 55]: 411b91c93166751e +Block 0001 [ 56]: db3db21fad2ef261 +Block 0001 [ 57]: 4c7fdda23adee093 +Block 0001 [ 58]: 9aa9d0309fe56528 +Block 0001 [ 59]: 7ac95d0e833e8229 +Block 0001 [ 60]: b866b5cac808e923 +Block 0001 [ 61]: ec33c77566bd6359 +Block 0001 [ 62]: b2eebb43d735ee1d +Block 0001 [ 63]: 118649041c59e2a7 +Block 0001 [ 64]: af20206ba5a1d752 +Block 0001 [ 65]: ba2ffe7788aae99a +Block 0001 [ 66]: a7b7298d3894db9f +Block 0001 [ 67]: 672ca76708483292 +Block 0001 [ 68]: aff4782c897c1a19 +Block 0001 [ 69]: 538d023ad96755df +Block 0001 [ 70]: 7ed7c497cab08355 +Block 0001 [ 71]: 884b34285863cb15 +Block 0001 [ 72]: ad1074a607136bf4 +Block 0001 [ 73]: 2ce505de99c23839 +Block 0001 [ 74]: b5604fab94c774ce +Block 0001 [ 75]: 109c4bd7c942078d +Block 0001 [ 76]: 3162ee468266a0bb +Block 0001 [ 77]: 6c3fc918ea50144b +Block 0001 [ 78]: 78f48ec6e1935763 +Block 0001 [ 79]: 40d6723006b90439 +Block 0001 [ 80]: 949a1c0ada5735dc +Block 0001 [ 81]: dc267afd286782f0 +Block 0001 [ 82]: 8804bd6d72a09d6d +Block 0001 [ 83]: bf39223e7a69770f +Block 0001 [ 84]: eb9d92cf56dff8d4 +Block 0001 [ 85]: 9ba7e9818f3e2b83 +Block 0001 [ 86]: accc832478308d87 +Block 0001 [ 87]: 71426e5757b74cf5 +Block 0001 [ 88]: 86a2ce89cd883f48 +Block 0001 [ 89]: d51f5d0a02790eb0 +Block 0001 [ 90]: 69e80c29297bedba +Block 0001 [ 91]: b3ec930fd404c55f +Block 0001 [ 92]: f24a1b23b7fedd1b +Block 0001 [ 93]: df5eccd58d6e4d6d +Block 0001 [ 94]: df40d0c69d78d9e8 +Block 0001 [ 95]: 3f8deaad8715ac9e +Block 0001 [ 96]: 1420be79644c1361 +Block 0001 [ 97]: 7e419bbb9bb9c864 +Block 0001 [ 98]: 013bf5d9ff74a285 +Block 0001 [ 99]: 581cd3a635a82691 +Block 0001 [100]: 199060c3ec5749a7 +Block 0001 [101]: d2fb1f9a243f098e +Block 0001 [102]: 37e1d71ee09bf2ea +Block 0001 [103]: 8c6955f9c37d373d +Block 0001 [104]: 0198d6d56e79086c +Block 0001 [105]: 129bfc2713ea2f9b +Block 0001 [106]: 8a967e53ac7c5692 +Block 0001 [107]: 75c7da7d357d5081 +Block 0001 [108]: 2dd6000b05d59968 +Block 0001 [109]: 06d0f5a683d1d03d +Block 0001 [110]: ebe5918726260f2f +Block 0001 [111]: 6930dac6aed65ff2 +Block 0001 [112]: e6df29645dd40e27 +Block 0001 [113]: 7b194cdaa168bcbe +Block 0001 [114]: 4a6cf8603ba55ee7 +Block 0001 [115]: 810f83dfc5dba615 +Block 0001 [116]: 07309feafb67199a +Block 0001 [117]: f6935d2b7c348c42 +Block 0001 [118]: 03c9c420a3e2eb7e +Block 0001 [119]: 8fe083617e5113eb +Block 0001 [120]: 28646389371863dc +Block 0001 [121]: 9d2d5c7776640f98 +Block 0001 [122]: 50494930c9be4284 +Block 0001 [123]: ef8058bf7ff7bde1 +Block 0001 [124]: be1b94279c25e46c +Block 0001 [125]: dcf4a14db25c1256 +Block 0001 [126]: ca8ef78ff53a0810 +Block 0001 [127]: 60f3728e2974e872 +Block 0002 [ 0]: 39369bd574bae1e2 +Block 0002 [ 1]: 03c14c225a42f602 +Block 0002 [ 2]: 59451ab02d6097c4 +Block 0002 [ 3]: 6201036724302781 +Block 0002 [ 4]: 7df52ebbc54327fb +Block 0002 [ 5]: 02cfe5c5677df54c +Block 0002 [ 6]: 383b7ca84b2fe67b +Block 0002 [ 7]: 935af47cb7e61e8e +Block 0002 [ 8]: 2986c34f785bf3ce +Block 0002 [ 9]: 7fba12b74db5a3ea +Block 0002 [ 10]: 0ff431215ac1f459 +Block 0002 [ 11]: 43a4cb7337fcd315 +Block 0002 [ 12]: 814d8fe45d6cecae +Block 0002 [ 13]: 7b902f70ed347f57 +Block 0002 [ 14]: 29fe23d166395653 +Block 0002 [ 15]: eef4afe6df3f28f3 +Block 0002 [ 16]: 127e45c900e2c848 +Block 0002 [ 17]: 3306010e528593e7 +Block 0002 [ 18]: b8c02ac97a845931 +Block 0002 [ 19]: 46b64e9d8859791c +Block 0002 [ 20]: 7c4593f720b8abfc +Block 0002 [ 21]: e671739a7fa910c8 +Block 0002 [ 22]: 3c0ca2e596d4c5d7 +Block 0002 [ 23]: e5cc2e4ca17ee077 +Block 0002 [ 24]: 701b7a9777c5b49a +Block 0002 [ 25]: 9131b8f9e8d63e08 +Block 0002 [ 26]: 2b7337f76bc9eacd +Block 0002 [ 27]: 2239c65e34ca42fb +Block 0002 [ 28]: 745f147facd4c359 +Block 0002 [ 29]: 82719af98b72fd9d +Block 0002 [ 30]: cd2848b4284fde78 +Block 0002 [ 31]: ca255cad0f479018 +Block 0002 [ 32]: db7ec3db4fa79052 +Block 0002 [ 33]: 2a3a0842efecbdd6 +Block 0002 [ 34]: e6f8d36519338fa6 +Block 0002 [ 35]: 54bb7617ed5b435e +Block 0002 [ 36]: 3b2807d9b536ad4a +Block 0002 [ 37]: fc84c316852ec1fa +Block 0002 [ 38]: 26b77f4eb9432021 +Block 0002 [ 39]: d789c86e89425b09 +Block 0002 [ 40]: f8be2d5484b0516a +Block 0002 [ 41]: 2bfeda2bb3b7e808 +Block 0002 [ 42]: d3bafc5d0646a46f +Block 0002 [ 43]: 3d0952ab4da0d97d +Block 0002 [ 44]: 7464b8d709366c81 +Block 0002 [ 45]: 36d1b42cde123306 +Block 0002 [ 46]: 8004e517e8316a81 +Block 0002 [ 47]: 7c90747d7b078051 +Block 0002 [ 48]: 199d6dfc53aa8200 +Block 0002 [ 49]: 259280428b473b5a +Block 0002 [ 50]: b8f07b7ef895a5e0 +Block 0002 [ 51]: e1d51665927f76bd +Block 0002 [ 52]: a8eb08f4e73b8cdd +Block 0002 [ 53]: ee82681cc6052db9 +Block 0002 [ 54]: e5826081a53a17f6 +Block 0002 [ 55]: ff40c3b7dd042602 +Block 0002 [ 56]: 57dd3f387a60b728 +Block 0002 [ 57]: 807a505c9f389331 +Block 0002 [ 58]: 67f2d7a33e606167 +Block 0002 [ 59]: 2d45965aa7e282f9 +Block 0002 [ 60]: 5624e92fb2dc4f4b +Block 0002 [ 61]: a1538a72c67d49b8 +Block 0002 [ 62]: a69b48d6b0e95ba7 +Block 0002 [ 63]: 4da8014e6a26f616 +Block 0002 [ 64]: 5d6b7d6ab6ebc703 +Block 0002 [ 65]: aeb74a3c5d7f4e27 +Block 0002 [ 66]: e67f12f71042997d +Block 0002 [ 67]: 8b4e258db674c59b +Block 0002 [ 68]: 095994a8f629afa1 +Block 0002 [ 69]: cefe061777f2b9ba +Block 0002 [ 70]: 3111c90d014dfd20 +Block 0002 [ 71]: 9326129a0010bd4c +Block 0002 [ 72]: ac17c28df5603581 +Block 0002 [ 73]: ad9e792b2600856b +Block 0002 [ 74]: 7b52afe6653f1cbc +Block 0002 [ 75]: 4a3e1516bfaf4925 +Block 0002 [ 76]: 8a082f41cca1c7de +Block 0002 [ 77]: 5e078a2d9634808e +Block 0002 [ 78]: 24951ed4ec5dea22 +Block 0002 [ 79]: 3091f28343d7c8b3 +Block 0002 [ 80]: dd18c8476dee4378 +Block 0002 [ 81]: fb421e171aac32be +Block 0002 [ 82]: 76bfb4022d16cfdb +Block 0002 [ 83]: 8f11eff2545455b4 +Block 0002 [ 84]: 8a2caf8661e95761 +Block 0002 [ 85]: 978e70edf1fafd80 +Block 0002 [ 86]: db4c587ad8767542 +Block 0002 [ 87]: 048172243ee062ab +Block 0002 [ 88]: ad90fc7b6b091293 +Block 0002 [ 89]: 2cc72efbd1e1fc8a +Block 0002 [ 90]: 639149af926c30ee +Block 0002 [ 91]: 7f942b868a1e86c5 +Block 0002 [ 92]: 8dd06eb5391596bc +Block 0002 [ 93]: e06cd833c21c3452 +Block 0002 [ 94]: f6f1f3faaa49b90c +Block 0002 [ 95]: b69c11f167588766 +Block 0002 [ 96]: 33eba8a816984e87 +Block 0002 [ 97]: 75c80eebb391fd0d +Block 0002 [ 98]: f9fdf867aa40219f +Block 0002 [ 99]: 73d3352396231a1e +Block 0002 [100]: 1c4bacf442c7da1e +Block 0002 [101]: b6b7fe2213ed030c +Block 0002 [102]: 8d0c685cb7c66ed9 +Block 0002 [103]: 1a96ac2110dd72bb +Block 0002 [104]: 244427570cb404eb +Block 0002 [105]: 8ae727d6c5d3518d +Block 0002 [106]: 97b104542790620e +Block 0002 [107]: 622dfdd36156eeca +Block 0002 [108]: a681e9d1ddda8db1 +Block 0002 [109]: f83107b93461b7f7 +Block 0002 [110]: cac3d7435c8b7450 +Block 0002 [111]: 876b185293c2ca77 +Block 0002 [112]: 2e1062849912cca8 +Block 0002 [113]: 467cf6b5ac5de0d5 +Block 0002 [114]: 6f44c747864760d5 +Block 0002 [115]: 7c686cf9c11360c3 +Block 0002 [116]: 3ed0e4a95c138496 +Block 0002 [117]: 6993c2bc63d9ac3d +Block 0002 [118]: 0fb471c25e0c41f8 +Block 0002 [119]: b7b0a9f7f9f49c2f +Block 0002 [120]: b8f3f293846684d6 +Block 0002 [121]: d5e6beb9078d4fd5 +Block 0002 [122]: dd647833684bd281 +Block 0002 [123]: 9978cc549f5c517e +Block 0002 [124]: d2c6b09d7235366d +Block 0002 [125]: 42dd43d586384fb5 +Block 0002 [126]: 1e54c27c01e78a0a +Block 0002 [127]: 08a37dbd2e2c584c +Block 0003 [ 0]: f654555f71650eb5 +Block 0003 [ 1]: 3311cb058032eb5e +Block 0003 [ 2]: fc42c737ea9c6945 +Block 0003 [ 3]: e21292d9164f2490 +Block 0003 [ 4]: 27d5b895386b5566 +Block 0003 [ 5]: 33f63d927b58fc26 +Block 0003 [ 6]: 32174cdb2bdc697a +Block 0003 [ 7]: 1631ec0d811e1d44 +Block 0003 [ 8]: 5ff386aeb5b7bbc9 +Block 0003 [ 9]: 286d219ba13605b2 +Block 0003 [ 10]: 0eafeddd1a0e0ef1 +Block 0003 [ 11]: 2ba6e0082d1218ae +Block 0003 [ 12]: 6956be8e800c160c +Block 0003 [ 13]: fded8de7903d4593 +Block 0003 [ 14]: edcac78e6073c155 +Block 0003 [ 15]: 273bc8ae910e209f +Block 0003 [ 16]: 4936f51d1793db47 +Block 0003 [ 17]: abfd6cef979f9dc7 +Block 0003 [ 18]: 85f80f74df948f05 +Block 0003 [ 19]: facb8f407834cdbf +Block 0003 [ 20]: f17ef84c91fefb2e +Block 0003 [ 21]: 0bc71a9ff8563aa5 +Block 0003 [ 22]: 5f00784cdffd8521 +Block 0003 [ 23]: c3efad6fcbbc8a06 +Block 0003 [ 24]: 9490284fad1de8b8 +Block 0003 [ 25]: 14d654aedea41317 +Block 0003 [ 26]: c6d4efd8354e0949 +Block 0003 [ 27]: b9d56d742808a1c6 +Block 0003 [ 28]: 93c4b288ef9737e2 +Block 0003 [ 29]: da912a5517927945 +Block 0003 [ 30]: 153b0fd5456cea9f +Block 0003 [ 31]: 88ff1e555463a130 +Block 0003 [ 32]: 29a555f4cd5b9da0 +Block 0003 [ 33]: 14c51a88b06a0773 +Block 0003 [ 34]: 127711470296f408 +Block 0003 [ 35]: b77c859a87ddd4b2 +Block 0003 [ 36]: 55989192f96f7c3d +Block 0003 [ 37]: b8cd6fa583cf4447 +Block 0003 [ 38]: 30e4137e4fe0b6a3 +Block 0003 [ 39]: d193e8dcb686123f +Block 0003 [ 40]: ae11628e6951ccc9 +Block 0003 [ 41]: 87c07ce234d715ed +Block 0003 [ 42]: 48512af01ece52c6 +Block 0003 [ 43]: ac5bd0db212ea1c2 +Block 0003 [ 44]: fc27495856d80c64 +Block 0003 [ 45]: d52ad551af985ed5 +Block 0003 [ 46]: 0f61ba492b8ea576 +Block 0003 [ 47]: 16f7d80e585074f7 +Block 0003 [ 48]: 1168c339be2be781 +Block 0003 [ 49]: 5491fea8c46927b3 +Block 0003 [ 50]: aa61457274175666 +Block 0003 [ 51]: 3a4cf2ecfa768b01 +Block 0003 [ 52]: 0b02dfde40ed6dd9 +Block 0003 [ 53]: 3aef92409270803d +Block 0003 [ 54]: 7d9b3b46d5f370b3 +Block 0003 [ 55]: 8bfe8cea00744a99 +Block 0003 [ 56]: c3ddc5c8c41dfb8c +Block 0003 [ 57]: 65d9708ed44e7df6 +Block 0003 [ 58]: 6ffdcee0a3f57453 +Block 0003 [ 59]: a8c006aca6c7f351 +Block 0003 [ 60]: 9fcb17f2691e1b55 +Block 0003 [ 61]: 0d090bf265f19bc5 +Block 0003 [ 62]: 21ad8443d491f5d1 +Block 0003 [ 63]: 916906b4f23224a3 +Block 0003 [ 64]: 10326b632749767c +Block 0003 [ 65]: f98c66a67c554352 +Block 0003 [ 66]: 9d1db4e901aec7a7 +Block 0003 [ 67]: f4a9961aba0cce0b +Block 0003 [ 68]: 90838c0c8fbee672 +Block 0003 [ 69]: a629e641159afbce +Block 0003 [ 70]: 0243ef1605b73782 +Block 0003 [ 71]: f4da62fa164f1744 +Block 0003 [ 72]: ba1ab52f4c558313 +Block 0003 [ 73]: 3382bbdd5f4d4288 +Block 0003 [ 74]: c87f9ec6d052b361 +Block 0003 [ 75]: 8c2de6ea01c4b855 +Block 0003 [ 76]: aef8c1c0bc852867 +Block 0003 [ 77]: a15792470e7625f7 +Block 0003 [ 78]: eb1499c0c6cb078b +Block 0003 [ 79]: 798694ae75cdcb8b +Block 0003 [ 80]: 93fffae472430115 +Block 0003 [ 81]: 282640d3575746c7 +Block 0003 [ 82]: ae00e8190db94ff8 +Block 0003 [ 83]: 947bc0354b75208e +Block 0003 [ 84]: ea8105cefa4cfcc4 +Block 0003 [ 85]: afe4ec955e6566d2 +Block 0003 [ 86]: b981cf985be10ec2 +Block 0003 [ 87]: 49434b094d1ae22b +Block 0003 [ 88]: 556e09e96107d1af +Block 0003 [ 89]: f62123222b386d5e +Block 0003 [ 90]: 6d178b5dd97aaf24 +Block 0003 [ 91]: 692bc5ab5b4ae925 +Block 0003 [ 92]: 3eebac8e2943d15f +Block 0003 [ 93]: d4c6171da55b6eac +Block 0003 [ 94]: dc546cd17f8219b7 +Block 0003 [ 95]: b933681a382fee47 +Block 0003 [ 96]: 4db5fa3ce780954d +Block 0003 [ 97]: 15229c91cb28bd08 +Block 0003 [ 98]: f740ddedafb71fc7 +Block 0003 [ 99]: d913d87686827178 +Block 0003 [100]: 563ab13b43e54c66 +Block 0003 [101]: f6ff4f6d55021cbf +Block 0003 [102]: 6d98731ba4459fe4 +Block 0003 [103]: fbef87bfb8f3b748 +Block 0003 [104]: 266b4c4a60074b3e +Block 0003 [105]: 0350f01dae1431b2 +Block 0003 [106]: 13a6a89350b1ee9f +Block 0003 [107]: 0326c88be0d895ea +Block 0003 [108]: 4ebefeafac42a5f4 +Block 0003 [109]: 71892e75bdc60352 +Block 0003 [110]: b7d3b5ecb45e0c8d +Block 0003 [111]: 860a73b1dd642684 +Block 0003 [112]: fd84fba35e10a99d +Block 0003 [113]: 7a8410820891078b +Block 0003 [114]: 86425f3ff9294b51 +Block 0003 [115]: d5fb33f90967ce7f +Block 0003 [116]: 53f65da243c0178d +Block 0003 [117]: 62029d3cce2945c2 +Block 0003 [118]: 4b1e0f57d816419f +Block 0003 [119]: 51eb3849aaffbaac +Block 0003 [120]: e05d248edb287da8 +Block 0003 [121]: 9615afc8dbd4ff70 +Block 0003 [122]: ff3e6685c8335e56 +Block 0003 [123]: 4394ae3741da402d +Block 0003 [124]: 62b8900ae6d45ec7 +Block 0003 [125]: 1e0e3b150ac1b8e6 +Block 0003 [126]: 46406a5dbdb3f471 +Block 0003 [127]: 4f2f51287c0533c5 +Block 0004 [ 0]: 6db3c512b201002a +Block 0004 [ 1]: a4893e550c6e847d +Block 0004 [ 2]: d738c01c6a4163cf +Block 0004 [ 3]: 3964a940c68c7672 +Block 0004 [ 4]: 008607d363313b1e +Block 0004 [ 5]: 09ac4c012f8a9f73 +Block 0004 [ 6]: 30407682ac696ad5 +Block 0004 [ 7]: d11878678fd15c5e +Block 0004 [ 8]: 2c97e49a7c535568 +Block 0004 [ 9]: c657dc0e64f3bada +Block 0004 [ 10]: 71d6d5d67c0e69c0 +Block 0004 [ 11]: 113f757922c12d80 +Block 0004 [ 12]: dff40f405affada0 +Block 0004 [ 13]: 7c770d074afdccbe +Block 0004 [ 14]: 02178564a28476ca +Block 0004 [ 15]: db9f8e2d04cb05d0 +Block 0004 [ 16]: 28dcb359ce250e08 +Block 0004 [ 17]: 1a551496399d2942 +Block 0004 [ 18]: e88e14ab890ff5ef +Block 0004 [ 19]: 488747a7703b9e7e +Block 0004 [ 20]: c31d161b0cc89570 +Block 0004 [ 21]: 4565c4b429ba6e1b +Block 0004 [ 22]: 0dfc72c087e1e08d +Block 0004 [ 23]: c92bf55e556097f8 +Block 0004 [ 24]: c4e7fe3a2a6e24ae +Block 0004 [ 25]: 581c2a385043aa51 +Block 0004 [ 26]: 35aef500b5f3eeae +Block 0004 [ 27]: 7f0e1d27c86cd926 +Block 0004 [ 28]: d557943ed1408c41 +Block 0004 [ 29]: 4af1b776a3298be5 +Block 0004 [ 30]: 8fd70fb3204a5114 +Block 0004 [ 31]: cd384f9fe3618f69 +Block 0004 [ 32]: 7c1c3fda22ce27c7 +Block 0004 [ 33]: dafd9ca79b351f86 +Block 0004 [ 34]: d44cb4fe10e44d5a +Block 0004 [ 35]: e9b2864c088d109e +Block 0004 [ 36]: 48e804a44fcc8a52 +Block 0004 [ 37]: daf3c5093302dc6b +Block 0004 [ 38]: a5be11b060ed5242 +Block 0004 [ 39]: e9140882ceeca69e +Block 0004 [ 40]: cc52836dc00f5bc7 +Block 0004 [ 41]: a60c4dd162e9ff75 +Block 0004 [ 42]: 48583d5cc8289c3e +Block 0004 [ 43]: 7f054592fdc38b14 +Block 0004 [ 44]: 132a9aa37870e575 +Block 0004 [ 45]: 73190cf53e288776 +Block 0004 [ 46]: ce8fde7a06993a1c +Block 0004 [ 47]: ed6199768f24b208 +Block 0004 [ 48]: 3ce97da1f9764400 +Block 0004 [ 49]: 23ecfa6cada7dd08 +Block 0004 [ 50]: 742ac86a22594f47 +Block 0004 [ 51]: 97676b7e0ae47bfa +Block 0004 [ 52]: ca78eecf87b2c0ef +Block 0004 [ 53]: dbff89c5a1ebad88 +Block 0004 [ 54]: 5533435d722aa535 +Block 0004 [ 55]: d51f7db2b23c1fcc +Block 0004 [ 56]: 65945d416121db78 +Block 0004 [ 57]: 2dc4f63b23ade57c +Block 0004 [ 58]: 22918d3b5b563b9d +Block 0004 [ 59]: 586ecd2e7df54ab2 +Block 0004 [ 60]: 1ac158a954866416 +Block 0004 [ 61]: 58d7ffbda6c857ff +Block 0004 [ 62]: 05a5b1765440b5d4 +Block 0004 [ 63]: f5593d391d483ae6 +Block 0004 [ 64]: b63afd052e7947cb +Block 0004 [ 65]: e9f1f92af8a2691d +Block 0004 [ 66]: 60fc54dfe8069a35 +Block 0004 [ 67]: fd2d4ccef3df5227 +Block 0004 [ 68]: 865b629d66d54066 +Block 0004 [ 69]: 062e9dab817e9e93 +Block 0004 [ 70]: 01671e76195217b0 +Block 0004 [ 71]: db554319cc55bbc6 +Block 0004 [ 72]: 33767aa620c6b9b4 +Block 0004 [ 73]: eb3070747ce8cd7a +Block 0004 [ 74]: 04a8f94c1f278eb8 +Block 0004 [ 75]: e37bd2e6fd74ac2d +Block 0004 [ 76]: 51954636db769391 +Block 0004 [ 77]: 62c924aef3d3a00b +Block 0004 [ 78]: 6be2ac1f4372e6bd +Block 0004 [ 79]: 6da5ea764aca7b86 +Block 0004 [ 80]: 7e98e9bb49fd5555 +Block 0004 [ 81]: 240a6bbea9499bf4 +Block 0004 [ 82]: ddae77704bd95091 +Block 0004 [ 83]: f20301a1e60a6388 +Block 0004 [ 84]: 843a97d690d125be +Block 0004 [ 85]: 0b22b9279728e0e4 +Block 0004 [ 86]: a68682bfef9cab88 +Block 0004 [ 87]: 54c152c5f6aa3347 +Block 0004 [ 88]: 3808ff4b61eb729e +Block 0004 [ 89]: eefb42a45db2b6df +Block 0004 [ 90]: 1057807d974ab8ba +Block 0004 [ 91]: f8b3a10c3c4ff30c +Block 0004 [ 92]: 50a10480d2c50642 +Block 0004 [ 93]: 9346af5b676d53d8 +Block 0004 [ 94]: fb4f3d3d2071a72c +Block 0004 [ 95]: 34ba748255e95958 +Block 0004 [ 96]: 1d55802ac5c6fbdd +Block 0004 [ 97]: 6e9bf639f96a71f7 +Block 0004 [ 98]: 2865022a7dca1fb3 +Block 0004 [ 99]: 051f576aa5462e73 +Block 0004 [100]: d7d06ece195f2115 +Block 0004 [101]: d198cfcdb221649a +Block 0004 [102]: d29774868386b41a +Block 0004 [103]: ed82361d873ab22c +Block 0004 [104]: a183f13bbdb3604d +Block 0004 [105]: 0d090eafafb9360d +Block 0004 [106]: c332ad53dca32795 +Block 0004 [107]: fca986dd4c58e868 +Block 0004 [108]: 7b049c4605c543ae +Block 0004 [109]: 59001a287ee5eb5a +Block 0004 [110]: ec48fff4d2bf19bc +Block 0004 [111]: 1ffbfa763d246fb2 +Block 0004 [112]: 77d442d05e756c41 +Block 0004 [113]: 7303708414279f9f +Block 0004 [114]: 1af6d103ba844721 +Block 0004 [115]: bf3af22c312f879f +Block 0004 [116]: 1974673bd6eace85 +Block 0004 [117]: 3c09fe80692acf97 +Block 0004 [118]: 69b5ceffe923242e +Block 0004 [119]: 5250d18f4e18d38f +Block 0004 [120]: 775d04feeecac653 +Block 0004 [121]: 3158b3eebf7cbfa1 +Block 0004 [122]: c9eb36370d6b31fa +Block 0004 [123]: 1c8d0a60062f4870 +Block 0004 [124]: 0536d25cf8ac9a2d +Block 0004 [125]: 2bbdd54340de4566 +Block 0004 [126]: 83a3bb8032d4444e +Block 0004 [127]: 49472858871210ef +Block 0005 [ 0]: b4676f8440d3dd72 +Block 0005 [ 1]: 543dc9478bcae8a8 +Block 0005 [ 2]: 0a1b2608dad7d093 +Block 0005 [ 3]: 158d884310bf64b9 +Block 0005 [ 4]: 0c39f463ae7e1f98 +Block 0005 [ 5]: 0f484a93597079e2 +Block 0005 [ 6]: 22008b41a1cae988 +Block 0005 [ 7]: 39fb86f28f9a72a9 +Block 0005 [ 8]: 0580218b147847ec +Block 0005 [ 9]: 45050f209731847b +Block 0005 [ 10]: a74df9c792a856ad +Block 0005 [ 11]: 59f9d055bf19b4b4 +Block 0005 [ 12]: 580d97d3550b9001 +Block 0005 [ 13]: 99394acf81072667 +Block 0005 [ 14]: 93bbd5b7531eada8 +Block 0005 [ 15]: 1fecebd996a84649 +Block 0005 [ 16]: 6a17fbcdbcde10f9 +Block 0005 [ 17]: 5276ce784b77e366 +Block 0005 [ 18]: 8a44853a1744c6c0 +Block 0005 [ 19]: 4760a36dfe24f187 +Block 0005 [ 20]: 7820ef1c716bc110 +Block 0005 [ 21]: 6ef7d4f420895751 +Block 0005 [ 22]: 605216e6d4a25a6a +Block 0005 [ 23]: 4b5acecae3fc8137 +Block 0005 [ 24]: 8df97b41aa216f3e +Block 0005 [ 25]: dcf8b51afa021170 +Block 0005 [ 26]: 72f57e5d1198747e +Block 0005 [ 27]: 7ab38114f0c3bfa0 +Block 0005 [ 28]: f515e2ba68a87769 +Block 0005 [ 29]: f422c9c76c9eb8cb +Block 0005 [ 30]: 9c9891e7d3c223d4 +Block 0005 [ 31]: ce6f99e5c48a2663 +Block 0005 [ 32]: d29a3e3cd369dc81 +Block 0005 [ 33]: 40d164ddb9622371 +Block 0005 [ 34]: acb980475786ab78 +Block 0005 [ 35]: f01def3e29ade749 +Block 0005 [ 36]: 85c0aca46da00807 +Block 0005 [ 37]: 6d6d6499dff5bc9b +Block 0005 [ 38]: f1a27605d1fe54ab +Block 0005 [ 39]: 592b2bc9bed0c745 +Block 0005 [ 40]: b9b8f3626ae6869f +Block 0005 [ 41]: 928331757d8b0ad0 +Block 0005 [ 42]: 0122bca4dd95e8fa +Block 0005 [ 43]: 25deae32523e74d9 +Block 0005 [ 44]: f8504d6710fa925b +Block 0005 [ 45]: 9d1b3bfa72ae59c5 +Block 0005 [ 46]: 3bba17b4dd2869d1 +Block 0005 [ 47]: e37edf9156e83204 +Block 0005 [ 48]: 104bd93e079e7426 +Block 0005 [ 49]: 82ccac92ea08c463 +Block 0005 [ 50]: 4f9fbf43f625dff8 +Block 0005 [ 51]: ef452ce3634d96d6 +Block 0005 [ 52]: 6ca846373c25297b +Block 0005 [ 53]: 20f669afc7c5af53 +Block 0005 [ 54]: 3cb2ad71a1c3a85b +Block 0005 [ 55]: 8e62f61109c2a232 +Block 0005 [ 56]: 944e5054bdca864e +Block 0005 [ 57]: 449c32f8480c83eb +Block 0005 [ 58]: e72123d7320f8a5c +Block 0005 [ 59]: ea19e7d53fc6fdc8 +Block 0005 [ 60]: 7a0bce3cc157ed97 +Block 0005 [ 61]: b931c70ee2259840 +Block 0005 [ 62]: bb95f4ea8eb1f929 +Block 0005 [ 63]: baaff204920aec3b +Block 0005 [ 64]: d53b7d052d5fe9eb +Block 0005 [ 65]: 846fa7db54e2b603 +Block 0005 [ 66]: d58ecfb72f270009 +Block 0005 [ 67]: 2e2e2e0ed43881b1 +Block 0005 [ 68]: 37e5fa1b47043b18 +Block 0005 [ 69]: 2d2fc7ac1c4e27b4 +Block 0005 [ 70]: 41bdf2f0b4343a48 +Block 0005 [ 71]: d6c50cf3cbd28f69 +Block 0005 [ 72]: 4f15d88744e935a3 +Block 0005 [ 73]: d2d070023d316db8 +Block 0005 [ 74]: 65d9ddede0875a36 +Block 0005 [ 75]: a85314d0b5bbb492 +Block 0005 [ 76]: 9621385a2f5571ba +Block 0005 [ 77]: d8b64682e9e633e3 +Block 0005 [ 78]: 34625b7ac1add871 +Block 0005 [ 79]: 0bd132a3ff51918b +Block 0005 [ 80]: 0bb1a7820a7db02f +Block 0005 [ 81]: 5416bc0ac394fe0b +Block 0005 [ 82]: e4a245f3f2ef7307 +Block 0005 [ 83]: f32a9098d6413d91 +Block 0005 [ 84]: be5f1d656b05bb45 +Block 0005 [ 85]: cb5d82099937e4ef +Block 0005 [ 86]: 6ccb388fa51e044f +Block 0005 [ 87]: fb325dce97a5669d +Block 0005 [ 88]: a997c10efa786b25 +Block 0005 [ 89]: 69efe80c86c535aa +Block 0005 [ 90]: 62acfc9e2e0cdc71 +Block 0005 [ 91]: 5ca162ddc15667a2 +Block 0005 [ 92]: 6bf05b3e8df7591b +Block 0005 [ 93]: f2cc19d04fc4678f +Block 0005 [ 94]: cc85393eb2f131c6 +Block 0005 [ 95]: 4bd2459fa6ac74dc +Block 0005 [ 96]: 794aa76fcece2af1 +Block 0005 [ 97]: a66e09232668e617 +Block 0005 [ 98]: 33e95cf3618e4e63 +Block 0005 [ 99]: ebf0af1432a8d2d4 +Block 0005 [100]: 3bd654a90acf89b5 +Block 0005 [101]: db3b1e828e36e540 +Block 0005 [102]: c2edec0973b1f22b +Block 0005 [103]: 29e916a5983dcf50 +Block 0005 [104]: 679e56d49d4fb9ad +Block 0005 [105]: 5339d09cda2b4cc0 +Block 0005 [106]: df3f7016c2fc771e +Block 0005 [107]: 94af855801dd680f +Block 0005 [108]: 38f0e2ee03acce8b +Block 0005 [109]: ca815a0c41218568 +Block 0005 [110]: ae44de789a0125e0 +Block 0005 [111]: b9cf3947f5aa75f9 +Block 0005 [112]: ef601c65b86c2a39 +Block 0005 [113]: ef17112febe7e477 +Block 0005 [114]: 44974a2a50bd092f +Block 0005 [115]: 0c30352ce2e2284b +Block 0005 [116]: 120566988befae10 +Block 0005 [117]: 396d4337fbe810d9 +Block 0005 [118]: 772684b56b646145 +Block 0005 [119]: 771e20d7bc7ae85c +Block 0005 [120]: b3d55b22de13f793 +Block 0005 [121]: 8f6403353849ee33 +Block 0005 [122]: 90eae65b5bc8e530 +Block 0005 [123]: aff5d5566e449a9b +Block 0005 [124]: bf7f8fba7ae06be1 +Block 0005 [125]: 293aec5b82c5fdbf +Block 0005 [126]: 440e20ef46f7ecbf +Block 0005 [127]: d662bde9b1cc1f76 +Block 0006 [ 0]: 14b82b49b0e25e71 +Block 0006 [ 1]: e937c4f6a43a3a5c +Block 0006 [ 2]: 065b9b36f123727a +Block 0006 [ 3]: a074456c731b7c9d +Block 0006 [ 4]: 8e0b0ee249b35b85 +Block 0006 [ 5]: ee5efbaaaedc6382 +Block 0006 [ 6]: 372ef432529a19dd +Block 0006 [ 7]: 0c39971923fd7ee3 +Block 0006 [ 8]: ab56b63dcb823bc2 +Block 0006 [ 9]: e3e30eba2c887545 +Block 0006 [ 10]: b1c1cf7f034fcab9 +Block 0006 [ 11]: 5a37ae1a9aba41ba +Block 0006 [ 12]: 90417da3eb65e3c6 +Block 0006 [ 13]: 9715c7adf7d48bd9 +Block 0006 [ 14]: a665424a5fa14b29 +Block 0006 [ 15]: 75e72489bda8111f +Block 0006 [ 16]: b497ab6e2575a894 +Block 0006 [ 17]: 10e82458b6431842 +Block 0006 [ 18]: 9c4fe9b5b4fa60b5 +Block 0006 [ 19]: cc0d3fc1fa5be33a +Block 0006 [ 20]: 4016c756a496d9d4 +Block 0006 [ 21]: 20d97fa72058f7d4 +Block 0006 [ 22]: 3a636962e222ebab +Block 0006 [ 23]: 2edbcf4ee4bd517c +Block 0006 [ 24]: e8d7fba7a86bddb4 +Block 0006 [ 25]: cf6180086cac6d0a +Block 0006 [ 26]: e3f8824092b4260f +Block 0006 [ 27]: f056ef7493b06cca +Block 0006 [ 28]: fac82c5c43b31478 +Block 0006 [ 29]: e660f484bafd3c93 +Block 0006 [ 30]: 95d236ab04727c88 +Block 0006 [ 31]: b9a61e8878952e45 +Block 0006 [ 32]: 689a578392b86703 +Block 0006 [ 33]: eb8522fc4bf33672 +Block 0006 [ 34]: 93f45c0020ea773a +Block 0006 [ 35]: 2fdf8e4d359075bc +Block 0006 [ 36]: ab571ba7bc6ec2fd +Block 0006 [ 37]: dda3dcbe917aaff8 +Block 0006 [ 38]: 9eb95a1e8ead794e +Block 0006 [ 39]: 6fedd57de55d273c +Block 0006 [ 40]: b1e982229232f1ad +Block 0006 [ 41]: 4fe42603c8a9fb69 +Block 0006 [ 42]: d659310e16205de3 +Block 0006 [ 43]: 20d78a53b3eb58aa +Block 0006 [ 44]: 38f5fdd6dc865e40 +Block 0006 [ 45]: d15b5699f7697b8e +Block 0006 [ 46]: 49ab382b1b33423c +Block 0006 [ 47]: 1d6efabc9ce41282 +Block 0006 [ 48]: 2961d5538a38da76 +Block 0006 [ 49]: 73aafddd34985b8c +Block 0006 [ 50]: 06b22e6994377ac5 +Block 0006 [ 51]: adae03a3e7842760 +Block 0006 [ 52]: 5e87d802acbe15c6 +Block 0006 [ 53]: 5cbb54f89ca40959 +Block 0006 [ 54]: e5b25cb912455ee4 +Block 0006 [ 55]: 4c6341f2bf67640c +Block 0006 [ 56]: 514c70013c6e98e7 +Block 0006 [ 57]: 5d6ac5092f7084bf +Block 0006 [ 58]: 3e8aba33150418bf +Block 0006 [ 59]: a30cf862735d162b +Block 0006 [ 60]: 6318ca3cd9772bd1 +Block 0006 [ 61]: d9ec0d7f1dbca7cd +Block 0006 [ 62]: b59787682be88aff +Block 0006 [ 63]: a064dca241a15e2c +Block 0006 [ 64]: 9e8c9708fc584c31 +Block 0006 [ 65]: f38b9cec2f104837 +Block 0006 [ 66]: aab3c7ad54444c98 +Block 0006 [ 67]: 1930cdbb75108f35 +Block 0006 [ 68]: e975c9867aceab39 +Block 0006 [ 69]: f96191489d892c54 +Block 0006 [ 70]: c8e1674971e0648f +Block 0006 [ 71]: b907513bcf5625a0 +Block 0006 [ 72]: ac104180b8a3fde9 +Block 0006 [ 73]: 013292e60a55a6d0 +Block 0006 [ 74]: f0423e702fc2c4ed +Block 0006 [ 75]: 61e8d0990582c55a +Block 0006 [ 76]: 4cbe0cb788314bed +Block 0006 [ 77]: 8c6280a475751998 +Block 0006 [ 78]: 29f7cc903c7c9634 +Block 0006 [ 79]: 57137bb43725f3d6 +Block 0006 [ 80]: 7a3e0bb3b04cb289 +Block 0006 [ 81]: c319cc5e6bb8d7d4 +Block 0006 [ 82]: 71b8459072558920 +Block 0006 [ 83]: 35316d0f774e5804 +Block 0006 [ 84]: deffee844b2ac25c +Block 0006 [ 85]: a52cce030fa44ca2 +Block 0006 [ 86]: c6921938401e2665 +Block 0006 [ 87]: 2b5a7a4619b39322 +Block 0006 [ 88]: c638cb6047ad7f73 +Block 0006 [ 89]: a22c9b0e4064cce3 +Block 0006 [ 90]: 69ec00c7c380d2b9 +Block 0006 [ 91]: dfd92cc8a4282ae2 +Block 0006 [ 92]: 3065f4657ee7867e +Block 0006 [ 93]: 2560cad440b434e5 +Block 0006 [ 94]: ac8bdaf8b273716f +Block 0006 [ 95]: 7326ef4e982b2e03 +Block 0006 [ 96]: f028bef637e8f480 +Block 0006 [ 97]: 4d5d126fc092a061 +Block 0006 [ 98]: 73ab780da60b5719 +Block 0006 [ 99]: 6119c713f2fc328b +Block 0006 [100]: 891e7a9911c5e6d9 +Block 0006 [101]: d40521ec37610f40 +Block 0006 [102]: a3fc256443a27d79 +Block 0006 [103]: 6b602f608c0e3af2 +Block 0006 [104]: dce03c74fd50362a +Block 0006 [105]: f779685936b26eba +Block 0006 [106]: d2534193125bcb00 +Block 0006 [107]: 12ca834d6b1eedb0 +Block 0006 [108]: 073d19e3c4f1bfe9 +Block 0006 [109]: 31935c96b465d0e1 +Block 0006 [110]: 13432f5bd1879a52 +Block 0006 [111]: b9e2cef15789ddd8 +Block 0006 [112]: 534f0d54cebe0592 +Block 0006 [113]: 761601a3a63b69e3 +Block 0006 [114]: 748b16ca57aaa7ab +Block 0006 [115]: aa677d0a7b68e486 +Block 0006 [116]: b2215d7cdecdf1b2 +Block 0006 [117]: 7ba8d9f400b2407b +Block 0006 [118]: 17682787fc9c8fc6 +Block 0006 [119]: e0d866a02b93fd02 +Block 0006 [120]: 8354c7153bc15c88 +Block 0006 [121]: 4df0d563bdab7ed9 +Block 0006 [122]: 468547092b155225 +Block 0006 [123]: 0e25c4e3903193f9 +Block 0006 [124]: 946f87745d6dc6ab +Block 0006 [125]: 636b2ba44cf3a26c +Block 0006 [126]: 7f2ed8b4cbd37294 +Block 0006 [127]: 1666f0a8a45f67e2 +Block 0007 [ 0]: 89bc5991b66a4f9a +Block 0007 [ 1]: 244f9a50eede4a24 +Block 0007 [ 2]: 83976af8c3a0a861 +Block 0007 [ 3]: 38ea76e0f71cc313 +Block 0007 [ 4]: c6e1867e6fa2278f +Block 0007 [ 5]: 27e79ac27c615f48 +Block 0007 [ 6]: 832d73e2c2f0c4fa +Block 0007 [ 7]: 0c4ee0490467a033 +Block 0007 [ 8]: e75eeac5cf1d7adc +Block 0007 [ 9]: 8c8a45c6946c950d +Block 0007 [ 10]: b5baad053f9ca7bd +Block 0007 [ 11]: 46fc8205c42f5a5f +Block 0007 [ 12]: 7c76404757f0454d +Block 0007 [ 13]: d9695eaedce9a870 +Block 0007 [ 14]: 9a5f14c4a42e1fe0 +Block 0007 [ 15]: 4003794a258c067f +Block 0007 [ 16]: cd9de2f71394f07e +Block 0007 [ 17]: 5dbbfdbe775cb191 +Block 0007 [ 18]: 9305fd724ef6ca78 +Block 0007 [ 19]: 9d4ea857a7e98879 +Block 0007 [ 20]: 3ef8dbba9be3b0d2 +Block 0007 [ 21]: cdcb7d8d4937c74d +Block 0007 [ 22]: 2b413663beab789c +Block 0007 [ 23]: 8c2022398a6f105f +Block 0007 [ 24]: fbc6564054e0c5ae +Block 0007 [ 25]: 29bc64cd100368b3 +Block 0007 [ 26]: 5b49e63514ce07ad +Block 0007 [ 27]: ee09dd8044e2993a +Block 0007 [ 28]: 0ef1a2e5536719e1 +Block 0007 [ 29]: a73127758047003a +Block 0007 [ 30]: 6ffb968f03445b73 +Block 0007 [ 31]: 1d6110a090f74e3e +Block 0007 [ 32]: 151ba2612e331780 +Block 0007 [ 33]: fbfc128b382d4c05 +Block 0007 [ 34]: f27fe4a8a1bc79e7 +Block 0007 [ 35]: 3484f508a5a56d2e +Block 0007 [ 36]: 414b6c4370ac4a9a +Block 0007 [ 37]: 1febb1feff45a2b8 +Block 0007 [ 38]: 0c9c9427da10327b +Block 0007 [ 39]: 9b4ebc3732023d56 +Block 0007 [ 40]: 9d74e0967d5b224d +Block 0007 [ 41]: d048577dc40fdb8d +Block 0007 [ 42]: 3879b17a30b0b978 +Block 0007 [ 43]: fb3f18a76754800f +Block 0007 [ 44]: 50559d8df5580475 +Block 0007 [ 45]: 9111d08c239370c7 +Block 0007 [ 46]: d766091af4b45a4b +Block 0007 [ 47]: 62aee41c1d8674a3 +Block 0007 [ 48]: a2930820ec8b2505 +Block 0007 [ 49]: fbd3b0a6e3565791 +Block 0007 [ 50]: aaa953c5471dbb17 +Block 0007 [ 51]: 49d5b5f4e86f9247 +Block 0007 [ 52]: 4b2b84aa2aabf8db +Block 0007 [ 53]: 5af1810ce84263f0 +Block 0007 [ 54]: 8fb74dc06e2c75b2 +Block 0007 [ 55]: df299055074a521f +Block 0007 [ 56]: 6f79200c0ae6493c +Block 0007 [ 57]: 8f8bfab88a8bc57b +Block 0007 [ 58]: 5723fc0b3895145c +Block 0007 [ 59]: ab919fe3268ceefb +Block 0007 [ 60]: 306be7b7d686339f +Block 0007 [ 61]: 43014813fb7fffa0 +Block 0007 [ 62]: 8428dec31fb0c09c +Block 0007 [ 63]: d8f65c034c59d7c2 +Block 0007 [ 64]: e6d5ea8a06c52ec8 +Block 0007 [ 65]: 2872ea29527eac1b +Block 0007 [ 66]: be4d066da29ec0e6 +Block 0007 [ 67]: 4665ebd5d344c313 +Block 0007 [ 68]: 50d6e23aea3e760b +Block 0007 [ 69]: 5e0e3e5f3534d811 +Block 0007 [ 70]: 1ee7dba867effc30 +Block 0007 [ 71]: c222516a167eb883 +Block 0007 [ 72]: f1d1e74cbf8ae6e9 +Block 0007 [ 73]: e106eb6f8bdca40a +Block 0007 [ 74]: b1b70e885bca3a77 +Block 0007 [ 75]: 0f64afa7c1004b06 +Block 0007 [ 76]: 2ea15d6201b8d307 +Block 0007 [ 77]: cd5c49ca4ed9b1c3 +Block 0007 [ 78]: bc0ddc91b4213b76 +Block 0007 [ 79]: 61cf167ea124ffdc +Block 0007 [ 80]: 8806befdffa43b77 +Block 0007 [ 81]: bcc6a6a392620c69 +Block 0007 [ 82]: 1434f9acecacaebe +Block 0007 [ 83]: 7c6af7c2f1d3a016 +Block 0007 [ 84]: 115556eb3d8d23bc +Block 0007 [ 85]: e3eafc2dda0aa391 +Block 0007 [ 86]: 5750369e0d454865 +Block 0007 [ 87]: a7c6fd735d535569 +Block 0007 [ 88]: 29e6ad4a5e5dfd52 +Block 0007 [ 89]: 1de107ad6c220b0f +Block 0007 [ 90]: 9c47398621cee82b +Block 0007 [ 91]: 7dfabceacb90433a +Block 0007 [ 92]: dd080065f92db5f8 +Block 0007 [ 93]: 808fb2ca8f9855fc +Block 0007 [ 94]: 9b37d0255ca874d9 +Block 0007 [ 95]: a29945156f5e78e0 +Block 0007 [ 96]: 7ebb17b54f99cc52 +Block 0007 [ 97]: 86a2c533d65321ec +Block 0007 [ 98]: e5fb0d5fa7cd9535 +Block 0007 [ 99]: 6c207d4bfaf49f7b +Block 0007 [100]: 44eb34b160e8f527 +Block 0007 [101]: 71ef01526ddb2885 +Block 0007 [102]: 915c082d99d95fd7 +Block 0007 [103]: bfcad755fc1307af +Block 0007 [104]: dfdb5ac657037222 +Block 0007 [105]: 08da606ac7d1602b +Block 0007 [106]: 95c0b0e9ebd7e4a0 +Block 0007 [107]: e77addfab259b972 +Block 0007 [108]: e3010379e9ad41d3 +Block 0007 [109]: 0f64d0ba35d2b8e5 +Block 0007 [110]: 2fad709e13c7b6f3 +Block 0007 [111]: 8fca48fc169624c9 +Block 0007 [112]: 05f2f0e60d335cb2 +Block 0007 [113]: cb7a2cd2340b3bfe +Block 0007 [114]: 6e058f453af0ccb6 +Block 0007 [115]: 3f445b7cc7839d27 +Block 0007 [116]: 619bfe60221d6100 +Block 0007 [117]: e5049d9c35782378 +Block 0007 [118]: acea85d52eb0c9f5 +Block 0007 [119]: 0b4f88ff01eb6c9c +Block 0007 [120]: 53bd40631c73d79b +Block 0007 [121]: 6a8e9acb96295031 +Block 0007 [122]: d1d48bed6b85937e +Block 0007 [123]: 9a4ce896116b82d8 +Block 0007 [124]: d580d4b5de6c3e9e +Block 0007 [125]: 812089540331bbaa +Block 0007 [126]: 6b9b3242b2fb8b9c +Block 0007 [127]: 2a402a6b13a8c267 +Block 0008 [ 0]: b7ab95721117d35e +Block 0008 [ 1]: 22efa2b9e5e159b2 +Block 0008 [ 2]: 964d836e880b8f89 +Block 0008 [ 3]: 465893367077dde0 +Block 0008 [ 4]: 04b86461613ddecf +Block 0008 [ 5]: faad3b55b362d764 +Block 0008 [ 6]: 9bfb8fdf7a2d2749 +Block 0008 [ 7]: 2514d8487b2f337e +Block 0008 [ 8]: 76b0368ad20aaf0e +Block 0008 [ 9]: 2e73c820427627ab +Block 0008 [ 10]: d6710dc04fd71cf7 +Block 0008 [ 11]: 05f1214cf754fe9c +Block 0008 [ 12]: 1b9226ebb176545d +Block 0008 [ 13]: d09950e8d137b218 +Block 0008 [ 14]: a556442aaa5a4704 +Block 0008 [ 15]: 22a558765f5b708c +Block 0008 [ 16]: 5a956898ea8655bb +Block 0008 [ 17]: d00c0f9a64cf54f8 +Block 0008 [ 18]: 1924450be9d7d7d3 +Block 0008 [ 19]: 4b2093cc1dba44d9 +Block 0008 [ 20]: 40e06f4fe9d9f193 +Block 0008 [ 21]: 9f669102987d4b33 +Block 0008 [ 22]: 25773e4784493e3e +Block 0008 [ 23]: f28659e531958e97 +Block 0008 [ 24]: 6946e4820d222c77 +Block 0008 [ 25]: 4681223f5565478d +Block 0008 [ 26]: 2e4d5f19e61816c4 +Block 0008 [ 27]: c96da5ff44d7b204 +Block 0008 [ 28]: 83582dd48b6fde2a +Block 0008 [ 29]: c7964d848c2cb4e1 +Block 0008 [ 30]: c0fbd722926446a8 +Block 0008 [ 31]: f7f224036da1b50b +Block 0008 [ 32]: 794c427ca82715f9 +Block 0008 [ 33]: 8a2b97b3013583b7 +Block 0008 [ 34]: 3244ee89081e7460 +Block 0008 [ 35]: f5e2a548eb51f3e4 +Block 0008 [ 36]: d1f2917f33c9beef +Block 0008 [ 37]: 4be72bd00cf526aa +Block 0008 [ 38]: c4783ba6b1a63baa +Block 0008 [ 39]: aa6c043d2a2b24b9 +Block 0008 [ 40]: 9770847719e53708 +Block 0008 [ 41]: 9062cef0c0d7b719 +Block 0008 [ 42]: 03bbe219e7b92dd6 +Block 0008 [ 43]: 60e53b185d155c18 +Block 0008 [ 44]: 1d6ba06581c7d26f +Block 0008 [ 45]: 8622eba9ec8d607b +Block 0008 [ 46]: d970b275e9b38475 +Block 0008 [ 47]: cd054ad4f06c85df +Block 0008 [ 48]: f326e9cf128b309b +Block 0008 [ 49]: 26e3d59d0f1514db +Block 0008 [ 50]: 957d99899c37ddb5 +Block 0008 [ 51]: 496914dbd6936795 +Block 0008 [ 52]: 5b297ef27bd7e1df +Block 0008 [ 53]: 6d0197c85b350e0c +Block 0008 [ 54]: 85d0ece1e8500251 +Block 0008 [ 55]: 480487de2170b8c1 +Block 0008 [ 56]: a015392335b28618 +Block 0008 [ 57]: 7f57a60af4f33b0f +Block 0008 [ 58]: 851a927b8c624cad +Block 0008 [ 59]: 89c747c64caab2a6 +Block 0008 [ 60]: 477cfa9b1918256a +Block 0008 [ 61]: d98e9f90a8bfb1bc +Block 0008 [ 62]: 30ff60298156ba3c +Block 0008 [ 63]: 3c7761e58ec0e095 +Block 0008 [ 64]: 8f679b883e408880 +Block 0008 [ 65]: 257ef71da8d77b46 +Block 0008 [ 66]: 4b7ad321efc75f0c +Block 0008 [ 67]: 1f6a32b542eebc6b +Block 0008 [ 68]: 0a0967b0f7acd6db +Block 0008 [ 69]: 54163535e5d00f3a +Block 0008 [ 70]: 7fdec43e6b6b4930 +Block 0008 [ 71]: c1c53843bd4aaab0 +Block 0008 [ 72]: 07016805847a07d8 +Block 0008 [ 73]: 10fb712c92c61c4b +Block 0008 [ 74]: 015e817683d154e8 +Block 0008 [ 75]: fe47daf5171bfc13 +Block 0008 [ 76]: c4827a7bfd8ce2d9 +Block 0008 [ 77]: 230c9209805eb318 +Block 0008 [ 78]: e63a7fa09253432f +Block 0008 [ 79]: 389ec0abe21e0ae7 +Block 0008 [ 80]: d905cce5cbd8176c +Block 0008 [ 81]: a422de2b3bb9a792 +Block 0008 [ 82]: e697168d4153dbcf +Block 0008 [ 83]: 23eb13f63115c465 +Block 0008 [ 84]: cf22e9ff2140d01e +Block 0008 [ 85]: 8a04ab6f7c64bdf4 +Block 0008 [ 86]: dc485082ce16fc73 +Block 0008 [ 87]: 4683333477cc0b97 +Block 0008 [ 88]: 863db556e1caaf30 +Block 0008 [ 89]: 50bd44001676b011 +Block 0008 [ 90]: 6a11db826217b8a8 +Block 0008 [ 91]: 3d2760322a5a5f6b +Block 0008 [ 92]: 5173a7ced46cafd3 +Block 0008 [ 93]: 990529a5161d0b95 +Block 0008 [ 94]: ca880dbb12f980d2 +Block 0008 [ 95]: f302c5e44f59329a +Block 0008 [ 96]: 983e583ac8e8e523 +Block 0008 [ 97]: 846f0c63282b5bbf +Block 0008 [ 98]: 08a4b7b9c5d791b8 +Block 0008 [ 99]: 86a7abed532c43b8 +Block 0008 [100]: 59fe6cf801a30e6d +Block 0008 [101]: f5764116d593fc3b +Block 0008 [102]: c0697b3cbd3001ab +Block 0008 [103]: 45e42c5ffb139e80 +Block 0008 [104]: d7ed91668c402ce0 +Block 0008 [105]: 6397bdd0d8527ae4 +Block 0008 [106]: 12880cb013fe58fc +Block 0008 [107]: 971fe855ed549949 +Block 0008 [108]: d1e0e639eb31c572 +Block 0008 [109]: 6e335ec1cf8de464 +Block 0008 [110]: da20beebc9ed0af9 +Block 0008 [111]: df0955ee5e18d4ef +Block 0008 [112]: 70eb91b051b35a76 +Block 0008 [113]: 7548e2994282c4d6 +Block 0008 [114]: 489a1b29c4a99af6 +Block 0008 [115]: 94cad03afaaa3898 +Block 0008 [116]: 37cbca7c85c8491d +Block 0008 [117]: 30faa00e59a713f6 +Block 0008 [118]: 35cc78464d8e0da4 +Block 0008 [119]: 7057afb2dd623ac4 +Block 0008 [120]: 6b1a9205926fc23c +Block 0008 [121]: e9e200e9ffd25f94 +Block 0008 [122]: 877f0fcc2e621a2e +Block 0008 [123]: 64535122e6a3edde +Block 0008 [124]: ae387cd847ebe238 +Block 0008 [125]: 059fc807fc322613 +Block 0008 [126]: c3b01aa192b0a0e9 +Block 0008 [127]: 77191027156712cc +Block 0009 [ 0]: 8e732c2c500d1bcf +Block 0009 [ 1]: e9f582c285d839fb +Block 0009 [ 2]: 2fc5142d3a7a7654 +Block 0009 [ 3]: 9095c31471464fe1 +Block 0009 [ 4]: 8e991a3caf2a3052 +Block 0009 [ 5]: 37702ba2be1e7b0a +Block 0009 [ 6]: 835c109a4a30f143 +Block 0009 [ 7]: 0eb4ae9d12f396c7 +Block 0009 [ 8]: 88f2953817eddb54 +Block 0009 [ 9]: 1cecd3d0a1e201c9 +Block 0009 [ 10]: deafac03b504e11d +Block 0009 [ 11]: 8157bf20b970b8e5 +Block 0009 [ 12]: 50b3e5bf1e48eb70 +Block 0009 [ 13]: 9d7efd0bff2d2e83 +Block 0009 [ 14]: 2a792a8f2b0982c2 +Block 0009 [ 15]: f18c1232d73408db +Block 0009 [ 16]: f5a62d2f9de07c74 +Block 0009 [ 17]: 8204c3aacca9edbb +Block 0009 [ 18]: b5baa1f4e095eef1 +Block 0009 [ 19]: 13235a4064138ef2 +Block 0009 [ 20]: a142635c58c634d7 +Block 0009 [ 21]: b7ddf6f55ab349a6 +Block 0009 [ 22]: f71717df61515bbf +Block 0009 [ 23]: 1890a0eeeed4ec12 +Block 0009 [ 24]: 2521df3d057602b1 +Block 0009 [ 25]: f425966f41a3cbae +Block 0009 [ 26]: 517dbeacc6a8e886 +Block 0009 [ 27]: 4e6782d7bfc248b0 +Block 0009 [ 28]: 077d169e58f83834 +Block 0009 [ 29]: 566f54c60623e8dd +Block 0009 [ 30]: 9282e16be5d00504 +Block 0009 [ 31]: 43e00854ca66714e +Block 0009 [ 32]: 28774e5b81f76aaa +Block 0009 [ 33]: 8950b8ae23d4faf1 +Block 0009 [ 34]: 09e4d38b92711e7c +Block 0009 [ 35]: 9a2eb57e82bc2afa +Block 0009 [ 36]: 506099a8d3aa3d16 +Block 0009 [ 37]: c3e99f028c752146 +Block 0009 [ 38]: 7ec9eb85c13ff100 +Block 0009 [ 39]: 718db4822eaf3c3f +Block 0009 [ 40]: 6e8cf355d00578c4 +Block 0009 [ 41]: a96f23d2042ed081 +Block 0009 [ 42]: b1efa003a52051a2 +Block 0009 [ 43]: 083cd3f3afeaac19 +Block 0009 [ 44]: 0d69d9676b1259fa +Block 0009 [ 45]: 08c3761ad4b25440 +Block 0009 [ 46]: 0c406de866ecbc24 +Block 0009 [ 47]: 5cb289de573f01cc +Block 0009 [ 48]: 02893bb82c671ed6 +Block 0009 [ 49]: c081209aca5d643e +Block 0009 [ 50]: 9a51ca107935abeb +Block 0009 [ 51]: 354aed6cc4970cb0 +Block 0009 [ 52]: fbd56117a58309b6 +Block 0009 [ 53]: daae519e820f1e5e +Block 0009 [ 54]: 48162d9e0c40b513 +Block 0009 [ 55]: 93b9f51a284d2e22 +Block 0009 [ 56]: b91de3ce3b32c35f +Block 0009 [ 57]: a2692cb72cd2f4bd +Block 0009 [ 58]: b34187d3ec2443e9 +Block 0009 [ 59]: 69c8d1d6b9141ab6 +Block 0009 [ 60]: 96e4e5ac6fc7de7d +Block 0009 [ 61]: 6edb6ef2a2c9524a +Block 0009 [ 62]: f2c41d9cfa6140a6 +Block 0009 [ 63]: 01d6b829b5a0478b +Block 0009 [ 64]: bebfd01f651b8408 +Block 0009 [ 65]: 2550cc3cdae04d67 +Block 0009 [ 66]: 15595a3d607dfbda +Block 0009 [ 67]: b46e32730ca3295f +Block 0009 [ 68]: 9ec5f85084cef798 +Block 0009 [ 69]: 2f404ab4feeb707f +Block 0009 [ 70]: fd41201b15012abe +Block 0009 [ 71]: 6ca913e4f0fd8fee +Block 0009 [ 72]: 709d15d4a5c351ca +Block 0009 [ 73]: 0ff417d5fb37ebe7 +Block 0009 [ 74]: 802e11d62972e3bd +Block 0009 [ 75]: bc2c232ea9b2159e +Block 0009 [ 76]: 69e7678104f56c09 +Block 0009 [ 77]: cde317f9f0a761f7 +Block 0009 [ 78]: daa884e6383a0c9b +Block 0009 [ 79]: 624e467ea037d7fc +Block 0009 [ 80]: da29125f93d7e351 +Block 0009 [ 81]: 7b8a251d7d757a20 +Block 0009 [ 82]: 123b966cfc4bdbe2 +Block 0009 [ 83]: e4b764a11ec7b794 +Block 0009 [ 84]: 61465f002fd37b96 +Block 0009 [ 85]: 519d444057d1d1bc +Block 0009 [ 86]: 17ca9449f5f2b619 +Block 0009 [ 87]: 20e1968729b8cbd3 +Block 0009 [ 88]: e07232d4ec01eec7 +Block 0009 [ 89]: 292fe0de615d0448 +Block 0009 [ 90]: 6d447d417ac58b7f +Block 0009 [ 91]: 213085ba89c1a0e6 +Block 0009 [ 92]: 279218ed0f586188 +Block 0009 [ 93]: 85432b291b14ae92 +Block 0009 [ 94]: d3811f53e9fb02b6 +Block 0009 [ 95]: 14b83bd6e46eaed6 +Block 0009 [ 96]: 622711519314f9f4 +Block 0009 [ 97]: ed92baab649ec78f +Block 0009 [ 98]: c72c72d7b0848cfe +Block 0009 [ 99]: de53a491c6295c22 +Block 0009 [100]: 2be4a0b8b5e43cbc +Block 0009 [101]: e6f22ceac7bccd1f +Block 0009 [102]: 05b12ebec17c187e +Block 0009 [103]: 52f341e886242a28 +Block 0009 [104]: e30c872494dae813 +Block 0009 [105]: bdad94979f6995a5 +Block 0009 [106]: bc9e4d10f9e5f606 +Block 0009 [107]: acb2275cf353d8e0 +Block 0009 [108]: 051c08df05a430a4 +Block 0009 [109]: ea68d850dbea3577 +Block 0009 [110]: d170a2ad236d937f +Block 0009 [111]: d15f44a6debf6691 +Block 0009 [112]: 155fb21a0411d4e6 +Block 0009 [113]: 7ef7eeb7ac21cf4b +Block 0009 [114]: 92edc47cbac6c4a6 +Block 0009 [115]: 510544dbaa033367 +Block 0009 [116]: 46a67011096e757c +Block 0009 [117]: 3a1a9464956028f7 +Block 0009 [118]: 38c1dea1570c12b9 +Block 0009 [119]: 0e1db1c9aa4e6e8a +Block 0009 [120]: e565a8750f24205c +Block 0009 [121]: 722413539d2ad804 +Block 0009 [122]: b9f8daba5bb18eec +Block 0009 [123]: 1e5be1da6957bcac +Block 0009 [124]: 8057de9f3f373a31 +Block 0009 [125]: ff03efbd16744e8c +Block 0009 [126]: 9424bb60b0df4407 +Block 0009 [127]: 13460e85e31e66d1 +Block 0010 [ 0]: 543b940990095875 +Block 0010 [ 1]: 18eaeb3f2173cdd7 +Block 0010 [ 2]: 0d08db9d1badfb0b +Block 0010 [ 3]: 67644ff573140c3a +Block 0010 [ 4]: 295ab880314f0f85 +Block 0010 [ 5]: 112edbb91c2a8fd7 +Block 0010 [ 6]: c038e70916f72cde +Block 0010 [ 7]: 4f9c910aa9899d1c +Block 0010 [ 8]: dada45d5af22d56c +Block 0010 [ 9]: e8b476a0c6350fbc +Block 0010 [ 10]: 870bc5fad488facf +Block 0010 [ 11]: 6b7dbbc32595f4c7 +Block 0010 [ 12]: a964783636eb2e97 +Block 0010 [ 13]: d145b572544eae6d +Block 0010 [ 14]: fe8ef676787818cb +Block 0010 [ 15]: 20e375197aa04ab2 +Block 0010 [ 16]: d011f89244a3d4df +Block 0010 [ 17]: 759e5d451dae6e92 +Block 0010 [ 18]: bec7d0751f0ab01e +Block 0010 [ 19]: 149251274eb89159 +Block 0010 [ 20]: f91432fc0eb92ec6 +Block 0010 [ 21]: 72e8c6ddcc930a13 +Block 0010 [ 22]: 8452c113f7fa9b56 +Block 0010 [ 23]: 4f5daba6e08b86c9 +Block 0010 [ 24]: 0e2d8b734f0bcf74 +Block 0010 [ 25]: 1a6c20125994331d +Block 0010 [ 26]: a87e4eed3891e466 +Block 0010 [ 27]: 3d00c4836245c1b3 +Block 0010 [ 28]: 189483b92b00a86d +Block 0010 [ 29]: 06d49ab12bbf1f15 +Block 0010 [ 30]: 20b348e5ead7bf24 +Block 0010 [ 31]: 506ba7e964fea6b4 +Block 0010 [ 32]: e8f23d6e2ea9f924 +Block 0010 [ 33]: f6d0d2bd74d90737 +Block 0010 [ 34]: 8fb226cbf1ce49c9 +Block 0010 [ 35]: 6815c3e3f8f4ef0b +Block 0010 [ 36]: abb3e01f3fce839b +Block 0010 [ 37]: e92757b13b57b915 +Block 0010 [ 38]: 5aeb88f6b7d1cb0b +Block 0010 [ 39]: bb1650328a3a14aa +Block 0010 [ 40]: f0728fb2ff0c8666 +Block 0010 [ 41]: 3e84a83c151639a7 +Block 0010 [ 42]: 9b0f4d15d9cf179f +Block 0010 [ 43]: dbb8c5716afd021c +Block 0010 [ 44]: e8bfc3df051ed951 +Block 0010 [ 45]: 2e0dfba45843e305 +Block 0010 [ 46]: a01b3aeb323b6409 +Block 0010 [ 47]: c9111b107b5297e7 +Block 0010 [ 48]: e2ff0a84b8ec6add +Block 0010 [ 49]: a1a71d29c99ea301 +Block 0010 [ 50]: 63bfcaad0e326961 +Block 0010 [ 51]: 9615e8c180b752fb +Block 0010 [ 52]: 7e5abed116da961d +Block 0010 [ 53]: 74ef9fa68f55818e +Block 0010 [ 54]: dc792d50364b460c +Block 0010 [ 55]: 45914d8df39e6635 +Block 0010 [ 56]: fa6b6755e5d333df +Block 0010 [ 57]: 6dd4c60cfa704cc7 +Block 0010 [ 58]: 3741ce484f6a142e +Block 0010 [ 59]: ad6e491cc36c0a3b +Block 0010 [ 60]: 62bb1c10e00e80d4 +Block 0010 [ 61]: ec9a80476840f855 +Block 0010 [ 62]: a6ee55d533895c55 +Block 0010 [ 63]: 6b0ca397060e3b98 +Block 0010 [ 64]: 0ad956334279e43a +Block 0010 [ 65]: b87d52c2a2c90ec3 +Block 0010 [ 66]: 50ff46a35d7842cc +Block 0010 [ 67]: c3d9a0d2d55ea9c1 +Block 0010 [ 68]: dfa49e5406a2e725 +Block 0010 [ 69]: 541dd28aa2563e8f +Block 0010 [ 70]: 53ad650ffc8e5958 +Block 0010 [ 71]: 3a5adad382c04c27 +Block 0010 [ 72]: 44943c194a99a8f2 +Block 0010 [ 73]: 3e1098d058fd17d8 +Block 0010 [ 74]: e12c8eb2e985e97d +Block 0010 [ 75]: f020c6b429ca33fb +Block 0010 [ 76]: 87d2223bd0ebcd78 +Block 0010 [ 77]: 459b25a71ba6b614 +Block 0010 [ 78]: 41da41285d0667ee +Block 0010 [ 79]: 09e80349cac41549 +Block 0010 [ 80]: ffc52232e58aeead +Block 0010 [ 81]: d8e66f8b2f80bbd1 +Block 0010 [ 82]: e04ae31c590646fa +Block 0010 [ 83]: ba8ad218ce90618d +Block 0010 [ 84]: bfe77439e9fe02f0 +Block 0010 [ 85]: 59eb9a5bb1936564 +Block 0010 [ 86]: f0a2471f9add76d7 +Block 0010 [ 87]: 9f8793e60fe20141 +Block 0010 [ 88]: f9b307023c67d822 +Block 0010 [ 89]: d0aeca62f1cf526e +Block 0010 [ 90]: 765d93ce65c4fa16 +Block 0010 [ 91]: b113f2b94c8726e7 +Block 0010 [ 92]: 38a889e531ea46bd +Block 0010 [ 93]: 6d5d5be952f68d15 +Block 0010 [ 94]: 6a9bdfe362d0869a +Block 0010 [ 95]: 7e659ff724978315 +Block 0010 [ 96]: 42ccdc3db17d27d7 +Block 0010 [ 97]: faec96f2411fd748 +Block 0010 [ 98]: fedf541027365e36 +Block 0010 [ 99]: 05aa427cbfa8c197 +Block 0010 [100]: 09db0e1c73dd017f +Block 0010 [101]: 051154d397ab8eb5 +Block 0010 [102]: c14899d6cfd6db92 +Block 0010 [103]: 76eba202872418f0 +Block 0010 [104]: 7de93ad989b7fa63 +Block 0010 [105]: 79b9781eb6d08a83 +Block 0010 [106]: 18c7e233870ab87e +Block 0010 [107]: a2f24fac2ccfaa05 +Block 0010 [108]: aa0329bd328e07aa +Block 0010 [109]: 6d568e267df6cbd8 +Block 0010 [110]: 0cdec16e4b3af9df +Block 0010 [111]: 516a6543fd378d95 +Block 0010 [112]: 044353035e8ed9e2 +Block 0010 [113]: 8cce3633089e9ef6 +Block 0010 [114]: 241ca0819199c35f +Block 0010 [115]: b84e6be91f3ba29c +Block 0010 [116]: 7681dba7d67b853d +Block 0010 [117]: cfaa8457e94a2ca3 +Block 0010 [118]: 4f55fddfa61e1c14 +Block 0010 [119]: 4ae2c0df0be7bdd2 +Block 0010 [120]: adf064db6f41b2d0 +Block 0010 [121]: 66e36ed60db08e78 +Block 0010 [122]: 9db421efe09b5dc9 +Block 0010 [123]: 25eab21b2878e5ba +Block 0010 [124]: f4ceb1a0e178b084 +Block 0010 [125]: f117d1fb52d7f0a1 +Block 0010 [126]: 7a2ac65a075a7e0f +Block 0010 [127]: 810954fbb31fdf1a +Block 0011 [ 0]: 0e29d95fe511e04d +Block 0011 [ 1]: 13c9ef6946e59fb2 +Block 0011 [ 2]: b9edf0e8e52a2e21 +Block 0011 [ 3]: 953124c3fc0130f4 +Block 0011 [ 4]: f9e368d2ce6e9f2b +Block 0011 [ 5]: 2c013e6d64bfac16 +Block 0011 [ 6]: 85ee494ff677546c +Block 0011 [ 7]: 7e5e241249696384 +Block 0011 [ 8]: f1bd19de6eb2b578 +Block 0011 [ 9]: fd7dff90cd127146 +Block 0011 [ 10]: b0276a8590517308 +Block 0011 [ 11]: 1997e6961cd4172b +Block 0011 [ 12]: e970bf5937e8ba67 +Block 0011 [ 13]: 997a801c2be3d65e +Block 0011 [ 14]: f251b1ac7c259652 +Block 0011 [ 15]: c65c431013920d9c +Block 0011 [ 16]: 8d77564d250306b4 +Block 0011 [ 17]: d9c99ace927fb203 +Block 0011 [ 18]: 615208697c3e89d7 +Block 0011 [ 19]: a657575ec6603056 +Block 0011 [ 20]: ffcfaad18c7e709f +Block 0011 [ 21]: c4236e6fbbd3e654 +Block 0011 [ 22]: 9912a1c921f60b6d +Block 0011 [ 23]: 0591dbfe857cbf25 +Block 0011 [ 24]: 37dca3835abf08ef +Block 0011 [ 25]: fe86e8c90fb2c5bd +Block 0011 [ 26]: f13d31fb9e188a0b +Block 0011 [ 27]: 52f558bae211b69a +Block 0011 [ 28]: 850898653a80ccf0 +Block 0011 [ 29]: d26bb731a29067f5 +Block 0011 [ 30]: 86457f7e5895d7f1 +Block 0011 [ 31]: 1b3349076ae1892e +Block 0011 [ 32]: 6409935520ced717 +Block 0011 [ 33]: ca0fcf02eca75105 +Block 0011 [ 34]: 5223f92b3919c403 +Block 0011 [ 35]: f15ff36a0dbc9a19 +Block 0011 [ 36]: 9d7776e6c269f58f +Block 0011 [ 37]: c04ee2bedbdc990f +Block 0011 [ 38]: ae936612661d3076 +Block 0011 [ 39]: d937f92bee9e6ca0 +Block 0011 [ 40]: fb6d834ac2a2ce56 +Block 0011 [ 41]: 804e4e605ac67a64 +Block 0011 [ 42]: de073c7c0740efd0 +Block 0011 [ 43]: 19fabb72e5670a8f +Block 0011 [ 44]: 4700769583220e60 +Block 0011 [ 45]: a3cc907f36e1fd94 +Block 0011 [ 46]: 13186c0243a98246 +Block 0011 [ 47]: 3fb2722223782206 +Block 0011 [ 48]: 0bae6ef325ea98df +Block 0011 [ 49]: bfa458d7bbc10e07 +Block 0011 [ 50]: e5af71034751f4dc +Block 0011 [ 51]: 60b296e6b629d7fd +Block 0011 [ 52]: f21c933bca848abc +Block 0011 [ 53]: f51be91c0e69b9b6 +Block 0011 [ 54]: cd47910b75abd177 +Block 0011 [ 55]: fde3573dc408cb71 +Block 0011 [ 56]: 9cd8f9089d99653b +Block 0011 [ 57]: 4bb5a1a43a0d5438 +Block 0011 [ 58]: 75d318af98df4e40 +Block 0011 [ 59]: 98bb9cfbf3051166 +Block 0011 [ 60]: 50f2c44750bf6bf5 +Block 0011 [ 61]: b417a6096ea6c619 +Block 0011 [ 62]: 773ab817c6b1d5d2 +Block 0011 [ 63]: d22a9eacb5a3d7f7 +Block 0011 [ 64]: 8cb6a5559d6fbcee +Block 0011 [ 65]: 0452f75d265fa348 +Block 0011 [ 66]: 193e6c5e124077c5 +Block 0011 [ 67]: 6642e04fe60a48c2 +Block 0011 [ 68]: daae3e4a5e745967 +Block 0011 [ 69]: 9843e3c8dda09afb +Block 0011 [ 70]: 67c8a319c4ac1922 +Block 0011 [ 71]: eacabb0f75114aac +Block 0011 [ 72]: 860ebbee0faf1cce +Block 0011 [ 73]: 7bf16fc76a8b56f5 +Block 0011 [ 74]: 5516fca385608bd1 +Block 0011 [ 75]: c3810f023ac43b84 +Block 0011 [ 76]: 2ec2a2053b9d16ab +Block 0011 [ 77]: 03b1d1d164395fce +Block 0011 [ 78]: 4a5569a698107fe4 +Block 0011 [ 79]: eeebc9893a8833da +Block 0011 [ 80]: baae7d25bb1718e3 +Block 0011 [ 81]: e0bd0e82ec8f8e56 +Block 0011 [ 82]: 00a3f878303000de +Block 0011 [ 83]: 81b15606e01d1853 +Block 0011 [ 84]: 4b68d808f18264f2 +Block 0011 [ 85]: cfbc30166b95a051 +Block 0011 [ 86]: 7ccf8c6fbe594d1a +Block 0011 [ 87]: 8fb7f6125de8a4b8 +Block 0011 [ 88]: 9874ab2e71425803 +Block 0011 [ 89]: 89836faa299c3612 +Block 0011 [ 90]: 18848a63fe32ac03 +Block 0011 [ 91]: 80c4fa2d0fa06de0 +Block 0011 [ 92]: 8f96900b1f819c8d +Block 0011 [ 93]: 25b5543a08d55450 +Block 0011 [ 94]: 93030b656f492ed6 +Block 0011 [ 95]: b27a28206ff52c96 +Block 0011 [ 96]: 7f6e7f6e09cf2d75 +Block 0011 [ 97]: 959272d1c52f6e68 +Block 0011 [ 98]: 1ada4e3a2de6c66e +Block 0011 [ 99]: d6569dfc7529f763 +Block 0011 [100]: 038cca522a11ac0f +Block 0011 [101]: 454db675e85984c8 +Block 0011 [102]: 58df9a938bdb8c55 +Block 0011 [103]: 0eedcc2512ddc387 +Block 0011 [104]: 936c4a2daa8ccb10 +Block 0011 [105]: b521e399d33e4d89 +Block 0011 [106]: 012c38f3584346f1 +Block 0011 [107]: 9771b339121cde79 +Block 0011 [108]: 909df00f57e0f0d8 +Block 0011 [109]: 231678b808c5f790 +Block 0011 [110]: 1301e2a6fe312dd4 +Block 0011 [111]: 9657e8e3084d6e89 +Block 0011 [112]: 7e83773b9757c9a9 +Block 0011 [113]: e569bf33a0b83346 +Block 0011 [114]: a442e925d7063b16 +Block 0011 [115]: f91f8be4eeb9e9d3 +Block 0011 [116]: 13b2253dc99c5078 +Block 0011 [117]: bf73b2bbb0f7feea +Block 0011 [118]: 7913497f784f9c00 +Block 0011 [119]: c135b851de9ca1f9 +Block 0011 [120]: 10d4ac102075f58c +Block 0011 [121]: 3e894baf2d480e04 +Block 0011 [122]: d2669db4d2abf1ae +Block 0011 [123]: b5b3a56a014be498 +Block 0011 [124]: 02059fe631e30976 +Block 0011 [125]: 2af8b8d2a9373534 +Block 0011 [126]: b7c31b0d57ea305e +Block 0011 [127]: 1c01db8d2984e3c3 +Block 0012 [ 0]: f0a10e805d6a3d42 +Block 0012 [ 1]: 793f18c15e3a812b +Block 0012 [ 2]: cd71670532fc3879 +Block 0012 [ 3]: 52026378e6aff4f4 +Block 0012 [ 4]: 18271d36c62e4b05 +Block 0012 [ 5]: fa6930a37b56ec6c +Block 0012 [ 6]: 583be84a02ec6ffe +Block 0012 [ 7]: 4b11ca6fb2f9097a +Block 0012 [ 8]: a1bbd58c4ae15ee9 +Block 0012 [ 9]: dbee5a087bbecbbb +Block 0012 [ 10]: 882bf5a9101613ce +Block 0012 [ 11]: bb3dde2797ef3263 +Block 0012 [ 12]: cbf13cfa9034a08b +Block 0012 [ 13]: 811814c390f8bfea +Block 0012 [ 14]: fcfe41d624f6b8ea +Block 0012 [ 15]: 68e3856880355b6f +Block 0012 [ 16]: 1236f5c74c7bf903 +Block 0012 [ 17]: d180385f9fb9a21c +Block 0012 [ 18]: 7499349f22b9555a +Block 0012 [ 19]: 5fb57d55eb9fbf15 +Block 0012 [ 20]: 5110de9baffaeabf +Block 0012 [ 21]: 793e08a617682e55 +Block 0012 [ 22]: 493b642d49020517 +Block 0012 [ 23]: 94df9b09283d2489 +Block 0012 [ 24]: fd2d581994173c8f +Block 0012 [ 25]: e07bf0dd445094a7 +Block 0012 [ 26]: f0ad829a158735b0 +Block 0012 [ 27]: d704ed42147e4768 +Block 0012 [ 28]: 94e8dd6c664e9b7a +Block 0012 [ 29]: 2e639aadb2538f91 +Block 0012 [ 30]: e2e9b6be2b7b4bd6 +Block 0012 [ 31]: 8eea81002f9ed55d +Block 0012 [ 32]: fda7705421c952b1 +Block 0012 [ 33]: c7fb8ff8a46f9bfd +Block 0012 [ 34]: 1633518f427b4076 +Block 0012 [ 35]: b61d459f7bdca710 +Block 0012 [ 36]: a1e87287e279fb03 +Block 0012 [ 37]: d5950378d37f53f9 +Block 0012 [ 38]: a2594348f93f1bea +Block 0012 [ 39]: a618cc5ac0dfe096 +Block 0012 [ 40]: 9266c0f94217c115 +Block 0012 [ 41]: 96d61a622b19ce38 +Block 0012 [ 42]: f63a027f9aca11df +Block 0012 [ 43]: 55729809d54915e1 +Block 0012 [ 44]: cbd491cb52e43cae +Block 0012 [ 45]: b481994150fd14ed +Block 0012 [ 46]: f83a7f15934b47cb +Block 0012 [ 47]: d3e1e10e23c2da2a +Block 0012 [ 48]: 372244cf798883ba +Block 0012 [ 49]: e8794123bacdf1e4 +Block 0012 [ 50]: 062ff79705430499 +Block 0012 [ 51]: 0fddc01417f4f219 +Block 0012 [ 52]: 740c3f09be649563 +Block 0012 [ 53]: 417915d57dc5e333 +Block 0012 [ 54]: f4ee80593bd8e5e8 +Block 0012 [ 55]: 1aee1eb265897cf7 +Block 0012 [ 56]: 0b9ad0f240ba5b24 +Block 0012 [ 57]: 02305b2b03979574 +Block 0012 [ 58]: 472d3640594de091 +Block 0012 [ 59]: 23fbf913420fcc2e +Block 0012 [ 60]: 6ca81dbbb5d512ce +Block 0012 [ 61]: e0520559706bc438 +Block 0012 [ 62]: fc33c33b8963da2c +Block 0012 [ 63]: 2aff701acb05547b +Block 0012 [ 64]: 5a3d42e91e578fc4 +Block 0012 [ 65]: 59758063adf92785 +Block 0012 [ 66]: 6e951b562c76432a +Block 0012 [ 67]: 51fff0413fb1aa59 +Block 0012 [ 68]: d727046b8866df8a +Block 0012 [ 69]: 6b4ebd88ac923a21 +Block 0012 [ 70]: 3c7e55e1d711a11d +Block 0012 [ 71]: 514608cba1330771 +Block 0012 [ 72]: ccb3fbfc634d067c +Block 0012 [ 73]: 68060b3d512ebbe3 +Block 0012 [ 74]: 5f78d84f461f23a6 +Block 0012 [ 75]: 0e0aef3906cb0db3 +Block 0012 [ 76]: 0ef3f0a509d24321 +Block 0012 [ 77]: 272fe65195e2de31 +Block 0012 [ 78]: 5da29cd98a1a39d6 +Block 0012 [ 79]: befb7a2c57c841dc +Block 0012 [ 80]: 8aae609c4e5dfef2 +Block 0012 [ 81]: 4d9b10b5e6ca0d55 +Block 0012 [ 82]: 66757b1cc499a8fd +Block 0012 [ 83]: c59eea79d9ae02c6 +Block 0012 [ 84]: deb05636105f0577 +Block 0012 [ 85]: 8f910d9f13862dcd +Block 0012 [ 86]: 8bbf0b58f2bfcae4 +Block 0012 [ 87]: 1dc80a5af6216876 +Block 0012 [ 88]: f0c7f38f688d275c +Block 0012 [ 89]: 02403970ee4c0e2e +Block 0012 [ 90]: 9bf3b1f16309c29d +Block 0012 [ 91]: a4af59c84060dc96 +Block 0012 [ 92]: c3e3fc9cf27457c6 +Block 0012 [ 93]: 220546fb39e69bfa +Block 0012 [ 94]: bc219a5e82fd01f9 +Block 0012 [ 95]: 893586e7f24bbbbb +Block 0012 [ 96]: 5ae5a74274584644 +Block 0012 [ 97]: a3d9b022bdb17043 +Block 0012 [ 98]: 44f0bbe60e366459 +Block 0012 [ 99]: 88f5771b41071c50 +Block 0012 [100]: d03e3dd3ff2884d7 +Block 0012 [101]: df42e00141a4c89c +Block 0012 [102]: 5aaaa0a2ae8cf52f +Block 0012 [103]: 3d81539d33d9b161 +Block 0012 [104]: 115e34c07ae62a81 +Block 0012 [105]: 94e9221ff8a546a1 +Block 0012 [106]: 8ece3db10b15f445 +Block 0012 [107]: 032849a37be21edb +Block 0012 [108]: 92714bca0b25c3eb +Block 0012 [109]: 721aa5702abcc45c +Block 0012 [110]: 01617ba1be353c8c +Block 0012 [111]: bc2fe091715fcb5a +Block 0012 [112]: 7043ec541e986c7a +Block 0012 [113]: bd57d71922db1672 +Block 0012 [114]: f0c92f03d437e05e +Block 0012 [115]: 9634e655a6d37386 +Block 0012 [116]: 3566fd3ebdaf03f4 +Block 0012 [117]: 85f6da1bc86fea33 +Block 0012 [118]: 1805b65c7746103a +Block 0012 [119]: eb0a6900ef07ca4a +Block 0012 [120]: 8f594a63644580fd +Block 0012 [121]: bfe1dd1be8d6cac2 +Block 0012 [122]: abc26813b3c0d475 +Block 0012 [123]: dbb6fb0dc45d5336 +Block 0012 [124]: abd7de0d061bc830 +Block 0012 [125]: 4f2d1a573c90037a +Block 0012 [126]: 3b9864dd28daf6ea +Block 0012 [127]: 9a7f1f97327c21fa +Block 0013 [ 0]: 110f27a1aef9087f +Block 0013 [ 1]: c0cfc9adf0c80b95 +Block 0013 [ 2]: 915b2854a9b6b139 +Block 0013 [ 3]: 705cd3389ad868f9 +Block 0013 [ 4]: 7ffa3e9cf5dc0143 +Block 0013 [ 5]: add08043ba2eb292 +Block 0013 [ 6]: b997dc82acbc56b3 +Block 0013 [ 7]: 29f9142ed8e3e203 +Block 0013 [ 8]: 050d803719d5d047 +Block 0013 [ 9]: be408d73e0383a54 +Block 0013 [ 10]: 0043e17848f8a16c +Block 0013 [ 11]: 7ab8058b78922cd3 +Block 0013 [ 12]: a97d9693d58a402d +Block 0013 [ 13]: d28560c5cf09156b +Block 0013 [ 14]: ea3cb0a06ba7e158 +Block 0013 [ 15]: fa0fa4343d04cece +Block 0013 [ 16]: 5b183466bb0e7d09 +Block 0013 [ 17]: 120ce02546fb925d +Block 0013 [ 18]: e7fc63058f17cdc3 +Block 0013 [ 19]: 1fae37ddb0408070 +Block 0013 [ 20]: 40c7079b90e2e848 +Block 0013 [ 21]: 7a9c8911517f1e87 +Block 0013 [ 22]: 63029b2b67fb12c9 +Block 0013 [ 23]: 4d800e4f7ba91f7f +Block 0013 [ 24]: b434650ee99c2251 +Block 0013 [ 25]: 74407b19bc5486db +Block 0013 [ 26]: b67c9a18dadf965a +Block 0013 [ 27]: d98744b3b1bb6d09 +Block 0013 [ 28]: 2d8c34b0cbcd7a6f +Block 0013 [ 29]: fd0afc73cc572177 +Block 0013 [ 30]: 07b09f0e5653ce17 +Block 0013 [ 31]: cab97eb257f691db +Block 0013 [ 32]: 9f11eae0f39f21a8 +Block 0013 [ 33]: 15d19b49b7e02c6c +Block 0013 [ 34]: 46da6e970f66b6c8 +Block 0013 [ 35]: 49a17e8263eec903 +Block 0013 [ 36]: c9de78f4bc6aa868 +Block 0013 [ 37]: 1d8dfea55f5b6796 +Block 0013 [ 38]: 175316a8f61b2587 +Block 0013 [ 39]: 25efcc429557ec7e +Block 0013 [ 40]: a9384ef695b7bc06 +Block 0013 [ 41]: 56f2662a3bacbdf6 +Block 0013 [ 42]: e69affaafe48fb24 +Block 0013 [ 43]: e3136ec9687b8b85 +Block 0013 [ 44]: 02d1dc27aac26fd1 +Block 0013 [ 45]: e7e6e588167ec3c9 +Block 0013 [ 46]: 652fe019d9c046cf +Block 0013 [ 47]: e3942dadc5eece24 +Block 0013 [ 48]: 6d93b00de46cf751 +Block 0013 [ 49]: fa8dd8fb0f6a895b +Block 0013 [ 50]: a086d03df0190e1c +Block 0013 [ 51]: 3494cede809724c7 +Block 0013 [ 52]: 0e391a8be24b0c61 +Block 0013 [ 53]: 63b504727b8f421d +Block 0013 [ 54]: f589dc5bb5b3bb05 +Block 0013 [ 55]: 2d907b105dc21167 +Block 0013 [ 56]: 80d67a062dc94ed8 +Block 0013 [ 57]: 7062e09641789f6a +Block 0013 [ 58]: e7a0e21c50810817 +Block 0013 [ 59]: f4c561d19debae21 +Block 0013 [ 60]: bcb9d85144bb0ec4 +Block 0013 [ 61]: 901b4b59386d1079 +Block 0013 [ 62]: 958c2c24f57698e3 +Block 0013 [ 63]: 378994aadd67b8bb +Block 0013 [ 64]: af646ae2a18aa18c +Block 0013 [ 65]: 98cf82fa8cad9367 +Block 0013 [ 66]: 34acd9fb664da41b +Block 0013 [ 67]: cb0c55d6a06a36d1 +Block 0013 [ 68]: 596cac0f464dccf5 +Block 0013 [ 69]: e0b7e5b458bf7e65 +Block 0013 [ 70]: 9d4153213429e381 +Block 0013 [ 71]: bd175bd05ad89ddc +Block 0013 [ 72]: 3a32b790edeb3b50 +Block 0013 [ 73]: 76181582b4bb6db4 +Block 0013 [ 74]: 3bacbf9a5c6bc5d2 +Block 0013 [ 75]: 52025dd1e69fe955 +Block 0013 [ 76]: 24766a27757868e1 +Block 0013 [ 77]: ea254628c57d6565 +Block 0013 [ 78]: 4dffd3946e2391c9 +Block 0013 [ 79]: a3f0ec19131b2c74 +Block 0013 [ 80]: aabf1ebb453cad3f +Block 0013 [ 81]: 5ce4d4039ae51784 +Block 0013 [ 82]: 063b31568aaa2b58 +Block 0013 [ 83]: b2edb1f3fd849ce2 +Block 0013 [ 84]: e1c635d7781384ab +Block 0013 [ 85]: 434ca168921233af +Block 0013 [ 86]: 5a4cd5d7f2893065 +Block 0013 [ 87]: dbab9cbae3521a69 +Block 0013 [ 88]: 73eba126bc1bd0ec +Block 0013 [ 89]: 036d4e6e1a1bd19a +Block 0013 [ 90]: 1bbcd74a6795d7b7 +Block 0013 [ 91]: d1dcfe677aa57f4d +Block 0013 [ 92]: 502f4df14adefb98 +Block 0013 [ 93]: 9cf907ea8095e86d +Block 0013 [ 94]: 68952d15ce5ffec0 +Block 0013 [ 95]: 51ef41bd9953cf0d +Block 0013 [ 96]: c75de12576679af2 +Block 0013 [ 97]: 3a1245ca4b59d991 +Block 0013 [ 98]: 58da406deda0a2be +Block 0013 [ 99]: ed1d359b0924fc6a +Block 0013 [100]: 88b53326e7c95d86 +Block 0013 [101]: bf63c58402be96e1 +Block 0013 [102]: 27e94f0a9fc33bd4 +Block 0013 [103]: 0941976229a26011 +Block 0013 [104]: f393524504acfc53 +Block 0013 [105]: 9d12db1e3a8fdd72 +Block 0013 [106]: 65f94d0cf0f79d71 +Block 0013 [107]: eb80341772fd94f3 +Block 0013 [108]: 50d0e71609e35d14 +Block 0013 [109]: d6e1428d1a900f1d +Block 0013 [110]: c0438ecdf9ee424e +Block 0013 [111]: fb220c418b818629 +Block 0013 [112]: 7c792913ed892332 +Block 0013 [113]: 0699f2d790569f7b +Block 0013 [114]: b3637f2e9d09356d +Block 0013 [115]: fc6e80e108607a84 +Block 0013 [116]: 93101242fdc3284c +Block 0013 [117]: 0f65daea4d92cc13 +Block 0013 [118]: aeb01cf68d144bb2 +Block 0013 [119]: d3132f63adac679c +Block 0013 [120]: 9956ffa4821ade14 +Block 0013 [121]: 45d10cd12b08a7f7 +Block 0013 [122]: 87df8b5647c8d31a +Block 0013 [123]: 42c90f381e6c64f3 +Block 0013 [124]: 530fde3cc6aa2cd9 +Block 0013 [125]: a7b34dbb301080f1 +Block 0013 [126]: 790189cfcbe04e38 +Block 0013 [127]: b448bd06eabfa98b +Block 0014 [ 0]: 9f1cd0689f53b9b6 +Block 0014 [ 1]: e35b168966e80b90 +Block 0014 [ 2]: b5a0942914a9db2c +Block 0014 [ 3]: 7231649171873f3d +Block 0014 [ 4]: 2c0a81ffc170207e +Block 0014 [ 5]: 168b9363fd1e8c79 +Block 0014 [ 6]: 0b7f5f346840af27 +Block 0014 [ 7]: f1e08d27b9de4794 +Block 0014 [ 8]: 90c4838daaa18f3c +Block 0014 [ 9]: c2d426a11ddfff84 +Block 0014 [ 10]: 6a2e7d5722f53302 +Block 0014 [ 11]: 2da4baa266ac48ac +Block 0014 [ 12]: 222cb59e7384d5bb +Block 0014 [ 13]: 9cc616e7b6e09d64 +Block 0014 [ 14]: d832f28ddee93b3c +Block 0014 [ 15]: 512ed55d654e52c4 +Block 0014 [ 16]: f8b9a8f05fad25eb +Block 0014 [ 17]: 58da11fa5bb50a7a +Block 0014 [ 18]: b16d7729e5485ed2 +Block 0014 [ 19]: 4762f37ae7b70419 +Block 0014 [ 20]: ce877c5117af06e1 +Block 0014 [ 21]: a264cfa6af1399cb +Block 0014 [ 22]: 1c713c633a43e490 +Block 0014 [ 23]: 605294b6d0d3e1e3 +Block 0014 [ 24]: e6699e6c92b1605f +Block 0014 [ 25]: 77283eeb32daee4f +Block 0014 [ 26]: d8d610cda9e3c069 +Block 0014 [ 27]: 59d3bddf6621cc2b +Block 0014 [ 28]: e8bbf2f7b451e342 +Block 0014 [ 29]: 9ca3895b73353bbe +Block 0014 [ 30]: d3ed63a85178af46 +Block 0014 [ 31]: 3de2f2b674cd7ec0 +Block 0014 [ 32]: 887ad16072a7cf85 +Block 0014 [ 33]: c062593e55dc4740 +Block 0014 [ 34]: b3eeaf3026f24201 +Block 0014 [ 35]: d404cb5e83d3e5d7 +Block 0014 [ 36]: 1f46223eb204e335 +Block 0014 [ 37]: 2f387000b96c0af9 +Block 0014 [ 38]: 52dc1b965363315d +Block 0014 [ 39]: 5dbab2ff30334937 +Block 0014 [ 40]: 827077350ef835ea +Block 0014 [ 41]: a5bb8eafd57608cd +Block 0014 [ 42]: bc37683bce72b276 +Block 0014 [ 43]: 489ec1943b6efce6 +Block 0014 [ 44]: 28c9a58821ed6adb +Block 0014 [ 45]: 663397bd43ea5ecf +Block 0014 [ 46]: 54980827a023f04f +Block 0014 [ 47]: 706eb7a6be4cdd9f +Block 0014 [ 48]: 4e6b5ecf1a232fe5 +Block 0014 [ 49]: 2c47b454de1dcafa +Block 0014 [ 50]: 5e1d313c65f0c1f9 +Block 0014 [ 51]: b0cadb11ec6bd339 +Block 0014 [ 52]: 5dd3a637173d8857 +Block 0014 [ 53]: a33f8ddff280b343 +Block 0014 [ 54]: c9da85614cb6590e +Block 0014 [ 55]: 7b568d8c124f7072 +Block 0014 [ 56]: 6f5ff6b532b5a348 +Block 0014 [ 57]: 60d2ead8531affff +Block 0014 [ 58]: 877b1a71f3346e8a +Block 0014 [ 59]: 242e688117a0b8d2 +Block 0014 [ 60]: 19b6fafc9a26c636 +Block 0014 [ 61]: 3d79c909792e2519 +Block 0014 [ 62]: 731417532be4bd67 +Block 0014 [ 63]: e2986d03c73c3b21 +Block 0014 [ 64]: f1668b930bf7d92e +Block 0014 [ 65]: 726901a66463d300 +Block 0014 [ 66]: 052f2baa09531e23 +Block 0014 [ 67]: 9ee57ada74595090 +Block 0014 [ 68]: b1d683625fbbe541 +Block 0014 [ 69]: 2ca43737ff0a5718 +Block 0014 [ 70]: 1721e2e1e9985f54 +Block 0014 [ 71]: d50e276b2aa551d2 +Block 0014 [ 72]: a799e3018b5e9184 +Block 0014 [ 73]: 4f277f05bdc10280 +Block 0014 [ 74]: 00a99d452e6e2fce +Block 0014 [ 75]: 9cd4b73c0081c1d3 +Block 0014 [ 76]: 2536bbd5d2e4a47e +Block 0014 [ 77]: e9cf0d3b2c3030b6 +Block 0014 [ 78]: 656e91bcfc0e222a +Block 0014 [ 79]: a6da444ba9091ea8 +Block 0014 [ 80]: e0afe24cdb91b8c3 +Block 0014 [ 81]: 97f078a7948b822e +Block 0014 [ 82]: 5ca27019b4d2028e +Block 0014 [ 83]: f9fd77cb1f46983a +Block 0014 [ 84]: d13fe437a13cc54e +Block 0014 [ 85]: 006dc58126a3680a +Block 0014 [ 86]: cd8216267cc53592 +Block 0014 [ 87]: e5b6c5d75cd47a7b +Block 0014 [ 88]: 8ec249b6f585da10 +Block 0014 [ 89]: 3d299fcdcebfd8a0 +Block 0014 [ 90]: 921e8f4085db462b +Block 0014 [ 91]: 4179567387eacae7 +Block 0014 [ 92]: e7f8371d18e577fc +Block 0014 [ 93]: 301a74658b8a2b21 +Block 0014 [ 94]: 64454eb02213d764 +Block 0014 [ 95]: 6053b14fdf4ed719 +Block 0014 [ 96]: df018d7367b07151 +Block 0014 [ 97]: d50a9c2eecf3f057 +Block 0014 [ 98]: c486b8ccbd41e401 +Block 0014 [ 99]: fa8978518353c015 +Block 0014 [100]: 18c4ad2167895d88 +Block 0014 [101]: a5c38befc8633165 +Block 0014 [102]: ea798f7e1bb559c6 +Block 0014 [103]: 668cc3c01b2fbc8f +Block 0014 [104]: de2267386c58da11 +Block 0014 [105]: d6b83abd71a31208 +Block 0014 [106]: 38ab9df0a5d6b2c6 +Block 0014 [107]: c70ff46aa3c2c60d +Block 0014 [108]: 7d45101acb53cfcd +Block 0014 [109]: 094b173ab1ae9e2d +Block 0014 [110]: a4c3c60b822ef6aa +Block 0014 [111]: be99a740b86c90af +Block 0014 [112]: a068c651c7bee61d +Block 0014 [113]: a5bd2b2ab61dd25a +Block 0014 [114]: 94831b9b6f0ffaef +Block 0014 [115]: ffdce9d64741f054 +Block 0014 [116]: a1bc5fb0b5b8161a +Block 0014 [117]: 2fc4d76a12e81c91 +Block 0014 [118]: aff984f2849e9279 +Block 0014 [119]: 75cebdf31da0ac2a +Block 0014 [120]: 488570167b20be47 +Block 0014 [121]: bbd10c9260824085 +Block 0014 [122]: 0057c389ecaa85f0 +Block 0014 [123]: 40d8491601f433d6 +Block 0014 [124]: b5be2fefe01b5d0b +Block 0014 [125]: f7518252c19f76da +Block 0014 [126]: 985d37680c4cf0a6 +Block 0014 [127]: 9a2867c2c0e609ba +Block 0015 [ 0]: 13910b6bc3664aa0 +Block 0015 [ 1]: 810c299005aceed3 +Block 0015 [ 2]: ed0b536ccefd2bf4 +Block 0015 [ 3]: 90e9118b3fba9a29 +Block 0015 [ 4]: f245832f7121268b +Block 0015 [ 5]: 1b9f85dbb96ea6ac +Block 0015 [ 6]: c42d0fdd5387a138 +Block 0015 [ 7]: dc60c5abb673cbd6 +Block 0015 [ 8]: c7705bbbda6bdaa3 +Block 0015 [ 9]: 6e17017b53f92aef +Block 0015 [ 10]: a0ba6415a40d1b1e +Block 0015 [ 11]: fa9e111e339104c5 +Block 0015 [ 12]: 8275b953b8f61384 +Block 0015 [ 13]: 01525585e0f3a8ff +Block 0015 [ 14]: 8e48915135123c0c +Block 0015 [ 15]: e449243c3be44c24 +Block 0015 [ 16]: 5e71f56cb5817b37 +Block 0015 [ 17]: 824e99b239ea043b +Block 0015 [ 18]: 20277a3732ba698f +Block 0015 [ 19]: 601b1a32059f9125 +Block 0015 [ 20]: 8c8a2f8094592d46 +Block 0015 [ 21]: e39f3ee523a2ea39 +Block 0015 [ 22]: 0b230a73c13a63bd +Block 0015 [ 23]: 274b81e73393d329 +Block 0015 [ 24]: 837dfd3bd0357519 +Block 0015 [ 25]: 195546d2218bcb43 +Block 0015 [ 26]: 532217c28434a94c +Block 0015 [ 27]: e29ef7168db35357 +Block 0015 [ 28]: dfa65c0f5ea36613 +Block 0015 [ 29]: f5ea1b2477ea5019 +Block 0015 [ 30]: eea2a212d4724c06 +Block 0015 [ 31]: 82ddd5df70bce0e3 +Block 0015 [ 32]: bed114d0172c9188 +Block 0015 [ 33]: 5c2327d38576b4a9 +Block 0015 [ 34]: 967cd759b4ac6a33 +Block 0015 [ 35]: 0f2562866c3454cc +Block 0015 [ 36]: af96dfb88fdca575 +Block 0015 [ 37]: 7dbb9f11564be976 +Block 0015 [ 38]: 0aa59b9e7bf7f48f +Block 0015 [ 39]: e81eb3014bac9fa7 +Block 0015 [ 40]: 0680394a1d912913 +Block 0015 [ 41]: 357ed036e65c33a5 +Block 0015 [ 42]: 75ae6371adf01990 +Block 0015 [ 43]: a2ace9bf2a013566 +Block 0015 [ 44]: 6d5ef6c3440afb82 +Block 0015 [ 45]: 37b072042495a57a +Block 0015 [ 46]: e6aa7dd55fcb12c2 +Block 0015 [ 47]: 7bdde78e351cbd8d +Block 0015 [ 48]: a188855b01202e2f +Block 0015 [ 49]: 0d159146d76e7f2b +Block 0015 [ 50]: 0cf5f48a18081329 +Block 0015 [ 51]: 389ab774f9126d73 +Block 0015 [ 52]: e51476adeaf90275 +Block 0015 [ 53]: b4d89924dc05ff5b +Block 0015 [ 54]: 09b69ba48ff39335 +Block 0015 [ 55]: 19e99309184f742b +Block 0015 [ 56]: 333b1a54ac0c3688 +Block 0015 [ 57]: 008c9b8d51233e6a +Block 0015 [ 58]: 92078aa2c4fd6d0d +Block 0015 [ 59]: 9445ce5fb44d94fc +Block 0015 [ 60]: 799dceafe1118445 +Block 0015 [ 61]: 54b47c19ad881f4f +Block 0015 [ 62]: 5fa8ace3817a0179 +Block 0015 [ 63]: c3a420b1843a745b +Block 0015 [ 64]: 44afad54500c9837 +Block 0015 [ 65]: 4ecbbd1225b43e5e +Block 0015 [ 66]: 66c9b32f899631c5 +Block 0015 [ 67]: e7d81299bacd2082 +Block 0015 [ 68]: 30d9d63610b0ffe3 +Block 0015 [ 69]: 9d8cfc4c8844d513 +Block 0015 [ 70]: b7c084178b4137a0 +Block 0015 [ 71]: f83e5d17062eb8b9 +Block 0015 [ 72]: 0d0b6549369d8f9d +Block 0015 [ 73]: b1124c8f15e76634 +Block 0015 [ 74]: 059926f89443c09e +Block 0015 [ 75]: 045a096f41a09c73 +Block 0015 [ 76]: 044c28c7194d8ad3 +Block 0015 [ 77]: e6df09e32fe8a94b +Block 0015 [ 78]: ab76ab78da161bbf +Block 0015 [ 79]: 316b39fc15505896 +Block 0015 [ 80]: 3fbe2060a5b8f55c +Block 0015 [ 81]: eb190ddebb4b6807 +Block 0015 [ 82]: af0456440e6ab638 +Block 0015 [ 83]: be0dab7d08cbc76a +Block 0015 [ 84]: abafe12ea41d5fe6 +Block 0015 [ 85]: 3b0cf7d7111bcfab +Block 0015 [ 86]: 7616a546c8ee4745 +Block 0015 [ 87]: b538bae6bf7ab536 +Block 0015 [ 88]: 81fd8f8b12a77f3b +Block 0015 [ 89]: 39a27b1569437440 +Block 0015 [ 90]: ae9964bb3cdff849 +Block 0015 [ 91]: e3a4132cdba67906 +Block 0015 [ 92]: d158cd59ea9f9034 +Block 0015 [ 93]: 2bf2511afb694d05 +Block 0015 [ 94]: 58838b0cd79d44b6 +Block 0015 [ 95]: 64064c613bf2e3f1 +Block 0015 [ 96]: 1fdfa3bf5446c792 +Block 0015 [ 97]: 2ca19444da846a6f +Block 0015 [ 98]: 695657edf5467ed8 +Block 0015 [ 99]: 920f468266e669d3 +Block 0015 [100]: 8730b7895b7f558a +Block 0015 [101]: 04fe6d8e53bcaa1b +Block 0015 [102]: 7c71b094b720ab4a +Block 0015 [103]: cadc9d7ab9b10062 +Block 0015 [104]: d1f55e2ad6398ebb +Block 0015 [105]: 59cf88c99120351e +Block 0015 [106]: 7b98146dab48ec98 +Block 0015 [107]: c13c99b8e717db1b +Block 0015 [108]: 80d0d51210e327f6 +Block 0015 [109]: 6ba3a2ba66a637fe +Block 0015 [110]: bf1937951c46acdd +Block 0015 [111]: a9366cd100f1fc79 +Block 0015 [112]: 341a0fe4906324d7 +Block 0015 [113]: 9913c4d902b0f3ee +Block 0015 [114]: ad09b2f566324f03 +Block 0015 [115]: 9f6f5f4349ee7f1e +Block 0015 [116]: 8b1948a1a8bf9fa1 +Block 0015 [117]: 178f7d8ceabf9cd5 +Block 0015 [118]: fdf3473cd9eeb149 +Block 0015 [119]: 552b82c798528d52 +Block 0015 [120]: b336c3211cfc3415 +Block 0015 [121]: 1461cf354137ecee +Block 0015 [122]: a584771e2094c871 +Block 0015 [123]: ff6e940e11f094db +Block 0015 [124]: 65e837b609d53c15 +Block 0015 [125]: ada005f93180c3b0 +Block 0015 [126]: ac8ebdb88c35c1a7 +Block 0015 [127]: ed3abf44c47ac005 +Block 0016 [ 0]: 9a0bb8d093596be9 +Block 0016 [ 1]: e1bfdc05ee03fd0d +Block 0016 [ 2]: 4a7b8afd32898b11 +Block 0016 [ 3]: 263bf05080975928 +Block 0016 [ 4]: 0563f113f91d5a5a +Block 0016 [ 5]: e862a00d92f15cc2 +Block 0016 [ 6]: e089bd9ccc09bea9 +Block 0016 [ 7]: ebe9f60e8c7a0e65 +Block 0016 [ 8]: 7f48279b30898131 +Block 0016 [ 9]: 17de2db04f052abf +Block 0016 [ 10]: 2cc5414dc6ad2c64 +Block 0016 [ 11]: 86d060b19d2f3be6 +Block 0016 [ 12]: 26e6b473a55b01d0 +Block 0016 [ 13]: d15c82850170d2ab +Block 0016 [ 14]: 3afa12012cf636de +Block 0016 [ 15]: 8280e9b3c7b94ae7 +Block 0016 [ 16]: 3b75e9ab4b6363c0 +Block 0016 [ 17]: 08773ef3f0850ae6 +Block 0016 [ 18]: 010c22444c34b6ee +Block 0016 [ 19]: 58961c39c35db529 +Block 0016 [ 20]: 8306e410937d0760 +Block 0016 [ 21]: 563b892ed86b6c0e +Block 0016 [ 22]: 636d5b97a0c83748 +Block 0016 [ 23]: 3d2dbcf4bb47154d +Block 0016 [ 24]: 9fa80ade851efc6c +Block 0016 [ 25]: 602c1d73bf843f33 +Block 0016 [ 26]: b3f7583703712055 +Block 0016 [ 27]: cebd7a463a65108c +Block 0016 [ 28]: 8abc836cdc9a09dd +Block 0016 [ 29]: 926f6766ee4b4e4a +Block 0016 [ 30]: 69f36ed4fe16e884 +Block 0016 [ 31]: 0391acd1b8d5875c +Block 0016 [ 32]: d200bbf9f45f84a3 +Block 0016 [ 33]: 3540b92d47171fb3 +Block 0016 [ 34]: e0fb94d4da9f4257 +Block 0016 [ 35]: ef32cf22f5a01cb3 +Block 0016 [ 36]: df1e8e16f3556b3f +Block 0016 [ 37]: b1fa8d466cdfa033 +Block 0016 [ 38]: 16f43f463a72d9cf +Block 0016 [ 39]: d31c53228c3c607c +Block 0016 [ 40]: 5f4875332e0a7a3c +Block 0016 [ 41]: 66c32d33164cdd0b +Block 0016 [ 42]: 6bc342588808610d +Block 0016 [ 43]: 75722f4c4d895bc3 +Block 0016 [ 44]: de5ead39fe3adf2f +Block 0016 [ 45]: 2d76d5a3c958f392 +Block 0016 [ 46]: 91cc2c795b0ea82e +Block 0016 [ 47]: f84b957da44e0f33 +Block 0016 [ 48]: 50049c6e6d1be204 +Block 0016 [ 49]: 0f84d4f7a4f4623f +Block 0016 [ 50]: c483afeac90c583b +Block 0016 [ 51]: 5241f5b4718b1996 +Block 0016 [ 52]: 189c1ae8662a63c7 +Block 0016 [ 53]: 5889d3e318c05e53 +Block 0016 [ 54]: 5861e11e8a35c858 +Block 0016 [ 55]: 48e5b948f6c3c526 +Block 0016 [ 56]: dadaab651667f7e6 +Block 0016 [ 57]: 82b7e7fb9150020a +Block 0016 [ 58]: da5e055412c7486d +Block 0016 [ 59]: dfd7090ff83f2156 +Block 0016 [ 60]: 63e3609787b041d8 +Block 0016 [ 61]: e4adb17b0082436f +Block 0016 [ 62]: e90c704102ce9df0 +Block 0016 [ 63]: f7f2b4a1c2fb125c +Block 0016 [ 64]: 618e7ec96f20d5e8 +Block 0016 [ 65]: 76fc2dbdcaf8bbf2 +Block 0016 [ 66]: ec96562071ce660d +Block 0016 [ 67]: 2a2213e85db607aa +Block 0016 [ 68]: 3fc2f6739556310f +Block 0016 [ 69]: 256ac5562ea7de43 +Block 0016 [ 70]: d542ad70ca615a20 +Block 0016 [ 71]: fc6d8c2817a34ea9 +Block 0016 [ 72]: 3c8f3ed7b7c6b9df +Block 0016 [ 73]: c791195df2a66f44 +Block 0016 [ 74]: 2c0d711503dbd28d +Block 0016 [ 75]: c4e7a179e25cf184 +Block 0016 [ 76]: b1d267c1a4f4beb9 +Block 0016 [ 77]: 2f4ef773b00980ba +Block 0016 [ 78]: 845a3577578f7664 +Block 0016 [ 79]: 1329b906846966f7 +Block 0016 [ 80]: 9ce86824f02b1a97 +Block 0016 [ 81]: 5c1b8630f6b3ffd8 +Block 0016 [ 82]: c56403dfff373b13 +Block 0016 [ 83]: 449de31b81ed40d0 +Block 0016 [ 84]: da5d86f1d4859c40 +Block 0016 [ 85]: af68984af506de62 +Block 0016 [ 86]: af0a30caa06ea84a +Block 0016 [ 87]: 66a71b0fd1eea1a7 +Block 0016 [ 88]: 91a458c8179efc09 +Block 0016 [ 89]: 324a160de3980429 +Block 0016 [ 90]: b4ef6da86a04fca6 +Block 0016 [ 91]: 87509873a5e21aa2 +Block 0016 [ 92]: 8fe6cceaab2ea6e8 +Block 0016 [ 93]: f51c3860ffce0184 +Block 0016 [ 94]: e16694975bfac692 +Block 0016 [ 95]: 95793e832e74d3a2 +Block 0016 [ 96]: 0605b8359c162493 +Block 0016 [ 97]: b54cd3949d30e152 +Block 0016 [ 98]: eb36361d9a8cef2e +Block 0016 [ 99]: f25eec2dc7386a06 +Block 0016 [100]: d19ba04ffc53b6ba +Block 0016 [101]: 3816f7769f6bd0fd +Block 0016 [102]: effbd7aa623d98ae +Block 0016 [103]: fc1bbfc3fb63741e +Block 0016 [104]: db3ec9d71c9b6955 +Block 0016 [105]: 49eb5111ec17d14a +Block 0016 [106]: 94117297793212f0 +Block 0016 [107]: 0ec9abf1e13bbe99 +Block 0016 [108]: 3a4273167ecc5265 +Block 0016 [109]: 852857524a04c4ce +Block 0016 [110]: 4178c75b2edd173e +Block 0016 [111]: c90afac8bc77aad7 +Block 0016 [112]: 6c92e96d83ccb468 +Block 0016 [113]: 9dbf8877c737acc7 +Block 0016 [114]: 5808636bf5dfec55 +Block 0016 [115]: b5d700579728717b +Block 0016 [116]: 9c9a0bdb324f4ec5 +Block 0016 [117]: 11bddc88463a56d3 +Block 0016 [118]: f5cf8247b6af1ff6 +Block 0016 [119]: cd2463cce0e4c423 +Block 0016 [120]: d78e5dc71540157e +Block 0016 [121]: 045815154efbdecc +Block 0016 [122]: b9cb3f0e83d30af0 +Block 0016 [123]: 803fd63d9ff39d87 +Block 0016 [124]: 372cad617ab2e088 +Block 0016 [125]: 9fc7449aef3171c6 +Block 0016 [126]: 949f1546def1e4e5 +Block 0016 [127]: 7ff68880ad3e4171 +Block 0017 [ 0]: 17bc51246a97bfe8 +Block 0017 [ 1]: 7c307392a89164be +Block 0017 [ 2]: 3bd25ce4dd817fdd +Block 0017 [ 3]: 060ac5b552a17caf +Block 0017 [ 4]: f4e5cb5ec952721c +Block 0017 [ 5]: f40a02b23dacf1ed +Block 0017 [ 6]: cc7916b0003b7715 +Block 0017 [ 7]: fc024a28346e29d2 +Block 0017 [ 8]: 853a0213a4bba254 +Block 0017 [ 9]: 86458aa39e26fb79 +Block 0017 [ 10]: d0c5986ee2a8b77c +Block 0017 [ 11]: b7e9a2067e41b9dc +Block 0017 [ 12]: 1480f8731540a9a5 +Block 0017 [ 13]: a611565fa40d4e17 +Block 0017 [ 14]: ed2165f337d3254f +Block 0017 [ 15]: 9a2ca8e3b872f068 +Block 0017 [ 16]: 2a8dcea98d5ca8e1 +Block 0017 [ 17]: 46588793c6ee55b7 +Block 0017 [ 18]: ce760091c665de69 +Block 0017 [ 19]: 4df6fd4c724c3c02 +Block 0017 [ 20]: e3d5e35e793d4938 +Block 0017 [ 21]: cbc479714ea420e4 +Block 0017 [ 22]: ca4cf169361fc3ae +Block 0017 [ 23]: 6e0ff7647dbee083 +Block 0017 [ 24]: 2a77fbb07ea0868b +Block 0017 [ 25]: e2269c613372f038 +Block 0017 [ 26]: d5c9a67fb1bd36cf +Block 0017 [ 27]: 94e6f478c6bad422 +Block 0017 [ 28]: 73d510ad54eab733 +Block 0017 [ 29]: f407ddfecc8746da +Block 0017 [ 30]: 39d0482ea9dad35d +Block 0017 [ 31]: 734ce00d891aa7ec +Block 0017 [ 32]: 1a6c74ee238502c1 +Block 0017 [ 33]: 0fcc8fa05bcc224e +Block 0017 [ 34]: ad32b509d3d19c3d +Block 0017 [ 35]: bb9b95df60ffb63d +Block 0017 [ 36]: 8bffc2455c34f2c0 +Block 0017 [ 37]: d6f5ef776360eee9 +Block 0017 [ 38]: 21659782e3299c20 +Block 0017 [ 39]: ec7ac42b913b8806 +Block 0017 [ 40]: 9314f0c2971f9ec0 +Block 0017 [ 41]: 5340aba1b3895424 +Block 0017 [ 42]: d4724e17d3e2e403 +Block 0017 [ 43]: dcfe96954d356b40 +Block 0017 [ 44]: d5262bbc7d9d9e42 +Block 0017 [ 45]: a983ed3013d9715b +Block 0017 [ 46]: 1d6ac87ef06ee57d +Block 0017 [ 47]: 8416641ced13f76e +Block 0017 [ 48]: 1e72c0a977c6f809 +Block 0017 [ 49]: a6c0a7b48524e94a +Block 0017 [ 50]: a8d4d8f0b5b1ee56 +Block 0017 [ 51]: 06951457a0cde01f +Block 0017 [ 52]: 17a8f30ddab4fe10 +Block 0017 [ 53]: 41a5c0de05cb6849 +Block 0017 [ 54]: 7d6e61695eb13641 +Block 0017 [ 55]: aef78a53d6f9c52e +Block 0017 [ 56]: d0a9b02db118488a +Block 0017 [ 57]: f9f3148df06e460f +Block 0017 [ 58]: ba54c9d7da37026c +Block 0017 [ 59]: 813043bb6263b64a +Block 0017 [ 60]: 01e8ed3940b3a653 +Block 0017 [ 61]: 95600d5f7b6e4d77 +Block 0017 [ 62]: 51b3fc67c6a0ea2a +Block 0017 [ 63]: a4bb04ccc8265b11 +Block 0017 [ 64]: 0ab034f465cc0813 +Block 0017 [ 65]: e405436951fc79ab +Block 0017 [ 66]: 3ffbc05b9fcdeb7a +Block 0017 [ 67]: 28a0287c2941a2fc +Block 0017 [ 68]: 5bf655516a93e471 +Block 0017 [ 69]: a52095c9bd7237c3 +Block 0017 [ 70]: 7bb4ba223bee1011 +Block 0017 [ 71]: 50948fc7c91590af +Block 0017 [ 72]: 6ca4a3345a4f0106 +Block 0017 [ 73]: fae756af4dda49f6 +Block 0017 [ 74]: c39806c4c73bf1f1 +Block 0017 [ 75]: b9b643d55df8b682 +Block 0017 [ 76]: eea591b9d94795b0 +Block 0017 [ 77]: 88f24f15d82df6c0 +Block 0017 [ 78]: 1d35dc2e5f49fb41 +Block 0017 [ 79]: 5916da9d7b572428 +Block 0017 [ 80]: 180ba1758293cd85 +Block 0017 [ 81]: 5a6735d12f2982fe +Block 0017 [ 82]: dd921fc0eee69756 +Block 0017 [ 83]: e0771b3f026dbabf +Block 0017 [ 84]: 6df839ab1ce96516 +Block 0017 [ 85]: 72ec1c04a9fdc1a2 +Block 0017 [ 86]: e0c95b2b94db0792 +Block 0017 [ 87]: a8642ff38ac9e870 +Block 0017 [ 88]: b110669b3d07ea33 +Block 0017 [ 89]: 2d8aa2a78f93c49f +Block 0017 [ 90]: b5a40d81a59f5ef8 +Block 0017 [ 91]: 70d2112c6066451f +Block 0017 [ 92]: 8417e0871fac12c6 +Block 0017 [ 93]: c38c9899e8edcdf8 +Block 0017 [ 94]: ce9590f30ff53347 +Block 0017 [ 95]: 6895d4878d62caf9 +Block 0017 [ 96]: 262535b134187242 +Block 0017 [ 97]: a0deecfbbbe86396 +Block 0017 [ 98]: 1ee3e87369ad6e5c +Block 0017 [ 99]: eb6d2adec6c431cd +Block 0017 [100]: 76d98fffc6de3f84 +Block 0017 [101]: f47b69b4f56db042 +Block 0017 [102]: f0123fbf21b74be5 +Block 0017 [103]: e82156d144a42e08 +Block 0017 [104]: b96dfd6e82865304 +Block 0017 [105]: 2b65b6f8bf85aa49 +Block 0017 [106]: 43784bb1d195eadd +Block 0017 [107]: 8e65dd65aca567b8 +Block 0017 [108]: ea9c8c9e75172184 +Block 0017 [109]: 8aadae18a51aadd6 +Block 0017 [110]: ad11911ba95b3a14 +Block 0017 [111]: e3244be33fcbb3a7 +Block 0017 [112]: 80fbed869132d4ff +Block 0017 [113]: 4156c7bdac7fb574 +Block 0017 [114]: 4a5e0ebfdc6185d5 +Block 0017 [115]: 808ffed756ed20ff +Block 0017 [116]: 423276097e8ee14f +Block 0017 [117]: 26a7de2148a76179 +Block 0017 [118]: b02275a467bca390 +Block 0017 [119]: 7646106b9071629a +Block 0017 [120]: 5b6c21a823ff65de +Block 0017 [121]: 3add52a1b76d989a +Block 0017 [122]: df9f28f504111275 +Block 0017 [123]: 7cac15fedd243ed5 +Block 0017 [124]: eb26ae42cf401b70 +Block 0017 [125]: 59ee7e4ee4833712 +Block 0017 [126]: a1e2bc7f1348749c +Block 0017 [127]: 98dca4163fdca5c8 +Block 0018 [ 0]: d084772fe184585c +Block 0018 [ 1]: b7a71a5c80ee84e4 +Block 0018 [ 2]: a483de7b04caaa0b +Block 0018 [ 3]: ccf118ab7d75e9b9 +Block 0018 [ 4]: 77853b81dbf3be54 +Block 0018 [ 5]: 5c20332b42ade752 +Block 0018 [ 6]: 1b732b6811dcea0a +Block 0018 [ 7]: 4a3d6efac28e3d78 +Block 0018 [ 8]: d14a43c694fc46ee +Block 0018 [ 9]: b3d3dabbb3287e12 +Block 0018 [ 10]: 358d5c7f1c7eec24 +Block 0018 [ 11]: 12b8d5a8c5df0034 +Block 0018 [ 12]: 131ff3fe443d313b +Block 0018 [ 13]: 00acf1cff6c323cf +Block 0018 [ 14]: 8838c79d58713e79 +Block 0018 [ 15]: 1aefe3b69e1ccf27 +Block 0018 [ 16]: 8fc035f26b129484 +Block 0018 [ 17]: febf943bfe6b4f27 +Block 0018 [ 18]: 17763060ae755bfa +Block 0018 [ 19]: 928cd6c24615587e +Block 0018 [ 20]: d05d9f8434053cc9 +Block 0018 [ 21]: 6b2ca6e171e4ed5b +Block 0018 [ 22]: 0572ce2d3cf14a9d +Block 0018 [ 23]: 7a61ce4a2c246662 +Block 0018 [ 24]: 605742a341eb3985 +Block 0018 [ 25]: a753887d0eb40761 +Block 0018 [ 26]: bd0f8da298d9c1b7 +Block 0018 [ 27]: 00596e2557f7f475 +Block 0018 [ 28]: 22a1329d12efeb77 +Block 0018 [ 29]: 0e626cb6fbfb5970 +Block 0018 [ 30]: dc8d9697877c7c19 +Block 0018 [ 31]: 005a226a1279357f +Block 0018 [ 32]: c4e5947af0e6deca +Block 0018 [ 33]: 94d569d17b1e6f67 +Block 0018 [ 34]: de386d45c5f3224d +Block 0018 [ 35]: 01403b1912e12590 +Block 0018 [ 36]: 00326afc95f0821c +Block 0018 [ 37]: 43dd6cae3a1686cf +Block 0018 [ 38]: 57ad2a4169aff5f6 +Block 0018 [ 39]: f0d13dbcf2539637 +Block 0018 [ 40]: 2af4dee0883f6264 +Block 0018 [ 41]: c372bb4b2347b981 +Block 0018 [ 42]: f8355df82fd6e1e5 +Block 0018 [ 43]: 62f87bd55f1766fb +Block 0018 [ 44]: 7d09765dc41d0f6c +Block 0018 [ 45]: b4ef9dff26945262 +Block 0018 [ 46]: 30c988904e8f9bc7 +Block 0018 [ 47]: 778b20a07139015a +Block 0018 [ 48]: 57337400114a4f22 +Block 0018 [ 49]: 607be229edbde71b +Block 0018 [ 50]: 0b40abc4ed7d31e9 +Block 0018 [ 51]: 8b7fed47f43ebb51 +Block 0018 [ 52]: a7e464184f6c95d9 +Block 0018 [ 53]: c6231982c1921464 +Block 0018 [ 54]: 5e758c90ff72fd07 +Block 0018 [ 55]: 37b5cc5e18198231 +Block 0018 [ 56]: 21528056165f24af +Block 0018 [ 57]: c74644315731a372 +Block 0018 [ 58]: 503f171f2ea0db88 +Block 0018 [ 59]: 0f584869dd54f31e +Block 0018 [ 60]: c10466c393cc5be7 +Block 0018 [ 61]: 24e7a034f6ad5fe0 +Block 0018 [ 62]: 0196a0f69cdae74e +Block 0018 [ 63]: 3c271b723ff0c33c +Block 0018 [ 64]: 36577195709ea2ec +Block 0018 [ 65]: e0951bce093b31ba +Block 0018 [ 66]: 6c0a54fa572e54da +Block 0018 [ 67]: 448a72ac125c2e9f +Block 0018 [ 68]: 4613c81ca1d46bcb +Block 0018 [ 69]: bee31e192f200f01 +Block 0018 [ 70]: a6cf318b6393bc81 +Block 0018 [ 71]: 7628622d5df2a701 +Block 0018 [ 72]: 04015c4ecfcf9bfe +Block 0018 [ 73]: 2071eebdf355667b +Block 0018 [ 74]: 86610a505283627d +Block 0018 [ 75]: 2b2a880964250e32 +Block 0018 [ 76]: 7121473b76166136 +Block 0018 [ 77]: 09d4a66876d0e7a0 +Block 0018 [ 78]: e4743e35c5c2eaab +Block 0018 [ 79]: 646868b26a9c4594 +Block 0018 [ 80]: 8dac159f6186bf69 +Block 0018 [ 81]: 380546891bd4c666 +Block 0018 [ 82]: 1720354bc9f61fc6 +Block 0018 [ 83]: 98e09f5f28637dd2 +Block 0018 [ 84]: 0420311ec175f586 +Block 0018 [ 85]: 516caaad13a66966 +Block 0018 [ 86]: 84e653e235fd0ffc +Block 0018 [ 87]: 2c1e232cfceb2e15 +Block 0018 [ 88]: 8822ab2668064755 +Block 0018 [ 89]: c7a99e8a5ff6bca0 +Block 0018 [ 90]: d98d6bb5829a56c6 +Block 0018 [ 91]: 19ae3576f64a5fff +Block 0018 [ 92]: effb8092b1f6f935 +Block 0018 [ 93]: 09ec59b5392d58d0 +Block 0018 [ 94]: 3a4ae1a0c6b596f4 +Block 0018 [ 95]: 86945defe7b4c6bf +Block 0018 [ 96]: 6bef6ff460e42e62 +Block 0018 [ 97]: c49b80acbc65b852 +Block 0018 [ 98]: 8b2d1c4baf8c075f +Block 0018 [ 99]: 7e3f7bf10f525d6f +Block 0018 [100]: ee9d6f757d30a1aa +Block 0018 [101]: 589a2046727cc440 +Block 0018 [102]: 53491fc1647a4e0a +Block 0018 [103]: ce68ea7fb20ead43 +Block 0018 [104]: 4dd0de9bfad115f3 +Block 0018 [105]: 6b0f8b8425f2b5a0 +Block 0018 [106]: c44db4c514acfc14 +Block 0018 [107]: e6dd1022bf14c48d +Block 0018 [108]: d8711234f656ce8a +Block 0018 [109]: 08bf8dec13ff93d2 +Block 0018 [110]: 0ff665e0275941d6 +Block 0018 [111]: 01e8c370456c3eb1 +Block 0018 [112]: eca303a81bc07867 +Block 0018 [113]: 6c1f9fd5e1cf7c28 +Block 0018 [114]: cecf8cd3e55e50ca +Block 0018 [115]: 6d791fb10089b0d7 +Block 0018 [116]: ba1c16d4628c8ac2 +Block 0018 [117]: 0add2f746a15fde5 +Block 0018 [118]: b8b1c169cec54425 +Block 0018 [119]: 2118f7b75c8eec10 +Block 0018 [120]: 62a698a86fdbea7c +Block 0018 [121]: d1f445354accf76f +Block 0018 [122]: 54a5ad09cfff950e +Block 0018 [123]: 321b3438f579b51e +Block 0018 [124]: 84fab9c8f11370d6 +Block 0018 [125]: 5362ef92ccee2146 +Block 0018 [126]: 7177d9edb1502f96 +Block 0018 [127]: 69d163f02c4974ed +Block 0019 [ 0]: 3d0916ed9e833207 +Block 0019 [ 1]: 246916dfc2448d0e +Block 0019 [ 2]: 1802a650dc4cc6a7 +Block 0019 [ 3]: 11945e0300016f36 +Block 0019 [ 4]: e65fe8dc14d54a2c +Block 0019 [ 5]: 8628137392bf8e5f +Block 0019 [ 6]: a45fbfdaf581c97f +Block 0019 [ 7]: a506ce7a102c6fb3 +Block 0019 [ 8]: c364b39bbbe2accc +Block 0019 [ 9]: 47a304654d05f7a4 +Block 0019 [ 10]: e39b8615c4e06e74 +Block 0019 [ 11]: 34907f8fd543151d +Block 0019 [ 12]: 4a1759c5e83a1206 +Block 0019 [ 13]: 6778a6195c965d45 +Block 0019 [ 14]: 9af9889bcb643739 +Block 0019 [ 15]: d756d62aa2e25a04 +Block 0019 [ 16]: 827dba7101e28106 +Block 0019 [ 17]: 3b0e46ba9b3c39cf +Block 0019 [ 18]: f1f38f90e67e5fe3 +Block 0019 [ 19]: 2c6cf41c1873dc3d +Block 0019 [ 20]: 48d9dc8fc1fd0d05 +Block 0019 [ 21]: 984cfb30aee058f7 +Block 0019 [ 22]: dba6c35650569ef6 +Block 0019 [ 23]: 05758ff526281ff8 +Block 0019 [ 24]: dea551321b133c9b +Block 0019 [ 25]: 2d2febfe90cc21c8 +Block 0019 [ 26]: 2a5ab9b4cf66466b +Block 0019 [ 27]: e8c8736b1118fe0f +Block 0019 [ 28]: 906569f6cebdd903 +Block 0019 [ 29]: 48977b0e03cc7acd +Block 0019 [ 30]: 392c1604e5e25847 +Block 0019 [ 31]: 0f3a782d67e75dc0 +Block 0019 [ 32]: 72ace7605024c74f +Block 0019 [ 33]: a1b1ecc0efb8d5ee +Block 0019 [ 34]: ea272ed7f31981bd +Block 0019 [ 35]: 92cde2b4d0a00a22 +Block 0019 [ 36]: 4de44e29a20cc050 +Block 0019 [ 37]: a14abcc63ff548c1 +Block 0019 [ 38]: 86af7968efed7819 +Block 0019 [ 39]: fa7b27ea7592d525 +Block 0019 [ 40]: 88386f081e59a92b +Block 0019 [ 41]: 2dbf4cae55ea74af +Block 0019 [ 42]: a7c4d6d44b7779db +Block 0019 [ 43]: 8fcceeab46f56dff +Block 0019 [ 44]: bf2701da005989d8 +Block 0019 [ 45]: 3885da5bfebc498f +Block 0019 [ 46]: 886c978a342d26ff +Block 0019 [ 47]: 5627e56d96e81ac6 +Block 0019 [ 48]: ae4e19022c09db70 +Block 0019 [ 49]: 8385a5556e4f951b +Block 0019 [ 50]: 2942868c20dff7ab +Block 0019 [ 51]: 7119533db3aedbf2 +Block 0019 [ 52]: 5707c74688cee744 +Block 0019 [ 53]: 511343dee334a23d +Block 0019 [ 54]: 6cd09da27c938bdc +Block 0019 [ 55]: c77e4714dcf668d3 +Block 0019 [ 56]: 767c11648d06b8f6 +Block 0019 [ 57]: deccdf769bef9089 +Block 0019 [ 58]: 455a5f824ffbc916 +Block 0019 [ 59]: 6c0fa714f83aec15 +Block 0019 [ 60]: cea560f5e6dc9218 +Block 0019 [ 61]: 87615693e82231f7 +Block 0019 [ 62]: 7abb05196b159d93 +Block 0019 [ 63]: f1968b8b3ac9bd54 +Block 0019 [ 64]: 0f5b76884a66ac19 +Block 0019 [ 65]: 593634c801741fb6 +Block 0019 [ 66]: 36fe94fdcac45f59 +Block 0019 [ 67]: 1260f8fe84cd160d +Block 0019 [ 68]: 63da6183ad0a643a +Block 0019 [ 69]: 5b27fbbda96e7ab4 +Block 0019 [ 70]: da3fec81f2e9218b +Block 0019 [ 71]: 5097727f0becde66 +Block 0019 [ 72]: 188d05de76951b8f +Block 0019 [ 73]: d654e94ccbd8d0ec +Block 0019 [ 74]: c1ea500224a941e0 +Block 0019 [ 75]: 1adc6cc4b1c7654f +Block 0019 [ 76]: 723738ebddeeda77 +Block 0019 [ 77]: 258540fd5b39a123 +Block 0019 [ 78]: bf8e0e3022f84c86 +Block 0019 [ 79]: d5d7e843a792f503 +Block 0019 [ 80]: 861c3f6650784c73 +Block 0019 [ 81]: ec58f0a9f36f6bf2 +Block 0019 [ 82]: 9fed771a57dd20cd +Block 0019 [ 83]: 79228975a1ad1a4b +Block 0019 [ 84]: 2f9d09811d3349db +Block 0019 [ 85]: 796ad44e7586692d +Block 0019 [ 86]: ab1191e9410f68fb +Block 0019 [ 87]: 1128ee882c6af04a +Block 0019 [ 88]: 73f57bf6cf9dc609 +Block 0019 [ 89]: dff741812d32401b +Block 0019 [ 90]: ea12d97dc9dc03fd +Block 0019 [ 91]: f50f4ad7c6e7abc6 +Block 0019 [ 92]: 688d13caa19ef5fe +Block 0019 [ 93]: 1dbaaf3ff5ad791b +Block 0019 [ 94]: 2884de8faece0a70 +Block 0019 [ 95]: 0c38bf887f4d311a +Block 0019 [ 96]: 95b004d9b0337a97 +Block 0019 [ 97]: 0ce5642f30645a2d +Block 0019 [ 98]: 8c7b39377deaadb4 +Block 0019 [ 99]: adce80468faaf392 +Block 0019 [100]: b7dc1859f20cbbc7 +Block 0019 [101]: 382d7f0d3d6cfe40 +Block 0019 [102]: abf0c8ef57ecb5d1 +Block 0019 [103]: 2b966db4075b3bf4 +Block 0019 [104]: c3868f4576df0661 +Block 0019 [105]: a56bc51175ea255c +Block 0019 [106]: 432656f6cf6ab332 +Block 0019 [107]: ec96141cdf52aa98 +Block 0019 [108]: 26e75ed39252d5ad +Block 0019 [109]: 1e6b75aaa66dab60 +Block 0019 [110]: 5fc14959a0021118 +Block 0019 [111]: 2832c47a618f6549 +Block 0019 [112]: ba03b67a60002625 +Block 0019 [113]: 200f5ce345022e08 +Block 0019 [114]: 0d82c4c459db15f2 +Block 0019 [115]: 344074f5390b7ddc +Block 0019 [116]: c320f898546a4174 +Block 0019 [117]: 430d1e2d1be316b2 +Block 0019 [118]: 8dceddf10c9e569a +Block 0019 [119]: 8122ec86dc334421 +Block 0019 [120]: e2758de2b61ec590 +Block 0019 [121]: c68f8b9d8c8cc491 +Block 0019 [122]: 42685a32054bd9b3 +Block 0019 [123]: e53de9a8050a4ad6 +Block 0019 [124]: 6330cbef475c6b1a +Block 0019 [125]: eccf64a43197e265 +Block 0019 [126]: 7c0b1667cb1e0562 +Block 0019 [127]: 141bb29376e7011d +Block 0020 [ 0]: f9c9c5dda18a6965 +Block 0020 [ 1]: b690a36c14cbd868 +Block 0020 [ 2]: 163c4705e87b13b6 +Block 0020 [ 3]: 929a86fe2df99e80 +Block 0020 [ 4]: 28e33d0ff638ceb0 +Block 0020 [ 5]: ab48f32887082c70 +Block 0020 [ 6]: b59ab6eb7f42f485 +Block 0020 [ 7]: e2622758fd7c67e6 +Block 0020 [ 8]: a4a71160bfb71c73 +Block 0020 [ 9]: 9b4925d44839e634 +Block 0020 [ 10]: 0340e91a9f6c3090 +Block 0020 [ 11]: b1a00bfc86641292 +Block 0020 [ 12]: 4759310f15b591b7 +Block 0020 [ 13]: 9091b33e75707188 +Block 0020 [ 14]: 81a4d0d991e6cd4d +Block 0020 [ 15]: 0efc2412ca9c947b +Block 0020 [ 16]: 8d26b3f7dce089b2 +Block 0020 [ 17]: f1da8900bcf32fa4 +Block 0020 [ 18]: 5ec8949e5eba513e +Block 0020 [ 19]: 4bff9e41de6e8843 +Block 0020 [ 20]: 515ce37f89dc28dc +Block 0020 [ 21]: e7ba4aee5acb5cd3 +Block 0020 [ 22]: c1d8c42c9fc6892b +Block 0020 [ 23]: 8b4011f6641bd2f6 +Block 0020 [ 24]: 9ab0113ecbf2a1a7 +Block 0020 [ 25]: 993cd18ecb74bcc1 +Block 0020 [ 26]: c335d78612d4a36c +Block 0020 [ 27]: eefc0b1d1a926985 +Block 0020 [ 28]: f875802c6f495962 +Block 0020 [ 29]: e4223bfc4a2b65dd +Block 0020 [ 30]: 08880db04b44e9ee +Block 0020 [ 31]: a332263240c1cac8 +Block 0020 [ 32]: 9fa737c30707186b +Block 0020 [ 33]: 595227e9b79d9a88 +Block 0020 [ 34]: 57a2008021d20e48 +Block 0020 [ 35]: a58eab22c505e4bf +Block 0020 [ 36]: f0109b2e88f6fb85 +Block 0020 [ 37]: c75d08e197165e56 +Block 0020 [ 38]: ec954f3f90eec8f0 +Block 0020 [ 39]: dbc876da2eb7cb3a +Block 0020 [ 40]: 5bbf9ea8ab943e25 +Block 0020 [ 41]: 20940bc2fa5e8391 +Block 0020 [ 42]: e7c829fca1e7f482 +Block 0020 [ 43]: d3ebf89ce06b9252 +Block 0020 [ 44]: 8a47b9736b1182fe +Block 0020 [ 45]: c729ce9f350718a9 +Block 0020 [ 46]: cdd723f353a00bca +Block 0020 [ 47]: 54dfa84d908b15a9 +Block 0020 [ 48]: 7fa23409fbe36687 +Block 0020 [ 49]: 5976fc7c4ae89b79 +Block 0020 [ 50]: c3bfee4f92c6dea4 +Block 0020 [ 51]: 70d69740726f23eb +Block 0020 [ 52]: e18c2b2e22c7e5c9 +Block 0020 [ 53]: 5ea08ab2df6f8a2b +Block 0020 [ 54]: 7063ae1ab581e206 +Block 0020 [ 55]: a5d6adfdfc22dda9 +Block 0020 [ 56]: 2d89c11429ccfdbc +Block 0020 [ 57]: 37db3754f2a57c26 +Block 0020 [ 58]: 1340fac6eb112a2c +Block 0020 [ 59]: 30189af6af800d0d +Block 0020 [ 60]: 6d611bd46ad93afc +Block 0020 [ 61]: 65ece3082d0a0bf7 +Block 0020 [ 62]: 155d2cb0a797a797 +Block 0020 [ 63]: 290f6f5c75189bdb +Block 0020 [ 64]: 2c9e04cc29a5f253 +Block 0020 [ 65]: 199eb8571717b01a +Block 0020 [ 66]: 8b22891284d0caa1 +Block 0020 [ 67]: 0a3c890819a97540 +Block 0020 [ 68]: 560bd8306af411b2 +Block 0020 [ 69]: 2fc338aa51fc1060 +Block 0020 [ 70]: 864a9eb237755447 +Block 0020 [ 71]: deb4c74af8f2eb0e +Block 0020 [ 72]: 0bf2c92928b99c42 +Block 0020 [ 73]: 4962cd509c4f2c3b +Block 0020 [ 74]: c89be72654913596 +Block 0020 [ 75]: a60eadb82746d5af +Block 0020 [ 76]: b3326e39ca57e78c +Block 0020 [ 77]: e6a6a9bebedcc84d +Block 0020 [ 78]: b667858af3138308 +Block 0020 [ 79]: dfeda5d85bbdcfee +Block 0020 [ 80]: d919b7578b76d74e +Block 0020 [ 81]: 850284e391722b19 +Block 0020 [ 82]: b03d2baa35837efa +Block 0020 [ 83]: a209abae24213ed5 +Block 0020 [ 84]: 49d5ac9f0fb11d32 +Block 0020 [ 85]: 69ea2a245f5c1813 +Block 0020 [ 86]: b11db3d63ceec6a9 +Block 0020 [ 87]: 8ef660c90b176663 +Block 0020 [ 88]: f26147a27dda57e2 +Block 0020 [ 89]: ed2b6911130346ac +Block 0020 [ 90]: b7a6fb331da0dab5 +Block 0020 [ 91]: 43c39f32728e46ae +Block 0020 [ 92]: 27eff7a0e2eff334 +Block 0020 [ 93]: 58714734110f1ed5 +Block 0020 [ 94]: 8e9501c8857d00fa +Block 0020 [ 95]: a09bed917512854d +Block 0020 [ 96]: a55609989993a5cf +Block 0020 [ 97]: a742b1aac4f486b3 +Block 0020 [ 98]: 1b64f3fbf7325e76 +Block 0020 [ 99]: 7116e730adff7f4f +Block 0020 [100]: 0c51d67ee841778f +Block 0020 [101]: 3bf13731bb2d6bf7 +Block 0020 [102]: 4a9352b8d776d47d +Block 0020 [103]: f6d78f9788bec749 +Block 0020 [104]: 8f1287aba7db6f4a +Block 0020 [105]: 0f10efdc8298ef68 +Block 0020 [106]: fae8d4b151fc557a +Block 0020 [107]: 8c5d238cd00d1e84 +Block 0020 [108]: ae1fba74cc6295c3 +Block 0020 [109]: 62ccae0639dc4631 +Block 0020 [110]: 6763e3e83f9959f3 +Block 0020 [111]: 813fb0a090e8d241 +Block 0020 [112]: 16d2ba6082843b5a +Block 0020 [113]: cf81b8308f4180b8 +Block 0020 [114]: 5bfbf79b1cc15285 +Block 0020 [115]: 7a64046d593d0c69 +Block 0020 [116]: fbf6a2343475bf5e +Block 0020 [117]: c0369ef57773309f +Block 0020 [118]: 18989bc4213e408c +Block 0020 [119]: 0538d61079e129a1 +Block 0020 [120]: c9ac59192ce92126 +Block 0020 [121]: 5556cce49cdc8ca3 +Block 0020 [122]: 17582f4977b56e48 +Block 0020 [123]: ea46273c59909883 +Block 0020 [124]: c1d1028489caba25 +Block 0020 [125]: a03a95f0ca25aefd +Block 0020 [126]: 05248c8fad679a3b +Block 0020 [127]: c460ffc0cdb31374 +Block 0021 [ 0]: 56e3d6cdc1058695 +Block 0021 [ 1]: 84d273510bffaa1d +Block 0021 [ 2]: 3ee27baf0003ffac +Block 0021 [ 3]: 17a56cc4ce43d1ad +Block 0021 [ 4]: eada1378b12c5b88 +Block 0021 [ 5]: bc5f12ec4fe0b98d +Block 0021 [ 6]: 863a9703fada5f2e +Block 0021 [ 7]: 4b74ea1dadc6e075 +Block 0021 [ 8]: 4df4976a127b8c34 +Block 0021 [ 9]: 2a589bae3f2f325f +Block 0021 [ 10]: ede299cc94e319c2 +Block 0021 [ 11]: 399d90f13a456d69 +Block 0021 [ 12]: 130c6e1fe2abf0f0 +Block 0021 [ 13]: d1229c11837a9c4e +Block 0021 [ 14]: d6847938c2a676eb +Block 0021 [ 15]: 677b2013e7dca300 +Block 0021 [ 16]: e9dd6c608bdd778b +Block 0021 [ 17]: 1b7147ac56de72f2 +Block 0021 [ 18]: 89e826683c323bf7 +Block 0021 [ 19]: 9b717e27007eeadb +Block 0021 [ 20]: f6e2a5be9bdc79f4 +Block 0021 [ 21]: 8a0b776dfbf2e02d +Block 0021 [ 22]: 6a961a882c9f1687 +Block 0021 [ 23]: 6f88a8233e259f64 +Block 0021 [ 24]: ead97b9ca691db31 +Block 0021 [ 25]: faaeeb04aa749d17 +Block 0021 [ 26]: c193caf83958f1a7 +Block 0021 [ 27]: 66ab1fc224c3b601 +Block 0021 [ 28]: bb43dc26d220b518 +Block 0021 [ 29]: e6dfc133b81dd628 +Block 0021 [ 30]: 6412a2acc78546d3 +Block 0021 [ 31]: 5caeeb9893888a44 +Block 0021 [ 32]: c8ad13c366fd6925 +Block 0021 [ 33]: 46474cc5bcbbad2b +Block 0021 [ 34]: 4d2012ac62d01d1a +Block 0021 [ 35]: 02202cc48c295cd8 +Block 0021 [ 36]: e5bd0cf27cc1a946 +Block 0021 [ 37]: 11fc8ea2f1af1294 +Block 0021 [ 38]: 5a1b503fe205d2c6 +Block 0021 [ 39]: 7dcfd7e8d37da7ff +Block 0021 [ 40]: daa02c5de85539ca +Block 0021 [ 41]: 2ef385aa290e2ffe +Block 0021 [ 42]: ec75f049b0c8bdd5 +Block 0021 [ 43]: 55086dcd60af2011 +Block 0021 [ 44]: 75bd4d45c5e74ae5 +Block 0021 [ 45]: 965897eb57f8eb5c +Block 0021 [ 46]: 427a52c3117476a5 +Block 0021 [ 47]: 2bb17fb421557439 +Block 0021 [ 48]: 613b7590b307f22f +Block 0021 [ 49]: 6b495b70ddaa6da9 +Block 0021 [ 50]: 8e035b4816af8019 +Block 0021 [ 51]: c22c82ddd9307ca1 +Block 0021 [ 52]: f2b817657210a745 +Block 0021 [ 53]: c35a72e9a6988cff +Block 0021 [ 54]: 49f30739d3b82d52 +Block 0021 [ 55]: 0a17decbc52dff3a +Block 0021 [ 56]: 9f09e1919fd18160 +Block 0021 [ 57]: f0133f28990d7c4a +Block 0021 [ 58]: 419824662919cae7 +Block 0021 [ 59]: e7025ec193302b60 +Block 0021 [ 60]: c36526923f11a314 +Block 0021 [ 61]: 0c79d97e27b889fe +Block 0021 [ 62]: 25a2c335ba84ada1 +Block 0021 [ 63]: ef4599d4390f42fb +Block 0021 [ 64]: 6a692ab692937aea +Block 0021 [ 65]: 8e92553f9bd587cc +Block 0021 [ 66]: c264f7ce2573326c +Block 0021 [ 67]: 1e110f26b0f028ca +Block 0021 [ 68]: 84feb398a69d30bc +Block 0021 [ 69]: 57066cdb0dd73bce +Block 0021 [ 70]: 131362f400566a4c +Block 0021 [ 71]: 1315c6beb6c3bf4b +Block 0021 [ 72]: 26aaaefc0ebff4d1 +Block 0021 [ 73]: a358eb15b2793ed2 +Block 0021 [ 74]: 02528da64402b96a +Block 0021 [ 75]: 7873f04aaaf20566 +Block 0021 [ 76]: 18848e03d5666413 +Block 0021 [ 77]: 03810f21b747d2da +Block 0021 [ 78]: 07a3bdd3385164db +Block 0021 [ 79]: e22ceea12176eab8 +Block 0021 [ 80]: 0b11b5e67cb86402 +Block 0021 [ 81]: fdbbb3e8d2d3c03a +Block 0021 [ 82]: 8c46ebdc1827bae5 +Block 0021 [ 83]: ebccc5f84e5bff07 +Block 0021 [ 84]: af9bb087253c48ec +Block 0021 [ 85]: bc858f152ef33f92 +Block 0021 [ 86]: d2f1ac013a227a55 +Block 0021 [ 87]: 3c20350c794aa4f6 +Block 0021 [ 88]: fdf399df49e450c4 +Block 0021 [ 89]: f37fb06fd2dd4c22 +Block 0021 [ 90]: fea8ab9a0a146a3e +Block 0021 [ 91]: 17355110050bddd3 +Block 0021 [ 92]: 422b1207f671670a +Block 0021 [ 93]: 530ddc77b6d64cc8 +Block 0021 [ 94]: ecba5ec654e4c582 +Block 0021 [ 95]: 54e0209c70a11ffe +Block 0021 [ 96]: 5c4cd04463205db2 +Block 0021 [ 97]: bcc35736a824f54b +Block 0021 [ 98]: dc43c322ec2d8a84 +Block 0021 [ 99]: f5613764992f37dd +Block 0021 [100]: e0a6ceb0583eef8f +Block 0021 [101]: 804eacf20c63f8a4 +Block 0021 [102]: 6e3806866f273a61 +Block 0021 [103]: b0c227e201485667 +Block 0021 [104]: f9fc0f92f9bedcac +Block 0021 [105]: fccafd379e9f12ef +Block 0021 [106]: 05ae07dec96f9eb0 +Block 0021 [107]: fd15d9577c4ea8e4 +Block 0021 [108]: 1a4e61a28ff11004 +Block 0021 [109]: a4872d13a69a0b4c +Block 0021 [110]: 8aa4ec2f2d437813 +Block 0021 [111]: 819bfdfeaaa63f48 +Block 0021 [112]: ed5a68b009e360c4 +Block 0021 [113]: e0e8b4a7cb576db0 +Block 0021 [114]: b59c4f32dd03da00 +Block 0021 [115]: b2ad853f8f069f41 +Block 0021 [116]: ca994d65093a74bb +Block 0021 [117]: d6a367644126ff76 +Block 0021 [118]: 474bcb62a5a32578 +Block 0021 [119]: afe92b0c4a373a90 +Block 0021 [120]: 2441672629527279 +Block 0021 [121]: d48d70a936bc1f6a +Block 0021 [122]: 06c0a578a5be8cff +Block 0021 [123]: bc465df8825e63b8 +Block 0021 [124]: 009832fb2593ed52 +Block 0021 [125]: 240ea37a5b3c0898 +Block 0021 [126]: a5e6792687d94efd +Block 0021 [127]: 016f2a1a3938b59d +Block 0022 [ 0]: f28208ecaf7daa39 +Block 0022 [ 1]: 53aa8bfdd2c7a82e +Block 0022 [ 2]: 040c51ebe7130e9b +Block 0022 [ 3]: c53745bc099f0a10 +Block 0022 [ 4]: 994c0f76e52c4e70 +Block 0022 [ 5]: d10f139c2035a83f +Block 0022 [ 6]: f45c9a03e7124b1c +Block 0022 [ 7]: 509df037e7cbcdc9 +Block 0022 [ 8]: f2e5559090115b70 +Block 0022 [ 9]: 920cca40b2d82562 +Block 0022 [ 10]: ce7fd5163ff910a1 +Block 0022 [ 11]: fe32d902cb033902 +Block 0022 [ 12]: 53a99b4671e1bd64 +Block 0022 [ 13]: 3a0a6b6ee19a017d +Block 0022 [ 14]: 6db107dc01c49333 +Block 0022 [ 15]: 714519d0c9dd6df6 +Block 0022 [ 16]: 0294a739ffac2767 +Block 0022 [ 17]: be852872da6c9909 +Block 0022 [ 18]: c689b81da8b6cc7b +Block 0022 [ 19]: 5b14400973fb7d4e +Block 0022 [ 20]: 94a2733e6461bf20 +Block 0022 [ 21]: f2b7d10b078450bf +Block 0022 [ 22]: 69f891c8b44849fa +Block 0022 [ 23]: adcc4aa0504c18e8 +Block 0022 [ 24]: bf56349a07bc26e6 +Block 0022 [ 25]: 1693eb4a1a011bab +Block 0022 [ 26]: 6b918c066f8c9886 +Block 0022 [ 27]: 7c74b51fd5003283 +Block 0022 [ 28]: cd33fc82717ef356 +Block 0022 [ 29]: 9be3279650ef3317 +Block 0022 [ 30]: 1636d1c49d3d8bb8 +Block 0022 [ 31]: d4c61b5e73e94a51 +Block 0022 [ 32]: d3834f906c63ae8a +Block 0022 [ 33]: 0729d1c26cd9665e +Block 0022 [ 34]: 0a8161ec2c96e248 +Block 0022 [ 35]: c83174338be92fde +Block 0022 [ 36]: 0431c9b4e21fa8f4 +Block 0022 [ 37]: 5e0a8a900923b805 +Block 0022 [ 38]: 8291af7cc00969ab +Block 0022 [ 39]: 11112b26e731e5a7 +Block 0022 [ 40]: e06428d5143e1bd6 +Block 0022 [ 41]: 2c12d27d4339701b +Block 0022 [ 42]: 072bfc5abe95f12e +Block 0022 [ 43]: 495f489c8045a96c +Block 0022 [ 44]: ef037b259d652793 +Block 0022 [ 45]: 76e13c91d34dd109 +Block 0022 [ 46]: 27c82183818246c5 +Block 0022 [ 47]: f767637242bee843 +Block 0022 [ 48]: f901c0738c648b8e +Block 0022 [ 49]: 96a2184fb86c7895 +Block 0022 [ 50]: bd7fb979f668146f +Block 0022 [ 51]: 36dd269c0380ed7c +Block 0022 [ 52]: 24511c91ad9e13b6 +Block 0022 [ 53]: 70e978c71bc99f9a +Block 0022 [ 54]: 5ea1a65b5cebc7c9 +Block 0022 [ 55]: edc11a6b51c5cd1e +Block 0022 [ 56]: 780ada000e671454 +Block 0022 [ 57]: 119cd1b73129ac78 +Block 0022 [ 58]: 3178d12be1db151e +Block 0022 [ 59]: ce6742aa5b3f70be +Block 0022 [ 60]: 4fc9591f439bba56 +Block 0022 [ 61]: d422a0643532cca6 +Block 0022 [ 62]: 1852782dcc6ab49b +Block 0022 [ 63]: caad088aeb0fc18b +Block 0022 [ 64]: b305da56b3fc0e06 +Block 0022 [ 65]: 809d79c7bf612db4 +Block 0022 [ 66]: 37082bf7a806431a +Block 0022 [ 67]: 63a7d2e4d19e97bd +Block 0022 [ 68]: b5962ee6c2321441 +Block 0022 [ 69]: db1776121fa5afe6 +Block 0022 [ 70]: 1c53ad44ab3643b6 +Block 0022 [ 71]: 5f873f6632e08c98 +Block 0022 [ 72]: 4c20777b04117596 +Block 0022 [ 73]: ba04e67acfa757cf +Block 0022 [ 74]: c1dbca772fe70d02 +Block 0022 [ 75]: 94ade1780a3edf02 +Block 0022 [ 76]: 288d7b3743d4e61f +Block 0022 [ 77]: 9b055d1193eb5291 +Block 0022 [ 78]: 0ec0e7c91a4aaa92 +Block 0022 [ 79]: a34de8d02873eb79 +Block 0022 [ 80]: 180f8fbdb0a4cc53 +Block 0022 [ 81]: 899c5bcc0ab9f829 +Block 0022 [ 82]: 641dc8e4a42347d8 +Block 0022 [ 83]: 37397c3696b512d2 +Block 0022 [ 84]: 171da4bc79dd8334 +Block 0022 [ 85]: e778f4ce24bdcc9a +Block 0022 [ 86]: 07ed3b0c74a1cff6 +Block 0022 [ 87]: eb774f9bd5d3a786 +Block 0022 [ 88]: 7ecc8df8de9b010e +Block 0022 [ 89]: 4bc8ff96cb6c1075 +Block 0022 [ 90]: 4e87e8d5b103a61c +Block 0022 [ 91]: 6970f27c0119652b +Block 0022 [ 92]: 4dd0ec5ee21849e5 +Block 0022 [ 93]: c1605b97fb688038 +Block 0022 [ 94]: 628a8cd70fbc14ec +Block 0022 [ 95]: fcf1558cb6d49aba +Block 0022 [ 96]: bda88d1a7603641f +Block 0022 [ 97]: c57e868e6e0b3eb5 +Block 0022 [ 98]: d6209eb6dc713428 +Block 0022 [ 99]: 1941dbe12465838f +Block 0022 [100]: d93ade4fa7c6ed41 +Block 0022 [101]: c9035a14343aa4c3 +Block 0022 [102]: 3916d1588daaa456 +Block 0022 [103]: 7f2220f99db61237 +Block 0022 [104]: 170fc02232581fb8 +Block 0022 [105]: ed832e589ccc12f7 +Block 0022 [106]: 83304d94de7f62c3 +Block 0022 [107]: d668470108f6fe2d +Block 0022 [108]: d25bc5e58f55894f +Block 0022 [109]: 40844e9c014682e2 +Block 0022 [110]: aecd9fee20958744 +Block 0022 [111]: b6ce492e71f31e6b +Block 0022 [112]: 456975f1da0a7502 +Block 0022 [113]: 7fe09228d49664bb +Block 0022 [114]: 004c96474ee60f41 +Block 0022 [115]: 6e727e5c490ea0fb +Block 0022 [116]: e2d8a78f06ec4e3e +Block 0022 [117]: 35e193e5480740e4 +Block 0022 [118]: dae2a930e3764785 +Block 0022 [119]: 4e034457389b8366 +Block 0022 [120]: 19a58f91fcb3ddff +Block 0022 [121]: 3a62f251e411e180 +Block 0022 [122]: 5c669a8f9a95a0e6 +Block 0022 [123]: ee7deb9f94a0865e +Block 0022 [124]: c8d5b909868f1e4e +Block 0022 [125]: 7d0bfb7632800a9b +Block 0022 [126]: 1a88e866ade9002b +Block 0022 [127]: 079029262e56f903 +Block 0023 [ 0]: c15a8fc42b27f642 +Block 0023 [ 1]: e03a8e8631d2b5bb +Block 0023 [ 2]: 60676b51a501fd20 +Block 0023 [ 3]: 70363f1f5d0982e7 +Block 0023 [ 4]: 6e64ad1dba37c597 +Block 0023 [ 5]: 077ec82bd054088a +Block 0023 [ 6]: 5b7c4ddd1228e337 +Block 0023 [ 7]: e2447d5fe98ef4a1 +Block 0023 [ 8]: a9272395f698506e +Block 0023 [ 9]: 19674a3d25dd1c41 +Block 0023 [ 10]: 3615d79951e1ee4b +Block 0023 [ 11]: b8779be91637ea3d +Block 0023 [ 12]: 8bfd401b59f0b40b +Block 0023 [ 13]: 63d27f0efb1fbecd +Block 0023 [ 14]: 0c92f5146c1000d8 +Block 0023 [ 15]: 0b82cd63e4a90488 +Block 0023 [ 16]: f36d845ed88968e8 +Block 0023 [ 17]: e55c4a5888669a9c +Block 0023 [ 18]: e2859d86961336e7 +Block 0023 [ 19]: 09cce3cb91692d8c +Block 0023 [ 20]: d831491e7a744a7f +Block 0023 [ 21]: 845e21c8789fbe20 +Block 0023 [ 22]: 7471f20a31c0f11b +Block 0023 [ 23]: f4a98b968bbe508a +Block 0023 [ 24]: c8b373278654bd2d +Block 0023 [ 25]: f5b7753a582847fd +Block 0023 [ 26]: c6c6833fa454822b +Block 0023 [ 27]: 60a96d2b60ff8110 +Block 0023 [ 28]: 740095523a202d0d +Block 0023 [ 29]: ccd5618264c2c7d7 +Block 0023 [ 30]: 26acdbd4c51053bc +Block 0023 [ 31]: 00cee5634151956e +Block 0023 [ 32]: 6468ca3bbf126e1e +Block 0023 [ 33]: 4e0ecb735bac1923 +Block 0023 [ 34]: 058fd5d9faa97acb +Block 0023 [ 35]: b985441f8cd0aea2 +Block 0023 [ 36]: 98db7e03c4b4fa5f +Block 0023 [ 37]: fce6c028c40d31d1 +Block 0023 [ 38]: bd46a1812c2d9989 +Block 0023 [ 39]: b7b16f5a4e5a4e46 +Block 0023 [ 40]: 1620f3704a2646dc +Block 0023 [ 41]: ef6c5ecffbba17d2 +Block 0023 [ 42]: 3ad6d21b5820df63 +Block 0023 [ 43]: 5513dac83bbb0253 +Block 0023 [ 44]: c3a976704657237a +Block 0023 [ 45]: d237eb3dc895af8d +Block 0023 [ 46]: 6889cf8777a35680 +Block 0023 [ 47]: 16634fd85637e778 +Block 0023 [ 48]: f16e9eec717fc4a9 +Block 0023 [ 49]: 4e317adaefc26b67 +Block 0023 [ 50]: 85971efb7c005aed +Block 0023 [ 51]: 88bb12c5e3d8cf61 +Block 0023 [ 52]: 677ab5233b01fba4 +Block 0023 [ 53]: b0010729c7615307 +Block 0023 [ 54]: 20b7ecf44ac319a9 +Block 0023 [ 55]: eef793b98a7e61fd +Block 0023 [ 56]: 85b60099f6d0bfa5 +Block 0023 [ 57]: 9ef45c3df475e8da +Block 0023 [ 58]: a0c4e30b646b34f2 +Block 0023 [ 59]: b74229c3f8f8f116 +Block 0023 [ 60]: 6b64b642b55f4b77 +Block 0023 [ 61]: 084ff048b1ab04d3 +Block 0023 [ 62]: d375965de7bbff82 +Block 0023 [ 63]: 57786d15edce08a2 +Block 0023 [ 64]: ce78982e90708e15 +Block 0023 [ 65]: b0e39ed6c7402cc2 +Block 0023 [ 66]: 3586998fe0495f3c +Block 0023 [ 67]: 60fdadfb02cb9a8f +Block 0023 [ 68]: bb58aa898c65a14d +Block 0023 [ 69]: f17213260e0fad9a +Block 0023 [ 70]: b42b62935550b400 +Block 0023 [ 71]: 5543e77410120d07 +Block 0023 [ 72]: 8d486269dd536011 +Block 0023 [ 73]: bd4f1af4698e9cc7 +Block 0023 [ 74]: 78abd3f2e0ad6851 +Block 0023 [ 75]: 0f382abc61fd54b8 +Block 0023 [ 76]: c9fcaa40dd997fb5 +Block 0023 [ 77]: 2818fe972f636137 +Block 0023 [ 78]: dee6cde471d08bf0 +Block 0023 [ 79]: 61e74d63ce506e93 +Block 0023 [ 80]: 4119c8d5cc111e68 +Block 0023 [ 81]: b6460571b021c77a +Block 0023 [ 82]: 3682f1268469be47 +Block 0023 [ 83]: da1041b9b821500f +Block 0023 [ 84]: 42c3f149c0939593 +Block 0023 [ 85]: 2eb6fe95cd7f8f7e +Block 0023 [ 86]: 30a28f6884baf140 +Block 0023 [ 87]: fb4517a8f6f314f0 +Block 0023 [ 88]: 159d8c247a4e0906 +Block 0023 [ 89]: 91843a594cfe15cd +Block 0023 [ 90]: 9a3f9e8078b72dc3 +Block 0023 [ 91]: dbe9713f47902a9a +Block 0023 [ 92]: aa2b6e73ba3c3d0c +Block 0023 [ 93]: 451ceb1b888cbe16 +Block 0023 [ 94]: 4db42dc635c0bb34 +Block 0023 [ 95]: 1828653d95f4341b +Block 0023 [ 96]: c1299eff4a5f8047 +Block 0023 [ 97]: f897b2a772822f5b +Block 0023 [ 98]: 33fd9d8a58670737 +Block 0023 [ 99]: ce47236b3e468a36 +Block 0023 [100]: 34cd0caf09c05c00 +Block 0023 [101]: 8c91a2667a59ef7a +Block 0023 [102]: 7c89fea7f780a662 +Block 0023 [103]: dbfd76736779b2c3 +Block 0023 [104]: 1f861037bd0abc1b +Block 0023 [105]: e5d868458e43dbce +Block 0023 [106]: 1703c8c3c5f122eb +Block 0023 [107]: 47168a277b482e6f +Block 0023 [108]: 239421a6e9376e4b +Block 0023 [109]: fab879b198eac843 +Block 0023 [110]: acc5f29c207f96c3 +Block 0023 [111]: 5e0459b6cad2017d +Block 0023 [112]: d03eeb4f2ce559ec +Block 0023 [113]: e74ff3674d169a0b +Block 0023 [114]: 26076994b57ff424 +Block 0023 [115]: 38dbf73a4d1fe5a8 +Block 0023 [116]: a3b7dc4a267c7521 +Block 0023 [117]: 583d4e15f7e10c9f +Block 0023 [118]: 38cb311dbc767883 +Block 0023 [119]: d67412648b62d999 +Block 0023 [120]: a132b14a24350528 +Block 0023 [121]: 8dc4bf4893d3a381 +Block 0023 [122]: 07254e51d81a9dc0 +Block 0023 [123]: 694e27e2bca68da0 +Block 0023 [124]: 2733cbe18458a93e +Block 0023 [125]: 17133c2fc328d2d8 +Block 0023 [126]: dcc6852dbac50cdc +Block 0023 [127]: d9989bf3ec285e44 +Block 0024 [ 0]: bafc20be127345f7 +Block 0024 [ 1]: a0e105b58755375b +Block 0024 [ 2]: 1d6a71416ff67391 +Block 0024 [ 3]: 9e839dfce45172b1 +Block 0024 [ 4]: d33112aaed4852e1 +Block 0024 [ 5]: 0622aee69fcb9e97 +Block 0024 [ 6]: 5e88992880040a2f +Block 0024 [ 7]: 852b8867310e3211 +Block 0024 [ 8]: e428be753777967d +Block 0024 [ 9]: ddeef681b468aad6 +Block 0024 [ 10]: b847fd00ea092021 +Block 0024 [ 11]: fdf2d32288baece4 +Block 0024 [ 12]: bb1ecc42e2fc594c +Block 0024 [ 13]: b610bf428a5bee66 +Block 0024 [ 14]: 48683a33fe4e565b +Block 0024 [ 15]: 67416c79b45c527f +Block 0024 [ 16]: d54025dca586097a +Block 0024 [ 17]: 6903b9074305a44a +Block 0024 [ 18]: 515a74f3004d1a83 +Block 0024 [ 19]: 5e247be7152ab011 +Block 0024 [ 20]: f89524bfacae7eb7 +Block 0024 [ 21]: bf1419b938b3ebc2 +Block 0024 [ 22]: ac612be97e2535b7 +Block 0024 [ 23]: 8b4b7e35ed62efed +Block 0024 [ 24]: c4db0666691de89c +Block 0024 [ 25]: da746bb3a0ea9036 +Block 0024 [ 26]: 648e0d474d9d5edf +Block 0024 [ 27]: d6cc1c7b9481a978 +Block 0024 [ 28]: c03ead602a6f125c +Block 0024 [ 29]: 52d1e2fba64a4c05 +Block 0024 [ 30]: beac5772e0792903 +Block 0024 [ 31]: 1a0fce7643d06795 +Block 0024 [ 32]: 9cf9c86abc978ef6 +Block 0024 [ 33]: 14edb2fb446834ea +Block 0024 [ 34]: 1aff2b0a0561082e +Block 0024 [ 35]: 1bdc3688d8a49501 +Block 0024 [ 36]: 25aa17332f0a1d54 +Block 0024 [ 37]: 493d2af91f4de279 +Block 0024 [ 38]: 93911a09eab9d742 +Block 0024 [ 39]: 76b476f9d874e180 +Block 0024 [ 40]: 1adb25a2cec03ab4 +Block 0024 [ 41]: 8527203b85b693c3 +Block 0024 [ 42]: 79f3cb77c155e8c2 +Block 0024 [ 43]: 0574b0c4b99985c6 +Block 0024 [ 44]: af18733188176aeb +Block 0024 [ 45]: b42cc646d1fe6639 +Block 0024 [ 46]: 6e4ddc05a0aaaf15 +Block 0024 [ 47]: bc4478c9716532b7 +Block 0024 [ 48]: 4fcbc6dc5f29f830 +Block 0024 [ 49]: ec47edc42c40a226 +Block 0024 [ 50]: 92da9c7bd9b3241f +Block 0024 [ 51]: 8aa095b9fab99b90 +Block 0024 [ 52]: 9cf9d0b635369605 +Block 0024 [ 53]: 8c94a54ec3d3d9db +Block 0024 [ 54]: d51d82e1e5647069 +Block 0024 [ 55]: f5c340c32eeb76f7 +Block 0024 [ 56]: fa5902c7acdc4f3b +Block 0024 [ 57]: f46b2cf8e9d44be0 +Block 0024 [ 58]: 6706a878e07af770 +Block 0024 [ 59]: 6da1f034bef87d13 +Block 0024 [ 60]: 799e0a83fd490d4c +Block 0024 [ 61]: a354e01a2ad75bcd +Block 0024 [ 62]: c27358c4ac491b7d +Block 0024 [ 63]: 18ba545379367429 +Block 0024 [ 64]: 1c1c5042b0d7a965 +Block 0024 [ 65]: 6d92f7e87e591c69 +Block 0024 [ 66]: ad72b6c6fbae77a8 +Block 0024 [ 67]: 20cc0e1d83937562 +Block 0024 [ 68]: b1c5e36ea64465d8 +Block 0024 [ 69]: aef9474384eae537 +Block 0024 [ 70]: 96c55972051f16bd +Block 0024 [ 71]: f6b9fbd4c1770049 +Block 0024 [ 72]: 00063b28ba569959 +Block 0024 [ 73]: 15034e11892d2b53 +Block 0024 [ 74]: 49c65e51d1c77d3e +Block 0024 [ 75]: c6cbe3c13677dbb9 +Block 0024 [ 76]: c9278514eb23f973 +Block 0024 [ 77]: 0418e33c3d1d1d67 +Block 0024 [ 78]: eaa9823ac8ef9f1d +Block 0024 [ 79]: b808887eee920d4b +Block 0024 [ 80]: 2762abdb3a826d18 +Block 0024 [ 81]: f6bd043987950f92 +Block 0024 [ 82]: 5e953a434ff2db87 +Block 0024 [ 83]: 5357c86ca298191a +Block 0024 [ 84]: 9516f3592e6e9c8a +Block 0024 [ 85]: 8f9689fc2c705eca +Block 0024 [ 86]: 41c091bd3bed62a9 +Block 0024 [ 87]: 8f5b0f2f7bdbf769 +Block 0024 [ 88]: 728639c0f6ef9b1d +Block 0024 [ 89]: 08aede8636e79efd +Block 0024 [ 90]: a9fe4536a61be7c9 +Block 0024 [ 91]: 014e422b37f869dd +Block 0024 [ 92]: 64d1e18d22d2928f +Block 0024 [ 93]: f0106d49826a34bd +Block 0024 [ 94]: 864bb5eda4a35c1f +Block 0024 [ 95]: bb8a9778ba354712 +Block 0024 [ 96]: d7875d3c0b0ab74e +Block 0024 [ 97]: 69038303e1460b09 +Block 0024 [ 98]: a6ca05dd54aef2ee +Block 0024 [ 99]: 728d835ab505d6bc +Block 0024 [100]: f1be387c80c03e4b +Block 0024 [101]: 2aac86175bda747c +Block 0024 [102]: d288c4d7161502bc +Block 0024 [103]: b0e42aa7ecbd6572 +Block 0024 [104]: 52e77db04ece14f7 +Block 0024 [105]: 6adb74b3d56f09a8 +Block 0024 [106]: 2a6452c901b43573 +Block 0024 [107]: 1056bf56e286e0b7 +Block 0024 [108]: c928aeb275c4b7fa +Block 0024 [109]: 389b14bde4c4d382 +Block 0024 [110]: 9965960db1954391 +Block 0024 [111]: b058a195f70320b4 +Block 0024 [112]: 7619ac5501f4432c +Block 0024 [113]: 586c2db0440f1c83 +Block 0024 [114]: 29e5c6289766490f +Block 0024 [115]: c53c12c1b8dd4d7a +Block 0024 [116]: 1e41341416298856 +Block 0024 [117]: d0a7ae5578f472ce +Block 0024 [118]: b65da50b01d5b8a5 +Block 0024 [119]: 83ec23e27b3eec21 +Block 0024 [120]: ddb5cbc028b735cb +Block 0024 [121]: 4884c6452683f7d5 +Block 0024 [122]: 6cd0174e00017e97 +Block 0024 [123]: fd24844d4d331560 +Block 0024 [124]: 816482d8427a8e64 +Block 0024 [125]: fed0e63ad09481e2 +Block 0024 [126]: 18b61579f735a700 +Block 0024 [127]: fee0bb721ee1ecbb +Block 0025 [ 0]: 218f7d49738f92c6 +Block 0025 [ 1]: 7c43c89d034788a4 +Block 0025 [ 2]: f5d1f2d8a8920f06 +Block 0025 [ 3]: 299f14e7ed5496cc +Block 0025 [ 4]: 1cbea1c1b52d4256 +Block 0025 [ 5]: b2592bd426bc03e0 +Block 0025 [ 6]: ca33a1cc73e76dc3 +Block 0025 [ 7]: 15b633ac2cd4b284 +Block 0025 [ 8]: 7b346972a603745c +Block 0025 [ 9]: ae49e15247e0539c +Block 0025 [ 10]: c39719dde95ec973 +Block 0025 [ 11]: 791d01640218069e +Block 0025 [ 12]: 9e12cde9bc52bbe4 +Block 0025 [ 13]: c86c7f806ea55df1 +Block 0025 [ 14]: 6b61f785e2d65f69 +Block 0025 [ 15]: cb37008fc82db79e +Block 0025 [ 16]: 6a60abdb40faf82a +Block 0025 [ 17]: 8cf923b935d9bcf5 +Block 0025 [ 18]: 76825bb43adce337 +Block 0025 [ 19]: babbde01d9655fb1 +Block 0025 [ 20]: f3d78eb5ad275d05 +Block 0025 [ 21]: d2870cf57340c55e +Block 0025 [ 22]: 91af1fc8c89689fc +Block 0025 [ 23]: 1a5433e50b5e05a8 +Block 0025 [ 24]: f457295bfa093ddc +Block 0025 [ 25]: 1957226241d244e1 +Block 0025 [ 26]: 36cc9305fd37b4e3 +Block 0025 [ 27]: 4aa1aac99f568863 +Block 0025 [ 28]: 941674cf76af7190 +Block 0025 [ 29]: 1b2c8add189d17ee +Block 0025 [ 30]: 562fd164598ba90c +Block 0025 [ 31]: 90d89a9e2623318f +Block 0025 [ 32]: 9ff0a6747fc96454 +Block 0025 [ 33]: 44b54df3ab1aead2 +Block 0025 [ 34]: 509e4c640941d270 +Block 0025 [ 35]: d9b30bff5ed623b2 +Block 0025 [ 36]: b716592c68837232 +Block 0025 [ 37]: cd8a95452b6aa6e1 +Block 0025 [ 38]: df5a3d86c0052718 +Block 0025 [ 39]: 2cae0d438b45a92b +Block 0025 [ 40]: 9bb50165d3b673e9 +Block 0025 [ 41]: 090a71cc136ec229 +Block 0025 [ 42]: 3bfc57430d7d2475 +Block 0025 [ 43]: b21d732e80efc1e1 +Block 0025 [ 44]: 569d99152241f5cb +Block 0025 [ 45]: 5bee8181547575e7 +Block 0025 [ 46]: 360a0f24e67e378b +Block 0025 [ 47]: 0a444cb4f1287e92 +Block 0025 [ 48]: f8fe73d971ad4e15 +Block 0025 [ 49]: 7809a6c41558690c +Block 0025 [ 50]: 14c554cbb8d87a9f +Block 0025 [ 51]: 4bf94d2f59a1b885 +Block 0025 [ 52]: d819171c43d2c448 +Block 0025 [ 53]: b9bad5c60bfa27b5 +Block 0025 [ 54]: 2f4ec140540ba3cc +Block 0025 [ 55]: 5e0b06feb534cb6b +Block 0025 [ 56]: 55eef994d053a92b +Block 0025 [ 57]: 3c3efb4ca90f9aa2 +Block 0025 [ 58]: 4ac1b476371364e9 +Block 0025 [ 59]: cfb1ac1ffb41f16f +Block 0025 [ 60]: 2e47b513102c6e6e +Block 0025 [ 61]: baf2a3f185deefc1 +Block 0025 [ 62]: 9688648864cb8ddb +Block 0025 [ 63]: 0726d0615a1a85b5 +Block 0025 [ 64]: 3d7383c8adfb85a7 +Block 0025 [ 65]: dac839ce44c2b275 +Block 0025 [ 66]: 0954eed70bd6fda5 +Block 0025 [ 67]: b347e872bdcd43da +Block 0025 [ 68]: cc040228c23d0e6e +Block 0025 [ 69]: 0de8b3f517319c2a +Block 0025 [ 70]: 50eff13db15ff965 +Block 0025 [ 71]: 5b5e495005b6e3a4 +Block 0025 [ 72]: ea83a832b036de55 +Block 0025 [ 73]: 4b92d114ff4c8a85 +Block 0025 [ 74]: 352986db66e2c6f2 +Block 0025 [ 75]: 5a5b775b10bd3414 +Block 0025 [ 76]: 7840ea80a027bde7 +Block 0025 [ 77]: f4365b7239cf5007 +Block 0025 [ 78]: 24fda471b099ae21 +Block 0025 [ 79]: 72b184a1ddc10267 +Block 0025 [ 80]: 362aa580b6b44a23 +Block 0025 [ 81]: 2249ca6bb3512afa +Block 0025 [ 82]: 9d86d882d57b1214 +Block 0025 [ 83]: 09cd175d74396827 +Block 0025 [ 84]: e9b1152be6185310 +Block 0025 [ 85]: b6fa99c7d3f6e258 +Block 0025 [ 86]: bb1157a075afefb8 +Block 0025 [ 87]: ecfad80c123ddcf4 +Block 0025 [ 88]: f4c5f6049360c7ed +Block 0025 [ 89]: 9b4a4dcb7b95af93 +Block 0025 [ 90]: 6af0da4d6ea78de5 +Block 0025 [ 91]: d486be8a57928782 +Block 0025 [ 92]: 2d3747216952a042 +Block 0025 [ 93]: 7480bdbc4fc25e99 +Block 0025 [ 94]: 7caea647a8b0f52b +Block 0025 [ 95]: a759ceef02e325d2 +Block 0025 [ 96]: a2f14256abd2a57f +Block 0025 [ 97]: 101ddae96091e57e +Block 0025 [ 98]: e810140f913206f3 +Block 0025 [ 99]: edb6506015ec4e5e +Block 0025 [100]: 114dc2565158243a +Block 0025 [101]: 4e9d15bdf88ad4e4 +Block 0025 [102]: ece4b8ff68cea6a2 +Block 0025 [103]: f0ebe4d86b4b9316 +Block 0025 [104]: 8355940d8efe6fc4 +Block 0025 [105]: ea8a6355cca5d9d3 +Block 0025 [106]: 65aca3bcc4d4a292 +Block 0025 [107]: b4ad427852001777 +Block 0025 [108]: 85639d301162a27f +Block 0025 [109]: 759e87e84b2f7c42 +Block 0025 [110]: ee1d3820c4f58ee3 +Block 0025 [111]: 88688a321ffa4610 +Block 0025 [112]: 9d4e4c09d07e6414 +Block 0025 [113]: 21cc042a64f6f219 +Block 0025 [114]: 934eb23f70839cdc +Block 0025 [115]: 52b37f2b7eef3a7a +Block 0025 [116]: 5f6642d0bcc72f28 +Block 0025 [117]: 7bc04881f38f6a04 +Block 0025 [118]: 37fdffd62c6fe429 +Block 0025 [119]: eb893917d8365d52 +Block 0025 [120]: 7bff88282c1cc77f +Block 0025 [121]: 1a877bda6afc8cee +Block 0025 [122]: f6261537899eb64f +Block 0025 [123]: 0631a65eda39a9cb +Block 0025 [124]: 4ef993405ba60811 +Block 0025 [125]: 62400e9a554324eb +Block 0025 [126]: 46a1f4e5f7d44185 +Block 0025 [127]: 98628c54e42825e7 +Block 0026 [ 0]: 3c6983afbba804d5 +Block 0026 [ 1]: 6711c9d79fddc321 +Block 0026 [ 2]: 2391ab06e29b8e47 +Block 0026 [ 3]: 357cda706f696cf8 +Block 0026 [ 4]: 7de77eb985e3e694 +Block 0026 [ 5]: 0b1cca5039a0bcf2 +Block 0026 [ 6]: 02b63e6bf9d96807 +Block 0026 [ 7]: 19d9ca3eb6108b20 +Block 0026 [ 8]: fa46aba3dcc57351 +Block 0026 [ 9]: 261914f924334ffb +Block 0026 [ 10]: aa184f31ff808f1f +Block 0026 [ 11]: f70c6320224698db +Block 0026 [ 12]: 20afaddd294fb3ec +Block 0026 [ 13]: 826874f33b12c683 +Block 0026 [ 14]: 036a6550f020d424 +Block 0026 [ 15]: f64caa528536a1b7 +Block 0026 [ 16]: eff5a71792f55f01 +Block 0026 [ 17]: 48f7424b0df5c46f +Block 0026 [ 18]: 01c1ade0611d07f1 +Block 0026 [ 19]: c89280c83156add8 +Block 0026 [ 20]: 258f1b61fc7f6b11 +Block 0026 [ 21]: ed5c950819eace58 +Block 0026 [ 22]: 2eeb9d215f9e1d41 +Block 0026 [ 23]: fae0b2678e3c8a67 +Block 0026 [ 24]: 739195ac32a0e262 +Block 0026 [ 25]: 6d71718902f627aa +Block 0026 [ 26]: a8cd44e2ec39edae +Block 0026 [ 27]: d8cc82a9d8334dee +Block 0026 [ 28]: 3e0bbab36c2d4b13 +Block 0026 [ 29]: 7173f42e8fb7d186 +Block 0026 [ 30]: aa49cc111f609407 +Block 0026 [ 31]: 86b5d32d57254d39 +Block 0026 [ 32]: c1c3ef5753af595a +Block 0026 [ 33]: 136cb058821065a2 +Block 0026 [ 34]: 0974f4cf5a77a026 +Block 0026 [ 35]: c5e39f3305aab8b1 +Block 0026 [ 36]: 10821d1445291cba +Block 0026 [ 37]: 81d371c00c1b4c08 +Block 0026 [ 38]: 85c8c719277f3965 +Block 0026 [ 39]: c590db7df5a36675 +Block 0026 [ 40]: 545f3dff15b55c1e +Block 0026 [ 41]: e980768ad45c12ef +Block 0026 [ 42]: 3be75af231bac2ca +Block 0026 [ 43]: 95ec39119f1250f2 +Block 0026 [ 44]: bbff859c5c9f89bb +Block 0026 [ 45]: 142a0680ef5b5f16 +Block 0026 [ 46]: 27facd74fffda870 +Block 0026 [ 47]: 55dd1b22cc90f735 +Block 0026 [ 48]: a12d88ec60c512fd +Block 0026 [ 49]: a135793f811d6111 +Block 0026 [ 50]: 34c6fa055bdc63e9 +Block 0026 [ 51]: cb40ef918c0a282f +Block 0026 [ 52]: 0a9042c429b52e20 +Block 0026 [ 53]: 8025ec3592aaac36 +Block 0026 [ 54]: e6fe903a66fe4e3f +Block 0026 [ 55]: e31655f738fd1ce8 +Block 0026 [ 56]: 9ee25a076d5f41cf +Block 0026 [ 57]: cde79d1536830e67 +Block 0026 [ 58]: 7721d1919a0ff9b9 +Block 0026 [ 59]: cc495c11c8639a44 +Block 0026 [ 60]: 5b6291631d8b1728 +Block 0026 [ 61]: 3f5037b0c8cbc91e +Block 0026 [ 62]: b9b6d9c18539e66a +Block 0026 [ 63]: 366ed0f240bf7120 +Block 0026 [ 64]: 9b201c10a4353d2f +Block 0026 [ 65]: 359c2842aa330468 +Block 0026 [ 66]: a3fb5a76d20bacd3 +Block 0026 [ 67]: a18496fc163bc0e9 +Block 0026 [ 68]: bbf9ca616287297c +Block 0026 [ 69]: 939beb6456f35b3c +Block 0026 [ 70]: 4e0f82cc86bfd22b +Block 0026 [ 71]: e966d50cc7df0f87 +Block 0026 [ 72]: e517c5470cea1c0c +Block 0026 [ 73]: c112ddf352579302 +Block 0026 [ 74]: a63420c0997f61e3 +Block 0026 [ 75]: 3926f92cdfc55124 +Block 0026 [ 76]: 88ec54e147108123 +Block 0026 [ 77]: 7e828e3c0fc07af4 +Block 0026 [ 78]: bdfe6fad95995ffd +Block 0026 [ 79]: b4919dca6d54d29b +Block 0026 [ 80]: 2a405f1adf13a606 +Block 0026 [ 81]: 404cc4b6e4adf8df +Block 0026 [ 82]: 15bf36bdcab5acb9 +Block 0026 [ 83]: cb0884b41dd7cbf2 +Block 0026 [ 84]: 96af5406db7d487c +Block 0026 [ 85]: c8074d30dd0c86ba +Block 0026 [ 86]: 7d1c52344ed5ecf2 +Block 0026 [ 87]: 5826b80aaa041c09 +Block 0026 [ 88]: aac72ffdfc5b0024 +Block 0026 [ 89]: 2077fe5a631f42a6 +Block 0026 [ 90]: 9fd9e717bcc0dfb8 +Block 0026 [ 91]: 69de97e2bd116811 +Block 0026 [ 92]: ed51dcd989772100 +Block 0026 [ 93]: 88c57a4fd02c9c4e +Block 0026 [ 94]: f5162652fd844d77 +Block 0026 [ 95]: d645ec63828fb2cb +Block 0026 [ 96]: f8bac28ed154957d +Block 0026 [ 97]: 9290f00d8a17bdb2 +Block 0026 [ 98]: e9833bb57c692f55 +Block 0026 [ 99]: db21a9b32401012a +Block 0026 [100]: 162b6d8c35201524 +Block 0026 [101]: 75ade54377c77238 +Block 0026 [102]: b8d7284df781f3d0 +Block 0026 [103]: 303bd658599f0e6c +Block 0026 [104]: 0232876bafc7bfd9 +Block 0026 [105]: 920c9811b0077634 +Block 0026 [106]: fcab0361efef9ff2 +Block 0026 [107]: ab8519c253a00f4a +Block 0026 [108]: da9867be15d00f19 +Block 0026 [109]: c82b7fe39d4017f2 +Block 0026 [110]: 583847c2f8775b22 +Block 0026 [111]: a303262ed2cd1159 +Block 0026 [112]: ccaf60e46589054f +Block 0026 [113]: 5bbb7b1b4cb3111c +Block 0026 [114]: 29eb66dd0bf01df5 +Block 0026 [115]: e8cf9b1056366920 +Block 0026 [116]: 0399042b521c3626 +Block 0026 [117]: c37fb9108d6c0d0a +Block 0026 [118]: 913c845e777489f5 +Block 0026 [119]: 918d92d0b7809530 +Block 0026 [120]: 0c36ee266601a21b +Block 0026 [121]: f2d1cd576aed1bb5 +Block 0026 [122]: 7b58b466d3fee7df +Block 0026 [123]: d5158fb67955e952 +Block 0026 [124]: 6ef3cfa7180c9bc1 +Block 0026 [125]: fa9acd56b8400839 +Block 0026 [126]: bc82d8d53d9ecfda +Block 0026 [127]: 5761bdea1282864c +Block 0027 [ 0]: 7d3c9a0ec3269b48 +Block 0027 [ 1]: 6686eb93fbda0d77 +Block 0027 [ 2]: cb7ee69fe719e3b4 +Block 0027 [ 3]: 54ae42cd9118070c +Block 0027 [ 4]: 62164ca70764a185 +Block 0027 [ 5]: 185e261947601d34 +Block 0027 [ 6]: 092bb74b591bd0ca +Block 0027 [ 7]: 1279028f9bf6f93d +Block 0027 [ 8]: 916e719df2543a93 +Block 0027 [ 9]: 3d38f8078087f328 +Block 0027 [ 10]: 09087bfdf5ba3af2 +Block 0027 [ 11]: de613c261f43a1ad +Block 0027 [ 12]: dd194937c3e7c7c7 +Block 0027 [ 13]: a354a8be75a53c84 +Block 0027 [ 14]: 58e61315e8799749 +Block 0027 [ 15]: 3790f1889691087d +Block 0027 [ 16]: 9c109cbb13bd0946 +Block 0027 [ 17]: 69d2a3cb24d725da +Block 0027 [ 18]: 66edb597ec53292d +Block 0027 [ 19]: a9be38befecc0584 +Block 0027 [ 20]: 96d0731c9f242696 +Block 0027 [ 21]: e3ba1585a32dce68 +Block 0027 [ 22]: 5a0484ed5038971b +Block 0027 [ 23]: 78bcdb43bf93d164 +Block 0027 [ 24]: 744576d9c3c30082 +Block 0027 [ 25]: 64f778f3189c1cff +Block 0027 [ 26]: f8eb15da12c637e1 +Block 0027 [ 27]: fcbebcbe50a21695 +Block 0027 [ 28]: 970e19c4f0521beb +Block 0027 [ 29]: bb5af6ec3a7ed2d1 +Block 0027 [ 30]: 096904e407e41cb7 +Block 0027 [ 31]: 796ef5112b7a1edd +Block 0027 [ 32]: db1a153e66ae58ea +Block 0027 [ 33]: b1f77c17cee5e733 +Block 0027 [ 34]: 20285245122afb59 +Block 0027 [ 35]: 4df42e52389d2aff +Block 0027 [ 36]: 201f9602a2014992 +Block 0027 [ 37]: 65f0cf04f5981313 +Block 0027 [ 38]: 0943da03f0840c17 +Block 0027 [ 39]: 2eced3376b8d7e95 +Block 0027 [ 40]: 5d2c25c04a6527e3 +Block 0027 [ 41]: 9d8e3bb1b210e5b4 +Block 0027 [ 42]: 1d552706ac628676 +Block 0027 [ 43]: d24b7fbd453c47b9 +Block 0027 [ 44]: 94a3efedba376d46 +Block 0027 [ 45]: c6cfaf61c5738603 +Block 0027 [ 46]: 6dc7dd999626802f +Block 0027 [ 47]: 679a0a330366aa5f +Block 0027 [ 48]: a588a97355f0b410 +Block 0027 [ 49]: a53c8e0722c1f2a3 +Block 0027 [ 50]: 5aaee7d200469b7b +Block 0027 [ 51]: 3aed0d73099c2bbb +Block 0027 [ 52]: 78b7a36c5ca25608 +Block 0027 [ 53]: e6b432160dcce680 +Block 0027 [ 54]: 1ba1aeff2677be69 +Block 0027 [ 55]: 3a73d1cbafe00bee +Block 0027 [ 56]: 44847a38e4ef1636 +Block 0027 [ 57]: 817c2c94824200ef +Block 0027 [ 58]: 028f8e5775dfaed1 +Block 0027 [ 59]: 0cbc774a55ab5843 +Block 0027 [ 60]: aeb5aacf73e0eb39 +Block 0027 [ 61]: 0b8433622bea4382 +Block 0027 [ 62]: 79769c5b649f1261 +Block 0027 [ 63]: 0c829d21a3e179b1 +Block 0027 [ 64]: 813f3231bba22a33 +Block 0027 [ 65]: a2416e7899d6fe8a +Block 0027 [ 66]: b6e98b7cfa6bd74b +Block 0027 [ 67]: 41bc3948470a0b96 +Block 0027 [ 68]: 69ea8fd9e284aea6 +Block 0027 [ 69]: def3afe35abbe28b +Block 0027 [ 70]: b68ea4c646fb6573 +Block 0027 [ 71]: 4fa9b31650260ae6 +Block 0027 [ 72]: 7e01fc0f2a7429d6 +Block 0027 [ 73]: 627b93dbd343caeb +Block 0027 [ 74]: f3eeae8deb82e242 +Block 0027 [ 75]: 1e851591772c1bb5 +Block 0027 [ 76]: 3c2e59c09ef5b878 +Block 0027 [ 77]: ad49c7f75f437548 +Block 0027 [ 78]: 46f34b1e7a607915 +Block 0027 [ 79]: aacf30a2e549bb4a +Block 0027 [ 80]: 5a19914c8fff5e96 +Block 0027 [ 81]: f415490e00fb30b9 +Block 0027 [ 82]: 9846376d7adcf814 +Block 0027 [ 83]: 78bbe891c9abfe1d +Block 0027 [ 84]: 7c4a0979fea67b38 +Block 0027 [ 85]: 59e586690f942554 +Block 0027 [ 86]: 0acca76f34a6d794 +Block 0027 [ 87]: 2f7b55cb6fe9390f +Block 0027 [ 88]: 7635a592209d0a11 +Block 0027 [ 89]: 7e83394274d76e07 +Block 0027 [ 90]: 6a7dc7b77fcd9ee7 +Block 0027 [ 91]: 2b97fb8c36950a71 +Block 0027 [ 92]: 1fd5a884ef569a60 +Block 0027 [ 93]: e910b6544d71b381 +Block 0027 [ 94]: de5c857dd603fd6a +Block 0027 [ 95]: 5417634f369d5986 +Block 0027 [ 96]: ba1ae13eb3352d9f +Block 0027 [ 97]: 402e1be1915906fa +Block 0027 [ 98]: 3e45c339df96d224 +Block 0027 [ 99]: a2a0c19bc60f28e2 +Block 0027 [100]: 14b5aa263f6b02ac +Block 0027 [101]: 455b8ce5effd82f1 +Block 0027 [102]: f9067ed819bfe040 +Block 0027 [103]: 34ee1496df2e9258 +Block 0027 [104]: 85132137bfd83071 +Block 0027 [105]: 274902202877e214 +Block 0027 [106]: 4df3027bdf10659e +Block 0027 [107]: 50e85dae17476d58 +Block 0027 [108]: ebd15a07c578a603 +Block 0027 [109]: 73539de46fd213d6 +Block 0027 [110]: aabf6dcb01dc066a +Block 0027 [111]: a742de72f634eecb +Block 0027 [112]: bd3e9d53c38cccbc +Block 0027 [113]: 0c6aee347a62283a +Block 0027 [114]: e8218a191cdfeba3 +Block 0027 [115]: 850cfae86fd4a736 +Block 0027 [116]: 2e9647c876dcf630 +Block 0027 [117]: 786b0a5bf8f8ed00 +Block 0027 [118]: 7d52cebe4d24c525 +Block 0027 [119]: 8dbd8532181f83a0 +Block 0027 [120]: e2003436c78933f2 +Block 0027 [121]: 6196d5c9274650f8 +Block 0027 [122]: 50e0015a9708e2c2 +Block 0027 [123]: 0df7db3f56521de7 +Block 0027 [124]: 41c4e4d30977c324 +Block 0027 [125]: fe90ec673b2a3ed5 +Block 0027 [126]: 8b894913484a96cd +Block 0027 [127]: b3ce79c030832f8b +Block 0028 [ 0]: 8001ef270631eb46 +Block 0028 [ 1]: 83416ab52ade6a20 +Block 0028 [ 2]: 2c2c2d8a6e19d701 +Block 0028 [ 3]: d8876e22d1e005e7 +Block 0028 [ 4]: 39ec3701311b6f21 +Block 0028 [ 5]: e27d91be0b0f01ea +Block 0028 [ 6]: 3a468a9921bd57d6 +Block 0028 [ 7]: e979f5210101a334 +Block 0028 [ 8]: 0fe50b2f6002dd2f +Block 0028 [ 9]: e93dccdb8c30683f +Block 0028 [ 10]: a39f7bb93d2527d7 +Block 0028 [ 11]: 43131f328e9f3257 +Block 0028 [ 12]: 3916bad309c754f5 +Block 0028 [ 13]: 01f6c6295e8f726a +Block 0028 [ 14]: 2980801f3d4d3c54 +Block 0028 [ 15]: a901be2b20bca6d9 +Block 0028 [ 16]: bd35a7f931c1bded +Block 0028 [ 17]: 27409429f88c477b +Block 0028 [ 18]: 8036cce294e86513 +Block 0028 [ 19]: 857a2229c5afedf8 +Block 0028 [ 20]: d3373ab3af5873a8 +Block 0028 [ 21]: 4066441cd77d44ed +Block 0028 [ 22]: 48f2ef97141ddf21 +Block 0028 [ 23]: 476609786badb439 +Block 0028 [ 24]: 98fe66b30b5fa4bf +Block 0028 [ 25]: 14ec3f588d97430d +Block 0028 [ 26]: 6067ae97295f88a2 +Block 0028 [ 27]: 7472170c692fec72 +Block 0028 [ 28]: abca04dcc1646c6a +Block 0028 [ 29]: 593abb9ad2fb4754 +Block 0028 [ 30]: d383c2cec2319674 +Block 0028 [ 31]: 383d630e75d111ce +Block 0028 [ 32]: aade349d6aa54022 +Block 0028 [ 33]: 6a005af570ce8a1d +Block 0028 [ 34]: f7b1a835dca0178f +Block 0028 [ 35]: 87fcdd328f68b675 +Block 0028 [ 36]: 08caa798697afc12 +Block 0028 [ 37]: dbf8280ba26bfac4 +Block 0028 [ 38]: 87ebbcd95eb62676 +Block 0028 [ 39]: 0e3c59cd8c020fdb +Block 0028 [ 40]: 2df7176c8b1ab6fd +Block 0028 [ 41]: 575bad97b70c3e66 +Block 0028 [ 42]: 323c319d2d524b44 +Block 0028 [ 43]: 368bb20d0637def3 +Block 0028 [ 44]: c4638388f45266ee +Block 0028 [ 45]: 3e437f36851a630c +Block 0028 [ 46]: 2779419dd62bdc82 +Block 0028 [ 47]: 6b8ad3cd205e4ad0 +Block 0028 [ 48]: a90e6cad3c5c2b0a +Block 0028 [ 49]: f8ae347a60d74f84 +Block 0028 [ 50]: c6c0926217b23c45 +Block 0028 [ 51]: fff3fa7d093cbb84 +Block 0028 [ 52]: 70fafbbdcb4a7ac9 +Block 0028 [ 53]: 8ab582b972cb8700 +Block 0028 [ 54]: e1fe38cfe02a0b27 +Block 0028 [ 55]: 6861f64be54a0dfc +Block 0028 [ 56]: 8e888789a129f02f +Block 0028 [ 57]: f46cd73182cd385f +Block 0028 [ 58]: e88c0c118ad7b6f3 +Block 0028 [ 59]: ca6a2cadf443f63e +Block 0028 [ 60]: 1bd7984c082c1ef6 +Block 0028 [ 61]: 49b2cc8e2d76a30f +Block 0028 [ 62]: 4eeaba2f6a5802b3 +Block 0028 [ 63]: 0c8cd49bc7463e4b +Block 0028 [ 64]: 8e97970259c37934 +Block 0028 [ 65]: 5b51d47446ba7d59 +Block 0028 [ 66]: 209bd2bfbad9f3a5 +Block 0028 [ 67]: 4933bc3073cce49a +Block 0028 [ 68]: 499abb45745240c9 +Block 0028 [ 69]: 686dec33783f389f +Block 0028 [ 70]: db53075850fa6621 +Block 0028 [ 71]: 8e2e332d929ac8fe +Block 0028 [ 72]: 12188a5b7a3191fd +Block 0028 [ 73]: b5224394b27de504 +Block 0028 [ 74]: 0a4637a76f5ceddc +Block 0028 [ 75]: 2512376fe7ac236d +Block 0028 [ 76]: d0409eee03676e53 +Block 0028 [ 77]: cf10ff014ec1119e +Block 0028 [ 78]: 8b31f8267b762c34 +Block 0028 [ 79]: c746da7b7446448f +Block 0028 [ 80]: ce5afecb66c7ea9a +Block 0028 [ 81]: dc50af46efdce716 +Block 0028 [ 82]: 8ef9fe564ce372bf +Block 0028 [ 83]: 9386004b96f3d07b +Block 0028 [ 84]: 931edb230d806873 +Block 0028 [ 85]: 463972892751ca7c +Block 0028 [ 86]: ea39b6b40936d859 +Block 0028 [ 87]: 5c58eb39f0c08539 +Block 0028 [ 88]: 6610cc54cd07c0c9 +Block 0028 [ 89]: e4c0ce16afd786cd +Block 0028 [ 90]: e25114fbc70f82ad +Block 0028 [ 91]: 6e47602eed12ae23 +Block 0028 [ 92]: 025c64b56a765d41 +Block 0028 [ 93]: 3dffc43a35be1657 +Block 0028 [ 94]: f9b04b0c7094b53d +Block 0028 [ 95]: 4389da938709bc9d +Block 0028 [ 96]: 4f946796bde00fdb +Block 0028 [ 97]: cd435c40d8746458 +Block 0028 [ 98]: 9a70f9e6a7d23334 +Block 0028 [ 99]: 7fe9132e580b2145 +Block 0028 [100]: e05b3c6c2eb2e055 +Block 0028 [101]: f230bd45be19ed50 +Block 0028 [102]: 98a17f9086217896 +Block 0028 [103]: 5a19b54398eb0f1e +Block 0028 [104]: 81805b218b4d7acc +Block 0028 [105]: 53cc0888db15d952 +Block 0028 [106]: 0a455db0253eeab5 +Block 0028 [107]: 427b99b3709a9278 +Block 0028 [108]: 309f67cf226c6dad +Block 0028 [109]: 04cc7e2268c9f8cb +Block 0028 [110]: b50cdbe6cd24ebd0 +Block 0028 [111]: 3b6ec1744022ce3a +Block 0028 [112]: 1c7bde9e2444594b +Block 0028 [113]: 8d2fdda47d1280df +Block 0028 [114]: dd593b7ef7cbc160 +Block 0028 [115]: 603425f28180ce0a +Block 0028 [116]: 36de44b577684c20 +Block 0028 [117]: b6e6174afd7cb6f0 +Block 0028 [118]: 26c361be1a85382b +Block 0028 [119]: 52093e7af6fb04c3 +Block 0028 [120]: 6b7bad5bdedbb60e +Block 0028 [121]: e01bcc7c7bc736b6 +Block 0028 [122]: cc0df433cf949b9c +Block 0028 [123]: 6ce89651fe24f50b +Block 0028 [124]: 2f65d14ec85d1d2f +Block 0028 [125]: f03036c3706caa76 +Block 0028 [126]: 468d03ccf8153f05 +Block 0028 [127]: 967dbda43084d3f3 +Block 0029 [ 0]: f7658b7617623350 +Block 0029 [ 1]: e03903fb99c2f364 +Block 0029 [ 2]: fa5e598d449bc7c1 +Block 0029 [ 3]: 64440941ca0286d0 +Block 0029 [ 4]: c4f04649929e715a +Block 0029 [ 5]: fc8b4e25df9a43a4 +Block 0029 [ 6]: 53aa104be4478ec1 +Block 0029 [ 7]: 18e8a7702998cfed +Block 0029 [ 8]: c38282b83a2bbf8d +Block 0029 [ 9]: d224c762f65e99f9 +Block 0029 [ 10]: 0182e8439fd508d9 +Block 0029 [ 11]: 55012ed0e1ddba0d +Block 0029 [ 12]: e788c80f0597f6c3 +Block 0029 [ 13]: 37da30953d61166d +Block 0029 [ 14]: 6a961813a7033b89 +Block 0029 [ 15]: 3c62e34b3e27b1c1 +Block 0029 [ 16]: e46a91515a994a98 +Block 0029 [ 17]: f3015c41b62f357a +Block 0029 [ 18]: ffc74dd046d74be8 +Block 0029 [ 19]: 0e58a388145cd6b2 +Block 0029 [ 20]: c25f2be79b76308b +Block 0029 [ 21]: b94035810d2020cb +Block 0029 [ 22]: e0f3d82a929ce754 +Block 0029 [ 23]: cde9659f5fce847e +Block 0029 [ 24]: 9e139ca8f03b3023 +Block 0029 [ 25]: 2eabec9e991c81e1 +Block 0029 [ 26]: 441ac0c3033ab565 +Block 0029 [ 27]: 31f7a287c5388a1f +Block 0029 [ 28]: 960a2014148ec008 +Block 0029 [ 29]: 512481b4ac76ea85 +Block 0029 [ 30]: 41e4e64d8adf69e9 +Block 0029 [ 31]: b73914f0091513d9 +Block 0029 [ 32]: 0b6b5f496c1cf4bb +Block 0029 [ 33]: de5f6aedafd3bd92 +Block 0029 [ 34]: c6d64010bf68ea8a +Block 0029 [ 35]: 0cc383a9e718ebd4 +Block 0029 [ 36]: 37c23e0c7722b7e6 +Block 0029 [ 37]: e5a48c2204d0b7a6 +Block 0029 [ 38]: cb05f8b51984a566 +Block 0029 [ 39]: b8c601d4357892cd +Block 0029 [ 40]: cc9cf4d83353f878 +Block 0029 [ 41]: 382e5b2d1692bc06 +Block 0029 [ 42]: c539774a206fce40 +Block 0029 [ 43]: 11f48ac74223311d +Block 0029 [ 44]: afe26e5a3fd54c79 +Block 0029 [ 45]: d3ae9fef26be1b6c +Block 0029 [ 46]: 541f3624089b54f8 +Block 0029 [ 47]: e04c07c4f89494c8 +Block 0029 [ 48]: 50be2647fea6aa3e +Block 0029 [ 49]: 100db5b5428a6916 +Block 0029 [ 50]: 32128747f3ea25cd +Block 0029 [ 51]: fff567fd0fb38972 +Block 0029 [ 52]: 0ac0a01a5357027e +Block 0029 [ 53]: 2b3c731c47903254 +Block 0029 [ 54]: fb73b7724da0a212 +Block 0029 [ 55]: cf83d5083f766a27 +Block 0029 [ 56]: 76ba8624d21308cc +Block 0029 [ 57]: fda64090fdaebdc7 +Block 0029 [ 58]: ce1db32a30eebabc +Block 0029 [ 59]: 554ad2d4f7b1a909 +Block 0029 [ 60]: 628bfb79f526d389 +Block 0029 [ 61]: fc722985e7ee67f8 +Block 0029 [ 62]: d04c65e8e57a99fe +Block 0029 [ 63]: a3196755e7f7c584 +Block 0029 [ 64]: cd330610beee5fe6 +Block 0029 [ 65]: f155296fc87aa152 +Block 0029 [ 66]: 44785555beba5f04 +Block 0029 [ 67]: f21d20529e52bc15 +Block 0029 [ 68]: 26bf65ef544e8ae8 +Block 0029 [ 69]: b0a20d786ec319dd +Block 0029 [ 70]: 87b001a1ddbc6ce4 +Block 0029 [ 71]: 6d86f2cfcbee56f8 +Block 0029 [ 72]: 9546ff8a0cf7f664 +Block 0029 [ 73]: 742e0cba36127004 +Block 0029 [ 74]: 68d8c05fd335d672 +Block 0029 [ 75]: 36859f6866bbc4ef +Block 0029 [ 76]: 04e86efcfc6155e8 +Block 0029 [ 77]: f0f74fcc82eaae4c +Block 0029 [ 78]: d5fbc145a2038e9b +Block 0029 [ 79]: c97dd73bdef94d85 +Block 0029 [ 80]: 46641a0d5e74d7cf +Block 0029 [ 81]: ef0685b5097b5e67 +Block 0029 [ 82]: 1d5fd9ee302a79b0 +Block 0029 [ 83]: cd863c3f6985ab13 +Block 0029 [ 84]: 4ca7738aeebb1b3d +Block 0029 [ 85]: 1ba380e7f9c6d41a +Block 0029 [ 86]: 053be3f43d0815d0 +Block 0029 [ 87]: 4531b35560fa4649 +Block 0029 [ 88]: 71170fcb9f881969 +Block 0029 [ 89]: 1d6539470e53caba +Block 0029 [ 90]: c811cd3a099745dd +Block 0029 [ 91]: d24e5a4cab1f6097 +Block 0029 [ 92]: bf49c3c36ce953e7 +Block 0029 [ 93]: 7ec2b167b48bb25c +Block 0029 [ 94]: 7f8f22149ea593c1 +Block 0029 [ 95]: 41045c4656526da0 +Block 0029 [ 96]: 0a62016ef6fe2d6f +Block 0029 [ 97]: dcc506a2314d1ab6 +Block 0029 [ 98]: 84fd724119b1778e +Block 0029 [ 99]: 6c7d5b3b446a1fd1 +Block 0029 [100]: 9b0f033862438e18 +Block 0029 [101]: 978b0aaed61203a4 +Block 0029 [102]: 218befc3d5b5aefb +Block 0029 [103]: 450431d34382b3a3 +Block 0029 [104]: 3e2d2c92065cd146 +Block 0029 [105]: 3c7e61ae4a8f0279 +Block 0029 [106]: d051b0de2d324355 +Block 0029 [107]: d7644e4a6b72da80 +Block 0029 [108]: 91133f252f076c21 +Block 0029 [109]: 173e52b3d1ab5ba8 +Block 0029 [110]: c86e504f324de992 +Block 0029 [111]: 4ddf966c7242fed3 +Block 0029 [112]: 18a29093e7e2bb3a +Block 0029 [113]: 36dafe385f2c2b10 +Block 0029 [114]: 2b6fe7ef1813672d +Block 0029 [115]: 9939a4bf68bba9d8 +Block 0029 [116]: 0adab70daef4deed +Block 0029 [117]: 5a735581b8a18158 +Block 0029 [118]: f6f3c9bc7ad697dd +Block 0029 [119]: a4deeac9deecda6e +Block 0029 [120]: 72d888dd86ec2222 +Block 0029 [121]: 81014cfe6416656b +Block 0029 [122]: 3ad075b693516c76 +Block 0029 [123]: 7ddd2aa89adb05be +Block 0029 [124]: 5ca65be828845c91 +Block 0029 [125]: 86117ec0186de07f +Block 0029 [126]: cafa675111211ca4 +Block 0029 [127]: 4a92b1c01c991dc7 +Block 0030 [ 0]: 3a4e77baaceeda4f +Block 0030 [ 1]: 7a9ee225ee9d9639 +Block 0030 [ 2]: be87707cf63597d6 +Block 0030 [ 3]: 4cc45af01e0c3d38 +Block 0030 [ 4]: 61eb5cb37a5db980 +Block 0030 [ 5]: a21053715936dbd4 +Block 0030 [ 6]: 2e2a60f4b776a427 +Block 0030 [ 7]: c3160614bf7b6e67 +Block 0030 [ 8]: 2c09de08c8702cd2 +Block 0030 [ 9]: 42075967917bfa70 +Block 0030 [ 10]: c3a601e6c4af7352 +Block 0030 [ 11]: 7da95db7a912839a +Block 0030 [ 12]: 7b91b6daf74df3d1 +Block 0030 [ 13]: 7e68f0c963c11656 +Block 0030 [ 14]: 292bf228471ea592 +Block 0030 [ 15]: 28297197c4237221 +Block 0030 [ 16]: c011080c1138e15b +Block 0030 [ 17]: 649689340374f6b2 +Block 0030 [ 18]: 22c4f943de3c6691 +Block 0030 [ 19]: 13dcc60a6e166690 +Block 0030 [ 20]: fa7b5a54f3fcd738 +Block 0030 [ 21]: 6795de2cac74fd73 +Block 0030 [ 22]: 970f60d8918882aa +Block 0030 [ 23]: ac1f731a31df5499 +Block 0030 [ 24]: 13e34af1c65e7b29 +Block 0030 [ 25]: 4bb39dae73b770f4 +Block 0030 [ 26]: e0df37aabf0a24f6 +Block 0030 [ 27]: 6353983bf4cfaf43 +Block 0030 [ 28]: 86149b53a770fdcb +Block 0030 [ 29]: 0a8047c119b1ea18 +Block 0030 [ 30]: ec84dee6813b98c1 +Block 0030 [ 31]: 68d4b8e0ccd7b622 +Block 0030 [ 32]: 4f5636008654d419 +Block 0030 [ 33]: eda05631c9161315 +Block 0030 [ 34]: eebb69dc293f8497 +Block 0030 [ 35]: 22c93868ebc40dce +Block 0030 [ 36]: c8b4d47f3480051e +Block 0030 [ 37]: 3e12b38ee5dac831 +Block 0030 [ 38]: 1c0c6618fd0b1a03 +Block 0030 [ 39]: edf8afbbdc630d8f +Block 0030 [ 40]: 74db17078f3381b5 +Block 0030 [ 41]: 1f3ef7f652def5d1 +Block 0030 [ 42]: 823081fa577de1cb +Block 0030 [ 43]: bab3df9f63e2474a +Block 0030 [ 44]: 5f8943ad9630ce55 +Block 0030 [ 45]: 49986b0a5fd83bb7 +Block 0030 [ 46]: 5a5d0b2f0fc4f2fa +Block 0030 [ 47]: ff63d169f9b3ee72 +Block 0030 [ 48]: d375bb8f1fbdddd6 +Block 0030 [ 49]: 52c165386bb256e3 +Block 0030 [ 50]: 1a925b2d08860b41 +Block 0030 [ 51]: 2a7211d563ae55a0 +Block 0030 [ 52]: 944d8a32a0f620cf +Block 0030 [ 53]: c221ab1dfc88b935 +Block 0030 [ 54]: 167bbd3c0073900c +Block 0030 [ 55]: 0db633dc8f2c1fd7 +Block 0030 [ 56]: f3c9215754dd8f0c +Block 0030 [ 57]: d104919d3adcc42b +Block 0030 [ 58]: c3d815aa1b927c67 +Block 0030 [ 59]: d91f5b17a46bb7fd +Block 0030 [ 60]: 6d1d86a418781821 +Block 0030 [ 61]: 3f0960ab45883d83 +Block 0030 [ 62]: ffb4730d3ec55144 +Block 0030 [ 63]: b127ee8cb7bf977b +Block 0030 [ 64]: c6838a7e889e1588 +Block 0030 [ 65]: 7ffedaf44973699a +Block 0030 [ 66]: 008ff4b9472cf2dc +Block 0030 [ 67]: 2c2e9d5ed75d138f +Block 0030 [ 68]: 329c478d8bfc8eab +Block 0030 [ 69]: a4b5d417ca5cad57 +Block 0030 [ 70]: 757f87821b6cc4ac +Block 0030 [ 71]: b82ba42df02d75f0 +Block 0030 [ 72]: c887e666f40bc6bb +Block 0030 [ 73]: ae6e53a5c3048169 +Block 0030 [ 74]: 4d296c09642f6d91 +Block 0030 [ 75]: 4fd264c1d18f900a +Block 0030 [ 76]: 1c15dc236ad7d489 +Block 0030 [ 77]: 57c630419d7fa503 +Block 0030 [ 78]: a5ec2b38561864cf +Block 0030 [ 79]: 51056353bcccaaea +Block 0030 [ 80]: da73a3459a97b928 +Block 0030 [ 81]: bd3279d2117f0962 +Block 0030 [ 82]: 42fc1367b4296b8b +Block 0030 [ 83]: 4de989cf50579856 +Block 0030 [ 84]: 9c11f82833791e40 +Block 0030 [ 85]: 6be709cb596edf6c +Block 0030 [ 86]: fb68b38c53e92279 +Block 0030 [ 87]: 68f1a49c0cb2311c +Block 0030 [ 88]: 50a4612fd938d89e +Block 0030 [ 89]: d58eee675fa3a41f +Block 0030 [ 90]: 870ed05ee6350067 +Block 0030 [ 91]: 8c53bd46aba7beec +Block 0030 [ 92]: e546cea63e89529c +Block 0030 [ 93]: 85bb7096cc9b51e2 +Block 0030 [ 94]: 9b151d482e5f737f +Block 0030 [ 95]: 3e02ee4e48d40847 +Block 0030 [ 96]: 143794b3b806c105 +Block 0030 [ 97]: 740138578a4412e3 +Block 0030 [ 98]: d6e1430d236fbd8d +Block 0030 [ 99]: c93ff2afac930718 +Block 0030 [100]: 0ee3fc474f99b65c +Block 0030 [101]: 7bc02766f6986262 +Block 0030 [102]: bc4687933c275a94 +Block 0030 [103]: e2ec1bc66998dfcd +Block 0030 [104]: 0f3137a4c7c39136 +Block 0030 [105]: 6640cc5a47acc8da +Block 0030 [106]: e2e2b4ddd0b254e1 +Block 0030 [107]: 2851fdb6ecbb9717 +Block 0030 [108]: 3bfdbefaee7b1d3b +Block 0030 [109]: 0b20c582f9b86a9a +Block 0030 [110]: dc058e810c81fc5f +Block 0030 [111]: dc1ad509e96d5af4 +Block 0030 [112]: ea2b48353d92a0c8 +Block 0030 [113]: 4f0fbd9411f1aefe +Block 0030 [114]: df2ee5a34ef9892b +Block 0030 [115]: 88d91adc176ece1b +Block 0030 [116]: e493018de47fbbf3 +Block 0030 [117]: 0bc0d0efc7465b23 +Block 0030 [118]: 616c33128632676c +Block 0030 [119]: 3c17e6a96769a2dc +Block 0030 [120]: 2eb32b1f6f7ee404 +Block 0030 [121]: 3b9bd65bcf653b07 +Block 0030 [122]: a23aec57c56882ec +Block 0030 [123]: 805e394d2b515733 +Block 0030 [124]: 3445d77be8923ddf +Block 0030 [125]: 20d3726bef9ac7b4 +Block 0030 [126]: 8f781753caa7d491 +Block 0030 [127]: 6b0ec3c5e1d47486 +Block 0031 [ 0]: 8306f7c967b395c3 +Block 0031 [ 1]: ffbda0ec347706b6 +Block 0031 [ 2]: 6b538b8f54fde01d +Block 0031 [ 3]: 92cddba06a854e63 +Block 0031 [ 4]: e99652ed7a685653 +Block 0031 [ 5]: 06285bf3d2c84177 +Block 0031 [ 6]: 4fd4db438b0a25c6 +Block 0031 [ 7]: 3d593b9d18304741 +Block 0031 [ 8]: e2a49f385a3ec381 +Block 0031 [ 9]: 9ea8d9ec4a6ebacf +Block 0031 [ 10]: b0013cf98afbadbf +Block 0031 [ 11]: dbdcc22dac267551 +Block 0031 [ 12]: 379d1119cb488e8a +Block 0031 [ 13]: 67c4a226cae340d2 +Block 0031 [ 14]: 61bb2a63fbf188d4 +Block 0031 [ 15]: 0f817bb25ea1b0a4 +Block 0031 [ 16]: 0f94ca725ccccba3 +Block 0031 [ 17]: a632e0f21c8f58b8 +Block 0031 [ 18]: 1d79a5e778c40ab6 +Block 0031 [ 19]: 79e3dc533eebfc58 +Block 0031 [ 20]: 1a2a047311c1b025 +Block 0031 [ 21]: 73489e4eedbaec14 +Block 0031 [ 22]: 318ba718b36de770 +Block 0031 [ 23]: 2ccaebfbe880e7ee +Block 0031 [ 24]: aa65a3cf94a7cc82 +Block 0031 [ 25]: 96f862a3645089a4 +Block 0031 [ 26]: 45456f474da39292 +Block 0031 [ 27]: 293b382f5b70f9d4 +Block 0031 [ 28]: 6837e6047dc46312 +Block 0031 [ 29]: 5f0491803d570380 +Block 0031 [ 30]: 77d19869608ac4f1 +Block 0031 [ 31]: d7f936ed6a30c940 +Block 0031 [ 32]: 2c94e8b715017145 +Block 0031 [ 33]: 3db8ea9151bf639e +Block 0031 [ 34]: 04d98fc999448e08 +Block 0031 [ 35]: 1e30799273f79847 +Block 0031 [ 36]: ed4a299ddef0824c +Block 0031 [ 37]: 53059a92df99a968 +Block 0031 [ 38]: 6317980fda9bd7ac +Block 0031 [ 39]: 531c258c22b37111 +Block 0031 [ 40]: 3e144cb617d753e5 +Block 0031 [ 41]: 0ad1b6cc800fad97 +Block 0031 [ 42]: 485de075ce354cf7 +Block 0031 [ 43]: 3e939cbdcbe8d38b +Block 0031 [ 44]: 0997fe08f57f0688 +Block 0031 [ 45]: 0c29cbb8ff0520a0 +Block 0031 [ 46]: 9013fa5da1f9d57e +Block 0031 [ 47]: 36eb3989037992db +Block 0031 [ 48]: d28c2374d860cc20 +Block 0031 [ 49]: 79cc56225c2ebc97 +Block 0031 [ 50]: 80ee579977e66ce9 +Block 0031 [ 51]: ef37303706d4c739 +Block 0031 [ 52]: c12bb9458ec378b3 +Block 0031 [ 53]: ab8b1475ca99dee1 +Block 0031 [ 54]: e01ccdb1c01665f5 +Block 0031 [ 55]: e9103674ac072d8e +Block 0031 [ 56]: 1bd24ece78517070 +Block 0031 [ 57]: 44438d3d8f2a34ac +Block 0031 [ 58]: 5a662ad1c9bb32ad +Block 0031 [ 59]: 60ea59c0ec8b19fb +Block 0031 [ 60]: ed360f0271f6e226 +Block 0031 [ 61]: ff6fe136d8939f79 +Block 0031 [ 62]: 3aae328e3bcf3077 +Block 0031 [ 63]: 7a1009c1813ebb07 +Block 0031 [ 64]: f7fa7ff6b5cff9dc +Block 0031 [ 65]: 6aafbdc262751941 +Block 0031 [ 66]: 318323a996e7a435 +Block 0031 [ 67]: daaba3ad743cbb49 +Block 0031 [ 68]: a0993c7c36cbbf10 +Block 0031 [ 69]: 263840e836b8c805 +Block 0031 [ 70]: 8bedb868059ad2e8 +Block 0031 [ 71]: 61a1155c5a5a0d77 +Block 0031 [ 72]: 7ed07df38823f7d6 +Block 0031 [ 73]: deaf2fe38de9a9b1 +Block 0031 [ 74]: 13c1471961aa3032 +Block 0031 [ 75]: 865379c27a3afe33 +Block 0031 [ 76]: 10f2c731e3471ff8 +Block 0031 [ 77]: d11ec955b352ea34 +Block 0031 [ 78]: 1bae54b12af0ee66 +Block 0031 [ 79]: 6d2191bc118b5106 +Block 0031 [ 80]: 2ca4a296fae792c1 +Block 0031 [ 81]: ba0a2f5e9545eb65 +Block 0031 [ 82]: b02a49851af4f76f +Block 0031 [ 83]: c214f20bac978c16 +Block 0031 [ 84]: 811c3e9926388f27 +Block 0031 [ 85]: a211b6e9a6d66463 +Block 0031 [ 86]: 01e5b225c481858a +Block 0031 [ 87]: 39d92f1aec39be76 +Block 0031 [ 88]: 79c9f3ee5bbd64c8 +Block 0031 [ 89]: a451d0ee456f1ad7 +Block 0031 [ 90]: f210d043b918cc7e +Block 0031 [ 91]: fd385af25e8eb5d4 +Block 0031 [ 92]: 4c1297afd1f15d9b +Block 0031 [ 93]: 31c395a3a375c5b7 +Block 0031 [ 94]: 34a9b2385663c299 +Block 0031 [ 95]: 3d99bcd6d489beeb +Block 0031 [ 96]: a6e71b785c66ae8d +Block 0031 [ 97]: 601e41b8f3311735 +Block 0031 [ 98]: b95597e39654bb80 +Block 0031 [ 99]: 2ba68c443b1388cd +Block 0031 [100]: c2eb6ec1890299d0 +Block 0031 [101]: 450921c9d7985bd0 +Block 0031 [102]: 51432dd07403de26 +Block 0031 [103]: e9c807d29d00abef +Block 0031 [104]: 69f4eac4ce9ece4f +Block 0031 [105]: e9e1977d0ec7b38f +Block 0031 [106]: 5ba243615e820eaa +Block 0031 [107]: 32f5d778185e5134 +Block 0031 [108]: 4052e09b2628a83e +Block 0031 [109]: cc8997055934d815 +Block 0031 [110]: 82037f7a6beef794 +Block 0031 [111]: 28943b7f1c12e2a3 +Block 0031 [112]: 23cccf5ec328d527 +Block 0031 [113]: 44d9465be2cf4352 +Block 0031 [114]: f7753906b77a4eed +Block 0031 [115]: 6aaf7384c73c1dc5 +Block 0031 [116]: 148aa0ed8ab6ee20 +Block 0031 [117]: f6b34a35560f84fe +Block 0031 [118]: 5958fa89d0ed311d +Block 0031 [119]: e229f574b84ba2d8 +Block 0031 [120]: 6e9a4188a3f6756a +Block 0031 [121]: ec28503a0854e61a +Block 0031 [122]: 57cd455e58f6f8b0 +Block 0031 [123]: 1a3541b15feb7f05 +Block 0031 [124]: 57cfb9d20479da49 +Block 0031 [125]: 4099654bc6607f69 +Block 0031 [126]: f142a1126075a5c8 +Block 0031 [127]: c341b3ca45c10da5 +Tag: 51 2b 39 1b 6f 11 62 97 53 71 d3 09 19 73 42 94 f8 68 e3 be 39 84 f3 c1 a1 3a 4d b9 fa be 4a cb diff --git a/deps/phc-winner-argon2-20190702/kats/argon2d.shasum b/deps/phc-winner-argon2-20190702/kats/argon2d.shasum new file mode 100644 index 000000000..b1b045d1b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2d.shasum @@ -0,0 +1 @@ +73619cfe0f35e52fdd1ca2595ffaa359879467407f98b61f4969c2861cc329ce argon2d diff --git a/deps/phc-winner-argon2-20190702/kats/argon2d_v16 b/deps/phc-winner-argon2-20190702/kats/argon2d_v16 new file mode 100644 index 000000000..d35bd4269 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2d_v16 @@ -0,0 +1,12304 @@ +======================================= +Argon2d version number 16 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: ec dc 26 dc 6b dd 21 56 19 68 97 aa 8c c9 a0 4c 03 ed 07 cd 12 92 67 c5 3c a6 ae f7 76 a4 30 89 6a 09 80 54 e4 de c3 e0 2e cd 82 c4 7f 56 2c a2 73 d2 f6 97 8a 5c 05 41 1a 0c d0 9d 47 7b 7b 06 + + After pass 0: +Block 0000 [ 0]: b0470f8400af9a3e +Block 0000 [ 1]: 73761d3efffb3c57 +Block 0000 [ 2]: 369f09e4da0c49b4 +Block 0000 [ 3]: f0ae6399a00bba82 +Block 0000 [ 4]: eee79cd2f0460d60 +Block 0000 [ 5]: 297b71501a8f338e +Block 0000 [ 6]: 9b61176d407909c3 +Block 0000 [ 7]: 66ff2a7fa45fae7e +Block 0000 [ 8]: c25d34462fb86e28 +Block 0000 [ 9]: 1722d2592c6d2ee9 +Block 0000 [ 10]: 4e53ae3da056ed0b +Block 0000 [ 11]: 07fe2bba6b66c178 +Block 0000 [ 12]: 5ec4cde6415931a2 +Block 0000 [ 13]: 35f1752594c09eb6 +Block 0000 [ 14]: 440d7f2b2fcfc0b2 +Block 0000 [ 15]: 9bd8f0a5b3ddedcc +Block 0000 [ 16]: 45577256f4ed31f1 +Block 0000 [ 17]: 722c5080dcb4b97a +Block 0000 [ 18]: e00041f0806886e4 +Block 0000 [ 19]: fe05098342a9d3fb +Block 0000 [ 20]: a8ab223d3d042e8b +Block 0000 [ 21]: 503fbc822817e86a +Block 0000 [ 22]: 05cc6a2089cc5d48 +Block 0000 [ 23]: eb3ada41307fc6ca +Block 0000 [ 24]: 83e52b2ff5b82787 +Block 0000 [ 25]: 310678685cead533 +Block 0000 [ 26]: 3a30a891a9347881 +Block 0000 [ 27]: 8a0bd25d5560dd7b +Block 0000 [ 28]: 263a1a16487c9dcd +Block 0000 [ 29]: 9b2c75e65c7aeb33 +Block 0000 [ 30]: 9a2d2e8e60a7ee9e +Block 0000 [ 31]: 18d5e488e8f929b2 +Block 0000 [ 32]: 53e264db9a04474f +Block 0000 [ 33]: c777f5c8fbc2b4c8 +Block 0000 [ 34]: 017246c703bdf7b0 +Block 0000 [ 35]: 30a5cbd790558b68 +Block 0000 [ 36]: 33a1b499675bcbeb +Block 0000 [ 37]: 23ddf458c2cb3da4 +Block 0000 [ 38]: 608a7b074a001e4a +Block 0000 [ 39]: 2f467b32c96b96bf +Block 0000 [ 40]: 7747313d71e791b2 +Block 0000 [ 41]: 485d66811d2f3814 +Block 0000 [ 42]: ba99a9bd1e43be30 +Block 0000 [ 43]: 53f0cd6ae19f0f0d +Block 0000 [ 44]: 59137981bd54937b +Block 0000 [ 45]: c5f473a3df6b9855 +Block 0000 [ 46]: 2ae6dcdbeaab3163 +Block 0000 [ 47]: a4fdb3388c42acc0 +Block 0000 [ 48]: 7bfab3c558e71ba4 +Block 0000 [ 49]: fca67432297d1cc4 +Block 0000 [ 50]: 57eced62c617b8ee +Block 0000 [ 51]: ead2fcf6b9865e75 +Block 0000 [ 52]: 1e0415b7d63186ae +Block 0000 [ 53]: 48ab90d7e3446023 +Block 0000 [ 54]: 6cb87870278b3f88 +Block 0000 [ 55]: 92d7d7605ae82850 +Block 0000 [ 56]: 2c00219bee6cace9 +Block 0000 [ 57]: 3986013bf8aa5be9 +Block 0000 [ 58]: 0f37c1ace5344089 +Block 0000 [ 59]: 398a91714ecd2c80 +Block 0000 [ 60]: 8adf42359d4c68aa +Block 0000 [ 61]: 1546fb42e3581df7 +Block 0000 [ 62]: f37a594c954bc404 +Block 0000 [ 63]: 2002d1097c0ce1c9 +Block 0000 [ 64]: 44d379e56798d98b +Block 0000 [ 65]: 8fd7eca2c1ba9bf1 +Block 0000 [ 66]: d7692a1ebae09a8f +Block 0000 [ 67]: 9dd054b950c447c2 +Block 0000 [ 68]: 8bd1f021f9e66f28 +Block 0000 [ 69]: 1abc5cab26fe2b45 +Block 0000 [ 70]: 9437187b1b2374f2 +Block 0000 [ 71]: 036fa42f4670a4cd +Block 0000 [ 72]: 3cda85705397c20c +Block 0000 [ 73]: 61d94f7670dc5745 +Block 0000 [ 74]: 48472cc130ec3dee +Block 0000 [ 75]: 7c375245b55f305e +Block 0000 [ 76]: 6630e68e114bdd1c +Block 0000 [ 77]: 79c8e7a1fd0b6d4e +Block 0000 [ 78]: f298c7419222a6a4 +Block 0000 [ 79]: f4659ba158b5934f +Block 0000 [ 80]: 972162604d305712 +Block 0000 [ 81]: a35a2238c97be97a +Block 0000 [ 82]: 7e79114089c65562 +Block 0000 [ 83]: bb789be2751a1de1 +Block 0000 [ 84]: 8efbfadc522fcfdb +Block 0000 [ 85]: 780d4e1a6fd7c6b5 +Block 0000 [ 86]: 6b9cfe77e601e7eb +Block 0000 [ 87]: 4f5537e3a224f600 +Block 0000 [ 88]: c5dfbee166944e3b +Block 0000 [ 89]: f42877c75d6a7ef2 +Block 0000 [ 90]: a7d34acad6a5a97f +Block 0000 [ 91]: 50d4dd96e00368bd +Block 0000 [ 92]: 092272774f2216d5 +Block 0000 [ 93]: 0a635f82303e1c4f +Block 0000 [ 94]: 9b9d405490f6a720 +Block 0000 [ 95]: 586ae3294ed8c291 +Block 0000 [ 96]: 3003bbca0021b5b0 +Block 0000 [ 97]: 68669eba07ae39f4 +Block 0000 [ 98]: 01715b14a9d26ef1 +Block 0000 [ 99]: 283673720c02984d +Block 0000 [100]: 930f81c178e5cb14 +Block 0000 [101]: a0a5edb1f31eba1c +Block 0000 [102]: 7aaee5640b99640b +Block 0000 [103]: 2e99d18246f5f4d9 +Block 0000 [104]: 6ea36e6869f1ac2f +Block 0000 [105]: 3581f1d1a2b126d7 +Block 0000 [106]: 0c8a55beefe5d92f +Block 0000 [107]: c9025ffe0d55429e +Block 0000 [108]: e9c2d55dd56a1b49 +Block 0000 [109]: e1449008d709b955 +Block 0000 [110]: 9d83305392cd07fa +Block 0000 [111]: 9c67f71d0d966cd0 +Block 0000 [112]: 6ac22b04295d8c0a +Block 0000 [113]: 5883e67617dde560 +Block 0000 [114]: 0901b89c026d313f +Block 0000 [115]: 11558f2456435166 +Block 0000 [116]: 99cfd4734a726790 +Block 0000 [117]: 407a21fa4523dbcd +Block 0000 [118]: f484b24dd1f08c68 +Block 0000 [119]: 31cb0c527a35975d +Block 0000 [120]: 65a55c3e82335f9f +Block 0000 [121]: 2a6f20c9818beb78 +Block 0000 [122]: 2d46e2c60c8e9d03 +Block 0000 [123]: 010bf8d357d74314 +Block 0000 [124]: 9920b8105a72ca59 +Block 0000 [125]: 5ba81a39878a8d89 +Block 0000 [126]: 5536fb2357880f88 +Block 0000 [127]: 8d41d5c05bb02c76 +Block 0001 [ 0]: 7c4dea0e2d60f524 +Block 0001 [ 1]: aa2a00de14b18b07 +Block 0001 [ 2]: 21096c8af065b38f +Block 0001 [ 3]: 497933239d8a973a +Block 0001 [ 4]: a142a7f757f8fc7e +Block 0001 [ 5]: d40e8a8d9a21e249 +Block 0001 [ 6]: b1ec7f19913afc1f +Block 0001 [ 7]: a338cff2cc8bc4ac +Block 0001 [ 8]: aac0b85583bf7289 +Block 0001 [ 9]: 690d5a54662e6410 +Block 0001 [ 10]: ac468078f037f0d6 +Block 0001 [ 11]: 384841ffe93d19e5 +Block 0001 [ 12]: 720f69aeff671d51 +Block 0001 [ 13]: d198555d8468ae2b +Block 0001 [ 14]: 7ffeefca4c978232 +Block 0001 [ 15]: 3360f4dfdf6895b5 +Block 0001 [ 16]: db53bd1b7e54520a +Block 0001 [ 17]: ea9f149f6212a583 +Block 0001 [ 18]: 020b78f177d94965 +Block 0001 [ 19]: 8ce06021e66d0bf2 +Block 0001 [ 20]: 5466008802bef56e +Block 0001 [ 21]: d8a227d38b6f358c +Block 0001 [ 22]: 296734d9cfe0d11e +Block 0001 [ 23]: 3e2eeb4342eb2262 +Block 0001 [ 24]: 46a62cb525e796c1 +Block 0001 [ 25]: 1824b1bd628b2847 +Block 0001 [ 26]: cc813a25271149a9 +Block 0001 [ 27]: fb0fcbe1fca6e76a +Block 0001 [ 28]: f5efd2568201f4da +Block 0001 [ 29]: 905670995124373a +Block 0001 [ 30]: d7b0ba4c678a83cc +Block 0001 [ 31]: 1c3c260b14d880ab +Block 0001 [ 32]: 56efe59ab054f179 +Block 0001 [ 33]: c695b1e57cb7af58 +Block 0001 [ 34]: 97885a5f0d1674a2 +Block 0001 [ 35]: a629559911b65eef +Block 0001 [ 36]: c2f2e5fc0c03a7c0 +Block 0001 [ 37]: 2dee9f43d23c80b2 +Block 0001 [ 38]: 5f68bda41bfcfa3d +Block 0001 [ 39]: fc7855b664b3caf8 +Block 0001 [ 40]: 66e223e79d9624bf +Block 0001 [ 41]: bfcac21a1f58b978 +Block 0001 [ 42]: 373154530d4e9cfe +Block 0001 [ 43]: 42a83b6b5a95a8f9 +Block 0001 [ 44]: dec51468eec2db12 +Block 0001 [ 45]: 52ca0501bc82cc25 +Block 0001 [ 46]: d2aae011fe9ef8e7 +Block 0001 [ 47]: 16602dccb9ceb742 +Block 0001 [ 48]: 573651bd7f1e70e4 +Block 0001 [ 49]: 92ca272adcc5f65d +Block 0001 [ 50]: fe1f0568275b66fc +Block 0001 [ 51]: d961aa493d1530f1 +Block 0001 [ 52]: d7d276d4745ebfb7 +Block 0001 [ 53]: adacd9d6986d03e6 +Block 0001 [ 54]: e3c5674a50aa9abc +Block 0001 [ 55]: 0cf2efe898a18bf7 +Block 0001 [ 56]: 7797339171b236d2 +Block 0001 [ 57]: bbe52e123b2df8e0 +Block 0001 [ 58]: eb1b7fba9e7589aa +Block 0001 [ 59]: 840badae7501c2be +Block 0001 [ 60]: 06deeda1ce2988d7 +Block 0001 [ 61]: 140a8210912f6372 +Block 0001 [ 62]: bcce0defcfaf3ff0 +Block 0001 [ 63]: bd8bbe3a5b7357c5 +Block 0001 [ 64]: 49637a6af40bb8e3 +Block 0001 [ 65]: fd75ad0b367affa6 +Block 0001 [ 66]: 69add785f11074df +Block 0001 [ 67]: 8454b757336e64a5 +Block 0001 [ 68]: 386ab1f621ab6142 +Block 0001 [ 69]: c2cd42d349dce6b6 +Block 0001 [ 70]: e32969ca5db538b4 +Block 0001 [ 71]: 74480a0d6ac3bf3f +Block 0001 [ 72]: 571082cf3b01e4c5 +Block 0001 [ 73]: 6bb06bd9260dea72 +Block 0001 [ 74]: d15a6b862bc7a814 +Block 0001 [ 75]: 558c4bd2255f8037 +Block 0001 [ 76]: 64b6c7b26cab95ce +Block 0001 [ 77]: 9a09637d8a22fc29 +Block 0001 [ 78]: 3df548df02d4b16c +Block 0001 [ 79]: 829be92eb1e213d5 +Block 0001 [ 80]: e6738c64ece294c0 +Block 0001 [ 81]: 66462b0b89f83f59 +Block 0001 [ 82]: e5013615a05a323e +Block 0001 [ 83]: 7cdfc7bdba04a275 +Block 0001 [ 84]: d0b9783aa00824f8 +Block 0001 [ 85]: 0f7febc5cf63d48b +Block 0001 [ 86]: ac3b53f9b1e8fff0 +Block 0001 [ 87]: fb6f0353cc6266ed +Block 0001 [ 88]: 70389279c1af15da +Block 0001 [ 89]: 5feb883aa01dac56 +Block 0001 [ 90]: 62c86cb126dd7e0a +Block 0001 [ 91]: 77dc24689be31b73 +Block 0001 [ 92]: 7591fa8815fee297 +Block 0001 [ 93]: a31a34a642aeee28 +Block 0001 [ 94]: 3cd8b4e84083f0bc +Block 0001 [ 95]: 88d90cc76c011122 +Block 0001 [ 96]: fc5548d89ff93615 +Block 0001 [ 97]: 4d0c9885517a4d90 +Block 0001 [ 98]: 10c21d0b82cd815e +Block 0001 [ 99]: 36978c5f64e948da +Block 0001 [100]: 93d37e62eb63da10 +Block 0001 [101]: c2063e399f8e0681 +Block 0001 [102]: 9f3ad235b61e3d64 +Block 0001 [103]: d0b5897523f036ce +Block 0001 [104]: 3d4bc104da4058eb +Block 0001 [105]: cab22022accf99e7 +Block 0001 [106]: 0a196df3f344aff8 +Block 0001 [107]: 7f2b12300165aee0 +Block 0001 [108]: fd653635d914158b +Block 0001 [109]: fb21692a6c1366a6 +Block 0001 [110]: edd6c2d040094961 +Block 0001 [111]: c79280e9941ec27a +Block 0001 [112]: 280fbce8e5cd6960 +Block 0001 [113]: 7cc512600d40f97b +Block 0001 [114]: 113b17fcc8deb868 +Block 0001 [115]: bc46307516881707 +Block 0001 [116]: c0aff8d55ea5a700 +Block 0001 [117]: d4c1d8dcbf1ecee8 +Block 0001 [118]: 3f09e229a0cf497f +Block 0001 [119]: 1def3afaac33feaf +Block 0001 [120]: cc2096dcd2211d73 +Block 0001 [121]: dfa75a456a313e59 +Block 0001 [122]: 3fe11ef2c04e65eb +Block 0001 [123]: ba1b015c57ab3dc5 +Block 0001 [124]: d4a1ca9073a23c77 +Block 0001 [125]: 51ac68a0fb4e1cb0 +Block 0001 [126]: ef182d66a08362fc +Block 0001 [127]: 699c95881a1b1060 +Block 0002 [ 0]: 71b8ec93e3f732c5 +Block 0002 [ 1]: 2921408aba7a6ee8 +Block 0002 [ 2]: c3025490c26543cd +Block 0002 [ 3]: 2e30a512c2b6484d +Block 0002 [ 4]: 162f85d06406e065 +Block 0002 [ 5]: 099550c9a0775360 +Block 0002 [ 6]: 826cd9cc4508ced2 +Block 0002 [ 7]: 8b50e67c9e390589 +Block 0002 [ 8]: 3f65b5a83ab16eeb +Block 0002 [ 9]: 17a13cfedda02c46 +Block 0002 [ 10]: caffc1c212eaf6da +Block 0002 [ 11]: 70544d093dae2eff +Block 0002 [ 12]: 75f87da3c49ef5cd +Block 0002 [ 13]: 3908fe7447cb509d +Block 0002 [ 14]: 2c13ce7102738447 +Block 0002 [ 15]: e7621f9479588459 +Block 0002 [ 16]: 89dd43987c830d89 +Block 0002 [ 17]: 4be2c7d1536f7afa +Block 0002 [ 18]: 60268880e79480d9 +Block 0002 [ 19]: 1ed06be1eecb34d7 +Block 0002 [ 20]: 2882a4262d1541c6 +Block 0002 [ 21]: bddd95b9db563f26 +Block 0002 [ 22]: fced5f7ad7b81f12 +Block 0002 [ 23]: c04469c639662e04 +Block 0002 [ 24]: 460754262f521e05 +Block 0002 [ 25]: 21c7d27cc5452fdd +Block 0002 [ 26]: 1310befaa07e57bc +Block 0002 [ 27]: ee7c3e228022978d +Block 0002 [ 28]: 64e2cf6ca5a6fdd8 +Block 0002 [ 29]: 5cbc6ef1df9cd675 +Block 0002 [ 30]: d6e3caee351230ba +Block 0002 [ 31]: 61546e25e5983aa1 +Block 0002 [ 32]: d41c9423345965f0 +Block 0002 [ 33]: 407791f4576a3aa8 +Block 0002 [ 34]: 46db5a0bcd5c846f +Block 0002 [ 35]: 8a95ee17bfe0ec08 +Block 0002 [ 36]: 5876f92dfc84ba7c +Block 0002 [ 37]: 8da713191be496b1 +Block 0002 [ 38]: f4c8167930dffef9 +Block 0002 [ 39]: 9781a08d32a0b1cf +Block 0002 [ 40]: 2037493b5f57d782 +Block 0002 [ 41]: 7e5354a5a79301a6 +Block 0002 [ 42]: ca1c80a7d3c25855 +Block 0002 [ 43]: 7c16b889b05d5d15 +Block 0002 [ 44]: cc8d72fcfa904393 +Block 0002 [ 45]: e69be7ed9d4a4b9b +Block 0002 [ 46]: 5b83edd2dc756478 +Block 0002 [ 47]: f06469381ce4b98c +Block 0002 [ 48]: 2cbb142fe5a0e8b1 +Block 0002 [ 49]: 25a7cc27085c2fa0 +Block 0002 [ 50]: 39bca88c1a5b175e +Block 0002 [ 51]: 2349a999fc48b56e +Block 0002 [ 52]: c498911f0fccf069 +Block 0002 [ 53]: fcc68ab56005de17 +Block 0002 [ 54]: c6ad828542abea0d +Block 0002 [ 55]: c8af3d891cbb47c8 +Block 0002 [ 56]: 3b95683722fcc593 +Block 0002 [ 57]: 418bd5f4f9ca062d +Block 0002 [ 58]: 111a6b7f103d805c +Block 0002 [ 59]: 319537bd4bb50060 +Block 0002 [ 60]: b431772961ad550b +Block 0002 [ 61]: cdd54e4909e4f5d6 +Block 0002 [ 62]: 4825697dcafe9f1a +Block 0002 [ 63]: b22fdd05afa7dcb2 +Block 0002 [ 64]: d740558c3e22b6b7 +Block 0002 [ 65]: 1a6700ef884972b8 +Block 0002 [ 66]: e1ddada589d6769e +Block 0002 [ 67]: 16e7d46c2f308c57 +Block 0002 [ 68]: a805a5577cabb7ac +Block 0002 [ 69]: e3190cb63ff4cea2 +Block 0002 [ 70]: d1d59749b12e2218 +Block 0002 [ 71]: aa05daeb0365bb35 +Block 0002 [ 72]: 53219e14d6ffd549 +Block 0002 [ 73]: 7f404b81efa8bcd8 +Block 0002 [ 74]: 3174a66d45b4c8ca +Block 0002 [ 75]: 6f4ece4db00d016b +Block 0002 [ 76]: 72609905da2763aa +Block 0002 [ 77]: b4df27508135bc32 +Block 0002 [ 78]: 2a1af06212e7ab05 +Block 0002 [ 79]: 83a250b2fc0dd162 +Block 0002 [ 80]: af2eb57044690474 +Block 0002 [ 81]: e308e6cd64304bab +Block 0002 [ 82]: 305c0c0a99e443ab +Block 0002 [ 83]: bc6b254c9b761c71 +Block 0002 [ 84]: 2eeb658cd9a94706 +Block 0002 [ 85]: 8b2e74a5947310b3 +Block 0002 [ 86]: 7eb34be2120cf80a +Block 0002 [ 87]: dff3f71f4898493b +Block 0002 [ 88]: c8cef85d3f0d5b4c +Block 0002 [ 89]: 664806ac6dade916 +Block 0002 [ 90]: bb65d599c8c080df +Block 0002 [ 91]: c54b8e93dbc7ded9 +Block 0002 [ 92]: 50a030ce6618ee8c +Block 0002 [ 93]: 45f54cb2aaa89e65 +Block 0002 [ 94]: 267b21b4235d7346 +Block 0002 [ 95]: 1bf408ed4e75b1dc +Block 0002 [ 96]: 0e8f1edbd4bbd0c8 +Block 0002 [ 97]: a1adb6d652b48eba +Block 0002 [ 98]: 09d7a628b284f260 +Block 0002 [ 99]: 2eb568f917e0a238 +Block 0002 [100]: 12067efa542954da +Block 0002 [101]: fed335dcd6c0d327 +Block 0002 [102]: 0ef0658af19df88c +Block 0002 [103]: 79772b8c71426f57 +Block 0002 [104]: a3fa41213ac1f06f +Block 0002 [105]: c1121c7f277a0413 +Block 0002 [106]: 69417dc62124eba2 +Block 0002 [107]: e5f073d09cc97483 +Block 0002 [108]: 6d4b689e3050ffeb +Block 0002 [109]: 8460b46071ee44e6 +Block 0002 [110]: 4f086191e05c2da3 +Block 0002 [111]: 0354280e4d44d36f +Block 0002 [112]: 790c8aa9173258fb +Block 0002 [113]: 60ed51d0eb2bb310 +Block 0002 [114]: da8ca7fcaab8acb4 +Block 0002 [115]: c6999b51539b1dea +Block 0002 [116]: 362b9d5fa7b5ebd5 +Block 0002 [117]: ef482e43f06ce25c +Block 0002 [118]: 6dc1ee2e3359b2d0 +Block 0002 [119]: 25afa5d76d54d610 +Block 0002 [120]: 878969f20bf69cd5 +Block 0002 [121]: 924a37340899c61f +Block 0002 [122]: 7ed02ee734978796 +Block 0002 [123]: 40fc63ad985ec23f +Block 0002 [124]: 3928395a5dd1a2bc +Block 0002 [125]: 9abb635194848088 +Block 0002 [126]: 4a5d219cac1ab9e7 +Block 0002 [127]: 3194b42ac43716a7 +Block 0003 [ 0]: ed9b018cf73119d4 +Block 0003 [ 1]: 676d7e00d2b3d934 +Block 0003 [ 2]: 24ed504cf99b75a2 +Block 0003 [ 3]: d9c68fa321957471 +Block 0003 [ 4]: c7dc7aeff1353f1e +Block 0003 [ 5]: 9a0b969f89ed418a +Block 0003 [ 6]: 043cfd3c93718f01 +Block 0003 [ 7]: e55c9f988adc8507 +Block 0003 [ 8]: d57fa23652f38e2f +Block 0003 [ 9]: 709d8bc2f7dd84f7 +Block 0003 [ 10]: ada563f3de793c91 +Block 0003 [ 11]: e27691545c44cc18 +Block 0003 [ 12]: 2fe9ca2b832c6714 +Block 0003 [ 13]: 747c2cab2953c670 +Block 0003 [ 14]: 6703532445d3915c +Block 0003 [ 15]: dfd77bc90722f024 +Block 0003 [ 16]: 16435ba9fbeb075d +Block 0003 [ 17]: 476d334c3dca8bfa +Block 0003 [ 18]: cde2fd89449eb0d5 +Block 0003 [ 19]: bd60a48ef022b66b +Block 0003 [ 20]: a2b9d31cb2bcc0ea +Block 0003 [ 21]: b5ea599c25604703 +Block 0003 [ 22]: 4120850f7df2620b +Block 0003 [ 23]: a0ecdb519966f5ee +Block 0003 [ 24]: 6463ec02a83f114d +Block 0003 [ 25]: 077ef4a147bf4cf4 +Block 0003 [ 26]: ceb96b986f2b6938 +Block 0003 [ 27]: 42dd9f1be3d42686 +Block 0003 [ 28]: d63add83abf847fd +Block 0003 [ 29]: 14798f3c6a47385c +Block 0003 [ 30]: 81a7c676faeff12f +Block 0003 [ 31]: 8007634d756d7974 +Block 0003 [ 32]: e530dd0f316b30e3 +Block 0003 [ 33]: 60537c75bc4e58f4 +Block 0003 [ 34]: 8c58c4b07d61a3c2 +Block 0003 [ 35]: 7314d4b84f29db19 +Block 0003 [ 36]: b1a8510d99f95311 +Block 0003 [ 37]: 77aec34e430a2ef3 +Block 0003 [ 38]: be9352608d95554c +Block 0003 [ 39]: afbdecc23c77e71a +Block 0003 [ 40]: ee9038b82427c8c6 +Block 0003 [ 41]: 3e7fe31ff4244515 +Block 0003 [ 42]: 9a19698f515d3421 +Block 0003 [ 43]: 6f8ff3c4f4815b14 +Block 0003 [ 44]: 761014fe861048a7 +Block 0003 [ 45]: 1f45dc9a00dc4d41 +Block 0003 [ 46]: 0b8b32add02a90bd +Block 0003 [ 47]: 7a009a892a306723 +Block 0003 [ 48]: 42cce6cfa293666e +Block 0003 [ 49]: b652771a017d6014 +Block 0003 [ 50]: a121c1f96f26c035 +Block 0003 [ 51]: d4ec5a9f263e50f3 +Block 0003 [ 52]: 6d2a4c8b05ef8267 +Block 0003 [ 53]: f61cf97cc03049fd +Block 0003 [ 54]: cc8397dd2288f295 +Block 0003 [ 55]: a77557382f89e947 +Block 0003 [ 56]: 403fb02df66263b8 +Block 0003 [ 57]: b76f07afa1117612 +Block 0003 [ 58]: 67c4c28018281163 +Block 0003 [ 59]: 092d53a36a29aa29 +Block 0003 [ 60]: 2f276cc30cb2d64a +Block 0003 [ 61]: 09b079ccc7d34bb5 +Block 0003 [ 62]: dec9a5b166f0ec7f +Block 0003 [ 63]: 7a88ad9e18177537 +Block 0003 [ 64]: 21a6a68a52e17069 +Block 0003 [ 65]: 97e42522e13bb917 +Block 0003 [ 66]: 49a945cf664ad2e3 +Block 0003 [ 67]: 7c90c7238fab3dc0 +Block 0003 [ 68]: f6847cbb9fc1dcf9 +Block 0003 [ 69]: 613b69f2ba41a4d6 +Block 0003 [ 70]: cd59fef52d150563 +Block 0003 [ 71]: b23fb8c47fc95d8e +Block 0003 [ 72]: 4eb21cc522448370 +Block 0003 [ 73]: be2a1cae856b6920 +Block 0003 [ 74]: 3598905d25c18c85 +Block 0003 [ 75]: 73b4c4eee6198073 +Block 0003 [ 76]: 16c26bcbac3bdf2c +Block 0003 [ 77]: f8ac9f5d95065fbe +Block 0003 [ 78]: 65648fc6460c45bf +Block 0003 [ 79]: a380fff8646f6293 +Block 0003 [ 80]: 3db7f55dcec13491 +Block 0003 [ 81]: 073383663b073614 +Block 0003 [ 82]: 79b12d0d0c82cb40 +Block 0003 [ 83]: 086a4b6b0fc2256a +Block 0003 [ 84]: ce61a9b255e7f76a +Block 0003 [ 85]: 30aacf6ee481f877 +Block 0003 [ 86]: c1035ed72ecf5286 +Block 0003 [ 87]: 8d7c39140fae6ef7 +Block 0003 [ 88]: d5a479c1cb9aba85 +Block 0003 [ 89]: f0a10cd2d8bb5f99 +Block 0003 [ 90]: b01948d3e6b8e3ea +Block 0003 [ 91]: dbbf70c01fac6be5 +Block 0003 [ 92]: 636ab4bdc5ca0716 +Block 0003 [ 93]: 61e4955bb3e60859 +Block 0003 [ 94]: d056e739fbb78902 +Block 0003 [ 95]: ad7bdf23e2d3c0e4 +Block 0003 [ 96]: 68b2dafb66a5c70d +Block 0003 [ 97]: aeb52729d6f0213f +Block 0003 [ 98]: d22801e34a52020e +Block 0003 [ 99]: 3e5f3f27cbb5c16b +Block 0003 [100]: c3dac10d2ee9a3b7 +Block 0003 [101]: 943bef903b65b36a +Block 0003 [102]: acdbd6a2e74a6d2e +Block 0003 [103]: 223fc07fb15b3c2e +Block 0003 [104]: 4cc21098fc36f7e9 +Block 0003 [105]: 6c4742940ea08300 +Block 0003 [106]: a318d8cbc50f01ce +Block 0003 [107]: a1223a4b89fe758c +Block 0003 [108]: 7df4cb5a8696ca03 +Block 0003 [109]: 27637f388536a4a9 +Block 0003 [110]: 1c563e66b7c61df7 +Block 0003 [111]: 4d92572792bd3787 +Block 0003 [112]: a3a589f00137e6bd +Block 0003 [113]: 480ae4ee49a1045b +Block 0003 [114]: 32e1a4543563d81a +Block 0003 [115]: caf283982a76d442 +Block 0003 [116]: f13be5d11aa516fe +Block 0003 [117]: e8a1dbd6fc937744 +Block 0003 [118]: 8c6aee1b9d7866f3 +Block 0003 [119]: cce7053af9f1aaa0 +Block 0003 [120]: eade4e2857a1a201 +Block 0003 [121]: fde12acd969b09b7 +Block 0003 [122]: 22d756c288c83344 +Block 0003 [123]: 02f684d861b7ca1f +Block 0003 [124]: 1fa704bee1681316 +Block 0003 [125]: 8df154c2ae1d9075 +Block 0003 [126]: 8c6c02319f35a7bf +Block 0003 [127]: 1766d7e719c829d3 +Block 0004 [ 0]: 90d839630181a712 +Block 0004 [ 1]: 31d40561345ccafe +Block 0004 [ 2]: ed3bb1ec934eb32a +Block 0004 [ 3]: 5158d93e82035417 +Block 0004 [ 4]: 628176e2ce74e373 +Block 0004 [ 5]: 2be8dd104a093ba5 +Block 0004 [ 6]: 5453f9a6c44d3631 +Block 0004 [ 7]: f8ea14f4bae9c0b7 +Block 0004 [ 8]: 95812642baad81ab +Block 0004 [ 9]: 5dfcb2fb77201eec +Block 0004 [ 10]: f79d47a8fb49794f +Block 0004 [ 11]: b2feee7f8f445b8e +Block 0004 [ 12]: 19b1d3ff0c53cf11 +Block 0004 [ 13]: 28f2554b95410c7d +Block 0004 [ 14]: cdfa040f869838b0 +Block 0004 [ 15]: a6f647991b3cb6ab +Block 0004 [ 16]: 91fc048145229e4c +Block 0004 [ 17]: ad19c42e4772ec1d +Block 0004 [ 18]: a1c37bbabe144901 +Block 0004 [ 19]: 89bd26a605f77b5b +Block 0004 [ 20]: 7794732d75f63a08 +Block 0004 [ 21]: f678f8f5e9c39808 +Block 0004 [ 22]: 5381a28c3ca44c6c +Block 0004 [ 23]: 8ae5e76c1e1122be +Block 0004 [ 24]: eee5585bab1a102f +Block 0004 [ 25]: 5e1f1fde2dbf1193 +Block 0004 [ 26]: 6b533d9727cc50fe +Block 0004 [ 27]: 87dafb6e3fbdc398 +Block 0004 [ 28]: 36f76d8fafcae2d0 +Block 0004 [ 29]: 15288254e14e5c2d +Block 0004 [ 30]: 496c6c8f8623621d +Block 0004 [ 31]: 28d16b519704b395 +Block 0004 [ 32]: e712775b8bb142a1 +Block 0004 [ 33]: 6a869b2a212c4e31 +Block 0004 [ 34]: 8524f52b679fd180 +Block 0004 [ 35]: 045b00049350acd7 +Block 0004 [ 36]: b66de5cc34a53bb8 +Block 0004 [ 37]: a0cfbc2274974caf +Block 0004 [ 38]: 56c94fb7d70e67cd +Block 0004 [ 39]: 006ce5dd55c8c12a +Block 0004 [ 40]: 60ef5183fe831ac5 +Block 0004 [ 41]: d89d487934705042 +Block 0004 [ 42]: 3b2acc4cbff1b2ba +Block 0004 [ 43]: 7bf6c5188eefdbb8 +Block 0004 [ 44]: 8c3b2593646988a8 +Block 0004 [ 45]: 28aa328e1a3e5b4b +Block 0004 [ 46]: 74fbb3c3b45b6637 +Block 0004 [ 47]: b20f255f1ce5a949 +Block 0004 [ 48]: 0358047b7364172e +Block 0004 [ 49]: 162c6c06f5bb0ea8 +Block 0004 [ 50]: 65ca6a515f0ee61a +Block 0004 [ 51]: 5f1cfa1e60f277c5 +Block 0004 [ 52]: 05e8c0ad94b7bc34 +Block 0004 [ 53]: f832de7a4bd3ac2f +Block 0004 [ 54]: 9eea74a6901b91a4 +Block 0004 [ 55]: 1f367789fc44140e +Block 0004 [ 56]: 695b670f7bc01632 +Block 0004 [ 57]: 3e7d34e670023872 +Block 0004 [ 58]: c989195f9b616264 +Block 0004 [ 59]: a21c5f971308c13a +Block 0004 [ 60]: 58b87503c8635980 +Block 0004 [ 61]: 3245610b4d97d82d +Block 0004 [ 62]: e34a0f2d155360b1 +Block 0004 [ 63]: baf280cbc7fffb87 +Block 0004 [ 64]: 58510f97a6f2e4fc +Block 0004 [ 65]: c3366abaa8b7eab1 +Block 0004 [ 66]: 893caba7b9600db0 +Block 0004 [ 67]: 37c367da3446b904 +Block 0004 [ 68]: 84167169b47affbc +Block 0004 [ 69]: 9dc74c47cc8d7f78 +Block 0004 [ 70]: aa6925dcf92952c7 +Block 0004 [ 71]: 59f66d9a13ca1062 +Block 0004 [ 72]: de96a08f9c99c2f3 +Block 0004 [ 73]: 30b98fc65d399fda +Block 0004 [ 74]: 950542d7df476453 +Block 0004 [ 75]: cb7fb37d21104379 +Block 0004 [ 76]: 2bea7104cd1c5ef3 +Block 0004 [ 77]: c54453a78f0101f7 +Block 0004 [ 78]: 93ff56dd2ba89557 +Block 0004 [ 79]: b838fe564d46e7f3 +Block 0004 [ 80]: 8960183d8596dfdc +Block 0004 [ 81]: f9b0885a7c7d64d9 +Block 0004 [ 82]: 6a44f97f4714b2b1 +Block 0004 [ 83]: fc9528da99669c4e +Block 0004 [ 84]: d8b7d4ca2567129d +Block 0004 [ 85]: 1720d486d7e638ce +Block 0004 [ 86]: 7a95ddcf453b2e08 +Block 0004 [ 87]: 9da746f32e51288f +Block 0004 [ 88]: f93accc446e95fb9 +Block 0004 [ 89]: 2d1de132a48664dd +Block 0004 [ 90]: 39583bba3d9fbb08 +Block 0004 [ 91]: 9a3da40a9dd5d893 +Block 0004 [ 92]: 3439fe746eb1d98b +Block 0004 [ 93]: b2854012ccc088fe +Block 0004 [ 94]: 0bd26ec0fbef03a6 +Block 0004 [ 95]: 412b9c3c62e87da1 +Block 0004 [ 96]: f2b20003dd729349 +Block 0004 [ 97]: 5096494607d466b0 +Block 0004 [ 98]: 9df5f7537e761192 +Block 0004 [ 99]: cba43f26b1a5934f +Block 0004 [100]: ffe6f2a661c64ddd +Block 0004 [101]: 42f416be423dd904 +Block 0004 [102]: 5c8a2a6a229e88aa +Block 0004 [103]: 45b7de400eddb52e +Block 0004 [104]: 61f0b2212a2560ca +Block 0004 [105]: a158ceb5c0937b7d +Block 0004 [106]: 62f686b1e4a7de10 +Block 0004 [107]: 45f6eba38f22f491 +Block 0004 [108]: 43b50d660b6c2fc5 +Block 0004 [109]: 2fce08a13cda1519 +Block 0004 [110]: 169c1a9c683cb235 +Block 0004 [111]: a5d2facdeffdde02 +Block 0004 [112]: 2ab227e7a7f5849d +Block 0004 [113]: efde35e81d357f68 +Block 0004 [114]: 4d5f2d83c52fce90 +Block 0004 [115]: 241c77003a456d44 +Block 0004 [116]: b5add1f38714d889 +Block 0004 [117]: 41666f254082da28 +Block 0004 [118]: 6d12a9213c48cbdb +Block 0004 [119]: 0bf9b91e0ed22fc7 +Block 0004 [120]: 02373fa7a4e3e90c +Block 0004 [121]: b1c086a91f0485dc +Block 0004 [122]: 1167003ca5e99357 +Block 0004 [123]: 141e5480972f7bfd +Block 0004 [124]: 63daa7474f351787 +Block 0004 [125]: 332052c9298085bb +Block 0004 [126]: 733ea09c23cb071d +Block 0004 [127]: fa41e42ec3d39e7f +Block 0005 [ 0]: 5e7846318659b41b +Block 0005 [ 1]: 5498eccba3733c30 +Block 0005 [ 2]: 3babdb1fb5d41161 +Block 0005 [ 3]: 36f2b33bdc764f24 +Block 0005 [ 4]: 3f221dda7d6d34bb +Block 0005 [ 5]: 77176ae7b153eadd +Block 0005 [ 6]: 342e2e8794a8af6e +Block 0005 [ 7]: 20dea27fc8fae486 +Block 0005 [ 8]: 15323b3e533f0c7a +Block 0005 [ 9]: 0193254289eb31e3 +Block 0005 [ 10]: 4a81fd81fb7d90b0 +Block 0005 [ 11]: 8f287ad488427dfe +Block 0005 [ 12]: d7eb8dedcc6cd803 +Block 0005 [ 13]: d9b6de0e50372560 +Block 0005 [ 14]: 324222fe078be0da +Block 0005 [ 15]: 6a948a5b4ebdbd71 +Block 0005 [ 16]: 52a1e7302ec5d8be +Block 0005 [ 17]: 6af1222211cb1b0d +Block 0005 [ 18]: b1d9f1ddb03d7da0 +Block 0005 [ 19]: 2d9bb8070b62cf15 +Block 0005 [ 20]: 5a87a430cd6f9f81 +Block 0005 [ 21]: 340bcc02b9ad15c9 +Block 0005 [ 22]: 98db72f822dd6a1b +Block 0005 [ 23]: f9305db39a479727 +Block 0005 [ 24]: 78c68f205955a9f3 +Block 0005 [ 25]: baadd583ec827375 +Block 0005 [ 26]: 291e96dda338f722 +Block 0005 [ 27]: ca2fd96c45f08d2b +Block 0005 [ 28]: 66295ca71d284284 +Block 0005 [ 29]: cf6aefc8074ed121 +Block 0005 [ 30]: 205c887346749eaf +Block 0005 [ 31]: d1a818c4cb17d88f +Block 0005 [ 32]: d28404b27af6d3de +Block 0005 [ 33]: 68f38514db6ce691 +Block 0005 [ 34]: 9810855101734602 +Block 0005 [ 35]: 334ed4ce0bbaa7d1 +Block 0005 [ 36]: 1769d56aad14c3da +Block 0005 [ 37]: 5040635b0964ca75 +Block 0005 [ 38]: 0d2d406dcd0da21e +Block 0005 [ 39]: 3f0d5711e7d95959 +Block 0005 [ 40]: b9648e9ccd94997e +Block 0005 [ 41]: cdbcdbd0291121a2 +Block 0005 [ 42]: c2c776e399fb1502 +Block 0005 [ 43]: 10d7b02208474647 +Block 0005 [ 44]: 8dd2cae279f20ec7 +Block 0005 [ 45]: e2a4911895890527 +Block 0005 [ 46]: d5ddc4bf372c2f32 +Block 0005 [ 47]: a7d9d7c0e24d0291 +Block 0005 [ 48]: b05f408614e904c0 +Block 0005 [ 49]: bbd0c036e048df41 +Block 0005 [ 50]: 8eed1406ddf119a0 +Block 0005 [ 51]: da90ba3dcac5e24a +Block 0005 [ 52]: b1c9d509e7c4e991 +Block 0005 [ 53]: eafc798f9b854437 +Block 0005 [ 54]: 83350b23cf076d28 +Block 0005 [ 55]: b904c82269abbf30 +Block 0005 [ 56]: 4f9470766db9f036 +Block 0005 [ 57]: 8d94d3b34697e7e9 +Block 0005 [ 58]: 9110bc556a9e4405 +Block 0005 [ 59]: 65851e38116eee1a +Block 0005 [ 60]: d7990c5616c3310b +Block 0005 [ 61]: f44a043870e946fe +Block 0005 [ 62]: 497d20f5a83a43bb +Block 0005 [ 63]: cf47efb899f32d07 +Block 0005 [ 64]: 9ed434cd932fd840 +Block 0005 [ 65]: c33f7501c8c7104e +Block 0005 [ 66]: 72894f99ad784543 +Block 0005 [ 67]: 520dbb68dac9d894 +Block 0005 [ 68]: 39a98546fe09e803 +Block 0005 [ 69]: 8bf75e44b18c4dc5 +Block 0005 [ 70]: b0e11b03cad79f54 +Block 0005 [ 71]: 785d01a461667158 +Block 0005 [ 72]: 2464d3fc7be6e14a +Block 0005 [ 73]: 3c56497d32689298 +Block 0005 [ 74]: de2986b940d32487 +Block 0005 [ 75]: d9d5cfb103f6cea4 +Block 0005 [ 76]: 832e8c4d909d7b97 +Block 0005 [ 77]: 903d7d62755ae704 +Block 0005 [ 78]: a54cef3105844550 +Block 0005 [ 79]: f5b738152f173e09 +Block 0005 [ 80]: fdf02e4e100e3460 +Block 0005 [ 81]: 5a71685373a067eb +Block 0005 [ 82]: 2dc6f153213ac8bb +Block 0005 [ 83]: 227d2d6a16d74573 +Block 0005 [ 84]: 4703d6e40d6de4b2 +Block 0005 [ 85]: 9297e5c7c78805f2 +Block 0005 [ 86]: d13bb39fa6cf15b7 +Block 0005 [ 87]: b4e86661abb79f78 +Block 0005 [ 88]: 5f62a96a771a79c9 +Block 0005 [ 89]: 7f5fdb426c93deff +Block 0005 [ 90]: 8ec5bec7a7be07bb +Block 0005 [ 91]: 6c4a44e9b8e262bb +Block 0005 [ 92]: 69d02ed7903ae98a +Block 0005 [ 93]: 9d93c3a8515505ec +Block 0005 [ 94]: b2f8780a5241a542 +Block 0005 [ 95]: 1903e7ee2ad04c3e +Block 0005 [ 96]: 57c98601e7623a24 +Block 0005 [ 97]: eb032d6dab553367 +Block 0005 [ 98]: a717a3fa9ca5e346 +Block 0005 [ 99]: 088edeae54d9b6f4 +Block 0005 [100]: f7bab20588a9ee70 +Block 0005 [101]: 32c0ed6315b77431 +Block 0005 [102]: 037db77faeccc301 +Block 0005 [103]: edebe8ca2930df7b +Block 0005 [104]: 975d89059e4c5930 +Block 0005 [105]: 1e90aa88a537676f +Block 0005 [106]: ad5d5855d8b8ee4a +Block 0005 [107]: 3e4a4cbb750e652a +Block 0005 [108]: 4d9150310e7a9ec9 +Block 0005 [109]: f2750b962f399a59 +Block 0005 [110]: 5b7bf09e4a0ba5d7 +Block 0005 [111]: dafc4f656d94b7a8 +Block 0005 [112]: 641bee8cef5ae340 +Block 0005 [113]: 9b62ae31301e1379 +Block 0005 [114]: c8ab9073ae12bbe7 +Block 0005 [115]: bcfc6272d1012f69 +Block 0005 [116]: 22f31f6ac36a18e3 +Block 0005 [117]: 75437f21353a161b +Block 0005 [118]: 85ee0a8925de3c14 +Block 0005 [119]: 93dbf2879401c798 +Block 0005 [120]: dc20b9024f9ca22a +Block 0005 [121]: 67d1055a09faf352 +Block 0005 [122]: 16610e8af8545564 +Block 0005 [123]: 612fe25e6478e6a8 +Block 0005 [124]: d9a92e44a145ae37 +Block 0005 [125]: 783f29b7380227d6 +Block 0005 [126]: 1870326b162dc6c8 +Block 0005 [127]: 6f485b82113bc2a5 +Block 0006 [ 0]: 0417e8d2c09771fa +Block 0006 [ 1]: a726fdcd1ac3a31a +Block 0006 [ 2]: 84d14b41bb6059ea +Block 0006 [ 3]: 3f53c23b60df7038 +Block 0006 [ 4]: 19239c627a485bc5 +Block 0006 [ 5]: fb4aabd5defe2f47 +Block 0006 [ 6]: f9f1e77d2e9e514c +Block 0006 [ 7]: 7956e820153bfb8f +Block 0006 [ 8]: 95470e1a550e5d09 +Block 0006 [ 9]: 2df5c82514ab9a06 +Block 0006 [ 10]: 18fd74e083ae8ceb +Block 0006 [ 11]: 4e7434e120c54b8a +Block 0006 [ 12]: f91a96890a2d4ac0 +Block 0006 [ 13]: 232d40c217b875ce +Block 0006 [ 14]: 762f49fc25fcd3a0 +Block 0006 [ 15]: 35d5437c8b64405e +Block 0006 [ 16]: 0b422d304c0ed838 +Block 0006 [ 17]: 85a3333bf921879e +Block 0006 [ 18]: f3914d23823a2d06 +Block 0006 [ 19]: cc231b9f95233733 +Block 0006 [ 20]: 95a45fed71b29b0a +Block 0006 [ 21]: 11b8f5bc39821ade +Block 0006 [ 22]: beed6d07ff11c69c +Block 0006 [ 23]: de3fcab576d24290 +Block 0006 [ 24]: cb31ef7a9d8002ed +Block 0006 [ 25]: e60798c0537c5cbe +Block 0006 [ 26]: 25dbc252460cf848 +Block 0006 [ 27]: da174e23673492ae +Block 0006 [ 28]: 5aa2fc50a36cce3d +Block 0006 [ 29]: 78642ee4e8259afb +Block 0006 [ 30]: ad9a1811a189ce80 +Block 0006 [ 31]: 2f1afb8e0386b092 +Block 0006 [ 32]: 777789abcad25560 +Block 0006 [ 33]: 127feff5537b2332 +Block 0006 [ 34]: 4205ad01c2be853e +Block 0006 [ 35]: 988ae5fd34f0c7c7 +Block 0006 [ 36]: 0b9f67850f84e5f2 +Block 0006 [ 37]: e1eef8199b93426e +Block 0006 [ 38]: 99e06d1c35c00831 +Block 0006 [ 39]: 59d99a6c99d0c6fa +Block 0006 [ 40]: bd5dceb6e37ef712 +Block 0006 [ 41]: 688e2a2779c7dc71 +Block 0006 [ 42]: 0bcba0f31e421c97 +Block 0006 [ 43]: 950a987e49b4a192 +Block 0006 [ 44]: 97a6320062a8ecad +Block 0006 [ 45]: ec9f00a9d09d89ba +Block 0006 [ 46]: 4117681b09f99aba +Block 0006 [ 47]: d8467026dda87eb2 +Block 0006 [ 48]: 8eae6e49ce6a479a +Block 0006 [ 49]: 543f4baf8ae08462 +Block 0006 [ 50]: d55c072b00a22ac2 +Block 0006 [ 51]: 54aa10083de6905b +Block 0006 [ 52]: 85b5c10b32ff7623 +Block 0006 [ 53]: 17f117b0a28bfc9a +Block 0006 [ 54]: 37ac27e7c6bc3a0c +Block 0006 [ 55]: dd9068b75c93bbd1 +Block 0006 [ 56]: 69f1a8ad964fa784 +Block 0006 [ 57]: fcb52326d3c515eb +Block 0006 [ 58]: 2c6ddb220f385957 +Block 0006 [ 59]: c5714a72aec686d3 +Block 0006 [ 60]: 66b376281e03b4dc +Block 0006 [ 61]: 28877c7f3213b260 +Block 0006 [ 62]: e579ce747b053fdd +Block 0006 [ 63]: 8727815de424a4cb +Block 0006 [ 64]: bc6d9c0d3179a1ef +Block 0006 [ 65]: ac4f154a1d761539 +Block 0006 [ 66]: 55fbaeec6dc7ca86 +Block 0006 [ 67]: a6f0af31cfe67f15 +Block 0006 [ 68]: 3922b3d031a2129b +Block 0006 [ 69]: 4453b2cb3aec5c2f +Block 0006 [ 70]: e380387d90a5e924 +Block 0006 [ 71]: 35e776afaf39e0b2 +Block 0006 [ 72]: b9f397c3611ec050 +Block 0006 [ 73]: 96df5c83a6df4140 +Block 0006 [ 74]: 695ff5340eec5ec5 +Block 0006 [ 75]: 987f9703bd026e3d +Block 0006 [ 76]: 0f4348c35038b1dc +Block 0006 [ 77]: 3d268153f9b16a2c +Block 0006 [ 78]: dc1cf419721a2453 +Block 0006 [ 79]: 1607e5d6ed685375 +Block 0006 [ 80]: 9a3d76a4963d8e34 +Block 0006 [ 81]: e9a1d2e0a80513c6 +Block 0006 [ 82]: 9fb6e4802f6e7169 +Block 0006 [ 83]: 01b29ef13e829bb4 +Block 0006 [ 84]: 66844c827d52bc55 +Block 0006 [ 85]: d07d0c3cbfdf7d5e +Block 0006 [ 86]: cf944367025e3ec7 +Block 0006 [ 87]: d90c8c514fcfc4b8 +Block 0006 [ 88]: 524c86be0fb92f8c +Block 0006 [ 89]: ce0a4bdd95819f54 +Block 0006 [ 90]: 89294a0f3414ae13 +Block 0006 [ 91]: d8cd430c02e6f74b +Block 0006 [ 92]: de46e3d9261a7b0f +Block 0006 [ 93]: 18e8320c1be34393 +Block 0006 [ 94]: f4bb7e71f45c46e7 +Block 0006 [ 95]: 3f0b6d6dd0e0c0fb +Block 0006 [ 96]: a64be31a62119da2 +Block 0006 [ 97]: 6972060764978fb8 +Block 0006 [ 98]: f3710a7be0ad2de5 +Block 0006 [ 99]: d6b80dd54b07c537 +Block 0006 [100]: d6051fc8b86b24b9 +Block 0006 [101]: d904afa89bbef2f5 +Block 0006 [102]: 2079fb23f3e3c75b +Block 0006 [103]: b594448695102524 +Block 0006 [104]: 7f6cfa7cea3593d8 +Block 0006 [105]: dd5fd43fdaaae533 +Block 0006 [106]: f30c2659a9142b1d +Block 0006 [107]: 3aa159403dced7a4 +Block 0006 [108]: 5962f9bf5160d458 +Block 0006 [109]: b8a982f7bb6fc161 +Block 0006 [110]: 5b5d15c13166d1d8 +Block 0006 [111]: 58aad2b0da7f6023 +Block 0006 [112]: 75421389e4139da8 +Block 0006 [113]: 91bc8b067014c464 +Block 0006 [114]: 7f91fd554a29cb3f +Block 0006 [115]: 54865eb5f6f4a935 +Block 0006 [116]: 1bbf6187700f04cb +Block 0006 [117]: fd95668e86d46407 +Block 0006 [118]: c1771c1acf358dc7 +Block 0006 [119]: 240ef33e1f0f5692 +Block 0006 [120]: 37f5f7a3d3dc98b3 +Block 0006 [121]: 0fdbc5425b41a182 +Block 0006 [122]: 8d029071e47bc518 +Block 0006 [123]: e33d5ba83bdbc7c5 +Block 0006 [124]: 9dfd7a2e63d545b9 +Block 0006 [125]: 74b00cf4ccf77152 +Block 0006 [126]: f02776461acb55a7 +Block 0006 [127]: a17599995e42dc1d +Block 0007 [ 0]: b790a46d763c1f8a +Block 0007 [ 1]: 88372edc47d473a5 +Block 0007 [ 2]: fdbf5895c75de68f +Block 0007 [ 3]: b576d710dc6934a9 +Block 0007 [ 4]: 261dbe511e84920e +Block 0007 [ 5]: 23ccb49198ef407e +Block 0007 [ 6]: dc7a607fcfdebbbb +Block 0007 [ 7]: c40f7909c8b74565 +Block 0007 [ 8]: bcb70d8b8c5ad62a +Block 0007 [ 9]: b407de45ef00203d +Block 0007 [ 10]: 1c9216113fbd2c5b +Block 0007 [ 11]: 77275accdb669b8a +Block 0007 [ 12]: 4fdcc4d247eaecbf +Block 0007 [ 13]: 3c9c6f9c725a8147 +Block 0007 [ 14]: 5896c77481a605a0 +Block 0007 [ 15]: e1a48bfa6f467b28 +Block 0007 [ 16]: dbf9935ebb5e2b89 +Block 0007 [ 17]: 14dab3f72d5e2176 +Block 0007 [ 18]: a154a24fe73fd778 +Block 0007 [ 19]: e6924d0f65899b84 +Block 0007 [ 20]: 4e62f41e7d33cb81 +Block 0007 [ 21]: 57aeacf64ee17eb9 +Block 0007 [ 22]: 2d1099c984394239 +Block 0007 [ 23]: a982e5e228a3385f +Block 0007 [ 24]: ca6d134a2b475bba +Block 0007 [ 25]: 3ef8c9ba2748bf6e +Block 0007 [ 26]: c6340e266c4c7758 +Block 0007 [ 27]: 805e6103e708427a +Block 0007 [ 28]: 83400bd566dc6d15 +Block 0007 [ 29]: 047f958c710d7217 +Block 0007 [ 30]: 281963f6a7372405 +Block 0007 [ 31]: 056cc5a85889d3d1 +Block 0007 [ 32]: 9752a6c3ff0ba9e3 +Block 0007 [ 33]: 092282962e219d5d +Block 0007 [ 34]: a453dd749ce5e0d2 +Block 0007 [ 35]: 88cb7090e75dfd2b +Block 0007 [ 36]: 9045ad926c38a180 +Block 0007 [ 37]: 637fd1abe93970e8 +Block 0007 [ 38]: 7a2bdbc77ba5a2a1 +Block 0007 [ 39]: 0d58dc850c38de96 +Block 0007 [ 40]: 9b8fb72271a76f9e +Block 0007 [ 41]: 82ce9be13cea48f8 +Block 0007 [ 42]: b24e764f68f217de +Block 0007 [ 43]: 9f7627a126af1bfb +Block 0007 [ 44]: 57163e7e745632fd +Block 0007 [ 45]: d282b8d0620d8261 +Block 0007 [ 46]: 807477780495b097 +Block 0007 [ 47]: 0f8f13b3edf03a12 +Block 0007 [ 48]: 899a059ba9a3840b +Block 0007 [ 49]: 8ed2c0cf3dc1f9c7 +Block 0007 [ 50]: cabc04edf2d6b2d2 +Block 0007 [ 51]: 1f4dd4cf9f078444 +Block 0007 [ 52]: 2927a20e27700649 +Block 0007 [ 53]: de52aaa1375b33bd +Block 0007 [ 54]: f1e8ea93f19d218c +Block 0007 [ 55]: 1550af4fa2fd9f2f +Block 0007 [ 56]: 55c59620ae537114 +Block 0007 [ 57]: cf489cd74a05e814 +Block 0007 [ 58]: c4c315c3cf39d416 +Block 0007 [ 59]: e59752fe467b5b96 +Block 0007 [ 60]: 997e1d12fb346c7b +Block 0007 [ 61]: 0a37442715377f32 +Block 0007 [ 62]: ebbe365a0e1bacfd +Block 0007 [ 63]: 8fcbbc39ecb89c4c +Block 0007 [ 64]: b38bd0764cde9d82 +Block 0007 [ 65]: 6f16527d4267b0a3 +Block 0007 [ 66]: 4ae5dea02d5fd9d9 +Block 0007 [ 67]: d6034ae87122afd7 +Block 0007 [ 68]: 12cc1f806cbc9d7c +Block 0007 [ 69]: ab9d9811c91588bb +Block 0007 [ 70]: e69c0a53a793ec61 +Block 0007 [ 71]: 4244a7184b2def54 +Block 0007 [ 72]: e05a4b9bcf35a10f +Block 0007 [ 73]: 83b4c5a14acf620b +Block 0007 [ 74]: 5c395967dd494072 +Block 0007 [ 75]: 9cc99d42a15cf863 +Block 0007 [ 76]: 651313f6ce56ac54 +Block 0007 [ 77]: 2d624d3b5e267495 +Block 0007 [ 78]: e5c5edce3caceb3a +Block 0007 [ 79]: 9e6a73a49cb1e138 +Block 0007 [ 80]: b63ce259bde73249 +Block 0007 [ 81]: 73ecd229001d48f9 +Block 0007 [ 82]: f596d98b783df7a9 +Block 0007 [ 83]: 7353862898dd9389 +Block 0007 [ 84]: 57063423fb02c599 +Block 0007 [ 85]: f5c261d8635cea29 +Block 0007 [ 86]: 506b486faca9af11 +Block 0007 [ 87]: ac0751d372f6ee49 +Block 0007 [ 88]: 5cb470a4a19ce898 +Block 0007 [ 89]: 45dfc8900981c9f8 +Block 0007 [ 90]: 2fdc79a1de246e99 +Block 0007 [ 91]: 63a7108d4264ef3f +Block 0007 [ 92]: 9089aae68dc0d946 +Block 0007 [ 93]: fbf2426d313a38ce +Block 0007 [ 94]: 4d737aa292130361 +Block 0007 [ 95]: c1eb918fba4db728 +Block 0007 [ 96]: 19c7bb8ed8bdd039 +Block 0007 [ 97]: 29cc46fb1db3081a +Block 0007 [ 98]: 6af7ead3aa61c786 +Block 0007 [ 99]: cdb8b00b8880bfb6 +Block 0007 [100]: b34176cd8343ba10 +Block 0007 [101]: b5a302876a9a9a2d +Block 0007 [102]: b766d763b9e23e61 +Block 0007 [103]: 3efd17036bb6ca0b +Block 0007 [104]: feeaae24f4c47ed1 +Block 0007 [105]: bebd53ac00c1c2a0 +Block 0007 [106]: babb3ef27e187adc +Block 0007 [107]: 981eeecfb50ac179 +Block 0007 [108]: 59188d843b69adfa +Block 0007 [109]: f4d2f0c370640543 +Block 0007 [110]: f725433a397d9b7e +Block 0007 [111]: 7505a3b205552a64 +Block 0007 [112]: a19ae22e984b2833 +Block 0007 [113]: fef5ba7a4a4de67d +Block 0007 [114]: 7dd338034b955296 +Block 0007 [115]: 60380e2b6e8b5651 +Block 0007 [116]: 1bf12c38cfaa4ccd +Block 0007 [117]: d8d9d8865e4da277 +Block 0007 [118]: 87ab45b1c1b2a472 +Block 0007 [119]: ac42c04e86a00b57 +Block 0007 [120]: f6f3afa0bfc7ee1a +Block 0007 [121]: a9d327166f257b5e +Block 0007 [122]: 8369e41dd8e7f1dc +Block 0007 [123]: b2541d86369b89c6 +Block 0007 [124]: 0c2e1060ad2cfb4d +Block 0007 [125]: f2d1ca5669641434 +Block 0007 [126]: a2f6616cc5520f24 +Block 0007 [127]: 1a5e4817b7ad354f +Block 0008 [ 0]: b9c7c2532b67d22b +Block 0008 [ 1]: 077ce77061aa2ff0 +Block 0008 [ 2]: 87adc5012fcc6d17 +Block 0008 [ 3]: 9d9bea1474b767e4 +Block 0008 [ 4]: cebe16566a953f30 +Block 0008 [ 5]: 9ad7069976e86c26 +Block 0008 [ 6]: ac1cd6d7c3be9fd5 +Block 0008 [ 7]: a0af6592942d74e6 +Block 0008 [ 8]: 62c54bb2125a6e98 +Block 0008 [ 9]: c98a354b32588b91 +Block 0008 [ 10]: f3b596fd6cf1e8bd +Block 0008 [ 11]: a8d5fb4cef80096c +Block 0008 [ 12]: 3d681d3f79cd27bc +Block 0008 [ 13]: df8fbea460aee1c4 +Block 0008 [ 14]: 5c75c3b402008252 +Block 0008 [ 15]: 580a6f636ab15434 +Block 0008 [ 16]: 208a7b74815ed1c3 +Block 0008 [ 17]: 1fb9abd67e26253e +Block 0008 [ 18]: e2b912f1b2e83e90 +Block 0008 [ 19]: e2e8a873d27242ab +Block 0008 [ 20]: 07f0cd5d2b520e6a +Block 0008 [ 21]: ad42bad9cbf997a7 +Block 0008 [ 22]: 833b071d6f74a63f +Block 0008 [ 23]: 48cef23c752c885e +Block 0008 [ 24]: 39f842734be8c8fd +Block 0008 [ 25]: 107782af44b5177a +Block 0008 [ 26]: 04439164e4963ec3 +Block 0008 [ 27]: 000c4a7af3d87aad +Block 0008 [ 28]: 1d853884ad7c35d1 +Block 0008 [ 29]: 7b898e1a009ae92b +Block 0008 [ 30]: 019a1f557de1c3b1 +Block 0008 [ 31]: 7587ba1dde02c979 +Block 0008 [ 32]: ac9a50a01d24a32f +Block 0008 [ 33]: d654c8db0fde8224 +Block 0008 [ 34]: da93df7fa2eb912a +Block 0008 [ 35]: 3d96657e8a3b7857 +Block 0008 [ 36]: f5c827e6634974f2 +Block 0008 [ 37]: e24f4f704a0d9606 +Block 0008 [ 38]: 4822ea21f1536e66 +Block 0008 [ 39]: 5f2d56075ce92649 +Block 0008 [ 40]: 7cf7365eec2c003e +Block 0008 [ 41]: d2072ae424d198a9 +Block 0008 [ 42]: bc0f44f4960bfeda +Block 0008 [ 43]: b9cf51e48deda197 +Block 0008 [ 44]: e1eeea36715a244b +Block 0008 [ 45]: c225441be8108083 +Block 0008 [ 46]: e31bce8554868b34 +Block 0008 [ 47]: c95ab4fc24c39772 +Block 0008 [ 48]: dec6166495e4ed32 +Block 0008 [ 49]: 9b923dbc7ca53682 +Block 0008 [ 50]: cbe461b15013d38a +Block 0008 [ 51]: 765cd1afecb13d26 +Block 0008 [ 52]: 6362c36a7d163513 +Block 0008 [ 53]: 72adc9a1f3a48bf8 +Block 0008 [ 54]: f5f68421f2f34166 +Block 0008 [ 55]: ea61e7179fe82d20 +Block 0008 [ 56]: 01662f9615ecdd3a +Block 0008 [ 57]: 17f61d1fc63ec481 +Block 0008 [ 58]: 0fe4fe28ef6821c5 +Block 0008 [ 59]: e681ba127361b647 +Block 0008 [ 60]: b191928ed0ed6e27 +Block 0008 [ 61]: ee67b65013c1a02e +Block 0008 [ 62]: 7376f8837774d67e +Block 0008 [ 63]: da60f51b24fa5db6 +Block 0008 [ 64]: da97f5dae1fb50bd +Block 0008 [ 65]: 3d897acc250ad297 +Block 0008 [ 66]: fc7eefc17b6e4d8f +Block 0008 [ 67]: d5a702a6e4bc4c77 +Block 0008 [ 68]: e680b62cfdbf407a +Block 0008 [ 69]: f01a14d0703e6713 +Block 0008 [ 70]: a50ab2984f01da78 +Block 0008 [ 71]: c81a6f7f9f0ff6b3 +Block 0008 [ 72]: 6af882b4197f35be +Block 0008 [ 73]: da153ae3f295e48d +Block 0008 [ 74]: 2144c2b8826db407 +Block 0008 [ 75]: 34a6080b38a6ffa8 +Block 0008 [ 76]: 4fba023c2961f20b +Block 0008 [ 77]: bf863224ec20a811 +Block 0008 [ 78]: 20c5125e6c39cfc9 +Block 0008 [ 79]: 0f5e74f9eb179b9a +Block 0008 [ 80]: 50dda8efcc4d1e77 +Block 0008 [ 81]: 6ea326dcb9006352 +Block 0008 [ 82]: 0389c30094ff80e0 +Block 0008 [ 83]: 7a7b9280301047f5 +Block 0008 [ 84]: c306819d8dc0c57b +Block 0008 [ 85]: 2c2d25d8a3b87926 +Block 0008 [ 86]: 3268d42a19fce381 +Block 0008 [ 87]: 65bb2ed5af98cb0d +Block 0008 [ 88]: 5db461cdec83a707 +Block 0008 [ 89]: 07eabe068ae1a576 +Block 0008 [ 90]: ca542c1db2c41368 +Block 0008 [ 91]: c0f6c2f19d388b31 +Block 0008 [ 92]: 67df7325f41a345e +Block 0008 [ 93]: 9f4a855eee802af2 +Block 0008 [ 94]: d308ac5aac84d191 +Block 0008 [ 95]: ab8e77fbb517080e +Block 0008 [ 96]: 050506ad63fc077d +Block 0008 [ 97]: ac2f98f6cf49f961 +Block 0008 [ 98]: 0998004b75a10f9f +Block 0008 [ 99]: 288a0cd29f0efb43 +Block 0008 [100]: 056f8ed8bad8f621 +Block 0008 [101]: 8f5774a97742bd65 +Block 0008 [102]: 8b8ab2e31359c1c5 +Block 0008 [103]: 852b384f17a635b2 +Block 0008 [104]: 2490e65cfacf7d22 +Block 0008 [105]: 2b15baa7e28aae41 +Block 0008 [106]: ed3c1c7ad7ac5646 +Block 0008 [107]: 24cf55a144ce1496 +Block 0008 [108]: a1c455ce9fe0dfb9 +Block 0008 [109]: f387f3a16d5cb9be +Block 0008 [110]: 8b48f8d6d65ea8d0 +Block 0008 [111]: 57eb999061ffc1da +Block 0008 [112]: 9163fc4867f0a9c5 +Block 0008 [113]: 6c0abdae81bdca0c +Block 0008 [114]: 38af67ebfaaf9b35 +Block 0008 [115]: 87b9ba3610e8c6b0 +Block 0008 [116]: 6b6f7fe3d7a42823 +Block 0008 [117]: cf7283ecbb972e62 +Block 0008 [118]: f006feb0d78c58e5 +Block 0008 [119]: 90bdf281b84ef947 +Block 0008 [120]: 8076948a0639e8dd +Block 0008 [121]: a911542a23ad3a85 +Block 0008 [122]: ae90a2f32e210a66 +Block 0008 [123]: bbced4d0627ead7f +Block 0008 [124]: 34c7c5f4f8da73f1 +Block 0008 [125]: 2029aae2afbc78dc +Block 0008 [126]: 7a1ab65f99792819 +Block 0008 [127]: 1c338df72ffafb0d +Block 0009 [ 0]: 90f63b41acfd2e3f +Block 0009 [ 1]: 2df1e2e603f91b0f +Block 0009 [ 2]: 5084f932783615e5 +Block 0009 [ 3]: a3710c3bfaf40ed0 +Block 0009 [ 4]: 13d4d81d5135df0f +Block 0009 [ 5]: 5dfeb4b8b74b2312 +Block 0009 [ 6]: 445e3a8c63053092 +Block 0009 [ 7]: b053c2140b29ad21 +Block 0009 [ 8]: 30a3517a523a9c9d +Block 0009 [ 9]: 3ee26153e2ef5731 +Block 0009 [ 10]: e3d9715f1c98d0d4 +Block 0009 [ 11]: 5cb14f3d7938ea32 +Block 0009 [ 12]: e0a2d15a050345df +Block 0009 [ 13]: b653b62615d0c5c0 +Block 0009 [ 14]: 0a13ebbb02227645 +Block 0009 [ 15]: fb27584fd730feae +Block 0009 [ 16]: 9de7027a352fc818 +Block 0009 [ 17]: 7ae68d9daadced50 +Block 0009 [ 18]: a7e012161f463b0f +Block 0009 [ 19]: d36322fbd9de50e8 +Block 0009 [ 20]: 33cee18a7b695d07 +Block 0009 [ 21]: a0a668e0d1079520 +Block 0009 [ 22]: 118beb776a2dab01 +Block 0009 [ 23]: cae16884e955da26 +Block 0009 [ 24]: f3ecd50fbb69b366 +Block 0009 [ 25]: f83690aecc4f84e1 +Block 0009 [ 26]: 2ebaeddbcdeb73ac +Block 0009 [ 27]: 361ec0b0acfffc17 +Block 0009 [ 28]: 5f49f0d5bf30edc9 +Block 0009 [ 29]: b07e1cfec13fdbcb +Block 0009 [ 30]: e9fb2ecc77c28262 +Block 0009 [ 31]: 7b47036980551052 +Block 0009 [ 32]: 2e804703942e3250 +Block 0009 [ 33]: 85c07d3d4bb3ceb3 +Block 0009 [ 34]: b310f1225e0bb382 +Block 0009 [ 35]: 9d13dfe845126a23 +Block 0009 [ 36]: 715274518ecb3edd +Block 0009 [ 37]: 7dbafe91429982f2 +Block 0009 [ 38]: bb103004f4b01569 +Block 0009 [ 39]: 37bebf44b2290105 +Block 0009 [ 40]: 3066f2347c59ae01 +Block 0009 [ 41]: 3622dad29d563c0d +Block 0009 [ 42]: af6200ec04529c2d +Block 0009 [ 43]: 6aaef2c134cc26cd +Block 0009 [ 44]: 15a1d9b32d636d66 +Block 0009 [ 45]: 66c47adabccb2e37 +Block 0009 [ 46]: 6b0a3a4f05bd126c +Block 0009 [ 47]: 2ef6b8d9fd0ac2c1 +Block 0009 [ 48]: 30d2dddb9c6fd9ae +Block 0009 [ 49]: 32b752b1d8d0f825 +Block 0009 [ 50]: 15f2273324185e41 +Block 0009 [ 51]: 2fc7cfaa0007f735 +Block 0009 [ 52]: 5bb0cb3e7a98dc42 +Block 0009 [ 53]: d4ba1caee83bd718 +Block 0009 [ 54]: d58bca8365593feb +Block 0009 [ 55]: 1caaa560f824f823 +Block 0009 [ 56]: 06d66004eef81ec8 +Block 0009 [ 57]: e62be588eb71c6e3 +Block 0009 [ 58]: 028af83ba978c75a +Block 0009 [ 59]: 455d36e5a57838c2 +Block 0009 [ 60]: 2271f285b39b417f +Block 0009 [ 61]: 19b9d33317ec5ce0 +Block 0009 [ 62]: 62a66573c00d9f1b +Block 0009 [ 63]: 1857e18294b8f3dd +Block 0009 [ 64]: 7926c357c015c014 +Block 0009 [ 65]: a57ad006cd650064 +Block 0009 [ 66]: f132763de2164979 +Block 0009 [ 67]: 1a6b884bf664c0ce +Block 0009 [ 68]: 4c7a58a1c301b62f +Block 0009 [ 69]: ca9ea9c9bb7ee4d5 +Block 0009 [ 70]: fda794c88609587f +Block 0009 [ 71]: 9113554d7df707b8 +Block 0009 [ 72]: dc15bdf224dd0352 +Block 0009 [ 73]: 6921c623544303e8 +Block 0009 [ 74]: b35a0a99d7d443ee +Block 0009 [ 75]: cc2a220c616c5049 +Block 0009 [ 76]: 7671e209b5318ee5 +Block 0009 [ 77]: a5e864ad143f8d39 +Block 0009 [ 78]: b06abe5900bffbba +Block 0009 [ 79]: 158d9421b8c0f9e4 +Block 0009 [ 80]: 2da152014cab559b +Block 0009 [ 81]: b8c17e04ad93e8f8 +Block 0009 [ 82]: 52eac4a8a411ba69 +Block 0009 [ 83]: 7a8f00a44b79615d +Block 0009 [ 84]: e1cdfaaeb0d07db2 +Block 0009 [ 85]: e78c69027b4403bd +Block 0009 [ 86]: 8d0ace0a9de358ef +Block 0009 [ 87]: 259e17069c1985ef +Block 0009 [ 88]: 2bbcf3de532871f8 +Block 0009 [ 89]: 0f0b5a3dc838ebed +Block 0009 [ 90]: 9039b06f29793ff1 +Block 0009 [ 91]: e3cdfa84c5e825b6 +Block 0009 [ 92]: 48d5c902a1d7445e +Block 0009 [ 93]: d323aabdadda5174 +Block 0009 [ 94]: bd286464b4d67c67 +Block 0009 [ 95]: b0c54c030c7afa1e +Block 0009 [ 96]: 3baa0122d9b14320 +Block 0009 [ 97]: aab0ea19711df1ba +Block 0009 [ 98]: 9469d4ce54a3fced +Block 0009 [ 99]: b1c72afddc74f4d0 +Block 0009 [100]: c29670cebb2988c1 +Block 0009 [101]: bf02191c60bfa561 +Block 0009 [102]: cf357b9034136a10 +Block 0009 [103]: c23d5df417f88814 +Block 0009 [104]: 83114ef35de168f2 +Block 0009 [105]: 058f7dc566f6f951 +Block 0009 [106]: b6ff38f14922933b +Block 0009 [107]: 0be1429882f0911e +Block 0009 [108]: f5efae1c14b31f47 +Block 0009 [109]: f8b4df8a360a01a5 +Block 0009 [110]: 43e67a6ccd951ba0 +Block 0009 [111]: ed95ded23d5b20b6 +Block 0009 [112]: 22b130913c60e481 +Block 0009 [113]: cb5a40e52e1e1104 +Block 0009 [114]: 7011efed737ae691 +Block 0009 [115]: 8a59bf8464200afb +Block 0009 [116]: b2d8f9050d97513c +Block 0009 [117]: d57f69030504491e +Block 0009 [118]: 2403848983113b0b +Block 0009 [119]: 22db081455729811 +Block 0009 [120]: d0db5aefd0419fd5 +Block 0009 [121]: e41070df7b2fd51b +Block 0009 [122]: 0fce0e7ffb3d7840 +Block 0009 [123]: 43fbaec79d79039a +Block 0009 [124]: 1d71fb266791c825 +Block 0009 [125]: aedf742f89a5b302 +Block 0009 [126]: 41c0f73c931dbe24 +Block 0009 [127]: 1c8cba64e64e34f2 +Block 0010 [ 0]: 03162a3d2fb31a25 +Block 0010 [ 1]: 95d94a611da86488 +Block 0010 [ 2]: a04524d51f43fbfe +Block 0010 [ 3]: b5fbf83fe35e1742 +Block 0010 [ 4]: 1702d9d1540b5e0e +Block 0010 [ 5]: a9cb1fc14db76b1c +Block 0010 [ 6]: 482da64056af648d +Block 0010 [ 7]: c5c6e169209aa2d1 +Block 0010 [ 8]: 5ff81bbb23cfa875 +Block 0010 [ 9]: 0a760c8cb3fff112 +Block 0010 [ 10]: a2af68f0049ca01d +Block 0010 [ 11]: 8b612089307f6546 +Block 0010 [ 12]: 7fc69ebacf75d649 +Block 0010 [ 13]: 72305888dff67bdc +Block 0010 [ 14]: 8801e7b401c32102 +Block 0010 [ 15]: 2222112df4517523 +Block 0010 [ 16]: 4ae3745fe43db23b +Block 0010 [ 17]: 0ae88e2a493b9a1f +Block 0010 [ 18]: a9cc47ea89a7bf49 +Block 0010 [ 19]: cbbe32c2f6b863b9 +Block 0010 [ 20]: 2f06cab4c8f4888f +Block 0010 [ 21]: 3b144622e62f7e5a +Block 0010 [ 22]: a859a6ec7da1e596 +Block 0010 [ 23]: 5fb8968a8d04c7ef +Block 0010 [ 24]: 5aaac0a73b6928e1 +Block 0010 [ 25]: 68cd864b58e58b1f +Block 0010 [ 26]: f0d9dfbf38e75ea1 +Block 0010 [ 27]: b92936821414ca29 +Block 0010 [ 28]: 19fc4f8375dbbd8e +Block 0010 [ 29]: ff51aec8104e45e6 +Block 0010 [ 30]: ad4518cca50dc645 +Block 0010 [ 31]: 42bbffddbf9af0b9 +Block 0010 [ 32]: b8568cf87046e23b +Block 0010 [ 33]: 28e5aca86ce23c97 +Block 0010 [ 34]: df69b5becf4306ee +Block 0010 [ 35]: a7e30b2fb0abf323 +Block 0010 [ 36]: f1e4b8b603ee5497 +Block 0010 [ 37]: 8937c677fb8ecdbd +Block 0010 [ 38]: f0cbce948a4fd7c5 +Block 0010 [ 39]: de19ec873867caf8 +Block 0010 [ 40]: 457f4d3348476483 +Block 0010 [ 41]: e19a51d9c78b78b3 +Block 0010 [ 42]: 97bebd6958586035 +Block 0010 [ 43]: 22a862ee6959c5d9 +Block 0010 [ 44]: eb6e508abb1c4e05 +Block 0010 [ 45]: 14234c65a136a786 +Block 0010 [ 46]: af12338c1ca6ad2e +Block 0010 [ 47]: 03d183bef690445e +Block 0010 [ 48]: 326ec9c641ea0ecf +Block 0010 [ 49]: ce787971555c98f4 +Block 0010 [ 50]: 0aa538a409c2cecc +Block 0010 [ 51]: e5ad409a55648f06 +Block 0010 [ 52]: 3b3c3e48dfbcf089 +Block 0010 [ 53]: 0be74cbe5ab3bda8 +Block 0010 [ 54]: 52c78e15e5b2adcd +Block 0010 [ 55]: a6acd621e94df26d +Block 0010 [ 56]: 19b3601aad02118b +Block 0010 [ 57]: ea86b5c50e080ee9 +Block 0010 [ 58]: e30b54d9ae2a555e +Block 0010 [ 59]: 0dd1c1abcaa0bf79 +Block 0010 [ 60]: da3dc56d55130978 +Block 0010 [ 61]: 87c97e8e8187d127 +Block 0010 [ 62]: 4720ff4be1fe0973 +Block 0010 [ 63]: 8ffa4974698469b8 +Block 0010 [ 64]: b74f20d179b01198 +Block 0010 [ 65]: 1cf9956c0b469776 +Block 0010 [ 66]: 0a4c0c1e2d98dd4e +Block 0010 [ 67]: 30ad0a024b0059dd +Block 0010 [ 68]: 0753951043b731c4 +Block 0010 [ 69]: c54d897d6a39226d +Block 0010 [ 70]: 7fce081f2122b0f0 +Block 0010 [ 71]: 5e003b5cbcc0aba4 +Block 0010 [ 72]: b584571f879d7593 +Block 0010 [ 73]: c0d22747a0873a89 +Block 0010 [ 74]: 096b1ab7cc3cd779 +Block 0010 [ 75]: 2104787f82456800 +Block 0010 [ 76]: 87ffeb72fb25ca92 +Block 0010 [ 77]: a6d45632612c75f9 +Block 0010 [ 78]: d84a222c579ad8a7 +Block 0010 [ 79]: 260e49a3917db014 +Block 0010 [ 80]: ddc70aef5f5f1289 +Block 0010 [ 81]: ce75db71f8307c39 +Block 0010 [ 82]: 988669c21d68b798 +Block 0010 [ 83]: bc253d44309e988d +Block 0010 [ 84]: 133b2d34fb862fb4 +Block 0010 [ 85]: 337fcded4be0ef7f +Block 0010 [ 86]: dba1a8dc49b65f56 +Block 0010 [ 87]: 70d4d2cc01651078 +Block 0010 [ 88]: 83d6646e37f6e2b6 +Block 0010 [ 89]: 27503f337a53e990 +Block 0010 [ 90]: 44aafbae9a1c5514 +Block 0010 [ 91]: 7539a36b19544cc7 +Block 0010 [ 92]: 5d0623d16de3b93e +Block 0010 [ 93]: 623e6fa8cf8dc502 +Block 0010 [ 94]: 084ac30cc5095a42 +Block 0010 [ 95]: bf6a2b9d4438871e +Block 0010 [ 96]: 6742f0a4e7b224f8 +Block 0010 [ 97]: 00e3179dc5145dfb +Block 0010 [ 98]: 3809bbecac742553 +Block 0010 [ 99]: 0de0efc339600332 +Block 0010 [100]: b86f4cda47b795f1 +Block 0010 [101]: ebb9583575c70f47 +Block 0010 [102]: 6601cf1f14855e00 +Block 0010 [103]: 54a19f47266bae3d +Block 0010 [104]: 2b30afe1ffff7bbe +Block 0010 [105]: e7186358f45ec150 +Block 0010 [106]: 2f3fc0f4ec78188b +Block 0010 [107]: dfb03a09423769a0 +Block 0010 [108]: c92df3af123f69a5 +Block 0010 [109]: f61f79e3b60ad2ae +Block 0010 [110]: 62155dab043e8e17 +Block 0010 [111]: 72b1b9b0ab48243a +Block 0010 [112]: 167a89196e5e3cb2 +Block 0010 [113]: 3f601eeec23df9d4 +Block 0010 [114]: 965d8400a3a092b2 +Block 0010 [115]: 611dc2ebbbb43701 +Block 0010 [116]: 27bb3105406300f7 +Block 0010 [117]: 435783800ec13a83 +Block 0010 [118]: eb7bb000b8de1dcc +Block 0010 [119]: 0b91a3a50360b857 +Block 0010 [120]: 431dc1068099cb7f +Block 0010 [121]: 63640dba63f66b02 +Block 0010 [122]: c175a55bb8195031 +Block 0010 [123]: cc39c58d7546d7e5 +Block 0010 [124]: 5130c4ed8e0d553e +Block 0010 [125]: 481a68ccccccb7ba +Block 0010 [126]: a31c3f8ea54032c0 +Block 0010 [127]: bc790a78ad15e281 +Block 0011 [ 0]: cd289066739699b7 +Block 0011 [ 1]: ef6f08e83b2279cc +Block 0011 [ 2]: bfe116223a67eac7 +Block 0011 [ 3]: 5ed9e51a2f3fa756 +Block 0011 [ 4]: d091e01529a66c68 +Block 0011 [ 5]: 6c00296717dc4db4 +Block 0011 [ 6]: 8e1a0e28f76b7b3a +Block 0011 [ 7]: ae25fb50b09ed824 +Block 0011 [ 8]: 93d73babe4143961 +Block 0011 [ 9]: 0da1f4d09c94370f +Block 0011 [ 10]: 30f77c7c452d7ce4 +Block 0011 [ 11]: 788024e40ab22171 +Block 0011 [ 12]: 26ccd25ef63a2f11 +Block 0011 [ 13]: d1c07c37e293eac0 +Block 0011 [ 14]: c0aa81d79ad9a8a6 +Block 0011 [ 15]: 6ec7214f553d8c69 +Block 0011 [ 16]: 893d6226e03c6bd1 +Block 0011 [ 17]: 962ed1779a6573bc +Block 0011 [ 18]: 7300c734c3c57e79 +Block 0011 [ 19]: 0834fd221492ebd2 +Block 0011 [ 20]: eab8cb092d44c594 +Block 0011 [ 21]: d85bc9e0605c61c9 +Block 0011 [ 22]: 0f10bcda5cc091d6 +Block 0011 [ 23]: 5dd2835a198b8ac3 +Block 0011 [ 24]: 414c25271a38a161 +Block 0011 [ 25]: 1d0c907d6caab7f5 +Block 0011 [ 26]: f6100897ed6eed1e +Block 0011 [ 27]: cd54dfefe46f6a86 +Block 0011 [ 28]: 9208e77496c06a3a +Block 0011 [ 29]: 296237fd89703010 +Block 0011 [ 30]: 03c11023e62bcf5f +Block 0011 [ 31]: 8851fb5b68678dcd +Block 0011 [ 32]: 40ff9e933fb5d757 +Block 0011 [ 33]: 18859d7030dd523c +Block 0011 [ 34]: c8cb6d5521ef7e7b +Block 0011 [ 35]: 88166acdfb046b45 +Block 0011 [ 36]: 2647d84ea607a84d +Block 0011 [ 37]: 9de18c9dcc05463a +Block 0011 [ 38]: 58e3a7730182d15c +Block 0011 [ 39]: b66213fb6a76642d +Block 0011 [ 40]: ec44e39215a9ac17 +Block 0011 [ 41]: 994c8fd34794739f +Block 0011 [ 42]: bc07c6d306bf6538 +Block 0011 [ 43]: 334dd171cfbf7e0d +Block 0011 [ 44]: 6ca8cf56b84e8066 +Block 0011 [ 45]: 269115bbc80e6bda +Block 0011 [ 46]: 7a58d538e5fd4fd7 +Block 0011 [ 47]: 10c69a27de84b7ce +Block 0011 [ 48]: 588946878009a2df +Block 0011 [ 49]: aab803acae234714 +Block 0011 [ 50]: 0db30430f182d18b +Block 0011 [ 51]: 374488ebafbd6f8d +Block 0011 [ 52]: 51bea2536583c798 +Block 0011 [ 53]: 5349f72cc9d30415 +Block 0011 [ 54]: 17e62cbd6fccce76 +Block 0011 [ 55]: f6ca270555d78986 +Block 0011 [ 56]: bd9f558733940b5b +Block 0011 [ 57]: 310c6473cf1f3eb5 +Block 0011 [ 58]: aaf61ebeb7b59d94 +Block 0011 [ 59]: c9ba9470ca8d94c5 +Block 0011 [ 60]: a7ee2542ad140b41 +Block 0011 [ 61]: 37d3fbf1ea5e25ce +Block 0011 [ 62]: df5c2e87a48fcf7a +Block 0011 [ 63]: 96ea0a40093da6bc +Block 0011 [ 64]: 1832e3d9420b9254 +Block 0011 [ 65]: 26d02a9dd32e1691 +Block 0011 [ 66]: 42ae4f33f51cbb54 +Block 0011 [ 67]: f8cd3a46c99d6bc8 +Block 0011 [ 68]: ae0e89024a1a7111 +Block 0011 [ 69]: 54127d1e8d5dd168 +Block 0011 [ 70]: 01fde931daffd7f4 +Block 0011 [ 71]: 350c6e16723fdd1c +Block 0011 [ 72]: df22c95585648b1a +Block 0011 [ 73]: e1f0024942478c76 +Block 0011 [ 74]: 70335cf2f4de5df2 +Block 0011 [ 75]: cdbe12e0abb4823c +Block 0011 [ 76]: fde59debfdbaac10 +Block 0011 [ 77]: 0bff220a8928c2dc +Block 0011 [ 78]: 0461fa55d303407a +Block 0011 [ 79]: 1634a41d6c9a5f1a +Block 0011 [ 80]: 6e6e4cd6db594d4f +Block 0011 [ 81]: dd18e467511a09ee +Block 0011 [ 82]: 9bdf9e3b17fd4342 +Block 0011 [ 83]: 8609696d927795b9 +Block 0011 [ 84]: d6d3fbf43587b11e +Block 0011 [ 85]: 6991a74f5a870d29 +Block 0011 [ 86]: d9cd608fee2e6721 +Block 0011 [ 87]: 6170131c10cc2374 +Block 0011 [ 88]: b0ab65f7594f8cc5 +Block 0011 [ 89]: d7185a9e216c4c1e +Block 0011 [ 90]: dde483d99f7e02a1 +Block 0011 [ 91]: e083b70b71230d2f +Block 0011 [ 92]: 1af2c5c2bd1e6dfe +Block 0011 [ 93]: c21b1fe7adc10d54 +Block 0011 [ 94]: bad581e4fbd50269 +Block 0011 [ 95]: 2d635c846e09fa3b +Block 0011 [ 96]: c093b53ede074fc2 +Block 0011 [ 97]: 41d4e984f8ad23d8 +Block 0011 [ 98]: 8a2bce31da109bce +Block 0011 [ 99]: 9725a483e6c34623 +Block 0011 [100]: 13089cdee7c3f5f2 +Block 0011 [101]: 3d4419b6807b8bfb +Block 0011 [102]: 2b609b191757fa48 +Block 0011 [103]: b171e65fdc7a27d9 +Block 0011 [104]: 69b8c8e5323e729b +Block 0011 [105]: 82357f1cfbdf2208 +Block 0011 [106]: e68036deb4d37145 +Block 0011 [107]: 6eecd0042852d038 +Block 0011 [108]: bb449cc49f3b4219 +Block 0011 [109]: 53e78414e3c3fa7f +Block 0011 [110]: f26d647fda1a1903 +Block 0011 [111]: c7788d7a05cb74d4 +Block 0011 [112]: f91960b42f1ea818 +Block 0011 [113]: 4fffd18f0deae9fb +Block 0011 [114]: 5ac77014671515e8 +Block 0011 [115]: d01d29217b293089 +Block 0011 [116]: c987835d3b2757b1 +Block 0011 [117]: 1b9d12290c75783b +Block 0011 [118]: 1b609eb672703181 +Block 0011 [119]: f0d7bed8ef5544fe +Block 0011 [120]: fd908aa2b4d52443 +Block 0011 [121]: 03ac288fa342e752 +Block 0011 [122]: 3e131ef012aef122 +Block 0011 [123]: acbb9427eb6c4095 +Block 0011 [124]: 65779c01fd20ff68 +Block 0011 [125]: ce2a60b7bbb1e01e +Block 0011 [126]: 5774720a372271f5 +Block 0011 [127]: ea30c4ce0712381b +Block 0012 [ 0]: 1c2a63bac7c154c1 +Block 0012 [ 1]: 42508ad075a16b3a +Block 0012 [ 2]: 791f280551d06f3e +Block 0012 [ 3]: 348a853e2533a525 +Block 0012 [ 4]: 3df830f0a023d57f +Block 0012 [ 5]: 009821b9b5259d3b +Block 0012 [ 6]: 0473a5252522f400 +Block 0012 [ 7]: a4cc17e35e27a5d3 +Block 0012 [ 8]: 3cec4c0926ed9a1d +Block 0012 [ 9]: 92e1ebf0f81b264d +Block 0012 [ 10]: 043aac8959c4f50e +Block 0012 [ 11]: 8216989f36994386 +Block 0012 [ 12]: 6c7a46ec0f593b4a +Block 0012 [ 13]: 615d9bc53c8aafd4 +Block 0012 [ 14]: e69671624cf39231 +Block 0012 [ 15]: de31127ba2643136 +Block 0012 [ 16]: 2645ccbeb9cc81e6 +Block 0012 [ 17]: 7872e0f680327659 +Block 0012 [ 18]: 9db25e0c68ddf8f9 +Block 0012 [ 19]: 6f27907812ee7d29 +Block 0012 [ 20]: b656b4af253ea7e0 +Block 0012 [ 21]: 2178637bdfcf46b3 +Block 0012 [ 22]: 1035f16577c1ba85 +Block 0012 [ 23]: 8cbeee81e32da9a2 +Block 0012 [ 24]: 475ae5e8a1a7fd03 +Block 0012 [ 25]: cd32872310c4cf5b +Block 0012 [ 26]: 1300b982803803d2 +Block 0012 [ 27]: 07f8ba5cd1184097 +Block 0012 [ 28]: 76d7fca7033112cf +Block 0012 [ 29]: acc28de2c427f438 +Block 0012 [ 30]: 6828aef30f3ef56e +Block 0012 [ 31]: 4da395dae574e44c +Block 0012 [ 32]: 827494c27d25fb51 +Block 0012 [ 33]: c9b5d7e7cc3eec16 +Block 0012 [ 34]: e068185515567a4c +Block 0012 [ 35]: ed2d26c2c0ea4970 +Block 0012 [ 36]: 1780aea878a1a49c +Block 0012 [ 37]: c04af2793f6c3d3a +Block 0012 [ 38]: 13494fccd3d844b8 +Block 0012 [ 39]: 1dbe9064ca0da769 +Block 0012 [ 40]: 6c4938243bf4e221 +Block 0012 [ 41]: 49aeca73f743075f +Block 0012 [ 42]: 684b4dc878fb5a2a +Block 0012 [ 43]: 4d8c36434eccb40d +Block 0012 [ 44]: a5ab9e20d5b38fd0 +Block 0012 [ 45]: b46dcc6a69e362c7 +Block 0012 [ 46]: 625077c4ab8f7e5b +Block 0012 [ 47]: 2f2b6451831786fa +Block 0012 [ 48]: 29bd2a796a638e84 +Block 0012 [ 49]: 9e5f8787ba2edfed +Block 0012 [ 50]: 16ec9a39d20182ac +Block 0012 [ 51]: abe01ec3ab8b71e9 +Block 0012 [ 52]: 145e8d1c67bf159f +Block 0012 [ 53]: 50a981c572813f38 +Block 0012 [ 54]: 87977fd04b380373 +Block 0012 [ 55]: 6e72ee7f8a5f195c +Block 0012 [ 56]: 55298c77c6435c8c +Block 0012 [ 57]: d1ea5008f239e8bc +Block 0012 [ 58]: 2d2b1d358bea1c27 +Block 0012 [ 59]: 9d293b3e70505688 +Block 0012 [ 60]: 1f57a815b02dd03f +Block 0012 [ 61]: 5bd99c9650ebed7d +Block 0012 [ 62]: be52d8ff71651ed3 +Block 0012 [ 63]: 35f3a2d423c0edc9 +Block 0012 [ 64]: d43ec0fbc3dbed4e +Block 0012 [ 65]: eb53cea0ec093139 +Block 0012 [ 66]: c200c6a5337f3c77 +Block 0012 [ 67]: c0e16f0190ef51f8 +Block 0012 [ 68]: 6c0c98019fa49148 +Block 0012 [ 69]: 15906d5647aaea5c +Block 0012 [ 70]: 712a775873db7424 +Block 0012 [ 71]: 2eac1964eabdcae4 +Block 0012 [ 72]: e71e32396b0ad27b +Block 0012 [ 73]: bef6323dbbc3818c +Block 0012 [ 74]: a9dd5cfdb6630790 +Block 0012 [ 75]: f064029a11a00acd +Block 0012 [ 76]: 696332e154302e67 +Block 0012 [ 77]: e2582460cd2816ef +Block 0012 [ 78]: e59950b4cfaa467d +Block 0012 [ 79]: 5991d99e5d1bacef +Block 0012 [ 80]: 16d23dd64096e1ed +Block 0012 [ 81]: 984eb0ed25ed2394 +Block 0012 [ 82]: 2f755244e1fc2598 +Block 0012 [ 83]: cb708970664b867c +Block 0012 [ 84]: 2ef6c4c2da67430d +Block 0012 [ 85]: d7c59053f2ba40b8 +Block 0012 [ 86]: df85654b59aaab8f +Block 0012 [ 87]: 6fc5e4f54a421593 +Block 0012 [ 88]: a8ba9d179663aa0e +Block 0012 [ 89]: c5da879ae66728a6 +Block 0012 [ 90]: e220fbd3cee2b2fe +Block 0012 [ 91]: f8b1b1e10aeec07b +Block 0012 [ 92]: d7175c31f480cd3e +Block 0012 [ 93]: 3a79224610a8642b +Block 0012 [ 94]: 270b4264c407cd08 +Block 0012 [ 95]: 738f6bb7f9abbb48 +Block 0012 [ 96]: e7a11c9a50808fce +Block 0012 [ 97]: 8663ca2db53e308f +Block 0012 [ 98]: 92bfd65af2b01a33 +Block 0012 [ 99]: 67205230b49bc74c +Block 0012 [100]: 5b4a4df4a812b2e3 +Block 0012 [101]: 8d1454ccca03b57f +Block 0012 [102]: 269156b9cadc71d9 +Block 0012 [103]: 4f9606502988716f +Block 0012 [104]: 5afbbff2b0d632d1 +Block 0012 [105]: c4ff98688046c0fb +Block 0012 [106]: df1d7b1d65f4c708 +Block 0012 [107]: a5ded21243ff9887 +Block 0012 [108]: c1ed83564bac320c +Block 0012 [109]: 87644000cf3b6328 +Block 0012 [110]: 03eddf451f4582ad +Block 0012 [111]: 4e99bfef863aefe3 +Block 0012 [112]: f4c5c9a281af9741 +Block 0012 [113]: f00a08a68c220c3c +Block 0012 [114]: b7c633c54afc5771 +Block 0012 [115]: ecde6342173832d9 +Block 0012 [116]: 25290781e957d9b5 +Block 0012 [117]: 1885d88000e584ad +Block 0012 [118]: 03b8e9a7748e4481 +Block 0012 [119]: f207874f5d14dbc3 +Block 0012 [120]: 39c8600104de16cd +Block 0012 [121]: 90c31d4b18011207 +Block 0012 [122]: 11c96fb4b8548f7a +Block 0012 [123]: 1548cae3f9a6fee0 +Block 0012 [124]: e46b97ed40e220d7 +Block 0012 [125]: 59cd30aea307e20f +Block 0012 [126]: 7e774fa0cf2e25e4 +Block 0012 [127]: 368f296b22ac7048 +Block 0013 [ 0]: 690c233779fcd1a5 +Block 0013 [ 1]: 164d19b92fd845e5 +Block 0013 [ 2]: 4a60478f329d03d1 +Block 0013 [ 3]: f6e7a353dc1d8509 +Block 0013 [ 4]: 8c6c26e9bce3999c +Block 0013 [ 5]: 73d1dba4d13a7fa1 +Block 0013 [ 6]: de62d56f692c8b88 +Block 0013 [ 7]: 4029a641b255e05b +Block 0013 [ 8]: e849c487d21a109d +Block 0013 [ 9]: b3752eb956b5a28c +Block 0013 [ 10]: 43b04c0f444343df +Block 0013 [ 11]: da8b8019e3177dcf +Block 0013 [ 12]: 4e4512fa70430746 +Block 0013 [ 13]: 68d6ceb3dbcf3abb +Block 0013 [ 14]: a54ff7cacea91ee1 +Block 0013 [ 15]: f6f265399b8e3390 +Block 0013 [ 16]: 77a159a100d38741 +Block 0013 [ 17]: d2b1cca843b0244b +Block 0013 [ 18]: 562e3eeba500ed4a +Block 0013 [ 19]: fb0f37bdcece65db +Block 0013 [ 20]: 698b10976e3f51d2 +Block 0013 [ 21]: 88d07ea552c403e6 +Block 0013 [ 22]: 65d5ab4c88a0c847 +Block 0013 [ 23]: e0c49b553e82b0c2 +Block 0013 [ 24]: a85aa2f95bed56f2 +Block 0013 [ 25]: 8920d955defe3c8a +Block 0013 [ 26]: d62b529a0274d319 +Block 0013 [ 27]: fee24b797049ae16 +Block 0013 [ 28]: 16710bb090bc2451 +Block 0013 [ 29]: 41a2a3df035869da +Block 0013 [ 30]: 2e8a999878b3c0be +Block 0013 [ 31]: afa17424460f43a3 +Block 0013 [ 32]: 3ab13cd5fe21b763 +Block 0013 [ 33]: 6409ae0b067e5573 +Block 0013 [ 34]: 54add50ef70c3e80 +Block 0013 [ 35]: 778cae26c9dbabf1 +Block 0013 [ 36]: 1ad4e56c961eeeed +Block 0013 [ 37]: c74678ca700e7048 +Block 0013 [ 38]: a5014f9ba1895d62 +Block 0013 [ 39]: d5909f7f417177a1 +Block 0013 [ 40]: eba69c817c3aefb5 +Block 0013 [ 41]: 63d57343f3fabf6f +Block 0013 [ 42]: 0a2b03f5fbf2010c +Block 0013 [ 43]: c5ba82905af74eda +Block 0013 [ 44]: 983ce80682e205ea +Block 0013 [ 45]: 7b89eb6563073133 +Block 0013 [ 46]: 030427ac1d91dc06 +Block 0013 [ 47]: 2e5454dd24ed6d24 +Block 0013 [ 48]: 48c692282390170c +Block 0013 [ 49]: 6182b733e5fcda88 +Block 0013 [ 50]: 29be37f56c231a16 +Block 0013 [ 51]: 9863267f76bb14ac +Block 0013 [ 52]: dff4f3f9230b833f +Block 0013 [ 53]: f10677d82116f55e +Block 0013 [ 54]: c6e3bcdc02c40157 +Block 0013 [ 55]: 0e356fa761c71a5f +Block 0013 [ 56]: 267b619a0368396b +Block 0013 [ 57]: 323b19403de6fa35 +Block 0013 [ 58]: 4b4927454270439c +Block 0013 [ 59]: 56b4024ff5fa70b1 +Block 0013 [ 60]: 78aa7bf906495eea +Block 0013 [ 61]: 981cb071b1d932bb +Block 0013 [ 62]: 0119f99b266444ad +Block 0013 [ 63]: a63f7e923977a02d +Block 0013 [ 64]: ff44a639740dc6e0 +Block 0013 [ 65]: 6e78313d8ee1b7f0 +Block 0013 [ 66]: ebd4e567ff5d0bd4 +Block 0013 [ 67]: 04fc7e127f1363d5 +Block 0013 [ 68]: 9f854557dc7cdc2a +Block 0013 [ 69]: 123a85765004f761 +Block 0013 [ 70]: 25987189fdc1c199 +Block 0013 [ 71]: 7645eec6d56596eb +Block 0013 [ 72]: de3d640e12f4a2e4 +Block 0013 [ 73]: a7088a305483aafa +Block 0013 [ 74]: 69f5c4f93a37c42c +Block 0013 [ 75]: 5a86c47ac539bfcd +Block 0013 [ 76]: 7cf4ce6c9207945c +Block 0013 [ 77]: 0cf8a991245eda31 +Block 0013 [ 78]: bacb196f26dba8ec +Block 0013 [ 79]: 1990ff657d9e0653 +Block 0013 [ 80]: 5eef63b1d0fb79e9 +Block 0013 [ 81]: 693d7795607687c5 +Block 0013 [ 82]: 2f0e3e3df3258209 +Block 0013 [ 83]: e5821367c959a292 +Block 0013 [ 84]: bc6eb31a2247bc03 +Block 0013 [ 85]: 6c82f7f810850d1b +Block 0013 [ 86]: 465322d01d969ea6 +Block 0013 [ 87]: 0dd07730117537b3 +Block 0013 [ 88]: 5d99807522c99cfa +Block 0013 [ 89]: c22a3ee8bf8419e6 +Block 0013 [ 90]: 4751bb03660f437b +Block 0013 [ 91]: 951e7871e44de80f +Block 0013 [ 92]: 8f4b787a3bc1a4ac +Block 0013 [ 93]: 437f765c7c45ac61 +Block 0013 [ 94]: d6283c5b3a90ad12 +Block 0013 [ 95]: 54099af4833a840c +Block 0013 [ 96]: 89ae56f7a1608fe9 +Block 0013 [ 97]: 680a073db29a30ac +Block 0013 [ 98]: f4518f7e14a2fbf4 +Block 0013 [ 99]: 94858d8127d3fbf0 +Block 0013 [100]: 9964c0749ef69904 +Block 0013 [101]: dfbb7bf3bcc80371 +Block 0013 [102]: 2b177b792a857f68 +Block 0013 [103]: fb7575b39037ef56 +Block 0013 [104]: b1047efa3fcad858 +Block 0013 [105]: c53c4c7aad92dfad +Block 0013 [106]: a68bd64b9f9a8e32 +Block 0013 [107]: a1ffa9474cd19e6d +Block 0013 [108]: 51f0cf2b00ef294b +Block 0013 [109]: ad54422b421ba9b7 +Block 0013 [110]: b33b2166933e82cf +Block 0013 [111]: d998e290753b0c2e +Block 0013 [112]: d5b55ce657f61ff4 +Block 0013 [113]: 1a2ff90cc7ac584e +Block 0013 [114]: e85ee2492584f982 +Block 0013 [115]: 9c1cf32314ee8aeb +Block 0013 [116]: f1fa688c871d1bf9 +Block 0013 [117]: 169d32554781beaa +Block 0013 [118]: 523aed8c7d307c93 +Block 0013 [119]: 2b7b881cb3c586b7 +Block 0013 [120]: 394a238db0bf1022 +Block 0013 [121]: d89139f29d14d6db +Block 0013 [122]: 71ef3f099cd3352f +Block 0013 [123]: b420e528391858bf +Block 0013 [124]: 6ebce924b5f8b524 +Block 0013 [125]: 8df56ab35b4dc343 +Block 0013 [126]: fe60f549720c38e5 +Block 0013 [127]: 52b2844a8ad07c19 +Block 0014 [ 0]: 42f9a2216ea60ceb +Block 0014 [ 1]: f4be235f9165be42 +Block 0014 [ 2]: e789f9d5fa754b79 +Block 0014 [ 3]: 022854d55d727111 +Block 0014 [ 4]: 812eb2f323f74d88 +Block 0014 [ 5]: fbcf65d73d76eaac +Block 0014 [ 6]: a4fac1040fb1be3c +Block 0014 [ 7]: 9a540a2bc0a1aa09 +Block 0014 [ 8]: fa65ffe434f56fb5 +Block 0014 [ 9]: 4b065f486f802cb1 +Block 0014 [ 10]: 5879b735d57c9adb +Block 0014 [ 11]: 7b7917daf59c28d7 +Block 0014 [ 12]: 17200f95067efd16 +Block 0014 [ 13]: 5d205d348a48db4d +Block 0014 [ 14]: 42100e93335dca01 +Block 0014 [ 15]: 69618baff0475d71 +Block 0014 [ 16]: ead862e0e6687f0d +Block 0014 [ 17]: 653c798b5dc34141 +Block 0014 [ 18]: c53378cd5de69d1b +Block 0014 [ 19]: a86b278f7d653ce2 +Block 0014 [ 20]: 5ba4121570a62068 +Block 0014 [ 21]: ae1ef5ab3f8b769b +Block 0014 [ 22]: 0227f65cc1231b76 +Block 0014 [ 23]: a8e28a1702dbb594 +Block 0014 [ 24]: 03e66ff4e4a2b18f +Block 0014 [ 25]: 101a43cad5c5fe60 +Block 0014 [ 26]: 98eb2eb0a56028a0 +Block 0014 [ 27]: 5877b7de89886613 +Block 0014 [ 28]: cfd4e8cca45b1790 +Block 0014 [ 29]: e4b35e3874b9e876 +Block 0014 [ 30]: 14541160c6b3ee02 +Block 0014 [ 31]: dd81bacea364da1d +Block 0014 [ 32]: 36fb0d5cbbb8dae3 +Block 0014 [ 33]: a5e78dbb96f499fe +Block 0014 [ 34]: cb9e478672e4fca6 +Block 0014 [ 35]: 2fb70e58b6f44554 +Block 0014 [ 36]: 229f985536cfbdc5 +Block 0014 [ 37]: 4777ce4b21b955dc +Block 0014 [ 38]: 35bedadfd4af9b10 +Block 0014 [ 39]: f0eb52f55c675a29 +Block 0014 [ 40]: 6ff3abb4b0918527 +Block 0014 [ 41]: a5fca11483c388bc +Block 0014 [ 42]: d253b0c295c6fbf8 +Block 0014 [ 43]: df39a28a23b4f038 +Block 0014 [ 44]: d163372bfb6af489 +Block 0014 [ 45]: 1e1804bf5afe3fa8 +Block 0014 [ 46]: dab4f6f07c2bebf2 +Block 0014 [ 47]: 07b8936bc3533670 +Block 0014 [ 48]: c70835706442a1a7 +Block 0014 [ 49]: c60f346aa6eca9ad +Block 0014 [ 50]: 97a0ce931e61716f +Block 0014 [ 51]: 60a2ba4b96edb79c +Block 0014 [ 52]: b055188f8aba284a +Block 0014 [ 53]: a6043aa3ad7bec78 +Block 0014 [ 54]: f4c35bfce3ace67d +Block 0014 [ 55]: 319ccada848cdee2 +Block 0014 [ 56]: d0795590ea34a8b8 +Block 0014 [ 57]: e87a7307f237f419 +Block 0014 [ 58]: ae12cee379d66302 +Block 0014 [ 59]: 86b85724e1286c79 +Block 0014 [ 60]: 7894b054641720aa +Block 0014 [ 61]: 49e32fbda0747886 +Block 0014 [ 62]: a16876726931b8c0 +Block 0014 [ 63]: 95a87d1556254491 +Block 0014 [ 64]: 1b7359bdd4645944 +Block 0014 [ 65]: f177fc737aebc782 +Block 0014 [ 66]: 9e72721109423695 +Block 0014 [ 67]: b5fccf24cb0ea7d3 +Block 0014 [ 68]: 80a6b33ddc9b5720 +Block 0014 [ 69]: 9e2e62146504301b +Block 0014 [ 70]: 18f348c546a48b21 +Block 0014 [ 71]: e9c4c72be6bdbcc2 +Block 0014 [ 72]: ff301b1c853cd28f +Block 0014 [ 73]: b86477b7bfd084c2 +Block 0014 [ 74]: c74db1d1144db45b +Block 0014 [ 75]: 1555cafa0c364252 +Block 0014 [ 76]: 7282bf96c973f185 +Block 0014 [ 77]: 16fcda0df22d0d0a +Block 0014 [ 78]: bde4d5ba20822c22 +Block 0014 [ 79]: c27d9a170dfa7344 +Block 0014 [ 80]: bd663b25e9bd3e90 +Block 0014 [ 81]: 06995c1ac6b3f2c6 +Block 0014 [ 82]: 0ff746c47c5feafa +Block 0014 [ 83]: 370f75aa1c2aaacf +Block 0014 [ 84]: 1de1a575bba86945 +Block 0014 [ 85]: 9a1954a4c45cc63e +Block 0014 [ 86]: a2e4824e3e170256 +Block 0014 [ 87]: 1d435c8cf13aa8f5 +Block 0014 [ 88]: 47773d9a5c4e3b77 +Block 0014 [ 89]: b97ed8dc09f6d1fd +Block 0014 [ 90]: 2492b160c74c94b6 +Block 0014 [ 91]: 377877a2f5d232a7 +Block 0014 [ 92]: 19813e25319f5d5b +Block 0014 [ 93]: 2981dcd02bd36023 +Block 0014 [ 94]: 9c51ced5edc2f88a +Block 0014 [ 95]: bdfcc0f92340b53b +Block 0014 [ 96]: ca3f8d8ea0028190 +Block 0014 [ 97]: 6083dd598898d0df +Block 0014 [ 98]: b7c2764a629af855 +Block 0014 [ 99]: cb7b51f275a23764 +Block 0014 [100]: 0999e69569ff8654 +Block 0014 [101]: 75d419e7e4034cf1 +Block 0014 [102]: 9926c163ccf6fbc0 +Block 0014 [103]: 6f6fbfbc4634b106 +Block 0014 [104]: 99aab02824ac6428 +Block 0014 [105]: 755070d1503322d0 +Block 0014 [106]: 794e25994c009ffd +Block 0014 [107]: 86c42e4262d68dab +Block 0014 [108]: 36a474da4489ddbb +Block 0014 [109]: ea205d9048c07756 +Block 0014 [110]: b3b00cb88461299c +Block 0014 [111]: abd0616d54bf1f27 +Block 0014 [112]: 298326ff8b16010b +Block 0014 [113]: 736d092013ecf8e7 +Block 0014 [114]: c80706fa402b55cc +Block 0014 [115]: 643f6ca3cd72bb76 +Block 0014 [116]: 1e43fab3e955c081 +Block 0014 [117]: f81da96e09233646 +Block 0014 [118]: 63db4670f362122e +Block 0014 [119]: ffe8fa6827833188 +Block 0014 [120]: a19d0f8c1f840a05 +Block 0014 [121]: a330e308ccb789fe +Block 0014 [122]: 4af172102042a852 +Block 0014 [123]: 78fe11656db11997 +Block 0014 [124]: ffd3f265c3bcad3b +Block 0014 [125]: 40939ffec182cb0f +Block 0014 [126]: f2e10f47cfed9d45 +Block 0014 [127]: 0db682170c37d732 +Block 0015 [ 0]: 5c60ebf343964379 +Block 0015 [ 1]: c844eb5bb2f5d7ee +Block 0015 [ 2]: 8c18a6010c78383f +Block 0015 [ 3]: fc52029ab145346b +Block 0015 [ 4]: 05f78944f5618755 +Block 0015 [ 5]: 6833faa1b7925ec6 +Block 0015 [ 6]: 142dcb8cdbcf985f +Block 0015 [ 7]: 1eec4fe13e3eb436 +Block 0015 [ 8]: 093270287ff6c154 +Block 0015 [ 9]: af0492e23c6948c4 +Block 0015 [ 10]: 2d6209d2e3bb36c9 +Block 0015 [ 11]: 5dc0d600021d81cb +Block 0015 [ 12]: 2efc1d348d9dfd50 +Block 0015 [ 13]: 80d5311f1b323f28 +Block 0015 [ 14]: 65b6b8c85e49651d +Block 0015 [ 15]: dd83f1aaa29f2b5c +Block 0015 [ 16]: dd0caea719886d54 +Block 0015 [ 17]: bd0737cfb15066fa +Block 0015 [ 18]: 4ee7af30812dba7a +Block 0015 [ 19]: 592e32c4663cf43b +Block 0015 [ 20]: 8115137c067d43c0 +Block 0015 [ 21]: 2bc8f96f7bd33335 +Block 0015 [ 22]: b42162e04c360f71 +Block 0015 [ 23]: 4c93a2bbbefa40c1 +Block 0015 [ 24]: b670eef90f8a3b4b +Block 0015 [ 25]: 2f0133f2465e20d9 +Block 0015 [ 26]: 6f5b35c7183bbb58 +Block 0015 [ 27]: 54863424d1104479 +Block 0015 [ 28]: c110593d9561e19e +Block 0015 [ 29]: 85915bdf108cfb8d +Block 0015 [ 30]: 564c2c9d12a17c32 +Block 0015 [ 31]: ae51b6cd7d8dba85 +Block 0015 [ 32]: 86801cbdd9edf13c +Block 0015 [ 33]: 4627159cacf299f6 +Block 0015 [ 34]: fcec5f216cbc609b +Block 0015 [ 35]: 92da6375678dca6d +Block 0015 [ 36]: 23237b4aca3e3087 +Block 0015 [ 37]: 778ced58723f4db7 +Block 0015 [ 38]: f8b8ac5c0c11a6db +Block 0015 [ 39]: ca5a9cfa51fb092b +Block 0015 [ 40]: ad9c36454a7b4555 +Block 0015 [ 41]: c2ec64eaed0476e2 +Block 0015 [ 42]: 9e42f0a6d2ecedf4 +Block 0015 [ 43]: 5ec5baacc56984a4 +Block 0015 [ 44]: 48cc00c537ad73f2 +Block 0015 [ 45]: 0e1950a5b40721b5 +Block 0015 [ 46]: 2219b901e1de2332 +Block 0015 [ 47]: 54da4a3f5776bb19 +Block 0015 [ 48]: 605cd0995671b863 +Block 0015 [ 49]: 6f565b0337c7940a +Block 0015 [ 50]: b6f7c44fa6ddde1c +Block 0015 [ 51]: b9bdbd9710ee5e3d +Block 0015 [ 52]: 233f90f4ae9a2661 +Block 0015 [ 53]: 0ad62c6866e21f0e +Block 0015 [ 54]: 21f27ed906fda36b +Block 0015 [ 55]: 8f1a7c3d6e92ab09 +Block 0015 [ 56]: 9b9188cec8960b71 +Block 0015 [ 57]: e81af96c30aa9ea0 +Block 0015 [ 58]: e10ba0b8ce762d3b +Block 0015 [ 59]: f6f1842458770d66 +Block 0015 [ 60]: b0ea72e76bb8b2c0 +Block 0015 [ 61]: 48735c0b7a684c9b +Block 0015 [ 62]: 3700939516de0b9f +Block 0015 [ 63]: 99ffb1b3c77a5911 +Block 0015 [ 64]: 3b0bea89f2d75973 +Block 0015 [ 65]: 7284d5a6e4ca73fa +Block 0015 [ 66]: fc2980004fa1d6fd +Block 0015 [ 67]: 85204a0328b701df +Block 0015 [ 68]: 951945bef9422e4b +Block 0015 [ 69]: 27fd0976cbd1aae8 +Block 0015 [ 70]: d6884a6d8c94694f +Block 0015 [ 71]: 097442b7e5f413b1 +Block 0015 [ 72]: 1c8239a020d0d2ed +Block 0015 [ 73]: 26e32bdf5c5f287a +Block 0015 [ 74]: 8eec296926a32040 +Block 0015 [ 75]: 40925c65e41f704c +Block 0015 [ 76]: 6dfc1b6036ac83f1 +Block 0015 [ 77]: 4372772306842f15 +Block 0015 [ 78]: 85d08be9df2914df +Block 0015 [ 79]: b6a217b37bd41e7c +Block 0015 [ 80]: 0c179dd3a6f1d8c3 +Block 0015 [ 81]: 83acfb8c99e2915f +Block 0015 [ 82]: f67b69c627380be8 +Block 0015 [ 83]: eb83f410554ab2d4 +Block 0015 [ 84]: a9b1da448e9c0e18 +Block 0015 [ 85]: c62a104866a6899f +Block 0015 [ 86]: b512109239c786e9 +Block 0015 [ 87]: d3d30893c8ef2d5b +Block 0015 [ 88]: 185fb60f6d5b6fd0 +Block 0015 [ 89]: 20b710b22ec06809 +Block 0015 [ 90]: 9ea3919f273b086c +Block 0015 [ 91]: fb4d1bba70e26bc3 +Block 0015 [ 92]: e237ab18824c0f9e +Block 0015 [ 93]: 4fa18dbf16693282 +Block 0015 [ 94]: 5f515456d7cf884b +Block 0015 [ 95]: dd01c2e260558f84 +Block 0015 [ 96]: b851d646c4273226 +Block 0015 [ 97]: 153ff9a1c2fad967 +Block 0015 [ 98]: efb1a8348b2034c0 +Block 0015 [ 99]: 39321e6706e1ca32 +Block 0015 [100]: 71f73d91cd992df2 +Block 0015 [101]: 47b532cfb7d073be +Block 0015 [102]: f9dabbfb4e3dd13f +Block 0015 [103]: b70c10269560f42a +Block 0015 [104]: 5980fa7986b2174a +Block 0015 [105]: bd9ecb17969cb07d +Block 0015 [106]: f05da06e851b53bc +Block 0015 [107]: 433e3504d76870af +Block 0015 [108]: cb5a0c78eab9e338 +Block 0015 [109]: e652db008f460a5d +Block 0015 [110]: cbbbc86cb666048b +Block 0015 [111]: 81ff315c2fc6c975 +Block 0015 [112]: 8399e727faa22a09 +Block 0015 [113]: eb0b9969885f2309 +Block 0015 [114]: 3b327c3fe4446450 +Block 0015 [115]: b3c0c30bd7a48a78 +Block 0015 [116]: 33d547fef50f583a +Block 0015 [117]: 9862ae613d5f6a05 +Block 0015 [118]: f77ba6cef1eef1b9 +Block 0015 [119]: 74ecf3320c1d18f5 +Block 0015 [120]: 04f27b3d8db404fa +Block 0015 [121]: e7c42ef35dbe1e69 +Block 0015 [122]: 9f722564ad1f94ca +Block 0015 [123]: 3808033cc8a6264a +Block 0015 [124]: 1948446042580abc +Block 0015 [125]: 025eb81c6f5bd44c +Block 0015 [126]: d2cdfcab1c7cc163 +Block 0015 [127]: deb4ea7420a60a38 +Block 0016 [ 0]: 8ef71222e25e33a7 +Block 0016 [ 1]: 5b788bacd4a161d2 +Block 0016 [ 2]: 4c085a5d4b387162 +Block 0016 [ 3]: fb00f740c0bff138 +Block 0016 [ 4]: 45f63e1874e69080 +Block 0016 [ 5]: 78a2f2d260a54dde +Block 0016 [ 6]: 8cb461cb1355137a +Block 0016 [ 7]: 7b7e3cd55639f758 +Block 0016 [ 8]: ba7f598ebc7d0a24 +Block 0016 [ 9]: 9cd3d7fa9b61dfba +Block 0016 [ 10]: 0f4bfda84f8bdbae +Block 0016 [ 11]: 43d53060d71491f4 +Block 0016 [ 12]: 7b4a2d3825164639 +Block 0016 [ 13]: 509a1b3858bd2bed +Block 0016 [ 14]: 792e1edbc1ea84b1 +Block 0016 [ 15]: be636d230f55cf24 +Block 0016 [ 16]: f4ce5fe0d5f89ea6 +Block 0016 [ 17]: d3bec22193b9fa85 +Block 0016 [ 18]: c50401a757676486 +Block 0016 [ 19]: 3801152878206e10 +Block 0016 [ 20]: a6f32c77460a68ca +Block 0016 [ 21]: 5be9be1aa491771f +Block 0016 [ 22]: b8d681e557a6b464 +Block 0016 [ 23]: b3d7a221ff57bdbd +Block 0016 [ 24]: 88c49fc0e90d2982 +Block 0016 [ 25]: ff22dc20add2096e +Block 0016 [ 26]: 6688f9c931036c83 +Block 0016 [ 27]: fbf4a2f65116f128 +Block 0016 [ 28]: 708dfca5957923bd +Block 0016 [ 29]: 5cab6655f730ead8 +Block 0016 [ 30]: 652c868b4e0973c6 +Block 0016 [ 31]: 7faf39e6e68db8f4 +Block 0016 [ 32]: 5ed3b7e45168776e +Block 0016 [ 33]: 3233f0afc73f8fc9 +Block 0016 [ 34]: 4f61d181ed54920e +Block 0016 [ 35]: 45af51628268a386 +Block 0016 [ 36]: b81809f7405da7c2 +Block 0016 [ 37]: 7f04e166e18f898e +Block 0016 [ 38]: 9461d15e80360ddf +Block 0016 [ 39]: bf0279fe577f4a56 +Block 0016 [ 40]: 68eebc0b0f81a4f6 +Block 0016 [ 41]: 16a7d9859c25a3b8 +Block 0016 [ 42]: aad09c771d7c5046 +Block 0016 [ 43]: 2e83257346b21f51 +Block 0016 [ 44]: 212616f504644c05 +Block 0016 [ 45]: 25b6ee612334f735 +Block 0016 [ 46]: d0f8fc39fabf5258 +Block 0016 [ 47]: c231ff70ac3bb48c +Block 0016 [ 48]: e5a4d9bdc0325012 +Block 0016 [ 49]: 7b3fc5655f613956 +Block 0016 [ 50]: ec5b647ca9a4b333 +Block 0016 [ 51]: 8975b8bbfa7b5b64 +Block 0016 [ 52]: c9afd74a277d31f9 +Block 0016 [ 53]: d6109dfb79b3199e +Block 0016 [ 54]: 503a79cbe90d1000 +Block 0016 [ 55]: 6b96e1111aa5b4a6 +Block 0016 [ 56]: 62e48b5640dc72bb +Block 0016 [ 57]: 0323e21f38eb7a85 +Block 0016 [ 58]: c2b3329aa089ea80 +Block 0016 [ 59]: 7e6de45346324c73 +Block 0016 [ 60]: 30d34ff4baf1ad6b +Block 0016 [ 61]: e70b1ecb101c7a8f +Block 0016 [ 62]: f6f4c4815d5c6443 +Block 0016 [ 63]: 84ddf532213ee089 +Block 0016 [ 64]: 3383dc784306f5c5 +Block 0016 [ 65]: d410866c9820fb80 +Block 0016 [ 66]: 9ad1a811918ae747 +Block 0016 [ 67]: 99cccd5f357e9e45 +Block 0016 [ 68]: d4bcab0da4749c7f +Block 0016 [ 69]: ca36322b45b520d3 +Block 0016 [ 70]: 9bbe0827e6440146 +Block 0016 [ 71]: 5ea0191d0bd9d6bc +Block 0016 [ 72]: b6b1d7c9f8b3b365 +Block 0016 [ 73]: 7b14bfce8ce14778 +Block 0016 [ 74]: 15733305ad30a8b0 +Block 0016 [ 75]: 3b3b8bbef4e20874 +Block 0016 [ 76]: 007b2c2770bbce68 +Block 0016 [ 77]: 9580dbbc49161c87 +Block 0016 [ 78]: e996e4a0fb606ff5 +Block 0016 [ 79]: 8166385b61c551c9 +Block 0016 [ 80]: 905b3a4586c9628f +Block 0016 [ 81]: 6c3538319960701a +Block 0016 [ 82]: 726852503e929623 +Block 0016 [ 83]: 0d1370de52be24ca +Block 0016 [ 84]: 137c4cd293095677 +Block 0016 [ 85]: e1a533c284ade63e +Block 0016 [ 86]: aa03ff8f2d48e0e8 +Block 0016 [ 87]: 8070a0ca0533d5e9 +Block 0016 [ 88]: de4f9b80be79236b +Block 0016 [ 89]: f61dd73e6ff6cb28 +Block 0016 [ 90]: b6d6b411c7d73e90 +Block 0016 [ 91]: 02675d6dda93734b +Block 0016 [ 92]: 52b5fe33ff0edf12 +Block 0016 [ 93]: 139bc3df49f3b211 +Block 0016 [ 94]: cfe9120dd35237a8 +Block 0016 [ 95]: f7d4041b2c512498 +Block 0016 [ 96]: ec5e66bb264d3022 +Block 0016 [ 97]: 57417ff639782925 +Block 0016 [ 98]: 7593670d37a496db +Block 0016 [ 99]: feab9e35be512f28 +Block 0016 [100]: cb506d5764fed86b +Block 0016 [101]: 6aec183ee8e3745f +Block 0016 [102]: ec2dd19767a5734d +Block 0016 [103]: 7b6358cc3b32a264 +Block 0016 [104]: d04380da36957c7f +Block 0016 [105]: 9ba5769ddfaa6a3d +Block 0016 [106]: 3aeb202ee3f852fd +Block 0016 [107]: 6ad40cabdb80aaf4 +Block 0016 [108]: a6c3dac45ee8a5c1 +Block 0016 [109]: e9cb6215b9882b7c +Block 0016 [110]: 625f58ff78a5786e +Block 0016 [111]: 2cef23f4a3b5387e +Block 0016 [112]: 1aba2156c5cc14ed +Block 0016 [113]: 70778bb6caf8e015 +Block 0016 [114]: b79817079fa67733 +Block 0016 [115]: 2040c00a18883d6f +Block 0016 [116]: 412e281fbfde7312 +Block 0016 [117]: 130fb0debdad3f8e +Block 0016 [118]: ce30ca55fc0c9a38 +Block 0016 [119]: 45010a54f0da2809 +Block 0016 [120]: b1f29bcd5a661b0d +Block 0016 [121]: f5461d4639986c9f +Block 0016 [122]: 79839bdaa491069e +Block 0016 [123]: eb8c090fbf0d2957 +Block 0016 [124]: f7a83b1156b6ffe4 +Block 0016 [125]: aaed1d193830d24e +Block 0016 [126]: b224c4377f85bc52 +Block 0016 [127]: 33f5586f84573cea +Block 0017 [ 0]: 02fe7e853ebe0d0f +Block 0017 [ 1]: e67e2c7ef9905707 +Block 0017 [ 2]: bd081291079d349f +Block 0017 [ 3]: ce214e31c447258f +Block 0017 [ 4]: 69f77c776aef74ac +Block 0017 [ 5]: 3ef5b6d0c3112146 +Block 0017 [ 6]: 09e582516b1c1946 +Block 0017 [ 7]: 5435e0c7d1062de4 +Block 0017 [ 8]: df4b0f596e780cc0 +Block 0017 [ 9]: 0b0d0a7707db157a +Block 0017 [ 10]: ca853fdaf1f30538 +Block 0017 [ 11]: dbc61bec8a0a7bcd +Block 0017 [ 12]: bbf288024ff1b4bd +Block 0017 [ 13]: 8faf22bafbdda20a +Block 0017 [ 14]: 2de1c40ca884f4f8 +Block 0017 [ 15]: ef1a6ab15a6bc297 +Block 0017 [ 16]: 8e7e3775b6e620ef +Block 0017 [ 17]: b73ee4a9b5447bd8 +Block 0017 [ 18]: a7c9c64002e7de6c +Block 0017 [ 19]: 856743efdc51e1f2 +Block 0017 [ 20]: 86c9fae9e825e51d +Block 0017 [ 21]: b46144dc2d2bd13e +Block 0017 [ 22]: bb5fc5f58afe9f3d +Block 0017 [ 23]: 72565138c0c0de3f +Block 0017 [ 24]: d84fe0d08aeec7f4 +Block 0017 [ 25]: d82d1fe736931013 +Block 0017 [ 26]: 553ccfd5d897edd3 +Block 0017 [ 27]: 1946897a258ceea8 +Block 0017 [ 28]: 478f4e0bb4d26feb +Block 0017 [ 29]: e5d7b422fce1d6ef +Block 0017 [ 30]: d20534b5858c1f2e +Block 0017 [ 31]: 2d337040a6af6b92 +Block 0017 [ 32]: 54b35c906bfc0254 +Block 0017 [ 33]: c576354c4fed88e2 +Block 0017 [ 34]: 855ef7a03ddc9780 +Block 0017 [ 35]: 02ae016abd455038 +Block 0017 [ 36]: 5b08b4330a0f36b9 +Block 0017 [ 37]: e701a20db187fa01 +Block 0017 [ 38]: 69f8c2535b667d31 +Block 0017 [ 39]: 0583ad87707f1166 +Block 0017 [ 40]: 6c264bad170d16a1 +Block 0017 [ 41]: 564e696401b54e74 +Block 0017 [ 42]: 8e1acd3b5a0ad13d +Block 0017 [ 43]: ce1e5f83383e7882 +Block 0017 [ 44]: 177d21beb37812d0 +Block 0017 [ 45]: 4676715efd422319 +Block 0017 [ 46]: 780a06261172d470 +Block 0017 [ 47]: d9632d7e70419064 +Block 0017 [ 48]: 02b3db83a3af41c3 +Block 0017 [ 49]: a6e65a316272a79c +Block 0017 [ 50]: a594b0086e916d24 +Block 0017 [ 51]: 0b064fce44a2a76e +Block 0017 [ 52]: 2432d7db8b6f7667 +Block 0017 [ 53]: 6b2be3b92c8db847 +Block 0017 [ 54]: 1bbce28d4fb4dda3 +Block 0017 [ 55]: 0a5c3648ed841873 +Block 0017 [ 56]: 4b4c24e1bfaa0eac +Block 0017 [ 57]: 215b198b57484d44 +Block 0017 [ 58]: 7e28db06c4967f06 +Block 0017 [ 59]: 39e94d6e13a8808d +Block 0017 [ 60]: a50a0f8831791cb8 +Block 0017 [ 61]: 206ae656ceea22ef +Block 0017 [ 62]: eb9e7198a871b113 +Block 0017 [ 63]: f787d735bd1a533a +Block 0017 [ 64]: 095f66cb5f1c248c +Block 0017 [ 65]: 80fc162065b052c9 +Block 0017 [ 66]: 153b6e9c7c97401c +Block 0017 [ 67]: f4a9643d056f0a72 +Block 0017 [ 68]: bc049b48bbfce9a1 +Block 0017 [ 69]: 36ed38a3b7ea84ad +Block 0017 [ 70]: cb6f51ee30ecd90a +Block 0017 [ 71]: ac3a5ca12a82be94 +Block 0017 [ 72]: 468d587d7ba0a88f +Block 0017 [ 73]: 6f907170b9e7aa5b +Block 0017 [ 74]: a9fd5366ca960483 +Block 0017 [ 75]: fbb9bc4c359f1468 +Block 0017 [ 76]: f226fad7fc553d60 +Block 0017 [ 77]: 048d6944e0ca29fb +Block 0017 [ 78]: bb318db94c95df18 +Block 0017 [ 79]: 105509a613c5abd8 +Block 0017 [ 80]: e332fdec7d180a2d +Block 0017 [ 81]: 0eee4c4474ae8711 +Block 0017 [ 82]: 6ab584eaec00b13d +Block 0017 [ 83]: a83bd159c1e167a6 +Block 0017 [ 84]: 9c34d31dd5cacd55 +Block 0017 [ 85]: 7293faa10f50cb2f +Block 0017 [ 86]: 762dd1ef8251fad0 +Block 0017 [ 87]: 2811a9f56bd43318 +Block 0017 [ 88]: 07519086e22d47c0 +Block 0017 [ 89]: 86f9d58e400448d8 +Block 0017 [ 90]: e232d4b04455bb74 +Block 0017 [ 91]: cf556841d4f2a45d +Block 0017 [ 92]: 491b78ca34525eda +Block 0017 [ 93]: 6a082b3b72e71133 +Block 0017 [ 94]: 4e1647256eb998ee +Block 0017 [ 95]: 08a31dcfd48be9bb +Block 0017 [ 96]: 8a4e4a5b57cdf1aa +Block 0017 [ 97]: 5b7bd8bf7ec28733 +Block 0017 [ 98]: b9c55f7917141bc2 +Block 0017 [ 99]: 980b698d90b954b8 +Block 0017 [100]: baa10262b146c465 +Block 0017 [101]: 44d9ccb900b6f193 +Block 0017 [102]: 4fc6aa48bb32c460 +Block 0017 [103]: c28c6acbc1be8628 +Block 0017 [104]: 54cc0cb3ddbae117 +Block 0017 [105]: 1720fbfe18c9b3ef +Block 0017 [106]: bfab05e66a69aaa0 +Block 0017 [107]: a71a908f786c34a9 +Block 0017 [108]: 5ee97817c670b28c +Block 0017 [109]: 535cc2a0664dd333 +Block 0017 [110]: db8351e905bddff4 +Block 0017 [111]: 1a2e45990fd03ab8 +Block 0017 [112]: ad73b205252daa73 +Block 0017 [113]: 8e12bdbe877b55f8 +Block 0017 [114]: e4b688e3c50dbec2 +Block 0017 [115]: e1bcb0ee231819b0 +Block 0017 [116]: ce3c23e03b3ef2e2 +Block 0017 [117]: 6432e7536ae6ccad +Block 0017 [118]: 20f0e04af94a13b5 +Block 0017 [119]: 7736490bd70914ae +Block 0017 [120]: 7024a116d4af3b76 +Block 0017 [121]: ab9e8c2f372ff436 +Block 0017 [122]: 1d545892a1065e03 +Block 0017 [123]: b0f4f3c0dfaeb2cc +Block 0017 [124]: 74de51d4e9f3d9f6 +Block 0017 [125]: a0b38d15ed7bf487 +Block 0017 [126]: 33a46ece14805c89 +Block 0017 [127]: 834fa9ef3ef24bcb +Block 0018 [ 0]: 1a242ce230997d9b +Block 0018 [ 1]: 27975054b29babe8 +Block 0018 [ 2]: 18762553e598c29f +Block 0018 [ 3]: db01e8d1a2ab9376 +Block 0018 [ 4]: 7bb81b4dd6cc2115 +Block 0018 [ 5]: 02cc7040043a1d92 +Block 0018 [ 6]: ae9f9edf3b6fce7f +Block 0018 [ 7]: c423921b660990a1 +Block 0018 [ 8]: 281a011bcbeece96 +Block 0018 [ 9]: 2983c2b72941eaa8 +Block 0018 [ 10]: 183e1e12a8798776 +Block 0018 [ 11]: 6d09aaa1212c44c3 +Block 0018 [ 12]: d4fe7f0108acac6c +Block 0018 [ 13]: e8c816784b6ef0f6 +Block 0018 [ 14]: b78c7e808a211ac5 +Block 0018 [ 15]: 31c20264a10ba60f +Block 0018 [ 16]: b08a505efef753d3 +Block 0018 [ 17]: 3e942daa0e5f1ea5 +Block 0018 [ 18]: 9b45f7e39e5ac395 +Block 0018 [ 19]: f94807bef7c72762 +Block 0018 [ 20]: aab80003ae994d98 +Block 0018 [ 21]: 15aec49efb7568c1 +Block 0018 [ 22]: cb17490b118d47d4 +Block 0018 [ 23]: abedd85d337b6148 +Block 0018 [ 24]: e4b422270e181995 +Block 0018 [ 25]: a60a9d9e401cb171 +Block 0018 [ 26]: 9e3d0787cf999dba +Block 0018 [ 27]: 47c6e6f979d72e4d +Block 0018 [ 28]: 0120cf5c8d5d8d29 +Block 0018 [ 29]: 5914b6ac500cabe0 +Block 0018 [ 30]: d4844b8e42b295bf +Block 0018 [ 31]: d11cb644b0aa6b16 +Block 0018 [ 32]: 34a280f5c6861b00 +Block 0018 [ 33]: 941fdabe32af2a3e +Block 0018 [ 34]: ed5f13ac3dfa8b17 +Block 0018 [ 35]: e40211257d153bb5 +Block 0018 [ 36]: 3ebecfce85fddabc +Block 0018 [ 37]: b058f2daa35d0659 +Block 0018 [ 38]: 6e81776227dc1de4 +Block 0018 [ 39]: 903cdd86ab044958 +Block 0018 [ 40]: db80e50ca568989e +Block 0018 [ 41]: b3a2667bf1afb19d +Block 0018 [ 42]: 2fb3b686e259b527 +Block 0018 [ 43]: 9d502c5be8f047e9 +Block 0018 [ 44]: 5ebe6a9c788aa7c3 +Block 0018 [ 45]: 0129219b3ab99be5 +Block 0018 [ 46]: 76fe8083ac5bc860 +Block 0018 [ 47]: b25a5c9803e15174 +Block 0018 [ 48]: 8e41588d22498da3 +Block 0018 [ 49]: 535d49cbcce974ee +Block 0018 [ 50]: 5ea7114ad5badab0 +Block 0018 [ 51]: eb274b50e0dd9f1a +Block 0018 [ 52]: ab155492a5c70b5f +Block 0018 [ 53]: e258df1ff509eef8 +Block 0018 [ 54]: 5a695278ef55ceab +Block 0018 [ 55]: 9e161114a82e15ef +Block 0018 [ 56]: 170045e4e9954260 +Block 0018 [ 57]: a56a50835b800700 +Block 0018 [ 58]: a23ce122ac1279da +Block 0018 [ 59]: f575b95bee91b087 +Block 0018 [ 60]: 8fc0e92bdd552538 +Block 0018 [ 61]: 288931bff9509197 +Block 0018 [ 62]: c387b8567a16558e +Block 0018 [ 63]: 5dfe7026d392410e +Block 0018 [ 64]: 77031b0bc52274b4 +Block 0018 [ 65]: 9768e068ba0a897f +Block 0018 [ 66]: 838fe9b83e9f8539 +Block 0018 [ 67]: 8223f105c1d0479b +Block 0018 [ 68]: 7b75e46b05d940c8 +Block 0018 [ 69]: c4588f5474a26ae8 +Block 0018 [ 70]: 1951941657f37da6 +Block 0018 [ 71]: 23f8893a1575ec0d +Block 0018 [ 72]: b2fd7ad7278072df +Block 0018 [ 73]: 4a4c3e999cfc173c +Block 0018 [ 74]: bd7589d499563076 +Block 0018 [ 75]: ae61c35742a7b0f9 +Block 0018 [ 76]: 3322400c35475fb9 +Block 0018 [ 77]: 65718a454c86e9d7 +Block 0018 [ 78]: 95c19f7fe564841f +Block 0018 [ 79]: c0afa7b93be8a16e +Block 0018 [ 80]: 610392365382be84 +Block 0018 [ 81]: 3d8894c43775de2e +Block 0018 [ 82]: a3c3a715cabe7fea +Block 0018 [ 83]: 065ab25ffcef32e7 +Block 0018 [ 84]: 33981a456b7eacd5 +Block 0018 [ 85]: 8beb1382748f3cb5 +Block 0018 [ 86]: 5dea419f8f0ee480 +Block 0018 [ 87]: d17e8c3ce9bed985 +Block 0018 [ 88]: 80e3414b6a1d33e8 +Block 0018 [ 89]: fe3e4f8b5de4d95c +Block 0018 [ 90]: 0eb88acb805e30a4 +Block 0018 [ 91]: caa8daa0063324c6 +Block 0018 [ 92]: 8a84c2e5487490c6 +Block 0018 [ 93]: 92c0919cce8933e0 +Block 0018 [ 94]: 95e40747a89ec3f8 +Block 0018 [ 95]: c94a85345a36fb98 +Block 0018 [ 96]: 4884a40550574ea6 +Block 0018 [ 97]: 98aef193a0b4195c +Block 0018 [ 98]: 547605d40d5874b5 +Block 0018 [ 99]: bcf2921c10084e3b +Block 0018 [100]: 2ae0acda27100af9 +Block 0018 [101]: b838891a6385a123 +Block 0018 [102]: d4ceec21e572c544 +Block 0018 [103]: 02d799fd3a0d43a8 +Block 0018 [104]: 874c74cf56e66a28 +Block 0018 [105]: 455ec04f0c6f644b +Block 0018 [106]: 794d622cefeb3142 +Block 0018 [107]: 397cc3fb58f243fd +Block 0018 [108]: bfce9c65d6e547dc +Block 0018 [109]: 3fc535b6747dda96 +Block 0018 [110]: b232041172c61955 +Block 0018 [111]: d0866b7afc724904 +Block 0018 [112]: 1bd0e861a1832f90 +Block 0018 [113]: a5b46e83ec65fccf +Block 0018 [114]: 14bf4cfaf58434ac +Block 0018 [115]: c6722ca70b88aec5 +Block 0018 [116]: 43f4f75ed575746b +Block 0018 [117]: 318dee187f44b2ef +Block 0018 [118]: 7718e9e01d747b67 +Block 0018 [119]: eabe624668bfdf10 +Block 0018 [120]: 86b91fdc534cd49b +Block 0018 [121]: de0d5d5ad7e1bd04 +Block 0018 [122]: 470fdb1caec64506 +Block 0018 [123]: 5ad95fcaef3c3781 +Block 0018 [124]: f3da0001aa2f20a5 +Block 0018 [125]: ea4df80b5c7b274f +Block 0018 [126]: 5e422b2276b364e3 +Block 0018 [127]: 2daba476dc742f98 +Block 0019 [ 0]: 5292bf204d008798 +Block 0019 [ 1]: 7ebaeba170dc400b +Block 0019 [ 2]: c8878105fd55f1b2 +Block 0019 [ 3]: a245621c86d0a8e3 +Block 0019 [ 4]: 636ca9abda535b34 +Block 0019 [ 5]: fd6e38f15d0d651f +Block 0019 [ 6]: 8b9def75cef5e50f +Block 0019 [ 7]: 0b23ac908432ea37 +Block 0019 [ 8]: b039c7c46ac081e9 +Block 0019 [ 9]: 3ca943597d747790 +Block 0019 [ 10]: 9e8849ca90b39e95 +Block 0019 [ 11]: e45654ea0a38a7f9 +Block 0019 [ 12]: 9f4c310ed74d5d09 +Block 0019 [ 13]: e29417a8eb9b0064 +Block 0019 [ 14]: 7f6b0ee1b68de286 +Block 0019 [ 15]: f871922b573a0e94 +Block 0019 [ 16]: 4f40a6cf457ef1fd +Block 0019 [ 17]: a7ced1866505a14b +Block 0019 [ 18]: 1c266357ac946c5c +Block 0019 [ 19]: 52fc52cc033b0ea3 +Block 0019 [ 20]: ebf88c70993e3715 +Block 0019 [ 21]: f19fb0dc686bd492 +Block 0019 [ 22]: 1da1a221153ee7f9 +Block 0019 [ 23]: 4ac6a02ae545485f +Block 0019 [ 24]: 5eed7871fbd8b74d +Block 0019 [ 25]: 930228abdbbcec23 +Block 0019 [ 26]: 856ae86b5eaa828b +Block 0019 [ 27]: 034fe05023dd4d48 +Block 0019 [ 28]: c26d7f4c8b06ef17 +Block 0019 [ 29]: c9de1f992e2271b0 +Block 0019 [ 30]: 875d1a7e35ab78ca +Block 0019 [ 31]: 47ae3b6799be5a90 +Block 0019 [ 32]: acd7d3791262cf96 +Block 0019 [ 33]: 656cb43289c97db8 +Block 0019 [ 34]: 8066231473820839 +Block 0019 [ 35]: 230d998ade75e245 +Block 0019 [ 36]: ee23d7552097aaa4 +Block 0019 [ 37]: c545ef4eb6d12dff +Block 0019 [ 38]: ae2e4952f240f07f +Block 0019 [ 39]: 922ad44ed38552c0 +Block 0019 [ 40]: b2fbff55158c04c2 +Block 0019 [ 41]: 3fe9a10ea5aef870 +Block 0019 [ 42]: 6b8cd254eefe733b +Block 0019 [ 43]: 7c99c409d5bdd715 +Block 0019 [ 44]: da8dacd2c0ed0281 +Block 0019 [ 45]: dcea85cffde78e15 +Block 0019 [ 46]: 0e709509407f3866 +Block 0019 [ 47]: 9331b3925ac0914c +Block 0019 [ 48]: 19d3d18adc5dbc63 +Block 0019 [ 49]: 5dfd33332c89d190 +Block 0019 [ 50]: c61a6a352b9227bc +Block 0019 [ 51]: c4e5c7b0a3785d94 +Block 0019 [ 52]: 6f74bae4e2174723 +Block 0019 [ 53]: 63dbe046cc100f82 +Block 0019 [ 54]: d882d08c1b6cc810 +Block 0019 [ 55]: 050374613b45e9af +Block 0019 [ 56]: 5cd129e5e2430a26 +Block 0019 [ 57]: 08ff1a2d09e10475 +Block 0019 [ 58]: 4ab63c621e814a29 +Block 0019 [ 59]: 717be236db19de8e +Block 0019 [ 60]: b69702badc215404 +Block 0019 [ 61]: 0f938810792db042 +Block 0019 [ 62]: 9cd896b3683874e4 +Block 0019 [ 63]: e5a2b94e27ae70d8 +Block 0019 [ 64]: 99a106c84e5a5eb2 +Block 0019 [ 65]: 363341869679ec8d +Block 0019 [ 66]: ee1153712c35345e +Block 0019 [ 67]: a7c8a5d924760fe9 +Block 0019 [ 68]: 32beac8da9d2fe0f +Block 0019 [ 69]: c0b40564b99ac08c +Block 0019 [ 70]: 21c6f279089d8d67 +Block 0019 [ 71]: c17eb4e9657c7d38 +Block 0019 [ 72]: 82119d42ee7383ee +Block 0019 [ 73]: 839a5ba4ad33e320 +Block 0019 [ 74]: dca3fbd6b621523b +Block 0019 [ 75]: 831be6174d1b7bfe +Block 0019 [ 76]: 3f9e8bfe785fef8b +Block 0019 [ 77]: 6ad962a245dc4541 +Block 0019 [ 78]: 3bcab76901720eeb +Block 0019 [ 79]: 220a3352d04b525b +Block 0019 [ 80]: 179aecb646a78ad3 +Block 0019 [ 81]: 0e37e2692c841cac +Block 0019 [ 82]: 5b9f397a9fc9914a +Block 0019 [ 83]: f6a7673df3a257f5 +Block 0019 [ 84]: 615685fffa2fe235 +Block 0019 [ 85]: 5e237db301dba24c +Block 0019 [ 86]: 81535ef20914d77f +Block 0019 [ 87]: e12cdcfe47093097 +Block 0019 [ 88]: 48c4b926c428a68c +Block 0019 [ 89]: fd308f9af27493ad +Block 0019 [ 90]: 2cd8f4bf32095907 +Block 0019 [ 91]: 77e525fe7a8e416d +Block 0019 [ 92]: 132e99f6e13c81da +Block 0019 [ 93]: 3f4b9f866fb660a4 +Block 0019 [ 94]: b0e935906dac73db +Block 0019 [ 95]: d7f22b090e9905e7 +Block 0019 [ 96]: cb11d90136f020f9 +Block 0019 [ 97]: c96be13880b6cd43 +Block 0019 [ 98]: 1712c855b6a0e9a7 +Block 0019 [ 99]: 06c2322f35f2c656 +Block 0019 [100]: 3959da36a56e8319 +Block 0019 [101]: 00395e9c332612d6 +Block 0019 [102]: 6ae26df19284f3b2 +Block 0019 [103]: 1e2691a6e0d129df +Block 0019 [104]: fc73f98a93270339 +Block 0019 [105]: 6cd684812beff818 +Block 0019 [106]: 7f6afcc089780856 +Block 0019 [107]: 41ba7228f41b01d8 +Block 0019 [108]: 8e2fcf2ea124d9c9 +Block 0019 [109]: ebc64f65ee2aee4f +Block 0019 [110]: 43369a8e316a948e +Block 0019 [111]: b3ff2df0c7f10202 +Block 0019 [112]: 0d03d4023e9810a0 +Block 0019 [113]: 873b2ed4d5aa7898 +Block 0019 [114]: 9780b00f14da8b14 +Block 0019 [115]: cd9995c99e10bf5a +Block 0019 [116]: e158368cbe15dbf5 +Block 0019 [117]: c2340418c755b209 +Block 0019 [118]: 9d6a8efa736d3c45 +Block 0019 [119]: 589d9b1963690d48 +Block 0019 [120]: 88a35d4ed48dd42a +Block 0019 [121]: bd08c9ff2cb27f60 +Block 0019 [122]: 57055384720f2845 +Block 0019 [123]: a21217b4da0a9fc5 +Block 0019 [124]: 744fa33320036cbc +Block 0019 [125]: 4e57db9bfa06c2a3 +Block 0019 [126]: 490b17fdfbcb169e +Block 0019 [127]: 084a615be1a9e4d9 +Block 0020 [ 0]: 5d57ca47136f780e +Block 0020 [ 1]: f7e6a489158047e0 +Block 0020 [ 2]: 43afd73ca20617e2 +Block 0020 [ 3]: f330892dcc219aec +Block 0020 [ 4]: 69ddcc169837eaca +Block 0020 [ 5]: 76276b1b9f66128a +Block 0020 [ 6]: 4a3c15e11e71cd34 +Block 0020 [ 7]: d136f0129e70d740 +Block 0020 [ 8]: bed3273b28f942a7 +Block 0020 [ 9]: 5666679b22a0e825 +Block 0020 [ 10]: 3cc5122dc80159bc +Block 0020 [ 11]: 1f9762b33b33aba5 +Block 0020 [ 12]: 62fdd7c730a65160 +Block 0020 [ 13]: c482f5bf34979c2f +Block 0020 [ 14]: 4f2349b0ecfeefb8 +Block 0020 [ 15]: 155b8ad94c89cbb6 +Block 0020 [ 16]: 1b9f6770ca2aedf4 +Block 0020 [ 17]: 192416f1c8c95ac1 +Block 0020 [ 18]: e9dd5be037cb364a +Block 0020 [ 19]: 0f090a08cd9aba13 +Block 0020 [ 20]: 31e9b657221639b3 +Block 0020 [ 21]: 87b363aa553befd0 +Block 0020 [ 22]: 4477b840ca7905ba +Block 0020 [ 23]: 05cc227f7f6d9b75 +Block 0020 [ 24]: 3a8c7320409d5d26 +Block 0020 [ 25]: 31ad20d85c763a6c +Block 0020 [ 26]: 4e73aa89e8725561 +Block 0020 [ 27]: 9a7b37f6c4ce09d5 +Block 0020 [ 28]: 98d1d425577e1801 +Block 0020 [ 29]: 89f69be4232297c6 +Block 0020 [ 30]: 792d3563c3bf9e98 +Block 0020 [ 31]: 2512ad23f53284c7 +Block 0020 [ 32]: c2981553ed8736f2 +Block 0020 [ 33]: f0e20cbfb5609433 +Block 0020 [ 34]: f8d948e6e651fa86 +Block 0020 [ 35]: 3149268c4aac6990 +Block 0020 [ 36]: 2658045704d43b96 +Block 0020 [ 37]: f2a949e2ac83b68b +Block 0020 [ 38]: 8f58f6bdd819b9c6 +Block 0020 [ 39]: 48d427bf2c2c0400 +Block 0020 [ 40]: dcf52ff4b5056b04 +Block 0020 [ 41]: 9360854e262cbd13 +Block 0020 [ 42]: 46228619dec396e7 +Block 0020 [ 43]: a5c0c9024eb34b51 +Block 0020 [ 44]: 80a4ff3799ffaa55 +Block 0020 [ 45]: ec44c47fe6760771 +Block 0020 [ 46]: 1c10b973bc0b4e65 +Block 0020 [ 47]: a10cfd79a24c6966 +Block 0020 [ 48]: a5d1d59a2470be40 +Block 0020 [ 49]: f32d79247a4b459b +Block 0020 [ 50]: ae7733eb4ece186d +Block 0020 [ 51]: 7fdf2ba9666fff99 +Block 0020 [ 52]: 5324ac97a90fda85 +Block 0020 [ 53]: c93ce65f7f8d362b +Block 0020 [ 54]: 1a8c3a78f89292f8 +Block 0020 [ 55]: 3b14b0cf8f636730 +Block 0020 [ 56]: e58c0d49afbbd7f6 +Block 0020 [ 57]: 0c7b4cf0cfeebbb7 +Block 0020 [ 58]: 2b2e13b6943f1a39 +Block 0020 [ 59]: a0b73361ed004dcf +Block 0020 [ 60]: 93eba2ea0ae14829 +Block 0020 [ 61]: 4b2f44fe71cf5fc3 +Block 0020 [ 62]: 3ed8260985628995 +Block 0020 [ 63]: ccc751ccb582a8c6 +Block 0020 [ 64]: addb305fb77183b9 +Block 0020 [ 65]: 6ae008af5ca19b9a +Block 0020 [ 66]: 6a2b6da53d8c5e9b +Block 0020 [ 67]: 684a936687acf847 +Block 0020 [ 68]: 95ddec6659b9826f +Block 0020 [ 69]: 568b6ada0abf36bb +Block 0020 [ 70]: 7dab587621d25117 +Block 0020 [ 71]: 719c14b211475577 +Block 0020 [ 72]: 6d6cfb1a289476e3 +Block 0020 [ 73]: 11bb65adb073bf84 +Block 0020 [ 74]: e8564c9ab3287123 +Block 0020 [ 75]: 055c00f96aba87ee +Block 0020 [ 76]: 2ce8391c91ff17ef +Block 0020 [ 77]: 712b4f15acccf00f +Block 0020 [ 78]: a557001a2a542828 +Block 0020 [ 79]: 8aa5fcd18d9be6c4 +Block 0020 [ 80]: a064fa473db20fe3 +Block 0020 [ 81]: 1ab5e78858bf2061 +Block 0020 [ 82]: c8408a0601756a2a +Block 0020 [ 83]: 8ebd7b0fa610e267 +Block 0020 [ 84]: 4737a8848fa8756e +Block 0020 [ 85]: 084383af4e6a6a33 +Block 0020 [ 86]: ee2aa19d3d4f1e0c +Block 0020 [ 87]: a425205d5b3c0e44 +Block 0020 [ 88]: a9b7d132ab432afe +Block 0020 [ 89]: cb3d70781cde1f01 +Block 0020 [ 90]: 13b46a9cc6036627 +Block 0020 [ 91]: f3cb9cf1013a522b +Block 0020 [ 92]: f04b6ae327081e12 +Block 0020 [ 93]: a00b16fc80f1fa79 +Block 0020 [ 94]: b7291598fc44947d +Block 0020 [ 95]: 5b0def4014962dfe +Block 0020 [ 96]: 889b67aae30ca681 +Block 0020 [ 97]: 38b9629ce8c21a58 +Block 0020 [ 98]: e31fa547764f1192 +Block 0020 [ 99]: 6c9fd99cb27b91eb +Block 0020 [100]: 729a48be4128351d +Block 0020 [101]: c9ef08e71850a66a +Block 0020 [102]: 222bb5d86b7f734a +Block 0020 [103]: 8d73e0e8f544544e +Block 0020 [104]: b90d08c81440cf69 +Block 0020 [105]: dd9fcc9d6e1c2a7c +Block 0020 [106]: 88360967c8ba6163 +Block 0020 [107]: 084ee06004657e4b +Block 0020 [108]: 4808ed26e383a9fd +Block 0020 [109]: 99216d7d19ebd14f +Block 0020 [110]: 86804f939794a1a0 +Block 0020 [111]: 79808541b501f7e1 +Block 0020 [112]: 87d9ced7805ba881 +Block 0020 [113]: 3cecd150f641b6ae +Block 0020 [114]: 48818425086f97d0 +Block 0020 [115]: 259ed59ef6f4eab9 +Block 0020 [116]: eeefaa0d117276db +Block 0020 [117]: b345010d4cff1602 +Block 0020 [118]: b2ebc77b9784db1a +Block 0020 [119]: b0fccb9ee2146d44 +Block 0020 [120]: 12efff78f820153e +Block 0020 [121]: f055073327d18f03 +Block 0020 [122]: ce7854ab4ef4adf0 +Block 0020 [123]: 06d17b027037f0fd +Block 0020 [124]: 92ce711adc04a9a1 +Block 0020 [125]: 66478a9d6396bc0d +Block 0020 [126]: ff1eb65c6ce7ea23 +Block 0020 [127]: 87e96088e607b745 +Block 0021 [ 0]: 976e9f659febc2e8 +Block 0021 [ 1]: a88f1274f70e5647 +Block 0021 [ 2]: 2d1030809e10bdbf +Block 0021 [ 3]: 39fa3a0e6eeb51d9 +Block 0021 [ 4]: a3dccb41bf561eba +Block 0021 [ 5]: 39174042994d9c86 +Block 0021 [ 6]: e653eb04aeba31fd +Block 0021 [ 7]: 1b4bf239f4fc1ae8 +Block 0021 [ 8]: b8ee57434441c67e +Block 0021 [ 9]: 3368705f1cf61836 +Block 0021 [ 10]: 5265f3bee7e8a64d +Block 0021 [ 11]: aee6bdc6c7453a50 +Block 0021 [ 12]: 3baa3a53a511d6d7 +Block 0021 [ 13]: b052f430ef905497 +Block 0021 [ 14]: 15655072b91558fd +Block 0021 [ 15]: d8f5df7a3e047ad8 +Block 0021 [ 16]: 7dc6a612217c1121 +Block 0021 [ 17]: 566076b6a23f9387 +Block 0021 [ 18]: ba4ed88d763b7640 +Block 0021 [ 19]: 9ddcc34d61bda242 +Block 0021 [ 20]: bca43b61b90ef9f0 +Block 0021 [ 21]: 44f372e24cab6c1a +Block 0021 [ 22]: 4a28ccd569072749 +Block 0021 [ 23]: 3bba0847ae0b83ed +Block 0021 [ 24]: 49494038474e4275 +Block 0021 [ 25]: 598fe8b9223c0f33 +Block 0021 [ 26]: ab22b6a0c4f78ab0 +Block 0021 [ 27]: 210db7846a68d8ae +Block 0021 [ 28]: 43282ca03322625e +Block 0021 [ 29]: b3ad67fe8abe1f46 +Block 0021 [ 30]: 989391df47fa1387 +Block 0021 [ 31]: e2cca1cde49182f6 +Block 0021 [ 32]: 2bb23a36ea2afdd7 +Block 0021 [ 33]: 5a7f289f9251fed6 +Block 0021 [ 34]: 5a544243ac7744d7 +Block 0021 [ 35]: cc72df263c6f51ec +Block 0021 [ 36]: c43f009bb3d5c4ff +Block 0021 [ 37]: be57289215b40eda +Block 0021 [ 38]: 6199f895c87b2dcc +Block 0021 [ 39]: 7ae8e2df71099f02 +Block 0021 [ 40]: 94d1ab2ecb1e962d +Block 0021 [ 41]: ac38b599cf400fe3 +Block 0021 [ 42]: e2d04241732ef8a2 +Block 0021 [ 43]: 311f2618f88be20f +Block 0021 [ 44]: bc624ead2ff7931a +Block 0021 [ 45]: 53dce757b2c8a471 +Block 0021 [ 46]: b45e24e9711e96ae +Block 0021 [ 47]: 4449f0d3ee397b7b +Block 0021 [ 48]: 701696b5549d2d6e +Block 0021 [ 49]: abd841c53153facb +Block 0021 [ 50]: 3dc2199505f24e66 +Block 0021 [ 51]: 9774d5a5bfd689f5 +Block 0021 [ 52]: 4d546794b4c18718 +Block 0021 [ 53]: 8dba23eaf3c9d3ae +Block 0021 [ 54]: cb1376d0c0ec06ce +Block 0021 [ 55]: 73cebc8b6066075d +Block 0021 [ 56]: d80e0ddbcd207d04 +Block 0021 [ 57]: 511ee60f7ab4b82d +Block 0021 [ 58]: 55f2ba5663fda61a +Block 0021 [ 59]: 4a1bf598eb874381 +Block 0021 [ 60]: 6d2eea6b4e0e2791 +Block 0021 [ 61]: 91a8d6a65942c0fd +Block 0021 [ 62]: f36cb50cadc4c59a +Block 0021 [ 63]: b51c59122c247d33 +Block 0021 [ 64]: d73e4c0f4ba0b24e +Block 0021 [ 65]: 9d062a74eddb078c +Block 0021 [ 66]: 76e462d56034ba74 +Block 0021 [ 67]: 7f981ba9589c3c86 +Block 0021 [ 68]: f87f9bbf54d53d09 +Block 0021 [ 69]: b58a591bb6d366eb +Block 0021 [ 70]: a5d206cbc7965fc4 +Block 0021 [ 71]: 0737b44abb7b8eb3 +Block 0021 [ 72]: 4eec2ff63f5346a9 +Block 0021 [ 73]: e7aad25813a2551a +Block 0021 [ 74]: a9db0a77fc3a3627 +Block 0021 [ 75]: dd5c26ab99927254 +Block 0021 [ 76]: a7351601b2018b23 +Block 0021 [ 77]: 56e87f62e4bd36a0 +Block 0021 [ 78]: 7579b8aabe7dfa32 +Block 0021 [ 79]: 34fe2f3bc8e03b0c +Block 0021 [ 80]: b6b3ad970eb248b1 +Block 0021 [ 81]: 121d7272bd7ebc93 +Block 0021 [ 82]: c80eb86fb6c50b6b +Block 0021 [ 83]: 8bd485d99bc66730 +Block 0021 [ 84]: cf903a06d42efa64 +Block 0021 [ 85]: a0bf1ea7429d9b66 +Block 0021 [ 86]: 100e7668252d8234 +Block 0021 [ 87]: 5611ac51e0c4aec0 +Block 0021 [ 88]: e0d47dbb54bd4fc2 +Block 0021 [ 89]: 762c3fc263658f83 +Block 0021 [ 90]: 0977a8ac842da06d +Block 0021 [ 91]: ffece2e0fcf82469 +Block 0021 [ 92]: 251d9000edf3560a +Block 0021 [ 93]: f88f20544d4602ab +Block 0021 [ 94]: a32ffc01b4f0fe3c +Block 0021 [ 95]: a24a0e2d9ff22a4b +Block 0021 [ 96]: 69d9855d6212b44a +Block 0021 [ 97]: 05fad3385f71b8be +Block 0021 [ 98]: 3b915fb26c778939 +Block 0021 [ 99]: 81485ec2990b5f1f +Block 0021 [100]: df6bde77b4b90dad +Block 0021 [101]: f54543616da45238 +Block 0021 [102]: 08f27ab408ba9e98 +Block 0021 [103]: 382039b1ac11c85b +Block 0021 [104]: 304799345fb375d8 +Block 0021 [105]: 9aa9d07bc2c653cf +Block 0021 [106]: c01eb96471beb8d2 +Block 0021 [107]: bf028c4a42a5c5b7 +Block 0021 [108]: 6bc2feea37184034 +Block 0021 [109]: 93ae626810c10f9c +Block 0021 [110]: e2185c6ae98e1a60 +Block 0021 [111]: a365bf7029eabc63 +Block 0021 [112]: da1ba6ddd489d60e +Block 0021 [113]: d7114e5abe779e82 +Block 0021 [114]: d62e97914253cc02 +Block 0021 [115]: 2d990cb146dc6ffb +Block 0021 [116]: 9f8dd338cb3d9169 +Block 0021 [117]: 00417fb43b21719f +Block 0021 [118]: c547a1fa25dff537 +Block 0021 [119]: 6649468066baba07 +Block 0021 [120]: aeb4eae2da0f4711 +Block 0021 [121]: b9619918b2b99ded +Block 0021 [122]: 7b3aa37c52219510 +Block 0021 [123]: c67f4ab94d67fdfe +Block 0021 [124]: 8c4d9ae73c0384d7 +Block 0021 [125]: 30fcd267567ade99 +Block 0021 [126]: 8eb4c44af8925b02 +Block 0021 [127]: 91532368b2dd5d98 +Block 0022 [ 0]: 7a7eb778ba137642 +Block 0022 [ 1]: 75fd20cc726c9447 +Block 0022 [ 2]: 377a009ac96c4e5b +Block 0022 [ 3]: 5137193344b6fa8e +Block 0022 [ 4]: fd3c6f316b4b2203 +Block 0022 [ 5]: c8c10e87059b7fcb +Block 0022 [ 6]: c3e984b4f4c19e0f +Block 0022 [ 7]: c1df342507a4239d +Block 0022 [ 8]: f3d84364c81068b5 +Block 0022 [ 9]: a84f4a8e0875f61b +Block 0022 [ 10]: f074dbaf73f5a520 +Block 0022 [ 11]: c917181b46f9e191 +Block 0022 [ 12]: 64da0eff5b833f16 +Block 0022 [ 13]: 8c3a814b666d1a5b +Block 0022 [ 14]: bb5ade7b7db56500 +Block 0022 [ 15]: 0094e518971a127b +Block 0022 [ 16]: 0fad4d30b3cc902d +Block 0022 [ 17]: 94acb7d50ba979f7 +Block 0022 [ 18]: cb1c8994dbbaec67 +Block 0022 [ 19]: db593985ab96d088 +Block 0022 [ 20]: 016cf146031e0455 +Block 0022 [ 21]: dbe4263eae7443a7 +Block 0022 [ 22]: 38b1ed9c3a1e8a0e +Block 0022 [ 23]: 30ccb33155dc79a6 +Block 0022 [ 24]: ab3f38b7fbe9c6a7 +Block 0022 [ 25]: b6ab6339e3b5cd2f +Block 0022 [ 26]: 105fb25c2d53aad2 +Block 0022 [ 27]: 9100d9974a0ebc84 +Block 0022 [ 28]: 05557560d577787d +Block 0022 [ 29]: 0be7aa32a729523c +Block 0022 [ 30]: 987ebbccd2e595ad +Block 0022 [ 31]: d1a61b40e35b65dd +Block 0022 [ 32]: 87edbd02dbb27253 +Block 0022 [ 33]: fd3917fe08ded9e1 +Block 0022 [ 34]: 5154aca7a67f09e6 +Block 0022 [ 35]: 0ac7077b17b0ce6b +Block 0022 [ 36]: 022506e3e68af855 +Block 0022 [ 37]: 477b231cb63085b7 +Block 0022 [ 38]: facbc07678f43b4e +Block 0022 [ 39]: f793ea3f705dbd7e +Block 0022 [ 40]: c9fdc7172747c3f7 +Block 0022 [ 41]: 69b7d2c9df87ef7e +Block 0022 [ 42]: ba896967adafe7ca +Block 0022 [ 43]: 15865ebadfe18b9d +Block 0022 [ 44]: 8a374b6123ccda48 +Block 0022 [ 45]: 1ccfc954e24f0885 +Block 0022 [ 46]: 6eaa9454516dc0c4 +Block 0022 [ 47]: a47cecb2678bca2c +Block 0022 [ 48]: c9d512ee9869639b +Block 0022 [ 49]: f2be8f067e53a2f7 +Block 0022 [ 50]: d12367af680b6f97 +Block 0022 [ 51]: 5b08d27744c63ee7 +Block 0022 [ 52]: 68240e233e3f5df7 +Block 0022 [ 53]: dabb61a4b4489e8a +Block 0022 [ 54]: 58daa56e290df240 +Block 0022 [ 55]: b7668b7b4334ad4b +Block 0022 [ 56]: 9b81324b9195a489 +Block 0022 [ 57]: 5c1b0f7850b4fdba +Block 0022 [ 58]: a19a882d2259b483 +Block 0022 [ 59]: 000144eaa2490219 +Block 0022 [ 60]: b86ade826f9ab064 +Block 0022 [ 61]: 2b30e0be2742140c +Block 0022 [ 62]: 5798c3cfcae5c8c5 +Block 0022 [ 63]: 318050a2867cc321 +Block 0022 [ 64]: 496efff959586146 +Block 0022 [ 65]: 042e2c16b9ce0ba3 +Block 0022 [ 66]: cbf37aba11d55dc2 +Block 0022 [ 67]: fa547c1aee0079cd +Block 0022 [ 68]: 81b1015f9bc428d3 +Block 0022 [ 69]: 5ee624ba1cec9ff4 +Block 0022 [ 70]: cc06875eecff4bfc +Block 0022 [ 71]: 70c5de30f89553ea +Block 0022 [ 72]: 82d6a1825d3e92d7 +Block 0022 [ 73]: 08ae275dc58392cf +Block 0022 [ 74]: ef27eec48a368912 +Block 0022 [ 75]: 413f245be1a350a1 +Block 0022 [ 76]: ac6ed1397cf170b1 +Block 0022 [ 77]: 88f42a66dbffe788 +Block 0022 [ 78]: 3e0dda4b5a02b8fc +Block 0022 [ 79]: 8f8eb68cdb179ae0 +Block 0022 [ 80]: fd018b0bac7799c5 +Block 0022 [ 81]: eba408d26249d044 +Block 0022 [ 82]: d75ac46fc02f7275 +Block 0022 [ 83]: c70a15596671f5d1 +Block 0022 [ 84]: e261a9551e07abc1 +Block 0022 [ 85]: 794892ee911a29de +Block 0022 [ 86]: 95b5b9a11d146624 +Block 0022 [ 87]: 86c21ad27d1543a4 +Block 0022 [ 88]: 1c277baeeff0ce9d +Block 0022 [ 89]: 7bd90b2cd713e638 +Block 0022 [ 90]: 0b2a164ea19e2b78 +Block 0022 [ 91]: 12fb9127ce3b8607 +Block 0022 [ 92]: 6361a6ec49a7b80d +Block 0022 [ 93]: 7cca1af1dce8ce7d +Block 0022 [ 94]: 6800dc2ac217bec3 +Block 0022 [ 95]: ec16cbb822442386 +Block 0022 [ 96]: b061fdcdc50e1e3e +Block 0022 [ 97]: dbd45a3166c80fa1 +Block 0022 [ 98]: 406e39115c27c83c +Block 0022 [ 99]: 4e67e960cc388f46 +Block 0022 [100]: 2a5706bdd0c69408 +Block 0022 [101]: 74720d5a7862a031 +Block 0022 [102]: 99eaa516e72e07a9 +Block 0022 [103]: 0652ebc6a9556b32 +Block 0022 [104]: 22e1c4807ba2d0d8 +Block 0022 [105]: b84684c4fe3cb95c +Block 0022 [106]: c5ae3cc6ff36e4bc +Block 0022 [107]: 7c6356397667c985 +Block 0022 [108]: 85a8a88cdb7088b2 +Block 0022 [109]: baaa4a40b2fe327f +Block 0022 [110]: bb549f69550ac7fe +Block 0022 [111]: 700ce2f1e6a53745 +Block 0022 [112]: fbd53afa58bdb58b +Block 0022 [113]: 59b964fe20508807 +Block 0022 [114]: e57b1917deb499be +Block 0022 [115]: 1ab30b4e53cdba30 +Block 0022 [116]: e97d383251335d8e +Block 0022 [117]: d58b02e4e16d9256 +Block 0022 [118]: 41814117f9badbdb +Block 0022 [119]: f47ac20cd426fc8b +Block 0022 [120]: b550ecef8d0d1bb6 +Block 0022 [121]: 816ae3c96a1e867e +Block 0022 [122]: 1a88cc4c5f601a97 +Block 0022 [123]: fe78b73e3cb347c0 +Block 0022 [124]: ab7c6f0d0fc23560 +Block 0022 [125]: df85ca82509c97aa +Block 0022 [126]: 040cd972f4f4cde0 +Block 0022 [127]: 8cc1f28d8b7a424c +Block 0023 [ 0]: b66bc13398076979 +Block 0023 [ 1]: 43b1f58fdbe5c6d7 +Block 0023 [ 2]: 78cfeb884aa0dcf8 +Block 0023 [ 3]: f6ad7bdbce0fc1f1 +Block 0023 [ 4]: 97bd0555962ab048 +Block 0023 [ 5]: dfeb2974250f3fba +Block 0023 [ 6]: 841d9de38b24c45d +Block 0023 [ 7]: f7ba62597d6b981c +Block 0023 [ 8]: 642acde47945bf0a +Block 0023 [ 9]: ba5998732b6e3a32 +Block 0023 [ 10]: fc5f4f5fa312aabb +Block 0023 [ 11]: 2f890fd5b28f6575 +Block 0023 [ 12]: a019341906f2c75a +Block 0023 [ 13]: 17bdcab50a8b8cad +Block 0023 [ 14]: 4bbd3902ab6ca789 +Block 0023 [ 15]: bd5b5bf197858bd3 +Block 0023 [ 16]: 76b97396716afeac +Block 0023 [ 17]: b5c6b2607a110210 +Block 0023 [ 18]: 3676052713568a3c +Block 0023 [ 19]: 1b243d70337d6a27 +Block 0023 [ 20]: 14a68d15138c679e +Block 0023 [ 21]: 2e5dec69515a9a11 +Block 0023 [ 22]: 89fad0d2ff2b3b0c +Block 0023 [ 23]: 65ffa10e16de42d4 +Block 0023 [ 24]: 2fe475a4468285bd +Block 0023 [ 25]: 598befca0e6acaa1 +Block 0023 [ 26]: bef9208bcce61210 +Block 0023 [ 27]: 497d41b68bf1eb06 +Block 0023 [ 28]: 8d8d7c7e8928d427 +Block 0023 [ 29]: 72dc43efe0c530cf +Block 0023 [ 30]: 50c87715dca1c97f +Block 0023 [ 31]: 97a31b1b001ff7ef +Block 0023 [ 32]: 2a2e6ab678997b48 +Block 0023 [ 33]: 3bcba511e04175e0 +Block 0023 [ 34]: c6ad3b6fd73abd88 +Block 0023 [ 35]: 49c135aede7792a2 +Block 0023 [ 36]: ab10861dfeed0a2a +Block 0023 [ 37]: b350fce5f7e9bfea +Block 0023 [ 38]: d45a436bfb246a48 +Block 0023 [ 39]: 29892cb62a433349 +Block 0023 [ 40]: 603e5902b12e7886 +Block 0023 [ 41]: 7b4ef649559126de +Block 0023 [ 42]: 2b7b48c2bbccc978 +Block 0023 [ 43]: 0f8035fc0a8f24e2 +Block 0023 [ 44]: f722f06c3b244851 +Block 0023 [ 45]: dab2722606c3e666 +Block 0023 [ 46]: 2c55f308a67bbe59 +Block 0023 [ 47]: 269043b9686499a5 +Block 0023 [ 48]: 109deb97c1757859 +Block 0023 [ 49]: cf3164ffce16fbfc +Block 0023 [ 50]: 7a221223e0354820 +Block 0023 [ 51]: 2ffbd3d62c1707fe +Block 0023 [ 52]: d0c6e6b39c3558af +Block 0023 [ 53]: e7fcc877262a87ee +Block 0023 [ 54]: eae055d6a0e7fdd3 +Block 0023 [ 55]: db620e9d037e13b6 +Block 0023 [ 56]: 469935d3b817996d +Block 0023 [ 57]: ee245d8a65759846 +Block 0023 [ 58]: b53d6d62749bba67 +Block 0023 [ 59]: dbf209dc213dfad3 +Block 0023 [ 60]: e36b204b799683ce +Block 0023 [ 61]: 1455b7fc3037401f +Block 0023 [ 62]: 42ce4ef72d07cd55 +Block 0023 [ 63]: 92eb30d2eb66f108 +Block 0023 [ 64]: 8fa86c51ef64302a +Block 0023 [ 65]: 2d0d0d36976fbc53 +Block 0023 [ 66]: 5fc6d2b9917bc624 +Block 0023 [ 67]: 889cf6888dd7bc8a +Block 0023 [ 68]: 992f099b98c3740c +Block 0023 [ 69]: 12fe92fe02ee099a +Block 0023 [ 70]: 23ce13d7948ddd64 +Block 0023 [ 71]: 33ee61ee295d4fa0 +Block 0023 [ 72]: 8283374ec0cce033 +Block 0023 [ 73]: fff2602247882991 +Block 0023 [ 74]: 4b1663575c159028 +Block 0023 [ 75]: bafdb75175f3f801 +Block 0023 [ 76]: 4896dc4bf1314297 +Block 0023 [ 77]: c194e7febcc3f109 +Block 0023 [ 78]: 58479af120c28438 +Block 0023 [ 79]: a4a0a51c58e36277 +Block 0023 [ 80]: 0b3bb203c682dc67 +Block 0023 [ 81]: 746cd2daa1e039dd +Block 0023 [ 82]: 778726fad45bc5c4 +Block 0023 [ 83]: 7032fd18f64ba5f7 +Block 0023 [ 84]: bfc6a54ff3c4b225 +Block 0023 [ 85]: 72b34d7cdd4ce5a0 +Block 0023 [ 86]: a98b6dcc105c6599 +Block 0023 [ 87]: f1e96f02fad3ed0b +Block 0023 [ 88]: 1939fc5e44020b06 +Block 0023 [ 89]: 448dfdd8798a4874 +Block 0023 [ 90]: 98a2c3a040beee9a +Block 0023 [ 91]: 6f2db254dd4b6380 +Block 0023 [ 92]: 08c4e1603c2e6090 +Block 0023 [ 93]: f827733c9a22a2ce +Block 0023 [ 94]: 3d1c8748079a56a3 +Block 0023 [ 95]: 7ae919efdd933131 +Block 0023 [ 96]: c727cf1cb2808cb3 +Block 0023 [ 97]: 7b6def6b630a169e +Block 0023 [ 98]: 6ef5ceefdf3d02bf +Block 0023 [ 99]: d181753664d13703 +Block 0023 [100]: 502f862c989e3fa7 +Block 0023 [101]: bb2f03f33d6ac3ae +Block 0023 [102]: 5c604b717948a33a +Block 0023 [103]: 630988dfb218abe5 +Block 0023 [104]: 5acb7fd208d802db +Block 0023 [105]: ac830527c5e999b1 +Block 0023 [106]: 516fd37d43ae2d1e +Block 0023 [107]: 594c0dc0159c63c6 +Block 0023 [108]: 836bc0c551eded8b +Block 0023 [109]: e0eddf7b8bf4760e +Block 0023 [110]: 47942839c8110b8f +Block 0023 [111]: dcb4aca02099f907 +Block 0023 [112]: ac918e1eb8d52a65 +Block 0023 [113]: 5146539f9438d2a6 +Block 0023 [114]: 922b0f0abfd46794 +Block 0023 [115]: 3fb0f166928220e4 +Block 0023 [116]: e2c9d29dbff352c8 +Block 0023 [117]: 3c949bb615b76a18 +Block 0023 [118]: 09881809f1e367b9 +Block 0023 [119]: d1fe339181b8b543 +Block 0023 [120]: b7fd1e77372bef3f +Block 0023 [121]: 03773182b98b9987 +Block 0023 [122]: 9e840ac0cc8d09ac +Block 0023 [123]: 2f45e7e49be08dfc +Block 0023 [124]: 6fe8bca985b15f5a +Block 0023 [125]: 594084ec59454bea +Block 0023 [126]: 5d0c687a81fc544d +Block 0023 [127]: ee89421c46d7e558 +Block 0024 [ 0]: fa103a94eb8b6e74 +Block 0024 [ 1]: 71cf5ea7430c6609 +Block 0024 [ 2]: 379c6751fee7ae1b +Block 0024 [ 3]: 1f3f70b9027f6e7c +Block 0024 [ 4]: 75d20e9caa8fa717 +Block 0024 [ 5]: 115a61491b07b6cd +Block 0024 [ 6]: 7932288af80cd9bf +Block 0024 [ 7]: 6535b5d2d138f903 +Block 0024 [ 8]: 284d6527a81184ec +Block 0024 [ 9]: 4e70f9959222fcbb +Block 0024 [ 10]: dd2a61a55cdc78e3 +Block 0024 [ 11]: 8365ad7d50f8f015 +Block 0024 [ 12]: ca4972f76a1c0238 +Block 0024 [ 13]: a6c0011066aa15b7 +Block 0024 [ 14]: 9eab0e1c3130d275 +Block 0024 [ 15]: aa76c422fa6b9f84 +Block 0024 [ 16]: 555e0ac5402670f1 +Block 0024 [ 17]: 0e2aa8b082335a73 +Block 0024 [ 18]: fa0aa4e7358150ac +Block 0024 [ 19]: a8f0ae6455d0cc7f +Block 0024 [ 20]: 24f1ee88bf0fabf7 +Block 0024 [ 21]: 38563cb2b3e99490 +Block 0024 [ 22]: 161de2f55406017c +Block 0024 [ 23]: 21c2167cf87df602 +Block 0024 [ 24]: 1cdc9f40d0c13285 +Block 0024 [ 25]: 734995aaa9ae30a4 +Block 0024 [ 26]: 74683a21713b323b +Block 0024 [ 27]: 1b7a14dd0ae8c7b0 +Block 0024 [ 28]: e93ebff9df6564ef +Block 0024 [ 29]: abe93118fe044789 +Block 0024 [ 30]: 41466094f1898728 +Block 0024 [ 31]: ea57b47d087a417a +Block 0024 [ 32]: 4c53c6cbcfd96e90 +Block 0024 [ 33]: 3adea2be4c2966a6 +Block 0024 [ 34]: 1823455650de85f3 +Block 0024 [ 35]: daf707bd14f21c4a +Block 0024 [ 36]: 600ca4b48bcbcf53 +Block 0024 [ 37]: b1af608e1c1acfce +Block 0024 [ 38]: 145d6117eda40e01 +Block 0024 [ 39]: 43bb28822f88806f +Block 0024 [ 40]: 18fd37e5c8359f98 +Block 0024 [ 41]: 7d93b6fae58530cf +Block 0024 [ 42]: 5b4cd795c04b4bf1 +Block 0024 [ 43]: 38dad5655f02d404 +Block 0024 [ 44]: af5f968c1a391d62 +Block 0024 [ 45]: c37bd6023c551d3c +Block 0024 [ 46]: f0c7f2917fbf51fb +Block 0024 [ 47]: c53f7f33cb2cb648 +Block 0024 [ 48]: eb35a7abedeedf32 +Block 0024 [ 49]: dd7fa26ee17cd9fc +Block 0024 [ 50]: f5fcce040a9308fa +Block 0024 [ 51]: a4552572b9348b7f +Block 0024 [ 52]: 7909ee855e91d636 +Block 0024 [ 53]: 94f69b3368d2c478 +Block 0024 [ 54]: 2bf78c27935d13ff +Block 0024 [ 55]: 36b9ed5e69ae9474 +Block 0024 [ 56]: 48fcc8a46a27b79b +Block 0024 [ 57]: b856786098b8bacd +Block 0024 [ 58]: 20dc555f833c4cad +Block 0024 [ 59]: ffdd83a0f20b35d1 +Block 0024 [ 60]: 13cfff8112e27de4 +Block 0024 [ 61]: fc935988d81e3589 +Block 0024 [ 62]: f0eee3a476f22d0c +Block 0024 [ 63]: fdcd5ba6dd44cf97 +Block 0024 [ 64]: e68d31d6f9ef3f8e +Block 0024 [ 65]: 508f9ff8d087e9f4 +Block 0024 [ 66]: f429f0cba38d7842 +Block 0024 [ 67]: 182fb1cac2acc609 +Block 0024 [ 68]: ca9a4568171cde9c +Block 0024 [ 69]: d47e38dba8e537e5 +Block 0024 [ 70]: bd743a39cd59f99c +Block 0024 [ 71]: 495abdd1bd1fc0f2 +Block 0024 [ 72]: 148c5ba07f03a932 +Block 0024 [ 73]: 904c4a6a79abfd96 +Block 0024 [ 74]: deecdf43f7698331 +Block 0024 [ 75]: e4f67a19d7041b1e +Block 0024 [ 76]: 16b5848fd1b24266 +Block 0024 [ 77]: 7d7ac333b809d08f +Block 0024 [ 78]: 35eaa6ae35afd3f1 +Block 0024 [ 79]: 5fca382578f0aba3 +Block 0024 [ 80]: a2250744c418ad53 +Block 0024 [ 81]: fadbb88c2f52c4d9 +Block 0024 [ 82]: d5954ae05fec3428 +Block 0024 [ 83]: d47ef4350d39f8b3 +Block 0024 [ 84]: 63bd863fa81e3d55 +Block 0024 [ 85]: 5b210d8edd4bf343 +Block 0024 [ 86]: 86216a2d781e3aba +Block 0024 [ 87]: 925a75c19797e906 +Block 0024 [ 88]: 0f4879030aa235b8 +Block 0024 [ 89]: 850d9f1d51e61cba +Block 0024 [ 90]: d21cbab6dc6a90f1 +Block 0024 [ 91]: f0288cd7780dd66b +Block 0024 [ 92]: 987f7d6f5e033538 +Block 0024 [ 93]: 339f9acd310bc324 +Block 0024 [ 94]: 3b0c17458702ddd1 +Block 0024 [ 95]: 8e2de118a2df9e6e +Block 0024 [ 96]: 355f5b40341e6a6d +Block 0024 [ 97]: 97b426f12c8ecd0a +Block 0024 [ 98]: 5f6c0bd4f4ad4801 +Block 0024 [ 99]: d83ccd8e06c9b99e +Block 0024 [100]: 0092227b6d6aba22 +Block 0024 [101]: c0d9f079e67bee82 +Block 0024 [102]: ddc0cf6634af2d1c +Block 0024 [103]: 926f01523f7f52c2 +Block 0024 [104]: 55ff254c9117c227 +Block 0024 [105]: 462dcdc07963b99e +Block 0024 [106]: 1d34ff532c8e6510 +Block 0024 [107]: 0fbf72a6de9b69db +Block 0024 [108]: 5e93cb1d7c955aaf +Block 0024 [109]: fa36f19bb7c882a0 +Block 0024 [110]: 6c6f68d785518d9c +Block 0024 [111]: 632bc6c3ce8a5029 +Block 0024 [112]: 31945fc5020e6cf5 +Block 0024 [113]: 1c097aff84bbc77e +Block 0024 [114]: 8649e1bf2f457f18 +Block 0024 [115]: db4da4890b69094a +Block 0024 [116]: 8d542edade32524a +Block 0024 [117]: 4b79711c5f1d24ef +Block 0024 [118]: 18b44b2118a930eb +Block 0024 [119]: 1ad45f28f08be690 +Block 0024 [120]: 305613dbe3e7ae65 +Block 0024 [121]: cc10a15534f46c09 +Block 0024 [122]: 0cd495b83f19a0e9 +Block 0024 [123]: 70b84f26fd32b9c1 +Block 0024 [124]: 059b57532d61ef20 +Block 0024 [125]: 0db5ea4dac04395d +Block 0024 [126]: 84e4b96503cad6e0 +Block 0024 [127]: b22cece0e90325b5 +Block 0025 [ 0]: acadb47787e0e62d +Block 0025 [ 1]: 89db15bfeb35c67c +Block 0025 [ 2]: ed2997a2cd0015a0 +Block 0025 [ 3]: 194671063cd59b39 +Block 0025 [ 4]: bfb10fa28657c239 +Block 0025 [ 5]: a3c9f57c2e492a5a +Block 0025 [ 6]: d2ad1559dc2faa60 +Block 0025 [ 7]: 07b30a013f1f0e8c +Block 0025 [ 8]: 9e24764dd386d411 +Block 0025 [ 9]: 9eecaf179e51d7a6 +Block 0025 [ 10]: 1e3ccb14c450b9fb +Block 0025 [ 11]: a02fbd9c3fdd5cd8 +Block 0025 [ 12]: cae040fffa896b67 +Block 0025 [ 13]: c30348e230fe34e7 +Block 0025 [ 14]: 2bab58f77b702f0c +Block 0025 [ 15]: 458a8b1be3ba75cc +Block 0025 [ 16]: 05f630c5b0fcefce +Block 0025 [ 17]: bbae1e1b7b233558 +Block 0025 [ 18]: a4f3cdc1a95349d6 +Block 0025 [ 19]: 6d48d6fc63a2b369 +Block 0025 [ 20]: 5a58b2e088572a86 +Block 0025 [ 21]: 93021d253a6ca370 +Block 0025 [ 22]: c4669e03aba0e41c +Block 0025 [ 23]: 517c21f6f717beef +Block 0025 [ 24]: ad1ed0842b693990 +Block 0025 [ 25]: 932ea3b600e8fa63 +Block 0025 [ 26]: 94412081fe5d7db6 +Block 0025 [ 27]: 0c9587581ca0676a +Block 0025 [ 28]: f6b804ef2660bb1d +Block 0025 [ 29]: 342294f1c057f5ac +Block 0025 [ 30]: 6cf1635982de5d91 +Block 0025 [ 31]: 26b51a9b4901465c +Block 0025 [ 32]: 47560ef80d00e93d +Block 0025 [ 33]: 1719bdd4357a7f33 +Block 0025 [ 34]: 6478f7b2660c9b93 +Block 0025 [ 35]: bd5209fc80832ddc +Block 0025 [ 36]: f6592e8643238445 +Block 0025 [ 37]: 6f204a61f25e4b12 +Block 0025 [ 38]: 35694628a2ff8abd +Block 0025 [ 39]: fea9ac42aa3ceff1 +Block 0025 [ 40]: 36e352f162c706fd +Block 0025 [ 41]: 8b3a6b5850374e58 +Block 0025 [ 42]: 451d1544d57f7618 +Block 0025 [ 43]: 62e57656237e4b0e +Block 0025 [ 44]: d85e6c03cda3ff01 +Block 0025 [ 45]: e10874aa046d1dfb +Block 0025 [ 46]: b6a0b09d65515347 +Block 0025 [ 47]: 86cbd5f2cb16e8ab +Block 0025 [ 48]: a4a135272607deff +Block 0025 [ 49]: f445fd366d4ff7f2 +Block 0025 [ 50]: dd15c10173acb786 +Block 0025 [ 51]: ed741e791affc000 +Block 0025 [ 52]: 1515bd8fd6a6d28b +Block 0025 [ 53]: d28947fae8e86d43 +Block 0025 [ 54]: 5670b6f88fc2e9ed +Block 0025 [ 55]: bc1776fe1e2a05d2 +Block 0025 [ 56]: b508250a4219c65a +Block 0025 [ 57]: 45f02eda1a48ea03 +Block 0025 [ 58]: 607bcf65c28ccb29 +Block 0025 [ 59]: 111e9405cc0a9c58 +Block 0025 [ 60]: abb33ee022dda838 +Block 0025 [ 61]: b2240c4df99b2d4c +Block 0025 [ 62]: e8c4a136a3eadcf9 +Block 0025 [ 63]: d7ec593b9aef542b +Block 0025 [ 64]: 6f510d1b002ec558 +Block 0025 [ 65]: a01e2071f0eb2e94 +Block 0025 [ 66]: 26f75e619cfb5140 +Block 0025 [ 67]: f1145e65bfdd120f +Block 0025 [ 68]: 5f0620860cd88389 +Block 0025 [ 69]: 52ca8641c7ebc6ac +Block 0025 [ 70]: a3c97e5904a54b1b +Block 0025 [ 71]: 57b37085fd40a46b +Block 0025 [ 72]: 8674f89c371ad57e +Block 0025 [ 73]: d939b68dfa8da895 +Block 0025 [ 74]: a86e84431961783c +Block 0025 [ 75]: 4365b03c8a63133b +Block 0025 [ 76]: a1b358ddc73aaf52 +Block 0025 [ 77]: e697264359e17f7d +Block 0025 [ 78]: 54cd0039bb353cb6 +Block 0025 [ 79]: c607259b67e3ce6f +Block 0025 [ 80]: 4b329cc61bf3eb5a +Block 0025 [ 81]: 2492f1f9bc9a8b5d +Block 0025 [ 82]: 7d4f7b9a4969b0a3 +Block 0025 [ 83]: b30cd7f1eba80723 +Block 0025 [ 84]: 4603bdb7771b5a18 +Block 0025 [ 85]: 22370064c642e39b +Block 0025 [ 86]: 67933471b75cf941 +Block 0025 [ 87]: 707ebb2467979a75 +Block 0025 [ 88]: 71bdbb34998bb883 +Block 0025 [ 89]: 7ca6b42ea9fb26a5 +Block 0025 [ 90]: 350e49361365bf71 +Block 0025 [ 91]: 33349dc1ced81fde +Block 0025 [ 92]: a358ee5e36aaa4c4 +Block 0025 [ 93]: 937b184837c13da3 +Block 0025 [ 94]: bd7a02b7e7b72a62 +Block 0025 [ 95]: d0656b37c7dc422d +Block 0025 [ 96]: fe65fcbe8a0ad440 +Block 0025 [ 97]: 12ed44baba3ebacb +Block 0025 [ 98]: 9a680c17e49ed88a +Block 0025 [ 99]: b839bf85c6d3956b +Block 0025 [100]: 75e6674117502c08 +Block 0025 [101]: d6cb9459957d0e4e +Block 0025 [102]: 2f025b945f2f71b0 +Block 0025 [103]: b15b992ebf46ea26 +Block 0025 [104]: a58186fd4f22c433 +Block 0025 [105]: db2c21ec363674eb +Block 0025 [106]: f88fe356feaaf1ff +Block 0025 [107]: 570f6a4b4849e237 +Block 0025 [108]: 14035bc7f48df466 +Block 0025 [109]: ddb45cdddb15dbdb +Block 0025 [110]: f0572535fe525143 +Block 0025 [111]: 1ce3c0282ea29234 +Block 0025 [112]: d73347c8a9c6df0f +Block 0025 [113]: 721642c7734110aa +Block 0025 [114]: f5b43e20200e678d +Block 0025 [115]: 53652fc6c3886359 +Block 0025 [116]: caa4c48dc6da888d +Block 0025 [117]: 8dbe7af4765ba285 +Block 0025 [118]: e7c34d642ab8379c +Block 0025 [119]: 694eba65c6198cd1 +Block 0025 [120]: 951e0c3a0fc9dac2 +Block 0025 [121]: a9512f0ae3e175bf +Block 0025 [122]: f912282c1fe8850d +Block 0025 [123]: 88ba06847be5780f +Block 0025 [124]: 9cf3b21809173c93 +Block 0025 [125]: 87afd19c5e19a948 +Block 0025 [126]: 990f1184b82f0c59 +Block 0025 [127]: 94d8c54ba08642ab +Block 0026 [ 0]: 50b295833dfb05dd +Block 0026 [ 1]: 567661a5a807fec5 +Block 0026 [ 2]: 03e4375c0677aa6c +Block 0026 [ 3]: 8df882b653a8e546 +Block 0026 [ 4]: 06a1a2e5b4dd1497 +Block 0026 [ 5]: ebf09eb380f1d347 +Block 0026 [ 6]: 8d674162d4d58415 +Block 0026 [ 7]: 8e9640ef1effca77 +Block 0026 [ 8]: 5415ecd367187b2f +Block 0026 [ 9]: f4e96c6f043df6ff +Block 0026 [ 10]: 75f864f3d561d897 +Block 0026 [ 11]: 401d802ccd58cbc2 +Block 0026 [ 12]: a2211178619d5b24 +Block 0026 [ 13]: 39d5bee61d034875 +Block 0026 [ 14]: 52815128485ab93d +Block 0026 [ 15]: 0598d9f55a912669 +Block 0026 [ 16]: 941552dd580575c0 +Block 0026 [ 17]: 8f619028dcc6784f +Block 0026 [ 18]: a6ecb0eb7e1cfba9 +Block 0026 [ 19]: 5e2e43be46ff1cfd +Block 0026 [ 20]: 3c015d055ab6467c +Block 0026 [ 21]: 1340e475f5b92367 +Block 0026 [ 22]: 100575c85d3eefe8 +Block 0026 [ 23]: 25baddd62863a612 +Block 0026 [ 24]: c3d327c5bfd22a3a +Block 0026 [ 25]: fa7a754f2bd820ea +Block 0026 [ 26]: 1d42473fb2d97483 +Block 0026 [ 27]: 3471d76071e9809b +Block 0026 [ 28]: cdb7c4192c5ae660 +Block 0026 [ 29]: 963ed324e1ac1061 +Block 0026 [ 30]: 421d12df283ff52e +Block 0026 [ 31]: 70f87bee5b64efc1 +Block 0026 [ 32]: 0421bc40a8db2f7d +Block 0026 [ 33]: b65a077b1e547d8a +Block 0026 [ 34]: b4dc92b0f61c5029 +Block 0026 [ 35]: 555b623fb30f1237 +Block 0026 [ 36]: 262edb116a2993a6 +Block 0026 [ 37]: 9582ef318a3ee8f9 +Block 0026 [ 38]: 7affb49d286d9632 +Block 0026 [ 39]: 27c704dfb98b3acf +Block 0026 [ 40]: 13e542f23f896758 +Block 0026 [ 41]: c8bbd0d56dfd7638 +Block 0026 [ 42]: eaba65a57471e933 +Block 0026 [ 43]: c98607a547832622 +Block 0026 [ 44]: 1ebd1b8afb0bf886 +Block 0026 [ 45]: f206507bfe115f86 +Block 0026 [ 46]: 326842eacb06c6bb +Block 0026 [ 47]: 95c621502add5dad +Block 0026 [ 48]: 60bcfce88154b796 +Block 0026 [ 49]: 9d0982e683e06e1f +Block 0026 [ 50]: 6e404290e8de2e0a +Block 0026 [ 51]: f7379a896794c18c +Block 0026 [ 52]: 7b2bfcb545e5ce3b +Block 0026 [ 53]: c7ea3b36e261e463 +Block 0026 [ 54]: 087aadf263e814dc +Block 0026 [ 55]: 470e873d7a28d2ea +Block 0026 [ 56]: 9c1de86f22c84905 +Block 0026 [ 57]: 0cb31716564be97d +Block 0026 [ 58]: 57c84f1733b38d11 +Block 0026 [ 59]: 90054ae99b4a469a +Block 0026 [ 60]: 44fc18fd1fbbfdf5 +Block 0026 [ 61]: 896474ccfa2a8abe +Block 0026 [ 62]: 6d1a83c45ab01d07 +Block 0026 [ 63]: 6e1db62335275c0e +Block 0026 [ 64]: f9e1778a7ace16c3 +Block 0026 [ 65]: 1a588e9ded9674b4 +Block 0026 [ 66]: d835296109312572 +Block 0026 [ 67]: 2e647c1fd56d0e9c +Block 0026 [ 68]: 2cfc5d8177130f53 +Block 0026 [ 69]: 48f63500ec356093 +Block 0026 [ 70]: c07082b25b554e7e +Block 0026 [ 71]: 28db93b22107fe9a +Block 0026 [ 72]: 6c8fb3681f1bf160 +Block 0026 [ 73]: 760d701be621a605 +Block 0026 [ 74]: 0cfda0e5c55ec8c7 +Block 0026 [ 75]: 5c6fdbbb2a8f8ff8 +Block 0026 [ 76]: aebfcee72b0950a3 +Block 0026 [ 77]: 9e2cb7decd8c3d48 +Block 0026 [ 78]: 27d55cfcb210dc24 +Block 0026 [ 79]: 55ad71b954f6abaf +Block 0026 [ 80]: be9834ba9ea0ac99 +Block 0026 [ 81]: 57f29d843db85712 +Block 0026 [ 82]: 9479adb08abb161a +Block 0026 [ 83]: 206421c067eb9317 +Block 0026 [ 84]: 7d72ee59b7d4463f +Block 0026 [ 85]: f02df93b0e19851d +Block 0026 [ 86]: 8dfa179b2fc85c50 +Block 0026 [ 87]: 4317539dae930952 +Block 0026 [ 88]: 4dc95947a415e992 +Block 0026 [ 89]: c828a34a403c233c +Block 0026 [ 90]: 44bde65a36130b0c +Block 0026 [ 91]: 43a9331614311fab +Block 0026 [ 92]: e343ad268e0db819 +Block 0026 [ 93]: 3bf80e0968fb4740 +Block 0026 [ 94]: 006f6758fb198787 +Block 0026 [ 95]: 5e4580c97af6364c +Block 0026 [ 96]: 0674fa0e5c5bb448 +Block 0026 [ 97]: 2b9cf6328e071183 +Block 0026 [ 98]: e82012c0f1292107 +Block 0026 [ 99]: 0041eb6c74330b21 +Block 0026 [100]: a0e1d5da140e1559 +Block 0026 [101]: 0cae4836a0580159 +Block 0026 [102]: 083475b819af769b +Block 0026 [103]: 497fcd3f6f96c7a6 +Block 0026 [104]: 1633d9be1cbeba9c +Block 0026 [105]: 431079c20c6dac62 +Block 0026 [106]: 5797684ab5a51658 +Block 0026 [107]: 6c669f583c1269c2 +Block 0026 [108]: a5d4304877962ed9 +Block 0026 [109]: 16abbaf910a907a7 +Block 0026 [110]: 7b80279a7ba988aa +Block 0026 [111]: 0bc8cea2c7084aa9 +Block 0026 [112]: 264cb55c54d5ad27 +Block 0026 [113]: 1a7f8846e62bba9c +Block 0026 [114]: 1c03cc75f7ce74e4 +Block 0026 [115]: 9944571757ddc5fa +Block 0026 [116]: 529e6ae1da16744d +Block 0026 [117]: c5153e8300f6dbed +Block 0026 [118]: abc65417de290d1b +Block 0026 [119]: 1f004424202a1b0a +Block 0026 [120]: cf3e839eeb92b189 +Block 0026 [121]: ef8b63f709186be2 +Block 0026 [122]: 1381a46de4cc9b60 +Block 0026 [123]: 46ef069715fbb521 +Block 0026 [124]: 5c225fbc8021dcc5 +Block 0026 [125]: bef20cb6a61f0826 +Block 0026 [126]: 688df34aa80029c2 +Block 0026 [127]: cd08d3de46464946 +Block 0027 [ 0]: f096dc3185d966c2 +Block 0027 [ 1]: d0ad3ab0d0656bae +Block 0027 [ 2]: 74c2422614d2ec64 +Block 0027 [ 3]: 687c01d102663a96 +Block 0027 [ 4]: a7a23967ca1e4843 +Block 0027 [ 5]: ecebcdc9d292e5bb +Block 0027 [ 6]: 7fa0abe1f526c09f +Block 0027 [ 7]: 37fc299537e25b91 +Block 0027 [ 8]: 99bee1a0a45aac3a +Block 0027 [ 9]: cf15202220272cb2 +Block 0027 [ 10]: eae1fcc2bceafb95 +Block 0027 [ 11]: dd5bd3d9fad9f727 +Block 0027 [ 12]: 80567562dcba64cf +Block 0027 [ 13]: e508747af9686bc4 +Block 0027 [ 14]: 4182eece1c93274a +Block 0027 [ 15]: 7edc10b4a33b2e1b +Block 0027 [ 16]: 7ec5682a947beac0 +Block 0027 [ 17]: 118d651eaa9b0f62 +Block 0027 [ 18]: b61d88641f68ab5d +Block 0027 [ 19]: 35badd2de0889c48 +Block 0027 [ 20]: 2c8f346e6876f454 +Block 0027 [ 21]: 478304ae6349d7e8 +Block 0027 [ 22]: 6d2810500634084e +Block 0027 [ 23]: 96d3d864a7d25fb4 +Block 0027 [ 24]: f29dfe7a753d21e4 +Block 0027 [ 25]: 2d2092e0345b81b4 +Block 0027 [ 26]: d3d4e7b8f30b5b4d +Block 0027 [ 27]: 966cc775e108688d +Block 0027 [ 28]: 92e135470b853dda +Block 0027 [ 29]: 1270493a870aa921 +Block 0027 [ 30]: 919cd6c705466b1d +Block 0027 [ 31]: a2939acdc6e4d066 +Block 0027 [ 32]: a304ab077675c888 +Block 0027 [ 33]: dfb58333a936fe6c +Block 0027 [ 34]: cca98347e639d280 +Block 0027 [ 35]: e0c7751fa0b95207 +Block 0027 [ 36]: 848c0482ff822b16 +Block 0027 [ 37]: 5af01581b7e62b6c +Block 0027 [ 38]: b016464dd3036bca +Block 0027 [ 39]: 1fb2a2ee30dff1a4 +Block 0027 [ 40]: fbf4e0ffa0ad1f2e +Block 0027 [ 41]: edf5f3be5331f61c +Block 0027 [ 42]: 7e5f55881a225643 +Block 0027 [ 43]: 62341c5352c796cb +Block 0027 [ 44]: bf162dc8d61c35ad +Block 0027 [ 45]: eee782d2dfb9f576 +Block 0027 [ 46]: 6b7ba3c07d263005 +Block 0027 [ 47]: e4b04cbfa903cf30 +Block 0027 [ 48]: 062e83f4560a79d8 +Block 0027 [ 49]: 17c1af32aa700e69 +Block 0027 [ 50]: d439638e74b2f66b +Block 0027 [ 51]: 64fd9c61d612a243 +Block 0027 [ 52]: 8dd0336357856c6d +Block 0027 [ 53]: 6d4c9d450b8ffb59 +Block 0027 [ 54]: 077a74414a905dc9 +Block 0027 [ 55]: 8046a314cc058ee5 +Block 0027 [ 56]: d8d54fce2d967c0e +Block 0027 [ 57]: 72035c981b1306f8 +Block 0027 [ 58]: 817343d510a272c3 +Block 0027 [ 59]: f07eb869b912aac8 +Block 0027 [ 60]: 1f57bf346c0b9468 +Block 0027 [ 61]: 84b55995890629ca +Block 0027 [ 62]: dec290057cec9c1b +Block 0027 [ 63]: 539154b989212510 +Block 0027 [ 64]: 58784ed313cd22f7 +Block 0027 [ 65]: 9e38a70af5a7db0b +Block 0027 [ 66]: dab3720f488e7c35 +Block 0027 [ 67]: a507550806424731 +Block 0027 [ 68]: 685b6a98ea7bbe6f +Block 0027 [ 69]: 9e8e21270e505097 +Block 0027 [ 70]: b77daaaf5e0fe51d +Block 0027 [ 71]: 79ef13739388ce3f +Block 0027 [ 72]: fe00eafe45c56be6 +Block 0027 [ 73]: bc7b9c5baff182fb +Block 0027 [ 74]: b35eabd2e8175144 +Block 0027 [ 75]: 99f48f8251f50e27 +Block 0027 [ 76]: ae1de2e512df9a3a +Block 0027 [ 77]: 470ee861030b164a +Block 0027 [ 78]: 5cd8f4c145b8dc2b +Block 0027 [ 79]: 41ad914535bf1043 +Block 0027 [ 80]: c5c20273c2ea694d +Block 0027 [ 81]: 6910400d047274eb +Block 0027 [ 82]: fa23ccc88611ed27 +Block 0027 [ 83]: 3fde5d5785ff6868 +Block 0027 [ 84]: 5ccc668ca420c783 +Block 0027 [ 85]: 21ad91fdb222acab +Block 0027 [ 86]: 16adf902927c8366 +Block 0027 [ 87]: 3cdb6e0c7a52bfe8 +Block 0027 [ 88]: a1bc687942afa21e +Block 0027 [ 89]: 8f54dddce8f7fd5c +Block 0027 [ 90]: 7b098fa4d4b6ab4a +Block 0027 [ 91]: a20634cbbf712aba +Block 0027 [ 92]: dd7777ea8afb70c9 +Block 0027 [ 93]: be05beeef4a4b8ee +Block 0027 [ 94]: e8b1925905bc113d +Block 0027 [ 95]: f0a1d60ea245eb7b +Block 0027 [ 96]: 1772469e07a94532 +Block 0027 [ 97]: 1df3f8439e4aa1ce +Block 0027 [ 98]: 66d5968f758bf1b0 +Block 0027 [ 99]: 5c35f016cfa6930e +Block 0027 [100]: 814ba6154fda28ad +Block 0027 [101]: e3dbf45106e1200d +Block 0027 [102]: ebb117726dab2d87 +Block 0027 [103]: 9e44b77784c653dd +Block 0027 [104]: a407d0952407cbf3 +Block 0027 [105]: 5e2110099e1cd4ea +Block 0027 [106]: 0f18e49033f7dc41 +Block 0027 [107]: c4332aa0c9c3c053 +Block 0027 [108]: 05b77caab4522bce +Block 0027 [109]: 29a3efbc52325114 +Block 0027 [110]: e1c0e2502bfa61af +Block 0027 [111]: f2a63277d6a3862d +Block 0027 [112]: 91b78dd58fc89d92 +Block 0027 [113]: 83a9e84f93692327 +Block 0027 [114]: fb6b7e7168751ec1 +Block 0027 [115]: 842c25ba64d5a3d8 +Block 0027 [116]: a50ebc02ce848a46 +Block 0027 [117]: 7fef4c3fd17127e8 +Block 0027 [118]: d661b87fbf9a2e34 +Block 0027 [119]: 98b71c1163dee85f +Block 0027 [120]: dfcacdd89eaa6e56 +Block 0027 [121]: b9abd457c2d22663 +Block 0027 [122]: 96e2ffbe173bb116 +Block 0027 [123]: f08974b04d026456 +Block 0027 [124]: f837e1862f495cc1 +Block 0027 [125]: 9dc79c703e07b954 +Block 0027 [126]: 0edb3ea5ce47e628 +Block 0027 [127]: bb94cd2b6c52fd2f +Block 0028 [ 0]: 0b8bfa4c5c97692d +Block 0028 [ 1]: 3fa01aeccfbcdebf +Block 0028 [ 2]: 9b19e228c5ffe5ec +Block 0028 [ 3]: 4624ebbea8947c48 +Block 0028 [ 4]: c30d6ed540afa086 +Block 0028 [ 5]: 2a61862b51cc4001 +Block 0028 [ 6]: 986a72ca0d3b275f +Block 0028 [ 7]: 8254f5483e9217c4 +Block 0028 [ 8]: a28f52ee554db367 +Block 0028 [ 9]: 7e03ad05d1743a6f +Block 0028 [ 10]: 5756878036e93a0b +Block 0028 [ 11]: ba168dcebfbe1b24 +Block 0028 [ 12]: 4eca447838c8fcf3 +Block 0028 [ 13]: 5dd09b4e010e7181 +Block 0028 [ 14]: 11aa79e5cfcb306f +Block 0028 [ 15]: 07a7d142ea04b372 +Block 0028 [ 16]: f2af2f7e65bc0d87 +Block 0028 [ 17]: baa9df98896b93a4 +Block 0028 [ 18]: 9c15d421cb8ba455 +Block 0028 [ 19]: fe2be76efa88ed21 +Block 0028 [ 20]: 1b37035070f9cbb9 +Block 0028 [ 21]: bbcbe391e2ce09f6 +Block 0028 [ 22]: 178ac0961508db49 +Block 0028 [ 23]: eff7abc82697e447 +Block 0028 [ 24]: 40f84b5085d1cd45 +Block 0028 [ 25]: 67775e01d463e559 +Block 0028 [ 26]: 8d07e8cdc435f37d +Block 0028 [ 27]: 9934217b91a7d414 +Block 0028 [ 28]: fa385dda3f4b1013 +Block 0028 [ 29]: 395a49ed50e1c9d2 +Block 0028 [ 30]: f329b164e220d024 +Block 0028 [ 31]: c660fbcdc4aa0785 +Block 0028 [ 32]: d6645444da6ace9d +Block 0028 [ 33]: cda566bd2bd27f63 +Block 0028 [ 34]: a282c756f0f20738 +Block 0028 [ 35]: db2ab31cd2a9ed5e +Block 0028 [ 36]: d6fbbe901dc5cb15 +Block 0028 [ 37]: 009aa73089ee763f +Block 0028 [ 38]: c09ecb723ca77bf1 +Block 0028 [ 39]: 79985c69f715a7be +Block 0028 [ 40]: ce8357764e0d204b +Block 0028 [ 41]: 26433dec7d36c631 +Block 0028 [ 42]: 9a70506191b6b793 +Block 0028 [ 43]: 79c2f30246220b39 +Block 0028 [ 44]: 1d2077172eff0607 +Block 0028 [ 45]: a9de9fa916722872 +Block 0028 [ 46]: d89b88b87ca12d3e +Block 0028 [ 47]: 870c847a554f4fef +Block 0028 [ 48]: a3a7a2748bfdb1de +Block 0028 [ 49]: edd069eee7b46d58 +Block 0028 [ 50]: 652602bbf39aaab7 +Block 0028 [ 51]: 2d4f209f3845e1e2 +Block 0028 [ 52]: 21308472e7be9f3a +Block 0028 [ 53]: 6c2db272b2a22b3c +Block 0028 [ 54]: 07a0740492d2359b +Block 0028 [ 55]: 374739683573a339 +Block 0028 [ 56]: 96c6ca6c0416b67e +Block 0028 [ 57]: b55df4f9cd261108 +Block 0028 [ 58]: af862bd549991a2a +Block 0028 [ 59]: 7dad80edf5e8206e +Block 0028 [ 60]: 05c95b6a445cc1dc +Block 0028 [ 61]: aa157bbfbb22d1aa +Block 0028 [ 62]: ca7b3e7ab07c0d70 +Block 0028 [ 63]: 394cd42c5c06a3c0 +Block 0028 [ 64]: 3a4bcdf992fedb45 +Block 0028 [ 65]: bc3a86c8c1a65078 +Block 0028 [ 66]: 5c5aeb0ba453aeaf +Block 0028 [ 67]: f284834b9c12c294 +Block 0028 [ 68]: f40b0d89c6a0441e +Block 0028 [ 69]: a4c885144d2dfd4f +Block 0028 [ 70]: 995ccb8d3d3af7e7 +Block 0028 [ 71]: c04b150b328137e6 +Block 0028 [ 72]: 90e86832780c763b +Block 0028 [ 73]: 4b251c2ffb40fd28 +Block 0028 [ 74]: 6d7bcad44112d76a +Block 0028 [ 75]: 1910e0c9e3b1d838 +Block 0028 [ 76]: 502ce4c4567d9432 +Block 0028 [ 77]: 124b66d5caab14d8 +Block 0028 [ 78]: 3fade26963f7b685 +Block 0028 [ 79]: 706539b9aa256e7b +Block 0028 [ 80]: c60fb2c39aa1b794 +Block 0028 [ 81]: b0211dc59dc646f1 +Block 0028 [ 82]: f34537f1b3e7d8cc +Block 0028 [ 83]: ba3baa631204f008 +Block 0028 [ 84]: 8c70d71cb5a2e75e +Block 0028 [ 85]: 1baa6160eaacb35b +Block 0028 [ 86]: 1d5a7acefa143c97 +Block 0028 [ 87]: 61c5da59873dd000 +Block 0028 [ 88]: 0292ee3bebcb4896 +Block 0028 [ 89]: 78b3fdfedac96082 +Block 0028 [ 90]: 8c53202fc59c6ee0 +Block 0028 [ 91]: c84a57856de4f50d +Block 0028 [ 92]: edd6e10e8954bc69 +Block 0028 [ 93]: ee16b0aeecfb83a6 +Block 0028 [ 94]: f5d2407a655cd4fc +Block 0028 [ 95]: 5582eba4f4f336a4 +Block 0028 [ 96]: 386c6c2b31e071ad +Block 0028 [ 97]: 4b6789f4e9271a28 +Block 0028 [ 98]: 1732ab6cb3b1c80b +Block 0028 [ 99]: 15726eb3db8d583d +Block 0028 [100]: d7e0ceea926cab91 +Block 0028 [101]: 94703084e3bb47e1 +Block 0028 [102]: 75e539dbeb6bc96c +Block 0028 [103]: 2da516bfde306d23 +Block 0028 [104]: 112679a6295082fe +Block 0028 [105]: ed817f8eade76421 +Block 0028 [106]: f39d3920dbc72bcf +Block 0028 [107]: 5a1a9faf59352d55 +Block 0028 [108]: e89a7d450442923f +Block 0028 [109]: ba346fe4087e77e7 +Block 0028 [110]: 35492364250abde6 +Block 0028 [111]: 9832e2b7905992a1 +Block 0028 [112]: 10b9b9b31d3ac35b +Block 0028 [113]: e4b0106fde39639d +Block 0028 [114]: d300caff1b81fc16 +Block 0028 [115]: 4aeee1beed87381b +Block 0028 [116]: 54eede43bd7f508a +Block 0028 [117]: 51ffc1138420db2c +Block 0028 [118]: 5e765bb31b18c0c2 +Block 0028 [119]: 1bf00fb92186e7c2 +Block 0028 [120]: 32d4d8cdb00aff86 +Block 0028 [121]: c1a075505c618c74 +Block 0028 [122]: 2862f96036005511 +Block 0028 [123]: f7e86b9564e716f3 +Block 0028 [124]: a4498d8255501669 +Block 0028 [125]: 771f2428943d3630 +Block 0028 [126]: f4dbed4a8483b5f8 +Block 0028 [127]: 38e0618f70429e7a +Block 0029 [ 0]: 1342aa819759ad55 +Block 0029 [ 1]: 2a58d88b1313ee1d +Block 0029 [ 2]: 04380d2370776def +Block 0029 [ 3]: 2984280394553fa4 +Block 0029 [ 4]: e6e0cbf7515e7614 +Block 0029 [ 5]: 65d3039585de045b +Block 0029 [ 6]: fad2abab2d69eabf +Block 0029 [ 7]: 14f6856b255cc8b0 +Block 0029 [ 8]: cf5e53abb23fde4b +Block 0029 [ 9]: 0f9ed7c99a4186b1 +Block 0029 [ 10]: 5128f73f1c9c476a +Block 0029 [ 11]: daa8ace3701b388b +Block 0029 [ 12]: 528eef2a04f98732 +Block 0029 [ 13]: b2f7800cb0863ba7 +Block 0029 [ 14]: 4c7f9bc145bfca64 +Block 0029 [ 15]: 62cb81be906a7529 +Block 0029 [ 16]: ae6a747e1fe0c590 +Block 0029 [ 17]: 64c36f221ccd38cb +Block 0029 [ 18]: 62e82903b941ce11 +Block 0029 [ 19]: 34abc5adfb0b23c9 +Block 0029 [ 20]: 69ac60e945ade24d +Block 0029 [ 21]: 80642aeab6d7bca9 +Block 0029 [ 22]: 4c8395c9e008dc8a +Block 0029 [ 23]: 0e3fc29352116891 +Block 0029 [ 24]: 78f2c451e68d73f7 +Block 0029 [ 25]: 6a4594a1b3f1c724 +Block 0029 [ 26]: 768002b557fef95e +Block 0029 [ 27]: 7bdcf6b313041bfc +Block 0029 [ 28]: 2e4c3ba77b7dc340 +Block 0029 [ 29]: 73080545a3049a27 +Block 0029 [ 30]: 3b71ab0a0f6b5be0 +Block 0029 [ 31]: 8fb04622b683c1fa +Block 0029 [ 32]: 29367052161c185d +Block 0029 [ 33]: 54c7744f8bd9d6ac +Block 0029 [ 34]: 35bf09e564100364 +Block 0029 [ 35]: 88f3c401223434f8 +Block 0029 [ 36]: 96d01519f6d5f60c +Block 0029 [ 37]: 4872434a3b4be97b +Block 0029 [ 38]: b64455bbe358020f +Block 0029 [ 39]: b455a338bafb3877 +Block 0029 [ 40]: 101974b5b225f62a +Block 0029 [ 41]: bb130e2146078e1d +Block 0029 [ 42]: 08d5d8867a06cdcb +Block 0029 [ 43]: 5188fb4d5e177880 +Block 0029 [ 44]: 1e88286829af2a8b +Block 0029 [ 45]: 1fb55b9f7549c764 +Block 0029 [ 46]: e1b13f2e423836c0 +Block 0029 [ 47]: 21f928ab65ee3682 +Block 0029 [ 48]: dbb430a89dd1a2a0 +Block 0029 [ 49]: caeb04df4c3100b2 +Block 0029 [ 50]: 013548395a133533 +Block 0029 [ 51]: ceb65861a017b5a8 +Block 0029 [ 52]: 3503846ee3882099 +Block 0029 [ 53]: f2b3055f0274c056 +Block 0029 [ 54]: 3c1aaed297fa6a09 +Block 0029 [ 55]: a1b3eaa82adb7138 +Block 0029 [ 56]: 7c98c993986612c7 +Block 0029 [ 57]: 332e0a10cb62caa6 +Block 0029 [ 58]: 7255157123d19354 +Block 0029 [ 59]: 87fada98140da26c +Block 0029 [ 60]: aa8f500aa9b5b4b4 +Block 0029 [ 61]: 5334543eba7805d2 +Block 0029 [ 62]: cda91bedbba419c2 +Block 0029 [ 63]: 8500721d1be41584 +Block 0029 [ 64]: d7d443102fbfbc58 +Block 0029 [ 65]: c8509445b06f2de8 +Block 0029 [ 66]: 41b046af2881f5d4 +Block 0029 [ 67]: 5a3a48952a70c0e9 +Block 0029 [ 68]: 2084ab777d8696fb +Block 0029 [ 69]: 367e4408de9f5e17 +Block 0029 [ 70]: 484f3345ea0f2209 +Block 0029 [ 71]: c3e89ccdec8d22c0 +Block 0029 [ 72]: 0242efdae8284e48 +Block 0029 [ 73]: f42905a84a844efe +Block 0029 [ 74]: 4424a2d4a1197b13 +Block 0029 [ 75]: 1d6d68842f1f3baa +Block 0029 [ 76]: b2edca88f7391dd4 +Block 0029 [ 77]: 07fe96875027d8dd +Block 0029 [ 78]: 26d07af4b56aa62b +Block 0029 [ 79]: 42ed21346aa2e910 +Block 0029 [ 80]: 427767abb9fc5db4 +Block 0029 [ 81]: 0ac5fea84b1c8fea +Block 0029 [ 82]: e27b91cfe888586d +Block 0029 [ 83]: 9068ed91b466cc0d +Block 0029 [ 84]: a55c75d158364b84 +Block 0029 [ 85]: d32d2407084e5174 +Block 0029 [ 86]: ea4f8cd3446c1654 +Block 0029 [ 87]: 52abfadbf462d66e +Block 0029 [ 88]: e670f796c665c750 +Block 0029 [ 89]: acbd1e8a64642e79 +Block 0029 [ 90]: a4c52d4c306fb308 +Block 0029 [ 91]: e7cea689579e0459 +Block 0029 [ 92]: ca6d2536a9c2b9a2 +Block 0029 [ 93]: 976ae0ac10f180e0 +Block 0029 [ 94]: 21f2d2f4a76951c8 +Block 0029 [ 95]: c63af3df30f6c4cf +Block 0029 [ 96]: 7c8d504059d31bde +Block 0029 [ 97]: 199eed54c6d323f4 +Block 0029 [ 98]: 04ef01484192b42a +Block 0029 [ 99]: 1cc19807d3fe0312 +Block 0029 [100]: 076c5b88f99a4766 +Block 0029 [101]: 32d3367c2e6058bf +Block 0029 [102]: 4c1ab23f34450cd4 +Block 0029 [103]: d05a45b002419d95 +Block 0029 [104]: a3e427169cce8c7b +Block 0029 [105]: 41b0beda3e123b31 +Block 0029 [106]: 1fd29ff5325c3021 +Block 0029 [107]: 418d7de5c18e8e7b +Block 0029 [108]: d857b25e57918532 +Block 0029 [109]: f23eab6af4e6f76b +Block 0029 [110]: 40df4093be491248 +Block 0029 [111]: 615b5919b163abc8 +Block 0029 [112]: dcecda207b953e9d +Block 0029 [113]: 612961710ce6358c +Block 0029 [114]: 408d6b85949c58f4 +Block 0029 [115]: d76936ce1d0d13c4 +Block 0029 [116]: f9c53a9492aad041 +Block 0029 [117]: c322c91811f78d3c +Block 0029 [118]: 609092f732b959b9 +Block 0029 [119]: ffe586d098e15630 +Block 0029 [120]: 5ffa0694fecaf5be +Block 0029 [121]: 8e08307f8ce1a92e +Block 0029 [122]: caa97eb3c6a9dfdf +Block 0029 [123]: 16ab5c05cb1bbef2 +Block 0029 [124]: 4651fbe947cda767 +Block 0029 [125]: b96daab8a4836c53 +Block 0029 [126]: 08fef05406742d7f +Block 0029 [127]: fee5545bf12d959f +Block 0030 [ 0]: ecb2b372da831b49 +Block 0030 [ 1]: c709558a41457c0e +Block 0030 [ 2]: f8464ae225358d10 +Block 0030 [ 3]: 565858a0371880b2 +Block 0030 [ 4]: 846f3802baa7d4d5 +Block 0030 [ 5]: 6a2041cf11bdc232 +Block 0030 [ 6]: 7391dac65c6ca396 +Block 0030 [ 7]: 20610c5f3458d103 +Block 0030 [ 8]: cf7dc2c3b5d21218 +Block 0030 [ 9]: b26b81b52310e8be +Block 0030 [ 10]: 1caf5d5acdd8ad0d +Block 0030 [ 11]: 9844351aac7ebd44 +Block 0030 [ 12]: 34b85f9e05026736 +Block 0030 [ 13]: 8d90acaec66ee2c5 +Block 0030 [ 14]: 79ebbbcc314700ea +Block 0030 [ 15]: af9ce295d25e9854 +Block 0030 [ 16]: 4633750c86574511 +Block 0030 [ 17]: 841dd873cf7c9af8 +Block 0030 [ 18]: 30a56a49963d6332 +Block 0030 [ 19]: 8758c43d7f43bc52 +Block 0030 [ 20]: 613500bf86a2472e +Block 0030 [ 21]: b662ccfc37dafc4e +Block 0030 [ 22]: b892dd0b1ed4867d +Block 0030 [ 23]: 55d004e0c22a6fa9 +Block 0030 [ 24]: 01895e286327f069 +Block 0030 [ 25]: 6316e819327f5aac +Block 0030 [ 26]: c17a79dc28221ff2 +Block 0030 [ 27]: fc7217cbe4abcb0f +Block 0030 [ 28]: e0a22abc712fc4ec +Block 0030 [ 29]: fc2ca70ad9656a5d +Block 0030 [ 30]: 78ad17f00e8363f9 +Block 0030 [ 31]: 5b8e9b907b095c13 +Block 0030 [ 32]: 1d0437e94c488a53 +Block 0030 [ 33]: a6c09180446ee448 +Block 0030 [ 34]: 592db16392414b1f +Block 0030 [ 35]: dfceadcd216f1c3b +Block 0030 [ 36]: afd0defb38513b4a +Block 0030 [ 37]: 55fec53c4a852f66 +Block 0030 [ 38]: 97cc98dede0e137a +Block 0030 [ 39]: 1efe8b0285eb0d53 +Block 0030 [ 40]: 0947a3ce98d0b868 +Block 0030 [ 41]: 4d49836cbb9e0f4d +Block 0030 [ 42]: 4464d43166968015 +Block 0030 [ 43]: 703e0898da38b794 +Block 0030 [ 44]: 5b7cfe7a59211f1c +Block 0030 [ 45]: 3c5fdc76342c4cc1 +Block 0030 [ 46]: 7edc3f911984cd71 +Block 0030 [ 47]: 53449b257e33379e +Block 0030 [ 48]: 97d49ba1e50a04fe +Block 0030 [ 49]: ca13017e3f9f4a72 +Block 0030 [ 50]: 86894a3d08a6cb97 +Block 0030 [ 51]: 805c183bd03c0ba8 +Block 0030 [ 52]: 966043770eadc1cf +Block 0030 [ 53]: 24a31a0bd717faa9 +Block 0030 [ 54]: 5a19962dad2bf5df +Block 0030 [ 55]: 3034f2f99495ce20 +Block 0030 [ 56]: 195fc7abd1a5dbe9 +Block 0030 [ 57]: 1f3a814bd85e8d9c +Block 0030 [ 58]: 59d4902d0897791f +Block 0030 [ 59]: 70616ecbae769969 +Block 0030 [ 60]: c0b35fdf7dd011a6 +Block 0030 [ 61]: 6c27eecf0dfaf13f +Block 0030 [ 62]: 04f4f55a838c904b +Block 0030 [ 63]: ee2bfa574b1f004c +Block 0030 [ 64]: 84cb47f17a211553 +Block 0030 [ 65]: 5ac7865a063f9175 +Block 0030 [ 66]: e1ce6460323291c0 +Block 0030 [ 67]: eddc3b6f7afb8969 +Block 0030 [ 68]: 1e1ed3f48592d3dc +Block 0030 [ 69]: c67f038d66ff6f88 +Block 0030 [ 70]: bd781d0261855bc3 +Block 0030 [ 71]: 2e1566dbfb78a892 +Block 0030 [ 72]: 035a4f7d351c8810 +Block 0030 [ 73]: d9301b86641d0837 +Block 0030 [ 74]: 4b4aa1e8bdf77993 +Block 0030 [ 75]: 22d5689c791cc39d +Block 0030 [ 76]: 04b267f305fdd276 +Block 0030 [ 77]: 89753d14693cdb86 +Block 0030 [ 78]: 49fd119b577707e6 +Block 0030 [ 79]: 04d8b03e8f25118c +Block 0030 [ 80]: f6aaf158c98bf608 +Block 0030 [ 81]: 6338c751302a2349 +Block 0030 [ 82]: b7169b8de98723cd +Block 0030 [ 83]: 9876c68d02e8d8da +Block 0030 [ 84]: d8be27b15da3e9c4 +Block 0030 [ 85]: d3c3bd16ce4518a1 +Block 0030 [ 86]: f116e6da60817f05 +Block 0030 [ 87]: 424d9096e5b7b236 +Block 0030 [ 88]: 68d08f23d2e01660 +Block 0030 [ 89]: 8391b1d4ccc96e77 +Block 0030 [ 90]: fa5a0445cb9d4eca +Block 0030 [ 91]: f35dea2991f818b8 +Block 0030 [ 92]: da06fcfbf14caaa3 +Block 0030 [ 93]: 3396473fc9b49d26 +Block 0030 [ 94]: dc0e4607f7047e53 +Block 0030 [ 95]: 88b8af32491bc7af +Block 0030 [ 96]: 2543c3dcba53d6cf +Block 0030 [ 97]: 74ccab446534e9a3 +Block 0030 [ 98]: 0875c246fb99841e +Block 0030 [ 99]: 2f13fcc0817d3543 +Block 0030 [100]: c8ab3c7a4e7260e6 +Block 0030 [101]: c730058d7eeda80d +Block 0030 [102]: de7fb4151297bbaf +Block 0030 [103]: 8b2bad56cd257929 +Block 0030 [104]: a16f121d2c6babeb +Block 0030 [105]: b23aed50a12698f7 +Block 0030 [106]: e6bc74f1c5e53eac +Block 0030 [107]: 2ecf12c6cc28ee0f +Block 0030 [108]: 73265ce24ac7eefa +Block 0030 [109]: c417f95b086f1ec4 +Block 0030 [110]: f5b33108d3254d7d +Block 0030 [111]: 2282b8385a69f71f +Block 0030 [112]: 08a128c65513bfc3 +Block 0030 [113]: dd1a056868bcb22c +Block 0030 [114]: 3711a120d9fe89fc +Block 0030 [115]: f629ebef106760db +Block 0030 [116]: 778784289feeebf6 +Block 0030 [117]: 781afab3042ba6cf +Block 0030 [118]: 69bfc9973c31f543 +Block 0030 [119]: 5a5d3d243c6a8b20 +Block 0030 [120]: d11b7960cf63ec8b +Block 0030 [121]: 6ad4c4cdb53621ce +Block 0030 [122]: 4ac645a6e18a6b16 +Block 0030 [123]: d4475ac4c0dbe40e +Block 0030 [124]: dfe701181b74acef +Block 0030 [125]: d4e308ef3c600531 +Block 0030 [126]: ef51f4965e80d50b +Block 0030 [127]: 2124a91e80b26b68 +Block 0031 [ 0]: 309f6c299d9879f9 +Block 0031 [ 1]: 61375f9b7b14d354 +Block 0031 [ 2]: 40ea625b81391ff8 +Block 0031 [ 3]: f15cbed827226249 +Block 0031 [ 4]: 5ce9b1693a572eda +Block 0031 [ 5]: 65f45c6d4dfa8c12 +Block 0031 [ 6]: 3e67d3cf7da85c8c +Block 0031 [ 7]: b8f8961765faa2c9 +Block 0031 [ 8]: 99f0b83b95d7c0f1 +Block 0031 [ 9]: fb304008030ea3f5 +Block 0031 [ 10]: ae5e2fa3a29075b4 +Block 0031 [ 11]: aa1ae37b327f62f2 +Block 0031 [ 12]: b94bce85e927be6c +Block 0031 [ 13]: c896549ae636df68 +Block 0031 [ 14]: 6952c1358d21b5a2 +Block 0031 [ 15]: 4038f1bbbdf6adde +Block 0031 [ 16]: 97fcf925d6298326 +Block 0031 [ 17]: 3e504f4327bcbdb6 +Block 0031 [ 18]: 024d30c429f5054f +Block 0031 [ 19]: 75318591f6653e81 +Block 0031 [ 20]: 29f7301b7b033e0d +Block 0031 [ 21]: 449cb4cc3a62ea86 +Block 0031 [ 22]: 42394853452068a9 +Block 0031 [ 23]: c87ddfebc72f384a +Block 0031 [ 24]: 47e532412f29d651 +Block 0031 [ 25]: 125959ed7619d763 +Block 0031 [ 26]: 68abeabaac672be4 +Block 0031 [ 27]: 784a08ffe3ea2e41 +Block 0031 [ 28]: 6635e49ca42e4b89 +Block 0031 [ 29]: bfe5d9a0b21ac03a +Block 0031 [ 30]: ee6453c49343c88e +Block 0031 [ 31]: 8665b5fa8f950f2e +Block 0031 [ 32]: f7f69ec71b54b177 +Block 0031 [ 33]: 40c25f95d856ebf5 +Block 0031 [ 34]: 59b9f6a29a90c6ec +Block 0031 [ 35]: 096e5d0f85b170ee +Block 0031 [ 36]: 98ac3365d491ef48 +Block 0031 [ 37]: 6a24ed36ca69234c +Block 0031 [ 38]: 9f4db634e58667b2 +Block 0031 [ 39]: 7f15383988bb1942 +Block 0031 [ 40]: 675e54a4986414dd +Block 0031 [ 41]: 9fb264d03b0bf34b +Block 0031 [ 42]: cc1fe359233a59ca +Block 0031 [ 43]: 06a7b5af161bca13 +Block 0031 [ 44]: d28e1ed596b43cce +Block 0031 [ 45]: d29ca29e051618cb +Block 0031 [ 46]: 9b11d233a9dc1f8b +Block 0031 [ 47]: 05116b39d78d10af +Block 0031 [ 48]: cfe9dc47077bbf75 +Block 0031 [ 49]: d89b8e20b6ddd178 +Block 0031 [ 50]: 2ea00f20ffc093cd +Block 0031 [ 51]: 51a0bd55c1eba699 +Block 0031 [ 52]: 3bf5d4ab777f6481 +Block 0031 [ 53]: 46308de0349ff974 +Block 0031 [ 54]: 677f762cbf01eafb +Block 0031 [ 55]: 148e52d70f13d161 +Block 0031 [ 56]: aac9894a6c0f52d8 +Block 0031 [ 57]: 916fad8177fb1517 +Block 0031 [ 58]: 2c6cb971e8ce24cf +Block 0031 [ 59]: b7f66b84ff3f1c6a +Block 0031 [ 60]: 7f131a58d45e20bf +Block 0031 [ 61]: b6b67bc9e2b162f3 +Block 0031 [ 62]: 224e9472ce3079a7 +Block 0031 [ 63]: bd52673cf1ebbc03 +Block 0031 [ 64]: 44210f114a3a508a +Block 0031 [ 65]: ab3566dfbea655ce +Block 0031 [ 66]: cf56bb4dabf2242b +Block 0031 [ 67]: d5749f3362a12aa9 +Block 0031 [ 68]: 65ebbb72e3ef59aa +Block 0031 [ 69]: f7484897773e242f +Block 0031 [ 70]: d043e243e50c581c +Block 0031 [ 71]: 7d1856ffd1fd2b33 +Block 0031 [ 72]: 723d2b6879dc6233 +Block 0031 [ 73]: 0128bca8e3230729 +Block 0031 [ 74]: e7f2af7f1f7a1162 +Block 0031 [ 75]: fad5c639a11e0a56 +Block 0031 [ 76]: e9bf231c61e72996 +Block 0031 [ 77]: b27143bd911ac35f +Block 0031 [ 78]: 757d9dc8b44d6729 +Block 0031 [ 79]: 0f784c8f9e2c457a +Block 0031 [ 80]: 5296215752af68c3 +Block 0031 [ 81]: fa2a0d6367d5d43a +Block 0031 [ 82]: 1c9d65b53604c9d0 +Block 0031 [ 83]: 1d55fd904fe8220b +Block 0031 [ 84]: ed34cd49c315a03a +Block 0031 [ 85]: 861ea5c5823bd9d5 +Block 0031 [ 86]: 358f58cb124df94c +Block 0031 [ 87]: 0b435adf91a35571 +Block 0031 [ 88]: dae7e1826db85ac4 +Block 0031 [ 89]: e670470c6ab8d9f2 +Block 0031 [ 90]: 30486e741c630a66 +Block 0031 [ 91]: 450d29e8cc3d4a69 +Block 0031 [ 92]: 49cdad6d59ac0add +Block 0031 [ 93]: e2bf968460f6259c +Block 0031 [ 94]: 191ca7f68c89af1e +Block 0031 [ 95]: 4497145b189ebb9a +Block 0031 [ 96]: 8da638358c0172ed +Block 0031 [ 97]: 8605c94d37eda7a0 +Block 0031 [ 98]: 6f2f59e44ef3811c +Block 0031 [ 99]: d5a44e6cc6dbb8b4 +Block 0031 [100]: bde572402e5c7dc2 +Block 0031 [101]: 3cd497d950293385 +Block 0031 [102]: 102be5062c637c5b +Block 0031 [103]: 69eaf3ad1722eb9f +Block 0031 [104]: 731dac2d1a722ca6 +Block 0031 [105]: afdfc9648bbb9b22 +Block 0031 [106]: 4ab06cc5234aef04 +Block 0031 [107]: 1f34f7c1ae7a0fb7 +Block 0031 [108]: 146d394a1d56fd2b +Block 0031 [109]: a71cef66736ea071 +Block 0031 [110]: be4dc0c799a9ab61 +Block 0031 [111]: 8f57dd28099e022e +Block 0031 [112]: bd6e3b1a62c0275b +Block 0031 [113]: fdfe31be37c6a3b8 +Block 0031 [114]: e6a7e6915adba060 +Block 0031 [115]: 95451eace1219c4e +Block 0031 [116]: 897816235b92c932 +Block 0031 [117]: 45e906d8622b85d3 +Block 0031 [118]: b82f4e0aa72d95dd +Block 0031 [119]: f4caee2823606dbb +Block 0031 [120]: 8c82170ba6003b71 +Block 0031 [121]: b9ba587178c53719 +Block 0031 [122]: 8da04337ef20afda +Block 0031 [123]: a863485e73253dc6 +Block 0031 [124]: 86ff3e9a61b6889c +Block 0031 [125]: dd50c7237eb67f05 +Block 0031 [126]: 7f19e13551117d48 +Block 0031 [127]: 67acdea7f4a2c876 + + After pass 1: +Block 0000 [ 0]: eb70c5da71245685 +Block 0000 [ 1]: b9aff8ada10961b8 +Block 0000 [ 2]: 865a10e399244b02 +Block 0000 [ 3]: 3161b9cd7980bda1 +Block 0000 [ 4]: 6bd2564c45042263 +Block 0000 [ 5]: 2b70da92385e4d23 +Block 0000 [ 6]: 98662686decc6e46 +Block 0000 [ 7]: 0de4ef0b5e35c2b4 +Block 0000 [ 8]: f238d4faa61a746f +Block 0000 [ 9]: 811d631e78456381 +Block 0000 [ 10]: 6b819488537c6b98 +Block 0000 [ 11]: 37bed8fffc2982ca +Block 0000 [ 12]: d8d61a26c1e1ab05 +Block 0000 [ 13]: 1568a7dfdae11df3 +Block 0000 [ 14]: b98f088aa645818c +Block 0000 [ 15]: 49aa299e0418469f +Block 0000 [ 16]: 4525a20e6ccba1fa +Block 0000 [ 17]: 937a4c94329365c5 +Block 0000 [ 18]: f0651d65470c89ee +Block 0000 [ 19]: ad9c2258efd5b32f +Block 0000 [ 20]: e95c39b287f061cb +Block 0000 [ 21]: 7105469e5f3b6097 +Block 0000 [ 22]: 52c23bd89c3dbe93 +Block 0000 [ 23]: e8e2706053327645 +Block 0000 [ 24]: 426c93675bfb8bad +Block 0000 [ 25]: 0d7dd3f7765e74c4 +Block 0000 [ 26]: 2c0954cbdd78ae1e +Block 0000 [ 27]: a484f003d25c1e2c +Block 0000 [ 28]: e433f058fdc53484 +Block 0000 [ 29]: 32db9ec16228254d +Block 0000 [ 30]: 8606a609508964c6 +Block 0000 [ 31]: 028fa140a907996a +Block 0000 [ 32]: 3afe54aee0ac53f9 +Block 0000 [ 33]: cc841e8ea9256952 +Block 0000 [ 34]: b27a9e52e5a82a90 +Block 0000 [ 35]: c6952624f6604e7e +Block 0000 [ 36]: 3e5e9a30a46765d1 +Block 0000 [ 37]: cc9f0a8b549ed406 +Block 0000 [ 38]: bfc31a98356d4436 +Block 0000 [ 39]: 89dea935c35aa6fd +Block 0000 [ 40]: 4ad0cb25dcc550db +Block 0000 [ 41]: 90a65cd8468abe7a +Block 0000 [ 42]: e4a2d75fbd35f1f4 +Block 0000 [ 43]: 03dcdcc9f0c3237f +Block 0000 [ 44]: 0e994242e9a98267 +Block 0000 [ 45]: f99ef10d64526f28 +Block 0000 [ 46]: 5fa42b5b906d097b +Block 0000 [ 47]: 3e57b6d1537dea15 +Block 0000 [ 48]: 175fdc8efe4590af +Block 0000 [ 49]: 809ab15fc4a2f68f +Block 0000 [ 50]: a9d11f6794e8d56d +Block 0000 [ 51]: ed6917141657969c +Block 0000 [ 52]: ea1a177cd47cd946 +Block 0000 [ 53]: cd289f074b35107c +Block 0000 [ 54]: 6359c0b519a8c31a +Block 0000 [ 55]: e081ba4316625dbb +Block 0000 [ 56]: de621edd1c166bb0 +Block 0000 [ 57]: 119aae89e2d7ae00 +Block 0000 [ 58]: 9c582b7525e90087 +Block 0000 [ 59]: e8c5df0b317630e5 +Block 0000 [ 60]: 17cb00fd02299703 +Block 0000 [ 61]: e69d92c5b0f3f45f +Block 0000 [ 62]: da58b8821a7dad01 +Block 0000 [ 63]: 596b3101643a1c77 +Block 0000 [ 64]: ee313aa55337b4bb +Block 0000 [ 65]: 06c72d8e8f38ea5d +Block 0000 [ 66]: 750ff687051a770f +Block 0000 [ 67]: 5d62741e42692ce5 +Block 0000 [ 68]: 9aa7b38ac07ff7a9 +Block 0000 [ 69]: df6175baf2fbc7b9 +Block 0000 [ 70]: cb00ce655414438f +Block 0000 [ 71]: af8716443e612d6a +Block 0000 [ 72]: 035b48984d145bc8 +Block 0000 [ 73]: c027c987a5064e5e +Block 0000 [ 74]: 66fb69540d4cca95 +Block 0000 [ 75]: be24d4bbbf3b02d6 +Block 0000 [ 76]: 0d3c404e0eeb547e +Block 0000 [ 77]: 08d96b387dd93a3f +Block 0000 [ 78]: 7d4209513e3c6dcf +Block 0000 [ 79]: 5894561b00c0b399 +Block 0000 [ 80]: f43326c64db2884e +Block 0000 [ 81]: 824e4ce31d9017db +Block 0000 [ 82]: a1d77f6e1368af6b +Block 0000 [ 83]: f733fa8b41d42e35 +Block 0000 [ 84]: 97c1608fcc7fa98d +Block 0000 [ 85]: db39d6b9297fe0ec +Block 0000 [ 86]: 8612f6beecb98441 +Block 0000 [ 87]: e82c1a9b4e205b3b +Block 0000 [ 88]: f91dcdb7188cfee6 +Block 0000 [ 89]: 57c8499d166215d4 +Block 0000 [ 90]: d774d1f7501185a8 +Block 0000 [ 91]: 08c158f7c95c4270 +Block 0000 [ 92]: 14b2df73ec7323c5 +Block 0000 [ 93]: 4e51fe5e5cc36675 +Block 0000 [ 94]: 5246234dc2a65747 +Block 0000 [ 95]: e88225ff9aafe09a +Block 0000 [ 96]: e1bda4b1a686a873 +Block 0000 [ 97]: eceb71893e27e7df +Block 0000 [ 98]: bca712ae5301ab4f +Block 0000 [ 99]: 6db640a15fe58ea4 +Block 0000 [100]: ba8e3fd75b1ae8b5 +Block 0000 [101]: 97ead52de3d8e35a +Block 0000 [102]: 3d4cf8cfc6dcd3c4 +Block 0000 [103]: 365d4258a2a2327e +Block 0000 [104]: 8bf174175fba6d54 +Block 0000 [105]: 3ce2d97f02a42d99 +Block 0000 [106]: 4df564c159e3b688 +Block 0000 [107]: 969691276b698548 +Block 0000 [108]: 2555c88e11430978 +Block 0000 [109]: e8c762e576a1f13c +Block 0000 [110]: 3b73325fdf4dba52 +Block 0000 [111]: 4e14995f0006aa8a +Block 0000 [112]: 822837767bd6da76 +Block 0000 [113]: f3f9d0ae4419aa57 +Block 0000 [114]: 23b9d2a26182eb2c +Block 0000 [115]: accb780b765bb407 +Block 0000 [116]: cca383fad32fafe3 +Block 0000 [117]: 47a02bbaee291a3c +Block 0000 [118]: 7085e3ac8acc427a +Block 0000 [119]: fed8144177ccaa27 +Block 0000 [120]: caa9bbfd51958faa +Block 0000 [121]: 8cb014215f290920 +Block 0000 [122]: 09b9ef1b731adc3d +Block 0000 [123]: d2a34f72092af56a +Block 0000 [124]: 249e39d444310e4b +Block 0000 [125]: 073fd444412cba9d +Block 0000 [126]: 7ca3c58f2c75d8a3 +Block 0000 [127]: 26dbe92fb3f5f00d +Block 0001 [ 0]: 4f728b69452fae31 +Block 0001 [ 1]: 654a59d030defa14 +Block 0001 [ 2]: 5f458f10c59f812a +Block 0001 [ 3]: 2a62954ed18bb93b +Block 0001 [ 4]: 26684fc624027a00 +Block 0001 [ 5]: 0ea0d3102c0485dd +Block 0001 [ 6]: 7ae1bdad4f312a66 +Block 0001 [ 7]: 8fea98a8c478b87e +Block 0001 [ 8]: 6f692ec7e9c54bbb +Block 0001 [ 9]: da9ca98424721bed +Block 0001 [ 10]: 900cbd5ce6fbe7bb +Block 0001 [ 11]: 85dbd49905599fc7 +Block 0001 [ 12]: 92f4addaefd9925b +Block 0001 [ 13]: 09608538561f2ca8 +Block 0001 [ 14]: ed7e94fd75bdd70a +Block 0001 [ 15]: 6d3ae3542fc34e01 +Block 0001 [ 16]: 7e7320c7088bb0e4 +Block 0001 [ 17]: e84d71c8ffbb2e67 +Block 0001 [ 18]: b7186919d8398b85 +Block 0001 [ 19]: e01b6bbe4055a48a +Block 0001 [ 20]: 3fd1d5fef68647d3 +Block 0001 [ 21]: 6300d72e1ffdf28b +Block 0001 [ 22]: b60996e804f36f8a +Block 0001 [ 23]: 2e93284225f6fc7c +Block 0001 [ 24]: a81d205f94650509 +Block 0001 [ 25]: 71f606dd8bebd0be +Block 0001 [ 26]: ee5d60be569efca5 +Block 0001 [ 27]: 4fc7328a0df5fcf4 +Block 0001 [ 28]: 2d961d7cfd357bd2 +Block 0001 [ 29]: 218726fbb9aeefc5 +Block 0001 [ 30]: 63f6f9cba09bb92d +Block 0001 [ 31]: 23973798dd642b97 +Block 0001 [ 32]: 68fe2ef53a26e4d0 +Block 0001 [ 33]: 9c3b84e088170e25 +Block 0001 [ 34]: c45fd09ea0d35688 +Block 0001 [ 35]: f2223ca8a907b99c +Block 0001 [ 36]: 4d85ca6a4e238eb0 +Block 0001 [ 37]: 9887644e7a74709d +Block 0001 [ 38]: 61c05b5b39af1c81 +Block 0001 [ 39]: 168218475794699a +Block 0001 [ 40]: 94fe356de27a61b8 +Block 0001 [ 41]: 08f98c2a5d687d4b +Block 0001 [ 42]: cdd9c1173a7cba9e +Block 0001 [ 43]: 4cbcf597f3cc3741 +Block 0001 [ 44]: e25bbedf15ccd7af +Block 0001 [ 45]: 8edc82479e1021c5 +Block 0001 [ 46]: d6ac7072e5cb40bc +Block 0001 [ 47]: e3dd6a54105d8932 +Block 0001 [ 48]: 581127fb5cb723a1 +Block 0001 [ 49]: 7050d0b24075dd5d +Block 0001 [ 50]: d5d2db339110fecf +Block 0001 [ 51]: ca62dccb416e4ac0 +Block 0001 [ 52]: 0293fe19b2c7a989 +Block 0001 [ 53]: 003ffccf01821aef +Block 0001 [ 54]: a3862c4116af5880 +Block 0001 [ 55]: b32910abbd694633 +Block 0001 [ 56]: 3f1176ab6a7f813f +Block 0001 [ 57]: 2025169a421a1771 +Block 0001 [ 58]: 935e5cc76adda9cb +Block 0001 [ 59]: 7335434849a26c6b +Block 0001 [ 60]: fa8ac0211e6b711a +Block 0001 [ 61]: 67145dbd1fb8001f +Block 0001 [ 62]: 4028012eeb9526ba +Block 0001 [ 63]: 385e0230fdf4f479 +Block 0001 [ 64]: 5a08384e562ccbe4 +Block 0001 [ 65]: 8fb1278b85d0d468 +Block 0001 [ 66]: 510c114748e9813f +Block 0001 [ 67]: d97ae3c8d92fb2d8 +Block 0001 [ 68]: dba513dc70d1bcca +Block 0001 [ 69]: 76df969ae1aa86e7 +Block 0001 [ 70]: 0a8bae02bae5800a +Block 0001 [ 71]: bb2078b61251d404 +Block 0001 [ 72]: b6db3e229806b315 +Block 0001 [ 73]: e60dee1006818f8a +Block 0001 [ 74]: a8e840613f64bf94 +Block 0001 [ 75]: e3d557347e2c6765 +Block 0001 [ 76]: 3cfd647de70de6ca +Block 0001 [ 77]: 2727cb94eacf75c8 +Block 0001 [ 78]: 782e0fd561e7fc1c +Block 0001 [ 79]: aaf6005b1175d39d +Block 0001 [ 80]: 1e38a51a498783fe +Block 0001 [ 81]: 8118e9ad026edfd1 +Block 0001 [ 82]: da1b462bb6ada0d5 +Block 0001 [ 83]: 0e07fd989e0740ec +Block 0001 [ 84]: 167027d0dfe260c4 +Block 0001 [ 85]: 3831c5065879f87a +Block 0001 [ 86]: 9969d6538518bbf0 +Block 0001 [ 87]: f729432491dde5bc +Block 0001 [ 88]: e488ad11f9e8a09b +Block 0001 [ 89]: b0b6bb576e656477 +Block 0001 [ 90]: d107bb0a7281ba2d +Block 0001 [ 91]: 5f83375bb027d15e +Block 0001 [ 92]: f4d94c88a0509f9f +Block 0001 [ 93]: 0d52e6500b11f46d +Block 0001 [ 94]: ff310a86b946253b +Block 0001 [ 95]: f8a4490cf057837e +Block 0001 [ 96]: c3569d9e20c30dde +Block 0001 [ 97]: 63772178aef6a3c2 +Block 0001 [ 98]: 0cd5abad15d3526a +Block 0001 [ 99]: 929f1688256337ec +Block 0001 [100]: fe99116df0ed24f7 +Block 0001 [101]: 6ebd12248fdeed7b +Block 0001 [102]: 724ce2c56c917514 +Block 0001 [103]: 60e91f3260a33db6 +Block 0001 [104]: 2300595ae52bde6b +Block 0001 [105]: 9ed3942bec949ecc +Block 0001 [106]: 35ab67790672ce89 +Block 0001 [107]: bcd97ac09925600f +Block 0001 [108]: 53bd812c1d5b983b +Block 0001 [109]: 9ee217e78798db42 +Block 0001 [110]: 024621d6eaa9dfa6 +Block 0001 [111]: 091d7bbc00b74cac +Block 0001 [112]: 51a3e878a7ec9637 +Block 0001 [113]: 8f1c496da75b71d4 +Block 0001 [114]: c3213542557c95e4 +Block 0001 [115]: 3259db47b00f135d +Block 0001 [116]: 77f0b3f24f6f2748 +Block 0001 [117]: 0a56aaa8a68eecb0 +Block 0001 [118]: 604cd1106c8bd53b +Block 0001 [119]: b17b9ba59c48e0e3 +Block 0001 [120]: 29a79c9ad70ac72f +Block 0001 [121]: efc613d0bde417ce +Block 0001 [122]: 975b3264affc0594 +Block 0001 [123]: 1bddc4bcc71f4ff6 +Block 0001 [124]: 8338248ef8fcfd02 +Block 0001 [125]: 2d566298f391fcc9 +Block 0001 [126]: 83db40ba1ec6e825 +Block 0001 [127]: 9376c28a2100e36a +Block 0002 [ 0]: 6f0aa682ddaa6126 +Block 0002 [ 1]: dab7227193219bb7 +Block 0002 [ 2]: 4de277e66c81dbba +Block 0002 [ 3]: d7721b4e73c47130 +Block 0002 [ 4]: 95b731717c175846 +Block 0002 [ 5]: 65d958e75791c1b8 +Block 0002 [ 6]: 0a49f6ecc98de387 +Block 0002 [ 7]: 72b02922d766a72a +Block 0002 [ 8]: fad2410fe9e386e9 +Block 0002 [ 9]: 9ff80811205f8e40 +Block 0002 [ 10]: bfd83bf7915bd06d +Block 0002 [ 11]: f2241c6bb086373c +Block 0002 [ 12]: f529fec9d07fc5c7 +Block 0002 [ 13]: 45ddf09931b44152 +Block 0002 [ 14]: 216aa6af5774af56 +Block 0002 [ 15]: 1babf510968c3bd0 +Block 0002 [ 16]: 6b3cc25f82bc7bab +Block 0002 [ 17]: a51883837931ec24 +Block 0002 [ 18]: 15d314e761f4f79f +Block 0002 [ 19]: 907ad9d3e6003728 +Block 0002 [ 20]: 8345e83982730ced +Block 0002 [ 21]: a98973f2f323f2fd +Block 0002 [ 22]: 34ceac857bc82192 +Block 0002 [ 23]: 3aff5a16248d61d0 +Block 0002 [ 24]: bf585e02a4ee76b3 +Block 0002 [ 25]: f102da35c3a1d22f +Block 0002 [ 26]: b8e0c5c6dffa8035 +Block 0002 [ 27]: b69a0ff4b7dc4be3 +Block 0002 [ 28]: 58f6befa5b4be20f +Block 0002 [ 29]: 53e17992af4bf567 +Block 0002 [ 30]: 97b6bbbe40e15da8 +Block 0002 [ 31]: b456092c3bbdee3d +Block 0002 [ 32]: 0fe760445435a994 +Block 0002 [ 33]: 8f00ec3d6cd764cf +Block 0002 [ 34]: 27f17691f81dba17 +Block 0002 [ 35]: 3eb25337717caf80 +Block 0002 [ 36]: 1a08dd7b4b987929 +Block 0002 [ 37]: ece8357a308528ea +Block 0002 [ 38]: e53ab5938ff9847d +Block 0002 [ 39]: cac2d4e6c427a151 +Block 0002 [ 40]: c1d3de78f8bcfc97 +Block 0002 [ 41]: 89026bd7fd300175 +Block 0002 [ 42]: c837079cf4b8e7a0 +Block 0002 [ 43]: cc4f01269d869716 +Block 0002 [ 44]: 1ced768b8adf0ca8 +Block 0002 [ 45]: 752ee66cb91592fd +Block 0002 [ 46]: 8d529b4831c2501b +Block 0002 [ 47]: 6898a8031165c701 +Block 0002 [ 48]: ba973e3b66aeab6d +Block 0002 [ 49]: b38b035f75e1f8ae +Block 0002 [ 50]: 8cea05b80f49929b +Block 0002 [ 51]: e0c6eaef11df5798 +Block 0002 [ 52]: edcb7cbb7a6a2838 +Block 0002 [ 53]: bd0954b83250312c +Block 0002 [ 54]: 030d8c4d29a827ab +Block 0002 [ 55]: defeea24becf9c47 +Block 0002 [ 56]: 4f1bd3d64032f88b +Block 0002 [ 57]: 5d559121df3fcf38 +Block 0002 [ 58]: d40333183106d935 +Block 0002 [ 59]: 9a68b1362e4ecdf3 +Block 0002 [ 60]: 8d094f6fe202c2a0 +Block 0002 [ 61]: cf51c0ec8d9a7bd0 +Block 0002 [ 62]: 6fc5ce646d5459b0 +Block 0002 [ 63]: 1355d7414fb8222d +Block 0002 [ 64]: 1d79f24f45055747 +Block 0002 [ 65]: b048cc45283b5ba4 +Block 0002 [ 66]: 9f599fc0d1a9b797 +Block 0002 [ 67]: 837d7802a73fec8c +Block 0002 [ 68]: ee0cac044c356913 +Block 0002 [ 69]: bd01139dc4a0a74d +Block 0002 [ 70]: 9687ac9b90372c6c +Block 0002 [ 71]: 7ad65839bced3728 +Block 0002 [ 72]: 3dc5cbf1b894db1e +Block 0002 [ 73]: 07359d7c76e52a41 +Block 0002 [ 74]: 9821998dcd6f2e0b +Block 0002 [ 75]: 55e08a3a8bf3f31a +Block 0002 [ 76]: 028648d336310757 +Block 0002 [ 77]: 505c49b8e78c72a5 +Block 0002 [ 78]: 847d4ad5e67effa6 +Block 0002 [ 79]: debe088acd5e0c67 +Block 0002 [ 80]: 09baf2a793f6e85a +Block 0002 [ 81]: 74c53ac1c44923c3 +Block 0002 [ 82]: 2d8e2f704dae8e0d +Block 0002 [ 83]: c11096107ecd9a1a +Block 0002 [ 84]: 6e92f0b937267ca4 +Block 0002 [ 85]: eb91961b00b8494a +Block 0002 [ 86]: e445eff84a307891 +Block 0002 [ 87]: 167008ffb848e317 +Block 0002 [ 88]: ffcd081be48824e8 +Block 0002 [ 89]: ae1188ab3620d030 +Block 0002 [ 90]: 7b5154bb3ae4beeb +Block 0002 [ 91]: 66a8189a6e829b4c +Block 0002 [ 92]: 1045478edacef269 +Block 0002 [ 93]: 4214f2b32e58abf7 +Block 0002 [ 94]: 8a0632f79e9a47d2 +Block 0002 [ 95]: 125f2e34aa373f69 +Block 0002 [ 96]: 4bdaf3650b12ff30 +Block 0002 [ 97]: 09a67d21f7c9a4b7 +Block 0002 [ 98]: da257867835c6ad0 +Block 0002 [ 99]: b09a503a1e027c3a +Block 0002 [100]: d82eab74b27e8c9e +Block 0002 [101]: b8ca0c4c1f8a66bb +Block 0002 [102]: 3295141fafa54773 +Block 0002 [103]: a711da3266cda357 +Block 0002 [104]: 8c491f18c12bef34 +Block 0002 [105]: fb3856d95887799b +Block 0002 [106]: 882efa262eba85c7 +Block 0002 [107]: e70e3ed6325ddce9 +Block 0002 [108]: 6cd188d08d8faaab +Block 0002 [109]: 3d8e89890fa8069e +Block 0002 [110]: 1740ded2e9212552 +Block 0002 [111]: 97dbb638e111dbaa +Block 0002 [112]: 591b3ef515441981 +Block 0002 [113]: 47924a68e2f2d931 +Block 0002 [114]: 56f6c3046c63e935 +Block 0002 [115]: 5d9b054b25c3cac7 +Block 0002 [116]: 730e460a6b42888e +Block 0002 [117]: 2a89748c965add5d +Block 0002 [118]: 2e21eda0da280986 +Block 0002 [119]: 8310061edc77f4ab +Block 0002 [120]: 663eccfd5e98f3da +Block 0002 [121]: ef140e3bb971144b +Block 0002 [122]: def56d52b3a2306e +Block 0002 [123]: c4d693020bec1987 +Block 0002 [124]: a3f956918de780b2 +Block 0002 [125]: f7a6e5c929d6a71a +Block 0002 [126]: 657926002bd1b059 +Block 0002 [127]: d87898adc25622e7 +Block 0003 [ 0]: a5098825713de56b +Block 0003 [ 1]: 5abdb2c9a238997c +Block 0003 [ 2]: 0df17021d43634ae +Block 0003 [ 3]: ec32a902ab58e758 +Block 0003 [ 4]: 4c31bf2c0f5a3e20 +Block 0003 [ 5]: 76b348a560871883 +Block 0003 [ 6]: 6b742fcacab4cd9d +Block 0003 [ 7]: 4d7181fe894748dd +Block 0003 [ 8]: a0f9122c42cfa0fa +Block 0003 [ 9]: b77b3a2b3a94836d +Block 0003 [ 10]: b2ec7046aa8e8c6e +Block 0003 [ 11]: f172c7888965cdf6 +Block 0003 [ 12]: d6c24405293e85f2 +Block 0003 [ 13]: 69ca9337912f8f1d +Block 0003 [ 14]: d11fd34b79f60203 +Block 0003 [ 15]: 7a7368c3416d7757 +Block 0003 [ 16]: 8a60c9c442d9a50b +Block 0003 [ 17]: e5003305596ff3f5 +Block 0003 [ 18]: 1f5a977083174168 +Block 0003 [ 19]: 3d2084004885c012 +Block 0003 [ 20]: 0dfcdb66c89fe7f8 +Block 0003 [ 21]: 7a542bc74aa62c61 +Block 0003 [ 22]: bbae5509f2bafa64 +Block 0003 [ 23]: 9c2fbdddab52a811 +Block 0003 [ 24]: 4eb45004f32e646c +Block 0003 [ 25]: 83575377e39c935c +Block 0003 [ 26]: 32c30d2dc888c05d +Block 0003 [ 27]: cf6c2f4e2e886954 +Block 0003 [ 28]: d763036a6ba7467e +Block 0003 [ 29]: 2949a553cb7bfb44 +Block 0003 [ 30]: 39e9a683d74a4a47 +Block 0003 [ 31]: 510b42f86fb01c3c +Block 0003 [ 32]: 1db70a935a24a08a +Block 0003 [ 33]: 37a4c61b5b50f6ce +Block 0003 [ 34]: 2ff60aebaff4c12c +Block 0003 [ 35]: cc43a35d3f92cb2b +Block 0003 [ 36]: e47a246363c0cf53 +Block 0003 [ 37]: 20c725e9838000f0 +Block 0003 [ 38]: 4e9e4630b154de4e +Block 0003 [ 39]: 9d91f5cab8ef6ca3 +Block 0003 [ 40]: c09cd72657c2b2e3 +Block 0003 [ 41]: 00c941ef8d77923a +Block 0003 [ 42]: c4a86260ceaa44c5 +Block 0003 [ 43]: b23cfde52879f0bb +Block 0003 [ 44]: 055a459516341951 +Block 0003 [ 45]: 15b38a4de76a86e3 +Block 0003 [ 46]: 500162d1d85b0734 +Block 0003 [ 47]: e4c121a06eeb8d00 +Block 0003 [ 48]: 59d00180f6bf9cab +Block 0003 [ 49]: 520a19a8621155f7 +Block 0003 [ 50]: b7ac913b05b0cdd7 +Block 0003 [ 51]: 2498e9f4684d695e +Block 0003 [ 52]: 9ff6533b36a439bd +Block 0003 [ 53]: b7e710b1b252173e +Block 0003 [ 54]: cddcdfc9bd2c30cc +Block 0003 [ 55]: 85d624f3b2903c78 +Block 0003 [ 56]: 1e0aebc7e45117e9 +Block 0003 [ 57]: a776b6281cd6b1f9 +Block 0003 [ 58]: 8a06bb51088eb00b +Block 0003 [ 59]: b59c40e38ff6ea03 +Block 0003 [ 60]: afc0cc4b3623e16d +Block 0003 [ 61]: 782c4c3d0474a5cf +Block 0003 [ 62]: 56ce8d13748c3e5b +Block 0003 [ 63]: c977975a1ff7a1f9 +Block 0003 [ 64]: 21546cc77fa04c11 +Block 0003 [ 65]: 23445ab1a31c4fcd +Block 0003 [ 66]: 329b27a58fa9ec0c +Block 0003 [ 67]: 1dd2c06440b93077 +Block 0003 [ 68]: b3be12b007cd0186 +Block 0003 [ 69]: 4a03029fa6a0b54b +Block 0003 [ 70]: a3cc4fdae3a06c28 +Block 0003 [ 71]: ea9497ff15ab73ee +Block 0003 [ 72]: e06aa57b0d93e9e6 +Block 0003 [ 73]: b8f1138ed2b5c2e4 +Block 0003 [ 74]: ca65309d17c912be +Block 0003 [ 75]: a79480072494d1df +Block 0003 [ 76]: a2cc762dc3085ebf +Block 0003 [ 77]: 4d8804b94f150480 +Block 0003 [ 78]: 010bc1d1d2d5e6a9 +Block 0003 [ 79]: 618deb456508ef66 +Block 0003 [ 80]: f4660b0c8ab78a72 +Block 0003 [ 81]: b8cafe97718c4b0c +Block 0003 [ 82]: 9e393ddbe4897c96 +Block 0003 [ 83]: 1941204736b1e333 +Block 0003 [ 84]: 819495456568a0e5 +Block 0003 [ 85]: 069191b00125985b +Block 0003 [ 86]: 8df6f2bc73a8f609 +Block 0003 [ 87]: d02410b0b3af460f +Block 0003 [ 88]: 5ad235682f1a4e6e +Block 0003 [ 89]: 31cc343b49bb3c5c +Block 0003 [ 90]: 1c5f33a9a895121f +Block 0003 [ 91]: dcfadc3f76c2a0db +Block 0003 [ 92]: cb87e12e0347cca2 +Block 0003 [ 93]: c3dadf345a0bf265 +Block 0003 [ 94]: 84c3d44034671090 +Block 0003 [ 95]: e0e9f65f68c7cc0f +Block 0003 [ 96]: 882d861688f924bc +Block 0003 [ 97]: 9cfc66984007086d +Block 0003 [ 98]: 91dc692e2ce706b9 +Block 0003 [ 99]: 86d088cd01e55500 +Block 0003 [100]: aafd183298ff1003 +Block 0003 [101]: aa4d5020b5ebfb5f +Block 0003 [102]: 98a71f8dbbdbf24c +Block 0003 [103]: 640f07762fee838b +Block 0003 [104]: 9bbfdd5f9f23460a +Block 0003 [105]: c1e3157b2e7cea32 +Block 0003 [106]: 205acdbfea7304f5 +Block 0003 [107]: d3903de60ff877fb +Block 0003 [108]: 2ffff2f401c666c2 +Block 0003 [109]: 71d728360ff4d066 +Block 0003 [110]: 1fa9cd9997943d58 +Block 0003 [111]: 37cd8137f9ed1517 +Block 0003 [112]: 4138ff82ec94ce81 +Block 0003 [113]: c5bdc5c497fb5efc +Block 0003 [114]: 765279b71bb1a03d +Block 0003 [115]: d41d5e2e112f0fa8 +Block 0003 [116]: 357a184df3d5a794 +Block 0003 [117]: e81a33a463f91f12 +Block 0003 [118]: 1b5e5040169f5195 +Block 0003 [119]: 65a6ceba06b05e8d +Block 0003 [120]: 238160bc1d2bf802 +Block 0003 [121]: 003f752624f1a8b8 +Block 0003 [122]: 89ee084762af8511 +Block 0003 [123]: 543d6f278a505ed6 +Block 0003 [124]: 14bf434e3d68965e +Block 0003 [125]: 3a8ff0179c0b0acc +Block 0003 [126]: ded1168930b9ebb6 +Block 0003 [127]: 50caf52f839d5504 +Block 0004 [ 0]: af9eced90a3d60a2 +Block 0004 [ 1]: 3458bd6dccdc5a86 +Block 0004 [ 2]: 05f6a062431d2afa +Block 0004 [ 3]: 40e258d40e9c80b6 +Block 0004 [ 4]: 1c6db8b3fd4c0899 +Block 0004 [ 5]: d5216db6d8913af1 +Block 0004 [ 6]: 80778a715660665f +Block 0004 [ 7]: 82db35653611f89f +Block 0004 [ 8]: 5d4bd06fff5fdcdf +Block 0004 [ 9]: 50059e85fca48e27 +Block 0004 [ 10]: a9568cb5426a5236 +Block 0004 [ 11]: 4ff2f5eaab600283 +Block 0004 [ 12]: 4577b19f9ff16d6b +Block 0004 [ 13]: 34d6b1d3fc137020 +Block 0004 [ 14]: a13ba3cc8c9b1783 +Block 0004 [ 15]: 48d97e808f8af599 +Block 0004 [ 16]: 718a8c5091f5c05a +Block 0004 [ 17]: d767e72321690b90 +Block 0004 [ 18]: 10ed05706530391d +Block 0004 [ 19]: a3da1bebae712116 +Block 0004 [ 20]: 3010dad96d0aa1cd +Block 0004 [ 21]: 078eecb48d148ae0 +Block 0004 [ 22]: 74672b83af77f91a +Block 0004 [ 23]: 3fa4fdfb8a92c047 +Block 0004 [ 24]: 96178f425ec4a875 +Block 0004 [ 25]: dd3fd3cce9ceac5e +Block 0004 [ 26]: 049865736c634c55 +Block 0004 [ 27]: bb322ce0a56bac6e +Block 0004 [ 28]: ca961724d6ea8c2d +Block 0004 [ 29]: af33db626bcba7d7 +Block 0004 [ 30]: 539c29974e7730fb +Block 0004 [ 31]: c267909579ef4313 +Block 0004 [ 32]: b9c8059b629272a0 +Block 0004 [ 33]: 3a18f4a5bc8e46e5 +Block 0004 [ 34]: 1888a2e964943b59 +Block 0004 [ 35]: 2380a9dd92f2ec21 +Block 0004 [ 36]: 9fc8021fe3043d67 +Block 0004 [ 37]: 107833c67f457b34 +Block 0004 [ 38]: 3e2ce4a56a45bb77 +Block 0004 [ 39]: 084a7ad0d3ef4922 +Block 0004 [ 40]: 8175a1738e9ce296 +Block 0004 [ 41]: c686afc17b2812e6 +Block 0004 [ 42]: c8e7b3598949ae60 +Block 0004 [ 43]: 667e47836b39bd99 +Block 0004 [ 44]: 3604e1597cc944ad +Block 0004 [ 45]: 7ab71831df29df52 +Block 0004 [ 46]: e889cfc1441d8415 +Block 0004 [ 47]: 762430a2d72ccf81 +Block 0004 [ 48]: 2f9a51b2e3112715 +Block 0004 [ 49]: 20099292f390a970 +Block 0004 [ 50]: 0b6c4d04e9754c82 +Block 0004 [ 51]: 3adc49b980633db3 +Block 0004 [ 52]: 8368e8fa2086f14e +Block 0004 [ 53]: e5369eeda68501e6 +Block 0004 [ 54]: 6fa74ecd57fa72f8 +Block 0004 [ 55]: d71a9415ba8dc920 +Block 0004 [ 56]: eb858d1ca26f6a40 +Block 0004 [ 57]: 28f7cc213b047e4a +Block 0004 [ 58]: c5042731bbd2b6ad +Block 0004 [ 59]: 5e2a0c937bb6adce +Block 0004 [ 60]: 2c1546f5dcd5ea09 +Block 0004 [ 61]: 0a55f02c93bef2f5 +Block 0004 [ 62]: 36439d472e564d9d +Block 0004 [ 63]: 3cf3e188d8724a5c +Block 0004 [ 64]: d20dcc19dfe8ee10 +Block 0004 [ 65]: 1e8ea45c14e22f6e +Block 0004 [ 66]: d9e188a0c2cd7de8 +Block 0004 [ 67]: 69878ffd2d67e813 +Block 0004 [ 68]: ca30fe88eb4a8303 +Block 0004 [ 69]: 3510ecb290818e10 +Block 0004 [ 70]: 577d78d8b0b762d0 +Block 0004 [ 71]: 7a3f510e17a35949 +Block 0004 [ 72]: bc5d883c6e8b23f7 +Block 0004 [ 73]: 1737df43b6c0f384 +Block 0004 [ 74]: a59f90005d06889b +Block 0004 [ 75]: c4f11cb4bece144b +Block 0004 [ 76]: 82b11dd2bd8e1499 +Block 0004 [ 77]: 242adaad084c4281 +Block 0004 [ 78]: ffa6ca17c08e29e7 +Block 0004 [ 79]: 37584bc6cf8344ad +Block 0004 [ 80]: 4062901ff4a9f07d +Block 0004 [ 81]: 20653350117ec63a +Block 0004 [ 82]: 45e642098a74abda +Block 0004 [ 83]: 89bed5a24c62d08d +Block 0004 [ 84]: 6e990f7008adee71 +Block 0004 [ 85]: 3c9126660bd152a9 +Block 0004 [ 86]: ef46fbf3e4fc19d4 +Block 0004 [ 87]: 4a711294a574aadc +Block 0004 [ 88]: d0efcf189dc02bcf +Block 0004 [ 89]: 0b9a48427ec38900 +Block 0004 [ 90]: 98e275b7e095d3f5 +Block 0004 [ 91]: 0353d666b93fb663 +Block 0004 [ 92]: a4646c2d8bfa4d1a +Block 0004 [ 93]: 52d08735a0ea0d9e +Block 0004 [ 94]: e55f869281c22581 +Block 0004 [ 95]: 46e82d4f204f0bad +Block 0004 [ 96]: fd26877918e173a5 +Block 0004 [ 97]: 6fdf6ec2bfa7b0f9 +Block 0004 [ 98]: ea146432e63186c4 +Block 0004 [ 99]: cd50784b0958662c +Block 0004 [100]: c25aff66357e24d1 +Block 0004 [101]: 99d34900b33f60d5 +Block 0004 [102]: 98a063f95e4bb934 +Block 0004 [103]: 4506dedfb4e77e5a +Block 0004 [104]: ad87e672cc7a4644 +Block 0004 [105]: e2965d2b0ae768ca +Block 0004 [106]: 52740c3dd4b833cd +Block 0004 [107]: 86a1f3edefdb6d8b +Block 0004 [108]: c5b1d035b9837203 +Block 0004 [109]: 694652d2340b99d6 +Block 0004 [110]: 2bf6e2963182a8d9 +Block 0004 [111]: 250d6c5d00fc762c +Block 0004 [112]: d2a822c642cbebce +Block 0004 [113]: 1a222412dcde3705 +Block 0004 [114]: f233dad5cdde3b9d +Block 0004 [115]: 7d72f0fac57caf91 +Block 0004 [116]: c2c83c5e69eca9d0 +Block 0004 [117]: 4b6f24ea92332019 +Block 0004 [118]: 80ac4c2f9eb482d6 +Block 0004 [119]: e52624e96ab034f2 +Block 0004 [120]: 273f6f30b19e5149 +Block 0004 [121]: d0a2128e22bb5ab7 +Block 0004 [122]: c6254c37b7c08c52 +Block 0004 [123]: a4e9aef8ecce1b94 +Block 0004 [124]: 333e39a2d3e1ce42 +Block 0004 [125]: c7ece998f84c8a3c +Block 0004 [126]: 702c957ff3364c06 +Block 0004 [127]: 06c2f7892027c350 +Block 0005 [ 0]: 37fb883b3937ac93 +Block 0005 [ 1]: 6acec54a53ba1331 +Block 0005 [ 2]: 4c4d2fd0e811a0b2 +Block 0005 [ 3]: f86ce63134bf480d +Block 0005 [ 4]: 04b31b850ceeff33 +Block 0005 [ 5]: ec4f3972779a5807 +Block 0005 [ 6]: 4a38a3f44fa47814 +Block 0005 [ 7]: bcb1991407ad6c02 +Block 0005 [ 8]: 0f82b1e0ba066aaa +Block 0005 [ 9]: f54bed9000ac6d55 +Block 0005 [ 10]: 481fa35fb39a97ec +Block 0005 [ 11]: 643ae4be056c1fc5 +Block 0005 [ 12]: 8d46d87b02bf389b +Block 0005 [ 13]: 5a7fdc9e765c2590 +Block 0005 [ 14]: a987d4731ceae07f +Block 0005 [ 15]: 83c199f1d90e4967 +Block 0005 [ 16]: 2563b5d5ef1bdddb +Block 0005 [ 17]: cc4a90082adb5576 +Block 0005 [ 18]: ccfbb01c7bdb2a09 +Block 0005 [ 19]: d78e46de3d4b41d4 +Block 0005 [ 20]: afafa14a5460b979 +Block 0005 [ 21]: 3973fa9623ec6c3e +Block 0005 [ 22]: 5425a2b596353a0d +Block 0005 [ 23]: e39d8e6a2702e7da +Block 0005 [ 24]: 665ff8a5fa7395ed +Block 0005 [ 25]: dc8ac092ad76cc8a +Block 0005 [ 26]: b2bad6d483d0f35b +Block 0005 [ 27]: 702b5502bc4d9f0a +Block 0005 [ 28]: 34b68078c136dbbd +Block 0005 [ 29]: c58b0e7c79d3760c +Block 0005 [ 30]: a26c53403f613aa6 +Block 0005 [ 31]: 6c4593e1dfb652c5 +Block 0005 [ 32]: 747ae28048698d2c +Block 0005 [ 33]: 3c30792dce14a383 +Block 0005 [ 34]: 7d4c52934c3c97ea +Block 0005 [ 35]: be9210487bc27afa +Block 0005 [ 36]: b1b0f786bd2ecd14 +Block 0005 [ 37]: 5e1483d330345f76 +Block 0005 [ 38]: b6bd1d623a641c03 +Block 0005 [ 39]: 9c2eef877e56f795 +Block 0005 [ 40]: e7169c587776a221 +Block 0005 [ 41]: cf5441b20cb71c90 +Block 0005 [ 42]: 69431b3b02dfeee6 +Block 0005 [ 43]: 495249d284250f7e +Block 0005 [ 44]: c69d107cd21df04c +Block 0005 [ 45]: 016b358679f15ece +Block 0005 [ 46]: f6ed30c43580ad07 +Block 0005 [ 47]: c8fa50877f0ad8d5 +Block 0005 [ 48]: d654182b26c4db2f +Block 0005 [ 49]: 28249e944de6e463 +Block 0005 [ 50]: fbf815ebca2f424a +Block 0005 [ 51]: d9c3c5996d1a615c +Block 0005 [ 52]: 1ed370fedf078cf4 +Block 0005 [ 53]: 3e8a6e37b9bedf55 +Block 0005 [ 54]: ef3369be5be150a9 +Block 0005 [ 55]: f4f724a2551fa487 +Block 0005 [ 56]: 088b9b009db5fc68 +Block 0005 [ 57]: 2e450de812063bb3 +Block 0005 [ 58]: fd20078b92ad2212 +Block 0005 [ 59]: ada2ab1a6d276600 +Block 0005 [ 60]: 2353d4e8ed05dcc8 +Block 0005 [ 61]: 48980a983637a4d3 +Block 0005 [ 62]: aefa1109f93347e1 +Block 0005 [ 63]: 0ced5850fbb88b4a +Block 0005 [ 64]: 433f25d571fb15c6 +Block 0005 [ 65]: b372ed489fd0a7f8 +Block 0005 [ 66]: d561dfd10da4202c +Block 0005 [ 67]: 4f5380cf14258bf6 +Block 0005 [ 68]: 9700f377438cc2a5 +Block 0005 [ 69]: a1c45cc8da4e3887 +Block 0005 [ 70]: 08b7d3ac75cea15d +Block 0005 [ 71]: 36e03cf3fbd05396 +Block 0005 [ 72]: c3fb7e03ba6f8fbc +Block 0005 [ 73]: 3f29718b41ff57c1 +Block 0005 [ 74]: d09946ec9b27aa37 +Block 0005 [ 75]: 4a0718a8f5616ac5 +Block 0005 [ 76]: e38cc23047827da9 +Block 0005 [ 77]: 002e16cd25071184 +Block 0005 [ 78]: 869182a986a7b7ee +Block 0005 [ 79]: 174a057e0e3b23a1 +Block 0005 [ 80]: 999aa42055b49c03 +Block 0005 [ 81]: c6d5b5d5120af131 +Block 0005 [ 82]: beb10bc4288cb0b7 +Block 0005 [ 83]: 214163d0c27f32e6 +Block 0005 [ 84]: 251a7d51579283e1 +Block 0005 [ 85]: ac0a7173e7268ccd +Block 0005 [ 86]: efabfb39669a0193 +Block 0005 [ 87]: 026de346a9670d9d +Block 0005 [ 88]: 15c15e1754978b30 +Block 0005 [ 89]: 977ebe9542e66de7 +Block 0005 [ 90]: c8fe60d834be0957 +Block 0005 [ 91]: 7e16de91837068a8 +Block 0005 [ 92]: 27785e000961550b +Block 0005 [ 93]: 9a5a8f77b6cba683 +Block 0005 [ 94]: f90378fa99cfd37b +Block 0005 [ 95]: f8c3ccad6676d6fe +Block 0005 [ 96]: c0b658afd44ad15b +Block 0005 [ 97]: b2580e884ffc329d +Block 0005 [ 98]: f79de1cc43658261 +Block 0005 [ 99]: 4536d5eb3f448ee0 +Block 0005 [100]: a4815de2946fe975 +Block 0005 [101]: 2295138fae33b9aa +Block 0005 [102]: 32947ba2cb293586 +Block 0005 [103]: 2c96c493e71235d9 +Block 0005 [104]: 546b634b59350c17 +Block 0005 [105]: bfd82c1e545abf86 +Block 0005 [106]: ede8399895eafe84 +Block 0005 [107]: 9027ddacc2ae573f +Block 0005 [108]: 7da810b9c7bf4af7 +Block 0005 [109]: 7e7de19cb6f96d91 +Block 0005 [110]: 08b249fed8b5cf45 +Block 0005 [111]: 90aae1f0d65f196d +Block 0005 [112]: 0cb847511541ea6b +Block 0005 [113]: 450c0c049ed61d99 +Block 0005 [114]: 8a095dd9c6d54157 +Block 0005 [115]: 82a4fbf93f735094 +Block 0005 [116]: d55fbc420c629102 +Block 0005 [117]: 25c9bf0fe571f5dd +Block 0005 [118]: 80207b546203df4c +Block 0005 [119]: 1cb70dea46305eef +Block 0005 [120]: 890003e8e39ecf29 +Block 0005 [121]: e558c275564dbf38 +Block 0005 [122]: 1d060fe29707d16b +Block 0005 [123]: 5037a90495063117 +Block 0005 [124]: e0d0226c0fce2c3c +Block 0005 [125]: ac55085dea1eef97 +Block 0005 [126]: d0a0f531e14cb58e +Block 0005 [127]: dda1781abb811d29 +Block 0006 [ 0]: a4000cb5a1cc76dd +Block 0006 [ 1]: 0c6a94a4086be124 +Block 0006 [ 2]: 819335f8932114b9 +Block 0006 [ 3]: d857ab033288c788 +Block 0006 [ 4]: f2e4630dbc30fddb +Block 0006 [ 5]: a1e8320af2866db4 +Block 0006 [ 6]: e225b40713f854ee +Block 0006 [ 7]: 088f90ee8bae291d +Block 0006 [ 8]: a43322a0c40abfbc +Block 0006 [ 9]: 83a4793e21d20b58 +Block 0006 [ 10]: 4d96e775f789cea2 +Block 0006 [ 11]: 30bd3620326a7f96 +Block 0006 [ 12]: d09c9035cd910544 +Block 0006 [ 13]: 81d572ae2eeb8006 +Block 0006 [ 14]: ceaf14127b62344b +Block 0006 [ 15]: 4f433cb45b3d6b0d +Block 0006 [ 16]: 31725df5018af041 +Block 0006 [ 17]: 927a1ed74e91cf76 +Block 0006 [ 18]: 555f5323de185080 +Block 0006 [ 19]: 2e303b4ff3920046 +Block 0006 [ 20]: 723ed0de113fa48b +Block 0006 [ 21]: 1d016713b6fff742 +Block 0006 [ 22]: c50a5aa3a0a0cfdb +Block 0006 [ 23]: a7d2e5db07f1475b +Block 0006 [ 24]: cd8324b0a3c0cad5 +Block 0006 [ 25]: 22da45be8cd1ec58 +Block 0006 [ 26]: 3d4f99a20af4ff73 +Block 0006 [ 27]: 5de2f3351e5fb287 +Block 0006 [ 28]: 3fedb44f445c865f +Block 0006 [ 29]: 2dcc364d689235c1 +Block 0006 [ 30]: 8fd3800f89627a4f +Block 0006 [ 31]: d4fd9bd4cc90b65a +Block 0006 [ 32]: d2453a16c4292b6c +Block 0006 [ 33]: d5c78b9e8066bc63 +Block 0006 [ 34]: 3de47a08c1ca30a4 +Block 0006 [ 35]: d226d79350129999 +Block 0006 [ 36]: 94017a9989f909b7 +Block 0006 [ 37]: 973151520b780bc4 +Block 0006 [ 38]: b852007fba960687 +Block 0006 [ 39]: ab0780741ff20149 +Block 0006 [ 40]: a9324a16f54ed9c4 +Block 0006 [ 41]: 393abfca3807175c +Block 0006 [ 42]: 690a91e3d9751ccb +Block 0006 [ 43]: f63676a1df3693a0 +Block 0006 [ 44]: c947250437a22b2f +Block 0006 [ 45]: 783c5571a97b606f +Block 0006 [ 46]: 6d05d793cd281272 +Block 0006 [ 47]: 60f5c5e244e4c08e +Block 0006 [ 48]: ea2ec7dabb54f430 +Block 0006 [ 49]: c6dce5092746fa3d +Block 0006 [ 50]: 973bc36c87c55018 +Block 0006 [ 51]: 0b564299f84975bb +Block 0006 [ 52]: f3ce81c95f39913d +Block 0006 [ 53]: 81357040f6d08a8a +Block 0006 [ 54]: dc40acbc9c27bcd3 +Block 0006 [ 55]: ae401fdd7ee471e6 +Block 0006 [ 56]: 80740241c5495c34 +Block 0006 [ 57]: cdb0a501fcfe4787 +Block 0006 [ 58]: 9f23f2af6531784a +Block 0006 [ 59]: e1c3475e31535d8f +Block 0006 [ 60]: 726770b5755e3324 +Block 0006 [ 61]: a5d7dfd224b844a3 +Block 0006 [ 62]: c7d7309774a868f9 +Block 0006 [ 63]: fde43b69a05ff27a +Block 0006 [ 64]: 78ba6d2fd465062e +Block 0006 [ 65]: ebc28526805859d7 +Block 0006 [ 66]: fd781d5281e8c097 +Block 0006 [ 67]: abe63b415d6c8429 +Block 0006 [ 68]: 73c804af9ac76b22 +Block 0006 [ 69]: c920fa3ad6d82433 +Block 0006 [ 70]: 15baf3d384adcebe +Block 0006 [ 71]: a83ad88c365bb9cd +Block 0006 [ 72]: a4d5ce841d92a276 +Block 0006 [ 73]: 5462f046b839af67 +Block 0006 [ 74]: 5b2edf414b026135 +Block 0006 [ 75]: ab768f985123b080 +Block 0006 [ 76]: f3e05481874d72b3 +Block 0006 [ 77]: ce73c152e3ff2f96 +Block 0006 [ 78]: 78bdc7edc3985401 +Block 0006 [ 79]: 6e3f52fa030d9227 +Block 0006 [ 80]: 69fc3df28dd982b6 +Block 0006 [ 81]: 87214bb7ffc2dc1d +Block 0006 [ 82]: f45a7ba051ba8110 +Block 0006 [ 83]: 2f9ccac16c85693c +Block 0006 [ 84]: f4447e2b8b6edbe6 +Block 0006 [ 85]: 7cad68391b787930 +Block 0006 [ 86]: 538850758753fc1a +Block 0006 [ 87]: fb8ee00e51149914 +Block 0006 [ 88]: c6936b88c520b802 +Block 0006 [ 89]: dca494f588a65fe3 +Block 0006 [ 90]: 7e261e838c252e46 +Block 0006 [ 91]: 8f4a0b941c47c9b6 +Block 0006 [ 92]: 773509cad95e3333 +Block 0006 [ 93]: 1475ee7d56a9da13 +Block 0006 [ 94]: feafdd14849f4089 +Block 0006 [ 95]: 2a1030fc9cae7e7c +Block 0006 [ 96]: d8fc6122c52cccaa +Block 0006 [ 97]: 02b7b807639b4d85 +Block 0006 [ 98]: 61712d9de40c2e87 +Block 0006 [ 99]: 345ace9a8469b06d +Block 0006 [100]: 9dcaa04d2aaa46a4 +Block 0006 [101]: 5c7f906c18c3b569 +Block 0006 [102]: 96cf6a3057491690 +Block 0006 [103]: 92341fd19b9555b4 +Block 0006 [104]: cd7be1cbec00959e +Block 0006 [105]: fbd2fc3c8a3d82e5 +Block 0006 [106]: f8bead38c9ad1356 +Block 0006 [107]: 5b0b7f47c9a71f9e +Block 0006 [108]: 670e7bfc0c037aa1 +Block 0006 [109]: 09a571475b06b55f +Block 0006 [110]: 2aaa535f4b5af572 +Block 0006 [111]: 47c00b90cdf87c08 +Block 0006 [112]: 985306fd8b26771f +Block 0006 [113]: 06b05349f47bfc1a +Block 0006 [114]: ca411ea698000db5 +Block 0006 [115]: cb85ea28dca6abf1 +Block 0006 [116]: 77b17ea121cd0348 +Block 0006 [117]: e5e4aa917ff9a4ba +Block 0006 [118]: 996faa37d20b0cb0 +Block 0006 [119]: f8dc838f2c8f7f3b +Block 0006 [120]: 4da7fed9fc5e3b3a +Block 0006 [121]: c833da16dea13c63 +Block 0006 [122]: efcaca85677958bc +Block 0006 [123]: a64498dca760f872 +Block 0006 [124]: 9a1bbadb8aa68b52 +Block 0006 [125]: a319d574ee5b8c46 +Block 0006 [126]: f4ff528d79cfee8f +Block 0006 [127]: b1af436e7c0b1c92 +Block 0007 [ 0]: e3ca02813668c742 +Block 0007 [ 1]: a7729db1aede304c +Block 0007 [ 2]: 9bb0d397cebc3d49 +Block 0007 [ 3]: 21f5d7dcd2e2fb53 +Block 0007 [ 4]: 2a31d5bdf05b7362 +Block 0007 [ 5]: 69239eb5a0b4bd31 +Block 0007 [ 6]: 48552e28bae9c687 +Block 0007 [ 7]: 23a438f8a232653a +Block 0007 [ 8]: aaaaf7b7895be8a6 +Block 0007 [ 9]: 567017d6a21230c2 +Block 0007 [ 10]: 00e9a00244ddff2a +Block 0007 [ 11]: b39a550c9200aedb +Block 0007 [ 12]: af8eeb528d432076 +Block 0007 [ 13]: e306f8fcfb5e1673 +Block 0007 [ 14]: cb6f324d48ea87de +Block 0007 [ 15]: c9279674b24388bb +Block 0007 [ 16]: 747e27bb51c50f7d +Block 0007 [ 17]: 51c2bb725842f6c2 +Block 0007 [ 18]: 14c56a15a8e3de1c +Block 0007 [ 19]: da3c7cb2760f3a76 +Block 0007 [ 20]: 75db3ede9cdc7ba1 +Block 0007 [ 21]: 4272ea974cdb8c1a +Block 0007 [ 22]: e99d25ca0e6883e9 +Block 0007 [ 23]: ec88b2fb97bb6b1d +Block 0007 [ 24]: aee2d46370e3900f +Block 0007 [ 25]: 3df19ce3caaf9db0 +Block 0007 [ 26]: 3bee45344fa45a62 +Block 0007 [ 27]: 259b38d5bfb723e5 +Block 0007 [ 28]: 782a1894acdd67eb +Block 0007 [ 29]: dd69343d8b2a42b0 +Block 0007 [ 30]: adb49da918224aae +Block 0007 [ 31]: e20ca605df492741 +Block 0007 [ 32]: 5c786e5c5f4a6ba7 +Block 0007 [ 33]: 3df1691d217fc686 +Block 0007 [ 34]: 7da6d378e182ddeb +Block 0007 [ 35]: 24078fd55514fdc0 +Block 0007 [ 36]: 996bed5355b02441 +Block 0007 [ 37]: 0c3a5c248f888609 +Block 0007 [ 38]: 2ec1ed046e161f71 +Block 0007 [ 39]: c1639cff4bf02347 +Block 0007 [ 40]: 87b135dc7f7a8b9a +Block 0007 [ 41]: 43ce7d06f71ffa98 +Block 0007 [ 42]: 7d3798f0664c9059 +Block 0007 [ 43]: e326063f0a25eed9 +Block 0007 [ 44]: 00abf225c2807f91 +Block 0007 [ 45]: b8aac8dccf1c912d +Block 0007 [ 46]: 56bc16c7ba15ef5b +Block 0007 [ 47]: bcd08294729e70f2 +Block 0007 [ 48]: db341d8367232a64 +Block 0007 [ 49]: 0dc9b2b57218845d +Block 0007 [ 50]: 12568bb40ff2045d +Block 0007 [ 51]: 5a62b75c8bb83c21 +Block 0007 [ 52]: c17362581e812f90 +Block 0007 [ 53]: 4580f3b28720b90e +Block 0007 [ 54]: b946d0208b06c214 +Block 0007 [ 55]: c9ef31df9b2d4378 +Block 0007 [ 56]: 6aa97cb883cdf5e4 +Block 0007 [ 57]: 42275d7f7e29da30 +Block 0007 [ 58]: fcc5b7368657d74d +Block 0007 [ 59]: adf37d794e5f9d31 +Block 0007 [ 60]: 97b138514fc74fd8 +Block 0007 [ 61]: 9eb6b55fa47fc297 +Block 0007 [ 62]: 754051ffac48b541 +Block 0007 [ 63]: 1d8b95b09af8fd1a +Block 0007 [ 64]: acd16a127bced27e +Block 0007 [ 65]: ae3382e9f75feac7 +Block 0007 [ 66]: c76a1f20a5c9a347 +Block 0007 [ 67]: dbe7136e2087e8d8 +Block 0007 [ 68]: 577029805d2cfb5d +Block 0007 [ 69]: 78dee0f47b02e323 +Block 0007 [ 70]: eeaa97dc4cb11975 +Block 0007 [ 71]: bdfa8f0f44599323 +Block 0007 [ 72]: 7f1d58af698b5e71 +Block 0007 [ 73]: fc5601043ef0b4e1 +Block 0007 [ 74]: 85eaa5dcd3db9539 +Block 0007 [ 75]: 2f357fa81f4adb91 +Block 0007 [ 76]: e91a41bc924a8ff2 +Block 0007 [ 77]: f70375d6d1380304 +Block 0007 [ 78]: c1bb93a4b3deb5d2 +Block 0007 [ 79]: 6c75ed60f7bd386e +Block 0007 [ 80]: 2a6417c70ca6da09 +Block 0007 [ 81]: 496bc0f2253ee4d6 +Block 0007 [ 82]: 385397524a41a976 +Block 0007 [ 83]: 385e12a008ae8ace +Block 0007 [ 84]: 94ac859b0438f0b6 +Block 0007 [ 85]: 2200d981da6dccad +Block 0007 [ 86]: 6f6f3c5730b2bac1 +Block 0007 [ 87]: 6e4ca80bc0ba5194 +Block 0007 [ 88]: 65a5bd29d8321a5c +Block 0007 [ 89]: b62cc59f27aaad04 +Block 0007 [ 90]: d923fdae147bc40c +Block 0007 [ 91]: 9c616bd57b7e84ae +Block 0007 [ 92]: ab85da331161632c +Block 0007 [ 93]: 1f829ab9e3d82e0f +Block 0007 [ 94]: a1a0cb5d41abd087 +Block 0007 [ 95]: 65d1a44fa4f74d71 +Block 0007 [ 96]: 0fff9f47af53d7bc +Block 0007 [ 97]: a6137e578c90212a +Block 0007 [ 98]: 1952ddf5f0d8559e +Block 0007 [ 99]: 82caa6d17701ce93 +Block 0007 [100]: ce2c4f2caa70d647 +Block 0007 [101]: 43b6f388fc63fceb +Block 0007 [102]: f0ab2a4a5f2401eb +Block 0007 [103]: 73f81ab2ff30012b +Block 0007 [104]: 0d48f1ed17ad305d +Block 0007 [105]: b9e395a5436b964b +Block 0007 [106]: 26ef4df90b6def84 +Block 0007 [107]: e2fe192b2e7fd243 +Block 0007 [108]: 2a1a94bfc3284834 +Block 0007 [109]: 20d972830befddeb +Block 0007 [110]: c4f665c5b4aae334 +Block 0007 [111]: dfc863e717497389 +Block 0007 [112]: c9d20e095e714d4a +Block 0007 [113]: 080e99e41e40ccd2 +Block 0007 [114]: 155244fecd9b4d56 +Block 0007 [115]: 0390aa4affdc169a +Block 0007 [116]: 24fd146729ad23c2 +Block 0007 [117]: 6c1c75d802e768bd +Block 0007 [118]: 18a2e91cc583305c +Block 0007 [119]: 38df18475a423feb +Block 0007 [120]: 5debbde2af61f810 +Block 0007 [121]: aeaca5dee3a59241 +Block 0007 [122]: bcde39331a1ecc97 +Block 0007 [123]: fbb5f3387dc6ee45 +Block 0007 [124]: 3a6761898cf1de67 +Block 0007 [125]: 274e953bd9e0c65a +Block 0007 [126]: 207eee4dbea76ede +Block 0007 [127]: 5ae4c378c10596ed +Block 0008 [ 0]: 7a4558382ec26ffe +Block 0008 [ 1]: bfb3a4220ee33bec +Block 0008 [ 2]: 0bb9abef17c12091 +Block 0008 [ 3]: 2d1a5e78e0315a51 +Block 0008 [ 4]: 5229abb2e02f3c9c +Block 0008 [ 5]: 4bf95fcf42690b6a +Block 0008 [ 6]: 69f9c812e04e0a23 +Block 0008 [ 7]: b9a9776bf9a9ebef +Block 0008 [ 8]: 4c68c489cd6f9f2f +Block 0008 [ 9]: d8aeafa31f1b226f +Block 0008 [ 10]: ab3999523eef3655 +Block 0008 [ 11]: 522930a175b1c971 +Block 0008 [ 12]: 6d854994a052c568 +Block 0008 [ 13]: 4f6a0b0e9ad28cee +Block 0008 [ 14]: 9ccbd1b8073aca10 +Block 0008 [ 15]: 9cb57f7137ccf8e4 +Block 0008 [ 16]: c3b6b259a447ec16 +Block 0008 [ 17]: c7d28a929ba8a4b9 +Block 0008 [ 18]: ef07034d2c437791 +Block 0008 [ 19]: 886507bd0b23dd4a +Block 0008 [ 20]: 439b59baa42dddab +Block 0008 [ 21]: adca3d7066d8c1c9 +Block 0008 [ 22]: 237de3c198c75d7e +Block 0008 [ 23]: 14a12b61a00c27d8 +Block 0008 [ 24]: 21ec3e3b68c03bea +Block 0008 [ 25]: 62f145b5bdfd0265 +Block 0008 [ 26]: 441c29b7ab81e019 +Block 0008 [ 27]: 721250f6ba37cec5 +Block 0008 [ 28]: 4f1d66952a460eac +Block 0008 [ 29]: 36c90c6c08958ba0 +Block 0008 [ 30]: 36e0d6b302c4c43d +Block 0008 [ 31]: a1036de72d3a24c4 +Block 0008 [ 32]: 5eb1b5a99de68da2 +Block 0008 [ 33]: d0f436a3c1bc2ac6 +Block 0008 [ 34]: bde158d75549813d +Block 0008 [ 35]: c747c78b6c871a27 +Block 0008 [ 36]: bf6583d6d6568f05 +Block 0008 [ 37]: 67752ac1e4e6d2a8 +Block 0008 [ 38]: d400789d1a2c99b6 +Block 0008 [ 39]: 4062fc2df7422502 +Block 0008 [ 40]: 16f312161d62c8ca +Block 0008 [ 41]: b73c24e98ec33c57 +Block 0008 [ 42]: a5051349edae2a72 +Block 0008 [ 43]: b79a6d8a2aaec726 +Block 0008 [ 44]: bc2138ff076b8662 +Block 0008 [ 45]: b6572caea7fba1b6 +Block 0008 [ 46]: 602ac98c8a63ace9 +Block 0008 [ 47]: dd7ef06b16122ceb +Block 0008 [ 48]: 80a999eb61bd8d70 +Block 0008 [ 49]: 9b7d45dbc341d857 +Block 0008 [ 50]: ac4e67fabca37aa9 +Block 0008 [ 51]: f9c524809e716091 +Block 0008 [ 52]: 619639e9fb27b57e +Block 0008 [ 53]: 5c1608ab33ed5ed2 +Block 0008 [ 54]: 369589c03d0eafa7 +Block 0008 [ 55]: a7914d392d81cc98 +Block 0008 [ 56]: 83759d9856a94944 +Block 0008 [ 57]: 9cfee9c2a8cb1780 +Block 0008 [ 58]: 30fe1eeac6982f47 +Block 0008 [ 59]: f4548a258a723f75 +Block 0008 [ 60]: 9aa833ecedeb3db1 +Block 0008 [ 61]: 12bad08144aafdfd +Block 0008 [ 62]: ff87f476fa549ee1 +Block 0008 [ 63]: 9bfcd44245b5d2d0 +Block 0008 [ 64]: 3a11a5b0fb4ff669 +Block 0008 [ 65]: ccfb7ba588c3d8fa +Block 0008 [ 66]: d8fd851205d9a244 +Block 0008 [ 67]: 4417f445a9a3d69d +Block 0008 [ 68]: 6721e7f561f6193f +Block 0008 [ 69]: ff39a930ac96214a +Block 0008 [ 70]: f0a33cfe65e8e5a7 +Block 0008 [ 71]: 906c6ae625eba5ef +Block 0008 [ 72]: 9ff110b00db8cf82 +Block 0008 [ 73]: a50a37b4ec50baef +Block 0008 [ 74]: aea63d8d8ab312b8 +Block 0008 [ 75]: 38bcee3687cfd826 +Block 0008 [ 76]: f55e6ebeeb5943f1 +Block 0008 [ 77]: 0cf154b24e0f7114 +Block 0008 [ 78]: 6e6149f3381c77da +Block 0008 [ 79]: d2c808920c78012f +Block 0008 [ 80]: 28375eb951f79538 +Block 0008 [ 81]: f84d4a372c6ac727 +Block 0008 [ 82]: 18e8fd6355ae1e8b +Block 0008 [ 83]: 993b2759755c6511 +Block 0008 [ 84]: fa0ad100b03f4a83 +Block 0008 [ 85]: 26d937298697431b +Block 0008 [ 86]: 2667bcd9fa134517 +Block 0008 [ 87]: 25bf69ea01c9f43b +Block 0008 [ 88]: 651d7711288dfee6 +Block 0008 [ 89]: dbdbc71ad1d3d8e6 +Block 0008 [ 90]: 19a2bc2962073d38 +Block 0008 [ 91]: 6fed17191de5eb87 +Block 0008 [ 92]: d00e7248d67d818f +Block 0008 [ 93]: 552f48b24a3c532d +Block 0008 [ 94]: 92f601c4a12ca656 +Block 0008 [ 95]: 6bd72e8382bab9f4 +Block 0008 [ 96]: 87800dd5e699ffa0 +Block 0008 [ 97]: 62051340716b1174 +Block 0008 [ 98]: cc61f428a6bff2ab +Block 0008 [ 99]: 54a69e44d4ce3a2c +Block 0008 [100]: 6496d5318c1f8a48 +Block 0008 [101]: bb871f31a81fa4a5 +Block 0008 [102]: 6a74236c72414426 +Block 0008 [103]: 15bae3add20aca96 +Block 0008 [104]: c80ea241cd5f97a8 +Block 0008 [105]: c04bdaaefaca448e +Block 0008 [106]: 81e3c2a697fe8f89 +Block 0008 [107]: 3be29e5ef72ea2d2 +Block 0008 [108]: 3f6b73d9c412839a +Block 0008 [109]: a8147b4754e46f0a +Block 0008 [110]: 29a478f91ff30eb8 +Block 0008 [111]: afe171a02f8ab002 +Block 0008 [112]: 14402c72b6ed606a +Block 0008 [113]: 0fc6cf88e4b26b79 +Block 0008 [114]: 1371cfaf137a4a36 +Block 0008 [115]: 3508f7e250e4812b +Block 0008 [116]: 6c0cdce1e3cec82e +Block 0008 [117]: b2e134c697f67e2d +Block 0008 [118]: 059929cfb84c8223 +Block 0008 [119]: 934dd6d510a690af +Block 0008 [120]: 26e3c05f2c8e2eb8 +Block 0008 [121]: 9e05231042675d2f +Block 0008 [122]: f8dfaedd456045cd +Block 0008 [123]: 0504ccf5fc2d1bf3 +Block 0008 [124]: f0345bbcc1d562ce +Block 0008 [125]: 2bdf71543425789a +Block 0008 [126]: 1b2ae340f1eb41a0 +Block 0008 [127]: 6ec035c341932b16 +Block 0009 [ 0]: 76da9663625cefa5 +Block 0009 [ 1]: 14d8f3ea4efe924a +Block 0009 [ 2]: d971d85251e15d77 +Block 0009 [ 3]: 1c25e2e430baeda6 +Block 0009 [ 4]: 0c4de1e3dbbf5aa1 +Block 0009 [ 5]: 6bf912dd75d1ebee +Block 0009 [ 6]: 89c6fd1e272626f6 +Block 0009 [ 7]: 4267979560731667 +Block 0009 [ 8]: bba1c48ef0407566 +Block 0009 [ 9]: bf22ba8f0c8db099 +Block 0009 [ 10]: abf49acd22b68ee7 +Block 0009 [ 11]: 19721b88f46e7b15 +Block 0009 [ 12]: 7b2f6dac68e7509c +Block 0009 [ 13]: d74ad4e90c4b1a0b +Block 0009 [ 14]: b02f8f4b13ee4aed +Block 0009 [ 15]: 3435fb7ceaebaf14 +Block 0009 [ 16]: cb59f285f76ecd91 +Block 0009 [ 17]: 19a98fac16083d0f +Block 0009 [ 18]: a6d6f2e7f0a10405 +Block 0009 [ 19]: b89f8e247760352b +Block 0009 [ 20]: 104507b7b68bfc06 +Block 0009 [ 21]: de351c2819b20286 +Block 0009 [ 22]: 9ec1c7aa3e8073a2 +Block 0009 [ 23]: 7c2c46aa130f6c1b +Block 0009 [ 24]: 5ac3a947e461ab4f +Block 0009 [ 25]: eca30a19e7455c87 +Block 0009 [ 26]: 9640d7b0113b5e71 +Block 0009 [ 27]: c896d6339618e6fb +Block 0009 [ 28]: d52d34642b92723e +Block 0009 [ 29]: 2a55ca129d38038e +Block 0009 [ 30]: 8a6dc3d7ceec85e9 +Block 0009 [ 31]: 7ba681ec3a53db83 +Block 0009 [ 32]: 3b9583434b7b2859 +Block 0009 [ 33]: 88bb320d5478546c +Block 0009 [ 34]: 09fe2e25f91bfd7a +Block 0009 [ 35]: 63c2c517ed701e04 +Block 0009 [ 36]: 61d250293a71cb82 +Block 0009 [ 37]: 32bdc1b64b6104b9 +Block 0009 [ 38]: f70a89b6785a1d41 +Block 0009 [ 39]: fc82d03affdb8016 +Block 0009 [ 40]: 514005dcdaae909a +Block 0009 [ 41]: 9211e089b2f9cda7 +Block 0009 [ 42]: 1416e44e5ae8b972 +Block 0009 [ 43]: 939c49d1b0d529b8 +Block 0009 [ 44]: 1840aede76b35c76 +Block 0009 [ 45]: 310b737a4d04eb51 +Block 0009 [ 46]: d7a2a1b09c71f893 +Block 0009 [ 47]: 3ea296cca93d6bfc +Block 0009 [ 48]: 91d7f03844662ebe +Block 0009 [ 49]: 10ded6ff22ebf906 +Block 0009 [ 50]: d13a2d771145017e +Block 0009 [ 51]: 3108f839bba8758e +Block 0009 [ 52]: c14c4cee0d507f99 +Block 0009 [ 53]: 892d6f69c439966f +Block 0009 [ 54]: 2509cbab89dac3e3 +Block 0009 [ 55]: f3645d2ebd8256cb +Block 0009 [ 56]: ece3b3e870ccc6b0 +Block 0009 [ 57]: 8069fedcc032f7cd +Block 0009 [ 58]: f1f3c7c853ce120c +Block 0009 [ 59]: 0c98b4f251d8b58c +Block 0009 [ 60]: c09d5932ecedc2e5 +Block 0009 [ 61]: d77d7ed390080d2e +Block 0009 [ 62]: 6a22a1fc7572e784 +Block 0009 [ 63]: 278de8d4b1198f48 +Block 0009 [ 64]: 5750b28e6422a7dd +Block 0009 [ 65]: f7d1a934c4c4f05c +Block 0009 [ 66]: af4ec05117ea6427 +Block 0009 [ 67]: 6fb4f6920fc7e676 +Block 0009 [ 68]: f2d83512befbd4b1 +Block 0009 [ 69]: f86687a23209f3aa +Block 0009 [ 70]: c777825f7401eee4 +Block 0009 [ 71]: c662f86b0d3f349c +Block 0009 [ 72]: 382a513dd4753c4b +Block 0009 [ 73]: a048c89447a62b56 +Block 0009 [ 74]: a74aa6b3081d0308 +Block 0009 [ 75]: f13092e648766c28 +Block 0009 [ 76]: 03032bb4913dc1b2 +Block 0009 [ 77]: b6998b0e42c2e209 +Block 0009 [ 78]: ab39805f67bca821 +Block 0009 [ 79]: 2fc2a4955b78cbe7 +Block 0009 [ 80]: 159cba427791e7c3 +Block 0009 [ 81]: 3fe7d23e3c571718 +Block 0009 [ 82]: 5e0d6f1e911c52b3 +Block 0009 [ 83]: 22f7a61b77838204 +Block 0009 [ 84]: d77426be938516bb +Block 0009 [ 85]: f7cb3ce698976d4f +Block 0009 [ 86]: 2cdd848c7d0eae51 +Block 0009 [ 87]: ad6f6dcbf2c0d570 +Block 0009 [ 88]: 817c9ec46f060801 +Block 0009 [ 89]: 4b7f9262adfdacd0 +Block 0009 [ 90]: 9f31812f3e5255a8 +Block 0009 [ 91]: cd174aa2c8c16338 +Block 0009 [ 92]: 8789b5ef6ade172b +Block 0009 [ 93]: 39373711e9a96757 +Block 0009 [ 94]: dff1fb97ccd6a6c2 +Block 0009 [ 95]: d9d4e3179b5f13e8 +Block 0009 [ 96]: 0a304d46e94cca00 +Block 0009 [ 97]: c1209e65a601f90b +Block 0009 [ 98]: 23bc71e75c8c4214 +Block 0009 [ 99]: 712904d565d09b14 +Block 0009 [100]: 97cfd610419e9abb +Block 0009 [101]: 3472ae86e479b578 +Block 0009 [102]: fef9f9f5b4491d49 +Block 0009 [103]: 1237c8b4e9dceb47 +Block 0009 [104]: 8ecddaf0a2588160 +Block 0009 [105]: bb75acd9afe17a30 +Block 0009 [106]: abb9ec4eaaf15acd +Block 0009 [107]: 36ca450d2be94bfc +Block 0009 [108]: a5ba15a2f35969ca +Block 0009 [109]: 5fe9dd04c051aa7f +Block 0009 [110]: 766ae8329fb254a4 +Block 0009 [111]: 5297e1d430ef5b0a +Block 0009 [112]: 38028d4ef043b385 +Block 0009 [113]: 367eae2fee1ecfb3 +Block 0009 [114]: 5244025847818051 +Block 0009 [115]: 5a708274f861d144 +Block 0009 [116]: c47fc6eb23e4815f +Block 0009 [117]: 4237e8b9b1f3cd9d +Block 0009 [118]: dbe1041d34cac4e1 +Block 0009 [119]: 413d2ae2ebf997c0 +Block 0009 [120]: f2e1a0edb6131e83 +Block 0009 [121]: 6017d817162e938e +Block 0009 [122]: e615ec7b7b788ba9 +Block 0009 [123]: 65980da4c019ce57 +Block 0009 [124]: fc0468d8994e41f6 +Block 0009 [125]: b4acf9c210b4c4a8 +Block 0009 [126]: 9d41bf349c2c7d76 +Block 0009 [127]: 692fde9411561af2 +Block 0010 [ 0]: 31b0e0280e2ecc43 +Block 0010 [ 1]: d93ce8f68a0da03e +Block 0010 [ 2]: 905acb624ea42359 +Block 0010 [ 3]: 41db5464be6fd809 +Block 0010 [ 4]: 1e18ca7554a26f96 +Block 0010 [ 5]: 13b7dab161d1fdd8 +Block 0010 [ 6]: 9b66c337f64cd75e +Block 0010 [ 7]: dcd57a568b0aa2eb +Block 0010 [ 8]: bb146ad41505d2f2 +Block 0010 [ 9]: 68b23abdcc2bedd2 +Block 0010 [ 10]: 98ea131811a6ce9d +Block 0010 [ 11]: bd4637f6ebaa8950 +Block 0010 [ 12]: de8a6392c9be3746 +Block 0010 [ 13]: 2877ec90bd19d6b4 +Block 0010 [ 14]: fa7e8f7f7268a613 +Block 0010 [ 15]: 74a12ec6ff3ea15b +Block 0010 [ 16]: 7760e314bb610a69 +Block 0010 [ 17]: c2567a4d1debed82 +Block 0010 [ 18]: 92a09f57410c22c6 +Block 0010 [ 19]: 029cf267e7fe7104 +Block 0010 [ 20]: fbea3477892c0bc9 +Block 0010 [ 21]: b2e3f0e7ef5a7a06 +Block 0010 [ 22]: d79a6b9875552ed8 +Block 0010 [ 23]: bb2af0a80556d78f +Block 0010 [ 24]: cba43070f27af0be +Block 0010 [ 25]: 0916245fd48c1b13 +Block 0010 [ 26]: ee72922b5c95c68b +Block 0010 [ 27]: 8442fa24985ecf3a +Block 0010 [ 28]: cf80392cac06da0c +Block 0010 [ 29]: d0920a00aeec8df8 +Block 0010 [ 30]: 3e24e4a5ceda5c74 +Block 0010 [ 31]: d8bbe4e1b6a62b5b +Block 0010 [ 32]: 54ebe9d0d5e0211e +Block 0010 [ 33]: 91317dbb9e6807b5 +Block 0010 [ 34]: 549c5ffb68d51a73 +Block 0010 [ 35]: 5f82c9335aa3513f +Block 0010 [ 36]: 495addbb2524905b +Block 0010 [ 37]: 64a03dcd91790e8a +Block 0010 [ 38]: d014df8b4bb91da3 +Block 0010 [ 39]: 6bcd8d9c0efa18a8 +Block 0010 [ 40]: 6c0e217ffe91d746 +Block 0010 [ 41]: 392eca2f236e3649 +Block 0010 [ 42]: 153c191538d717fb +Block 0010 [ 43]: c599c0570b6e3b3f +Block 0010 [ 44]: e97a9c1aea767f83 +Block 0010 [ 45]: f94b7ba8ba460a99 +Block 0010 [ 46]: 09947779799a24ff +Block 0010 [ 47]: 907f6f5cfe9a3a15 +Block 0010 [ 48]: 35926d86cc4b6a06 +Block 0010 [ 49]: c6ba133f79a0dbf0 +Block 0010 [ 50]: 004c55c1df4b91fb +Block 0010 [ 51]: dbadadd7d628d9b6 +Block 0010 [ 52]: 86f9e3ccf70cadd8 +Block 0010 [ 53]: e40b6524491e38f7 +Block 0010 [ 54]: 7e8ccdb6aa7ee6c8 +Block 0010 [ 55]: 673e5a85a14411e1 +Block 0010 [ 56]: 83fc3f033b501ec5 +Block 0010 [ 57]: 62ea0d3cc43de771 +Block 0010 [ 58]: eb51849733fa0a69 +Block 0010 [ 59]: ba3a5561891a745a +Block 0010 [ 60]: 508ac863f9ed414d +Block 0010 [ 61]: 7901256c6773a819 +Block 0010 [ 62]: 66128cf9e004a626 +Block 0010 [ 63]: d8f5776a2f46c852 +Block 0010 [ 64]: 22feb1b89d6f2615 +Block 0010 [ 65]: 6e15418dd65e27ed +Block 0010 [ 66]: 6078aac19f8c26a0 +Block 0010 [ 67]: e7f4ce3a286b3289 +Block 0010 [ 68]: d7b784346ed69fad +Block 0010 [ 69]: 3a01ff3f21fd890b +Block 0010 [ 70]: a8e64f89ba8a89e4 +Block 0010 [ 71]: 5faca06ed3155ee9 +Block 0010 [ 72]: db1279ef5d952316 +Block 0010 [ 73]: 7a6f2cca2eb8fd17 +Block 0010 [ 74]: fa350ee18ea4f4ef +Block 0010 [ 75]: fd23540d3ba0ada5 +Block 0010 [ 76]: fe71f0b180fb7a6c +Block 0010 [ 77]: bc1e622145c35033 +Block 0010 [ 78]: 4fc14b7a245c0357 +Block 0010 [ 79]: 0e1e1bdff76aa6a9 +Block 0010 [ 80]: a927389a374a1b32 +Block 0010 [ 81]: aff1a61bfb7d1891 +Block 0010 [ 82]: 72918289c24056b0 +Block 0010 [ 83]: 0833a583e75d1b50 +Block 0010 [ 84]: d13fa3a097554968 +Block 0010 [ 85]: f76322cbf6ae3de4 +Block 0010 [ 86]: d10106a843f3bc6a +Block 0010 [ 87]: 28f603e202e9f6a8 +Block 0010 [ 88]: e46a32b64599b2f1 +Block 0010 [ 89]: 88c6a687989f490d +Block 0010 [ 90]: 1ff23120e10c7e49 +Block 0010 [ 91]: fafb40a0f8529f66 +Block 0010 [ 92]: 3487240fef8bdf47 +Block 0010 [ 93]: 8248d2350c00490c +Block 0010 [ 94]: adc9101f99058a3b +Block 0010 [ 95]: 7d5f41ae871f8547 +Block 0010 [ 96]: 437207a49efdec8a +Block 0010 [ 97]: a4a383635c4c1daf +Block 0010 [ 98]: caf5fe0f57bb5e70 +Block 0010 [ 99]: a8af868ea7caeaf6 +Block 0010 [100]: 95fc901d137f29cf +Block 0010 [101]: e2480d5cec52a4f5 +Block 0010 [102]: 27fcbc1059d0b47a +Block 0010 [103]: 6cac9c61964647b9 +Block 0010 [104]: c80374446458ea9e +Block 0010 [105]: 294cd33eb188fb53 +Block 0010 [106]: aaedf14d09be48e6 +Block 0010 [107]: 54bd2364c64e7129 +Block 0010 [108]: b97dd69e971b74e2 +Block 0010 [109]: 3a913f07ce8383ca +Block 0010 [110]: 03c86810f373931b +Block 0010 [111]: 44affaf2720253ec +Block 0010 [112]: 9e459c99aefc0a66 +Block 0010 [113]: 172156f40a813320 +Block 0010 [114]: 918eb2798a1ec024 +Block 0010 [115]: 4f8c69444bc9b10c +Block 0010 [116]: 2485548f4f2dfafc +Block 0010 [117]: d88b524283e1930b +Block 0010 [118]: 12193f879f60e01f +Block 0010 [119]: d03dfb6ee7cb1e01 +Block 0010 [120]: 67256e0de8d1daf0 +Block 0010 [121]: 5fbce0def71cb5ea +Block 0010 [122]: d536a5ca66d99e5b +Block 0010 [123]: aa293c38c4e50d7c +Block 0010 [124]: 9c96c76ff9329c4b +Block 0010 [125]: 89caec0b4702e34d +Block 0010 [126]: 6bbc4c71d1f9a952 +Block 0010 [127]: 2c4eefa6b29b0a9f +Block 0011 [ 0]: d1e82a4318ce77be +Block 0011 [ 1]: 874f2182f38b5342 +Block 0011 [ 2]: a57e47eab52c45ef +Block 0011 [ 3]: d7868f310ded7eb8 +Block 0011 [ 4]: 2ab5e7aa907db14f +Block 0011 [ 5]: 8f5eb091fca8ae9c +Block 0011 [ 6]: 91a8d5162ebf9145 +Block 0011 [ 7]: e63439256b6c3095 +Block 0011 [ 8]: ba7c299a1f46c2b5 +Block 0011 [ 9]: 5ac255566aed1dcc +Block 0011 [ 10]: b744aeee793dd56b +Block 0011 [ 11]: 40ff3553e445a0a6 +Block 0011 [ 12]: 47cdec6b8fd8e08d +Block 0011 [ 13]: 378a3eaccc571892 +Block 0011 [ 14]: a43bbaacf3b7c831 +Block 0011 [ 15]: 9cf93a8aac9ac5dd +Block 0011 [ 16]: 644a7e1659437ae0 +Block 0011 [ 17]: be7aca7c8eeb7a78 +Block 0011 [ 18]: 5489b83282196cd2 +Block 0011 [ 19]: 12b3c67f31e850ca +Block 0011 [ 20]: 78acadb5952ded66 +Block 0011 [ 21]: 2f5532bf38ed472d +Block 0011 [ 22]: 80b01e9f61ae9217 +Block 0011 [ 23]: 137d9dbb651eeeec +Block 0011 [ 24]: 91fb38a676d620e5 +Block 0011 [ 25]: c6ee49c2b882c3dc +Block 0011 [ 26]: fd857c3247645a71 +Block 0011 [ 27]: e01ccd93bdb5360c +Block 0011 [ 28]: b27916b0936e7083 +Block 0011 [ 29]: ca6bd8cfc6c79705 +Block 0011 [ 30]: 42e029a388a28b08 +Block 0011 [ 31]: 88a6038c5deb05df +Block 0011 [ 32]: d8e7581a960046be +Block 0011 [ 33]: 55db8fad721a8593 +Block 0011 [ 34]: e181ae0982209758 +Block 0011 [ 35]: 9b3f644bc56863bb +Block 0011 [ 36]: 695442459c0b18d5 +Block 0011 [ 37]: 3180bedbeb601294 +Block 0011 [ 38]: 8916a950f0fb1a93 +Block 0011 [ 39]: 09b1af364f196d42 +Block 0011 [ 40]: 5c4d48b1fdb9e4ea +Block 0011 [ 41]: 06bd164d5fe8cd7c +Block 0011 [ 42]: 5d08357823fdd0fe +Block 0011 [ 43]: 871aa81df5297db4 +Block 0011 [ 44]: aea1bb914cc4d3de +Block 0011 [ 45]: 5805bff2f68f3fdd +Block 0011 [ 46]: 05da3d9d7bb42b11 +Block 0011 [ 47]: f0d6cec4ff7576a3 +Block 0011 [ 48]: 586c76e40ae98ec1 +Block 0011 [ 49]: 7df9ba4cccc6f6fc +Block 0011 [ 50]: a12f512bda7cce33 +Block 0011 [ 51]: 097a47bb7afcaf97 +Block 0011 [ 52]: 6cd6cf7ef02230c1 +Block 0011 [ 53]: 1a2dab3aaf33461e +Block 0011 [ 54]: 4d4461daf1edb76e +Block 0011 [ 55]: 4b094e8be464a5e1 +Block 0011 [ 56]: 94b49b52468af12d +Block 0011 [ 57]: e97f29956e4f3f65 +Block 0011 [ 58]: 546a2f30e98fa22f +Block 0011 [ 59]: a6a0a2679d03cbc7 +Block 0011 [ 60]: fb2d7fb78efc80c4 +Block 0011 [ 61]: cecb0c7cfc14d85e +Block 0011 [ 62]: 042dc5f3eb0ad513 +Block 0011 [ 63]: 52515d7e6dc6a8da +Block 0011 [ 64]: 2575cc25e9839a8e +Block 0011 [ 65]: 7f516599f948cb42 +Block 0011 [ 66]: e46f36f1c0818d6b +Block 0011 [ 67]: 5731d012d459c4e9 +Block 0011 [ 68]: 81cff35112704502 +Block 0011 [ 69]: da0bebf564d3dd82 +Block 0011 [ 70]: 6eb0391b93c3d6de +Block 0011 [ 71]: 1923bfbed3be6f3e +Block 0011 [ 72]: b6dfb17deaee4398 +Block 0011 [ 73]: de0be6017872013a +Block 0011 [ 74]: c148acb5b418afa0 +Block 0011 [ 75]: b1ca1e5f9d454327 +Block 0011 [ 76]: 550fbbd0d340ebe0 +Block 0011 [ 77]: 428ad5fcb873e497 +Block 0011 [ 78]: 1ea91704a4d3163a +Block 0011 [ 79]: f5b226019dd7ecdb +Block 0011 [ 80]: e216e4c8c718f95e +Block 0011 [ 81]: fde6918ddab3c6dd +Block 0011 [ 82]: a76475fd1c2cd357 +Block 0011 [ 83]: 536a89d3e96743db +Block 0011 [ 84]: cc10a5c4c126803d +Block 0011 [ 85]: 94ec09d9d7fd1b47 +Block 0011 [ 86]: aadd844c38ae1ad3 +Block 0011 [ 87]: c23192926aae85c1 +Block 0011 [ 88]: 9a3da449c0a5c317 +Block 0011 [ 89]: 965b1bb78c380db6 +Block 0011 [ 90]: c4534716589815d1 +Block 0011 [ 91]: 9ba4fd59e3b8bd34 +Block 0011 [ 92]: b7e7f48548a8b3a9 +Block 0011 [ 93]: 0c8f981ecad3b2cd +Block 0011 [ 94]: 58e0f56cef6e5df4 +Block 0011 [ 95]: 200e65e54ea07964 +Block 0011 [ 96]: e2ea08dd9dcb51ae +Block 0011 [ 97]: a58c5aacf25cd0c3 +Block 0011 [ 98]: 2bbd2393fb09dabc +Block 0011 [ 99]: d7c789974e35f75a +Block 0011 [100]: a5f2cfb27cc81bd4 +Block 0011 [101]: 0dbba0cd49c7fff0 +Block 0011 [102]: 3009e3a888fd14da +Block 0011 [103]: 8bb49cc8a5933291 +Block 0011 [104]: 3ff75be07f6da507 +Block 0011 [105]: 46b952048fae8b54 +Block 0011 [106]: 7d91a4bcc82074a8 +Block 0011 [107]: 3d1d0424d4b61236 +Block 0011 [108]: 2f9e57b172250828 +Block 0011 [109]: 110651a2fb71a9e2 +Block 0011 [110]: b8d52422bd4b24b7 +Block 0011 [111]: ad1285e4bda390bd +Block 0011 [112]: 9914e7817f719d17 +Block 0011 [113]: acfe8f67181ad3ec +Block 0011 [114]: ce07461f18020414 +Block 0011 [115]: bc2c5ea5b825f0ff +Block 0011 [116]: 8f34db8f5ecad7eb +Block 0011 [117]: 94d1a356122a6b15 +Block 0011 [118]: 4ac50fe0e2fcf6dd +Block 0011 [119]: 0e86996b9a244cbf +Block 0011 [120]: ef15e3204c51e486 +Block 0011 [121]: 7c96ce7c8273218c +Block 0011 [122]: 08481880faf9071d +Block 0011 [123]: 1127c3f2a6bf95cb +Block 0011 [124]: c9ba567895d6a66c +Block 0011 [125]: 5e0728ee3527ac2d +Block 0011 [126]: 085a8b3210d29a8e +Block 0011 [127]: b10a923b96936609 +Block 0012 [ 0]: 7ca5c1c23ba6fcf5 +Block 0012 [ 1]: 93896c87071cb700 +Block 0012 [ 2]: 0a7b001ab1d4f108 +Block 0012 [ 3]: f5971749b3290e79 +Block 0012 [ 4]: bbe4b1b8f9ae97cc +Block 0012 [ 5]: f0dc4d86da7101d8 +Block 0012 [ 6]: f44093e88688d153 +Block 0012 [ 7]: 9b57e221f5fa8003 +Block 0012 [ 8]: b9be5cc908dd61d1 +Block 0012 [ 9]: dce02419744f80ff +Block 0012 [ 10]: 590345f83559e7ae +Block 0012 [ 11]: 2b511a0ce02963f0 +Block 0012 [ 12]: cf49704b097c97a8 +Block 0012 [ 13]: 5e617f96beefc078 +Block 0012 [ 14]: 26904c1a263343e3 +Block 0012 [ 15]: d198ed95ed7899e3 +Block 0012 [ 16]: 7fb6c36f83d74440 +Block 0012 [ 17]: 26d6d951affa686a +Block 0012 [ 18]: 429458ed251aa32d +Block 0012 [ 19]: 30564a6502752222 +Block 0012 [ 20]: 083b3593f6437019 +Block 0012 [ 21]: bfb2edf1d3e2f9df +Block 0012 [ 22]: 8ef9a090bd52ba74 +Block 0012 [ 23]: 5960fa5b86350e43 +Block 0012 [ 24]: 87d794a0f5fe8de2 +Block 0012 [ 25]: 1f57ffd067f747bd +Block 0012 [ 26]: a7d821de0a8dedc1 +Block 0012 [ 27]: e1f07bf2a21990e9 +Block 0012 [ 28]: b3eef4b38c12154c +Block 0012 [ 29]: c4116ef122474677 +Block 0012 [ 30]: 6bf969976fae2b7d +Block 0012 [ 31]: 5c9192386d774124 +Block 0012 [ 32]: ea2542ca11476ed1 +Block 0012 [ 33]: 0f6c064701aea6a8 +Block 0012 [ 34]: 2a23cfa48e6bab6f +Block 0012 [ 35]: f9e1a627c2049543 +Block 0012 [ 36]: 498c67b116f61850 +Block 0012 [ 37]: a00d000b36091880 +Block 0012 [ 38]: 98416e75169a8b1d +Block 0012 [ 39]: 739ddcb3ac78772b +Block 0012 [ 40]: f987556d3e7e1df8 +Block 0012 [ 41]: ed080bc2bf785655 +Block 0012 [ 42]: 5f3b5a444e7658b0 +Block 0012 [ 43]: 7f58797e8a5a964a +Block 0012 [ 44]: 17ebd94342ae69ef +Block 0012 [ 45]: a78ce8b8314a838b +Block 0012 [ 46]: 4bf854703175d834 +Block 0012 [ 47]: 80ad519d6ca1dbe7 +Block 0012 [ 48]: 0034082b54ae9a4a +Block 0012 [ 49]: 503c5d03d2ee6f33 +Block 0012 [ 50]: 204944949f5b4a25 +Block 0012 [ 51]: 7ca8d9e4035c02ed +Block 0012 [ 52]: 5f29bf6897d71373 +Block 0012 [ 53]: a98f567680ffe33b +Block 0012 [ 54]: bed6859cef39bc91 +Block 0012 [ 55]: 66a5ed3f8ac0d2f3 +Block 0012 [ 56]: f9992ff178cb62e7 +Block 0012 [ 57]: 519b60c89b4a9e6e +Block 0012 [ 58]: 68cf1d3f38e3282a +Block 0012 [ 59]: 487e0010e144b05c +Block 0012 [ 60]: a6e09dce21d71d56 +Block 0012 [ 61]: 3f430a49042f84d2 +Block 0012 [ 62]: 98b3d6776bff822f +Block 0012 [ 63]: 74d938e0417ae0f7 +Block 0012 [ 64]: a8326370d10eff51 +Block 0012 [ 65]: 08ae557de683d605 +Block 0012 [ 66]: 7ab2fd7755ce48db +Block 0012 [ 67]: d15cc3febefee36d +Block 0012 [ 68]: 11e258f2eaad3bd6 +Block 0012 [ 69]: 3e5bf59ff6de85ef +Block 0012 [ 70]: 28b67261c63ca8c5 +Block 0012 [ 71]: 31ca052e999c45cb +Block 0012 [ 72]: 1faac598530b1f73 +Block 0012 [ 73]: 1a80147ba6b55947 +Block 0012 [ 74]: 02f41d623c86bfbb +Block 0012 [ 75]: 28d352044c3d0332 +Block 0012 [ 76]: 51227bb407e40943 +Block 0012 [ 77]: b191e20bba5ea6fa +Block 0012 [ 78]: 5a312002b2b849e5 +Block 0012 [ 79]: 969250eeadb700df +Block 0012 [ 80]: 2f2b0c204965f63d +Block 0012 [ 81]: 44adafa88612b805 +Block 0012 [ 82]: e61ad5e762b8e7c2 +Block 0012 [ 83]: d02e02a9f7c2893b +Block 0012 [ 84]: 0589f6ab6e0e88a6 +Block 0012 [ 85]: 7bd21a4db5bdc536 +Block 0012 [ 86]: 5e36482a2a3841ff +Block 0012 [ 87]: 7df93b0a71b9ac74 +Block 0012 [ 88]: fef8ca444cf873a3 +Block 0012 [ 89]: 733d37035f85b13a +Block 0012 [ 90]: bd9667eb6c003398 +Block 0012 [ 91]: 86e39720f5a6d34e +Block 0012 [ 92]: 87b59164d4a6bf7b +Block 0012 [ 93]: 927cece859b18d76 +Block 0012 [ 94]: cdc44fe6c8cd0871 +Block 0012 [ 95]: 7fe6340847034e40 +Block 0012 [ 96]: fe1ba94d16fefc2e +Block 0012 [ 97]: 08598f6f400d59a2 +Block 0012 [ 98]: 2e224e7a6b238166 +Block 0012 [ 99]: 4355d3f32647af5e +Block 0012 [100]: abdcf4c292a354cd +Block 0012 [101]: 7767314711558d31 +Block 0012 [102]: f1be6ed3f5d65a32 +Block 0012 [103]: 869911f775ba374d +Block 0012 [104]: e1c96e065e7630d3 +Block 0012 [105]: d43c7b0348047d5a +Block 0012 [106]: 2d3cb7990e56bb98 +Block 0012 [107]: a2b18306ef3ea736 +Block 0012 [108]: 744545559db80b1d +Block 0012 [109]: b0d93df763d7341b +Block 0012 [110]: 27fe604eaeac07f0 +Block 0012 [111]: 91c8e0ce703d48e8 +Block 0012 [112]: 901d510d6e4e50fd +Block 0012 [113]: 2652abf2b7403a3b +Block 0012 [114]: 11fa4ade8dab09c8 +Block 0012 [115]: e2df4a27e429f753 +Block 0012 [116]: dd033575e5f9d6c8 +Block 0012 [117]: f252e3c78e2e6b65 +Block 0012 [118]: 620fe7ce4ab1760e +Block 0012 [119]: c371755dc9851eda +Block 0012 [120]: 0b433ba5ddd97375 +Block 0012 [121]: dfde5cab62b93c63 +Block 0012 [122]: 083d2b596861dc5e +Block 0012 [123]: fd3433f1329ff7f8 +Block 0012 [124]: cabdff76543d1539 +Block 0012 [125]: bc26b3144c0a289d +Block 0012 [126]: 6f4a916e08ff334b +Block 0012 [127]: e5b0a4a8e5240637 +Block 0013 [ 0]: fd7ce244c7475828 +Block 0013 [ 1]: cacbfbd93617f1b8 +Block 0013 [ 2]: fdb0cf48b620586c +Block 0013 [ 3]: 94956780c2e98c6d +Block 0013 [ 4]: 459b6a1652d4486d +Block 0013 [ 5]: 6771131551e25220 +Block 0013 [ 6]: e0f3adab0728de2b +Block 0013 [ 7]: c857c4ef14df60aa +Block 0013 [ 8]: 783c3f264f917e14 +Block 0013 [ 9]: 4acc8ca7db5e61a3 +Block 0013 [ 10]: 6da6df59f8723540 +Block 0013 [ 11]: 71404b58ae33ad1e +Block 0013 [ 12]: 2d262d75c9de8656 +Block 0013 [ 13]: 605867033025d5bf +Block 0013 [ 14]: feed04276187d9d4 +Block 0013 [ 15]: 15ecefec97adbe97 +Block 0013 [ 16]: b3c0ba25f92b6407 +Block 0013 [ 17]: b4d88b79d5f8118e +Block 0013 [ 18]: 07af806302bf4150 +Block 0013 [ 19]: cdbf444301ef2cc4 +Block 0013 [ 20]: a83d0468385b1bf7 +Block 0013 [ 21]: 8cfc125da8f7b77b +Block 0013 [ 22]: 1594a86836460d1d +Block 0013 [ 23]: 3f18f39a56755b9f +Block 0013 [ 24]: ff78b84c9062e743 +Block 0013 [ 25]: 6d0ba651733a82a7 +Block 0013 [ 26]: 274b8e73a9a164ee +Block 0013 [ 27]: 2d3fbd108699a52e +Block 0013 [ 28]: 13680eff7955bae3 +Block 0013 [ 29]: 075258a2e2129a54 +Block 0013 [ 30]: 60a7ac04e29c4aac +Block 0013 [ 31]: 54cc75e4326adef5 +Block 0013 [ 32]: e043bc18332cba15 +Block 0013 [ 33]: a93ec2c04a305e5e +Block 0013 [ 34]: 28bd2e7185ce9911 +Block 0013 [ 35]: 6ede8387462677be +Block 0013 [ 36]: b6f7ae65415a323c +Block 0013 [ 37]: ba1c8d92ee403589 +Block 0013 [ 38]: c0d3bbb3043f10f9 +Block 0013 [ 39]: ec8e1e4344ad6062 +Block 0013 [ 40]: c94ecb937323d618 +Block 0013 [ 41]: 9754f1c11c9a7804 +Block 0013 [ 42]: d8efaa317c06f2b5 +Block 0013 [ 43]: a22b6ed585837d7e +Block 0013 [ 44]: 12c343c5d0e9520e +Block 0013 [ 45]: 6747b0dd0325b557 +Block 0013 [ 46]: 6fbb047d945192c6 +Block 0013 [ 47]: a6045420c6f3771a +Block 0013 [ 48]: df2a352f6214bcd2 +Block 0013 [ 49]: c3a292f001e6b65f +Block 0013 [ 50]: 723caaba605418ff +Block 0013 [ 51]: 6f8e850a165e2c9d +Block 0013 [ 52]: dcb982867ea624b3 +Block 0013 [ 53]: a0bf3e1c3fdc4ab4 +Block 0013 [ 54]: e824433d920a9952 +Block 0013 [ 55]: 98e66aa8596eb9ac +Block 0013 [ 56]: cb89ceb9f4cdfbf7 +Block 0013 [ 57]: e138589c0b1aeffa +Block 0013 [ 58]: 523f0606cffaea25 +Block 0013 [ 59]: 631bd8041e1b3b9b +Block 0013 [ 60]: 65e31ec29e142f85 +Block 0013 [ 61]: aa24720c1cc2595b +Block 0013 [ 62]: f367717328bebeb3 +Block 0013 [ 63]: 9172c6dcb9471144 +Block 0013 [ 64]: bb7fe520bf5b10e9 +Block 0013 [ 65]: 0c448c1b958ba9bb +Block 0013 [ 66]: 3342dea528ba0404 +Block 0013 [ 67]: 38101672d55d514f +Block 0013 [ 68]: 295f68aa6b25072b +Block 0013 [ 69]: 0a23137aacb2ca3f +Block 0013 [ 70]: 06365c4a08d7dc52 +Block 0013 [ 71]: 925a4eb911246ff4 +Block 0013 [ 72]: 79678ba22a5af61f +Block 0013 [ 73]: c6a264d4266d6705 +Block 0013 [ 74]: f83c88ef42aa748e +Block 0013 [ 75]: 71111052820882f3 +Block 0013 [ 76]: 0431e61dc2b6e548 +Block 0013 [ 77]: 11861c8cd487e3c4 +Block 0013 [ 78]: dc7e3139c735152b +Block 0013 [ 79]: 9d4214d83eb5168c +Block 0013 [ 80]: ecfeb1108bd18ae0 +Block 0013 [ 81]: eb6d12f55dc8d27b +Block 0013 [ 82]: 90d76b8da957c074 +Block 0013 [ 83]: 11361e1dcbe17eb6 +Block 0013 [ 84]: 841baacb0c5578a1 +Block 0013 [ 85]: 0b688c3798cc1ec1 +Block 0013 [ 86]: 46577db35ac5b023 +Block 0013 [ 87]: 766ab57bde46ca71 +Block 0013 [ 88]: e173aee80c598c25 +Block 0013 [ 89]: 4c0f26b801014154 +Block 0013 [ 90]: b00674f3807c4cce +Block 0013 [ 91]: c5504a8596323b1d +Block 0013 [ 92]: 0f5c0149b310640e +Block 0013 [ 93]: 74681f161ed43407 +Block 0013 [ 94]: 87f96733ba9a9305 +Block 0013 [ 95]: 5b057120a9eda19e +Block 0013 [ 96]: a879658c469f816f +Block 0013 [ 97]: e8e7a8bd1fee6418 +Block 0013 [ 98]: 374f686f822d71c4 +Block 0013 [ 99]: 67373b96acd04bd6 +Block 0013 [100]: 9a60f9fd85a895c5 +Block 0013 [101]: c558b5cd131c8b0a +Block 0013 [102]: 22dabcedc843d71a +Block 0013 [103]: 7edbb62c2e9b6e61 +Block 0013 [104]: 7fae51b3ec828ce0 +Block 0013 [105]: 1a0de7b941720cc5 +Block 0013 [106]: 5fda761c024f32fe +Block 0013 [107]: d77d00379261498a +Block 0013 [108]: ca3a3c8f18efe862 +Block 0013 [109]: 8c9c4dae15073fe0 +Block 0013 [110]: e7c3d35f790635f1 +Block 0013 [111]: 0db7c40f399e6ca5 +Block 0013 [112]: 368d2f184ee634bc +Block 0013 [113]: cf9c845b2527ad3e +Block 0013 [114]: 5a911598e5731f6d +Block 0013 [115]: b8e698a1d10a45c2 +Block 0013 [116]: f84ff315ba6ce3e9 +Block 0013 [117]: 4f69cb819ada3ff4 +Block 0013 [118]: 1e16b7331e757b2e +Block 0013 [119]: cea4a14373c1dc54 +Block 0013 [120]: 8c09c205a962250d +Block 0013 [121]: 001aa12eddf882b1 +Block 0013 [122]: db55f0f45bbe5c3e +Block 0013 [123]: e0874e9b2b8fd7c5 +Block 0013 [124]: b2c4e4287c43c5b2 +Block 0013 [125]: f16604ac4d68f1b3 +Block 0013 [126]: 7744f22d0a3f760f +Block 0013 [127]: 0a18fb6f2ea680c1 +Block 0014 [ 0]: f2f03d1b04a17cef +Block 0014 [ 1]: 96992a0db12dc452 +Block 0014 [ 2]: c7da5aa80bff1ab9 +Block 0014 [ 3]: be7c01a0e083cda4 +Block 0014 [ 4]: 474108589e0ec82b +Block 0014 [ 5]: ec8892e4f6903c4c +Block 0014 [ 6]: 739f9160edf19f30 +Block 0014 [ 7]: 58cfbefe026c3f53 +Block 0014 [ 8]: 3fadcb006fe1f646 +Block 0014 [ 9]: 4d25defa435a56e6 +Block 0014 [ 10]: 8feb9f57775a61aa +Block 0014 [ 11]: 038df252cf08fe7b +Block 0014 [ 12]: 5a0cdf9786d3d986 +Block 0014 [ 13]: 5be9dc12c5530d3a +Block 0014 [ 14]: 94af01ec9648d74f +Block 0014 [ 15]: 4977da96d56c854b +Block 0014 [ 16]: be4f7249746c253c +Block 0014 [ 17]: c408cc59fd752762 +Block 0014 [ 18]: 086bedc984333962 +Block 0014 [ 19]: 39b3219879079a48 +Block 0014 [ 20]: 90b885202a64f113 +Block 0014 [ 21]: abc0a2ad49b2f704 +Block 0014 [ 22]: 7a2677fdbf428392 +Block 0014 [ 23]: 4668ee34a150ddcd +Block 0014 [ 24]: a8a46a39ad66e435 +Block 0014 [ 25]: da4c56ff993a177a +Block 0014 [ 26]: eccff9b93a55dc50 +Block 0014 [ 27]: cd8657a12ba4e3d4 +Block 0014 [ 28]: 21914e642bc6fdfe +Block 0014 [ 29]: 4480f86b8e9db2d8 +Block 0014 [ 30]: d6a24e5481c56350 +Block 0014 [ 31]: 1a8b840bcfe985be +Block 0014 [ 32]: d23efab915d69ef0 +Block 0014 [ 33]: 697e3d1584c3f8d5 +Block 0014 [ 34]: 1d6bd5c30988e3cf +Block 0014 [ 35]: b8a22e618971d997 +Block 0014 [ 36]: 1fbe49fdddadc888 +Block 0014 [ 37]: 7ceefb8d37e9bfa4 +Block 0014 [ 38]: cbee4bf6ce316222 +Block 0014 [ 39]: d6733e7d86990202 +Block 0014 [ 40]: f85bcd8891002bd4 +Block 0014 [ 41]: bcbac6f06255668c +Block 0014 [ 42]: 55090ef103152488 +Block 0014 [ 43]: 7cd3bf9926e877da +Block 0014 [ 44]: 5cab104e2b8c8b44 +Block 0014 [ 45]: 2a16ffdc1a4a879a +Block 0014 [ 46]: 2867317c152f109e +Block 0014 [ 47]: 76ec5ec6e994b320 +Block 0014 [ 48]: ad77c12ec7c75ba1 +Block 0014 [ 49]: 09b4a81a2e216e77 +Block 0014 [ 50]: 5908fe588be9fd0a +Block 0014 [ 51]: 26ffcc96221c1989 +Block 0014 [ 52]: 3310c69cdd95eef0 +Block 0014 [ 53]: 0432787506b0745c +Block 0014 [ 54]: 7d9d002f2b6f18b1 +Block 0014 [ 55]: 8bd9abcedfa7b4f8 +Block 0014 [ 56]: d758fddd27590f92 +Block 0014 [ 57]: 67e82e109ce16bef +Block 0014 [ 58]: deaa1e3b8fdfe767 +Block 0014 [ 59]: 5119a6bb9208ae19 +Block 0014 [ 60]: 274efdc1006d3a22 +Block 0014 [ 61]: c94f0b13873b7b24 +Block 0014 [ 62]: 357ac407d0b5759c +Block 0014 [ 63]: 3930e5d999b0312e +Block 0014 [ 64]: 33e3e6bd2fe095f8 +Block 0014 [ 65]: 338b9696938d0cc0 +Block 0014 [ 66]: c96b296da856ad27 +Block 0014 [ 67]: 14148dfb090c18c7 +Block 0014 [ 68]: cd7d931e870597e7 +Block 0014 [ 69]: c1cc609ca861a3c4 +Block 0014 [ 70]: 09056c2aa840eef5 +Block 0014 [ 71]: 9d6e78244394c4d4 +Block 0014 [ 72]: 7e2dc358a727d8b0 +Block 0014 [ 73]: a88b992feed4d62a +Block 0014 [ 74]: bd54844166fb0f1d +Block 0014 [ 75]: a696233c40a65b6d +Block 0014 [ 76]: c9e1f184fb491805 +Block 0014 [ 77]: 3d65649659b5bc13 +Block 0014 [ 78]: b8cd773cfd1472c5 +Block 0014 [ 79]: fc75b5985df11340 +Block 0014 [ 80]: b8d937b3f3ff97f3 +Block 0014 [ 81]: abea06296e20efc5 +Block 0014 [ 82]: a7ccb1aadd084873 +Block 0014 [ 83]: be960608efa8f86a +Block 0014 [ 84]: 2235ba471ea6cea9 +Block 0014 [ 85]: 6d5c640b585ed896 +Block 0014 [ 86]: 38f6ed9f38bc9391 +Block 0014 [ 87]: cbedcd648c24df47 +Block 0014 [ 88]: d151aba03768ae3c +Block 0014 [ 89]: 758e544c4f59313a +Block 0014 [ 90]: f3832f4c300332f1 +Block 0014 [ 91]: 8eaac11d100c0c1d +Block 0014 [ 92]: 130a1c5607c584a3 +Block 0014 [ 93]: 0dfb11d24999f348 +Block 0014 [ 94]: 7e317c9700d59f24 +Block 0014 [ 95]: e58a8f116bd3d788 +Block 0014 [ 96]: 6988e8db0ee7fba5 +Block 0014 [ 97]: 8e82951b0136710f +Block 0014 [ 98]: 3d02d910d490375c +Block 0014 [ 99]: faeb97304bb1be0c +Block 0014 [100]: 21e7742bc48de3cd +Block 0014 [101]: 65e8f95e9b3fbc47 +Block 0014 [102]: be63ccf97ce8754b +Block 0014 [103]: 6789594d4bddec50 +Block 0014 [104]: a18c8782e6905365 +Block 0014 [105]: 4436042cd2d01265 +Block 0014 [106]: 2285d882b07ee472 +Block 0014 [107]: 6557c4dac229d174 +Block 0014 [108]: 68b0d678ce7212e2 +Block 0014 [109]: 825e3feeadc63f9a +Block 0014 [110]: 09617c5a98cdc06a +Block 0014 [111]: fefb35a97c41a327 +Block 0014 [112]: 09f9effdaeb72080 +Block 0014 [113]: 65bbb2866f516772 +Block 0014 [114]: f0fc0d1466e91442 +Block 0014 [115]: 57e41d6f7b9a9830 +Block 0014 [116]: ed3dab2c2a606e1f +Block 0014 [117]: 53925f1e10f3d52d +Block 0014 [118]: ff01f703dfecba68 +Block 0014 [119]: 6e049b809c19c293 +Block 0014 [120]: 42add865c70171a8 +Block 0014 [121]: 6a66f6439622b1dd +Block 0014 [122]: 1ad1b3f08aac6977 +Block 0014 [123]: 6f9fcebaba3a8239 +Block 0014 [124]: 349c01c02eb52510 +Block 0014 [125]: d779dd0e5d7578f5 +Block 0014 [126]: bae26cd8f24fc0b4 +Block 0014 [127]: de7a654482ac69f3 +Block 0015 [ 0]: 1255358413a2f1f9 +Block 0015 [ 1]: 751ead88b0364f98 +Block 0015 [ 2]: b30312b425732427 +Block 0015 [ 3]: 4dd5694abdf8e712 +Block 0015 [ 4]: d02e249ca6d3f489 +Block 0015 [ 5]: 71493faca635c5ad +Block 0015 [ 6]: f78982bc7f4ca168 +Block 0015 [ 7]: c633520a9725f4af +Block 0015 [ 8]: 341db6d65fddf672 +Block 0015 [ 9]: 00e78a8c97e7500b +Block 0015 [ 10]: 3c1eddc1acdaf215 +Block 0015 [ 11]: bc5ace37b9d774b5 +Block 0015 [ 12]: 895485b8620a8aee +Block 0015 [ 13]: a4b23e29fcf0582c +Block 0015 [ 14]: dae479e8563081ac +Block 0015 [ 15]: 91ce9ed95308593b +Block 0015 [ 16]: 1f597249ed72d58b +Block 0015 [ 17]: f0037a97ecc07819 +Block 0015 [ 18]: 270262d7c2a2215c +Block 0015 [ 19]: 2c708de0238eef8c +Block 0015 [ 20]: c6056f29b6e4e73d +Block 0015 [ 21]: dcc9a09ea0d6d07f +Block 0015 [ 22]: 42630afe629efd41 +Block 0015 [ 23]: ef89fb3fa093fbee +Block 0015 [ 24]: 907eb2909634cca2 +Block 0015 [ 25]: e1b76abbb4c1e695 +Block 0015 [ 26]: 1aa2fa18102682d2 +Block 0015 [ 27]: bf05c904ff36f1dd +Block 0015 [ 28]: 89fe77d740427896 +Block 0015 [ 29]: ae7c4b328a98651a +Block 0015 [ 30]: aaa34fcf1098df10 +Block 0015 [ 31]: ea7f105cedd5ce17 +Block 0015 [ 32]: e48627ab79a7ccd4 +Block 0015 [ 33]: bf080032bf8c8d3f +Block 0015 [ 34]: 901f4fa87b358010 +Block 0015 [ 35]: 28687f31c48e45c6 +Block 0015 [ 36]: 69a67c4c183d2a09 +Block 0015 [ 37]: cf5d0c0964860a2f +Block 0015 [ 38]: ef7cca75218f27a0 +Block 0015 [ 39]: 755891ba0181c6df +Block 0015 [ 40]: 69fc1f1fb54f7e68 +Block 0015 [ 41]: e1a50bcdd76c01b2 +Block 0015 [ 42]: 8d20bc9e4582d634 +Block 0015 [ 43]: f5bb031864f83c09 +Block 0015 [ 44]: b6a23f45f2367307 +Block 0015 [ 45]: 3e82729a6494e098 +Block 0015 [ 46]: 7791faaac40f4632 +Block 0015 [ 47]: acb9d9be87280aa2 +Block 0015 [ 48]: 0f29ad18d6e83cbc +Block 0015 [ 49]: e1d7ec9ed395ae76 +Block 0015 [ 50]: e8360c0c6b3fcd7c +Block 0015 [ 51]: ad8ccdefc893d72b +Block 0015 [ 52]: 90abd311e2537d6a +Block 0015 [ 53]: a395a4653707425f +Block 0015 [ 54]: a8fa96881bf142a9 +Block 0015 [ 55]: cb80ecdcebcc94a2 +Block 0015 [ 56]: 2855f69a9c3bb4e5 +Block 0015 [ 57]: ab213ef77b3a45db +Block 0015 [ 58]: 5ce4cea1fe393c3d +Block 0015 [ 59]: 3e53f9b07a96f0a9 +Block 0015 [ 60]: c544ee084b9f0309 +Block 0015 [ 61]: b1a2040b934b211c +Block 0015 [ 62]: 5786c6421c449ecd +Block 0015 [ 63]: 026a08e9a3a4cd5d +Block 0015 [ 64]: 49ebf2b8246b3c49 +Block 0015 [ 65]: 131dbb5efced5f87 +Block 0015 [ 66]: e953740868a2dbd3 +Block 0015 [ 67]: cd2b4261d4d98342 +Block 0015 [ 68]: fdb12b71ee28acea +Block 0015 [ 69]: bb19976da7b21eeb +Block 0015 [ 70]: 724cd3d9d2e9d16b +Block 0015 [ 71]: 6696d05c291c1967 +Block 0015 [ 72]: 042b9a5efae770df +Block 0015 [ 73]: 602824b47d02bf47 +Block 0015 [ 74]: 40d0f9eff044a6f0 +Block 0015 [ 75]: 5285b30bdf724adf +Block 0015 [ 76]: 14813c0b2cdc4809 +Block 0015 [ 77]: 6e2e1693ff0fc7f6 +Block 0015 [ 78]: 5a165346997138ce +Block 0015 [ 79]: 1a76bf7aa83132c8 +Block 0015 [ 80]: a6519d9659432a64 +Block 0015 [ 81]: f5f1c2d6b15bce5a +Block 0015 [ 82]: f5b29a131ca0a074 +Block 0015 [ 83]: c5e9a0544b261af0 +Block 0015 [ 84]: 8d9953c2d32b33f9 +Block 0015 [ 85]: c7f21a3e0d0b3bb7 +Block 0015 [ 86]: 75f4a476b8c4b2f9 +Block 0015 [ 87]: 756d6972e7060a75 +Block 0015 [ 88]: 62699ecf6ddbee77 +Block 0015 [ 89]: 7d195f9a4f52b21c +Block 0015 [ 90]: ea4c560cea05cda3 +Block 0015 [ 91]: 0d5589b1e874cd8d +Block 0015 [ 92]: 68c9804bb7ceaded +Block 0015 [ 93]: 64949cd5db3bd11c +Block 0015 [ 94]: 391c3bfe0a230a0e +Block 0015 [ 95]: 5f9584071f0450f0 +Block 0015 [ 96]: 11f7986cd347ffeb +Block 0015 [ 97]: a3d32d4f7c987b46 +Block 0015 [ 98]: 97306e0cb5794d17 +Block 0015 [ 99]: f6600ddb12c2360b +Block 0015 [100]: ee875f8f1e829ed1 +Block 0015 [101]: f8838d4105e9e06d +Block 0015 [102]: 29a64f9ede3483c6 +Block 0015 [103]: 4c8bfa826e1c98ae +Block 0015 [104]: 8b8764597961e33c +Block 0015 [105]: 446734f12cd1e8a5 +Block 0015 [106]: 1575565d48091cbb +Block 0015 [107]: df76d2d4fb41d479 +Block 0015 [108]: 9c731839f9a69055 +Block 0015 [109]: 63a1bcba5e407783 +Block 0015 [110]: 89eee48d0f2af665 +Block 0015 [111]: d435a276381b3f5d +Block 0015 [112]: a15f2a8cf30c8242 +Block 0015 [113]: f3aa49983fee282a +Block 0015 [114]: e582e86f9e8ee653 +Block 0015 [115]: 4c7c33109e0dec66 +Block 0015 [116]: 6fd95057ae162c43 +Block 0015 [117]: 47c054c1102250ba +Block 0015 [118]: 5ca2000678b17d5f +Block 0015 [119]: b7a46465f2f67b9f +Block 0015 [120]: 3be6f3a2fe74eb70 +Block 0015 [121]: 6bd87ed167e85c64 +Block 0015 [122]: 4578998648f615f0 +Block 0015 [123]: 8d6b943f96554611 +Block 0015 [124]: b8f726520775506e +Block 0015 [125]: 2c720aacce22a83f +Block 0015 [126]: 4c74a22df9900c10 +Block 0015 [127]: 677933502ccbb992 +Block 0016 [ 0]: 4db7d68d9601e701 +Block 0016 [ 1]: c22dbfcd31599660 +Block 0016 [ 2]: 5a571361825c35f5 +Block 0016 [ 3]: a6e2abaa12350087 +Block 0016 [ 4]: 8d539b6a04326542 +Block 0016 [ 5]: 13aa4d46af6159d7 +Block 0016 [ 6]: 2b46a2baaa82b799 +Block 0016 [ 7]: 6db1ffe91647adf1 +Block 0016 [ 8]: fa299728b2d664bb +Block 0016 [ 9]: 7106dc0e4de7fb6b +Block 0016 [ 10]: 23bad9c3029d5ed2 +Block 0016 [ 11]: 5b2a068f6fb744da +Block 0016 [ 12]: a09d30ab6242d56c +Block 0016 [ 13]: e57083fbac677790 +Block 0016 [ 14]: 61ea4bfcffccd406 +Block 0016 [ 15]: 66c50e9d8adce355 +Block 0016 [ 16]: 5ac73d2b9e4e38fb +Block 0016 [ 17]: 09e063f4fb7790bb +Block 0016 [ 18]: 46dfd5a0f8d8dec2 +Block 0016 [ 19]: bd925ed692313d4e +Block 0016 [ 20]: 3e5013e04540b07f +Block 0016 [ 21]: 36d13e4cb42ed6ba +Block 0016 [ 22]: 19a6fba6330763c9 +Block 0016 [ 23]: 4b8e8279794a06ea +Block 0016 [ 24]: 669cc88cb6ebf3fd +Block 0016 [ 25]: 5d26b291e22d6f3c +Block 0016 [ 26]: eded220ce598a9b1 +Block 0016 [ 27]: 82bf01afa95b32ac +Block 0016 [ 28]: 9d2d4f8ce3cf4a5a +Block 0016 [ 29]: efb52aa40b14f099 +Block 0016 [ 30]: 303b3d066fa3bb0e +Block 0016 [ 31]: d79142270c27e172 +Block 0016 [ 32]: f8b29998949ab8d5 +Block 0016 [ 33]: 976ec56b65bc1cdb +Block 0016 [ 34]: 00ec9322e0c65283 +Block 0016 [ 35]: 5a682d984b0253db +Block 0016 [ 36]: dfeeb5a0cd007a74 +Block 0016 [ 37]: 6d7ed66839d81317 +Block 0016 [ 38]: 7cbf6ff524df82ea +Block 0016 [ 39]: a402cba8fe4ee222 +Block 0016 [ 40]: 051ce4340605fb49 +Block 0016 [ 41]: db1c5330069c673f +Block 0016 [ 42]: d04ad8bdeb9ee349 +Block 0016 [ 43]: 095a39dfbedeb10f +Block 0016 [ 44]: c8f2764065673d60 +Block 0016 [ 45]: 250f51b581f26844 +Block 0016 [ 46]: 89f8ff131b1e1adf +Block 0016 [ 47]: 8c278f41821d1b65 +Block 0016 [ 48]: 45064aaffb3c6590 +Block 0016 [ 49]: 0ed7d575c479d9e9 +Block 0016 [ 50]: a880e9daeb7a648c +Block 0016 [ 51]: d0fb1bd6daa2e147 +Block 0016 [ 52]: 1f13ac0f49a4d2e8 +Block 0016 [ 53]: e748f547f85b940d +Block 0016 [ 54]: 6f4014e2e1beea5c +Block 0016 [ 55]: 0bf87689a53f2a46 +Block 0016 [ 56]: acd91b7197cf80eb +Block 0016 [ 57]: 9603a84c49ea2b0c +Block 0016 [ 58]: 7674eb49dbcbd228 +Block 0016 [ 59]: 54a8b7d3fcb61a40 +Block 0016 [ 60]: b5f0e12b74727573 +Block 0016 [ 61]: ea7e8ba3eb6af459 +Block 0016 [ 62]: d1b08409c386140e +Block 0016 [ 63]: 3e346330eae2f3c0 +Block 0016 [ 64]: 19594146c1309b3b +Block 0016 [ 65]: 8039aac71029f73e +Block 0016 [ 66]: d1e9ec55bb6e7cf6 +Block 0016 [ 67]: 9252fee592a2d1ce +Block 0016 [ 68]: c8fe275bd8ccc476 +Block 0016 [ 69]: 357d09183e4eea94 +Block 0016 [ 70]: 992d00208d5f5286 +Block 0016 [ 71]: 0c854a63942fa090 +Block 0016 [ 72]: 69dd9ef7ec5397cf +Block 0016 [ 73]: b9afe5e205d6e5c9 +Block 0016 [ 74]: 2371fbb9bf596a93 +Block 0016 [ 75]: d6bec9f826beb54a +Block 0016 [ 76]: 48954f405076ba24 +Block 0016 [ 77]: 327b7a72c294184d +Block 0016 [ 78]: ff3813caf762b02e +Block 0016 [ 79]: 6701af476b138c3e +Block 0016 [ 80]: ff27a00fc63062a3 +Block 0016 [ 81]: ab1ab6bf00205f51 +Block 0016 [ 82]: 7ccddffaf79e0429 +Block 0016 [ 83]: b2e0f5f4b62c8f47 +Block 0016 [ 84]: f1e3cb6a21181e4c +Block 0016 [ 85]: e8ba84317f763bdd +Block 0016 [ 86]: ea2627679ca2629f +Block 0016 [ 87]: 68a29eccab7bdf7e +Block 0016 [ 88]: aa81043849728072 +Block 0016 [ 89]: f03fe30d8cc1750a +Block 0016 [ 90]: e1c8dc0586b6d96a +Block 0016 [ 91]: 9efb4cefbc1f797a +Block 0016 [ 92]: e9614318106bb145 +Block 0016 [ 93]: 6a05a48ce9764b41 +Block 0016 [ 94]: 35d9f3e94e77a4d3 +Block 0016 [ 95]: 1d3d8037ca4c3f94 +Block 0016 [ 96]: b781fb66e6ba85a7 +Block 0016 [ 97]: 82aaa076c2bf43f3 +Block 0016 [ 98]: f922a9c456a4b545 +Block 0016 [ 99]: eee12870754d9bb8 +Block 0016 [100]: b1942602108d6701 +Block 0016 [101]: 43a61f3c92d2d0df +Block 0016 [102]: f49bf18180934b65 +Block 0016 [103]: 79e13c570bdc1a64 +Block 0016 [104]: 79e5a885c8f6a304 +Block 0016 [105]: c193d6341218fc8d +Block 0016 [106]: 9fd3fe537b8da1d8 +Block 0016 [107]: 0cb5defa5667eaa8 +Block 0016 [108]: 4a362119f16ebcee +Block 0016 [109]: 328d6c6fe467f299 +Block 0016 [110]: 1ebe0815be15b551 +Block 0016 [111]: f72344ed513952bb +Block 0016 [112]: 230c62884c7bb1bc +Block 0016 [113]: 0509bf0a7180b231 +Block 0016 [114]: bea5fa3794b76431 +Block 0016 [115]: 58fe11d9e0ac41f2 +Block 0016 [116]: 29ee103be36b97cc +Block 0016 [117]: 9ddb5e6a37034145 +Block 0016 [118]: 36182ee882cb12ef +Block 0016 [119]: 4b6cda7dd1c879a4 +Block 0016 [120]: b36a7852a1576905 +Block 0016 [121]: 69f26e6c7af01c50 +Block 0016 [122]: 51d24eee59eea10e +Block 0016 [123]: 4413829b410310e7 +Block 0016 [124]: 6e400eca296a3eec +Block 0016 [125]: 83dcf4d0698b439e +Block 0016 [126]: c78b6ca7d4e4fa65 +Block 0016 [127]: d9622848b6251236 +Block 0017 [ 0]: c54328d345ca134d +Block 0017 [ 1]: cfa77c1577707f01 +Block 0017 [ 2]: b5aa378403ab29b0 +Block 0017 [ 3]: f20b478caa621ff5 +Block 0017 [ 4]: ab99c9536508c527 +Block 0017 [ 5]: 1f4f3e051eca8e47 +Block 0017 [ 6]: 0e60c96834ac2fc8 +Block 0017 [ 7]: 4cca30658c05da56 +Block 0017 [ 8]: 9198d2faa4c0335d +Block 0017 [ 9]: 100fdd49ef23faa6 +Block 0017 [ 10]: 1ad7bc8ec193d0aa +Block 0017 [ 11]: 383474b87bc77f78 +Block 0017 [ 12]: 7379b1216d9fb400 +Block 0017 [ 13]: d441d1836fef3337 +Block 0017 [ 14]: 5a222157ae4b4ebc +Block 0017 [ 15]: 1c96f190fa25fcdd +Block 0017 [ 16]: d8a3ef1a22b6600a +Block 0017 [ 17]: 19559dd25da63154 +Block 0017 [ 18]: df8d7fc83bdf129b +Block 0017 [ 19]: 57d7d7f2dd9e659f +Block 0017 [ 20]: ac96e1ff1aa1aa95 +Block 0017 [ 21]: 1160e842ccc628f4 +Block 0017 [ 22]: f66aabf8a6679a72 +Block 0017 [ 23]: d413c7452672421b +Block 0017 [ 24]: 9c8553bc9aa9a3ac +Block 0017 [ 25]: aea0b3ad0a8e7b97 +Block 0017 [ 26]: 7d024038e0b25b37 +Block 0017 [ 27]: 25e901ca558b870d +Block 0017 [ 28]: 646311cb35864fdc +Block 0017 [ 29]: 7755180ad31050bb +Block 0017 [ 30]: db45dcbddd267c51 +Block 0017 [ 31]: d7776d1556dae483 +Block 0017 [ 32]: ba57f51d620df982 +Block 0017 [ 33]: 94523d6c3bd0dca6 +Block 0017 [ 34]: e80c237ab5434208 +Block 0017 [ 35]: f8b6582d4d0b28e5 +Block 0017 [ 36]: 1ba4596ef5f23763 +Block 0017 [ 37]: a1b5be3f522e4f18 +Block 0017 [ 38]: f46d15fb9aec82a9 +Block 0017 [ 39]: fc554234bf947ba0 +Block 0017 [ 40]: 81555cb4ba1e65b8 +Block 0017 [ 41]: 51c91682e578b053 +Block 0017 [ 42]: 7523b1d8e0c77245 +Block 0017 [ 43]: 6c16476e5ac5e8bd +Block 0017 [ 44]: 6314944acce18cbc +Block 0017 [ 45]: 6b43cd08397cd457 +Block 0017 [ 46]: a239e3c7d48b9e5a +Block 0017 [ 47]: 69c2376df7b66591 +Block 0017 [ 48]: 826105da3fb96f0c +Block 0017 [ 49]: 5b70d4230b4309f2 +Block 0017 [ 50]: 1d5b84056f0c9427 +Block 0017 [ 51]: 86a6061b9157b530 +Block 0017 [ 52]: c5781a6ee336c6d4 +Block 0017 [ 53]: c83cbfb283f2db87 +Block 0017 [ 54]: 73c3a7ee255b70b4 +Block 0017 [ 55]: e35346cf3c917a18 +Block 0017 [ 56]: 51d17c233753e88c +Block 0017 [ 57]: c708839e0cfe70d8 +Block 0017 [ 58]: db38c49c7deb9110 +Block 0017 [ 59]: a4b316fc65fe56b4 +Block 0017 [ 60]: 278b861666460673 +Block 0017 [ 61]: 8a602bdd360facee +Block 0017 [ 62]: 9187b67f360fb96f +Block 0017 [ 63]: 929eb2819f26f457 +Block 0017 [ 64]: 416e6d297b208f50 +Block 0017 [ 65]: 35995bf5743caa54 +Block 0017 [ 66]: f2c12345798abde2 +Block 0017 [ 67]: 387e8376d981ed5c +Block 0017 [ 68]: d35b2c8fbed5bbf4 +Block 0017 [ 69]: f77d0f68fbc0b8b6 +Block 0017 [ 70]: 6ca736edbb3f688d +Block 0017 [ 71]: ef34ee1747771a6b +Block 0017 [ 72]: eebf0ca5b6311f32 +Block 0017 [ 73]: fa3fa95cb3d67c5e +Block 0017 [ 74]: 2bccc3d9a03e5bf6 +Block 0017 [ 75]: 736b79dfb710023d +Block 0017 [ 76]: c6f4c8d9b79c8b74 +Block 0017 [ 77]: f5c38b8fd5241700 +Block 0017 [ 78]: ffd159c0618bdffc +Block 0017 [ 79]: b7f47549a90bc033 +Block 0017 [ 80]: 9e876174a58ad8db +Block 0017 [ 81]: 77b8427d935b21ab +Block 0017 [ 82]: 4927a28eba796c7f +Block 0017 [ 83]: 78045ac02f89368f +Block 0017 [ 84]: 4b27512bf6edc90f +Block 0017 [ 85]: 40646c4e19dd788e +Block 0017 [ 86]: 68ab9102c1676ed9 +Block 0017 [ 87]: 05c56dfa101e5935 +Block 0017 [ 88]: 186693df865e9407 +Block 0017 [ 89]: 0385811decc5060d +Block 0017 [ 90]: bfe32fafcf161c7a +Block 0017 [ 91]: 12f640466210cc83 +Block 0017 [ 92]: bfee4686d9857686 +Block 0017 [ 93]: 7aef4cba468a9955 +Block 0017 [ 94]: 4c75ab47d5cc3a8a +Block 0017 [ 95]: 2a5eec15181f9b55 +Block 0017 [ 96]: afa922a4970eec4e +Block 0017 [ 97]: b4675389b5a2ac9b +Block 0017 [ 98]: 9cba91a2e292b96d +Block 0017 [ 99]: 0afdeafb943582b8 +Block 0017 [100]: bf25b9f2b10e5efb +Block 0017 [101]: a2d10582b75d78b5 +Block 0017 [102]: 2a441f808bd0333b +Block 0017 [103]: a642e7057149cc1f +Block 0017 [104]: d6bc9ab2fc3dedd4 +Block 0017 [105]: 0a69e038dad8ed99 +Block 0017 [106]: cb6f1e8b33aa7bbf +Block 0017 [107]: 8304861a110a863f +Block 0017 [108]: c64db5cffd1dddc9 +Block 0017 [109]: 21ab4b7d16d24343 +Block 0017 [110]: c70d7531ff41687b +Block 0017 [111]: d9fbf424520de3ab +Block 0017 [112]: 62dbc0c63614a2ca +Block 0017 [113]: fb5ddca5cc9b5ef5 +Block 0017 [114]: 102fb169979dff96 +Block 0017 [115]: 89bb3c6d5273def2 +Block 0017 [116]: 4e8ad330ed9ba987 +Block 0017 [117]: 91f9120badad4fe8 +Block 0017 [118]: 2cba6deb67a93e33 +Block 0017 [119]: 82eb9efbfc3f069c +Block 0017 [120]: 92751db67186e7b8 +Block 0017 [121]: 452989bad621fbd0 +Block 0017 [122]: b55a1956286888a8 +Block 0017 [123]: 9b60dc755f5cc9f3 +Block 0017 [124]: 752866cc50addf99 +Block 0017 [125]: f80c6f88dbaf5618 +Block 0017 [126]: 2dacf26165da310a +Block 0017 [127]: 5a5c1346648cb98f +Block 0018 [ 0]: c041b5404fc14796 +Block 0018 [ 1]: 42c1d1d2d2412a2c +Block 0018 [ 2]: 322612b96dbe404c +Block 0018 [ 3]: 357a1fb8cc729650 +Block 0018 [ 4]: 7a527a5309468dd2 +Block 0018 [ 5]: fb2cb6f6e10e59b3 +Block 0018 [ 6]: 34c83bfa6b96fe14 +Block 0018 [ 7]: 32e5eee98371df6a +Block 0018 [ 8]: 814e7423992dab73 +Block 0018 [ 9]: 4bb91cf61fbf942a +Block 0018 [ 10]: f87274d2287559b3 +Block 0018 [ 11]: fed41160f5deb3ac +Block 0018 [ 12]: 3fe00e7ccb816d8a +Block 0018 [ 13]: e98cff2234abbb10 +Block 0018 [ 14]: 92e7a0367f92a4d3 +Block 0018 [ 15]: d5b51b4d450add95 +Block 0018 [ 16]: dc28b4287e3f9ed7 +Block 0018 [ 17]: da0cb8b59bc77666 +Block 0018 [ 18]: 5a888148a7c23edc +Block 0018 [ 19]: 22630c8872df9a76 +Block 0018 [ 20]: d05adf7c8efc2f5d +Block 0018 [ 21]: 43be90f2e7d8bcf2 +Block 0018 [ 22]: eac412fc14be4be7 +Block 0018 [ 23]: e1e771059e409d40 +Block 0018 [ 24]: e135eb81cecf1833 +Block 0018 [ 25]: 0c01619993e2f658 +Block 0018 [ 26]: c8cd4eb79c5cd6fa +Block 0018 [ 27]: 9b7ffab4b459cfb6 +Block 0018 [ 28]: bb354089eba04584 +Block 0018 [ 29]: 6b3b2a819b790a99 +Block 0018 [ 30]: ea717cdc28bd1e23 +Block 0018 [ 31]: 3736624be21dadff +Block 0018 [ 32]: ac6b859c93b2e762 +Block 0018 [ 33]: 1cb8d4442942a949 +Block 0018 [ 34]: 7fb052284494bded +Block 0018 [ 35]: 6f952e9ec4bd5d81 +Block 0018 [ 36]: 043d4040a33ed417 +Block 0018 [ 37]: 278620a20136dc5e +Block 0018 [ 38]: 4b71f1f93451bf05 +Block 0018 [ 39]: 4939662290575aaf +Block 0018 [ 40]: 313e1346d49191a6 +Block 0018 [ 41]: 6d39db233f342f32 +Block 0018 [ 42]: d2ae94655f710ce3 +Block 0018 [ 43]: c9c047392f281a66 +Block 0018 [ 44]: 80dd26a85e5e796f +Block 0018 [ 45]: f186dd414ce01efb +Block 0018 [ 46]: 051f172d5797a286 +Block 0018 [ 47]: 835513a6ab42e638 +Block 0018 [ 48]: 3226271414bf91ae +Block 0018 [ 49]: 04cb3ebae9b28551 +Block 0018 [ 50]: 83ed429d7eb9b927 +Block 0018 [ 51]: 7095a647334175a9 +Block 0018 [ 52]: 33db074e9991615d +Block 0018 [ 53]: 46d842a09fe53c20 +Block 0018 [ 54]: 557606fc5495a082 +Block 0018 [ 55]: a3ad8552fe15a034 +Block 0018 [ 56]: 078a9456a97efccf +Block 0018 [ 57]: d18f62b6e538775a +Block 0018 [ 58]: f81e4b8ec17d28d4 +Block 0018 [ 59]: 5928661efcc1b8bd +Block 0018 [ 60]: fcf4eac3d546e540 +Block 0018 [ 61]: ddb969004b39ba74 +Block 0018 [ 62]: 20e448cd8be12f7a +Block 0018 [ 63]: a61b19150fafec9d +Block 0018 [ 64]: 748bdc3cf48998a6 +Block 0018 [ 65]: ab65d8df971cbe5a +Block 0018 [ 66]: 8c6f9434a9586b89 +Block 0018 [ 67]: 895ca0446a2c28fa +Block 0018 [ 68]: 904d7791774e17fc +Block 0018 [ 69]: 223b37a2589eb79d +Block 0018 [ 70]: 16fa6b43545df34c +Block 0018 [ 71]: 05053dfbf5963e0c +Block 0018 [ 72]: bf4e015f2b2a8543 +Block 0018 [ 73]: bf18babcf76250c0 +Block 0018 [ 74]: a3b1fdfea3b799c3 +Block 0018 [ 75]: 7b66b5e810bb8ed0 +Block 0018 [ 76]: c31a6e1403261884 +Block 0018 [ 77]: fcc69d0a7dc39120 +Block 0018 [ 78]: fa1226c66d84c99b +Block 0018 [ 79]: 4fc6666d38efd0d2 +Block 0018 [ 80]: 180af3a735556b6c +Block 0018 [ 81]: 257757c7b0d7bd60 +Block 0018 [ 82]: b8cf53a7741f7206 +Block 0018 [ 83]: 36445f0e4fa2ff4f +Block 0018 [ 84]: 84e818bcf7f9c0e7 +Block 0018 [ 85]: aef043adae1fea8a +Block 0018 [ 86]: 1a4b58be1665f6c8 +Block 0018 [ 87]: f05dc6e91bc674b7 +Block 0018 [ 88]: fb774360bac8a6be +Block 0018 [ 89]: b391bc826f20faee +Block 0018 [ 90]: d27202a49375b6a0 +Block 0018 [ 91]: 7f4d317308ed1f24 +Block 0018 [ 92]: 85b0e894700e8c53 +Block 0018 [ 93]: 2dc02256d2e6e25a +Block 0018 [ 94]: f59439776d6f90b3 +Block 0018 [ 95]: 743cb12747d017ae +Block 0018 [ 96]: 3dba91a205dcc769 +Block 0018 [ 97]: 51a7dc73cfe29b8a +Block 0018 [ 98]: 43c46e0312db15f2 +Block 0018 [ 99]: 6405b2d2fe5e79a5 +Block 0018 [100]: 9637fdc2d5644c31 +Block 0018 [101]: ea1f9a3fa19447b3 +Block 0018 [102]: 8844881da9341a88 +Block 0018 [103]: a468100efa203be3 +Block 0018 [104]: 628df4042f4e5768 +Block 0018 [105]: d47d10937d3a46d9 +Block 0018 [106]: 9df989b91d7709e2 +Block 0018 [107]: 017ebdf71eda7aaa +Block 0018 [108]: bd75089946ac2eef +Block 0018 [109]: 978c9a569c3de744 +Block 0018 [110]: bf43f9640ece86d2 +Block 0018 [111]: e6bd892f7b28d4e6 +Block 0018 [112]: 2ff9516b1e19d1c3 +Block 0018 [113]: f0dc1c592e7010b9 +Block 0018 [114]: eb4cce9940eccf06 +Block 0018 [115]: da4d653f57eec00f +Block 0018 [116]: e51ab8d3c4be9827 +Block 0018 [117]: 82a6fc187105d291 +Block 0018 [118]: 5c2917ce70d42dc6 +Block 0018 [119]: 2d13186607f06354 +Block 0018 [120]: 08255748d3544673 +Block 0018 [121]: 38864c085f79994e +Block 0018 [122]: ddb698307723325f +Block 0018 [123]: bfec853f7eba283d +Block 0018 [124]: 29dbde8f56583edb +Block 0018 [125]: 89c8a74d98ca5d87 +Block 0018 [126]: 2568841313d637b8 +Block 0018 [127]: c7c147e011020538 +Block 0019 [ 0]: 5975d074fb2b80ca +Block 0019 [ 1]: d3a0fd982f4ffb97 +Block 0019 [ 2]: f2669a67972dfa35 +Block 0019 [ 3]: 1f574aaa1262c366 +Block 0019 [ 4]: 9c1e3ed5ba77c25e +Block 0019 [ 5]: 88783fba68f8148a +Block 0019 [ 6]: e87d826ed27f9403 +Block 0019 [ 7]: 14ecc52ba1db2fe0 +Block 0019 [ 8]: aae61478ed5259ba +Block 0019 [ 9]: 4b1414084db18e5f +Block 0019 [ 10]: c35f1e0ea6765b4c +Block 0019 [ 11]: 7c17e2cd01b7faef +Block 0019 [ 12]: 31888561748cb1bf +Block 0019 [ 13]: 9c8eef4bb77e3b31 +Block 0019 [ 14]: 65615a5be74205b7 +Block 0019 [ 15]: 834fa75572cc0c16 +Block 0019 [ 16]: ced5b8d8a542ca3e +Block 0019 [ 17]: 63fc5c364db120fe +Block 0019 [ 18]: 03385d133a6b3b8d +Block 0019 [ 19]: 6e9483e026d4c324 +Block 0019 [ 20]: 01c63c1034072162 +Block 0019 [ 21]: 4106addfa2a6c4a4 +Block 0019 [ 22]: 545bb4774f5af6fb +Block 0019 [ 23]: f304cc3ff0149f20 +Block 0019 [ 24]: c432491aeea87c6f +Block 0019 [ 25]: 67b894d2251fcd87 +Block 0019 [ 26]: a8f491ffe7629435 +Block 0019 [ 27]: 0529f1dc08202fe3 +Block 0019 [ 28]: dce32768c571875d +Block 0019 [ 29]: 0ee9629f09082ef6 +Block 0019 [ 30]: cad6d8d9b39f6a0f +Block 0019 [ 31]: b3a689484a015bc0 +Block 0019 [ 32]: 9d8877a13d1c3826 +Block 0019 [ 33]: 238759c6a375b2e4 +Block 0019 [ 34]: 1a0840206d678414 +Block 0019 [ 35]: 5f4f523e2f9bc1db +Block 0019 [ 36]: 86bac81c9f087660 +Block 0019 [ 37]: 2b1fc228b7ce1eae +Block 0019 [ 38]: 272373ba633e502a +Block 0019 [ 39]: 07d1da188de3bd27 +Block 0019 [ 40]: 60f1d7a0cf09bd7d +Block 0019 [ 41]: e8338703ba406ffa +Block 0019 [ 42]: a3126dac248af0ba +Block 0019 [ 43]: b66d1411baeee667 +Block 0019 [ 44]: 7e428cba8e92009a +Block 0019 [ 45]: f433fe4cc97cb0a1 +Block 0019 [ 46]: 6d54be08d676e02f +Block 0019 [ 47]: 5520bcd293855640 +Block 0019 [ 48]: 3f559b48823c0871 +Block 0019 [ 49]: 9c3709178d3c2c73 +Block 0019 [ 50]: dc5d227ca8b0a06c +Block 0019 [ 51]: bd6752dd42d9d747 +Block 0019 [ 52]: 2855f70a04ff378e +Block 0019 [ 53]: 33fdd9e42f309bb6 +Block 0019 [ 54]: bbd3ece6fd7e22d3 +Block 0019 [ 55]: 55dc22237d39f2f0 +Block 0019 [ 56]: 86c379043652eebc +Block 0019 [ 57]: c170577fe3e3559b +Block 0019 [ 58]: 11787c617d9b2ff8 +Block 0019 [ 59]: eb7101cfebc209fb +Block 0019 [ 60]: 802bba4c3656ef15 +Block 0019 [ 61]: 583c2ae983b05494 +Block 0019 [ 62]: a03b6463c9aaa2eb +Block 0019 [ 63]: bde4ae47733fa2e2 +Block 0019 [ 64]: 23ada257cf4c6c7a +Block 0019 [ 65]: ada4e1f5e4344a35 +Block 0019 [ 66]: cc978a0231cfbffe +Block 0019 [ 67]: a371c42dc049887c +Block 0019 [ 68]: 345f8bda6f0df672 +Block 0019 [ 69]: 8650d26948762f48 +Block 0019 [ 70]: f43c2d95e07b072a +Block 0019 [ 71]: 67f61ef3ebbc0f96 +Block 0019 [ 72]: 10e739223f7d96e5 +Block 0019 [ 73]: fd6c29b7a80413a9 +Block 0019 [ 74]: 4e1c3d1da37018bc +Block 0019 [ 75]: b02c4fbb8af4294f +Block 0019 [ 76]: 8b40c90a7c84e1ce +Block 0019 [ 77]: 0f985348b6d734b1 +Block 0019 [ 78]: 7dd931cc8b11632a +Block 0019 [ 79]: 814fe25909879a87 +Block 0019 [ 80]: 76d914493b833e24 +Block 0019 [ 81]: 5b5be017ff49892c +Block 0019 [ 82]: 5d83b46073cfd823 +Block 0019 [ 83]: 290b8fdb7f7fb122 +Block 0019 [ 84]: 0efc2d0bbc0d35ac +Block 0019 [ 85]: fec9e053d1874abc +Block 0019 [ 86]: 6724fad53bb13885 +Block 0019 [ 87]: 5940e1a1676bee41 +Block 0019 [ 88]: ed7f9730e4aa9718 +Block 0019 [ 89]: 0cba50e516fe5321 +Block 0019 [ 90]: 417b1c44ebc37352 +Block 0019 [ 91]: c072e1ef6fdbbbc0 +Block 0019 [ 92]: f59b0ea794221c51 +Block 0019 [ 93]: 8a80635f831b642c +Block 0019 [ 94]: 816090e93f345f93 +Block 0019 [ 95]: 8a60e2d12967aeaa +Block 0019 [ 96]: 6707818a46cde2cc +Block 0019 [ 97]: 75daf2d9dd0846d9 +Block 0019 [ 98]: 506b1cf7d9d6b08e +Block 0019 [ 99]: 65903cee3e8a7f3b +Block 0019 [100]: be2174352527d8ce +Block 0019 [101]: 12e0d0792954a886 +Block 0019 [102]: 7eab60f6de1ce0d9 +Block 0019 [103]: 360ea3fd133fd307 +Block 0019 [104]: 5f7435144945666d +Block 0019 [105]: 243ea63a94f2ad1f +Block 0019 [106]: 2d8e733176d41102 +Block 0019 [107]: 746146ad34837e87 +Block 0019 [108]: 90354e38c8503718 +Block 0019 [109]: 1cd40344cbe92283 +Block 0019 [110]: c668973adf6ca79c +Block 0019 [111]: a7e8b08f16ee0da1 +Block 0019 [112]: 4b0a6b18f0a124b1 +Block 0019 [113]: c587e43c8155c830 +Block 0019 [114]: 58cb61030ee0e295 +Block 0019 [115]: a288723f509a656d +Block 0019 [116]: a234563f4e938bc7 +Block 0019 [117]: 78eae87758c6490c +Block 0019 [118]: 3f725bf6465c17bd +Block 0019 [119]: d906e8489e8bd295 +Block 0019 [120]: 589e8eb2682879ab +Block 0019 [121]: d64af1ef2a74f6b6 +Block 0019 [122]: 8144c43fde1ad585 +Block 0019 [123]: 296883ffd42aaf46 +Block 0019 [124]: a3d1b0b82df571d0 +Block 0019 [125]: b8912fe47cc36af9 +Block 0019 [126]: 785f891f4fcbe2c5 +Block 0019 [127]: dface78ba2552ce9 +Block 0020 [ 0]: bf06b2703ca2687f +Block 0020 [ 1]: 66eeeb3ddf34f8a1 +Block 0020 [ 2]: b95f9f996c1c5488 +Block 0020 [ 3]: 242a8bbb2cba35b1 +Block 0020 [ 4]: d742af34a7687518 +Block 0020 [ 5]: fd49b478c7c35b1e +Block 0020 [ 6]: a9aa82aef77d374c +Block 0020 [ 7]: 931f287f229addfb +Block 0020 [ 8]: aea5556a92b17106 +Block 0020 [ 9]: 3421eb9c547646df +Block 0020 [ 10]: 84902b6557754253 +Block 0020 [ 11]: 0dddc14b4aa9dc2c +Block 0020 [ 12]: 400f9e0e79df61d4 +Block 0020 [ 13]: 17aa6a5b0509dc43 +Block 0020 [ 14]: 4f5c4056326d4a69 +Block 0020 [ 15]: 462ac87fda95d3f4 +Block 0020 [ 16]: 9dc248b452234994 +Block 0020 [ 17]: 9f55bef8c449b3fe +Block 0020 [ 18]: dcb9018c911c9823 +Block 0020 [ 19]: 8b0666361853eb86 +Block 0020 [ 20]: f75bfee1a466f38a +Block 0020 [ 21]: eef004f6622ba3a4 +Block 0020 [ 22]: 5e7542da527fbfc7 +Block 0020 [ 23]: cad27d215519e198 +Block 0020 [ 24]: 543a711a2012c0df +Block 0020 [ 25]: 782439a5cf4c6357 +Block 0020 [ 26]: 626f8cb2f646e336 +Block 0020 [ 27]: 27d63ff2d2f5a069 +Block 0020 [ 28]: 7a8adda616f7f464 +Block 0020 [ 29]: 01481647db7b5bfb +Block 0020 [ 30]: 133f07aa86c8d5fb +Block 0020 [ 31]: fdb9090a47295857 +Block 0020 [ 32]: 2b8af4c3a603a10e +Block 0020 [ 33]: 6893ba15ef708e00 +Block 0020 [ 34]: ae6e506b7231044a +Block 0020 [ 35]: 80a831e434a83282 +Block 0020 [ 36]: e6f31bf7f5ac1013 +Block 0020 [ 37]: 59cb7125f004794d +Block 0020 [ 38]: 909d3baf9e4f87a4 +Block 0020 [ 39]: 424af5e6e79d06b1 +Block 0020 [ 40]: 3fae61df4c245611 +Block 0020 [ 41]: 47910940370dfa1c +Block 0020 [ 42]: 255d8003b2be5289 +Block 0020 [ 43]: af9ef269872b42fe +Block 0020 [ 44]: 6148bb955ee73cfd +Block 0020 [ 45]: 9153a8710241bfa8 +Block 0020 [ 46]: 7f990736fa01991f +Block 0020 [ 47]: b0fd4eef9c02115d +Block 0020 [ 48]: 9dd6f482f4191acf +Block 0020 [ 49]: ca024fbf3db9a740 +Block 0020 [ 50]: df82edd640dc69b1 +Block 0020 [ 51]: 1654b5ae829fbd58 +Block 0020 [ 52]: 761c1b1b18247948 +Block 0020 [ 53]: faca1c68baf59e32 +Block 0020 [ 54]: cc38df5e5e7aa81f +Block 0020 [ 55]: 49f3d3f152d1dc0f +Block 0020 [ 56]: f89018f9c5129515 +Block 0020 [ 57]: dac5b6c8ae9f50ed +Block 0020 [ 58]: 8ba01f9fbe900280 +Block 0020 [ 59]: 10611166a326e7e6 +Block 0020 [ 60]: de55eadd96b3f4df +Block 0020 [ 61]: 42aab6fff6e521cf +Block 0020 [ 62]: 47ec7168714eaece +Block 0020 [ 63]: 904dd019a3ab244a +Block 0020 [ 64]: 7f2df0d8c84f6e34 +Block 0020 [ 65]: 1fb128a8df1f68fd +Block 0020 [ 66]: f36c3853507c46c2 +Block 0020 [ 67]: 4df02816df208152 +Block 0020 [ 68]: a6048fc325ec6135 +Block 0020 [ 69]: 01e3809304a909cc +Block 0020 [ 70]: 5f1aa6c03fe7ffa0 +Block 0020 [ 71]: a71d6fadb3403338 +Block 0020 [ 72]: b05b24740b5059bb +Block 0020 [ 73]: 1e5be332cab4cc96 +Block 0020 [ 74]: eabd4670953d4bcf +Block 0020 [ 75]: 75bb0e890c309e8c +Block 0020 [ 76]: 4ba5f3410211ad2a +Block 0020 [ 77]: 74cf2a9624d12fd4 +Block 0020 [ 78]: 6aea587ee952596d +Block 0020 [ 79]: f6ac7426e0240886 +Block 0020 [ 80]: 1ab879b3a53065db +Block 0020 [ 81]: 4a5beac193536b01 +Block 0020 [ 82]: 5193a8fd2c3c74db +Block 0020 [ 83]: 77616a4f76538cf6 +Block 0020 [ 84]: 495cd739bf10f5c8 +Block 0020 [ 85]: b68f2b22d119f196 +Block 0020 [ 86]: 42cdda3bb05cae1a +Block 0020 [ 87]: bea6a38d6aa87f25 +Block 0020 [ 88]: 76664223b0a34ea7 +Block 0020 [ 89]: 86c583aa440330f4 +Block 0020 [ 90]: 088a72d7ec72de94 +Block 0020 [ 91]: 88460c4824f41ca6 +Block 0020 [ 92]: 633bcdeecbb960ac +Block 0020 [ 93]: 5e75c4663e3d852e +Block 0020 [ 94]: 1ccf9cbc5da47576 +Block 0020 [ 95]: 046dc004ef4923bf +Block 0020 [ 96]: 88eefd45eb5e9eaa +Block 0020 [ 97]: 0e955efe5f8797c1 +Block 0020 [ 98]: 91d9762a0fed8ebb +Block 0020 [ 99]: 52d8ebcdbacb5df7 +Block 0020 [100]: 574cd3e9238e2764 +Block 0020 [101]: a980d494a5100569 +Block 0020 [102]: 86832502488c9aa7 +Block 0020 [103]: 1fc9bdb470956f1f +Block 0020 [104]: 39f8bf49af2c10c1 +Block 0020 [105]: 037f1959a20a2823 +Block 0020 [106]: c9fa2b01347358db +Block 0020 [107]: 2494b5368202ff78 +Block 0020 [108]: 7a61a9b0ee5dc1be +Block 0020 [109]: 8da10663648d024a +Block 0020 [110]: 5ac14216531e239e +Block 0020 [111]: 91c917ab42a14684 +Block 0020 [112]: 80aa0cdb9b0cb881 +Block 0020 [113]: 80353569cd511cb0 +Block 0020 [114]: 334c54fca282870c +Block 0020 [115]: d2fb2e2aa01c2da1 +Block 0020 [116]: 06baca7139225edd +Block 0020 [117]: 4d23ee2ef7aa6c5a +Block 0020 [118]: 85e3b2db336611d3 +Block 0020 [119]: 54e049b532f97e15 +Block 0020 [120]: 9ba8ca6975ee7697 +Block 0020 [121]: dbb4a07ee8e1e1ec +Block 0020 [122]: 08a88026b23a1a8f +Block 0020 [123]: 904a6fb70888cc8e +Block 0020 [124]: 8015003a37c1d2c8 +Block 0020 [125]: 4a0bece1dc802e8a +Block 0020 [126]: e83b5bc5b63254dd +Block 0020 [127]: 315b078379732a55 +Block 0021 [ 0]: d98dacb952d24420 +Block 0021 [ 1]: 6ecefcfe9d2fce83 +Block 0021 [ 2]: 382b10cdcd4992f2 +Block 0021 [ 3]: 7c448939c4bf754d +Block 0021 [ 4]: e952610c3a3def5b +Block 0021 [ 5]: b8530f5459295399 +Block 0021 [ 6]: bbe9e115b1e37624 +Block 0021 [ 7]: 3619cf1d35d29654 +Block 0021 [ 8]: 1623a3887360cc74 +Block 0021 [ 9]: 8d33879e4b8217fd +Block 0021 [ 10]: 6c63b8e106d93d20 +Block 0021 [ 11]: 33a3a79e9cf2a354 +Block 0021 [ 12]: a24c5ba0e3072c87 +Block 0021 [ 13]: dbc11e2218cf95b3 +Block 0021 [ 14]: 1ba86314b90b1788 +Block 0021 [ 15]: 17b0904e5bf6f224 +Block 0021 [ 16]: 1451021dffe4fc93 +Block 0021 [ 17]: fa60d71c5556f9be +Block 0021 [ 18]: a4d8a51e384ab69b +Block 0021 [ 19]: 67d12fd94a2be9f5 +Block 0021 [ 20]: f14bb5b5aac93bc9 +Block 0021 [ 21]: 9378796ef3ba102b +Block 0021 [ 22]: 5e6f488326121b6b +Block 0021 [ 23]: 592621c434b0ce6d +Block 0021 [ 24]: c7424cfff8b3b826 +Block 0021 [ 25]: 04b0b25e87bd42f2 +Block 0021 [ 26]: 69339b43e358f015 +Block 0021 [ 27]: 9c1a659e532ff7c5 +Block 0021 [ 28]: a1d5bd93788dbcac +Block 0021 [ 29]: 9366ff377573f23d +Block 0021 [ 30]: 86d8b9e63bc75e4f +Block 0021 [ 31]: e4a67711b9f4fa29 +Block 0021 [ 32]: 0dad38ae8f5a1e04 +Block 0021 [ 33]: 4fae94319789ee3e +Block 0021 [ 34]: 3cdbdb5dfe5b731b +Block 0021 [ 35]: 4e0ce9a6413c3bcd +Block 0021 [ 36]: 93640d28a17deca2 +Block 0021 [ 37]: 07ed1daa7f314e39 +Block 0021 [ 38]: dde6874f6cb113ab +Block 0021 [ 39]: 84d5e35f62380ed3 +Block 0021 [ 40]: cb9e1fccad5a49a8 +Block 0021 [ 41]: ac4d4db97342a253 +Block 0021 [ 42]: f8116ff018848c4b +Block 0021 [ 43]: a05377f405673668 +Block 0021 [ 44]: 7472fa1ac1fa40dd +Block 0021 [ 45]: 66139b5e4c70780e +Block 0021 [ 46]: 88c21339074cf6c1 +Block 0021 [ 47]: a5148f1e4e76661b +Block 0021 [ 48]: 170a478179733825 +Block 0021 [ 49]: eb143bdecf5dd3ec +Block 0021 [ 50]: d2823463723e066d +Block 0021 [ 51]: b3940bbd94f8bd9c +Block 0021 [ 52]: dc5aacae8113ea16 +Block 0021 [ 53]: 1cfccf1746c31e74 +Block 0021 [ 54]: c0ef593db7d6031a +Block 0021 [ 55]: 332ea71b13a66d46 +Block 0021 [ 56]: 4a64bf8f0edd195b +Block 0021 [ 57]: 865db29b08296b25 +Block 0021 [ 58]: 4910a3014fe2f270 +Block 0021 [ 59]: a358cfd6afbe1a7b +Block 0021 [ 60]: 6986b50badaf443b +Block 0021 [ 61]: 598890f56972ca95 +Block 0021 [ 62]: ec44d5f01c361a8c +Block 0021 [ 63]: f79b2cafc96cd35a +Block 0021 [ 64]: 641067f7e4d0fc30 +Block 0021 [ 65]: b8edd873352f01ef +Block 0021 [ 66]: d1ff92e53c93a46d +Block 0021 [ 67]: 74ede5ca7e19622c +Block 0021 [ 68]: 9efa50c40af182d4 +Block 0021 [ 69]: 1dc41311428d8ed6 +Block 0021 [ 70]: d711fe07a8727a56 +Block 0021 [ 71]: c4d212ff76c97984 +Block 0021 [ 72]: 9d073689ca2ad4fc +Block 0021 [ 73]: 178aa8d197172ee7 +Block 0021 [ 74]: 46a0c28765bb4043 +Block 0021 [ 75]: afa90f2b421dbf1c +Block 0021 [ 76]: 8e7bee6842b6af3a +Block 0021 [ 77]: 79d2f5438af8bcb6 +Block 0021 [ 78]: ea00efd5db7c57de +Block 0021 [ 79]: f0974aa1ec354092 +Block 0021 [ 80]: 6c74b588913d4b1e +Block 0021 [ 81]: e8c90d16b01d747f +Block 0021 [ 82]: 7ef33f5658372999 +Block 0021 [ 83]: 4e0397c1dd16e9a7 +Block 0021 [ 84]: 289e3c980bc5c267 +Block 0021 [ 85]: fdc35d92fb2b138d +Block 0021 [ 86]: 4f60dbb4715f4377 +Block 0021 [ 87]: 038ea7ce4501b429 +Block 0021 [ 88]: f5d6971a39619b5c +Block 0021 [ 89]: 1ee68cb6ad1ad2bf +Block 0021 [ 90]: e7b678892a7ab0d3 +Block 0021 [ 91]: 5296b50abd13f8d8 +Block 0021 [ 92]: 0a0c11eb32bad5d1 +Block 0021 [ 93]: 62a04ab31aca9b85 +Block 0021 [ 94]: 8ee3c8aaafc1c37a +Block 0021 [ 95]: a679930ef4e84767 +Block 0021 [ 96]: b04cffad7dd306f4 +Block 0021 [ 97]: 615bf6a1ce835476 +Block 0021 [ 98]: fded9b06857aaeef +Block 0021 [ 99]: fdbf46d28acab387 +Block 0021 [100]: 58fcf9286a597f27 +Block 0021 [101]: 365e45615e1c06a1 +Block 0021 [102]: d5b5b8783a8f6e94 +Block 0021 [103]: 4f6704326849f6ee +Block 0021 [104]: 4786fb349eeb83d3 +Block 0021 [105]: 6e23749d929458d7 +Block 0021 [106]: 762b35de343c8888 +Block 0021 [107]: 45c0bbe5e881eebb +Block 0021 [108]: 5524af970d7747c2 +Block 0021 [109]: 7642e839a38308ed +Block 0021 [110]: 83116756fae0756d +Block 0021 [111]: dc1310d82834160f +Block 0021 [112]: db164a0b29b09861 +Block 0021 [113]: 297e4577cf659941 +Block 0021 [114]: e7fc84e90aac30ca +Block 0021 [115]: b36c4bea07e566d4 +Block 0021 [116]: 2ab7769287c75732 +Block 0021 [117]: fd931d4cb3c65f6f +Block 0021 [118]: f678f8e63ec79f54 +Block 0021 [119]: db7985eca3d474e9 +Block 0021 [120]: e6f59690114a1d52 +Block 0021 [121]: e3307b0f6212383b +Block 0021 [122]: 0c128521465d65ea +Block 0021 [123]: b798c51553ecfa41 +Block 0021 [124]: 20377296fa088c82 +Block 0021 [125]: bb3e7fe72954d469 +Block 0021 [126]: 0bdd6756a03fc48b +Block 0021 [127]: a59afa783ff40b08 +Block 0022 [ 0]: 894fb10684f63911 +Block 0022 [ 1]: c79e516e27e0eae1 +Block 0022 [ 2]: e4eb70963475aa54 +Block 0022 [ 3]: fa82a9bd92c66730 +Block 0022 [ 4]: 6bac0da0c39340c9 +Block 0022 [ 5]: 8ec6d78db179db48 +Block 0022 [ 6]: feb6da1a2c768038 +Block 0022 [ 7]: 8d8330d86ab0b201 +Block 0022 [ 8]: 782a6b1b6582aa80 +Block 0022 [ 9]: f18bd0c0ac40731f +Block 0022 [ 10]: 876077f975a2610e +Block 0022 [ 11]: ab514d1c8bd52949 +Block 0022 [ 12]: 758a978e57a5cb53 +Block 0022 [ 13]: a3f99b1346fbc817 +Block 0022 [ 14]: b98c66ba86dad2da +Block 0022 [ 15]: 891da0ae5d3c8167 +Block 0022 [ 16]: d5665fcafefc49af +Block 0022 [ 17]: b896b1d29e0478ab +Block 0022 [ 18]: a66a6c204d5e1dac +Block 0022 [ 19]: 991fcd02bdb902a8 +Block 0022 [ 20]: 4a10d59071361da9 +Block 0022 [ 21]: 38ee47da00b3896f +Block 0022 [ 22]: 1b1a81ae9ff8c085 +Block 0022 [ 23]: cb5f18bc3495bfa7 +Block 0022 [ 24]: ab16c36264a70127 +Block 0022 [ 25]: 2c00e90e8650f9a7 +Block 0022 [ 26]: b865eb3c34a4898c +Block 0022 [ 27]: 686164804f2386fd +Block 0022 [ 28]: cdf4f95feaa6880e +Block 0022 [ 29]: de938318bce749ab +Block 0022 [ 30]: 6a8884ad54f8e0c0 +Block 0022 [ 31]: ba17a2eed4edb6a3 +Block 0022 [ 32]: 03565e3f24fc6c53 +Block 0022 [ 33]: a72d60702118177d +Block 0022 [ 34]: 53cc8a0dd84a79ee +Block 0022 [ 35]: d8bc2ff2f8e1e245 +Block 0022 [ 36]: 4664e02b6091aaf7 +Block 0022 [ 37]: 8ce8fbfb6b2c659f +Block 0022 [ 38]: 1d3ff48f828c076e +Block 0022 [ 39]: 2a154a5733380c66 +Block 0022 [ 40]: 97935f5fcf051a92 +Block 0022 [ 41]: 30a082488b0cc18f +Block 0022 [ 42]: b8cec1865510da77 +Block 0022 [ 43]: f69f733d02225eb8 +Block 0022 [ 44]: 5e977e5a7fb48dc9 +Block 0022 [ 45]: c9ac7bbbde9594fe +Block 0022 [ 46]: 38726e01c66a8330 +Block 0022 [ 47]: d0cad8f24e4bf70d +Block 0022 [ 48]: b92f4fb7765df3c3 +Block 0022 [ 49]: 599e65781b30edae +Block 0022 [ 50]: 30371e95d33a8566 +Block 0022 [ 51]: ef8cdbb7b77acf52 +Block 0022 [ 52]: 7e62aa6c33002015 +Block 0022 [ 53]: b79f8344f4aca7d2 +Block 0022 [ 54]: c306c71173828957 +Block 0022 [ 55]: 04ec0a2cea3ca2be +Block 0022 [ 56]: 669ed752935e38de +Block 0022 [ 57]: e41e57dad7e38479 +Block 0022 [ 58]: f68f6869312acf69 +Block 0022 [ 59]: d2e9eef906a6e5da +Block 0022 [ 60]: 3dc8f02bf675a71c +Block 0022 [ 61]: fe05d48e00d632d7 +Block 0022 [ 62]: 7f2dee8ee9900bbe +Block 0022 [ 63]: 7d499069dfe3f84a +Block 0022 [ 64]: efc16839f74bd528 +Block 0022 [ 65]: 85a573fa646a7922 +Block 0022 [ 66]: 739f50e997638d43 +Block 0022 [ 67]: 02d0f0e636f1ead4 +Block 0022 [ 68]: fb0925efa1e52cd4 +Block 0022 [ 69]: c46b1cf1f1a59a8d +Block 0022 [ 70]: 1ffb7a7a2402392b +Block 0022 [ 71]: 95694bedb94e49a4 +Block 0022 [ 72]: bf6b98b553e545c9 +Block 0022 [ 73]: 024b23922c08cbf6 +Block 0022 [ 74]: e942a9619f377d06 +Block 0022 [ 75]: 845346bd3d6ed087 +Block 0022 [ 76]: 811557cc8ed4cdf5 +Block 0022 [ 77]: 2596c4bef0b39380 +Block 0022 [ 78]: 00b3ec347bc265b8 +Block 0022 [ 79]: 3e3f1e7f786c1514 +Block 0022 [ 80]: 40c8998c013651cd +Block 0022 [ 81]: 424ada87053d72ca +Block 0022 [ 82]: 135f12196de93fd1 +Block 0022 [ 83]: 85d71d71a38da084 +Block 0022 [ 84]: b2c2e83ce6bf68be +Block 0022 [ 85]: c00799ccb83f163b +Block 0022 [ 86]: 23d14becef3b11d3 +Block 0022 [ 87]: 436c07c01f94bcd7 +Block 0022 [ 88]: 182e68a627907240 +Block 0022 [ 89]: 3049fbea32141bbb +Block 0022 [ 90]: 6ad0528debcec2bc +Block 0022 [ 91]: 8b49f103c0010c3c +Block 0022 [ 92]: 2ad22e691ed79870 +Block 0022 [ 93]: fca9c54f859e2927 +Block 0022 [ 94]: 11e276466ab8bcfa +Block 0022 [ 95]: 001174f7b1c4f6a5 +Block 0022 [ 96]: e237f3a569ede1c8 +Block 0022 [ 97]: 2199033ff0c87b70 +Block 0022 [ 98]: 46ca834e676152d3 +Block 0022 [ 99]: b90b08ea4b9b1272 +Block 0022 [100]: ddba70ef01abc23b +Block 0022 [101]: 8a7f67c932bfa0c2 +Block 0022 [102]: 6c8e92f6a8b41c30 +Block 0022 [103]: d8de541588bd27cb +Block 0022 [104]: bd72f5b7c21c327f +Block 0022 [105]: 9bbca4fe9883b002 +Block 0022 [106]: 1e17e97459704a3d +Block 0022 [107]: 1b5e1bb4d628e734 +Block 0022 [108]: 4164a672d7f37337 +Block 0022 [109]: 79202876a4e1d434 +Block 0022 [110]: 83a60d1ae8b4d69d +Block 0022 [111]: be992378e10ae871 +Block 0022 [112]: 8ef05f200cc7a9b8 +Block 0022 [113]: 8e3b8ecbd99494f3 +Block 0022 [114]: 8be8f5e9977fb07b +Block 0022 [115]: 6562a43f5eee838a +Block 0022 [116]: 278de9718e90574d +Block 0022 [117]: 09976190662a1bc6 +Block 0022 [118]: f8bc98e4c7f01f71 +Block 0022 [119]: 1f5b6162280592b1 +Block 0022 [120]: 93c35337d2f78dd8 +Block 0022 [121]: fba0e65ae8ad86a8 +Block 0022 [122]: bb080e690d538029 +Block 0022 [123]: cd914b9a50bc983c +Block 0022 [124]: b86bb82fbb02716f +Block 0022 [125]: 69debb138546a813 +Block 0022 [126]: 5573bba3fa50b093 +Block 0022 [127]: e0486d1e7e4ba4d2 +Block 0023 [ 0]: 4c2e8bfde4858256 +Block 0023 [ 1]: 0e27b8df1a7bfd63 +Block 0023 [ 2]: 0ca3b35943cf7423 +Block 0023 [ 3]: b409995a80af9766 +Block 0023 [ 4]: 27cfac08e2e49ad8 +Block 0023 [ 5]: 8a6e4f3e271e25a0 +Block 0023 [ 6]: c71594856a479dac +Block 0023 [ 7]: 506f4270ed9605f4 +Block 0023 [ 8]: 2e7c70c26839396b +Block 0023 [ 9]: 0b20f649d9523165 +Block 0023 [ 10]: 543e217485c0abeb +Block 0023 [ 11]: 0cb1abcc888e01c8 +Block 0023 [ 12]: 9d6360c15dcb2600 +Block 0023 [ 13]: 3f16dbb1f886001a +Block 0023 [ 14]: ec9b7d4980243fca +Block 0023 [ 15]: afdfec256cbf0b7a +Block 0023 [ 16]: 8f584e724b650a88 +Block 0023 [ 17]: c413f1aba32cc4eb +Block 0023 [ 18]: 17d545f8b2e64314 +Block 0023 [ 19]: 9068a6d6ce974e4e +Block 0023 [ 20]: d6b452deab39ca75 +Block 0023 [ 21]: 59218d12cab0af33 +Block 0023 [ 22]: ed19b3667f1fbba8 +Block 0023 [ 23]: 93a226a16d6bb59e +Block 0023 [ 24]: 0de268264746dc53 +Block 0023 [ 25]: 42bec86aa16652c4 +Block 0023 [ 26]: a17a4df361e17dc5 +Block 0023 [ 27]: 2ca05b04344c29f6 +Block 0023 [ 28]: 15ec2ac7c425d01e +Block 0023 [ 29]: 98723a73be5c449d +Block 0023 [ 30]: fac664e9b515c24d +Block 0023 [ 31]: 667c74be9cfbf2de +Block 0023 [ 32]: de3851fc81a42170 +Block 0023 [ 33]: 4d9afc9e7d1dba49 +Block 0023 [ 34]: 8380e0274161b55c +Block 0023 [ 35]: 3b3f74f7b1ffdc7d +Block 0023 [ 36]: af8146b72185e1b1 +Block 0023 [ 37]: 045c8173a0ca5e9b +Block 0023 [ 38]: 6b9462d3a3079ca7 +Block 0023 [ 39]: 91a29181d7aee397 +Block 0023 [ 40]: 1f78f53cba1cfb53 +Block 0023 [ 41]: a4ecd6402fe982b2 +Block 0023 [ 42]: 52290de77a77a30b +Block 0023 [ 43]: 8636b59fdfc2628a +Block 0023 [ 44]: e981e9ef1efd52fa +Block 0023 [ 45]: 2daceec89e9e75d8 +Block 0023 [ 46]: 7553a6b86c1bd3b4 +Block 0023 [ 47]: 8d2703641eaabd8e +Block 0023 [ 48]: a7d768e9c39c2fcd +Block 0023 [ 49]: f1857f0b55b6f379 +Block 0023 [ 50]: db895bb3f18d46d9 +Block 0023 [ 51]: 04a5007ada435091 +Block 0023 [ 52]: 3f70592bbaa98b62 +Block 0023 [ 53]: 8b67d0d8abbe328e +Block 0023 [ 54]: ea7474021a650668 +Block 0023 [ 55]: e90347a7acaf41af +Block 0023 [ 56]: 37c7a4f487483706 +Block 0023 [ 57]: 6f854c4fa348730f +Block 0023 [ 58]: 783761eea411efa2 +Block 0023 [ 59]: d2f84fffdc1c2dab +Block 0023 [ 60]: 15876740b2afeca4 +Block 0023 [ 61]: 42df2017f6cb0cd6 +Block 0023 [ 62]: da2288c5b587b656 +Block 0023 [ 63]: 8fc504318b434fb2 +Block 0023 [ 64]: be72c16924931758 +Block 0023 [ 65]: 5eb26ba68f62fb65 +Block 0023 [ 66]: a026b7c625a26eaa +Block 0023 [ 67]: e37dcfbbd3416388 +Block 0023 [ 68]: dc52d59c0b02448d +Block 0023 [ 69]: 935543a8846025b2 +Block 0023 [ 70]: d60143cd0a4b3cef +Block 0023 [ 71]: 86f7efa204af95ac +Block 0023 [ 72]: 2b6f6816679f91d1 +Block 0023 [ 73]: 94e6182998b96b54 +Block 0023 [ 74]: 93e73bf0f0105569 +Block 0023 [ 75]: da13f18e4c0cb699 +Block 0023 [ 76]: 870448ce3efa8548 +Block 0023 [ 77]: 4a6416a905d86b3e +Block 0023 [ 78]: 1fe58f6a54047cca +Block 0023 [ 79]: f42edddfef0201d4 +Block 0023 [ 80]: f2a9f93e5ea486d2 +Block 0023 [ 81]: b9d1604eb4f52307 +Block 0023 [ 82]: 56c5d663e18af644 +Block 0023 [ 83]: 162302f10139e362 +Block 0023 [ 84]: 0042db324df502f2 +Block 0023 [ 85]: 28495f12c64d8cd5 +Block 0023 [ 86]: e3fe80b267e1b630 +Block 0023 [ 87]: 641544818559128f +Block 0023 [ 88]: ab828451acaf5169 +Block 0023 [ 89]: ec86a3fd707ed0e1 +Block 0023 [ 90]: 3eb5572a1e406ab5 +Block 0023 [ 91]: c6cc09d3d4fb0e82 +Block 0023 [ 92]: 4738b1bb726b069c +Block 0023 [ 93]: 317e2a78a9908215 +Block 0023 [ 94]: a63c7f3cb168d444 +Block 0023 [ 95]: 9b17d567889390ef +Block 0023 [ 96]: 3d4bc23a26789e48 +Block 0023 [ 97]: a43b551c6e1bfc15 +Block 0023 [ 98]: ed2b8686fe6304d9 +Block 0023 [ 99]: 00620e444100bd23 +Block 0023 [100]: a43f1dd9f630d8e3 +Block 0023 [101]: d64b5dcd78d0fa09 +Block 0023 [102]: 870ff475afc7e794 +Block 0023 [103]: 11224ada8d5df827 +Block 0023 [104]: 20c39bc4cd167cb7 +Block 0023 [105]: 88d5cd35be323b5c +Block 0023 [106]: e3b289bb6a505cd3 +Block 0023 [107]: 40c9a2a625417bb5 +Block 0023 [108]: 2878a1103bcb1215 +Block 0023 [109]: 622d767c09fe18f5 +Block 0023 [110]: e00be87cbb6151cd +Block 0023 [111]: 68629d325a0095a8 +Block 0023 [112]: b49cb38fbb6a6518 +Block 0023 [113]: 86c32eebbd93b831 +Block 0023 [114]: 6d490907ad5e39cc +Block 0023 [115]: 610a7fa27d41f3ec +Block 0023 [116]: 491fd646a4be24dc +Block 0023 [117]: d2b3f507e79ddbbf +Block 0023 [118]: 9bafa9c11b16eac1 +Block 0023 [119]: cc2c7a70a9326714 +Block 0023 [120]: da03090b736421a2 +Block 0023 [121]: c78c8bf47b2fa258 +Block 0023 [122]: 6b40c85c5a3ef0b6 +Block 0023 [123]: 039e611fd2f43f50 +Block 0023 [124]: 4d96dc1301e43a45 +Block 0023 [125]: f9390676244bb1b4 +Block 0023 [126]: 541447043f38c5a7 +Block 0023 [127]: 9fa74c869aedb58f +Block 0024 [ 0]: 1b6d97f364ab1346 +Block 0024 [ 1]: 687c08189d7efe5d +Block 0024 [ 2]: 6e2970046223f59a +Block 0024 [ 3]: 201784f74072fc2a +Block 0024 [ 4]: 2d2547403935e57b +Block 0024 [ 5]: 7d853338f6589465 +Block 0024 [ 6]: 9da8aead5eea47d6 +Block 0024 [ 7]: 4cb61307518d7fbe +Block 0024 [ 8]: 0bd6df24105219cb +Block 0024 [ 9]: 9e3c1a1c459a1560 +Block 0024 [ 10]: c4afb9befd5c4615 +Block 0024 [ 11]: 35cc8bb5890e32fd +Block 0024 [ 12]: 42d369e59a7bbf15 +Block 0024 [ 13]: ed7a3c27e46f61d2 +Block 0024 [ 14]: 9ae3d245b38ff4ac +Block 0024 [ 15]: 6606075547aec2c7 +Block 0024 [ 16]: 87cf9c94c0c06f9a +Block 0024 [ 17]: 33cc104c0a1e67cd +Block 0024 [ 18]: 95b65f1410712d0d +Block 0024 [ 19]: e5a685c8d48d8bfe +Block 0024 [ 20]: 6e3f226d46a8825a +Block 0024 [ 21]: 1b040014d7aa884b +Block 0024 [ 22]: ca62adf20dafce90 +Block 0024 [ 23]: 4be470b0fa205479 +Block 0024 [ 24]: 24308ae259e78652 +Block 0024 [ 25]: a22865e6df84c43d +Block 0024 [ 26]: 8a257435179ef5f3 +Block 0024 [ 27]: 7528d2d048b63094 +Block 0024 [ 28]: 52d6b0bbae33dd91 +Block 0024 [ 29]: b786b9bf3f260a14 +Block 0024 [ 30]: 8022252f3494ac9d +Block 0024 [ 31]: f08b21f7dbed0caa +Block 0024 [ 32]: f2746d7321fc2375 +Block 0024 [ 33]: bd6d6dcc95880acc +Block 0024 [ 34]: a19e4304559ba8bf +Block 0024 [ 35]: 10ff706c1856688a +Block 0024 [ 36]: 3f63ed9e8363333f +Block 0024 [ 37]: 1fd49162c4817b52 +Block 0024 [ 38]: ddc70fc91fc43c97 +Block 0024 [ 39]: ae180ca44f1e9390 +Block 0024 [ 40]: a09e0ce6f7ca33e4 +Block 0024 [ 41]: ebc444a5cabb3206 +Block 0024 [ 42]: 5519bd49fa0d4d48 +Block 0024 [ 43]: 4f3ec96c151d6a1d +Block 0024 [ 44]: 2e7e65ad9de4611d +Block 0024 [ 45]: e29c6024528a1481 +Block 0024 [ 46]: e70eaf44fb8dbdac +Block 0024 [ 47]: a20804e6afabfd4a +Block 0024 [ 48]: abec4c52a6ba54f8 +Block 0024 [ 49]: f18776eceb179fc3 +Block 0024 [ 50]: 71c5b59ff02c64d5 +Block 0024 [ 51]: 0eb62ddb7c7b9898 +Block 0024 [ 52]: 78e7cf44557ed070 +Block 0024 [ 53]: dcf3718610a69b15 +Block 0024 [ 54]: d2aee39a8abc74fb +Block 0024 [ 55]: d8eca1f46bc06ae0 +Block 0024 [ 56]: c20ddf556d469215 +Block 0024 [ 57]: 77d2fce63b53504d +Block 0024 [ 58]: ca0f78a6db59b782 +Block 0024 [ 59]: e08630201e93844b +Block 0024 [ 60]: 011b122308a2ad54 +Block 0024 [ 61]: 989563a37aa0250b +Block 0024 [ 62]: 50c69b16e0c3aae4 +Block 0024 [ 63]: 61738db62009e68e +Block 0024 [ 64]: 4fee029f50b9ad21 +Block 0024 [ 65]: 59e8d0db17da305e +Block 0024 [ 66]: b6077aa1ca0d36c6 +Block 0024 [ 67]: f469a0199cb637ea +Block 0024 [ 68]: 6d644a367fed3a78 +Block 0024 [ 69]: 40c2ebf12ced7376 +Block 0024 [ 70]: b0f9f1af56f200d4 +Block 0024 [ 71]: 9c470579f03b27ec +Block 0024 [ 72]: 29ef27bb4e7261df +Block 0024 [ 73]: 3bb0c11596f105a7 +Block 0024 [ 74]: 831e6117a872ef3f +Block 0024 [ 75]: 141586a939871928 +Block 0024 [ 76]: de05c66973c18f61 +Block 0024 [ 77]: bb04e9de901e6e4b +Block 0024 [ 78]: f209934886855554 +Block 0024 [ 79]: f205f3433fc48384 +Block 0024 [ 80]: 1a91e7fc0f8f7add +Block 0024 [ 81]: 2ef9e4a071709634 +Block 0024 [ 82]: 32a6d71c4c162cd8 +Block 0024 [ 83]: 40cd26eb6ff34e7e +Block 0024 [ 84]: 1bf4edf9fe9811f2 +Block 0024 [ 85]: 5bbb164291c455e4 +Block 0024 [ 86]: a3bb18b302a9a9f7 +Block 0024 [ 87]: 7ac7d717cd014cc8 +Block 0024 [ 88]: 3355afbd7da534fd +Block 0024 [ 89]: 0d488eddc9478451 +Block 0024 [ 90]: 2192fd7c8f12f985 +Block 0024 [ 91]: 77cd72d33cf5cf87 +Block 0024 [ 92]: 11c0fadc29eade8b +Block 0024 [ 93]: af3078c91e0e86fc +Block 0024 [ 94]: 857211547a0b3253 +Block 0024 [ 95]: b5600bb399a4fec3 +Block 0024 [ 96]: 57bef31e17560d76 +Block 0024 [ 97]: fc89b941ffcde649 +Block 0024 [ 98]: ad3fbfb2612cc072 +Block 0024 [ 99]: 0768c44e8e79642f +Block 0024 [100]: fa82a7fc94531b44 +Block 0024 [101]: f4c591741e03ce27 +Block 0024 [102]: 601142b021e0d820 +Block 0024 [103]: 1b3a2508c3b26062 +Block 0024 [104]: b987bbaf19cdb37f +Block 0024 [105]: 8b4af1e25c892610 +Block 0024 [106]: 7951909eefee86df +Block 0024 [107]: 2cb36e418dcbe252 +Block 0024 [108]: b51abea53ca30724 +Block 0024 [109]: 14e49911570af91f +Block 0024 [110]: a00c4c240bb7249b +Block 0024 [111]: 451fe680abefa587 +Block 0024 [112]: 5369dfc1b916d153 +Block 0024 [113]: 1761ff4a62d7d45e +Block 0024 [114]: 151c216f3c1944ef +Block 0024 [115]: 7a185bbcdd0531fc +Block 0024 [116]: c700e6047cc7a9ce +Block 0024 [117]: 6ea92ecf27030984 +Block 0024 [118]: ecc7bf426636fcde +Block 0024 [119]: 38b9bd46560f0b1b +Block 0024 [120]: 346e7252c870ee10 +Block 0024 [121]: 3aa8d6c44e60d291 +Block 0024 [122]: f9dd7a421fb3d07c +Block 0024 [123]: ff85282feda3cd60 +Block 0024 [124]: dbfb89e57658dccf +Block 0024 [125]: 5728d16e353ea62b +Block 0024 [126]: 162c91687bbe2588 +Block 0024 [127]: 62180018d170be19 +Block 0025 [ 0]: 9dea98e0f45c8df3 +Block 0025 [ 1]: e718675e0ca9af64 +Block 0025 [ 2]: 2a200f968940a3e6 +Block 0025 [ 3]: 7c56da29d7d510af +Block 0025 [ 4]: 5b519939866bfefc +Block 0025 [ 5]: 134b855183457280 +Block 0025 [ 6]: 170ac5fed0cb9ee0 +Block 0025 [ 7]: d0a9bacf2034d21a +Block 0025 [ 8]: 00fce08c97ef87e0 +Block 0025 [ 9]: 9aa0041eaa7ad61f +Block 0025 [ 10]: 407a94b0a313e995 +Block 0025 [ 11]: b955191be75b7b24 +Block 0025 [ 12]: 316c31961ddff5f3 +Block 0025 [ 13]: 02a21a3bbbc4a5fe +Block 0025 [ 14]: 55fb14c755cd390d +Block 0025 [ 15]: 2a4b331d7df48c4e +Block 0025 [ 16]: 1be3b27043f0361f +Block 0025 [ 17]: f5c84613bd424fbe +Block 0025 [ 18]: e83919e013bef260 +Block 0025 [ 19]: 8fbdd74b3ffd0c32 +Block 0025 [ 20]: 066215f05844ab4d +Block 0025 [ 21]: 7b621ea46579b6bb +Block 0025 [ 22]: f3204a3744956a24 +Block 0025 [ 23]: 21428bee28221146 +Block 0025 [ 24]: 9f3eda1b1cb2a9af +Block 0025 [ 25]: baedddaa0cad8da8 +Block 0025 [ 26]: 6fdda68a32b9d387 +Block 0025 [ 27]: 5f1e005ced3c19e1 +Block 0025 [ 28]: cff1336476a4540b +Block 0025 [ 29]: a6be6f21ed834472 +Block 0025 [ 30]: 54f1db5d11d1874b +Block 0025 [ 31]: e0973ae921ea1ec6 +Block 0025 [ 32]: 54026fec00959adf +Block 0025 [ 33]: f355788737a4226d +Block 0025 [ 34]: 08eb52c06424d35e +Block 0025 [ 35]: 4c51dd52a31b3a25 +Block 0025 [ 36]: 8d6fb8828dc93960 +Block 0025 [ 37]: 9ca7d3414f6be751 +Block 0025 [ 38]: 5536071059f29bd0 +Block 0025 [ 39]: 212d31590dc55ff4 +Block 0025 [ 40]: 00160f22408fe1bf +Block 0025 [ 41]: 2ae2d51e4ef4fc38 +Block 0025 [ 42]: 3197ecb672fd06fb +Block 0025 [ 43]: f1291d96197e5455 +Block 0025 [ 44]: aabd77ecd5f9cf74 +Block 0025 [ 45]: ea21b4064dfcddbf +Block 0025 [ 46]: 7fe4679308b95d5b +Block 0025 [ 47]: 719cae719c25851f +Block 0025 [ 48]: 88cb63475ddd958a +Block 0025 [ 49]: e8def05e2a50961b +Block 0025 [ 50]: 3306b43d445e0c6c +Block 0025 [ 51]: 1a0ee61add088b04 +Block 0025 [ 52]: ebeb156ec51a9240 +Block 0025 [ 53]: 03998909b2b26e65 +Block 0025 [ 54]: 94d90f46e365b989 +Block 0025 [ 55]: fdc410a5ceccff31 +Block 0025 [ 56]: 557cc6b7afa5ae1f +Block 0025 [ 57]: 92045147a4608d29 +Block 0025 [ 58]: f24cd61d05340a80 +Block 0025 [ 59]: e8a771bb3e64ba20 +Block 0025 [ 60]: ea7a859223d8c1be +Block 0025 [ 61]: e0ed40a0864b6654 +Block 0025 [ 62]: cdca027f76da810d +Block 0025 [ 63]: 3e90ca16f87f8c64 +Block 0025 [ 64]: ada45048fa983c11 +Block 0025 [ 65]: 71676d391911b13a +Block 0025 [ 66]: 1d50c778ba2a1e16 +Block 0025 [ 67]: ee2174c9cfc78c55 +Block 0025 [ 68]: 4e649a15999421b4 +Block 0025 [ 69]: 283b514d302de05f +Block 0025 [ 70]: 0e5ffdfdd82c65aa +Block 0025 [ 71]: b05c24c95c134893 +Block 0025 [ 72]: 2d23b161436d607c +Block 0025 [ 73]: d191b4dfbc763bbc +Block 0025 [ 74]: 0fc53094eda325ab +Block 0025 [ 75]: 1e73613359daf5e9 +Block 0025 [ 76]: dadf7d0cd21e9f95 +Block 0025 [ 77]: d738d1a27daecafa +Block 0025 [ 78]: 31f8765d2324fbfb +Block 0025 [ 79]: 4db749e5e1e91ce3 +Block 0025 [ 80]: 312f948729f66ff9 +Block 0025 [ 81]: fe2b219ac8c6af11 +Block 0025 [ 82]: 947e787f9c64e091 +Block 0025 [ 83]: 49378284ecd531d5 +Block 0025 [ 84]: 061fbf2e83dfb196 +Block 0025 [ 85]: e065a3bb91f47c0a +Block 0025 [ 86]: 0bac9c6e8ddad59e +Block 0025 [ 87]: 82458709614459a1 +Block 0025 [ 88]: 184b5ba3476a00d8 +Block 0025 [ 89]: ac35cdb330809819 +Block 0025 [ 90]: 4164015963e94a50 +Block 0025 [ 91]: 5b49db84037e46ca +Block 0025 [ 92]: eccb81844e039636 +Block 0025 [ 93]: 94a259a089ebb6ee +Block 0025 [ 94]: c8365c576d7ca7e4 +Block 0025 [ 95]: 9600a395ee895e92 +Block 0025 [ 96]: d3f2a00d550f507e +Block 0025 [ 97]: 245198c21c2c6ae8 +Block 0025 [ 98]: 057f8dce7f761c0e +Block 0025 [ 99]: 3b88913083dda199 +Block 0025 [100]: c5eb496e745c47cb +Block 0025 [101]: 6a13fe3ee998220d +Block 0025 [102]: e44904f23834ebd5 +Block 0025 [103]: acaf928c769a8852 +Block 0025 [104]: 0866087633969633 +Block 0025 [105]: 8dd5b1dde3b06956 +Block 0025 [106]: 29f3bd382a42c2a5 +Block 0025 [107]: 29ea43a5a960be6b +Block 0025 [108]: 164710ec5da538da +Block 0025 [109]: 4e8d7d1fe9563032 +Block 0025 [110]: a920e54e66141df0 +Block 0025 [111]: 09d93900fd84dbb7 +Block 0025 [112]: 007245b49a574c20 +Block 0025 [113]: 595c4a0e5a8d9914 +Block 0025 [114]: fd3b2741644d6845 +Block 0025 [115]: 97ff3f94b0ac27c7 +Block 0025 [116]: c1c2efb0b9d18aaf +Block 0025 [117]: 22abb5fd2ecc9e62 +Block 0025 [118]: 3c41db1bdead501a +Block 0025 [119]: c0f75a3fdbbd361c +Block 0025 [120]: e36a235924b7cd2b +Block 0025 [121]: 92f3a12daa934ab9 +Block 0025 [122]: c0e1da579eebdbe1 +Block 0025 [123]: b1ac487a725cdb21 +Block 0025 [124]: a39fab7029df3ed7 +Block 0025 [125]: 7b8fe4524db844eb +Block 0025 [126]: b7fdf1a6ca4ff258 +Block 0025 [127]: f68cf7b80de6823a +Block 0026 [ 0]: c1b768e4ab523978 +Block 0026 [ 1]: 5521d67bc3751eeb +Block 0026 [ 2]: a123beff943e992f +Block 0026 [ 3]: a481f25f5c200f65 +Block 0026 [ 4]: ce26d5b7c8bee62f +Block 0026 [ 5]: 7f2072875ee51d8d +Block 0026 [ 6]: caf87e7d0df6e37d +Block 0026 [ 7]: e651b78783205174 +Block 0026 [ 8]: 614321f79276d222 +Block 0026 [ 9]: f9f78652a5bb3bfa +Block 0026 [ 10]: 53d925d442ea4557 +Block 0026 [ 11]: 312a5b33795050b7 +Block 0026 [ 12]: cba5769f359671c5 +Block 0026 [ 13]: 93c2a858f246f896 +Block 0026 [ 14]: 5f3eb206646804d1 +Block 0026 [ 15]: 16e5ecd1c0ad3301 +Block 0026 [ 16]: 8bdf8382b5f2b3ed +Block 0026 [ 17]: 045c403db709d4f0 +Block 0026 [ 18]: ee934246f22072af +Block 0026 [ 19]: 0f70f344e2c9f578 +Block 0026 [ 20]: 0901b57afe2fadc3 +Block 0026 [ 21]: 7dfed2e4a595459d +Block 0026 [ 22]: fc78ee1cda513a1f +Block 0026 [ 23]: deb4abff7339b932 +Block 0026 [ 24]: f6332454f63314a5 +Block 0026 [ 25]: 261c97b58a557f94 +Block 0026 [ 26]: 26bda71112c57f76 +Block 0026 [ 27]: 63c9cdc690144e61 +Block 0026 [ 28]: 228b202353c930f1 +Block 0026 [ 29]: cd5b0960c4c9a6b9 +Block 0026 [ 30]: f4e6d387d6d7d453 +Block 0026 [ 31]: f54ab733b2f25833 +Block 0026 [ 32]: cc6e4118a0ef810b +Block 0026 [ 33]: 03f01fdf18ea4cba +Block 0026 [ 34]: 5cb4f724e790eaff +Block 0026 [ 35]: 5979ac899ca55c44 +Block 0026 [ 36]: c74ef1a91d4deb67 +Block 0026 [ 37]: e0fc99d3c50934c9 +Block 0026 [ 38]: e2df12194bd1fa08 +Block 0026 [ 39]: 12f4b8caf4503184 +Block 0026 [ 40]: cec9dffaa4d18089 +Block 0026 [ 41]: 613ae59272234838 +Block 0026 [ 42]: cd20d01802e789eb +Block 0026 [ 43]: 710c8602eced8907 +Block 0026 [ 44]: 77c6c58846a6b8e5 +Block 0026 [ 45]: b42064e5052fd0c9 +Block 0026 [ 46]: a442a14edaf934f0 +Block 0026 [ 47]: e36aa911fc51365e +Block 0026 [ 48]: 08994423dd52d9e2 +Block 0026 [ 49]: 3af306d20f71a362 +Block 0026 [ 50]: ddd19978ffbfc195 +Block 0026 [ 51]: a98d1c2853b66a7f +Block 0026 [ 52]: bcfa8f96df34ce90 +Block 0026 [ 53]: aac16a4e7790de1f +Block 0026 [ 54]: cb58692620dfdf6e +Block 0026 [ 55]: 0a159b6511e3ef66 +Block 0026 [ 56]: 37e2a3cec5bfa151 +Block 0026 [ 57]: 790c8919db0afb67 +Block 0026 [ 58]: 0db6896dad7786e0 +Block 0026 [ 59]: 1c508ba2eb33c916 +Block 0026 [ 60]: 7813ac676e47bbd0 +Block 0026 [ 61]: c0c1f531f081a1db +Block 0026 [ 62]: cb790687688c62c9 +Block 0026 [ 63]: 63817244e76d9501 +Block 0026 [ 64]: 26bfb652cc6bdedc +Block 0026 [ 65]: e22e045baa9da7f3 +Block 0026 [ 66]: 302ba10d58dea506 +Block 0026 [ 67]: bba2d7cb5a6c5f63 +Block 0026 [ 68]: d0e81de1bcebf888 +Block 0026 [ 69]: 85afaa8d746c4ad2 +Block 0026 [ 70]: 9d4553d7e1930919 +Block 0026 [ 71]: 7928f64d08bca456 +Block 0026 [ 72]: c05167e3574c5123 +Block 0026 [ 73]: 3279ee18661433d2 +Block 0026 [ 74]: e9e16e636967561a +Block 0026 [ 75]: 34b50294012f9026 +Block 0026 [ 76]: a6706d61a88b965b +Block 0026 [ 77]: b194e35bfb3322be +Block 0026 [ 78]: 9eb1502169ed7f53 +Block 0026 [ 79]: 9ffba512e785acc2 +Block 0026 [ 80]: ad74a73d057a68f1 +Block 0026 [ 81]: d13ad830ec250f12 +Block 0026 [ 82]: 89990d03fcda5d40 +Block 0026 [ 83]: 7f41fe42aab938af +Block 0026 [ 84]: e7b12c40b212bedb +Block 0026 [ 85]: 2271c1588b468df4 +Block 0026 [ 86]: 214975ca6aa32f35 +Block 0026 [ 87]: f0c6aa78d1f1c858 +Block 0026 [ 88]: aaabaf4a63267c00 +Block 0026 [ 89]: 03898ff8906d365f +Block 0026 [ 90]: baa52fe008c7c1eb +Block 0026 [ 91]: 5eb08154e5a18442 +Block 0026 [ 92]: 739afe1d946e5da4 +Block 0026 [ 93]: fd3f3c47a107f99b +Block 0026 [ 94]: a0ae9aae60e91db4 +Block 0026 [ 95]: 688a0f505ad71c75 +Block 0026 [ 96]: e400ef9ef47fbc41 +Block 0026 [ 97]: d4d61a48f3ca6b9e +Block 0026 [ 98]: dc46bcdcae323a05 +Block 0026 [ 99]: 70eb928f22f91eb7 +Block 0026 [100]: 3356b17622be880c +Block 0026 [101]: b26b8de5b961f86d +Block 0026 [102]: c88d10e282a6c105 +Block 0026 [103]: d1a4fa0df2642bbc +Block 0026 [104]: 3c2eb1be6a990b63 +Block 0026 [105]: 7698318905e3d24b +Block 0026 [106]: 25069d30ab91d51c +Block 0026 [107]: 00d22156781af202 +Block 0026 [108]: 872c784c0766ef3f +Block 0026 [109]: 59c0caaad7afb6e5 +Block 0026 [110]: f577e87ab65ef4b8 +Block 0026 [111]: 5f6511ad9970b9f6 +Block 0026 [112]: efd260e4b49fb223 +Block 0026 [113]: ecb1c4b543007a9f +Block 0026 [114]: e9ab27fc3b6f5843 +Block 0026 [115]: 202737490e645c2d +Block 0026 [116]: d56b3e3b827021ca +Block 0026 [117]: 64b68ff331ac5aa9 +Block 0026 [118]: 8cbf36f00083ff2a +Block 0026 [119]: 274ea8aa43adcd0a +Block 0026 [120]: b238ae985e018099 +Block 0026 [121]: c333b2c0e3794b74 +Block 0026 [122]: 7c63f863700f6744 +Block 0026 [123]: b01f279d312af042 +Block 0026 [124]: 5450528f718101e2 +Block 0026 [125]: 8e121c1018d5a808 +Block 0026 [126]: 09f735d16f02fd17 +Block 0026 [127]: 30bdbd4ab589600d +Block 0027 [ 0]: dfb1b7b6e19fef45 +Block 0027 [ 1]: 8a7e2af24e969d87 +Block 0027 [ 2]: 6b743c2dece928b4 +Block 0027 [ 3]: 50275017b269ff38 +Block 0027 [ 4]: fb3756653d2a67d3 +Block 0027 [ 5]: 96b0005894cb9c6f +Block 0027 [ 6]: c77260686102fe4b +Block 0027 [ 7]: 7b4db34395d8d4cc +Block 0027 [ 8]: 6cf098719acb748e +Block 0027 [ 9]: 9f8a882796d1ed33 +Block 0027 [ 10]: d41a525bbf224af7 +Block 0027 [ 11]: 5965acbb144b0ffd +Block 0027 [ 12]: bb174761b0489258 +Block 0027 [ 13]: 2c4b9428c0e54b03 +Block 0027 [ 14]: 3a070ae66305b255 +Block 0027 [ 15]: 31a6e4f4060f33f4 +Block 0027 [ 16]: 67d29285c6b81359 +Block 0027 [ 17]: 1d97e1e82c4bb8ec +Block 0027 [ 18]: 9147a224773267be +Block 0027 [ 19]: cada23a7599100e8 +Block 0027 [ 20]: 39f654ca5affb557 +Block 0027 [ 21]: 653e55fb1fe7d98d +Block 0027 [ 22]: 1fe150b6c5e568df +Block 0027 [ 23]: 11b04652c7425426 +Block 0027 [ 24]: 51ed5eab1d250839 +Block 0027 [ 25]: a157a2654e2f31a7 +Block 0027 [ 26]: 5ac42844add3bfd4 +Block 0027 [ 27]: 092ea7ad07912ed6 +Block 0027 [ 28]: 57be83c5dd581252 +Block 0027 [ 29]: a4150638b5232b78 +Block 0027 [ 30]: 91baf1e273f3292b +Block 0027 [ 31]: 279ddb9ae0f59685 +Block 0027 [ 32]: e1ede6b23ac6ce30 +Block 0027 [ 33]: b65d7f1aceaa298b +Block 0027 [ 34]: 1356d0e6ae4203b4 +Block 0027 [ 35]: b162f2dbe36e9099 +Block 0027 [ 36]: d2efeae7e4eb03bf +Block 0027 [ 37]: 10cd45bd5b941710 +Block 0027 [ 38]: 45ee2d5ff2910df1 +Block 0027 [ 39]: 9e31c67dcc63a2f8 +Block 0027 [ 40]: 6d4047eb18b27369 +Block 0027 [ 41]: 319096d6062b8482 +Block 0027 [ 42]: bc1d42249ce2caba +Block 0027 [ 43]: 95e6c2ecdf193df3 +Block 0027 [ 44]: f581c15ed36c2773 +Block 0027 [ 45]: d09f6bdfe41d9deb +Block 0027 [ 46]: 63359723da79b1ec +Block 0027 [ 47]: b014e747082bed32 +Block 0027 [ 48]: d4fcea83c8489367 +Block 0027 [ 49]: 79264c6a13f6d74b +Block 0027 [ 50]: 23a98835209cb37d +Block 0027 [ 51]: 55cf27731bc71b54 +Block 0027 [ 52]: 579d23c3c8f0d874 +Block 0027 [ 53]: c2d9c527760854e5 +Block 0027 [ 54]: b67733a70e32c7a5 +Block 0027 [ 55]: bf3c8adda26c4378 +Block 0027 [ 56]: 9a4e6986727599a7 +Block 0027 [ 57]: 5d23ac243a3758b7 +Block 0027 [ 58]: 98f6bf7a738c86f1 +Block 0027 [ 59]: 9e6727d5968272f9 +Block 0027 [ 60]: cecb900fe87b7449 +Block 0027 [ 61]: 68171bbfeeec88d6 +Block 0027 [ 62]: c8280dab9e0be4f5 +Block 0027 [ 63]: 786dcdfd9f13e110 +Block 0027 [ 64]: 15ac1cc5a67a123f +Block 0027 [ 65]: 8ba78d88911bb074 +Block 0027 [ 66]: 11d81827a8bf57a8 +Block 0027 [ 67]: 293af374772b85e8 +Block 0027 [ 68]: 29043eae6117e07b +Block 0027 [ 69]: 7d8b59384e757a4f +Block 0027 [ 70]: d7eadfa7fa1a057c +Block 0027 [ 71]: 08020d3f2ed7d3e4 +Block 0027 [ 72]: 3ffd01936555240e +Block 0027 [ 73]: 4172d0d76e3a425e +Block 0027 [ 74]: e80b2670c69d0187 +Block 0027 [ 75]: c8b66b9b7589a2c5 +Block 0027 [ 76]: 3da25f6759ac3ced +Block 0027 [ 77]: b8f45a9416f6c2b4 +Block 0027 [ 78]: 6bd3a3df27308217 +Block 0027 [ 79]: 30f61b3b5818ca8e +Block 0027 [ 80]: 563376db56d040f3 +Block 0027 [ 81]: a6123f082a29fe18 +Block 0027 [ 82]: 98361cd23cddfe24 +Block 0027 [ 83]: 0504e44336ddc550 +Block 0027 [ 84]: 12096c9de0473588 +Block 0027 [ 85]: ccb1faa1fc5c3aef +Block 0027 [ 86]: a285d47e4a11135f +Block 0027 [ 87]: 4e3bef96d97d6995 +Block 0027 [ 88]: 28af4e31ac05b822 +Block 0027 [ 89]: 4421ffa284241116 +Block 0027 [ 90]: eff52a0fd5c8d53a +Block 0027 [ 91]: 3c9105b1e792f051 +Block 0027 [ 92]: c6699665bd597fbe +Block 0027 [ 93]: f4e7bf0aa2f4ab6a +Block 0027 [ 94]: 9ea7d6698bcd3d73 +Block 0027 [ 95]: f7070ccfb227cf25 +Block 0027 [ 96]: 0e73f666dea37687 +Block 0027 [ 97]: c14e8d7de7f64630 +Block 0027 [ 98]: 6868515684a2e725 +Block 0027 [ 99]: 206095a669b7650c +Block 0027 [100]: 48dd79ad5aab7562 +Block 0027 [101]: 2b915476af89bedb +Block 0027 [102]: 9c1387f4f1ff6c7d +Block 0027 [103]: a1c3389ebbc7ad3b +Block 0027 [104]: 6cc1fe26cda5ca6e +Block 0027 [105]: 4175a4fbd5406670 +Block 0027 [106]: 2d268ff39496b430 +Block 0027 [107]: f985b90d6a900624 +Block 0027 [108]: da1b3e8a3ee00a3c +Block 0027 [109]: 6dec5419d237ae08 +Block 0027 [110]: 4833bd3dc940c7e2 +Block 0027 [111]: c0b6e96736180b3a +Block 0027 [112]: 764786ef491a21cc +Block 0027 [113]: 6ab8b494951aa58d +Block 0027 [114]: 1654435146879de9 +Block 0027 [115]: 0c7df427e44d2fcb +Block 0027 [116]: ca7a758ad8d8df28 +Block 0027 [117]: e35ce9f1d8f8c51b +Block 0027 [118]: 1ac1d9afec8e66fa +Block 0027 [119]: 57f25346a9fa27e3 +Block 0027 [120]: 2e79157e350d0ac6 +Block 0027 [121]: 92d09dd28f617b33 +Block 0027 [122]: c400341fd1bc382f +Block 0027 [123]: f83172627c338632 +Block 0027 [124]: 6ebf3b078e99f975 +Block 0027 [125]: 76b1b6be911347ce +Block 0027 [126]: f154a593a33de676 +Block 0027 [127]: c4c34f93aa371a57 +Block 0028 [ 0]: 4e2ac80509bca280 +Block 0028 [ 1]: 53717768028a3f68 +Block 0028 [ 2]: e39dc8aca99e6f66 +Block 0028 [ 3]: 53ebffa315286c27 +Block 0028 [ 4]: 705fba0ce74adda1 +Block 0028 [ 5]: 40cf24b7846fbeea +Block 0028 [ 6]: 08e1a9ca69b52556 +Block 0028 [ 7]: 5742721314aa28d7 +Block 0028 [ 8]: a8e7ba94670950ba +Block 0028 [ 9]: d682cbf431183b33 +Block 0028 [ 10]: 6da4c3e4a20f9af4 +Block 0028 [ 11]: 2ee2e501d76c7f47 +Block 0028 [ 12]: 18c76e756851c749 +Block 0028 [ 13]: d7499ec23d51287f +Block 0028 [ 14]: c8a21d3b456ccd9c +Block 0028 [ 15]: e318a0d2dec093f2 +Block 0028 [ 16]: c8387e0d1103811b +Block 0028 [ 17]: cfd9fafc75da3916 +Block 0028 [ 18]: c90d21f4ec27b430 +Block 0028 [ 19]: eb110a88aaf9e8c4 +Block 0028 [ 20]: fe43290e11e97783 +Block 0028 [ 21]: e711badb49e785ae +Block 0028 [ 22]: 47da30f3dfadd77c +Block 0028 [ 23]: 213005e8eaaec1b2 +Block 0028 [ 24]: 0db1337e0939cded +Block 0028 [ 25]: 79402cfac8f41b81 +Block 0028 [ 26]: 8fb206b462d929d3 +Block 0028 [ 27]: 8bf4edccde1b3f5e +Block 0028 [ 28]: 4fb5750fd001ec5f +Block 0028 [ 29]: 6163db3306eb00c3 +Block 0028 [ 30]: cd2ad0bdcba9703a +Block 0028 [ 31]: a989225aa8e9805c +Block 0028 [ 32]: 66af421dbabc751e +Block 0028 [ 33]: 19ca456193827f8e +Block 0028 [ 34]: ae61e6f8e84ea077 +Block 0028 [ 35]: ea6dad1c09cd284e +Block 0028 [ 36]: f958dbaa44014255 +Block 0028 [ 37]: e9c596f3061ad9cf +Block 0028 [ 38]: a743d258c493448e +Block 0028 [ 39]: dfe0ea446e47b64e +Block 0028 [ 40]: 09656df9863a4d0e +Block 0028 [ 41]: 097514eb0e9fdb0b +Block 0028 [ 42]: dd901308afe3324d +Block 0028 [ 43]: 639c721c16fd4955 +Block 0028 [ 44]: 35972be5aa22701b +Block 0028 [ 45]: 351dd3796340bdac +Block 0028 [ 46]: c31bb6ed7ee361e3 +Block 0028 [ 47]: 5163df958fd4e5af +Block 0028 [ 48]: ce6fdf2ae0a10c27 +Block 0028 [ 49]: b8155894b2d469a2 +Block 0028 [ 50]: 2bf15585424c2500 +Block 0028 [ 51]: e3d4b0bf2e7919b5 +Block 0028 [ 52]: 76d4ea66e8e27e9a +Block 0028 [ 53]: 515cd2ae2772ce7b +Block 0028 [ 54]: 679aa73fe2c89064 +Block 0028 [ 55]: 7997086c96c4a813 +Block 0028 [ 56]: 1a7bb444208bd79b +Block 0028 [ 57]: f21833b017a5400e +Block 0028 [ 58]: d266eef93b3490ff +Block 0028 [ 59]: 6f72683f6295d4c8 +Block 0028 [ 60]: caf38a6e397d6771 +Block 0028 [ 61]: ee88b044901a7a00 +Block 0028 [ 62]: cd05fc2e355e9719 +Block 0028 [ 63]: 3eb58642439c07c2 +Block 0028 [ 64]: 37b3c2e8c31b2ac2 +Block 0028 [ 65]: 298497119f560963 +Block 0028 [ 66]: a851e8e9e3d31be3 +Block 0028 [ 67]: 6d2c3bc9bdca1aff +Block 0028 [ 68]: dccbb833daf4fb92 +Block 0028 [ 69]: 5105f182cb32c48a +Block 0028 [ 70]: 7d8fb4b4881034ec +Block 0028 [ 71]: 21ba5176a4d8b744 +Block 0028 [ 72]: ef773853c451d06b +Block 0028 [ 73]: bfcb4fa94cbd866e +Block 0028 [ 74]: 06698214fef5596d +Block 0028 [ 75]: effbd0e63460d9d0 +Block 0028 [ 76]: a3953f6125c44b22 +Block 0028 [ 77]: d7fd87fdb0dc2d43 +Block 0028 [ 78]: 239ea462ebb0534d +Block 0028 [ 79]: 7924c7edc51d7998 +Block 0028 [ 80]: a9a5c86c148c5b83 +Block 0028 [ 81]: 58fa2801a433f66a +Block 0028 [ 82]: 08b6b4a726074921 +Block 0028 [ 83]: 451e8ed1f1c26f8d +Block 0028 [ 84]: 67b6c5ca1214bdad +Block 0028 [ 85]: 68bccd07601599c4 +Block 0028 [ 86]: 44f1d4401f2662f3 +Block 0028 [ 87]: b33dc98b525a1493 +Block 0028 [ 88]: 5d5c6952b912dcc7 +Block 0028 [ 89]: 31679f3139323221 +Block 0028 [ 90]: 052faed9f3a4e084 +Block 0028 [ 91]: 03bc4bb7589a4dfc +Block 0028 [ 92]: a31038ec95934e61 +Block 0028 [ 93]: 097dc529b1217289 +Block 0028 [ 94]: 4be72bc9cc749312 +Block 0028 [ 95]: 4c1f68597848d992 +Block 0028 [ 96]: b444c7254fa8fb61 +Block 0028 [ 97]: c346543ef84e8a59 +Block 0028 [ 98]: 206e055b3f3f3730 +Block 0028 [ 99]: 078d4ce845c6455c +Block 0028 [100]: 655cfd84ba3aabbe +Block 0028 [101]: 7da6829e216aa0bc +Block 0028 [102]: 435efea8611f7c12 +Block 0028 [103]: 6312478ed7893960 +Block 0028 [104]: c79bc333eaecaf10 +Block 0028 [105]: 8cdd24ffa611f409 +Block 0028 [106]: c716631996a6d371 +Block 0028 [107]: cfa3c11f4ae6ca0f +Block 0028 [108]: e371b34cf30063ec +Block 0028 [109]: 1718fd0b77146341 +Block 0028 [110]: d52a6b12f48603ce +Block 0028 [111]: 42b73ab9ffe6a4b3 +Block 0028 [112]: 452a7b610ce7c398 +Block 0028 [113]: d88650bcaad9c965 +Block 0028 [114]: ba7fa59d0ce7bd70 +Block 0028 [115]: f4b59e0f6fb3a8a0 +Block 0028 [116]: 3e1aeeda56a01d9c +Block 0028 [117]: e9279b366a89e250 +Block 0028 [118]: 778ba4ae19a9af6d +Block 0028 [119]: 72fc6f6559bf14c2 +Block 0028 [120]: 3a118ac1bf4871fb +Block 0028 [121]: 70574565eb2cfc81 +Block 0028 [122]: 1983ab178235c534 +Block 0028 [123]: 5604a37353928f70 +Block 0028 [124]: 7fd8d5cce867e1c8 +Block 0028 [125]: 70d7e1ed61847f19 +Block 0028 [126]: 1a3d93af42c2c9e0 +Block 0028 [127]: ed13f2ac7eedcbef +Block 0029 [ 0]: 33cf93e6cce7be2c +Block 0029 [ 1]: 372711da69651ef5 +Block 0029 [ 2]: 5f181b07cee4fd30 +Block 0029 [ 3]: 67535edc41066807 +Block 0029 [ 4]: 30b4aba2d58eeae1 +Block 0029 [ 5]: dca3d06b611e0aae +Block 0029 [ 6]: c769fab6173e6bfe +Block 0029 [ 7]: 10b0480ec9249fa7 +Block 0029 [ 8]: 41fad98a38fb6f67 +Block 0029 [ 9]: 1d15f3f87fb05962 +Block 0029 [ 10]: cd5704702ccd37e9 +Block 0029 [ 11]: 6d5f3e7b74a6640e +Block 0029 [ 12]: 884fa40221d10e15 +Block 0029 [ 13]: 7f18b8d5e79143f0 +Block 0029 [ 14]: 28f11a889ffef7d1 +Block 0029 [ 15]: 28decff387bee808 +Block 0029 [ 16]: 6907e08a57d2f8de +Block 0029 [ 17]: 54816218bce03e77 +Block 0029 [ 18]: c91274596de25c36 +Block 0029 [ 19]: 6d926b9a697f08d0 +Block 0029 [ 20]: 5601cb11e42287ad +Block 0029 [ 21]: e67a9e7239317578 +Block 0029 [ 22]: 3b347aaecb5bb370 +Block 0029 [ 23]: 993f8601c116adb4 +Block 0029 [ 24]: 4bd559876fa2a678 +Block 0029 [ 25]: 56c572647d6b98c0 +Block 0029 [ 26]: 981d52ed292920a3 +Block 0029 [ 27]: f53f2adbcb37b2d9 +Block 0029 [ 28]: c60e801d5ff660bb +Block 0029 [ 29]: 545c53bd9e909cba +Block 0029 [ 30]: a50059730c68333b +Block 0029 [ 31]: f229e0a49de642d6 +Block 0029 [ 32]: 64a92610a4e81764 +Block 0029 [ 33]: 289c40c21a874f0f +Block 0029 [ 34]: 2d20318544d7a828 +Block 0029 [ 35]: 4e776209bf3163a5 +Block 0029 [ 36]: 4e4d880f59f82d31 +Block 0029 [ 37]: e3450815aa32bb05 +Block 0029 [ 38]: 605c3125306f7b9f +Block 0029 [ 39]: a550b122e1ce00c4 +Block 0029 [ 40]: ec2b5a795837a0bc +Block 0029 [ 41]: 119f699a09a13ad5 +Block 0029 [ 42]: 9a340071e76e84e7 +Block 0029 [ 43]: c54ee0cca8723d1d +Block 0029 [ 44]: 6df24d0c6fcf3814 +Block 0029 [ 45]: 58fbebabf998cc37 +Block 0029 [ 46]: bddf26bf6235a216 +Block 0029 [ 47]: 871ed9ba19f3cf4b +Block 0029 [ 48]: 6299baf2f954ec4e +Block 0029 [ 49]: 444ee538008d2ec6 +Block 0029 [ 50]: 026a21131e13b73c +Block 0029 [ 51]: b080b44e6724b4ed +Block 0029 [ 52]: 6c94166dca97de12 +Block 0029 [ 53]: 356ee8e0bd44b94b +Block 0029 [ 54]: 800a52ccc57fbf98 +Block 0029 [ 55]: 68da4be416925eb6 +Block 0029 [ 56]: bdadbd80576b246f +Block 0029 [ 57]: 44b38c548a2cfd19 +Block 0029 [ 58]: be7f2123f69a9ea4 +Block 0029 [ 59]: 1b8f37faec9a6ab1 +Block 0029 [ 60]: e3c4b10ae4ba4e3b +Block 0029 [ 61]: eee4d03c910fe3b5 +Block 0029 [ 62]: 745cf878722aa984 +Block 0029 [ 63]: 8e7085a568dbb61e +Block 0029 [ 64]: 966da2b5386203be +Block 0029 [ 65]: bc6421ec3d4fc07c +Block 0029 [ 66]: 9d470f80efa5c663 +Block 0029 [ 67]: 8c4a9b72f9ef31c2 +Block 0029 [ 68]: 5f6f0abd618f7409 +Block 0029 [ 69]: 76371da61293896d +Block 0029 [ 70]: 0dc2d295a512ce69 +Block 0029 [ 71]: e87771709fbc90f4 +Block 0029 [ 72]: bb6c4d5e2ce22862 +Block 0029 [ 73]: 90e1af93e71818cb +Block 0029 [ 74]: 55b1c9d0d3313531 +Block 0029 [ 75]: 9688b54c43f4547f +Block 0029 [ 76]: f3b43a51cf8379c9 +Block 0029 [ 77]: 3f64ee2df539ccf9 +Block 0029 [ 78]: 0052afb100e3e6d2 +Block 0029 [ 79]: 556f77896150e82f +Block 0029 [ 80]: 0289300035cc07f5 +Block 0029 [ 81]: e6ac3e026d176d28 +Block 0029 [ 82]: d256dd0979870ade +Block 0029 [ 83]: 52f1edf016820998 +Block 0029 [ 84]: 7990c26012425aa5 +Block 0029 [ 85]: b2fdc9cd71716664 +Block 0029 [ 86]: 499eea789dfd8c6c +Block 0029 [ 87]: a33739d6dc44df83 +Block 0029 [ 88]: 5b2473304ff02ba2 +Block 0029 [ 89]: 6221fe99ce18fd6f +Block 0029 [ 90]: 9b88abce601fb555 +Block 0029 [ 91]: d4255810ae3bd298 +Block 0029 [ 92]: 8a3957699742a79c +Block 0029 [ 93]: c1e90c11b21afdca +Block 0029 [ 94]: 2c7531ce3a0f8ae5 +Block 0029 [ 95]: de3570a2b72d8ab4 +Block 0029 [ 96]: 7058926b75183c6d +Block 0029 [ 97]: b036b85be8608da9 +Block 0029 [ 98]: 4908a8d134b324dc +Block 0029 [ 99]: 9ca9c9a119d9865f +Block 0029 [100]: 05efd6adf2af52c7 +Block 0029 [101]: 53c7a35c9c88758c +Block 0029 [102]: cd4ed200fd912eec +Block 0029 [103]: b1044093fbb535af +Block 0029 [104]: cf5e842a5a94efa1 +Block 0029 [105]: 1954b5b8c49d4462 +Block 0029 [106]: 5f3a71fecff0d4f1 +Block 0029 [107]: ed2705757b17552f +Block 0029 [108]: afd077618cefdad9 +Block 0029 [109]: 007303311b2e4fa6 +Block 0029 [110]: da07ecdc7845ad01 +Block 0029 [111]: 33724bb091b3cad0 +Block 0029 [112]: 4f30c96b7bb5a778 +Block 0029 [113]: dd633315a7413454 +Block 0029 [114]: 1215bea5da3b0263 +Block 0029 [115]: a890ad66a77d0fd9 +Block 0029 [116]: 80f7d436ca7c0534 +Block 0029 [117]: 1ff2f3dbe5171bcb +Block 0029 [118]: 1bd78433a2de661d +Block 0029 [119]: 4fd6406d8b56293b +Block 0029 [120]: d35bcaab27db2e2f +Block 0029 [121]: b83da5153feb2ebe +Block 0029 [122]: 2e7e8954d6c25e01 +Block 0029 [123]: bb47ee3b0fff9cc3 +Block 0029 [124]: 272cffa537b8710b +Block 0029 [125]: 57a15d3001de9398 +Block 0029 [126]: 2321da238e044e17 +Block 0029 [127]: a8bd886d88ba8cf4 +Block 0030 [ 0]: 6ecd3a74b8ca272f +Block 0030 [ 1]: b5dbd6ae9917542c +Block 0030 [ 2]: 92796d78d9eb12a5 +Block 0030 [ 3]: ce36aa84848aeb2b +Block 0030 [ 4]: b2fd7b2b1275d646 +Block 0030 [ 5]: 7924e2d5736dcb1f +Block 0030 [ 6]: dedf8fa9f053c3ce +Block 0030 [ 7]: 3704cd36cdc8489f +Block 0030 [ 8]: f439f82ca1402d2c +Block 0030 [ 9]: f0535c5815780519 +Block 0030 [ 10]: 301ee82afbb2f4f0 +Block 0030 [ 11]: c8cf2dbfae87a7b8 +Block 0030 [ 12]: 9788cfc325f465a2 +Block 0030 [ 13]: d16609c0ffedea6b +Block 0030 [ 14]: 2cd87900f24384b2 +Block 0030 [ 15]: bbd3b932af9756d4 +Block 0030 [ 16]: 4726092cb27622e5 +Block 0030 [ 17]: 23e7a536a9abdc04 +Block 0030 [ 18]: b85c68d32b08ac68 +Block 0030 [ 19]: 01c7cd213e0357bc +Block 0030 [ 20]: 520cbe46d040e8fe +Block 0030 [ 21]: 4e18b68037222145 +Block 0030 [ 22]: 9d0533780ec15042 +Block 0030 [ 23]: 6aa0998dfbd1fc5d +Block 0030 [ 24]: 34b8f0f77fb20531 +Block 0030 [ 25]: 4ced999c154dfcb4 +Block 0030 [ 26]: b9a91ee42ece1d4b +Block 0030 [ 27]: a64ca0a2413435a3 +Block 0030 [ 28]: a154c9bfe4dd0880 +Block 0030 [ 29]: a9319f178c7ad588 +Block 0030 [ 30]: 233d887655e00f93 +Block 0030 [ 31]: 0ee0c36c2966e538 +Block 0030 [ 32]: 00a6f9b7fb4cde72 +Block 0030 [ 33]: b6b0777f23d1b2ab +Block 0030 [ 34]: 006222e11286472e +Block 0030 [ 35]: 2fe7e3124ceef0d1 +Block 0030 [ 36]: ff6e89a72dcd81f3 +Block 0030 [ 37]: 2df079639e87e734 +Block 0030 [ 38]: fe888a1af0b870c5 +Block 0030 [ 39]: 77a5dbbea31587ae +Block 0030 [ 40]: 387f86968288fe9b +Block 0030 [ 41]: 262a7864cb6144ed +Block 0030 [ 42]: 077e0a154fa50c43 +Block 0030 [ 43]: 119043b23af44739 +Block 0030 [ 44]: b7aee252cad97cc0 +Block 0030 [ 45]: 711c23dd4c5a1695 +Block 0030 [ 46]: ed051bb2a391b7ce +Block 0030 [ 47]: e973e2a22e396475 +Block 0030 [ 48]: a0bc6bfa849824f3 +Block 0030 [ 49]: e9f7a93f57279b83 +Block 0030 [ 50]: acb04d04db307e5d +Block 0030 [ 51]: e3c2b1944e0aa0c4 +Block 0030 [ 52]: f84e30a19a08949d +Block 0030 [ 53]: aa41b6af0f7682a4 +Block 0030 [ 54]: d53e4ac5eec1401e +Block 0030 [ 55]: 8a4d7682c811c47d +Block 0030 [ 56]: 6b13be440a301a75 +Block 0030 [ 57]: fec09305aa9cb47f +Block 0030 [ 58]: 5b49e2e6139c6af5 +Block 0030 [ 59]: 54b9144ef244c041 +Block 0030 [ 60]: 37d475e4e8c7162f +Block 0030 [ 61]: cea7a663067c9675 +Block 0030 [ 62]: be5354eeb5e8a1e1 +Block 0030 [ 63]: e775a094cc07905a +Block 0030 [ 64]: 291d525c7f6b3a27 +Block 0030 [ 65]: 7bef57e5526868d6 +Block 0030 [ 66]: 6f54b6cdfeb7227f +Block 0030 [ 67]: 93282dd954e1bf49 +Block 0030 [ 68]: 57c18e7631bbc297 +Block 0030 [ 69]: c2d3178a04d2d48c +Block 0030 [ 70]: 44127507cdadbae6 +Block 0030 [ 71]: 1c3c2e2ecbbd89ad +Block 0030 [ 72]: 509c90bc050d19b7 +Block 0030 [ 73]: 464023c2557ea4c4 +Block 0030 [ 74]: d99c16a1de32e6a6 +Block 0030 [ 75]: ae0176330021ff02 +Block 0030 [ 76]: b3fe389546fd5b6c +Block 0030 [ 77]: 8498583a9577b1da +Block 0030 [ 78]: 915d4d61a3b08f7d +Block 0030 [ 79]: 3578b5b049de581b +Block 0030 [ 80]: a80612a42043a474 +Block 0030 [ 81]: a59df7ec56ed0e61 +Block 0030 [ 82]: ba3cf869d25aedc6 +Block 0030 [ 83]: 2049762e0d3ca8fc +Block 0030 [ 84]: 8d771e0161f3a0eb +Block 0030 [ 85]: 98d0872d072574e7 +Block 0030 [ 86]: 4cfe5d48b8c10515 +Block 0030 [ 87]: 50c9043d923a50c7 +Block 0030 [ 88]: 5c910292699c0b89 +Block 0030 [ 89]: 95e4bc9a8f04e102 +Block 0030 [ 90]: 47b404d915b1f09a +Block 0030 [ 91]: f310c30b79c434c5 +Block 0030 [ 92]: a32cfc80bfd999af +Block 0030 [ 93]: ba6fb895832005e7 +Block 0030 [ 94]: c940b07d4bbac8d8 +Block 0030 [ 95]: b927cacd864b8ef4 +Block 0030 [ 96]: 7f86cbec290ce150 +Block 0030 [ 97]: 44019f102bbc346c +Block 0030 [ 98]: f4922e3a79972b25 +Block 0030 [ 99]: 57a11cec2904209b +Block 0030 [100]: ed500a5896662d38 +Block 0030 [101]: 40a1e81c7710aebb +Block 0030 [102]: 0f7c55b652f43c6c +Block 0030 [103]: 76fa83f4935552b0 +Block 0030 [104]: fda0042a566c8419 +Block 0030 [105]: bc669a6b2f036242 +Block 0030 [106]: 5ea211557564cd1e +Block 0030 [107]: e2b66a7d127fb62d +Block 0030 [108]: fb0497bb58905fd3 +Block 0030 [109]: 9bf162918404c986 +Block 0030 [110]: dabc64ecba15c2a5 +Block 0030 [111]: ff69083ee852f81b +Block 0030 [112]: 3739cb3c2a316ae1 +Block 0030 [113]: 0914028c39ec51de +Block 0030 [114]: 38261471477e87eb +Block 0030 [115]: 09681ad936fd9609 +Block 0030 [116]: baba75611ec7f474 +Block 0030 [117]: 5a587814bbc26e41 +Block 0030 [118]: 7929e20b70736dbb +Block 0030 [119]: a1c3fe1ad20fccde +Block 0030 [120]: 40789b143639d83c +Block 0030 [121]: 1f54a0c9767d4704 +Block 0030 [122]: cf2fa83d66dd7b8c +Block 0030 [123]: e8d8978cbe11894d +Block 0030 [124]: 9c75ca73199f324b +Block 0030 [125]: 06818c0d4dd46001 +Block 0030 [126]: 4f10eefc69bd7d4e +Block 0030 [127]: 9c35ccb7d1b407a3 +Block 0031 [ 0]: 7b2c886a0becf8aa +Block 0031 [ 1]: a961a68cd9802059 +Block 0031 [ 2]: c17906242f91d148 +Block 0031 [ 3]: 07b5168a9ba5dc20 +Block 0031 [ 4]: 7aa37588acbb43f7 +Block 0031 [ 5]: 03b0d1e09eb1e873 +Block 0031 [ 6]: c12f280456f1599a +Block 0031 [ 7]: 1b9eb2aa25f4fe4a +Block 0031 [ 8]: 92a506c1c444d06c +Block 0031 [ 9]: ab0a55ef35918793 +Block 0031 [ 10]: af635b968f49a6ca +Block 0031 [ 11]: 314f6856774229fb +Block 0031 [ 12]: 588edd661fab5266 +Block 0031 [ 13]: 3067a959a20de573 +Block 0031 [ 14]: ce8587775df42928 +Block 0031 [ 15]: 998f789c66194f76 +Block 0031 [ 16]: fa5cefe6d2653f8c +Block 0031 [ 17]: c9e69ab9e1cca147 +Block 0031 [ 18]: aa8ea6e905228faa +Block 0031 [ 19]: ffaba13e3b61b88d +Block 0031 [ 20]: db2eaa23530363ea +Block 0031 [ 21]: a64096fddc020f87 +Block 0031 [ 22]: a35c94cbd4f04a9f +Block 0031 [ 23]: e8396a978198ec52 +Block 0031 [ 24]: 5e7a8437b42c9016 +Block 0031 [ 25]: f1c65654317c0508 +Block 0031 [ 26]: 08a818ddbf2a23fd +Block 0031 [ 27]: cb3ef670786fcae9 +Block 0031 [ 28]: e83f4fc405e1d49f +Block 0031 [ 29]: 94b089965afe8871 +Block 0031 [ 30]: 92008c2a75103b5a +Block 0031 [ 31]: c9ce40dcb0ae0fff +Block 0031 [ 32]: 31e7b05a84523cbe +Block 0031 [ 33]: 1b854b7afd4321aa +Block 0031 [ 34]: e611bbf67f403d94 +Block 0031 [ 35]: e7ddb82fcf732908 +Block 0031 [ 36]: 8afea8045337f395 +Block 0031 [ 37]: 5a4b29a0464a87fd +Block 0031 [ 38]: ddc4b39b66d51a4e +Block 0031 [ 39]: 8a962a2a7848e9c7 +Block 0031 [ 40]: c553d559a2dbc2f7 +Block 0031 [ 41]: f0d5b10beb21bccb +Block 0031 [ 42]: 29a8b6322d76864d +Block 0031 [ 43]: 30a6a1d4b043ee12 +Block 0031 [ 44]: 0f8698a6f49cbbf8 +Block 0031 [ 45]: 0271710fca1ae0e6 +Block 0031 [ 46]: 86b474e9cc978929 +Block 0031 [ 47]: 6381d0f8c249ca80 +Block 0031 [ 48]: ae93ff832984a78b +Block 0031 [ 49]: e3806eb3831109ab +Block 0031 [ 50]: c4bb916929ec7540 +Block 0031 [ 51]: 587ce5ea6a14b5af +Block 0031 [ 52]: 81ae14d279dd55ce +Block 0031 [ 53]: b4490e4a095cccc7 +Block 0031 [ 54]: b5b74756d1a47600 +Block 0031 [ 55]: 229f5aa2436f8fd4 +Block 0031 [ 56]: f4dda68045c81478 +Block 0031 [ 57]: d307c85dd48a2344 +Block 0031 [ 58]: 433ad4706e5d90f9 +Block 0031 [ 59]: e74575dbb844a038 +Block 0031 [ 60]: a89f0718e3393ce1 +Block 0031 [ 61]: 588fe47981e7946b +Block 0031 [ 62]: 6518231d42469f4a +Block 0031 [ 63]: 746c07f616058dfc +Block 0031 [ 64]: 3c968cf79bb87403 +Block 0031 [ 65]: 8c4cd47f02979496 +Block 0031 [ 66]: 0303646363f1dbe4 +Block 0031 [ 67]: dcdf94b5679bbdab +Block 0031 [ 68]: 8e92abfffa0073b0 +Block 0031 [ 69]: 712d21d6945e5d7d +Block 0031 [ 70]: 09114fac05fe6744 +Block 0031 [ 71]: 4568bcb4a9fa8b29 +Block 0031 [ 72]: 6608c183890263d6 +Block 0031 [ 73]: 1f74ccf6ab150884 +Block 0031 [ 74]: facdc83fa2c1c817 +Block 0031 [ 75]: 7ae035fa8ed0ce1b +Block 0031 [ 76]: 29f7d651507d76df +Block 0031 [ 77]: e73b4c7efb5671dc +Block 0031 [ 78]: c74deda09b63447d +Block 0031 [ 79]: 629a595aaa37a3c2 +Block 0031 [ 80]: 751fa8d3d07f1156 +Block 0031 [ 81]: 7c8a83446320004d +Block 0031 [ 82]: 993186df8a1ae482 +Block 0031 [ 83]: 6bf5f5c6071b66c1 +Block 0031 [ 84]: d495bb47b2ef1361 +Block 0031 [ 85]: 528404d7247a455f +Block 0031 [ 86]: 8cc33913d6ef8cb6 +Block 0031 [ 87]: 70c0b0ce7fefbd05 +Block 0031 [ 88]: a58a8a3c7c246774 +Block 0031 [ 89]: 2ffda09b4d88cb6b +Block 0031 [ 90]: 3fb07d2cd72192fd +Block 0031 [ 91]: 84689e06eb122836 +Block 0031 [ 92]: e2f659a255c97fc2 +Block 0031 [ 93]: a4e8983f8e3f2363 +Block 0031 [ 94]: f5c06cdf6ac58be1 +Block 0031 [ 95]: cce957feb8dc694e +Block 0031 [ 96]: 955f7bd29f980a3e +Block 0031 [ 97]: 5e6a9b06b958d9eb +Block 0031 [ 98]: 13e2ae511f9fcf95 +Block 0031 [ 99]: 7e90dc5738154a96 +Block 0031 [100]: 2fbff3198bc7dfbb +Block 0031 [101]: 029b171c3879b4e5 +Block 0031 [102]: 6b2e35fc0ec55726 +Block 0031 [103]: 8b7618296c29640b +Block 0031 [104]: aa6da19845af6feb +Block 0031 [105]: af2aab61252a6652 +Block 0031 [106]: 70107491337b1baf +Block 0031 [107]: d01fa41824afe775 +Block 0031 [108]: 2f49d846b7e7fde5 +Block 0031 [109]: 36de3a765cd99df7 +Block 0031 [110]: e1892ef5e7bf72e5 +Block 0031 [111]: cdb4e92f199df6f7 +Block 0031 [112]: ac68f1f63533a059 +Block 0031 [113]: 54d709cf88689da1 +Block 0031 [114]: d22355579e725146 +Block 0031 [115]: f68214076ccce3f6 +Block 0031 [116]: 061f07bc4b3f9526 +Block 0031 [117]: 93ca7252bd067ab8 +Block 0031 [118]: 25fac18a5fb39a86 +Block 0031 [119]: f823ae791d41fe57 +Block 0031 [120]: 5b72f046297886bc +Block 0031 [121]: cbae98da46154192 +Block 0031 [122]: c087b1a1b5ede419 +Block 0031 [123]: 2c05d9fa80a8f2ff +Block 0031 [124]: 3921a5c7788362de +Block 0031 [125]: e0b99140444ee63a +Block 0031 [126]: 9cb08bbd62f6ecb5 +Block 0031 [127]: 7863ba7c31e4780d + + After pass 2: +Block 0000 [ 0]: 074ffcc2d6211662 +Block 0000 [ 1]: 23dc267c4f3d1696 +Block 0000 [ 2]: 067781fb67b4a7cd +Block 0000 [ 3]: 4405600ea87c3236 +Block 0000 [ 4]: 5c7d7668ebdd0f48 +Block 0000 [ 5]: 2c158c83d6a8dfc6 +Block 0000 [ 6]: a51c8b5beac9a07b +Block 0000 [ 7]: 1cae283e1849d908 +Block 0000 [ 8]: 67d9e3f64caa972d +Block 0000 [ 9]: fc6754c829fc7cba +Block 0000 [ 10]: 017dfa540b6c9bc9 +Block 0000 [ 11]: 39b736ea7cdf7b0b +Block 0000 [ 12]: 1f37d704a41cb903 +Block 0000 [ 13]: 3aecddd32b254afa +Block 0000 [ 14]: 4700d23ff95830df +Block 0000 [ 15]: 8d21806d416feb40 +Block 0000 [ 16]: 5053c210b1f3f1a6 +Block 0000 [ 17]: c7cac96030349349 +Block 0000 [ 18]: b980e68ee8d6b5c0 +Block 0000 [ 19]: 02834d681a06cd74 +Block 0000 [ 20]: 02ac55d5bb3f15a2 +Block 0000 [ 21]: e67d07df976b00a1 +Block 0000 [ 22]: a439d570908a6dfc +Block 0000 [ 23]: 50f092cbe300c2fc +Block 0000 [ 24]: befdffab9975f1e4 +Block 0000 [ 25]: f4f4600d82cd417d +Block 0000 [ 26]: 17f6612758926fc5 +Block 0000 [ 27]: dfd8c28f34a09aed +Block 0000 [ 28]: 24584d701e1a84e2 +Block 0000 [ 29]: 47c5add8e8460639 +Block 0000 [ 30]: 0f9c8e1641cf56bb +Block 0000 [ 31]: 9ec95ca5bcff5620 +Block 0000 [ 32]: 97b7cdda0a711063 +Block 0000 [ 33]: 63853fcecb6b6b8a +Block 0000 [ 34]: 5df2cde7e36bafc7 +Block 0000 [ 35]: d7e0e9b81910dd50 +Block 0000 [ 36]: 399ac6865b269713 +Block 0000 [ 37]: 8376d957a91e502e +Block 0000 [ 38]: b9ccdb00eced58d8 +Block 0000 [ 39]: 0ca46bce53d80ec1 +Block 0000 [ 40]: 403e6af6dde5401a +Block 0000 [ 41]: 79041a1ee46d5de5 +Block 0000 [ 42]: 6478018547a45c10 +Block 0000 [ 43]: b586c73694a50ad5 +Block 0000 [ 44]: 19c09a72ffb077c6 +Block 0000 [ 45]: cd4ed30f1950c280 +Block 0000 [ 46]: 30a24c09eb9f26e3 +Block 0000 [ 47]: a5a3e3544f299ca2 +Block 0000 [ 48]: 4daf9512c147bf09 +Block 0000 [ 49]: 566c7455847c148f +Block 0000 [ 50]: 9d1b5569164a3cd2 +Block 0000 [ 51]: 89c678b2ab335957 +Block 0000 [ 52]: 32d2c5727eaa685b +Block 0000 [ 53]: 6cc29cae8d088214 +Block 0000 [ 54]: 217d81e9f0fefbe2 +Block 0000 [ 55]: 639ac623a21feded +Block 0000 [ 56]: 235e78e584141ede +Block 0000 [ 57]: 7919e75c6d3dab69 +Block 0000 [ 58]: 6a876509af846fd1 +Block 0000 [ 59]: 215a62e84a5dda9b +Block 0000 [ 60]: 1be8f91ab4628c1a +Block 0000 [ 61]: 1d6526223d2ce03d +Block 0000 [ 62]: a62350b8d2991ef3 +Block 0000 [ 63]: e3256eebc2e9743d +Block 0000 [ 64]: 7d3c911dde4b729d +Block 0000 [ 65]: bc30bb8cbadaea85 +Block 0000 [ 66]: b7794d58951616b7 +Block 0000 [ 67]: ba9d59b655e8426d +Block 0000 [ 68]: 3e84c80234db69df +Block 0000 [ 69]: 57c75d2442885b3c +Block 0000 [ 70]: 19abdeb8612da37f +Block 0000 [ 71]: ec8efaf2e2d2e65c +Block 0000 [ 72]: 87692796d1f2e210 +Block 0000 [ 73]: f6d623948e49ce7b +Block 0000 [ 74]: 8e96e29c9a2fa442 +Block 0000 [ 75]: 54bb73c34877db70 +Block 0000 [ 76]: 98dad77daadd139d +Block 0000 [ 77]: 0f794bfaf84e29b0 +Block 0000 [ 78]: 2b34a73157d7ef5c +Block 0000 [ 79]: 8ecb005134ac5b8a +Block 0000 [ 80]: 793d55e30eb5485c +Block 0000 [ 81]: de517434bcf0cafa +Block 0000 [ 82]: 7ea4f8ecbc183f32 +Block 0000 [ 83]: 72a35118ac328bce +Block 0000 [ 84]: f4275ff7a034f425 +Block 0000 [ 85]: e95a8c458757ffd0 +Block 0000 [ 86]: 64fd3ce6e85f934e +Block 0000 [ 87]: d9c027d06733c4e6 +Block 0000 [ 88]: 6e7eb7d2f3f4b2a4 +Block 0000 [ 89]: f6b9860481ea6f18 +Block 0000 [ 90]: 9d883d8955179f0c +Block 0000 [ 91]: b1ba223d9186b36f +Block 0000 [ 92]: 1989b62b3c499c02 +Block 0000 [ 93]: a292a87cacf94dc5 +Block 0000 [ 94]: ef8cd9123be7351f +Block 0000 [ 95]: 98c5673b3bb4e050 +Block 0000 [ 96]: 300366627841dc69 +Block 0000 [ 97]: 2834511a487aca0e +Block 0000 [ 98]: 0b4fa280d5e7967c +Block 0000 [ 99]: da97469d8738dfdb +Block 0000 [100]: d00c6e9085aba92a +Block 0000 [101]: 029e1930514f1d49 +Block 0000 [102]: 7749ba0fb768e9ef +Block 0000 [103]: 631f5377678c24ee +Block 0000 [104]: 7997bd3d7d2b3ddb +Block 0000 [105]: 63170d21238ffc00 +Block 0000 [106]: 4bae77aba388d1af +Block 0000 [107]: 9ff14fc9d20615f7 +Block 0000 [108]: 8cc4d7f451e5ea62 +Block 0000 [109]: d317157783a6278a +Block 0000 [110]: 4a0a192d4102224f +Block 0000 [111]: 56bda18173b56c75 +Block 0000 [112]: c194d8f1db07f888 +Block 0000 [113]: e08781cc46e76541 +Block 0000 [114]: d1104ae30639dc72 +Block 0000 [115]: 81f4c81422544029 +Block 0000 [116]: 36c3fbba9c223820 +Block 0000 [117]: fa92e2c95a6ac010 +Block 0000 [118]: 0e5e2a5f620020cc +Block 0000 [119]: b08063b69cd858eb +Block 0000 [120]: 63d32af9ea60f5c7 +Block 0000 [121]: 3815e273927c8b44 +Block 0000 [122]: 01aabcd9163ee1fb +Block 0000 [123]: 332241a4b6dd26a1 +Block 0000 [124]: b801a887e60e88b1 +Block 0000 [125]: 730a4b559c209261 +Block 0000 [126]: 6cef830772dad5c6 +Block 0000 [127]: b1080b96394ceb2b +Block 0001 [ 0]: 35578285c65e90fd +Block 0001 [ 1]: 4bb9cc0c6d2efc55 +Block 0001 [ 2]: 7baa171e89c44f1a +Block 0001 [ 3]: b5248ac1751059d1 +Block 0001 [ 4]: 6bad1484d694d0e0 +Block 0001 [ 5]: f93622b535148cc3 +Block 0001 [ 6]: 751a6fe829a61d29 +Block 0001 [ 7]: e8c3aca31e64ab54 +Block 0001 [ 8]: 93745f7637ef0a30 +Block 0001 [ 9]: a49ed01e2e6e0753 +Block 0001 [ 10]: c04456bd7e5bfd5b +Block 0001 [ 11]: 3a7cb2b5b5fa1bcd +Block 0001 [ 12]: 8ba5050fca0be409 +Block 0001 [ 13]: 0fe0d194cbe241b0 +Block 0001 [ 14]: f767dbead0b52cba +Block 0001 [ 15]: 35e72a7bb50d7144 +Block 0001 [ 16]: 143a86cf490b4b49 +Block 0001 [ 17]: 3ceb93f75eacf023 +Block 0001 [ 18]: 55f78adb9892524b +Block 0001 [ 19]: 97a9c8c671792a2b +Block 0001 [ 20]: bd930f3e27a8e299 +Block 0001 [ 21]: f48dc858d7623a19 +Block 0001 [ 22]: e4dc1f425b078cd9 +Block 0001 [ 23]: 40abe54c27a1df54 +Block 0001 [ 24]: 0f13ecb6b1f801ae +Block 0001 [ 25]: 40e76bbc9e8e0359 +Block 0001 [ 26]: 5a1fba7aa341f9fb +Block 0001 [ 27]: f6cb6c0dc939b786 +Block 0001 [ 28]: 5f3163fc202e2c15 +Block 0001 [ 29]: a060056daefacd6d +Block 0001 [ 30]: 962582e26876c45d +Block 0001 [ 31]: 8f2ae61de120c15c +Block 0001 [ 32]: 1798a6b18d5df0fa +Block 0001 [ 33]: f35379efc89f3185 +Block 0001 [ 34]: 9aa653f4d27037d4 +Block 0001 [ 35]: f55d25a85ef70083 +Block 0001 [ 36]: e0b5fa445529ad98 +Block 0001 [ 37]: 90cd2452561901c0 +Block 0001 [ 38]: e13e29ac39c5c75b +Block 0001 [ 39]: 3b5f3754b72ad946 +Block 0001 [ 40]: 0b74c97f8530631e +Block 0001 [ 41]: f205c031d6eab47a +Block 0001 [ 42]: 0392f102d95bedd0 +Block 0001 [ 43]: df8cc06fd357b932 +Block 0001 [ 44]: adba22945f6ea54b +Block 0001 [ 45]: 245c28eb786846fc +Block 0001 [ 46]: 1374137daa585fa4 +Block 0001 [ 47]: 9bbfdb864d4a44a4 +Block 0001 [ 48]: fa43c6b21ca5e381 +Block 0001 [ 49]: 7fcd01d29f0cf1b5 +Block 0001 [ 50]: 26ed604d9cccb91d +Block 0001 [ 51]: 61f83421bd6c1f23 +Block 0001 [ 52]: 1f8b6d81b8e3e293 +Block 0001 [ 53]: ae720a3cd9e026e1 +Block 0001 [ 54]: 799793cee15b9fcc +Block 0001 [ 55]: 50a2920934111544 +Block 0001 [ 56]: ae98b61798fe4197 +Block 0001 [ 57]: d09b498bcc92caa4 +Block 0001 [ 58]: 626405a3f141ac39 +Block 0001 [ 59]: 3b8fc5a9403eff81 +Block 0001 [ 60]: 26be736898a3d356 +Block 0001 [ 61]: fec9b55fe7400706 +Block 0001 [ 62]: 7b42f7e3dc25495d +Block 0001 [ 63]: 0ad2b5ac04f2455a +Block 0001 [ 64]: f9cee4116bb71092 +Block 0001 [ 65]: 017640c28e88caf5 +Block 0001 [ 66]: 4d9a590bd7959d08 +Block 0001 [ 67]: e0889cdd7e722e2b +Block 0001 [ 68]: b864c81b4f0a72ab +Block 0001 [ 69]: f13be1af5f968168 +Block 0001 [ 70]: a18c60f1bca699b5 +Block 0001 [ 71]: b0d6efd7f979ab4b +Block 0001 [ 72]: 44251fa7bd97a8ec +Block 0001 [ 73]: 80fc637798575c3d +Block 0001 [ 74]: b49d9f0a356332a0 +Block 0001 [ 75]: 577788eb3e3cde4e +Block 0001 [ 76]: 4b0f73f577b3bf93 +Block 0001 [ 77]: 0703cffd01ec20c4 +Block 0001 [ 78]: 57b7fad9a047f157 +Block 0001 [ 79]: 3d4a385b573bf8f4 +Block 0001 [ 80]: 3ec7cd6e9a586917 +Block 0001 [ 81]: 30502a8f0d6b3b3b +Block 0001 [ 82]: 5827740f69f6ed7e +Block 0001 [ 83]: e772f948ef87d9e8 +Block 0001 [ 84]: 113292b8eb726923 +Block 0001 [ 85]: e1a0f99b9b4c7f45 +Block 0001 [ 86]: 849ca6d49a8beb6f +Block 0001 [ 87]: 899e64706cc6cc22 +Block 0001 [ 88]: 762aac2687b27c1e +Block 0001 [ 89]: bec687a1a0ff5f67 +Block 0001 [ 90]: a6d0d4c0dd017184 +Block 0001 [ 91]: 7184b936a5192649 +Block 0001 [ 92]: 8a0b189778c5c2f9 +Block 0001 [ 93]: 388c8aa99414a343 +Block 0001 [ 94]: bfa9e7e8b944a012 +Block 0001 [ 95]: 0bec06d22c5cbc68 +Block 0001 [ 96]: 48cf01fc006a932a +Block 0001 [ 97]: 4eca2a3ce6a9ede5 +Block 0001 [ 98]: 5de361340ad870d4 +Block 0001 [ 99]: 991c300d989769b7 +Block 0001 [100]: e81e6ff5168dea46 +Block 0001 [101]: b80b74c2dea3598b +Block 0001 [102]: 4178c7a329ec33f9 +Block 0001 [103]: 821b69f7ec159cb4 +Block 0001 [104]: 3fbcf7aed8b16057 +Block 0001 [105]: 8ff6fd8c8dbb7d97 +Block 0001 [106]: 00999cc3dfd68ed5 +Block 0001 [107]: 4b1125750e10c124 +Block 0001 [108]: c4faa4346465f470 +Block 0001 [109]: 9228b997dec487a9 +Block 0001 [110]: 7a77a1f7775085a7 +Block 0001 [111]: 76c87a4eb0814378 +Block 0001 [112]: 9d1dc217f8205567 +Block 0001 [113]: 192082947d040aff +Block 0001 [114]: 835a0e7dc57147a4 +Block 0001 [115]: d658d49131e2034f +Block 0001 [116]: 8178295354854b4b +Block 0001 [117]: 546509eed0804fd2 +Block 0001 [118]: dad30f4cad39632f +Block 0001 [119]: 7067a93d88b400b3 +Block 0001 [120]: f208ab50a921620b +Block 0001 [121]: 11d3c5a308076062 +Block 0001 [122]: 66cc7ff9c93e6d86 +Block 0001 [123]: d6d88bbd8f39f66a +Block 0001 [124]: 2267ded47cd0fd58 +Block 0001 [125]: 3f54c246e26607c7 +Block 0001 [126]: 90549bbe29fd6b8b +Block 0001 [127]: 13ee9844392f8eb3 +Block 0002 [ 0]: 73d51d413b4c53d0 +Block 0002 [ 1]: 76ae856cbdb336a0 +Block 0002 [ 2]: af1b19667ebc609b +Block 0002 [ 3]: 79e1597f33187d55 +Block 0002 [ 4]: 6a65de429602a2a3 +Block 0002 [ 5]: f1143254e35f0f75 +Block 0002 [ 6]: e8e367d45b989e55 +Block 0002 [ 7]: 7bcd857863800596 +Block 0002 [ 8]: a849576915058869 +Block 0002 [ 9]: 84e96cfd017f8259 +Block 0002 [ 10]: 5faa617589a4bb6e +Block 0002 [ 11]: 9779d55b049906f4 +Block 0002 [ 12]: bf6b51a7c73464ac +Block 0002 [ 13]: d1362f3e2c38a1fc +Block 0002 [ 14]: 1f009be2c745a955 +Block 0002 [ 15]: a9cf27c109ab7ae6 +Block 0002 [ 16]: 9bae95cb88fd2bfd +Block 0002 [ 17]: aa3fc5e576e3f2e9 +Block 0002 [ 18]: 727a888a9cdf5d82 +Block 0002 [ 19]: e29325278794849d +Block 0002 [ 20]: aa579a642dc5efc0 +Block 0002 [ 21]: e64d2aa10ca93a83 +Block 0002 [ 22]: fbf9a497307c6789 +Block 0002 [ 23]: 63dec585b76b0e36 +Block 0002 [ 24]: 9914fe6ae8f7902e +Block 0002 [ 25]: 9f183f1f898a2eec +Block 0002 [ 26]: 871dd6f0c5ed7391 +Block 0002 [ 27]: 6a998c598e62d632 +Block 0002 [ 28]: ae4fb7d7d044a498 +Block 0002 [ 29]: 45bb02b68c94dabe +Block 0002 [ 30]: 0ee5b5b2a12fedcb +Block 0002 [ 31]: f81100966671170e +Block 0002 [ 32]: bc10a0e55f0581e3 +Block 0002 [ 33]: 59fa2ae5ae73bc1a +Block 0002 [ 34]: 8734ef9fd26b2592 +Block 0002 [ 35]: 8b1125062051701d +Block 0002 [ 36]: b8e68fc7dfe6e175 +Block 0002 [ 37]: 4e350c55108d1b95 +Block 0002 [ 38]: a92a1a6e50453305 +Block 0002 [ 39]: 12ae32bee16cbc4b +Block 0002 [ 40]: e63b524d74f88184 +Block 0002 [ 41]: 1c32b08c95f570e2 +Block 0002 [ 42]: e1f63121e0c49256 +Block 0002 [ 43]: e8908ea1b577e153 +Block 0002 [ 44]: bf670a809c56f86a +Block 0002 [ 45]: 0bd87114ea78aa82 +Block 0002 [ 46]: a5f83d398c0518c8 +Block 0002 [ 47]: caf9fc4fd0d13fac +Block 0002 [ 48]: 87dc556761c3b84e +Block 0002 [ 49]: b271d201d69d87ba +Block 0002 [ 50]: 60afbeeb05e32ce6 +Block 0002 [ 51]: 3f7d0c4c77690400 +Block 0002 [ 52]: 827402ca4c4b7568 +Block 0002 [ 53]: cc1490ac87cae9ab +Block 0002 [ 54]: 5f0c0be02bfee0d6 +Block 0002 [ 55]: ee55646ea303f7ee +Block 0002 [ 56]: 760b0ef4f4be1085 +Block 0002 [ 57]: f6e1dda0ba5aa3ec +Block 0002 [ 58]: 64d813c90f235d07 +Block 0002 [ 59]: 7e243d64c004d7cf +Block 0002 [ 60]: 9ba0e4619f9321b1 +Block 0002 [ 61]: 9af7d15278ce6e9c +Block 0002 [ 62]: 84429fe41e908a5f +Block 0002 [ 63]: 087d31f94451179a +Block 0002 [ 64]: 6bd8e211a6776757 +Block 0002 [ 65]: bce0156f33df21ff +Block 0002 [ 66]: b89d728cb0ea1478 +Block 0002 [ 67]: 1d38586723a2aaf6 +Block 0002 [ 68]: 7fdf415d588153a9 +Block 0002 [ 69]: 784414ab43287466 +Block 0002 [ 70]: 7549c68a0508a290 +Block 0002 [ 71]: fb6e20ff908acfbc +Block 0002 [ 72]: 1b7ea5812d994dd2 +Block 0002 [ 73]: eceb8fb8ecc00544 +Block 0002 [ 74]: 6a1db08dcf131415 +Block 0002 [ 75]: ef12b7be1c98f06d +Block 0002 [ 76]: 4bab0815544ff51c +Block 0002 [ 77]: d7005204797a3a09 +Block 0002 [ 78]: 3a62509e74742fb6 +Block 0002 [ 79]: d299457155448ac2 +Block 0002 [ 80]: 97f4f9620deb14f3 +Block 0002 [ 81]: 569cd97b9e8554b1 +Block 0002 [ 82]: 971aa2f58c986a44 +Block 0002 [ 83]: d2462db7dd1dc03f +Block 0002 [ 84]: f0709d7bc71246be +Block 0002 [ 85]: 0b25b74b0b86e738 +Block 0002 [ 86]: b685b14a81c45aa8 +Block 0002 [ 87]: 1a512dc11da0a043 +Block 0002 [ 88]: 47b0149e3e3ac09c +Block 0002 [ 89]: 675a13653235da5d +Block 0002 [ 90]: 79cd73d9561f7abe +Block 0002 [ 91]: 2b7e85da8095a630 +Block 0002 [ 92]: ea9ee50b427a24f0 +Block 0002 [ 93]: cf3a906fc784dee6 +Block 0002 [ 94]: c5e846fbb3cef89b +Block 0002 [ 95]: d2e00082f5bd5d75 +Block 0002 [ 96]: 311bc46892a29e3f +Block 0002 [ 97]: 5404eee07dffcd46 +Block 0002 [ 98]: 793df68160ff5272 +Block 0002 [ 99]: 9cf21ecd74a09c05 +Block 0002 [100]: 97c651e1b57fe890 +Block 0002 [101]: d21b4652fdaa71aa +Block 0002 [102]: f62616d527da1b00 +Block 0002 [103]: 8111d5ef7eb2fd3d +Block 0002 [104]: 88bc12e37dfb1f51 +Block 0002 [105]: 706b7a1d6384bf60 +Block 0002 [106]: 1bc22344df9219a0 +Block 0002 [107]: 8f7ca7a93c0cc2f3 +Block 0002 [108]: 4f45b8e0a2529942 +Block 0002 [109]: e7b00d653cf2f13c +Block 0002 [110]: 67187d7826c89513 +Block 0002 [111]: 7754f65a9f702ba5 +Block 0002 [112]: 68a5bfea171493cc +Block 0002 [113]: deb3870509d40d3e +Block 0002 [114]: fb3690dee5a3fc15 +Block 0002 [115]: 02f3a66dbad140a3 +Block 0002 [116]: 44b70f1d0eabf627 +Block 0002 [117]: a57ce8e7d9cc1fce +Block 0002 [118]: 6831b2965eebf76f +Block 0002 [119]: 05303f957ebaf718 +Block 0002 [120]: 17a65879d3fb0003 +Block 0002 [121]: 6ab65ffaea096928 +Block 0002 [122]: 2164657f763a5dbe +Block 0002 [123]: 1d8072135dc98a7a +Block 0002 [124]: d2b2f7a5744d25b7 +Block 0002 [125]: 71314040af09b83d +Block 0002 [126]: 2f73ab3da08b6618 +Block 0002 [127]: 801c6c6324986446 +Block 0003 [ 0]: 64732568928f828e +Block 0003 [ 1]: f0e835abec79b14c +Block 0003 [ 2]: 4207566a57dafdc0 +Block 0003 [ 3]: 8c7214adc4de6a5c +Block 0003 [ 4]: 1ba9060d3fdbd2b1 +Block 0003 [ 5]: c283b201aaed5725 +Block 0003 [ 6]: fd7e524200d55194 +Block 0003 [ 7]: 9cad3f8488691d33 +Block 0003 [ 8]: f24250ba766eeea0 +Block 0003 [ 9]: 4dafb4ca2313c16a +Block 0003 [ 10]: fc1b1fdb788694d4 +Block 0003 [ 11]: fa314a001d805b18 +Block 0003 [ 12]: fc9b8a9e15eedbd6 +Block 0003 [ 13]: c1a95d732ea90450 +Block 0003 [ 14]: 747798647d3da8ee +Block 0003 [ 15]: b5486a8fabc5c299 +Block 0003 [ 16]: 23ff76548af23c21 +Block 0003 [ 17]: f662e50172dc06b4 +Block 0003 [ 18]: b99fe04efacbabc9 +Block 0003 [ 19]: 030c683e8be4b57e +Block 0003 [ 20]: c7d04e1e2f7eb1b7 +Block 0003 [ 21]: 06c758882e33c1d4 +Block 0003 [ 22]: 6ea19794559d0bac +Block 0003 [ 23]: 1f80b0b09de7b6cf +Block 0003 [ 24]: d46987c238db6213 +Block 0003 [ 25]: f0f363d487c64c01 +Block 0003 [ 26]: b20cf91dc47ee91c +Block 0003 [ 27]: 48fac840c62f466a +Block 0003 [ 28]: c7104baed50fbd2e +Block 0003 [ 29]: 7a7565f6163eb33e +Block 0003 [ 30]: baf293590025e736 +Block 0003 [ 31]: 638ddb2a0dcf89aa +Block 0003 [ 32]: 0bf1d84cd8c9548f +Block 0003 [ 33]: e173ce50e3ac7125 +Block 0003 [ 34]: 431a7a3b7020cd23 +Block 0003 [ 35]: 7312ca0186fcccac +Block 0003 [ 36]: 9c93dd7716859719 +Block 0003 [ 37]: b53476d68465f248 +Block 0003 [ 38]: 2c8ae3759ff45f6c +Block 0003 [ 39]: 89f858e6b950a51b +Block 0003 [ 40]: c024f8b01f375725 +Block 0003 [ 41]: e17760ffe78506fe +Block 0003 [ 42]: 67f71589fa342748 +Block 0003 [ 43]: c2bfb19181a1b336 +Block 0003 [ 44]: b117ceec5935ffec +Block 0003 [ 45]: 14e0f64aa4d6a5b3 +Block 0003 [ 46]: 5a03026316942429 +Block 0003 [ 47]: 788e7c14dbe17ab5 +Block 0003 [ 48]: 8e0eb445c3d928e8 +Block 0003 [ 49]: 523f883054d18325 +Block 0003 [ 50]: eb0bf194d4800e32 +Block 0003 [ 51]: 777275d6cc00e7fb +Block 0003 [ 52]: dca496f17a00aafe +Block 0003 [ 53]: 9cb2d38eec372050 +Block 0003 [ 54]: 4f93385cf1076d07 +Block 0003 [ 55]: fdc58139d57e6687 +Block 0003 [ 56]: 7e615f13e128b1bc +Block 0003 [ 57]: 4fb44deb8bbf5c5c +Block 0003 [ 58]: 54c6683b193dea25 +Block 0003 [ 59]: ca828ff49ea7ed7b +Block 0003 [ 60]: 23ef27dd6876b365 +Block 0003 [ 61]: 7b76f0bf2bc26e1c +Block 0003 [ 62]: eae5d4ac7f7144bf +Block 0003 [ 63]: b1f9099b11ededcc +Block 0003 [ 64]: 32cc9c81f017ba0e +Block 0003 [ 65]: 5b2444503a200158 +Block 0003 [ 66]: cecc6fc191799aae +Block 0003 [ 67]: d21109299e87add6 +Block 0003 [ 68]: 9a62b1fa3f2a5bb0 +Block 0003 [ 69]: 879d63a256449f83 +Block 0003 [ 70]: c4648ef65d063255 +Block 0003 [ 71]: ed478356d2d62771 +Block 0003 [ 72]: 0e26ca78fe098d30 +Block 0003 [ 73]: 40072329c48e1ec8 +Block 0003 [ 74]: 07e5bd63f3304854 +Block 0003 [ 75]: fb34638a5201ce10 +Block 0003 [ 76]: a951299757c793b0 +Block 0003 [ 77]: e368d57abe74ff7b +Block 0003 [ 78]: 85ec98ccb26290e7 +Block 0003 [ 79]: 53459ad4acf2da65 +Block 0003 [ 80]: c98a78858f14d347 +Block 0003 [ 81]: 9d8b22547d48916b +Block 0003 [ 82]: 80d0e8f5f215b88c +Block 0003 [ 83]: 5edbf7bcd02fd162 +Block 0003 [ 84]: 9954d82dec3ca03a +Block 0003 [ 85]: 444b538378d0a5d6 +Block 0003 [ 86]: 606066967cda56db +Block 0003 [ 87]: d7d491715b473467 +Block 0003 [ 88]: a6d02b9ecc8ff032 +Block 0003 [ 89]: 0595036c7117a22c +Block 0003 [ 90]: 11180cf417129d6d +Block 0003 [ 91]: aea26c1f97481b9c +Block 0003 [ 92]: cc45377f1ae1c8ee +Block 0003 [ 93]: 966793a197ca6057 +Block 0003 [ 94]: 85ac7fe90fb11019 +Block 0003 [ 95]: af2078d3ede0a983 +Block 0003 [ 96]: 7958ec6a4835c1ce +Block 0003 [ 97]: 9c2a859b73a07937 +Block 0003 [ 98]: 8b115dcfc1d79139 +Block 0003 [ 99]: 53094bc763b39413 +Block 0003 [100]: 9750583002d83564 +Block 0003 [101]: a4c554841aa2f5da +Block 0003 [102]: b3917593d039083b +Block 0003 [103]: 06f729fc1fb672ed +Block 0003 [104]: 038cd42a493d0293 +Block 0003 [105]: e20cde867860f38e +Block 0003 [106]: 62690da6b7c25ae7 +Block 0003 [107]: bd660101bac5a274 +Block 0003 [108]: 3523ebeb30ac0d6a +Block 0003 [109]: 76d94c2febc0f225 +Block 0003 [110]: 212d2f1a307cd09b +Block 0003 [111]: cb71474dc2bddc34 +Block 0003 [112]: 0cedb05f7f3999b7 +Block 0003 [113]: 59d49b2bdc5ff79f +Block 0003 [114]: 8f41dad377f98ea4 +Block 0003 [115]: 7e8c4f12f658b1be +Block 0003 [116]: b9ed73dd3c09bc2a +Block 0003 [117]: 4d70b50bf9f67b7c +Block 0003 [118]: b16376113c6b3388 +Block 0003 [119]: 1959de6ed1ea5ef7 +Block 0003 [120]: 2d05696db2182ffe +Block 0003 [121]: 0614bd82fda3c718 +Block 0003 [122]: 992fbd510b5095a3 +Block 0003 [123]: 6064c37e3677f6a8 +Block 0003 [124]: 5400f81ee75febe5 +Block 0003 [125]: e4ea20163ed41feb +Block 0003 [126]: aad145432d99ce84 +Block 0003 [127]: 28ca037ca0c948b5 +Block 0004 [ 0]: 9537a8d571e14dd2 +Block 0004 [ 1]: 4dc0ad51cc92ed8a +Block 0004 [ 2]: 55bd4ba9424aa6ff +Block 0004 [ 3]: a744762b554e1ec3 +Block 0004 [ 4]: d8320c91f51a677a +Block 0004 [ 5]: b2cf00025f31b59d +Block 0004 [ 6]: 01ae36ad13a305d4 +Block 0004 [ 7]: b9b9767808ea9c62 +Block 0004 [ 8]: 713d9125c3306797 +Block 0004 [ 9]: b61665cce9e83699 +Block 0004 [ 10]: 325d6eb6798a8584 +Block 0004 [ 11]: 4f07c3d6a680f5c2 +Block 0004 [ 12]: 0a09f03b8ce46486 +Block 0004 [ 13]: 6286566c595fba0b +Block 0004 [ 14]: e1ebe6e6c31431e8 +Block 0004 [ 15]: ffe04f39685d0461 +Block 0004 [ 16]: 53ca4927ae552083 +Block 0004 [ 17]: bfc0ac7bbfb0a523 +Block 0004 [ 18]: ef7007a863c595fa +Block 0004 [ 19]: 7843cde5fe943990 +Block 0004 [ 20]: bf2f584814389b08 +Block 0004 [ 21]: ed568f494f3b7f31 +Block 0004 [ 22]: 1504344614110bca +Block 0004 [ 23]: 993f1f0f045854bc +Block 0004 [ 24]: 158161730b7a01f5 +Block 0004 [ 25]: cedec86d0c6474f2 +Block 0004 [ 26]: 61277594ce55e9ef +Block 0004 [ 27]: 1ac9623722103320 +Block 0004 [ 28]: e0b1f7ff25d63fca +Block 0004 [ 29]: 561a1d0cfb2f7d0a +Block 0004 [ 30]: 9485584b613ae3fd +Block 0004 [ 31]: 23ef53706164ff5c +Block 0004 [ 32]: d75b09f417d430c0 +Block 0004 [ 33]: ff8b028717907100 +Block 0004 [ 34]: 875111393d253da7 +Block 0004 [ 35]: f458ee5ba05a9b78 +Block 0004 [ 36]: d33a40a8a389fbb5 +Block 0004 [ 37]: 89405e2c0126e397 +Block 0004 [ 38]: f0624eaf3617dd35 +Block 0004 [ 39]: 3339d799ca9fa273 +Block 0004 [ 40]: 7fa3e0e496d8d9b5 +Block 0004 [ 41]: 1cec3be146a79491 +Block 0004 [ 42]: bb4f051657fd1e2b +Block 0004 [ 43]: af33959d559547bc +Block 0004 [ 44]: fb6dd05eee469853 +Block 0004 [ 45]: f8ba2f1392589c80 +Block 0004 [ 46]: 5fc140faa08de7a8 +Block 0004 [ 47]: 4b3fdd5510eac7c7 +Block 0004 [ 48]: 29f31eed05b8526c +Block 0004 [ 49]: e5a75fce6e74c1d6 +Block 0004 [ 50]: 9ebca9c5b0e88888 +Block 0004 [ 51]: 54012deed102f6e8 +Block 0004 [ 52]: dc6aa4029c0feedd +Block 0004 [ 53]: b82cab65e5d81650 +Block 0004 [ 54]: 665ab42e1780c04f +Block 0004 [ 55]: 8336681730e97b0b +Block 0004 [ 56]: d9cc84a4b22d9b68 +Block 0004 [ 57]: b292fc773296606a +Block 0004 [ 58]: 32fadadded74ff6d +Block 0004 [ 59]: 5e255ad5bd09fd79 +Block 0004 [ 60]: 1c5d99287c2d81e4 +Block 0004 [ 61]: b21f3fddabcc79be +Block 0004 [ 62]: c2d4470091d2a399 +Block 0004 [ 63]: 4989fa7d69a80f25 +Block 0004 [ 64]: aa69da87b7db456a +Block 0004 [ 65]: 51fde513e2f7d7ae +Block 0004 [ 66]: 812d57ccc291d970 +Block 0004 [ 67]: 25b973a25beb11c3 +Block 0004 [ 68]: fee862dbadbf76ce +Block 0004 [ 69]: 04dbf43ecbf53aa8 +Block 0004 [ 70]: ccdc2c2b573af1f3 +Block 0004 [ 71]: e4b32bf0e0bfeaa6 +Block 0004 [ 72]: 3a3879ec1c6e004b +Block 0004 [ 73]: 107f4958b25af714 +Block 0004 [ 74]: fa4e0c74a0ee9e83 +Block 0004 [ 75]: 911bccc813b79cf6 +Block 0004 [ 76]: b497c614eb3a8c6c +Block 0004 [ 77]: d7a01e12f35f6e00 +Block 0004 [ 78]: c99ff61e804121dd +Block 0004 [ 79]: e3d05657ff5b4f90 +Block 0004 [ 80]: e48828629f5aed9f +Block 0004 [ 81]: cdc8aff4caa1f315 +Block 0004 [ 82]: 9013a736ab5fa851 +Block 0004 [ 83]: cbb8c9c276816950 +Block 0004 [ 84]: a67ece7c71b7ad02 +Block 0004 [ 85]: a0ed8a4f128f6ecb +Block 0004 [ 86]: fb62d4c0d755d0fc +Block 0004 [ 87]: 1091699fdab67e95 +Block 0004 [ 88]: 901d7aa388933dd5 +Block 0004 [ 89]: ba0ad9b7db68b704 +Block 0004 [ 90]: c8b46edf36578856 +Block 0004 [ 91]: b3d87a4ec5ff3a2d +Block 0004 [ 92]: 9c7d3eea8191b86d +Block 0004 [ 93]: 3f791b6883190899 +Block 0004 [ 94]: b694aa889c99fa7b +Block 0004 [ 95]: c42559f1608034fd +Block 0004 [ 96]: 5557e364bfd0674d +Block 0004 [ 97]: 9dbade36191fd2c0 +Block 0004 [ 98]: 1a47f258bc00bd52 +Block 0004 [ 99]: 56e4f50be8c33e69 +Block 0004 [100]: ee6c8f3e30c52581 +Block 0004 [101]: b6302207b64d8ed2 +Block 0004 [102]: 681bcd0107359d8a +Block 0004 [103]: 738a0384b182ac67 +Block 0004 [104]: 4941db6da14bf8f3 +Block 0004 [105]: 6ddf9e01ffd4cfc6 +Block 0004 [106]: b9fd089568236f38 +Block 0004 [107]: ea9a02ed74d0ce66 +Block 0004 [108]: b7c398164d2cec98 +Block 0004 [109]: 074b120be92e77e2 +Block 0004 [110]: 21554e4a0007f53a +Block 0004 [111]: 40bf8073b9818922 +Block 0004 [112]: af2b47782b6e69aa +Block 0004 [113]: 689a3140a931152c +Block 0004 [114]: ef127931b979b81f +Block 0004 [115]: 333d56e7771fde6d +Block 0004 [116]: d7dac660115eb2fe +Block 0004 [117]: 783f0447b10b0687 +Block 0004 [118]: 839287fa51814963 +Block 0004 [119]: 51fd8c9d26d2cfa6 +Block 0004 [120]: 98096c3229af0623 +Block 0004 [121]: f1e44616cf83a89d +Block 0004 [122]: d7dee4c489526646 +Block 0004 [123]: d1ff564c6e0cd950 +Block 0004 [124]: 4fafa266ced52aa7 +Block 0004 [125]: 22498eba46a04ef8 +Block 0004 [126]: 45b609663e3b7ce3 +Block 0004 [127]: ee22f7dd21561ac8 +Block 0005 [ 0]: 3cd2e94de90ca481 +Block 0005 [ 1]: dfba8ebdd159db11 +Block 0005 [ 2]: d4d9c891fc74618d +Block 0005 [ 3]: ee4a8995ad390d5b +Block 0005 [ 4]: 2dfbe3d914219e1d +Block 0005 [ 5]: 55649cca2df44184 +Block 0005 [ 6]: d08257933ed59497 +Block 0005 [ 7]: eef09b6cde6aa023 +Block 0005 [ 8]: 9470b40a38496b22 +Block 0005 [ 9]: 8b63c69dc20b94f3 +Block 0005 [ 10]: ab67bd14275990f4 +Block 0005 [ 11]: 278328cc9a689607 +Block 0005 [ 12]: 45bd50f8323de809 +Block 0005 [ 13]: e006cfe9893815ff +Block 0005 [ 14]: 7e7f1ea102228e0c +Block 0005 [ 15]: def383cbb711f355 +Block 0005 [ 16]: 375621a2ad73a6cb +Block 0005 [ 17]: 9e84a59a85925193 +Block 0005 [ 18]: 1447a30c4d2aee4a +Block 0005 [ 19]: 6654b312db275611 +Block 0005 [ 20]: d31d748bee47a017 +Block 0005 [ 21]: 510443570050a8f3 +Block 0005 [ 22]: ea626416bd3fa29e +Block 0005 [ 23]: 3c2cd53b276cd524 +Block 0005 [ 24]: 2b2083e1d220c4d8 +Block 0005 [ 25]: d94599d6f3785390 +Block 0005 [ 26]: 67dad7e6c48ebb00 +Block 0005 [ 27]: 6b92998802e30c96 +Block 0005 [ 28]: 645b1010baac196f +Block 0005 [ 29]: cf4282c3a8ef150c +Block 0005 [ 30]: 5cea9998241d0b66 +Block 0005 [ 31]: 1da03fc4761ee079 +Block 0005 [ 32]: 85544e5a0e0a40a7 +Block 0005 [ 33]: 7d2c97e52be32169 +Block 0005 [ 34]: eaa643ad41ed1c8a +Block 0005 [ 35]: 8e3a28e84a0d15b3 +Block 0005 [ 36]: 98ca6c4cde9f092b +Block 0005 [ 37]: c8397eff8a335a64 +Block 0005 [ 38]: bab0e00748aa1acc +Block 0005 [ 39]: 6979089506d97131 +Block 0005 [ 40]: 35fdb48046953cdd +Block 0005 [ 41]: e9329191b9f4586c +Block 0005 [ 42]: d8615adbab425d2f +Block 0005 [ 43]: 272a1a2d7a7e1554 +Block 0005 [ 44]: 74df2fecf4828a47 +Block 0005 [ 45]: 8d18d4efcd6b5999 +Block 0005 [ 46]: 026aa3c4d8365938 +Block 0005 [ 47]: cdc6eb20428ed057 +Block 0005 [ 48]: 587b106898200c89 +Block 0005 [ 49]: e4cbb4cc3292d8e4 +Block 0005 [ 50]: 8cd19eec986586e6 +Block 0005 [ 51]: 2dc92fc62f91f407 +Block 0005 [ 52]: 1995b751c561d8ed +Block 0005 [ 53]: a354a2cb47fb6d52 +Block 0005 [ 54]: 1edbaac5c88a5409 +Block 0005 [ 55]: 0603484ad13feb48 +Block 0005 [ 56]: 055a26aa8ba641be +Block 0005 [ 57]: 84df1bd3ba8e553e +Block 0005 [ 58]: 7b6863e87b5c4889 +Block 0005 [ 59]: 1f2f946a3193a989 +Block 0005 [ 60]: 5c41ad6c9307af04 +Block 0005 [ 61]: 51b014b4202c9e6c +Block 0005 [ 62]: bcd2327d0fc577eb +Block 0005 [ 63]: c707c191c590c79e +Block 0005 [ 64]: 57257237320ff10a +Block 0005 [ 65]: e48199dfc56bb7f0 +Block 0005 [ 66]: a05ab88148b58f38 +Block 0005 [ 67]: a82063473bd88e71 +Block 0005 [ 68]: 7ce490d805eb0802 +Block 0005 [ 69]: da09b404a4fd5d59 +Block 0005 [ 70]: 796b87be5f3ad540 +Block 0005 [ 71]: 832a6d5b275b9736 +Block 0005 [ 72]: e5dc09d9ff333c8f +Block 0005 [ 73]: bd325fae47103b43 +Block 0005 [ 74]: 842cc4b109936d28 +Block 0005 [ 75]: 0288ad46048a598b +Block 0005 [ 76]: 6e6aca4e2f64cc00 +Block 0005 [ 77]: 74531597ecfa1e36 +Block 0005 [ 78]: 413b81c34e0f35fd +Block 0005 [ 79]: 75f045e6159ec582 +Block 0005 [ 80]: 02b7e4158121f50c +Block 0005 [ 81]: facdab0b178e2d0e +Block 0005 [ 82]: 96dfc5937b23fd82 +Block 0005 [ 83]: d70cb31166d20062 +Block 0005 [ 84]: 19f89ce3f2dd58cb +Block 0005 [ 85]: 24982d720b762691 +Block 0005 [ 86]: d523f396f3a6eb3e +Block 0005 [ 87]: 9284f59b96bccaa1 +Block 0005 [ 88]: b8ea93e059626094 +Block 0005 [ 89]: d2ff2f61d0edf52f +Block 0005 [ 90]: 7712bb23fd5e9d3f +Block 0005 [ 91]: 327ccbdff1b9f0f9 +Block 0005 [ 92]: 1f78ae754cd9f907 +Block 0005 [ 93]: 9224a03220ae07a1 +Block 0005 [ 94]: ecd122202fd83f76 +Block 0005 [ 95]: 756f86991892353b +Block 0005 [ 96]: 209acb92814e6097 +Block 0005 [ 97]: f31ea1ea1d038547 +Block 0005 [ 98]: df8383e6e6d46768 +Block 0005 [ 99]: 204eb18e722413bb +Block 0005 [100]: 8272dc586305e4e5 +Block 0005 [101]: 6df368fdc20eecb4 +Block 0005 [102]: bb0d1440d64fa01d +Block 0005 [103]: f9e2b4c2b114be60 +Block 0005 [104]: 7b639d21f1a4c262 +Block 0005 [105]: 8e9e1f91102ef9c1 +Block 0005 [106]: d2872fbb0f21f30b +Block 0005 [107]: 4a9983530a52d87c +Block 0005 [108]: 6880c281e0ebb884 +Block 0005 [109]: 54fd1bf55c2da8d2 +Block 0005 [110]: e0b9f3163ab63d65 +Block 0005 [111]: 783d94c97ea356ff +Block 0005 [112]: 69458be8db9536e9 +Block 0005 [113]: dbcadae9ee38190d +Block 0005 [114]: ab0eb15bddcbf967 +Block 0005 [115]: 2d46dfc393f333b5 +Block 0005 [116]: 88fc92a12c24f8d6 +Block 0005 [117]: 85565f4cd6be55d5 +Block 0005 [118]: 22d83c79b8b18a0f +Block 0005 [119]: 2e333918c4a9abab +Block 0005 [120]: 5c495fc0b97433cd +Block 0005 [121]: 96d29cc3808c059f +Block 0005 [122]: a4cbfb8614fc4478 +Block 0005 [123]: 5f768a83d326cbf9 +Block 0005 [124]: 9e304b29e1a6a0bf +Block 0005 [125]: c022c4ff7eb1ddd5 +Block 0005 [126]: 742349c9da4a5c73 +Block 0005 [127]: 82004e9101493542 +Block 0006 [ 0]: cae85a2ceb8efc02 +Block 0006 [ 1]: 6d93381a5d1d8d86 +Block 0006 [ 2]: 49434e31aab85464 +Block 0006 [ 3]: 596e450733089895 +Block 0006 [ 4]: 7ad5266fb35c9dc6 +Block 0006 [ 5]: f103661c0f84cdcb +Block 0006 [ 6]: bdbe945901233f82 +Block 0006 [ 7]: 7a4fc3fa729bf6a9 +Block 0006 [ 8]: 411d8ecffde9d0bc +Block 0006 [ 9]: 3f3879677ae88a93 +Block 0006 [ 10]: 691d2256d8c12414 +Block 0006 [ 11]: 05404821b655cbdf +Block 0006 [ 12]: dc4a287118bd7a42 +Block 0006 [ 13]: f885e8da9e48d9a4 +Block 0006 [ 14]: ee20557eeca2759a +Block 0006 [ 15]: 9b57b912699d14b8 +Block 0006 [ 16]: 9ec2b555224f5056 +Block 0006 [ 17]: 45f8f99df3076f67 +Block 0006 [ 18]: 75188b4f06146b33 +Block 0006 [ 19]: fa1940bb72d8bfa9 +Block 0006 [ 20]: ee77215b5a6461be +Block 0006 [ 21]: 130e5694a4a657a6 +Block 0006 [ 22]: b6d6240eba5cff31 +Block 0006 [ 23]: 6c263e648845c25d +Block 0006 [ 24]: 010f505761537c16 +Block 0006 [ 25]: 2bcd8e8d78174280 +Block 0006 [ 26]: 09cc439d6038920b +Block 0006 [ 27]: 102e6fcadf8fab25 +Block 0006 [ 28]: 865536493af63e34 +Block 0006 [ 29]: 92ba807f489592c3 +Block 0006 [ 30]: fa63293e6bf3450d +Block 0006 [ 31]: 0ab2b18e20af652f +Block 0006 [ 32]: c98d6491c993727d +Block 0006 [ 33]: b91f68d6f2a0935b +Block 0006 [ 34]: 874208aaac5ea660 +Block 0006 [ 35]: fad07e63f8cdcb80 +Block 0006 [ 36]: 05ac511fa2ad4e9c +Block 0006 [ 37]: 91e2f2bef739eb7a +Block 0006 [ 38]: fa418b08d22535b8 +Block 0006 [ 39]: f3bdafdb79902895 +Block 0006 [ 40]: 4278119248e1374c +Block 0006 [ 41]: 2c15a1216716e84f +Block 0006 [ 42]: 06dc9d2d38aa5d01 +Block 0006 [ 43]: 3305f0e0c4a6bf15 +Block 0006 [ 44]: ee6d12b7dae3c9c0 +Block 0006 [ 45]: 9ce6de35c567a77e +Block 0006 [ 46]: aed4cd9f12f9791c +Block 0006 [ 47]: f544023b7aff183e +Block 0006 [ 48]: e239dd3ca8ea9d3f +Block 0006 [ 49]: 17d93ae3f4526473 +Block 0006 [ 50]: 2856d2082a92b453 +Block 0006 [ 51]: 600c119b6d555873 +Block 0006 [ 52]: 3dafb34abaa13aac +Block 0006 [ 53]: 8b9143da50cd92ef +Block 0006 [ 54]: c768a76c43beb3a7 +Block 0006 [ 55]: b125fa82ae2ef4f4 +Block 0006 [ 56]: c4918a79cc02e24d +Block 0006 [ 57]: 4d08a1876b80affe +Block 0006 [ 58]: c98370851d92e969 +Block 0006 [ 59]: e3db1a89b7c66b82 +Block 0006 [ 60]: a5402a035e74f02c +Block 0006 [ 61]: 7daa9f89a675fa9c +Block 0006 [ 62]: 48704bf794e0da1a +Block 0006 [ 63]: 2680b08618fdf25a +Block 0006 [ 64]: 9d5549d923fa207b +Block 0006 [ 65]: 458f138ffc7aded3 +Block 0006 [ 66]: 3b37e756328b99c6 +Block 0006 [ 67]: 04276fee936e3fba +Block 0006 [ 68]: 13f801049a751510 +Block 0006 [ 69]: 4018cb14f41af756 +Block 0006 [ 70]: 8fa9339cd9a10e80 +Block 0006 [ 71]: 9f7398196bcdb698 +Block 0006 [ 72]: 380d6e5db36b1e76 +Block 0006 [ 73]: 48322289e5744636 +Block 0006 [ 74]: 63c91ee0e2c28cfa +Block 0006 [ 75]: 9bda8b855e06fa54 +Block 0006 [ 76]: d411082aeb0decae +Block 0006 [ 77]: 9a81183d5ceeb7a0 +Block 0006 [ 78]: 5b521ded3990d418 +Block 0006 [ 79]: 34e6f3c32e525b4b +Block 0006 [ 80]: 88409ccd5c81fc37 +Block 0006 [ 81]: b7653a0babcf04d4 +Block 0006 [ 82]: bae435aab4d286f3 +Block 0006 [ 83]: 43732419de6f6d91 +Block 0006 [ 84]: 66371d8bd924e722 +Block 0006 [ 85]: 8f523e494a2ec953 +Block 0006 [ 86]: c2bceda3ed49f414 +Block 0006 [ 87]: ed6a64fa5a07244d +Block 0006 [ 88]: 61a1cf88debb7a05 +Block 0006 [ 89]: 85fdf531bc2c9a43 +Block 0006 [ 90]: 8bf9f05cff8eac65 +Block 0006 [ 91]: 9b52f433a222ff47 +Block 0006 [ 92]: 4ac5392090073723 +Block 0006 [ 93]: 07c0e145df5c2c24 +Block 0006 [ 94]: 28be9407aee2d860 +Block 0006 [ 95]: 7a6bc60d1354c7f0 +Block 0006 [ 96]: c524527490c63e7f +Block 0006 [ 97]: 9f0811bbe6b6a454 +Block 0006 [ 98]: 3f04d9d829c49e04 +Block 0006 [ 99]: c208949b51e67461 +Block 0006 [100]: d9df595fcb66c187 +Block 0006 [101]: d83c0989a89578d2 +Block 0006 [102]: 53eb66cc61df5273 +Block 0006 [103]: 220b69c92abb99f6 +Block 0006 [104]: 0ee4c8c6bfb270b1 +Block 0006 [105]: c402b2a60b9525d6 +Block 0006 [106]: f5b846806988ea0b +Block 0006 [107]: 989420c88849ed91 +Block 0006 [108]: 2e423daea0cd45ab +Block 0006 [109]: fbc8cab48993dc1c +Block 0006 [110]: a81466b266d649d3 +Block 0006 [111]: a1cf72a6980c8dec +Block 0006 [112]: e024e1561c0c0e55 +Block 0006 [113]: f5fa1c1120a3590c +Block 0006 [114]: b518502c3c71694a +Block 0006 [115]: e2ab9448cf43d8c1 +Block 0006 [116]: ffae6e44db873d57 +Block 0006 [117]: 5a0f0a08fd6a38a1 +Block 0006 [118]: 40ddbed30d3d9031 +Block 0006 [119]: 8da59292ddbc0263 +Block 0006 [120]: 10b7aabec6c51827 +Block 0006 [121]: 07f794acdff97a71 +Block 0006 [122]: c59fdc4356994dde +Block 0006 [123]: 4f3307d87776106a +Block 0006 [124]: befd22b455bc0865 +Block 0006 [125]: 701121ca8c9515d3 +Block 0006 [126]: 1ef8d046d0b9a563 +Block 0006 [127]: 39b63a35b9efdb99 +Block 0007 [ 0]: aa96f9e08367c767 +Block 0007 [ 1]: 649f858166f87ed5 +Block 0007 [ 2]: e3a12f109cb8c3d9 +Block 0007 [ 3]: 8812c38cd64c7d94 +Block 0007 [ 4]: 3ad89cea6c879850 +Block 0007 [ 5]: 4ad57f58078de647 +Block 0007 [ 6]: 7c91531334d0d4dc +Block 0007 [ 7]: a0fb2ac5e8b87cff +Block 0007 [ 8]: 484649d71b9d1e43 +Block 0007 [ 9]: 094f7304f8ab4c8a +Block 0007 [ 10]: 6df95fa9e9a3f3f8 +Block 0007 [ 11]: e623e88cef2337d0 +Block 0007 [ 12]: e88d11f6d2ed8a35 +Block 0007 [ 13]: 4432c0595c14f75e +Block 0007 [ 14]: 258bd33ca56c8a19 +Block 0007 [ 15]: 6cc890994f178d88 +Block 0007 [ 16]: 38fd3ad0a8d8d873 +Block 0007 [ 17]: ff00206d6f40d106 +Block 0007 [ 18]: 40c1540922ad3309 +Block 0007 [ 19]: ac62185a61a98e5a +Block 0007 [ 20]: a52969af6f33c5f9 +Block 0007 [ 21]: 07a5ed928429d229 +Block 0007 [ 22]: c050a35ba5c589a6 +Block 0007 [ 23]: 8ca12828ceca882a +Block 0007 [ 24]: b68899a29a8a8409 +Block 0007 [ 25]: 909b0feb3da3956b +Block 0007 [ 26]: e6187a3fde82a3d9 +Block 0007 [ 27]: 2cfbaffc07547b7e +Block 0007 [ 28]: bc87b96179db239c +Block 0007 [ 29]: 15f6a8b3f195469e +Block 0007 [ 30]: 8ccc5a4bad93dd85 +Block 0007 [ 31]: f28389eab823c396 +Block 0007 [ 32]: 5c878a746f493847 +Block 0007 [ 33]: dc630599ea9a7a43 +Block 0007 [ 34]: be8f61cede964c9f +Block 0007 [ 35]: 0a0aed40cd05eeab +Block 0007 [ 36]: 7bee51bc54fa558c +Block 0007 [ 37]: cb4c7f727bb2b0e8 +Block 0007 [ 38]: 3e7f5a7844614578 +Block 0007 [ 39]: 820ef308cc67186e +Block 0007 [ 40]: 4ec109927b4043be +Block 0007 [ 41]: f9e4071f5f488bfb +Block 0007 [ 42]: a94607b9b6b215a0 +Block 0007 [ 43]: 28827d5daa40fc2f +Block 0007 [ 44]: 54f31e9dfab0345c +Block 0007 [ 45]: 887c56da37c6e314 +Block 0007 [ 46]: 1148953965073ce8 +Block 0007 [ 47]: c01ae7f35cd7c0ac +Block 0007 [ 48]: e776abf00711922d +Block 0007 [ 49]: 482b7bbafc9c6b93 +Block 0007 [ 50]: 97e6bf7879562de0 +Block 0007 [ 51]: 23d739237098aa07 +Block 0007 [ 52]: bdc9b4185d94ade7 +Block 0007 [ 53]: c63b815b15f2796b +Block 0007 [ 54]: 8553ac1b6a37be91 +Block 0007 [ 55]: 4fe3e5356b9ed266 +Block 0007 [ 56]: 6b2d180c55f275ec +Block 0007 [ 57]: d4fa4fb13209f598 +Block 0007 [ 58]: 5443aa93e28afa7b +Block 0007 [ 59]: 6b647752d66f57b7 +Block 0007 [ 60]: 9666cff649c996d5 +Block 0007 [ 61]: 7bd692c2d21a5047 +Block 0007 [ 62]: eb7c79815024a53b +Block 0007 [ 63]: 1d5196d7fb6f63a1 +Block 0007 [ 64]: ac79fa1a8b4dc7f8 +Block 0007 [ 65]: a8df09a098c0be84 +Block 0007 [ 66]: a0a54a9d55b0b259 +Block 0007 [ 67]: 9ac055953106d3f9 +Block 0007 [ 68]: cecfbbbd0a75b297 +Block 0007 [ 69]: d8f24f0b6bb69dc5 +Block 0007 [ 70]: 378ebbd76c6e3a90 +Block 0007 [ 71]: acd6e360894ee0a3 +Block 0007 [ 72]: ca2554b43fdb94fd +Block 0007 [ 73]: d3f9cde1e592226f +Block 0007 [ 74]: 0dbfb10f2f1efae9 +Block 0007 [ 75]: c71e2c6c043d4dd6 +Block 0007 [ 76]: 542b5306ef9f6d3d +Block 0007 [ 77]: 76edfa648496c329 +Block 0007 [ 78]: 250612884c4f0b85 +Block 0007 [ 79]: 6075f1ce858b87e6 +Block 0007 [ 80]: 104f24fd6dd36325 +Block 0007 [ 81]: e877c408d7628431 +Block 0007 [ 82]: bfde93ac7c25c4c3 +Block 0007 [ 83]: 5df386f7c1ec1683 +Block 0007 [ 84]: b71ecaddf313cf0e +Block 0007 [ 85]: a12579e2673e01d6 +Block 0007 [ 86]: 2ad19a0604cd5fe9 +Block 0007 [ 87]: 272ea01051cb6358 +Block 0007 [ 88]: a2d7685936a4ceb4 +Block 0007 [ 89]: b3e3249849509375 +Block 0007 [ 90]: 6b8203a8e0c94907 +Block 0007 [ 91]: 1d688c4a3f966428 +Block 0007 [ 92]: 2016b91b50f0f449 +Block 0007 [ 93]: 4d5e3e8b2fd48920 +Block 0007 [ 94]: 9ce0e560887cf9d3 +Block 0007 [ 95]: 8bf1c4fe311f6941 +Block 0007 [ 96]: eea996cf128b79fd +Block 0007 [ 97]: 87d2181997f90c9f +Block 0007 [ 98]: 2e6ff5336274c0b1 +Block 0007 [ 99]: 07bcbc51de405ed5 +Block 0007 [100]: 58528c033854e6c4 +Block 0007 [101]: 1e74bb2c415e259a +Block 0007 [102]: 81257185b52075ed +Block 0007 [103]: f69a6f103e6d90d9 +Block 0007 [104]: 2957fac276b0ecf3 +Block 0007 [105]: 73bf7c5536294f71 +Block 0007 [106]: 9a6275570ed2df1d +Block 0007 [107]: ccf4ba74c777f8ee +Block 0007 [108]: eaff28c6db196040 +Block 0007 [109]: d54fe5cf5874a657 +Block 0007 [110]: c93036465726f57f +Block 0007 [111]: b660605a42952da9 +Block 0007 [112]: d4ab99d7310068cd +Block 0007 [113]: 21f7fb4e319084ce +Block 0007 [114]: 519edf5d36936eb9 +Block 0007 [115]: b2c82d19c105271a +Block 0007 [116]: 718dfcd0eb783bc5 +Block 0007 [117]: b235745fdf50c280 +Block 0007 [118]: b7b333715a491c57 +Block 0007 [119]: 4d1d58bf981fc3ff +Block 0007 [120]: 09142593a9e31264 +Block 0007 [121]: 2ba15f73ae641cdb +Block 0007 [122]: 0dbedd4b8ad66694 +Block 0007 [123]: a2e08ce9a67e410d +Block 0007 [124]: 3c33479a6316a3d4 +Block 0007 [125]: b49dcf61cc1ee0f7 +Block 0007 [126]: 554dd48bd5a57ba3 +Block 0007 [127]: 7f62bde60a68421f +Block 0008 [ 0]: 92f6d6ca261fc8cf +Block 0008 [ 1]: 46231b8ea96831aa +Block 0008 [ 2]: d7b240430ce761e2 +Block 0008 [ 3]: 78bf44b216c84d15 +Block 0008 [ 4]: 233673b6dbc99394 +Block 0008 [ 5]: fef85a6245b2959f +Block 0008 [ 6]: b50611c7b12700a3 +Block 0008 [ 7]: b1d5b20c38fd698b +Block 0008 [ 8]: ed05bdf565eb1670 +Block 0008 [ 9]: c1bd5b774427ee83 +Block 0008 [ 10]: 662366030971d978 +Block 0008 [ 11]: a3672fc5e14d3835 +Block 0008 [ 12]: 396f9f9e5fdc007d +Block 0008 [ 13]: 9c2af96d848a18ec +Block 0008 [ 14]: 17753b738206411c +Block 0008 [ 15]: 1173420c24118788 +Block 0008 [ 16]: 0a6a9f243be7ee99 +Block 0008 [ 17]: 2b7e600ca9aaa924 +Block 0008 [ 18]: c0766db77b8640b6 +Block 0008 [ 19]: 7d32c2e8b617fb00 +Block 0008 [ 20]: 55aeb0119138c0d4 +Block 0008 [ 21]: 0da720da65b9f532 +Block 0008 [ 22]: 9ebd62381d2d5491 +Block 0008 [ 23]: 79cb72a785dde658 +Block 0008 [ 24]: e76297c84f559e80 +Block 0008 [ 25]: a2b36a54e16f0260 +Block 0008 [ 26]: 3c6f3f453a1bd215 +Block 0008 [ 27]: 74330ed8f77ec3f1 +Block 0008 [ 28]: 331dde512c425385 +Block 0008 [ 29]: 9fc0c6ccb30db6e6 +Block 0008 [ 30]: 774aafaf5dcc91b5 +Block 0008 [ 31]: 9b05e8f3b4a8189f +Block 0008 [ 32]: 82e0b0bdd1398b73 +Block 0008 [ 33]: 0cb016fab2a01997 +Block 0008 [ 34]: 3be4263af97114bc +Block 0008 [ 35]: 0d55775808650824 +Block 0008 [ 36]: 8105fea6f9a6deb4 +Block 0008 [ 37]: e6a69e43428e0116 +Block 0008 [ 38]: d1dae82531d7f6a0 +Block 0008 [ 39]: 75f3152168bcef9b +Block 0008 [ 40]: 5324b2ae324a2354 +Block 0008 [ 41]: 33ed57275072eb06 +Block 0008 [ 42]: 7e9e632411ee708d +Block 0008 [ 43]: 9bcce35940c7159c +Block 0008 [ 44]: f5af40b874b2a402 +Block 0008 [ 45]: 110c586d5e1c1188 +Block 0008 [ 46]: 978d2662424a4bac +Block 0008 [ 47]: a656e414d797b095 +Block 0008 [ 48]: 0970f7c8c6075dec +Block 0008 [ 49]: 6ff3e812a7f1aa46 +Block 0008 [ 50]: eee42ac2dbcb5760 +Block 0008 [ 51]: 4e8489009f2a83d5 +Block 0008 [ 52]: fea08093f6f4ed51 +Block 0008 [ 53]: 352247f19ec0e53f +Block 0008 [ 54]: 82d807f61412e2b5 +Block 0008 [ 55]: 3276543fce1e8ba9 +Block 0008 [ 56]: 305629c5c3b64aed +Block 0008 [ 57]: 5b6f8f456b643373 +Block 0008 [ 58]: 9d0f9c2a4c8f060b +Block 0008 [ 59]: 438294ae3de753ce +Block 0008 [ 60]: b0a6e33302a9deff +Block 0008 [ 61]: b10592023513b0b9 +Block 0008 [ 62]: f8c79b71c102905b +Block 0008 [ 63]: 43b4413873a270ba +Block 0008 [ 64]: d34f5c5e0998a1f8 +Block 0008 [ 65]: 19f5df3546045ba8 +Block 0008 [ 66]: dcece1ca7a0dcd19 +Block 0008 [ 67]: bc53d2ae75a68004 +Block 0008 [ 68]: 54f7e9cdaa7e569e +Block 0008 [ 69]: 94aba4e907e3ad17 +Block 0008 [ 70]: 8e09815df38d82ad +Block 0008 [ 71]: 52ebb7d86386430e +Block 0008 [ 72]: adfa72bf58111b6f +Block 0008 [ 73]: 9a97a34d02f35c55 +Block 0008 [ 74]: 88a5f560607896e6 +Block 0008 [ 75]: 30e3deba10a0e2c7 +Block 0008 [ 76]: a88c9001142218f0 +Block 0008 [ 77]: 34443da1afe34ad5 +Block 0008 [ 78]: dff9a8672d9c3c16 +Block 0008 [ 79]: 4c922e79b39902a0 +Block 0008 [ 80]: 8c87abe539b79af1 +Block 0008 [ 81]: c27dd77ff32e7546 +Block 0008 [ 82]: 32394933c3cf5e0c +Block 0008 [ 83]: 579cd4a121e76b03 +Block 0008 [ 84]: d0ddc746442ea314 +Block 0008 [ 85]: 268e280ea0775645 +Block 0008 [ 86]: 255c28d63c7288b4 +Block 0008 [ 87]: 220aba41a338f9e4 +Block 0008 [ 88]: fff7450697217135 +Block 0008 [ 89]: 3c5ef84ee9febcfc +Block 0008 [ 90]: ca1fe3294dc518c7 +Block 0008 [ 91]: a562721d4f6bbf01 +Block 0008 [ 92]: fc33d7633e7dcc7d +Block 0008 [ 93]: cfb8c4bbd4953e6e +Block 0008 [ 94]: 01bbf2c52cac42c2 +Block 0008 [ 95]: b65219c09fd95934 +Block 0008 [ 96]: e96d416d0ccab83d +Block 0008 [ 97]: c4f88891388c48ee +Block 0008 [ 98]: d6a10504939a858e +Block 0008 [ 99]: 713907c339464081 +Block 0008 [100]: 6e1fb4478d2ce08c +Block 0008 [101]: 834969ca83993eef +Block 0008 [102]: fd91b73ae90795e0 +Block 0008 [103]: d9cfa18953aea3f9 +Block 0008 [104]: 1eb6a19221268e59 +Block 0008 [105]: c0ad63c783ac8007 +Block 0008 [106]: 1a2d426c6dc70c86 +Block 0008 [107]: 26d59d50f8388ec8 +Block 0008 [108]: a80437af7437599c +Block 0008 [109]: 6969260f334d5d82 +Block 0008 [110]: 00dfd4895631ef90 +Block 0008 [111]: dfd0efe509122127 +Block 0008 [112]: b52af91406aff929 +Block 0008 [113]: adb32b6ab6fdcbd7 +Block 0008 [114]: 3e89d6ace903a5d8 +Block 0008 [115]: d11fd78a1445e270 +Block 0008 [116]: bdadee3624fbefd4 +Block 0008 [117]: 424ff6da14872281 +Block 0008 [118]: 6dd4cf79eaa5797b +Block 0008 [119]: f176c7ecc2872fb3 +Block 0008 [120]: a79bfc8746f264b9 +Block 0008 [121]: 9625eb7aa57c52eb +Block 0008 [122]: ac854065c1dc3575 +Block 0008 [123]: cf4b92c820e2d280 +Block 0008 [124]: 3c5b29c8ab4c7d21 +Block 0008 [125]: 81a16e1d57a4a742 +Block 0008 [126]: 0a59951bb4a5350b +Block 0008 [127]: 5afbe0d24e05c8a6 +Block 0009 [ 0]: 861d303a02999e8e +Block 0009 [ 1]: 39bff09c822fdbc0 +Block 0009 [ 2]: 622b81abdc3f4a32 +Block 0009 [ 3]: ab9d09e5dfd64194 +Block 0009 [ 4]: 326a874cec237f12 +Block 0009 [ 5]: 8fb67fab8060e98c +Block 0009 [ 6]: d2d74a1c2f83d3d3 +Block 0009 [ 7]: 2f55faf116707ea5 +Block 0009 [ 8]: 79da12d2f0c3e61a +Block 0009 [ 9]: 891d23c5a9412f39 +Block 0009 [ 10]: 6cdd30456923f037 +Block 0009 [ 11]: 14d3ce76187b9c60 +Block 0009 [ 12]: 936f98d58d2218f3 +Block 0009 [ 13]: 628ee9e7c16b3580 +Block 0009 [ 14]: 71f65d809281dd0b +Block 0009 [ 15]: 775d67d622193f7e +Block 0009 [ 16]: 4a22de00a7c3b0c0 +Block 0009 [ 17]: b0ff5e3db98eeed5 +Block 0009 [ 18]: c4ef45496b302eb2 +Block 0009 [ 19]: 4a2c2b6b8a87d99c +Block 0009 [ 20]: cc850382694f8c0e +Block 0009 [ 21]: c022ab6a59ba02b1 +Block 0009 [ 22]: 2b350ffab1420e6f +Block 0009 [ 23]: 97c40487830a1ddd +Block 0009 [ 24]: eb2c092a9a8a5a9a +Block 0009 [ 25]: 6fef1e9dbee32d55 +Block 0009 [ 26]: b9da76a743ce6df8 +Block 0009 [ 27]: 80d9afd64c6c21b0 +Block 0009 [ 28]: 8956b45ae00aa70b +Block 0009 [ 29]: 6802ece7ab96c121 +Block 0009 [ 30]: 00ee32a4a2ca9d90 +Block 0009 [ 31]: 9f0e1f59571a3276 +Block 0009 [ 32]: 8ac3d2cf84ebb6b5 +Block 0009 [ 33]: e2e94ddfeaac1f8b +Block 0009 [ 34]: f9a025b84c989037 +Block 0009 [ 35]: c1f33f3cba4c0ad1 +Block 0009 [ 36]: 198d388d3756c187 +Block 0009 [ 37]: 431ca049992cd38e +Block 0009 [ 38]: d468ada99b30f701 +Block 0009 [ 39]: 2fcd5b0b5dabc78f +Block 0009 [ 40]: 649f86945f38593a +Block 0009 [ 41]: 213ee790f61abd50 +Block 0009 [ 42]: 39b0cb1110006813 +Block 0009 [ 43]: b5703b76384430ad +Block 0009 [ 44]: 3eaeebeb30fcc9f9 +Block 0009 [ 45]: 9a5dd247256ef2c8 +Block 0009 [ 46]: b9985bc60977cda1 +Block 0009 [ 47]: 62cdd6be32a5d84c +Block 0009 [ 48]: af8858bf60bb22fb +Block 0009 [ 49]: 7f5f239c2b2f7ca0 +Block 0009 [ 50]: b71a7a67cf14960f +Block 0009 [ 51]: 7911708c3a71d21b +Block 0009 [ 52]: 4408de99594ba448 +Block 0009 [ 53]: 423fc44df0684f3e +Block 0009 [ 54]: 2e0c36453dd361a0 +Block 0009 [ 55]: 2d7c96f01c7fd189 +Block 0009 [ 56]: ddfdd016b5a9cebe +Block 0009 [ 57]: 2fd26d237640f4e6 +Block 0009 [ 58]: 47f5f2444af6c7cf +Block 0009 [ 59]: 0d3b91052b41c61e +Block 0009 [ 60]: d62f462898904aeb +Block 0009 [ 61]: 4b470aba5f110e6a +Block 0009 [ 62]: ffbe1984153237fb +Block 0009 [ 63]: f9df2c0fcd574baf +Block 0009 [ 64]: 08a6531cd251adfb +Block 0009 [ 65]: 1decd865fc6e0472 +Block 0009 [ 66]: bce66f9ea598171a +Block 0009 [ 67]: f5f88f984a85ee08 +Block 0009 [ 68]: feb94e6b9343480f +Block 0009 [ 69]: 2d611326d643c179 +Block 0009 [ 70]: 40a46d7c231ab873 +Block 0009 [ 71]: 4d406e17273b6c99 +Block 0009 [ 72]: 6b28c89629bcfbb4 +Block 0009 [ 73]: a748f1788d8a8a5c +Block 0009 [ 74]: ffb3b25cb52ea498 +Block 0009 [ 75]: 44817bdbe66a4938 +Block 0009 [ 76]: 9d80db4fc1cddbd9 +Block 0009 [ 77]: a1c9ebbad8bdc094 +Block 0009 [ 78]: b2ce16610b569c06 +Block 0009 [ 79]: e13ef6abd5b78468 +Block 0009 [ 80]: 3593f789c862423b +Block 0009 [ 81]: 756c40de660aab62 +Block 0009 [ 82]: 447a830e3f02dc0b +Block 0009 [ 83]: 9b2816be8209816b +Block 0009 [ 84]: 1a2e31d8cd87e262 +Block 0009 [ 85]: c162dfea41dfbeca +Block 0009 [ 86]: f1f5ae63bf8992f0 +Block 0009 [ 87]: 163c3c7ac5d4a7b0 +Block 0009 [ 88]: 5cc9ba44845532c8 +Block 0009 [ 89]: cc991c2f782193f6 +Block 0009 [ 90]: a657bcd3365b522e +Block 0009 [ 91]: 04a272455d7de47f +Block 0009 [ 92]: 4de4b0911e7d01b6 +Block 0009 [ 93]: 2a64bfd12cef0747 +Block 0009 [ 94]: 4f870d2fe4aa5fc6 +Block 0009 [ 95]: ee8b0743542e9751 +Block 0009 [ 96]: cd64ea70a570d282 +Block 0009 [ 97]: c4ab20bb416c6943 +Block 0009 [ 98]: 841bb1199cb466cd +Block 0009 [ 99]: f60f32b0b68e4f2d +Block 0009 [100]: 1a71dc489bd5c3e1 +Block 0009 [101]: c53b31169829e4bd +Block 0009 [102]: cd2c064dd76b1865 +Block 0009 [103]: 2b4a556a60e999e9 +Block 0009 [104]: 9909c2b0a72e2fa9 +Block 0009 [105]: eae2c80121344389 +Block 0009 [106]: d69778d04e1a09af +Block 0009 [107]: 32f17b7202372cc1 +Block 0009 [108]: 00790b7928166164 +Block 0009 [109]: a3fb0db8a27f0a52 +Block 0009 [110]: 1fd50e78d45abf18 +Block 0009 [111]: ace28638e7964859 +Block 0009 [112]: 365d9776d1d13dd4 +Block 0009 [113]: 466a93251e133b44 +Block 0009 [114]: dba49ff0b3b9fbfa +Block 0009 [115]: 6ea36c0808696c7b +Block 0009 [116]: 19c4e2fe051d08f7 +Block 0009 [117]: d0f9c63843224913 +Block 0009 [118]: ebc7e793b642d70f +Block 0009 [119]: 6de8c83fe37b7836 +Block 0009 [120]: b2b2af5741a01d6a +Block 0009 [121]: 31717aa7407194ac +Block 0009 [122]: eb34348ac46cb928 +Block 0009 [123]: 95e2142661045702 +Block 0009 [124]: 82892ec15063676a +Block 0009 [125]: 0a93ffd5635a838c +Block 0009 [126]: f5054bb7e05f8478 +Block 0009 [127]: f0e32a040eb8d62c +Block 0010 [ 0]: 110297f463d4717e +Block 0010 [ 1]: 3828eb6209d28c20 +Block 0010 [ 2]: 35c1584b1757b98d +Block 0010 [ 3]: 771c3556525c54af +Block 0010 [ 4]: 5226e0fa8b5a97be +Block 0010 [ 5]: d4404af7854f4531 +Block 0010 [ 6]: e91725de137e3987 +Block 0010 [ 7]: d1a77075a0e6bb9d +Block 0010 [ 8]: cd2f8e8fb6d0901b +Block 0010 [ 9]: 7e246e279c85e964 +Block 0010 [ 10]: 0da2a382740fa23f +Block 0010 [ 11]: ddbe4942cc122308 +Block 0010 [ 12]: 7a3d92ac09975af1 +Block 0010 [ 13]: 8d210d589a07defd +Block 0010 [ 14]: d12322eadbed1288 +Block 0010 [ 15]: 626edcd2444b7c78 +Block 0010 [ 16]: e10856c39889ccba +Block 0010 [ 17]: 1e7ce7e9b0d7f793 +Block 0010 [ 18]: 03022c6f8619397c +Block 0010 [ 19]: 61cadf5c6c612d5f +Block 0010 [ 20]: 266a8188eb214c7a +Block 0010 [ 21]: 8f91d5c0bf6f3bbd +Block 0010 [ 22]: 10da2e0b78c9e301 +Block 0010 [ 23]: 46f4a4577e3c3755 +Block 0010 [ 24]: 099b19a75a149e97 +Block 0010 [ 25]: f977352167b9048f +Block 0010 [ 26]: ed87004d3f744f8e +Block 0010 [ 27]: 8980201a571eeaac +Block 0010 [ 28]: f8775f7233d82ef5 +Block 0010 [ 29]: 81ad57684a96a61c +Block 0010 [ 30]: fa0e5b145e36e1c0 +Block 0010 [ 31]: 5da6470b7e51be0a +Block 0010 [ 32]: 5cd1fe96302b8b27 +Block 0010 [ 33]: d38b9cf01a52f2f8 +Block 0010 [ 34]: fa7bfeb316d67b52 +Block 0010 [ 35]: 5173a803996cad74 +Block 0010 [ 36]: 37a46313dc93e2ff +Block 0010 [ 37]: 044735689012d83d +Block 0010 [ 38]: 99cd36a5787006e7 +Block 0010 [ 39]: e2aa7201b180dc9c +Block 0010 [ 40]: 384f6cbd27e96f5d +Block 0010 [ 41]: 33e0f9f86a59665a +Block 0010 [ 42]: 17991cc270086db8 +Block 0010 [ 43]: cf93f6aa37ab95d2 +Block 0010 [ 44]: 1f2728468af489c9 +Block 0010 [ 45]: 804443ff55476398 +Block 0010 [ 46]: 5b7ed05930a6c76c +Block 0010 [ 47]: d97b71273879328a +Block 0010 [ 48]: e6950700c420861d +Block 0010 [ 49]: 2efcb94c032a0a7f +Block 0010 [ 50]: 7f4cf4eb22135d4d +Block 0010 [ 51]: e3b10b4195f7f945 +Block 0010 [ 52]: 006bb903385536a4 +Block 0010 [ 53]: 77ca0b9a29c058db +Block 0010 [ 54]: 9d8a471366bd13cb +Block 0010 [ 55]: 40d9cf15a3986f5f +Block 0010 [ 56]: 50a080ed23996ea3 +Block 0010 [ 57]: 11e420bea0c08fb7 +Block 0010 [ 58]: 2e85b9ddad230198 +Block 0010 [ 59]: f50b554c8bfbb3b7 +Block 0010 [ 60]: 08a7d72d8aa342c6 +Block 0010 [ 61]: 6cc80e83f2c15811 +Block 0010 [ 62]: b3a6e194a6fda8c0 +Block 0010 [ 63]: d7f74e7aa4f4d630 +Block 0010 [ 64]: 2df488549fb0f8dd +Block 0010 [ 65]: 9a5bc68d4474cd5c +Block 0010 [ 66]: d41aca980d1f2603 +Block 0010 [ 67]: df6552b8d6654437 +Block 0010 [ 68]: 983a9339b96cb1b8 +Block 0010 [ 69]: e3071ef62bf10360 +Block 0010 [ 70]: 3eaaa277b6d1bafc +Block 0010 [ 71]: 172345b0d9558fed +Block 0010 [ 72]: 97319c89c731a02c +Block 0010 [ 73]: 8ff07e264876973f +Block 0010 [ 74]: 01c32c0c0d654104 +Block 0010 [ 75]: 5f53661a1ee1b4c6 +Block 0010 [ 76]: a9c3da1ad696a16a +Block 0010 [ 77]: 30fe71394a311283 +Block 0010 [ 78]: 0f430ad1dea89c48 +Block 0010 [ 79]: fff048ac83a64f90 +Block 0010 [ 80]: c972527bf676f382 +Block 0010 [ 81]: ecb9a1ecb1be64c4 +Block 0010 [ 82]: 9c13e375c2ab34fd +Block 0010 [ 83]: 075bc62ae5a021b5 +Block 0010 [ 84]: 3f9b3f22818dd97d +Block 0010 [ 85]: 3eae713ae75fafaa +Block 0010 [ 86]: def4641c47a181f5 +Block 0010 [ 87]: 2ad7ac99f83eb6ef +Block 0010 [ 88]: 8d9bf96f4262d9a1 +Block 0010 [ 89]: 4bf1edb2dc479604 +Block 0010 [ 90]: 406c2f505dabf0a7 +Block 0010 [ 91]: 0776ad101c034fab +Block 0010 [ 92]: 2857c04f873dafca +Block 0010 [ 93]: a552f1e8ffa8ec48 +Block 0010 [ 94]: cd4ac3951c1c7ac8 +Block 0010 [ 95]: 991a387dc304b4d3 +Block 0010 [ 96]: 4a62ae26332cf695 +Block 0010 [ 97]: 99989a5b0ec7afe5 +Block 0010 [ 98]: ab2b76e0fb2e34dd +Block 0010 [ 99]: d3d09e0fa3dc5e77 +Block 0010 [100]: 7414b924a1f4f9fd +Block 0010 [101]: 01081a97e3667c3e +Block 0010 [102]: a879d8ae57621b88 +Block 0010 [103]: b252f12b3a3992d9 +Block 0010 [104]: b239a13aec939a49 +Block 0010 [105]: 029148ded8d39810 +Block 0010 [106]: 0f09288a2e1ad2b8 +Block 0010 [107]: f289a0a95b9d76fc +Block 0010 [108]: bc151f281383fb02 +Block 0010 [109]: f3bfe6a2939a9c5f +Block 0010 [110]: 4951bd53b83739ea +Block 0010 [111]: 20062e7ccefa3c7f +Block 0010 [112]: 20049fbcca6e1276 +Block 0010 [113]: 6554bd2ba666dbdf +Block 0010 [114]: b84b84abc76ff06e +Block 0010 [115]: 2816898ed2d362c1 +Block 0010 [116]: 2cc5d0406a9b8a30 +Block 0010 [117]: 5cb404b772ec2e72 +Block 0010 [118]: 30ff618b95dd0ca4 +Block 0010 [119]: 197e19f88bbb4c54 +Block 0010 [120]: 8efd88b018876d72 +Block 0010 [121]: d16ce6880bb48af0 +Block 0010 [122]: 8279d270c5ae1b3b +Block 0010 [123]: 6f23fa0e7ede09c2 +Block 0010 [124]: dd73f98a2379858e +Block 0010 [125]: 6fe85bbab6b21a5a +Block 0010 [126]: c05d149be2380f54 +Block 0010 [127]: d1ae698a35b02155 +Block 0011 [ 0]: bf619ba9cd33f95c +Block 0011 [ 1]: 0d2ac712c43a258a +Block 0011 [ 2]: d9dd4ee0d026984d +Block 0011 [ 3]: 646f79b969d84848 +Block 0011 [ 4]: 6d70dafdc7603cca +Block 0011 [ 5]: f12d6b70c293bef8 +Block 0011 [ 6]: 489e389aa5a7c24a +Block 0011 [ 7]: 086272b565165ee5 +Block 0011 [ 8]: c9f4fb5a39048c4d +Block 0011 [ 9]: a6f603aa70d9e5d2 +Block 0011 [ 10]: 3bf25a0bb1f7ac38 +Block 0011 [ 11]: 14ddd25c2d5e3596 +Block 0011 [ 12]: faa4e84c465394d8 +Block 0011 [ 13]: f8ef145f6844f82f +Block 0011 [ 14]: f9549b745c33d239 +Block 0011 [ 15]: b396a5075f3d4296 +Block 0011 [ 16]: 3d469a0b36f79da8 +Block 0011 [ 17]: d95f7a181fc9efbc +Block 0011 [ 18]: acf4136c4277bd85 +Block 0011 [ 19]: d77857338a5e203c +Block 0011 [ 20]: 63bf886f0d376e4d +Block 0011 [ 21]: 4afc35e28228b78b +Block 0011 [ 22]: 88ce07494723a779 +Block 0011 [ 23]: ec0a4672f81e2455 +Block 0011 [ 24]: 9b274d635cc92fbf +Block 0011 [ 25]: 8e6d72ea1532273a +Block 0011 [ 26]: b788d44eec8ed38f +Block 0011 [ 27]: ca0b197b4dc4c8e0 +Block 0011 [ 28]: 092230b70e1e4a42 +Block 0011 [ 29]: 5d625d9ac17bde09 +Block 0011 [ 30]: b93db814b66e4291 +Block 0011 [ 31]: 6f52e5601eb894ab +Block 0011 [ 32]: 0b77390efee15e79 +Block 0011 [ 33]: 82f6b168a63fe7f1 +Block 0011 [ 34]: 928a76a455f889d7 +Block 0011 [ 35]: 45c46061f47474d6 +Block 0011 [ 36]: d4065cb48f92aa76 +Block 0011 [ 37]: bf6f8c1b76f13500 +Block 0011 [ 38]: 57e3cbff98403ac9 +Block 0011 [ 39]: 4eb93a3eb96f1bdc +Block 0011 [ 40]: a0d9dac64a63e011 +Block 0011 [ 41]: 80cf457a61239ce5 +Block 0011 [ 42]: 12cbdf7f7b345bdd +Block 0011 [ 43]: 558fca889cbfb6a8 +Block 0011 [ 44]: ada62c7467f789a2 +Block 0011 [ 45]: 847e4323ebbe551a +Block 0011 [ 46]: d86b0fb2d0a54c81 +Block 0011 [ 47]: 2f9f78ce91656503 +Block 0011 [ 48]: 9224c2d9e15272ab +Block 0011 [ 49]: 57f39cdd4dbfbb37 +Block 0011 [ 50]: 5ac28368fd6414e2 +Block 0011 [ 51]: 7fea8df3452d5ff6 +Block 0011 [ 52]: 0ddb457c7ed1693f +Block 0011 [ 53]: d15eafd50e4839e6 +Block 0011 [ 54]: 70b74f4ec868eeed +Block 0011 [ 55]: 1f50fbb8eadedc4d +Block 0011 [ 56]: 2bff0b825beecb9a +Block 0011 [ 57]: f7e23f0fbf8fb5e0 +Block 0011 [ 58]: 169fc6a7da58e7c6 +Block 0011 [ 59]: c759c0fe25fdca4e +Block 0011 [ 60]: a193c01631706ff5 +Block 0011 [ 61]: 8425925525cfb70d +Block 0011 [ 62]: e36d59fa28e117e3 +Block 0011 [ 63]: 021f51f6e924bd1c +Block 0011 [ 64]: 88d912c9de684d7c +Block 0011 [ 65]: b08faaf01463fa22 +Block 0011 [ 66]: dfca8cec70dd1005 +Block 0011 [ 67]: 4518e831507f33a4 +Block 0011 [ 68]: 7265bcabed2a4d1d +Block 0011 [ 69]: 56f8f9a0f20afb0e +Block 0011 [ 70]: 9466d5828edade85 +Block 0011 [ 71]: 4a5990ef5fe1a0a1 +Block 0011 [ 72]: 9e8d71c58adf1850 +Block 0011 [ 73]: 2fce135d3f208a11 +Block 0011 [ 74]: eb02eb1a0e77cf4e +Block 0011 [ 75]: 83b8334bd764ab5f +Block 0011 [ 76]: fc98743a215282e4 +Block 0011 [ 77]: f628862aeb37e3cf +Block 0011 [ 78]: 0e285752ea8b49f6 +Block 0011 [ 79]: 45137ed52e87fc71 +Block 0011 [ 80]: f16667bed93b16e1 +Block 0011 [ 81]: 19ea703c42ba921a +Block 0011 [ 82]: e8fec569d85d1da5 +Block 0011 [ 83]: c582602a4902e2ef +Block 0011 [ 84]: 5118a85f2f85b6d2 +Block 0011 [ 85]: 5254a0abbf3e1bf6 +Block 0011 [ 86]: 864d04b8aeafaba2 +Block 0011 [ 87]: a9157728d3eace94 +Block 0011 [ 88]: 929fff7cd5c8912f +Block 0011 [ 89]: d6b565cdcbfe97a2 +Block 0011 [ 90]: f1cac3f87b2d83b1 +Block 0011 [ 91]: 391784898501b826 +Block 0011 [ 92]: 963fd42330391bb7 +Block 0011 [ 93]: 22f53f44ba19f81b +Block 0011 [ 94]: 849a3c40e7f35a6a +Block 0011 [ 95]: 2621c1353cd8fa5a +Block 0011 [ 96]: bc5b32f805e90323 +Block 0011 [ 97]: 48c9c41acfa6534d +Block 0011 [ 98]: 47e2c3054fe2863f +Block 0011 [ 99]: 61275e63f8f2c157 +Block 0011 [100]: 49cdff8f529dbe70 +Block 0011 [101]: 172135c6ebd89118 +Block 0011 [102]: 94015490366fd71a +Block 0011 [103]: 9e0975de7ab4c2ba +Block 0011 [104]: f87576ecd5896a97 +Block 0011 [105]: 3d241dfeb9eff1bf +Block 0011 [106]: 87ced3201be31c9b +Block 0011 [107]: a1b205a82e4a060b +Block 0011 [108]: 225d1ce3c11da16c +Block 0011 [109]: c07dfe2ce4aabd03 +Block 0011 [110]: 1434ee5041b82175 +Block 0011 [111]: 1c4e1b1c7334a509 +Block 0011 [112]: 60c151bfa5932a93 +Block 0011 [113]: 84d44077ee4c8253 +Block 0011 [114]: 6a4b8d6cd076e254 +Block 0011 [115]: df882989a57a6b51 +Block 0011 [116]: bbe63591d7ab0e4e +Block 0011 [117]: bb46e03a39c54fea +Block 0011 [118]: 14198e736ed8209f +Block 0011 [119]: 73a82d993ddbf317 +Block 0011 [120]: 81be44f6bb106619 +Block 0011 [121]: cb0a5d74cc13275f +Block 0011 [122]: 8abc8fb70c4dc792 +Block 0011 [123]: d47faaceb91155c7 +Block 0011 [124]: 95aa009ba3ac5d98 +Block 0011 [125]: 6d25fc5c774bec47 +Block 0011 [126]: c72751d51103cd58 +Block 0011 [127]: 726aba80485a4db1 +Block 0012 [ 0]: 73ce723169e527f6 +Block 0012 [ 1]: 308bd4738f7976a1 +Block 0012 [ 2]: c355b356d91f24d6 +Block 0012 [ 3]: 09ed9df50d935a67 +Block 0012 [ 4]: 717c7ff7c944689d +Block 0012 [ 5]: 6c5820e5948a5959 +Block 0012 [ 6]: a2cba3426fdeedcd +Block 0012 [ 7]: 0c4f78f7fe2e775f +Block 0012 [ 8]: 198c071d5b3f64ff +Block 0012 [ 9]: caf9aad5d3de5a15 +Block 0012 [ 10]: 0a9d3484d272f3ca +Block 0012 [ 11]: 3f82a2d990cce3c6 +Block 0012 [ 12]: f927453eee587c23 +Block 0012 [ 13]: 5a36887bf9b00b27 +Block 0012 [ 14]: f88bbe6c5bc73f5b +Block 0012 [ 15]: 52da3b1769a613eb +Block 0012 [ 16]: 39840c2892de1cdf +Block 0012 [ 17]: 4b805e1770f4777f +Block 0012 [ 18]: ae59fcacf8ec62a5 +Block 0012 [ 19]: aed76584ef1be382 +Block 0012 [ 20]: 477e1854261d29ae +Block 0012 [ 21]: 00c04e48d1d6438d +Block 0012 [ 22]: e43e846dfa10e2c7 +Block 0012 [ 23]: 54dc1d90c10beec6 +Block 0012 [ 24]: 31eac75291e4f891 +Block 0012 [ 25]: eeabb2fb46c0e7fa +Block 0012 [ 26]: be72d2a02c40e76f +Block 0012 [ 27]: 2c223a1d489e3e53 +Block 0012 [ 28]: 1b842e1c231e577f +Block 0012 [ 29]: 5a560f0f2e6af886 +Block 0012 [ 30]: 658dbf3060d2ed46 +Block 0012 [ 31]: cd4efafc6edde8a3 +Block 0012 [ 32]: 5218beab24ad8820 +Block 0012 [ 33]: fc844dc6d30edc70 +Block 0012 [ 34]: c03e32282b08b833 +Block 0012 [ 35]: f6526556c4c2bc8c +Block 0012 [ 36]: eef40a4c8d3246dc +Block 0012 [ 37]: d395cdddd5dcaded +Block 0012 [ 38]: 5d141c705958116f +Block 0012 [ 39]: bf6eb3d80d70a6d4 +Block 0012 [ 40]: becea1cfbd53daee +Block 0012 [ 41]: 1ffca512f562d1f7 +Block 0012 [ 42]: e8bc5235bf1f0011 +Block 0012 [ 43]: 3ee59d7fef681870 +Block 0012 [ 44]: 8316e6c7ec8d86ac +Block 0012 [ 45]: 00cc2bcfd342063e +Block 0012 [ 46]: 97abc50fdefb7beb +Block 0012 [ 47]: 7c4a3fd61c121c41 +Block 0012 [ 48]: 7eef15597ff45a1e +Block 0012 [ 49]: 2635654685e51a2a +Block 0012 [ 50]: 196d80c0220cf5e9 +Block 0012 [ 51]: 907d81d5db058770 +Block 0012 [ 52]: 5db1d4866657cca1 +Block 0012 [ 53]: 494307edf2063396 +Block 0012 [ 54]: dc19b63a79b917d0 +Block 0012 [ 55]: b9d18ad8d4260be8 +Block 0012 [ 56]: dab1095a4b004abe +Block 0012 [ 57]: e6afd37d77d008ef +Block 0012 [ 58]: 854726fc8461ca89 +Block 0012 [ 59]: a8a69473c59d37c3 +Block 0012 [ 60]: f55724283be2330b +Block 0012 [ 61]: 2dcfd5ea5ad3636a +Block 0012 [ 62]: f3848e715bf6e61b +Block 0012 [ 63]: be4d839c33f14bfd +Block 0012 [ 64]: 397abb336ac92022 +Block 0012 [ 65]: f20cee19e5e388fc +Block 0012 [ 66]: 6edd6d3d0d2323ab +Block 0012 [ 67]: e3b6c5f7c944af17 +Block 0012 [ 68]: 990fcad01d4052f0 +Block 0012 [ 69]: 629c06d809f81f90 +Block 0012 [ 70]: 5c4a5071655f899f +Block 0012 [ 71]: 40d54256be550482 +Block 0012 [ 72]: 4fe1f617c9c672b3 +Block 0012 [ 73]: 3af9e965e25ee169 +Block 0012 [ 74]: 93246b2adad69d87 +Block 0012 [ 75]: 3eb7245c60abfa3a +Block 0012 [ 76]: 411c2a17452fc250 +Block 0012 [ 77]: 5d2af0c77b854c04 +Block 0012 [ 78]: 11218a31a7d3960b +Block 0012 [ 79]: 79b6f5e1d69a33b6 +Block 0012 [ 80]: 81fbaab092b14bf3 +Block 0012 [ 81]: 9f40f1f5344bc391 +Block 0012 [ 82]: 52fd68c595c511d0 +Block 0012 [ 83]: ec28704fb787cbe2 +Block 0012 [ 84]: 2ef764aef58346ae +Block 0012 [ 85]: e76767105c7b8af2 +Block 0012 [ 86]: b7ea621da02c9d03 +Block 0012 [ 87]: 3086a0391498b2e3 +Block 0012 [ 88]: 252329e57c6144c0 +Block 0012 [ 89]: e0d034657ad118b2 +Block 0012 [ 90]: 3d81206435e4cbae +Block 0012 [ 91]: 3b3ca2059dc97c30 +Block 0012 [ 92]: aabcdf9fb844df47 +Block 0012 [ 93]: 3c6b558831ed4b92 +Block 0012 [ 94]: b7bc17b4b0f33c9d +Block 0012 [ 95]: a4a82578872fbc6d +Block 0012 [ 96]: d85124a9b6672389 +Block 0012 [ 97]: 08b17e75139006f6 +Block 0012 [ 98]: 977827cd78088f2a +Block 0012 [ 99]: c20bc30182a91fe1 +Block 0012 [100]: 91bd9bda54db837c +Block 0012 [101]: a56f2ec6fa7ae2a1 +Block 0012 [102]: 75b8aab88e62f2f6 +Block 0012 [103]: e058c358294f6c0d +Block 0012 [104]: 98343c65fbe5e6ba +Block 0012 [105]: 659c225db9887bc8 +Block 0012 [106]: 948fb28011425b40 +Block 0012 [107]: 67cf0ff8cf3e0439 +Block 0012 [108]: 26e5546ece3ef627 +Block 0012 [109]: 72aab058c6c7cbc0 +Block 0012 [110]: ccc489c7bbbcde3a +Block 0012 [111]: 65b2322e9fbb9abe +Block 0012 [112]: 52326cb2a92360aa +Block 0012 [113]: 6eb0f22b356aacda +Block 0012 [114]: 156607f0176d9d5b +Block 0012 [115]: 0e18a589d9c98b2b +Block 0012 [116]: b73ed2b9c3cddad6 +Block 0012 [117]: bb4bac45f760c708 +Block 0012 [118]: f954e80c85c61a21 +Block 0012 [119]: f72b0dea1dbd82ee +Block 0012 [120]: 061e6c6fd5c9af78 +Block 0012 [121]: d8036a836de015bc +Block 0012 [122]: c06b956b2c5944b8 +Block 0012 [123]: d354483d3da39bc5 +Block 0012 [124]: 8042853ccccdf2aa +Block 0012 [125]: cb33ae4bcdbf89f5 +Block 0012 [126]: b36b52f64c953c3e +Block 0012 [127]: 43d5c23cbf60f228 +Block 0013 [ 0]: 18e43ecb466a8968 +Block 0013 [ 1]: de0624bc4603c390 +Block 0013 [ 2]: e47c6900e1e0f9ec +Block 0013 [ 3]: 1f7523e92ceff004 +Block 0013 [ 4]: 90ea827f76ffd035 +Block 0013 [ 5]: e2207e851ad049a1 +Block 0013 [ 6]: 0dadce26fee967e3 +Block 0013 [ 7]: f6c91d95427d2e35 +Block 0013 [ 8]: d163aca31bc02437 +Block 0013 [ 9]: ae11833e1859b9dd +Block 0013 [ 10]: 0085475658b25b37 +Block 0013 [ 11]: a941662fc1bf7290 +Block 0013 [ 12]: 785b6a11ee6cdcf8 +Block 0013 [ 13]: 78ae534c17d037e9 +Block 0013 [ 14]: 5409875d5a7c1f94 +Block 0013 [ 15]: 2e57b97295d14afa +Block 0013 [ 16]: 20f11b28155fdaa0 +Block 0013 [ 17]: 49680370961a80b2 +Block 0013 [ 18]: 506ec8c10dd1ca21 +Block 0013 [ 19]: b323ba42707917f0 +Block 0013 [ 20]: 2c7ac437db4b5bc8 +Block 0013 [ 21]: 7609f06765e28d19 +Block 0013 [ 22]: 09bc9531879ebcff +Block 0013 [ 23]: 6b96f2e996fe0877 +Block 0013 [ 24]: 0be156a465407fe9 +Block 0013 [ 25]: c5c4043a6b9ab6ea +Block 0013 [ 26]: ead52b39166fc1e6 +Block 0013 [ 27]: f40357c33f749e39 +Block 0013 [ 28]: f3d43b525a872a0a +Block 0013 [ 29]: 1e62f830e3519b2e +Block 0013 [ 30]: dffcd1e0532ddf7f +Block 0013 [ 31]: ecdebc7e2df4ca61 +Block 0013 [ 32]: 956e9be0eae88846 +Block 0013 [ 33]: 5f2867f853307359 +Block 0013 [ 34]: 54f0c56e75250fc7 +Block 0013 [ 35]: d821f1a65277b0da +Block 0013 [ 36]: 5a1badcd335982e0 +Block 0013 [ 37]: 2aefcd4c13c5595f +Block 0013 [ 38]: d8cae5e2fd0ecd13 +Block 0013 [ 39]: e111ec2dea668473 +Block 0013 [ 40]: 4f94418823c5fd86 +Block 0013 [ 41]: 6cbfd543b9e6c0f3 +Block 0013 [ 42]: 635b3f358ddebe5d +Block 0013 [ 43]: e1fedaf13a785014 +Block 0013 [ 44]: cb1ecd99b31799d2 +Block 0013 [ 45]: 7a55a2101bc1badd +Block 0013 [ 46]: 3789674f01e71585 +Block 0013 [ 47]: b30e075a7084778a +Block 0013 [ 48]: 68a9b8dba31d54de +Block 0013 [ 49]: 5924e35dad98726d +Block 0013 [ 50]: 54c063d3efd3f781 +Block 0013 [ 51]: 35a5759d0e811a46 +Block 0013 [ 52]: 67f813e40948aa3e +Block 0013 [ 53]: e30f18c6a37e3ef7 +Block 0013 [ 54]: 9fa54fdd007564c4 +Block 0013 [ 55]: c20d517b50bc5f9b +Block 0013 [ 56]: 17bc793afcc2d58f +Block 0013 [ 57]: 8ee17609a1f73d66 +Block 0013 [ 58]: 9512c68643cdbc82 +Block 0013 [ 59]: 93cea37bcad14887 +Block 0013 [ 60]: e82d710423fc7374 +Block 0013 [ 61]: edba70dbc24e1ab5 +Block 0013 [ 62]: 0dbaf4429ad565f8 +Block 0013 [ 63]: fef4942ca08fed0d +Block 0013 [ 64]: ca83d6487de24384 +Block 0013 [ 65]: 9e92dfd67d866a01 +Block 0013 [ 66]: d274d461fa499a68 +Block 0013 [ 67]: 70a2e178171a42ef +Block 0013 [ 68]: 2522a77aa3935a8e +Block 0013 [ 69]: 38fcde56f53a4afb +Block 0013 [ 70]: 5e49c140c03a9923 +Block 0013 [ 71]: 171aa7389918a2e7 +Block 0013 [ 72]: 3a8f18ccd501197b +Block 0013 [ 73]: 76f0992020b3d59c +Block 0013 [ 74]: 3c373d386809a05c +Block 0013 [ 75]: 2a30a1b8155318a4 +Block 0013 [ 76]: a03fa84d01f13453 +Block 0013 [ 77]: 4a872280f5ef1a3b +Block 0013 [ 78]: c22b8619c689c0ef +Block 0013 [ 79]: dd6c265ea30559a6 +Block 0013 [ 80]: c819aafe8db166ed +Block 0013 [ 81]: 46f01e808cfe0a4a +Block 0013 [ 82]: 440f0e8ab090496f +Block 0013 [ 83]: ce51c3ecd3766d6b +Block 0013 [ 84]: 7f0b0ef92deffc64 +Block 0013 [ 85]: 116c821f6c9fdc28 +Block 0013 [ 86]: 9cc813686c478e37 +Block 0013 [ 87]: 1ff9523444a9f731 +Block 0013 [ 88]: bfc9b93360dc52fd +Block 0013 [ 89]: 453d3a0c4d2a6ce8 +Block 0013 [ 90]: e64484db10e4c9ea +Block 0013 [ 91]: f85e66468328fce4 +Block 0013 [ 92]: d3b71ef1d0857bdb +Block 0013 [ 93]: 8fc64459b1b84aa9 +Block 0013 [ 94]: 4ff3785ad108501e +Block 0013 [ 95]: 5db53ddd955530b0 +Block 0013 [ 96]: 0e9db8ed5086f981 +Block 0013 [ 97]: 8ef019feb7b74454 +Block 0013 [ 98]: b13a76096fdd138f +Block 0013 [ 99]: cb7d283fc650d0c0 +Block 0013 [100]: 2e85ae49006df7f5 +Block 0013 [101]: 6bc81aa091850cfc +Block 0013 [102]: c8337747d3a09c23 +Block 0013 [103]: 67b1769f37d721cb +Block 0013 [104]: 6cc2cd4c1bf5bfd5 +Block 0013 [105]: 2f2d8fea231dc9b5 +Block 0013 [106]: d07c5b8da4cefa1c +Block 0013 [107]: 21824639499054fb +Block 0013 [108]: 5aa3d5bd8b14ca72 +Block 0013 [109]: c5897b79d1064a0b +Block 0013 [110]: bac2bb6e9516511b +Block 0013 [111]: 7cf309367e8b306e +Block 0013 [112]: a0abfa3564cb142e +Block 0013 [113]: 0f2b7c41cde3a983 +Block 0013 [114]: 6b77066f440bb86b +Block 0013 [115]: 419b2373a574cb92 +Block 0013 [116]: cb2a2e3d1c092282 +Block 0013 [117]: f3be594d1481879e +Block 0013 [118]: 2e56778ff9740d34 +Block 0013 [119]: 9eb7964504e4b519 +Block 0013 [120]: 4202d23d721d162b +Block 0013 [121]: a1d0610d3bd8fbbb +Block 0013 [122]: 070e2baa1f4b17fe +Block 0013 [123]: d8465bb41a1826e8 +Block 0013 [124]: f2dc327281534bfb +Block 0013 [125]: a8674141208bf59d +Block 0013 [126]: 414187ba004fc431 +Block 0013 [127]: 85664d6cdae69ec7 +Block 0014 [ 0]: 273f89c3c4d02299 +Block 0014 [ 1]: 65cdbad74085012f +Block 0014 [ 2]: 1b209b55833ad98e +Block 0014 [ 3]: ecc8b976b1a67ae9 +Block 0014 [ 4]: cb5166556f87a25b +Block 0014 [ 5]: b7d1f89b87526040 +Block 0014 [ 6]: 373382b4d510dfd3 +Block 0014 [ 7]: 04fbe454c5ea3f3b +Block 0014 [ 8]: 26ee04db4cee85e1 +Block 0014 [ 9]: b49d3ce4b2a068fb +Block 0014 [ 10]: 1e0284184e27ad46 +Block 0014 [ 11]: 9f05fcd205c15aad +Block 0014 [ 12]: 8c84f8290060fef1 +Block 0014 [ 13]: fe0f3f65a0e49203 +Block 0014 [ 14]: f0cfcb1a06f79993 +Block 0014 [ 15]: 453a2a0021034051 +Block 0014 [ 16]: 442c6629ea64dda6 +Block 0014 [ 17]: ce15b0b7ad384fd9 +Block 0014 [ 18]: 039550d4511e19c8 +Block 0014 [ 19]: 54bde38889bb00a5 +Block 0014 [ 20]: 48dda5fe7bd65bc0 +Block 0014 [ 21]: 1f0b7375d9cdd05b +Block 0014 [ 22]: 48df34a0dbf136ba +Block 0014 [ 23]: b20a359e9281ea3b +Block 0014 [ 24]: 431c29ff33a999d3 +Block 0014 [ 25]: 0968e84781dd8bde +Block 0014 [ 26]: 182b2d58441e26ee +Block 0014 [ 27]: fb23c95d4d4abcbe +Block 0014 [ 28]: 25b087fb10a7b02d +Block 0014 [ 29]: 0591464d8c341c3a +Block 0014 [ 30]: 394ed79a62d9c0ae +Block 0014 [ 31]: d9bf954211f9f238 +Block 0014 [ 32]: f3e8633abc0da2c7 +Block 0014 [ 33]: b55d953f9561dc9c +Block 0014 [ 34]: 34b94b3f5a185d38 +Block 0014 [ 35]: 41994961bc5912b4 +Block 0014 [ 36]: 0a49a8f3fa468833 +Block 0014 [ 37]: 3168909e7e87dcd8 +Block 0014 [ 38]: 49a79f694d38b937 +Block 0014 [ 39]: aeca197acd807826 +Block 0014 [ 40]: e78018bda087ed66 +Block 0014 [ 41]: caf0caca076d215a +Block 0014 [ 42]: df57e8aaa56e06e8 +Block 0014 [ 43]: e04757a1866d206f +Block 0014 [ 44]: b14d1f7e87a9b7f4 +Block 0014 [ 45]: 1f2fed83aafb7139 +Block 0014 [ 46]: e62bb58ff3b8e493 +Block 0014 [ 47]: 0f4db670f7d7e617 +Block 0014 [ 48]: 49393771498d5f3d +Block 0014 [ 49]: 40ff217967d0e6b4 +Block 0014 [ 50]: 43361453b3774655 +Block 0014 [ 51]: 798eff0f49dcf729 +Block 0014 [ 52]: 2b52f449561c01d6 +Block 0014 [ 53]: 7f22e3d534852755 +Block 0014 [ 54]: 5c5a01509a2ceaf1 +Block 0014 [ 55]: e723988ef8d43faf +Block 0014 [ 56]: 5cd2a452f32589e3 +Block 0014 [ 57]: 4492d0afff901013 +Block 0014 [ 58]: 5f74c6b8364a8b16 +Block 0014 [ 59]: 531f2fdffbed3c1b +Block 0014 [ 60]: b58c72a19555d9e9 +Block 0014 [ 61]: a2b49eee8d78c6ad +Block 0014 [ 62]: ac5b58636303f51d +Block 0014 [ 63]: bbb04381f89de22b +Block 0014 [ 64]: 310bb057d316746b +Block 0014 [ 65]: df609a73aa6f04c1 +Block 0014 [ 66]: dde1e330db4a2353 +Block 0014 [ 67]: df8bd2c3aa4ed8d5 +Block 0014 [ 68]: a354ff5ec71203d3 +Block 0014 [ 69]: a63bd02607f399dc +Block 0014 [ 70]: f686121f14151e98 +Block 0014 [ 71]: 99b2bb138b954be7 +Block 0014 [ 72]: 308625b4491ccb32 +Block 0014 [ 73]: 297a597e8c04e7c4 +Block 0014 [ 74]: c126cb6c2c547416 +Block 0014 [ 75]: 95466d15799cf5b7 +Block 0014 [ 76]: 363687f488132959 +Block 0014 [ 77]: 1a7824f884e546e5 +Block 0014 [ 78]: 6f2591631287db18 +Block 0014 [ 79]: f4b6521106d317a2 +Block 0014 [ 80]: 7e3835fc300cf076 +Block 0014 [ 81]: 1caac48041fba75f +Block 0014 [ 82]: 8212146ba19b4068 +Block 0014 [ 83]: ba118608fd5f86e0 +Block 0014 [ 84]: d909e703db90c331 +Block 0014 [ 85]: a09b6bfbe24eaf6b +Block 0014 [ 86]: 6996644aa1b4214e +Block 0014 [ 87]: eb02ad1a13fade24 +Block 0014 [ 88]: ad14cb674fdc24fe +Block 0014 [ 89]: 75a579cc9bc86d81 +Block 0014 [ 90]: 11a448208b1bad80 +Block 0014 [ 91]: dd7e817951488ebb +Block 0014 [ 92]: 84319b6e0a938a8e +Block 0014 [ 93]: 601a085543c1f304 +Block 0014 [ 94]: a26ec834a5008ed6 +Block 0014 [ 95]: 065886b182b12de9 +Block 0014 [ 96]: bca693abbc55f94e +Block 0014 [ 97]: d75838f966cd197d +Block 0014 [ 98]: 0fc473ed39950739 +Block 0014 [ 99]: 86b5eeb016c5c09e +Block 0014 [100]: b620889b18b197e4 +Block 0014 [101]: 7bd685894288c621 +Block 0014 [102]: a4fb318772e1f30e +Block 0014 [103]: 75d292c046b66ba8 +Block 0014 [104]: 106da59cc1adc7b9 +Block 0014 [105]: f72257945ad6c61e +Block 0014 [106]: 97f73c5a48c7eb8f +Block 0014 [107]: bbf3c353fe34c7ce +Block 0014 [108]: ba8b83a9f90f632e +Block 0014 [109]: 4747de44c251976d +Block 0014 [110]: f18a8336d5c33cdf +Block 0014 [111]: c94db7537973cc65 +Block 0014 [112]: 11e1046ee6ffa84a +Block 0014 [113]: 61ede68d3dd7a018 +Block 0014 [114]: 840a15e6cdb6615a +Block 0014 [115]: c35bece40424bee4 +Block 0014 [116]: 63d05f3e0c4f1d1e +Block 0014 [117]: e802bb16993cf741 +Block 0014 [118]: 39ee29de862cd4bf +Block 0014 [119]: 6c9e966cba8180ea +Block 0014 [120]: 0f31cfc44385b89a +Block 0014 [121]: 36ab1b02706b383d +Block 0014 [122]: d8e57c05760ab650 +Block 0014 [123]: 0745e27d24cb16b5 +Block 0014 [124]: e588703fb8d7bc20 +Block 0014 [125]: 0644bdce31a77191 +Block 0014 [126]: 1bd0666d9975b8f9 +Block 0014 [127]: 7dc4943f398250a6 +Block 0015 [ 0]: 4e7562e99872522b +Block 0015 [ 1]: 66b8a4b078db303c +Block 0015 [ 2]: 4f9e3d64d3c842cf +Block 0015 [ 3]: c22b2bdbf886ef3c +Block 0015 [ 4]: cdd4df9530916a8d +Block 0015 [ 5]: 23bb0f61caf2b262 +Block 0015 [ 6]: 17c2092fa60f6f45 +Block 0015 [ 7]: 4125dd598e088602 +Block 0015 [ 8]: 8406d6514999d625 +Block 0015 [ 9]: 8467b8c69044a698 +Block 0015 [ 10]: 1418ded13a87f1c1 +Block 0015 [ 11]: ec81553a84582651 +Block 0015 [ 12]: 6d37718ba2e32dc4 +Block 0015 [ 13]: 31119a7d298fedba +Block 0015 [ 14]: 6aec539cbe7a2d82 +Block 0015 [ 15]: 1302e8bf03137898 +Block 0015 [ 16]: 27f7482fd8b4c288 +Block 0015 [ 17]: 211f11d1af0df544 +Block 0015 [ 18]: b610c439809337bc +Block 0015 [ 19]: 51ef516a43d28553 +Block 0015 [ 20]: d6953153439c5df9 +Block 0015 [ 21]: 8bae6253e709b68f +Block 0015 [ 22]: 68065cd35f15374f +Block 0015 [ 23]: 6a238be5cea416af +Block 0015 [ 24]: 977d7259234f6365 +Block 0015 [ 25]: 4cd916b891b0778f +Block 0015 [ 26]: 35116f1080cef277 +Block 0015 [ 27]: 568c31f4ed06dd0d +Block 0015 [ 28]: f3036b593431b2f2 +Block 0015 [ 29]: 734441677e625cd7 +Block 0015 [ 30]: f891ecf5e790d153 +Block 0015 [ 31]: 7b4959ff7cd052ed +Block 0015 [ 32]: 7e90fb5ae04ec9ec +Block 0015 [ 33]: 278bdb2b3068750d +Block 0015 [ 34]: 542970101d9e03b5 +Block 0015 [ 35]: 92613dff6f3cace4 +Block 0015 [ 36]: 0bca0734e50828f7 +Block 0015 [ 37]: 93d8a2694b1228fd +Block 0015 [ 38]: 58f220eede1aee8d +Block 0015 [ 39]: 1296ac6d714977aa +Block 0015 [ 40]: b10bfd20792f958f +Block 0015 [ 41]: e51bb8dafb1cac13 +Block 0015 [ 42]: 0f033677bae35a45 +Block 0015 [ 43]: 8815c9cc589ef617 +Block 0015 [ 44]: 0a7588f5ba0585b3 +Block 0015 [ 45]: 561c9266bf857827 +Block 0015 [ 46]: 1a658bb9854aa89d +Block 0015 [ 47]: 2bc84c130bf82b05 +Block 0015 [ 48]: ab8019ce7e71d1df +Block 0015 [ 49]: 011cfb35e8763a17 +Block 0015 [ 50]: c9173bccc4ca9678 +Block 0015 [ 51]: bbcb9e737c362350 +Block 0015 [ 52]: 09e15c0437a57cdb +Block 0015 [ 53]: 64f684ab037429d6 +Block 0015 [ 54]: 1420435f8cdd5c66 +Block 0015 [ 55]: 36adee091cfc29ee +Block 0015 [ 56]: 1fde9df5dbff0132 +Block 0015 [ 57]: b6a34569f36bc4c7 +Block 0015 [ 58]: 8eb15a83c5d21868 +Block 0015 [ 59]: 660cd0e9c8a1a7d8 +Block 0015 [ 60]: e54badb052c928ee +Block 0015 [ 61]: ac8cc341e0ae1af5 +Block 0015 [ 62]: 5155906cc20e5e77 +Block 0015 [ 63]: d86576106452b0f0 +Block 0015 [ 64]: c66032c9204546e4 +Block 0015 [ 65]: 8332b4874131b9cb +Block 0015 [ 66]: 47ae353d4464335f +Block 0015 [ 67]: fd646e4545794a48 +Block 0015 [ 68]: 9fd0218acae10f24 +Block 0015 [ 69]: f2f6040ffbc6e58f +Block 0015 [ 70]: 388720e8c1d2dc12 +Block 0015 [ 71]: 822980335abb942c +Block 0015 [ 72]: a54e39961e5e6203 +Block 0015 [ 73]: 4f8eea2afae53a05 +Block 0015 [ 74]: ec36590c61711e62 +Block 0015 [ 75]: 1d044f7eb1edbb8e +Block 0015 [ 76]: 020f47bb7c4dc9b0 +Block 0015 [ 77]: dc8cf730af322a2f +Block 0015 [ 78]: 5ba84a051d763d7b +Block 0015 [ 79]: e04e796053d22286 +Block 0015 [ 80]: 1fa5ce52fc8565a6 +Block 0015 [ 81]: b25f1c05d7490304 +Block 0015 [ 82]: a4e0006cce1fa914 +Block 0015 [ 83]: 3279c3cde2c9ecec +Block 0015 [ 84]: 689361e4370c48b6 +Block 0015 [ 85]: 77567214a9d5dd81 +Block 0015 [ 86]: f4877ca9650391cc +Block 0015 [ 87]: 93747ddab39b430a +Block 0015 [ 88]: 2c0b37f027b54360 +Block 0015 [ 89]: 052529d6af326a57 +Block 0015 [ 90]: 91357d945a80cdb8 +Block 0015 [ 91]: 2fda3ba647eac74c +Block 0015 [ 92]: f5c21a8e76fa19d3 +Block 0015 [ 93]: 69c8bf807e40f728 +Block 0015 [ 94]: 7177057f6df7fab8 +Block 0015 [ 95]: 19637448baea9365 +Block 0015 [ 96]: 1bc3c05cd0a7e170 +Block 0015 [ 97]: 8b175f281aa5184c +Block 0015 [ 98]: 22f878ec508d2505 +Block 0015 [ 99]: 02bad20f789cc371 +Block 0015 [100]: df485d396e80da2e +Block 0015 [101]: e1177e38552b3b0f +Block 0015 [102]: cd5d9d315a42b212 +Block 0015 [103]: 4ed4199994fc0503 +Block 0015 [104]: b4556ef1bbf50d9b +Block 0015 [105]: 27ec9c33c2817064 +Block 0015 [106]: 2cb72f64b92601eb +Block 0015 [107]: af35f896991a8829 +Block 0015 [108]: a8a6bed2402f441f +Block 0015 [109]: 92371ee6ee3dd914 +Block 0015 [110]: f01d46477e83f53c +Block 0015 [111]: 157f0bc4848bf4e7 +Block 0015 [112]: b8accc3eadeda0a7 +Block 0015 [113]: d234ef67c125e7ef +Block 0015 [114]: d3ad74bedef4c4fd +Block 0015 [115]: 9d647f2d0f69b7df +Block 0015 [116]: 7508119dee6aeb48 +Block 0015 [117]: 28f0c80b6803f8c8 +Block 0015 [118]: 7f7528ded9487889 +Block 0015 [119]: af444f8e9ad26d92 +Block 0015 [120]: 1e849f3d83b05579 +Block 0015 [121]: 3905d4df49382f60 +Block 0015 [122]: 0579d173ff4e01dd +Block 0015 [123]: 7ad8e9bd97862430 +Block 0015 [124]: 9d9df0ba6442503f +Block 0015 [125]: e83d5bffc3957d64 +Block 0015 [126]: dec92b7cb93eb3d8 +Block 0015 [127]: 132eceec8b789472 +Block 0016 [ 0]: a7c4bd9c8195e5ae +Block 0016 [ 1]: d2e7203b85272ece +Block 0016 [ 2]: c4c57f73c5463166 +Block 0016 [ 3]: 703ab3c8d9c1db19 +Block 0016 [ 4]: 9720fe7c801a431e +Block 0016 [ 5]: 4b9783e71df58bb1 +Block 0016 [ 6]: d100be4423e41516 +Block 0016 [ 7]: 1f5bc28255df4c18 +Block 0016 [ 8]: dc29d9e528350071 +Block 0016 [ 9]: 70e98de92f01c8e8 +Block 0016 [ 10]: 082a279585108603 +Block 0016 [ 11]: 12824a1c6baddbf8 +Block 0016 [ 12]: 299b198d5687861b +Block 0016 [ 13]: d764532121fcb048 +Block 0016 [ 14]: 7ed58a31dc247ca1 +Block 0016 [ 15]: 04974b0e380e190e +Block 0016 [ 16]: 005cd3437ce2b618 +Block 0016 [ 17]: 4d2160b2e9929125 +Block 0016 [ 18]: 4c2f1164bd9572ca +Block 0016 [ 19]: e45ce310e0ab8651 +Block 0016 [ 20]: 4d4ce7e432b5ef92 +Block 0016 [ 21]: 5598f75c0e3ed39e +Block 0016 [ 22]: 74a116c69967d582 +Block 0016 [ 23]: 7a61a7262e89199d +Block 0016 [ 24]: 2a70ca5bd3b70742 +Block 0016 [ 25]: b176ad069e401739 +Block 0016 [ 26]: 08ec43669e715bf5 +Block 0016 [ 27]: 834f52898a5622ed +Block 0016 [ 28]: 69fc86a4ae45b482 +Block 0016 [ 29]: f8f87fb7c99b53c9 +Block 0016 [ 30]: 8b26ba5c4aaaf50d +Block 0016 [ 31]: 257a9e3be7804fd6 +Block 0016 [ 32]: 92b35066abb159db +Block 0016 [ 33]: d5652c3400531043 +Block 0016 [ 34]: 17121e2c27c5243a +Block 0016 [ 35]: bd2429d2c6881bfb +Block 0016 [ 36]: 3fe2e56950c12c7d +Block 0016 [ 37]: 2d4b8a1bf11c6257 +Block 0016 [ 38]: 04aa03aead29ddaf +Block 0016 [ 39]: bca22327be578191 +Block 0016 [ 40]: f75a1c32c133c5a0 +Block 0016 [ 41]: 5789b745ce7deaa6 +Block 0016 [ 42]: 19d1f1f0f0307e01 +Block 0016 [ 43]: a74e6d13a3b0e57b +Block 0016 [ 44]: d427fb2528c9a0a2 +Block 0016 [ 45]: 4e06a13184d4589f +Block 0016 [ 46]: b3a015cb32e2fa41 +Block 0016 [ 47]: 89083dd7a3a7ea7b +Block 0016 [ 48]: 7f8197bba08ae770 +Block 0016 [ 49]: f8173c4a7d9e9a20 +Block 0016 [ 50]: a25ef0122bb3e4fe +Block 0016 [ 51]: a8cfcf2ccb632274 +Block 0016 [ 52]: 4794a1c6e0c6fd3a +Block 0016 [ 53]: 28bfebcf8eba67fd +Block 0016 [ 54]: 548ce35ad71a6de8 +Block 0016 [ 55]: 55e14585214b44ae +Block 0016 [ 56]: 4f2c91227ef2f67e +Block 0016 [ 57]: 1f46ff01df8c7b92 +Block 0016 [ 58]: 176e93db8da1c1aa +Block 0016 [ 59]: c1999f8432873a9a +Block 0016 [ 60]: f253261d5c603127 +Block 0016 [ 61]: 4dc28da5758a3ecc +Block 0016 [ 62]: 9dc6739c55bfe672 +Block 0016 [ 63]: d46ceb9c82cf77f0 +Block 0016 [ 64]: 606ace0c4e59088c +Block 0016 [ 65]: 6a2b1c743bed4464 +Block 0016 [ 66]: a222bb63a9d1dfa4 +Block 0016 [ 67]: 7bf4a973bb0ea950 +Block 0016 [ 68]: b6e4eb111b0f90e9 +Block 0016 [ 69]: 963b4f01ca24e49a +Block 0016 [ 70]: f12a07803f119709 +Block 0016 [ 71]: c9a4bd99c942bb93 +Block 0016 [ 72]: 1b631319178a8b8b +Block 0016 [ 73]: 13dce9b5956e7c62 +Block 0016 [ 74]: af1ab6950e39073a +Block 0016 [ 75]: 2077fc99c62a3629 +Block 0016 [ 76]: 7b17e876bc56d9a1 +Block 0016 [ 77]: 5697e81e5b10b640 +Block 0016 [ 78]: ec1a36a6ba2668c2 +Block 0016 [ 79]: ce3e10c7c721e1aa +Block 0016 [ 80]: d55eb97cd2b697ca +Block 0016 [ 81]: 7d6190610198b4a4 +Block 0016 [ 82]: 6eaf57dbad34d038 +Block 0016 [ 83]: 61e3393f4c4b9a42 +Block 0016 [ 84]: e3c0008bbe5960d7 +Block 0016 [ 85]: c6f809afbee36fea +Block 0016 [ 86]: 4c3d6ed4514efa91 +Block 0016 [ 87]: 0897a22b8fd03be3 +Block 0016 [ 88]: 0103454f10ab0cb1 +Block 0016 [ 89]: a4a40dd908a3e32d +Block 0016 [ 90]: 2865f329d9da074f +Block 0016 [ 91]: 3fc7f288b723d94e +Block 0016 [ 92]: 9f5fe6a83da6c0b3 +Block 0016 [ 93]: d96214e995bc42dc +Block 0016 [ 94]: 4d17727350dc92fb +Block 0016 [ 95]: 99e33bc47e06c103 +Block 0016 [ 96]: 566bd4910d1149e6 +Block 0016 [ 97]: deb495e41515c67c +Block 0016 [ 98]: 9dda393d183ebe5e +Block 0016 [ 99]: 50da7b9bd87c0620 +Block 0016 [100]: 20eaca05f8caecf0 +Block 0016 [101]: 73f201cfabe4e3df +Block 0016 [102]: 8837f8da8260eb0f +Block 0016 [103]: afec76bbd77b1a05 +Block 0016 [104]: 94318f9750f6a554 +Block 0016 [105]: 8fdb5ad4d8f03be0 +Block 0016 [106]: b13106b580105096 +Block 0016 [107]: a3ef3f3a8518a008 +Block 0016 [108]: b85051713552ee6d +Block 0016 [109]: abd559c687293ffd +Block 0016 [110]: c701a56b69c9670f +Block 0016 [111]: 9fe8ce8a418c1029 +Block 0016 [112]: 5131ac1b41dc1db1 +Block 0016 [113]: a8f5622b22294904 +Block 0016 [114]: 99d166b28c228cba +Block 0016 [115]: 4221fa4de0332567 +Block 0016 [116]: 7e5e49691c67a3b0 +Block 0016 [117]: 04c18bdb2bbe716e +Block 0016 [118]: 6c95bba9a6a0066e +Block 0016 [119]: 65913aae6e7f3496 +Block 0016 [120]: 6ccee1cf9135225e +Block 0016 [121]: eea59d57c3c1067b +Block 0016 [122]: bc53b79d836fcd67 +Block 0016 [123]: 005b4b44a8c75488 +Block 0016 [124]: 75a0c228c4925ca1 +Block 0016 [125]: 51db30da0208afa3 +Block 0016 [126]: c3fa22b10c158f11 +Block 0016 [127]: 32f9bfdf3810cffb +Block 0017 [ 0]: 55f864a4bba04b69 +Block 0017 [ 1]: 86688ea3b4c7b570 +Block 0017 [ 2]: 4acb9000c989e990 +Block 0017 [ 3]: a684cce37b3dbecf +Block 0017 [ 4]: 1308047031fd0b09 +Block 0017 [ 5]: 48d0396732b7d297 +Block 0017 [ 6]: e65eab4b35fdc1e8 +Block 0017 [ 7]: f8f55563c27513ad +Block 0017 [ 8]: 43631c52a17d0455 +Block 0017 [ 9]: 7c58534e0153d743 +Block 0017 [ 10]: b680014bde5a5b00 +Block 0017 [ 11]: a98686fa6034fb55 +Block 0017 [ 12]: b40e7cd918e4bb6b +Block 0017 [ 13]: 7a129caa8f7b7ecd +Block 0017 [ 14]: 7a2c5f80068ed988 +Block 0017 [ 15]: 74930f06e7818b64 +Block 0017 [ 16]: 699df22ad1c2b7a7 +Block 0017 [ 17]: 935ab251bd87d363 +Block 0017 [ 18]: 0ae1d9012e3edbe5 +Block 0017 [ 19]: 32ea4d9dd0b8a926 +Block 0017 [ 20]: 547db28a60aa43e5 +Block 0017 [ 21]: 6c9ee0a9de7f1b87 +Block 0017 [ 22]: 905cc8aaf66a86eb +Block 0017 [ 23]: 7d20f5583a60e2f3 +Block 0017 [ 24]: e34f5bbbfa73d678 +Block 0017 [ 25]: d61c1b847c02150f +Block 0017 [ 26]: 41cb644e15d0b052 +Block 0017 [ 27]: e00227734f066173 +Block 0017 [ 28]: d8af76bd1770ab69 +Block 0017 [ 29]: b79d451c214a4bc4 +Block 0017 [ 30]: 2f5402b7495d5cb6 +Block 0017 [ 31]: bebecb6d82b81cab +Block 0017 [ 32]: 840c99b3a37ee1c3 +Block 0017 [ 33]: eee590dc48ce4c28 +Block 0017 [ 34]: 6b75a284765b0d20 +Block 0017 [ 35]: d4d30ec02cef9dd5 +Block 0017 [ 36]: 594fa4b9f2e1f661 +Block 0017 [ 37]: 14d30d5dbcbbf39a +Block 0017 [ 38]: 97f18e14fc209bf3 +Block 0017 [ 39]: ad730f490aa5a7fc +Block 0017 [ 40]: 7cf845139f9df67a +Block 0017 [ 41]: 090a6c6adb749c17 +Block 0017 [ 42]: c66fc330fe7a832d +Block 0017 [ 43]: 7d046a6232b6644e +Block 0017 [ 44]: eccd8b00bb5c89ae +Block 0017 [ 45]: cfa80b3ca9b32666 +Block 0017 [ 46]: cf538995385e0d84 +Block 0017 [ 47]: 5a058bf3cb834267 +Block 0017 [ 48]: 734d6406b7c25f24 +Block 0017 [ 49]: 58f2c405e68c867b +Block 0017 [ 50]: 3dac578d2f388db0 +Block 0017 [ 51]: 00cd551f962e2d02 +Block 0017 [ 52]: 49b13b2924e88a93 +Block 0017 [ 53]: e7743f5443a9d274 +Block 0017 [ 54]: 98dd74f1733f61bc +Block 0017 [ 55]: 711854c53a5a12c2 +Block 0017 [ 56]: 01ba975458f076c1 +Block 0017 [ 57]: 2935ddb4a0a9a780 +Block 0017 [ 58]: 98a3847b5f5a92b1 +Block 0017 [ 59]: f6b51f815727a771 +Block 0017 [ 60]: 83d455831270fa14 +Block 0017 [ 61]: bf01382f3fb5dc3b +Block 0017 [ 62]: 1e40bfb6f2493fe3 +Block 0017 [ 63]: 5a861f123e59c889 +Block 0017 [ 64]: 44569ccf53d43812 +Block 0017 [ 65]: 08e3be00922024dd +Block 0017 [ 66]: b30ea60175ed31b8 +Block 0017 [ 67]: c67ada13ea4ef796 +Block 0017 [ 68]: 6ae9bb2e162e1793 +Block 0017 [ 69]: d16637c04dd7479b +Block 0017 [ 70]: 82d1f83bfa388973 +Block 0017 [ 71]: a6ee8701855d80ad +Block 0017 [ 72]: e6a6f0f9a815394a +Block 0017 [ 73]: b09d9a2c1ba5f6c6 +Block 0017 [ 74]: 29253a5eb8f062ec +Block 0017 [ 75]: 9f2f42051b859c49 +Block 0017 [ 76]: 7a553bd4e61add79 +Block 0017 [ 77]: 49f5b81d6d3da61a +Block 0017 [ 78]: 4a2a6b70585823f2 +Block 0017 [ 79]: e0ba481ebbb314a2 +Block 0017 [ 80]: 2e026a086b59c6e5 +Block 0017 [ 81]: af75fc6519e8292b +Block 0017 [ 82]: 68f34b44c3d6ce1f +Block 0017 [ 83]: 66414b29e763ca01 +Block 0017 [ 84]: 7bb093c4cbee74d9 +Block 0017 [ 85]: 52a4474b0cb7c318 +Block 0017 [ 86]: 0514f43a6f43fa6e +Block 0017 [ 87]: 88678d0d92fc9d04 +Block 0017 [ 88]: 9aca117183c360cf +Block 0017 [ 89]: 22b278c99c1be55f +Block 0017 [ 90]: 734f078cd0c14fe4 +Block 0017 [ 91]: a6c4697929b35037 +Block 0017 [ 92]: 20caff1ac11c6a3b +Block 0017 [ 93]: b7b58e29c410063c +Block 0017 [ 94]: f5f82a0e4ffb425c +Block 0017 [ 95]: 1d1faf6a9e04f749 +Block 0017 [ 96]: f61180a10c47e350 +Block 0017 [ 97]: 90c2d0f116370800 +Block 0017 [ 98]: 245c6a8c032df64e +Block 0017 [ 99]: 72af2e2387729677 +Block 0017 [100]: 255fef7d0f299493 +Block 0017 [101]: 63696cd15a9827db +Block 0017 [102]: 9ff1a677815906e9 +Block 0017 [103]: cfe7645e84fbcc6b +Block 0017 [104]: 7d118f5c1773a380 +Block 0017 [105]: 53c22df34ab0c79d +Block 0017 [106]: e60cafb5a84da024 +Block 0017 [107]: c71b19e25f00eaca +Block 0017 [108]: 70a2599c461d4b5a +Block 0017 [109]: a1defaf5d43782e7 +Block 0017 [110]: 307173d4eb84a5f0 +Block 0017 [111]: b2965ee119aae588 +Block 0017 [112]: aea1214bdc220904 +Block 0017 [113]: af783e47a62e2905 +Block 0017 [114]: c17c6bd0dd07543e +Block 0017 [115]: bc2f4f61b3d4bc42 +Block 0017 [116]: 427af793fe06f68e +Block 0017 [117]: d3ddbc5545d45375 +Block 0017 [118]: 7e8f88721e1d599e +Block 0017 [119]: 2fddf0a0a1d0b8de +Block 0017 [120]: 536c66fe9d3064d4 +Block 0017 [121]: ca596ae712b194c4 +Block 0017 [122]: 2d98514c3a3fc1a3 +Block 0017 [123]: 2099f96fa5525447 +Block 0017 [124]: 3a0da830930120fa +Block 0017 [125]: f65c0f3d4d80ec4d +Block 0017 [126]: b02733acf2e0bd07 +Block 0017 [127]: 9a777043164a9ecb +Block 0018 [ 0]: 9757cc1f8fc67731 +Block 0018 [ 1]: 35bf6c0a07d6151b +Block 0018 [ 2]: 4a562b10d3cb3b5b +Block 0018 [ 3]: 3837df4668b638ff +Block 0018 [ 4]: fd8641b21b4bde24 +Block 0018 [ 5]: 7a4c20b761f213bf +Block 0018 [ 6]: c7fbe70faf6e78ad +Block 0018 [ 7]: a35a01acc5baae2d +Block 0018 [ 8]: ba8375042c16a408 +Block 0018 [ 9]: 2c17a49df0210514 +Block 0018 [ 10]: 54bcfc9c5e61a2df +Block 0018 [ 11]: 20b669a6e9371de8 +Block 0018 [ 12]: 5f60f6fa0ce2b5cf +Block 0018 [ 13]: 8876d888784de54d +Block 0018 [ 14]: 5a14abc68ade70d2 +Block 0018 [ 15]: caf7c3bd9bb8d627 +Block 0018 [ 16]: 6aa9f50c26c864b4 +Block 0018 [ 17]: 42c651a28985bfe1 +Block 0018 [ 18]: 299525de82ccf4b7 +Block 0018 [ 19]: 805093fc25cf4833 +Block 0018 [ 20]: fd71d130eead0c07 +Block 0018 [ 21]: 44e09d7e4e7c79ef +Block 0018 [ 22]: d6c9edddb29687b1 +Block 0018 [ 23]: 9ea7f4af4c6e404c +Block 0018 [ 24]: 44b15a0e484e20a8 +Block 0018 [ 25]: 4c0a4ea8ae119282 +Block 0018 [ 26]: 1625138e2fec19e0 +Block 0018 [ 27]: 8c431896e4c7f89f +Block 0018 [ 28]: 1e391f9440f50bbb +Block 0018 [ 29]: abe564717646535b +Block 0018 [ 30]: bfdd2d6c7a615b0c +Block 0018 [ 31]: a476b4167fe0d71e +Block 0018 [ 32]: 2ee078458a627435 +Block 0018 [ 33]: 0f92479fb6bbe7db +Block 0018 [ 34]: f4910af60181eea0 +Block 0018 [ 35]: bdf2c1d96257032f +Block 0018 [ 36]: aa18a53adae220ea +Block 0018 [ 37]: 4680eb844619121c +Block 0018 [ 38]: b5381e15c57b1f8d +Block 0018 [ 39]: a1adbf1d3fc63488 +Block 0018 [ 40]: 456a44ce404b2e50 +Block 0018 [ 41]: 3d588bcdee76376a +Block 0018 [ 42]: 8a7c2c43a9315512 +Block 0018 [ 43]: fe46734e4c364784 +Block 0018 [ 44]: 10de3b6380dcd058 +Block 0018 [ 45]: 04ce55eadbd266fb +Block 0018 [ 46]: 3114eac782bf5a3f +Block 0018 [ 47]: ef503aec668a2980 +Block 0018 [ 48]: 73b2e046a73cce5e +Block 0018 [ 49]: 06dc65dc97686835 +Block 0018 [ 50]: 9afa20ac608c0c95 +Block 0018 [ 51]: a722124767a49fc1 +Block 0018 [ 52]: 3ca0c4282bb241c1 +Block 0018 [ 53]: e3eb230c04aa6faa +Block 0018 [ 54]: 27a925e841a0081a +Block 0018 [ 55]: 92fa113d0e62b8d1 +Block 0018 [ 56]: e1a23f578ad3b6e2 +Block 0018 [ 57]: f0a40e4f904293cb +Block 0018 [ 58]: 24868ed872e36b84 +Block 0018 [ 59]: 25e7a53a161bfcaf +Block 0018 [ 60]: 26e1c9c12b5939e1 +Block 0018 [ 61]: a13029dc4e435467 +Block 0018 [ 62]: 60dee45dc1d2c33b +Block 0018 [ 63]: e5060012f7e3c08f +Block 0018 [ 64]: d80235bfd51562b4 +Block 0018 [ 65]: 9e65692aa89c51ae +Block 0018 [ 66]: f6189d85d588d4b8 +Block 0018 [ 67]: 6db9500363de22cd +Block 0018 [ 68]: cc5a9622b64f01db +Block 0018 [ 69]: e4c795a27f76dd79 +Block 0018 [ 70]: 3e2371f3bf3bc607 +Block 0018 [ 71]: 91613779534e6f9d +Block 0018 [ 72]: 012e99a50f2ef5af +Block 0018 [ 73]: 0f72353196725129 +Block 0018 [ 74]: 56c1e7f4592babb9 +Block 0018 [ 75]: ffd4fa2bf674ec77 +Block 0018 [ 76]: ae3864b6e39c9804 +Block 0018 [ 77]: 0707d4da655e8e8a +Block 0018 [ 78]: e412ab43d93fe67e +Block 0018 [ 79]: 070aacc9f712091d +Block 0018 [ 80]: 8b7868f2fc6e0f37 +Block 0018 [ 81]: ff7a2b63db626acc +Block 0018 [ 82]: 4ff42dcd52320549 +Block 0018 [ 83]: 914a7a459398aa31 +Block 0018 [ 84]: ee51f62912e4ba33 +Block 0018 [ 85]: 6a9547de7f719ae6 +Block 0018 [ 86]: 515534b4c1a9b96e +Block 0018 [ 87]: af49c87f6cc80cab +Block 0018 [ 88]: 6e4037b2f8a44b6c +Block 0018 [ 89]: 4205d6e29532c56c +Block 0018 [ 90]: 8b4772cc0b174ebc +Block 0018 [ 91]: cb8ebf453087902b +Block 0018 [ 92]: 4725e327afb7bec5 +Block 0018 [ 93]: 20c361231f875f96 +Block 0018 [ 94]: 7b19053aaa2e3d99 +Block 0018 [ 95]: bf249d83ac92e83e +Block 0018 [ 96]: 79fd44ef823bddd6 +Block 0018 [ 97]: c1f1a2089940dbbe +Block 0018 [ 98]: b23109bfc79dd2d0 +Block 0018 [ 99]: 503f7aff2422c84a +Block 0018 [100]: 0e3eae25cd971986 +Block 0018 [101]: 4f55b8acfe8132d7 +Block 0018 [102]: 835190a8cce3d640 +Block 0018 [103]: d3c3e2d6be9bb545 +Block 0018 [104]: 903b4f4716a77729 +Block 0018 [105]: feac8b79414f6615 +Block 0018 [106]: e00e93f66de68aef +Block 0018 [107]: 6ad3b10817355a15 +Block 0018 [108]: 4ed19e42abb08129 +Block 0018 [109]: e7bb8588cc665460 +Block 0018 [110]: 49ef295634a90acf +Block 0018 [111]: e6a7881b69491467 +Block 0018 [112]: ee99ba0eab2c15d4 +Block 0018 [113]: 68c7e2218006e47c +Block 0018 [114]: 73bda829fdab534a +Block 0018 [115]: 1746c6743d7cbe37 +Block 0018 [116]: 47f0145c5b347fe6 +Block 0018 [117]: 6541d303cd230e44 +Block 0018 [118]: 9e2235cd3562fa39 +Block 0018 [119]: 103dd929e08da913 +Block 0018 [120]: e530d486b9c1c3ac +Block 0018 [121]: cdb3beda3d93767d +Block 0018 [122]: 9ffd5b80d6db00d2 +Block 0018 [123]: 1b03c689857a1268 +Block 0018 [124]: b19cbf649b04d17f +Block 0018 [125]: bc949d4214befa50 +Block 0018 [126]: fc9bb6c70f544751 +Block 0018 [127]: 17cb94b26db9fc77 +Block 0019 [ 0]: 4314154c5f8bfb7f +Block 0019 [ 1]: 3960b49759850cc7 +Block 0019 [ 2]: 8976b29aa88ba0e9 +Block 0019 [ 3]: 1961c02cf5bd3641 +Block 0019 [ 4]: 36cd5ad5ba621760 +Block 0019 [ 5]: 2b90507c27f79886 +Block 0019 [ 6]: c18aaa55cccfdb73 +Block 0019 [ 7]: d1c214ff58eb7c03 +Block 0019 [ 8]: 1378de6fc11c6541 +Block 0019 [ 9]: a56ecb0ac3b4af54 +Block 0019 [ 10]: 2d2190fd988dde5d +Block 0019 [ 11]: 84f3ee1af8e2af5b +Block 0019 [ 12]: 6dddf7618d5625be +Block 0019 [ 13]: 979c0ce7f7396465 +Block 0019 [ 14]: 11896471c733b0cc +Block 0019 [ 15]: 30a7692f04c7551b +Block 0019 [ 16]: f9f9f053c712aa09 +Block 0019 [ 17]: 58b44b128159e693 +Block 0019 [ 18]: 37e086353c6296c2 +Block 0019 [ 19]: 557f7c0aa022e101 +Block 0019 [ 20]: 5314aa7234e465e5 +Block 0019 [ 21]: 9d36d7f79f38c0cb +Block 0019 [ 22]: 89a72d1fb523a939 +Block 0019 [ 23]: 458747163d53ba06 +Block 0019 [ 24]: 7703d30593f95a8b +Block 0019 [ 25]: ec8311fbd6fd53f2 +Block 0019 [ 26]: 713c830141066152 +Block 0019 [ 27]: 4a62995d5ffbe602 +Block 0019 [ 28]: 6af0645d48bec0d6 +Block 0019 [ 29]: 27e45b09463f3dff +Block 0019 [ 30]: baa124296071c0fd +Block 0019 [ 31]: d16c5d4d4b1c8d2f +Block 0019 [ 32]: 9ac6176e1ef86aa1 +Block 0019 [ 33]: a47cee4462a9d6fc +Block 0019 [ 34]: 472f0c6fd49768fa +Block 0019 [ 35]: 52c6b14445e43848 +Block 0019 [ 36]: e8d71cf621702683 +Block 0019 [ 37]: 09ada9a60ad9c009 +Block 0019 [ 38]: d2b1449ad7e4b3e0 +Block 0019 [ 39]: 49bb73806621273d +Block 0019 [ 40]: 23171ad9f2922791 +Block 0019 [ 41]: b84891d44abdc33c +Block 0019 [ 42]: 333d7b252c09d8ed +Block 0019 [ 43]: 2b5a825ad59e10a4 +Block 0019 [ 44]: a2b7d87242a47ab6 +Block 0019 [ 45]: 78c603789153920e +Block 0019 [ 46]: c74772f388fe7abf +Block 0019 [ 47]: 6efe8e593bc16925 +Block 0019 [ 48]: 699162891707e631 +Block 0019 [ 49]: d0157fbd2b53030e +Block 0019 [ 50]: 9afa5daed35b7362 +Block 0019 [ 51]: 6793c8bc068da00f +Block 0019 [ 52]: 7e9edbe7feba10ae +Block 0019 [ 53]: 0a20088cd94941cc +Block 0019 [ 54]: aa3d527ab123df69 +Block 0019 [ 55]: ab75f2204a3d0324 +Block 0019 [ 56]: 964c7f893c365ea8 +Block 0019 [ 57]: 483a6808ea8790bc +Block 0019 [ 58]: 29b19f92e91f2f9c +Block 0019 [ 59]: 3a4ca873d9ad1d49 +Block 0019 [ 60]: ffdbd035ce98254c +Block 0019 [ 61]: 1be20771208967bc +Block 0019 [ 62]: 2d8fd4c1a2db84e9 +Block 0019 [ 63]: 7c05013f4e86cf36 +Block 0019 [ 64]: 32a65907c497fecf +Block 0019 [ 65]: 537804b593d1e020 +Block 0019 [ 66]: dad22ee481314e93 +Block 0019 [ 67]: bf616fd3f343980a +Block 0019 [ 68]: 8454052ca6d01d92 +Block 0019 [ 69]: 98382a5905785879 +Block 0019 [ 70]: 5c656a82d3a37c94 +Block 0019 [ 71]: 859ff66ae8019e17 +Block 0019 [ 72]: 1ac9b185efd30d59 +Block 0019 [ 73]: 694701c7f6c151ef +Block 0019 [ 74]: 86035ab5b492d8d7 +Block 0019 [ 75]: 6382b4fa05470299 +Block 0019 [ 76]: 7c0baaf7846825b5 +Block 0019 [ 77]: 55f1fecaf8ade443 +Block 0019 [ 78]: b3eda2e95c094348 +Block 0019 [ 79]: 840e5b37fe246ebd +Block 0019 [ 80]: aa85bd44078f5912 +Block 0019 [ 81]: 4f016b6d1a7508c1 +Block 0019 [ 82]: 1a2f83fd10f571ee +Block 0019 [ 83]: 8b38fceecb329171 +Block 0019 [ 84]: 6b5a8ba2f5afa6cc +Block 0019 [ 85]: b327aa70032e1b62 +Block 0019 [ 86]: 33d803f14f60c47c +Block 0019 [ 87]: 75411f058e6d9c92 +Block 0019 [ 88]: 424013b76efefd3c +Block 0019 [ 89]: 988e31f9985e32b6 +Block 0019 [ 90]: 36a2ecbd086d21e6 +Block 0019 [ 91]: c0cc2d8c896d1c67 +Block 0019 [ 92]: db70f98dbeaebcdd +Block 0019 [ 93]: 1433d6cf2fa2659c +Block 0019 [ 94]: 980f4efcab856f56 +Block 0019 [ 95]: fcc7e7e55faa441c +Block 0019 [ 96]: af22e93ab1b3d6de +Block 0019 [ 97]: e4815feb2c7317b1 +Block 0019 [ 98]: f0c02e5d140958e0 +Block 0019 [ 99]: be559709a94d435d +Block 0019 [100]: 3af7f5ebdadcd7e9 +Block 0019 [101]: 1323a5528cfe9894 +Block 0019 [102]: a0808f334ae43cff +Block 0019 [103]: 8b2c3a75006c0c5a +Block 0019 [104]: 387180249c231ee6 +Block 0019 [105]: 6d6b61885cc1759e +Block 0019 [106]: c703e8d94dcf72d9 +Block 0019 [107]: ad82be834e120dfd +Block 0019 [108]: bc4f3dc566411565 +Block 0019 [109]: 330cd1b8ed68386a +Block 0019 [110]: 1aa8639d72a79c51 +Block 0019 [111]: 5fb694dab1306633 +Block 0019 [112]: 872a2f427b6aaea2 +Block 0019 [113]: 6058670384ca92a8 +Block 0019 [114]: 701ba8e9a43f1fb8 +Block 0019 [115]: ff0589f989f9a9f7 +Block 0019 [116]: bc39e80dbe8946b8 +Block 0019 [117]: de0d6c1534faad54 +Block 0019 [118]: 04ec12783b64d1a6 +Block 0019 [119]: 59cfde4877e8691c +Block 0019 [120]: ce18fd19ef32feb9 +Block 0019 [121]: d734d700036c5912 +Block 0019 [122]: 6d58153be0df3a46 +Block 0019 [123]: 37e7d95f1815c981 +Block 0019 [124]: a543cd85f55168ae +Block 0019 [125]: e47dff1e4ed1ae7e +Block 0019 [126]: 29edc56980fc3dc0 +Block 0019 [127]: f4d7bbc79e4d3caf +Block 0020 [ 0]: 99b54612d5331442 +Block 0020 [ 1]: 1df109b2551f5cff +Block 0020 [ 2]: 8d7f342edf1f1ced +Block 0020 [ 3]: c52ae3d91c062623 +Block 0020 [ 4]: e3a9aa53339e7425 +Block 0020 [ 5]: c1c6de190f3c376a +Block 0020 [ 6]: b01061a26c2b3be5 +Block 0020 [ 7]: 35b7980d9f01a3ec +Block 0020 [ 8]: f36abc3066eeef34 +Block 0020 [ 9]: 6c6a1641be1b68ca +Block 0020 [ 10]: 8e81654080ebb01e +Block 0020 [ 11]: 3102256ba607483a +Block 0020 [ 12]: 8b179c528e84a0ac +Block 0020 [ 13]: a09af43d38700de7 +Block 0020 [ 14]: 57e1c72a076854c7 +Block 0020 [ 15]: 806d9d5bbae63fbc +Block 0020 [ 16]: 78e8baf331882e1f +Block 0020 [ 17]: 2875993187cf01f8 +Block 0020 [ 18]: 1db07ca0c8c1571a +Block 0020 [ 19]: bde598a325fc60d8 +Block 0020 [ 20]: a9b9ea0af0ce7552 +Block 0020 [ 21]: fe9c03e4901de695 +Block 0020 [ 22]: bd21ae857dbbe711 +Block 0020 [ 23]: 4d9f8da024ec27d9 +Block 0020 [ 24]: 3304bdbf57ad64f1 +Block 0020 [ 25]: 3c69c5fc82417a9b +Block 0020 [ 26]: a66d465e11d67c52 +Block 0020 [ 27]: 315070b1e7e7a2d8 +Block 0020 [ 28]: 7689fe180a552186 +Block 0020 [ 29]: a19f92527d77f1ad +Block 0020 [ 30]: 1dec4550e47ded4e +Block 0020 [ 31]: 47e340ee79e1e937 +Block 0020 [ 32]: 8b18ab4d70a89258 +Block 0020 [ 33]: 8b0f557cb2c5d6b0 +Block 0020 [ 34]: 562279f5f801a973 +Block 0020 [ 35]: 4f8ddf383e960f5f +Block 0020 [ 36]: aec60f9e5560e4b3 +Block 0020 [ 37]: 0f95d7160757f116 +Block 0020 [ 38]: 91fb5708a31df4b3 +Block 0020 [ 39]: e21b9fcb6d7ff780 +Block 0020 [ 40]: 36a7a60680d38c08 +Block 0020 [ 41]: 1fcac6fcd32a1d00 +Block 0020 [ 42]: f1026ee196f319b1 +Block 0020 [ 43]: dd8f46ea4886b7b9 +Block 0020 [ 44]: 35c62335537e7cbf +Block 0020 [ 45]: 8c353ab20852e073 +Block 0020 [ 46]: 69a6a3b13a46c746 +Block 0020 [ 47]: a6169fa549169c83 +Block 0020 [ 48]: c6bb5d303ed28f72 +Block 0020 [ 49]: ce4c7f745cde2de8 +Block 0020 [ 50]: 717d92d2a9c842c4 +Block 0020 [ 51]: df649d3a2919ca3c +Block 0020 [ 52]: 3b3f2310b1e47458 +Block 0020 [ 53]: 6f664ab9b206191c +Block 0020 [ 54]: 94b785ee0c5ac9a1 +Block 0020 [ 55]: df92354c9ab1d65f +Block 0020 [ 56]: 1276546bf5321547 +Block 0020 [ 57]: a65b38bf4c4fd99b +Block 0020 [ 58]: 6fa757438ddef903 +Block 0020 [ 59]: 4af3819a7cfd003b +Block 0020 [ 60]: 9f00b83185c90c15 +Block 0020 [ 61]: 72b821506b22be45 +Block 0020 [ 62]: 4baadadb24e5ef4f +Block 0020 [ 63]: dcb9e3d9c2406da1 +Block 0020 [ 64]: 534c7e46dc0da3c7 +Block 0020 [ 65]: c3f79ae0d244cbb9 +Block 0020 [ 66]: c093ed3f909efd22 +Block 0020 [ 67]: 8ec38073bc8c6f16 +Block 0020 [ 68]: b3cad456a6c4943b +Block 0020 [ 69]: bc7f40e766001aff +Block 0020 [ 70]: 35aeacc99092a2b9 +Block 0020 [ 71]: 1754588e2b90e14a +Block 0020 [ 72]: 9e4beabb01216807 +Block 0020 [ 73]: b18d269b6be68c5b +Block 0020 [ 74]: c84476ed288034e9 +Block 0020 [ 75]: e54edd60a9adb04d +Block 0020 [ 76]: 9f1f178bf34f5eb7 +Block 0020 [ 77]: 3ccccb0b6ea19f95 +Block 0020 [ 78]: ec17067b40d70152 +Block 0020 [ 79]: 341fbf6208d5e1fa +Block 0020 [ 80]: 9bcd09c030e71c95 +Block 0020 [ 81]: a004676b00008402 +Block 0020 [ 82]: 7a44d5bba550c975 +Block 0020 [ 83]: 25b45af16d682520 +Block 0020 [ 84]: c1df2912476f1b7a +Block 0020 [ 85]: c5a3651373817558 +Block 0020 [ 86]: e73f947765d51638 +Block 0020 [ 87]: a46887137d124b59 +Block 0020 [ 88]: b9aee454d4e109d1 +Block 0020 [ 89]: 3dff8b985a9ed506 +Block 0020 [ 90]: 137459f4dfa321cc +Block 0020 [ 91]: 76877953eb8dedab +Block 0020 [ 92]: 9bbac2f32b25eaec +Block 0020 [ 93]: b74998965f640906 +Block 0020 [ 94]: acc825a4ad52d287 +Block 0020 [ 95]: d197fdc61372c0cd +Block 0020 [ 96]: 5a4e95595b22a985 +Block 0020 [ 97]: a1fc30dd53054d3b +Block 0020 [ 98]: 22feaadf7b85fa4f +Block 0020 [ 99]: ffa4b7d06f2ee116 +Block 0020 [100]: f8cae02794177009 +Block 0020 [101]: 0c0da064cf078a0e +Block 0020 [102]: 3b4530a03afa5efc +Block 0020 [103]: 426a556b6d45a9ec +Block 0020 [104]: 27953a0a104c326b +Block 0020 [105]: db94f0756b6965cc +Block 0020 [106]: f301360676859492 +Block 0020 [107]: 707a4e21d3d8dc16 +Block 0020 [108]: eb115c2a7c9afe03 +Block 0020 [109]: ac784d0ac04f8f13 +Block 0020 [110]: 39d71ab9ffe878ab +Block 0020 [111]: b1443a770fce6211 +Block 0020 [112]: d10dd0565ff67628 +Block 0020 [113]: e1fb38a21599a693 +Block 0020 [114]: 9ee8e257cf634826 +Block 0020 [115]: d5f6e5170e1da3d8 +Block 0020 [116]: 9a10a7e8d7668df8 +Block 0020 [117]: 12298c1738cf4bc7 +Block 0020 [118]: 505f4a9720725022 +Block 0020 [119]: 20572575149e406b +Block 0020 [120]: b0bdd2ce731aa1cb +Block 0020 [121]: 96cde79047a80bb1 +Block 0020 [122]: ef4b364dd09598d4 +Block 0020 [123]: 4ded87a8b524729d +Block 0020 [124]: ef23734b6b00b198 +Block 0020 [125]: 54af6f6764f54d6d +Block 0020 [126]: c584a13771d952ad +Block 0020 [127]: a43755deb1070142 +Block 0021 [ 0]: eaf22a72257ece3e +Block 0021 [ 1]: bc3db8d75db6ab56 +Block 0021 [ 2]: f6fd83b4066f8478 +Block 0021 [ 3]: 612d22eda0ebe1a9 +Block 0021 [ 4]: 465477c0efeea0a8 +Block 0021 [ 5]: cfa5293a6fef2f5f +Block 0021 [ 6]: 23ea14915d5247dd +Block 0021 [ 7]: a2ed1868435d0781 +Block 0021 [ 8]: 83b20881f9332c81 +Block 0021 [ 9]: e8a61edb2c077a93 +Block 0021 [ 10]: c963e144d48b7872 +Block 0021 [ 11]: 8d4cbaa38c3a9fcc +Block 0021 [ 12]: d69c356de80d6cb7 +Block 0021 [ 13]: 9a433254d972c2a6 +Block 0021 [ 14]: d3a6458db7b5f574 +Block 0021 [ 15]: b152bc0809d76014 +Block 0021 [ 16]: cd80587aad983590 +Block 0021 [ 17]: 714df7d77e1f7471 +Block 0021 [ 18]: e56def8658adc47f +Block 0021 [ 19]: e32056e570f63065 +Block 0021 [ 20]: cfdaba585602ba13 +Block 0021 [ 21]: 691e36443ec4b181 +Block 0021 [ 22]: 93aaeea268573ece +Block 0021 [ 23]: 4312d3fd583bda77 +Block 0021 [ 24]: cee8c693eb1da004 +Block 0021 [ 25]: 0d6e0f419eee0037 +Block 0021 [ 26]: e9e4e113c0d7a023 +Block 0021 [ 27]: 366ee6913e04d0c9 +Block 0021 [ 28]: e5be4eb934faa2db +Block 0021 [ 29]: 5964b39808d5b797 +Block 0021 [ 30]: 42ecda87914bd65a +Block 0021 [ 31]: 5bfb873d10a207d7 +Block 0021 [ 32]: ca66068cf8c41ee3 +Block 0021 [ 33]: 376a2fe75f80be7b +Block 0021 [ 34]: 5ad07cad128d3a78 +Block 0021 [ 35]: 8dcb75e704a01312 +Block 0021 [ 36]: 2d4cdaabafb2011f +Block 0021 [ 37]: 4e4fc05aa0def3ac +Block 0021 [ 38]: 8ad7096e0b1966d4 +Block 0021 [ 39]: ed6086ed6c30399e +Block 0021 [ 40]: 6d6ad65c81e1e574 +Block 0021 [ 41]: 378f39e47b6d5022 +Block 0021 [ 42]: 623a21c9267b9efa +Block 0021 [ 43]: 0610511f07a7f9eb +Block 0021 [ 44]: 5680ce8724225437 +Block 0021 [ 45]: d5eb8daa9d713835 +Block 0021 [ 46]: a0b9f5efa5c9802d +Block 0021 [ 47]: e9333e99222c5aab +Block 0021 [ 48]: 597fbe9522296cd3 +Block 0021 [ 49]: ee7269c78dd9c000 +Block 0021 [ 50]: 03d3a1a6a7039b42 +Block 0021 [ 51]: 6df4eb00d4cebffb +Block 0021 [ 52]: 8295f7ac0ddc80bb +Block 0021 [ 53]: 9f0ead21df6e7856 +Block 0021 [ 54]: 9d48d524fe0d564a +Block 0021 [ 55]: f97a84fa8cf4143a +Block 0021 [ 56]: 5e238cdfb3a37dee +Block 0021 [ 57]: 13dd319d1576ce29 +Block 0021 [ 58]: b4a0b6c870ddd21d +Block 0021 [ 59]: 5ced7d1931881510 +Block 0021 [ 60]: e6362d3752dce714 +Block 0021 [ 61]: 64721226de7f4231 +Block 0021 [ 62]: 5e29523e73f0cb30 +Block 0021 [ 63]: 7e5c701c4a754eb9 +Block 0021 [ 64]: f90f9928575d19c8 +Block 0021 [ 65]: 5a87671b1792bb9e +Block 0021 [ 66]: 1ba1edb579ff5ce1 +Block 0021 [ 67]: d81f8269d698d8af +Block 0021 [ 68]: a95debed7aa19f9e +Block 0021 [ 69]: a7d9265743c5c802 +Block 0021 [ 70]: e6df5edc0823fbd3 +Block 0021 [ 71]: 1b3ef0d4395fbccf +Block 0021 [ 72]: 7f6bde3c73fc513d +Block 0021 [ 73]: 16cda4a056dc3a9d +Block 0021 [ 74]: 36563b6c92443394 +Block 0021 [ 75]: 749536d4491edf2f +Block 0021 [ 76]: ce011359b419b387 +Block 0021 [ 77]: 4c8455044dfc4dd5 +Block 0021 [ 78]: aa4d04037787ae89 +Block 0021 [ 79]: 3480568ed27e30aa +Block 0021 [ 80]: 436ff0c954f70457 +Block 0021 [ 81]: 6c6d781dc1817e60 +Block 0021 [ 82]: dbba7171652bcd3f +Block 0021 [ 83]: 62dea6260849c192 +Block 0021 [ 84]: 3d9d26097d6cc1f3 +Block 0021 [ 85]: 22639329408cc1b2 +Block 0021 [ 86]: 849d9f4bb0604fe3 +Block 0021 [ 87]: 01cc125b244e0ea8 +Block 0021 [ 88]: 7ebbb57a0de64d80 +Block 0021 [ 89]: c37ab535fc7d686e +Block 0021 [ 90]: adb00a142848417f +Block 0021 [ 91]: 3445a90c3e87fcd7 +Block 0021 [ 92]: e34ff72206ff1386 +Block 0021 [ 93]: 11626fc232e4270f +Block 0021 [ 94]: 28bbd829c97758de +Block 0021 [ 95]: 67b017e60ef4a655 +Block 0021 [ 96]: a720681c19c0fb13 +Block 0021 [ 97]: 7e1f2be672dd9c07 +Block 0021 [ 98]: c10afaa9599d6269 +Block 0021 [ 99]: 57bdf94c65106f2b +Block 0021 [100]: dc59da56d4e8c48b +Block 0021 [101]: 5ce2b008062974cd +Block 0021 [102]: d7950df8e7812438 +Block 0021 [103]: 0913b55a9026ff83 +Block 0021 [104]: 4d8311ba0f1a8c0d +Block 0021 [105]: fe53cd482d9a09bf +Block 0021 [106]: 1bdf01edc7da7f10 +Block 0021 [107]: d4391237df17af26 +Block 0021 [108]: 3d694dfcd22c5a91 +Block 0021 [109]: f1b09ca49bc8eec9 +Block 0021 [110]: 09f81a527a65c25e +Block 0021 [111]: cf3b08baf5856dbb +Block 0021 [112]: 12cabc43d1fb108e +Block 0021 [113]: b7c209c2bfde3031 +Block 0021 [114]: 02e0d3d4029e7510 +Block 0021 [115]: 36c7a4f9dcf9cae4 +Block 0021 [116]: 580cab16cc58aa6a +Block 0021 [117]: f502f9c2c13c00d5 +Block 0021 [118]: dbf6bcc189397a5c +Block 0021 [119]: 641d6882bf43781b +Block 0021 [120]: ff471cbbadce8b04 +Block 0021 [121]: 5fb8d2a88e62fa1a +Block 0021 [122]: bf56dea0710e9ef8 +Block 0021 [123]: 68eba851089279e7 +Block 0021 [124]: dee4e1f0a55f11f2 +Block 0021 [125]: 1729abaa6c28f626 +Block 0021 [126]: d1e4360bf9a99709 +Block 0021 [127]: 57cd8306d3c9972c +Block 0022 [ 0]: d9017177a669b6e5 +Block 0022 [ 1]: d2561f290188fbe2 +Block 0022 [ 2]: f5c9c509ab75bf4a +Block 0022 [ 3]: debd7125423ade4c +Block 0022 [ 4]: d89cd562b4dd7a29 +Block 0022 [ 5]: 944b7f8c8169715b +Block 0022 [ 6]: 4d7d25a7bd269bdf +Block 0022 [ 7]: 07e089a684eafbc7 +Block 0022 [ 8]: 9a9a15206e1bd87b +Block 0022 [ 9]: 885062c80f1323e6 +Block 0022 [ 10]: ffa7679520887020 +Block 0022 [ 11]: c29294b8d2736bf5 +Block 0022 [ 12]: 10bf9218eb2046a9 +Block 0022 [ 13]: 39a5fc7ecaf5e87e +Block 0022 [ 14]: a2f0798f897c0857 +Block 0022 [ 15]: 4dba832b267d8e91 +Block 0022 [ 16]: 7438fad141293cba +Block 0022 [ 17]: 3ec92fa015f218f0 +Block 0022 [ 18]: 18071da78366eeca +Block 0022 [ 19]: c8a7112b99128c1e +Block 0022 [ 20]: 04c3dbc620abb9cd +Block 0022 [ 21]: e63c4f3d8e79330b +Block 0022 [ 22]: 318615b27ad7c835 +Block 0022 [ 23]: 6429acacb6d345f7 +Block 0022 [ 24]: 036320dbb7f843e8 +Block 0022 [ 25]: c5221241c3397245 +Block 0022 [ 26]: 961c54c8b1a5bd7b +Block 0022 [ 27]: a3dd266a7d0f434f +Block 0022 [ 28]: e012c881f77fb9a7 +Block 0022 [ 29]: f39867b0dcc0baf9 +Block 0022 [ 30]: b3f236d9551e1fe1 +Block 0022 [ 31]: fea089089ba359a0 +Block 0022 [ 32]: cb3703237146bf20 +Block 0022 [ 33]: 73f0720fcae901a9 +Block 0022 [ 34]: a1c7de63038bd5f6 +Block 0022 [ 35]: 7c157239f4f4b199 +Block 0022 [ 36]: aeb4a9f78eabcdcd +Block 0022 [ 37]: b0f1e62f53e0e463 +Block 0022 [ 38]: 1c3acd6bdfd48f04 +Block 0022 [ 39]: 4c4ac7710afffbe0 +Block 0022 [ 40]: 0243e157d6d847ba +Block 0022 [ 41]: 2aeb704359df1996 +Block 0022 [ 42]: b0662086e5b73c39 +Block 0022 [ 43]: 05d79ef890244df4 +Block 0022 [ 44]: af01278314058d10 +Block 0022 [ 45]: 4372e42f10ef5443 +Block 0022 [ 46]: 438de8d30efd58a2 +Block 0022 [ 47]: 1bd8d75d30df4e7c +Block 0022 [ 48]: e3daf4091eb7097f +Block 0022 [ 49]: c6dbbdc0a6f9a781 +Block 0022 [ 50]: aef97c8fbbfbe25c +Block 0022 [ 51]: 0e6881706cb458a0 +Block 0022 [ 52]: e609f19ae55d5ffc +Block 0022 [ 53]: 17031d4c3738c72b +Block 0022 [ 54]: 5231693d9e2a207d +Block 0022 [ 55]: 50dbae42c1c0806c +Block 0022 [ 56]: cb01a7fd19a411b1 +Block 0022 [ 57]: 6859a8f3cfaa64c9 +Block 0022 [ 58]: 04defed4aaa73495 +Block 0022 [ 59]: f3ae8c7ce1882111 +Block 0022 [ 60]: 553c94b9dab67ae3 +Block 0022 [ 61]: f23f1bab715a7fe5 +Block 0022 [ 62]: 42b8e1e62d9174ff +Block 0022 [ 63]: ad75d5d56e0e0225 +Block 0022 [ 64]: f7460a269e67b3dc +Block 0022 [ 65]: 421c8a8a7d0c9833 +Block 0022 [ 66]: 06a3b172d2175ded +Block 0022 [ 67]: 223564e8a1801481 +Block 0022 [ 68]: c74c488483a39dce +Block 0022 [ 69]: 5c301a5fb7c7bb62 +Block 0022 [ 70]: 6d307c79268412d1 +Block 0022 [ 71]: e11b10b2f300fdc6 +Block 0022 [ 72]: 790a855854675477 +Block 0022 [ 73]: 9ddef4befcea38aa +Block 0022 [ 74]: 8fbc6fbd777cd48e +Block 0022 [ 75]: 3ee49861fb128f70 +Block 0022 [ 76]: 7583637e2397ed12 +Block 0022 [ 77]: ecae2f66700d1a4f +Block 0022 [ 78]: 4a4d4065d20d8349 +Block 0022 [ 79]: 65cf24b9e53a8fb4 +Block 0022 [ 80]: 99dbae8b2d889df2 +Block 0022 [ 81]: b9ac3793aafbd04b +Block 0022 [ 82]: 51c26c283f570544 +Block 0022 [ 83]: d16d8a09a8d47994 +Block 0022 [ 84]: cc57b8302e49656b +Block 0022 [ 85]: ac389ca16ad04216 +Block 0022 [ 86]: 8988e5b3a38d0ccc +Block 0022 [ 87]: 57f2686c27fe305f +Block 0022 [ 88]: 0e762dabcff6c25b +Block 0022 [ 89]: a45da9efeb14129b +Block 0022 [ 90]: 1c222d3f443d81c9 +Block 0022 [ 91]: 8fb5de5479c7a3b4 +Block 0022 [ 92]: a78c7ae1e313f074 +Block 0022 [ 93]: 9f8cb10b4bb4efe0 +Block 0022 [ 94]: 89e094fed9b5d688 +Block 0022 [ 95]: 577b162a6b10cfc0 +Block 0022 [ 96]: e220188a3a495256 +Block 0022 [ 97]: 2462082fd6415c0b +Block 0022 [ 98]: 72b7bd3af5f430a5 +Block 0022 [ 99]: 180e07c5fc6bad72 +Block 0022 [100]: e3738c9b8202dac5 +Block 0022 [101]: 4a253af6aa78901d +Block 0022 [102]: 79c249156bc8b4c9 +Block 0022 [103]: a4c9d12d7a1ca0ae +Block 0022 [104]: 41665c3cc225b69e +Block 0022 [105]: 42b4536ad5c5f09c +Block 0022 [106]: 9949fdb6c75e0fb9 +Block 0022 [107]: d124a71717d1c071 +Block 0022 [108]: d19982096015d9e2 +Block 0022 [109]: b80a05faf21e2911 +Block 0022 [110]: 50669ab3798654a9 +Block 0022 [111]: 05bbf71791adb8ca +Block 0022 [112]: 2b24afdacdbc7570 +Block 0022 [113]: feac8d01ae4b08dc +Block 0022 [114]: 4072a0567202afc5 +Block 0022 [115]: b50e1cb840bf5e3a +Block 0022 [116]: 34c6de5d4b22ffe7 +Block 0022 [117]: b0c05f78400ca0cb +Block 0022 [118]: c873334f15b4e1f7 +Block 0022 [119]: 39ad9d10b5e1d750 +Block 0022 [120]: 88a1ad499aca526f +Block 0022 [121]: aa2bd5a6c1f38caf +Block 0022 [122]: 603557577d75599c +Block 0022 [123]: f361f34f5820dff9 +Block 0022 [124]: 85ed6ef23956eac4 +Block 0022 [125]: bd26eacf31c7a353 +Block 0022 [126]: b2ffd15aa41db4e0 +Block 0022 [127]: e91021ab90f8cc95 +Block 0023 [ 0]: a29ad9956727f9cb +Block 0023 [ 1]: 524b13d7bf20dd27 +Block 0023 [ 2]: 14c0f637bb393dd3 +Block 0023 [ 3]: 29aad246fdada10b +Block 0023 [ 4]: d5b615fcec0c08a1 +Block 0023 [ 5]: 850221d183d0efbd +Block 0023 [ 6]: 13d223815685feac +Block 0023 [ 7]: 87e7c7bf9494f3cf +Block 0023 [ 8]: f2b24763c57bf743 +Block 0023 [ 9]: a955627873df3d9f +Block 0023 [ 10]: eb19072ea79b706e +Block 0023 [ 11]: 554f841bf8289187 +Block 0023 [ 12]: 5b2a7a1be684d10f +Block 0023 [ 13]: fb86695ec08991bc +Block 0023 [ 14]: d570ba9f4043e5a3 +Block 0023 [ 15]: ebc35889e61d4065 +Block 0023 [ 16]: 88328db3b597316e +Block 0023 [ 17]: 2ee2ebe41f9b15ba +Block 0023 [ 18]: 43d6aec812d2f7aa +Block 0023 [ 19]: d4e775fa43332640 +Block 0023 [ 20]: b806bcd4c2a3c968 +Block 0023 [ 21]: ebf8c4c91925ad87 +Block 0023 [ 22]: 57e8556a90240f0c +Block 0023 [ 23]: 8286650e1d23ba45 +Block 0023 [ 24]: ae934251ba4c4150 +Block 0023 [ 25]: d006bccf7f11fc65 +Block 0023 [ 26]: 0f66a89ec37bea84 +Block 0023 [ 27]: 6c4ff6a351250fd3 +Block 0023 [ 28]: bc2ed16b7ccd77da +Block 0023 [ 29]: f8992a75652efd74 +Block 0023 [ 30]: 541a0238d8c87aa4 +Block 0023 [ 31]: 60a419e0abc63204 +Block 0023 [ 32]: 9ab5285ed5a4886a +Block 0023 [ 33]: 70d2cd82c589ca56 +Block 0023 [ 34]: f14e21d1174f7038 +Block 0023 [ 35]: 045a340d0a05c6df +Block 0023 [ 36]: 265a854800392dfa +Block 0023 [ 37]: 1febb38eb7e840f3 +Block 0023 [ 38]: d7da8f296f748474 +Block 0023 [ 39]: 321e5bea25a1c0d3 +Block 0023 [ 40]: dfd8bb4afd35f8b2 +Block 0023 [ 41]: 94b8d2e10841ccbb +Block 0023 [ 42]: 6f114382039a8228 +Block 0023 [ 43]: e9da6a56692fa330 +Block 0023 [ 44]: 5bc2f30da0303c1a +Block 0023 [ 45]: d1bda2513b50bfc3 +Block 0023 [ 46]: 13334d39ee171bcb +Block 0023 [ 47]: ae9ea591b5930fce +Block 0023 [ 48]: 64973a25f91e2a82 +Block 0023 [ 49]: aff456b8d8d34f40 +Block 0023 [ 50]: 164dbfc91f4fa96b +Block 0023 [ 51]: 9dc6292bff5fbc5d +Block 0023 [ 52]: bb191847509ff434 +Block 0023 [ 53]: 10e9a0ad94ef7acc +Block 0023 [ 54]: d9954305d5f16c4f +Block 0023 [ 55]: d0a5957208441157 +Block 0023 [ 56]: 529205ea9738c777 +Block 0023 [ 57]: fe1cb6297e9ace0e +Block 0023 [ 58]: fd8e28400112061f +Block 0023 [ 59]: fb912ca9f8059fd1 +Block 0023 [ 60]: 0c2ea500a95da40b +Block 0023 [ 61]: 8a91a09684952f67 +Block 0023 [ 62]: 5f26b82d0c8417a7 +Block 0023 [ 63]: 2326074c848f0d02 +Block 0023 [ 64]: a23474e62e4744ed +Block 0023 [ 65]: 3ad865e5974f5527 +Block 0023 [ 66]: 3901c8a615c69aaf +Block 0023 [ 67]: 71cd871d7eb67c88 +Block 0023 [ 68]: 9fe70add737e4f1a +Block 0023 [ 69]: 87dcc3e08ad7d9d4 +Block 0023 [ 70]: e5ef3e417b23cb96 +Block 0023 [ 71]: b9373896f18c1e66 +Block 0023 [ 72]: 9e7786adfbce6085 +Block 0023 [ 73]: 3f91a9f344df4df1 +Block 0023 [ 74]: 2d526c15df0c84ff +Block 0023 [ 75]: 9ba7a5b5ee5de5b4 +Block 0023 [ 76]: 3d6ae44c06ab9887 +Block 0023 [ 77]: 4afe7b68d6464748 +Block 0023 [ 78]: 0a866a8c319fa828 +Block 0023 [ 79]: c8f841262c4f60d4 +Block 0023 [ 80]: f83563e151dfc565 +Block 0023 [ 81]: 310bd851ee8f72ee +Block 0023 [ 82]: dd50d4efe4195375 +Block 0023 [ 83]: 5cdff14af1b6be5c +Block 0023 [ 84]: f80f75c43c6374e8 +Block 0023 [ 85]: d17a7017c65a71b6 +Block 0023 [ 86]: 6700c8703fe2dd5b +Block 0023 [ 87]: 803ece8035840bd8 +Block 0023 [ 88]: d2e8da645cc4f0c3 +Block 0023 [ 89]: 4f0e262f60b4a0cd +Block 0023 [ 90]: e6118043496083d2 +Block 0023 [ 91]: d16b6ea9b44ac8d2 +Block 0023 [ 92]: 97d7ea25d23ec420 +Block 0023 [ 93]: 584389ba3e0466f5 +Block 0023 [ 94]: f7e33a38de304d1e +Block 0023 [ 95]: b1a8df3491b0cafa +Block 0023 [ 96]: ba545b5360692a6d +Block 0023 [ 97]: 0ca7cb54eeb9d32d +Block 0023 [ 98]: 617ced7b2c227496 +Block 0023 [ 99]: eefacf3c069f5845 +Block 0023 [100]: 391176458830f910 +Block 0023 [101]: c3fe4a86dc5bae9f +Block 0023 [102]: 6b36ab560852d6a2 +Block 0023 [103]: 207988111cb654f6 +Block 0023 [104]: 7b5e2576e2b3bb8e +Block 0023 [105]: ac267506fd370a46 +Block 0023 [106]: b4ee88ac9fcc6eba +Block 0023 [107]: 510d7b841c6d38d3 +Block 0023 [108]: 235d4e1bd7ffd276 +Block 0023 [109]: 2df8efc35016e0fb +Block 0023 [110]: d2577859f955b1b9 +Block 0023 [111]: c8f962216dc4ffad +Block 0023 [112]: 7846e4fc2ba62cb0 +Block 0023 [113]: 6b851256f5061ef8 +Block 0023 [114]: 497ee81cf6dda322 +Block 0023 [115]: 1620886ee32ef2ca +Block 0023 [116]: ff3079c7656033b9 +Block 0023 [117]: fc1b78a962226c50 +Block 0023 [118]: bf975fd236d5f371 +Block 0023 [119]: 4f7f421e74b21343 +Block 0023 [120]: ab1345b271fdaf8b +Block 0023 [121]: 308b376c1bdb360e +Block 0023 [122]: 6c63beff5d5dbafe +Block 0023 [123]: d0167e4bf9145352 +Block 0023 [124]: 222c497dc9a79c9f +Block 0023 [125]: e8248b9c830f7d58 +Block 0023 [126]: 1de80a68d405c3ef +Block 0023 [127]: d79ad55a65da2664 +Block 0024 [ 0]: 6969f641ffdfe715 +Block 0024 [ 1]: 9258b43ee34e21d9 +Block 0024 [ 2]: d50ffe6a5801f950 +Block 0024 [ 3]: 61b72030cbb4a177 +Block 0024 [ 4]: cafa82549198a73d +Block 0024 [ 5]: d1150c31b668f77e +Block 0024 [ 6]: 1fe77b51c643d8ae +Block 0024 [ 7]: 790bca1b555b9a9a +Block 0024 [ 8]: 7174696da064fe4f +Block 0024 [ 9]: 861deeae3929aec4 +Block 0024 [ 10]: 3a388025f4725473 +Block 0024 [ 11]: 9f2fd193b86e54e6 +Block 0024 [ 12]: 7dcafe338e777ea0 +Block 0024 [ 13]: f224bb7eedbd95b2 +Block 0024 [ 14]: c0b6d2f978ab0dec +Block 0024 [ 15]: 1f1ae23b9628a194 +Block 0024 [ 16]: b9dec21d58d34d8e +Block 0024 [ 17]: eef0ee6370727c70 +Block 0024 [ 18]: bc3ba66b8e252048 +Block 0024 [ 19]: 40d59fbfee193677 +Block 0024 [ 20]: d98ad7ba132685a8 +Block 0024 [ 21]: 16a00dfd8846515b +Block 0024 [ 22]: 0628d2508c84b5d7 +Block 0024 [ 23]: 23523cf2a4c53fb5 +Block 0024 [ 24]: 715d3ab7a9295ef5 +Block 0024 [ 25]: 50fbb85c3d387005 +Block 0024 [ 26]: 7964421278c0de1c +Block 0024 [ 27]: a30df4d76612f3d9 +Block 0024 [ 28]: ac93914885b34586 +Block 0024 [ 29]: a9a6084c17e06e6e +Block 0024 [ 30]: 9a8765c57557cf2f +Block 0024 [ 31]: 9535d5e5b1f0eefc +Block 0024 [ 32]: 160c2c3a863b6758 +Block 0024 [ 33]: 017158926c8902fe +Block 0024 [ 34]: eb0d01d4d1a5f399 +Block 0024 [ 35]: b458e852b548ef2f +Block 0024 [ 36]: 4a9f07351074ff05 +Block 0024 [ 37]: 891636249b931c48 +Block 0024 [ 38]: 1df71c0d7f49eceb +Block 0024 [ 39]: c0c17bf91a9348fa +Block 0024 [ 40]: 0c8ec34f06d0ca8d +Block 0024 [ 41]: c8a64e6518bca6e2 +Block 0024 [ 42]: 32a79e401b2033a1 +Block 0024 [ 43]: 4436a57b1984ebde +Block 0024 [ 44]: c4b635de2118e547 +Block 0024 [ 45]: b46a58c3da799e3d +Block 0024 [ 46]: 809428c1e866ee3c +Block 0024 [ 47]: 6a3fae63cc23b5b5 +Block 0024 [ 48]: 59cb5ddb257ba3f2 +Block 0024 [ 49]: 2cc69453f630e10c +Block 0024 [ 50]: 5b9c483dc73034bc +Block 0024 [ 51]: a77fa6d7baffdaf1 +Block 0024 [ 52]: 53c3624d4b339c82 +Block 0024 [ 53]: 03a2a64f36000e48 +Block 0024 [ 54]: abcdf3f1795c6c69 +Block 0024 [ 55]: 1f466a05d7965d5c +Block 0024 [ 56]: 9b6f8788e01c5381 +Block 0024 [ 57]: bf5e74b5e1c32ef2 +Block 0024 [ 58]: 4758b08aa9afe564 +Block 0024 [ 59]: 48f94e1fffe6438c +Block 0024 [ 60]: 4b4a2892f06818f2 +Block 0024 [ 61]: bceff5a99e47b620 +Block 0024 [ 62]: 3060d08b52af4aa1 +Block 0024 [ 63]: a3d9a165e5c65d79 +Block 0024 [ 64]: 123b231f7bf1be25 +Block 0024 [ 65]: cc1e3ad20d8f2356 +Block 0024 [ 66]: 69852803fcb614c4 +Block 0024 [ 67]: db7480b12650096c +Block 0024 [ 68]: cce190a49a4a96fa +Block 0024 [ 69]: ccc9b26c541113aa +Block 0024 [ 70]: d73544f23c5bd6cc +Block 0024 [ 71]: 55cd4e9884d01240 +Block 0024 [ 72]: b358876752a98151 +Block 0024 [ 73]: c1881eac1a053aad +Block 0024 [ 74]: 4789407f7d033e41 +Block 0024 [ 75]: 3360667505df643c +Block 0024 [ 76]: 579bf698b57c80a6 +Block 0024 [ 77]: 5b47d4d45b4a3f3e +Block 0024 [ 78]: b77d0607040d6c41 +Block 0024 [ 79]: 6884dac57b7f12ac +Block 0024 [ 80]: d3cc1f9fd938bb7e +Block 0024 [ 81]: 73a68dd0528fe5cd +Block 0024 [ 82]: c7859f68ad84be24 +Block 0024 [ 83]: 5b0db28343bbcc56 +Block 0024 [ 84]: ed31bbd129906e60 +Block 0024 [ 85]: 05f40f05ddc90ae9 +Block 0024 [ 86]: 4f4f039c3db15331 +Block 0024 [ 87]: 704e8b3862009b61 +Block 0024 [ 88]: a1edbf57f0b139ca +Block 0024 [ 89]: 78f5af917866a501 +Block 0024 [ 90]: a485e287c34a06b2 +Block 0024 [ 91]: 6cdd76520612e2ce +Block 0024 [ 92]: 39fa227307e0bb4f +Block 0024 [ 93]: 96245312a7935575 +Block 0024 [ 94]: 77f694a7b65e06ce +Block 0024 [ 95]: 0b4c5b0b23a0792a +Block 0024 [ 96]: ad46df6ff95fa686 +Block 0024 [ 97]: 02024ea948b9604b +Block 0024 [ 98]: beb882c124cd1ab8 +Block 0024 [ 99]: db7ec51f4fb2e3b6 +Block 0024 [100]: 148e6c98c2dcff3d +Block 0024 [101]: aa4e5910f5fe7772 +Block 0024 [102]: 665451a76989dba0 +Block 0024 [103]: aab9def1764c01de +Block 0024 [104]: 7187deed9a554c1c +Block 0024 [105]: a5dd3db07fc83d94 +Block 0024 [106]: 77b9f80938269a0a +Block 0024 [107]: a6512b101c9b02cc +Block 0024 [108]: f72ab2ecbcea2450 +Block 0024 [109]: 91b778f0a54da32b +Block 0024 [110]: 0dcb8a95679b55b4 +Block 0024 [111]: 9cd32122fe513e5d +Block 0024 [112]: b075bc86cceb1250 +Block 0024 [113]: 30bbf6f47551705f +Block 0024 [114]: 1d186a57f4818c81 +Block 0024 [115]: 501666ec7907c229 +Block 0024 [116]: cafbe336eb85f78d +Block 0024 [117]: d77bc0f41cf3adfe +Block 0024 [118]: 2d90197cf7095b6c +Block 0024 [119]: e42911f51b42d1d6 +Block 0024 [120]: 5faf35557a21aaf3 +Block 0024 [121]: 85be59bc0dd2201e +Block 0024 [122]: dd9295a14aef5e0e +Block 0024 [123]: b93a47670cf5b680 +Block 0024 [124]: a65ff50fc3bf9fc8 +Block 0024 [125]: 8d951d29aff95fa6 +Block 0024 [126]: 13bbbeeda75b273d +Block 0024 [127]: 98f195d7024186a0 +Block 0025 [ 0]: bba40f5a47d417b9 +Block 0025 [ 1]: 38e25e958235bb82 +Block 0025 [ 2]: 518e6b13a896b70f +Block 0025 [ 3]: 60405fe81faf9b64 +Block 0025 [ 4]: 2ced5f6ef3502bc8 +Block 0025 [ 5]: 79e7be1233ee4f0c +Block 0025 [ 6]: 3b978f674d06920e +Block 0025 [ 7]: 3df44338dbcefa3b +Block 0025 [ 8]: e4a94353df03ed60 +Block 0025 [ 9]: 59390ed09a0f47c9 +Block 0025 [ 10]: 9954694167bc7935 +Block 0025 [ 11]: 45577851e5fcf7a2 +Block 0025 [ 12]: ded46e2b0499a4dd +Block 0025 [ 13]: f00cafff22ac4044 +Block 0025 [ 14]: 511e53d92769a80f +Block 0025 [ 15]: af95973928a31f86 +Block 0025 [ 16]: 99b76728184ff8ac +Block 0025 [ 17]: a57e8f06400e1e2f +Block 0025 [ 18]: daa4835775144800 +Block 0025 [ 19]: 679a78622d3b16c5 +Block 0025 [ 20]: 5692552bd6ab8996 +Block 0025 [ 21]: c24ee7e93c3db671 +Block 0025 [ 22]: 61e434a343652398 +Block 0025 [ 23]: c47346cfd3191661 +Block 0025 [ 24]: f5e6ce91648c3c68 +Block 0025 [ 25]: 279f57679d6f6132 +Block 0025 [ 26]: 37c0a781cf440243 +Block 0025 [ 27]: 5ea5669a328cdf11 +Block 0025 [ 28]: 802d09ab6e7a0868 +Block 0025 [ 29]: 07eb1fa6bca9debb +Block 0025 [ 30]: ef3c12dd091134be +Block 0025 [ 31]: 2567727d448590c1 +Block 0025 [ 32]: e08540f824239b10 +Block 0025 [ 33]: 31c7beba56868274 +Block 0025 [ 34]: 077fc225a960ee90 +Block 0025 [ 35]: 301b82376a7ccae9 +Block 0025 [ 36]: fdd3881fc5fca41d +Block 0025 [ 37]: addce699566df76e +Block 0025 [ 38]: 092d9c03d980d984 +Block 0025 [ 39]: 7d98605e2aa3f4ac +Block 0025 [ 40]: 2608763bed27ec95 +Block 0025 [ 41]: 8782b2dff9b41089 +Block 0025 [ 42]: 3c3afbe5d82dac0d +Block 0025 [ 43]: 6bde148ab758b189 +Block 0025 [ 44]: d6ddd8914ac9cf79 +Block 0025 [ 45]: 52a1e1122baf014a +Block 0025 [ 46]: de57140a5c5aa9fd +Block 0025 [ 47]: 05db47d0e4e02af8 +Block 0025 [ 48]: 41990891d0444d56 +Block 0025 [ 49]: 547ff48a9d700720 +Block 0025 [ 50]: a810a834c1543a71 +Block 0025 [ 51]: 34fcaef0ef5d2f29 +Block 0025 [ 52]: fade3aa85d7cf180 +Block 0025 [ 53]: 1b574b782f1428c7 +Block 0025 [ 54]: e6e74b37b14430d4 +Block 0025 [ 55]: bcc097d24ab98a70 +Block 0025 [ 56]: 9e2954057a3d9414 +Block 0025 [ 57]: 7e6ea29ffbb0f63b +Block 0025 [ 58]: a7cc9ec051b86dad +Block 0025 [ 59]: 6f8274c9d96e52a7 +Block 0025 [ 60]: f447c520e61e4a60 +Block 0025 [ 61]: 27837b7d8014892f +Block 0025 [ 62]: 32c933e68fb44ff6 +Block 0025 [ 63]: df63aca26e3cd24c +Block 0025 [ 64]: bee83c8517f44de6 +Block 0025 [ 65]: 423ce78c74ed7149 +Block 0025 [ 66]: d8994e5735b66f8e +Block 0025 [ 67]: ce621833a2a3961f +Block 0025 [ 68]: b203e8ad73f78c2b +Block 0025 [ 69]: 5d602060b48c9acb +Block 0025 [ 70]: bbfd338d371fcbc8 +Block 0025 [ 71]: f299f99bdd7ba144 +Block 0025 [ 72]: 8324537878431c11 +Block 0025 [ 73]: 387dc9e73b15d8b3 +Block 0025 [ 74]: b943f301cf9f1f3d +Block 0025 [ 75]: cdf888ac99fff4f8 +Block 0025 [ 76]: 0eae3766686c5209 +Block 0025 [ 77]: 5f97d1fba4bcfcb4 +Block 0025 [ 78]: 715884edef0cf617 +Block 0025 [ 79]: e22540f279cc18d4 +Block 0025 [ 80]: f242de5481fd070d +Block 0025 [ 81]: ec292ce495f429a3 +Block 0025 [ 82]: d92a9fdd84a23406 +Block 0025 [ 83]: a7fc57fd55b481a2 +Block 0025 [ 84]: 383ac58faa6a8afa +Block 0025 [ 85]: e15530da8507a5e6 +Block 0025 [ 86]: 27eee21e792ca907 +Block 0025 [ 87]: c5ea9ec8a817e81f +Block 0025 [ 88]: 70008fdb121ecf32 +Block 0025 [ 89]: 978e2f5024aebf1d +Block 0025 [ 90]: 54143c4d79513ca4 +Block 0025 [ 91]: e5753e90346facad +Block 0025 [ 92]: b274b4c10a0161ff +Block 0025 [ 93]: 4f9096920761d015 +Block 0025 [ 94]: ae52b378a843f7d4 +Block 0025 [ 95]: 215f01ff30b7aeb2 +Block 0025 [ 96]: 5690ba842925161e +Block 0025 [ 97]: b7e25a89542e522c +Block 0025 [ 98]: 7644cfc97b40b48a +Block 0025 [ 99]: 4380c85f11f70baa +Block 0025 [100]: 94ba2b2707ebb3f2 +Block 0025 [101]: 89125afa70ed9ba4 +Block 0025 [102]: 5181f2282d281fe1 +Block 0025 [103]: f2f3dbcde02f7b28 +Block 0025 [104]: c0cca5a20a9cef7f +Block 0025 [105]: 6ee895188116cbc4 +Block 0025 [106]: e782e9270cecc673 +Block 0025 [107]: 95793a3c704b4dec +Block 0025 [108]: 5be31429be10f2bb +Block 0025 [109]: 8b2243083615ec15 +Block 0025 [110]: c5ade73601838bb6 +Block 0025 [111]: cc498fab3f9da0ea +Block 0025 [112]: 3fb7ce8e8ff8e31e +Block 0025 [113]: 9007393c51b786ce +Block 0025 [114]: 0d2e3be79e8be99c +Block 0025 [115]: 22a0992219b7d9c1 +Block 0025 [116]: 201a88022a7a5e5e +Block 0025 [117]: a5e413ff26993fa3 +Block 0025 [118]: ed88af659a44ff8e +Block 0025 [119]: a3a95740338b24b9 +Block 0025 [120]: c0c268eb4867d83a +Block 0025 [121]: 6bc5f961c03e2fc1 +Block 0025 [122]: 4707f39a3d5fc77d +Block 0025 [123]: 8aabb099015c1bd8 +Block 0025 [124]: eed1e19d8ca2a204 +Block 0025 [125]: 443a58299ed4223d +Block 0025 [126]: d74770e09dce90bb +Block 0025 [127]: 4b888c18c4236b8f +Block 0026 [ 0]: 7524ecdc95e7c6d7 +Block 0026 [ 1]: b3cb822ba2eceed0 +Block 0026 [ 2]: 7d987ffbecfccf8c +Block 0026 [ 3]: 3a258473aa1fdc9f +Block 0026 [ 4]: 83e61e2c136c00bf +Block 0026 [ 5]: caab98d5a6680f59 +Block 0026 [ 6]: 3908a0934c16862e +Block 0026 [ 7]: cc51e77f565be08f +Block 0026 [ 8]: 50d45dff2ee9795f +Block 0026 [ 9]: a35605e01aacbbc6 +Block 0026 [ 10]: 65c99361e71f2100 +Block 0026 [ 11]: 89a8baffa55ff0e5 +Block 0026 [ 12]: c65bec11667a437b +Block 0026 [ 13]: 090740aa017af145 +Block 0026 [ 14]: fab2e73cfa81f396 +Block 0026 [ 15]: 8679026a13ee01e3 +Block 0026 [ 16]: c05d58a1f3ab7333 +Block 0026 [ 17]: c896937796641e46 +Block 0026 [ 18]: ee27c718c81600aa +Block 0026 [ 19]: 0a3b9a30f844f5d0 +Block 0026 [ 20]: 567ee45f0a0c28d3 +Block 0026 [ 21]: cf3876bf24e2a5e8 +Block 0026 [ 22]: 9a2cafb3f511bf6e +Block 0026 [ 23]: 8487f16264a92081 +Block 0026 [ 24]: 74f04fae8ecf7090 +Block 0026 [ 25]: bd34df8e4e140159 +Block 0026 [ 26]: 24b7139c92dc8525 +Block 0026 [ 27]: 0553db4b337a9f7f +Block 0026 [ 28]: 1c24f59103b3a966 +Block 0026 [ 29]: a5175df227ce8de8 +Block 0026 [ 30]: f3b4ae3a1754e5c0 +Block 0026 [ 31]: 6c704dc1f8c64299 +Block 0026 [ 32]: 4d8a9c79d715519e +Block 0026 [ 33]: 8eaab1487cba16c8 +Block 0026 [ 34]: 528c6d737b994fd5 +Block 0026 [ 35]: fc8acca0cc21c09c +Block 0026 [ 36]: d61bc364f6ebaf18 +Block 0026 [ 37]: 8b94c071976e68a0 +Block 0026 [ 38]: 56ded45d70cd498b +Block 0026 [ 39]: 6a152849b21db2fd +Block 0026 [ 40]: 86bd73f44d45264b +Block 0026 [ 41]: c40ac98438a506ed +Block 0026 [ 42]: 5701ffca1aaad2ec +Block 0026 [ 43]: cff12b9747736945 +Block 0026 [ 44]: f9a6a6323192d3ab +Block 0026 [ 45]: 18c0163c6a7445a9 +Block 0026 [ 46]: ebba754fafbaa806 +Block 0026 [ 47]: da031098c2d192e1 +Block 0026 [ 48]: 2136f081115bb910 +Block 0026 [ 49]: 42cfafd06a770254 +Block 0026 [ 50]: 3cb4fe46c0f36b15 +Block 0026 [ 51]: 497e81c32e8afca4 +Block 0026 [ 52]: 69be4fb9638403d3 +Block 0026 [ 53]: 623d7fc341bb7b36 +Block 0026 [ 54]: 07d4519da1bd73f5 +Block 0026 [ 55]: 39af114fee896a8a +Block 0026 [ 56]: 9d7f584810c79e34 +Block 0026 [ 57]: f322aaa42a4ae198 +Block 0026 [ 58]: fb1aabd77964bde2 +Block 0026 [ 59]: d78ebb3d243f9b2d +Block 0026 [ 60]: 56a651b80a3da854 +Block 0026 [ 61]: edfd1fc542a8a0e6 +Block 0026 [ 62]: 0a46f95d3fae6429 +Block 0026 [ 63]: 3f20f938f650b5b6 +Block 0026 [ 64]: 54d570030c9c4837 +Block 0026 [ 65]: 5a2bef18df0d2e76 +Block 0026 [ 66]: b9e8a41eaba841cb +Block 0026 [ 67]: f5dcbf5174e0cbe2 +Block 0026 [ 68]: 70f5c1b6902e4a6d +Block 0026 [ 69]: 9761e7fb83ccb56f +Block 0026 [ 70]: 5f18b557308f0816 +Block 0026 [ 71]: a11c1e7aa6418541 +Block 0026 [ 72]: c631bafe9232e605 +Block 0026 [ 73]: 8826e45712fce91d +Block 0026 [ 74]: cd7e12f6195a79f9 +Block 0026 [ 75]: 9b8e8d667a3a4d1b +Block 0026 [ 76]: ef7efc9b3ae6f0a5 +Block 0026 [ 77]: 0f4c34f7f2ec4243 +Block 0026 [ 78]: 8f556330f679d973 +Block 0026 [ 79]: df7bda01e284a44e +Block 0026 [ 80]: eeabac8631c766ef +Block 0026 [ 81]: fef44e5ef6a3498c +Block 0026 [ 82]: 2d382ba1d1226d27 +Block 0026 [ 83]: b4f91bd12ec9f39f +Block 0026 [ 84]: 1db321ce939ddc97 +Block 0026 [ 85]: 7a5a0eabeab0078f +Block 0026 [ 86]: 51eb1dda474c86c1 +Block 0026 [ 87]: feb8d76a89319ec8 +Block 0026 [ 88]: d0039a53c43dfa4e +Block 0026 [ 89]: 82e48ec313b1cdea +Block 0026 [ 90]: c767da8cc93f5a1a +Block 0026 [ 91]: bfae99754e21e39c +Block 0026 [ 92]: 63fe97ada5387dbc +Block 0026 [ 93]: 2495c0d09d9f5d0a +Block 0026 [ 94]: bd2bbee826f6f61c +Block 0026 [ 95]: 59e3da689fe1d853 +Block 0026 [ 96]: e0f2181f9021901a +Block 0026 [ 97]: ce0bca4afe4bcdbd +Block 0026 [ 98]: 806ad96f49d275fb +Block 0026 [ 99]: ca66fff815705ad9 +Block 0026 [100]: 5e98c84e2bc4c65d +Block 0026 [101]: 138ce0cd914c7e4b +Block 0026 [102]: 1618685441796cd2 +Block 0026 [103]: 5652d9b9b577c1ca +Block 0026 [104]: fee05c49605b365d +Block 0026 [105]: 3a21df7d902490b6 +Block 0026 [106]: 0e56efb726856293 +Block 0026 [107]: ca9357c7d84aeaf3 +Block 0026 [108]: 814277096e54588a +Block 0026 [109]: ad5782d3e8183ea5 +Block 0026 [110]: 5258092311f7e6f9 +Block 0026 [111]: 16d04ef134231d8a +Block 0026 [112]: 4108069cb7d3c144 +Block 0026 [113]: b9fd8d673423e689 +Block 0026 [114]: 351480ec621ec66c +Block 0026 [115]: e6a6252aacf2671d +Block 0026 [116]: 7d2d586140549db6 +Block 0026 [117]: bfd7061371b05c96 +Block 0026 [118]: cfdcfe617d0483c4 +Block 0026 [119]: d573dd56878888fb +Block 0026 [120]: a040fd126cc375ae +Block 0026 [121]: 2d2c73cb9fe6db48 +Block 0026 [122]: 339570f37059f69e +Block 0026 [123]: 82ef4b1697bacaf7 +Block 0026 [124]: 1955bb40ef1fc395 +Block 0026 [125]: 8ff584d88baa7c9d +Block 0026 [126]: 0ad220eb031acb72 +Block 0026 [127]: 2484f6a33f13f23e +Block 0027 [ 0]: 1fda0c7229c75fdb +Block 0027 [ 1]: 3b057cc942f3cd3f +Block 0027 [ 2]: 31c9c320a5c0376a +Block 0027 [ 3]: cb00a56e4d62b45a +Block 0027 [ 4]: b7572461ea7d6726 +Block 0027 [ 5]: cbc887b494d57efa +Block 0027 [ 6]: cb1b6c6fc2d82eb9 +Block 0027 [ 7]: 33881117fe70f2a6 +Block 0027 [ 8]: 3d1cb35895213d3a +Block 0027 [ 9]: cadf7a6c0022d5f4 +Block 0027 [ 10]: a12c7a7bed011c22 +Block 0027 [ 11]: 536018ae6e9d2647 +Block 0027 [ 12]: 75c4cb0be2473d4d +Block 0027 [ 13]: 9764997b546ebb1a +Block 0027 [ 14]: dda4c694dab76ad4 +Block 0027 [ 15]: 55567a0d8ab9e123 +Block 0027 [ 16]: 2a49c160bb879bce +Block 0027 [ 17]: 5a2403c98b0f8ae8 +Block 0027 [ 18]: a4a92b12cb2b5c51 +Block 0027 [ 19]: ad1798fe3ab20086 +Block 0027 [ 20]: ea98bbeb727fd02e +Block 0027 [ 21]: 43958b17a50e1ec6 +Block 0027 [ 22]: 112a473821660ed4 +Block 0027 [ 23]: 987280b0b5818417 +Block 0027 [ 24]: f7f3543254541625 +Block 0027 [ 25]: 5ab76e1f9126f8ab +Block 0027 [ 26]: 65e55682ea820bdc +Block 0027 [ 27]: 972dc0ebaed288ab +Block 0027 [ 28]: f79b148835c0958d +Block 0027 [ 29]: 3ace78497080a361 +Block 0027 [ 30]: 9969a3d7b1befeaf +Block 0027 [ 31]: bd742e51395a89d3 +Block 0027 [ 32]: baf43c1483db2352 +Block 0027 [ 33]: e84ee2f1a84ece40 +Block 0027 [ 34]: 8f22dc4670472f04 +Block 0027 [ 35]: 2dcf99ef10f86670 +Block 0027 [ 36]: ce14e564c83002bc +Block 0027 [ 37]: 2e32ecc6db0741fa +Block 0027 [ 38]: ad4f625ed99e4383 +Block 0027 [ 39]: e6603fb0f3152626 +Block 0027 [ 40]: 32eaec4ac6c7c398 +Block 0027 [ 41]: 865a9e0a85b188b8 +Block 0027 [ 42]: 560965c1253f5da6 +Block 0027 [ 43]: 2693d2406683e622 +Block 0027 [ 44]: f43c35decf7602d7 +Block 0027 [ 45]: a5fff958abd0eeef +Block 0027 [ 46]: 8a33327b82089453 +Block 0027 [ 47]: 005bef4f733bc2c3 +Block 0027 [ 48]: 97a28713c59f913d +Block 0027 [ 49]: 5cd353bd83cdc6ef +Block 0027 [ 50]: 0aacbc79afddab85 +Block 0027 [ 51]: 4fe6b306da0bfa7d +Block 0027 [ 52]: 282f1a5d2122d391 +Block 0027 [ 53]: f438beb0459123af +Block 0027 [ 54]: 8d9a638b3e3972e1 +Block 0027 [ 55]: c57f98b7f0ebec5f +Block 0027 [ 56]: 493014c1e861a08d +Block 0027 [ 57]: 45dea4bb52398bb4 +Block 0027 [ 58]: 4202e23da13e9241 +Block 0027 [ 59]: 5ca76107962004d4 +Block 0027 [ 60]: 168a3f3fb1162c0c +Block 0027 [ 61]: 10a2c8451d4897d4 +Block 0027 [ 62]: 47be7e7ab8dade9e +Block 0027 [ 63]: 744d7e7a55d4300e +Block 0027 [ 64]: e6443af357da9913 +Block 0027 [ 65]: 385e14bfc8c813d0 +Block 0027 [ 66]: f3f6bbd7ce800d04 +Block 0027 [ 67]: 1e9bec6599344a5b +Block 0027 [ 68]: f58295f409ae0aef +Block 0027 [ 69]: 1fbed74bd118c839 +Block 0027 [ 70]: d5853cab4e59c44e +Block 0027 [ 71]: b94325cf3fbb0cad +Block 0027 [ 72]: 47e21f2b9ea96510 +Block 0027 [ 73]: 9cd1830ba9360d6c +Block 0027 [ 74]: 65f9e4a2bbb6bf7a +Block 0027 [ 75]: 3709eb11e8d6fece +Block 0027 [ 76]: f0faeac468e19460 +Block 0027 [ 77]: c4471652d4912143 +Block 0027 [ 78]: c876c69eccbece1d +Block 0027 [ 79]: 7950940be4fb865e +Block 0027 [ 80]: 1b4f4a1601f2c591 +Block 0027 [ 81]: e5706950d5d8f6b0 +Block 0027 [ 82]: 4042a47ec801379d +Block 0027 [ 83]: 6be04ec20118f578 +Block 0027 [ 84]: 001a180d065bce38 +Block 0027 [ 85]: 80964ddc465ba83d +Block 0027 [ 86]: 415c2aa44481ac91 +Block 0027 [ 87]: aed89f436287d7e3 +Block 0027 [ 88]: 802952efaaf3d094 +Block 0027 [ 89]: 1af0ad9a1610ed91 +Block 0027 [ 90]: 744f0d0bef283a27 +Block 0027 [ 91]: 1b689530c140618e +Block 0027 [ 92]: 4f7f8dc2b1bc8bf4 +Block 0027 [ 93]: 376ee176419f6bcb +Block 0027 [ 94]: 2ee40b0c2b7ffc4f +Block 0027 [ 95]: 7e368f2600d064e3 +Block 0027 [ 96]: 54553339b386dfbc +Block 0027 [ 97]: fd22006cdd6cc1d1 +Block 0027 [ 98]: aeaf9f07ce706f0c +Block 0027 [ 99]: 9a937eed3aaac150 +Block 0027 [100]: 50dbe43b498b11af +Block 0027 [101]: 03a25bcf482de7db +Block 0027 [102]: 1ac83d9c336e1ae5 +Block 0027 [103]: c7f954237ed53c26 +Block 0027 [104]: 7f8d262d30bd8811 +Block 0027 [105]: 9a47671a117cf278 +Block 0027 [106]: a0f96d1f1dbd203b +Block 0027 [107]: c8f89836bcb2ace2 +Block 0027 [108]: 6aa9b91c1cd82772 +Block 0027 [109]: 54445ab2a0e7dc23 +Block 0027 [110]: 66fc9ad87cf140db +Block 0027 [111]: 0159efe6983f9106 +Block 0027 [112]: b6cf18fdd907cf1d +Block 0027 [113]: 7696955344a1d27c +Block 0027 [114]: 1f3dfbd6e87b3d20 +Block 0027 [115]: 299d8c04822e399d +Block 0027 [116]: 0532c0de3a332eef +Block 0027 [117]: 696239a2ac2cbbb5 +Block 0027 [118]: 68f545a0ec2c696c +Block 0027 [119]: 048222d61d6f610d +Block 0027 [120]: 6584663441c18229 +Block 0027 [121]: a830dac83ecbaccd +Block 0027 [122]: 51f2a3e552d6153f +Block 0027 [123]: 7bdc0c6c3384f2b7 +Block 0027 [124]: e803e1fb1417ad70 +Block 0027 [125]: cf0ec4475e1e64fd +Block 0027 [126]: a4e27f7d5dc71200 +Block 0027 [127]: 06d4c361534e9911 +Block 0028 [ 0]: 32c41335ea9210b6 +Block 0028 [ 1]: 2908caade7811d5c +Block 0028 [ 2]: 4b1a563eb5a1d98d +Block 0028 [ 3]: 45cf5b4af41deea0 +Block 0028 [ 4]: 5909a634f94e4646 +Block 0028 [ 5]: ff552e94367fede7 +Block 0028 [ 6]: 8989b674682ab120 +Block 0028 [ 7]: 800dd98f9fa275ab +Block 0028 [ 8]: edffe0b58e9c86fd +Block 0028 [ 9]: c45282004f2814a8 +Block 0028 [ 10]: a521cf9953b68333 +Block 0028 [ 11]: 70abc3e590f22725 +Block 0028 [ 12]: 8f29ae090f8d0773 +Block 0028 [ 13]: e4d540b0329e3fd3 +Block 0028 [ 14]: 77fddd636772d800 +Block 0028 [ 15]: ba078e3c82b5318b +Block 0028 [ 16]: 56d10528600ed38a +Block 0028 [ 17]: 89d098154caa0893 +Block 0028 [ 18]: e4aa0f03e1cb18d5 +Block 0028 [ 19]: fc4cf7eb61cf8f4f +Block 0028 [ 20]: 44dc4ee07a7bfd74 +Block 0028 [ 21]: cb06692efcf18e23 +Block 0028 [ 22]: 5a9d5ebdacfef739 +Block 0028 [ 23]: 9790bad34a423c07 +Block 0028 [ 24]: 3383040615c439a7 +Block 0028 [ 25]: 226fde6e0cb002f1 +Block 0028 [ 26]: 7978d600dd285d8c +Block 0028 [ 27]: 0835c8b042d47a83 +Block 0028 [ 28]: b1a17cbff3060a9f +Block 0028 [ 29]: 4545802efeae6841 +Block 0028 [ 30]: 5367aec249f2b6de +Block 0028 [ 31]: 9a8422a7f6aea5e0 +Block 0028 [ 32]: 94cabf485e66553d +Block 0028 [ 33]: e57981e2b14887a4 +Block 0028 [ 34]: 93905e1e794d2205 +Block 0028 [ 35]: 6a4ff9e27c02848d +Block 0028 [ 36]: 10c8f985566fe580 +Block 0028 [ 37]: b3c3171e95becffa +Block 0028 [ 38]: eec81d0bcede8dd4 +Block 0028 [ 39]: b00be28516aca858 +Block 0028 [ 40]: 6934e88a20ace76c +Block 0028 [ 41]: 47f08f5592350122 +Block 0028 [ 42]: 14e17ffc342eebaf +Block 0028 [ 43]: 863d389922f73a18 +Block 0028 [ 44]: 0ff7df6a4bbf6bcd +Block 0028 [ 45]: 2faba6af4b500401 +Block 0028 [ 46]: 372768258430dfe1 +Block 0028 [ 47]: 01bcbd80ed1de995 +Block 0028 [ 48]: ae5afc3480fb7967 +Block 0028 [ 49]: f250d7a29d4be253 +Block 0028 [ 50]: 872e9136a10d0eb5 +Block 0028 [ 51]: 3564f6703348db6b +Block 0028 [ 52]: cf93aa26857f8ee7 +Block 0028 [ 53]: 1d299906531381e4 +Block 0028 [ 54]: ed7ca859c6d8b326 +Block 0028 [ 55]: 5bbab373efc162e8 +Block 0028 [ 56]: 41b53fef1db146c2 +Block 0028 [ 57]: 9867a1d10a2b388d +Block 0028 [ 58]: a5ad3d460ca549c4 +Block 0028 [ 59]: 8bed29dd5fc55562 +Block 0028 [ 60]: 3dcf490ad631e1a9 +Block 0028 [ 61]: ca435946ccb81dcb +Block 0028 [ 62]: 1b4562bcf9168a82 +Block 0028 [ 63]: 2fd4e872eaa1fe62 +Block 0028 [ 64]: b983dc5232d579d5 +Block 0028 [ 65]: 03c695c140c0edf1 +Block 0028 [ 66]: 12099ea1c402ac91 +Block 0028 [ 67]: e5afa04a89237da7 +Block 0028 [ 68]: a728ae68bd5437fc +Block 0028 [ 69]: b88fd09c300d4a2d +Block 0028 [ 70]: 9914366e0b3c126a +Block 0028 [ 71]: 8364641c737e50d1 +Block 0028 [ 72]: 122e37cb75998698 +Block 0028 [ 73]: 85572ba9771af0fe +Block 0028 [ 74]: a44b9f591f80b58a +Block 0028 [ 75]: 6459da15cb5d272f +Block 0028 [ 76]: ae12e0972e058f17 +Block 0028 [ 77]: a0e841ae6a81805d +Block 0028 [ 78]: 5acd71d74a03b7c9 +Block 0028 [ 79]: c1673f3dffac1f87 +Block 0028 [ 80]: 9683f8d059a3b697 +Block 0028 [ 81]: 15f48a9a018b5479 +Block 0028 [ 82]: e0a92373d66cb331 +Block 0028 [ 83]: b84417d7cb5bd6b3 +Block 0028 [ 84]: 22132d54c2fd5b3f +Block 0028 [ 85]: 785d35635126aacf +Block 0028 [ 86]: d0b53d2c7798ecce +Block 0028 [ 87]: 9b626d1e9b959bff +Block 0028 [ 88]: da50d0911145526d +Block 0028 [ 89]: 75312c2a5cf2e275 +Block 0028 [ 90]: fb3aa5e8a13c4046 +Block 0028 [ 91]: e1c7c3217dd12c33 +Block 0028 [ 92]: 07909d45807dd952 +Block 0028 [ 93]: 110ec96ff2ebdc7f +Block 0028 [ 94]: 7ea07fe9842efe47 +Block 0028 [ 95]: 425c93ed6006230c +Block 0028 [ 96]: b7fb64295a59a93d +Block 0028 [ 97]: 4efcb995d56337c4 +Block 0028 [ 98]: bf377c88a5af6c75 +Block 0028 [ 99]: ce50e122e1079e8e +Block 0028 [100]: 06b62a99c54dd329 +Block 0028 [101]: 5b0a20d8f32a0af9 +Block 0028 [102]: 3dcc3c5ac31473ed +Block 0028 [103]: edcdeeabbecb091c +Block 0028 [104]: 38e14f2ad8ddaef1 +Block 0028 [105]: 3949a00bdfc849d5 +Block 0028 [106]: 3b9f6f89d40e7f3e +Block 0028 [107]: fd7903c040f8ee1b +Block 0028 [108]: 7d2e15f404b0d354 +Block 0028 [109]: 44f182b1f5898001 +Block 0028 [110]: c07e54e736fcfc92 +Block 0028 [111]: 3261288fd6af25bc +Block 0028 [112]: 37eb6fb2c2600a4d +Block 0028 [113]: 5eb2713e33ebc44a +Block 0028 [114]: c1bc5125e04a3cc8 +Block 0028 [115]: 069c8e186b801b0d +Block 0028 [116]: 12cfde575ffb4f28 +Block 0028 [117]: 52c4b308cf636f0f +Block 0028 [118]: d0d7c70301717b1c +Block 0028 [119]: 5e336270c1e4be93 +Block 0028 [120]: bbc5117dafb3e016 +Block 0028 [121]: e92c253e4ff5c789 +Block 0028 [122]: 2fe2ef37a3bad40d +Block 0028 [123]: 5f2b5516992e9a7c +Block 0028 [124]: 751834695924b8b9 +Block 0028 [125]: 1690f02af7b84ea1 +Block 0028 [126]: 532fc595d9512246 +Block 0028 [127]: c61ba9a02850ea46 +Block 0029 [ 0]: add11aa00a1ea4d0 +Block 0029 [ 1]: fefe9582aaec41cd +Block 0029 [ 2]: 5cd4a89c4444635d +Block 0029 [ 3]: bdd0c9350b4a5094 +Block 0029 [ 4]: 5d0a829bca844556 +Block 0029 [ 5]: 186a40fca2ba9ad9 +Block 0029 [ 6]: b6607f2d0e772114 +Block 0029 [ 7]: 8fdad92bdeab4dfc +Block 0029 [ 8]: af5824fae0d6e220 +Block 0029 [ 9]: 1172624a43ce5a27 +Block 0029 [ 10]: 9efa1c98083ea629 +Block 0029 [ 11]: 2057b1f90d21994a +Block 0029 [ 12]: b4a78f175af13055 +Block 0029 [ 13]: a8067c8ecb690f89 +Block 0029 [ 14]: 696808a37d55b720 +Block 0029 [ 15]: 3ac7ac8bcf254afc +Block 0029 [ 16]: 3118370cc0dd00ea +Block 0029 [ 17]: 2076c62ed3b2abc5 +Block 0029 [ 18]: 17bb0bf6de2ddc05 +Block 0029 [ 19]: 25e529d36c8adab3 +Block 0029 [ 20]: 7b3e7cc26479761f +Block 0029 [ 21]: cbd465a0506827a4 +Block 0029 [ 22]: d37d375e0e95a1f5 +Block 0029 [ 23]: 76f8302d75ed5d19 +Block 0029 [ 24]: 2191acabbb23f800 +Block 0029 [ 25]: 3d377fb20887a356 +Block 0029 [ 26]: c7682304541f1323 +Block 0029 [ 27]: ceb43d33e7d3386a +Block 0029 [ 28]: 407add972d722890 +Block 0029 [ 29]: 93a767e25ada3ba7 +Block 0029 [ 30]: 8fed6af3edc7824f +Block 0029 [ 31]: bf01dfabc83a3c4c +Block 0029 [ 32]: fe1ef8d4ce519029 +Block 0029 [ 33]: f1a09603ee5fcdf2 +Block 0029 [ 34]: 67cc66acdff21067 +Block 0029 [ 35]: 1116b86114d72bcb +Block 0029 [ 36]: 56164ccc856823e4 +Block 0029 [ 37]: 3171a29cde173382 +Block 0029 [ 38]: cbf5e8127ef7fb2f +Block 0029 [ 39]: 884573ff59238a7b +Block 0029 [ 40]: 8c3565a5909ba912 +Block 0029 [ 41]: 58e7366a05905181 +Block 0029 [ 42]: dbf13d7043ede744 +Block 0029 [ 43]: de011ea9c7c23e54 +Block 0029 [ 44]: 428cad22d58f193a +Block 0029 [ 45]: 45de623cf58b0c53 +Block 0029 [ 46]: 483fc391de58d241 +Block 0029 [ 47]: e73d32757f024a7b +Block 0029 [ 48]: c835d9a411601ec6 +Block 0029 [ 49]: 4a3af9cc90fa8a69 +Block 0029 [ 50]: b1c327c3b12a12ff +Block 0029 [ 51]: 7fdc8c0ebd7c30b6 +Block 0029 [ 52]: 4b9b92ff0b10341c +Block 0029 [ 53]: 9d8b0c5831e6c994 +Block 0029 [ 54]: d47efb3be63d3e3d +Block 0029 [ 55]: ade765bf86f5df54 +Block 0029 [ 56]: 788fd7782936eeea +Block 0029 [ 57]: 540e48df4db64ada +Block 0029 [ 58]: 2fe776d6bf8d30a4 +Block 0029 [ 59]: 63c88f63651bea29 +Block 0029 [ 60]: 81aea09a44806f4b +Block 0029 [ 61]: d90a0f9ba502ac3f +Block 0029 [ 62]: 4f96462a8497a7c7 +Block 0029 [ 63]: a7ae07aeb861a596 +Block 0029 [ 64]: 3a1b6d5ebcfc303d +Block 0029 [ 65]: 723827adee4a8e15 +Block 0029 [ 66]: 72b52160c47894e1 +Block 0029 [ 67]: 15616dcc3f42f6e3 +Block 0029 [ 68]: de67114cc4170021 +Block 0029 [ 69]: 95ee35dfd896d229 +Block 0029 [ 70]: 7dc3c038cac0bb6a +Block 0029 [ 71]: e114afde3c1de71f +Block 0029 [ 72]: 93ea33127d3ce347 +Block 0029 [ 73]: bdee9a999f9f8214 +Block 0029 [ 74]: 3550c57e4800e4ca +Block 0029 [ 75]: 59bdb97534185fb3 +Block 0029 [ 76]: d4efb828dc1f5ff5 +Block 0029 [ 77]: 711c1f4bacce64ab +Block 0029 [ 78]: 459a1b080ac101c6 +Block 0029 [ 79]: ef8e36116123fc71 +Block 0029 [ 80]: 0d0fae7c0cf5e221 +Block 0029 [ 81]: 3b102939edcc0eae +Block 0029 [ 82]: 2d9b9bf5be11f338 +Block 0029 [ 83]: 271550e5da1f36de +Block 0029 [ 84]: cca29d23e9c467b4 +Block 0029 [ 85]: 744636c4a604ae60 +Block 0029 [ 86]: 89b8ee0f4749a36a +Block 0029 [ 87]: 65220bc4563a257a +Block 0029 [ 88]: b74c05e4eaa7cc4f +Block 0029 [ 89]: 086fd14ecdeb82e8 +Block 0029 [ 90]: 230b4c7e56c1ee7b +Block 0029 [ 91]: bae6c10b660c5111 +Block 0029 [ 92]: 07cd541cc6437cb1 +Block 0029 [ 93]: b5ea0b9f20ad5934 +Block 0029 [ 94]: 18e9b42ec8814d0e +Block 0029 [ 95]: e83fb10b5a09e073 +Block 0029 [ 96]: da5e28b56288ac58 +Block 0029 [ 97]: 174a4b4903b9c5d6 +Block 0029 [ 98]: 82bc2f5b6793b6cc +Block 0029 [ 99]: ac6b5c349715cfbf +Block 0029 [100]: 7a48fed3b0c9f26e +Block 0029 [101]: 4eeb834b011f248a +Block 0029 [102]: 2a1d26ca58e502b1 +Block 0029 [103]: 040c0107e7aaa35e +Block 0029 [104]: 3cdad0dfe1993113 +Block 0029 [105]: 1c49204462db6030 +Block 0029 [106]: 0bb6e36674aef59d +Block 0029 [107]: 78f8a4a051cb7d88 +Block 0029 [108]: a95d9a11b1b56cd1 +Block 0029 [109]: e3664edc847d987f +Block 0029 [110]: 699052c329fcd1c3 +Block 0029 [111]: 8b02281ab5d25587 +Block 0029 [112]: 61fa5bcacc25ec28 +Block 0029 [113]: 382590c5a74307db +Block 0029 [114]: de30a0f8f4c2f320 +Block 0029 [115]: c55f1987ae2aa60a +Block 0029 [116]: 8a724baccfc67cfa +Block 0029 [117]: de0cfef70f80dd8d +Block 0029 [118]: 77beeebf78cc6a32 +Block 0029 [119]: 617da08890f3c0e9 +Block 0029 [120]: 62bb69bb0f1c5160 +Block 0029 [121]: a93377cb766010b5 +Block 0029 [122]: 112da6ac115a74fb +Block 0029 [123]: e3a52beb05168b2b +Block 0029 [124]: f3fd36ecabb3527b +Block 0029 [125]: 64574738ec294c16 +Block 0029 [126]: d5333065268994d7 +Block 0029 [127]: b09bd8e650de9161 +Block 0030 [ 0]: 08dfb5b3fe406306 +Block 0030 [ 1]: c5312272e1f69b52 +Block 0030 [ 2]: cbdd6a284c512f4d +Block 0030 [ 3]: 687538b188f6bf15 +Block 0030 [ 4]: 5aee1a263441db4a +Block 0030 [ 5]: 00e32ad00ade10e7 +Block 0030 [ 6]: bab8788eafa26d22 +Block 0030 [ 7]: 7b843cae9bd7429c +Block 0030 [ 8]: 89ab7c909ce0afcb +Block 0030 [ 9]: 7fb383e1420a5e21 +Block 0030 [ 10]: b26b0cfbee87d48a +Block 0030 [ 11]: 983210f3de9b9047 +Block 0030 [ 12]: fb59126535223142 +Block 0030 [ 13]: db514d95f211c7fb +Block 0030 [ 14]: f515b48c97bd9515 +Block 0030 [ 15]: 7e68254e02cdd184 +Block 0030 [ 16]: c496044d88ab47c0 +Block 0030 [ 17]: 22db0bf93215dd06 +Block 0030 [ 18]: cf46a109f73acc39 +Block 0030 [ 19]: e6a9c9e5962a2bfc +Block 0030 [ 20]: 12797c2591967658 +Block 0030 [ 21]: 1014994c62a70462 +Block 0030 [ 22]: 90a53cae4c9b0e1f +Block 0030 [ 23]: a633d50ff83bcb8d +Block 0030 [ 24]: 70a6e461bd449dbf +Block 0030 [ 25]: 4da0098f9c7a5453 +Block 0030 [ 26]: a09198d0dfe7713b +Block 0030 [ 27]: 6eb90d60a5ba7529 +Block 0030 [ 28]: 81d8c5ebe039a33b +Block 0030 [ 29]: 4e37f98a762ef594 +Block 0030 [ 30]: 1abfad99141701c9 +Block 0030 [ 31]: 67ee74fa668481eb +Block 0030 [ 32]: 7a669dd3cb4cf59e +Block 0030 [ 33]: aea827dc1f7195ca +Block 0030 [ 34]: 5c80866eb9c926eb +Block 0030 [ 35]: 0d5dae78f6f6aa32 +Block 0030 [ 36]: da67e2bf0a9a4b77 +Block 0030 [ 37]: 8a18b58bfcb1cd04 +Block 0030 [ 38]: fa0637bd520b412c +Block 0030 [ 39]: 3d018060fe8aa1e0 +Block 0030 [ 40]: c6c79556dedc0000 +Block 0030 [ 41]: 54265a1bfe4733f9 +Block 0030 [ 42]: dae1c5465ac7ce06 +Block 0030 [ 43]: 91d1e17536504207 +Block 0030 [ 44]: b16901c12fbbcec2 +Block 0030 [ 45]: b0cab54ebbc38c1a +Block 0030 [ 46]: cb177d1c379b6ba5 +Block 0030 [ 47]: 9e89831cd5f7af27 +Block 0030 [ 48]: c58c9ea11044eb08 +Block 0030 [ 49]: 0098fda05b1145c6 +Block 0030 [ 50]: ca02336bd40c4e33 +Block 0030 [ 51]: 77abb03f0e361d83 +Block 0030 [ 52]: bfa6459a28eb2f57 +Block 0030 [ 53]: 54d31d24130925b7 +Block 0030 [ 54]: a12618fe3ca0c681 +Block 0030 [ 55]: a24b0483c9958e0a +Block 0030 [ 56]: 64d5a56781f4d6f4 +Block 0030 [ 57]: e20130a5f6d87d0a +Block 0030 [ 58]: 5f580a9102de8a68 +Block 0030 [ 59]: 502a334100566829 +Block 0030 [ 60]: 797750bf411eb51b +Block 0030 [ 61]: 62a09e380225fc5e +Block 0030 [ 62]: b33ee6ddb9ac36f8 +Block 0030 [ 63]: 9ad1dd87f3ee6417 +Block 0030 [ 64]: c665959960517a13 +Block 0030 [ 65]: 4e5cbc7e627f4e24 +Block 0030 [ 66]: cf059e777b429508 +Block 0030 [ 67]: b9927671cb6d6302 +Block 0030 [ 68]: 19926b6bda53e8fe +Block 0030 [ 69]: 423ba4b5555df12a +Block 0030 [ 70]: d733c68771548188 +Block 0030 [ 71]: 29a6ccd4536f41dc +Block 0030 [ 72]: 5c0d40dfa1a71042 +Block 0030 [ 73]: 181b1f0ff83ca88d +Block 0030 [ 74]: f8d3a324d605f361 +Block 0030 [ 75]: c7ad66be1e571c2e +Block 0030 [ 76]: 2a21a8c1e20120b0 +Block 0030 [ 77]: 02952b2500d1efa2 +Block 0030 [ 78]: adf8c180acee7d49 +Block 0030 [ 79]: 8237b37ed5f21ac5 +Block 0030 [ 80]: bfd242ac3779da36 +Block 0030 [ 81]: d7b855378e7fbdd2 +Block 0030 [ 82]: 170f22ae96fe001f +Block 0030 [ 83]: 8eab780bebebf04a +Block 0030 [ 84]: 477e80264e61af76 +Block 0030 [ 85]: dc69e31592d53b7e +Block 0030 [ 86]: 328fb77f8bae2fcc +Block 0030 [ 87]: c455a0092a29ea78 +Block 0030 [ 88]: 1800e6910efc272b +Block 0030 [ 89]: aafdfa08b9556b15 +Block 0030 [ 90]: ad91adfa49ce7d6b +Block 0030 [ 91]: 877b80cac732ef89 +Block 0030 [ 92]: 44674288a92e8bd9 +Block 0030 [ 93]: 79f4d5eaf13b6f7f +Block 0030 [ 94]: 684b87a9b0d52671 +Block 0030 [ 95]: d9db925848ab10d7 +Block 0030 [ 96]: 0f2b06ba22a78c8f +Block 0030 [ 97]: b243791bc790a685 +Block 0030 [ 98]: 1170616247ef89f1 +Block 0030 [ 99]: 5aeff68c2d24e50e +Block 0030 [100]: 4343a891e18c7467 +Block 0030 [101]: 75d3996a744fa7d5 +Block 0030 [102]: 48914f9a89dbc621 +Block 0030 [103]: 0e2fb9f7e0f8178b +Block 0030 [104]: a4788b9e0fd44e18 +Block 0030 [105]: 591ea8f93e28cff6 +Block 0030 [106]: de9e9a4a5f89f020 +Block 0030 [107]: 1a88133a2a7ad118 +Block 0030 [108]: 115997bfc3fd9306 +Block 0030 [109]: 30a4ad4d9ef28ef6 +Block 0030 [110]: d537b41a77b10f73 +Block 0030 [111]: 3369bdfb413b272b +Block 0030 [112]: 8e34565660c067bb +Block 0030 [113]: 3da1bd4281d3d62f +Block 0030 [114]: 1370fa3a826909b8 +Block 0030 [115]: 656e4e0c713a2771 +Block 0030 [116]: 8ad3b509c8186a57 +Block 0030 [117]: 4acfd4b8dacba1ba +Block 0030 [118]: bb6cfd146f147a75 +Block 0030 [119]: 4ce21db7ebc6bec5 +Block 0030 [120]: 3b037cf3d8980a60 +Block 0030 [121]: 58b03a7d9e6ab6d1 +Block 0030 [122]: ee0d4ee5f201021a +Block 0030 [123]: 6608e0f76e954f0b +Block 0030 [124]: 0a296388dc27b0a5 +Block 0030 [125]: 39436aba3e4b9171 +Block 0030 [126]: 5d9d8588ee7539a8 +Block 0030 [127]: ad10057b7c4da7e0 +Block 0031 [ 0]: b3c48688fc2b713b +Block 0031 [ 1]: 364781fc5f750423 +Block 0031 [ 2]: ea69a118315d23c7 +Block 0031 [ 3]: 4ac9ed2303ec053e +Block 0031 [ 4]: b6c7e3bfcc85a6f7 +Block 0031 [ 5]: 160b6b27cc70d7f1 +Block 0031 [ 6]: d9b57e9cc0aad16d +Block 0031 [ 7]: f51388fa42bd1428 +Block 0031 [ 8]: 8db628f8a2ccbf52 +Block 0031 [ 9]: 0ef96003d0231d89 +Block 0031 [ 10]: a77815f354a8e5b7 +Block 0031 [ 11]: d584a05b6814fdf8 +Block 0031 [ 12]: f74510d8ca59d0bb +Block 0031 [ 13]: 13c0fd32bdd2cc33 +Block 0031 [ 14]: 6b9516534e1e8ee1 +Block 0031 [ 15]: 34a15e4c62a6ab14 +Block 0031 [ 16]: 1882e2eba3ae44e9 +Block 0031 [ 17]: 957874ed3ac0ca45 +Block 0031 [ 18]: a471a22d5c6b42de +Block 0031 [ 19]: c56f33082e512277 +Block 0031 [ 20]: b81484ee71fe466f +Block 0031 [ 21]: 07d24fcbeb680a1e +Block 0031 [ 22]: f320052c7a5e3ca1 +Block 0031 [ 23]: 56a7f75059c8ff64 +Block 0031 [ 24]: 66d9988e90a28fc8 +Block 0031 [ 25]: c52009fa320c94fc +Block 0031 [ 26]: 38998b1a93fa14ed +Block 0031 [ 27]: 40fcfdcca6291c75 +Block 0031 [ 28]: cc025109722879c5 +Block 0031 [ 29]: 9e52089a827f9efd +Block 0031 [ 30]: 78b4b8748c01ddc2 +Block 0031 [ 31]: 5ffe0751b440f784 +Block 0031 [ 32]: 169ce11a3f88a85f +Block 0031 [ 33]: 33c9a0e2de1d0c3a +Block 0031 [ 34]: 85e428ffcd39101f +Block 0031 [ 35]: 3fa0828a33be4bc6 +Block 0031 [ 36]: 78196d7f8e4c8698 +Block 0031 [ 37]: 9f0c886cf76a8f7d +Block 0031 [ 38]: 4eb7c07ae742f382 +Block 0031 [ 39]: 467bb21382b7aa46 +Block 0031 [ 40]: 4bafc9489e5fbe32 +Block 0031 [ 41]: 1fb0fb5c81d35964 +Block 0031 [ 42]: c434eb81393e44f2 +Block 0031 [ 43]: 561f1f4b28c42edd +Block 0031 [ 44]: 277df226f23e81ee +Block 0031 [ 45]: c08d4113b941697a +Block 0031 [ 46]: 829e09624e128f31 +Block 0031 [ 47]: 6283d40b695d8127 +Block 0031 [ 48]: 9655b9e317f39b77 +Block 0031 [ 49]: 7b68f551daff8793 +Block 0031 [ 50]: c7703dbdf2683b4e +Block 0031 [ 51]: 55c627bbe2d149d1 +Block 0031 [ 52]: a3a66eff7c8051ae +Block 0031 [ 53]: a26573784f8e6ab3 +Block 0031 [ 54]: b5f1e85d216f7949 +Block 0031 [ 55]: f4f73a7c4b9aad80 +Block 0031 [ 56]: 7825ab8d82f2e119 +Block 0031 [ 57]: 477b0475d80ecb8c +Block 0031 [ 58]: 55d7e5090c40da89 +Block 0031 [ 59]: f78377f6048ae4f7 +Block 0031 [ 60]: 8cd3f34ad475a8d6 +Block 0031 [ 61]: 4b083d7bdd6a8cba +Block 0031 [ 62]: 95d8abfb240c4814 +Block 0031 [ 63]: a3377ef2f90de6c2 +Block 0031 [ 64]: dbc89827423716f1 +Block 0031 [ 65]: 335e301508ad645f +Block 0031 [ 66]: 651b44508cd7a07b +Block 0031 [ 67]: c6193afb80e62027 +Block 0031 [ 68]: 2a71a83b6e034408 +Block 0031 [ 69]: e434912f53a352bc +Block 0031 [ 70]: f9d50b8fb251136f +Block 0031 [ 71]: f27424b6c6eba780 +Block 0031 [ 72]: b2264f402f8ef79f +Block 0031 [ 73]: 81697a71fc39551d +Block 0031 [ 74]: 00c6a580d7f107b5 +Block 0031 [ 75]: d6c923bcda6464b2 +Block 0031 [ 76]: b94aa22a4d66b346 +Block 0031 [ 77]: f24aa1224c7568ed +Block 0031 [ 78]: f2b2b13c5372ec7e +Block 0031 [ 79]: 02f019342bfd68de +Block 0031 [ 80]: e7c71e7270a9125f +Block 0031 [ 81]: 5d48c3fde040dd13 +Block 0031 [ 82]: f0f48402df38fe5f +Block 0031 [ 83]: 3c181ea41dc2ec3c +Block 0031 [ 84]: 2beb6e97876b88cf +Block 0031 [ 85]: 7ea1174c0dc96fe5 +Block 0031 [ 86]: 1f8a392f03d0c079 +Block 0031 [ 87]: 4701d9fff4897905 +Block 0031 [ 88]: 14161fe99ea020a2 +Block 0031 [ 89]: 2fa89d01e50bfb3c +Block 0031 [ 90]: 909a26187893ff8c +Block 0031 [ 91]: d71a9cde6778796b +Block 0031 [ 92]: dc5c48410d2a711f +Block 0031 [ 93]: 6d157148168c2013 +Block 0031 [ 94]: a9534ea78f37392f +Block 0031 [ 95]: 04fe65b5dcc4223e +Block 0031 [ 96]: 76cdd2997d6eb568 +Block 0031 [ 97]: e1d576333a57d9ba +Block 0031 [ 98]: c1a31217c5f5599d +Block 0031 [ 99]: 4cb52c88e2e00fe8 +Block 0031 [100]: 153cfd925ef21b00 +Block 0031 [101]: 2e4f158d03b58211 +Block 0031 [102]: 639ffe731e811fcc +Block 0031 [103]: 24fb4a3d962e898b +Block 0031 [104]: e0bcc96f713b8ff9 +Block 0031 [105]: 0cf4c44703830b7f +Block 0031 [106]: b32cb05c07886e34 +Block 0031 [107]: ba08b062ccba50d0 +Block 0031 [108]: 91294b4aa9bc5a43 +Block 0031 [109]: 2d400f10c1b6a9be +Block 0031 [110]: 62a147f32799a447 +Block 0031 [111]: d8d5a2fd4fc9bfdf +Block 0031 [112]: 244d3a7fb1fabfec +Block 0031 [113]: c5b919604e91a5fb +Block 0031 [114]: 387d446b9148351b +Block 0031 [115]: afa4faf51d18ceb6 +Block 0031 [116]: 3d185ce015d811db +Block 0031 [117]: 055b8e4f1439bf47 +Block 0031 [118]: 96a004c174932568 +Block 0031 [119]: 7cde3345b6a6a927 +Block 0031 [120]: 3b2cd27114b81fc0 +Block 0031 [121]: 85a734f9649b30b3 +Block 0031 [122]: dbfac3c3ba955bdd +Block 0031 [123]: cbdd3b8c4c271e4f +Block 0031 [124]: be934f0029c83a48 +Block 0031 [125]: db7e4b8f39c91c7d +Block 0031 [126]: 60b2676ff06a944a +Block 0031 [127]: 802b5b8358cf77b4 +Tag: 96 a9 d4 e5 a1 73 40 92 c8 5e 29 f4 10 a4 59 14 a5 dd 1f 5c bf 08 b2 67 0d a6 8a 02 85 ab f3 2b diff --git a/deps/phc-winner-argon2-20190702/kats/argon2d_v16.shasum b/deps/phc-winner-argon2-20190702/kats/argon2d_v16.shasum new file mode 100644 index 000000000..6df69c8de --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2d_v16.shasum @@ -0,0 +1 @@ +4ec4569a016c3accc6a25a34252b03a6135939b3c452389917a3f3b65878165b argon2d_v16 diff --git a/deps/phc-winner-argon2-20190702/kats/argon2i b/deps/phc-winner-argon2-20190702/kats/argon2i new file mode 100644 index 000000000..2438db048 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2i @@ -0,0 +1,12304 @@ +======================================= +Argon2i version number 19 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: c4 60 65 81 52 76 a0 b3 e7 31 73 1c 90 2f 1f d8 0c f7 76 90 7f bb 7b 6a 5c a7 2e 7b 56 01 1f ee ca 44 6c 86 dd 75 b9 46 9a 5e 68 79 de c4 b7 2d 08 63 fb 93 9b 98 2e 5f 39 7c c7 d1 64 fd da a9 + + After pass 0: +Block 0000 [ 0]: f8f9e84545db08f6 +Block 0000 [ 1]: 9b073a5c87aa2d97 +Block 0000 [ 2]: d1e868d75ca8d8e4 +Block 0000 [ 3]: 349634174e1aebcc +Block 0000 [ 4]: eea679ca0b5f6de1 +Block 0000 [ 5]: 28f43caf97eba539 +Block 0000 [ 6]: 0f7895c9d5b3a714 +Block 0000 [ 7]: 34ee3afb003414a8 +Block 0000 [ 8]: 19e25e3ad0aea4dd +Block 0000 [ 9]: 0621947f5c64686c +Block 0000 [ 10]: f9eb4d3b70a00365 +Block 0000 [ 11]: 29d30205ecdbbfdd +Block 0000 [ 12]: bd82cd842052f713 +Block 0000 [ 13]: e465f1dd3eb4d797 +Block 0000 [ 14]: 56769e2b75d3d2e7 +Block 0000 [ 15]: fa423c1914be7eea +Block 0000 [ 16]: 62c74952efa4962e +Block 0000 [ 17]: 7452bcfeae5ed127 +Block 0000 [ 18]: 9b244b507058a767 +Block 0000 [ 19]: ad381b104b333277 +Block 0000 [ 20]: d74814cfe245d0a8 +Block 0000 [ 21]: 1e502a5c5fae8de4 +Block 0000 [ 22]: facc3eb8b94d3934 +Block 0000 [ 23]: 309a560639f36145 +Block 0000 [ 24]: 97c9414271065971 +Block 0000 [ 25]: 9d2d8e80f0b210fd +Block 0000 [ 26]: 8ad91ada654260d9 +Block 0000 [ 27]: e8f0199dc84ec601 +Block 0000 [ 28]: 259b8023dfe9f620 +Block 0000 [ 29]: a89f710764c84faa +Block 0000 [ 30]: 00ef7d0ed19c9170 +Block 0000 [ 31]: c3365e9be7f8ad9a +Block 0000 [ 32]: 0713eccea1449c39 +Block 0000 [ 33]: 76dfdcbc5418ca19 +Block 0000 [ 34]: 6dae38246899edb4 +Block 0000 [ 35]: d119c2592c32d2fd +Block 0000 [ 36]: 12588a09c09fa985 +Block 0000 [ 37]: fd7de45ad68146e2 +Block 0000 [ 38]: b8b2a32696f86ff5 +Block 0000 [ 39]: 7a8597fe96c79b15 +Block 0000 [ 40]: 0b1c32b869e29e8e +Block 0000 [ 41]: d109376ce2cd296a +Block 0000 [ 42]: 5930033519fbc3ea +Block 0000 [ 43]: 26c0615c70db9a06 +Block 0000 [ 44]: c52e63756eb284d6 +Block 0000 [ 45]: f46353b6fa27de93 +Block 0000 [ 46]: c3f16cd0bf50beb1 +Block 0000 [ 47]: 7cbb5010db6ca163 +Block 0000 [ 48]: 6df6fb9d5477cb8d +Block 0000 [ 49]: f76c9bc2200b9271 +Block 0000 [ 50]: 4307dd8d26190968 +Block 0000 [ 51]: 559d187e7f15ce59 +Block 0000 [ 52]: 3fa3181855fc8fae +Block 0000 [ 53]: 8a5c7a26545c3289 +Block 0000 [ 54]: 6e0dab49fbd175c9 +Block 0000 [ 55]: 162d68393ba63961 +Block 0000 [ 56]: 7e8bf654d150b577 +Block 0000 [ 57]: 245981b04758d084 +Block 0000 [ 58]: b94c1f15f33a00c3 +Block 0000 [ 59]: 09b776c573975316 +Block 0000 [ 60]: e059c7959776505f +Block 0000 [ 61]: c8dec45d870e2428 +Block 0000 [ 62]: 9d05dd926cbe5e24 +Block 0000 [ 63]: 07eadbb03290625e +Block 0000 [ 64]: 1813e236d70246c4 +Block 0000 [ 65]: 6b9e88ab27f282a1 +Block 0000 [ 66]: 8cab57c214d0e51b +Block 0000 [ 67]: 819344c6d98d7949 +Block 0000 [ 68]: 642adef349e0b4c2 +Block 0000 [ 69]: 9147532626665562 +Block 0000 [ 70]: 4ce7940e9759fa18 +Block 0000 [ 71]: 86d723f5cb5bfa23 +Block 0000 [ 72]: 5956a509891d3a19 +Block 0000 [ 73]: fb65eb9452479fe5 +Block 0000 [ 74]: 15600005da769dbc +Block 0000 [ 75]: 0460dfcc45a3df4c +Block 0000 [ 76]: 9aeaf38a4e4a76a9 +Block 0000 [ 77]: a32de9ae286662a0 +Block 0000 [ 78]: 6c77f20cb87d260b +Block 0000 [ 79]: b4ee4f5014fe19b3 +Block 0000 [ 80]: 786e8758451fedc0 +Block 0000 [ 81]: 9f8a3f5a0bea80d5 +Block 0000 [ 82]: 1f5ed85ddaa1bb51 +Block 0000 [ 83]: 431138b634bdf789 +Block 0000 [ 84]: 8fee5e61ed0f3a28 +Block 0000 [ 85]: 3f166d47f662999d +Block 0000 [ 86]: 01825a35d081ba83 +Block 0000 [ 87]: 363beef46f72e254 +Block 0000 [ 88]: c0404cbcaeb8b1e5 +Block 0000 [ 89]: bf01bb3491b46fd2 +Block 0000 [ 90]: a96f73ec77d2ea1b +Block 0000 [ 91]: 7307883b0bb3368c +Block 0000 [ 92]: 180c75845418050e +Block 0000 [ 93]: 9fdd76f0e4c993c1 +Block 0000 [ 94]: d27430c09a31f795 +Block 0000 [ 95]: b16a193a47b44cd5 +Block 0000 [ 96]: 07213b9404ed4cf7 +Block 0000 [ 97]: 71794be1c4c5f86a +Block 0000 [ 98]: 46ac3a39882cffc5 +Block 0000 [ 99]: b607228f89c849b3 +Block 0000 [100]: a686fe80a061b73d +Block 0000 [101]: 5da420bbf2060e84 +Block 0000 [102]: 41d90855f9cfdd8a +Block 0000 [103]: 0bd841213cab1533 +Block 0000 [104]: f2c61ec90b666394 +Block 0000 [105]: 2ccdba05749dfd50 +Block 0000 [106]: 892110f27c3b5cec +Block 0000 [107]: 83a48c906e85ec88 +Block 0000 [108]: 9e47d91d9fd201f6 +Block 0000 [109]: b63a128d51ad43c8 +Block 0000 [110]: b704ba46fcf4e5ff +Block 0000 [111]: b12ae3f3cd72953c +Block 0000 [112]: 757f5ab719072f8f +Block 0000 [113]: 7aa97ff2970a4983 +Block 0000 [114]: 26d6bfd165886039 +Block 0000 [115]: e7adc882d7cb951b +Block 0000 [116]: ada2f6156a676320 +Block 0000 [117]: 171d0b6b8aa5a810 +Block 0000 [118]: 23bed4ea02a196ee +Block 0000 [119]: 02f0188d935ab1ca +Block 0000 [120]: 35587bbaae997e8f +Block 0000 [121]: e019dc02fbbd82c7 +Block 0000 [122]: f6075ab25dbcf553 +Block 0000 [123]: fb9083c228f4a752 +Block 0000 [124]: 9d15acfaa9b10ba4 +Block 0000 [125]: f0a6348c8d1d5414 +Block 0000 [126]: 3677542aa326e00f +Block 0000 [127]: 4243b9abcf3da44a +Block 0001 [ 0]: ef764133b4ca7099 +Block 0001 [ 1]: 620440b335cfe9e1 +Block 0001 [ 2]: 57168a36ebcb7715 +Block 0001 [ 3]: ff3b0b0f3930071d +Block 0001 [ 4]: 45172aba01f6fb3f +Block 0001 [ 5]: 0e1606b528bbcc18 +Block 0001 [ 6]: 45e18c0a19181cfc +Block 0001 [ 7]: 82bfbe0920b6587e +Block 0001 [ 8]: 3bab67fb1c68f77a +Block 0001 [ 9]: 56c49774a6130f3b +Block 0001 [ 10]: 3a6dfe75c9eb7f87 +Block 0001 [ 11]: 73c5e435e706cfe0 +Block 0001 [ 12]: 4c99046a73c091a9 +Block 0001 [ 13]: af7daf0a40e91b94 +Block 0001 [ 14]: 9da14c9e8cbb3ecb +Block 0001 [ 15]: 60440e10556a8e9e +Block 0001 [ 16]: 83353ede182e7349 +Block 0001 [ 17]: 2421e9e19a58a64d +Block 0001 [ 18]: f1eb1a9a17260a7a +Block 0001 [ 19]: a1898333c9e704ba +Block 0001 [ 20]: 159219bddbc57599 +Block 0001 [ 21]: dfbe30755288733b +Block 0001 [ 22]: fe9df8f860580019 +Block 0001 [ 23]: 16a1ca7d3854643e +Block 0001 [ 24]: 485e3ac74e7231ba +Block 0001 [ 25]: beebe23e664c4a95 +Block 0001 [ 26]: c9049347422d9e0d +Block 0001 [ 27]: 4d88f3373c446af7 +Block 0001 [ 28]: b83c654f54013a30 +Block 0001 [ 29]: 75b41709be2283c4 +Block 0001 [ 30]: 83f2efbed5b0d3f0 +Block 0001 [ 31]: 04629de997b1b2b0 +Block 0001 [ 32]: 583c5766265c50fe +Block 0001 [ 33]: e0306a89eb326efd +Block 0001 [ 34]: 5c1f148541f18e2c +Block 0001 [ 35]: 0462bd80b505f544 +Block 0001 [ 36]: afa70cd1847e14ba +Block 0001 [ 37]: 4a107dc0330d7392 +Block 0001 [ 38]: a41d234f92da5fef +Block 0001 [ 39]: 5c1f1ef242e817ac +Block 0001 [ 40]: 4c21ded5b41e4094 +Block 0001 [ 41]: 5382efd3508c2e0c +Block 0001 [ 42]: f99d3383b9f79cd4 +Block 0001 [ 43]: c59cf9cca42b6c3c +Block 0001 [ 44]: c1073a16b4609c9e +Block 0001 [ 45]: eeb0741015c0bec1 +Block 0001 [ 46]: 59fdebef1fa66310 +Block 0001 [ 47]: ac6041a2f43ddf7e +Block 0001 [ 48]: 1dfa0e2d9bf3acf9 +Block 0001 [ 49]: d424856738a27879 +Block 0001 [ 50]: a00c23feea1774f4 +Block 0001 [ 51]: 89aa283bcb83e2ea +Block 0001 [ 52]: d5c467511139648b +Block 0001 [ 53]: 736a35cbe2be51a7 +Block 0001 [ 54]: 2a9a116684b668a6 +Block 0001 [ 55]: 6c97a9ae3f327f6e +Block 0001 [ 56]: 7a37d7d11fa226a1 +Block 0001 [ 57]: e933955bb195f86f +Block 0001 [ 58]: 33e0ba8e788c608b +Block 0001 [ 59]: b191c25233ce5744 +Block 0001 [ 60]: a47cbd502d3d657d +Block 0001 [ 61]: 9373f7d43329517c +Block 0001 [ 62]: 69c08268cd250f03 +Block 0001 [ 63]: 64806d4cebc49823 +Block 0001 [ 64]: 51b7c4d051e70e05 +Block 0001 [ 65]: 91598eb48764ed2c +Block 0001 [ 66]: b9be7ab1d422d2c3 +Block 0001 [ 67]: eb4243989b24e6da +Block 0001 [ 68]: 0df9fb33ec5a2734 +Block 0001 [ 69]: db21c080fd6a4f45 +Block 0001 [ 70]: b33850abcfdd0713 +Block 0001 [ 71]: 7dad7d9d0be16da2 +Block 0001 [ 72]: ae3ccab55493d758 +Block 0001 [ 73]: d0d752f17120f636 +Block 0001 [ 74]: bc9d875ca9a5617b +Block 0001 [ 75]: f71b4218c11d1de7 +Block 0001 [ 76]: b71c8b9ad12f8574 +Block 0001 [ 77]: 1f47cd7880ee5f60 +Block 0001 [ 78]: 7e94dcef68d5437b +Block 0001 [ 79]: 5212acee74773cd5 +Block 0001 [ 80]: 447fe1f91d18984b +Block 0001 [ 81]: 42b651bbf71123bf +Block 0001 [ 82]: a36cbec05af8a16e +Block 0001 [ 83]: f0062604e61b9562 +Block 0001 [ 84]: 8de69b3901f9beed +Block 0001 [ 85]: 0ef87138213d49bb +Block 0001 [ 86]: ac23b588ee62df85 +Block 0001 [ 87]: 214784f404183fc6 +Block 0001 [ 88]: 80bd01721550b847 +Block 0001 [ 89]: 477d6c0b7cde2cbe +Block 0001 [ 90]: 52854d28f1c327ef +Block 0001 [ 91]: 6d023ae28c3aa0b8 +Block 0001 [ 92]: ad28349b9fb94455 +Block 0001 [ 93]: 9f03641c1e41fd77 +Block 0001 [ 94]: b7f2c676f362a9eb +Block 0001 [ 95]: 66974a6cf91ef0f3 +Block 0001 [ 96]: 767da5d9fc567f54 +Block 0001 [ 97]: 43b4c5bd3a112b5f +Block 0001 [ 98]: d14f0ebe0a796ebe +Block 0001 [ 99]: e4a7ade650871550 +Block 0001 [100]: 8841858fab3bbc24 +Block 0001 [101]: 9bf02ae3876cee46 +Block 0001 [102]: fb3d03e3030580de +Block 0001 [103]: 3cd714a5f553c6ae +Block 0001 [104]: 7301e5f821f928da +Block 0001 [105]: c2fc74e88d5b7cff +Block 0001 [106]: 6161d5101e4fd223 +Block 0001 [107]: 45cf0588a9a55a41 +Block 0001 [108]: 77902bd3439bf89d +Block 0001 [109]: 6fa5269812f867d1 +Block 0001 [110]: 2caa21dbd02ea223 +Block 0001 [111]: b776e0d326f8bf2b +Block 0001 [112]: 3f3959f6cf241888 +Block 0001 [113]: e2ad2d05b2095775 +Block 0001 [114]: 08403c042f8bfe87 +Block 0001 [115]: 2ee327dcc9e04a69 +Block 0001 [116]: 6031d492c05b0970 +Block 0001 [117]: 9b6f35141994e4a4 +Block 0001 [118]: 24427c298a09f2a6 +Block 0001 [119]: 3325ce5ef7c363fe +Block 0001 [120]: 5821f16b64830335 +Block 0001 [121]: 18d3c2a72d220c00 +Block 0001 [122]: 60c684f8541cdb39 +Block 0001 [123]: 53e20b76bdc07a15 +Block 0001 [124]: 396fd953e51a57f7 +Block 0001 [125]: 6c45c1dd68804fbb +Block 0001 [126]: 386e57e7fe152c87 +Block 0001 [127]: 2b8ab7d454b17187 +Block 0002 [ 0]: f800892a7954baa5 +Block 0002 [ 1]: bb211f064d193505 +Block 0002 [ 2]: 2c406a2eb271e25e +Block 0002 [ 3]: fa438cb81ec6e36f +Block 0002 [ 4]: 9735e9adcf04badc +Block 0002 [ 5]: 197193e9f53e6c35 +Block 0002 [ 6]: 260ee704b27a33d5 +Block 0002 [ 7]: fc9e533fe0595718 +Block 0002 [ 8]: 0a5b5d636945ddc1 +Block 0002 [ 9]: 2b8c865b8c7cbbc9 +Block 0002 [ 10]: 407b524588d22887 +Block 0002 [ 11]: 5bf322dd7ed3f320 +Block 0002 [ 12]: 68b0ac8fcd51f09e +Block 0002 [ 13]: e573f760dbeab339 +Block 0002 [ 14]: 8f9bbb1aa92d30df +Block 0002 [ 15]: de70db7a94f48763 +Block 0002 [ 16]: c7343a9920a08774 +Block 0002 [ 17]: 04a16cc553ccfd91 +Block 0002 [ 18]: ba758a5bcf1ceee1 +Block 0002 [ 19]: 302d7a2500b04827 +Block 0002 [ 20]: fab42113e7a58400 +Block 0002 [ 21]: 774d2f3fb3ebac54 +Block 0002 [ 22]: 039fb1f8b4bd0ae6 +Block 0002 [ 23]: a0062ed5dc741bfb +Block 0002 [ 24]: c1f8b84daf845788 +Block 0002 [ 25]: 676d9d836a19800a +Block 0002 [ 26]: a38f6fd865ac4848 +Block 0002 [ 27]: caeb787c80d60dd8 +Block 0002 [ 28]: c0ef86db1ef7dc8c +Block 0002 [ 29]: 2ab8f9a9e8e5c11d +Block 0002 [ 30]: a4541aee68c4eb23 +Block 0002 [ 31]: e95fe5830c6b8ba0 +Block 0002 [ 32]: 15b15aae605b133c +Block 0002 [ 33]: 96b0a14a369ec241 +Block 0002 [ 34]: ef41fbe7867703a6 +Block 0002 [ 35]: efd04ef060083c4e +Block 0002 [ 36]: 6989e447eb83bdc2 +Block 0002 [ 37]: 9a36016905584a79 +Block 0002 [ 38]: 0d13b26ce0ff9d05 +Block 0002 [ 39]: b4d7e57e14069ece +Block 0002 [ 40]: 1f0e4c518f1c8c1e +Block 0002 [ 41]: 8b78a9808d9690d2 +Block 0002 [ 42]: 90c2d89b2aed8a6b +Block 0002 [ 43]: ff2e5c3beb3a1815 +Block 0002 [ 44]: d496191f32068f3a +Block 0002 [ 45]: b8dfe21cb707da28 +Block 0002 [ 46]: d79319d5f2e41fab +Block 0002 [ 47]: 9a46839bc093121e +Block 0002 [ 48]: 5bac63652a33f3ec +Block 0002 [ 49]: 02c37aa9ae4990e8 +Block 0002 [ 50]: 1398f6f1dbb7af0f +Block 0002 [ 51]: 7eb5484d7affbb12 +Block 0002 [ 52]: 78660ba371fea159 +Block 0002 [ 53]: 98e4d1399d2362c8 +Block 0002 [ 54]: 8568b763f41a812d +Block 0002 [ 55]: b9bbbefe59138b97 +Block 0002 [ 56]: 86039e4a97b3f9c1 +Block 0002 [ 57]: 23f89f528c03a7d7 +Block 0002 [ 58]: 34602582e567cc92 +Block 0002 [ 59]: a85188de86a572bd +Block 0002 [ 60]: 8a73a6b3119b4089 +Block 0002 [ 61]: 7bc9311caf998892 +Block 0002 [ 62]: 938f52a89c882cc7 +Block 0002 [ 63]: 3caa06a9012cb757 +Block 0002 [ 64]: 54b797ab02e20770 +Block 0002 [ 65]: f96f77af4acc75c9 +Block 0002 [ 66]: fbfea542d5e8050e +Block 0002 [ 67]: d34858f9f7c0509e +Block 0002 [ 68]: 770353666b8d6d6d +Block 0002 [ 69]: 876cfcb815cb1825 +Block 0002 [ 70]: d5794151cc1d4b6b +Block 0002 [ 71]: c94613ec9e726d59 +Block 0002 [ 72]: b386eddf504649b4 +Block 0002 [ 73]: 048945fcd8814cd2 +Block 0002 [ 74]: 1ca2c95c74bda800 +Block 0002 [ 75]: c881bb4a4c047e6f +Block 0002 [ 76]: 7d0311c7ffc91e51 +Block 0002 [ 77]: fde167d6295385f8 +Block 0002 [ 78]: 25decd8821d31214 +Block 0002 [ 79]: 67dbf17c5a3615be +Block 0002 [ 80]: 235fce4fbbaf1b91 +Block 0002 [ 81]: f8cf3fe7dc09dd19 +Block 0002 [ 82]: 1047453126c4e863 +Block 0002 [ 83]: 8845e5b3deb21c6c +Block 0002 [ 84]: 4cbcfb62e7732ecb +Block 0002 [ 85]: f673aca506549a4a +Block 0002 [ 86]: 9273d099a3df174f +Block 0002 [ 87]: 08ffdc9464e5292b +Block 0002 [ 88]: c8ca072e21db9bba +Block 0002 [ 89]: 3c2610eb1e17098f +Block 0002 [ 90]: fe447430a6ac29a2 +Block 0002 [ 91]: 021f607556d333bf +Block 0002 [ 92]: 42f7f71e90b08b96 +Block 0002 [ 93]: c2e25d7dfaefc9bc +Block 0002 [ 94]: cc372cea39d95dea +Block 0002 [ 95]: c7bb1a34bce7deb7 +Block 0002 [ 96]: 3699605b8efc1d72 +Block 0002 [ 97]: b9d1203e5e5a9f93 +Block 0002 [ 98]: e0ac8c626778c5b9 +Block 0002 [ 99]: e8f0abe5bfffc759 +Block 0002 [100]: a0ddef1454f012c4 +Block 0002 [101]: c35b7e6bb3c129ef +Block 0002 [102]: c495ece8dffaa61f +Block 0002 [103]: 9f303d56213c5213 +Block 0002 [104]: c15b627a5137b819 +Block 0002 [105]: c767b5cdb34e6640 +Block 0002 [106]: 63970c306c5456b3 +Block 0002 [107]: 3c5d22fed3a34b4b +Block 0002 [108]: 77fcecc4982e6e5d +Block 0002 [109]: ad1612003aca1745 +Block 0002 [110]: e1952b3ba36fb7ad +Block 0002 [111]: bc654d244a26361a +Block 0002 [112]: 996cba723c6dee9f +Block 0002 [113]: abfd371026ffc462 +Block 0002 [114]: 2aca5170a54baf57 +Block 0002 [115]: fe5af00451aa2448 +Block 0002 [116]: adcc756aad83c72c +Block 0002 [117]: ea0b0fd40b596cb2 +Block 0002 [118]: e553a4d72df13b74 +Block 0002 [119]: 43d6b8d77a537397 +Block 0002 [120]: cdfd86bdf959205a +Block 0002 [121]: cb0e847adf1b1a21 +Block 0002 [122]: 7daf47cb8acefa5d +Block 0002 [123]: f473a1dc75308090 +Block 0002 [124]: b5c963edba8f5b31 +Block 0002 [125]: 977fe5978311b717 +Block 0002 [126]: 508d8a5d678bdce3 +Block 0002 [127]: a9fc0d3300c8acc0 +Block 0003 [ 0]: f29f5ee7dde3e2fa +Block 0003 [ 1]: a69ac3ce1bfbe156 +Block 0003 [ 2]: f20cd315e3237ea6 +Block 0003 [ 3]: f65add2c10041390 +Block 0003 [ 4]: 224a2f1d2d0cb714 +Block 0003 [ 5]: 852d30cc9e7667b2 +Block 0003 [ 6]: 5bae034c9ae55292 +Block 0003 [ 7]: 3693e7e73fcb7211 +Block 0003 [ 8]: 1bc540987729dad0 +Block 0003 [ 9]: 61bc9fef7ee05b1e +Block 0003 [ 10]: c349dbc3fbdd2373 +Block 0003 [ 11]: b9943f5eedfec4e6 +Block 0003 [ 12]: 78070afd731fad12 +Block 0003 [ 13]: 5bd3aab17f6b9d8c +Block 0003 [ 14]: a6b24b01005d202c +Block 0003 [ 15]: 333fe2532820ff48 +Block 0003 [ 16]: 1f4f7e472e2b8fb3 +Block 0003 [ 17]: f176be488974611a +Block 0003 [ 18]: 1e9f6f9231c09908 +Block 0003 [ 19]: 5d54c79477328673 +Block 0003 [ 20]: 3e7969bf3766cf2d +Block 0003 [ 21]: b4dcc50e5b21245b +Block 0003 [ 22]: 7a53bfcd6e7fc1b8 +Block 0003 [ 23]: 7212aeab8eccdb9b +Block 0003 [ 24]: 909aa8c6929eca7c +Block 0003 [ 25]: ff8a4ee4e6e07f69 +Block 0003 [ 26]: 5d189711c4cbf159 +Block 0003 [ 27]: 6e16fb8216c3341d +Block 0003 [ 28]: 74b7cf5d99f50dd9 +Block 0003 [ 29]: a3e420ff6430892f +Block 0003 [ 30]: 32bcd10ef54c9025 +Block 0003 [ 31]: 4040565062b0c14a +Block 0003 [ 32]: 48e8d06ee166f230 +Block 0003 [ 33]: a7941b7ef30da38b +Block 0003 [ 34]: dc303d0535fb39c0 +Block 0003 [ 35]: 704564c8a42f5387 +Block 0003 [ 36]: 995ae4804047a33c +Block 0003 [ 37]: c9aaed214935c044 +Block 0003 [ 38]: a1ddf242e51be1e1 +Block 0003 [ 39]: 509629b7401dae92 +Block 0003 [ 40]: aa08ce0caa96268c +Block 0003 [ 41]: 916ade45d30f4159 +Block 0003 [ 42]: 689738eedf7ebff5 +Block 0003 [ 43]: 1a7addd2b677db5f +Block 0003 [ 44]: fb5bb4c97d66b670 +Block 0003 [ 45]: 41a52657afbe3147 +Block 0003 [ 46]: 3883bc90bc1169d8 +Block 0003 [ 47]: ec52333d647d5b85 +Block 0003 [ 48]: 5a444fd37a3c4f27 +Block 0003 [ 49]: 8c32816c9d713368 +Block 0003 [ 50]: 5d5224766dd5d5db +Block 0003 [ 51]: 4904f3da1d5dcae4 +Block 0003 [ 52]: ce1a724bd5858367 +Block 0003 [ 53]: 8eccc94bf8659467 +Block 0003 [ 54]: f452f0b9278f115d +Block 0003 [ 55]: f0cbb770de867a30 +Block 0003 [ 56]: 7e52ecf3a381577c +Block 0003 [ 57]: 2b1228c2a7ba6127 +Block 0003 [ 58]: 5e826b4c3d378b86 +Block 0003 [ 59]: 2479e83e33f483eb +Block 0003 [ 60]: b98b54b722038d21 +Block 0003 [ 61]: f9e4729b6e07e4af +Block 0003 [ 62]: ac3e565b4b0d5c61 +Block 0003 [ 63]: 20f2acbd2702c2b0 +Block 0003 [ 64]: 2806b9b55ae9f42a +Block 0003 [ 65]: 3b0ff28da85596ff +Block 0003 [ 66]: 67de27987796c904 +Block 0003 [ 67]: 7cad0f6f1c0baf7d +Block 0003 [ 68]: 87394f6d9e6387a2 +Block 0003 [ 69]: e684ab37a27ffa95 +Block 0003 [ 70]: 40044ced68c8fcf8 +Block 0003 [ 71]: c3cd8c8d3a92a151 +Block 0003 [ 72]: 586fc6e2612b29d9 +Block 0003 [ 73]: 0a05e7e439049499 +Block 0003 [ 74]: a2e36bc85145c34c +Block 0003 [ 75]: ebdffd4eee30c7d0 +Block 0003 [ 76]: eb4bf0c46b2fd17d +Block 0003 [ 77]: a6247f3ec7467b0d +Block 0003 [ 78]: d35d387770f7b130 +Block 0003 [ 79]: 6587143e81164304 +Block 0003 [ 80]: 87a0d7265bb58016 +Block 0003 [ 81]: a0e8b7ed5337329a +Block 0003 [ 82]: 20bffc3919b2f8ee +Block 0003 [ 83]: 5bae72ac7bc9e98e +Block 0003 [ 84]: f0720b89617c114c +Block 0003 [ 85]: d458007dd3ad396d +Block 0003 [ 86]: f6a77609442e6dbc +Block 0003 [ 87]: 6927f28f9f2b3931 +Block 0003 [ 88]: 9dd53d1ba8546814 +Block 0003 [ 89]: 375b50984dd3215f +Block 0003 [ 90]: d916bca2077a3dfc +Block 0003 [ 91]: fddd15ac8ec81f25 +Block 0003 [ 92]: 5f7fc3b451ef209a +Block 0003 [ 93]: 04500f0944cfb165 +Block 0003 [ 94]: 55e97e7a0286d396 +Block 0003 [ 95]: 21a9d670b0d460d6 +Block 0003 [ 96]: 4b5ef30861dd497d +Block 0003 [ 97]: 05868fe9bee1b79a +Block 0003 [ 98]: 4090c8b98223f86a +Block 0003 [ 99]: 952446e47335d4cf +Block 0003 [100]: 8ce87f53a456595d +Block 0003 [101]: 2e337ac5f6c713ff +Block 0003 [102]: 14c0320208b056f7 +Block 0003 [103]: 4b62cfe312451641 +Block 0003 [104]: b84242c858a3c472 +Block 0003 [105]: 224c1df89e776cc7 +Block 0003 [106]: 4b87c369fba56549 +Block 0003 [107]: 7fc4979047128a2d +Block 0003 [108]: 1656d958d82950e4 +Block 0003 [109]: dfedfbee1e7e1006 +Block 0003 [110]: d682028ee41f8844 +Block 0003 [111]: 53f64e8bb452c43c +Block 0003 [112]: 3a0f16fa65ccd87f +Block 0003 [113]: b1563cdcd9ffa4a1 +Block 0003 [114]: 67fa21f7b286a798 +Block 0003 [115]: 0baa99c3ad450dc5 +Block 0003 [116]: e9bd5f54023ce367 +Block 0003 [117]: d08137ab3255eee1 +Block 0003 [118]: eb904d633401c297 +Block 0003 [119]: 3332a4249f22ad11 +Block 0003 [120]: a8f06f44894e1b5e +Block 0003 [121]: c8255151ffc2df5b +Block 0003 [122]: 8e4a109353c6adaf +Block 0003 [123]: 9b28b15b5d3174f4 +Block 0003 [124]: c6d904a8edee34c6 +Block 0003 [125]: 87375410235cbcd9 +Block 0003 [126]: 55bf929868fc10c3 +Block 0003 [127]: 127c01e4eb0a2de7 +Block 0004 [ 0]: c5669884e05e1054 +Block 0004 [ 1]: 3f94ff6ebc2b2554 +Block 0004 [ 2]: 8fbc379431b56422 +Block 0004 [ 3]: f88c86f1f1270af0 +Block 0004 [ 4]: 26b6ae60cef93b49 +Block 0004 [ 5]: 72b0b121127be7b5 +Block 0004 [ 6]: dab1be76dc74af93 +Block 0004 [ 7]: a03e9cfcc4ac8a05 +Block 0004 [ 8]: d8c9e3b84f55f063 +Block 0004 [ 9]: ffa26c3a57c34ad2 +Block 0004 [ 10]: bd74c5a8a2127eb8 +Block 0004 [ 11]: cea1dc181f6f2a21 +Block 0004 [ 12]: 4843f0f8551328b3 +Block 0004 [ 13]: 47b8b38b1acdb67a +Block 0004 [ 14]: 781232b450232fdd +Block 0004 [ 15]: 9e2377879037b3e2 +Block 0004 [ 16]: 85a04f0ffa72a07c +Block 0004 [ 17]: 39451ddefe9fc9d8 +Block 0004 [ 18]: 173704443ef64f6b +Block 0004 [ 19]: 84f4b473532ad2a1 +Block 0004 [ 20]: 3089cff815b0f3b8 +Block 0004 [ 21]: 233f0730c04ea4da +Block 0004 [ 22]: 6fec989fd9ca3751 +Block 0004 [ 23]: 950ca59da61af60d +Block 0004 [ 24]: 64ed9179567b182c +Block 0004 [ 25]: 5dc48b9fe1d0a171 +Block 0004 [ 26]: 2f66b2eb0ee38875 +Block 0004 [ 27]: d175513a90dd451a +Block 0004 [ 28]: 4206e0c724377abd +Block 0004 [ 29]: cc13835a191fa67b +Block 0004 [ 30]: 3053614f4145274f +Block 0004 [ 31]: 1ca6125149cac629 +Block 0004 [ 32]: 1ec4eb1d931fcec5 +Block 0004 [ 33]: b48d876f2c3b85d9 +Block 0004 [ 34]: e94ce07477ca43e9 +Block 0004 [ 35]: 700c79cbe93b4394 +Block 0004 [ 36]: e89e17b0489867ff +Block 0004 [ 37]: 3cd01ed6b3858f52 +Block 0004 [ 38]: 474dad41679d199b +Block 0004 [ 39]: 5b255cc1d055e5df +Block 0004 [ 40]: 4ccade7e3293957a +Block 0004 [ 41]: 4d73c3ed8f0f9dce +Block 0004 [ 42]: 682e559fef82408c +Block 0004 [ 43]: 55a3398f6c8ad9f0 +Block 0004 [ 44]: a38c1d494d186dc9 +Block 0004 [ 45]: d4d9cb29dda4e9a9 +Block 0004 [ 46]: 5a881e243e65800f +Block 0004 [ 47]: 3245ba87e34e6a01 +Block 0004 [ 48]: f8301e184fc6cda0 +Block 0004 [ 49]: 4c349af6614bdf35 +Block 0004 [ 50]: 38983beb42cabfa6 +Block 0004 [ 51]: 471b2b7d59aaf4c0 +Block 0004 [ 52]: 200340ed6848065c +Block 0004 [ 53]: fe5fa422a8539342 +Block 0004 [ 54]: 19db85340e85a4c7 +Block 0004 [ 55]: 764b873844fe5dc8 +Block 0004 [ 56]: f95b70aba7297760 +Block 0004 [ 57]: 28b74a30e88c25a4 +Block 0004 [ 58]: ff6052d1b7dc11b8 +Block 0004 [ 59]: 359fc7217f7b5ea3 +Block 0004 [ 60]: 7343b307e5077ab9 +Block 0004 [ 61]: 8150cdffb05bd766 +Block 0004 [ 62]: cc7c8dc0e4ab8231 +Block 0004 [ 63]: 16934251c5404298 +Block 0004 [ 64]: 5b8b9b3abdf59f9e +Block 0004 [ 65]: e9111f573f4630ab +Block 0004 [ 66]: 382795e34b2ec716 +Block 0004 [ 67]: fcc921aa39a2cff8 +Block 0004 [ 68]: 6705644ecca72318 +Block 0004 [ 69]: 43f91b74943af5ed +Block 0004 [ 70]: 4d7d1da11f036218 +Block 0004 [ 71]: e1c228cdfcd89e96 +Block 0004 [ 72]: 090f00dea2cc93be +Block 0004 [ 73]: b387db043b11e668 +Block 0004 [ 74]: 0da3856a53e7ca99 +Block 0004 [ 75]: af74d7028d88f1f6 +Block 0004 [ 76]: 0e0abae1e9a6f9f9 +Block 0004 [ 77]: 693fa44317e4a292 +Block 0004 [ 78]: 5db30f5a60e69d24 +Block 0004 [ 79]: 11c85a24b61982a9 +Block 0004 [ 80]: 799ce38a9797a637 +Block 0004 [ 81]: 22be541165077550 +Block 0004 [ 82]: 3e9d7987ed7393f2 +Block 0004 [ 83]: 346fc635e2423532 +Block 0004 [ 84]: c329869d6c743739 +Block 0004 [ 85]: 7e1776ce3430a617 +Block 0004 [ 86]: 4879c918b591a3d5 +Block 0004 [ 87]: df686348aa1bcc9d +Block 0004 [ 88]: 4c292b6cb6451b23 +Block 0004 [ 89]: 64a0a9e46c7f4944 +Block 0004 [ 90]: 0e66aa435ab0d3c2 +Block 0004 [ 91]: da8620defbe33208 +Block 0004 [ 92]: 65a8aebdc3b995f7 +Block 0004 [ 93]: f446a1293537c2a3 +Block 0004 [ 94]: a5c2b153c90dafbd +Block 0004 [ 95]: aee2502b1b7b6454 +Block 0004 [ 96]: f77055f60f6ded0f +Block 0004 [ 97]: 4c99ab5ec6d6cc51 +Block 0004 [ 98]: 8b0570e7d0993e6e +Block 0004 [ 99]: a57d13448847ab2e +Block 0004 [100]: 2e25763d3f1f8860 +Block 0004 [101]: 9438798b77b4c74c +Block 0004 [102]: 88e65057c688ebe4 +Block 0004 [103]: 23d18ba2061e692b +Block 0004 [104]: fa2590a606cb24bf +Block 0004 [105]: 959e41d5895359f9 +Block 0004 [106]: b2d9c8c2ea35b321 +Block 0004 [107]: 4ae5dd4861388fc1 +Block 0004 [108]: 7047bf4db43193ea +Block 0004 [109]: dc6a89e8e3031a84 +Block 0004 [110]: 49df122c84348347 +Block 0004 [111]: b9eaaf9df38dfa72 +Block 0004 [112]: a5eadb80efc9f742 +Block 0004 [113]: 6e289d7490d5e8df +Block 0004 [114]: 1d8dfa94f6a71ddd +Block 0004 [115]: 05d642c2d9accca5 +Block 0004 [116]: e2fa51b62d827843 +Block 0004 [117]: cc351a7fbc1d6c57 +Block 0004 [118]: 08483dae0fb2a6e7 +Block 0004 [119]: 1377a9b14e8a170a +Block 0004 [120]: 18dd33ecc8497fc6 +Block 0004 [121]: cc1bf6adee26abb2 +Block 0004 [122]: 1b0f9fa6148fdcb8 +Block 0004 [123]: d85c6b6f66af28d2 +Block 0004 [124]: edb28ef7c9fd8989 +Block 0004 [125]: 3482825859e2fc7f +Block 0004 [126]: 7aafe644d7847c19 +Block 0004 [127]: 2066cdb758166cd6 +Block 0005 [ 0]: c69d96a7bb15ad7c +Block 0005 [ 1]: cd7d7ed48d3cd0c5 +Block 0005 [ 2]: b9b77be8c3a6d644 +Block 0005 [ 3]: 5c090535da2bdf7e +Block 0005 [ 4]: 468ba6b3adecc383 +Block 0005 [ 5]: 9bdc6c810fb047b6 +Block 0005 [ 6]: 59fa24c0e4629f41 +Block 0005 [ 7]: 2671328033fbac24 +Block 0005 [ 8]: c52bf1f5c071984d +Block 0005 [ 9]: 941e98216ad7ba45 +Block 0005 [ 10]: 4512e358a8f202e9 +Block 0005 [ 11]: e04b6e394dc8fcbf +Block 0005 [ 12]: edeee98a26d2ed10 +Block 0005 [ 13]: acfa10bcafede436 +Block 0005 [ 14]: 0327e4dccfda0df3 +Block 0005 [ 15]: 1517590ce6508a53 +Block 0005 [ 16]: 93be06e857f828b0 +Block 0005 [ 17]: 9e334a17efeacf2d +Block 0005 [ 18]: 0abb1c185c360c66 +Block 0005 [ 19]: 6e8ba87a521c988f +Block 0005 [ 20]: e1ce03229d851942 +Block 0005 [ 21]: b3a2f4339372bea0 +Block 0005 [ 22]: aee33f6f38262588 +Block 0005 [ 23]: 18538d1dbff00c4b +Block 0005 [ 24]: 560b17ae3900a4ca +Block 0005 [ 25]: 4f59a85a546527ba +Block 0005 [ 26]: f04efb8b9aa3ed24 +Block 0005 [ 27]: 7bb31fa85be906fd +Block 0005 [ 28]: 02b6a569c025f548 +Block 0005 [ 29]: 02f5100db86384ca +Block 0005 [ 30]: 218bf5af0629d6ac +Block 0005 [ 31]: cfe334b46e5562e6 +Block 0005 [ 32]: dcc54852060e5f15 +Block 0005 [ 33]: 3225b16290cc6003 +Block 0005 [ 34]: e2424de76ed2e45b +Block 0005 [ 35]: ad15394489787731 +Block 0005 [ 36]: 7d05d61506fad68e +Block 0005 [ 37]: 2c0c1d672f2f9b1f +Block 0005 [ 38]: 3ea3a2c1e10a1dfa +Block 0005 [ 39]: 4b2d09219829c0b4 +Block 0005 [ 40]: 240d9cc9af661f07 +Block 0005 [ 41]: bc8d390ba8011edb +Block 0005 [ 42]: 9bb0be348cde4a4a +Block 0005 [ 43]: 647c882ae02f2a4f +Block 0005 [ 44]: 5dbd001ec7676d38 +Block 0005 [ 45]: 73ab60a147b1c181 +Block 0005 [ 46]: 84fea05444fa2a85 +Block 0005 [ 47]: aef881d5d95c0df1 +Block 0005 [ 48]: 5a692fe61bda2856 +Block 0005 [ 49]: fe3ecd15fcb2c13a +Block 0005 [ 50]: fa10984aec1d1382 +Block 0005 [ 51]: e9aee1ccb6b4965c +Block 0005 [ 52]: 4d2e18d82faf8c3e +Block 0005 [ 53]: 1c4ece926941a8e9 +Block 0005 [ 54]: 386b5528970270e1 +Block 0005 [ 55]: 823551ce67827ec7 +Block 0005 [ 56]: 87d81a2f1a8047fb +Block 0005 [ 57]: ba373060adbed505 +Block 0005 [ 58]: 8578052221d6ae46 +Block 0005 [ 59]: 1f168936c739c3a4 +Block 0005 [ 60]: 0bcca09786e83d87 +Block 0005 [ 61]: 5753de51288adfc2 +Block 0005 [ 62]: 8ad3bcca43f40be1 +Block 0005 [ 63]: 4f1b9617f9c86c30 +Block 0005 [ 64]: e4d837570a26318b +Block 0005 [ 65]: 067d4cb0d49a3121 +Block 0005 [ 66]: 91b77927a207b848 +Block 0005 [ 67]: 5dbc721e332e2bc4 +Block 0005 [ 68]: 2316410cbb3610b1 +Block 0005 [ 69]: 673181681ae22a67 +Block 0005 [ 70]: 8067fe815c96c23f +Block 0005 [ 71]: 80cc56dfebe3ddda +Block 0005 [ 72]: 14609d5fa6ce23c1 +Block 0005 [ 73]: 73cbea41966a7142 +Block 0005 [ 74]: 119ab1b5f53ba3ca +Block 0005 [ 75]: 9a6852050ece2e4a +Block 0005 [ 76]: bc3654b7fa5b0c6b +Block 0005 [ 77]: 4c69d15d64efcb85 +Block 0005 [ 78]: 5b09d250e32e8259 +Block 0005 [ 79]: c3e9baf9b11b3152 +Block 0005 [ 80]: 53e0b2ec68d041b4 +Block 0005 [ 81]: 0b98b646fc0fce16 +Block 0005 [ 82]: d25838c84d8cce12 +Block 0005 [ 83]: 1f7939000f470cb9 +Block 0005 [ 84]: ac4aacacba06092f +Block 0005 [ 85]: acfadfca8de0ff05 +Block 0005 [ 86]: bf09f53231d87750 +Block 0005 [ 87]: 79d905956e0f3889 +Block 0005 [ 88]: e14f247f4d5e216a +Block 0005 [ 89]: 212d91fda8e22bbb +Block 0005 [ 90]: 0e4c4aa22d20b934 +Block 0005 [ 91]: d0e46af19abc1ad2 +Block 0005 [ 92]: 2c7ea87d03e3d09b +Block 0005 [ 93]: 7164b75cc1953042 +Block 0005 [ 94]: 7b659a27384d82fb +Block 0005 [ 95]: 8bc42d8b31cebe7f +Block 0005 [ 96]: 7b06a683d868bc51 +Block 0005 [ 97]: 319e2ea63d699167 +Block 0005 [ 98]: 1ab697198262eb44 +Block 0005 [ 99]: 5b49959d8f4ca9c8 +Block 0005 [100]: 4f35c23e17f05819 +Block 0005 [101]: 26d5aaa4f087ae8f +Block 0005 [102]: b78fea4d6f1d7732 +Block 0005 [103]: 3f3e6f841d48add2 +Block 0005 [104]: ef24bee225179b89 +Block 0005 [105]: bed586e853daf5c7 +Block 0005 [106]: bc26d99c49cf9a6c +Block 0005 [107]: d909da65d4c11556 +Block 0005 [108]: ed12711f224cef83 +Block 0005 [109]: 2b9607d0e5e900a7 +Block 0005 [110]: fc43b421ce701587 +Block 0005 [111]: af7ac9f1a69d5e02 +Block 0005 [112]: d0fdb554f3165990 +Block 0005 [113]: 91aaac41e7f9ea3a +Block 0005 [114]: d217a6555996c34c +Block 0005 [115]: 54b2726ee172aaf7 +Block 0005 [116]: bc60721ff605e001 +Block 0005 [117]: 2a5c053049c31e68 +Block 0005 [118]: eb66aa545b46853b +Block 0005 [119]: da32c94d6ac845df +Block 0005 [120]: d3c36a7387623c03 +Block 0005 [121]: a5e37961367e911a +Block 0005 [122]: ed0223c8f80f0f62 +Block 0005 [123]: c9577e0c09c50399 +Block 0005 [124]: 0042484883108146 +Block 0005 [125]: 490c07c2c85c00d8 +Block 0005 [126]: cff6918e0df215d4 +Block 0005 [127]: 5e5dca04d2dd1563 +Block 0006 [ 0]: 06e575606df88e3b +Block 0006 [ 1]: 71a7464b72fd64a7 +Block 0006 [ 2]: 468923168d541632 +Block 0006 [ 3]: f3583b7ff4adbe56 +Block 0006 [ 4]: e87b42b4b254cde7 +Block 0006 [ 5]: 3548c94a108f6c4c +Block 0006 [ 6]: a56ac305d8f4bc99 +Block 0006 [ 7]: 8378293152189352 +Block 0006 [ 8]: c1dbba854c7c7f6e +Block 0006 [ 9]: 5d9fb7867d240ed6 +Block 0006 [ 10]: fdbd8b16b16c7494 +Block 0006 [ 11]: 7ad763ffba6200e8 +Block 0006 [ 12]: 77c8ebde2abb1d53 +Block 0006 [ 13]: ceabcc21195a1c4b +Block 0006 [ 14]: 20736ee04af8ae96 +Block 0006 [ 15]: 6161d5f1a7b82e44 +Block 0006 [ 16]: 7e35690bb164e16e +Block 0006 [ 17]: d0de4831d5825765 +Block 0006 [ 18]: f4b613fe1dad1e3c +Block 0006 [ 19]: e26741b0625f688b +Block 0006 [ 20]: b0d4b503e2229c7c +Block 0006 [ 21]: 819ff61fd8c3546a +Block 0006 [ 22]: e2252c69b5c0e012 +Block 0006 [ 23]: e6ac62b49e6aba20 +Block 0006 [ 24]: 5793fcaf58202c2a +Block 0006 [ 25]: b06a3c14e96ed572 +Block 0006 [ 26]: 036e41058b08b42c +Block 0006 [ 27]: 14989720933e50ad +Block 0006 [ 28]: 44ad4d4c252d6d1f +Block 0006 [ 29]: d3e00c49991c01b0 +Block 0006 [ 30]: 2615381daaed34ff +Block 0006 [ 31]: 0d645551e1597e3c +Block 0006 [ 32]: 2b11ec26203fd73b +Block 0006 [ 33]: 0e766f7080fe92d6 +Block 0006 [ 34]: 47b2ba5db10cfc3a +Block 0006 [ 35]: 6ad29e44a0f3be62 +Block 0006 [ 36]: da842a34d581ad7f +Block 0006 [ 37]: fb3c375543afd6a8 +Block 0006 [ 38]: ed9de9c706c068a6 +Block 0006 [ 39]: 1fb7693b385233b7 +Block 0006 [ 40]: 49eda29d7136fc7d +Block 0006 [ 41]: ab6e18616433333a +Block 0006 [ 42]: 72df17bf0a5580c7 +Block 0006 [ 43]: 0082bba3466cd5ea +Block 0006 [ 44]: e9a4c1e542244a87 +Block 0006 [ 45]: c2d9cf7758b923e3 +Block 0006 [ 46]: bee180f733988dbf +Block 0006 [ 47]: 59a2da4ab34ee654 +Block 0006 [ 48]: cc56314eb2fa23e6 +Block 0006 [ 49]: 0f087137ac0a1c7a +Block 0006 [ 50]: 8067c1e34852b917 +Block 0006 [ 51]: 90a8915d42ae5075 +Block 0006 [ 52]: d5a11fa31dcd190a +Block 0006 [ 53]: 441518b90ef57a2b +Block 0006 [ 54]: 5b9fa34fb393336d +Block 0006 [ 55]: 6cd5798454fa4a12 +Block 0006 [ 56]: e9e5be8a0a850ca8 +Block 0006 [ 57]: 9e557468d5e3f9a6 +Block 0006 [ 58]: 3be40b13014c63af +Block 0006 [ 59]: e5db3589ece2fa5d +Block 0006 [ 60]: a7db7905add3ccbc +Block 0006 [ 61]: fdb1a2121e3ee9b9 +Block 0006 [ 62]: 87b16d82fd2baf1e +Block 0006 [ 63]: 596798be5427ad24 +Block 0006 [ 64]: bbc45faa52e1c3b5 +Block 0006 [ 65]: e0c382fd816cedee +Block 0006 [ 66]: 278a382948535926 +Block 0006 [ 67]: e796002cdda2daf4 +Block 0006 [ 68]: 8927e6a03f549fca +Block 0006 [ 69]: 31b3180c654b4ddb +Block 0006 [ 70]: 18dce7f5bbf32bfa +Block 0006 [ 71]: ae6b15ff97e0c1d4 +Block 0006 [ 72]: 9c22613ba008bc2c +Block 0006 [ 73]: 39ecb7c2397ca17d +Block 0006 [ 74]: fbbed8367164594a +Block 0006 [ 75]: d7cb5457059e32d5 +Block 0006 [ 76]: b06eac3578f74d1c +Block 0006 [ 77]: 882fdacd5035687f +Block 0006 [ 78]: 595c5747ab50a560 +Block 0006 [ 79]: 9000f76a4aa7e370 +Block 0006 [ 80]: ca6b97e8b24d933c +Block 0006 [ 81]: b1c524d71db5ecb1 +Block 0006 [ 82]: 63f4933374b5e5e2 +Block 0006 [ 83]: 84a48cc12b57dc0d +Block 0006 [ 84]: 785a2a1c88a63522 +Block 0006 [ 85]: f86705d1a24f35ca +Block 0006 [ 86]: f6e7ca822fa200cf +Block 0006 [ 87]: ca207bf6bdee4a69 +Block 0006 [ 88]: d701d641fd420f68 +Block 0006 [ 89]: 1c4f598bff32340f +Block 0006 [ 90]: 3bbb6d14037f8e85 +Block 0006 [ 91]: 0ac8f692c37dbdf1 +Block 0006 [ 92]: e17256aaa2c6417b +Block 0006 [ 93]: 130aabc282078fe6 +Block 0006 [ 94]: 72c4cb749d0eec25 +Block 0006 [ 95]: ffe89caac8c5946d +Block 0006 [ 96]: 2f2d8c60afaf2c94 +Block 0006 [ 97]: 7db481c19f5fb1ba +Block 0006 [ 98]: 0508153944853486 +Block 0006 [ 99]: 37a9635cb7261716 +Block 0006 [100]: f60fdd2341537e3b +Block 0006 [101]: abe87965feb6c714 +Block 0006 [102]: 0f2cb41fe88f9686 +Block 0006 [103]: 5f7d5faa3191545c +Block 0006 [104]: 9870bcbd2c7d0fbf +Block 0006 [105]: 1980d28854804501 +Block 0006 [106]: 882c0e69b0d1cab3 +Block 0006 [107]: 181723d7663999d9 +Block 0006 [108]: ac3af38a6b5919b2 +Block 0006 [109]: f3c7b5014ca21a1d +Block 0006 [110]: 82d98fc9d3c26c7b +Block 0006 [111]: cd63896a773ee2f2 +Block 0006 [112]: 8ca6b1bc8e639c17 +Block 0006 [113]: dc643e71fa5ba0d4 +Block 0006 [114]: 826997cd621ce6c6 +Block 0006 [115]: 60d2ab15f86ccda7 +Block 0006 [116]: 736900641a1df82f +Block 0006 [117]: 74b7a10a22330c0f +Block 0006 [118]: 21faa45375e80c38 +Block 0006 [119]: 4b8c2f8bbb148222 +Block 0006 [120]: 586d669cc9dc46aa +Block 0006 [121]: 582cc814f6edde20 +Block 0006 [122]: a6171da287a072ee +Block 0006 [123]: 9dfafee0098dc6ba +Block 0006 [124]: 280efcd252cb68a8 +Block 0006 [125]: fb26ef59ef4d8505 +Block 0006 [126]: 1d5e477cb30e513c +Block 0006 [127]: 87dc7ecab98fe69c +Block 0007 [ 0]: 272d06fade6d331a +Block 0007 [ 1]: c625b4d1a098ff17 +Block 0007 [ 2]: b9a65a7b82e0c9c9 +Block 0007 [ 3]: a7301af123895781 +Block 0007 [ 4]: 05cc626884232f6b +Block 0007 [ 5]: cc1cb1d4830da55d +Block 0007 [ 6]: 7ad27fd0ebbbc641 +Block 0007 [ 7]: 1bdabd0730624045 +Block 0007 [ 8]: 8a796cb38f76bef5 +Block 0007 [ 9]: 955a31ecd6a3e9f3 +Block 0007 [ 10]: 8e614cbf6c83ed5b +Block 0007 [ 11]: 7cfee51609058b60 +Block 0007 [ 12]: c1a76d5bbfd35b39 +Block 0007 [ 13]: 12661d52aed610ed +Block 0007 [ 14]: 19ddb4706a02b6c4 +Block 0007 [ 15]: 512029583ae902a2 +Block 0007 [ 16]: 2a22ec2229b71abe +Block 0007 [ 17]: f35d343177e1a239 +Block 0007 [ 18]: a4b78e999c59f71d +Block 0007 [ 19]: 00121cf1bded93ee +Block 0007 [ 20]: 7f492bad6a0792ed +Block 0007 [ 21]: 5b2224cd6fbc8b30 +Block 0007 [ 22]: dc3b63b33575ed25 +Block 0007 [ 23]: af84aa371c386c6b +Block 0007 [ 24]: 174995fa235d8e0c +Block 0007 [ 25]: b1c7d3904bf63ed2 +Block 0007 [ 26]: a43938085a786223 +Block 0007 [ 27]: 6928a779ebd0acbe +Block 0007 [ 28]: 00649d7e17e68bf0 +Block 0007 [ 29]: 7ff8c78339c135e3 +Block 0007 [ 30]: d2cc3195e2f4a6fa +Block 0007 [ 31]: 87d7db26ff9c4839 +Block 0007 [ 32]: 170ff45d245abc95 +Block 0007 [ 33]: ca0de5afa7bc179b +Block 0007 [ 34]: 47f87e00ca4a5bd7 +Block 0007 [ 35]: 42c9e956ce7b830d +Block 0007 [ 36]: e2d68ca2fe26cbae +Block 0007 [ 37]: 31facbd28e4ff423 +Block 0007 [ 38]: 816dee4fde572108 +Block 0007 [ 39]: 24aabace105ecf93 +Block 0007 [ 40]: beac4f8a0eca1d5f +Block 0007 [ 41]: 228c9957808ed0e5 +Block 0007 [ 42]: 31ab6b20240ceb32 +Block 0007 [ 43]: 3079d7aa4522c927 +Block 0007 [ 44]: d9437ac020401bf7 +Block 0007 [ 45]: 2dbf3ec6847975f0 +Block 0007 [ 46]: 1c677f6d76964cc5 +Block 0007 [ 47]: 56e9aecea3bc1b26 +Block 0007 [ 48]: 2837465c37fb812d +Block 0007 [ 49]: 0c306513f38f378d +Block 0007 [ 50]: 0c37fd80799a554f +Block 0007 [ 51]: 7b39bbcd780ce2b7 +Block 0007 [ 52]: 37607a623990fa10 +Block 0007 [ 53]: 439b6ae755ff0868 +Block 0007 [ 54]: 352644a9cc59b330 +Block 0007 [ 55]: f2533ac8d81ba695 +Block 0007 [ 56]: b56c25657ac775cd +Block 0007 [ 57]: 69bcc975eb9cfda8 +Block 0007 [ 58]: e965849c9c4ecf32 +Block 0007 [ 59]: e1e5e54302307fca +Block 0007 [ 60]: 2ff11a374a3f367c +Block 0007 [ 61]: ef3347a4e2a55d88 +Block 0007 [ 62]: d4c092ae6aa73d35 +Block 0007 [ 63]: cd90b21e590d3b7f +Block 0007 [ 64]: 7f47d6288f261862 +Block 0007 [ 65]: e595765a549a7456 +Block 0007 [ 66]: 9b46d372f817fad0 +Block 0007 [ 67]: 0ef73e99671ced02 +Block 0007 [ 68]: 068c1456cffd15f2 +Block 0007 [ 69]: 0450108481b2aec3 +Block 0007 [ 70]: 9a51541fca67cef7 +Block 0007 [ 71]: 344a07ee5c0a9781 +Block 0007 [ 72]: b8e2b12cb684e206 +Block 0007 [ 73]: 73aa863c2cec0580 +Block 0007 [ 74]: 56fba126410a6204 +Block 0007 [ 75]: 803deaed4fcf5750 +Block 0007 [ 76]: 02bcfae2d70280fb +Block 0007 [ 77]: b8ab8a5874e27d6f +Block 0007 [ 78]: d74bc0568607a2f1 +Block 0007 [ 79]: 8dfc1a8581f4797d +Block 0007 [ 80]: 7d5e362d1f502015 +Block 0007 [ 81]: fd494de723c9e751 +Block 0007 [ 82]: c1205d413f2fce7b +Block 0007 [ 83]: eee662d69c3a0011 +Block 0007 [ 84]: 9b902b3931050f40 +Block 0007 [ 85]: bd830f0036694cd4 +Block 0007 [ 86]: e9420bf5b18f8b4f +Block 0007 [ 87]: aa0f2c68410ae330 +Block 0007 [ 88]: 47d4132eb7dade03 +Block 0007 [ 89]: 0c05c6af851968e5 +Block 0007 [ 90]: c5b535d388a53d78 +Block 0007 [ 91]: ac97ce6b41d6c7d5 +Block 0007 [ 92]: 112052d13f30e8c1 +Block 0007 [ 93]: cc560af42f595097 +Block 0007 [ 94]: ad7abf51469c4f83 +Block 0007 [ 95]: 5dd9175d9fff36f6 +Block 0007 [ 96]: 14ab61988879261d +Block 0007 [ 97]: 4726e1f0236e01ad +Block 0007 [ 98]: 7309705c333c73b6 +Block 0007 [ 99]: 4ba518ea29172f7f +Block 0007 [100]: ecdff9f4dc349e2c +Block 0007 [101]: 2e0b9def72ef1912 +Block 0007 [102]: 78a468fc70c7075c +Block 0007 [103]: d705b64d14bfbd7c +Block 0007 [104]: 67a2b7162aee3bd3 +Block 0007 [105]: 5978e84637288123 +Block 0007 [106]: 5153bcaf415ee20f +Block 0007 [107]: e3a999e7921a7722 +Block 0007 [108]: 1defb1f37bb6df78 +Block 0007 [109]: 4396889ae5329428 +Block 0007 [110]: 1f5304f6d3f4c5eb +Block 0007 [111]: 7ad70f5d1b72c11b +Block 0007 [112]: 2a497b553a83863d +Block 0007 [113]: afaa70491f8139a8 +Block 0007 [114]: b41152f3eea230d9 +Block 0007 [115]: 27b29c968c0e02eb +Block 0007 [116]: 380544bbc10304c2 +Block 0007 [117]: f32188d2a43f24de +Block 0007 [118]: 6e2b22fb4ed9b3d8 +Block 0007 [119]: 927e2d31cbfdfb51 +Block 0007 [120]: 15be340149804f89 +Block 0007 [121]: fe8e654001ec9dc3 +Block 0007 [122]: 0952688acce880d9 +Block 0007 [123]: bfd9caca8b3c2ed7 +Block 0007 [124]: 57489b9341cc60b9 +Block 0007 [125]: 5c290f757cb97be6 +Block 0007 [126]: dea6a955364f7879 +Block 0007 [127]: 2734980c24943229 +Block 0008 [ 0]: dc6b6d1adf13ba10 +Block 0008 [ 1]: b91d17ea5fd061fa +Block 0008 [ 2]: aeb5e95e05f28465 +Block 0008 [ 3]: aae5d4364c1ac7e2 +Block 0008 [ 4]: 531c8c4860b55657 +Block 0008 [ 5]: 546f378ddacf7d44 +Block 0008 [ 6]: 1fbdab2cab565be2 +Block 0008 [ 7]: 3907d1b6b09a1762 +Block 0008 [ 8]: 2eeef614ecbd720d +Block 0008 [ 9]: 46e5e7efd4525bd9 +Block 0008 [ 10]: f4d0acbf1bed6c87 +Block 0008 [ 11]: 83cc80d830e03068 +Block 0008 [ 12]: bb67c441b80c8604 +Block 0008 [ 13]: 9dcc40be341714ac +Block 0008 [ 14]: 18abaf3eb1a7890c +Block 0008 [ 15]: 1990d7f3ac301693 +Block 0008 [ 16]: d0e8b3bdfeec80fd +Block 0008 [ 17]: d88b6939c62d2b0d +Block 0008 [ 18]: 917249fcba34089f +Block 0008 [ 19]: f970f8b97f892d13 +Block 0008 [ 20]: 5d3cf4f4665e8025 +Block 0008 [ 21]: 7fbc8fc1719a00e0 +Block 0008 [ 22]: 3b94c22e3e2725b5 +Block 0008 [ 23]: d4ce1e6309916de6 +Block 0008 [ 24]: 87fbacd4e43dd068 +Block 0008 [ 25]: 200cff600856dafe +Block 0008 [ 26]: 23ba6b39c79cb5ef +Block 0008 [ 27]: b1f46be594d43c95 +Block 0008 [ 28]: ff35e0beed2ea235 +Block 0008 [ 29]: bef54f0cad51bdf4 +Block 0008 [ 30]: d06e6a34d97cd464 +Block 0008 [ 31]: 85e39b5b21902dca +Block 0008 [ 32]: 6bc1d2871274396e +Block 0008 [ 33]: d7d23981830ab34f +Block 0008 [ 34]: fb7fefb74c559aed +Block 0008 [ 35]: 06e363f9a51f4783 +Block 0008 [ 36]: 3115e623e62aaa41 +Block 0008 [ 37]: 72e98c5a2f6ce676 +Block 0008 [ 38]: 9215b69396270668 +Block 0008 [ 39]: e0844ff4b74ba824 +Block 0008 [ 40]: 29954c50a989f002 +Block 0008 [ 41]: 82eb6370e89c3eb1 +Block 0008 [ 42]: 62ce9194a114645f +Block 0008 [ 43]: d7af7eef56703e93 +Block 0008 [ 44]: fcebd0463c2bbcff +Block 0008 [ 45]: 3f9ec1849914b05c +Block 0008 [ 46]: 6c9970e2a5698e8b +Block 0008 [ 47]: 9862a324eb161be6 +Block 0008 [ 48]: 32334ea7036383a4 +Block 0008 [ 49]: 7e64ecf8ad38de47 +Block 0008 [ 50]: ccf52cfd8dd5208f +Block 0008 [ 51]: 7058c1e23eca4bd2 +Block 0008 [ 52]: ad66da4882be2b72 +Block 0008 [ 53]: 6f95725de653f188 +Block 0008 [ 54]: 659e89de1828405e +Block 0008 [ 55]: 451d65f554be4ee6 +Block 0008 [ 56]: 84d337c6f49641df +Block 0008 [ 57]: a869207e69d5299f +Block 0008 [ 58]: 0078bd60849acc64 +Block 0008 [ 59]: 606f256c808ffbd0 +Block 0008 [ 60]: e96aed2a2b6073a6 +Block 0008 [ 61]: d2dc35007b056e00 +Block 0008 [ 62]: e1af5e8c6239ca8a +Block 0008 [ 63]: c13c556f4eb60ff2 +Block 0008 [ 64]: 0d383da1a0b22a3c +Block 0008 [ 65]: 85ae949a305ef696 +Block 0008 [ 66]: f59d0e46d51c54c5 +Block 0008 [ 67]: 0c7301c96a56b539 +Block 0008 [ 68]: 65dd44ab0979d798 +Block 0008 [ 69]: 61cfa43ce06ded75 +Block 0008 [ 70]: d1099cc2ce7dc5d0 +Block 0008 [ 71]: 4b51cbcc97c72879 +Block 0008 [ 72]: c4c96ed0aeb5be58 +Block 0008 [ 73]: cd4d3ad40727e0df +Block 0008 [ 74]: 9ac84675bd4eb1fa +Block 0008 [ 75]: 3873937250526178 +Block 0008 [ 76]: c695538e394b84f3 +Block 0008 [ 77]: e26ad59a4b45df18 +Block 0008 [ 78]: 3ccf1fc37ae30577 +Block 0008 [ 79]: 1da81eaf501a98bf +Block 0008 [ 80]: f5bde1fdb6c61688 +Block 0008 [ 81]: 48a236a088e9bc96 +Block 0008 [ 82]: 2e54ed7d3b0505bc +Block 0008 [ 83]: f756483978ec1b71 +Block 0008 [ 84]: 949c4fe87b7d67a9 +Block 0008 [ 85]: b788279c6674c956 +Block 0008 [ 86]: b96bfdc0c59a7cc3 +Block 0008 [ 87]: 37152d7aac6f5aad +Block 0008 [ 88]: 17128b43250a0624 +Block 0008 [ 89]: caaefd58274022e6 +Block 0008 [ 90]: 3e6af46acda01234 +Block 0008 [ 91]: 43091b598aecff38 +Block 0008 [ 92]: 1070375d7d2c8988 +Block 0008 [ 93]: 54ca7be036dc1816 +Block 0008 [ 94]: b631d974db91a390 +Block 0008 [ 95]: efc15bb9abc2cfad +Block 0008 [ 96]: 2b1c41ece54418ab +Block 0008 [ 97]: d7882b30049b13d5 +Block 0008 [ 98]: 4dc546209f942114 +Block 0008 [ 99]: 4da30a306bb48db6 +Block 0008 [100]: 3e78eacda997f0a3 +Block 0008 [101]: 42f92bc6bf89e191 +Block 0008 [102]: aef3a035402b18a9 +Block 0008 [103]: 7418b3827a08136b +Block 0008 [104]: 82f2bd22342aadd9 +Block 0008 [105]: 928bb61702b4cc95 +Block 0008 [106]: 779a5cae529e6d13 +Block 0008 [107]: e14bf3cdeefeb3fa +Block 0008 [108]: 34075120b790f68b +Block 0008 [109]: 2aa17b3a36b46677 +Block 0008 [110]: e96b0ffccb42f8d1 +Block 0008 [111]: c895ba8dd04aa4b7 +Block 0008 [112]: 26ffd120da78eb7e +Block 0008 [113]: aa2421483a0f6984 +Block 0008 [114]: aead9757c1108bc6 +Block 0008 [115]: 59a09752c2e4954b +Block 0008 [116]: 1275c2fb3e2f7d66 +Block 0008 [117]: 24f14bf43c8b3438 +Block 0008 [118]: 898abe2e8e0e1065 +Block 0008 [119]: 7c7c5df695255005 +Block 0008 [120]: 6801c208f9ac6f4f +Block 0008 [121]: 7df45962a612c76e +Block 0008 [122]: 2756812f921cb052 +Block 0008 [123]: 06a5fb01f2ba4e28 +Block 0008 [124]: 72617963057f1c4c +Block 0008 [125]: 3470685b81ac58a0 +Block 0008 [126]: 783c1a85437acb5c +Block 0008 [127]: 3bd80ab09cfb1139 +Block 0009 [ 0]: c87e47b1c3772012 +Block 0009 [ 1]: 53ef67895ef0ba16 +Block 0009 [ 2]: 51e4861563608c9d +Block 0009 [ 3]: 3cfcbc281c9ebdd6 +Block 0009 [ 4]: feaf7c32fee96066 +Block 0009 [ 5]: 1127f68fe2e0ef2b +Block 0009 [ 6]: d2b9348e169c5429 +Block 0009 [ 7]: 01def6b91eb75bad +Block 0009 [ 8]: f868acc084b74873 +Block 0009 [ 9]: b73c0d66f77e6e65 +Block 0009 [ 10]: 5dcf631cc3261744 +Block 0009 [ 11]: 5c063f0e7dc4ddc9 +Block 0009 [ 12]: d88ec186ab575517 +Block 0009 [ 13]: b49d4fd9265055fa +Block 0009 [ 14]: af9c253d9ec60147 +Block 0009 [ 15]: c133040684f7f94b +Block 0009 [ 16]: 7c9fd7f6bba1b216 +Block 0009 [ 17]: d9c687ce5c476a65 +Block 0009 [ 18]: 0005a29d070297c7 +Block 0009 [ 19]: dc897d2c175e3c02 +Block 0009 [ 20]: e942dfe4ccf40d40 +Block 0009 [ 21]: 6caa0532e5669a76 +Block 0009 [ 22]: 5baf9399bd1e8f8a +Block 0009 [ 23]: b3deb6ab6a5a1d4b +Block 0009 [ 24]: 3d454ed17ed9d6d4 +Block 0009 [ 25]: 4bbb1c5031ba97f1 +Block 0009 [ 26]: c2f1c71e39dad8ce +Block 0009 [ 27]: 6691d661c29e7010 +Block 0009 [ 28]: 6759aa49c1fc9154 +Block 0009 [ 29]: c9cc86dc186f4518 +Block 0009 [ 30]: b746e661d8353a8e +Block 0009 [ 31]: d238bafb93f0025a +Block 0009 [ 32]: 41e346bfb0d34e5b +Block 0009 [ 33]: eafafc3b447bccb4 +Block 0009 [ 34]: ceb113c031914223 +Block 0009 [ 35]: caf4e78e1cd53f5f +Block 0009 [ 36]: 78351504f8a33c16 +Block 0009 [ 37]: 7575acf932b356c8 +Block 0009 [ 38]: c09617cd3a1a1627 +Block 0009 [ 39]: cb07cf989cc4caf2 +Block 0009 [ 40]: 8cc189366d9b26f5 +Block 0009 [ 41]: 449beb3368a3877e +Block 0009 [ 42]: e8f5818a7858db70 +Block 0009 [ 43]: c793ebf3d301198f +Block 0009 [ 44]: 3aa508c80633437f +Block 0009 [ 45]: d3b867a3cbaf08f6 +Block 0009 [ 46]: fbde37db7e33e4fc +Block 0009 [ 47]: dc548c7f368e6497 +Block 0009 [ 48]: 4c1c0211c7516b79 +Block 0009 [ 49]: 75dbc72a82d41883 +Block 0009 [ 50]: 530487899a550ada +Block 0009 [ 51]: 27e20eb8330d18d7 +Block 0009 [ 52]: f5b0ea85baf15669 +Block 0009 [ 53]: ac9c2708dbe29cec +Block 0009 [ 54]: 102df235d45e0fe8 +Block 0009 [ 55]: 1ec27724b22275b8 +Block 0009 [ 56]: 7ff048771596e3d6 +Block 0009 [ 57]: 401be2cc8914cbb7 +Block 0009 [ 58]: 127969310e85020f +Block 0009 [ 59]: 668aa409ee1e22ab +Block 0009 [ 60]: 4ea69cd6b1727439 +Block 0009 [ 61]: 3da31ac5eefe1d0a +Block 0009 [ 62]: 7eeadbaf86a9e3fb +Block 0009 [ 63]: 7fd960e6520c2179 +Block 0009 [ 64]: 1e778bfc99b12598 +Block 0009 [ 65]: 737729bf678749fd +Block 0009 [ 66]: 25e9e1f65be274b9 +Block 0009 [ 67]: 1190348847839e7c +Block 0009 [ 68]: da6903502fbb1d6a +Block 0009 [ 69]: 8febd989e10caf6e +Block 0009 [ 70]: 5bec284c097f0f56 +Block 0009 [ 71]: 0ad7e582f0f3ca14 +Block 0009 [ 72]: ac3d0111de95633c +Block 0009 [ 73]: b03374b9fdf0165f +Block 0009 [ 74]: df6408de8b5d06e9 +Block 0009 [ 75]: 6545ea0295ffd8e2 +Block 0009 [ 76]: e7a37676dfb5330c +Block 0009 [ 77]: e97777e4dab1e386 +Block 0009 [ 78]: 23aad2be96ef0dbe +Block 0009 [ 79]: 67a3c60819619ed2 +Block 0009 [ 80]: cc5bf52ea2cb1323 +Block 0009 [ 81]: 3d1e3e79c7dcd249 +Block 0009 [ 82]: bd78f50ff24a14c1 +Block 0009 [ 83]: 24ebc5de9a24b1f1 +Block 0009 [ 84]: 35d2ad9a11fd08e7 +Block 0009 [ 85]: d5d586e87776af28 +Block 0009 [ 86]: 0a29e47fcd7bb004 +Block 0009 [ 87]: 5be280ff4eae5d10 +Block 0009 [ 88]: e9efc91da33b4f70 +Block 0009 [ 89]: 98ddf317551d1e13 +Block 0009 [ 90]: 9ed9fb074b0a2315 +Block 0009 [ 91]: 385474dcc69460b0 +Block 0009 [ 92]: edf4b8f53ee65fa3 +Block 0009 [ 93]: e55a8ee53447e358 +Block 0009 [ 94]: e5d77c0d5d0d447a +Block 0009 [ 95]: 9b8d0f0579b33fe2 +Block 0009 [ 96]: c38407b72241aa34 +Block 0009 [ 97]: ee6b13f12b3d99ef +Block 0009 [ 98]: 8dc888f6831b572e +Block 0009 [ 99]: decf4825f7a4524c +Block 0009 [100]: a3e3b8af2b57dd62 +Block 0009 [101]: 6acc58b90c361016 +Block 0009 [102]: 40a0794b70468084 +Block 0009 [103]: 2e8a1bf968e971f6 +Block 0009 [104]: 1572b5471c1e0893 +Block 0009 [105]: 741bc6497a2dc4a8 +Block 0009 [106]: 8846d56dae324d63 +Block 0009 [107]: 4864229bbb77532b +Block 0009 [108]: c5f6478ebca01d36 +Block 0009 [109]: 3c8d06e4e9ae61ae +Block 0009 [110]: 8b84b6a6ec874319 +Block 0009 [111]: b73a861c04f8d0ba +Block 0009 [112]: 21bf2816040b2d99 +Block 0009 [113]: e5e3954579481c8e +Block 0009 [114]: 6df21d01fc4ec2c0 +Block 0009 [115]: d85fe0be3c317775 +Block 0009 [116]: 6785100343e96142 +Block 0009 [117]: 60c1585dd04ec099 +Block 0009 [118]: 9035b1e5912bb6ad +Block 0009 [119]: 6447bc2528ad95d3 +Block 0009 [120]: f5f4a497dea40726 +Block 0009 [121]: df1c9adc1dd0354c +Block 0009 [122]: e30cee24d3114e16 +Block 0009 [123]: 3c16415b0b3e36d2 +Block 0009 [124]: ddc2d3d67ba5aa90 +Block 0009 [125]: 4e8b75fd86fc44aa +Block 0009 [126]: 43c133389abe42fa +Block 0009 [127]: 1f0163071d1c2fd1 +Block 0010 [ 0]: befa5b8772684bf6 +Block 0010 [ 1]: 085c709ecbb1163e +Block 0010 [ 2]: c9952c634b7d47f7 +Block 0010 [ 3]: a9f2b1b34abb7255 +Block 0010 [ 4]: be1e81439a7a7527 +Block 0010 [ 5]: c759115839e61b79 +Block 0010 [ 6]: 90cdc1d1dde970eb +Block 0010 [ 7]: 4280a622460f8f81 +Block 0010 [ 8]: 95fa2520e5ea2640 +Block 0010 [ 9]: 3ef882089894d918 +Block 0010 [ 10]: 0707aea599fcd04d +Block 0010 [ 11]: 263da9476e267dab +Block 0010 [ 12]: 0243d341cce26088 +Block 0010 [ 13]: a0baddf8da89da95 +Block 0010 [ 14]: 15a0b306f9705ef5 +Block 0010 [ 15]: 3ca3647aafd77025 +Block 0010 [ 16]: fee96d8bf3dd1a25 +Block 0010 [ 17]: cf2c6b7a5ece296a +Block 0010 [ 18]: 1607217149c09a31 +Block 0010 [ 19]: 7e01c277d0ef54c4 +Block 0010 [ 20]: 207f8b6971f3ae28 +Block 0010 [ 21]: 3dbb5683d75695e0 +Block 0010 [ 22]: a368fd19c839e578 +Block 0010 [ 23]: e60a3067d5d5693b +Block 0010 [ 24]: 405be0c196638dc5 +Block 0010 [ 25]: dd6b58f4cbb38216 +Block 0010 [ 26]: 67f9d42959a2f41d +Block 0010 [ 27]: 740cb740b3e2dfbc +Block 0010 [ 28]: e34b6c6d0a49657f +Block 0010 [ 29]: 685d381724c365a6 +Block 0010 [ 30]: b5d7fd05fa5304dd +Block 0010 [ 31]: 291426b0884ca7c0 +Block 0010 [ 32]: fc26d49c0b7307f6 +Block 0010 [ 33]: 1ce47f53948cba58 +Block 0010 [ 34]: c7873387db218bad +Block 0010 [ 35]: ef0e4ec79d349a29 +Block 0010 [ 36]: 7f42c4685301d3e1 +Block 0010 [ 37]: 646965e52f86b620 +Block 0010 [ 38]: 3b24fae553a213fa +Block 0010 [ 39]: b58c7bf6b48d4969 +Block 0010 [ 40]: df53292c9ffd2d03 +Block 0010 [ 41]: fcb36b01a3a98243 +Block 0010 [ 42]: 7e53d4ce327d8cb4 +Block 0010 [ 43]: 135711f8b9c07b15 +Block 0010 [ 44]: d78adac7fcaaf2f4 +Block 0010 [ 45]: f607b6b937105259 +Block 0010 [ 46]: bb3dc4c6e46379ca +Block 0010 [ 47]: eefaac476ee9ab7c +Block 0010 [ 48]: 468f2a5b91ee25f4 +Block 0010 [ 49]: fe6835bf15208fd4 +Block 0010 [ 50]: 8affa55b80d80c40 +Block 0010 [ 51]: 8fffb69a0a6bc68c +Block 0010 [ 52]: 891fc625a7a996f2 +Block 0010 [ 53]: 0d0685282c901497 +Block 0010 [ 54]: 2b954fbc63f376ae +Block 0010 [ 55]: 0bf1c04c7b66a429 +Block 0010 [ 56]: 57cfab3494e5a87b +Block 0010 [ 57]: 9c7cba71413b4420 +Block 0010 [ 58]: b6067ace22788323 +Block 0010 [ 59]: 88cc4cadb0ef6327 +Block 0010 [ 60]: 335e981c1139ea8c +Block 0010 [ 61]: 1891fde6348d4fc8 +Block 0010 [ 62]: b381eed13dc2b78d +Block 0010 [ 63]: f2a7eec805d51aae +Block 0010 [ 64]: cc135639e5e00188 +Block 0010 [ 65]: a69d976a329936b6 +Block 0010 [ 66]: 711efe69efaf4466 +Block 0010 [ 67]: 77457b10caf144d4 +Block 0010 [ 68]: 8aa80f5b398b0ba1 +Block 0010 [ 69]: 0462168a20ff98fd +Block 0010 [ 70]: 289476e527ad0471 +Block 0010 [ 71]: 0d16c9f256fd3fcf +Block 0010 [ 72]: 217f514f3cd70a35 +Block 0010 [ 73]: 2614c68433606c51 +Block 0010 [ 74]: 7ab84319913ed734 +Block 0010 [ 75]: dd5f5f5c9aaecbd9 +Block 0010 [ 76]: 702cd4909bdc11c0 +Block 0010 [ 77]: 72a4e082cbc8137b +Block 0010 [ 78]: 653aa0dd3bd208fd +Block 0010 [ 79]: e9f932f6da625eb3 +Block 0010 [ 80]: f509bb018f18cfaf +Block 0010 [ 81]: 99a9e8543ca215f5 +Block 0010 [ 82]: 4708e89ae1b1188e +Block 0010 [ 83]: 51891a2708bc5d49 +Block 0010 [ 84]: dad30d258b95dfeb +Block 0010 [ 85]: 484cb6452492d4b3 +Block 0010 [ 86]: 24e97876b8de8ad5 +Block 0010 [ 87]: 497aed5cc31eabe9 +Block 0010 [ 88]: 534be98534a52cd4 +Block 0010 [ 89]: 0fab7b40d1cc4b6b +Block 0010 [ 90]: 757ae5b5eae855b2 +Block 0010 [ 91]: 41e89502499a68f7 +Block 0010 [ 92]: 692503814db75985 +Block 0010 [ 93]: 880611b34e91bedd +Block 0010 [ 94]: ab7786085ad98a6e +Block 0010 [ 95]: b79e239e6ad63dc1 +Block 0010 [ 96]: 61776e383070a25e +Block 0010 [ 97]: f29cbc2b3acfb0c7 +Block 0010 [ 98]: 996441bfce221ced +Block 0010 [ 99]: 6f5ead13c143577d +Block 0010 [100]: aaaa31be402b27b4 +Block 0010 [101]: bf83e7a5e9ceaa42 +Block 0010 [102]: d7c70f2a03c8aafe +Block 0010 [103]: f208e9600f6eaf8f +Block 0010 [104]: a86e7647599dc845 +Block 0010 [105]: b7bd43ee9c81e4ae +Block 0010 [106]: b1040a7ff84bf978 +Block 0010 [107]: c1da4cab128267ac +Block 0010 [108]: 92663063b6bc8da6 +Block 0010 [109]: bbc3e4dff7e3a55c +Block 0010 [110]: e0064c5f0e09d73c +Block 0010 [111]: 49f643c676dc2772 +Block 0010 [112]: a3be74551a7e1e36 +Block 0010 [113]: abb7fe1b3fe50c56 +Block 0010 [114]: 526f984c4ab11df6 +Block 0010 [115]: b9eb4cf82a7a11de +Block 0010 [116]: aaa8b1c1d2be2069 +Block 0010 [117]: 0e35c1a3e51f6a46 +Block 0010 [118]: 07686089eebde1ab +Block 0010 [119]: 5263d0261569a314 +Block 0010 [120]: 1688ceb9338a4b31 +Block 0010 [121]: 5aaab77de3987dd8 +Block 0010 [122]: b56f428cb894f0a1 +Block 0010 [123]: 3cf7890c2f0ae0f3 +Block 0010 [124]: eccbb53963cfe1da +Block 0010 [125]: bb84140c85b73e58 +Block 0010 [126]: 16473f1cdafe7c7a +Block 0010 [127]: c402ee74ab2ac05c +Block 0011 [ 0]: c653e884a645cdaa +Block 0011 [ 1]: 1a80a4a9129c76af +Block 0011 [ 2]: ad20d6b7a20d3352 +Block 0011 [ 3]: 917837cc2a442b26 +Block 0011 [ 4]: 41d5764a042d0163 +Block 0011 [ 5]: f51dab48664317ff +Block 0011 [ 6]: 3b779caf5b8277da +Block 0011 [ 7]: b8c5828991b426ac +Block 0011 [ 8]: 47ab06236d61a15f +Block 0011 [ 9]: 0a0a476c1d875005 +Block 0011 [ 10]: d72be69d44f4ccb4 +Block 0011 [ 11]: d95a306e7bcc2d96 +Block 0011 [ 12]: 985203c137206ae1 +Block 0011 [ 13]: e07fadc68088ffeb +Block 0011 [ 14]: 1890161f30cc007d +Block 0011 [ 15]: 932d310e7cbc5ca4 +Block 0011 [ 16]: dfd306dea8fc3e87 +Block 0011 [ 17]: 39637a2bdd5dfee7 +Block 0011 [ 18]: 93db7797472ffa83 +Block 0011 [ 19]: 0cfe6f1f456731d8 +Block 0011 [ 20]: fddf2caa3d0cf657 +Block 0011 [ 21]: a49abbc39b10e22c +Block 0011 [ 22]: d0c6c58a83e7e52d +Block 0011 [ 23]: 2e4ef7d71b8465f4 +Block 0011 [ 24]: fe82bc09e95b6cc1 +Block 0011 [ 25]: b627e2fe87f7ad69 +Block 0011 [ 26]: 0fe85e68705aad64 +Block 0011 [ 27]: 6725c0fc669a2949 +Block 0011 [ 28]: 00af03bf439b3e92 +Block 0011 [ 29]: c55fcbcd0874aa11 +Block 0011 [ 30]: a6354e7265de96b0 +Block 0011 [ 31]: 6ab1657e8e5523cc +Block 0011 [ 32]: ffbbb07dda2378d6 +Block 0011 [ 33]: 91cdd7eacf43a1c4 +Block 0011 [ 34]: fda16e5ed4b758f9 +Block 0011 [ 35]: 75b36a93f61d0042 +Block 0011 [ 36]: 80621463273f5094 +Block 0011 [ 37]: 8c749b031564fdef +Block 0011 [ 38]: 1a26abfb041795ca +Block 0011 [ 39]: 92c69cdeb75efde3 +Block 0011 [ 40]: 64362ce5e598c487 +Block 0011 [ 41]: b65bc723e932f76b +Block 0011 [ 42]: f43ebd68f6e9c432 +Block 0011 [ 43]: de5de5c1f36a45ba +Block 0011 [ 44]: 2f8d0d9b95f74e80 +Block 0011 [ 45]: 5469c5dd541fa533 +Block 0011 [ 46]: d03b064b3c284dd5 +Block 0011 [ 47]: e95b01a5b9d29e3f +Block 0011 [ 48]: 622ca8c0ae5d930e +Block 0011 [ 49]: 69448a5aa5ace55f +Block 0011 [ 50]: c989a9e575455ebc +Block 0011 [ 51]: 0476db62a6886efd +Block 0011 [ 52]: a4832dec608aca4f +Block 0011 [ 53]: 86b177320faf452f +Block 0011 [ 54]: fbeafa6566deffcf +Block 0011 [ 55]: a0c875dd077aab2b +Block 0011 [ 56]: 09d79bbadb920be5 +Block 0011 [ 57]: dfa71d47055b1ae1 +Block 0011 [ 58]: 491e72e2c0b45b1b +Block 0011 [ 59]: 9d5d759a04605ff9 +Block 0011 [ 60]: 0995e9f221f5f944 +Block 0011 [ 61]: df4e0b7afd7ead75 +Block 0011 [ 62]: 61141a94ba73a087 +Block 0011 [ 63]: f9d6151cb6988393 +Block 0011 [ 64]: 66f098f5c572ddd2 +Block 0011 [ 65]: 1940bf2f30fa28ad +Block 0011 [ 66]: c0827cf0ddfff6f2 +Block 0011 [ 67]: 73f8fb11d825a338 +Block 0011 [ 68]: 10fe21234998f744 +Block 0011 [ 69]: f8efc010e321247f +Block 0011 [ 70]: 2db04992d9220e61 +Block 0011 [ 71]: d00a64e77a8220c9 +Block 0011 [ 72]: 3d27f291da5fd89c +Block 0011 [ 73]: 1650ea233a65a6d9 +Block 0011 [ 74]: d32faf1133b296bf +Block 0011 [ 75]: 025f216987806954 +Block 0011 [ 76]: 00c9f933047627f9 +Block 0011 [ 77]: 2ce59ffdbcc25feb +Block 0011 [ 78]: 9e5d95d5f5e1665f +Block 0011 [ 79]: 8e9aa2d6c5f4fb8f +Block 0011 [ 80]: f29a4f3b1df3f2f4 +Block 0011 [ 81]: 163e77046784203d +Block 0011 [ 82]: d3475f23d0bcbb68 +Block 0011 [ 83]: fb5c4cfddac2c802 +Block 0011 [ 84]: bb6d887a81266342 +Block 0011 [ 85]: ab2b93751d7057ee +Block 0011 [ 86]: e79b4ec1b629ee53 +Block 0011 [ 87]: e50213e5fc957257 +Block 0011 [ 88]: f35a4d4a55ee15ec +Block 0011 [ 89]: c3bc9d6d1181c300 +Block 0011 [ 90]: a9f97892e7819b52 +Block 0011 [ 91]: 7a81ab2502821be8 +Block 0011 [ 92]: 57a98531b6c8e311 +Block 0011 [ 93]: fbab2dbf19f01294 +Block 0011 [ 94]: 402824c6dbe777ee +Block 0011 [ 95]: 59509aa8448aac6c +Block 0011 [ 96]: 9bcf16665a0a953a +Block 0011 [ 97]: 2172cb256715c249 +Block 0011 [ 98]: 54d6bbe2385b704a +Block 0011 [ 99]: dc288a2ff4a31f21 +Block 0011 [100]: 33e3c4d905aa1584 +Block 0011 [101]: f87bcfbbc106fe52 +Block 0011 [102]: 7dee45d72215096d +Block 0011 [103]: b798a129a56a498d +Block 0011 [104]: 639de22338bdfb22 +Block 0011 [105]: 4f1b0e209be36402 +Block 0011 [106]: ecfbf8eed84dda98 +Block 0011 [107]: d737114d3c05d061 +Block 0011 [108]: 987eadfcab4ec3c9 +Block 0011 [109]: c7cd9308d517c07a +Block 0011 [110]: 8b8637368781bc8d +Block 0011 [111]: 032f8375d3ac536e +Block 0011 [112]: 7da4a1808bb34e88 +Block 0011 [113]: 1761824e178e9d2f +Block 0011 [114]: 9ce6a9d604b50b6d +Block 0011 [115]: 69cfb48f60aa6b37 +Block 0011 [116]: d10088c389c01e7c +Block 0011 [117]: 01039dabd810204e +Block 0011 [118]: 02473cbb6d6e86e7 +Block 0011 [119]: 783710a70144d0d7 +Block 0011 [120]: c2081f9cbd0809bc +Block 0011 [121]: 60ecdee8cfba90c0 +Block 0011 [122]: 6068a3dce6a26929 +Block 0011 [123]: 67f4c0a3db81d9a6 +Block 0011 [124]: 62271723a9aa8451 +Block 0011 [125]: 1de12a522b1eb996 +Block 0011 [126]: 7da35ad6ff1aeaaf +Block 0011 [127]: 80d7af237c2acafa +Block 0012 [ 0]: bd6fecfb82bc40a9 +Block 0012 [ 1]: 83336a93ab307b70 +Block 0012 [ 2]: 8b23f98b36e3f85d +Block 0012 [ 3]: b765a38c83edc5d2 +Block 0012 [ 4]: 9c0952608e9e1b40 +Block 0012 [ 5]: c6b0b813dd3ff03f +Block 0012 [ 6]: 4e2f62beefb4ae56 +Block 0012 [ 7]: b5a4a8eebcf9d58e +Block 0012 [ 8]: ae17f59b432b6d88 +Block 0012 [ 9]: 32819dd91d5739f4 +Block 0012 [ 10]: aaf0a8106472cfdf +Block 0012 [ 11]: b19f65ec5f51d84e +Block 0012 [ 12]: 159148c18cb66a09 +Block 0012 [ 13]: 9d2b434c6c1553ac +Block 0012 [ 14]: a5cce2701e867af0 +Block 0012 [ 15]: a55e1618aca4da98 +Block 0012 [ 16]: 81da9e768512baca +Block 0012 [ 17]: 1292f9b1473da8ac +Block 0012 [ 18]: a49f71e94a278e39 +Block 0012 [ 19]: 7fbb53543ca895ef +Block 0012 [ 20]: 00301a0afcd2be7a +Block 0012 [ 21]: e28304111c2c7648 +Block 0012 [ 22]: cf67a24ec647f5ed +Block 0012 [ 23]: bbc3b2b582a87d95 +Block 0012 [ 24]: f452cd934124cc65 +Block 0012 [ 25]: 1d378de963be2060 +Block 0012 [ 26]: 5990d862ea81af34 +Block 0012 [ 27]: 76147c9b39f87a13 +Block 0012 [ 28]: c25f4d3aa4d724b4 +Block 0012 [ 29]: 8a2b3d742203141b +Block 0012 [ 30]: e79ce7830b1839a6 +Block 0012 [ 31]: 77fcf2032765debf +Block 0012 [ 32]: aac37411ed2339c7 +Block 0012 [ 33]: b9269cb3fa20e7c1 +Block 0012 [ 34]: bfe8f0953b80457d +Block 0012 [ 35]: b8d693d0a724ebde +Block 0012 [ 36]: 6f81188db5f1dd62 +Block 0012 [ 37]: 2809cc7ca199f651 +Block 0012 [ 38]: 9cfbf8589f28d12e +Block 0012 [ 39]: 2cf2ccfac3dc9548 +Block 0012 [ 40]: 46a60eae36e52610 +Block 0012 [ 41]: 8371bc8f910afac3 +Block 0012 [ 42]: c8ed9127942d2db9 +Block 0012 [ 43]: 2d1c0bb32a76a732 +Block 0012 [ 44]: 6d082794caa06a07 +Block 0012 [ 45]: 2a600fd1301dfb8d +Block 0012 [ 46]: 0546619fe6018911 +Block 0012 [ 47]: 3dfaf84e4bdbc93c +Block 0012 [ 48]: f351151625eb1c56 +Block 0012 [ 49]: 65ca506fc1b2b211 +Block 0012 [ 50]: f22083d6e4593f8c +Block 0012 [ 51]: 38a532e405c9cc85 +Block 0012 [ 52]: 130358836e4ab549 +Block 0012 [ 53]: b5da86cbccf9964a +Block 0012 [ 54]: 1a9bb7ccbe06b579 +Block 0012 [ 55]: 490244cc3d3ee5e7 +Block 0012 [ 56]: 05d16e1931499413 +Block 0012 [ 57]: c0f16d5307625a9c +Block 0012 [ 58]: dd5b60f8d3b6c265 +Block 0012 [ 59]: 5ffe40efc39b43d9 +Block 0012 [ 60]: 8a46a99cb2986022 +Block 0012 [ 61]: 59038865f9fa8ad6 +Block 0012 [ 62]: 07ee51e4a12d312b +Block 0012 [ 63]: 8c26838791d078b5 +Block 0012 [ 64]: e8f3197cfd8946a7 +Block 0012 [ 65]: 8cd3de9ec42e8dca +Block 0012 [ 66]: 0e2ed85ed54aa7a5 +Block 0012 [ 67]: b6db0d7dc497200e +Block 0012 [ 68]: d32cbf9e9d2ce91e +Block 0012 [ 69]: de0fd572d12a1bb3 +Block 0012 [ 70]: 0fd7b72104abff6d +Block 0012 [ 71]: f77a43e60b67290f +Block 0012 [ 72]: 3400c1aa61958019 +Block 0012 [ 73]: b15adcc92694b70b +Block 0012 [ 74]: fd03d78fa44ac635 +Block 0012 [ 75]: 6cbfe20764d6dee2 +Block 0012 [ 76]: 182992629853ad1d +Block 0012 [ 77]: 400a9ebcf07d8420 +Block 0012 [ 78]: 326a1b23b215ae73 +Block 0012 [ 79]: 21bcc4c98c55b193 +Block 0012 [ 80]: c8b40befa3dbfb04 +Block 0012 [ 81]: 9d21f41a2cdd84d3 +Block 0012 [ 82]: 0b544356ce4d4441 +Block 0012 [ 83]: bdd72d812505c333 +Block 0012 [ 84]: bb579d11cc3fbc7e +Block 0012 [ 85]: f3993400276d22c0 +Block 0012 [ 86]: 7f72b9c256b482e6 +Block 0012 [ 87]: 6a96d43928b6b630 +Block 0012 [ 88]: 6ae39cf21c9dab65 +Block 0012 [ 89]: a71321114a321bbc +Block 0012 [ 90]: 66252673668e98c8 +Block 0012 [ 91]: 545ae6fc8e6869ee +Block 0012 [ 92]: 6aa1d357b3bea674 +Block 0012 [ 93]: 0305780721fc75b9 +Block 0012 [ 94]: 9b43ff8046dfd073 +Block 0012 [ 95]: 1f8406fcab692e3a +Block 0012 [ 96]: 87b7db6bd68117bf +Block 0012 [ 97]: 0fed7932df8a7c02 +Block 0012 [ 98]: a2480d823634a1cb +Block 0012 [ 99]: 599396eb3193929d +Block 0012 [100]: aa9daa60b3ee560a +Block 0012 [101]: 412dce8bf4f87d2c +Block 0012 [102]: 3e36a5398694573f +Block 0012 [103]: d7fb28a0679bae3a +Block 0012 [104]: 3d74fea861251b70 +Block 0012 [105]: 516254cd2865cee0 +Block 0012 [106]: 9ce59d8bef9b81f0 +Block 0012 [107]: 97edabc40b358a34 +Block 0012 [108]: c1da8b2dcb42b386 +Block 0012 [109]: 979a59bb41a1c6f9 +Block 0012 [110]: 7f2ce7c8350d6481 +Block 0012 [111]: 01f6f97f063f3cfb +Block 0012 [112]: 93d99359d44b5995 +Block 0012 [113]: 6fda1427ad9ffed2 +Block 0012 [114]: 1f94a1f1e8ac2548 +Block 0012 [115]: 9ce14a580a564fc5 +Block 0012 [116]: 5cd702995eafaab5 +Block 0012 [117]: 13cddde717fe137c +Block 0012 [118]: 32bbc3e14f19743c +Block 0012 [119]: 18b8fee621b29a66 +Block 0012 [120]: 6d324f4418d8d341 +Block 0012 [121]: 1af85a9d05911cb7 +Block 0012 [122]: e58c08b75a16ef4e +Block 0012 [123]: 7eed498732243b2a +Block 0012 [124]: 85ddb6c93b244e3a +Block 0012 [125]: 04c79ec3b6abdacd +Block 0012 [126]: d6ace9220597ec2d +Block 0012 [127]: c58e5433f48ee38f +Block 0013 [ 0]: 469b89bf35144e2d +Block 0013 [ 1]: f1bb807bcbd5492b +Block 0013 [ 2]: 91b9c93c749f507e +Block 0013 [ 3]: c680ccabc457bed4 +Block 0013 [ 4]: a479230d83618dc8 +Block 0013 [ 5]: 3a608e4b91e578c8 +Block 0013 [ 6]: f82f5fb88c62c45f +Block 0013 [ 7]: 9c0c70469edc71a8 +Block 0013 [ 8]: 109f3d2e62f8507e +Block 0013 [ 9]: be32a740c6fbf047 +Block 0013 [ 10]: d3c4eb40218c412c +Block 0013 [ 11]: fd85ca2ebb4cb9cf +Block 0013 [ 12]: f51fa3e9aff33cb3 +Block 0013 [ 13]: c4a86dbc5b4c4e04 +Block 0013 [ 14]: c9b4794615050c61 +Block 0013 [ 15]: 4e0a7930c1e9d6f6 +Block 0013 [ 16]: 41c663d90a0b34f8 +Block 0013 [ 17]: 117a51022de13b30 +Block 0013 [ 18]: e7fc0de7e64d2538 +Block 0013 [ 19]: 2d52025217802c22 +Block 0013 [ 20]: 4318fc8296bced59 +Block 0013 [ 21]: 9d48c41ffd81ceff +Block 0013 [ 22]: 667b1c99880199ed +Block 0013 [ 23]: 5b990dcfcbaaf93b +Block 0013 [ 24]: f37f472db4b6f7e8 +Block 0013 [ 25]: cc1008a071e70d81 +Block 0013 [ 26]: 75b3f963a92d01d4 +Block 0013 [ 27]: 47f644f4261bbcd2 +Block 0013 [ 28]: b48fc438ace2ec49 +Block 0013 [ 29]: 82306b345782219c +Block 0013 [ 30]: 3ba907903f025346 +Block 0013 [ 31]: 7a18eec36db22089 +Block 0013 [ 32]: 6e55e2b6898aaa84 +Block 0013 [ 33]: e730cd439b6e94b1 +Block 0013 [ 34]: 4fec54842c67cb85 +Block 0013 [ 35]: 5deadada3303fa9f +Block 0013 [ 36]: 176d6e6e4d0f3488 +Block 0013 [ 37]: 8725266fd29e99ab +Block 0013 [ 38]: 9f125355c004d01c +Block 0013 [ 39]: dc36f29aa027f5a6 +Block 0013 [ 40]: 525bf4bf8fb5bec4 +Block 0013 [ 41]: 8557409bab69aa67 +Block 0013 [ 42]: 3008d95b6835faab +Block 0013 [ 43]: 2fa1b7395cde8d4e +Block 0013 [ 44]: 8c23ee445af43f01 +Block 0013 [ 45]: 0e34c44d2c3c956e +Block 0013 [ 46]: f3ff515c41428f14 +Block 0013 [ 47]: 4bbd10994aa53ade +Block 0013 [ 48]: 70897165253d8ef9 +Block 0013 [ 49]: e4aa8b7916923cf9 +Block 0013 [ 50]: 46e24ef1ac6bfff1 +Block 0013 [ 51]: bc5d31a2b82f30dd +Block 0013 [ 52]: f57c5c12eed9c220 +Block 0013 [ 53]: 099affa1a90bc96f +Block 0013 [ 54]: 50d24186a40277a2 +Block 0013 [ 55]: bdf6cb0a23ab150a +Block 0013 [ 56]: c6550fbbb31eea4f +Block 0013 [ 57]: f2eb00dbbf2f741b +Block 0013 [ 58]: 705d493f35a221eb +Block 0013 [ 59]: 18c759f8d7372759 +Block 0013 [ 60]: cd53295156bbdaf7 +Block 0013 [ 61]: 55fcd365dffd3f54 +Block 0013 [ 62]: 5d1acc769fa1de1f +Block 0013 [ 63]: 2cd1a56d595cd38f +Block 0013 [ 64]: 781c267f2589cee0 +Block 0013 [ 65]: ee1c09ef98a5a1f1 +Block 0013 [ 66]: 7a1bfb603c4dba63 +Block 0013 [ 67]: 34514bf06f413a08 +Block 0013 [ 68]: f0ab7003938a1476 +Block 0013 [ 69]: 8192f273377b379b +Block 0013 [ 70]: 47728ee5081aef9a +Block 0013 [ 71]: 3a401ef54a86e805 +Block 0013 [ 72]: 09a3e8653cf89a9c +Block 0013 [ 73]: de57c3623c7c6716 +Block 0013 [ 74]: 531ccbe06178e4b7 +Block 0013 [ 75]: 9e7ab5d7f66c58c0 +Block 0013 [ 76]: 41ee6347824a9aec +Block 0013 [ 77]: 802ba21600951c51 +Block 0013 [ 78]: 8405a2255deae3cf +Block 0013 [ 79]: c03511dda328b340 +Block 0013 [ 80]: c28d190bbf5cf177 +Block 0013 [ 81]: 73871fd8db5c3f7b +Block 0013 [ 82]: 9c334dd4281aab96 +Block 0013 [ 83]: 292f2dda3329e449 +Block 0013 [ 84]: 2f541a89b08cf4ba +Block 0013 [ 85]: a2ab80002dcca405 +Block 0013 [ 86]: db676901ecd0fa45 +Block 0013 [ 87]: 096dfe473e13e96f +Block 0013 [ 88]: 53968abdbe6e4572 +Block 0013 [ 89]: c6e7b422616906dd +Block 0013 [ 90]: edc199a6e9f6778a +Block 0013 [ 91]: 8ae900b4c954e50d +Block 0013 [ 92]: f9ee03ef99ef37b4 +Block 0013 [ 93]: 8a20e8e614c05e8e +Block 0013 [ 94]: ad858cea0b6610cf +Block 0013 [ 95]: 48501c603e178f3e +Block 0013 [ 96]: 8ac0979a7338a41b +Block 0013 [ 97]: 89d0a41b5373145e +Block 0013 [ 98]: ba71436efa6b897d +Block 0013 [ 99]: 56f2a1a0ca08e284 +Block 0013 [100]: 760e5e43697efd46 +Block 0013 [101]: bae77c1a65bef07e +Block 0013 [102]: 25e18714ea68d2a2 +Block 0013 [103]: b8ca56d1a6018956 +Block 0013 [104]: 342258dccc6a6d80 +Block 0013 [105]: d1a935f161a883de +Block 0013 [106]: 223aa5ec5f1311dd +Block 0013 [107]: fc66376a80e78e43 +Block 0013 [108]: b465c3b8933975b9 +Block 0013 [109]: 2b805a1aa85636c2 +Block 0013 [110]: 3bdbd379782a4213 +Block 0013 [111]: b3443e45eaeed777 +Block 0013 [112]: 48a458478a4e1fd5 +Block 0013 [113]: ce95d563b9d2580c +Block 0013 [114]: ba1750aa2c93bb7a +Block 0013 [115]: c0a849e80ac219c1 +Block 0013 [116]: f7df4f1ee48f8e2e +Block 0013 [117]: 0c80dc43de98a7d2 +Block 0013 [118]: 2659164c58c94cc5 +Block 0013 [119]: 4add333f8e5b70b4 +Block 0013 [120]: 7ef8625419224a9f +Block 0013 [121]: 9438a803327d4709 +Block 0013 [122]: e52835e1e39dd129 +Block 0013 [123]: f703ee0b9232369c +Block 0013 [124]: ec1e4f18f2f11ef6 +Block 0013 [125]: a46901c0035eedd2 +Block 0013 [126]: 0cd3fcc9c81a85be +Block 0013 [127]: 1ebc5566d5fc58f6 +Block 0014 [ 0]: a6fd444da23d6e1c +Block 0014 [ 1]: 27d5f1f2edfa9804 +Block 0014 [ 2]: 049fe0712c2aabc8 +Block 0014 [ 3]: 83379947d2bd63e1 +Block 0014 [ 4]: 8c54d252f69aafae +Block 0014 [ 5]: e008c186c409521d +Block 0014 [ 6]: 8a4dd58902b9065d +Block 0014 [ 7]: 171da5b5d4ca2c54 +Block 0014 [ 8]: 47d296bbaffac7ca +Block 0014 [ 9]: 4245e46959d2ba01 +Block 0014 [ 10]: 0cd6fd7bed88782a +Block 0014 [ 11]: 789f688d25adb3ba +Block 0014 [ 12]: cfa2969bd35cdb01 +Block 0014 [ 13]: 8147baf43054c3c3 +Block 0014 [ 14]: f28980a5b7a66642 +Block 0014 [ 15]: 379842f855193f71 +Block 0014 [ 16]: 167618251bf12e1a +Block 0014 [ 17]: 3de4a36244acda65 +Block 0014 [ 18]: ff9e1b243a00498e +Block 0014 [ 19]: da067a939b699e93 +Block 0014 [ 20]: fafa959c3af548a9 +Block 0014 [ 21]: cd7fb142db37d651 +Block 0014 [ 22]: 57a08b06b92fe762 +Block 0014 [ 23]: f8f217cf85858346 +Block 0014 [ 24]: c633ded2a0a87279 +Block 0014 [ 25]: e9ae9e18c6a2185b +Block 0014 [ 26]: 7798a758f4c08d73 +Block 0014 [ 27]: 4dac706917b3a0e0 +Block 0014 [ 28]: 17f25c21df6f6ad8 +Block 0014 [ 29]: 72b898b7b31cf4d2 +Block 0014 [ 30]: 0fcdc820916a5f0d +Block 0014 [ 31]: f04a3dd5a97dec99 +Block 0014 [ 32]: 9266960d1846ae17 +Block 0014 [ 33]: 67bdcd5d02ce1ec5 +Block 0014 [ 34]: edc1a704aadbfce9 +Block 0014 [ 35]: 60605d2cf5826657 +Block 0014 [ 36]: 66a1abe201545d43 +Block 0014 [ 37]: c416a25c6add6379 +Block 0014 [ 38]: 14edd341150ffe0f +Block 0014 [ 39]: eb0a69d9692d422e +Block 0014 [ 40]: 5edc64141f3fe535 +Block 0014 [ 41]: 5517f8af8e63cfb0 +Block 0014 [ 42]: 6496e3427f0b72b4 +Block 0014 [ 43]: 533584b066c29739 +Block 0014 [ 44]: 5ef672ef52028670 +Block 0014 [ 45]: a3a73a265b5b4c68 +Block 0014 [ 46]: c317a90bed56f97f +Block 0014 [ 47]: b25eaa412e6826bf +Block 0014 [ 48]: c33ca6840a8f4a20 +Block 0014 [ 49]: 22ba3746a5d7c617 +Block 0014 [ 50]: f8d75f32795a920c +Block 0014 [ 51]: de36310091fe3fc4 +Block 0014 [ 52]: 8cd740bf21c74f09 +Block 0014 [ 53]: 1b06579f7fcc666c +Block 0014 [ 54]: 8ccc6d4c75062885 +Block 0014 [ 55]: 43fd4b36fb0f01e5 +Block 0014 [ 56]: f8a2253f4de60237 +Block 0014 [ 57]: a3a34bec7464896d +Block 0014 [ 58]: c7263f2c186fe862 +Block 0014 [ 59]: 52dbd94463c3e89d +Block 0014 [ 60]: 1bfb2ad7a5da2dcb +Block 0014 [ 61]: 242b1455089cb5e3 +Block 0014 [ 62]: 537f4c68e83e9592 +Block 0014 [ 63]: aa12ee9c267fbf0f +Block 0014 [ 64]: e1c90243ff1558fc +Block 0014 [ 65]: a3ec1df790d1dd94 +Block 0014 [ 66]: 839102ed6415bdcc +Block 0014 [ 67]: 41a1eb33046c79b4 +Block 0014 [ 68]: 70162541518db319 +Block 0014 [ 69]: 9e4a9ff2379777d2 +Block 0014 [ 70]: cd976546ac02b98c +Block 0014 [ 71]: e4d3c3e4d7bafa9c +Block 0014 [ 72]: 3006682d1102cd1e +Block 0014 [ 73]: 2dda21061d60eeb0 +Block 0014 [ 74]: be8a8a034b76bea0 +Block 0014 [ 75]: 41d84a746d71ab65 +Block 0014 [ 76]: 207ce30627e15f10 +Block 0014 [ 77]: fdf84363bc87a648 +Block 0014 [ 78]: c936d95a70ffc7e5 +Block 0014 [ 79]: b3827987cc12c8e0 +Block 0014 [ 80]: 1c9e093a8100d421 +Block 0014 [ 81]: cb08d8230707442f +Block 0014 [ 82]: a5030a8c92aa863e +Block 0014 [ 83]: aae38d609e0109b2 +Block 0014 [ 84]: 5eceb17f9447a99c +Block 0014 [ 85]: dbd9d5ee531b610b +Block 0014 [ 86]: 99711e89db1680b1 +Block 0014 [ 87]: 4f7a10b757cb608f +Block 0014 [ 88]: 68658d34dc7e94fb +Block 0014 [ 89]: 440eeb626787c17e +Block 0014 [ 90]: dc279af3228c0353 +Block 0014 [ 91]: 1dac0a35211d14ef +Block 0014 [ 92]: 33bfe237745a88be +Block 0014 [ 93]: f30c62a742b86288 +Block 0014 [ 94]: 343cfd6104f75999 +Block 0014 [ 95]: 931344dad6051583 +Block 0014 [ 96]: 1ce3c8aba7af78e3 +Block 0014 [ 97]: 27a53fdba01abe2f +Block 0014 [ 98]: 6b3a5a9d94b13792 +Block 0014 [ 99]: f2255279896284a1 +Block 0014 [100]: db937dc3e2711431 +Block 0014 [101]: 4320a35809367826 +Block 0014 [102]: 0b7cc7006e18961b +Block 0014 [103]: 498eedf7ae16de25 +Block 0014 [104]: 9ed3fd7b3616d7c5 +Block 0014 [105]: 2f215d99735d5724 +Block 0014 [106]: 3846a13d7f2189da +Block 0014 [107]: f0911c31c8b28468 +Block 0014 [108]: 6f905c811b277595 +Block 0014 [109]: 5b6b45083eecca78 +Block 0014 [110]: 30b9c29f7c5fa245 +Block 0014 [111]: ac8f586b04386777 +Block 0014 [112]: a774d9b1a99dff6e +Block 0014 [113]: 4e1aade50867b4df +Block 0014 [114]: 05056826da07617e +Block 0014 [115]: cfd596b007b261a1 +Block 0014 [116]: 2fb87c6b4b19e672 +Block 0014 [117]: dc7a50615db0941f +Block 0014 [118]: 5ad371dd8bbb2d82 +Block 0014 [119]: 7a0a4565560fcf8e +Block 0014 [120]: 8edfdbb2246844e5 +Block 0014 [121]: 78cba762a604171c +Block 0014 [122]: d4d5140c608e25fd +Block 0014 [123]: e9b7a0f411af0178 +Block 0014 [124]: 495579fde5795935 +Block 0014 [125]: 98e91ae67903df3a +Block 0014 [126]: fb858d0ce6815c77 +Block 0014 [127]: abf9a3b4783b95b9 +Block 0015 [ 0]: 48f1ac950cf3881c +Block 0015 [ 1]: eaf883ea6cf90acd +Block 0015 [ 2]: b2abd6966dde13e6 +Block 0015 [ 3]: 1c1dbd963e509e80 +Block 0015 [ 4]: 99bfefb56bcc8b5b +Block 0015 [ 5]: 91b695442100a299 +Block 0015 [ 6]: d83bece1229baf44 +Block 0015 [ 7]: fbce75e4f69616ef +Block 0015 [ 8]: 8c4c204a54ea028d +Block 0015 [ 9]: 6e6afa1b87e5a778 +Block 0015 [ 10]: 32a41c52296d6509 +Block 0015 [ 11]: d76d7f53b02b548b +Block 0015 [ 12]: 317a97a4e29484ae +Block 0015 [ 13]: 49b5a36d87c27964 +Block 0015 [ 14]: 39ea0bdaf61f37c3 +Block 0015 [ 15]: 9e9152c38d3e5f91 +Block 0015 [ 16]: 71416bda681eb455 +Block 0015 [ 17]: d0a7c1a1d26677c7 +Block 0015 [ 18]: e663c0641e7f5e4e +Block 0015 [ 19]: 4553876046389bb4 +Block 0015 [ 20]: 3cde6995f45a4871 +Block 0015 [ 21]: 52de8d0ebc9f2d28 +Block 0015 [ 22]: 60cd90051fb84a8c +Block 0015 [ 23]: e185ea6d7388200b +Block 0015 [ 24]: 8d7d7020905d621a +Block 0015 [ 25]: 900bec536616cc0f +Block 0015 [ 26]: 283f8b890d0ae676 +Block 0015 [ 27]: 680bb488f2b0c5ba +Block 0015 [ 28]: 605284785bf2f48f +Block 0015 [ 29]: 66f88983aa442e96 +Block 0015 [ 30]: 335863bf15240c60 +Block 0015 [ 31]: 75e73ea0b669185d +Block 0015 [ 32]: 5afe255a49284d18 +Block 0015 [ 33]: 42d132c12033b815 +Block 0015 [ 34]: 768745082542997a +Block 0015 [ 35]: 3eaaadd309f971dc +Block 0015 [ 36]: 60063eab924ef931 +Block 0015 [ 37]: f64bdc7714548239 +Block 0015 [ 38]: b72beb1f7a4047bc +Block 0015 [ 39]: a0180a0fe772d833 +Block 0015 [ 40]: 555207f87100a775 +Block 0015 [ 41]: 348ac5544e3e12c2 +Block 0015 [ 42]: c549140299b026c3 +Block 0015 [ 43]: f3658936873c5eba +Block 0015 [ 44]: 49ff7a8cd84acebc +Block 0015 [ 45]: fe9706b4679eae94 +Block 0015 [ 46]: 0abfa68ea8bc7995 +Block 0015 [ 47]: e04df13b96469667 +Block 0015 [ 48]: d2509b6a6f172a1e +Block 0015 [ 49]: 3f98700992a85d42 +Block 0015 [ 50]: 37d15e6350f1fcf2 +Block 0015 [ 51]: 6a4bedc47ff0824d +Block 0015 [ 52]: 70f4fe2199d457ff +Block 0015 [ 53]: 2c352f913ad00226 +Block 0015 [ 54]: 80ec73821a01a1b7 +Block 0015 [ 55]: 52f144a2b92a0b8b +Block 0015 [ 56]: 8cb51546d7a50169 +Block 0015 [ 57]: b11c13a15ec5255d +Block 0015 [ 58]: deaccaa72dfd73e6 +Block 0015 [ 59]: c0d8ff50d1a70a84 +Block 0015 [ 60]: 063070a7a03bf4c5 +Block 0015 [ 61]: 90aa76c10d2f3dcd +Block 0015 [ 62]: b3ea5c879e1b8f69 +Block 0015 [ 63]: 06d58d40b299fff5 +Block 0015 [ 64]: f0906a0cbb014658 +Block 0015 [ 65]: 03fb6e4c776e4e6b +Block 0015 [ 66]: 341efc293b930c6a +Block 0015 [ 67]: 8c3495057d757b46 +Block 0015 [ 68]: af0b9102cb848408 +Block 0015 [ 69]: 4a61c0921fbfdb02 +Block 0015 [ 70]: d3a97a49364fcc87 +Block 0015 [ 71]: d89c0d1eaef9131c +Block 0015 [ 72]: f4ee9aa2027b0a0e +Block 0015 [ 73]: 7af4d9b428349614 +Block 0015 [ 74]: 71ff65de539e5a82 +Block 0015 [ 75]: 8f83a497e1669ac7 +Block 0015 [ 76]: 825661a2b539797e +Block 0015 [ 77]: 391f3e236e22d860 +Block 0015 [ 78]: 5bd028a09b96c6b8 +Block 0015 [ 79]: d03b3abd6c7bd98b +Block 0015 [ 80]: b218c3cff8ca229a +Block 0015 [ 81]: 449e748579dd114a +Block 0015 [ 82]: e75e5765ec0ef4eb +Block 0015 [ 83]: 927a53763eb52763 +Block 0015 [ 84]: eb31bea6ac58be13 +Block 0015 [ 85]: 3f9e0b6243e43d9c +Block 0015 [ 86]: 7d36ccb527d2f47c +Block 0015 [ 87]: 2e6737d2ac42f8a4 +Block 0015 [ 88]: 6be4965ce76dcf99 +Block 0015 [ 89]: 5266eb13b7c0fb67 +Block 0015 [ 90]: bc4a02952a5c891e +Block 0015 [ 91]: 652f04e1955a0cb2 +Block 0015 [ 92]: 94a422e3d810af83 +Block 0015 [ 93]: 00952c083000917f +Block 0015 [ 94]: 14a67f3032a00925 +Block 0015 [ 95]: 69f7e91255059cd0 +Block 0015 [ 96]: 5a708dd19514a98f +Block 0015 [ 97]: 91316fabb0d60317 +Block 0015 [ 98]: 687b66014c5a7015 +Block 0015 [ 99]: 8ad7ed6406b0f002 +Block 0015 [100]: 1dfbff523447315d +Block 0015 [101]: 4c896e08bd7477bd +Block 0015 [102]: 1665790a010701f7 +Block 0015 [103]: 2dc97780c92719db +Block 0015 [104]: 404cc7858d36f9f1 +Block 0015 [105]: ca5feabd4fd0c204 +Block 0015 [106]: 2cabce3fa772a19d +Block 0015 [107]: b877c257103bf937 +Block 0015 [108]: 5f9ea2426ce35573 +Block 0015 [109]: e6845f8d690e983d +Block 0015 [110]: de3d1d493abb9fbd +Block 0015 [111]: 82371cfa0ff53dd6 +Block 0015 [112]: 3336ba8f5026315f +Block 0015 [113]: 8110fe8c4a0ec071 +Block 0015 [114]: abefc53ff83604ed +Block 0015 [115]: 432543ba9c4c5317 +Block 0015 [116]: 1c9ffaa7191280d0 +Block 0015 [117]: b822a777b82ae96e +Block 0015 [118]: 3c0200fd356b34a8 +Block 0015 [119]: 78702afdbecd0848 +Block 0015 [120]: ceb5463bb7e4c860 +Block 0015 [121]: d779daa42cbece71 +Block 0015 [122]: 0f648209e29f3ee7 +Block 0015 [123]: 7ae6b67331d4cd58 +Block 0015 [124]: 5ec5eff47f3c7ded +Block 0015 [125]: c0f9dd6c59ff0521 +Block 0015 [126]: 6dbda1415a779a2f +Block 0015 [127]: 6fae8d18b407e040 +Block 0016 [ 0]: 710cfaf0bee662a5 +Block 0016 [ 1]: 6912d7353809b4ec +Block 0016 [ 2]: f75afc8a20e77848 +Block 0016 [ 3]: ad2ce00df7907bc6 +Block 0016 [ 4]: d8609558c4656b32 +Block 0016 [ 5]: df01d7192f02d6ad +Block 0016 [ 6]: 352b6d394b14dcd7 +Block 0016 [ 7]: 8c2959de89207bbe +Block 0016 [ 8]: 23dfe7c79c0babe3 +Block 0016 [ 9]: 681ddaa5b4076422 +Block 0016 [ 10]: 97a39739ef278fa6 +Block 0016 [ 11]: f595186e3f7cfb95 +Block 0016 [ 12]: fd8237458bedd057 +Block 0016 [ 13]: 5af3ccf518f8a6a9 +Block 0016 [ 14]: b4e2d70622b28ad2 +Block 0016 [ 15]: 9c9d445d0fc67760 +Block 0016 [ 16]: fe51b49a33018412 +Block 0016 [ 17]: a64f16fe32b4663c +Block 0016 [ 18]: 8e00e12bdb7129df +Block 0016 [ 19]: f7ff04584b60c14f +Block 0016 [ 20]: 974549315b64ae56 +Block 0016 [ 21]: d2e2f3bad2f3c964 +Block 0016 [ 22]: 2ad09f40f62e916c +Block 0016 [ 23]: 834c123230fda32f +Block 0016 [ 24]: da3f268010f0ae2d +Block 0016 [ 25]: af77c72c041a267a +Block 0016 [ 26]: 0da0f22e2ab41b36 +Block 0016 [ 27]: ac4bb65a75a868ed +Block 0016 [ 28]: c07e1215f30f9b25 +Block 0016 [ 29]: fe9c83043786499d +Block 0016 [ 30]: 4156d45c9c90cda3 +Block 0016 [ 31]: a8ec3559f62350e4 +Block 0016 [ 32]: 7f30e5cb02bfe5fa +Block 0016 [ 33]: 0f6c1b3fdbaaf663 +Block 0016 [ 34]: b997ddb2b173d5eb +Block 0016 [ 35]: 19127cee6480525a +Block 0016 [ 36]: 397a7b2b5255dc3a +Block 0016 [ 37]: f605ad9c1aaa7ed5 +Block 0016 [ 38]: 05d03ece38045455 +Block 0016 [ 39]: d4d5d65162bcca6e +Block 0016 [ 40]: 3cb61f380c80a889 +Block 0016 [ 41]: 17d299f871ec5ea4 +Block 0016 [ 42]: 693b37025942dfd6 +Block 0016 [ 43]: c6c05c5b0dc9e3e8 +Block 0016 [ 44]: 4303937541762ac5 +Block 0016 [ 45]: 3abafd38ef6245ee +Block 0016 [ 46]: 4bc1936e70418b04 +Block 0016 [ 47]: 25f7c72049559b67 +Block 0016 [ 48]: a977bc3194d89a91 +Block 0016 [ 49]: 471fac0934c45a12 +Block 0016 [ 50]: 78804b9bc54e8573 +Block 0016 [ 51]: 295f435d98ee06f9 +Block 0016 [ 52]: 6a32dc0811626e3b +Block 0016 [ 53]: c4db418d2dc47928 +Block 0016 [ 54]: 577ba22ecf5d231a +Block 0016 [ 55]: 28482d1a3153e0f4 +Block 0016 [ 56]: b42b7f05d45a65e8 +Block 0016 [ 57]: 1e242452db0744f4 +Block 0016 [ 58]: d97329be8474cd63 +Block 0016 [ 59]: 7cf9eff8edd07327 +Block 0016 [ 60]: 9f13cceab620d429 +Block 0016 [ 61]: f28a3026dd1db08f +Block 0016 [ 62]: 1c856cac60b6ab53 +Block 0016 [ 63]: a65279bd15d7f9a9 +Block 0016 [ 64]: 803fefc16404a710 +Block 0016 [ 65]: abe288e325cb7802 +Block 0016 [ 66]: d805bdfcc44040ae +Block 0016 [ 67]: 3ddeb139a7a0ed25 +Block 0016 [ 68]: f70cf79756da13a3 +Block 0016 [ 69]: 973f68ed071dbb8a +Block 0016 [ 70]: f3a939066cd21bc9 +Block 0016 [ 71]: b88d5fa30a1bab23 +Block 0016 [ 72]: 72227642f90106d4 +Block 0016 [ 73]: 7881a0e385380ebd +Block 0016 [ 74]: 04fc2c77bab1f4e7 +Block 0016 [ 75]: 9bebb3381fd536e3 +Block 0016 [ 76]: ef66d65a4a6050ab +Block 0016 [ 77]: a0c9b8785e782343 +Block 0016 [ 78]: a47023641507e262 +Block 0016 [ 79]: 465731861624687d +Block 0016 [ 80]: 2ae9549efc699fa5 +Block 0016 [ 81]: 6a15176ff48c36e5 +Block 0016 [ 82]: 82b481f1af0802e4 +Block 0016 [ 83]: b8c2d24bef0b79e5 +Block 0016 [ 84]: 269962820b63ad6b +Block 0016 [ 85]: e8d57e0ce2d8fa9b +Block 0016 [ 86]: d7fa415b4526ff7d +Block 0016 [ 87]: fafefe6b65041c41 +Block 0016 [ 88]: bfdef0334b2045a2 +Block 0016 [ 89]: feedd024bc36e30f +Block 0016 [ 90]: 20f45c92eb155f9c +Block 0016 [ 91]: 871efb3f3f90dbcd +Block 0016 [ 92]: 521a292c3cb15113 +Block 0016 [ 93]: 38662f1474beb8c1 +Block 0016 [ 94]: 69b8e7fc0ac12eed +Block 0016 [ 95]: 6ccfa59f401331ea +Block 0016 [ 96]: db7ad7c040889c92 +Block 0016 [ 97]: e0b3515aef70da17 +Block 0016 [ 98]: 529d53c2147f38f6 +Block 0016 [ 99]: 22c0f0ab0f5153d9 +Block 0016 [100]: e3a1e05598ad1072 +Block 0016 [101]: e0b0d28ad8a3e7eb +Block 0016 [102]: 7f68b2c84d2af77b +Block 0016 [103]: 466cc2bb5864b911 +Block 0016 [104]: ee63ea577f1f4e3f +Block 0016 [105]: 41ccb035b33684e4 +Block 0016 [106]: d90e6188131d652c +Block 0016 [107]: b13d24b082aca657 +Block 0016 [108]: 286d91f7dae701f6 +Block 0016 [109]: 7ddff979b2863b0d +Block 0016 [110]: 29b0f3577ed4f54d +Block 0016 [111]: e7b2fc6f93e22cd4 +Block 0016 [112]: 481aa7ea963c8277 +Block 0016 [113]: 5bbfd2c5c401194a +Block 0016 [114]: 773fa381b1d58f24 +Block 0016 [115]: fcdd4ac68cf673f4 +Block 0016 [116]: c2e5d48aee88b451 +Block 0016 [117]: 96ee1b09d99bac93 +Block 0016 [118]: f594138e33640e81 +Block 0016 [119]: e33f50e896cbcddb +Block 0016 [120]: d81f98bb8eecfdaf +Block 0016 [121]: ec31d99173fb77a4 +Block 0016 [122]: f2acc3b6fb255414 +Block 0016 [123]: bfef242337128b14 +Block 0016 [124]: bb663dc0e3338f7b +Block 0016 [125]: f49c51621d4201cb +Block 0016 [126]: e53c1fedd3052913 +Block 0016 [127]: ed6a6fe4f31cecdf +Block 0017 [ 0]: 952aece0f16fb3b6 +Block 0017 [ 1]: c94589dd7551b542 +Block 0017 [ 2]: be3fd2c66132daa4 +Block 0017 [ 3]: 81c48a0b3f2de2bc +Block 0017 [ 4]: 9ac5a66a083de3a1 +Block 0017 [ 5]: 17ec452a15738cf9 +Block 0017 [ 6]: 56671b153c50b567 +Block 0017 [ 7]: a738f66fc6633cd6 +Block 0017 [ 8]: e2f5b4c00b04b715 +Block 0017 [ 9]: 3cb7271c9e33787a +Block 0017 [ 10]: 4afb98c129a9ba81 +Block 0017 [ 11]: 401f1034d0cdcef6 +Block 0017 [ 12]: b3efedcb63fd0b52 +Block 0017 [ 13]: 4ca2a7602ee2abc3 +Block 0017 [ 14]: 7e220a5a8e56f8f4 +Block 0017 [ 15]: 627b16f115ab64b3 +Block 0017 [ 16]: 9005adb61ec4d578 +Block 0017 [ 17]: a40878f747dc0488 +Block 0017 [ 18]: 716efca0eefef3fb +Block 0017 [ 19]: 267e4dd2ce4a37d4 +Block 0017 [ 20]: 1852a3b61229cd4b +Block 0017 [ 21]: d9e05bec5abb0cfb +Block 0017 [ 22]: 809000e0ce09670a +Block 0017 [ 23]: f63651bc886e9b53 +Block 0017 [ 24]: 6618b2ab81b879b1 +Block 0017 [ 25]: 1c47da92a5d1c8c9 +Block 0017 [ 26]: 783113941e83d8da +Block 0017 [ 27]: 78201466eedd7fe9 +Block 0017 [ 28]: 89d3b3aa0c047056 +Block 0017 [ 29]: ddd16957defe030d +Block 0017 [ 30]: db81dbb7545aacfc +Block 0017 [ 31]: 80932e26f6ac5e56 +Block 0017 [ 32]: d590d512dec1e8bc +Block 0017 [ 33]: 22d20bd8220c4073 +Block 0017 [ 34]: 7f7993cab07534c6 +Block 0017 [ 35]: d738bd5c4c396610 +Block 0017 [ 36]: 15f88e3db0cd588f +Block 0017 [ 37]: b297a18e99f05f81 +Block 0017 [ 38]: d2fcbe03ca586a9f +Block 0017 [ 39]: da08c038b2aa3bef +Block 0017 [ 40]: 5a190360d985b628 +Block 0017 [ 41]: 41b215e0ed7bb415 +Block 0017 [ 42]: b38b27298d8dd9da +Block 0017 [ 43]: 011f566449fdc64c +Block 0017 [ 44]: 70367da514bde68d +Block 0017 [ 45]: 663e8093c3095c2d +Block 0017 [ 46]: 4872581648e38cf3 +Block 0017 [ 47]: a24469e0e2bb9daa +Block 0017 [ 48]: 95f032b49673e322 +Block 0017 [ 49]: ac1b38e53d2fb7c9 +Block 0017 [ 50]: 9179c042a54419a1 +Block 0017 [ 51]: f754d6e4ba540299 +Block 0017 [ 52]: fd2c6f8f49d6b42d +Block 0017 [ 53]: 5afa29c2f36e9a2f +Block 0017 [ 54]: ac740f84ffaca274 +Block 0017 [ 55]: 7e0fd8c31320c792 +Block 0017 [ 56]: 9b16d4d7fc190110 +Block 0017 [ 57]: a49b6f07283e4e86 +Block 0017 [ 58]: 040b686ee5047205 +Block 0017 [ 59]: 8aed40cb6e27e3eb +Block 0017 [ 60]: 4ca31b9fd4606d5f +Block 0017 [ 61]: 74c87970a65f8356 +Block 0017 [ 62]: 1eb1d933307076b2 +Block 0017 [ 63]: 304aa86fa95d0ee4 +Block 0017 [ 64]: cfb6cbac1b17beee +Block 0017 [ 65]: 2661f3e0b33a5a4d +Block 0017 [ 66]: 18e500d1ef4fd8bc +Block 0017 [ 67]: 9afec62590f199db +Block 0017 [ 68]: 26e4843c77db29e4 +Block 0017 [ 69]: 91603b76ec35253b +Block 0017 [ 70]: 1756708a5280549d +Block 0017 [ 71]: ca5eaeed94c69c73 +Block 0017 [ 72]: 2ca3c6040c38b167 +Block 0017 [ 73]: 3013413ecde7db9a +Block 0017 [ 74]: a0691438772206c4 +Block 0017 [ 75]: 06561b5f445b5b51 +Block 0017 [ 76]: 0d197b9980a81b16 +Block 0017 [ 77]: e71cd08afa96a69c +Block 0017 [ 78]: 71d606b12ccac9c4 +Block 0017 [ 79]: 8b80d848ff657dbc +Block 0017 [ 80]: 1ef4e7aa2eb67ca1 +Block 0017 [ 81]: fd3cbb5c194e156a +Block 0017 [ 82]: 943b8a9eea7c81d8 +Block 0017 [ 83]: fdba08a52c123357 +Block 0017 [ 84]: 282d371eace2eca3 +Block 0017 [ 85]: 44ddb3bc4d49b335 +Block 0017 [ 86]: a86a22dd6190e990 +Block 0017 [ 87]: 85a33224357364fa +Block 0017 [ 88]: ed80d83fc228f476 +Block 0017 [ 89]: ac8539c903ad25ae +Block 0017 [ 90]: 2face77d2e2c1eb8 +Block 0017 [ 91]: 4aed4cbac77719fd +Block 0017 [ 92]: 89ae974f79cf3813 +Block 0017 [ 93]: 6cd3ac7cab276e7f +Block 0017 [ 94]: d32cf45b417879f7 +Block 0017 [ 95]: 1b5e429dc8b9b907 +Block 0017 [ 96]: 6bf3ebfe54c463d6 +Block 0017 [ 97]: 92b310b3afe0e8b8 +Block 0017 [ 98]: 39f4fb9b656899c6 +Block 0017 [ 99]: 5235703fecb3f167 +Block 0017 [100]: 9ea64cd88ba4357b +Block 0017 [101]: ea54ed9dbe94c8ff +Block 0017 [102]: c5cea8ee03f01ecb +Block 0017 [103]: 0f3640c69fedd57d +Block 0017 [104]: 36aefd6f034c6728 +Block 0017 [105]: b44915a3339efeb6 +Block 0017 [106]: d0bb17f934bc2700 +Block 0017 [107]: 983ad4dd718a532e +Block 0017 [108]: 35be08b039710fb5 +Block 0017 [109]: 38acd5446171ca7d +Block 0017 [110]: ec2ecb38c65e8336 +Block 0017 [111]: ef3da5eac5cc16bb +Block 0017 [112]: bfef6c86c428166d +Block 0017 [113]: 7d7f878381f100da +Block 0017 [114]: 36537e58dbe2ef59 +Block 0017 [115]: 53a2a7328158b0b0 +Block 0017 [116]: e5a265a5833444c0 +Block 0017 [117]: a523477bb35aed86 +Block 0017 [118]: 820aead8675755b4 +Block 0017 [119]: 1599320a5cd31db5 +Block 0017 [120]: 1e2832448cafe90e +Block 0017 [121]: fc80c971ff3a0716 +Block 0017 [122]: 05c122688dc31dc4 +Block 0017 [123]: 7e1d0c1c98f81cb3 +Block 0017 [124]: 8931b0cb5450a64b +Block 0017 [125]: 8f1db3816e6d618b +Block 0017 [126]: 0ed498b9dd789b3c +Block 0017 [127]: c125a3023d2920de +Block 0018 [ 0]: 8fabded4e0f2a1e4 +Block 0018 [ 1]: 68d45e22ed92b46d +Block 0018 [ 2]: c71a5ed100fc0449 +Block 0018 [ 3]: 7280db58709e201d +Block 0018 [ 4]: 9bbba222ee9a909b +Block 0018 [ 5]: d104738019223045 +Block 0018 [ 6]: e79cf9aecc636fd5 +Block 0018 [ 7]: 0c3e482363104c2e +Block 0018 [ 8]: 168dea4b19461c22 +Block 0018 [ 9]: 0a430224f27650db +Block 0018 [ 10]: 5876a9465dff7324 +Block 0018 [ 11]: cd5bdc51f16cdc6a +Block 0018 [ 12]: f7485bceab705b14 +Block 0018 [ 13]: 0194df9b6c93fdee +Block 0018 [ 14]: 64c4504f4cad09b6 +Block 0018 [ 15]: 39cb64e258fc4c55 +Block 0018 [ 16]: b6be51ba477832fb +Block 0018 [ 17]: a67ce79038849bc7 +Block 0018 [ 18]: 3fe1784e2a94738f +Block 0018 [ 19]: c3a849b6a92cfcfa +Block 0018 [ 20]: fcc82176f80498c2 +Block 0018 [ 21]: 263341b189902b6e +Block 0018 [ 22]: 417defc8c7f8f3c9 +Block 0018 [ 23]: f6644368b34df787 +Block 0018 [ 24]: ec2a2afb635a3784 +Block 0018 [ 25]: 0b701ff950a6425a +Block 0018 [ 26]: 9050f2cf14974fc1 +Block 0018 [ 27]: eabdb9008b5d7451 +Block 0018 [ 28]: 87294049cce968f8 +Block 0018 [ 29]: 3229fd9d6e0208d4 +Block 0018 [ 30]: 2711963d8828f89d +Block 0018 [ 31]: a36db7b573f46447 +Block 0018 [ 32]: adb0af4d022fde58 +Block 0018 [ 33]: 1ae6dfe87b9c72d0 +Block 0018 [ 34]: a84b81e0c9d4b3a3 +Block 0018 [ 35]: 2b938f9ba0f08d63 +Block 0018 [ 36]: 3636e2dbc0451bc0 +Block 0018 [ 37]: 4296eb63bdc8dbed +Block 0018 [ 38]: 55b9f09671453ea8 +Block 0018 [ 39]: ff7c0de03e212c77 +Block 0018 [ 40]: 4fe5bc2a5b762094 +Block 0018 [ 41]: aea3348becc82a97 +Block 0018 [ 42]: a0a6f19496037fd6 +Block 0018 [ 43]: 08f83b9ee8b1aec9 +Block 0018 [ 44]: c603a7b74d79d52d +Block 0018 [ 45]: 25bc006f70c29714 +Block 0018 [ 46]: 781425263a5ee427 +Block 0018 [ 47]: da4a74361607728d +Block 0018 [ 48]: dc6e928f3fcecee9 +Block 0018 [ 49]: a4e0922764d6f97f +Block 0018 [ 50]: 230b19a966032ca7 +Block 0018 [ 51]: e11298c93942a1f0 +Block 0018 [ 52]: 15a770dff2136cb8 +Block 0018 [ 53]: b99ec484f91812de +Block 0018 [ 54]: a2f500db72ef0d4e +Block 0018 [ 55]: c452e832489cccd3 +Block 0018 [ 56]: b55fbd3ae1cd35d4 +Block 0018 [ 57]: c74f7c32d7acb75f +Block 0018 [ 58]: 164e2f10659a683f +Block 0018 [ 59]: 9eb1438025013929 +Block 0018 [ 60]: 7899f290de335c1f +Block 0018 [ 61]: 18901b574e91a434 +Block 0018 [ 62]: a2a6f1685e526f95 +Block 0018 [ 63]: 077130043c8eda1b +Block 0018 [ 64]: cde5f3f6fb439b5a +Block 0018 [ 65]: b2e556df38615dc4 +Block 0018 [ 66]: b15ac399f94a6ff6 +Block 0018 [ 67]: c9647f6c2465eb54 +Block 0018 [ 68]: 3dfa14a29e41088d +Block 0018 [ 69]: 5e9712b7ec261592 +Block 0018 [ 70]: 9bbd51d4b33f949a +Block 0018 [ 71]: 10ac40fab5131993 +Block 0018 [ 72]: 91d646159065a62d +Block 0018 [ 73]: 3fbc0be21b7cedf9 +Block 0018 [ 74]: d6693caf5b42f0e4 +Block 0018 [ 75]: ae9de9793e268970 +Block 0018 [ 76]: 3c53254b71f4fa2d +Block 0018 [ 77]: 55b9ba93b4d18f36 +Block 0018 [ 78]: 2bb3e1e9c076965b +Block 0018 [ 79]: 45d215bb3c731484 +Block 0018 [ 80]: c3944831932612a0 +Block 0018 [ 81]: 7fd4c8b7fa48ffaa +Block 0018 [ 82]: ec86027bbdf08fe2 +Block 0018 [ 83]: c8a4d2c4a28d0b45 +Block 0018 [ 84]: 795c2d1e57a61e77 +Block 0018 [ 85]: 92bf81b1f4d87b5a +Block 0018 [ 86]: 1ef911d4a9425b17 +Block 0018 [ 87]: 6d25fa4b3185b9d4 +Block 0018 [ 88]: a93f54aa4124c757 +Block 0018 [ 89]: 48af4d4768aecbee +Block 0018 [ 90]: 35d4abed720841ed +Block 0018 [ 91]: 665b3ac85fc4ee43 +Block 0018 [ 92]: 7ab4ca6ce7050e88 +Block 0018 [ 93]: 5c153804cce23a8e +Block 0018 [ 94]: 08a7790b6ae73d7e +Block 0018 [ 95]: 783cf66f52f2e00f +Block 0018 [ 96]: f7b816646210de2b +Block 0018 [ 97]: 09b82cc60113ef18 +Block 0018 [ 98]: f01c85f079ba8c5d +Block 0018 [ 99]: a6b659870e6f818c +Block 0018 [100]: 3455c90f45c36368 +Block 0018 [101]: 4aaff880c2bf4336 +Block 0018 [102]: 3ca38b4514afaf7b +Block 0018 [103]: ae6baefa48127298 +Block 0018 [104]: 56c02afca5fa1ee6 +Block 0018 [105]: 276b9dc16980b90f +Block 0018 [106]: 3b7059c3608de518 +Block 0018 [107]: daafa75eb308f5d4 +Block 0018 [108]: 5106f5a61bf578e2 +Block 0018 [109]: 61298f9f09494838 +Block 0018 [110]: 898ce468450ba934 +Block 0018 [111]: 4603cddb732f5d23 +Block 0018 [112]: 4f992f8582a5558d +Block 0018 [113]: c04fa5bcc8962b01 +Block 0018 [114]: e7a91e75d0fb9d85 +Block 0018 [115]: 0d8618021c04f84f +Block 0018 [116]: 44805dbf1d4e2f5f +Block 0018 [117]: 1e3e39a6076048c9 +Block 0018 [118]: dce41a86d7fb8643 +Block 0018 [119]: 70645bbe501fe7a4 +Block 0018 [120]: 4e47b5e159be52ce +Block 0018 [121]: 87f87906a56eb933 +Block 0018 [122]: e3d1788b0c2aba8b +Block 0018 [123]: 33be685aa22ab3ee +Block 0018 [124]: 8ced6b6f38143c6c +Block 0018 [125]: 7423f8ec9a516e00 +Block 0018 [126]: d7f7c1ff44c6d67d +Block 0018 [127]: f23b8867d4dd6fe1 +Block 0019 [ 0]: e68c94b2460ec841 +Block 0019 [ 1]: 99aaac0b34f4f8b7 +Block 0019 [ 2]: 3c66c650488686ee +Block 0019 [ 3]: 006374c400feb21d +Block 0019 [ 4]: eea0a1659a2c98e5 +Block 0019 [ 5]: 780c33d6870d93a5 +Block 0019 [ 6]: 2194f53780f57e6d +Block 0019 [ 7]: 151aadf89b99214b +Block 0019 [ 8]: 8e2994935a4ace33 +Block 0019 [ 9]: 3fea9a95dd889748 +Block 0019 [ 10]: 25bda6a6de6c9a02 +Block 0019 [ 11]: e2e31f2388fb26bb +Block 0019 [ 12]: e67486341d841440 +Block 0019 [ 13]: 633ac48051c0a0f1 +Block 0019 [ 14]: 62ebe294b85f42bf +Block 0019 [ 15]: 4ae4d2d157c1aa18 +Block 0019 [ 16]: 82e4215bf4d93f58 +Block 0019 [ 17]: a2ca18667bd8f7ff +Block 0019 [ 18]: 3037c66438e88973 +Block 0019 [ 19]: da18a6f3fef45119 +Block 0019 [ 20]: 3437a3d396527380 +Block 0019 [ 21]: 13cee0476a7e3f5f +Block 0019 [ 22]: 8ec5610e05e28f37 +Block 0019 [ 23]: 4d48ec3452f91e7b +Block 0019 [ 24]: 3a793c6dde0c489d +Block 0019 [ 25]: 7b79a433882146fd +Block 0019 [ 26]: 6e8562d28af6c353 +Block 0019 [ 27]: 9a0b815272ab6b2d +Block 0019 [ 28]: 989089e323496f7e +Block 0019 [ 29]: 30df1bdc4aea0225 +Block 0019 [ 30]: 6a3a564f55f4b3dd +Block 0019 [ 31]: fc50dc83bceb546c +Block 0019 [ 32]: 447e4405aa759904 +Block 0019 [ 33]: 58266b1f78f2ac2e +Block 0019 [ 34]: 31dd27bf51d0d63a +Block 0019 [ 35]: 735e46b955e39717 +Block 0019 [ 36]: 1137bbe17d3b419b +Block 0019 [ 37]: ce95092221294cf2 +Block 0019 [ 38]: b6d43f6023590ef7 +Block 0019 [ 39]: b9d3ffdc98719c65 +Block 0019 [ 40]: ff3be96758e36733 +Block 0019 [ 41]: a12599993003b4a9 +Block 0019 [ 42]: 5223772f965c4f8e +Block 0019 [ 43]: a78299a08abeb803 +Block 0019 [ 44]: e90d78a70c0e8e0f +Block 0019 [ 45]: 74ecc0d57a293296 +Block 0019 [ 46]: d4ca0fa2a509d91e +Block 0019 [ 47]: 86618f44fa0a98d8 +Block 0019 [ 48]: daffa696aa145a98 +Block 0019 [ 49]: f80e1bbe12db884f +Block 0019 [ 50]: ebe33c1b5affb1fd +Block 0019 [ 51]: 44d448690ffbe1c9 +Block 0019 [ 52]: 9ca41894f7191203 +Block 0019 [ 53]: 1d2a66481d0d7db1 +Block 0019 [ 54]: 76920c05c68f5a3e +Block 0019 [ 55]: 0324f0278705d5af +Block 0019 [ 56]: 3452c35f0f075a17 +Block 0019 [ 57]: cde1816fe56e2fbe +Block 0019 [ 58]: 61abb618c5c0121c +Block 0019 [ 59]: f38bbdf15d765970 +Block 0019 [ 60]: 64706d4efadddf8f +Block 0019 [ 61]: 668bacefb840fa45 +Block 0019 [ 62]: 81231b2e6d5a7228 +Block 0019 [ 63]: e0d93a1b5bcd2131 +Block 0019 [ 64]: 0bacf6789927c3e9 +Block 0019 [ 65]: 7450e8b30f92531e +Block 0019 [ 66]: 05870796723598e7 +Block 0019 [ 67]: 50387864aef7f3a6 +Block 0019 [ 68]: 2a5cc79b01e2d90b +Block 0019 [ 69]: d51ae1a77c1dd0c4 +Block 0019 [ 70]: d79de203232c010b +Block 0019 [ 71]: 4f9bdd24343d3330 +Block 0019 [ 72]: c1aaa24ff29cfcdf +Block 0019 [ 73]: c84dbb8f6f12e921 +Block 0019 [ 74]: dc444657b3bf3c81 +Block 0019 [ 75]: 18267cb2799f6008 +Block 0019 [ 76]: d9f2cb8a341fe77f +Block 0019 [ 77]: e291cf5c2060b212 +Block 0019 [ 78]: 46cb0528271d6244 +Block 0019 [ 79]: b734aca21de50d61 +Block 0019 [ 80]: 5a5de201bf6a2673 +Block 0019 [ 81]: 19a117528479480c +Block 0019 [ 82]: e79b301c2d155dd0 +Block 0019 [ 83]: 0be0429e25f3d73f +Block 0019 [ 84]: cf50115c5a8756f4 +Block 0019 [ 85]: ee9df0785e86b82c +Block 0019 [ 86]: 867ee8925e4a829f +Block 0019 [ 87]: db6994d375cd1c5d +Block 0019 [ 88]: 613424ffe028a72b +Block 0019 [ 89]: cf2819132c6b90fb +Block 0019 [ 90]: ae7c354a78ceefa7 +Block 0019 [ 91]: 6ee261ad0d0a6524 +Block 0019 [ 92]: e063d7b6752108d8 +Block 0019 [ 93]: d400d60801ad65fe +Block 0019 [ 94]: 056813fbb4b32958 +Block 0019 [ 95]: da6538dd2c171c1e +Block 0019 [ 96]: f5620f8890c1353e +Block 0019 [ 97]: c3915a2bedda38fc +Block 0019 [ 98]: f28944cea0d819ed +Block 0019 [ 99]: 07e0317ad31d983a +Block 0019 [100]: 54bdd629f270f9db +Block 0019 [101]: 96936d62fda5b903 +Block 0019 [102]: ca7bf41d8b5afa41 +Block 0019 [103]: 4930a62f8787eef7 +Block 0019 [104]: 055401e28cace080 +Block 0019 [105]: b22d6a0368a17683 +Block 0019 [106]: 8153868647380d50 +Block 0019 [107]: 72e5c3f1ec2ccb24 +Block 0019 [108]: 5ef04cea652960ab +Block 0019 [109]: d1c491afee065791 +Block 0019 [110]: 9123e3d65be41ef6 +Block 0019 [111]: 5e573c21771a6e0f +Block 0019 [112]: 4c233c6896ad2bd8 +Block 0019 [113]: 0917fac4bef0e86a +Block 0019 [114]: d5eba161cdd4b19c +Block 0019 [115]: 231e08de94edb6a1 +Block 0019 [116]: 4238a5d0b6fee732 +Block 0019 [117]: 2ec30accc4214752 +Block 0019 [118]: 08adfd6dbb5c724f +Block 0019 [119]: 2bba105466e32b7c +Block 0019 [120]: e55defcb46625080 +Block 0019 [121]: 855a7f9b856df6b7 +Block 0019 [122]: 1a800bd9d8f62493 +Block 0019 [123]: 5c5a069470c15cc2 +Block 0019 [124]: fcc3739e177a54e1 +Block 0019 [125]: 76a1b592006e7414 +Block 0019 [126]: 5e597cdfa3b799a0 +Block 0019 [127]: c57e11887fcf795c +Block 0020 [ 0]: c54d3e2cb71bdcb3 +Block 0020 [ 1]: 045b75b5a325da89 +Block 0020 [ 2]: b9e14f31c00c36a4 +Block 0020 [ 3]: 966cda36e60c59d2 +Block 0020 [ 4]: 1f2fed12ae03196a +Block 0020 [ 5]: 394d0e3f47889ec9 +Block 0020 [ 6]: 1dfa30485d24f092 +Block 0020 [ 7]: 85fc989151ff8366 +Block 0020 [ 8]: 178abd2a02a4a8e9 +Block 0020 [ 9]: 0f95d8d8b4b33b17 +Block 0020 [ 10]: 7ce14c39ea336a61 +Block 0020 [ 11]: 8588e56ba55173b4 +Block 0020 [ 12]: 7c9f9fef0393618e +Block 0020 [ 13]: 3981488aa716fff4 +Block 0020 [ 14]: 2de3fcfec310f1f7 +Block 0020 [ 15]: 64c8abbb27c8ccb6 +Block 0020 [ 16]: a71a061b8aad5f01 +Block 0020 [ 17]: 4a8299be564abd67 +Block 0020 [ 18]: 928630af5033c132 +Block 0020 [ 19]: 35c2cf541f2c3539 +Block 0020 [ 20]: 934b011ac1d5f33f +Block 0020 [ 21]: f0261dfa4a0b84ff +Block 0020 [ 22]: a88a1ff2595f7ae4 +Block 0020 [ 23]: a03126345067fa76 +Block 0020 [ 24]: 3df3835b2c16eb32 +Block 0020 [ 25]: 60b4166b25329b80 +Block 0020 [ 26]: a8d471f7d45ff5ba +Block 0020 [ 27]: 2e6fe056562554d2 +Block 0020 [ 28]: 3d07f858142c2fe3 +Block 0020 [ 29]: dddfeca432ccd3ba +Block 0020 [ 30]: 8400fb66a8db5b16 +Block 0020 [ 31]: a748bca7d7302b54 +Block 0020 [ 32]: f925832d18b51065 +Block 0020 [ 33]: 77cb3f75fde4d890 +Block 0020 [ 34]: f35d2422522de8c3 +Block 0020 [ 35]: dfa7fde45521747b +Block 0020 [ 36]: df0695c8e0139c4d +Block 0020 [ 37]: 51047eb7b5dd8aba +Block 0020 [ 38]: 7c44efc45de0bcfd +Block 0020 [ 39]: 1491c82e92645137 +Block 0020 [ 40]: 6e6ecc04f4212e26 +Block 0020 [ 41]: 9d5b9ebb54f1e541 +Block 0020 [ 42]: 598e7f273d8a08ee +Block 0020 [ 43]: 3b6e27abfb649a5a +Block 0020 [ 44]: d0c6518b5a6a4791 +Block 0020 [ 45]: 2cbcf2c3c944b133 +Block 0020 [ 46]: ac7f945b5e493475 +Block 0020 [ 47]: 028cefefd0a89765 +Block 0020 [ 48]: de50ac74cb3dfc57 +Block 0020 [ 49]: c1f212cb7ff0e154 +Block 0020 [ 50]: 6c12225df148f8c9 +Block 0020 [ 51]: a531d30641fb8f3e +Block 0020 [ 52]: feb48fd4409e38ea +Block 0020 [ 53]: 7d97606342d70db7 +Block 0020 [ 54]: 25e4dc7a78a45ed1 +Block 0020 [ 55]: 213b0ad8218be4b2 +Block 0020 [ 56]: 907b03533fe689f6 +Block 0020 [ 57]: 0254dbaa7b4d1cb4 +Block 0020 [ 58]: fa2127039a17e414 +Block 0020 [ 59]: 8e42e9379fc70e9a +Block 0020 [ 60]: 7d6fcd35dfdc3df8 +Block 0020 [ 61]: 7c117c259b7f677b +Block 0020 [ 62]: ced9a88d8b6d21b9 +Block 0020 [ 63]: 3cd93f07ac90b6dd +Block 0020 [ 64]: 3f64026f2f2d5d21 +Block 0020 [ 65]: 918da82771c98e07 +Block 0020 [ 66]: fa0bcaa023b52934 +Block 0020 [ 67]: d254161d884dab65 +Block 0020 [ 68]: 0ab9fb2e38f39aa0 +Block 0020 [ 69]: 9b0ad40ca7a7e53d +Block 0020 [ 70]: a59718f79af53441 +Block 0020 [ 71]: 61dd123c0753cd8b +Block 0020 [ 72]: 9be36512f98bf123 +Block 0020 [ 73]: 1b10f5701374b409 +Block 0020 [ 74]: d2a9ecd263a43767 +Block 0020 [ 75]: 5588fcb390d08fc6 +Block 0020 [ 76]: 48c7d0ccbd865afa +Block 0020 [ 77]: baf1f14150d0c6ac +Block 0020 [ 78]: a513e811bed260aa +Block 0020 [ 79]: e2256898e554eabe +Block 0020 [ 80]: 245d08410ddc2073 +Block 0020 [ 81]: cac07dbc1480586f +Block 0020 [ 82]: 7af04b8310ad0ece +Block 0020 [ 83]: 5a12c12021d4c398 +Block 0020 [ 84]: 6e6771bb7a6146d5 +Block 0020 [ 85]: 3fec7cc7d0f05f06 +Block 0020 [ 86]: dac5d20d4a7f0558 +Block 0020 [ 87]: 36e29accf65b0fbf +Block 0020 [ 88]: 17f4cafd73b22af1 +Block 0020 [ 89]: bc3daf981eae353f +Block 0020 [ 90]: 9ea48362e9375a28 +Block 0020 [ 91]: dfe05001142b3662 +Block 0020 [ 92]: 66a26ef9cb3c9a62 +Block 0020 [ 93]: 7d9fece4c8e9060d +Block 0020 [ 94]: 67a9a26a7af4d68f +Block 0020 [ 95]: 0c73007e1b65eeb4 +Block 0020 [ 96]: bb0815188f59f189 +Block 0020 [ 97]: 532b8112c89fb754 +Block 0020 [ 98]: fe870b6acefedf44 +Block 0020 [ 99]: 87ffc30535a4e771 +Block 0020 [100]: 3065fc324181dea9 +Block 0020 [101]: bb66f0d2a87bebb6 +Block 0020 [102]: ec737a39dcfc4886 +Block 0020 [103]: a790b38df1cd0369 +Block 0020 [104]: fde7bcafccb7dec9 +Block 0020 [105]: fab95e7a5e1e9896 +Block 0020 [106]: 8fa2fb1044142009 +Block 0020 [107]: 13369c517008a55a +Block 0020 [108]: 51ebff2547ca9d7d +Block 0020 [109]: b4fec36f856ee016 +Block 0020 [110]: 522b8ce6e5135485 +Block 0020 [111]: 875bae25f8ac8cb3 +Block 0020 [112]: eff897d039cdc9b9 +Block 0020 [113]: 99758f2baea77a83 +Block 0020 [114]: d58ad76dd94db6e5 +Block 0020 [115]: 9b328f1e84364f75 +Block 0020 [116]: 4243923d22b1457d +Block 0020 [117]: 96de22ee64f80846 +Block 0020 [118]: 9663e19dc0808f0e +Block 0020 [119]: a31787db1626f171 +Block 0020 [120]: fe941f17981bedc3 +Block 0020 [121]: 24925bbf73d23de8 +Block 0020 [122]: d87e2a9df7952d66 +Block 0020 [123]: 163a92313113e2b6 +Block 0020 [124]: 8fcde73c94fb861b +Block 0020 [125]: 599d993568adde24 +Block 0020 [126]: ef53a06b7dc3ab34 +Block 0020 [127]: 6164df011b9803ce +Block 0021 [ 0]: b4359aafad15cb66 +Block 0021 [ 1]: 7ce75a4dc9d24ad5 +Block 0021 [ 2]: 80628ac68feba208 +Block 0021 [ 3]: 647a73904f76cf42 +Block 0021 [ 4]: 054f3fa5406f291c +Block 0021 [ 5]: 2a8a0ce8ca579a6c +Block 0021 [ 6]: 241db1a3fca580d8 +Block 0021 [ 7]: 53be796a6148af72 +Block 0021 [ 8]: 2c3f7ef0d9fa0fa6 +Block 0021 [ 9]: 232118c9bc2c1821 +Block 0021 [ 10]: 4732801687b6ad99 +Block 0021 [ 11]: 091eede831c70741 +Block 0021 [ 12]: 390b7bad92e5aad4 +Block 0021 [ 13]: 0e3bd13e7b8cf2b2 +Block 0021 [ 14]: a5d92db9aad5ebcb +Block 0021 [ 15]: 33096e82e7d9a193 +Block 0021 [ 16]: 345a736d05b8ae2e +Block 0021 [ 17]: 3cf0b101b23e68e3 +Block 0021 [ 18]: 3f206123e8289d5e +Block 0021 [ 19]: b3b82744857e6420 +Block 0021 [ 20]: 09fe2ef20ed5f50e +Block 0021 [ 21]: 309b9c0a7ebde4b3 +Block 0021 [ 22]: 110b6319f949d6d6 +Block 0021 [ 23]: 33afd02b5efd01cb +Block 0021 [ 24]: 1c64e2a0bf49aa3b +Block 0021 [ 25]: 91f7d6182f04c9e0 +Block 0021 [ 26]: f838cbeb18e1c36a +Block 0021 [ 27]: 83b0dbfaa26dd968 +Block 0021 [ 28]: b4bd77cde2e42069 +Block 0021 [ 29]: 92fb33478ed213fc +Block 0021 [ 30]: bd155dc19753e426 +Block 0021 [ 31]: b3baebd3c6baecac +Block 0021 [ 32]: 5503e71b97973de3 +Block 0021 [ 33]: 36191e2eb2082f5a +Block 0021 [ 34]: ee885969b22aad9c +Block 0021 [ 35]: 2134f58df159795c +Block 0021 [ 36]: dcf3454302715c0c +Block 0021 [ 37]: 96d6f6d96728028f +Block 0021 [ 38]: a6c2214609c42c1b +Block 0021 [ 39]: b4c9277ac8edc055 +Block 0021 [ 40]: 5ee3a94d1fbb0c98 +Block 0021 [ 41]: 5c6cc1572251a5df +Block 0021 [ 42]: 65460fd6055384d0 +Block 0021 [ 43]: 53046124ab0bb1ce +Block 0021 [ 44]: c1588ca311f6229b +Block 0021 [ 45]: af4c3450fd49bde2 +Block 0021 [ 46]: d8bd84abebca4b44 +Block 0021 [ 47]: 0dbd468e2ce4c736 +Block 0021 [ 48]: a05732cb618fb3d2 +Block 0021 [ 49]: 4285ee522591c15a +Block 0021 [ 50]: 226f73bbeb355b3d +Block 0021 [ 51]: 71eaaa9babe05328 +Block 0021 [ 52]: 34e517122258eb4f +Block 0021 [ 53]: 8db93c1689432f17 +Block 0021 [ 54]: cc042f252799cbdc +Block 0021 [ 55]: eb7bc92c56f1a160 +Block 0021 [ 56]: 93e3f8caf83238ff +Block 0021 [ 57]: 3d09fe62b2cec6ee +Block 0021 [ 58]: 0b3506ec7cc5c28b +Block 0021 [ 59]: 593b5033fc8e18eb +Block 0021 [ 60]: 09082196bc215c48 +Block 0021 [ 61]: 653aac366e202636 +Block 0021 [ 62]: d7c8fc4e7aff96b2 +Block 0021 [ 63]: 091ebda3ffbaba3e +Block 0021 [ 64]: d3b37b144c8d36ef +Block 0021 [ 65]: 88a95e9be1dc5dc8 +Block 0021 [ 66]: 083c1a074ea5a5e9 +Block 0021 [ 67]: 34a11d71b4925a91 +Block 0021 [ 68]: ac3f2081b74276e1 +Block 0021 [ 69]: e178dc364e9ce587 +Block 0021 [ 70]: fc358da58b918d09 +Block 0021 [ 71]: c98f6b556d55d177 +Block 0021 [ 72]: aef7971cfa9ff37d +Block 0021 [ 73]: b5d411fd662c5fba +Block 0021 [ 74]: 4e2562e0dbfdcbcb +Block 0021 [ 75]: b03ab288ba43ac82 +Block 0021 [ 76]: 9b7cd3120b8eecce +Block 0021 [ 77]: d311e41b9b961a2c +Block 0021 [ 78]: d74f38c1f470407b +Block 0021 [ 79]: b436ea598c38c2e8 +Block 0021 [ 80]: be7c8e0d99fcfa5b +Block 0021 [ 81]: 277bb5b7d604b0f3 +Block 0021 [ 82]: 95aa4567c7c08ced +Block 0021 [ 83]: b983c108c9552cc5 +Block 0021 [ 84]: dad3e1c67fc6291e +Block 0021 [ 85]: eea86a2a4fa30ee2 +Block 0021 [ 86]: 8e5e499491ad8d27 +Block 0021 [ 87]: c16da828dbb58de5 +Block 0021 [ 88]: aa1c634f7b67da81 +Block 0021 [ 89]: f6880237a2459b29 +Block 0021 [ 90]: 2cfc0b5833399be9 +Block 0021 [ 91]: 3714e3f38337f68a +Block 0021 [ 92]: 31d6460f7d0e5979 +Block 0021 [ 93]: 2caa43efea4389c2 +Block 0021 [ 94]: 4386b7afe0d31674 +Block 0021 [ 95]: 85fb37a557a28138 +Block 0021 [ 96]: 9cbbd44c38af6793 +Block 0021 [ 97]: bee341aebbcfe36c +Block 0021 [ 98]: 674ce8f742369cbb +Block 0021 [ 99]: 856b0b350bae5187 +Block 0021 [100]: 02a68a5823e3b954 +Block 0021 [101]: 6704e91be87c9ea0 +Block 0021 [102]: d92888c4a8c08134 +Block 0021 [103]: 87472fbfbc2fcfd5 +Block 0021 [104]: a50169e2fa648772 +Block 0021 [105]: 4feb188466f7e52d +Block 0021 [106]: 0d79238c73a589fa +Block 0021 [107]: 6332ffb33d56c49c +Block 0021 [108]: 68607184ed0754b1 +Block 0021 [109]: f272d2e8b08e7a34 +Block 0021 [110]: a968fd194564013f +Block 0021 [111]: 60e08b245657d2b2 +Block 0021 [112]: b473337ba3a572da +Block 0021 [113]: bdb28b111b33fcc1 +Block 0021 [114]: 7e4fc761ee70caf0 +Block 0021 [115]: b3fa3d33d9bf2517 +Block 0021 [116]: 93d97291bed8d833 +Block 0021 [117]: d8ee5c9a49a96764 +Block 0021 [118]: bb2bce5f4a8040e0 +Block 0021 [119]: 266fd5ba94493f99 +Block 0021 [120]: ea3e1b720fc5638a +Block 0021 [121]: 7ec3443cf459c697 +Block 0021 [122]: 670b59b62d2c1552 +Block 0021 [123]: 7ea24423e5485f69 +Block 0021 [124]: 86a381d3e697ec37 +Block 0021 [125]: 7ef381fd980cd373 +Block 0021 [126]: 4d97d8f2f15a08fd +Block 0021 [127]: f241c79c4336e5ee +Block 0022 [ 0]: 813e36b57f736f0e +Block 0022 [ 1]: 345edbccfd655060 +Block 0022 [ 2]: 45f4ada44a2382e7 +Block 0022 [ 3]: 62cd805ccbcf63e1 +Block 0022 [ 4]: 2609d71d9286f6d5 +Block 0022 [ 5]: 39eb81718e588a4c +Block 0022 [ 6]: 20b478f3eb7e3cc2 +Block 0022 [ 7]: 253c29e9bedcefc1 +Block 0022 [ 8]: 08004243908f4f1d +Block 0022 [ 9]: b7a67c83f293d403 +Block 0022 [ 10]: 1911fd2dda85e2f8 +Block 0022 [ 11]: 70f5f853b83b5dd7 +Block 0022 [ 12]: a67f4eba9920c6e3 +Block 0022 [ 13]: 56f13344621a0e61 +Block 0022 [ 14]: 971f77f862b273dc +Block 0022 [ 15]: e12eefe0abcc5b4e +Block 0022 [ 16]: 59b4f8f1a60fed17 +Block 0022 [ 17]: 2051dbd0c486d542 +Block 0022 [ 18]: 7f6423db1c459ead +Block 0022 [ 19]: 85293e221fc0b143 +Block 0022 [ 20]: d96e5034170a075a +Block 0022 [ 21]: c7c39f32dcaf4a9f +Block 0022 [ 22]: 2a880940c67864c4 +Block 0022 [ 23]: a54c6f2d14dd1e7e +Block 0022 [ 24]: 6dfc7feebdf6b0c7 +Block 0022 [ 25]: 716b53a52f1ca01e +Block 0022 [ 26]: ee494ea0dcd25617 +Block 0022 [ 27]: 9da47bea3267169d +Block 0022 [ 28]: 9b1cedca1279315e +Block 0022 [ 29]: a05e91f4da37ba4b +Block 0022 [ 30]: 3f9012c056d9ea0a +Block 0022 [ 31]: 9eafd586517cf956 +Block 0022 [ 32]: 33fc7e8fb52d11ce +Block 0022 [ 33]: 360c77ad386602e1 +Block 0022 [ 34]: 239bc09dbae396f3 +Block 0022 [ 35]: db564062b886e0db +Block 0022 [ 36]: 5b99052adc7fb1f4 +Block 0022 [ 37]: afbba2175808419a +Block 0022 [ 38]: 8584484a2cf421f3 +Block 0022 [ 39]: df26603c940349d7 +Block 0022 [ 40]: d44ba11ddfaa77d3 +Block 0022 [ 41]: ff903fbd137aa9b3 +Block 0022 [ 42]: e92191a967f00fe5 +Block 0022 [ 43]: eeacdc65c294236a +Block 0022 [ 44]: 8efaeac4c8bfc2c6 +Block 0022 [ 45]: 65842ccf54771329 +Block 0022 [ 46]: ff0a8a16832baa5f +Block 0022 [ 47]: dc2d92bd7ea194c3 +Block 0022 [ 48]: bb6baaa1316affbc +Block 0022 [ 49]: 9dba26c40d1f4c5c +Block 0022 [ 50]: 5c5dcaf5cc029b7b +Block 0022 [ 51]: 76dde8e5937ed9fa +Block 0022 [ 52]: 8c6912cf71d1b0f7 +Block 0022 [ 53]: c291157fa8faf585 +Block 0022 [ 54]: 846626675908e472 +Block 0022 [ 55]: 703c628a4b8160db +Block 0022 [ 56]: ba20a5ac7c56f3c8 +Block 0022 [ 57]: aeeda4e5faf9bd4f +Block 0022 [ 58]: 66a610879006072d +Block 0022 [ 59]: 056d180bd4f6af2f +Block 0022 [ 60]: 7505b0cdb9c93e64 +Block 0022 [ 61]: 0293ba0f95b4517e +Block 0022 [ 62]: befb683208444571 +Block 0022 [ 63]: 69035d1ab4c773c5 +Block 0022 [ 64]: 6b53ad1a6b633732 +Block 0022 [ 65]: 7942fdfc3c8d30fd +Block 0022 [ 66]: f631898c080bd8cf +Block 0022 [ 67]: 16eca90577600ed0 +Block 0022 [ 68]: 7029d3f17b6914d0 +Block 0022 [ 69]: 4779698217fce0c1 +Block 0022 [ 70]: 2a8b2a94619361dd +Block 0022 [ 71]: 280f6adcac49f9b9 +Block 0022 [ 72]: 42771780bbf292ed +Block 0022 [ 73]: 486b0fb39b59fd26 +Block 0022 [ 74]: ea95b24743c40e47 +Block 0022 [ 75]: 75dd1f2a65fc4348 +Block 0022 [ 76]: 9dcfc10e5d7d78f6 +Block 0022 [ 77]: 2cb8a82aafe24993 +Block 0022 [ 78]: 57e2a0c1b90752a5 +Block 0022 [ 79]: 6ec85892729bb3e9 +Block 0022 [ 80]: d7656c1d56dbcecf +Block 0022 [ 81]: 8f73225a3350f820 +Block 0022 [ 82]: 477edcbc02afc238 +Block 0022 [ 83]: e4275a1b9aa7e943 +Block 0022 [ 84]: 3ae96dad9513e87b +Block 0022 [ 85]: fb7fa4b503184cbd +Block 0022 [ 86]: 3ef220b5ca9bd822 +Block 0022 [ 87]: 6cc1b23ce216063c +Block 0022 [ 88]: a8bfec1577b858b5 +Block 0022 [ 89]: bc88a540cf4ccea0 +Block 0022 [ 90]: 8ef8ff6f9d2b187b +Block 0022 [ 91]: 87c6df841301e4fe +Block 0022 [ 92]: 63403f90699e4971 +Block 0022 [ 93]: 172ccd9b90911d01 +Block 0022 [ 94]: 627145555f3ca629 +Block 0022 [ 95]: 9598aa5a5d03ad85 +Block 0022 [ 96]: d1a9fd862eaad482 +Block 0022 [ 97]: eb84b9bd1db4e5f9 +Block 0022 [ 98]: a4e82f816e247783 +Block 0022 [ 99]: fdb966659f11201c +Block 0022 [100]: 54f4ceecbb73d1fd +Block 0022 [101]: 31237b6a155ac335 +Block 0022 [102]: ed9cdd6bc0440c99 +Block 0022 [103]: 5df61b5eafba2445 +Block 0022 [104]: c2e8a0b81e9f2861 +Block 0022 [105]: 50d50587c5ccf4d4 +Block 0022 [106]: 9f798cca5d417467 +Block 0022 [107]: e1a40ba6506cd7d9 +Block 0022 [108]: 14f6fbba5f8381b9 +Block 0022 [109]: 1507d17ae17e99e5 +Block 0022 [110]: 5b6a8344c3bf8a4e +Block 0022 [111]: 3a4b5da9f312b9e7 +Block 0022 [112]: 980d402ac279c4a1 +Block 0022 [113]: 4a83e58717bfdf2e +Block 0022 [114]: edfda956f994881e +Block 0022 [115]: dd928d191f2bad0f +Block 0022 [116]: 32f2b58f81e9db2e +Block 0022 [117]: 795786215883c510 +Block 0022 [118]: 2ea35a3be27dc59a +Block 0022 [119]: 696cb31e49444600 +Block 0022 [120]: d37ca87ae65fe96b +Block 0022 [121]: 7db487549599b66e +Block 0022 [122]: 02a9a74bad372257 +Block 0022 [123]: 81c7c8d7e3864a39 +Block 0022 [124]: dcb6a7a05eeafd74 +Block 0022 [125]: 899c2040fa48c0dd +Block 0022 [126]: 1ba5009a290db5af +Block 0022 [127]: 90f532941e285313 +Block 0023 [ 0]: d92feaf9ce8f832f +Block 0023 [ 1]: 3de3b81d2dab8116 +Block 0023 [ 2]: cf1e8cca6963628c +Block 0023 [ 3]: 07cb29d6ba973354 +Block 0023 [ 4]: c348b52ae94fbd89 +Block 0023 [ 5]: 61ce2eecdec8a31b +Block 0023 [ 6]: 82a2130eaea128dc +Block 0023 [ 7]: 4f8aa3e0d7d6710c +Block 0023 [ 8]: bcd653f901fb9f3b +Block 0023 [ 9]: 3bb0a8d09248a0e1 +Block 0023 [ 10]: 310899a7c559e07d +Block 0023 [ 11]: 621fb1b749c89c1d +Block 0023 [ 12]: e5dd90a69a7c2088 +Block 0023 [ 13]: df25ff336f01b4f3 +Block 0023 [ 14]: e82704f1da52db54 +Block 0023 [ 15]: 6cf8eaf00efd333b +Block 0023 [ 16]: 656e8a75c9990167 +Block 0023 [ 17]: 2495bd9a4e94b6ff +Block 0023 [ 18]: dc75566d181ba85d +Block 0023 [ 19]: 4b41a1f74adca60e +Block 0023 [ 20]: 7e2a74ac28620381 +Block 0023 [ 21]: ae2c8230deddc7ca +Block 0023 [ 22]: db57b6833bd71c5c +Block 0023 [ 23]: b98fe4728a732634 +Block 0023 [ 24]: ec0bdcfb62bf1944 +Block 0023 [ 25]: f118264665f3c202 +Block 0023 [ 26]: cbb5a036c33319fe +Block 0023 [ 27]: f327b9bae21d24fe +Block 0023 [ 28]: 4478291d73a3bf0d +Block 0023 [ 29]: e5fb606769ddfb31 +Block 0023 [ 30]: f523956060e94a9a +Block 0023 [ 31]: 8c32c1450c832977 +Block 0023 [ 32]: 430f30e003942c3b +Block 0023 [ 33]: 5b8dacd457d7041a +Block 0023 [ 34]: 512765b9187e2778 +Block 0023 [ 35]: 34683aff41f7d9d6 +Block 0023 [ 36]: 16ded03fb6edc604 +Block 0023 [ 37]: 60f18b90ca5ccbce +Block 0023 [ 38]: 26afa948ec150fdd +Block 0023 [ 39]: f1572bab289539ae +Block 0023 [ 40]: 54c85f3574d44104 +Block 0023 [ 41]: d7ae5531e526625c +Block 0023 [ 42]: 48ceb1160c16bc68 +Block 0023 [ 43]: a7f5980b2fef07ed +Block 0023 [ 44]: b0e154d525eab517 +Block 0023 [ 45]: 354c61f188ac9c85 +Block 0023 [ 46]: 1735825e0dcbb3c8 +Block 0023 [ 47]: 6c85a29988884a89 +Block 0023 [ 48]: 183d32c1c7b75210 +Block 0023 [ 49]: 1c61dd508c241991 +Block 0023 [ 50]: 5c1749abe0f7f0e1 +Block 0023 [ 51]: dfd50644c2722393 +Block 0023 [ 52]: a32f6e257045aa4f +Block 0023 [ 53]: 5f0d63a2fa6b9db5 +Block 0023 [ 54]: 8137c4a1649ff49e +Block 0023 [ 55]: 0361fd084a8429b4 +Block 0023 [ 56]: 2fff5a3d5978327d +Block 0023 [ 57]: 647412ac4a4a5db8 +Block 0023 [ 58]: 7c538866533b8084 +Block 0023 [ 59]: 9bd01c9630abd6e4 +Block 0023 [ 60]: 49d58e98765e7062 +Block 0023 [ 61]: d28099be1bebcfda +Block 0023 [ 62]: 4a299a576da2a4c5 +Block 0023 [ 63]: f3189872d6fb849f +Block 0023 [ 64]: 7dda31d38325b7e9 +Block 0023 [ 65]: 0f4c97f756b82ae3 +Block 0023 [ 66]: 6bb0608531658ea5 +Block 0023 [ 67]: 15eadad675329af7 +Block 0023 [ 68]: 27808f4042c4396c +Block 0023 [ 69]: 46ed46f38dd41e57 +Block 0023 [ 70]: ecf63b28dbc424ca +Block 0023 [ 71]: d39f3e9fd8c74f10 +Block 0023 [ 72]: 09bc3876def81567 +Block 0023 [ 73]: 712a20a8ac895b22 +Block 0023 [ 74]: 4d4110dc7b315e87 +Block 0023 [ 75]: 5ca2290813579508 +Block 0023 [ 76]: ca993d8a3e8fe80b +Block 0023 [ 77]: 8fa2d7afd58c99fb +Block 0023 [ 78]: 871df3e6bdd85cf8 +Block 0023 [ 79]: bd87aa5c46bcd0a5 +Block 0023 [ 80]: 29bc11f4b6940ae4 +Block 0023 [ 81]: 0f0cc784b683f458 +Block 0023 [ 82]: 3173391b65289758 +Block 0023 [ 83]: 80b49ee12ff0ea70 +Block 0023 [ 84]: ad29a311a9ac5e0c +Block 0023 [ 85]: fa4bce3853385cfd +Block 0023 [ 86]: 5ba5787462f7a889 +Block 0023 [ 87]: 8f881e91d93bb917 +Block 0023 [ 88]: 44e7b45101b23012 +Block 0023 [ 89]: 3700c0182238d7e7 +Block 0023 [ 90]: 25b2fcddc913a952 +Block 0023 [ 91]: b6187c757f862577 +Block 0023 [ 92]: 6fd30e484383d75d +Block 0023 [ 93]: 12e9bb3086090629 +Block 0023 [ 94]: 2d5019d6344d9351 +Block 0023 [ 95]: 4c5fc7108e6c87b3 +Block 0023 [ 96]: 16b1525a3b280956 +Block 0023 [ 97]: 98987e0229057d3d +Block 0023 [ 98]: fd8b47ca62cafec7 +Block 0023 [ 99]: 69fd38fae9a7c741 +Block 0023 [100]: 8c2e4f14813d552b +Block 0023 [101]: 2e9a7c9a55d324ff +Block 0023 [102]: 9b345c3bcbefe217 +Block 0023 [103]: 52962171fbaea0b7 +Block 0023 [104]: 856e0e7ac867e1ac +Block 0023 [105]: c0ebd9d4b59f5031 +Block 0023 [106]: eb5c94df7be654d7 +Block 0023 [107]: 0725acfb389c822e +Block 0023 [108]: 2ae46cf5dc01fb3d +Block 0023 [109]: 4c8c87d24c4c396d +Block 0023 [110]: 8e37af365f796e24 +Block 0023 [111]: cb454318ca6dd824 +Block 0023 [112]: 6669edae28765b15 +Block 0023 [113]: ecc90a6c75263179 +Block 0023 [114]: 91ae80ee00e213b2 +Block 0023 [115]: e4f6ae47598bd7c8 +Block 0023 [116]: d4d306030ee62936 +Block 0023 [117]: 7caa0f1a1bbb26ed +Block 0023 [118]: 2ae6972e42774638 +Block 0023 [119]: 4ecaf984d41d9d63 +Block 0023 [120]: 2d6aab1800387fb6 +Block 0023 [121]: 0a7a2961cc0f0e8c +Block 0023 [122]: 46e5b112f06ad739 +Block 0023 [123]: 44c5ad17398f4bc0 +Block 0023 [124]: 64be1d1b9194f92e +Block 0023 [125]: 3046768d16c6d93f +Block 0023 [126]: 59ac6bb60f2c9c85 +Block 0023 [127]: 95595e52b7f2152f +Block 0024 [ 0]: 421df20d08fd899e +Block 0024 [ 1]: 06490f067ca5f4c0 +Block 0024 [ 2]: 4b7bab14d2317386 +Block 0024 [ 3]: 928cb31a919ac9e0 +Block 0024 [ 4]: 8eeb69c9bf35ca26 +Block 0024 [ 5]: 3b871b2affbf59cb +Block 0024 [ 6]: 9a44775f57d70b0c +Block 0024 [ 7]: d1753e76fd4cd2f5 +Block 0024 [ 8]: 23beccd32f5a538c +Block 0024 [ 9]: 26cb1bfdc1bfe467 +Block 0024 [ 10]: d27541618bf4a7a7 +Block 0024 [ 11]: 0aa0a42080544478 +Block 0024 [ 12]: bc8f20da1a6e40e4 +Block 0024 [ 13]: e875b5a98a112900 +Block 0024 [ 14]: ca61219887cb4959 +Block 0024 [ 15]: e2493c2da5dc45cc +Block 0024 [ 16]: 376be64ae523a96d +Block 0024 [ 17]: bc26c2991a963b5d +Block 0024 [ 18]: d507fa831eb0b11c +Block 0024 [ 19]: cbb1fae2e8a7724d +Block 0024 [ 20]: 0d57265e72b6fcaf +Block 0024 [ 21]: 57bda72893b0ba2c +Block 0024 [ 22]: b1dfd60192386ed2 +Block 0024 [ 23]: dcfe908cf1bed33c +Block 0024 [ 24]: 3cf2ae1e6ba2f37b +Block 0024 [ 25]: c26c60ad1b72cec6 +Block 0024 [ 26]: 227b729e4be43c89 +Block 0024 [ 27]: f1698cc673f4b33d +Block 0024 [ 28]: 6d6a36ee935bd1be +Block 0024 [ 29]: e044d40fe77c96fd +Block 0024 [ 30]: 51f025fc9570d3b1 +Block 0024 [ 31]: 9047ccdcadfba8f3 +Block 0024 [ 32]: 4fbfd7f34c1fc530 +Block 0024 [ 33]: a21db2877a70cffe +Block 0024 [ 34]: 6779dd725caffcfa +Block 0024 [ 35]: abd46d03ab30e7e8 +Block 0024 [ 36]: 3df9ce3d3f9b8d77 +Block 0024 [ 37]: 79c4e82b1d66f2b2 +Block 0024 [ 38]: f6e56a9befd85521 +Block 0024 [ 39]: 63effa4aac8c722f +Block 0024 [ 40]: 5d95c78b470b652b +Block 0024 [ 41]: 0d49b3bd5c53de96 +Block 0024 [ 42]: 677fdc7ac25e2963 +Block 0024 [ 43]: 64cf061a259c532e +Block 0024 [ 44]: 2f9da934b23e75a0 +Block 0024 [ 45]: b8889059afbcd633 +Block 0024 [ 46]: 87268a47bdacb91a +Block 0024 [ 47]: bdd1d344a00442ce +Block 0024 [ 48]: ed2fb8fcfcccfd0f +Block 0024 [ 49]: 9702e80222aaa0a2 +Block 0024 [ 50]: b59fd3607c6f4a99 +Block 0024 [ 51]: b5a3abe17118d3f5 +Block 0024 [ 52]: b36e4548145308e8 +Block 0024 [ 53]: 9f58a90d739baeb2 +Block 0024 [ 54]: 949e5504da615608 +Block 0024 [ 55]: 8be00e3ae5fe9cae +Block 0024 [ 56]: 32c6269ff1f417d3 +Block 0024 [ 57]: a0fd7a40f50436bc +Block 0024 [ 58]: 804eddf125b05db8 +Block 0024 [ 59]: e412fa3b09805e30 +Block 0024 [ 60]: ee38f256fefee213 +Block 0024 [ 61]: 4700102c10caca7b +Block 0024 [ 62]: 7c72c70089dfa961 +Block 0024 [ 63]: bab72c9336d9b835 +Block 0024 [ 64]: 2146a5760b289949 +Block 0024 [ 65]: 9d3846479be2a556 +Block 0024 [ 66]: 6a81e0b707146bbc +Block 0024 [ 67]: 7648f0711580ddfe +Block 0024 [ 68]: aab8aee50021b344 +Block 0024 [ 69]: 38f296313d23ec72 +Block 0024 [ 70]: 04b4905eaec03ac5 +Block 0024 [ 71]: fe0f55aaeb91559f +Block 0024 [ 72]: 5fb453a232b4a989 +Block 0024 [ 73]: daa1ab85149235e2 +Block 0024 [ 74]: c825ee74fa3cfa1b +Block 0024 [ 75]: 6113b7f6fa3aa5fa +Block 0024 [ 76]: 9f3e6aea3b3be4d5 +Block 0024 [ 77]: f7d471f5f8ae3ce3 +Block 0024 [ 78]: c68f97bfab689e30 +Block 0024 [ 79]: b7c234060a797abf +Block 0024 [ 80]: 6041520f55b95a30 +Block 0024 [ 81]: 56ea11838e34faab +Block 0024 [ 82]: e2fa113ac34a4e76 +Block 0024 [ 83]: 952a842f6f1f0ea6 +Block 0024 [ 84]: 2bcdfb5279443993 +Block 0024 [ 85]: 10946fdd29e96316 +Block 0024 [ 86]: 5f908e7a28f81708 +Block 0024 [ 87]: d289b647f332fbe9 +Block 0024 [ 88]: f16d8e959f359c08 +Block 0024 [ 89]: 18601d046daf6b9f +Block 0024 [ 90]: 66214e8c17b7a365 +Block 0024 [ 91]: c6c7b0aeef79013c +Block 0024 [ 92]: dc20cc64d5a79a4c +Block 0024 [ 93]: 5187e9a6ff899eb1 +Block 0024 [ 94]: 730cac806359e63c +Block 0024 [ 95]: 9691bae04c4bbd94 +Block 0024 [ 96]: 0fa7b3a871abe79d +Block 0024 [ 97]: b3a3883ad7a4e928 +Block 0024 [ 98]: f1b2d895589851d8 +Block 0024 [ 99]: 6f905a6249a50eae +Block 0024 [100]: 4cf1840c45bca0d9 +Block 0024 [101]: 782e7ffb69c668aa +Block 0024 [102]: fe55c440f0227790 +Block 0024 [103]: dec111756b979cbc +Block 0024 [104]: 9e1621f10dc6142e +Block 0024 [105]: af92a355e0758599 +Block 0024 [106]: 1f85ba4b4b00884b +Block 0024 [107]: aff87e8f36e044cf +Block 0024 [108]: 87667d6990985f08 +Block 0024 [109]: 5e7d62dd0e2b654a +Block 0024 [110]: 984eeff01ce256d9 +Block 0024 [111]: 5d76c092a79bca15 +Block 0024 [112]: cb2ff31e3e9de68d +Block 0024 [113]: a4a6cc101833f846 +Block 0024 [114]: 0eeb05c1eac92920 +Block 0024 [115]: 3795d878dfbaaa3c +Block 0024 [116]: a363bb42a0bf4fd4 +Block 0024 [117]: 212c42d91a79e145 +Block 0024 [118]: 844305ca7ebe404e +Block 0024 [119]: c23c2a10a961d67c +Block 0024 [120]: 2038404d2ceadec9 +Block 0024 [121]: 71f48b5bff5b4c03 +Block 0024 [122]: 00d97ddde74a8b18 +Block 0024 [123]: d4a629a0f481c37b +Block 0024 [124]: a31ac02725842396 +Block 0024 [125]: 26c90ede186fd85f +Block 0024 [126]: 32d3c3f0385d16a2 +Block 0024 [127]: a58053f744dc93ad +Block 0025 [ 0]: 75e219ce652f9e9b +Block 0025 [ 1]: 5192d14a2c29f461 +Block 0025 [ 2]: ecadcc07806d90a7 +Block 0025 [ 3]: cb8f9debaf8159b8 +Block 0025 [ 4]: 922fd6b8cb6a2641 +Block 0025 [ 5]: fc1677aa64a158b1 +Block 0025 [ 6]: 0c24c2820ef42f14 +Block 0025 [ 7]: b3cd3deb0443f694 +Block 0025 [ 8]: 52b0ac996c835048 +Block 0025 [ 9]: 7b69b5d070589932 +Block 0025 [ 10]: 0381d9fcdb0803a1 +Block 0025 [ 11]: d7cf49bf4207a833 +Block 0025 [ 12]: 64bc64f604b3f54e +Block 0025 [ 13]: b37bfc379b820700 +Block 0025 [ 14]: f6fcf8867e9ed30a +Block 0025 [ 15]: 2cf52fe2e641e6cd +Block 0025 [ 16]: d9b5d1d957265528 +Block 0025 [ 17]: 456c76fd493723d9 +Block 0025 [ 18]: d09ec25592ba65e1 +Block 0025 [ 19]: 74ead8f490ea2724 +Block 0025 [ 20]: 1fcd94f345103418 +Block 0025 [ 21]: 28191af193f3b4a8 +Block 0025 [ 22]: 00ba309bea6bc75e +Block 0025 [ 23]: f820f928e042b770 +Block 0025 [ 24]: 0096864fb4a6195a +Block 0025 [ 25]: 1deb4dd4d925fc05 +Block 0025 [ 26]: 28e822e800e1f326 +Block 0025 [ 27]: 8a9e61f3ff3536f6 +Block 0025 [ 28]: 7bd53608d022cc05 +Block 0025 [ 29]: dc1da98bfbf23a80 +Block 0025 [ 30]: 335ec2757c72f04a +Block 0025 [ 31]: c699727d298109d9 +Block 0025 [ 32]: 5c4f4efb6a24011c +Block 0025 [ 33]: 45abc8326a1c11a6 +Block 0025 [ 34]: ea1ec080a5afa957 +Block 0025 [ 35]: c710f53a3016e4cf +Block 0025 [ 36]: 48bc8eae571960ee +Block 0025 [ 37]: 9717942f28632927 +Block 0025 [ 38]: baefc76649ee961b +Block 0025 [ 39]: 913d6a3d5cbebe92 +Block 0025 [ 40]: 3d486447ff8cdeb9 +Block 0025 [ 41]: 738e311c3606c310 +Block 0025 [ 42]: 752814a9b8a98007 +Block 0025 [ 43]: ea80a6739c87925e +Block 0025 [ 44]: d05607c48043b531 +Block 0025 [ 45]: 4e8077320bcb121a +Block 0025 [ 46]: db134a8b3ce51f86 +Block 0025 [ 47]: a3b62a8db4d931cb +Block 0025 [ 48]: 479838f512a07a3c +Block 0025 [ 49]: ad416f96a9c1dc62 +Block 0025 [ 50]: 2ce8d6c41e022354 +Block 0025 [ 51]: 02e88e689bb3c9bc +Block 0025 [ 52]: 4c4fa4dfd77f1efc +Block 0025 [ 53]: e481206da484d670 +Block 0025 [ 54]: 43a91e27c52cb0de +Block 0025 [ 55]: 9a3863141390c605 +Block 0025 [ 56]: db07004e00d8628d +Block 0025 [ 57]: b05ad69ed0d8db58 +Block 0025 [ 58]: aa78c6f41ae31f4c +Block 0025 [ 59]: 372bc9ff8debf9a9 +Block 0025 [ 60]: 832af3443b613cd2 +Block 0025 [ 61]: 10176ea29c715def +Block 0025 [ 62]: f1ae3f51da186219 +Block 0025 [ 63]: eb93e663b63849a0 +Block 0025 [ 64]: 0a10808e97df2cc8 +Block 0025 [ 65]: 0a8b16edfe0a46d6 +Block 0025 [ 66]: 25ee9dabd8559f47 +Block 0025 [ 67]: aae095f6613e07f8 +Block 0025 [ 68]: 6dee9a39650d583a +Block 0025 [ 69]: c8da4f9ba5efc464 +Block 0025 [ 70]: 2057651e6272cecf +Block 0025 [ 71]: 5bcf7937a601500b +Block 0025 [ 72]: 8c3097be523605ec +Block 0025 [ 73]: 12008ec70fc55a6b +Block 0025 [ 74]: 1dc40873a708a3a0 +Block 0025 [ 75]: 8550840bfb0b2a74 +Block 0025 [ 76]: 71b76f86ed93b236 +Block 0025 [ 77]: ada3b0d78299d2f3 +Block 0025 [ 78]: 196bbca1dd53c6ba +Block 0025 [ 79]: 25ae9a9b7a909ffd +Block 0025 [ 80]: 8332bc00f837a920 +Block 0025 [ 81]: bb13e06b3dcd6274 +Block 0025 [ 82]: 724e07a3c76bdcd3 +Block 0025 [ 83]: c11a941aa4678ac6 +Block 0025 [ 84]: d69d1f13fabb164e +Block 0025 [ 85]: 2d518e00e58c92ea +Block 0025 [ 86]: 698ecf7437bf07dc +Block 0025 [ 87]: c5758b279f98a217 +Block 0025 [ 88]: 4ace1d8069fb04c7 +Block 0025 [ 89]: 3a6848ca135c48a1 +Block 0025 [ 90]: 1284342c28b552e4 +Block 0025 [ 91]: a7bf09a8fb448bce +Block 0025 [ 92]: 23652822eef77d5b +Block 0025 [ 93]: ede7aa7d9975c43e +Block 0025 [ 94]: ec8d6127d93a7b37 +Block 0025 [ 95]: 38f50b3d0f17f5c9 +Block 0025 [ 96]: 91a10d4b7fe9f30b +Block 0025 [ 97]: 63112ee0f40a6241 +Block 0025 [ 98]: fad7e72daa8ad18d +Block 0025 [ 99]: 07e0f4d64d5744cc +Block 0025 [100]: aafbd22997d5cb7c +Block 0025 [101]: 76e6e220725528df +Block 0025 [102]: d540860ca129a3d4 +Block 0025 [103]: c652f20d7f2dafc6 +Block 0025 [104]: 39619c788de5f720 +Block 0025 [105]: b1153fbf6bc05c68 +Block 0025 [106]: 7936d6405a7745b0 +Block 0025 [107]: 69e1ea5b7dddab89 +Block 0025 [108]: a535615b5285f419 +Block 0025 [109]: c7039ed18206a233 +Block 0025 [110]: 0edf3cf1262dcd26 +Block 0025 [111]: 1f0b4499b2b9e8b2 +Block 0025 [112]: 671bed1ce2de5052 +Block 0025 [113]: 0e8b79824c58ca80 +Block 0025 [114]: 874458d3d760dd5a +Block 0025 [115]: 249f129d67cf59a5 +Block 0025 [116]: bc6962f83ec41f7d +Block 0025 [117]: 3b5b2bf5dbba3f76 +Block 0025 [118]: bc3213efa967e1e2 +Block 0025 [119]: 6a9208a3b0e96a13 +Block 0025 [120]: 4cc594a949c15018 +Block 0025 [121]: edc4f2d74b9ed106 +Block 0025 [122]: 17189edb9d25be84 +Block 0025 [123]: 335cacc975861bdb +Block 0025 [124]: 4e40d19267f33144 +Block 0025 [125]: fe8b5e16f077d4dd +Block 0025 [126]: eef70082d8d8ca4d +Block 0025 [127]: 0e35a18383368440 +Block 0026 [ 0]: f5fb505370677e73 +Block 0026 [ 1]: 3d8aab3e00026248 +Block 0026 [ 2]: 039ea2f2dc076a2b +Block 0026 [ 3]: 39c8d87ab919d22d +Block 0026 [ 4]: 5e4289e8494d7e21 +Block 0026 [ 5]: b62799988c90ffa4 +Block 0026 [ 6]: e4bbf6d54ec025a4 +Block 0026 [ 7]: d4906bcf299eb95f +Block 0026 [ 8]: 65430d2f59e217cf +Block 0026 [ 9]: 82d0ebd6510efa74 +Block 0026 [ 10]: 7631d5fc46073cb9 +Block 0026 [ 11]: 37293f77752fbc98 +Block 0026 [ 12]: cce2024931226a4e +Block 0026 [ 13]: 0b3e54fd2ae0b3ce +Block 0026 [ 14]: 35e2af0be586cf66 +Block 0026 [ 15]: f94a5a46a427b24c +Block 0026 [ 16]: 4030eb43a50f4bc6 +Block 0026 [ 17]: e5e817c211ffd536 +Block 0026 [ 18]: ce4d39f262d8906f +Block 0026 [ 19]: e109bca81d06ea97 +Block 0026 [ 20]: a52c2ea963311247 +Block 0026 [ 21]: ea1050b3679d3f68 +Block 0026 [ 22]: c9dae9c84e36b885 +Block 0026 [ 23]: 1e6a0ef172a58c1f +Block 0026 [ 24]: a1cdd2e6d157f211 +Block 0026 [ 25]: c2b28b17582588b2 +Block 0026 [ 26]: a2269ef1361a34d1 +Block 0026 [ 27]: 6f4108d0009a0a4a +Block 0026 [ 28]: 67e945bdf88e3a45 +Block 0026 [ 29]: 2734e1edf6b6d1ff +Block 0026 [ 30]: 64003857fe488908 +Block 0026 [ 31]: 23097d34ae04fdaa +Block 0026 [ 32]: 9f0ea9d7bac5f1ee +Block 0026 [ 33]: 16f9ff9a693423f8 +Block 0026 [ 34]: e8d94b5ad2280a5d +Block 0026 [ 35]: e08e8d1fddc32380 +Block 0026 [ 36]: a1ac08a8060bcaab +Block 0026 [ 37]: 437c08cbae28e67f +Block 0026 [ 38]: 3d269e57e32cecd0 +Block 0026 [ 39]: 8337155690848c62 +Block 0026 [ 40]: a868cc5d9c97cc04 +Block 0026 [ 41]: 9f719a13b79ba555 +Block 0026 [ 42]: c06df5e22c349b6d +Block 0026 [ 43]: 8fcbaad237433b6a +Block 0026 [ 44]: fc34c1b9d2bdd5f4 +Block 0026 [ 45]: b9bb08869920d24b +Block 0026 [ 46]: baf85dcd7f37fa00 +Block 0026 [ 47]: 35a40e91760a75c1 +Block 0026 [ 48]: 6e93320f5d477425 +Block 0026 [ 49]: 826a134a9801cb0b +Block 0026 [ 50]: 910033d07a75c521 +Block 0026 [ 51]: 755b3bc8251407db +Block 0026 [ 52]: 8dd64b25a605b6b8 +Block 0026 [ 53]: b950fbb99e155c2b +Block 0026 [ 54]: e87b27b31068f5b0 +Block 0026 [ 55]: ba423858cdff8905 +Block 0026 [ 56]: 642636c58acba031 +Block 0026 [ 57]: 017a0449dd896efd +Block 0026 [ 58]: 7620fc91870c63e7 +Block 0026 [ 59]: 3b757db72cc7c3e0 +Block 0026 [ 60]: 52c6505f35dea770 +Block 0026 [ 61]: bd6ed47f26715259 +Block 0026 [ 62]: f0d6f2d380f155fd +Block 0026 [ 63]: c6c8518a64cac880 +Block 0026 [ 64]: 53f09f11d506562c +Block 0026 [ 65]: c51aac6790e918c7 +Block 0026 [ 66]: 93a2ca9a510fb338 +Block 0026 [ 67]: f4974aa31138dd1f +Block 0026 [ 68]: ea548f592104df60 +Block 0026 [ 69]: d099d955bc104c10 +Block 0026 [ 70]: 8feaf5ad3acbeead +Block 0026 [ 71]: d774bca52aa40db1 +Block 0026 [ 72]: 631b8c8e5206ef96 +Block 0026 [ 73]: c2467f34313a2f1a +Block 0026 [ 74]: fbe46c13ef4734a9 +Block 0026 [ 75]: 84277835d9d323b2 +Block 0026 [ 76]: 2e4d98f1a671683d +Block 0026 [ 77]: e86bcdfafe1c9704 +Block 0026 [ 78]: 858d689f5447874c +Block 0026 [ 79]: 34c11778bae7a605 +Block 0026 [ 80]: c63373727a5b4951 +Block 0026 [ 81]: 2b6ee36647dbeab0 +Block 0026 [ 82]: 593c1210e15b9a2e +Block 0026 [ 83]: 7cbabf2d6a7f60dd +Block 0026 [ 84]: f6286c13a4054115 +Block 0026 [ 85]: d504d66401d19f08 +Block 0026 [ 86]: 4377a456061e4ba4 +Block 0026 [ 87]: bedc6a171c2c9f7d +Block 0026 [ 88]: daaa4c2b70e89d78 +Block 0026 [ 89]: b43f52f216b02a80 +Block 0026 [ 90]: b5938ee138c6bc1c +Block 0026 [ 91]: 0877679273c8f0c6 +Block 0026 [ 92]: f6fe77bd04c9e7a1 +Block 0026 [ 93]: 851cbda45a28add1 +Block 0026 [ 94]: 5fe2bc3b7c34160f +Block 0026 [ 95]: 7e04cfbb08fbfec3 +Block 0026 [ 96]: 560e3def15d51f49 +Block 0026 [ 97]: aa9dd5cd812de83c +Block 0026 [ 98]: fb96e9ac7eb362fb +Block 0026 [ 99]: 77a97e7fe8461cc4 +Block 0026 [100]: 49d6ef7afeabf9df +Block 0026 [101]: 2db33b3eab3c3e74 +Block 0026 [102]: 22ee497b98aff5a0 +Block 0026 [103]: daa8c64262e0e084 +Block 0026 [104]: ac2047b2a642b5f6 +Block 0026 [105]: c6a1bdbe1afafe7a +Block 0026 [106]: 40cc38524f5589f7 +Block 0026 [107]: 981613d268c3c78f +Block 0026 [108]: 9db3258cd0588b72 +Block 0026 [109]: ec987d516209c1d3 +Block 0026 [110]: e186f53aa49c1c16 +Block 0026 [111]: e21f193c314f6914 +Block 0026 [112]: 8b8f04c5e30d6a65 +Block 0026 [113]: 32f0379b3e282763 +Block 0026 [114]: 74611ed89926c85b +Block 0026 [115]: 82cb876074150f22 +Block 0026 [116]: b4e8636aa8d530e4 +Block 0026 [117]: 98c5cb9f36e3ca0e +Block 0026 [118]: 562de3e3a60b6377 +Block 0026 [119]: 6a9abbd609e9a77b +Block 0026 [120]: 963e356cec311d7b +Block 0026 [121]: 7075034174072426 +Block 0026 [122]: f58b94caf83bbb5c +Block 0026 [123]: 3d6e98f918fc35fc +Block 0026 [124]: c5408b21805a47a6 +Block 0026 [125]: b708ec7ca7019412 +Block 0026 [126]: b092d3938ed92f30 +Block 0026 [127]: cff8bf31a57540ef +Block 0027 [ 0]: 3833936ed309a40e +Block 0027 [ 1]: aa12aa94d9454a14 +Block 0027 [ 2]: 72c4a5b5e0eeb799 +Block 0027 [ 3]: 4024ffdb54eef730 +Block 0027 [ 4]: cd7bf4160fba3fff +Block 0027 [ 5]: 167d04d9139c38c7 +Block 0027 [ 6]: 570f0841b540745e +Block 0027 [ 7]: af34a7133cd2a7eb +Block 0027 [ 8]: 8e02eb212ba5d1e4 +Block 0027 [ 9]: 84756a529a924066 +Block 0027 [ 10]: fe2a7294d8395683 +Block 0027 [ 11]: 227ea6f39aa2db15 +Block 0027 [ 12]: 35891d0ffa4e156f +Block 0027 [ 13]: 73602a9a8749e196 +Block 0027 [ 14]: 4a85f3a4d4d8da72 +Block 0027 [ 15]: 334564cd39f78db5 +Block 0027 [ 16]: bb50ff365ec10d5b +Block 0027 [ 17]: 15af66399cd11253 +Block 0027 [ 18]: a7cf019ed9b1246b +Block 0027 [ 19]: fe94c3e001243205 +Block 0027 [ 20]: 9778185b3cad932f +Block 0027 [ 21]: 7f1bd55772064b0b +Block 0027 [ 22]: 9e13e24cbfc382ca +Block 0027 [ 23]: dbd4d1bbc191d0f7 +Block 0027 [ 24]: 7dd89184bbe49fd5 +Block 0027 [ 25]: 5af27c9e566eac9c +Block 0027 [ 26]: ed57cf89c8c5f4a7 +Block 0027 [ 27]: 836c0c093002e5f3 +Block 0027 [ 28]: dff3d9f1eb535dc4 +Block 0027 [ 29]: 327d67fc2049f8fb +Block 0027 [ 30]: 605fd14694fa9449 +Block 0027 [ 31]: 66822ee641a6ca0c +Block 0027 [ 32]: bc7c177b547a9299 +Block 0027 [ 33]: b228d67439803c1d +Block 0027 [ 34]: e80660f6a38d8930 +Block 0027 [ 35]: 48465638b515839e +Block 0027 [ 36]: f59aa28a2b5dfb4d +Block 0027 [ 37]: 451ed876660c6810 +Block 0027 [ 38]: 29ebbdcc493a13e4 +Block 0027 [ 39]: 9ad95963564f5e59 +Block 0027 [ 40]: d9f513c58466e6e4 +Block 0027 [ 41]: e8502393e51b4216 +Block 0027 [ 42]: 55410a20946569e7 +Block 0027 [ 43]: ac2e16e37e14263e +Block 0027 [ 44]: 8cc37d82b6dd99d5 +Block 0027 [ 45]: 018bb84f0209f5ce +Block 0027 [ 46]: af3e3d76394cb3e7 +Block 0027 [ 47]: ab519dd479103c56 +Block 0027 [ 48]: ec37868d55b82a51 +Block 0027 [ 49]: 0bd60f8790e408f8 +Block 0027 [ 50]: ca67177c3f31c96b +Block 0027 [ 51]: f6b20d690e55b321 +Block 0027 [ 52]: cb607a912230f0eb +Block 0027 [ 53]: 7c7c06a2d370ef3b +Block 0027 [ 54]: a5398513af3fed38 +Block 0027 [ 55]: a8e6ec3c16cda63f +Block 0027 [ 56]: a7288864d44f667b +Block 0027 [ 57]: 360e196a67d37b9e +Block 0027 [ 58]: ec06a0c378b7b1cc +Block 0027 [ 59]: f826d0f0aca8de3d +Block 0027 [ 60]: c8d1345bd495ce06 +Block 0027 [ 61]: c8cb738599268128 +Block 0027 [ 62]: 0f077e43a8105e05 +Block 0027 [ 63]: 5949111094f84982 +Block 0027 [ 64]: caab31a8dce41c8e +Block 0027 [ 65]: 14ec39b16f79a72c +Block 0027 [ 66]: 30f52ced8af85cbf +Block 0027 [ 67]: e7ecff9e0e0e5770 +Block 0027 [ 68]: bade9fd9644f14fc +Block 0027 [ 69]: f070e6746d4f632b +Block 0027 [ 70]: 928f8d1f8a137183 +Block 0027 [ 71]: fa7d998ddba748bb +Block 0027 [ 72]: 844b46d51416c7d8 +Block 0027 [ 73]: a8ce3dccbf849300 +Block 0027 [ 74]: 40b5bf59fac37079 +Block 0027 [ 75]: e693d904e51eef2d +Block 0027 [ 76]: 90fef2b130484972 +Block 0027 [ 77]: ad5b43c0ad1315fb +Block 0027 [ 78]: f5c51886d9fd50ee +Block 0027 [ 79]: 804c2aa34fba3aee +Block 0027 [ 80]: 4108d414e6218b42 +Block 0027 [ 81]: a055d4fb2e34d89f +Block 0027 [ 82]: d2341e113762009e +Block 0027 [ 83]: b0fc9752a454da10 +Block 0027 [ 84]: d1288c476704b25b +Block 0027 [ 85]: d3c4c572d91465ac +Block 0027 [ 86]: 2f8069a8289e7aca +Block 0027 [ 87]: 71f3b6a4b26995d6 +Block 0027 [ 88]: 4441ff6c4000ce3c +Block 0027 [ 89]: d3c96f999b30851e +Block 0027 [ 90]: 009122df0b16cfdf +Block 0027 [ 91]: bcdd32311dca65de +Block 0027 [ 92]: d1eb48772ad5d526 +Block 0027 [ 93]: 23906d56ebf95940 +Block 0027 [ 94]: 3d320da7906f09ca +Block 0027 [ 95]: 806162060635d7cf +Block 0027 [ 96]: a65c264228f152ef +Block 0027 [ 97]: 8402f96b258bbb89 +Block 0027 [ 98]: 49a04047c237edd3 +Block 0027 [ 99]: 3042a8a4678be559 +Block 0027 [100]: d3f7d3340ec80df8 +Block 0027 [101]: 1d17540fc5c633d1 +Block 0027 [102]: 4ad144abcec46b9c +Block 0027 [103]: 3a6805112b3af97e +Block 0027 [104]: a6772ba931271c65 +Block 0027 [105]: 24807675ebbd48e4 +Block 0027 [106]: d58fbed9e7350632 +Block 0027 [107]: 52454dc82c274360 +Block 0027 [108]: b12793e27b3e12f6 +Block 0027 [109]: 9269abbd3d9d1ae1 +Block 0027 [110]: 7b980387ddcb0e90 +Block 0027 [111]: 3338569394aa1806 +Block 0027 [112]: 1c985037c4308c4c +Block 0027 [113]: 3740dd5683d775d5 +Block 0027 [114]: acec65817bd7ba6c +Block 0027 [115]: 41ab62f1c98e3bfb +Block 0027 [116]: 973525758db70ade +Block 0027 [117]: d8d9076c0fe5513b +Block 0027 [118]: b9dda9b5d7a00cc6 +Block 0027 [119]: 85c1543f46708ec5 +Block 0027 [120]: 72bd1954fc92405c +Block 0027 [121]: 00f76076b61ace34 +Block 0027 [122]: a98d6335766bf76f +Block 0027 [123]: 1fbd089ee7c6f748 +Block 0027 [124]: 10136fb34cf6aaa2 +Block 0027 [125]: 50c5846e44fbc975 +Block 0027 [126]: 977ddbb793a83311 +Block 0027 [127]: d501160dda0add24 +Block 0028 [ 0]: b3f74da78e4bb4d1 +Block 0028 [ 1]: 0068b2500f8b2107 +Block 0028 [ 2]: acf96291acfb9feb +Block 0028 [ 3]: 43200819c384e18f +Block 0028 [ 4]: 54dccb52bc0ed9d4 +Block 0028 [ 5]: dd7d449eb8389b6d +Block 0028 [ 6]: 4c47575882bed005 +Block 0028 [ 7]: dccf5ec02f7b653e +Block 0028 [ 8]: 81d84bb23c0c4d99 +Block 0028 [ 9]: 3cc8ff7f6b1670dc +Block 0028 [ 10]: eb5447dc01331f1b +Block 0028 [ 11]: e6c5f694f1638081 +Block 0028 [ 12]: 5cfa9e9831bfd598 +Block 0028 [ 13]: 2cf881d2dfb3bb2e +Block 0028 [ 14]: 6e80b12a71cdf77b +Block 0028 [ 15]: 8379ddd89673f35e +Block 0028 [ 16]: ce5154ab9a574b72 +Block 0028 [ 17]: 41ea66748e335062 +Block 0028 [ 18]: 657679fce01a5d7d +Block 0028 [ 19]: 3896c88c2e5baabc +Block 0028 [ 20]: 315589187590cf3d +Block 0028 [ 21]: 0d39974eeae411ab +Block 0028 [ 22]: 84d402703dbdb892 +Block 0028 [ 23]: ba96e74e1919a832 +Block 0028 [ 24]: 30b7a76e90011125 +Block 0028 [ 25]: 28f312dc69ad2ffb +Block 0028 [ 26]: 81700effa6f96864 +Block 0028 [ 27]: 92c92ea93e3095e2 +Block 0028 [ 28]: 371c9bd565a0debc +Block 0028 [ 29]: f9337cdf06c282f3 +Block 0028 [ 30]: 27217fa566a5bbce +Block 0028 [ 31]: 10c312681c3491c5 +Block 0028 [ 32]: e7cdf437453ca28d +Block 0028 [ 33]: 4530c7ee1fd2677a +Block 0028 [ 34]: d16c39d8950b1db1 +Block 0028 [ 35]: 5ee3b113a97369c0 +Block 0028 [ 36]: f96a3796450f218d +Block 0028 [ 37]: 9dbbf0bbb9c7affc +Block 0028 [ 38]: 9367894b04cb7525 +Block 0028 [ 39]: 63d505005ca97afc +Block 0028 [ 40]: 755fba7c0546dab4 +Block 0028 [ 41]: 2c94e4f1ea898b9f +Block 0028 [ 42]: aaa9b9248181e1c3 +Block 0028 [ 43]: ba827f64a01f2b84 +Block 0028 [ 44]: 36e310230e22e0cf +Block 0028 [ 45]: d76f7cb6c31c910f +Block 0028 [ 46]: 7f55c08ca24c175f +Block 0028 [ 47]: 70d59843f362422b +Block 0028 [ 48]: fb2cc00b52176c97 +Block 0028 [ 49]: 9e91c272a354ccf9 +Block 0028 [ 50]: fedfa3bbfd084038 +Block 0028 [ 51]: 66c268e3d3471545 +Block 0028 [ 52]: cdcd7168925ae4eb +Block 0028 [ 53]: 1816c7d21f19a754 +Block 0028 [ 54]: 9e3100dd7798b55f +Block 0028 [ 55]: da2ef9205dcf4b82 +Block 0028 [ 56]: 372619bb220cf87c +Block 0028 [ 57]: 22a4413ecb6e4f99 +Block 0028 [ 58]: 03717cf0bfe1503d +Block 0028 [ 59]: 3caaa69489d9b6fb +Block 0028 [ 60]: cb98f0775973e3df +Block 0028 [ 61]: 1d888ba44c947535 +Block 0028 [ 62]: fc0d0ddb3ec24d7b +Block 0028 [ 63]: 1bc085ba44559e11 +Block 0028 [ 64]: 8953975b8539d843 +Block 0028 [ 65]: f96aea013628b82c +Block 0028 [ 66]: b419370dd5c74690 +Block 0028 [ 67]: fb6c6aa70aee9799 +Block 0028 [ 68]: 85c3aaeb348e6555 +Block 0028 [ 69]: 59dc27ad4cb80f88 +Block 0028 [ 70]: ed7afeffdf385af3 +Block 0028 [ 71]: 0f0dfd4dc6230c52 +Block 0028 [ 72]: 4636832c11781396 +Block 0028 [ 73]: 2c33a5a47579ca10 +Block 0028 [ 74]: ad88de9061a25e88 +Block 0028 [ 75]: d1224222eeedd591 +Block 0028 [ 76]: 69bc46adc65fa8ad +Block 0028 [ 77]: 1ee3233180d64833 +Block 0028 [ 78]: 11948dbb66ed6a04 +Block 0028 [ 79]: 31488740e7c9662d +Block 0028 [ 80]: 16df31894039b685 +Block 0028 [ 81]: af4f60facedaede6 +Block 0028 [ 82]: d683f45a39bb4306 +Block 0028 [ 83]: 13c961bf8ba5a0ec +Block 0028 [ 84]: 03530369d1cf43d4 +Block 0028 [ 85]: 71d91b318967084c +Block 0028 [ 86]: 32274b144bac8237 +Block 0028 [ 87]: d6d8eaac469832c5 +Block 0028 [ 88]: 3fefc193c0e9bbae +Block 0028 [ 89]: 54c4d65a3dbc724e +Block 0028 [ 90]: 9f5f3ada21ba189f +Block 0028 [ 91]: c6f754427c4d6fbc +Block 0028 [ 92]: aa2578e45b353de0 +Block 0028 [ 93]: a189e64da4c5edee +Block 0028 [ 94]: d8925737d18ba6cf +Block 0028 [ 95]: 19e7541d4bb078e6 +Block 0028 [ 96]: 6257ce84db6a0585 +Block 0028 [ 97]: c28fd38e38d259f5 +Block 0028 [ 98]: 21e5bbd6bc911d42 +Block 0028 [ 99]: 9e7ff827f7a6aa0b +Block 0028 [100]: 87b9d2b325e2d51e +Block 0028 [101]: 063d74eb3465a8f1 +Block 0028 [102]: fa4ce27126d960c1 +Block 0028 [103]: 6cf8a01df2a65fb7 +Block 0028 [104]: d3dd5981fd75d786 +Block 0028 [105]: 1d2aeee33712ebd9 +Block 0028 [106]: aef7d538f83bd76a +Block 0028 [107]: bc930cdb8705578e +Block 0028 [108]: 7cadc7439eb2940a +Block 0028 [109]: 169745940d7e1948 +Block 0028 [110]: 7d8665a74288db3c +Block 0028 [111]: b748b1cd8d96ba2a +Block 0028 [112]: defaba3d0b9aec81 +Block 0028 [113]: 7a5caf35df223c73 +Block 0028 [114]: b4a74e84a51b11fa +Block 0028 [115]: ebf12950c6f34a6e +Block 0028 [116]: 05683a715cc17966 +Block 0028 [117]: df2e9871efcc643d +Block 0028 [118]: 1b66b82b99320384 +Block 0028 [119]: 997df1a8e8e9244a +Block 0028 [120]: 20263014f76f78e8 +Block 0028 [121]: 42769a9211f735e5 +Block 0028 [122]: e8cc76e32520ff1b +Block 0028 [123]: 0a9130ff5bb61092 +Block 0028 [124]: 1bac198c40fb6a57 +Block 0028 [125]: fa685df2fe727bb3 +Block 0028 [126]: b3e7bcfd42ffe2d7 +Block 0028 [127]: 66be499624073e2d +Block 0029 [ 0]: 1178d0480551dfc6 +Block 0029 [ 1]: 5187eed47212089f +Block 0029 [ 2]: 42898321caf5af34 +Block 0029 [ 3]: 1e0565d05fb9f254 +Block 0029 [ 4]: 68d1cf52778d2feb +Block 0029 [ 5]: 2fc1c91be6b25822 +Block 0029 [ 6]: 9e616744ca1cd585 +Block 0029 [ 7]: cb52d5be9e180b62 +Block 0029 [ 8]: ca2217ead26e1eab +Block 0029 [ 9]: 75f749c30dfb9fab +Block 0029 [ 10]: 7ee7fba56c86c33b +Block 0029 [ 11]: 6d5b689f4f800858 +Block 0029 [ 12]: 28a17498950b879a +Block 0029 [ 13]: cb81340219891240 +Block 0029 [ 14]: c273841814b1e916 +Block 0029 [ 15]: f1674554a51e9b34 +Block 0029 [ 16]: b8edcf4f61113467 +Block 0029 [ 17]: 4c9fed95227d3220 +Block 0029 [ 18]: ea2560287408d60b +Block 0029 [ 19]: 910e6ebd0d760e08 +Block 0029 [ 20]: 7249b66d9458152d +Block 0029 [ 21]: 5bbbafb398ebe2af +Block 0029 [ 22]: d14cca3302065ae9 +Block 0029 [ 23]: 2381a24f70d7461f +Block 0029 [ 24]: 4610f2b3c45aaa48 +Block 0029 [ 25]: 0770c2aafa948d59 +Block 0029 [ 26]: 4b88fdc8aa300ec9 +Block 0029 [ 27]: 8be083716fb9ec8a +Block 0029 [ 28]: 57fc57bbf62aea8f +Block 0029 [ 29]: bdfcd3491ba8f1ff +Block 0029 [ 30]: 0aeed63235663fd9 +Block 0029 [ 31]: 191012cb4aa161e1 +Block 0029 [ 32]: 60678d765589fd1d +Block 0029 [ 33]: 223281bdd84345cb +Block 0029 [ 34]: 1a3f94b2164cc584 +Block 0029 [ 35]: 15e66f71f0544969 +Block 0029 [ 36]: a1b51a96bf12eb48 +Block 0029 [ 37]: 8b0a8a65b688eb0d +Block 0029 [ 38]: 6b0b58dd2d36652a +Block 0029 [ 39]: e5539a59cfcdefe7 +Block 0029 [ 40]: f2008d87b7556a7c +Block 0029 [ 41]: 84110ef2f60a53ee +Block 0029 [ 42]: b733f4f75f4b849d +Block 0029 [ 43]: a47f8945a6faebc6 +Block 0029 [ 44]: 3d5d650d8bb93088 +Block 0029 [ 45]: f5fc955ad93ab98a +Block 0029 [ 46]: 8af341c08d45dee8 +Block 0029 [ 47]: 7d07c8d014e9163f +Block 0029 [ 48]: 887a2fca5f135987 +Block 0029 [ 49]: ab251174f76ad2b9 +Block 0029 [ 50]: 404602ca6bcd80df +Block 0029 [ 51]: b4c2749a49e85a7d +Block 0029 [ 52]: 0d5d67e561f20bf6 +Block 0029 [ 53]: 53db11a315a12a0f +Block 0029 [ 54]: d802cc1dd33b595b +Block 0029 [ 55]: 68afa26bb1bc8087 +Block 0029 [ 56]: 9fa3a9eeee65c849 +Block 0029 [ 57]: 166ad5e90e1fb34a +Block 0029 [ 58]: 111cbb03483c7948 +Block 0029 [ 59]: d1a00ee3bc309870 +Block 0029 [ 60]: c26b7662c5117bcc +Block 0029 [ 61]: 02fd9550715a76b9 +Block 0029 [ 62]: 3bd94c9f496d061b +Block 0029 [ 63]: bd8c34d3de23173b +Block 0029 [ 64]: 73903c5a6130726c +Block 0029 [ 65]: 14e7ae74063b1c41 +Block 0029 [ 66]: 880c6cab2bf1f166 +Block 0029 [ 67]: f9766e9ef9d5bfd9 +Block 0029 [ 68]: addb32c388d90782 +Block 0029 [ 69]: 6554423048bedf74 +Block 0029 [ 70]: 51c6576b5281b903 +Block 0029 [ 71]: eeecd5b168b9b5bf +Block 0029 [ 72]: 062dca803c473ec9 +Block 0029 [ 73]: fb84d11eb83a1f48 +Block 0029 [ 74]: 9163949866a646c6 +Block 0029 [ 75]: ae458ee2c4aa38b0 +Block 0029 [ 76]: ba7b37a0fe308791 +Block 0029 [ 77]: 23bdb9b915739e12 +Block 0029 [ 78]: cebef87ee8e00146 +Block 0029 [ 79]: 1ff5050825cb849a +Block 0029 [ 80]: dcaf4b96d9369968 +Block 0029 [ 81]: cbd9923d4a25e778 +Block 0029 [ 82]: fda760b9bcce8309 +Block 0029 [ 83]: 9ba39fcea41dea54 +Block 0029 [ 84]: ff89703e444c7d03 +Block 0029 [ 85]: c1528bfd6f82fb85 +Block 0029 [ 86]: 04d4c35cba24af07 +Block 0029 [ 87]: 5d34229c32c2f458 +Block 0029 [ 88]: 8d07eb7d2dc56870 +Block 0029 [ 89]: 6dd6ea0c611eb1b5 +Block 0029 [ 90]: bac1f9799d2ab54e +Block 0029 [ 91]: 173b5b2a973bdaaf +Block 0029 [ 92]: b1a4d48e7ee1a46f +Block 0029 [ 93]: 0fb36719adc8e91c +Block 0029 [ 94]: faefc2753cb6cdb7 +Block 0029 [ 95]: 3427dee22c050a26 +Block 0029 [ 96]: 648629655322c85e +Block 0029 [ 97]: da6a37e23216fe1e +Block 0029 [ 98]: dac40e7d38f3ada2 +Block 0029 [ 99]: 1f9e046da29bcca6 +Block 0029 [100]: b0fa2e7b8f53a3ad +Block 0029 [101]: 4b7971342bd55433 +Block 0029 [102]: 14101d41f2afb513 +Block 0029 [103]: 1f0363b9b7c93230 +Block 0029 [104]: c26b7dc1abe4c074 +Block 0029 [105]: 511202c932605bc3 +Block 0029 [106]: 506f446b14c2fa0d +Block 0029 [107]: 9e5d0d754af3c04b +Block 0029 [108]: 2e79bcb2c0a7e061 +Block 0029 [109]: 5ce8a45905514efd +Block 0029 [110]: bb21b252b1c6abce +Block 0029 [111]: 27a6a502660183c1 +Block 0029 [112]: 3b27a572ce4e05c6 +Block 0029 [113]: a0e0c0768b022220 +Block 0029 [114]: 4873709f797c3e92 +Block 0029 [115]: 3fa74bae85c78557 +Block 0029 [116]: 330626653f791311 +Block 0029 [117]: 4e3401cd1d1f092e +Block 0029 [118]: f4ab84a94f25d989 +Block 0029 [119]: c1f9db3453d949e2 +Block 0029 [120]: d00d0eae1c6b4941 +Block 0029 [121]: 2f72341a47394d0f +Block 0029 [122]: 9faf011956ae9b44 +Block 0029 [123]: 6d5af027411369bf +Block 0029 [124]: 3ba9db1f0e087f5c +Block 0029 [125]: ff5f35b92c04605d +Block 0029 [126]: 6b522baa870cd062 +Block 0029 [127]: 116c95d872b06470 +Block 0030 [ 0]: a497707d907bdbb5 +Block 0030 [ 1]: 1387b1d7e2de9fb2 +Block 0030 [ 2]: e9b7a5ae2c3911c3 +Block 0030 [ 3]: 2304e30b4abe1342 +Block 0030 [ 4]: 6569e5e7e495cac3 +Block 0030 [ 5]: e781abd4b3be3fa2 +Block 0030 [ 6]: cec45944649475fe +Block 0030 [ 7]: e3fd8069db7556ca +Block 0030 [ 8]: 12aad9e722e95123 +Block 0030 [ 9]: f63c54f3569a0288 +Block 0030 [ 10]: 602202c9a3326c48 +Block 0030 [ 11]: 034a4bb4f502d541 +Block 0030 [ 12]: 906032657dd97cfa +Block 0030 [ 13]: b5a1edcb89d7eeae +Block 0030 [ 14]: b40c965b3a0ec87e +Block 0030 [ 15]: 19beb1de7d74c858 +Block 0030 [ 16]: 84d9844f4f30b2cd +Block 0030 [ 17]: 2de7df0d9270a720 +Block 0030 [ 18]: 987353a68f551dfe +Block 0030 [ 19]: 87231e01671d5682 +Block 0030 [ 20]: 95e08d7d4d13e893 +Block 0030 [ 21]: c9d54121b1cbe05a +Block 0030 [ 22]: 9173beb279257e2f +Block 0030 [ 23]: 6c0b47361287718b +Block 0030 [ 24]: d815836edde64e0d +Block 0030 [ 25]: 3aab70f8ef8acd58 +Block 0030 [ 26]: 3d4eacbb303b8942 +Block 0030 [ 27]: 47074d7a499f1b4d +Block 0030 [ 28]: 6b77d29cc5814f8e +Block 0030 [ 29]: 4a22120fe4303e54 +Block 0030 [ 30]: 788b37c81c090145 +Block 0030 [ 31]: 944d5943a04e0b67 +Block 0030 [ 32]: b3581ddd1331a125 +Block 0030 [ 33]: 9f34510aa2b7d72d +Block 0030 [ 34]: 1c612fbaac10b0c4 +Block 0030 [ 35]: ed62acd73a0b0d39 +Block 0030 [ 36]: 1eb6b7c4c3b33953 +Block 0030 [ 37]: 9598308b94b5e7d8 +Block 0030 [ 38]: c28392bfb3e48aff +Block 0030 [ 39]: 86833aec5beb2fd1 +Block 0030 [ 40]: be199029fcd63ac9 +Block 0030 [ 41]: 146e2a07296b54bc +Block 0030 [ 42]: 1b42bea1f2fffb84 +Block 0030 [ 43]: 4e01f060efa7f0dd +Block 0030 [ 44]: dfc3a66f34fdc191 +Block 0030 [ 45]: aaba1fb5f896bb29 +Block 0030 [ 46]: 3297ba5c2b77908a +Block 0030 [ 47]: dbb1641509d7d204 +Block 0030 [ 48]: 2a8a4be0b611de11 +Block 0030 [ 49]: 5abb85518f96f0ce +Block 0030 [ 50]: 23eec337eedea731 +Block 0030 [ 51]: f581a8d567be23b7 +Block 0030 [ 52]: 877c88e984fc6794 +Block 0030 [ 53]: fdf883e49b5450ae +Block 0030 [ 54]: 81ad8e2532db6a2b +Block 0030 [ 55]: a6d3644b428394df +Block 0030 [ 56]: ade7c3614a7f3454 +Block 0030 [ 57]: 4789c2d8ffd935b2 +Block 0030 [ 58]: 09571ee74ecdaeb9 +Block 0030 [ 59]: 5ec25b62459cd7df +Block 0030 [ 60]: ae9063222cebedd0 +Block 0030 [ 61]: 838691ff044dac26 +Block 0030 [ 62]: 9c2b1ff5d82f5c48 +Block 0030 [ 63]: 4ed661d83f838188 +Block 0030 [ 64]: da11ffe4f89a98bf +Block 0030 [ 65]: 026102a18ff640c3 +Block 0030 [ 66]: b40d27b026bd55a3 +Block 0030 [ 67]: 65dd56b86986b85f +Block 0030 [ 68]: b5f744df59d5cf0b +Block 0030 [ 69]: a9d05b38d431021e +Block 0030 [ 70]: 7aa376509a108cbb +Block 0030 [ 71]: 7e0cae8ca01a7ba2 +Block 0030 [ 72]: f257fb68679f2ba5 +Block 0030 [ 73]: a027a9a021201e96 +Block 0030 [ 74]: 8ff39ab8e46c65db +Block 0030 [ 75]: 1f61e97c20b1922b +Block 0030 [ 76]: 2e8f687076b3cbaf +Block 0030 [ 77]: 7d8107a7e3840cd5 +Block 0030 [ 78]: 2f65babde65d296f +Block 0030 [ 79]: 1897c1b8df8db90f +Block 0030 [ 80]: 7d431f0d0229c28d +Block 0030 [ 81]: a1f1c590f3ac726c +Block 0030 [ 82]: 5868070e74cecb5a +Block 0030 [ 83]: 6fca45ad6efdcb57 +Block 0030 [ 84]: ececbb1ddd986c18 +Block 0030 [ 85]: bb4f79fa8793727b +Block 0030 [ 86]: e9ccb85cba576ede +Block 0030 [ 87]: cad0e15d66710c9e +Block 0030 [ 88]: 47339a449ddf32bc +Block 0030 [ 89]: 9d82700ead343ae7 +Block 0030 [ 90]: 48d7c02a64d34fdd +Block 0030 [ 91]: a47baf96226a594f +Block 0030 [ 92]: c1bd47b224ffaa1b +Block 0030 [ 93]: 280edfb69fd7ea1a +Block 0030 [ 94]: 64417df4d9700c3e +Block 0030 [ 95]: a559eb16ca1690aa +Block 0030 [ 96]: 7a4cfedb4e665af8 +Block 0030 [ 97]: e9635d0de30f731a +Block 0030 [ 98]: 5e40ef66b6a35488 +Block 0030 [ 99]: a6c5a440428cae6b +Block 0030 [100]: 464bbed452e49552 +Block 0030 [101]: 2cd703be6cb48289 +Block 0030 [102]: 19814217d930cbb8 +Block 0030 [103]: 9ca6007e94343418 +Block 0030 [104]: 83628a532ebee52b +Block 0030 [105]: b96a42109d9b7797 +Block 0030 [106]: ccc287509dc3a229 +Block 0030 [107]: bcb1714a388e28ab +Block 0030 [108]: 7c0210e4bc243b95 +Block 0030 [109]: 0701316191270f44 +Block 0030 [110]: fe186f16bf6a4331 +Block 0030 [111]: ca565a897bcd7ef8 +Block 0030 [112]: fe5a66451bdf69f5 +Block 0030 [113]: 076858ec4a523860 +Block 0030 [114]: efe04a084a633f98 +Block 0030 [115]: be0a2c63541771bb +Block 0030 [116]: f32d430350e88858 +Block 0030 [117]: 7817ff971e7f4810 +Block 0030 [118]: b6f18c6e97c66e6b +Block 0030 [119]: ad4804cbb61673f5 +Block 0030 [120]: 4001049c9d5a4a69 +Block 0030 [121]: 7d04aa55446e6096 +Block 0030 [122]: 3bd9c63472650ea6 +Block 0030 [123]: c7b3e0272cfcd957 +Block 0030 [124]: 2dc05b7529c3166d +Block 0030 [125]: 7eb2b09e8b11d32e +Block 0030 [126]: d91455278416d563 +Block 0030 [127]: 66d637a2a2b6c5cc +Block 0031 [ 0]: 944a7ec736864f24 +Block 0031 [ 1]: 62207f9b144f6041 +Block 0031 [ 2]: 1b91de707e936258 +Block 0031 [ 3]: b11599a08b417d8b +Block 0031 [ 4]: 89ee0ff3f7266b4e +Block 0031 [ 5]: 36fb1c44fefd9e7f +Block 0031 [ 6]: 5cd146a84de48497 +Block 0031 [ 7]: d729287c49dba1ee +Block 0031 [ 8]: f63844866eab1228 +Block 0031 [ 9]: a28a6b71ea46f38a +Block 0031 [ 10]: 9aec7730893dbc33 +Block 0031 [ 11]: 8ef663a07b64cc7d +Block 0031 [ 12]: 05cc88303838c4be +Block 0031 [ 13]: 462bd3ab56e8a6a6 +Block 0031 [ 14]: 4f3d76237943927f +Block 0031 [ 15]: f6b6653932fe9ef0 +Block 0031 [ 16]: 6d7b4d2aa239c737 +Block 0031 [ 17]: caae7db69aa59aa7 +Block 0031 [ 18]: 1e31c6f143d9952a +Block 0031 [ 19]: 6b60a98e290ca696 +Block 0031 [ 20]: 940ca1bbcd3f7463 +Block 0031 [ 21]: e2018e95efea6502 +Block 0031 [ 22]: 723653c1f8b8b5aa +Block 0031 [ 23]: 44e8613497d80985 +Block 0031 [ 24]: 47fc4079d7548605 +Block 0031 [ 25]: 12c033e65ead5787 +Block 0031 [ 26]: 7e35d99dd937027d +Block 0031 [ 27]: db08418fcf1de9e2 +Block 0031 [ 28]: 962efd855a0c9915 +Block 0031 [ 29]: 49a9432586bd141c +Block 0031 [ 30]: 3e934ae2d20d3bf4 +Block 0031 [ 31]: ca3878557731e31b +Block 0031 [ 32]: 5a2e3f7af5fd99fc +Block 0031 [ 33]: d4cdb70de69868a7 +Block 0031 [ 34]: 2e466841a0631c49 +Block 0031 [ 35]: ad2cce77b3eaac9b +Block 0031 [ 36]: d7457681c1d3b8d1 +Block 0031 [ 37]: 21f8b6b030430d7e +Block 0031 [ 38]: 52e8e9ef6f17868d +Block 0031 [ 39]: 74643040276b49e0 +Block 0031 [ 40]: fa0fc64652a88bbe +Block 0031 [ 41]: b85368143ee3fc44 +Block 0031 [ 42]: ceb7bf6f9163bf98 +Block 0031 [ 43]: 014748d0c2530c89 +Block 0031 [ 44]: f08c8d17798594a5 +Block 0031 [ 45]: 300302703d482fb6 +Block 0031 [ 46]: f6c702c1f364984a +Block 0031 [ 47]: 88e96d54da28c933 +Block 0031 [ 48]: 600731f1d5e30200 +Block 0031 [ 49]: 3fafb57df73906ee +Block 0031 [ 50]: 50676df27723e8dc +Block 0031 [ 51]: 35276a345eafaa5b +Block 0031 [ 52]: 6836ff29f04060fb +Block 0031 [ 53]: f836a93b5a0e07b5 +Block 0031 [ 54]: 7ff0ec0945b7555f +Block 0031 [ 55]: 9a978bbe613eee43 +Block 0031 [ 56]: 0cb6317840199246 +Block 0031 [ 57]: 9ac40873681cb4f3 +Block 0031 [ 58]: ef3ab4e1f58c04cb +Block 0031 [ 59]: cf511bdcbbaab45a +Block 0031 [ 60]: ac604c91d14a4a8b +Block 0031 [ 61]: 5d9a3364c9cfe64a +Block 0031 [ 62]: 8f3c791a7e3997cd +Block 0031 [ 63]: af6786e36a555a52 +Block 0031 [ 64]: aa4c4498263bd24a +Block 0031 [ 65]: 17bb504c406e501c +Block 0031 [ 66]: 5605458618bb7567 +Block 0031 [ 67]: 23dba58aeaf90514 +Block 0031 [ 68]: ddf47fc505d368f3 +Block 0031 [ 69]: d020a357a81d8f2a +Block 0031 [ 70]: 5a8105998d6289cc +Block 0031 [ 71]: cc09c874e9ad7fb4 +Block 0031 [ 72]: 6e0e7a023893dea4 +Block 0031 [ 73]: 9bb514c8b1d2d2bd +Block 0031 [ 74]: 9afbba056d6b02db +Block 0031 [ 75]: 567639eeb1c4f4f3 +Block 0031 [ 76]: b23981b08a43352d +Block 0031 [ 77]: 8a99b8cb4cf52afd +Block 0031 [ 78]: 4c9ae1dcc386ba60 +Block 0031 [ 79]: 5877d8ffcee47c72 +Block 0031 [ 80]: 08ec719cd344b3d9 +Block 0031 [ 81]: 5fed35d31f385127 +Block 0031 [ 82]: a98b4f7dcb2fb022 +Block 0031 [ 83]: bed0b0d8eeb49d83 +Block 0031 [ 84]: 353088c2e9bffc0c +Block 0031 [ 85]: 621cd0ea9f951e5e +Block 0031 [ 86]: 15b6e21e7fe5cff1 +Block 0031 [ 87]: fb256930ba770de1 +Block 0031 [ 88]: 58153034cf988f39 +Block 0031 [ 89]: b135d6b52572443a +Block 0031 [ 90]: b46c8c25d02e20e1 +Block 0031 [ 91]: cdf31cdd2a5e6c86 +Block 0031 [ 92]: e5df8b1870d0fa5f +Block 0031 [ 93]: ff58e219eb2aaef9 +Block 0031 [ 94]: 7b7bf59a19bf4b82 +Block 0031 [ 95]: a83c4eddca7251b7 +Block 0031 [ 96]: e6846c08a364b23b +Block 0031 [ 97]: ce1e0e3990a0b85c +Block 0031 [ 98]: 4805db1de087560c +Block 0031 [ 99]: 65510d9d724717cf +Block 0031 [100]: a5083efef98e595a +Block 0031 [101]: eff774bbf800218d +Block 0031 [102]: fda9598516b2db5d +Block 0031 [103]: 4c1a7ec2bfbca7b7 +Block 0031 [104]: 805250bd4ac405ed +Block 0031 [105]: f11b412261ec3b87 +Block 0031 [106]: e08f40d87a900ff8 +Block 0031 [107]: 99b8fbca386979b6 +Block 0031 [108]: 07aa22432c786a5a +Block 0031 [109]: 585b41d00bc71127 +Block 0031 [110]: 0b03483ac6511c99 +Block 0031 [111]: 6d4cc89b3af28b23 +Block 0031 [112]: 6970451c183ee79a +Block 0031 [113]: f5580761f2eccdc7 +Block 0031 [114]: 0424ccc22b9d54f9 +Block 0031 [115]: 9c48d9de801d0bf0 +Block 0031 [116]: 54fa4f6346f39b22 +Block 0031 [117]: 1ece637d6f675279 +Block 0031 [118]: 260b9ebb18ab1078 +Block 0031 [119]: 4ec528bb24040a3f +Block 0031 [120]: 383fd565da93d8cd +Block 0031 [121]: 6935146f0387f41a +Block 0031 [122]: ae152b1a7f1d5c85 +Block 0031 [123]: d6269b14a3203dcc +Block 0031 [124]: 975f596583745e30 +Block 0031 [125]: e349bdd7edeb3092 +Block 0031 [126]: b751a689b7a83659 +Block 0031 [127]: c570f2ab2a86cf00 + + After pass 1: +Block 0000 [ 0]: b2e4ddfcf76dc85a +Block 0000 [ 1]: 4ffd0626c89a2327 +Block 0000 [ 2]: 4af1440fff212980 +Block 0000 [ 3]: 1e77299c7408505b +Block 0000 [ 4]: 7e672fb78ae3238d +Block 0000 [ 5]: e1cd67bfe18df2a1 +Block 0000 [ 6]: a8c04ae868f9e203 +Block 0000 [ 7]: 37a422ec2be1e14a +Block 0000 [ 8]: ea9c1ad5c2eb5a3c +Block 0000 [ 9]: 3c3424244acf65b3 +Block 0000 [ 10]: 989f059deef06d0e +Block 0000 [ 11]: da5804817b974b81 +Block 0000 [ 12]: 568bf960dcd66161 +Block 0000 [ 13]: c7e121cade4f297b +Block 0000 [ 14]: 27137ecb75c49a3f +Block 0000 [ 15]: 2dcd6d8f395ca8e2 +Block 0000 [ 16]: f54545a15ff00e31 +Block 0000 [ 17]: 3a7c1498b8d66c10 +Block 0000 [ 18]: 4a2d2bb85113a135 +Block 0000 [ 19]: 78b94e1def66f354 +Block 0000 [ 20]: e2c64ed507262087 +Block 0000 [ 21]: e6ca912ac501b306 +Block 0000 [ 22]: c0550c72d9d27c6f +Block 0000 [ 23]: 0a989bf18f3d182f +Block 0000 [ 24]: 03021933aeecca55 +Block 0000 [ 25]: a2c5723fd06c1245 +Block 0000 [ 26]: 29deb6fc754291db +Block 0000 [ 27]: 01e5e4663bd45e9b +Block 0000 [ 28]: 42df9217bad5bad4 +Block 0000 [ 29]: cbce9a4ee35f8a19 +Block 0000 [ 30]: 5e3da2d83d8eb369 +Block 0000 [ 31]: 4aa815e870f6d260 +Block 0000 [ 32]: 9fb5792a7cacd0dd +Block 0000 [ 33]: 537c357f3389887d +Block 0000 [ 34]: 85ab6defa2a243a6 +Block 0000 [ 35]: 9a0d93d5abead9c9 +Block 0000 [ 36]: 8db03096016980a9 +Block 0000 [ 37]: 8136c1a3dd0bb522 +Block 0000 [ 38]: 8cf8da44ab7d86b7 +Block 0000 [ 39]: e6f2cf5e26222f47 +Block 0000 [ 40]: fb2c472f85b81433 +Block 0000 [ 41]: 86e420d43e669e99 +Block 0000 [ 42]: a94125c90c4e51eb +Block 0000 [ 43]: f0cdfc7f5d9661d5 +Block 0000 [ 44]: f35814a7d0533f8e +Block 0000 [ 45]: eaee32abeeb1d71d +Block 0000 [ 46]: 5a19ad61e8018c3b +Block 0000 [ 47]: 42dc03945b12adb0 +Block 0000 [ 48]: 0efc60abd50a2629 +Block 0000 [ 49]: 71682cdb7a674bcc +Block 0000 [ 50]: b91c1757438caaa3 +Block 0000 [ 51]: 456a17580d4264d0 +Block 0000 [ 52]: e2830a456e3be8d1 +Block 0000 [ 53]: 6984a07c7eb39daa +Block 0000 [ 54]: 129d6a66f99e7c51 +Block 0000 [ 55]: 49cd04749c85f25d +Block 0000 [ 56]: cf5e1f90e3ccacea +Block 0000 [ 57]: e00d2db8929c2342 +Block 0000 [ 58]: 4a50a98f75a4d23a +Block 0000 [ 59]: 06f3a32ee178e8a3 +Block 0000 [ 60]: e34113ed208c810e +Block 0000 [ 61]: 2ded060db2eebe26 +Block 0000 [ 62]: dd60eb35ca0c7625 +Block 0000 [ 63]: ad1d92d562b0d222 +Block 0000 [ 64]: 047447517d666518 +Block 0000 [ 65]: 613ce6bb0ff26d08 +Block 0000 [ 66]: 5521788de49616b7 +Block 0000 [ 67]: 3a5056474730596e +Block 0000 [ 68]: d5cbdad593ff2517 +Block 0000 [ 69]: 61fa2a8e714695c1 +Block 0000 [ 70]: 23baaccba2490eb5 +Block 0000 [ 71]: 655cfc83b1a82fc5 +Block 0000 [ 72]: a5c66c25b7fc4ebf +Block 0000 [ 73]: 95f66ee973a5b6e3 +Block 0000 [ 74]: 082e286bdaa2cd49 +Block 0000 [ 75]: 849a992344f431c8 +Block 0000 [ 76]: 9bbc20fce1f8e3fc +Block 0000 [ 77]: 1b7586e5ce69f2b5 +Block 0000 [ 78]: 9a263f9fdd4628fc +Block 0000 [ 79]: 7cd5ff4d7eb3c224 +Block 0000 [ 80]: 76dd41d1fc458a1f +Block 0000 [ 81]: e7db382f1cb0c2c9 +Block 0000 [ 82]: 837e7a11ad6033c2 +Block 0000 [ 83]: eaf7ed04d62b47a7 +Block 0000 [ 84]: 7f3e93feae950543 +Block 0000 [ 85]: f43dce98db930c6c +Block 0000 [ 86]: 034085278bfb1aaf +Block 0000 [ 87]: 047c628b27d21682 +Block 0000 [ 88]: ff6f46a71535f39d +Block 0000 [ 89]: cf8b2ec8ea64daa0 +Block 0000 [ 90]: 7798fea1844fc894 +Block 0000 [ 91]: e5a89e1eaa8c2be8 +Block 0000 [ 92]: 7da8c3309f71a9c4 +Block 0000 [ 93]: 126aa1334fabc285 +Block 0000 [ 94]: a31b8a6990dff9ea +Block 0000 [ 95]: b6f753045da7efcb +Block 0000 [ 96]: d5f7ae86280997fb +Block 0000 [ 97]: 4ac781ee5a227dc2 +Block 0000 [ 98]: 90bf68c528de1614 +Block 0000 [ 99]: f2b948077c97bb31 +Block 0000 [100]: ed9869cd2fcc01d6 +Block 0000 [101]: dd757dd9bb87c485 +Block 0000 [102]: 401e6dfaeb98fdc1 +Block 0000 [103]: ce46cebd1c998df8 +Block 0000 [104]: 2c96b3649229238c +Block 0000 [105]: d73d3649246a34e8 +Block 0000 [106]: f8c09d8ed3624653 +Block 0000 [107]: 4b00e20ec3ef6334 +Block 0000 [108]: fc612e9aea430b66 +Block 0000 [109]: 082cb1bffd463327 +Block 0000 [110]: 708afd583f223878 +Block 0000 [111]: bacc8830cdfb689a +Block 0000 [112]: 51c543c47d97a5e5 +Block 0000 [113]: 088ddff206e1af93 +Block 0000 [114]: 14ba0bf68723ea38 +Block 0000 [115]: 60cec002007482d7 +Block 0000 [116]: cc35a0963e1e318e +Block 0000 [117]: e49f60771b29722a +Block 0000 [118]: 571920b4c7fc0351 +Block 0000 [119]: fb7800322db6813b +Block 0000 [120]: d6ee0ab287858786 +Block 0000 [121]: 8a78e72d193027b9 +Block 0000 [122]: 6e5c870b4156f14e +Block 0000 [123]: 940e690ff9bd0e4b +Block 0000 [124]: e4ceee2788ca1338 +Block 0000 [125]: 107efa0a04948bea +Block 0000 [126]: 54169c55f786c3de +Block 0000 [127]: 27f4ddbe3b4bfb29 +Block 0001 [ 0]: 7c7e4e842a102e2d +Block 0001 [ 1]: d97fb43fe330bc52 +Block 0001 [ 2]: dbb3531f03bfaed0 +Block 0001 [ 3]: 379d167ac7eb5f37 +Block 0001 [ 4]: bcac160bbdff1487 +Block 0001 [ 5]: a2ddda9500ea90be +Block 0001 [ 6]: 1d7966fb7d9f62f3 +Block 0001 [ 7]: f015be978fbcd6e9 +Block 0001 [ 8]: 6f6b9177dbf23924 +Block 0001 [ 9]: cd3d5950128429bc +Block 0001 [ 10]: 6002e39a85144740 +Block 0001 [ 11]: 9af2c013af0db2a5 +Block 0001 [ 12]: 32d56e0705ddb5d4 +Block 0001 [ 13]: f8ed5a41bf619926 +Block 0001 [ 14]: a48b07b10a30d3f0 +Block 0001 [ 15]: 30c347cbeac2dba4 +Block 0001 [ 16]: 0705452f5690858e +Block 0001 [ 17]: 91214114cad3fbb2 +Block 0001 [ 18]: c3c528bbc2f2b866 +Block 0001 [ 19]: 8449f042c4edcb84 +Block 0001 [ 20]: b4f8190f05d2860b +Block 0001 [ 21]: ff0e2dbbc88c0452 +Block 0001 [ 22]: d063b4424c6fabf3 +Block 0001 [ 23]: 79785bfe15e572e9 +Block 0001 [ 24]: 8b9cf846aeb1ad6e +Block 0001 [ 25]: 06384456c23106a8 +Block 0001 [ 26]: f67379d12f8af09c +Block 0001 [ 27]: d557757d96eb9d12 +Block 0001 [ 28]: b153ed5e9e18c9f8 +Block 0001 [ 29]: 9e865cefbd445b3a +Block 0001 [ 30]: 84a87d3cf1d42139 +Block 0001 [ 31]: 98eff782bd9f7acf +Block 0001 [ 32]: baa280b8075cae9b +Block 0001 [ 33]: 64ac022bf3b0cf64 +Block 0001 [ 34]: e445bbadf36fea9f +Block 0001 [ 35]: 7a638052234cecc5 +Block 0001 [ 36]: d1561f72f4db01a3 +Block 0001 [ 37]: c0ee406b5dab7a6c +Block 0001 [ 38]: 03999c6c700e7e52 +Block 0001 [ 39]: c2adb31c6e041da3 +Block 0001 [ 40]: fca2270651bb2959 +Block 0001 [ 41]: 5ee8f5be5975c4d7 +Block 0001 [ 42]: abe285efbc633b22 +Block 0001 [ 43]: 1232e79db37874d7 +Block 0001 [ 44]: 6f8b937469210023 +Block 0001 [ 45]: b6771199336d27d2 +Block 0001 [ 46]: 68261151e67ef112 +Block 0001 [ 47]: a3d3c5385acb39f3 +Block 0001 [ 48]: e13cc3158a887bad +Block 0001 [ 49]: 6e49bbe54dcdd6e1 +Block 0001 [ 50]: 7b53792348cebf03 +Block 0001 [ 51]: 2bad526dc40fd5ed +Block 0001 [ 52]: 4fc378646d4f270e +Block 0001 [ 53]: 7e1238268cb3c608 +Block 0001 [ 54]: 3e6bef59b00ed662 +Block 0001 [ 55]: 6cbc24d59c79bf65 +Block 0001 [ 56]: 93bf6f73eaaa18d3 +Block 0001 [ 57]: 3086062a47b65381 +Block 0001 [ 58]: 0a573df850f72ca7 +Block 0001 [ 59]: a34505f05cd9b423 +Block 0001 [ 60]: 73dc824fcfcd196e +Block 0001 [ 61]: ca8eb6deca473c6d +Block 0001 [ 62]: 6c750f133ae71a99 +Block 0001 [ 63]: 88c12f0eab06a0b1 +Block 0001 [ 64]: 1a0db5c1522ab263 +Block 0001 [ 65]: 99da78e8b8ff09d5 +Block 0001 [ 66]: fb8842c7292ca975 +Block 0001 [ 67]: 1ddb8ed4f63a9f47 +Block 0001 [ 68]: 70f53652df585383 +Block 0001 [ 69]: bf24132118dc24b4 +Block 0001 [ 70]: 937839e1f511fb44 +Block 0001 [ 71]: 65dc97b180f7d8df +Block 0001 [ 72]: f98385784dd99067 +Block 0001 [ 73]: aee167d39d525b8b +Block 0001 [ 74]: 11eb5ba83feaff09 +Block 0001 [ 75]: 3113331bd4fe5849 +Block 0001 [ 76]: c087bac03cc593eb +Block 0001 [ 77]: 911541803860d5ad +Block 0001 [ 78]: 972796bde9d1c42e +Block 0001 [ 79]: c8cd6935d63f999a +Block 0001 [ 80]: 4eb3a3310ac0652b +Block 0001 [ 81]: 5faa0e3ba17495cc +Block 0001 [ 82]: 54538022fe6f9c31 +Block 0001 [ 83]: 85ad4868c2fdd47a +Block 0001 [ 84]: 2e7bd3ad0d2a35b0 +Block 0001 [ 85]: 35087db302505af5 +Block 0001 [ 86]: 7b06c9fb29e26df2 +Block 0001 [ 87]: 9df831ef57448e1c +Block 0001 [ 88]: 1d908722a58fa4c6 +Block 0001 [ 89]: 9cfe0815564ca490 +Block 0001 [ 90]: 1b3cdb61b5feaa18 +Block 0001 [ 91]: e37917c95e8105a1 +Block 0001 [ 92]: 5704635a0737b2be +Block 0001 [ 93]: 734708322a4f163f +Block 0001 [ 94]: 65c5c56111e21f7b +Block 0001 [ 95]: 48a7e79585c82ac8 +Block 0001 [ 96]: 90b83ac17e185667 +Block 0001 [ 97]: 1e2d69687bb0f277 +Block 0001 [ 98]: 551effebbb0677cf +Block 0001 [ 99]: 7c7e64cb0b4a9dfb +Block 0001 [100]: b6e6a9e294ae2aef +Block 0001 [101]: c772befaa7b7d5a2 +Block 0001 [102]: 705a0ae7722982bd +Block 0001 [103]: 487550a7ae562b33 +Block 0001 [104]: c978ab00275b329b +Block 0001 [105]: ef22ed8e7ca24204 +Block 0001 [106]: c80b4bc89eab8590 +Block 0001 [107]: f02f2945d3db6813 +Block 0001 [108]: 1258ee15004331a1 +Block 0001 [109]: 12a45ca546f3f203 +Block 0001 [110]: 7eb5ba10595ab1bd +Block 0001 [111]: 83c50861b087e83b +Block 0001 [112]: e5c3369514f76c3b +Block 0001 [113]: b6f0b3be44be16bb +Block 0001 [114]: d90429b12ea6a18e +Block 0001 [115]: ce343138c9908c54 +Block 0001 [116]: f5b8874f958cca3b +Block 0001 [117]: 0e90768218b2827f +Block 0001 [118]: d10d62333598e847 +Block 0001 [119]: b7adbe6b921354b9 +Block 0001 [120]: f867bae8bff66bc4 +Block 0001 [121]: ec4fc408964ee14a +Block 0001 [122]: db1e5b94bf1a6ba9 +Block 0001 [123]: 4427a9a3b206a22e +Block 0001 [124]: f680b8152ab38fe3 +Block 0001 [125]: 57e82afc40c6bdb3 +Block 0001 [126]: 62669624fa9f150e +Block 0001 [127]: 3e2b78aca9af3e85 +Block 0002 [ 0]: 86efaf80eac2ed5e +Block 0002 [ 1]: 6cbb794e606e30fa +Block 0002 [ 2]: 58ba8f651613a62f +Block 0002 [ 3]: 39e6c82450a725ef +Block 0002 [ 4]: f7c274a22d6358b2 +Block 0002 [ 5]: 540c17b677071a38 +Block 0002 [ 6]: d5e18b9c175e9391 +Block 0002 [ 7]: 84142a92ecfb7e48 +Block 0002 [ 8]: 98fb5a0b8f3b87d5 +Block 0002 [ 9]: 1bac756bfe70762c +Block 0002 [ 10]: 426e9fdea7694bd7 +Block 0002 [ 11]: 2b2bc7b298230b84 +Block 0002 [ 12]: 2ba0f4d8cd3744e7 +Block 0002 [ 13]: c16dc3f56fefbe36 +Block 0002 [ 14]: 9456970ece1ae4f5 +Block 0002 [ 15]: dc71b76d67640fbd +Block 0002 [ 16]: 6a51483c1bcbd225 +Block 0002 [ 17]: ca5a32517132a4a7 +Block 0002 [ 18]: ba7b715053f1efd6 +Block 0002 [ 19]: a8c07fef13c81b75 +Block 0002 [ 20]: d08df79370575fa9 +Block 0002 [ 21]: 461e63a5da271692 +Block 0002 [ 22]: d13f39e35427319e +Block 0002 [ 23]: 727864f49a85bc04 +Block 0002 [ 24]: 229ef524b7660d7b +Block 0002 [ 25]: f2f4edb42bf81a78 +Block 0002 [ 26]: 2752e760c33b9a2b +Block 0002 [ 27]: 8c9a11a95b09715c +Block 0002 [ 28]: d0e9e5f5f517a199 +Block 0002 [ 29]: 9dad9e62f67e8afc +Block 0002 [ 30]: b8e5565ca41ee587 +Block 0002 [ 31]: 4bd71f8bcb062846 +Block 0002 [ 32]: 5e8a7c70a0cf04be +Block 0002 [ 33]: c26facf6fc442e2e +Block 0002 [ 34]: 8242539af817aec3 +Block 0002 [ 35]: 5c756cf641282347 +Block 0002 [ 36]: 209cf98052588aba +Block 0002 [ 37]: b1d35f1ccd13c627 +Block 0002 [ 38]: 66071ccee68fe1ba +Block 0002 [ 39]: c3221a5092ac879b +Block 0002 [ 40]: 789f48d15ef8de9e +Block 0002 [ 41]: ee6b857cb4aa1847 +Block 0002 [ 42]: 15c376adfaa40762 +Block 0002 [ 43]: eb0f698827d47eb1 +Block 0002 [ 44]: a394d2ea11fc10c2 +Block 0002 [ 45]: d67cf8f561e9a481 +Block 0002 [ 46]: a7acf11f6419b8e2 +Block 0002 [ 47]: e2612a660bb29fd8 +Block 0002 [ 48]: cf40e044fd3406b9 +Block 0002 [ 49]: f181e86d1eb929e5 +Block 0002 [ 50]: b730f4a0313a0f9d +Block 0002 [ 51]: ad12579bcb46430f +Block 0002 [ 52]: 65cf23444e237272 +Block 0002 [ 53]: 0c1f74ebcc48766a +Block 0002 [ 54]: c481845a7c971d93 +Block 0002 [ 55]: 4681c7fad6c494db +Block 0002 [ 56]: b7c59834dcc299b6 +Block 0002 [ 57]: 00d2679dca310ece +Block 0002 [ 58]: 186b0718dcbce10b +Block 0002 [ 59]: cdac40832d0120df +Block 0002 [ 60]: 2f74751ad7d219d3 +Block 0002 [ 61]: 36e9506170140101 +Block 0002 [ 62]: 63a29d721621df3a +Block 0002 [ 63]: f2bbb30328991022 +Block 0002 [ 64]: cf784e1f178183cb +Block 0002 [ 65]: c551388392a229d4 +Block 0002 [ 66]: e43c737c16a2998c +Block 0002 [ 67]: edba1c64023e06a8 +Block 0002 [ 68]: d30148725b097c00 +Block 0002 [ 69]: 2f7aacc907a0a410 +Block 0002 [ 70]: 0529807f7bfc11fb +Block 0002 [ 71]: 9c1fdcd641d1a7da +Block 0002 [ 72]: 432594adb3c7420b +Block 0002 [ 73]: a672c3e18f45886e +Block 0002 [ 74]: 9fdf014ee62a9a15 +Block 0002 [ 75]: 1eb438533674ead2 +Block 0002 [ 76]: 1667a75fdd2f08a4 +Block 0002 [ 77]: 88ef55710e08a035 +Block 0002 [ 78]: 2ed94808e5cbbc40 +Block 0002 [ 79]: 9e6c492a9369ab82 +Block 0002 [ 80]: 241d77bfa45b6e7a +Block 0002 [ 81]: 72b39a71964e5854 +Block 0002 [ 82]: 84de18604265df39 +Block 0002 [ 83]: 7c3edb10801b0d48 +Block 0002 [ 84]: 42f315c78dd33bb2 +Block 0002 [ 85]: 02d84c0fcc17dcde +Block 0002 [ 86]: 4361ab015f3f710b +Block 0002 [ 87]: 3f61db1d858a6be6 +Block 0002 [ 88]: 4f9efe1458258efa +Block 0002 [ 89]: 9245fc3739c44c2f +Block 0002 [ 90]: 60ceab1c851628c0 +Block 0002 [ 91]: 5e15d09383818a4c +Block 0002 [ 92]: 679f64a7cca20698 +Block 0002 [ 93]: b69349974a5e49ed +Block 0002 [ 94]: ac12e9258f2d6e04 +Block 0002 [ 95]: 489d9fd811795ec7 +Block 0002 [ 96]: 2e8296f89c6838c7 +Block 0002 [ 97]: c11755f2925691a7 +Block 0002 [ 98]: 41dbe65271283b39 +Block 0002 [ 99]: 409c1cf3e5788ed3 +Block 0002 [100]: 3e54cdb0b3fce3c4 +Block 0002 [101]: 955c3fb2dcb5810a +Block 0002 [102]: 16ae1a9795a45a40 +Block 0002 [103]: 715877d9f3b5b47e +Block 0002 [104]: 8e738b5a56e7fbdb +Block 0002 [105]: 3d2921bb972e0556 +Block 0002 [106]: 0085d78ec42ba7ff +Block 0002 [107]: 07f45baf4bcef049 +Block 0002 [108]: 6d775cc56a00f99f +Block 0002 [109]: 39217ea705c54f90 +Block 0002 [110]: 3881e3250797c790 +Block 0002 [111]: b055d6d9879ab68e +Block 0002 [112]: d947b16d523ab838 +Block 0002 [113]: 46e931e12f2d9197 +Block 0002 [114]: 85593910a8e77820 +Block 0002 [115]: d437375c655d1e9b +Block 0002 [116]: 952ba7cb1d8f446e +Block 0002 [117]: f5db5b403f667c07 +Block 0002 [118]: a72ced86fedf6fbd +Block 0002 [119]: e40062d8c9b929b1 +Block 0002 [120]: 18ab405d561e23e6 +Block 0002 [121]: db3f1f52d33e8521 +Block 0002 [122]: 526fc65c3d4198ce +Block 0002 [123]: 1c02368aedb009a0 +Block 0002 [124]: f0193b1322fea1eb +Block 0002 [125]: 08160def3ed589ba +Block 0002 [126]: c3d02084ef29e3a8 +Block 0002 [127]: 9e3c26c84794b742 +Block 0003 [ 0]: 47e4b55ca3a68849 +Block 0003 [ 1]: ce3677e651b75c83 +Block 0003 [ 2]: 93052446e287428b +Block 0003 [ 3]: 0f05057bdc434eb2 +Block 0003 [ 4]: 36bf9cdd1805985d +Block 0003 [ 5]: b9d6973b140575af +Block 0003 [ 6]: 536655215a96fc07 +Block 0003 [ 7]: 9f2c073205f1eefb +Block 0003 [ 8]: 49035726d5561411 +Block 0003 [ 9]: b19c87fa5805385d +Block 0003 [ 10]: c2048432848d1599 +Block 0003 [ 11]: 452a4980262dde88 +Block 0003 [ 12]: 6c2ff858fdd69274 +Block 0003 [ 13]: a9edd1d47c90287a +Block 0003 [ 14]: e52a0eab7afc24ef +Block 0003 [ 15]: 25eee1c982f06bba +Block 0003 [ 16]: 90bd4e021a66270e +Block 0003 [ 17]: 327bfcebf1d1c9cf +Block 0003 [ 18]: a6f77c2fcb3b40ea +Block 0003 [ 19]: cbd7b68a0d625e45 +Block 0003 [ 20]: 6a4943f1ff2876c2 +Block 0003 [ 21]: 7633be8700da0f98 +Block 0003 [ 22]: e3ec9e32f16a2da8 +Block 0003 [ 23]: fc7d59dcf497c0f5 +Block 0003 [ 24]: 5edb6a169eafd532 +Block 0003 [ 25]: d0e3c0cc94079a25 +Block 0003 [ 26]: 6f0c0ea1da6b3d56 +Block 0003 [ 27]: 0410e06dffe05b11 +Block 0003 [ 28]: a3b230d46679e317 +Block 0003 [ 29]: 5b18d07ed650f566 +Block 0003 [ 30]: 3ad4a7d10e729f78 +Block 0003 [ 31]: 1c6faf65c5e7880d +Block 0003 [ 32]: 28b6cb21416f151a +Block 0003 [ 33]: 21f23de1fb58bc00 +Block 0003 [ 34]: dba935f0876504d0 +Block 0003 [ 35]: 1b422804c8124bdb +Block 0003 [ 36]: d459afe5f9cad581 +Block 0003 [ 37]: df451308c78343c9 +Block 0003 [ 38]: 67752625a5ef6a7b +Block 0003 [ 39]: dfa0c32b55c7990b +Block 0003 [ 40]: dfa65d3cb4eff6f4 +Block 0003 [ 41]: 9d44a5a4583abc39 +Block 0003 [ 42]: 81221f10ce31c4cf +Block 0003 [ 43]: 2c75eaf2aae12a92 +Block 0003 [ 44]: 5c73ea9099605ec4 +Block 0003 [ 45]: e38ce91cc6fb0c88 +Block 0003 [ 46]: 59607ea7ed2cf60c +Block 0003 [ 47]: dc478047f6b71620 +Block 0003 [ 48]: 5857e51b6d638f28 +Block 0003 [ 49]: 280fbc8107a5c239 +Block 0003 [ 50]: 32ba01e4cffbd141 +Block 0003 [ 51]: 2052dd85024e1869 +Block 0003 [ 52]: 812f491bd5de07bb +Block 0003 [ 53]: dc80c11853ab55ff +Block 0003 [ 54]: 0be2e2faca6cd724 +Block 0003 [ 55]: 3de4a64cad66aff2 +Block 0003 [ 56]: dd39f6170b7ebb97 +Block 0003 [ 57]: 5deefd62fa73991d +Block 0003 [ 58]: 4d81ea48d0879d8d +Block 0003 [ 59]: 5e287e11a01fa8cc +Block 0003 [ 60]: 1750e9cdaa57979d +Block 0003 [ 61]: d44bc2a6bb5e0c1d +Block 0003 [ 62]: 3eb6172aa93f7235 +Block 0003 [ 63]: 625851b0f51453cd +Block 0003 [ 64]: 787aa08312b800c2 +Block 0003 [ 65]: 926dd8711de0aa81 +Block 0003 [ 66]: f92c3b44a3930a99 +Block 0003 [ 67]: 202321fd495bc4dd +Block 0003 [ 68]: 8ba8059f755bc587 +Block 0003 [ 69]: 912c62454af1486b +Block 0003 [ 70]: abc58ea3d020e71c +Block 0003 [ 71]: 019f064393246e8e +Block 0003 [ 72]: 447d2b297c5c0a60 +Block 0003 [ 73]: 8b10703382e5d0c2 +Block 0003 [ 74]: 1d3bc2052bace4dd +Block 0003 [ 75]: d840e74802a71b30 +Block 0003 [ 76]: 9860620a312cd5e1 +Block 0003 [ 77]: e02377a18ac65e65 +Block 0003 [ 78]: 11871fd45a03d051 +Block 0003 [ 79]: feaa331ec85d2e65 +Block 0003 [ 80]: 54b602f1cec5a912 +Block 0003 [ 81]: d03a5a9d3de97d60 +Block 0003 [ 82]: bcb99e1b95b67044 +Block 0003 [ 83]: 35976d9cac311fc1 +Block 0003 [ 84]: a838d7c9595d830d +Block 0003 [ 85]: ca8276cafa72e5be +Block 0003 [ 86]: 76b9769123938b18 +Block 0003 [ 87]: 3bb48f4670306aa0 +Block 0003 [ 88]: fbd323102d37a4cc +Block 0003 [ 89]: 7a787b482ae5c679 +Block 0003 [ 90]: 41759fa5a6c77e1d +Block 0003 [ 91]: 5eba576416c98141 +Block 0003 [ 92]: 0a4420853cd2220b +Block 0003 [ 93]: 764c40c685f1ad35 +Block 0003 [ 94]: b9c859e929596367 +Block 0003 [ 95]: c49f156da3049e06 +Block 0003 [ 96]: 0601b22007d45a9d +Block 0003 [ 97]: 7342d9112bdf462f +Block 0003 [ 98]: 57a4ea145c8dfd59 +Block 0003 [ 99]: 6713f392d28f454b +Block 0003 [100]: 54769b84908fe40a +Block 0003 [101]: 18ee40ca2547674d +Block 0003 [102]: 2e9b828597481407 +Block 0003 [103]: 7fcc3d5791033ac8 +Block 0003 [104]: 74163ca2e9f91de5 +Block 0003 [105]: 916299261106d2ee +Block 0003 [106]: c5c5798b20f0f813 +Block 0003 [107]: b98bfea35c51037c +Block 0003 [108]: e8907314d75807c4 +Block 0003 [109]: fc5ab15c031499db +Block 0003 [110]: a1ffdca0b3446d30 +Block 0003 [111]: f084211b0c5e43b2 +Block 0003 [112]: 52e7554b5df72092 +Block 0003 [113]: e55a86c0b8f08a81 +Block 0003 [114]: 9f021f191a8bef77 +Block 0003 [115]: b45e6d2a520505ac +Block 0003 [116]: 9bf1e40036d9fbee +Block 0003 [117]: 8df547b45358d289 +Block 0003 [118]: 543f8dac24f4841a +Block 0003 [119]: 33e7a353ca697ef7 +Block 0003 [120]: e8f81c6070ff2b86 +Block 0003 [121]: 05a0a6c1a44952d8 +Block 0003 [122]: dc1f07f38de6e460 +Block 0003 [123]: 381b8afc1b6d7bf6 +Block 0003 [124]: 8f92a8605ccc67e7 +Block 0003 [125]: e2a38a24d6c52813 +Block 0003 [126]: 8f69eb2814952c79 +Block 0003 [127]: 62a72909082d270e +Block 0004 [ 0]: 871209abdcbd4665 +Block 0004 [ 1]: 6ab1ca5cd5ecef94 +Block 0004 [ 2]: 1fea45956063895b +Block 0004 [ 3]: ee58d6590d1676bb +Block 0004 [ 4]: 3dc00f189dc5c3fa +Block 0004 [ 5]: a5b8ce1a1f4e7020 +Block 0004 [ 6]: 7b1f6d1a4a686357 +Block 0004 [ 7]: 8b1edaacca4590b2 +Block 0004 [ 8]: 60fedc7502cc9fa5 +Block 0004 [ 9]: b68e2a1d1dd5dfd9 +Block 0004 [ 10]: ad3a8268c1e90b40 +Block 0004 [ 11]: 84b4724c4bd5fc51 +Block 0004 [ 12]: 968da98760d2c519 +Block 0004 [ 13]: 7e20bddeea2c88c5 +Block 0004 [ 14]: 35cf39e20d289cb8 +Block 0004 [ 15]: c17a80a2c0a9250d +Block 0004 [ 16]: 801d2fe51918e490 +Block 0004 [ 17]: 334599dfe6468fcb +Block 0004 [ 18]: 05e2044464c256dc +Block 0004 [ 19]: 506830970d8ae416 +Block 0004 [ 20]: 97acbf19c3efd58b +Block 0004 [ 21]: 2dbf1feb30fa28c8 +Block 0004 [ 22]: 7d79f356d1d44674 +Block 0004 [ 23]: 40812a1b85e1aae2 +Block 0004 [ 24]: e4a94f755dfb89de +Block 0004 [ 25]: a683e248949966dc +Block 0004 [ 26]: 33f3a86f657124ef +Block 0004 [ 27]: fabc367ac27942c3 +Block 0004 [ 28]: b99e431918cc7c59 +Block 0004 [ 29]: 6d033fc5e284994e +Block 0004 [ 30]: b07e2fa321621b2c +Block 0004 [ 31]: f7535b1505615d74 +Block 0004 [ 32]: 68bb97943fa339cf +Block 0004 [ 33]: 91672a586f73085e +Block 0004 [ 34]: 7c3b401568284ce5 +Block 0004 [ 35]: fbc4adc821140d2d +Block 0004 [ 36]: ca5599b6de915aca +Block 0004 [ 37]: b3b6a518685f440b +Block 0004 [ 38]: a03850795b7c782e +Block 0004 [ 39]: 75020b29baf49164 +Block 0004 [ 40]: 86f193633b5f37af +Block 0004 [ 41]: fe3460ff365fd099 +Block 0004 [ 42]: db4921a0057c5560 +Block 0004 [ 43]: a9cbc706024dfa2b +Block 0004 [ 44]: 31d16202356d73a3 +Block 0004 [ 45]: 30e16b62c4099af6 +Block 0004 [ 46]: a6c9b1183dcd19f7 +Block 0004 [ 47]: 4d9e959d8d6b3754 +Block 0004 [ 48]: 61b83b597030b1c8 +Block 0004 [ 49]: ae6fcee3be93f61e +Block 0004 [ 50]: 50fc16f00eba0f19 +Block 0004 [ 51]: 0a64962755c66c4f +Block 0004 [ 52]: 6ccf1966f53437c9 +Block 0004 [ 53]: 3f5226c05a50ca43 +Block 0004 [ 54]: acaa53ac8359b625 +Block 0004 [ 55]: 938f69e09741ac2c +Block 0004 [ 56]: 0f0ac9cc7eb41bb3 +Block 0004 [ 57]: b5969b3c1fe6b866 +Block 0004 [ 58]: 07ca5b9db7f95807 +Block 0004 [ 59]: b063da491eb1c31e +Block 0004 [ 60]: 65ff8c77bead17f7 +Block 0004 [ 61]: ed8040671c8d7f81 +Block 0004 [ 62]: 464389f4113f5e88 +Block 0004 [ 63]: 7c48c61726449223 +Block 0004 [ 64]: 9f7b6bf8527d1d1f +Block 0004 [ 65]: e709423c16c82110 +Block 0004 [ 66]: 337f9777fa88c26c +Block 0004 [ 67]: 02d89d338ed99ff6 +Block 0004 [ 68]: d35b61d714e2159c +Block 0004 [ 69]: ef0065d8a46d091d +Block 0004 [ 70]: 21bbb304a6c274ce +Block 0004 [ 71]: 9754ea69566260de +Block 0004 [ 72]: 15af436883827327 +Block 0004 [ 73]: 294ebef6568a9143 +Block 0004 [ 74]: 216c83e9fb7bfefc +Block 0004 [ 75]: 6ea0a345816ae474 +Block 0004 [ 76]: 0d877976466f0287 +Block 0004 [ 77]: 455498ff52f8a84a +Block 0004 [ 78]: 4a048b3ee88673e7 +Block 0004 [ 79]: 3660bd8483ac2d36 +Block 0004 [ 80]: 391af29c8b695622 +Block 0004 [ 81]: 4f62ea7ffbe0a95c +Block 0004 [ 82]: 9b2b3f4d04352770 +Block 0004 [ 83]: 44c1cff0e51499b3 +Block 0004 [ 84]: a1e531f8cf6edf18 +Block 0004 [ 85]: 39419f0074881536 +Block 0004 [ 86]: cef4024632610741 +Block 0004 [ 87]: 11049ca17737c32c +Block 0004 [ 88]: 0a10c0cd7a189f1b +Block 0004 [ 89]: 687c690e01cd83cd +Block 0004 [ 90]: f06a0133bfce8cdc +Block 0004 [ 91]: 66df6a2e23c8944b +Block 0004 [ 92]: fbcff4b3ed651268 +Block 0004 [ 93]: 8ad5f038e3123bb7 +Block 0004 [ 94]: 6bb487bb9c8d8cd0 +Block 0004 [ 95]: 93cf69fc27d4689a +Block 0004 [ 96]: 2afec0f26e5bf277 +Block 0004 [ 97]: 31134929d344d951 +Block 0004 [ 98]: ffd87f78eb17b89c +Block 0004 [ 99]: faa9ec74ce7f8e49 +Block 0004 [100]: b3259d1d6c5be3e2 +Block 0004 [101]: 45b02bd8b76389f9 +Block 0004 [102]: bec627f348f56a93 +Block 0004 [103]: cbcae4615e596978 +Block 0004 [104]: 80c9283195da7520 +Block 0004 [105]: e8e6d067602f52a8 +Block 0004 [106]: 48a563e2f8a17c40 +Block 0004 [107]: 2d7194ce9e175b97 +Block 0004 [108]: f3bada1842a83c8d +Block 0004 [109]: 10a24148069fb4d0 +Block 0004 [110]: 87b4ac62310e3055 +Block 0004 [111]: 70b8e8adc9d8d6a9 +Block 0004 [112]: 988c39066b575815 +Block 0004 [113]: adaea6def4975f21 +Block 0004 [114]: e09dcaf815dd8dac +Block 0004 [115]: 790523ec82c9ba99 +Block 0004 [116]: 4e4f599373a63715 +Block 0004 [117]: e5d6a1032a0bbfcd +Block 0004 [118]: a87032ec60719b7e +Block 0004 [119]: 5522154a317e43a4 +Block 0004 [120]: 8c2420ea268cf592 +Block 0004 [121]: 50ca5df1c96c8b97 +Block 0004 [122]: 9361eceab543a181 +Block 0004 [123]: bce9db3fb691ac63 +Block 0004 [124]: bbaebb394c9fe4af +Block 0004 [125]: ed63ee581ce22d7e +Block 0004 [126]: 94ae21616c5b3094 +Block 0004 [127]: d95da019e0999430 +Block 0005 [ 0]: 155ccff39341aa6f +Block 0005 [ 1]: 54a69c64dcb493ca +Block 0005 [ 2]: eef63d3a6926f8d9 +Block 0005 [ 3]: e9ca019f8c490de2 +Block 0005 [ 4]: ef5fe2e9fe1cfda3 +Block 0005 [ 5]: e06a975887aa3e04 +Block 0005 [ 6]: 7f838117d20e0aee +Block 0005 [ 7]: f06651485d09f94b +Block 0005 [ 8]: ad01c8ce33481657 +Block 0005 [ 9]: f148a24f675e9076 +Block 0005 [ 10]: bf2b9ec0049a032b +Block 0005 [ 11]: 79852b9bfb6698d7 +Block 0005 [ 12]: 6bd08e133c925b5d +Block 0005 [ 13]: 27447ed323030ef8 +Block 0005 [ 14]: 7895b4059a429434 +Block 0005 [ 15]: 017379983bc697eb +Block 0005 [ 16]: 28633004c9c92418 +Block 0005 [ 17]: 49fe67b1a66ba90e +Block 0005 [ 18]: 46420673b44352d3 +Block 0005 [ 19]: 174a91fd26893166 +Block 0005 [ 20]: 7ccbf4705560e6d8 +Block 0005 [ 21]: cca42142125d19e2 +Block 0005 [ 22]: 2be2e05c33484649 +Block 0005 [ 23]: 06b455f3384c102b +Block 0005 [ 24]: d91ee93c8e0a32c8 +Block 0005 [ 25]: b8b3676e186c199a +Block 0005 [ 26]: 5318de0cac98b443 +Block 0005 [ 27]: cf2f2eafd31ecb65 +Block 0005 [ 28]: aa2c13d8af3ac49c +Block 0005 [ 29]: f13e38159c731e1d +Block 0005 [ 30]: bfb273d30db0ea8b +Block 0005 [ 31]: e9ee2ed512ec4707 +Block 0005 [ 32]: 536e64c7cd9be92d +Block 0005 [ 33]: 32d61c4f2eb9be8b +Block 0005 [ 34]: d1c1f55c0da42e83 +Block 0005 [ 35]: 5fe40d60e4f9a806 +Block 0005 [ 36]: 1bd9c2a64123ffe8 +Block 0005 [ 37]: d8c68b4b6755892c +Block 0005 [ 38]: 224f6d01f3b8dc87 +Block 0005 [ 39]: 95987eb6fd5f46fa +Block 0005 [ 40]: 09fb258b50b2b264 +Block 0005 [ 41]: 34f3e6a34baf8636 +Block 0005 [ 42]: 5663b55c7b79c10e +Block 0005 [ 43]: 264e60d189cd2be0 +Block 0005 [ 44]: a1aad8cc73e60800 +Block 0005 [ 45]: 87343e7c26f33a7a +Block 0005 [ 46]: f4c06e87f63e3ae3 +Block 0005 [ 47]: ef2a9f44d99cdc77 +Block 0005 [ 48]: 0c37d5b69521bdd3 +Block 0005 [ 49]: bf1a13fedd395420 +Block 0005 [ 50]: 5b555201c45b3bde +Block 0005 [ 51]: d697bb37c4d40ad5 +Block 0005 [ 52]: e05a26e4b9f4ccc5 +Block 0005 [ 53]: 0ec56bfea415df1f +Block 0005 [ 54]: 7a75ac9069cd78ef +Block 0005 [ 55]: 246d2c2beaa6c1b0 +Block 0005 [ 56]: 6140b1bda15aab8f +Block 0005 [ 57]: 7b8ef6f99539bf8c +Block 0005 [ 58]: fb5e418d315c83b3 +Block 0005 [ 59]: d6fe3bddeee33757 +Block 0005 [ 60]: 325bc7c925602628 +Block 0005 [ 61]: 43516cffe54b3b0a +Block 0005 [ 62]: 384035fcf36ccb13 +Block 0005 [ 63]: 3c9539555b7f3987 +Block 0005 [ 64]: 22b1ac749010da2c +Block 0005 [ 65]: 031eaeb8a8f08b92 +Block 0005 [ 66]: 6a63b6c7815d478e +Block 0005 [ 67]: dd27ffc33860c497 +Block 0005 [ 68]: 99126b88405bf412 +Block 0005 [ 69]: abccb2bd8cf0704b +Block 0005 [ 70]: 2b1bfcd0f9d379b3 +Block 0005 [ 71]: 3551021bf0ad8ee0 +Block 0005 [ 72]: 3aa0cb329547f7db +Block 0005 [ 73]: c780c336227e34f2 +Block 0005 [ 74]: caf8eacb9a26c871 +Block 0005 [ 75]: b3134f664b9dd172 +Block 0005 [ 76]: 8b23138df8a9fd40 +Block 0005 [ 77]: da12b22060a68654 +Block 0005 [ 78]: 266cb3df2a3e1018 +Block 0005 [ 79]: 492187e0415be49e +Block 0005 [ 80]: 312347210bf47feb +Block 0005 [ 81]: affa92d1b4555ad1 +Block 0005 [ 82]: 70328f688d12367b +Block 0005 [ 83]: 58818080e3e91734 +Block 0005 [ 84]: e36e9321b2429731 +Block 0005 [ 85]: 86b75de040abcef0 +Block 0005 [ 86]: 3306f439957b9731 +Block 0005 [ 87]: 06e0997abfb5d79f +Block 0005 [ 88]: a77295a2f4538305 +Block 0005 [ 89]: 6c0a3e8b55c9e35b +Block 0005 [ 90]: 568bae7e7d1b9abd +Block 0005 [ 91]: 1d3b9385bd55d372 +Block 0005 [ 92]: 4f536880c060d963 +Block 0005 [ 93]: 606521fc00a08c7f +Block 0005 [ 94]: ca173b52b80a7952 +Block 0005 [ 95]: 01c0457196c7269b +Block 0005 [ 96]: ac7a2712fb33911f +Block 0005 [ 97]: 77feb9e9ccf48ecf +Block 0005 [ 98]: b1c088252562dee0 +Block 0005 [ 99]: 5523c9d087069aaf +Block 0005 [100]: e878930aefaddd43 +Block 0005 [101]: 7487a72baff492ef +Block 0005 [102]: 6891437d8a389bd5 +Block 0005 [103]: bfa3113471fd5d18 +Block 0005 [104]: 0d3ddbe17f9e084e +Block 0005 [105]: 2cc1c5a314f6e837 +Block 0005 [106]: 03e0d06131142837 +Block 0005 [107]: 28537aa176e020fc +Block 0005 [108]: e410025b3345934b +Block 0005 [109]: 62c4883861dfd8ae +Block 0005 [110]: 12b80d8ab0a37f1a +Block 0005 [111]: 82b705019cec0fb3 +Block 0005 [112]: ec1ca9634dbffe5b +Block 0005 [113]: 72feedad093bb4b0 +Block 0005 [114]: 6abee7fca315e0d4 +Block 0005 [115]: 5d75e6744aef9203 +Block 0005 [116]: 6be017c75c642aa1 +Block 0005 [117]: 7e172e238794d952 +Block 0005 [118]: 142a6d2f23e2eb72 +Block 0005 [119]: 6c39eb4627fdce76 +Block 0005 [120]: 0f61eb951bb9a8c7 +Block 0005 [121]: f51a98b0335ee217 +Block 0005 [122]: 89f7533015d3b6c5 +Block 0005 [123]: 7c5f4947988a52bc +Block 0005 [124]: 737c5304fdea7426 +Block 0005 [125]: 34f53ef7e17fc1f4 +Block 0005 [126]: 62c66398981ea1e2 +Block 0005 [127]: 39c9a16aee082d52 +Block 0006 [ 0]: c3bcb1abd61815c0 +Block 0006 [ 1]: 83b7950cbd0c5c0e +Block 0006 [ 2]: 3f4b1eb8ca73ddd7 +Block 0006 [ 3]: 4941802796861b2f +Block 0006 [ 4]: d2423564817e9c63 +Block 0006 [ 5]: 30d3554169a39bc3 +Block 0006 [ 6]: 79325b66f3c62418 +Block 0006 [ 7]: a292650ed9851d8b +Block 0006 [ 8]: 5966a6a6a6b98159 +Block 0006 [ 9]: d3d0f7de1865efe1 +Block 0006 [ 10]: f806353da999c88c +Block 0006 [ 11]: 2596be1606155ac3 +Block 0006 [ 12]: 44f7e2410fdade67 +Block 0006 [ 13]: 3ae822a453e5df49 +Block 0006 [ 14]: c709635132fb5232 +Block 0006 [ 15]: 22f02a7d54e8c5ac +Block 0006 [ 16]: cb9702971b3c0666 +Block 0006 [ 17]: 83997e32defcc4f6 +Block 0006 [ 18]: 512837aa821221ac +Block 0006 [ 19]: 9b6396869872661c +Block 0006 [ 20]: 2fe121552172eddd +Block 0006 [ 21]: 946a4d7435354818 +Block 0006 [ 22]: 87b54129576c4a9c +Block 0006 [ 23]: 28b86e840a4064d9 +Block 0006 [ 24]: f9f1822ce98f3ca0 +Block 0006 [ 25]: 344e3c556a58cc14 +Block 0006 [ 26]: 883035b52362e185 +Block 0006 [ 27]: f36ba02aa3454e68 +Block 0006 [ 28]: 048750f15e3ffd00 +Block 0006 [ 29]: 51caa2d99e8a24ab +Block 0006 [ 30]: 7811c3a5ede085db +Block 0006 [ 31]: 191cd21a6481418d +Block 0006 [ 32]: af23c99585efa784 +Block 0006 [ 33]: 009b765496773741 +Block 0006 [ 34]: 6b2f4fc088cd7915 +Block 0006 [ 35]: 2f47f7ffb875f613 +Block 0006 [ 36]: 4d4bc03237a6f45d +Block 0006 [ 37]: 05a194b584b3e4f3 +Block 0006 [ 38]: 876c8e1c406258a9 +Block 0006 [ 39]: 094c4a65daf31597 +Block 0006 [ 40]: 71979d2c94876815 +Block 0006 [ 41]: d95fbb18cdde807b +Block 0006 [ 42]: 56873c3c6a77ea27 +Block 0006 [ 43]: 0e8ee552d3dbb73c +Block 0006 [ 44]: 354914b53c56f3cf +Block 0006 [ 45]: 3af03f752ae6d89f +Block 0006 [ 46]: 9cf11128e09615c1 +Block 0006 [ 47]: 2b1793be04e3d175 +Block 0006 [ 48]: 152c18eb08686b4e +Block 0006 [ 49]: ea062b401a839631 +Block 0006 [ 50]: aee5f2f751f1c24a +Block 0006 [ 51]: 174e16304bc95ced +Block 0006 [ 52]: 31afd4326e143511 +Block 0006 [ 53]: 3e6bb44a56e9adff +Block 0006 [ 54]: a9ab2ae4f513489b +Block 0006 [ 55]: e8b59bb6b3ed5627 +Block 0006 [ 56]: 1a0098009a7d2d2f +Block 0006 [ 57]: f768c69efa1d67b4 +Block 0006 [ 58]: bf24fd4213be81d2 +Block 0006 [ 59]: 26707139bbe1b40d +Block 0006 [ 60]: b0664adea7357dd7 +Block 0006 [ 61]: 048453a9909258e6 +Block 0006 [ 62]: b69cdb041e2b2de0 +Block 0006 [ 63]: 5430e7650ccd9852 +Block 0006 [ 64]: 019f7e73ee6525ac +Block 0006 [ 65]: 1bb5a8b0938dd82c +Block 0006 [ 66]: 5091e79b43e23f21 +Block 0006 [ 67]: f2da3be4a013db03 +Block 0006 [ 68]: 98b2008447c0b8ac +Block 0006 [ 69]: 8846b0e94373ea1f +Block 0006 [ 70]: fbe04b9847c48704 +Block 0006 [ 71]: d1cf382289dc3c2f +Block 0006 [ 72]: 3a29efe90d33f696 +Block 0006 [ 73]: f22903e77daf981e +Block 0006 [ 74]: e6db7a462ee8c50b +Block 0006 [ 75]: c0509059ce0d3cff +Block 0006 [ 76]: 1f46c664bba8807d +Block 0006 [ 77]: 6379a85f3aa0f184 +Block 0006 [ 78]: cc4ba6f32664b4fc +Block 0006 [ 79]: 4c915b1a7bee1063 +Block 0006 [ 80]: b9212960b6c24468 +Block 0006 [ 81]: 79b4f92e0c689f7a +Block 0006 [ 82]: c0f3af7508f81d94 +Block 0006 [ 83]: 58d580eb8f6cab7e +Block 0006 [ 84]: bab9252d091f5a2a +Block 0006 [ 85]: de577666a2048bc7 +Block 0006 [ 86]: 33632662d8715400 +Block 0006 [ 87]: 6d0ea1c72b931660 +Block 0006 [ 88]: a3da78066b27764c +Block 0006 [ 89]: a278a6ddc80a80df +Block 0006 [ 90]: 3c2c1591ff0ff037 +Block 0006 [ 91]: a0e81559825b745b +Block 0006 [ 92]: 7a39c65250040b17 +Block 0006 [ 93]: effd385d0bbfbd5c +Block 0006 [ 94]: a690fb0e8ffc9158 +Block 0006 [ 95]: 142669d9ce44d588 +Block 0006 [ 96]: 90af245b7597b010 +Block 0006 [ 97]: 7f81e10489d3f752 +Block 0006 [ 98]: 98d6bf0d23b826f9 +Block 0006 [ 99]: ff2b06359fa73091 +Block 0006 [100]: b9891d8a4e86a7d1 +Block 0006 [101]: 2f76cd97393807b0 +Block 0006 [102]: a6e08dbea22fdbb4 +Block 0006 [103]: 5e438ed85d0c539a +Block 0006 [104]: adbe1afcb407cd9d +Block 0006 [105]: f8c35e7209ae8fc2 +Block 0006 [106]: f01786a381e5f75d +Block 0006 [107]: a0fd8d9144d2038e +Block 0006 [108]: 559367e9de9364f0 +Block 0006 [109]: 2ccf232c8f6ca882 +Block 0006 [110]: 0e1db01c3b4c62f0 +Block 0006 [111]: 8113e8478672ec59 +Block 0006 [112]: f1ea0ae15d78c389 +Block 0006 [113]: c33cf9e67f720c6d +Block 0006 [114]: 2824d46afa608c48 +Block 0006 [115]: e9ede0276710d159 +Block 0006 [116]: 93e0433df7fc77f6 +Block 0006 [117]: 7d69e3993c1460f3 +Block 0006 [118]: 72abf66864ec87a3 +Block 0006 [119]: 605deff9007bc0ce +Block 0006 [120]: 21b78f4f4ea41262 +Block 0006 [121]: 93e4596f4d325cd0 +Block 0006 [122]: 9b7dee7ba08c21f6 +Block 0006 [123]: eaf1b9c52f63d89a +Block 0006 [124]: 89c423612f0c9ffd +Block 0006 [125]: 9418a0e8c1e851a7 +Block 0006 [126]: 69955c65a7490b33 +Block 0006 [127]: 3173a0c424292d3d +Block 0007 [ 0]: 6ba8496b38841197 +Block 0007 [ 1]: ff6a2e6d337b1531 +Block 0007 [ 2]: fec2383a55d6d0d3 +Block 0007 [ 3]: 822585037db7b999 +Block 0007 [ 4]: 6834a1dab9935597 +Block 0007 [ 5]: 3313c569327449d3 +Block 0007 [ 6]: 53e24b910c22985b +Block 0007 [ 7]: 1e8b33d9e05abd81 +Block 0007 [ 8]: 6670313249886b9e +Block 0007 [ 9]: 207e04ab88f7cf12 +Block 0007 [ 10]: 8a6f5bd892a41752 +Block 0007 [ 11]: b84a87556a3e88e3 +Block 0007 [ 12]: 21b205650be73cf2 +Block 0007 [ 13]: 1eb1561c9672c294 +Block 0007 [ 14]: 3e9a33b36d56b481 +Block 0007 [ 15]: f6ca32e7178da473 +Block 0007 [ 16]: e1ac00984e2fdf66 +Block 0007 [ 17]: e1f213beb00420fe +Block 0007 [ 18]: 70c93c4772003b75 +Block 0007 [ 19]: 2178696de08e8af6 +Block 0007 [ 20]: 0bffb4fc05ac46e1 +Block 0007 [ 21]: 49d5777efd5c299c +Block 0007 [ 22]: 4acec3e85211a3d1 +Block 0007 [ 23]: de3d57be5a2f1031 +Block 0007 [ 24]: 85044f690b7477ce +Block 0007 [ 25]: cd0d85379c56058f +Block 0007 [ 26]: 1c71b6be61c6b3b7 +Block 0007 [ 27]: 31190408aac590f1 +Block 0007 [ 28]: ce49aa0929d8a6ea +Block 0007 [ 29]: d9e6a8f41ec97ed4 +Block 0007 [ 30]: e50cc28d487bcddf +Block 0007 [ 31]: 6e68852e0fb4ea28 +Block 0007 [ 32]: adb9ee01a0fffb02 +Block 0007 [ 33]: 51dba1925c8aa63f +Block 0007 [ 34]: 6e92ab6f38465397 +Block 0007 [ 35]: c2ec2bcdf128653b +Block 0007 [ 36]: b25694a246c4592f +Block 0007 [ 37]: 66410b37f06c626d +Block 0007 [ 38]: 2ccad97a38b8a60d +Block 0007 [ 39]: e80513476e773cb6 +Block 0007 [ 40]: a766c53f0ad112c9 +Block 0007 [ 41]: 4427c130a94fe37a +Block 0007 [ 42]: 2060b67375f3ad3d +Block 0007 [ 43]: 74a58556cc0e6489 +Block 0007 [ 44]: c58074434fddc554 +Block 0007 [ 45]: 858a27583a085017 +Block 0007 [ 46]: f88a99df8f73b570 +Block 0007 [ 47]: c21bb09e329ac925 +Block 0007 [ 48]: 29ea872c5e08034c +Block 0007 [ 49]: bbd71198f12c71df +Block 0007 [ 50]: f6404ea4ef1d6f2e +Block 0007 [ 51]: 145386a7ced124d6 +Block 0007 [ 52]: 69cbf3fc4068f8d6 +Block 0007 [ 53]: d7b7cc641a2170bb +Block 0007 [ 54]: b83c95965b03faed +Block 0007 [ 55]: a4157cf188bb4117 +Block 0007 [ 56]: 7172143717acef86 +Block 0007 [ 57]: cdb6489f49711464 +Block 0007 [ 58]: 1b21f5488c062af2 +Block 0007 [ 59]: 281e751e504dbf68 +Block 0007 [ 60]: 60d0f12dc5e74185 +Block 0007 [ 61]: b08294081e8249ef +Block 0007 [ 62]: 4e5b7b8e64f09128 +Block 0007 [ 63]: 66add7f61b5c0e95 +Block 0007 [ 64]: 675debc5d747afae +Block 0007 [ 65]: 794d5d3f683068a8 +Block 0007 [ 66]: 36e8710f090ebac1 +Block 0007 [ 67]: 13529fc886acb59c +Block 0007 [ 68]: 1d3c5a8f79042ef6 +Block 0007 [ 69]: 3b0927181306d5e0 +Block 0007 [ 70]: 4873c12d854f2927 +Block 0007 [ 71]: a8ef6fb5a498fefc +Block 0007 [ 72]: 8e55a9e91f278162 +Block 0007 [ 73]: f5629f3cd20af0c5 +Block 0007 [ 74]: ae75e9f6c80cf778 +Block 0007 [ 75]: 38fa5d2caefb359b +Block 0007 [ 76]: 1fcfb6d2bbf23517 +Block 0007 [ 77]: 372d4e12820e8f5e +Block 0007 [ 78]: ac9dd03841fc2c41 +Block 0007 [ 79]: 76b002cdba27d3e0 +Block 0007 [ 80]: 1bf59879b1e30e6e +Block 0007 [ 81]: 8a68990cf2a5a8f5 +Block 0007 [ 82]: 632afa5231f6d3d4 +Block 0007 [ 83]: bbf44429a770bb79 +Block 0007 [ 84]: 746687e36209f07b +Block 0007 [ 85]: fad5bc64f3274572 +Block 0007 [ 86]: a018eb23b8814708 +Block 0007 [ 87]: b41cb61d4ad7753e +Block 0007 [ 88]: 580314d1a213d60b +Block 0007 [ 89]: 4e427e87fdc6d92d +Block 0007 [ 90]: 1cb485f5924de8fd +Block 0007 [ 91]: 687fdb6bb6ac98a9 +Block 0007 [ 92]: 04e069dd82a73b0b +Block 0007 [ 93]: 8925a70571fb554e +Block 0007 [ 94]: 14860dde567eb785 +Block 0007 [ 95]: 2426e70c2283d948 +Block 0007 [ 96]: 505e230457a88d97 +Block 0007 [ 97]: 1078e11353e9cfad +Block 0007 [ 98]: 9c29e7f7217ca11c +Block 0007 [ 99]: 3d22a8e0d5b6c73b +Block 0007 [100]: 0e9a6cfffddba9ae +Block 0007 [101]: 038737d6db808e1e +Block 0007 [102]: 76106281d3f52bad +Block 0007 [103]: 433a57c1931117b4 +Block 0007 [104]: 3195542f3f970037 +Block 0007 [105]: f390555bc1c142e8 +Block 0007 [106]: 6e393054580d5c77 +Block 0007 [107]: b59995f826e3ea8a +Block 0007 [108]: 8b67b02c62482a00 +Block 0007 [109]: fc571f50017bf799 +Block 0007 [110]: be5aea8814966996 +Block 0007 [111]: 0806343d7b049900 +Block 0007 [112]: e185db328360b1f7 +Block 0007 [113]: f592ab2705a7630c +Block 0007 [114]: 19a218f17ffaf619 +Block 0007 [115]: 11243b99852c5781 +Block 0007 [116]: e491ffdd746b6f91 +Block 0007 [117]: 2bb1bbc794389f18 +Block 0007 [118]: 05545e1dfa2952e1 +Block 0007 [119]: fae4b68ab089c759 +Block 0007 [120]: 2406bc9a7d295f89 +Block 0007 [121]: 4d14821942c2c37a +Block 0007 [122]: 9455321b00e5824b +Block 0007 [123]: c12b3a7316ccd0ad +Block 0007 [124]: 962ae5fed17351e4 +Block 0007 [125]: b4e0b6e97f44972b +Block 0007 [126]: 4b452df74ac1020e +Block 0007 [127]: 7e0d387b75c20cf5 +Block 0008 [ 0]: 5259ca6d3a36b313 +Block 0008 [ 1]: 1d6d1ead6f5edbf9 +Block 0008 [ 2]: 3e626075da15b3c4 +Block 0008 [ 3]: 159304bf818a9646 +Block 0008 [ 4]: 40f28de5b742a00d +Block 0008 [ 5]: fd764500ccda300a +Block 0008 [ 6]: 93c1a2d82fcfe062 +Block 0008 [ 7]: 891b24e3f7120153 +Block 0008 [ 8]: 27f332ccb78f83d4 +Block 0008 [ 9]: d3df53656df5e84a +Block 0008 [ 10]: b3e520d550fa7e1c +Block 0008 [ 11]: b1018a57bdd1e9f3 +Block 0008 [ 12]: 61b86a7179c4f80d +Block 0008 [ 13]: 4a03abac5da9f1ca +Block 0008 [ 14]: 8fda17eda1a0a156 +Block 0008 [ 15]: 1addce7e73437ac2 +Block 0008 [ 16]: fea9bedf8bb82502 +Block 0008 [ 17]: 4c5840bef9c83e56 +Block 0008 [ 18]: a5b218fc4e41c532 +Block 0008 [ 19]: 5ec230403ad39835 +Block 0008 [ 20]: c7f49b16c6102a74 +Block 0008 [ 21]: 9b2602c9f497a960 +Block 0008 [ 22]: 9b2d5fe555b3465f +Block 0008 [ 23]: 47122c2f575c13c1 +Block 0008 [ 24]: 50a4d6db14d04ddc +Block 0008 [ 25]: 410dc8958a5e2e93 +Block 0008 [ 26]: 20f5192234fac4b5 +Block 0008 [ 27]: b4c41f2c0051c250 +Block 0008 [ 28]: 4ba7da28b90c27e0 +Block 0008 [ 29]: 6c6b3db5578529b8 +Block 0008 [ 30]: 1108be2d43f32bf7 +Block 0008 [ 31]: 6c77b6100babf0a2 +Block 0008 [ 32]: 830dba5dc317b352 +Block 0008 [ 33]: 03da88c747d12d8c +Block 0008 [ 34]: 34dd0664bda16e49 +Block 0008 [ 35]: b78e41567969e6d6 +Block 0008 [ 36]: 92ee7dcaf0366a9e +Block 0008 [ 37]: e61fe366d2213950 +Block 0008 [ 38]: e8ddfcdef2070068 +Block 0008 [ 39]: a525d18a51ef42bf +Block 0008 [ 40]: 2914e74d1937b200 +Block 0008 [ 41]: 828e147751e87a58 +Block 0008 [ 42]: 6678f5b97860ff7e +Block 0008 [ 43]: b92df23d8cd7cf61 +Block 0008 [ 44]: 6249bd3a4dc38950 +Block 0008 [ 45]: 9cf718b68e6260af +Block 0008 [ 46]: 355b1eb992fff80e +Block 0008 [ 47]: fa39bf26a986146e +Block 0008 [ 48]: 4d50d1700b363539 +Block 0008 [ 49]: b576745005e28e0c +Block 0008 [ 50]: 4103cf637375435b +Block 0008 [ 51]: d73e3ce76a4a54a0 +Block 0008 [ 52]: 3afb76f130d0b780 +Block 0008 [ 53]: c107de104e9f2dd5 +Block 0008 [ 54]: 73cb0720c2240f50 +Block 0008 [ 55]: 1bf896e70d6c2083 +Block 0008 [ 56]: a45e07f0cff18009 +Block 0008 [ 57]: 4d7612f5a121ea61 +Block 0008 [ 58]: 893f75beaddfc367 +Block 0008 [ 59]: e370e0dfde0d5d99 +Block 0008 [ 60]: 0c6c3872aa92803d +Block 0008 [ 61]: 29af23c163072580 +Block 0008 [ 62]: e1932b09eba1f3f9 +Block 0008 [ 63]: 85f51b011b100456 +Block 0008 [ 64]: 00a9e1bc03e8991f +Block 0008 [ 65]: d09e12552ef1c5d1 +Block 0008 [ 66]: cc824029d72b7bdc +Block 0008 [ 67]: 05a5cd6e9b167495 +Block 0008 [ 68]: 6d4dcb4d9f5445a8 +Block 0008 [ 69]: cc98c830e7008817 +Block 0008 [ 70]: 814a7125a194beca +Block 0008 [ 71]: 5808972b2747fe67 +Block 0008 [ 72]: 7a81cd0866c59672 +Block 0008 [ 73]: 9d9f58c494142020 +Block 0008 [ 74]: 9b4faa9e4ada6403 +Block 0008 [ 75]: bb43d73d368406b5 +Block 0008 [ 76]: a975c8724e5db21e +Block 0008 [ 77]: 3f7a667f5f787811 +Block 0008 [ 78]: e4a9d2d0fb77087f +Block 0008 [ 79]: 739edaaa0e25def1 +Block 0008 [ 80]: d582427ee94572e7 +Block 0008 [ 81]: 3c8c45c831998bd6 +Block 0008 [ 82]: 4c344b54c0ccaf0c +Block 0008 [ 83]: cf7dd330084c741a +Block 0008 [ 84]: 953fa1dcf74a93e5 +Block 0008 [ 85]: 8084832af5b9a52d +Block 0008 [ 86]: 55baac78297fc151 +Block 0008 [ 87]: fae1b46c08dbc171 +Block 0008 [ 88]: a3d0bdb749a194e0 +Block 0008 [ 89]: e87d1b2638d34859 +Block 0008 [ 90]: 2b9f364c44ab2eb9 +Block 0008 [ 91]: d8262a2360ce0759 +Block 0008 [ 92]: 346bb034f119271c +Block 0008 [ 93]: c94b9fb51412a621 +Block 0008 [ 94]: 4225b9cde4fc86ac +Block 0008 [ 95]: 4e8e3c64415b1ee4 +Block 0008 [ 96]: 60009e56552c6993 +Block 0008 [ 97]: d1abc108a143c4e2 +Block 0008 [ 98]: ce5bdcb7836aa2ca +Block 0008 [ 99]: 1a010f4ef1d0b16c +Block 0008 [100]: 7c3a56be69587764 +Block 0008 [101]: 7369edd379ab8b63 +Block 0008 [102]: eb059375e9d81e38 +Block 0008 [103]: ae49a0bebd2c2ac9 +Block 0008 [104]: 8add79962ff22ad5 +Block 0008 [105]: 2dfb46381509ec52 +Block 0008 [106]: 04de7d1dae36bc35 +Block 0008 [107]: 99e3ae5cacf38f66 +Block 0008 [108]: 5b4db397ff6f28f8 +Block 0008 [109]: 89abdd89178308c5 +Block 0008 [110]: e54007bba21fe65d +Block 0008 [111]: c0e9fdadf5e1e527 +Block 0008 [112]: 3d0f9bbae6d4610a +Block 0008 [113]: df4b0e09deee4fe4 +Block 0008 [114]: 08cf08a9a18f088a +Block 0008 [115]: 58c8f1ae000a0d79 +Block 0008 [116]: 7744856a25d26d97 +Block 0008 [117]: f246a2fab3db25d9 +Block 0008 [118]: 54cf019234a9b36e +Block 0008 [119]: c793d0b47c8dbd37 +Block 0008 [120]: e8c663169cb43d49 +Block 0008 [121]: 19b18b1eb53f8254 +Block 0008 [122]: 483a04f336087aca +Block 0008 [123]: 97493df4888c1ba2 +Block 0008 [124]: e446534935ffa48b +Block 0008 [125]: ad8fa4e6f8cb4598 +Block 0008 [126]: dff80c58fb8dcf69 +Block 0008 [127]: 9615048467e85223 +Block 0009 [ 0]: 8d963957a536997f +Block 0009 [ 1]: c4a6ad17a4903963 +Block 0009 [ 2]: 3ee60a10fade64bd +Block 0009 [ 3]: 918230770a0bda88 +Block 0009 [ 4]: 4dad1f4d8f17a928 +Block 0009 [ 5]: 870a1122e272b9c3 +Block 0009 [ 6]: 899e307819c85ebc +Block 0009 [ 7]: 5641cd3d43fdfaa0 +Block 0009 [ 8]: 69c1d89c1ba02780 +Block 0009 [ 9]: 128b497198c1865c +Block 0009 [ 10]: 4160861b315ab2ee +Block 0009 [ 11]: 784697c277a6072e +Block 0009 [ 12]: 5d62d29bec87100c +Block 0009 [ 13]: 2e6e695196fc9121 +Block 0009 [ 14]: 86a30cd6b0741842 +Block 0009 [ 15]: 1e18a364e5529621 +Block 0009 [ 16]: a311f98926327790 +Block 0009 [ 17]: e32d9b217b876772 +Block 0009 [ 18]: 4582229ca541e0a1 +Block 0009 [ 19]: 8ddbf5257cd31eeb +Block 0009 [ 20]: 42b4f8b1484aac1b +Block 0009 [ 21]: b6c08be2826d7c43 +Block 0009 [ 22]: 848ef012c2332b6c +Block 0009 [ 23]: 4858f635c0303546 +Block 0009 [ 24]: eaed088be0c2a16c +Block 0009 [ 25]: bb4c1b64e3521fc1 +Block 0009 [ 26]: 67cba8006304295c +Block 0009 [ 27]: 95ed7e2dc98c07de +Block 0009 [ 28]: 4f0b541907b7ab11 +Block 0009 [ 29]: 7aaf4aadb5919b8a +Block 0009 [ 30]: 65c3144eacb5e21c +Block 0009 [ 31]: b870063bb1c29683 +Block 0009 [ 32]: d1fccbcb6ac869a8 +Block 0009 [ 33]: e19c542080c1037a +Block 0009 [ 34]: b782df41419c71b7 +Block 0009 [ 35]: 4a15b9dcf0f2914a +Block 0009 [ 36]: 5da3c185b1920dbc +Block 0009 [ 37]: 1e4f4ca00f51a8da +Block 0009 [ 38]: 4540b427d7986a06 +Block 0009 [ 39]: fafd493c29276799 +Block 0009 [ 40]: 6ed26c50e7f2f666 +Block 0009 [ 41]: 65aff4e3d3229085 +Block 0009 [ 42]: c9e8ba24fd75136c +Block 0009 [ 43]: 663fa64fa9fe42f7 +Block 0009 [ 44]: c7544b471dae4d4d +Block 0009 [ 45]: 517114e5034b0c26 +Block 0009 [ 46]: f24e844f304a3465 +Block 0009 [ 47]: 6e5db83b787cb0f8 +Block 0009 [ 48]: 723ec7e828d038fc +Block 0009 [ 49]: 0db3e649393b0c13 +Block 0009 [ 50]: 970b65347ed76a0b +Block 0009 [ 51]: 67b8830d910eb7d8 +Block 0009 [ 52]: cf84ec1f4b8d86eb +Block 0009 [ 53]: be876b2a347b2cfa +Block 0009 [ 54]: 81bb175f13040617 +Block 0009 [ 55]: 29674b23bc32c06a +Block 0009 [ 56]: 034979be2e66bd20 +Block 0009 [ 57]: 16616446a32d1454 +Block 0009 [ 58]: 4c3b6001cf1aa63f +Block 0009 [ 59]: c16597bd1140e5f8 +Block 0009 [ 60]: 4915156867633734 +Block 0009 [ 61]: c58d3c905365d036 +Block 0009 [ 62]: a1a58f8411565ab5 +Block 0009 [ 63]: e0b468700d2b3969 +Block 0009 [ 64]: af4e54cfdabd7edb +Block 0009 [ 65]: 8b634eecb5a46d85 +Block 0009 [ 66]: 5c923be735f6b858 +Block 0009 [ 67]: c0f362cb40cfd94e +Block 0009 [ 68]: c67c2ba34bda20ec +Block 0009 [ 69]: a3413ddc6029885f +Block 0009 [ 70]: cc207f19ab7e5f18 +Block 0009 [ 71]: c73bfd337bf0f0b1 +Block 0009 [ 72]: ee284443d5ced8cf +Block 0009 [ 73]: 1b9232b01fad047e +Block 0009 [ 74]: 703688554bee2ae4 +Block 0009 [ 75]: f597ac898a79680c +Block 0009 [ 76]: 5325576a2e5adbaf +Block 0009 [ 77]: b2781327e24f8204 +Block 0009 [ 78]: c6840aa28b3e3b9a +Block 0009 [ 79]: b80c00e463ce419e +Block 0009 [ 80]: 08c14af5fd669746 +Block 0009 [ 81]: cbf2715a3e703b03 +Block 0009 [ 82]: 5c5252edfcefc3fe +Block 0009 [ 83]: c48bbd0ba30fd38c +Block 0009 [ 84]: 0355e5b24d75ccb0 +Block 0009 [ 85]: 95339e461d24b225 +Block 0009 [ 86]: b9d5a4b5eb19ce67 +Block 0009 [ 87]: 7781e7c609adb4ba +Block 0009 [ 88]: fdef794fbe63f3a6 +Block 0009 [ 89]: bb85bdfff07b8070 +Block 0009 [ 90]: c1564b6b30544c8b +Block 0009 [ 91]: ca50d06573e145b8 +Block 0009 [ 92]: c8b9a64f3c9dcdfe +Block 0009 [ 93]: 96384a8d0c02ed62 +Block 0009 [ 94]: a3e0251da1846848 +Block 0009 [ 95]: 9e46f28821fcd8a3 +Block 0009 [ 96]: d511566c1b2a611a +Block 0009 [ 97]: b3f0b3d1d6decdf6 +Block 0009 [ 98]: b356cc84ab1dd563 +Block 0009 [ 99]: 79385780cdc22aa6 +Block 0009 [100]: 8e54d0f99da0ba48 +Block 0009 [101]: eeb4bbc030ecb64f +Block 0009 [102]: aa65a55cb2217b98 +Block 0009 [103]: 74c0f4b18cb18580 +Block 0009 [104]: 8800a12932cafd8d +Block 0009 [105]: dc3f1cafe3ef4169 +Block 0009 [106]: e22f0b7715086a3a +Block 0009 [107]: 23e7ff371f808fab +Block 0009 [108]: 2722c0cd8303729a +Block 0009 [109]: 2e19a354daddf68e +Block 0009 [110]: bf066010ca4d2470 +Block 0009 [111]: 93bf7152d6c01024 +Block 0009 [112]: bf0e9c8587beeeea +Block 0009 [113]: bdcd171d0af4f8c8 +Block 0009 [114]: 50d615372d928f8a +Block 0009 [115]: e6e1a1f298ead702 +Block 0009 [116]: 688961c8eef31af0 +Block 0009 [117]: 6286463479291f80 +Block 0009 [118]: 2326971a8e438ca8 +Block 0009 [119]: cfabc762664132ba +Block 0009 [120]: 453e4d9874f8c7d2 +Block 0009 [121]: 252f5639b54d91c1 +Block 0009 [122]: bdfadba3e20d0814 +Block 0009 [123]: c7e2ea1a068ac5fc +Block 0009 [124]: 60b0c61c569a38a9 +Block 0009 [125]: 23697167f4e5bca5 +Block 0009 [126]: f0f6d6ba1b088fc4 +Block 0009 [127]: 45c7753fff713126 +Block 0010 [ 0]: a155295b01ac4d30 +Block 0010 [ 1]: 68ab16c5843df6cb +Block 0010 [ 2]: ed7098da0bd1ff3b +Block 0010 [ 3]: 0db2099cb481af2f +Block 0010 [ 4]: a52db650e07ce567 +Block 0010 [ 5]: 2750f845c384504b +Block 0010 [ 6]: 0a83bf1dae23e4c3 +Block 0010 [ 7]: de8d504a2708cdf3 +Block 0010 [ 8]: f93265ef617dff1d +Block 0010 [ 9]: aeeff126f1e4567c +Block 0010 [ 10]: be36af22f2341833 +Block 0010 [ 11]: e237aa380f006bde +Block 0010 [ 12]: 2841c97e30c36218 +Block 0010 [ 13]: 184af4aea8cd5e3d +Block 0010 [ 14]: 876a611ed9d49bdf +Block 0010 [ 15]: 88dcffa6fdff7e0f +Block 0010 [ 16]: e868b86f79e7c8e5 +Block 0010 [ 17]: fc48a515f1f1fc7a +Block 0010 [ 18]: 4de6909906d51551 +Block 0010 [ 19]: f405e8ed00ab8bcb +Block 0010 [ 20]: 303ec10c8f448bfc +Block 0010 [ 21]: 356c758cb6c5a6e1 +Block 0010 [ 22]: 81c1c60cbfe526f3 +Block 0010 [ 23]: 67769a6e5c0614a4 +Block 0010 [ 24]: 808c3f810c6ae10a +Block 0010 [ 25]: 1311e7194ea63ca3 +Block 0010 [ 26]: 51d884b09a5f06c9 +Block 0010 [ 27]: 31f59e84e05466e3 +Block 0010 [ 28]: bbec4b3666df4af1 +Block 0010 [ 29]: 7cf8ac6e32ec9c9b +Block 0010 [ 30]: 6df4b0777ac0d800 +Block 0010 [ 31]: c044519371be85bd +Block 0010 [ 32]: c904303d438b2327 +Block 0010 [ 33]: d37cc11f5a390efe +Block 0010 [ 34]: a442a081b209a435 +Block 0010 [ 35]: ea5fd8c62a00f630 +Block 0010 [ 36]: f29acbd22fe24aba +Block 0010 [ 37]: 58250563d6e9d821 +Block 0010 [ 38]: b6aa81f0386d4805 +Block 0010 [ 39]: 2959dfb28bbfdc1d +Block 0010 [ 40]: afb376911753d340 +Block 0010 [ 41]: ff93ed94cac1679a +Block 0010 [ 42]: 255a7e056235ca61 +Block 0010 [ 43]: c53082cfa7444f13 +Block 0010 [ 44]: 85c5e2c1da5750c9 +Block 0010 [ 45]: 3d830e2c63bb654c +Block 0010 [ 46]: 38d498ed77856052 +Block 0010 [ 47]: 9f5bfa824372f0b0 +Block 0010 [ 48]: fa2a179bd8996d69 +Block 0010 [ 49]: 40f27a5bd12cf513 +Block 0010 [ 50]: 0e2770ef9875c3fd +Block 0010 [ 51]: 0b0605ce69236666 +Block 0010 [ 52]: e300caa5339b66d9 +Block 0010 [ 53]: ea15eb73ed763d9f +Block 0010 [ 54]: aca1d069a5b673ed +Block 0010 [ 55]: eb1582e734dca43b +Block 0010 [ 56]: ae1f595784c7a0d1 +Block 0010 [ 57]: 11773c35e07ad36e +Block 0010 [ 58]: ade39ad32aa382df +Block 0010 [ 59]: a0cd5005220bf1d2 +Block 0010 [ 60]: 4cd54612e5ae3ab1 +Block 0010 [ 61]: 718c32e1f0f4d42d +Block 0010 [ 62]: ed1f4959e2732ab9 +Block 0010 [ 63]: 56a9fd7a2779ec0d +Block 0010 [ 64]: 6c26e13421fc4adf +Block 0010 [ 65]: 2aef67967429131f +Block 0010 [ 66]: 98a3c0c68368bd99 +Block 0010 [ 67]: a26987ead29cc55d +Block 0010 [ 68]: 52488b2265b5c01b +Block 0010 [ 69]: 151cf48de1fe8f67 +Block 0010 [ 70]: 8ca385421622de8f +Block 0010 [ 71]: 030a4ed9cdbac297 +Block 0010 [ 72]: 648302f6f37362dd +Block 0010 [ 73]: 100a968b3ee2cbf2 +Block 0010 [ 74]: eedf1aef6c2dd804 +Block 0010 [ 75]: 0d715cdd579b672a +Block 0010 [ 76]: 0a5ea66e059bae9e +Block 0010 [ 77]: ef9f5ac4fbc451da +Block 0010 [ 78]: 845ea8478e73a043 +Block 0010 [ 79]: a77ccaf8cdd52b7f +Block 0010 [ 80]: 91ea5e5d11aef2cf +Block 0010 [ 81]: ff048e6f903d4a54 +Block 0010 [ 82]: 822305d17b8f1f91 +Block 0010 [ 83]: d73824354065568c +Block 0010 [ 84]: 2b44d0d77e59f310 +Block 0010 [ 85]: ec92eab7de901b36 +Block 0010 [ 86]: 6e08016fa0d063c3 +Block 0010 [ 87]: 4bf9004837e9583b +Block 0010 [ 88]: 3e90cf88cd76ef51 +Block 0010 [ 89]: 922de6420db4e9ad +Block 0010 [ 90]: 061881dfad24119a +Block 0010 [ 91]: 8f6a872a98be535b +Block 0010 [ 92]: 22ae2709eec244b2 +Block 0010 [ 93]: f236154cda27421c +Block 0010 [ 94]: 518cd738e05da247 +Block 0010 [ 95]: fc03cebe3057d920 +Block 0010 [ 96]: bb23eb6eb9e60b8e +Block 0010 [ 97]: 6193477b593d97fe +Block 0010 [ 98]: 40f082b0b3d57018 +Block 0010 [ 99]: 096790e49d224334 +Block 0010 [100]: d2dafff37dbffd43 +Block 0010 [101]: 3574fcbfe52e8b8c +Block 0010 [102]: 6ec82c308a5e69c1 +Block 0010 [103]: 583434560a091635 +Block 0010 [104]: 06829557ec535cfb +Block 0010 [105]: f4043f12018d3761 +Block 0010 [106]: 8e388c730ec84362 +Block 0010 [107]: 2a6e35d51235dbb2 +Block 0010 [108]: 1b9442bc195397f4 +Block 0010 [109]: 0936c2e76ce5a0df +Block 0010 [110]: 8d684e8befbbd5c7 +Block 0010 [111]: 0a1240e8def43989 +Block 0010 [112]: bfb4b54653ff9af3 +Block 0010 [113]: 25ae9402aa130a0d +Block 0010 [114]: 7d276ec556940d88 +Block 0010 [115]: cda890baf010f915 +Block 0010 [116]: 56f9901e7075728b +Block 0010 [117]: 6b73d35e23ddba2c +Block 0010 [118]: a89df666576093f2 +Block 0010 [119]: 8f65a1ede29fbd78 +Block 0010 [120]: a68506cdaef8c905 +Block 0010 [121]: a1470990c4b30b1a +Block 0010 [122]: 0eb09895d515d9b1 +Block 0010 [123]: bf69f75cdd17fcfa +Block 0010 [124]: eb84a10c20614087 +Block 0010 [125]: 96379c54d0c2023b +Block 0010 [126]: a7477d567fd71950 +Block 0010 [127]: f037e9b031a97504 +Block 0011 [ 0]: 16d5da761e2acf6f +Block 0011 [ 1]: 6ad87f540d41f387 +Block 0011 [ 2]: 6f820405b2971af5 +Block 0011 [ 3]: 17b25af4c1c16f5e +Block 0011 [ 4]: 2ee33eb0bfaa58f9 +Block 0011 [ 5]: b7485047f793e807 +Block 0011 [ 6]: e52fab8ca2aaf375 +Block 0011 [ 7]: d6acc6a7c567b85c +Block 0011 [ 8]: b9ab663e0824a963 +Block 0011 [ 9]: 3ed7c09ce01c8ad6 +Block 0011 [ 10]: 837443ede4f8bed6 +Block 0011 [ 11]: 8353cf5e1459756d +Block 0011 [ 12]: 01c08edcae2527d6 +Block 0011 [ 13]: db388b3e6b962544 +Block 0011 [ 14]: c113c7ed15543703 +Block 0011 [ 15]: 0bc986fa7737339d +Block 0011 [ 16]: e17dd29e93c96a73 +Block 0011 [ 17]: 7d4e5d3027092ecb +Block 0011 [ 18]: 8c165d43a9b74c65 +Block 0011 [ 19]: 11d3bb05f3c2dca0 +Block 0011 [ 20]: 8b12c7a8b3767321 +Block 0011 [ 21]: 24cce4a0f3500b45 +Block 0011 [ 22]: 7d6eaa8f935fe7fd +Block 0011 [ 23]: 149d30539dfa5940 +Block 0011 [ 24]: 23d0f122c7c0cbcf +Block 0011 [ 25]: d899562ed181b04e +Block 0011 [ 26]: dbc100cb4edfc990 +Block 0011 [ 27]: 177854a7449272f6 +Block 0011 [ 28]: 44d3ff8214a0f0c3 +Block 0011 [ 29]: 233f4fab487f5942 +Block 0011 [ 30]: c94a38017b4d0e24 +Block 0011 [ 31]: 14907f985d2d0332 +Block 0011 [ 32]: 3521d2a02c50eada +Block 0011 [ 33]: 329f4202c68dc27a +Block 0011 [ 34]: 5648323f8456bd6c +Block 0011 [ 35]: 9381cfcfb0b9a3da +Block 0011 [ 36]: 7420d4017e432c52 +Block 0011 [ 37]: 74ea06fcaf152880 +Block 0011 [ 38]: 7b44ce911f823401 +Block 0011 [ 39]: b923ee926f87622c +Block 0011 [ 40]: 0283c7a1f167499b +Block 0011 [ 41]: e1737ba82a19c571 +Block 0011 [ 42]: f9b63927e53a45f6 +Block 0011 [ 43]: 9550a830500a3210 +Block 0011 [ 44]: 05c7a35d07ade74f +Block 0011 [ 45]: ed1a289ffb3f305e +Block 0011 [ 46]: 2c8d598ad77f601b +Block 0011 [ 47]: 25e4baff52399210 +Block 0011 [ 48]: e74b1e3b49e9a78b +Block 0011 [ 49]: 18b4b3f39c90f7c7 +Block 0011 [ 50]: 329822ea868b1fd7 +Block 0011 [ 51]: 6411cb3574b64ade +Block 0011 [ 52]: 947891798fd01f8d +Block 0011 [ 53]: 3dd08d795b8c02c2 +Block 0011 [ 54]: 478fd0d43a7fa288 +Block 0011 [ 55]: 88a9b9dc0ae9c7a9 +Block 0011 [ 56]: b9583b9e42ba1802 +Block 0011 [ 57]: e1e9bc1d711c8f22 +Block 0011 [ 58]: 15881e0659ceda04 +Block 0011 [ 59]: d1501a760d3d4a33 +Block 0011 [ 60]: 038c4699f07c1fc5 +Block 0011 [ 61]: 89a0f133277bf367 +Block 0011 [ 62]: 67129d0a742b771b +Block 0011 [ 63]: d55736ca7e7d5c13 +Block 0011 [ 64]: 66d17ba5ebb98138 +Block 0011 [ 65]: 905043e0102e5136 +Block 0011 [ 66]: 5ce42fae82caeeb5 +Block 0011 [ 67]: eee0b24c626ccfb2 +Block 0011 [ 68]: f13b34cfa160faa6 +Block 0011 [ 69]: d152913d8434e565 +Block 0011 [ 70]: 46f08fa361436ed8 +Block 0011 [ 71]: 476fe95a3eb25b18 +Block 0011 [ 72]: d0821f62c54f4b63 +Block 0011 [ 73]: af1912c68f81b8b5 +Block 0011 [ 74]: 7d0aed1b7cfe9215 +Block 0011 [ 75]: f7013ad16ab17ac1 +Block 0011 [ 76]: bdea73e717e5e9c7 +Block 0011 [ 77]: 36d8d670c31182db +Block 0011 [ 78]: 50f5bbe3f051fcd9 +Block 0011 [ 79]: 5d410ac5d4379955 +Block 0011 [ 80]: 4b9720ccfbe61a3d +Block 0011 [ 81]: 6c63bd26273ad3d8 +Block 0011 [ 82]: 9909be9a65ef8aae +Block 0011 [ 83]: 47d7660487d79065 +Block 0011 [ 84]: 9b65b7f5ca6f10f7 +Block 0011 [ 85]: 5c30891026346e3a +Block 0011 [ 86]: 0955df9ce73a911a +Block 0011 [ 87]: 235c4f3afaac52f4 +Block 0011 [ 88]: d3fa46a611e7ae27 +Block 0011 [ 89]: 89c0db05c5f3024f +Block 0011 [ 90]: dbcb01a6c0e4050b +Block 0011 [ 91]: abca89b857e99e18 +Block 0011 [ 92]: eb31d6fb723e632a +Block 0011 [ 93]: 031c7b76283804d5 +Block 0011 [ 94]: 30ccac15e32a08ed +Block 0011 [ 95]: 242f2b13e7fe0266 +Block 0011 [ 96]: 0b1b51fdcaab6bb8 +Block 0011 [ 97]: 9d336dfd23b236a3 +Block 0011 [ 98]: 4eeaf99bcf0c1173 +Block 0011 [ 99]: 9294e337605f02d2 +Block 0011 [100]: b7391a42963d8a3f +Block 0011 [101]: 8c7f9f625e1c4ffb +Block 0011 [102]: 7c202d63402ffb12 +Block 0011 [103]: 465d394021fba944 +Block 0011 [104]: b70e74918fcf4e79 +Block 0011 [105]: a02932280e957875 +Block 0011 [106]: b82709862601c6e7 +Block 0011 [107]: 4dcd278efa73b84f +Block 0011 [108]: c989a31b52fe9ea3 +Block 0011 [109]: 3e67e65ed7d255b1 +Block 0011 [110]: 5bd18bc29536ccc3 +Block 0011 [111]: b23efe04420321f9 +Block 0011 [112]: c57b1b093eabd7a7 +Block 0011 [113]: bdefbdc6c8803be8 +Block 0011 [114]: cae880e44d925961 +Block 0011 [115]: 7cf1bf54e78c13ba +Block 0011 [116]: aafa3cf4189ae522 +Block 0011 [117]: 41b52b96d7aa2e0c +Block 0011 [118]: 9f67eff23fffc6e1 +Block 0011 [119]: 9eef0c2059cc2b4e +Block 0011 [120]: d0014fdd3e2eaaa9 +Block 0011 [121]: d6dc04699625b658 +Block 0011 [122]: ee5b509a8fec397d +Block 0011 [123]: e99b5a5b20642de4 +Block 0011 [124]: 1853735329636fde +Block 0011 [125]: 6249b557a6fb93d9 +Block 0011 [126]: 2502ceca006bcbef +Block 0011 [127]: 691208dd510b74b4 +Block 0012 [ 0]: 479bed6dde74697b +Block 0012 [ 1]: c837d8d60d2214a3 +Block 0012 [ 2]: 2cce7a5664653b4e +Block 0012 [ 3]: d5f47908104f9dfe +Block 0012 [ 4]: 8f33f1a3401ce873 +Block 0012 [ 5]: 6318d20c310aa3f3 +Block 0012 [ 6]: 9a8c1067e646cf2f +Block 0012 [ 7]: da0411c4f0b9d646 +Block 0012 [ 8]: 4f1a128c6195af3e +Block 0012 [ 9]: f66c9e56cb5f4ff4 +Block 0012 [ 10]: bb192d9a6e711985 +Block 0012 [ 11]: 57136bae517fc91d +Block 0012 [ 12]: a4b51776c440f3ae +Block 0012 [ 13]: 9948574e322d3dd9 +Block 0012 [ 14]: 9ea814ec6cbb9955 +Block 0012 [ 15]: 55b4234e06276f01 +Block 0012 [ 16]: 384ba30dd3183608 +Block 0012 [ 17]: dcc76d5af8b9f6e1 +Block 0012 [ 18]: 80d439b91f04b10f +Block 0012 [ 19]: b72f956fb72c081b +Block 0012 [ 20]: 78cc14d32f4f1cdc +Block 0012 [ 21]: ad99b2f9a74185f2 +Block 0012 [ 22]: 987dc5012ae1a664 +Block 0012 [ 23]: ebc1098f16346958 +Block 0012 [ 24]: 7cf6fb6601ad0cff +Block 0012 [ 25]: d53828e896e30068 +Block 0012 [ 26]: 80f07625663e91e9 +Block 0012 [ 27]: da9aa3dcebf93e45 +Block 0012 [ 28]: 5f7d20f04cfa78c6 +Block 0012 [ 29]: f880f90b6a602855 +Block 0012 [ 30]: 5e52e35b8b9910c5 +Block 0012 [ 31]: 6edaa56bdea58a09 +Block 0012 [ 32]: bd3bf1ccf3b938b5 +Block 0012 [ 33]: a72a4a89ab2fdc74 +Block 0012 [ 34]: 080d919b24f87a04 +Block 0012 [ 35]: 27e7d16d439111d6 +Block 0012 [ 36]: aa9674480df2c6e0 +Block 0012 [ 37]: 2f69d96019e10cdd +Block 0012 [ 38]: 522951c9583f8368 +Block 0012 [ 39]: e443adf29afac5f2 +Block 0012 [ 40]: 748efa26a7b9f7b4 +Block 0012 [ 41]: c1d82ff00f41a415 +Block 0012 [ 42]: 93b12a65b481644c +Block 0012 [ 43]: 3a9361a1a24fb8fe +Block 0012 [ 44]: 9fa9db4674c4ae0b +Block 0012 [ 45]: 6c09c898703d18dd +Block 0012 [ 46]: a2364154f4aa1c76 +Block 0012 [ 47]: 0317e1ab68529d62 +Block 0012 [ 48]: 82a51ec093f4e4ac +Block 0012 [ 49]: 7e1b86bae00f0341 +Block 0012 [ 50]: 4d9e742cc0951668 +Block 0012 [ 51]: d1bd11f39b511da6 +Block 0012 [ 52]: eb509302c5ed1b65 +Block 0012 [ 53]: e3a4db785c5e6419 +Block 0012 [ 54]: 5b43dc7bce9ac02c +Block 0012 [ 55]: 8fb29954e608f2fd +Block 0012 [ 56]: 2cf4847ccfd29810 +Block 0012 [ 57]: 7054dfa1e24ea4a1 +Block 0012 [ 58]: 413d54995b4a3847 +Block 0012 [ 59]: 0ca94a54d1234516 +Block 0012 [ 60]: e3f21986e65a1276 +Block 0012 [ 61]: 9d30023f2b0de00d +Block 0012 [ 62]: c57c67ac34de2acb +Block 0012 [ 63]: cea1c131b2e6f6f1 +Block 0012 [ 64]: 44d107c62c763d74 +Block 0012 [ 65]: c4b1203184ceac4a +Block 0012 [ 66]: 7726c5e222f77f87 +Block 0012 [ 67]: 96b88e59365ac05c +Block 0012 [ 68]: 94b969b2c696dc77 +Block 0012 [ 69]: 37b575acdafcdcbc +Block 0012 [ 70]: cb8e3c2b408d264d +Block 0012 [ 71]: 36e779fd95a9693c +Block 0012 [ 72]: d7e90f25f0da03d4 +Block 0012 [ 73]: e4975c96652101fe +Block 0012 [ 74]: 249694d8ba8080c7 +Block 0012 [ 75]: 078fbed98e73cf86 +Block 0012 [ 76]: 3dfa5218e5f22b77 +Block 0012 [ 77]: 9b3a6a1272d472dc +Block 0012 [ 78]: e3c6ce5493d39837 +Block 0012 [ 79]: 53518b494be87ca8 +Block 0012 [ 80]: cb9b6888c60d8336 +Block 0012 [ 81]: c73e313c1f688a9e +Block 0012 [ 82]: b732289be782b0dc +Block 0012 [ 83]: a23853027cf2a452 +Block 0012 [ 84]: 6203d97675096015 +Block 0012 [ 85]: 8cd7d53aeb740717 +Block 0012 [ 86]: 57d24cb2a31b5720 +Block 0012 [ 87]: b1b20f5f0cdfbc58 +Block 0012 [ 88]: 5e7adb7681cffb5c +Block 0012 [ 89]: 2ecba812756d30ab +Block 0012 [ 90]: 3ee2f6f4691fc2ee +Block 0012 [ 91]: 7ad83ed55ea1e4de +Block 0012 [ 92]: 8145b77b8bb02543 +Block 0012 [ 93]: 12ba71f86b801c88 +Block 0012 [ 94]: d742db3bb16c11ef +Block 0012 [ 95]: b6f3487e39bbbfea +Block 0012 [ 96]: 3c807e44e0f76419 +Block 0012 [ 97]: 2b67cb709daaba44 +Block 0012 [ 98]: 854e279d27594d9d +Block 0012 [ 99]: c6c5fc086e450097 +Block 0012 [100]: 60c96c36a34f567e +Block 0012 [101]: 320b1a20620c6a52 +Block 0012 [102]: e261aef2b4735167 +Block 0012 [103]: 38c79e39edd260f8 +Block 0012 [104]: 80d057ab61c1c373 +Block 0012 [105]: 3d843068498eaa9d +Block 0012 [106]: f7200a89d0b53ec2 +Block 0012 [107]: 208a5da69d2804cd +Block 0012 [108]: cdc8eb2dd5303721 +Block 0012 [109]: d553e50ff2dc23ad +Block 0012 [110]: b8a284c5390a6677 +Block 0012 [111]: 2e8337fb6b5a8068 +Block 0012 [112]: 8aa4ee1b63809c68 +Block 0012 [113]: cb2d7ce6f22bfe1c +Block 0012 [114]: 45884652a6502a3d +Block 0012 [115]: b70308e7a301b39a +Block 0012 [116]: 5e0fbc5229a687fb +Block 0012 [117]: e6090e6b6d4afdce +Block 0012 [118]: 283f22d8fb804f61 +Block 0012 [119]: 0140e2e41a6c1064 +Block 0012 [120]: 3bc6a2c13687a35e +Block 0012 [121]: 709c8a7b7787060a +Block 0012 [122]: 395451d23660c97e +Block 0012 [123]: 9de1b10411494865 +Block 0012 [124]: c7901a854d4b2ac0 +Block 0012 [125]: 36c185f932b47622 +Block 0012 [126]: 8da1cc1943d6651d +Block 0012 [127]: 84a6607c1b0506c9 +Block 0013 [ 0]: 869de2c4be545941 +Block 0013 [ 1]: 4e3e2310099f6efc +Block 0013 [ 2]: 53cf9c3ba87811c0 +Block 0013 [ 3]: 45ba8f270479088c +Block 0013 [ 4]: cbc47bdb4bfb9512 +Block 0013 [ 5]: 705f37996c447d25 +Block 0013 [ 6]: 64f985dd3edfb36a +Block 0013 [ 7]: 30dc1cccd7a15a67 +Block 0013 [ 8]: 9d64ca45397a3987 +Block 0013 [ 9]: 643c9f78432b9e83 +Block 0013 [ 10]: 59bb13fda190b187 +Block 0013 [ 11]: 9c133bb3453ed3c4 +Block 0013 [ 12]: 632fc9efd5701891 +Block 0013 [ 13]: 12849ab202ce82fb +Block 0013 [ 14]: 1ef1705beb9facec +Block 0013 [ 15]: 18c2856c7f1ffd53 +Block 0013 [ 16]: ec08f1d3139e748f +Block 0013 [ 17]: 6a9555f38829e066 +Block 0013 [ 18]: a266ec1c4d6a0914 +Block 0013 [ 19]: 9da85111fa971270 +Block 0013 [ 20]: d2703c03675b4d56 +Block 0013 [ 21]: 052169e2a88da447 +Block 0013 [ 22]: 4df8ea75293ef8eb +Block 0013 [ 23]: 98a67dffd7bf1584 +Block 0013 [ 24]: 9e0ea048198f4e6b +Block 0013 [ 25]: c0ced52ac8776fc1 +Block 0013 [ 26]: 5dc759a20859e47f +Block 0013 [ 27]: 3eaa91ec50be0842 +Block 0013 [ 28]: e01f425fff0d5ccd +Block 0013 [ 29]: 5bc54a37268f877d +Block 0013 [ 30]: d70aaf26f46b54ca +Block 0013 [ 31]: 38cc404e371a5fa3 +Block 0013 [ 32]: 8caf2d6497da9dd7 +Block 0013 [ 33]: 0f59968a70e65c73 +Block 0013 [ 34]: 5df8b31703ac512a +Block 0013 [ 35]: 6a282d3ccc9974d9 +Block 0013 [ 36]: 7e1f19160264cc76 +Block 0013 [ 37]: 31384a7c8ddbe02c +Block 0013 [ 38]: cc2366252232f299 +Block 0013 [ 39]: 3edae45774890aca +Block 0013 [ 40]: 0d68e6d5ab8a3789 +Block 0013 [ 41]: 0a6311497373525e +Block 0013 [ 42]: 392f2b5968e6da1d +Block 0013 [ 43]: f51bfde00fd8ae12 +Block 0013 [ 44]: f745dd5d22f2389f +Block 0013 [ 45]: 8a29d9d8e38d6abd +Block 0013 [ 46]: 43dfa80fbaee264f +Block 0013 [ 47]: 41c8f46d33dbc1df +Block 0013 [ 48]: 38e4ffeac09c1559 +Block 0013 [ 49]: 35e68675c46dd316 +Block 0013 [ 50]: cf7dd905cbcdfc71 +Block 0013 [ 51]: 0ecb3be43721b94f +Block 0013 [ 52]: d2df07056860f6bf +Block 0013 [ 53]: 4375012359501fab +Block 0013 [ 54]: 5f0f024635f27998 +Block 0013 [ 55]: 605253df9c015df1 +Block 0013 [ 56]: 52ef0714a0978174 +Block 0013 [ 57]: 1e0cbe08d115392d +Block 0013 [ 58]: b0861399e44a6671 +Block 0013 [ 59]: 12f06ce67cb65a63 +Block 0013 [ 60]: 88e2b2f4d5aa270c +Block 0013 [ 61]: b416ae8495cdb1dd +Block 0013 [ 62]: 476eb9a14827f2d6 +Block 0013 [ 63]: 3fe106fdc31e49b7 +Block 0013 [ 64]: f65c055ed52486ec +Block 0013 [ 65]: 520ce94b1bdf56fc +Block 0013 [ 66]: cb665701c023670b +Block 0013 [ 67]: efffd466a44a6ecc +Block 0013 [ 68]: 5d4016d66b7428c0 +Block 0013 [ 69]: 21dc31325439d1f1 +Block 0013 [ 70]: 09269f65d8343f6c +Block 0013 [ 71]: b8911cbf45e6e91e +Block 0013 [ 72]: 57917b9b8f857336 +Block 0013 [ 73]: d5936dc55b3b8dfa +Block 0013 [ 74]: 6bbcfb958f006d1b +Block 0013 [ 75]: 3eee9ffc6db62eaa +Block 0013 [ 76]: 0c27000175b7c256 +Block 0013 [ 77]: 7b57e54e0f284814 +Block 0013 [ 78]: ce5c71ad657a0f9e +Block 0013 [ 79]: 113fd1f5a39d12ab +Block 0013 [ 80]: 5d310f2e39a4ebf9 +Block 0013 [ 81]: caef54f2ee5bc4af +Block 0013 [ 82]: 74d02a51575f9d89 +Block 0013 [ 83]: cbe8c9b293f234a3 +Block 0013 [ 84]: 97664e656bdf7a18 +Block 0013 [ 85]: 50cadc8443995bfe +Block 0013 [ 86]: c5bc3dbcd40bfb84 +Block 0013 [ 87]: 4f182b51402a7fdd +Block 0013 [ 88]: 82e5cb9b38d5147d +Block 0013 [ 89]: 9f96d4d29ad743bb +Block 0013 [ 90]: 9df98bdaf7111234 +Block 0013 [ 91]: fa101598dbefaff3 +Block 0013 [ 92]: 0a9112ed1833295d +Block 0013 [ 93]: 5a1819c534c75f6e +Block 0013 [ 94]: 863b85ee5f040587 +Block 0013 [ 95]: 536a68ab78ce76db +Block 0013 [ 96]: e63773caba37d0d7 +Block 0013 [ 97]: 3019b9bcbc3f7f0c +Block 0013 [ 98]: c1dfb09fe2d9ed0b +Block 0013 [ 99]: ebe8e7e4e4d0bf5c +Block 0013 [100]: 55af1a98cd9c8eaf +Block 0013 [101]: 5a491d1c5210d0b7 +Block 0013 [102]: 36b51725274f3586 +Block 0013 [103]: d479ff760a6da201 +Block 0013 [104]: 5502a0a5abd69dc5 +Block 0013 [105]: cc7e981900143bb3 +Block 0013 [106]: 08262d89452d89bb +Block 0013 [107]: 2ade91d1358ef400 +Block 0013 [108]: 45a1bf547d66f5ad +Block 0013 [109]: f8534c4b19fdec11 +Block 0013 [110]: c2dc68df97f00da1 +Block 0013 [111]: 9a67651f64fc054c +Block 0013 [112]: 51cbcbb7f2388fc1 +Block 0013 [113]: b22586297e8d659b +Block 0013 [114]: 111c205af275e222 +Block 0013 [115]: a1b63b89156d22d0 +Block 0013 [116]: f00bc4173610a284 +Block 0013 [117]: 807f16cfa68d7daf +Block 0013 [118]: 131e2a15d73586be +Block 0013 [119]: 99c188d88b8b19f8 +Block 0013 [120]: b191a1d6a7f7025f +Block 0013 [121]: f9901cf222b01b1b +Block 0013 [122]: 64bcf834a02188bc +Block 0013 [123]: 268289b3f602d318 +Block 0013 [124]: d77bc155075f3301 +Block 0013 [125]: 3db1c22c96a653fe +Block 0013 [126]: ae5bfce1a9f3044e +Block 0013 [127]: 78d5aaf71c2a77d7 +Block 0014 [ 0]: 00c86bd24802ea9d +Block 0014 [ 1]: 70eaa8e2d857454e +Block 0014 [ 2]: b8461f74bdaeebea +Block 0014 [ 3]: 5b0fbdada15fa94d +Block 0014 [ 4]: 4e1c6a1b0d24fb70 +Block 0014 [ 5]: 6356e350ec69a25a +Block 0014 [ 6]: 9082450c3aed4839 +Block 0014 [ 7]: 5ce7c454002a4f90 +Block 0014 [ 8]: 41761904fd5e0795 +Block 0014 [ 9]: a51251eab300a4fe +Block 0014 [ 10]: 993abaa3ca0ef769 +Block 0014 [ 11]: a06ff7ca3a082cc8 +Block 0014 [ 12]: 32e0401836b47569 +Block 0014 [ 13]: 2d275468ec43edc1 +Block 0014 [ 14]: add41de9575a0742 +Block 0014 [ 15]: 106c2c271f1d5489 +Block 0014 [ 16]: 0484e39a05e6a3d9 +Block 0014 [ 17]: d1f40dc02a507f75 +Block 0014 [ 18]: 50f7834440e25b0e +Block 0014 [ 19]: 2fc995af1911e6a6 +Block 0014 [ 20]: ced0b1d1001c1dc0 +Block 0014 [ 21]: 8ba00763ea1a115d +Block 0014 [ 22]: 7a434535db10fa25 +Block 0014 [ 23]: dc56a10a894c332d +Block 0014 [ 24]: 87491bfa1203b506 +Block 0014 [ 25]: 96e8a73d3e8e437a +Block 0014 [ 26]: 713d91ffc723b560 +Block 0014 [ 27]: ae4ccde8b1e2f38b +Block 0014 [ 28]: c5ccc7ae6f2be8f9 +Block 0014 [ 29]: 79fca3dfceb34b7e +Block 0014 [ 30]: 549551fa994d9055 +Block 0014 [ 31]: a2629606bfb6448c +Block 0014 [ 32]: f1676c661be1fbd7 +Block 0014 [ 33]: 38d4e94c23878d90 +Block 0014 [ 34]: 36d2170e5cdfdcc5 +Block 0014 [ 35]: 201d50c4600eafac +Block 0014 [ 36]: 4e8a7a0f4774f2e1 +Block 0014 [ 37]: 56f3c307d20765eb +Block 0014 [ 38]: dafb7f11ad7730a2 +Block 0014 [ 39]: be6722b2fadb6160 +Block 0014 [ 40]: c8d96d73c11db8ce +Block 0014 [ 41]: f6ecadc3bd4ecf5b +Block 0014 [ 42]: 7beedae27ab13341 +Block 0014 [ 43]: 56f3ede80c8750c8 +Block 0014 [ 44]: ad31b1489aca9fc5 +Block 0014 [ 45]: cede55663da2fc9e +Block 0014 [ 46]: 6dd2af6408693a2c +Block 0014 [ 47]: 04d961d026175067 +Block 0014 [ 48]: 7c6fd82af1d6e8cf +Block 0014 [ 49]: 95397dbf1f7a6c38 +Block 0014 [ 50]: bdae428ffc7de7e7 +Block 0014 [ 51]: 84b8ef4eeb1d144b +Block 0014 [ 52]: 71f06279ec183109 +Block 0014 [ 53]: 7e2d2144e3364773 +Block 0014 [ 54]: 0ea7b5505ec554d4 +Block 0014 [ 55]: e43d0b3a8714b1b0 +Block 0014 [ 56]: 9e34e938edc4832a +Block 0014 [ 57]: 623e7858c67c1456 +Block 0014 [ 58]: ce8cbfa434ed6ab3 +Block 0014 [ 59]: 1bff169a2dd33fd1 +Block 0014 [ 60]: 5114fd75790e1723 +Block 0014 [ 61]: 2866e974f1feed4c +Block 0014 [ 62]: a8e955affe2235a9 +Block 0014 [ 63]: 3b57591f37fd14cd +Block 0014 [ 64]: 7b218b6b041d1a0a +Block 0014 [ 65]: f0f792a5970adb06 +Block 0014 [ 66]: 96885001e6238bbb +Block 0014 [ 67]: 7307175080bda5d8 +Block 0014 [ 68]: 8dcec3b6bc0a928a +Block 0014 [ 69]: 8edf3697e22d9995 +Block 0014 [ 70]: 5a6069964e3ad92c +Block 0014 [ 71]: c3075b22691aee95 +Block 0014 [ 72]: d0cde2edb64c8ca8 +Block 0014 [ 73]: 60e9d510f0d624c2 +Block 0014 [ 74]: 9d7c5975380b0389 +Block 0014 [ 75]: 4e361fe607121311 +Block 0014 [ 76]: b934e471d7f25770 +Block 0014 [ 77]: 3cc1b0b276a87957 +Block 0014 [ 78]: 36c3c3ccafbd940c +Block 0014 [ 79]: cdbacd401c0d26ac +Block 0014 [ 80]: e8cf26f9266243bc +Block 0014 [ 81]: 3e494b39746897f8 +Block 0014 [ 82]: 76f70f73a95d5040 +Block 0014 [ 83]: 9fcf6d04848799fc +Block 0014 [ 84]: 420adba2d5a0ffd8 +Block 0014 [ 85]: 7d3179bf1094ac98 +Block 0014 [ 86]: bf1c368e3f8db189 +Block 0014 [ 87]: 555766187874c3ba +Block 0014 [ 88]: 947d88cf25d2e292 +Block 0014 [ 89]: b3ad799755e3bdf4 +Block 0014 [ 90]: 329adf355bdb795b +Block 0014 [ 91]: a20dabdff81c9d7f +Block 0014 [ 92]: 102479e949df8a5a +Block 0014 [ 93]: 6eaf90100f244259 +Block 0014 [ 94]: 847dabe1ca858f90 +Block 0014 [ 95]: a996b83fe8181714 +Block 0014 [ 96]: ba3d4069779e6e66 +Block 0014 [ 97]: 9419a60629bd868c +Block 0014 [ 98]: 86babe464aeb9d25 +Block 0014 [ 99]: 3a1d5a4844a955f3 +Block 0014 [100]: 5c8e5dc4986e5d34 +Block 0014 [101]: a146bff2dd80ffc0 +Block 0014 [102]: 14f526ae0bf9f335 +Block 0014 [103]: 7068780723340465 +Block 0014 [104]: 8f05ac83e14eea15 +Block 0014 [105]: 6e977e15d10e6f06 +Block 0014 [106]: aabe0b897bedbac4 +Block 0014 [107]: ac46c22beea3cd31 +Block 0014 [108]: c2d1847c1152e335 +Block 0014 [109]: bd1ca29ae5b34d5b +Block 0014 [110]: 496331e4757ab303 +Block 0014 [111]: 9c79b215bf4472af +Block 0014 [112]: 36c603bf5809aa33 +Block 0014 [113]: 3bada4e0890a89eb +Block 0014 [114]: de41b684fe909f5c +Block 0014 [115]: 77acbca5c6cf32cf +Block 0014 [116]: 0a537ea31cb3da7f +Block 0014 [117]: 1cdcec02169ec735 +Block 0014 [118]: 802d3fdb8d8849b4 +Block 0014 [119]: faee1668d1e776b8 +Block 0014 [120]: 57981790a57fac50 +Block 0014 [121]: e4791f7d957ccf0e +Block 0014 [122]: b7ee4984decb37ec +Block 0014 [123]: 95264b7a43318d79 +Block 0014 [124]: 52a8fdf5c03e06d0 +Block 0014 [125]: e569b4bf5c4574d2 +Block 0014 [126]: a36df387d9cc8f37 +Block 0014 [127]: 57068ca334d423d0 +Block 0015 [ 0]: d75972ef03571f4c +Block 0015 [ 1]: 5e5e8b05d98f3896 +Block 0015 [ 2]: b04e1c546ce6d8e3 +Block 0015 [ 3]: 53f2adda47a9cc25 +Block 0015 [ 4]: 3eac52ee5a2cb38e +Block 0015 [ 5]: 7b694a48e0d2819e +Block 0015 [ 6]: c241e4ea0bd4ebab +Block 0015 [ 7]: d0375209fb4ee4b3 +Block 0015 [ 8]: 34cfe8cb52316010 +Block 0015 [ 9]: 149b360c2e1998a4 +Block 0015 [ 10]: 79be196992f3e9cf +Block 0015 [ 11]: 58bf824ecf470a1b +Block 0015 [ 12]: 81889fe16317e424 +Block 0015 [ 13]: 204b5157bbbae499 +Block 0015 [ 14]: a816fa2fe32c2baf +Block 0015 [ 15]: d3e6f71c565b77c3 +Block 0015 [ 16]: 441439ca5abafa8d +Block 0015 [ 17]: 7c203cbd869c4977 +Block 0015 [ 18]: 8ffef24d751f61da +Block 0015 [ 19]: 8700964313db8a34 +Block 0015 [ 20]: 7eb15ce9dce6d5e6 +Block 0015 [ 21]: a8ea8be42ba1aedb +Block 0015 [ 22]: 68e0cdf37d17d392 +Block 0015 [ 23]: c29c6cc7611a110b +Block 0015 [ 24]: 953e2e65492a624d +Block 0015 [ 25]: 885259398da320e3 +Block 0015 [ 26]: 83e966e8a38610d4 +Block 0015 [ 27]: 83ea8061ea029504 +Block 0015 [ 28]: 34b9a1d0d654badb +Block 0015 [ 29]: 5577f100ceb1ab30 +Block 0015 [ 30]: a4415f554a54f985 +Block 0015 [ 31]: f41f0445612657d3 +Block 0015 [ 32]: 4e6632178ddeebc7 +Block 0015 [ 33]: 8ed0150b5f742a90 +Block 0015 [ 34]: a0e50dc6f98027d6 +Block 0015 [ 35]: 9c2e0784a086a19d +Block 0015 [ 36]: f1250326cfeecf5f +Block 0015 [ 37]: f26f569ac0c27156 +Block 0015 [ 38]: d8b7aa1999e7bcf2 +Block 0015 [ 39]: 21afc665eef7f8f6 +Block 0015 [ 40]: 79c5529b8dbbfdce +Block 0015 [ 41]: d694d8c3fb45b159 +Block 0015 [ 42]: c87437dd97abd34c +Block 0015 [ 43]: 22a0fe0c8b91c357 +Block 0015 [ 44]: cdfe2967d8eca54b +Block 0015 [ 45]: b6637f2c58b8962a +Block 0015 [ 46]: fffe389ff9e282f8 +Block 0015 [ 47]: 01037b1735f05742 +Block 0015 [ 48]: fc0c711b36244e13 +Block 0015 [ 49]: 5a5cadf6259259e4 +Block 0015 [ 50]: 5b25a4892c1bbf2a +Block 0015 [ 51]: 0970a7cddc1a7638 +Block 0015 [ 52]: f1836959c9326f9d +Block 0015 [ 53]: 3cfc6246151da4d1 +Block 0015 [ 54]: 8021e484b484b98e +Block 0015 [ 55]: 09452842146e5091 +Block 0015 [ 56]: 92df9ea332551b95 +Block 0015 [ 57]: 708084655fe8fbdf +Block 0015 [ 58]: c5514438a489ff6d +Block 0015 [ 59]: 633d707db2ca6b0f +Block 0015 [ 60]: 503042eb463ed026 +Block 0015 [ 61]: 9047897e1216e5c1 +Block 0015 [ 62]: c5decb95009acd93 +Block 0015 [ 63]: 86a70312b794373b +Block 0015 [ 64]: 40543a7d1ff593eb +Block 0015 [ 65]: cde3c0e472895075 +Block 0015 [ 66]: bb4f1933fd49e35a +Block 0015 [ 67]: 8b07d06d62e39575 +Block 0015 [ 68]: fc7bd9dbb50d5b5d +Block 0015 [ 69]: 5385e3f433ad4c7d +Block 0015 [ 70]: d9e08a5968386621 +Block 0015 [ 71]: 1a8034bdf1d062a7 +Block 0015 [ 72]: d71633748f0984a6 +Block 0015 [ 73]: 30db9941ccca4edf +Block 0015 [ 74]: 1a07d24906730427 +Block 0015 [ 75]: 3713bff74517517b +Block 0015 [ 76]: c9fee35405dadbc1 +Block 0015 [ 77]: 31c5bbd7159c97d2 +Block 0015 [ 78]: 6963f0bd077b6b28 +Block 0015 [ 79]: 6e348b2cdbb823a0 +Block 0015 [ 80]: 7b57b1ff3d8ff3a5 +Block 0015 [ 81]: 6e2b1699acf177ae +Block 0015 [ 82]: 8678cbbc62f66658 +Block 0015 [ 83]: 40600816986324ff +Block 0015 [ 84]: 7c8cb0e28a6f28ae +Block 0015 [ 85]: a8cff1d4f445c4ee +Block 0015 [ 86]: 341612ac59cc7847 +Block 0015 [ 87]: d1deacb53809d7fd +Block 0015 [ 88]: 9b50a6ee5d7d1948 +Block 0015 [ 89]: 9d15c478f7dcc4b9 +Block 0015 [ 90]: 59d7263057f177ea +Block 0015 [ 91]: 289f4fc690f576c2 +Block 0015 [ 92]: 902d29652c8d7a5f +Block 0015 [ 93]: ebb6de4f2680ad2e +Block 0015 [ 94]: aebe09766aae6aed +Block 0015 [ 95]: a010352a4a466549 +Block 0015 [ 96]: 6d01abc20434cf28 +Block 0015 [ 97]: ef5490c26c7160db +Block 0015 [ 98]: c8967bdad6fec7d4 +Block 0015 [ 99]: 1f3f3b7d011a59ac +Block 0015 [100]: 14649f16126e9144 +Block 0015 [101]: 7514a5b367741bd2 +Block 0015 [102]: f3048e4c58fa961d +Block 0015 [103]: b2029cf4babc2ece +Block 0015 [104]: 57d3d365f470df82 +Block 0015 [105]: f26caa1e504b2cee +Block 0015 [106]: 4e14ee1162f1aba0 +Block 0015 [107]: 8b404c1894a6cd7e +Block 0015 [108]: 7e59e9ad0315edb9 +Block 0015 [109]: 2982da0a40e3c999 +Block 0015 [110]: 5ee7b95068be9b9d +Block 0015 [111]: 2189fd2f1977ba4e +Block 0015 [112]: 9ce806b536243b71 +Block 0015 [113]: d9111bcc2d73ef11 +Block 0015 [114]: a1ec7c389432f66b +Block 0015 [115]: ebc58ec09735e09e +Block 0015 [116]: a6a66414ae766b22 +Block 0015 [117]: c0c662760fcb1852 +Block 0015 [118]: 04b77f032d2d29fb +Block 0015 [119]: 8dfac7b3bc22a617 +Block 0015 [120]: b0c1f84766e79592 +Block 0015 [121]: d97f09302ba87684 +Block 0015 [122]: 8961b89bb1dd5ada +Block 0015 [123]: 0d5c705785872c8c +Block 0015 [124]: ba3e87aaaa1a8399 +Block 0015 [125]: 6a2d50a64a414a9e +Block 0015 [126]: 3e921708eacebd87 +Block 0015 [127]: a57e9e6d210d9d86 +Block 0016 [ 0]: df185dd78c1f2b78 +Block 0016 [ 1]: 49f9a99335a422c3 +Block 0016 [ 2]: 02f5635e3b743a97 +Block 0016 [ 3]: 55f4724e5adf72c0 +Block 0016 [ 4]: e30716783fee2adb +Block 0016 [ 5]: 39dfe7810c7dd4e6 +Block 0016 [ 6]: 1dc5bb0e8e136978 +Block 0016 [ 7]: d13e3eaa24203ad3 +Block 0016 [ 8]: 4339943877cf7d96 +Block 0016 [ 9]: b918c90f4188fa29 +Block 0016 [ 10]: 907d0ff73d281017 +Block 0016 [ 11]: 425fce389b70a999 +Block 0016 [ 12]: c3baf4d09f9ec2ad +Block 0016 [ 13]: 69d75dbceb4b915d +Block 0016 [ 14]: a29ffd628df96321 +Block 0016 [ 15]: cf88189cf78fdfb6 +Block 0016 [ 16]: ef07b5d1da111948 +Block 0016 [ 17]: 4a3a74f1376d0d9e +Block 0016 [ 18]: 1b01accbc747837f +Block 0016 [ 19]: b48871a477381e4b +Block 0016 [ 20]: c7b3494dcf85abbd +Block 0016 [ 21]: 8aee4be839ba50cb +Block 0016 [ 22]: e6a4fc4ea169d857 +Block 0016 [ 23]: edfb8357401cb614 +Block 0016 [ 24]: f9dc1ba46003757c +Block 0016 [ 25]: ec9c465391eaeea3 +Block 0016 [ 26]: 1e1402a3ab178ad0 +Block 0016 [ 27]: 5a5810524c1f782b +Block 0016 [ 28]: 475df04282096019 +Block 0016 [ 29]: be53861dcdf717aa +Block 0016 [ 30]: 517ee91e28c1e49b +Block 0016 [ 31]: 4f6e9f32312fe2b8 +Block 0016 [ 32]: 374a8ff4124c3ba5 +Block 0016 [ 33]: 0a9add0bf6378093 +Block 0016 [ 34]: a17a2a5d0e3ff0d0 +Block 0016 [ 35]: 833253687ab236c9 +Block 0016 [ 36]: 10f5c2b5789316ca +Block 0016 [ 37]: c4055ea79dc80e81 +Block 0016 [ 38]: 333e55f91ae29671 +Block 0016 [ 39]: 150e8674d536a0a0 +Block 0016 [ 40]: 28c66be816ffcaa1 +Block 0016 [ 41]: 592a94f3b1459cab +Block 0016 [ 42]: eea6ec4cba337888 +Block 0016 [ 43]: 8600219ec14cde04 +Block 0016 [ 44]: 3a9b5cdd3568b325 +Block 0016 [ 45]: aad6128a2a76c958 +Block 0016 [ 46]: bfb8cade0905c962 +Block 0016 [ 47]: dda1376b4299b18a +Block 0016 [ 48]: bd0078b78f05094a +Block 0016 [ 49]: ab94838730040fb3 +Block 0016 [ 50]: 8891b571e9e2336e +Block 0016 [ 51]: 5c18d22f60a1a657 +Block 0016 [ 52]: b4615a5fb8572c23 +Block 0016 [ 53]: d3cbac3c3adecd23 +Block 0016 [ 54]: 71cf3196d24159dd +Block 0016 [ 55]: e5b0c73bdb337098 +Block 0016 [ 56]: 8849fdd41969d56e +Block 0016 [ 57]: c24297d105b05808 +Block 0016 [ 58]: 3d206c5fe6f6289d +Block 0016 [ 59]: a9a8333d832b2199 +Block 0016 [ 60]: e66ec8f0873f231b +Block 0016 [ 61]: ca9905c770bfe992 +Block 0016 [ 62]: f63c14054d5124e9 +Block 0016 [ 63]: d58d91fd3ee2b1a1 +Block 0016 [ 64]: 6ff32629231dc72b +Block 0016 [ 65]: 255d68cb56d3fa47 +Block 0016 [ 66]: 6b0af8028d7ca3a3 +Block 0016 [ 67]: 736d0fe6f9f80d52 +Block 0016 [ 68]: 90d1bde757cd5e96 +Block 0016 [ 69]: 07db8b6e1b4d5c34 +Block 0016 [ 70]: 791b2ff7ef295bd7 +Block 0016 [ 71]: fae425b3e1da0fd8 +Block 0016 [ 72]: 9f19178f83fe4783 +Block 0016 [ 73]: 1167f6d05e9820f4 +Block 0016 [ 74]: 7df7b36d7debf250 +Block 0016 [ 75]: 82113bee719dd1b5 +Block 0016 [ 76]: 5e798b4976c90140 +Block 0016 [ 77]: 3290bcc2692f2fc9 +Block 0016 [ 78]: 79ca6777cbe0ae0a +Block 0016 [ 79]: 32a54689489dc4ea +Block 0016 [ 80]: ea95bbfbeec60577 +Block 0016 [ 81]: ef12d7710711faae +Block 0016 [ 82]: 7866976349319235 +Block 0016 [ 83]: b321f8967d8fe701 +Block 0016 [ 84]: 0edcf290c5c241b3 +Block 0016 [ 85]: 92cfa62cadaef334 +Block 0016 [ 86]: c0c4c0077068d155 +Block 0016 [ 87]: ee895ccf8a30ce54 +Block 0016 [ 88]: f71204e73361a729 +Block 0016 [ 89]: 157afabb278e2f75 +Block 0016 [ 90]: f44173218e7734b5 +Block 0016 [ 91]: 8ce162e3111fe98d +Block 0016 [ 92]: 3f5f5a4acbc10d7e +Block 0016 [ 93]: 8fec68852d8995ab +Block 0016 [ 94]: ff2eed0c3d136a66 +Block 0016 [ 95]: 431218a26b23c2cf +Block 0016 [ 96]: 01264b38f47d5244 +Block 0016 [ 97]: 92bc9bd098e8c02a +Block 0016 [ 98]: bb4d45a1401c21f3 +Block 0016 [ 99]: c98791ab390af0a3 +Block 0016 [100]: 8fe6c5109d119811 +Block 0016 [101]: c00cf15abf0089cb +Block 0016 [102]: 57038fc4a333e7b5 +Block 0016 [103]: 82b257d90a52da30 +Block 0016 [104]: b9cc96cce73c1c99 +Block 0016 [105]: dacefe330d03e9e2 +Block 0016 [106]: e811034d6fe46bb0 +Block 0016 [107]: 96cb3e04aa68af22 +Block 0016 [108]: d6c949273c0f6012 +Block 0016 [109]: edb20985c7cc041b +Block 0016 [110]: 8569c84b201e2722 +Block 0016 [111]: 37b8fbe2e91d4cce +Block 0016 [112]: 4f25db3dad602ad2 +Block 0016 [113]: ad25504f1f0029f8 +Block 0016 [114]: 55d05138e5fc67ea +Block 0016 [115]: 8abba493f0b14307 +Block 0016 [116]: dbda5a77b570203c +Block 0016 [117]: 6c0e73d8df2a5cbf +Block 0016 [118]: ab1675a4c073aa1b +Block 0016 [119]: c28837a4d5785148 +Block 0016 [120]: 6be217b67e87d0cd +Block 0016 [121]: 96b6f0aada351d55 +Block 0016 [122]: d7b08772796b0ca3 +Block 0016 [123]: b0b5beb384738224 +Block 0016 [124]: 2766dfdc8eebb835 +Block 0016 [125]: 6fbe781c87b91676 +Block 0016 [126]: ef9dae4fda31bf35 +Block 0016 [127]: 41ce4b9bfdcd494c +Block 0017 [ 0]: c255f12517b5f528 +Block 0017 [ 1]: 1a7c91d6a62de6c6 +Block 0017 [ 2]: 6042723b63c8b725 +Block 0017 [ 3]: edc1e525aace3c4d +Block 0017 [ 4]: 9083bb02e70719bf +Block 0017 [ 5]: dff2e711c263aad0 +Block 0017 [ 6]: 643e8a1676401ac9 +Block 0017 [ 7]: 67ee406626e2af5b +Block 0017 [ 8]: 2ca94c000c31762e +Block 0017 [ 9]: e3975e35e2eb5398 +Block 0017 [ 10]: 2088403155c03d95 +Block 0017 [ 11]: 1146ad509ae7d17e +Block 0017 [ 12]: ebf6b18eb6274f96 +Block 0017 [ 13]: 74c2258314569745 +Block 0017 [ 14]: d1a25a287f9acbc0 +Block 0017 [ 15]: 306846f42d1db68f +Block 0017 [ 16]: 4d07dc025ac6f493 +Block 0017 [ 17]: d014df675b0095b9 +Block 0017 [ 18]: 0cac62bf06a23332 +Block 0017 [ 19]: 6c579b8f790fc721 +Block 0017 [ 20]: 5aff18b8d7750ee6 +Block 0017 [ 21]: 5c41322f23c3d21b +Block 0017 [ 22]: cd64bb030c6d4c14 +Block 0017 [ 23]: d6abf4f11955fba4 +Block 0017 [ 24]: f08e1d8bb5aa745e +Block 0017 [ 25]: 51f0dd60784369cf +Block 0017 [ 26]: d3eea3880a74e837 +Block 0017 [ 27]: 027fb4558c227054 +Block 0017 [ 28]: 69705de9eb976c9e +Block 0017 [ 29]: 029ed81f3b8083fe +Block 0017 [ 30]: 6174a0327bbb3513 +Block 0017 [ 31]: f0865510be03373f +Block 0017 [ 32]: c06d8ae72cb28b64 +Block 0017 [ 33]: 619282b2915316e8 +Block 0017 [ 34]: 9544171bca5aba07 +Block 0017 [ 35]: 2bb07513d70af873 +Block 0017 [ 36]: 4a0649f9bcd697c1 +Block 0017 [ 37]: 569952b056a02d6a +Block 0017 [ 38]: ecc1a448e97ec334 +Block 0017 [ 39]: 3a3f886128900cb6 +Block 0017 [ 40]: 59ab40a31e998543 +Block 0017 [ 41]: 464c956704a1522f +Block 0017 [ 42]: 0a88e34421502b80 +Block 0017 [ 43]: 11f29238c24ca7ae +Block 0017 [ 44]: 4c4ed3acdc97d6c7 +Block 0017 [ 45]: b3dd9cbf8e290895 +Block 0017 [ 46]: 58597d61f7166115 +Block 0017 [ 47]: 0a3668475c207ac0 +Block 0017 [ 48]: 16bf61e088c6a552 +Block 0017 [ 49]: fb03ea187661dbbb +Block 0017 [ 50]: 936a42f8220b9daf +Block 0017 [ 51]: 8e534cb1de16ae4a +Block 0017 [ 52]: 10ce6cb9da19db43 +Block 0017 [ 53]: 440a033c0cbcfb97 +Block 0017 [ 54]: 8e1d18c6fe8879b2 +Block 0017 [ 55]: 9f8c3b96301f169d +Block 0017 [ 56]: 7aad3cbcacc015db +Block 0017 [ 57]: 7129d8ac7b3ac45b +Block 0017 [ 58]: 6459133e511c248d +Block 0017 [ 59]: afcaf25b44ac2cc0 +Block 0017 [ 60]: 5e50b5ab3bf43e66 +Block 0017 [ 61]: 6ead49151f1d1b6f +Block 0017 [ 62]: 84105ac703c1d668 +Block 0017 [ 63]: fe6ea623494ad5df +Block 0017 [ 64]: c0f2820a0784bcea +Block 0017 [ 65]: 6192b3775d188c4e +Block 0017 [ 66]: b80f2e5d98cb4314 +Block 0017 [ 67]: 62e6d5758eef3792 +Block 0017 [ 68]: 51e207f92257bdf8 +Block 0017 [ 69]: 871b10b5dcbd15fb +Block 0017 [ 70]: c293d554a47db14a +Block 0017 [ 71]: b01ccdc84de5763a +Block 0017 [ 72]: 5b7beabd11951254 +Block 0017 [ 73]: 3059926a0f099e08 +Block 0017 [ 74]: 9caf0ff4887cc6c1 +Block 0017 [ 75]: 3bc6b264d764258e +Block 0017 [ 76]: 790512ed0dd294c9 +Block 0017 [ 77]: 72ef920edb63ec2c +Block 0017 [ 78]: 394da25fd4f9e123 +Block 0017 [ 79]: aa54ec6877648eb7 +Block 0017 [ 80]: 44e1b077b8a7565b +Block 0017 [ 81]: 45857d0b5ad9479a +Block 0017 [ 82]: f062f65b5d503323 +Block 0017 [ 83]: a168acb912f125be +Block 0017 [ 84]: 15630c565fab9475 +Block 0017 [ 85]: 11455ef696ae101e +Block 0017 [ 86]: 86763895b6fe2b49 +Block 0017 [ 87]: 654cead6b7d65bba +Block 0017 [ 88]: 7632b64be27554b3 +Block 0017 [ 89]: ac562a4331bdf6b2 +Block 0017 [ 90]: 70438f6240517dcb +Block 0017 [ 91]: e5b1bbdd81883384 +Block 0017 [ 92]: e5406e221cfcc990 +Block 0017 [ 93]: 694c710d4750bc8d +Block 0017 [ 94]: dd1729bf7e0b12d3 +Block 0017 [ 95]: 55886f912b344cd3 +Block 0017 [ 96]: c902a53f97ba19a0 +Block 0017 [ 97]: b66c74cd9e7a20c1 +Block 0017 [ 98]: 2308e5b036079da4 +Block 0017 [ 99]: cdc526b983a98cfc +Block 0017 [100]: 9868dc35af76d88e +Block 0017 [101]: 1166ed598c534c7e +Block 0017 [102]: 66ed886b20c6ae61 +Block 0017 [103]: 804b12b774cb411d +Block 0017 [104]: a8e1de357f7444b5 +Block 0017 [105]: 7375b1c693cb1e59 +Block 0017 [106]: fdea379b45e1d482 +Block 0017 [107]: a7ae259328e505e1 +Block 0017 [108]: 4a498055e9c7a4e5 +Block 0017 [109]: fdb7762264b16d42 +Block 0017 [110]: b0afc809e1b4d93e +Block 0017 [111]: 4143e78d76c21ae8 +Block 0017 [112]: ede783054972535d +Block 0017 [113]: a30b50251b9a735c +Block 0017 [114]: bfdc3808fef4acd5 +Block 0017 [115]: af990dac9a2314f7 +Block 0017 [116]: 44e37b021779c6d1 +Block 0017 [117]: d846b03cfc7637b1 +Block 0017 [118]: a7c373274faff42e +Block 0017 [119]: bc9c3a5ab89c8aaa +Block 0017 [120]: 3b5a5fa7262355f3 +Block 0017 [121]: 1bc2d9f69829a86a +Block 0017 [122]: 3546ed470b5a8723 +Block 0017 [123]: 97f881b5aff970d3 +Block 0017 [124]: 1ac3821269c2ee8f +Block 0017 [125]: 1d24698d02c09cca +Block 0017 [126]: e968c1d7e6f7f983 +Block 0017 [127]: 615ae91ba244796e +Block 0018 [ 0]: c56353865706e01e +Block 0018 [ 1]: 2008deada2479371 +Block 0018 [ 2]: 6bf9640afa0be017 +Block 0018 [ 3]: cbff064315b5c969 +Block 0018 [ 4]: 73c6647d9e81768f +Block 0018 [ 5]: 54c35767415dcc0f +Block 0018 [ 6]: 85789ed843f63faa +Block 0018 [ 7]: a29e6d2bad36be72 +Block 0018 [ 8]: b301ef96181f4af9 +Block 0018 [ 9]: 623461467a1d50b8 +Block 0018 [ 10]: 779c081d5dd2a8d8 +Block 0018 [ 11]: 97d9bfcc4d7c1bf0 +Block 0018 [ 12]: a1d72012d47fa27c +Block 0018 [ 13]: 0d3641842d3e8f4e +Block 0018 [ 14]: 7b0c3ed769c28a37 +Block 0018 [ 15]: a16e60ca97b4983f +Block 0018 [ 16]: 2bcb4545dfdfa02f +Block 0018 [ 17]: 2852a84faf0688da +Block 0018 [ 18]: e4cf9192f6f7df0f +Block 0018 [ 19]: d79e3702087b824d +Block 0018 [ 20]: a3b87e0702914795 +Block 0018 [ 21]: e2f14145b5897d88 +Block 0018 [ 22]: 9fbb5bbc9089bc9b +Block 0018 [ 23]: d1a2d108b965ee75 +Block 0018 [ 24]: d3965baad215bdae +Block 0018 [ 25]: 5146559ceb1203f7 +Block 0018 [ 26]: 438229a438f64d84 +Block 0018 [ 27]: d52ea8df05362ef2 +Block 0018 [ 28]: f65849b93cac0fbc +Block 0018 [ 29]: 91d10136de976abc +Block 0018 [ 30]: a6e405c4cc904a3b +Block 0018 [ 31]: 680b6f21abd89675 +Block 0018 [ 32]: a71ce0ee26d18c2e +Block 0018 [ 33]: ce26ebecb85e8737 +Block 0018 [ 34]: 142f9a78e5c1538b +Block 0018 [ 35]: d05611f217f38322 +Block 0018 [ 36]: 831121ec0775df8d +Block 0018 [ 37]: fde91d847c51ecdd +Block 0018 [ 38]: 3ad5f8d0ccb56e6f +Block 0018 [ 39]: 9fcd5e80613b6c23 +Block 0018 [ 40]: cfc5db7486fd0e95 +Block 0018 [ 41]: e5a1867214869654 +Block 0018 [ 42]: acb382ffbe5139e6 +Block 0018 [ 43]: 1ed3941d890bb088 +Block 0018 [ 44]: a4145acf9ec95a86 +Block 0018 [ 45]: 78da7311f5416211 +Block 0018 [ 46]: 939b875265496872 +Block 0018 [ 47]: e1bb9c5c2220f3ff +Block 0018 [ 48]: 1c24f60c4ce3bae3 +Block 0018 [ 49]: 414f56e67af2736c +Block 0018 [ 50]: f1a5fd7110bda591 +Block 0018 [ 51]: ebd71b667376a60c +Block 0018 [ 52]: e6cd6e0aa97da042 +Block 0018 [ 53]: 653f9b43d66fd80e +Block 0018 [ 54]: 52db371819ad4bbe +Block 0018 [ 55]: 20b98ebd399caa7e +Block 0018 [ 56]: c3cba3ea8af37c61 +Block 0018 [ 57]: 20340256ad3a6278 +Block 0018 [ 58]: e9bba7cc05e901e8 +Block 0018 [ 59]: ef99a3e5e269af3f +Block 0018 [ 60]: 4ec9e41d99c9c61b +Block 0018 [ 61]: e737c793049f51fd +Block 0018 [ 62]: 735095de5b23f4af +Block 0018 [ 63]: 68702e4e0d7a42c4 +Block 0018 [ 64]: e74de4a633120e8b +Block 0018 [ 65]: 6dae24a779a30904 +Block 0018 [ 66]: c6a469551c191227 +Block 0018 [ 67]: b7967b46207c2c5c +Block 0018 [ 68]: 71379f1e1b5162b0 +Block 0018 [ 69]: 5ab11e0f2cc5802a +Block 0018 [ 70]: 55643f358e6e9381 +Block 0018 [ 71]: afb36c68f8206119 +Block 0018 [ 72]: 7d179088c52f6798 +Block 0018 [ 73]: 551634a47e4951ad +Block 0018 [ 74]: 752eda55f86b960f +Block 0018 [ 75]: a73594a6d81887f9 +Block 0018 [ 76]: 246794e4638b41e6 +Block 0018 [ 77]: 409b195249a51f5a +Block 0018 [ 78]: f7bd3026e193d18c +Block 0018 [ 79]: 4be5161c5bdd6e8b +Block 0018 [ 80]: de96cd3c413a8be9 +Block 0018 [ 81]: aba764ceb1adb102 +Block 0018 [ 82]: b7842636bd5aa117 +Block 0018 [ 83]: a9c14fdc42872e40 +Block 0018 [ 84]: a15963f20588b09c +Block 0018 [ 85]: 368cecfa2963a40d +Block 0018 [ 86]: 053d9f8602aa5b63 +Block 0018 [ 87]: 760fba8205ffcb02 +Block 0018 [ 88]: 38a771fa1838dc59 +Block 0018 [ 89]: c99bfa719cb66fe5 +Block 0018 [ 90]: b073ace471a2021e +Block 0018 [ 91]: fd7e19c27d2f7eca +Block 0018 [ 92]: 38fc7cb22e67dbf3 +Block 0018 [ 93]: 9a03652a320f0213 +Block 0018 [ 94]: f1cc4b1493b3703f +Block 0018 [ 95]: 1b3306a2f3865325 +Block 0018 [ 96]: 2595f7949a755f71 +Block 0018 [ 97]: 78e9fa382d0927d3 +Block 0018 [ 98]: 8b85e76f7f397022 +Block 0018 [ 99]: a19f6dd3b8dca52d +Block 0018 [100]: 00e82e5576b941e6 +Block 0018 [101]: a7fa7ae6faddf0d9 +Block 0018 [102]: d99ff748568de1f9 +Block 0018 [103]: 4e2675753ff9d242 +Block 0018 [104]: d0cd9788bfee8164 +Block 0018 [105]: f2da4d54b004e796 +Block 0018 [106]: 5b1a0f55a7d95023 +Block 0018 [107]: e4ef7b231962072e +Block 0018 [108]: 729cf2df66d37c30 +Block 0018 [109]: 40c7b786a7aed4b0 +Block 0018 [110]: 3ac08ac29d39223d +Block 0018 [111]: 203dc268677ed0e9 +Block 0018 [112]: 52c84d8337fd4d66 +Block 0018 [113]: 139e5667061027e1 +Block 0018 [114]: 6c078c85ee42c4aa +Block 0018 [115]: 63833db031595429 +Block 0018 [116]: d447ec89081e5689 +Block 0018 [117]: 840de94326fb0d5c +Block 0018 [118]: 410e13a5634eae20 +Block 0018 [119]: d7b756d4a7b1697f +Block 0018 [120]: 1050513a1e7b7326 +Block 0018 [121]: 08a14292e030a2a3 +Block 0018 [122]: 30d6edcc44ef12f2 +Block 0018 [123]: 77d8788d3cf22d4b +Block 0018 [124]: 9066b21a6c79f00e +Block 0018 [125]: c3eab9a459f9fcb8 +Block 0018 [126]: 3bdd440ce2e5e1f4 +Block 0018 [127]: 8f973dff57dbd378 +Block 0019 [ 0]: 01fb129cc5b77b4f +Block 0019 [ 1]: d97f57425162ea3e +Block 0019 [ 2]: e8276a92492039e6 +Block 0019 [ 3]: 3608e78e794a18a4 +Block 0019 [ 4]: 4b11369193064da4 +Block 0019 [ 5]: b0de35a83d3f72e4 +Block 0019 [ 6]: d2a6b44f3df673a8 +Block 0019 [ 7]: 2ac37c9b9bd04ab3 +Block 0019 [ 8]: 488c7cd49282a0a0 +Block 0019 [ 9]: 8c380c95963e6b4f +Block 0019 [ 10]: 81d5c1c378d59641 +Block 0019 [ 11]: 2d857e93286b67ae +Block 0019 [ 12]: 6a58c08de951b4d0 +Block 0019 [ 13]: 6ab7d4bee5b738d3 +Block 0019 [ 14]: 88bf6dc38b506d3b +Block 0019 [ 15]: 009b889d679b8497 +Block 0019 [ 16]: 59b1f1f74efb2322 +Block 0019 [ 17]: 52ceaeb9154ca50c +Block 0019 [ 18]: 28c0cd203b6b6fc9 +Block 0019 [ 19]: aad7e207dff3cec6 +Block 0019 [ 20]: 9ffd1e22884b708b +Block 0019 [ 21]: 06e86279cd514c88 +Block 0019 [ 22]: cb899f826746fe5d +Block 0019 [ 23]: 10b5ecf199c8d34d +Block 0019 [ 24]: faae19be3f1a73b1 +Block 0019 [ 25]: c05fa929156bb2b8 +Block 0019 [ 26]: 966ee6906bcc9ca0 +Block 0019 [ 27]: 910f75707b22bbeb +Block 0019 [ 28]: 05bea73cdcad1abe +Block 0019 [ 29]: 2a217ca21b87f4ea +Block 0019 [ 30]: 9803db62cd649fdb +Block 0019 [ 31]: e41f40690f0acedb +Block 0019 [ 32]: 2704ac203dbf666a +Block 0019 [ 33]: de3867742cda737b +Block 0019 [ 34]: 5e891ddbc0ebf80f +Block 0019 [ 35]: a26084633cbc25c6 +Block 0019 [ 36]: e324a914bb6ee989 +Block 0019 [ 37]: 12af57e4ebd54cfc +Block 0019 [ 38]: 7326a4ef7bb3ce72 +Block 0019 [ 39]: 96ebd2aacd9ea28a +Block 0019 [ 40]: 177b393db4a26bd8 +Block 0019 [ 41]: 1885addd7e6227f2 +Block 0019 [ 42]: 707cc6e9254dd0e5 +Block 0019 [ 43]: fbafea1c9cac4810 +Block 0019 [ 44]: f650d8ca36a2cc92 +Block 0019 [ 45]: df88d3699c7fd4ff +Block 0019 [ 46]: d01a174fa16b4df5 +Block 0019 [ 47]: e8c9e9b1426c2e01 +Block 0019 [ 48]: 13ca5016746e7cc2 +Block 0019 [ 49]: fa7bb4c75626d3b2 +Block 0019 [ 50]: 0f844dd13a6eedf9 +Block 0019 [ 51]: 2bdf7095dddb0eca +Block 0019 [ 52]: 70020701e7728c78 +Block 0019 [ 53]: 1b7cc5becedf1a6e +Block 0019 [ 54]: 4402873b468a684c +Block 0019 [ 55]: 9c7cbbb1df70289c +Block 0019 [ 56]: bd1d0dd77aa7b618 +Block 0019 [ 57]: 750c4d82f4c0978e +Block 0019 [ 58]: dbdc7edc1833b96b +Block 0019 [ 59]: bb7dba594b1c100f +Block 0019 [ 60]: ece11ceaa82d9904 +Block 0019 [ 61]: 7b808930d82a9020 +Block 0019 [ 62]: b06d85c1d2424bdd +Block 0019 [ 63]: 64ffd652a760ed2c +Block 0019 [ 64]: 4562d6f8e3b5dccb +Block 0019 [ 65]: 87e6d56d65c283c6 +Block 0019 [ 66]: 9fe94fc027c21a00 +Block 0019 [ 67]: 8dc400478b9f1163 +Block 0019 [ 68]: 029c14bce5524f9e +Block 0019 [ 69]: 423deec939785c44 +Block 0019 [ 70]: a969d7c12fea9a28 +Block 0019 [ 71]: cec54cf9731902f2 +Block 0019 [ 72]: 6cac7755e0231ce0 +Block 0019 [ 73]: 3ed2da7f7fdfa17c +Block 0019 [ 74]: 6469eff8bafbf4c0 +Block 0019 [ 75]: 5619e6ce49fea452 +Block 0019 [ 76]: 5ff711a1d157e9c6 +Block 0019 [ 77]: bbbb1e51b7c0fa8d +Block 0019 [ 78]: ff6020f896d4aa0a +Block 0019 [ 79]: 7793af1f4cb28be8 +Block 0019 [ 80]: d4119423ff81e99a +Block 0019 [ 81]: 87071a0fe6f1fdb2 +Block 0019 [ 82]: fe52ad7fc16253e8 +Block 0019 [ 83]: 7f5f03545de2fefc +Block 0019 [ 84]: 7b38fc2bb6260261 +Block 0019 [ 85]: da971613e240efe7 +Block 0019 [ 86]: 7a86717ff3583bc9 +Block 0019 [ 87]: 41e9e68bbc8d3459 +Block 0019 [ 88]: 352101524d076bdf +Block 0019 [ 89]: 56bc810db202a661 +Block 0019 [ 90]: 724895de53780184 +Block 0019 [ 91]: 472995ae2902dc14 +Block 0019 [ 92]: e26c34719dc75f33 +Block 0019 [ 93]: 284575a822951dee +Block 0019 [ 94]: 3c34de13fbf1fd82 +Block 0019 [ 95]: b7dd994c13edd4d0 +Block 0019 [ 96]: 8811e94ca8eabca9 +Block 0019 [ 97]: 02ea332997305ef9 +Block 0019 [ 98]: ade80b60a9a5e79e +Block 0019 [ 99]: 66077ba1b5565540 +Block 0019 [100]: 7388da600272d9d3 +Block 0019 [101]: def87e32345358d6 +Block 0019 [102]: e71436c27aa3f5e4 +Block 0019 [103]: a6c69a8fbb9110c0 +Block 0019 [104]: 48000a8ca2db151d +Block 0019 [105]: b2f16745a08b53c3 +Block 0019 [106]: a9bd83427a1fb1b2 +Block 0019 [107]: 3b5eaf5351dad3d7 +Block 0019 [108]: f6b94b7083aefcc2 +Block 0019 [109]: b460241c7ab61f9b +Block 0019 [110]: c239335eb5ed5785 +Block 0019 [111]: b73d576203875b21 +Block 0019 [112]: 0513d7728b6dabaa +Block 0019 [113]: 1be1815371f2da1a +Block 0019 [114]: 80af69b2bb1f5078 +Block 0019 [115]: 4ca38ab5b8309e95 +Block 0019 [116]: 330b528faad28a90 +Block 0019 [117]: 71ad5e378ee67af2 +Block 0019 [118]: 0c600c1d3b739681 +Block 0019 [119]: cec06a6b8cec5726 +Block 0019 [120]: 9f24740e13ae7b5e +Block 0019 [121]: bad1bf8dd52977b4 +Block 0019 [122]: 6a6858419908532f +Block 0019 [123]: d81b57f836be3478 +Block 0019 [124]: 20f707578f0627bb +Block 0019 [125]: eac9fa947830264d +Block 0019 [126]: d3bda8399e5f7b2f +Block 0019 [127]: a0c476401ade3caa +Block 0020 [ 0]: 2904d477754f1182 +Block 0020 [ 1]: c7817f8c904876aa +Block 0020 [ 2]: ef630ae6c82fdd4b +Block 0020 [ 3]: 2b90f2f26913e67e +Block 0020 [ 4]: 4a00e183ac3b02f2 +Block 0020 [ 5]: d36d5d6dd25c2444 +Block 0020 [ 6]: 2f6ff1b1a0d64a92 +Block 0020 [ 7]: fbaa201fda84ce01 +Block 0020 [ 8]: 4b29cc7f03ce8132 +Block 0020 [ 9]: baf31290c098e42d +Block 0020 [ 10]: fe21fd15da24aadf +Block 0020 [ 11]: b46774f27b1b06a9 +Block 0020 [ 12]: 7fd84d48a8f2dc8a +Block 0020 [ 13]: 42a97fe50cdce3cb +Block 0020 [ 14]: c597b37c0fbbdf6d +Block 0020 [ 15]: cefba6997f40e239 +Block 0020 [ 16]: ba63b0a3b6a92f33 +Block 0020 [ 17]: 3d2c8dc2af6de650 +Block 0020 [ 18]: 0416456efe02d663 +Block 0020 [ 19]: 8bb54ac882e37ad3 +Block 0020 [ 20]: 90873df0d3d9cdf2 +Block 0020 [ 21]: 27c896216f937720 +Block 0020 [ 22]: ae591b750081df20 +Block 0020 [ 23]: a1d13beb52615120 +Block 0020 [ 24]: 58242fd330b617fe +Block 0020 [ 25]: cea097568f1d910c +Block 0020 [ 26]: 06d3145ceb011b4c +Block 0020 [ 27]: c0907ede1d338bed +Block 0020 [ 28]: 5d647e9063e3a000 +Block 0020 [ 29]: fb2bc9ff8eb0da2b +Block 0020 [ 30]: cafc25218c1854f4 +Block 0020 [ 31]: 9494568ebe7b081f +Block 0020 [ 32]: 2fce8d55463d09b0 +Block 0020 [ 33]: 8bdf4e97534ee12c +Block 0020 [ 34]: 0f07aa1a0fcc4e9f +Block 0020 [ 35]: 084dc457956a6a0e +Block 0020 [ 36]: 232705d7f0cab526 +Block 0020 [ 37]: d448fb450c080da5 +Block 0020 [ 38]: 48b7912f7fe83b1e +Block 0020 [ 39]: 6489d462f6978400 +Block 0020 [ 40]: fad910fea0c872f7 +Block 0020 [ 41]: a2bc6a2472d0de22 +Block 0020 [ 42]: 1da8c7cc8c2a0ead +Block 0020 [ 43]: bda44d0c59102810 +Block 0020 [ 44]: bed9ec721abf77bd +Block 0020 [ 45]: 5eb04509a4efa5fe +Block 0020 [ 46]: 147abfb14b55ff4d +Block 0020 [ 47]: 464db5cb2ab081e4 +Block 0020 [ 48]: 347a42f1646122f7 +Block 0020 [ 49]: 6c60a9d4d4809c39 +Block 0020 [ 50]: 0faa4393af952836 +Block 0020 [ 51]: e96e650e09870d44 +Block 0020 [ 52]: f2fbbf0ea59259f6 +Block 0020 [ 53]: f9d39cf808465afa +Block 0020 [ 54]: 4f41c740452f42d8 +Block 0020 [ 55]: ccd0940ced56b760 +Block 0020 [ 56]: cfc2c111d630bb14 +Block 0020 [ 57]: 00bb0851dabe0d80 +Block 0020 [ 58]: 0db0f1293ff7fe6b +Block 0020 [ 59]: 6021268000713de0 +Block 0020 [ 60]: 8dd8a5cd7c133a5a +Block 0020 [ 61]: e2603e8416c2dcfc +Block 0020 [ 62]: aeece433db673608 +Block 0020 [ 63]: 06411431eb04ce7b +Block 0020 [ 64]: b4cde9369fd8fedd +Block 0020 [ 65]: ead8fa31d96ead7d +Block 0020 [ 66]: f1498c4b282142fc +Block 0020 [ 67]: 9a6bf2a2920dcc07 +Block 0020 [ 68]: ef19df470784a666 +Block 0020 [ 69]: 7b19ef45403eb2aa +Block 0020 [ 70]: 7f87efe8bb1347b9 +Block 0020 [ 71]: 966b6c76676b7cb2 +Block 0020 [ 72]: ddfde750a3792957 +Block 0020 [ 73]: af435d6f749595f3 +Block 0020 [ 74]: 6b66903f330cb882 +Block 0020 [ 75]: 2f5d5734383ab9b2 +Block 0020 [ 76]: 16c84ef3653ec28d +Block 0020 [ 77]: ed267393d64b8ca9 +Block 0020 [ 78]: 37617f3ef3cc84a2 +Block 0020 [ 79]: 0392cc1ddb7741bd +Block 0020 [ 80]: 3e4cd2bd5d298731 +Block 0020 [ 81]: fad5bfe2a757e129 +Block 0020 [ 82]: 77200759f5610f93 +Block 0020 [ 83]: c4a3a70476b47735 +Block 0020 [ 84]: 67d711646fe329a3 +Block 0020 [ 85]: a297b952e77fb1a5 +Block 0020 [ 86]: 6667da2228cad03d +Block 0020 [ 87]: 61e9958285b43f16 +Block 0020 [ 88]: 9ed6b30497286eee +Block 0020 [ 89]: a1390ee861b2ab3a +Block 0020 [ 90]: 4ed79e20591d2fd6 +Block 0020 [ 91]: d48ed0be2c925b76 +Block 0020 [ 92]: c822e029ac094eb3 +Block 0020 [ 93]: ba2d8c8a4a67e483 +Block 0020 [ 94]: ccb998f8886aa893 +Block 0020 [ 95]: 280cc0b728b73fad +Block 0020 [ 96]: 277e12cadbf7798d +Block 0020 [ 97]: 7f57143f08c86d28 +Block 0020 [ 98]: 1ca6f11a4b1e25ff +Block 0020 [ 99]: b2db91c288ed40cd +Block 0020 [100]: f2c6434730b685b2 +Block 0020 [101]: 0f9a24dd1275f7b9 +Block 0020 [102]: 9bd27d8fcac17d47 +Block 0020 [103]: af38fcf1b8cb26da +Block 0020 [104]: 16a1f451c0e83e8b +Block 0020 [105]: a8c2fb8a2cd2a9af +Block 0020 [106]: 686efdc520934059 +Block 0020 [107]: 23cb0295bad5928e +Block 0020 [108]: 22e331a0e82ae918 +Block 0020 [109]: b246bdcdcb1b3dc8 +Block 0020 [110]: e706d48f7b4be38b +Block 0020 [111]: f6b8e33579072361 +Block 0020 [112]: d093370d12803e37 +Block 0020 [113]: f5ee3f6bbe485f0c +Block 0020 [114]: ff26642a6224ef14 +Block 0020 [115]: 8e060f75459b1591 +Block 0020 [116]: 92d11d49029def67 +Block 0020 [117]: 83686769d908640a +Block 0020 [118]: 982d2d9cc1892c1a +Block 0020 [119]: d182c0a05d04be1f +Block 0020 [120]: 085b197d2ae051ef +Block 0020 [121]: 6a9f23d9345da493 +Block 0020 [122]: f1de02d627b8e3ad +Block 0020 [123]: 274aabf0e728e979 +Block 0020 [124]: f296c23bfd3ddd40 +Block 0020 [125]: d2d634b5e3eb437f +Block 0020 [126]: 28a830d2b2a53ae3 +Block 0020 [127]: 0204d4ecf900d9fd +Block 0021 [ 0]: c12cc1a7630ab20c +Block 0021 [ 1]: 7d843f9d1bb57449 +Block 0021 [ 2]: 4ec1c00fb99466b5 +Block 0021 [ 3]: 76f7b0ad0b006ffe +Block 0021 [ 4]: f8c75bd78486fcd5 +Block 0021 [ 5]: 31b3c8708d155fe3 +Block 0021 [ 6]: 20c16f1e186a23e4 +Block 0021 [ 7]: a878075c67e6146e +Block 0021 [ 8]: c448dd6ff4914bf2 +Block 0021 [ 9]: f26dc8f66622ff67 +Block 0021 [ 10]: 42913728606ca3b4 +Block 0021 [ 11]: 08df8268d1ab2dea +Block 0021 [ 12]: 62d6424701b0d763 +Block 0021 [ 13]: 74c12644770da62b +Block 0021 [ 14]: 57fed96b12c80890 +Block 0021 [ 15]: 48d7d8d34fa4a950 +Block 0021 [ 16]: 6d572991f37958e3 +Block 0021 [ 17]: 63f5eafb7cd7efbc +Block 0021 [ 18]: 291c0fa67d95097d +Block 0021 [ 19]: d745f3585cae2a23 +Block 0021 [ 20]: 5b098367274119eb +Block 0021 [ 21]: eeb0b972239d67c3 +Block 0021 [ 22]: 6f8d5d30a3290b2d +Block 0021 [ 23]: 1cd930f80f508fed +Block 0021 [ 24]: 13252320a59f1add +Block 0021 [ 25]: c0bd534bb0880794 +Block 0021 [ 26]: 2ae82368d37658b1 +Block 0021 [ 27]: 0767e3162640b624 +Block 0021 [ 28]: 97a163f101921954 +Block 0021 [ 29]: 240e2369e5df1c54 +Block 0021 [ 30]: 796dc4405b1058ce +Block 0021 [ 31]: e32a4b28380c93fc +Block 0021 [ 32]: fe45b1a7bc753ed2 +Block 0021 [ 33]: 9e036ac9e7500849 +Block 0021 [ 34]: 4ccffa21cc335fb9 +Block 0021 [ 35]: a98d9e57a864f8be +Block 0021 [ 36]: c821969719d0b4ee +Block 0021 [ 37]: ea18b297cddc70f2 +Block 0021 [ 38]: f2c76c0b5f9f4096 +Block 0021 [ 39]: 54e08c67e0685193 +Block 0021 [ 40]: a75405fdc2ae7c40 +Block 0021 [ 41]: 8e7132965e9d271d +Block 0021 [ 42]: 998217fcf11ac2f2 +Block 0021 [ 43]: 3defa4721885a50e +Block 0021 [ 44]: 70699c4abc689fba +Block 0021 [ 45]: d746bef4daf4bcea +Block 0021 [ 46]: 600fdc290ee2027d +Block 0021 [ 47]: 67be6a9bd1e606bc +Block 0021 [ 48]: af28be9adba758ed +Block 0021 [ 49]: ad583090bd70d41c +Block 0021 [ 50]: 9f4b3857054b108d +Block 0021 [ 51]: 5310a2ea584dea4e +Block 0021 [ 52]: 1e6b0959fae98af3 +Block 0021 [ 53]: a13a136d93c676a6 +Block 0021 [ 54]: 137ecb0ff39d3409 +Block 0021 [ 55]: 7ca34f346ffe4eb0 +Block 0021 [ 56]: b31d811d53e9fd89 +Block 0021 [ 57]: 33e9ee66616eefa5 +Block 0021 [ 58]: 036a3a60147520c5 +Block 0021 [ 59]: e5e6b915e03d02e1 +Block 0021 [ 60]: f2b85ab4bee057cc +Block 0021 [ 61]: f020edf1cfa20c62 +Block 0021 [ 62]: 560116c2cd4749a5 +Block 0021 [ 63]: fee85e86bbcec42d +Block 0021 [ 64]: fd24d86bfbf48a4b +Block 0021 [ 65]: daa1ca90040ea1ec +Block 0021 [ 66]: c113e6c001bda230 +Block 0021 [ 67]: 06c9e40ff5c0514f +Block 0021 [ 68]: ad6e82c68f64cf0c +Block 0021 [ 69]: a92062c5f8ecf9a3 +Block 0021 [ 70]: f446d44ccd988cdb +Block 0021 [ 71]: 2665503730a90b3f +Block 0021 [ 72]: 0d5b91cb0378ac0a +Block 0021 [ 73]: 9e37095869eb5713 +Block 0021 [ 74]: 2321ce41dd8da5a3 +Block 0021 [ 75]: 64614f3ce5ebaf1e +Block 0021 [ 76]: 99b437d318b3fd65 +Block 0021 [ 77]: 8da370c7b0a99bd1 +Block 0021 [ 78]: b88f5071e7b1ff22 +Block 0021 [ 79]: e385367b7446a5d8 +Block 0021 [ 80]: 7fd00d9988d6298b +Block 0021 [ 81]: 6dacadf00512c4c7 +Block 0021 [ 82]: a79fafc4c62f47e0 +Block 0021 [ 83]: bec3c28b98e09481 +Block 0021 [ 84]: 59658b57a179c94d +Block 0021 [ 85]: 9b5655e529c865bb +Block 0021 [ 86]: 446468a9aef42973 +Block 0021 [ 87]: 8b17d0792b62b959 +Block 0021 [ 88]: 946928416f827f66 +Block 0021 [ 89]: bf1e4e1cf11e4d13 +Block 0021 [ 90]: ed26651a9cc1cf4c +Block 0021 [ 91]: 1999ecb0492dbf6d +Block 0021 [ 92]: 5ae6127f4aff6568 +Block 0021 [ 93]: d44ed717054f9942 +Block 0021 [ 94]: 5437b56726a956ed +Block 0021 [ 95]: 6f6befe7e5b92675 +Block 0021 [ 96]: 6417eb27b53301bb +Block 0021 [ 97]: 620f7d9b1e2c90b6 +Block 0021 [ 98]: ebb1aaf241321a4e +Block 0021 [ 99]: 5afdb7a0b59befa7 +Block 0021 [100]: fae040ea8eee04f4 +Block 0021 [101]: 88d12acc0b99fece +Block 0021 [102]: b5e1e7175ac7fc22 +Block 0021 [103]: 4c7bd92ede0a3303 +Block 0021 [104]: 8c9e433bd43d540d +Block 0021 [105]: b41d516eba7eb06f +Block 0021 [106]: 2d7c6d31687048be +Block 0021 [107]: f3ed5c6303fe8930 +Block 0021 [108]: 63adb43e1eb1c2b0 +Block 0021 [109]: 0fd88f6d8c134194 +Block 0021 [110]: 96e5248b15869af1 +Block 0021 [111]: 2b2214a414b91922 +Block 0021 [112]: ec49cf29cd39bcb0 +Block 0021 [113]: 30a080de12274f79 +Block 0021 [114]: fdda4ce0c746632f +Block 0021 [115]: 95e428f16be30440 +Block 0021 [116]: 517bd14be65778c5 +Block 0021 [117]: 8047066c240bf71f +Block 0021 [118]: 76e99bbe489edc17 +Block 0021 [119]: e38bbfc1500917cd +Block 0021 [120]: 47b495ea51ddde99 +Block 0021 [121]: a7f465121e6866d6 +Block 0021 [122]: bcad55441d717cf4 +Block 0021 [123]: c01b4ccf3af42871 +Block 0021 [124]: a2fac53753be25d4 +Block 0021 [125]: ecf463167e33c65f +Block 0021 [126]: b59ec66d36b26358 +Block 0021 [127]: 3c69b335560021a7 +Block 0022 [ 0]: ab16b3a56c5075d9 +Block 0022 [ 1]: bf6e87316986ed91 +Block 0022 [ 2]: 3706dc9baa34f072 +Block 0022 [ 3]: d000956d44f7d1a1 +Block 0022 [ 4]: b9042077b3ba870e +Block 0022 [ 5]: 23f4954484f46834 +Block 0022 [ 6]: 7f00ea023bd08390 +Block 0022 [ 7]: 6d36d08a66d30fc7 +Block 0022 [ 8]: 90b1d92efe744358 +Block 0022 [ 9]: 43148be233395484 +Block 0022 [ 10]: 529f606afdabaea5 +Block 0022 [ 11]: 0840d08dfdc8cf40 +Block 0022 [ 12]: d2d110baa6ed66df +Block 0022 [ 13]: d94d5feceb8b6693 +Block 0022 [ 14]: 9d5f3588931f8d56 +Block 0022 [ 15]: 5909bb597b2548db +Block 0022 [ 16]: 4ef8519c35d03e3b +Block 0022 [ 17]: 3c963b75c7aa5cfb +Block 0022 [ 18]: 262fb246be170e59 +Block 0022 [ 19]: d440145519b7ad26 +Block 0022 [ 20]: 73ab50c82577acdd +Block 0022 [ 21]: a898aeed8a2d8301 +Block 0022 [ 22]: 0f12e4d69e8ff588 +Block 0022 [ 23]: 42de1e1610bf5ac0 +Block 0022 [ 24]: c9d77bd96186c22b +Block 0022 [ 25]: 48224c45c85d1a7e +Block 0022 [ 26]: eb605118f55496a7 +Block 0022 [ 27]: eae4f2d623f09f0c +Block 0022 [ 28]: 1bc8533a22ade72e +Block 0022 [ 29]: c5d5d068055194ba +Block 0022 [ 30]: dc8091ca4b23c5c9 +Block 0022 [ 31]: 4f6ab36707a798d1 +Block 0022 [ 32]: f5661f644f082a87 +Block 0022 [ 33]: 89906ef40c28c45c +Block 0022 [ 34]: 8245084f1e623ca3 +Block 0022 [ 35]: eb80dabbf146dfd1 +Block 0022 [ 36]: 21597abb85a09601 +Block 0022 [ 37]: 911883ff4eaad8ce +Block 0022 [ 38]: 37a30fcfd4e7e78e +Block 0022 [ 39]: a0e80cdfa662c635 +Block 0022 [ 40]: 8eab544a96438380 +Block 0022 [ 41]: 82c38c4f95d1ae3f +Block 0022 [ 42]: 29fd6fd0a6903703 +Block 0022 [ 43]: b6a8e2cda01ed83e +Block 0022 [ 44]: f90b7e33a0165041 +Block 0022 [ 45]: 977f2a7ac3eaf97e +Block 0022 [ 46]: 1942327dddd81546 +Block 0022 [ 47]: 517c90126edcaaa0 +Block 0022 [ 48]: c5ffce11d9f5fd31 +Block 0022 [ 49]: e7bcbb02539969cf +Block 0022 [ 50]: a4657d205059500a +Block 0022 [ 51]: 61e75294e0c5a7dd +Block 0022 [ 52]: 4b2297b821bf9d6c +Block 0022 [ 53]: f5d35f75b3efe34f +Block 0022 [ 54]: 3069214b0c198625 +Block 0022 [ 55]: 58dc0964970a7436 +Block 0022 [ 56]: 5ab8e583fcf8cc8a +Block 0022 [ 57]: d3f90e125dc63769 +Block 0022 [ 58]: d99fdc3e92d27d41 +Block 0022 [ 59]: 59c8a73d0a38ef89 +Block 0022 [ 60]: 7cfee5d258168e40 +Block 0022 [ 61]: 7f9531f36c2b78d2 +Block 0022 [ 62]: 5fa407b6ae15296b +Block 0022 [ 63]: b52c77c541797d42 +Block 0022 [ 64]: 1ac5d4233901339e +Block 0022 [ 65]: b29e6f85131997a2 +Block 0022 [ 66]: 87147a9a6dc9db3c +Block 0022 [ 67]: 033f96b424f5af0d +Block 0022 [ 68]: ec33cf847ef40a18 +Block 0022 [ 69]: 0f8f314e8c3a0bec +Block 0022 [ 70]: d6c21ea4ba3358a0 +Block 0022 [ 71]: ac3d0f1c487d577b +Block 0022 [ 72]: 11937f11fc59a840 +Block 0022 [ 73]: 61674f505fd229ae +Block 0022 [ 74]: 5a00e6607ec78934 +Block 0022 [ 75]: e249c6cd3f887bff +Block 0022 [ 76]: 716deb4f18e87fba +Block 0022 [ 77]: 92dd5e6b87ae487d +Block 0022 [ 78]: d45ae78ffed12c55 +Block 0022 [ 79]: 2c5bfc277658f3a1 +Block 0022 [ 80]: db971b0168ea4745 +Block 0022 [ 81]: 46e39abd9f685214 +Block 0022 [ 82]: 93ee55707d51ac38 +Block 0022 [ 83]: 3764e134d7bc5e1e +Block 0022 [ 84]: c867ee52271ef46c +Block 0022 [ 85]: d41958c6c6cdd2fd +Block 0022 [ 86]: 21a4c738e6b32bbb +Block 0022 [ 87]: 9182f1362fbe103f +Block 0022 [ 88]: d4fc051a73c0ba4f +Block 0022 [ 89]: 4b3b78d41e673f1b +Block 0022 [ 90]: de8859d43a77db34 +Block 0022 [ 91]: 702f0530d93babe9 +Block 0022 [ 92]: b67f17c55e7f9629 +Block 0022 [ 93]: 04584cb783e39923 +Block 0022 [ 94]: fd138c6fabea3a81 +Block 0022 [ 95]: 43658bec8f80a41d +Block 0022 [ 96]: 0440da4de750eaab +Block 0022 [ 97]: 4b7702f3d6554710 +Block 0022 [ 98]: d68d5f3de84d37ca +Block 0022 [ 99]: 18ca44373c453767 +Block 0022 [100]: d1fdbbe79c392c87 +Block 0022 [101]: 9dae17d1f4740b9b +Block 0022 [102]: a9c52e3c1eb100ad +Block 0022 [103]: 8bd7475cfb22956c +Block 0022 [104]: 85eb6b76a6d2a8c8 +Block 0022 [105]: 198bec106136c9ce +Block 0022 [106]: 9b81158c4c3d0e51 +Block 0022 [107]: 2022774adeafe355 +Block 0022 [108]: 7a1b3f58e921bfd0 +Block 0022 [109]: 906523ea688ebb1b +Block 0022 [110]: 74472376d97f71b8 +Block 0022 [111]: e2a6b16fe40d2a75 +Block 0022 [112]: 9abc505f14c1dd63 +Block 0022 [113]: d0fa9c766f6d104c +Block 0022 [114]: adefe0e0ae4bb777 +Block 0022 [115]: a5d379758af224e6 +Block 0022 [116]: dc29361b4c8ebc7d +Block 0022 [117]: 5c091ed940780a84 +Block 0022 [118]: 7ffc0e4038e28779 +Block 0022 [119]: 80b312993291f81e +Block 0022 [120]: 39608712b2445c46 +Block 0022 [121]: bf879dc1b80ae860 +Block 0022 [122]: 514c6ab3ff330561 +Block 0022 [123]: 55370d7c118dd1fb +Block 0022 [124]: 846f03da6bfa17f1 +Block 0022 [125]: 87948df888a4cbf2 +Block 0022 [126]: 89ccbff86501eb61 +Block 0022 [127]: 6aa3800ea4c30a6d +Block 0023 [ 0]: 556721f6dc987249 +Block 0023 [ 1]: 99b4dfec9c302f7d +Block 0023 [ 2]: 1117e2bb2476093b +Block 0023 [ 3]: 1b2f958fa1e0291a +Block 0023 [ 4]: d2ec858fef0236e7 +Block 0023 [ 5]: c3b8b8774e30fa01 +Block 0023 [ 6]: fec88aa56118cd0b +Block 0023 [ 7]: 7482e9a6e06d2726 +Block 0023 [ 8]: 803534fe2cf0f98e +Block 0023 [ 9]: ff6d8c8018ede5a7 +Block 0023 [ 10]: 87d7eff1d657f2ac +Block 0023 [ 11]: 819c06f8a94ddad7 +Block 0023 [ 12]: 6341df572ace94c6 +Block 0023 [ 13]: 2f45f9db86cf0797 +Block 0023 [ 14]: 6555d7ef0a6fa787 +Block 0023 [ 15]: 9db255c7658fe518 +Block 0023 [ 16]: b34faa5c72edf4ad +Block 0023 [ 17]: ba7bd4028c089f1a +Block 0023 [ 18]: 09602adb7e3c7b36 +Block 0023 [ 19]: 1209106421591752 +Block 0023 [ 20]: 5819306a403cd8e4 +Block 0023 [ 21]: 53197970bb5fa1f9 +Block 0023 [ 22]: 16e8bbc10bec7ef8 +Block 0023 [ 23]: 6b01c4dd49a87999 +Block 0023 [ 24]: 7495246fdc5193b5 +Block 0023 [ 25]: b3a8f9152786463b +Block 0023 [ 26]: 23c964909608bb59 +Block 0023 [ 27]: d48cb6d946414714 +Block 0023 [ 28]: 0bf19bb18fbe8fd4 +Block 0023 [ 29]: 776e3968ded52066 +Block 0023 [ 30]: cb51fe52d0717809 +Block 0023 [ 31]: 51a4f168ef8c6df2 +Block 0023 [ 32]: 828e73597ba1ffb4 +Block 0023 [ 33]: 775664a0a94d9a38 +Block 0023 [ 34]: aa8d077ca94bd294 +Block 0023 [ 35]: 0f8d196531249306 +Block 0023 [ 36]: 18bdafa6230e7c58 +Block 0023 [ 37]: 828062267b0d6fd3 +Block 0023 [ 38]: a3bdf8db2fe6cf2f +Block 0023 [ 39]: b0733ce01f2b0704 +Block 0023 [ 40]: d1c49348c163ffd0 +Block 0023 [ 41]: 9ceaa71c0412483e +Block 0023 [ 42]: 270728a894443699 +Block 0023 [ 43]: 31e0b34e8a211d4b +Block 0023 [ 44]: 065f68d65aa2ce32 +Block 0023 [ 45]: b3a0f4c50ba17262 +Block 0023 [ 46]: 6e4a884360dc6018 +Block 0023 [ 47]: 0229bb9b7f74e2e3 +Block 0023 [ 48]: a0e2d3bb2aa6f992 +Block 0023 [ 49]: 51816f912c836575 +Block 0023 [ 50]: e0b825bbc0d3e078 +Block 0023 [ 51]: 4c479c9963e79cf4 +Block 0023 [ 52]: 73dca92a9169307e +Block 0023 [ 53]: b429a5f8c46bd932 +Block 0023 [ 54]: b0b7fb8ef64c1b04 +Block 0023 [ 55]: 8169f07c085d8b2a +Block 0023 [ 56]: 0e8394c61e8979cc +Block 0023 [ 57]: 09692e621ebe9fbe +Block 0023 [ 58]: 307da2a38a26abf7 +Block 0023 [ 59]: db57d2225640b395 +Block 0023 [ 60]: 764b4447978991f1 +Block 0023 [ 61]: 6ff6a890fce95daf +Block 0023 [ 62]: c3e624ade7d96d9c +Block 0023 [ 63]: 2b5053bfb7ef35c8 +Block 0023 [ 64]: 2e8a62d6bb119e7b +Block 0023 [ 65]: 8cac526cc4a7a645 +Block 0023 [ 66]: 8fbb0601586486ce +Block 0023 [ 67]: 8044ffb0401b4041 +Block 0023 [ 68]: 8798e3677b488295 +Block 0023 [ 69]: 7433a887af3dd05a +Block 0023 [ 70]: 3a7189e6fb1014a1 +Block 0023 [ 71]: 32d00c4bbcaac4a9 +Block 0023 [ 72]: a77359f3d6c159b6 +Block 0023 [ 73]: 74f343d44052937d +Block 0023 [ 74]: 0c66f82b096e4a8c +Block 0023 [ 75]: 986205cf0d8ddfd5 +Block 0023 [ 76]: 4505e8e3ff1955c7 +Block 0023 [ 77]: bdfdb8e10137d89c +Block 0023 [ 78]: 3cfab16a6e505749 +Block 0023 [ 79]: 0c9e89e21030cda5 +Block 0023 [ 80]: 9b39ebca2638fa57 +Block 0023 [ 81]: a39a852d538cc65a +Block 0023 [ 82]: 417ac20a52b358c5 +Block 0023 [ 83]: 57bb86093eb9779e +Block 0023 [ 84]: 6104a01c0efb313a +Block 0023 [ 85]: 9a76e197a2daaaa4 +Block 0023 [ 86]: 0ba50f40599759b0 +Block 0023 [ 87]: 82d2f09e12c993e1 +Block 0023 [ 88]: 8213a0d0c050aaf5 +Block 0023 [ 89]: 7850e59315f640ec +Block 0023 [ 90]: 742b954ff07ec512 +Block 0023 [ 91]: 1cc7b7a76ddb5908 +Block 0023 [ 92]: 90175fb8e3f50c78 +Block 0023 [ 93]: a9bb387ad0caedfb +Block 0023 [ 94]: 687bb45cc5c9cc4c +Block 0023 [ 95]: d452dfa463e6cb6a +Block 0023 [ 96]: 77f1cc9138028d48 +Block 0023 [ 97]: f8d09a3ea40682a7 +Block 0023 [ 98]: a5a831cab641262d +Block 0023 [ 99]: 131636b6651e56f4 +Block 0023 [100]: 540331e6bd311bc3 +Block 0023 [101]: 29392009473107a3 +Block 0023 [102]: 9171ce46a6d71344 +Block 0023 [103]: ece3a2c971e5d580 +Block 0023 [104]: 7a90cdaa7553b5a8 +Block 0023 [105]: ef302aa8ca894274 +Block 0023 [106]: 9f92c44cbc91bc72 +Block 0023 [107]: 0e85df7e88220c16 +Block 0023 [108]: b59f9d637a0f1de4 +Block 0023 [109]: 365dedbc87eb2698 +Block 0023 [110]: 14b1e9d4bd03ed33 +Block 0023 [111]: 6894880ded846900 +Block 0023 [112]: 4019b80ea900fce9 +Block 0023 [113]: bb9eaa2c25a5e283 +Block 0023 [114]: b02f512376bfd802 +Block 0023 [115]: f44a5e0fd7134db4 +Block 0023 [116]: 5385593b6cf69c33 +Block 0023 [117]: 651d8a75b4f5d8cd +Block 0023 [118]: d9fa29584a6b0b21 +Block 0023 [119]: b2c2fca9073c3882 +Block 0023 [120]: 810511ff5d9e8807 +Block 0023 [121]: f160852a94f55308 +Block 0023 [122]: 2f741d93d26befbc +Block 0023 [123]: 0504623ef78331ec +Block 0023 [124]: 73feb604a4e6f0f5 +Block 0023 [125]: 4ad832c77a9891bd +Block 0023 [126]: b5e45edc4e847c4b +Block 0023 [127]: 6ffd61b212eb8ea2 +Block 0024 [ 0]: d88284f50713c31b +Block 0024 [ 1]: 8c87762439effae4 +Block 0024 [ 2]: 627d88554d9c676c +Block 0024 [ 3]: 456a544d129f6a19 +Block 0024 [ 4]: 1bba14a4866d3eaa +Block 0024 [ 5]: 8b95d511ff8e5399 +Block 0024 [ 6]: 5d2f3d694b9f103a +Block 0024 [ 7]: c616b5caf714f117 +Block 0024 [ 8]: 78500c063a98f09a +Block 0024 [ 9]: f8d930b864f14db7 +Block 0024 [ 10]: 1fd61ead5acebd80 +Block 0024 [ 11]: b4528739e5183157 +Block 0024 [ 12]: 89e5791f65963437 +Block 0024 [ 13]: 68f5cc6a53562ec0 +Block 0024 [ 14]: 3871f32fdaa3b946 +Block 0024 [ 15]: 75344f511527fedf +Block 0024 [ 16]: 4fe8800adf2466be +Block 0024 [ 17]: 9ab4030c1a3aaddd +Block 0024 [ 18]: 8339ff862f1ab707 +Block 0024 [ 19]: 5c6597e27d49f75b +Block 0024 [ 20]: 1a14e616a338206c +Block 0024 [ 21]: 31eed02a0647075a +Block 0024 [ 22]: 8c7a00d30e7d31e9 +Block 0024 [ 23]: acd25fe6051b5363 +Block 0024 [ 24]: da738b6d3d6e875a +Block 0024 [ 25]: f24fca741d0f8de3 +Block 0024 [ 26]: 12ca39f6d6087516 +Block 0024 [ 27]: e40695661644eeda +Block 0024 [ 28]: 4c5b86c9fab6199c +Block 0024 [ 29]: 6c24d91cbd243752 +Block 0024 [ 30]: a6ba8fb90af10a20 +Block 0024 [ 31]: 298bbf7d91bd6df3 +Block 0024 [ 32]: cda34cf012e25d4b +Block 0024 [ 33]: aee2c946a2f594a0 +Block 0024 [ 34]: 8cb96f7da1a78ef2 +Block 0024 [ 35]: 0fc18547c433ba29 +Block 0024 [ 36]: 6f03257b4a4aa101 +Block 0024 [ 37]: 9f4a1bf963efe77f +Block 0024 [ 38]: 24eccb6c5c64d4a9 +Block 0024 [ 39]: 5d3c5a06a53c2cf7 +Block 0024 [ 40]: 01d604366f6dc1e0 +Block 0024 [ 41]: a8e0dba29a99108e +Block 0024 [ 42]: 1c47a9a5f396ab45 +Block 0024 [ 43]: d45cbbfbb03fd673 +Block 0024 [ 44]: ddc29f83a08238ba +Block 0024 [ 45]: efb52fda37fd5483 +Block 0024 [ 46]: 2252e2ce16b35dd2 +Block 0024 [ 47]: 037fc7a6c0ff0c5a +Block 0024 [ 48]: f202db23b64e1eb6 +Block 0024 [ 49]: 743410480c25aff3 +Block 0024 [ 50]: 640a479a6f306adf +Block 0024 [ 51]: 958e2253a8914ede +Block 0024 [ 52]: 8b1e51392300b250 +Block 0024 [ 53]: a699253416b612d4 +Block 0024 [ 54]: c4e9097a571bdb24 +Block 0024 [ 55]: f7f1162a4fbc75ee +Block 0024 [ 56]: 1b6dd1fe292d9c22 +Block 0024 [ 57]: 796d46d2f71d4e77 +Block 0024 [ 58]: 893ded32ffb7ac70 +Block 0024 [ 59]: bb6dab308f4cee79 +Block 0024 [ 60]: 8b18e8740f27d639 +Block 0024 [ 61]: f644b8c3df7db7e2 +Block 0024 [ 62]: 35c04f8f8824a45b +Block 0024 [ 63]: bcd9215d9a18a39d +Block 0024 [ 64]: e80b5dfa5dfe2d2c +Block 0024 [ 65]: 47ca09e8916c744a +Block 0024 [ 66]: 527d58c882db4fe4 +Block 0024 [ 67]: 384654cce68a5a48 +Block 0024 [ 68]: 1e917bd09d5fc395 +Block 0024 [ 69]: f2eeb59a136c23c5 +Block 0024 [ 70]: d0062fa155adcbd3 +Block 0024 [ 71]: 650d4fd65c081681 +Block 0024 [ 72]: 77535a18a15e4f39 +Block 0024 [ 73]: 2a081a72b7522a15 +Block 0024 [ 74]: 9c64ed7680bc0ab6 +Block 0024 [ 75]: dfd06369f31d6630 +Block 0024 [ 76]: f669d8a8c9f0eb39 +Block 0024 [ 77]: c296a9c2a9485dbb +Block 0024 [ 78]: 6214d2f5ba58a315 +Block 0024 [ 79]: 5b653348723c129d +Block 0024 [ 80]: 9c48f59c76fcf934 +Block 0024 [ 81]: fd7498527f17d3ab +Block 0024 [ 82]: 7ae20772d38bf8d4 +Block 0024 [ 83]: ef647a626247193c +Block 0024 [ 84]: 4d317391d8df4450 +Block 0024 [ 85]: 12558123e175f980 +Block 0024 [ 86]: fac8e511cba42c82 +Block 0024 [ 87]: 8069fb7578f5f0cb +Block 0024 [ 88]: 31858de29f739b86 +Block 0024 [ 89]: c1e68b8f0eef3ca6 +Block 0024 [ 90]: 95bb9e89125dca10 +Block 0024 [ 91]: c5d1abd5a40b7cae +Block 0024 [ 92]: 94f17725613a0eef +Block 0024 [ 93]: ad34e36ea76bb481 +Block 0024 [ 94]: d07439a3ef48bff7 +Block 0024 [ 95]: 0a0c062abfc544f3 +Block 0024 [ 96]: 24f99b247f7b7e5a +Block 0024 [ 97]: ed27a580eaaf4ee5 +Block 0024 [ 98]: ebc61a0a4c093f87 +Block 0024 [ 99]: d08946d03ff1542a +Block 0024 [100]: 0befcf9d5f571522 +Block 0024 [101]: b5be7e66b886472c +Block 0024 [102]: 0271a6c1f348073b +Block 0024 [103]: 7f24ce4f67784d15 +Block 0024 [104]: bf7b10d70723ba6e +Block 0024 [105]: f00edf5c303e9b06 +Block 0024 [106]: 7a7ef27f4872669f +Block 0024 [107]: fffd0af0f5e95a97 +Block 0024 [108]: 7dac32c65cebd8ad +Block 0024 [109]: 611bdbe7f7ac37b6 +Block 0024 [110]: db3b333b27fb4ced +Block 0024 [111]: bb3cefc08d708545 +Block 0024 [112]: 1a17b3c9ba7fdf10 +Block 0024 [113]: 288dd53e76b91f62 +Block 0024 [114]: d2795c6696a76238 +Block 0024 [115]: 3eaf16374449b54f +Block 0024 [116]: 7ec146ee77bd917d +Block 0024 [117]: a9e40f4aa4a25eb7 +Block 0024 [118]: b2afd186798bcdd5 +Block 0024 [119]: 94815c56ceb4e679 +Block 0024 [120]: b4bc677bddd6448e +Block 0024 [121]: 01cd724d3300bbd0 +Block 0024 [122]: 8343503e5e98eb96 +Block 0024 [123]: 6a7a4414b7ed645e +Block 0024 [124]: 672bac9c0ae51d50 +Block 0024 [125]: 640075a4cfd1f8dc +Block 0024 [126]: 136974d993c474b3 +Block 0024 [127]: 7ce21aafca4593ee +Block 0025 [ 0]: 9b02443a6f899e73 +Block 0025 [ 1]: c1ee68a9c94f0899 +Block 0025 [ 2]: a6eaf7a6b38f45dc +Block 0025 [ 3]: 66069bc282e196e8 +Block 0025 [ 4]: 6d15c727711caa68 +Block 0025 [ 5]: 1a1efa2d260f3cde +Block 0025 [ 6]: eff2a14ce540dca8 +Block 0025 [ 7]: 94b2877a291c2fa9 +Block 0025 [ 8]: 4d57f7b951ec9e6c +Block 0025 [ 9]: 38643647a66bad56 +Block 0025 [ 10]: f4949cf4a451d471 +Block 0025 [ 11]: 38f9d32110a50ed8 +Block 0025 [ 12]: 00892238ac194fef +Block 0025 [ 13]: 5cc481f19bd1b7b2 +Block 0025 [ 14]: 89eae5086a6fb7df +Block 0025 [ 15]: d339c86fe08eaaf6 +Block 0025 [ 16]: d3615f7f03f60511 +Block 0025 [ 17]: 5beafb3a682787a5 +Block 0025 [ 18]: 7e690364d56c6f35 +Block 0025 [ 19]: 715ba6f8d92cfde8 +Block 0025 [ 20]: da002adec3a9aec0 +Block 0025 [ 21]: f7fd26727e3c39de +Block 0025 [ 22]: 5ce5effbabeb778b +Block 0025 [ 23]: 82488be85fa89f69 +Block 0025 [ 24]: ebf34f3cf31e872f +Block 0025 [ 25]: 904e3442eb91077d +Block 0025 [ 26]: 4ccb7af848995148 +Block 0025 [ 27]: 6674e0d65423b763 +Block 0025 [ 28]: 441ff96ad8206f58 +Block 0025 [ 29]: 94666bf2dfc0b99b +Block 0025 [ 30]: ed05edb80461172e +Block 0025 [ 31]: 48a4835d15f5dd8d +Block 0025 [ 32]: b7ba7f265b645ae8 +Block 0025 [ 33]: c28982cf0cc46f5f +Block 0025 [ 34]: 0047564c7e3a987b +Block 0025 [ 35]: 49c42f1ca2a0a3ee +Block 0025 [ 36]: 5fd7a85954ea8759 +Block 0025 [ 37]: d3a2e6ddb90e1819 +Block 0025 [ 38]: ca044a91edca1181 +Block 0025 [ 39]: 7befe3a3efd19c8c +Block 0025 [ 40]: 12e2593aa586a908 +Block 0025 [ 41]: ca3204fd0293daa7 +Block 0025 [ 42]: 6fffdd8f81c7ec5b +Block 0025 [ 43]: a5a9e710a5c35441 +Block 0025 [ 44]: 8fc140c3dd6a23b9 +Block 0025 [ 45]: 4dc101b965e2bf8b +Block 0025 [ 46]: bfe30265551dfb70 +Block 0025 [ 47]: 4325a4ab2bffde44 +Block 0025 [ 48]: 0873c9bb55796104 +Block 0025 [ 49]: 3d855f2ccb7886cf +Block 0025 [ 50]: a892ad2f13aa23fd +Block 0025 [ 51]: 7ec7f45b1c3a13a3 +Block 0025 [ 52]: 7933b1cf28b7e587 +Block 0025 [ 53]: fb261404744b4403 +Block 0025 [ 54]: 1ce9fbf19e0b05ed +Block 0025 [ 55]: 081e058ac89cf91b +Block 0025 [ 56]: 0f4c61900902f20e +Block 0025 [ 57]: 6e4e47d0a76c7b2f +Block 0025 [ 58]: 31dfad465737d2d6 +Block 0025 [ 59]: c4e565cd4db9cf80 +Block 0025 [ 60]: 0fc21868de584fed +Block 0025 [ 61]: cf4bc3bdde019366 +Block 0025 [ 62]: d4b6def2b28c6197 +Block 0025 [ 63]: 1e091aa94e9efee1 +Block 0025 [ 64]: 920ae1dfc602caa9 +Block 0025 [ 65]: b9e32b85330f06cf +Block 0025 [ 66]: 622903a2ba1f7401 +Block 0025 [ 67]: 376fc0c285b6e1d6 +Block 0025 [ 68]: 58262b60f7222c02 +Block 0025 [ 69]: 48963a834c84e786 +Block 0025 [ 70]: cbf03b6c03b3f0b2 +Block 0025 [ 71]: bffe850121f01632 +Block 0025 [ 72]: 74a2031f32512b24 +Block 0025 [ 73]: 4adcf0a16a0f52f3 +Block 0025 [ 74]: 657fbc2930fa5547 +Block 0025 [ 75]: 775a8a54e8a2b61c +Block 0025 [ 76]: 603cd60bf170030e +Block 0025 [ 77]: 601ec99f484a891f +Block 0025 [ 78]: b933410f3e524173 +Block 0025 [ 79]: d86f3e3c5a2ea17a +Block 0025 [ 80]: ca2303f8e28d86d4 +Block 0025 [ 81]: c94d7faa2359de02 +Block 0025 [ 82]: 6fe0c5ecd10dd8f7 +Block 0025 [ 83]: 132b13bc110fd6bb +Block 0025 [ 84]: 1396a58273222139 +Block 0025 [ 85]: b10ff9ffee965ea2 +Block 0025 [ 86]: 835e56180aec7730 +Block 0025 [ 87]: 7e845526c7c472b9 +Block 0025 [ 88]: cf559646d6e7acfe +Block 0025 [ 89]: 6da5fa01922bc97b +Block 0025 [ 90]: 8a7cecf7918a97f5 +Block 0025 [ 91]: 75c63598267982a4 +Block 0025 [ 92]: fb62647242501a21 +Block 0025 [ 93]: 053879ca2e32577c +Block 0025 [ 94]: 328874c4f6657677 +Block 0025 [ 95]: cd160a4827bac171 +Block 0025 [ 96]: 366fb60bdfd14ec8 +Block 0025 [ 97]: 53042bee2ee8eea9 +Block 0025 [ 98]: daab24de7ed4b56e +Block 0025 [ 99]: 618bbb25385e03e7 +Block 0025 [100]: be554b98dbfc2a9d +Block 0025 [101]: 4566911b80d8dc2c +Block 0025 [102]: 8b5305bdbcd6075b +Block 0025 [103]: 67133a756f6a4b94 +Block 0025 [104]: 8284f40064d78922 +Block 0025 [105]: 5cf6fd63cf1d566a +Block 0025 [106]: b0175f63f4ddde67 +Block 0025 [107]: d7fb740f72bbda6d +Block 0025 [108]: 3f826efe67b1be5f +Block 0025 [109]: f3dc52433918e9a7 +Block 0025 [110]: 5de0272794bbdc54 +Block 0025 [111]: 240198167e58db76 +Block 0025 [112]: ca61e16751058de5 +Block 0025 [113]: 69ed01fd9dfb4e30 +Block 0025 [114]: 23264aec15e29210 +Block 0025 [115]: 0ed5522a78def765 +Block 0025 [116]: da43bf7acbd3db76 +Block 0025 [117]: 1b08030a1e29657c +Block 0025 [118]: 4421fe09e2526c19 +Block 0025 [119]: c752a808ce58ef11 +Block 0025 [120]: a4a0ae7b4c27f551 +Block 0025 [121]: a9bd8741f2ce61bb +Block 0025 [122]: 6806af701aaaff8e +Block 0025 [123]: f51d43bad7d70d80 +Block 0025 [124]: b6ef49db4b4be794 +Block 0025 [125]: e36d78c39c512816 +Block 0025 [126]: cc32f44ae037a86b +Block 0025 [127]: 880fecf11ba54ced +Block 0026 [ 0]: 7ef468a64079cd9a +Block 0026 [ 1]: 8546dfe9d161c4bc +Block 0026 [ 2]: eebf928e3390334e +Block 0026 [ 3]: 7218cc9841e59f45 +Block 0026 [ 4]: 95d9e37c4b9a4f4d +Block 0026 [ 5]: 276db3f95e1261bf +Block 0026 [ 6]: a97405ae99bfaab7 +Block 0026 [ 7]: 58d5a4bab4709e48 +Block 0026 [ 8]: 7d53c7ee5ec47ccb +Block 0026 [ 9]: bd8064b37e9fcd44 +Block 0026 [ 10]: 838bda546d531773 +Block 0026 [ 11]: fe3e588ecb36d23d +Block 0026 [ 12]: 2bd509e8359fb68c +Block 0026 [ 13]: 21e808c5ccbbb67d +Block 0026 [ 14]: c8c63b5118c5b7bc +Block 0026 [ 15]: 5aa30e29e87723ed +Block 0026 [ 16]: 9bee04350c6ac26b +Block 0026 [ 17]: fd5f59a6868ee80a +Block 0026 [ 18]: d03cd60f128a4d38 +Block 0026 [ 19]: 319edf5ae1fd16c3 +Block 0026 [ 20]: 55fae0ac08942a8c +Block 0026 [ 21]: 48efd5deba981eda +Block 0026 [ 22]: 4a9a42f6929229b4 +Block 0026 [ 23]: 6e5250d853603705 +Block 0026 [ 24]: 470392f63cf8c80b +Block 0026 [ 25]: af637923901c26d7 +Block 0026 [ 26]: e0357745a3c135d9 +Block 0026 [ 27]: 69a1a5a1594c5498 +Block 0026 [ 28]: 8b33325678af02cf +Block 0026 [ 29]: df2c0c4935f133fb +Block 0026 [ 30]: 41517c2801176075 +Block 0026 [ 31]: b91c2a723d9c6a4f +Block 0026 [ 32]: c8f49391d970a150 +Block 0026 [ 33]: 611642a25e792a1f +Block 0026 [ 34]: 93551770566de5ff +Block 0026 [ 35]: 05c6a42cf2ae5314 +Block 0026 [ 36]: c87777b796c9bc1b +Block 0026 [ 37]: 6e4c8c8598220e5c +Block 0026 [ 38]: 63f141c6a0d2312d +Block 0026 [ 39]: 45e19d756e512b56 +Block 0026 [ 40]: 2b34021cd96cc4f4 +Block 0026 [ 41]: e3d41f9435cbab53 +Block 0026 [ 42]: 82bff43da2662c43 +Block 0026 [ 43]: 5fbf81d0f198a14d +Block 0026 [ 44]: 0719beae98c62ff9 +Block 0026 [ 45]: 3cf8075583d96a30 +Block 0026 [ 46]: 5011d98a15533b7e +Block 0026 [ 47]: 9bc8ea4f4c71754e +Block 0026 [ 48]: 6ea994994cc966d1 +Block 0026 [ 49]: cd5b3d21e82a4b3e +Block 0026 [ 50]: a82cc5d874e19644 +Block 0026 [ 51]: 75225bcee41db2c8 +Block 0026 [ 52]: 6f91ce2ee312bc16 +Block 0026 [ 53]: 8e3a411f853d1ee8 +Block 0026 [ 54]: 6e20aa263bb03ddf +Block 0026 [ 55]: 2bc22c49f82ac92a +Block 0026 [ 56]: 6834393a3a72cb2d +Block 0026 [ 57]: 2c15e7ee39881b9b +Block 0026 [ 58]: 3b680656e204c6f8 +Block 0026 [ 59]: 0db101ef83bc6e1d +Block 0026 [ 60]: 4ef271dcf28d5ad7 +Block 0026 [ 61]: b25d0a8e922b17cd +Block 0026 [ 62]: c029827e59818eed +Block 0026 [ 63]: 01c3c5fa5b1910a0 +Block 0026 [ 64]: 7e2acaf23c628008 +Block 0026 [ 65]: 3966da46acdbf674 +Block 0026 [ 66]: 6c546372f285eb81 +Block 0026 [ 67]: 4c64673f1bd15733 +Block 0026 [ 68]: ddc0115b4f88d8b2 +Block 0026 [ 69]: 6699aee29d277d58 +Block 0026 [ 70]: 7060e5e8708be4a6 +Block 0026 [ 71]: b4e995b146fbf8e9 +Block 0026 [ 72]: 6ca7a550c9676696 +Block 0026 [ 73]: c8aaae0e7ae2e6ec +Block 0026 [ 74]: de456377963d8cf0 +Block 0026 [ 75]: 8fc337a19a8f1ac8 +Block 0026 [ 76]: 3d2dfe4e4df1d79c +Block 0026 [ 77]: eda051c4a2c7b70a +Block 0026 [ 78]: 57cbaf017e6723ab +Block 0026 [ 79]: b049d3e6d213512d +Block 0026 [ 80]: 2c8412eaa5c44735 +Block 0026 [ 81]: 827939a1f4a276e8 +Block 0026 [ 82]: 1ae471fd346f7a74 +Block 0026 [ 83]: dfd457440025ce20 +Block 0026 [ 84]: 3a85730d2e41a58b +Block 0026 [ 85]: f31fb93979c8085f +Block 0026 [ 86]: 94b2247bf9bbc38a +Block 0026 [ 87]: 57e6e4d2fb9ae750 +Block 0026 [ 88]: 29f72e206e450dea +Block 0026 [ 89]: 98126e68984fba49 +Block 0026 [ 90]: 54908e7e85c5d297 +Block 0026 [ 91]: 0d904ba583bf36c7 +Block 0026 [ 92]: 3186f67cde1b92eb +Block 0026 [ 93]: 9546a09b767f715d +Block 0026 [ 94]: ed2ab1b74f1f424f +Block 0026 [ 95]: 9d9121f5252a10d5 +Block 0026 [ 96]: 8b6c6cda6565b693 +Block 0026 [ 97]: 6a8e539240a22900 +Block 0026 [ 98]: 40b4f95b2a231d63 +Block 0026 [ 99]: 6293633c33154160 +Block 0026 [100]: 96b28f631411950e +Block 0026 [101]: 67fe40c1aa95a7a1 +Block 0026 [102]: 37d54121b4d85920 +Block 0026 [103]: 75b5cbd8b8660c06 +Block 0026 [104]: 24ebb2de04d1114b +Block 0026 [105]: 5fc419f35e7ce336 +Block 0026 [106]: d4afdb18dca824cf +Block 0026 [107]: 293f5840856b1ec9 +Block 0026 [108]: f232d1b7074a32b8 +Block 0026 [109]: 6f1fc4541b484666 +Block 0026 [110]: 8d148a83d4e93398 +Block 0026 [111]: d8c832cb07658c49 +Block 0026 [112]: 6ad0e8f6d9daa36e +Block 0026 [113]: dda24c063ae01145 +Block 0026 [114]: 3bde319d36725fbc +Block 0026 [115]: f3b9a9454c05da6e +Block 0026 [116]: 06e186ddc78cf92d +Block 0026 [117]: 2a596ae91800204d +Block 0026 [118]: 212c7c706f943811 +Block 0026 [119]: ae7db514d3b24213 +Block 0026 [120]: 672e25c5cef9deb8 +Block 0026 [121]: 19d761c0b6076ad3 +Block 0026 [122]: be9b211c5366c41e +Block 0026 [123]: 0deda395bd9a27d4 +Block 0026 [124]: e791c020717c6e02 +Block 0026 [125]: d7f77e53b85a47ff +Block 0026 [126]: 6e33712b6beac4ac +Block 0026 [127]: a532ad317ce50370 +Block 0027 [ 0]: 9fa1c53b690e5115 +Block 0027 [ 1]: 8b37cc2741764653 +Block 0027 [ 2]: e8c49cf23c0f8cfa +Block 0027 [ 3]: 2bb24b419bd5e104 +Block 0027 [ 4]: 89fffe467a5cfc5e +Block 0027 [ 5]: 60fd2c56d6210a00 +Block 0027 [ 6]: dbfac4f4146bb1d4 +Block 0027 [ 7]: ac59d69f4bd2f4b3 +Block 0027 [ 8]: d49097043be118e3 +Block 0027 [ 9]: 25a7ae779e708584 +Block 0027 [ 10]: a53eddfb92e77aeb +Block 0027 [ 11]: bef96fb2ccdb40ad +Block 0027 [ 12]: f745b82dffd9f4ff +Block 0027 [ 13]: 30e1c89daa429f25 +Block 0027 [ 14]: d7a3c4a8a2adfe8f +Block 0027 [ 15]: 5caaeea3a87c46c4 +Block 0027 [ 16]: 7849920c43db9b8f +Block 0027 [ 17]: 7330761405e5eef6 +Block 0027 [ 18]: 3df683244cf7df08 +Block 0027 [ 19]: d876761a60146318 +Block 0027 [ 20]: 168b6e118598ef85 +Block 0027 [ 21]: 374310fa30d84885 +Block 0027 [ 22]: 100757baa01e6c74 +Block 0027 [ 23]: d542a23309d78ddb +Block 0027 [ 24]: 500e1ac576de3a31 +Block 0027 [ 25]: 68c6493eafc727d1 +Block 0027 [ 26]: 51c529a4cdaafd71 +Block 0027 [ 27]: 6c886eed1dcd2a9d +Block 0027 [ 28]: 76e816b102474317 +Block 0027 [ 29]: 5db645c2d8bbc3b5 +Block 0027 [ 30]: 528b633a10bff528 +Block 0027 [ 31]: 2eca05eeee7f445d +Block 0027 [ 32]: b90ff76fe52371b4 +Block 0027 [ 33]: 0da08131b4982cac +Block 0027 [ 34]: 82277c1a16645af4 +Block 0027 [ 35]: da2bc08daf4a5290 +Block 0027 [ 36]: a0832f040c393c7f +Block 0027 [ 37]: dccf4d0ce8f6ecd4 +Block 0027 [ 38]: db23ff4aa8381bea +Block 0027 [ 39]: 61bf2705ff3119f6 +Block 0027 [ 40]: 76f344f53ed13981 +Block 0027 [ 41]: eb01f42010398423 +Block 0027 [ 42]: 43a19e52956f565d +Block 0027 [ 43]: addbba697b6aafd4 +Block 0027 [ 44]: 96fb2ff3add663ce +Block 0027 [ 45]: 5641ffd5d86e93fc +Block 0027 [ 46]: 6fd4691920b273b4 +Block 0027 [ 47]: b81e5f93eca99d62 +Block 0027 [ 48]: 8d093429f1ff1d82 +Block 0027 [ 49]: aea6e5fbfcc25a52 +Block 0027 [ 50]: 62e1ebe136fa8dba +Block 0027 [ 51]: 15db85e69ba386cd +Block 0027 [ 52]: 527710ee9951122a +Block 0027 [ 53]: 0f091dfc4a9af619 +Block 0027 [ 54]: 3d84ef91adcdec8a +Block 0027 [ 55]: 343ebe2dd28417fe +Block 0027 [ 56]: 9be06f5b49a6f05e +Block 0027 [ 57]: f4b1e0dc0e81697e +Block 0027 [ 58]: 2c32e3ee4934a9c2 +Block 0027 [ 59]: c5abee7d81abe68a +Block 0027 [ 60]: aab7d4a83d0ced99 +Block 0027 [ 61]: d70d53f57205e491 +Block 0027 [ 62]: 543646a33d67ab52 +Block 0027 [ 63]: 9e7720bce3cb5286 +Block 0027 [ 64]: f1e849ce5c52f1ad +Block 0027 [ 65]: 8ab8eda5cd40c8fc +Block 0027 [ 66]: 52864bf8c065bbc5 +Block 0027 [ 67]: f6e11187c4bd5aa7 +Block 0027 [ 68]: bd39792abd351168 +Block 0027 [ 69]: ae6b7e3a6a100a79 +Block 0027 [ 70]: 713b081c7958b546 +Block 0027 [ 71]: e984cae7793fe035 +Block 0027 [ 72]: 1094841fa7eec293 +Block 0027 [ 73]: a49f3fed3d1697ff +Block 0027 [ 74]: 57b7a9aa5209c9f3 +Block 0027 [ 75]: 75dfa69fc876bdf5 +Block 0027 [ 76]: afd6ca990dc04546 +Block 0027 [ 77]: 650fe9377d9cebe4 +Block 0027 [ 78]: cc9cc3acdd5b8345 +Block 0027 [ 79]: 5b193656205729ff +Block 0027 [ 80]: 45e61b89a2e05f16 +Block 0027 [ 81]: a005d8298561714e +Block 0027 [ 82]: 1fa74ae4179734b2 +Block 0027 [ 83]: 2ee4f5fab9189036 +Block 0027 [ 84]: ef17041c685d0e40 +Block 0027 [ 85]: 5f92a508530ff0c0 +Block 0027 [ 86]: cfa7a375870e09e8 +Block 0027 [ 87]: 261f7ef8b9bfbff3 +Block 0027 [ 88]: cbe7e553a0cf2e7f +Block 0027 [ 89]: 39eb11ca144e77ca +Block 0027 [ 90]: de08863c98348c66 +Block 0027 [ 91]: 8fb79e25b74d0a9d +Block 0027 [ 92]: 7b589fc28e7e49f5 +Block 0027 [ 93]: 2b36a30651701013 +Block 0027 [ 94]: 33f3d35fac3e386a +Block 0027 [ 95]: 9b8232dd011c0cd9 +Block 0027 [ 96]: c222979853df7368 +Block 0027 [ 97]: a75437ef2e7ebee2 +Block 0027 [ 98]: ca7290f054ee32ff +Block 0027 [ 99]: f7f615bb41c13909 +Block 0027 [100]: 98a41dab04c916e3 +Block 0027 [101]: 56bd9abe4ffea529 +Block 0027 [102]: ab9e8c1838f9140a +Block 0027 [103]: 73b7e554d7085f0c +Block 0027 [104]: aa5bbfdc2d18403a +Block 0027 [105]: e951d7c31bbfda11 +Block 0027 [106]: 929bd0980cc9638b +Block 0027 [107]: 52a2f3b285fac8be +Block 0027 [108]: 59fce169b2718b88 +Block 0027 [109]: 156cb6fa586ac342 +Block 0027 [110]: 16318cd4bd24716e +Block 0027 [111]: 7ca17d055bcd7b2c +Block 0027 [112]: 32053bfc51617177 +Block 0027 [113]: 28beddc1cdd676e7 +Block 0027 [114]: b2255a813a0861e3 +Block 0027 [115]: 4757a1408edd8347 +Block 0027 [116]: 5c92919ddd014b15 +Block 0027 [117]: 7ff74e029790456d +Block 0027 [118]: a4c0c1e2e59ce89b +Block 0027 [119]: 7f9713ca32bc0ba5 +Block 0027 [120]: a614204dcc6463a9 +Block 0027 [121]: 0cb7f1d92565704e +Block 0027 [122]: 5a26f2a6a5d8d1f3 +Block 0027 [123]: 09e8fbb79f46d15a +Block 0027 [124]: 60cba24dbc7a69ea +Block 0027 [125]: ddae6302e17afaf7 +Block 0027 [126]: 8fae3a02a0cd58ae +Block 0027 [127]: 739eabc30024614d +Block 0028 [ 0]: 0e85cca41243c749 +Block 0028 [ 1]: 40ba0b7c7b17a399 +Block 0028 [ 2]: 65ac8f2a7be3503c +Block 0028 [ 3]: b87f91c2b1c410b9 +Block 0028 [ 4]: 054c671cdf78fed8 +Block 0028 [ 5]: 5d3ec01ba37df53b +Block 0028 [ 6]: a41996c0d74d1d4f +Block 0028 [ 7]: bf981d07080966b7 +Block 0028 [ 8]: fb38da158b87f305 +Block 0028 [ 9]: 5c144628680ea65f +Block 0028 [ 10]: 8155b6fea71b9ca6 +Block 0028 [ 11]: a7e86b495469fd06 +Block 0028 [ 12]: eab1fc3d6ef06c16 +Block 0028 [ 13]: ed27acee6714900c +Block 0028 [ 14]: ab257e11a32f3e2b +Block 0028 [ 15]: 77edcc29b66e91dc +Block 0028 [ 16]: 7817bf469d8cf51e +Block 0028 [ 17]: 29d5b4a8f4d782e3 +Block 0028 [ 18]: 8a7ecb0fe133bd77 +Block 0028 [ 19]: dfcd56d9f51ee53d +Block 0028 [ 20]: 1bf3d77568b1cb75 +Block 0028 [ 21]: c751f52caa4356a6 +Block 0028 [ 22]: 39a6b3286a5c30e8 +Block 0028 [ 23]: c1e0704b2b8456b1 +Block 0028 [ 24]: cb6e541ae789f116 +Block 0028 [ 25]: 7374b85accd6ec1a +Block 0028 [ 26]: f88601a3d9333dec +Block 0028 [ 27]: 5aa74417a8bbd5e7 +Block 0028 [ 28]: b7b24ec3a0179349 +Block 0028 [ 29]: b899ea108a55cb30 +Block 0028 [ 30]: cf36370deb66ab32 +Block 0028 [ 31]: c62d26777d0cf3c0 +Block 0028 [ 32]: a859b878ba83a08b +Block 0028 [ 33]: a87be8e682613211 +Block 0028 [ 34]: d01855cabfba05be +Block 0028 [ 35]: a6263d2dc62ce85f +Block 0028 [ 36]: dc69da3a993bcc2c +Block 0028 [ 37]: 83b472fba8ccfc63 +Block 0028 [ 38]: e0d64b25c699d08f +Block 0028 [ 39]: 584d5affcacb1e9e +Block 0028 [ 40]: b98d206a1f3544ea +Block 0028 [ 41]: 26b5ec7a7c297725 +Block 0028 [ 42]: cd96ab285713d99f +Block 0028 [ 43]: df492f93837f09f2 +Block 0028 [ 44]: cb3c9ff1fe66ada8 +Block 0028 [ 45]: bb006aedfa2ea6ad +Block 0028 [ 46]: e3939acaf8abcd32 +Block 0028 [ 47]: 4b14c3952070da49 +Block 0028 [ 48]: 574efbbefdf497ea +Block 0028 [ 49]: af01ce5b7378b06f +Block 0028 [ 50]: 20a9929b5bdf186a +Block 0028 [ 51]: ea42fe634d665702 +Block 0028 [ 52]: 6b0bd4f2912b8b3e +Block 0028 [ 53]: 814db8e14f32ae57 +Block 0028 [ 54]: e69ae15f95df680e +Block 0028 [ 55]: 425a977565c863f7 +Block 0028 [ 56]: 973c97da3ba71ff9 +Block 0028 [ 57]: d7143cb537a9f71d +Block 0028 [ 58]: 73439409660c5c38 +Block 0028 [ 59]: c8430dc386fc9d15 +Block 0028 [ 60]: 0c67cd6e6fff1e63 +Block 0028 [ 61]: 62c0256fde5856ff +Block 0028 [ 62]: 3e25b0c0db1e3416 +Block 0028 [ 63]: b2187c58176ae515 +Block 0028 [ 64]: 8dd7227f711ffd7e +Block 0028 [ 65]: fcd1182ce333eb1e +Block 0028 [ 66]: 1afd2879ab103888 +Block 0028 [ 67]: ea6db3a5935c5592 +Block 0028 [ 68]: 86f39e2e75bef366 +Block 0028 [ 69]: b1d9454de3de9e74 +Block 0028 [ 70]: 37b20202c244827b +Block 0028 [ 71]: 1ebe94e672421dcb +Block 0028 [ 72]: 92129c6d6bfbeef1 +Block 0028 [ 73]: a6caab1ac6da487b +Block 0028 [ 74]: 19d015236d62b791 +Block 0028 [ 75]: 275f059bdb96f81c +Block 0028 [ 76]: aa6fb609adb40425 +Block 0028 [ 77]: 46770ee193d5f0ee +Block 0028 [ 78]: 3013c7b5504eefc0 +Block 0028 [ 79]: 37ebc9d99ab31363 +Block 0028 [ 80]: 37d64d1d0b77f7e7 +Block 0028 [ 81]: baf4d2355c9e3f91 +Block 0028 [ 82]: 713c207bd98f5bad +Block 0028 [ 83]: 4adf2c66093519a0 +Block 0028 [ 84]: 7d90ba3ac0b79e34 +Block 0028 [ 85]: 960e9309c6ef6ff6 +Block 0028 [ 86]: 399f055a58788bdb +Block 0028 [ 87]: 8ee4b1a6799cd390 +Block 0028 [ 88]: 3099856d626a230c +Block 0028 [ 89]: c1fe40bb28b691f7 +Block 0028 [ 90]: afe7e4123bc59379 +Block 0028 [ 91]: b08b56a71ef1bc17 +Block 0028 [ 92]: e910f52504e7136e +Block 0028 [ 93]: fa26cfc79fb74284 +Block 0028 [ 94]: 553ba6b7d0429bfd +Block 0028 [ 95]: 340061b6aa853ae3 +Block 0028 [ 96]: 191cdde0fd8de140 +Block 0028 [ 97]: 6ddb0e9ffdd173c8 +Block 0028 [ 98]: 67d0dfba86c27796 +Block 0028 [ 99]: 94ec1e01b3bd8632 +Block 0028 [100]: 31867525f8bc8238 +Block 0028 [101]: 65e995ab9307b566 +Block 0028 [102]: 377b3b891df93943 +Block 0028 [103]: a3b9fdce60c4261d +Block 0028 [104]: f08bc6604b98f79d +Block 0028 [105]: baec2e81d8b364a4 +Block 0028 [106]: 02f2edac0f508601 +Block 0028 [107]: f82d55936f52ebf4 +Block 0028 [108]: 2fa3ef0957aec0f5 +Block 0028 [109]: b1f637bbedb476d8 +Block 0028 [110]: bb5dc2a1eb0e9f7b +Block 0028 [111]: 9e67d8c0f07623f6 +Block 0028 [112]: 65f009064ff0e9c3 +Block 0028 [113]: 5d08017b855e7be7 +Block 0028 [114]: 5d8eed96a64db23d +Block 0028 [115]: 3512927f50b1b1e2 +Block 0028 [116]: dc15de89063b4012 +Block 0028 [117]: c4679f41c6c56a6e +Block 0028 [118]: 0a4e0b7e365782bb +Block 0028 [119]: 9b7444a953c6d6ba +Block 0028 [120]: 64d1f446d97216fe +Block 0028 [121]: aae982e26bbd3da9 +Block 0028 [122]: ef1cd05ad517ed77 +Block 0028 [123]: 97a7dac0ddaf58dc +Block 0028 [124]: b241dd4508b65f10 +Block 0028 [125]: ca9aa32702f4ad94 +Block 0028 [126]: 0b5df4481d1655ac +Block 0028 [127]: 1f127ce283eb9aa0 +Block 0029 [ 0]: b28d5deaef96e66a +Block 0029 [ 1]: 60faf86916b45b57 +Block 0029 [ 2]: 4e5fa33acc5404c5 +Block 0029 [ 3]: 9fd6a17e93d035d6 +Block 0029 [ 4]: 0893d077e4b8d174 +Block 0029 [ 5]: f03e7f804936297f +Block 0029 [ 6]: cc76ddd3b1f33443 +Block 0029 [ 7]: ca571fde36d623c2 +Block 0029 [ 8]: 6c90fdc13ceaaffa +Block 0029 [ 9]: d9e61e9c12a5f434 +Block 0029 [ 10]: c1ad29dcbb355739 +Block 0029 [ 11]: 89c3d212b96b585a +Block 0029 [ 12]: edc5d46da39f3664 +Block 0029 [ 13]: 76f1b5a61c0123f7 +Block 0029 [ 14]: fe328e8203051cc3 +Block 0029 [ 15]: 9bd4e4ee7952ad46 +Block 0029 [ 16]: a1d2164a687d7afe +Block 0029 [ 17]: 71d22e2206efe720 +Block 0029 [ 18]: dd570188cb4768ac +Block 0029 [ 19]: 73e76f871a564857 +Block 0029 [ 20]: 19984cb80773d41a +Block 0029 [ 21]: 1e5a525f66c2bfab +Block 0029 [ 22]: 9eb9d711dc54bdfe +Block 0029 [ 23]: 80202120abb1f2af +Block 0029 [ 24]: 762aad6301f0f687 +Block 0029 [ 25]: 924a11ab5bdd8d6d +Block 0029 [ 26]: 71a2bc27939e981b +Block 0029 [ 27]: bf6cd48e38e6fecb +Block 0029 [ 28]: c33e0fa6f3853d62 +Block 0029 [ 29]: 9cec1adb998c40e7 +Block 0029 [ 30]: 456c0560470631cc +Block 0029 [ 31]: cbc4831ba9510433 +Block 0029 [ 32]: df115dc56383ef17 +Block 0029 [ 33]: 3ae2401e3b9d1071 +Block 0029 [ 34]: 529a3c7e240815cc +Block 0029 [ 35]: 60e469e9b79ecfec +Block 0029 [ 36]: 48978c13a0db4353 +Block 0029 [ 37]: 2807c4ccad614aba +Block 0029 [ 38]: 36bc5a395ea99a2d +Block 0029 [ 39]: 2f5eeb78c5a901a3 +Block 0029 [ 40]: b10fc4c58c21db64 +Block 0029 [ 41]: 976836b2e1e3046f +Block 0029 [ 42]: 648d34fcc495dfff +Block 0029 [ 43]: cf4f898d00641f63 +Block 0029 [ 44]: 768f15f98e84fb17 +Block 0029 [ 45]: 6e5a7e27aa0874ee +Block 0029 [ 46]: fc9b1390cb33f4fc +Block 0029 [ 47]: 8c916f3ee985266a +Block 0029 [ 48]: ac4f0564ad44f4ec +Block 0029 [ 49]: 098adc10cdeef1d4 +Block 0029 [ 50]: ffb0f1701437ffbc +Block 0029 [ 51]: a4ce31038dfcd250 +Block 0029 [ 52]: 10a1f6563a54453a +Block 0029 [ 53]: f17f021dc41171e2 +Block 0029 [ 54]: 6877dec2a510de4d +Block 0029 [ 55]: f035c7817b56646a +Block 0029 [ 56]: 8d2dc75ed87d1f09 +Block 0029 [ 57]: def747cce81ffedb +Block 0029 [ 58]: a404e5187e7c88e9 +Block 0029 [ 59]: c8a8f0f2eee0ab45 +Block 0029 [ 60]: 5177d3db538e7006 +Block 0029 [ 61]: 2033765493f54c07 +Block 0029 [ 62]: d25e03408762825c +Block 0029 [ 63]: bf358da4de74d44f +Block 0029 [ 64]: 7169d9bac3f6b089 +Block 0029 [ 65]: 34aa5592008cb63e +Block 0029 [ 66]: 648460c51b3eb8e2 +Block 0029 [ 67]: 745f4d631c28ed67 +Block 0029 [ 68]: 15b07807de3167ec +Block 0029 [ 69]: b271a3455f6ad429 +Block 0029 [ 70]: 8a4c7a688f53849b +Block 0029 [ 71]: d47b0059ca698b91 +Block 0029 [ 72]: 5401fcaa6e1613f5 +Block 0029 [ 73]: eab2ed41c82503ed +Block 0029 [ 74]: b651b03e13eb8116 +Block 0029 [ 75]: 22441c0d3152627f +Block 0029 [ 76]: 086b49b7fd79cd37 +Block 0029 [ 77]: 6a2072fd35ec9ffd +Block 0029 [ 78]: d60ad9b09b6f53a2 +Block 0029 [ 79]: bed980f12e3e9942 +Block 0029 [ 80]: a8d2311811115bd4 +Block 0029 [ 81]: 047607dbd328a4ab +Block 0029 [ 82]: 57929ac9e5d669ac +Block 0029 [ 83]: 17521cb6eebc4cbd +Block 0029 [ 84]: ec29c8b11f03b546 +Block 0029 [ 85]: 8c3207b69a2e03fd +Block 0029 [ 86]: b6f8deb6a899dd69 +Block 0029 [ 87]: 50eb7a89a30eb2a9 +Block 0029 [ 88]: 2f2eda5c8d005e89 +Block 0029 [ 89]: b925767aa40ed8d0 +Block 0029 [ 90]: c0b7aae715772ac5 +Block 0029 [ 91]: dccbd919a7913b20 +Block 0029 [ 92]: 1d0904985d927067 +Block 0029 [ 93]: ea17fad0c1205cf5 +Block 0029 [ 94]: c79c19bab0477b58 +Block 0029 [ 95]: e2f4b87c67079492 +Block 0029 [ 96]: 648f8e57ca950544 +Block 0029 [ 97]: 09a16d4452a5aeff +Block 0029 [ 98]: 1020c0d715864a87 +Block 0029 [ 99]: ef4571edec273ee3 +Block 0029 [100]: bbfc9532f778a70e +Block 0029 [101]: 764cf7bb9dd250e6 +Block 0029 [102]: fd2ee8be4998c8bf +Block 0029 [103]: 400a72a9e344c2fa +Block 0029 [104]: 90acd7a2f8016e3c +Block 0029 [105]: a1fd46e9f88ef794 +Block 0029 [106]: fbc375521db9ff27 +Block 0029 [107]: 426e56c2b8dfa489 +Block 0029 [108]: e501faec2ebe5e48 +Block 0029 [109]: 88d8cb1d2b938fb1 +Block 0029 [110]: 22481c28a857b844 +Block 0029 [111]: 0f48a0190e3998f8 +Block 0029 [112]: b987462fcbd0d42d +Block 0029 [113]: 92b894ed5ae61019 +Block 0029 [114]: 96fef58b74fd323e +Block 0029 [115]: 96384b5f636f7fb4 +Block 0029 [116]: 1fe75196ac057245 +Block 0029 [117]: 667a495e0fcf1af3 +Block 0029 [118]: 3d0b9fc737dc4f2f +Block 0029 [119]: b1395938051b5c3b +Block 0029 [120]: 3e8dcddd601ec5ef +Block 0029 [121]: cbba85b46d84cbca +Block 0029 [122]: ea62a35c8d28304e +Block 0029 [123]: ebedde4456cf597f +Block 0029 [124]: a333b258a27b5373 +Block 0029 [125]: 6f4f7c2c51ebbf33 +Block 0029 [126]: d542eff31f159567 +Block 0029 [127]: 6869d4daa5acd753 +Block 0030 [ 0]: b0e5888ede5c8dac +Block 0030 [ 1]: 2947e0c66206b871 +Block 0030 [ 2]: 931942ce42ad27d6 +Block 0030 [ 3]: 3dd35c71fa980316 +Block 0030 [ 4]: b549254e041de1f8 +Block 0030 [ 5]: 288a295329a1bdae +Block 0030 [ 6]: af2667951e3fce86 +Block 0030 [ 7]: fc7543071c09d556 +Block 0030 [ 8]: 4957f01ef9fe1ffb +Block 0030 [ 9]: be316c502ec520ed +Block 0030 [ 10]: ece84265d2ef9b97 +Block 0030 [ 11]: 4eaa0d6c6bad20de +Block 0030 [ 12]: 7ca1f307b296c8e8 +Block 0030 [ 13]: c4e32d348044f957 +Block 0030 [ 14]: 50697fda97ed01e5 +Block 0030 [ 15]: cd2a914e1a30208a +Block 0030 [ 16]: 3227da448a87316e +Block 0030 [ 17]: 8896e1c09e53ac5e +Block 0030 [ 18]: 9a02a17295caac6e +Block 0030 [ 19]: fe260353800fb2c5 +Block 0030 [ 20]: 98fe9a5abbee7323 +Block 0030 [ 21]: d2e465ad6ff6522a +Block 0030 [ 22]: dc1ec4681a531d77 +Block 0030 [ 23]: a9be825083445307 +Block 0030 [ 24]: 20a55e7ef381eaad +Block 0030 [ 25]: 9329bb7819768457 +Block 0030 [ 26]: 0f244df63d40188f +Block 0030 [ 27]: b3dd7873d937c70c +Block 0030 [ 28]: af9f93785f756d37 +Block 0030 [ 29]: c797db32266d8ce2 +Block 0030 [ 30]: 35cf4b324e67541b +Block 0030 [ 31]: 01844a32e3bfd33d +Block 0030 [ 32]: fd342870363d3422 +Block 0030 [ 33]: 8c7dd1a49645c4a3 +Block 0030 [ 34]: 24a8f8142ad33503 +Block 0030 [ 35]: e2ae44a3ae5e7af6 +Block 0030 [ 36]: 8028ac5f745267a7 +Block 0030 [ 37]: b690a9a4bc11258d +Block 0030 [ 38]: 2ff9c51288b1e54f +Block 0030 [ 39]: c65ab253f9eddfb2 +Block 0030 [ 40]: ae808cc2f3522ea8 +Block 0030 [ 41]: b8523a531b8ee3de +Block 0030 [ 42]: eb10ca13497f0a14 +Block 0030 [ 43]: 0234eb8439b05aa1 +Block 0030 [ 44]: 99ae2d652ab5f6f7 +Block 0030 [ 45]: ee86a5751b6be154 +Block 0030 [ 46]: b317c57e22d2fd04 +Block 0030 [ 47]: 8e525bd89823545e +Block 0030 [ 48]: 6db14c7cce51c804 +Block 0030 [ 49]: e59635843f833bbc +Block 0030 [ 50]: 408d78e00bd38918 +Block 0030 [ 51]: 332152358dcd8d8b +Block 0030 [ 52]: 2e4f4081eef49dbb +Block 0030 [ 53]: fc17367edefa01f4 +Block 0030 [ 54]: 8e88915176024a3e +Block 0030 [ 55]: 6ae1773750423a1a +Block 0030 [ 56]: 049e6661027076f1 +Block 0030 [ 57]: da464aa051508136 +Block 0030 [ 58]: 668a19912111ba4b +Block 0030 [ 59]: 4fc0f8758e6b072b +Block 0030 [ 60]: 9249479ec4f9a25b +Block 0030 [ 61]: e1b761f5f33f625a +Block 0030 [ 62]: 66a54f4afac4195f +Block 0030 [ 63]: 36f04e02d4f3c336 +Block 0030 [ 64]: 1a322be91f026c16 +Block 0030 [ 65]: ecb88344974e5267 +Block 0030 [ 66]: 287435939e643bfd +Block 0030 [ 67]: e58ee2cc81e2327b +Block 0030 [ 68]: 4775f9b50e042d9c +Block 0030 [ 69]: b3599c38d982a55f +Block 0030 [ 70]: 8d0a150207232f9c +Block 0030 [ 71]: 586c4528d0d00293 +Block 0030 [ 72]: 3d913208cc402a16 +Block 0030 [ 73]: 9aae0a4db183400b +Block 0030 [ 74]: 3fce4b4358d6f960 +Block 0030 [ 75]: e2c34cae7121c6fa +Block 0030 [ 76]: fb6066a5eec05661 +Block 0030 [ 77]: 19e3f805f7f395b3 +Block 0030 [ 78]: ea57f581bb90bd1e +Block 0030 [ 79]: 4403ddb3d5d88d54 +Block 0030 [ 80]: 9ec5620c2650cada +Block 0030 [ 81]: e187151963499d27 +Block 0030 [ 82]: e1e490016d3e7a90 +Block 0030 [ 83]: 47dba15fb3114a6a +Block 0030 [ 84]: 00e6713e3524748c +Block 0030 [ 85]: 83830560126cdc8d +Block 0030 [ 86]: 8b9795d20eba6712 +Block 0030 [ 87]: 1f8f0e4cabdf4a19 +Block 0030 [ 88]: d5dbaee140cef589 +Block 0030 [ 89]: 592578e759114087 +Block 0030 [ 90]: eccc40aba3284be3 +Block 0030 [ 91]: 4b02c4c91e5ed750 +Block 0030 [ 92]: d6620771f12fdb1d +Block 0030 [ 93]: f1bd112af7f6a8e8 +Block 0030 [ 94]: f47bfff0211edb2f +Block 0030 [ 95]: e131d353a0967967 +Block 0030 [ 96]: 65aed7d87586ba45 +Block 0030 [ 97]: f15197b40f0b7b6d +Block 0030 [ 98]: 54e06f25fe4ee906 +Block 0030 [ 99]: 34b01354129382ec +Block 0030 [100]: c7f6988356e5d16e +Block 0030 [101]: cd5f18759d23da4c +Block 0030 [102]: a53a9b98e51aa5d7 +Block 0030 [103]: 9dcaaa20febf21d0 +Block 0030 [104]: 15d188f2c06e0fdd +Block 0030 [105]: 3df0c897dd56961f +Block 0030 [106]: 214e5774a75128c2 +Block 0030 [107]: 1f3d964be08e22c9 +Block 0030 [108]: 7e2da6a44beeba29 +Block 0030 [109]: 794b8f5662cd37fc +Block 0030 [110]: 87e1930746ed7aba +Block 0030 [111]: 63b38bc439afc3f8 +Block 0030 [112]: a4974dbb47bd4ddf +Block 0030 [113]: d8c3107a98637538 +Block 0030 [114]: e7bf1c42db1a76d9 +Block 0030 [115]: c40c2a46939cbfec +Block 0030 [116]: 2f9a1d4bda4a7f87 +Block 0030 [117]: a1f04a1cf57bee91 +Block 0030 [118]: 2c80d3b0b53a4ff8 +Block 0030 [119]: 6780c97b92b320fc +Block 0030 [120]: 6ffad7bf7a3cef66 +Block 0030 [121]: c3ea5d7dcda539e2 +Block 0030 [122]: a0ce5960ccb716e3 +Block 0030 [123]: 14e7d5d9cc4b77bc +Block 0030 [124]: 873764de6fc77a4f +Block 0030 [125]: d2e5faef31dafe08 +Block 0030 [126]: d2480de38d2bf7cb +Block 0030 [127]: 0508ce05f2d3c998 +Block 0031 [ 0]: 0be96ca10d034a45 +Block 0031 [ 1]: 9575d2e4602f4318 +Block 0031 [ 2]: 89214d75d56ed403 +Block 0031 [ 3]: 2cc7abbfb9839016 +Block 0031 [ 4]: 8f7133d96eb95c09 +Block 0031 [ 5]: 5fec17150c93946a +Block 0031 [ 6]: 04d71991c57dbe81 +Block 0031 [ 7]: 2b5ff0848d9af7c4 +Block 0031 [ 8]: a582464dd6a0ea81 +Block 0031 [ 9]: 4dd7a4072a85a7aa +Block 0031 [ 10]: 5ac584683d0796f8 +Block 0031 [ 11]: 441bbbff03f42a0f +Block 0031 [ 12]: bbdce2a42ef826de +Block 0031 [ 13]: d042fda562e0bb63 +Block 0031 [ 14]: 361d43ee2c58c5c4 +Block 0031 [ 15]: 7de686cf2d145af9 +Block 0031 [ 16]: 6ce7323d894eb8cc +Block 0031 [ 17]: 1547f88fc60a49ae +Block 0031 [ 18]: f9a6d4fd04247a06 +Block 0031 [ 19]: ab25c7afa49b95f8 +Block 0031 [ 20]: 3e7b0916c93b6e61 +Block 0031 [ 21]: 18da624648ab23b9 +Block 0031 [ 22]: 59e1d686864cf4ee +Block 0031 [ 23]: a02fac31694739c1 +Block 0031 [ 24]: 785530b6ae946af4 +Block 0031 [ 25]: 6b894bacaa6489ac +Block 0031 [ 26]: 22d346de32ad482d +Block 0031 [ 27]: 730aeb618656de77 +Block 0031 [ 28]: e9286e648c915180 +Block 0031 [ 29]: 48e61c353897c210 +Block 0031 [ 30]: c699de54ca1fb7f8 +Block 0031 [ 31]: 26e5dd847fcbc9e5 +Block 0031 [ 32]: 3ec9afd124b60527 +Block 0031 [ 33]: 7a6e5ae14fd233ed +Block 0031 [ 34]: d498d8fbd24c99a2 +Block 0031 [ 35]: 68f63c8302d0b2be +Block 0031 [ 36]: 92aa88c5af73ddcf +Block 0031 [ 37]: 33bad457727e53c1 +Block 0031 [ 38]: bba23119ee8d666f +Block 0031 [ 39]: d86b119eec24e821 +Block 0031 [ 40]: 1465044ba63b7eb1 +Block 0031 [ 41]: 89f0d0319c93d477 +Block 0031 [ 42]: bdaf399c54254189 +Block 0031 [ 43]: 4d8bdefbcc8e8c41 +Block 0031 [ 44]: 7bf584eac7a5b05d +Block 0031 [ 45]: f485dc24ad6145cf +Block 0031 [ 46]: 5b3dd93acc2f39f4 +Block 0031 [ 47]: b409d73cfacb198c +Block 0031 [ 48]: c7cc71f41e692bf6 +Block 0031 [ 49]: cc7fe606a9c98628 +Block 0031 [ 50]: 65a1bdefcc16e8b3 +Block 0031 [ 51]: bcf903babebec896 +Block 0031 [ 52]: 14195ac57e7acef3 +Block 0031 [ 53]: a17ad05681735026 +Block 0031 [ 54]: 83983688b4510a11 +Block 0031 [ 55]: 391b7ecf135fccf9 +Block 0031 [ 56]: 16c862996731d2e9 +Block 0031 [ 57]: 11755979836c247a +Block 0031 [ 58]: ec206587fd6e429b +Block 0031 [ 59]: c6929ef1d28fa1bb +Block 0031 [ 60]: 1a5a684997bed207 +Block 0031 [ 61]: 5af629a8bab5430f +Block 0031 [ 62]: 4f970b23c03c2a16 +Block 0031 [ 63]: db8874377f4d472f +Block 0031 [ 64]: 0a2a27ae4a441659 +Block 0031 [ 65]: d9ae804b74a44141 +Block 0031 [ 66]: b59b24aa9b2a0c71 +Block 0031 [ 67]: b108f0eee97f2e57 +Block 0031 [ 68]: 08a4ed01afb97547 +Block 0031 [ 69]: 6290765dcecd698c +Block 0031 [ 70]: f979a05daa8d8585 +Block 0031 [ 71]: 33aba4bbc37fdc4b +Block 0031 [ 72]: 0539e40be7d9b206 +Block 0031 [ 73]: 8a59244b8a0debb7 +Block 0031 [ 74]: cb223a21caf3211e +Block 0031 [ 75]: e93e6821e67d18a9 +Block 0031 [ 76]: 10b2e28b612beea9 +Block 0031 [ 77]: bac404af0b69285a +Block 0031 [ 78]: b447cd291a0a7376 +Block 0031 [ 79]: 47a74d8f58347ab5 +Block 0031 [ 80]: 4a48960ce6a6f756 +Block 0031 [ 81]: 606f7c3dfd074823 +Block 0031 [ 82]: 2076b15081d66c1e +Block 0031 [ 83]: 9c4cad0f6c5fbc82 +Block 0031 [ 84]: d0822b2857eca2df +Block 0031 [ 85]: de651eeb74c86bc8 +Block 0031 [ 86]: 2adc4589b575fb47 +Block 0031 [ 87]: 0defd70a578c0f1b +Block 0031 [ 88]: 165f5c7899be2a2a +Block 0031 [ 89]: 6c235e2602669359 +Block 0031 [ 90]: 1a7b3c2830c1c249 +Block 0031 [ 91]: 2ae61f42fba7c357 +Block 0031 [ 92]: a3e3134ac362997a +Block 0031 [ 93]: 612de1e90e7d2665 +Block 0031 [ 94]: 6a98f405d60a5897 +Block 0031 [ 95]: da640cf46db9f3ad +Block 0031 [ 96]: 192189ab2fce097c +Block 0031 [ 97]: 980c4190f2bdff0e +Block 0031 [ 98]: 2af5f4959ffe8833 +Block 0031 [ 99]: b21d820700a31cc1 +Block 0031 [100]: 6b7cef3303925760 +Block 0031 [101]: b7f918936d0a977c +Block 0031 [102]: 7516ea298918042d +Block 0031 [103]: 3093f3755c9ad8ac +Block 0031 [104]: d55b8196194f1851 +Block 0031 [105]: 5b13af0fcc6dd9fb +Block 0031 [106]: 48ab25b261495bd0 +Block 0031 [107]: f706bc4b314d3605 +Block 0031 [108]: 9dc7d9998834723f +Block 0031 [109]: b374304d5060f92e +Block 0031 [110]: b8cbfaa4f3d7f622 +Block 0031 [111]: a39e300ed046f5d3 +Block 0031 [112]: b5ba736e0e3ad706 +Block 0031 [113]: 4fc2a74746529f60 +Block 0031 [114]: 75f4c5700bb63dfc +Block 0031 [115]: 8879fe7c00cb6666 +Block 0031 [116]: 58164fb0826c7345 +Block 0031 [117]: 7f9ca9b024878a8e +Block 0031 [118]: 3ee1db46ada2e47d +Block 0031 [119]: 0c76e6496a69ad8b +Block 0031 [120]: 890e19b75bed5274 +Block 0031 [121]: d1105605f9410829 +Block 0031 [122]: a30e7a92069a2a6b +Block 0031 [123]: 175bc756d16f1316 +Block 0031 [124]: e4274fd675d1e1d6 +Block 0031 [125]: 903fffb7c4a14c98 +Block 0031 [126]: 7e5db55def471966 +Block 0031 [127]: 421b3c6e9555b79d + + After pass 2: +Block 0000 [ 0]: af2a8bd8482c2f11 +Block 0000 [ 1]: 785442294fa55e6d +Block 0000 [ 2]: 9256a768529a7f96 +Block 0000 [ 3]: 25a1c1f5bb953766 +Block 0000 [ 4]: 72a9cd9a10886cd8 +Block 0000 [ 5]: 3ecaa9543eb7af4f +Block 0000 [ 6]: 15ee21ef99126afa +Block 0000 [ 7]: d096e22d0fdccbed +Block 0000 [ 8]: 98695dc49460ec60 +Block 0000 [ 9]: ab044a53cf328972 +Block 0000 [ 10]: a8f4132856b85100 +Block 0000 [ 11]: e4e16ec3f4b0a8e4 +Block 0000 [ 12]: 8ffc55592cd030ce +Block 0000 [ 13]: 4ce7804c886fdefa +Block 0000 [ 14]: b023146da6402293 +Block 0000 [ 15]: 856585f1c5c743f1 +Block 0000 [ 16]: 718fa6455c5781f9 +Block 0000 [ 17]: db0177f7e7dcdc24 +Block 0000 [ 18]: 59646c865b04120d +Block 0000 [ 19]: 42fafc9a487ab374 +Block 0000 [ 20]: 7734cee2193a300a +Block 0000 [ 21]: ed753f1dc5975edd +Block 0000 [ 22]: 0f2ef8f86bc502e2 +Block 0000 [ 23]: 523d9a809c797111 +Block 0000 [ 24]: f8dccc9247fb54b3 +Block 0000 [ 25]: 5e75f97947c4f9ae +Block 0000 [ 26]: 8770611909c9eb72 +Block 0000 [ 27]: 01c898af62ec5a22 +Block 0000 [ 28]: a1acad245dec85df +Block 0000 [ 29]: d5d6e3f14ff07f69 +Block 0000 [ 30]: c98f44f03cc8540d +Block 0000 [ 31]: e9eff12cfc7ac7b3 +Block 0000 [ 32]: 696308a7c4841e57 +Block 0000 [ 33]: fa6699460fe0dad0 +Block 0000 [ 34]: b00c52019aaba84e +Block 0000 [ 35]: e8c46902a1a082c0 +Block 0000 [ 36]: c463b9a06f7bfe1c +Block 0000 [ 37]: 5f1588d9124740cc +Block 0000 [ 38]: 8a3845857d8e6450 +Block 0000 [ 39]: 098b1d2b3083364e +Block 0000 [ 40]: 2bdacbc5d75a3796 +Block 0000 [ 41]: 5fe02a54a1d09388 +Block 0000 [ 42]: 9dd25924ab01fd49 +Block 0000 [ 43]: 28fc235c36a67e69 +Block 0000 [ 44]: b9cdcc6aed6b42aa +Block 0000 [ 45]: 2292bf66aeecd9b4 +Block 0000 [ 46]: b65c616f92615e70 +Block 0000 [ 47]: 665d2a8cc95fda20 +Block 0000 [ 48]: 5d6015cd24d5b58e +Block 0000 [ 49]: 566e2511fc13e860 +Block 0000 [ 50]: 0e6d4172d299fda2 +Block 0000 [ 51]: 51711bb30a213fee +Block 0000 [ 52]: baa627b1b95efb66 +Block 0000 [ 53]: 553ef8b4d081f251 +Block 0000 [ 54]: dc296e21d3908bd2 +Block 0000 [ 55]: 0b5577934372e18b +Block 0000 [ 56]: 325a7c02c34a0063 +Block 0000 [ 57]: 511cd738a2bb29ec +Block 0000 [ 58]: 78bd842866f6081b +Block 0000 [ 59]: a4917fb40f795866 +Block 0000 [ 60]: f63451ab7fe45926 +Block 0000 [ 61]: e72da44da8fa2526 +Block 0000 [ 62]: cf7a0a79171c3dc5 +Block 0000 [ 63]: 5dffa87b6a19c377 +Block 0000 [ 64]: 87709249d1a67953 +Block 0000 [ 65]: 8c6e8aff0b893742 +Block 0000 [ 66]: 6d1644b786853055 +Block 0000 [ 67]: 45344b95703440e7 +Block 0000 [ 68]: 69d529484a27369c +Block 0000 [ 69]: 77cd187ff379d71e +Block 0000 [ 70]: 4695c1676a6297cb +Block 0000 [ 71]: 129c2e4d8f0d130f +Block 0000 [ 72]: 80df37b16e8e0120 +Block 0000 [ 73]: 36816cf794842bf6 +Block 0000 [ 74]: cd51ebe0bea75d4f +Block 0000 [ 75]: 6e2640064f0024a8 +Block 0000 [ 76]: 5fa751c45d4571e6 +Block 0000 [ 77]: be08b615e84e99e2 +Block 0000 [ 78]: aff895f6bd7ad5a2 +Block 0000 [ 79]: a94668aec045af6f +Block 0000 [ 80]: 7df54929439123b6 +Block 0000 [ 81]: 2177e81dc530a178 +Block 0000 [ 82]: 23702198b8815fd7 +Block 0000 [ 83]: c6cfdfc6c58b7c23 +Block 0000 [ 84]: f6665bdaec247318 +Block 0000 [ 85]: 25e38016bd0c2b13 +Block 0000 [ 86]: bda625c7027b06ab +Block 0000 [ 87]: 105491576c6bf104 +Block 0000 [ 88]: cdbf6de9ff65be01 +Block 0000 [ 89]: 87dca172936422a9 +Block 0000 [ 90]: 277f6a1f433f47f0 +Block 0000 [ 91]: 464d3691eb0eeb9f +Block 0000 [ 92]: ab180830e1806e1d +Block 0000 [ 93]: 488749a577657e8c +Block 0000 [ 94]: 1ffec0ce2790e240 +Block 0000 [ 95]: a0efe4db12ef9a4b +Block 0000 [ 96]: 1ce776a738fe62c5 +Block 0000 [ 97]: d693a4f99ad2ddc0 +Block 0000 [ 98]: a2b8ce9c5a1181f8 +Block 0000 [ 99]: 6e037c488d9505e0 +Block 0000 [100]: c7b6863367ad8547 +Block 0000 [101]: a41c214223ae4f53 +Block 0000 [102]: 0caca33bd0555161 +Block 0000 [103]: e8ab772466030bda +Block 0000 [104]: 55a5256adf841b5c +Block 0000 [105]: c26501daed133a58 +Block 0000 [106]: c6ee94951fd20f1a +Block 0000 [107]: f9f7da71e229eb3b +Block 0000 [108]: 1294145272aa8dd7 +Block 0000 [109]: 83806fd19da7fa36 +Block 0000 [110]: 043dff3929d76862 +Block 0000 [111]: b207d7f3d742fc0f +Block 0000 [112]: e5cd7f664d8b9d85 +Block 0000 [113]: d354f54da4494d6e +Block 0000 [114]: 9b5f7db77aaf43b1 +Block 0000 [115]: 8760c0fda9bd5ef2 +Block 0000 [116]: 82e8cefc4f50beb9 +Block 0000 [117]: e0792492c41de5d2 +Block 0000 [118]: 961d746857b85e19 +Block 0000 [119]: fd8924440157f644 +Block 0000 [120]: 309fa2d2f185eca2 +Block 0000 [121]: df4477ca4024ca5a +Block 0000 [122]: 69c6c1b33ae10cf4 +Block 0000 [123]: 58df5414cc861dde +Block 0000 [124]: 77b32f2a19a5f0cf +Block 0000 [125]: 28c446e2110842b6 +Block 0000 [126]: 196a06e7803f07af +Block 0000 [127]: 703b8726fa442184 +Block 0001 [ 0]: b39e52eb91c1bdc1 +Block 0001 [ 1]: d92c2860542c5eab +Block 0001 [ 2]: cf88b66662afd9a4 +Block 0001 [ 3]: ab205105abf50363 +Block 0001 [ 4]: 0cad5ffe232c1e55 +Block 0001 [ 5]: 482eab98f97f69aa +Block 0001 [ 6]: df181ad58c929eaa +Block 0001 [ 7]: 1ca9a83149e9ab89 +Block 0001 [ 8]: ba562d31e81f884b +Block 0001 [ 9]: f95357df37ae767e +Block 0001 [ 10]: 45b2892b275dda33 +Block 0001 [ 11]: 241585e03db70e6d +Block 0001 [ 12]: 5c3324c4c067ddd8 +Block 0001 [ 13]: dc259c66486556a0 +Block 0001 [ 14]: b7497cd48e74a4f1 +Block 0001 [ 15]: 64ea476ce1178638 +Block 0001 [ 16]: 9e7045e96a30f5b8 +Block 0001 [ 17]: 5a69a92c5a464b3e +Block 0001 [ 18]: c7a059805b6d1880 +Block 0001 [ 19]: 440f25c7f2b63692 +Block 0001 [ 20]: 526c9603d5bb0f81 +Block 0001 [ 21]: c777fa917cb46eb8 +Block 0001 [ 22]: 59e0889599745628 +Block 0001 [ 23]: bd82e71af2c4f941 +Block 0001 [ 24]: ef9eabbe63ed885b +Block 0001 [ 25]: e5e7357881f13ba0 +Block 0001 [ 26]: aae864789abb9006 +Block 0001 [ 27]: 62343cf1b559b572 +Block 0001 [ 28]: 94c06926a5f752fa +Block 0001 [ 29]: 0f574fb3d218ff4f +Block 0001 [ 30]: 32c072026d0ee272 +Block 0001 [ 31]: 0a569df20a2ed675 +Block 0001 [ 32]: 2cfbee56a5b095fb +Block 0001 [ 33]: 32152424daad99a0 +Block 0001 [ 34]: 7a0a45c7a647c2e3 +Block 0001 [ 35]: a919db876ec5ee05 +Block 0001 [ 36]: 751af0fcf6b4506c +Block 0001 [ 37]: a213cfa621dd3379 +Block 0001 [ 38]: f4976f69ca9fd2a0 +Block 0001 [ 39]: fb9e8a81c1ae1561 +Block 0001 [ 40]: eb99e9a23c2bd68d +Block 0001 [ 41]: 109614411df38ee3 +Block 0001 [ 42]: d830230cb9ef4eeb +Block 0001 [ 43]: 7b6534f6b9125e6f +Block 0001 [ 44]: 4b8d06409fe2dcc0 +Block 0001 [ 45]: 1539d75c386cb30f +Block 0001 [ 46]: 34f2a2d5e70c5291 +Block 0001 [ 47]: 5e2d0c48230ca61c +Block 0001 [ 48]: 3dc0983d88937207 +Block 0001 [ 49]: 2ea263335271880a +Block 0001 [ 50]: 2e12ff10bfc8720c +Block 0001 [ 51]: 159a0a7b98efb22e +Block 0001 [ 52]: 98ee6f8150bd1bf7 +Block 0001 [ 53]: 4ab37247230bf307 +Block 0001 [ 54]: 1e8e9811d03bb579 +Block 0001 [ 55]: 069a57f413b64703 +Block 0001 [ 56]: f293bc9dc1bac9f2 +Block 0001 [ 57]: 068b62897b97b078 +Block 0001 [ 58]: fa6870e9439ae4b9 +Block 0001 [ 59]: e1e9a4d4bf2934bd +Block 0001 [ 60]: bd272bf53d295610 +Block 0001 [ 61]: 645938ab64a6d8c5 +Block 0001 [ 62]: af436972fd38544f +Block 0001 [ 63]: 43daf23ba5ead97d +Block 0001 [ 64]: a809fa9d2be31c90 +Block 0001 [ 65]: 5c52fa2e2da1ab6e +Block 0001 [ 66]: 39bd7bbcd09f6dfe +Block 0001 [ 67]: 5badc190cccecf31 +Block 0001 [ 68]: f72407904b16eb9a +Block 0001 [ 69]: 402228c2604e2359 +Block 0001 [ 70]: f1d353798d59dc0e +Block 0001 [ 71]: 91bc64df9fff4545 +Block 0001 [ 72]: 33c824a2621fd4df +Block 0001 [ 73]: 3b8e88ca432c6d5a +Block 0001 [ 74]: 9a0cb3f1b6ab96c2 +Block 0001 [ 75]: 067359cdebe0d519 +Block 0001 [ 76]: b4aacccf376ceb8d +Block 0001 [ 77]: 2aa6e909369143aa +Block 0001 [ 78]: df538d112febd4c0 +Block 0001 [ 79]: e1befd0fb9173850 +Block 0001 [ 80]: d402f5534c7eb96b +Block 0001 [ 81]: fe5a069f1e0ae34d +Block 0001 [ 82]: 6961cbeafba1ff67 +Block 0001 [ 83]: 54cf6d2bb3b82b3e +Block 0001 [ 84]: d7df2164ffb14392 +Block 0001 [ 85]: 142c0d8c20c56e01 +Block 0001 [ 86]: 5d9760b1fe61e8ef +Block 0001 [ 87]: c231026b091606cb +Block 0001 [ 88]: f7ace6fd77b17264 +Block 0001 [ 89]: dbed7e84e0a1b29c +Block 0001 [ 90]: 6dff9c730a69a47e +Block 0001 [ 91]: 9b5fae14c1947799 +Block 0001 [ 92]: 4f92371285c77bf3 +Block 0001 [ 93]: 773b5d4c10922cf8 +Block 0001 [ 94]: 189f25e093ec733b +Block 0001 [ 95]: a46f6b50f17faa5f +Block 0001 [ 96]: d2d8cb0cd59536c3 +Block 0001 [ 97]: d4f22425b74219ad +Block 0001 [ 98]: 44ece7df86187831 +Block 0001 [ 99]: 9b3b0f6d79aa3073 +Block 0001 [100]: eb5cd8e3706408dc +Block 0001 [101]: 4d095338d1559076 +Block 0001 [102]: 6b983b34a3cd1d03 +Block 0001 [103]: 0b9fb83578dde9e0 +Block 0001 [104]: 241b795deea655a8 +Block 0001 [105]: 6e74249559871092 +Block 0001 [106]: 3233dd2ab0ff3d60 +Block 0001 [107]: e53a50d0a98d0822 +Block 0001 [108]: 7d2dcd3a0e8588f0 +Block 0001 [109]: 96b8a86fcd45c056 +Block 0001 [110]: e8049d66f30a33c7 +Block 0001 [111]: bfa5249f4e5a109b +Block 0001 [112]: 088bb1e4dcd92a86 +Block 0001 [113]: ec15ec59f08a90f5 +Block 0001 [114]: 7b46daf17afb9e94 +Block 0001 [115]: 630b22e55f889c44 +Block 0001 [116]: 783691d88df12293 +Block 0001 [117]: c09e1eef375a4cb1 +Block 0001 [118]: 5292cd778f7d358b +Block 0001 [119]: 2c3b0f3b876e25fb +Block 0001 [120]: bfb2636b9592f067 +Block 0001 [121]: 07f44ff9972385bf +Block 0001 [122]: ffbccd62f3ced551 +Block 0001 [123]: 1f0f08705400cb47 +Block 0001 [124]: ef68b6e60b36887c +Block 0001 [125]: e698259b92b2c83e +Block 0001 [126]: dff046d9c5520ca6 +Block 0001 [127]: 7991bf5453c3b638 +Block 0002 [ 0]: dd23e459ec7a7b44 +Block 0002 [ 1]: 28741e6fe272b23c +Block 0002 [ 2]: 3bc8ee6d9f0b29a2 +Block 0002 [ 3]: ae39b5cbb3437522 +Block 0002 [ 4]: 758846264ea5f488 +Block 0002 [ 5]: ec3446e7f72f599d +Block 0002 [ 6]: 0bc86bd3b02a4152 +Block 0002 [ 7]: 95b7b5188fa5ea77 +Block 0002 [ 8]: 8d54f41ac3e6b462 +Block 0002 [ 9]: c788eabc6fc4b0ff +Block 0002 [ 10]: de3c64851157af6b +Block 0002 [ 11]: 4f287f4af73c67e9 +Block 0002 [ 12]: b6a19fc4e95e8290 +Block 0002 [ 13]: 85dc2853f27e9133 +Block 0002 [ 14]: 5663079347682383 +Block 0002 [ 15]: 02ef93c528c8b425 +Block 0002 [ 16]: f4244ee9c891c2b9 +Block 0002 [ 17]: a5728848d80240af +Block 0002 [ 18]: b9144b5d186a8590 +Block 0002 [ 19]: aaffa101deb880ad +Block 0002 [ 20]: 8b64003a05a79b57 +Block 0002 [ 21]: 8058e18f9de6f322 +Block 0002 [ 22]: 55b089d2703cddb5 +Block 0002 [ 23]: 86028d18880f2ad2 +Block 0002 [ 24]: 31355b1568d7adcf +Block 0002 [ 25]: 859079281ec15b46 +Block 0002 [ 26]: 8eb2be5993c11d50 +Block 0002 [ 27]: 7bec18fb9a0e784a +Block 0002 [ 28]: b792de1f75db4c8e +Block 0002 [ 29]: a876e86413fa1fa9 +Block 0002 [ 30]: 4cd6f37fd4eccee5 +Block 0002 [ 31]: a9dbc182dfeae36c +Block 0002 [ 32]: c4ef190a1e9d616b +Block 0002 [ 33]: 7c9e0bd0a2c26296 +Block 0002 [ 34]: 16b6ba5e8894b634 +Block 0002 [ 35]: 65a451695eae46d1 +Block 0002 [ 36]: c379abceeaabb352 +Block 0002 [ 37]: 5e0be866fca09057 +Block 0002 [ 38]: f16d10590dfa812e +Block 0002 [ 39]: 9364c03e8bf533c6 +Block 0002 [ 40]: 70ea4fe297664dae +Block 0002 [ 41]: 75d8c06c28f33748 +Block 0002 [ 42]: 5cbbec46e77b4d15 +Block 0002 [ 43]: 179bee833c0e2b11 +Block 0002 [ 44]: 189911c825c302eb +Block 0002 [ 45]: 60e2164c39da5a7f +Block 0002 [ 46]: b27a85a209358502 +Block 0002 [ 47]: 1e1a71fac6640545 +Block 0002 [ 48]: 5f86db5fddde6641 +Block 0002 [ 49]: a183e0e4ad45bb17 +Block 0002 [ 50]: 5326fc28f8c52311 +Block 0002 [ 51]: ca76d903b860c5aa +Block 0002 [ 52]: 3f15e4902a35d379 +Block 0002 [ 53]: 0b8eb6ba289ec0f9 +Block 0002 [ 54]: 9507ca02e069a05a +Block 0002 [ 55]: 61e21d6c08e494b9 +Block 0002 [ 56]: 505b52f1a764340f +Block 0002 [ 57]: 9d7b12f00bb712b6 +Block 0002 [ 58]: 08e4cc9a9d6af979 +Block 0002 [ 59]: 885db0825a30acc6 +Block 0002 [ 60]: 4ac721007866bb40 +Block 0002 [ 61]: 35ebcebaa1754249 +Block 0002 [ 62]: 8ec3842db1d07b56 +Block 0002 [ 63]: 8c2bba8b54d248a4 +Block 0002 [ 64]: 73e4883914fd19f1 +Block 0002 [ 65]: a53eddc4cb8cab79 +Block 0002 [ 66]: 77ceae67ac3b62f6 +Block 0002 [ 67]: 60bbb32043d74028 +Block 0002 [ 68]: e2a4e36e43f74ff7 +Block 0002 [ 69]: 71909946ab7773d1 +Block 0002 [ 70]: 7b5acff55fbb7dfb +Block 0002 [ 71]: c794dfa7065f2c47 +Block 0002 [ 72]: 66af2decb5329261 +Block 0002 [ 73]: c384d12af9f93a8d +Block 0002 [ 74]: ff80a743def4f0d0 +Block 0002 [ 75]: 10cbb8eac2d1ad4c +Block 0002 [ 76]: 546181544e57eca5 +Block 0002 [ 77]: 32110a65918a7e2d +Block 0002 [ 78]: ec276d8f8c71a33c +Block 0002 [ 79]: f11461667246342f +Block 0002 [ 80]: da2610422692be8e +Block 0002 [ 81]: b932777284ab93ed +Block 0002 [ 82]: 39e843b0a462f822 +Block 0002 [ 83]: 56be82271e70a6f1 +Block 0002 [ 84]: 394e12432c8d1f14 +Block 0002 [ 85]: b50f3562e448dd1a +Block 0002 [ 86]: d7c13dcd7fb4369d +Block 0002 [ 87]: 5c137edb4d11128f +Block 0002 [ 88]: 496401fc2b3a0dca +Block 0002 [ 89]: 20dcd790fd23aec6 +Block 0002 [ 90]: 38a0cceecad50c53 +Block 0002 [ 91]: 2a36cb7180d23f3b +Block 0002 [ 92]: 06a936f29ee07f91 +Block 0002 [ 93]: 679b87be6661c48a +Block 0002 [ 94]: 3104acb9c9416273 +Block 0002 [ 95]: 62cdeaadccd66f6e +Block 0002 [ 96]: 675596e72b20db7e +Block 0002 [ 97]: df51b05fa30443d7 +Block 0002 [ 98]: e550f147d18fa4f8 +Block 0002 [ 99]: b7c92884f699b00e +Block 0002 [100]: 3971bfe495111ddc +Block 0002 [101]: be6c841f9298b987 +Block 0002 [102]: 36264fdf4d66cc1e +Block 0002 [103]: 3966c703cdd2876b +Block 0002 [104]: 31072cbb07905072 +Block 0002 [105]: bb5cb679fd65f45c +Block 0002 [106]: 428bfa358e73473b +Block 0002 [107]: 9a2642a566a546ae +Block 0002 [108]: 0d3de325716c09f2 +Block 0002 [109]: 7b2b9773aff01a0e +Block 0002 [110]: 4cbd6f15e2746305 +Block 0002 [111]: 3d36f63c2c825d13 +Block 0002 [112]: a554238bf607ba3c +Block 0002 [113]: 7a86a81e929f9d6c +Block 0002 [114]: 8cf93c67a08a5915 +Block 0002 [115]: f48891bd8223a8b3 +Block 0002 [116]: aaee89560ce32e57 +Block 0002 [117]: a65fdc297527cff5 +Block 0002 [118]: 5d4054b589611c4b +Block 0002 [119]: efc6f60b84cca568 +Block 0002 [120]: 2db2e8633528bffb +Block 0002 [121]: d32c09564b09f418 +Block 0002 [122]: ebfa0176bb5954f4 +Block 0002 [123]: 72244abd8cc810bc +Block 0002 [124]: d156dc75cad947e7 +Block 0002 [125]: 620bd5bd6831dc75 +Block 0002 [126]: be69b12e194293b6 +Block 0002 [127]: 899f2fee213f1de9 +Block 0003 [ 0]: fb56a6f3add6fbf5 +Block 0003 [ 1]: 0f70eeb79f04a036 +Block 0003 [ 2]: 21988c987d9a6bae +Block 0003 [ 3]: 520bceff7462ace7 +Block 0003 [ 4]: ad909e68c1f012ff +Block 0003 [ 5]: b0dea9d56bd02153 +Block 0003 [ 6]: 66c1d56a4bcd3c3d +Block 0003 [ 7]: edf4eb0acb6c312f +Block 0003 [ 8]: 812f098eb3f51d98 +Block 0003 [ 9]: cb57986e6a080edf +Block 0003 [ 10]: 3ff9cf96daa45e5e +Block 0003 [ 11]: f03a603e2493f062 +Block 0003 [ 12]: 3a9bd9a68d202e97 +Block 0003 [ 13]: 570a6752c0c5cb3f +Block 0003 [ 14]: 6e3ff8cfde441c1e +Block 0003 [ 15]: b9a2c0d8bd8578ff +Block 0003 [ 16]: 4b8d7ef427d31ae9 +Block 0003 [ 17]: 065cf6acfd5b2e03 +Block 0003 [ 18]: c63a2ced88f063b9 +Block 0003 [ 19]: 5de62ee0f73c89d0 +Block 0003 [ 20]: c205637146f8c78c +Block 0003 [ 21]: 53ffa1ca2347257e +Block 0003 [ 22]: c9bbf7444d9deef3 +Block 0003 [ 23]: 6b214fc5d13ca15b +Block 0003 [ 24]: 1983a8131af7010f +Block 0003 [ 25]: 723598dddf1db8aa +Block 0003 [ 26]: d1f125036bb68c2e +Block 0003 [ 27]: 573314a277cbd46d +Block 0003 [ 28]: 8fb5257f38a0893d +Block 0003 [ 29]: 6f82aa350258358f +Block 0003 [ 30]: 0d70c253df3fced4 +Block 0003 [ 31]: e595ca4e326dde32 +Block 0003 [ 32]: 7c93535f19f04c44 +Block 0003 [ 33]: 06924354b5324a58 +Block 0003 [ 34]: beaa0c1a43bd5458 +Block 0003 [ 35]: a1d149ea16c1162b +Block 0003 [ 36]: 01640d4273b5839d +Block 0003 [ 37]: dce6b17485cb9db1 +Block 0003 [ 38]: c89a52747f1821f5 +Block 0003 [ 39]: 30bb832e0f53e158 +Block 0003 [ 40]: 1a0847008fd1b846 +Block 0003 [ 41]: 4cebde059f835332 +Block 0003 [ 42]: 0f034ddd0d4e4bc7 +Block 0003 [ 43]: cbe3528d589b6a73 +Block 0003 [ 44]: 6025d2bc3be52d8b +Block 0003 [ 45]: 5778af30e8c961a3 +Block 0003 [ 46]: 9692098526efbd5f +Block 0003 [ 47]: abf4049842746f89 +Block 0003 [ 48]: b1b779375f25ddc2 +Block 0003 [ 49]: b39ee648800d7f0e +Block 0003 [ 50]: 6ed0f992f6759f6a +Block 0003 [ 51]: 1214315851996819 +Block 0003 [ 52]: 07abf5656070323e +Block 0003 [ 53]: 18ac860f782bc9d2 +Block 0003 [ 54]: 980218218884d219 +Block 0003 [ 55]: 2f3fb9ad24298ab8 +Block 0003 [ 56]: 45a188a99b980d81 +Block 0003 [ 57]: 43f9bb24b34929f4 +Block 0003 [ 58]: eacc9f32423a06bf +Block 0003 [ 59]: 61d00561386621a0 +Block 0003 [ 60]: b64fd998ca28cc23 +Block 0003 [ 61]: e62e2aa17a058fcf +Block 0003 [ 62]: 4da3729542018be2 +Block 0003 [ 63]: 7523de30690d87ad +Block 0003 [ 64]: a0d414d97ff76659 +Block 0003 [ 65]: 94d80303cdccbe07 +Block 0003 [ 66]: b81ffe4a4e106cf6 +Block 0003 [ 67]: 41712d3a88f571aa +Block 0003 [ 68]: 9d011e543a5ce6e3 +Block 0003 [ 69]: 69d69c1e69e5f972 +Block 0003 [ 70]: f25a39ed9a7ec482 +Block 0003 [ 71]: 5832d4812c8c4c57 +Block 0003 [ 72]: 1211a9c54c07f790 +Block 0003 [ 73]: 5303c102e9b45c21 +Block 0003 [ 74]: 97457d5738540218 +Block 0003 [ 75]: acea58c384e21618 +Block 0003 [ 76]: b6259e5a7ceb3df8 +Block 0003 [ 77]: 440656da0f3ef414 +Block 0003 [ 78]: d8c484440162ecb9 +Block 0003 [ 79]: 64c335a57eb00044 +Block 0003 [ 80]: 6cecee1ae6bfa0b4 +Block 0003 [ 81]: 0ffc22fcf7b03663 +Block 0003 [ 82]: 540137e7b4398a11 +Block 0003 [ 83]: 7ddf5807771780d9 +Block 0003 [ 84]: 0363d76635de4e70 +Block 0003 [ 85]: 0abca167960b4b39 +Block 0003 [ 86]: fb65298a875c60c6 +Block 0003 [ 87]: 6346ea3ff20181c5 +Block 0003 [ 88]: cd51ada4f78050b5 +Block 0003 [ 89]: 2a43d4e2bf47b952 +Block 0003 [ 90]: acfcb3001f913635 +Block 0003 [ 91]: 411deab07c65ee19 +Block 0003 [ 92]: 1d189a46754809e4 +Block 0003 [ 93]: babf37efbf18c86c +Block 0003 [ 94]: f92fcdece817e247 +Block 0003 [ 95]: 873afe7217b7851d +Block 0003 [ 96]: 927eeadc8fadd290 +Block 0003 [ 97]: 7213c6ef9ca89f8f +Block 0003 [ 98]: 954d08698a03ddf0 +Block 0003 [ 99]: ccb51edd7f11262b +Block 0003 [100]: 6a498937058d4c78 +Block 0003 [101]: 4b14b8c5878e068e +Block 0003 [102]: ba12a7b03972114b +Block 0003 [103]: dff12621c17eca1f +Block 0003 [104]: 61fd0fea28e34153 +Block 0003 [105]: f06cdd41da132ef8 +Block 0003 [106]: 35acbb677a549a48 +Block 0003 [107]: ffd667b4c8e806f3 +Block 0003 [108]: 49200825235fbffd +Block 0003 [109]: 88e3019f9e034791 +Block 0003 [110]: 83c9e3abe3ea87fd +Block 0003 [111]: 6c3cea295a2565e1 +Block 0003 [112]: 538fb21149a66ed5 +Block 0003 [113]: d65d2f8b53a9106b +Block 0003 [114]: f483d2cebd16dec2 +Block 0003 [115]: 5c2e9fc4f7bd8e5d +Block 0003 [116]: 0f2bf6a3814c58d8 +Block 0003 [117]: 94e762719e799f4d +Block 0003 [118]: 7906a64262e02bde +Block 0003 [119]: d278e23ff953b7cd +Block 0003 [120]: c389950788607700 +Block 0003 [121]: c415165302ce18fc +Block 0003 [122]: c00a856c40f4c8bf +Block 0003 [123]: 9d8693388f6c4448 +Block 0003 [124]: e3bf742527c158dc +Block 0003 [125]: 78f831362f7dc9d8 +Block 0003 [126]: 21b0450a4a162590 +Block 0003 [127]: 9f14702133338041 +Block 0004 [ 0]: 1f4bfff1169c239e +Block 0004 [ 1]: 7826a84aebd08cb9 +Block 0004 [ 2]: 77b687cdebbb8252 +Block 0004 [ 3]: bb622856ff91cfc5 +Block 0004 [ 4]: 1cb853de37e58f4c +Block 0004 [ 5]: 8ab731ee056473c1 +Block 0004 [ 6]: 7cc452a31f71474c +Block 0004 [ 7]: 7e6af8625ebbcad5 +Block 0004 [ 8]: 94b7a53c75f01f3f +Block 0004 [ 9]: 24ac4e19a5c0fb37 +Block 0004 [ 10]: 59ea871a2ad1e802 +Block 0004 [ 11]: a19069ea084df0d7 +Block 0004 [ 12]: 15c55a1d96698e7a +Block 0004 [ 13]: 50ee5f96169dc765 +Block 0004 [ 14]: feebfdf9c4e8c14d +Block 0004 [ 15]: 109dbc84bbae0c77 +Block 0004 [ 16]: 7980f4474000e12c +Block 0004 [ 17]: 7bfb1e76fae72ecf +Block 0004 [ 18]: 80202573c08d0304 +Block 0004 [ 19]: 690dacc76d735f59 +Block 0004 [ 20]: ef7e52019560e447 +Block 0004 [ 21]: 6600da7a6bf6125c +Block 0004 [ 22]: c24d2e58a8e90406 +Block 0004 [ 23]: 712b9c2015d10024 +Block 0004 [ 24]: df63b5ad68463243 +Block 0004 [ 25]: 1b9039493b5dfb54 +Block 0004 [ 26]: caf0ccf6b4216f1e +Block 0004 [ 27]: 8387560fa1ba0168 +Block 0004 [ 28]: 30436beed598ccef +Block 0004 [ 29]: 542cba1ef2ef1b4f +Block 0004 [ 30]: e2830b7cd8a885f4 +Block 0004 [ 31]: 3c783826b3557628 +Block 0004 [ 32]: bb7d60801f02ad76 +Block 0004 [ 33]: cc354aa998635e97 +Block 0004 [ 34]: 5a2c1af11968c3b4 +Block 0004 [ 35]: da0a5a4d4e7a0d25 +Block 0004 [ 36]: 905dfde8c9f5931e +Block 0004 [ 37]: e0d86aaf2bdc0a00 +Block 0004 [ 38]: 875f10db09de687e +Block 0004 [ 39]: d3acbd2b9691eebb +Block 0004 [ 40]: 0f4ab9500d27b7f6 +Block 0004 [ 41]: d769190449856fa2 +Block 0004 [ 42]: f71772fb0b6e1757 +Block 0004 [ 43]: 1971206973bd9365 +Block 0004 [ 44]: 51e23fe410819a38 +Block 0004 [ 45]: 1d58d69319e63a56 +Block 0004 [ 46]: f59e3060ed85225b +Block 0004 [ 47]: b4487ec84cd0746e +Block 0004 [ 48]: c2348b990c23dbb1 +Block 0004 [ 49]: 38c5c34f0a61b67a +Block 0004 [ 50]: ee9f2cc1650a9172 +Block 0004 [ 51]: 5746f1fd8fdf085b +Block 0004 [ 52]: 43c65f28351411cd +Block 0004 [ 53]: 1bf0c575dd03cc83 +Block 0004 [ 54]: 89fd5da38d99f58a +Block 0004 [ 55]: bb776e8c70834de0 +Block 0004 [ 56]: bf0f2292e55ec916 +Block 0004 [ 57]: d9d98cd9eebac545 +Block 0004 [ 58]: 58d5ca66c32ce98b +Block 0004 [ 59]: 4a457a8f1c16a8ac +Block 0004 [ 60]: 4b2d30b9453fac13 +Block 0004 [ 61]: 80dd455f23308749 +Block 0004 [ 62]: 7b8e9c21befca460 +Block 0004 [ 63]: 382d5f6f88bb45c6 +Block 0004 [ 64]: 5446ac8c9a13aa21 +Block 0004 [ 65]: 5af8a4bf1be1404b +Block 0004 [ 66]: 4bed69e773c3bc33 +Block 0004 [ 67]: de21f3f20c01e245 +Block 0004 [ 68]: 07947acd343ff718 +Block 0004 [ 69]: a3273639f6aa2e86 +Block 0004 [ 70]: 81af6e7d148105fa +Block 0004 [ 71]: 6d2a2d27c0240158 +Block 0004 [ 72]: 230228f9486c7d5f +Block 0004 [ 73]: d0f9502d095d1d61 +Block 0004 [ 74]: eda1dfc0163868ba +Block 0004 [ 75]: fba2e329e4b590a9 +Block 0004 [ 76]: 7e3981f5c94a32f4 +Block 0004 [ 77]: aebbf3e39f176adb +Block 0004 [ 78]: 286ca52dfb323f51 +Block 0004 [ 79]: 833cf31e0d466e90 +Block 0004 [ 80]: 4e300c1e306b8f13 +Block 0004 [ 81]: 824b53333fced271 +Block 0004 [ 82]: edf34cd945d7210b +Block 0004 [ 83]: 43038b680e9dffe3 +Block 0004 [ 84]: 2f9fb7b082d9c219 +Block 0004 [ 85]: 619bf28703df87b7 +Block 0004 [ 86]: fda84f7ae8ae73ac +Block 0004 [ 87]: 39ec5d049200ec6a +Block 0004 [ 88]: b7bee34b3af6a88f +Block 0004 [ 89]: 393690efa5e2fcec +Block 0004 [ 90]: 07a885a1ab63f35d +Block 0004 [ 91]: 094cf25fe38b00d2 +Block 0004 [ 92]: 7938fde0ce831763 +Block 0004 [ 93]: fa548a2a97932eac +Block 0004 [ 94]: ca747928b037d4e2 +Block 0004 [ 95]: d8052573416f9a31 +Block 0004 [ 96]: 3e61a2127a36ea9b +Block 0004 [ 97]: 19ea0b3a6cf1c9a2 +Block 0004 [ 98]: 4e83b355bc86006e +Block 0004 [ 99]: aacd8df333ea6d30 +Block 0004 [100]: b6bfd76c58c3d60d +Block 0004 [101]: c7d73525add3bd57 +Block 0004 [102]: cad6fe5d1b06a2c1 +Block 0004 [103]: c4ab56c924fe5b08 +Block 0004 [104]: dbe4e0b763bb6bb1 +Block 0004 [105]: c19c86942ec530fb +Block 0004 [106]: e888bb27b3995932 +Block 0004 [107]: 30a878899a87c2a4 +Block 0004 [108]: 42b160bf69b804c3 +Block 0004 [109]: 1b662e82f5ff668f +Block 0004 [110]: 400b9463e2b70039 +Block 0004 [111]: 0c42792dd517f120 +Block 0004 [112]: e5d2783bc74b1db1 +Block 0004 [113]: 616271ebb481803c +Block 0004 [114]: ce397db1ea2f109e +Block 0004 [115]: ff2a4d9a41f27cfe +Block 0004 [116]: 143f5545c3cb7ac5 +Block 0004 [117]: 043d1e2315ee9b12 +Block 0004 [118]: c9c5db186171120c +Block 0004 [119]: 162d0f20feb42416 +Block 0004 [120]: 9a6ad48ba5165f31 +Block 0004 [121]: 2745f1f5d8a83383 +Block 0004 [122]: fb642a715308dcd9 +Block 0004 [123]: f4aaf8ef74a9fed0 +Block 0004 [124]: 277f46cda4ec5361 +Block 0004 [125]: 633e4dd91025d362 +Block 0004 [126]: bbaa459b3f915cb5 +Block 0004 [127]: 06be040c42f5364a +Block 0005 [ 0]: 56bc1f3296dd2ce5 +Block 0005 [ 1]: 8bc5ab8496de707e +Block 0005 [ 2]: d9644efa47808ffa +Block 0005 [ 3]: 8efe9e433a0c85e3 +Block 0005 [ 4]: 4a5df187ab89e42c +Block 0005 [ 5]: a152346eda240da5 +Block 0005 [ 6]: 6d2987077fb98c71 +Block 0005 [ 7]: 57a42e75ca3586c2 +Block 0005 [ 8]: 0a0ba506c7b76ee4 +Block 0005 [ 9]: 4fd130bc473ca0b8 +Block 0005 [ 10]: 9b29c4ac1d976010 +Block 0005 [ 11]: ff7913480eebda94 +Block 0005 [ 12]: dc9e218864ce3ef0 +Block 0005 [ 13]: 3cf7dbd1727b82b2 +Block 0005 [ 14]: a71c3c0ec3aea67b +Block 0005 [ 15]: 57a88ca0e5a824de +Block 0005 [ 16]: edc7720b0e811eef +Block 0005 [ 17]: e5deb23e00cd70d3 +Block 0005 [ 18]: 360f8b0603d3e05f +Block 0005 [ 19]: eecdf9fd77f4f367 +Block 0005 [ 20]: 5fd47b07a4fba1b8 +Block 0005 [ 21]: d7e7892acda87447 +Block 0005 [ 22]: d8a65351566b4cef +Block 0005 [ 23]: b448eea0fbe46f4f +Block 0005 [ 24]: c14fc4e53e7665bc +Block 0005 [ 25]: c5af40847ee10c41 +Block 0005 [ 26]: ec9a322dbbc80e10 +Block 0005 [ 27]: 62b8d071bb6df9e3 +Block 0005 [ 28]: ebdb4bd5139ec05f +Block 0005 [ 29]: 2cbb1cb894674200 +Block 0005 [ 30]: cbac9276b8d62258 +Block 0005 [ 31]: 340cb88843557dbb +Block 0005 [ 32]: 175bd4c2baa4574e +Block 0005 [ 33]: 1fc98675a50be7fe +Block 0005 [ 34]: 2a99f47a058fc17e +Block 0005 [ 35]: e79fd453fc8a698b +Block 0005 [ 36]: 3308cfa89a737ee6 +Block 0005 [ 37]: 4d874d35563f79c9 +Block 0005 [ 38]: 0901887475a16e95 +Block 0005 [ 39]: ca90d7075224fd56 +Block 0005 [ 40]: e9ccbba72c73f229 +Block 0005 [ 41]: 9a58978532de573f +Block 0005 [ 42]: 72a7c483199477fd +Block 0005 [ 43]: 74ae4a95aa86f679 +Block 0005 [ 44]: 39196e3bb0f9465a +Block 0005 [ 45]: 7e0aa61bebb4f8b7 +Block 0005 [ 46]: 3b3e4cf3c3767634 +Block 0005 [ 47]: 385568a115a4b7ba +Block 0005 [ 48]: ee475f11f508e361 +Block 0005 [ 49]: e2817d692ac425ca +Block 0005 [ 50]: 6bcb654d71ad29c6 +Block 0005 [ 51]: b8e0f8d40bd34cdc +Block 0005 [ 52]: 23e1122ed5fe525b +Block 0005 [ 53]: 118d441dd90d22d6 +Block 0005 [ 54]: 964d711ace56313d +Block 0005 [ 55]: 839a28506c08d638 +Block 0005 [ 56]: 1a9816a29d9ce7e5 +Block 0005 [ 57]: 61754f0576224d87 +Block 0005 [ 58]: 3e6408809e4e7de7 +Block 0005 [ 59]: a8f4a10955bf4406 +Block 0005 [ 60]: 94a63146fb256183 +Block 0005 [ 61]: 920c1b3d2c902b66 +Block 0005 [ 62]: 2df4b46832d03909 +Block 0005 [ 63]: b796e7fb9e6618fb +Block 0005 [ 64]: 973fa1e3eb5fb6ef +Block 0005 [ 65]: decdd1da1988d287 +Block 0005 [ 66]: d0753db3225995d5 +Block 0005 [ 67]: fee17a05a4e947ee +Block 0005 [ 68]: 0ca155fc78aa8be7 +Block 0005 [ 69]: 5cec59b99faac731 +Block 0005 [ 70]: bde7a1777f4dcb64 +Block 0005 [ 71]: 902be95825b61c51 +Block 0005 [ 72]: 401aff6e1f334c13 +Block 0005 [ 73]: ca46b2a0c1072b10 +Block 0005 [ 74]: cb7b0928958fb7e4 +Block 0005 [ 75]: 7ecc13ba897596cc +Block 0005 [ 76]: b1fa2e9e2fdfdf4b +Block 0005 [ 77]: a7c61a3b18ce9503 +Block 0005 [ 78]: e30fa55955465c83 +Block 0005 [ 79]: a099c26f48aea2d2 +Block 0005 [ 80]: 489b23555922b0cd +Block 0005 [ 81]: 275e8c7c9e772d38 +Block 0005 [ 82]: 173510ec47a69499 +Block 0005 [ 83]: 7cd31916cc558393 +Block 0005 [ 84]: 3f30016de11fafaa +Block 0005 [ 85]: f5b2e0ba7f14b171 +Block 0005 [ 86]: bfef8224ae7a0a51 +Block 0005 [ 87]: 8de95384bae75e40 +Block 0005 [ 88]: 3b666c78a48b30d0 +Block 0005 [ 89]: fd2321a748238c90 +Block 0005 [ 90]: 69fdab228d29478a +Block 0005 [ 91]: e0103afd01ceacd7 +Block 0005 [ 92]: 8b9ea3e23dd777e9 +Block 0005 [ 93]: 08635e8e5113bb4a +Block 0005 [ 94]: 3d315ca4675a44b1 +Block 0005 [ 95]: b20e22e6f65e1102 +Block 0005 [ 96]: a038d3ea447aa7fe +Block 0005 [ 97]: 0882a3723c4de776 +Block 0005 [ 98]: 575df4bf97ea305b +Block 0005 [ 99]: d98ea42ef107f0f0 +Block 0005 [100]: 0cba1d48f83867e7 +Block 0005 [101]: 649696d1781d2d95 +Block 0005 [102]: 9510c80999da84f7 +Block 0005 [103]: ce2f3c2d0f0d3ce2 +Block 0005 [104]: 2f30fa615e5a6c65 +Block 0005 [105]: 3c8589ad2c05e3e6 +Block 0005 [106]: c3576d16bf3517eb +Block 0005 [107]: 9b74bfbfe2f00fdf +Block 0005 [108]: b790e014dad1acdd +Block 0005 [109]: 29487c81893a5b04 +Block 0005 [110]: 4cc9f4f313fd7fc4 +Block 0005 [111]: a04f0d2766655766 +Block 0005 [112]: 0902eed758e7d367 +Block 0005 [113]: b1fcd9d76e1b30c8 +Block 0005 [114]: aa4f588a3a4aac13 +Block 0005 [115]: 0e57ff97e192f16e +Block 0005 [116]: 570393a65214975e +Block 0005 [117]: fe2abc9fb39a3db3 +Block 0005 [118]: 5833d62b97534288 +Block 0005 [119]: 452997ed754f9159 +Block 0005 [120]: 5befe711f63a4ed4 +Block 0005 [121]: f7ec83aff1f3c8ef +Block 0005 [122]: bbb5bd1ed3e4a6b5 +Block 0005 [123]: 45589b32b3e51e9d +Block 0005 [124]: 5fcd06dcf0473856 +Block 0005 [125]: c450164cff4ffeae +Block 0005 [126]: c64495c818121aa9 +Block 0005 [127]: 9fc7e86dc33cd2f3 +Block 0006 [ 0]: 6a3b43a71fe61a9d +Block 0006 [ 1]: 65dc6f99a409b85f +Block 0006 [ 2]: 3bfb666d815258ae +Block 0006 [ 3]: f86ce9ab75ffde48 +Block 0006 [ 4]: 3314c1be16a6df50 +Block 0006 [ 5]: 4d306e1ec94e6edb +Block 0006 [ 6]: 43402b6d6db3fc24 +Block 0006 [ 7]: 7b0149cc45cfcd7b +Block 0006 [ 8]: f6bbdd7398ec689d +Block 0006 [ 9]: 238319ac77ccc6c6 +Block 0006 [ 10]: fc36c2be2be64d9a +Block 0006 [ 11]: b090143eeed5bde4 +Block 0006 [ 12]: b865b75955c172e0 +Block 0006 [ 13]: ac328bf104acb8c7 +Block 0006 [ 14]: 7ca6c932408f7981 +Block 0006 [ 15]: c48572b8cb7807b1 +Block 0006 [ 16]: ea7fd8ba0749e76f +Block 0006 [ 17]: eb0842a6a483c361 +Block 0006 [ 18]: 4cd81bc9b5b020b2 +Block 0006 [ 19]: e69b3e81d49cbb97 +Block 0006 [ 20]: cc2c403448ef287f +Block 0006 [ 21]: 5dbd5c6f2cc79089 +Block 0006 [ 22]: 8ce898ea5ed001b1 +Block 0006 [ 23]: a4a8fbf4399e580e +Block 0006 [ 24]: b266b33d76edabdd +Block 0006 [ 25]: 72861366950e1b06 +Block 0006 [ 26]: 12fb10321bf4e848 +Block 0006 [ 27]: 1483bf9793e16cac +Block 0006 [ 28]: bb3ad110fc9f9c9c +Block 0006 [ 29]: 7d9a1aa5cdab1074 +Block 0006 [ 30]: bf36d5753f1f3ad2 +Block 0006 [ 31]: 3467a9be322905a2 +Block 0006 [ 32]: 0e82a639e7b7e4d7 +Block 0006 [ 33]: 0e5ba0c9c730232e +Block 0006 [ 34]: 67184bbc003e15cb +Block 0006 [ 35]: 9b18396759ec49be +Block 0006 [ 36]: 663b4946e9a5969a +Block 0006 [ 37]: 410edc3cb9af3358 +Block 0006 [ 38]: b9df4e421d49fe3e +Block 0006 [ 39]: 7a438d221e257b59 +Block 0006 [ 40]: e0694ab5116881b9 +Block 0006 [ 41]: b73f3da5c0327d16 +Block 0006 [ 42]: ab045a79f78afe15 +Block 0006 [ 43]: dd4b109852035a50 +Block 0006 [ 44]: 82a051573f849056 +Block 0006 [ 45]: de6f5c7607962384 +Block 0006 [ 46]: 097933cffaf24632 +Block 0006 [ 47]: 2b80ece7ee4995a9 +Block 0006 [ 48]: 346dc5c2df8b4418 +Block 0006 [ 49]: eb61689e0bc584fd +Block 0006 [ 50]: b3bc2fa36dd52ef2 +Block 0006 [ 51]: 7822e567796619e5 +Block 0006 [ 52]: dfee366e46cf7b59 +Block 0006 [ 53]: a12c1e7450428bfc +Block 0006 [ 54]: c9df1ad369529065 +Block 0006 [ 55]: 83e046722a7ddf69 +Block 0006 [ 56]: 1e3d5f066847e240 +Block 0006 [ 57]: c640f33eb71ea4a6 +Block 0006 [ 58]: a462476761bc6aa7 +Block 0006 [ 59]: 9a9397e75b7e150c +Block 0006 [ 60]: c459d118bfadc25b +Block 0006 [ 61]: a53c8b75dce6dab0 +Block 0006 [ 62]: 10f1f11a7f7ae936 +Block 0006 [ 63]: c734b2a1de8c7b42 +Block 0006 [ 64]: 118e5468ccfd0f3c +Block 0006 [ 65]: ab57d27c81dacbb0 +Block 0006 [ 66]: 78d2e6c45ae1e7e3 +Block 0006 [ 67]: 5d27d4f803340141 +Block 0006 [ 68]: 96c66baf2f146389 +Block 0006 [ 69]: e566ced7ba2cddae +Block 0006 [ 70]: 3c012d4bd72c0348 +Block 0006 [ 71]: baf38d9b8e04daff +Block 0006 [ 72]: f6feed25399edac5 +Block 0006 [ 73]: 478b5cc3dcd96f42 +Block 0006 [ 74]: ae74579919b6fc92 +Block 0006 [ 75]: 51fc1fa68ac1f1db +Block 0006 [ 76]: fa3ed06ccadd40b5 +Block 0006 [ 77]: 1db8e7cd61efa227 +Block 0006 [ 78]: b3cfa541a286c6c3 +Block 0006 [ 79]: 3272804c4fe3bf91 +Block 0006 [ 80]: 0080c0901626b2fa +Block 0006 [ 81]: af0da6e3aead2853 +Block 0006 [ 82]: 7e21db22722f0e3c +Block 0006 [ 83]: ab683cc97e8da7db +Block 0006 [ 84]: 27263c6eac0c9972 +Block 0006 [ 85]: ceccc3f5227ea80a +Block 0006 [ 86]: 01831837084a501b +Block 0006 [ 87]: 70b067419f21b827 +Block 0006 [ 88]: 65cea757322ba00c +Block 0006 [ 89]: 41c1a0ff8b0c3f32 +Block 0006 [ 90]: 3712715a850f2838 +Block 0006 [ 91]: 2ac61cb666e74a4a +Block 0006 [ 92]: 493189c0f8d7596d +Block 0006 [ 93]: e2bb69d85549becf +Block 0006 [ 94]: 51c73d8bf21898ee +Block 0006 [ 95]: bdb01d4cae47277f +Block 0006 [ 96]: bc2a923ed80017d4 +Block 0006 [ 97]: 87a1c6c4d38c5e8e +Block 0006 [ 98]: 4cd2b7721dca75ea +Block 0006 [ 99]: 1b7ea031a5808da9 +Block 0006 [100]: feb8ddd109ac72b9 +Block 0006 [101]: c4130e2bf97ea60d +Block 0006 [102]: c63b7d61a4388b9c +Block 0006 [103]: 314db246c472fea4 +Block 0006 [104]: cb33dc35d7857304 +Block 0006 [105]: 9c79fae6464d9639 +Block 0006 [106]: 370775c05750999a +Block 0006 [107]: cc59cd15aff3fcf9 +Block 0006 [108]: 72c7a887702ef86c +Block 0006 [109]: 2eba1082d8d310dc +Block 0006 [110]: e5df92c0479c82a7 +Block 0006 [111]: 925fd4e76d8f9aa9 +Block 0006 [112]: cf517f3178d8e581 +Block 0006 [113]: 58d49010da08f568 +Block 0006 [114]: 0b424f5aa96687e0 +Block 0006 [115]: 05937aa9fa4dbbc5 +Block 0006 [116]: e439bf60bb1ab810 +Block 0006 [117]: f6ed43b26a6e203f +Block 0006 [118]: e6fa12f52fe77030 +Block 0006 [119]: cca64264e6d574c0 +Block 0006 [120]: d777282f425ea35e +Block 0006 [121]: 06ffcf55bf74e8a9 +Block 0006 [122]: 4302e2530cef5824 +Block 0006 [123]: 101bb2ae18dbf8e7 +Block 0006 [124]: 35ed76e0f0d3521e +Block 0006 [125]: 707fd23042d46e34 +Block 0006 [126]: 8ad45ad78d5bd6b1 +Block 0006 [127]: 090f7d08b06abe8d +Block 0007 [ 0]: 59e479e05f916b33 +Block 0007 [ 1]: d170629134a24177 +Block 0007 [ 2]: c5a78cf1009b05c1 +Block 0007 [ 3]: 83a9dcb5e2ec7231 +Block 0007 [ 4]: 1616b9f12a99a638 +Block 0007 [ 5]: 02fbd63ddf2af667 +Block 0007 [ 6]: f5c20436df6ca8ca +Block 0007 [ 7]: 08cbe91a8e8b7aeb +Block 0007 [ 8]: e99eaa8eed7ad3c4 +Block 0007 [ 9]: 6d76bb05e62f8041 +Block 0007 [ 10]: 43417e37d6ac6c02 +Block 0007 [ 11]: ff20ea03c37e7778 +Block 0007 [ 12]: dcfc35fd7cb8b236 +Block 0007 [ 13]: 6e73ef79ad4921b5 +Block 0007 [ 14]: a128f0bbad4dc092 +Block 0007 [ 15]: 819290ea07d314a1 +Block 0007 [ 16]: 3233cce2c9759135 +Block 0007 [ 17]: f8dc66d2d321fb10 +Block 0007 [ 18]: 66902d9a98315fde +Block 0007 [ 19]: 9afbc0551c0d1f7e +Block 0007 [ 20]: d6e8f5ff43afebed +Block 0007 [ 21]: f95778ae0fc77151 +Block 0007 [ 22]: 1837f0f3b7a76f9d +Block 0007 [ 23]: 605f3328875eec26 +Block 0007 [ 24]: 1eb6a84483461d88 +Block 0007 [ 25]: 21298bbe36e17930 +Block 0007 [ 26]: 1a8829e5cabfe38b +Block 0007 [ 27]: b9edb6a15d084218 +Block 0007 [ 28]: 85746018776d8a75 +Block 0007 [ 29]: bde38b66cb6021e3 +Block 0007 [ 30]: bc642e63ab6a6c04 +Block 0007 [ 31]: e76312b76b9a6c68 +Block 0007 [ 32]: e43d533d4d6c4221 +Block 0007 [ 33]: fc0bcfda1ea9bdc0 +Block 0007 [ 34]: e4005e3b2d530103 +Block 0007 [ 35]: b3b9e8837034900f +Block 0007 [ 36]: dfe56aa81655556e +Block 0007 [ 37]: 8ad6a320388c6d3f +Block 0007 [ 38]: 9ae987a2539bd378 +Block 0007 [ 39]: 1576f25b6c489173 +Block 0007 [ 40]: ec1a591044807eae +Block 0007 [ 41]: 0f99146dc1860c2b +Block 0007 [ 42]: 536637bf1e4fe122 +Block 0007 [ 43]: f4999739b04901e1 +Block 0007 [ 44]: 650f99cf58618218 +Block 0007 [ 45]: 9a1ae560b1ac7f46 +Block 0007 [ 46]: 80cf15b71c2fb100 +Block 0007 [ 47]: 124cd01eab0338ab +Block 0007 [ 48]: 046fe5ecba1b7e0f +Block 0007 [ 49]: f74a03ad56db554a +Block 0007 [ 50]: 8153889b066fb09c +Block 0007 [ 51]: 283033056c99b707 +Block 0007 [ 52]: 0c21b5f77978d727 +Block 0007 [ 53]: 866031cd62857a99 +Block 0007 [ 54]: 6f97e8f3138a4e11 +Block 0007 [ 55]: c8d25173bc0a3c50 +Block 0007 [ 56]: 82ca24fa507cbf0c +Block 0007 [ 57]: c357faf33c66cfcf +Block 0007 [ 58]: 064f0616fccfd6a5 +Block 0007 [ 59]: 9bf3f89a6d1354f3 +Block 0007 [ 60]: cc7cff8a4d27620b +Block 0007 [ 61]: c9fb56f1b1669a97 +Block 0007 [ 62]: a89f350519d56943 +Block 0007 [ 63]: 5c400048568d631d +Block 0007 [ 64]: a96bf018d584151f +Block 0007 [ 65]: 0a3035ab955a79a5 +Block 0007 [ 66]: a19d60cbbe48f711 +Block 0007 [ 67]: f5b135b6f8c2e8a6 +Block 0007 [ 68]: 33270a12add9e641 +Block 0007 [ 69]: 8c224ab20be246e3 +Block 0007 [ 70]: 60df4727935eb9ce +Block 0007 [ 71]: 9b5141d124ec88cf +Block 0007 [ 72]: bcf91ee278b6e202 +Block 0007 [ 73]: 3dcd55a57ff9f5eb +Block 0007 [ 74]: 1dce42dba8d41d03 +Block 0007 [ 75]: 6f383dd35cdec94e +Block 0007 [ 76]: 36ce0d873d5c1de8 +Block 0007 [ 77]: 26d0c0004b6f19c4 +Block 0007 [ 78]: e618af3d62fee3a5 +Block 0007 [ 79]: 345492f55b4e985c +Block 0007 [ 80]: 6e4a85c1607b2c4b +Block 0007 [ 81]: 52dd856c7bb5efa4 +Block 0007 [ 82]: 52dcb46b9c209104 +Block 0007 [ 83]: 32717127c3ee487a +Block 0007 [ 84]: 312697b5cf52940e +Block 0007 [ 85]: 2dcb97fcc018a163 +Block 0007 [ 86]: 177d895c77466d2f +Block 0007 [ 87]: 6e61c547bfb37079 +Block 0007 [ 88]: a59b315fa1be5b68 +Block 0007 [ 89]: 87d66bc90afb2ca6 +Block 0007 [ 90]: 8cf85500edeee702 +Block 0007 [ 91]: ecbbab4d2133b00c +Block 0007 [ 92]: b26d33321ac1abc3 +Block 0007 [ 93]: b4a52773a6207e7d +Block 0007 [ 94]: a209c5896bc6f12a +Block 0007 [ 95]: 41fb84a301cff0c3 +Block 0007 [ 96]: 09cdf552c77b557d +Block 0007 [ 97]: 1e52df18ab3dfb9a +Block 0007 [ 98]: 57fd74a68ad68378 +Block 0007 [ 99]: 07227e916b0f5996 +Block 0007 [100]: 32ef2531400d1b35 +Block 0007 [101]: 4fc2dc41f7b23ff4 +Block 0007 [102]: 0b020da0feb2a228 +Block 0007 [103]: 5cfc2db650991a48 +Block 0007 [104]: f81c0cd56cb9c08f +Block 0007 [105]: e60e21da2ebb7ce8 +Block 0007 [106]: 268739ac9bca060a +Block 0007 [107]: 92cd1e2104e368c5 +Block 0007 [108]: 98156dc095f52233 +Block 0007 [109]: 30f247cf0f011fa1 +Block 0007 [110]: 66f829551d2e0a3e +Block 0007 [111]: ea52274d79ff571e +Block 0007 [112]: acb6d370148653a4 +Block 0007 [113]: 3669b3147dfe731a +Block 0007 [114]: 1c8bdda97133b4ad +Block 0007 [115]: 0cc5dd86167dbc1b +Block 0007 [116]: dd0aa6d96f923c39 +Block 0007 [117]: 512fe7564b090b61 +Block 0007 [118]: c86816c60da06a46 +Block 0007 [119]: dedf55b9d5f4268e +Block 0007 [120]: d29c4a93d713b733 +Block 0007 [121]: f87604f8f94f5aea +Block 0007 [122]: 97d9788450105075 +Block 0007 [123]: 54e489cefdbfb9e0 +Block 0007 [124]: 934701adf12d8e81 +Block 0007 [125]: 95bc8d473335a595 +Block 0007 [126]: fab387b04eacbaaf +Block 0007 [127]: fc3e56a297370c38 +Block 0008 [ 0]: 282145945f12ecd3 +Block 0008 [ 1]: 1ac1aa0b5c30acd6 +Block 0008 [ 2]: 60f8604f21e73053 +Block 0008 [ 3]: 763bbde8b3025afe +Block 0008 [ 4]: 19813cdc34768a0d +Block 0008 [ 5]: 6c91e7d7cca6e347 +Block 0008 [ 6]: 3f049f472508cc53 +Block 0008 [ 7]: e0ffa88d72bebdc2 +Block 0008 [ 8]: de17f817893dfa9c +Block 0008 [ 9]: 2d63b8df6cdea739 +Block 0008 [ 10]: a7d7bc228a9b0279 +Block 0008 [ 11]: f07ab3a91ba1cba8 +Block 0008 [ 12]: 41a0157563872217 +Block 0008 [ 13]: c109c12ad61ddba8 +Block 0008 [ 14]: ecb3deb6a4142e08 +Block 0008 [ 15]: 2a932539267a41ae +Block 0008 [ 16]: 6d3a62fc8d00e500 +Block 0008 [ 17]: f0e439bef2eb6c6e +Block 0008 [ 18]: 1dd011595308ac57 +Block 0008 [ 19]: d60a8d118a649d8d +Block 0008 [ 20]: 37af5bc5a580eeed +Block 0008 [ 21]: 547777804b31ac21 +Block 0008 [ 22]: ceeaa2b7bc51f419 +Block 0008 [ 23]: 680d345e4dfeffa3 +Block 0008 [ 24]: 3047a84a4e3c615f +Block 0008 [ 25]: fc7b6f9717120164 +Block 0008 [ 26]: a106a1af037e2478 +Block 0008 [ 27]: f1d93c81c3d5999e +Block 0008 [ 28]: f5a65b33b2538b91 +Block 0008 [ 29]: 934f66c72c8f525d +Block 0008 [ 30]: dae4e5dffbac54bc +Block 0008 [ 31]: afb603ae332283d2 +Block 0008 [ 32]: af3f345a59ad6951 +Block 0008 [ 33]: bb3ecdfb2eb1d571 +Block 0008 [ 34]: 5ccc9de9818c13d0 +Block 0008 [ 35]: faf5de9da827896e +Block 0008 [ 36]: 952eb0543c6eaa82 +Block 0008 [ 37]: 2137bd47cd8e8d2e +Block 0008 [ 38]: 4767e8759b44592d +Block 0008 [ 39]: 7d5c195b08c35bf9 +Block 0008 [ 40]: 070453b9d1fa6fe1 +Block 0008 [ 41]: 210fb2c38527d6a2 +Block 0008 [ 42]: 6d0e9f7449f23c3e +Block 0008 [ 43]: bac26f89bffad658 +Block 0008 [ 44]: 25ac007e672ee346 +Block 0008 [ 45]: a3c85973642a0166 +Block 0008 [ 46]: 3a925b7f8ad6e011 +Block 0008 [ 47]: 15e0badde1d99090 +Block 0008 [ 48]: 42bf9c540f2e1394 +Block 0008 [ 49]: c2029ee97cd9c915 +Block 0008 [ 50]: 1927c36c7f975006 +Block 0008 [ 51]: 73fa08166e0f1951 +Block 0008 [ 52]: 1aa1638331153336 +Block 0008 [ 53]: a0d8ba67e8d3832c +Block 0008 [ 54]: 5a35f3574b0ecadc +Block 0008 [ 55]: b29d225c180b9d7f +Block 0008 [ 56]: e360ba0f450119ef +Block 0008 [ 57]: 0451064565c02bc1 +Block 0008 [ 58]: 3e41001b8b0e0bbd +Block 0008 [ 59]: 8ca745962358496c +Block 0008 [ 60]: 6fcee749ec5a01f4 +Block 0008 [ 61]: f74dc0b916dd8578 +Block 0008 [ 62]: d79d32fb1ac52b9a +Block 0008 [ 63]: 91c3f4695bb05f08 +Block 0008 [ 64]: aea5311cde98edcb +Block 0008 [ 65]: 29681dca687cb503 +Block 0008 [ 66]: 5ed29cfcf4a05c65 +Block 0008 [ 67]: 69996409342ed84f +Block 0008 [ 68]: 1eb369993397ea34 +Block 0008 [ 69]: abe7f5d61d819f02 +Block 0008 [ 70]: 128ac7ec2988131d +Block 0008 [ 71]: cbf98166be45c13b +Block 0008 [ 72]: 3eb0cc4cf3ffc15b +Block 0008 [ 73]: 4be0eb7cdc596327 +Block 0008 [ 74]: a53dfb2e9c4f1572 +Block 0008 [ 75]: 97628a447584028d +Block 0008 [ 76]: ad8efb47b9527bda +Block 0008 [ 77]: d898345e003d8bfc +Block 0008 [ 78]: aed572ff49f824da +Block 0008 [ 79]: effdfb03ca6d262b +Block 0008 [ 80]: 5c76b7e719d4b092 +Block 0008 [ 81]: 3fbc5d75533377a0 +Block 0008 [ 82]: c3e9be1e87fff04f +Block 0008 [ 83]: 6fd35d2bfd653013 +Block 0008 [ 84]: 8ae6fc6a2a959fe9 +Block 0008 [ 85]: 16c177dac219e4bb +Block 0008 [ 86]: b778cfd1541b7d86 +Block 0008 [ 87]: 71cdb864322493fd +Block 0008 [ 88]: c84ee1bb3002781c +Block 0008 [ 89]: cd3f3001e43f22f2 +Block 0008 [ 90]: ee0723c7e3fa57fa +Block 0008 [ 91]: 3b7905f9889f12ce +Block 0008 [ 92]: 201c9588c929d89e +Block 0008 [ 93]: b1537c7fb54bdfd3 +Block 0008 [ 94]: e258a3bc1d698cf3 +Block 0008 [ 95]: 83255c867a2e8677 +Block 0008 [ 96]: 0279b6538a409fcf +Block 0008 [ 97]: f74290c084079691 +Block 0008 [ 98]: 0632ffc7e37ad8d9 +Block 0008 [ 99]: a200d59ee03ea9d6 +Block 0008 [100]: 46803d61b515f08c +Block 0008 [101]: 6cf535987406656a +Block 0008 [102]: 3995a42c92cc7966 +Block 0008 [103]: 85df03e49bfe47d5 +Block 0008 [104]: 6cceb87dee9aa0c9 +Block 0008 [105]: fc9d31d40341a15e +Block 0008 [106]: 0a180adfadc6356c +Block 0008 [107]: 0e058b8ef724d830 +Block 0008 [108]: f2245297d8482ccf +Block 0008 [109]: b9f1451dc3145bbf +Block 0008 [110]: d0b4ffdea62b3e54 +Block 0008 [111]: 88212eb7971b3f49 +Block 0008 [112]: 10fedd9fe29e14bb +Block 0008 [113]: e3cbbff144f56d12 +Block 0008 [114]: 767f4fd28abed05a +Block 0008 [115]: a6b2027a43f64775 +Block 0008 [116]: ba11fb9502d4a9b6 +Block 0008 [117]: 89729444846e3174 +Block 0008 [118]: cc5ce515d1e99aae +Block 0008 [119]: d46cb5dcdecb9520 +Block 0008 [120]: eb33b12794818b53 +Block 0008 [121]: 6dc4bef6e24fdbfe +Block 0008 [122]: 79c4cad4c865e91a +Block 0008 [123]: f42028b04d0dbbd4 +Block 0008 [124]: 6b0fe2e42e2c8d5e +Block 0008 [125]: 6efc4e74787fb7ad +Block 0008 [126]: 62e777191870974b +Block 0008 [127]: b637d492fff7bf5b +Block 0009 [ 0]: b51ebc1ce5c54587 +Block 0009 [ 1]: f24cfd2d28416a55 +Block 0009 [ 2]: a56be5bda1d10f36 +Block 0009 [ 3]: 1a5f620482fa56e5 +Block 0009 [ 4]: c8cd41bdc76c0502 +Block 0009 [ 5]: 38253d2c027e8ff2 +Block 0009 [ 6]: 89af4f4315191f22 +Block 0009 [ 7]: 77cfcb90bfcb4c5c +Block 0009 [ 8]: 86dd4fda752a6933 +Block 0009 [ 9]: 478a200eb9585357 +Block 0009 [ 10]: 904df51f016d77d7 +Block 0009 [ 11]: 42f6090334873cf3 +Block 0009 [ 12]: 1d0acdb372df3f75 +Block 0009 [ 13]: 6d882e7dee617c83 +Block 0009 [ 14]: 903ec926348998cb +Block 0009 [ 15]: e77922f31cf1b89a +Block 0009 [ 16]: f1f1f3e73eec2745 +Block 0009 [ 17]: 5ba312d7d83b2883 +Block 0009 [ 18]: 5ff76517a1633867 +Block 0009 [ 19]: 41af74d8f12e3e1d +Block 0009 [ 20]: fdc04bd78cfa38a5 +Block 0009 [ 21]: 720cbde8e8dfd8fb +Block 0009 [ 22]: 346652d8064f3f80 +Block 0009 [ 23]: 317b0d033c38db97 +Block 0009 [ 24]: 718f7f0c4bf7e910 +Block 0009 [ 25]: e17fda1c6a8e6ec2 +Block 0009 [ 26]: 3884b2a7782be170 +Block 0009 [ 27]: 0b28a061c237c26e +Block 0009 [ 28]: adbb8d0872b20abf +Block 0009 [ 29]: 2fc555b807f6da68 +Block 0009 [ 30]: 2429a5e8fa7514a9 +Block 0009 [ 31]: dd89d41b0bfe36de +Block 0009 [ 32]: b7d1955a2e89df52 +Block 0009 [ 33]: 60a53a7e0095b3df +Block 0009 [ 34]: bbe12271d25326dd +Block 0009 [ 35]: 7383edb8add93339 +Block 0009 [ 36]: d2c1340e78b8eb9b +Block 0009 [ 37]: 48bb9b6bdddd1978 +Block 0009 [ 38]: bfc99101cf8a0151 +Block 0009 [ 39]: 2e3d430da5248b01 +Block 0009 [ 40]: 714972754e2a3b17 +Block 0009 [ 41]: 980bcc89c6b68d41 +Block 0009 [ 42]: b0bc1736129cd3da +Block 0009 [ 43]: b5e11d28394e62d4 +Block 0009 [ 44]: 66e520fd1c988ac5 +Block 0009 [ 45]: dedd7c5e4748fc1c +Block 0009 [ 46]: 996ff3699d168445 +Block 0009 [ 47]: dd6c882d28be792d +Block 0009 [ 48]: 8523e263ddc58b4a +Block 0009 [ 49]: 179e9ec6d8182cd1 +Block 0009 [ 50]: e9cef718f9504909 +Block 0009 [ 51]: 3b898f007e372a80 +Block 0009 [ 52]: 08a283c2f650064c +Block 0009 [ 53]: 810fefdccd438bda +Block 0009 [ 54]: d5e8770991d2486f +Block 0009 [ 55]: fc1ae28b281de523 +Block 0009 [ 56]: 736f486afd0d647a +Block 0009 [ 57]: bb2be00d646a5185 +Block 0009 [ 58]: 1ca35ad8ceb99210 +Block 0009 [ 59]: 48eacc4e7cb83759 +Block 0009 [ 60]: 3e1dcd336966003c +Block 0009 [ 61]: 9275a2b29941257c +Block 0009 [ 62]: 257e1a89c6d4c1cd +Block 0009 [ 63]: 8c8f67a882805a33 +Block 0009 [ 64]: e5fe75eda295409d +Block 0009 [ 65]: bfdcafe10fdb456f +Block 0009 [ 66]: 40ad88568c584e13 +Block 0009 [ 67]: fa20866a2766c7fe +Block 0009 [ 68]: b310c6d79e568ffb +Block 0009 [ 69]: 503d9253aff998e4 +Block 0009 [ 70]: 495f296b6b61f264 +Block 0009 [ 71]: beef0e82653e020f +Block 0009 [ 72]: be4811e8488ffd1e +Block 0009 [ 73]: 14fb1ffd5fd037e4 +Block 0009 [ 74]: 8afac21754fba78e +Block 0009 [ 75]: d8d9734e8005d3dc +Block 0009 [ 76]: bde1976942530836 +Block 0009 [ 77]: 5a36cfa5bc85404f +Block 0009 [ 78]: 3efcdd865f2ef595 +Block 0009 [ 79]: 8503f12ded4ba3a2 +Block 0009 [ 80]: 8b550ac564227c3c +Block 0009 [ 81]: 3b72f71db910d566 +Block 0009 [ 82]: bc422a71f193fb78 +Block 0009 [ 83]: ac534f6fc1e09dff +Block 0009 [ 84]: ad0b10c5fb42fc0b +Block 0009 [ 85]: 52a2d4dcf13d5e0a +Block 0009 [ 86]: df202d34863e7be9 +Block 0009 [ 87]: 09e4eb0e6fd242ac +Block 0009 [ 88]: cd33e3660e9c1a73 +Block 0009 [ 89]: b6e4d387310b7df0 +Block 0009 [ 90]: f1d8514afa7b45d3 +Block 0009 [ 91]: cf750fb315193dc3 +Block 0009 [ 92]: 0d1f7681fe88f783 +Block 0009 [ 93]: e2580891465c28f6 +Block 0009 [ 94]: 81edf01e45e5303a +Block 0009 [ 95]: 972e459a0b4b78a1 +Block 0009 [ 96]: 73d4b4cd70e66a45 +Block 0009 [ 97]: e8ae9b153e316496 +Block 0009 [ 98]: c5bf4b57c7ee3cf7 +Block 0009 [ 99]: 5f0e59387d54969e +Block 0009 [100]: 4f06752cd7252de1 +Block 0009 [101]: 8a206fbc01509988 +Block 0009 [102]: c9d48b8fbd5b7adc +Block 0009 [103]: dd331a619ec7fd24 +Block 0009 [104]: ce99e40346f40515 +Block 0009 [105]: bc258259f1ff919c +Block 0009 [106]: 3007e9ff3fe6a502 +Block 0009 [107]: 4c9bc60f05fe4dd6 +Block 0009 [108]: fcee0af0e0ab22b0 +Block 0009 [109]: 7bf90ecf20597b49 +Block 0009 [110]: 14c6e9adffbcb2cc +Block 0009 [111]: 57d24e03ac4a9495 +Block 0009 [112]: 6265cd2145acfcbb +Block 0009 [113]: 462777e67b621ec4 +Block 0009 [114]: d83e82f38e7f7089 +Block 0009 [115]: 8240ac135c1961cf +Block 0009 [116]: 9b5cfa591d26ff97 +Block 0009 [117]: 23fc3a587408818a +Block 0009 [118]: a406f4578dc58fca +Block 0009 [119]: 8997f1c33e411d00 +Block 0009 [120]: 8908c3f119cf398d +Block 0009 [121]: 7ca9090945d56951 +Block 0009 [122]: a3d87d8e207ed64d +Block 0009 [123]: 8ce2e01f7a194ebc +Block 0009 [124]: 70231c9ccdb58341 +Block 0009 [125]: 2b3dea3311b02815 +Block 0009 [126]: bdebaed5c4dc0a02 +Block 0009 [127]: 84af05b1e80139c5 +Block 0010 [ 0]: f173509e8c6951f0 +Block 0010 [ 1]: 5ecae05ac3a7f094 +Block 0010 [ 2]: 87b04b90fb412faf +Block 0010 [ 3]: 9d7a4584deb3c1bc +Block 0010 [ 4]: 938349d693eabff7 +Block 0010 [ 5]: e51daa894d1b1d86 +Block 0010 [ 6]: 7839e531eb3ef150 +Block 0010 [ 7]: dcc8bac832dd9263 +Block 0010 [ 8]: 503f31984a22a73d +Block 0010 [ 9]: 32dd0cf3b1a6f6da +Block 0010 [ 10]: 6232dd0ddf1f293a +Block 0010 [ 11]: c08cf7243d71db15 +Block 0010 [ 12]: 9dd223a71d553c7e +Block 0010 [ 13]: e705405f11c0c88a +Block 0010 [ 14]: a76cbcff056ea623 +Block 0010 [ 15]: 4211d6067c63e4ea +Block 0010 [ 16]: e38b95c43b6c8c42 +Block 0010 [ 17]: fa039b85f4e37025 +Block 0010 [ 18]: c7641d8b3c1d3d27 +Block 0010 [ 19]: a168373a6246e3b1 +Block 0010 [ 20]: 1c29f3c317d4a842 +Block 0010 [ 21]: 0e112c2b5002251c +Block 0010 [ 22]: 35edabf640a1a4be +Block 0010 [ 23]: fbece5e62986f45e +Block 0010 [ 24]: a0300d91ab35e389 +Block 0010 [ 25]: 2307aae53bb6cdff +Block 0010 [ 26]: 8ff7b4bbe121ebe8 +Block 0010 [ 27]: 9fa0f247c76473b3 +Block 0010 [ 28]: b3fba8860e65096e +Block 0010 [ 29]: bc5fae00925aa4bd +Block 0010 [ 30]: e45c0c1a94a0716e +Block 0010 [ 31]: 81e3abe71ec403bc +Block 0010 [ 32]: 8cf7ad3248baf5d4 +Block 0010 [ 33]: 42a689d358de4862 +Block 0010 [ 34]: 722e6ab07bb13dd4 +Block 0010 [ 35]: 4925a4d2c005727a +Block 0010 [ 36]: c15fd84720b2611a +Block 0010 [ 37]: d4d87de5205dfb30 +Block 0010 [ 38]: 22b28aa75745fc2d +Block 0010 [ 39]: 749dc8d5598179a6 +Block 0010 [ 40]: eeaa16e0659e0192 +Block 0010 [ 41]: fa25ab267613034e +Block 0010 [ 42]: 4508a5f87fe32a35 +Block 0010 [ 43]: 9540fef3fc000dac +Block 0010 [ 44]: 0541345b4b35787d +Block 0010 [ 45]: b6d197f33253019b +Block 0010 [ 46]: 40c00ee49dabe233 +Block 0010 [ 47]: 10dcffe3f4d84140 +Block 0010 [ 48]: 6f6504bd4202b80b +Block 0010 [ 49]: 4910aadb5d995e14 +Block 0010 [ 50]: 3be7598ad6b7b00f +Block 0010 [ 51]: 16d760387217d677 +Block 0010 [ 52]: 157c2603fb94d372 +Block 0010 [ 53]: 245a425507040bbd +Block 0010 [ 54]: 53119479f5874f90 +Block 0010 [ 55]: bf6f9b8692f0b837 +Block 0010 [ 56]: 0049c75dfc7dc720 +Block 0010 [ 57]: f238ae4395b094b4 +Block 0010 [ 58]: 2dcb2348df0bd8e1 +Block 0010 [ 59]: 3210cccdb289293f +Block 0010 [ 60]: 51c7facbf4d63c99 +Block 0010 [ 61]: eff7c07dfef9e59d +Block 0010 [ 62]: f2ab55b9e629297f +Block 0010 [ 63]: 8edf75faa3478b49 +Block 0010 [ 64]: 774ecc317f36cfe1 +Block 0010 [ 65]: db216cef5837ca17 +Block 0010 [ 66]: e9cd3059b825aae6 +Block 0010 [ 67]: f46039c3d87aeb33 +Block 0010 [ 68]: 420dd68f9b66827a +Block 0010 [ 69]: 34f07ae5e76d6e8a +Block 0010 [ 70]: d5ac5c911584d4cb +Block 0010 [ 71]: 058f82cec99756b0 +Block 0010 [ 72]: d11c2004749ba930 +Block 0010 [ 73]: 9f1ff374580eb6c0 +Block 0010 [ 74]: 9f957fa50da0b9f3 +Block 0010 [ 75]: 1c44951395918e91 +Block 0010 [ 76]: 7111b1a8aae6be7f +Block 0010 [ 77]: 0ab3388f275426ef +Block 0010 [ 78]: 26fc0217e12d62d0 +Block 0010 [ 79]: f2ce2aa321c90437 +Block 0010 [ 80]: 4fda333183fd6655 +Block 0010 [ 81]: e019af98f13ee4d9 +Block 0010 [ 82]: 6bab83f3f92f653b +Block 0010 [ 83]: ffee52f49e2f42a8 +Block 0010 [ 84]: f150c70d8514a7e6 +Block 0010 [ 85]: 806c48b29ace438b +Block 0010 [ 86]: 6c9f59490dc47c0c +Block 0010 [ 87]: d2da0113cc468eec +Block 0010 [ 88]: acd3870091fa11ae +Block 0010 [ 89]: b3349dd058479c88 +Block 0010 [ 90]: 9802b3b860a9a3cb +Block 0010 [ 91]: 00e0840446d6776e +Block 0010 [ 92]: 57ef8b24e3d3cd3e +Block 0010 [ 93]: 9eb466c964e0fe56 +Block 0010 [ 94]: 5a73a0ddbf0b8322 +Block 0010 [ 95]: bf5e064687ff3f2f +Block 0010 [ 96]: 5657e143ddc3b17c +Block 0010 [ 97]: fcf05095a8320084 +Block 0010 [ 98]: f9f69e9b630ee96a +Block 0010 [ 99]: f1c9e9bdbe357cdd +Block 0010 [100]: 77103f2471d037dc +Block 0010 [101]: 270fbe363e682e11 +Block 0010 [102]: e26bcc409254504e +Block 0010 [103]: f090445c6daa8d1d +Block 0010 [104]: f2b96cf4bd3aee9d +Block 0010 [105]: d4b5c4138079400b +Block 0010 [106]: 851896bd06456429 +Block 0010 [107]: b0e197d30c2302f0 +Block 0010 [108]: ad14c29915ce379d +Block 0010 [109]: f20a29201fb36736 +Block 0010 [110]: ea3f27b2e1aa01ef +Block 0010 [111]: ece60dc38bf94d59 +Block 0010 [112]: 4ff4f6bba8050abe +Block 0010 [113]: be89f5fb18df5156 +Block 0010 [114]: f44369b404835880 +Block 0010 [115]: 62e51fbf337ceb9a +Block 0010 [116]: 3e1079ced5348d06 +Block 0010 [117]: ebeedc4a3dd087bf +Block 0010 [118]: d26839c2654c02a1 +Block 0010 [119]: cb67fe217aa3fa9e +Block 0010 [120]: 2d9a64ea20bab5eb +Block 0010 [121]: d2685facf666715a +Block 0010 [122]: 70e5091ed6e07b6c +Block 0010 [123]: fb3438d9b59896ef +Block 0010 [124]: 45a3f4fb770aae6c +Block 0010 [125]: 34dcff3647fe618e +Block 0010 [126]: 317cdd9023e383f9 +Block 0010 [127]: e8a91e43c976159a +Block 0011 [ 0]: 1fd1594b82df1dfa +Block 0011 [ 1]: 8356d52c018e2d54 +Block 0011 [ 2]: 2b25d4c0ce6857dc +Block 0011 [ 3]: e38988c550171f57 +Block 0011 [ 4]: f256212a4b780db5 +Block 0011 [ 5]: 109671484ffeb0e1 +Block 0011 [ 6]: 07958db0c32c7ad7 +Block 0011 [ 7]: b5244109ffaec646 +Block 0011 [ 8]: 6deb9ce5497d4bbf +Block 0011 [ 9]: f6bd231e7e9e4664 +Block 0011 [ 10]: 0af37ff345afd9f3 +Block 0011 [ 11]: 4e116d808b9db908 +Block 0011 [ 12]: c14a0b50f20f7f5c +Block 0011 [ 13]: 015304b3b9c7b933 +Block 0011 [ 14]: 75938887ff2ed1f8 +Block 0011 [ 15]: d497584fe66718cb +Block 0011 [ 16]: 5f9c6abddfc3c763 +Block 0011 [ 17]: fccdaf55d21a649c +Block 0011 [ 18]: 64047640a2346f52 +Block 0011 [ 19]: 7f87cac3095edc21 +Block 0011 [ 20]: e316f30445340fe7 +Block 0011 [ 21]: 26b96f77308e2070 +Block 0011 [ 22]: cff78be364db6c6b +Block 0011 [ 23]: 557b2b82bfae51a1 +Block 0011 [ 24]: a54c3e902a240602 +Block 0011 [ 25]: 8d666deaaf8c83c3 +Block 0011 [ 26]: 7f4e040bf76908a8 +Block 0011 [ 27]: f6adecc892d33ab0 +Block 0011 [ 28]: 5fc73bd7e58f4a3e +Block 0011 [ 29]: a4d0cce01bbee3e0 +Block 0011 [ 30]: fb2d8fb79f6ab152 +Block 0011 [ 31]: 38e68dc30491f640 +Block 0011 [ 32]: 2c9de1778c5de4f6 +Block 0011 [ 33]: ace30ebb97b3bc42 +Block 0011 [ 34]: bffe6eb4b67452a8 +Block 0011 [ 35]: c78b6d4d48e23ddf +Block 0011 [ 36]: 7775c5958faa5a6c +Block 0011 [ 37]: 68014715c9f5e5ce +Block 0011 [ 38]: 898c95f1cde02893 +Block 0011 [ 39]: 13f5ea34f1732ec6 +Block 0011 [ 40]: 7318b943b749fa47 +Block 0011 [ 41]: 082e401cab2de318 +Block 0011 [ 42]: 4c32158ff923f585 +Block 0011 [ 43]: eef77621983721fb +Block 0011 [ 44]: 02d490a3209b78a7 +Block 0011 [ 45]: 8770be626e6e8c16 +Block 0011 [ 46]: 3ddf6df056b37443 +Block 0011 [ 47]: 44d477f220017c45 +Block 0011 [ 48]: 0466ab1b16d9daf0 +Block 0011 [ 49]: 6ddc70d233e22d85 +Block 0011 [ 50]: 63c9a17c29126f50 +Block 0011 [ 51]: a04bb2d97d9a6b41 +Block 0011 [ 52]: 019bd561e0b2a9c9 +Block 0011 [ 53]: 1d18fd9a1ba73242 +Block 0011 [ 54]: 88c4f53bf9e5ef1a +Block 0011 [ 55]: ff13b6aee469b983 +Block 0011 [ 56]: 5726af33d8098ff6 +Block 0011 [ 57]: d51ee36307e108d9 +Block 0011 [ 58]: eceb791278214d78 +Block 0011 [ 59]: 0145bc4302e4a279 +Block 0011 [ 60]: 103fc5eb0ca47ade +Block 0011 [ 61]: a0815229bbf5a6a1 +Block 0011 [ 62]: 152f5e569d9cd53a +Block 0011 [ 63]: 11f789c95adc2fd8 +Block 0011 [ 64]: 78c4c36d005d72b9 +Block 0011 [ 65]: 14c55c2f993804bc +Block 0011 [ 66]: f335bc41204c6a26 +Block 0011 [ 67]: a3b078547373e462 +Block 0011 [ 68]: 29fbcf862902747d +Block 0011 [ 69]: f526be07b3d4cd6d +Block 0011 [ 70]: 6cc9609dfade5ebc +Block 0011 [ 71]: 4f7efba69a0477a4 +Block 0011 [ 72]: dbabe545e63b086d +Block 0011 [ 73]: 4bc7c9a2eed311b7 +Block 0011 [ 74]: 64e54d8b1bab4a1f +Block 0011 [ 75]: d76fff4669327dfd +Block 0011 [ 76]: 321692d0e50cbb4b +Block 0011 [ 77]: aa32a5f7807d1935 +Block 0011 [ 78]: 4f5a8fbfcac5f52b +Block 0011 [ 79]: 60f86347392bbd97 +Block 0011 [ 80]: 74a612d2547ff8b8 +Block 0011 [ 81]: 86529138b37e41b1 +Block 0011 [ 82]: 07a56ff7d5df2923 +Block 0011 [ 83]: 48c0b2cd2c8ec937 +Block 0011 [ 84]: f25406b807d0509f +Block 0011 [ 85]: 7dd53859b3414d79 +Block 0011 [ 86]: a542f6bbc495ef25 +Block 0011 [ 87]: 467563dd0f231916 +Block 0011 [ 88]: 453396eac5ad4b1e +Block 0011 [ 89]: 54aaf9a724d9627d +Block 0011 [ 90]: 7f7a8d36b13cc862 +Block 0011 [ 91]: 9961e8e3fd191c9c +Block 0011 [ 92]: ba00227f9cbcaed2 +Block 0011 [ 93]: ae68b8273c755e87 +Block 0011 [ 94]: cdce8af651a75b3b +Block 0011 [ 95]: 839999074aab83eb +Block 0011 [ 96]: a3427e62f8a2fde7 +Block 0011 [ 97]: 5aa52a737e043106 +Block 0011 [ 98]: 140d77a072532183 +Block 0011 [ 99]: 1629c1497b7dca49 +Block 0011 [100]: 139701bbf30af41e +Block 0011 [101]: fa67c839cbd36888 +Block 0011 [102]: b93f013495c2fb7c +Block 0011 [103]: a780e94dc6aed270 +Block 0011 [104]: caf607bc55cedb65 +Block 0011 [105]: 101c942911ede959 +Block 0011 [106]: 0e29fa0ded8a9f09 +Block 0011 [107]: ad8be809951517f7 +Block 0011 [108]: 61c3d9430d2dc220 +Block 0011 [109]: 8f994499afc1a216 +Block 0011 [110]: 369a6933dab8d31f +Block 0011 [111]: 9829be415fb7ca60 +Block 0011 [112]: 7d81a1df1b3a8a4b +Block 0011 [113]: 4a1f610433899dac +Block 0011 [114]: 102c08b6e7485a6c +Block 0011 [115]: 1a20f39e1997f7df +Block 0011 [116]: dede8cdccea7dbc4 +Block 0011 [117]: fe662506f4ef1565 +Block 0011 [118]: c59f245f91cc9f21 +Block 0011 [119]: 7edf0558eed181ff +Block 0011 [120]: 52660f58659e6416 +Block 0011 [121]: 9a8652ba35ebbfe3 +Block 0011 [122]: 3ddcc3f3a9d0d4e9 +Block 0011 [123]: 9b77732233e29b31 +Block 0011 [124]: 5cca0503b8810763 +Block 0011 [125]: 20437f00f7599495 +Block 0011 [126]: 697494785bf513c0 +Block 0011 [127]: 3ab8bd182b6c8249 +Block 0012 [ 0]: 74c495065857a14a +Block 0012 [ 1]: ec96b80a6b33aca7 +Block 0012 [ 2]: f444c0ff27974ebd +Block 0012 [ 3]: 8be83acdb72435c6 +Block 0012 [ 4]: dd61727abd58d7f6 +Block 0012 [ 5]: 5cfb6a444de715d1 +Block 0012 [ 6]: 96783e23efc4d2a0 +Block 0012 [ 7]: 8676efba8fca7711 +Block 0012 [ 8]: 03b65deaa794547b +Block 0012 [ 9]: 723cbdd0b9bb8d66 +Block 0012 [ 10]: f41cacae2bcf2b0b +Block 0012 [ 11]: e2aec66d0247e1c1 +Block 0012 [ 12]: 3b397dcc3b4b0baa +Block 0012 [ 13]: c1b6183e2bb1ba29 +Block 0012 [ 14]: 872ddf74f2f0c4b6 +Block 0012 [ 15]: 7fa99dcf8c868329 +Block 0012 [ 16]: 81aaf228dab8d432 +Block 0012 [ 17]: f662d33a0d61f712 +Block 0012 [ 18]: fc94f70f5dbbd7f8 +Block 0012 [ 19]: 091fdf4051ca05bf +Block 0012 [ 20]: db86fbd51496da46 +Block 0012 [ 21]: e23f27c3e27cfce4 +Block 0012 [ 22]: b30cbb5f194f3665 +Block 0012 [ 23]: 098e970f7402448a +Block 0012 [ 24]: 8b8c305c65695a8b +Block 0012 [ 25]: 7d510babc681fec3 +Block 0012 [ 26]: 9730753a01829732 +Block 0012 [ 27]: 07fcd4c5caad3b8a +Block 0012 [ 28]: 0e460f3d1bd79795 +Block 0012 [ 29]: c4a603208e0f3b48 +Block 0012 [ 30]: 379b4e95cba16ceb +Block 0012 [ 31]: bc72b408d217a603 +Block 0012 [ 32]: c47562fb642367b8 +Block 0012 [ 33]: 7c3c05432783dc7e +Block 0012 [ 34]: d67d0d228e37ecf9 +Block 0012 [ 35]: a2af9cf396be30e5 +Block 0012 [ 36]: 5f9c37739225a9f6 +Block 0012 [ 37]: 1622955d4a9a1422 +Block 0012 [ 38]: 05813a48687001ac +Block 0012 [ 39]: 29b364a9d8d6ae47 +Block 0012 [ 40]: c669633534f43bee +Block 0012 [ 41]: 44cfaee91755b969 +Block 0012 [ 42]: b438bfa944ef8f40 +Block 0012 [ 43]: 8d70530a6dd56e35 +Block 0012 [ 44]: 400f2ca1ed882bc7 +Block 0012 [ 45]: 160924cb0e833079 +Block 0012 [ 46]: 35a0cba772432178 +Block 0012 [ 47]: 0c854eeba328e0af +Block 0012 [ 48]: ed795385b6c8c33d +Block 0012 [ 49]: 99e486b31d520a75 +Block 0012 [ 50]: 1b5b830b450e4c3b +Block 0012 [ 51]: 93d51f5a82abbfce +Block 0012 [ 52]: 1bc16f482ff354bb +Block 0012 [ 53]: 757533f073cc215d +Block 0012 [ 54]: d408a1d75467d7b5 +Block 0012 [ 55]: 17e3c3b05d2def65 +Block 0012 [ 56]: eb8227aaf6789f99 +Block 0012 [ 57]: 59ad64f49eb5e25e +Block 0012 [ 58]: f6388f3df1ffa208 +Block 0012 [ 59]: b538d46a9f9f5615 +Block 0012 [ 60]: d7fadc7f0d1a1a9b +Block 0012 [ 61]: cc5653b41856d599 +Block 0012 [ 62]: 2eb0cb645a22bc9f +Block 0012 [ 63]: a604231af8395b0a +Block 0012 [ 64]: a280f5b5784bb713 +Block 0012 [ 65]: 8127d0070d705591 +Block 0012 [ 66]: 9d027a04414ff63b +Block 0012 [ 67]: c18b91df73f8b2ee +Block 0012 [ 68]: baba58a0614a8348 +Block 0012 [ 69]: fa0979b12baca497 +Block 0012 [ 70]: 488e2446c1ace4eb +Block 0012 [ 71]: 61b55bd7789e6757 +Block 0012 [ 72]: a3792ee1291d3d19 +Block 0012 [ 73]: ec996ff15540cb7f +Block 0012 [ 74]: 846eb47bb5500c0a +Block 0012 [ 75]: 63004d98c3fa85ad +Block 0012 [ 76]: d5e0c488c883d3a5 +Block 0012 [ 77]: e17c041222078902 +Block 0012 [ 78]: 5229cef32a4a309d +Block 0012 [ 79]: ff7e6b193154b239 +Block 0012 [ 80]: 50b448deb704b282 +Block 0012 [ 81]: fdf2757c71dd05fe +Block 0012 [ 82]: 798ce5f0123757e3 +Block 0012 [ 83]: 2ee64751ff269375 +Block 0012 [ 84]: 07b502f310eeb614 +Block 0012 [ 85]: 5a2921f9d24871da +Block 0012 [ 86]: a84d011edf032722 +Block 0012 [ 87]: a06da58fec671444 +Block 0012 [ 88]: 7b29541f047f8c39 +Block 0012 [ 89]: f272e37908f33227 +Block 0012 [ 90]: 32fd9dccac14f94e +Block 0012 [ 91]: 472efa6203e12101 +Block 0012 [ 92]: cac17d5f64192468 +Block 0012 [ 93]: 59ef34af8d1d42a7 +Block 0012 [ 94]: 875aff50e380c04a +Block 0012 [ 95]: 2ab6fe1d9aea14e8 +Block 0012 [ 96]: c687fa35d4bf9769 +Block 0012 [ 97]: 5be39abfa75b0e19 +Block 0012 [ 98]: ba5f78e7bf0c55ad +Block 0012 [ 99]: 3cebbe87e128539a +Block 0012 [100]: 0919a876f25bc820 +Block 0012 [101]: 6c9791f13fbbca50 +Block 0012 [102]: 3f74e510198bfc60 +Block 0012 [103]: f1aa13bc480aaa8c +Block 0012 [104]: 973b47716c2abba4 +Block 0012 [105]: 471cc7d2ca3eb89e +Block 0012 [106]: 8455ba5c570cd648 +Block 0012 [107]: e3bb3806a7479560 +Block 0012 [108]: 7d4cab7697e464b0 +Block 0012 [109]: 6c0ca3ec57564285 +Block 0012 [110]: 3267684183405f26 +Block 0012 [111]: 498afc2bc754e598 +Block 0012 [112]: 55076940aea93c2d +Block 0012 [113]: c63498bc724b3e1c +Block 0012 [114]: 50286619f7262a6f +Block 0012 [115]: 7984fb064e978bfc +Block 0012 [116]: 336490a1908c9a5b +Block 0012 [117]: f09f3b5b9959b3b7 +Block 0012 [118]: 04eceef263776576 +Block 0012 [119]: c7c191df82ea3c6a +Block 0012 [120]: 5b752037136cbc1c +Block 0012 [121]: 551ebaf941eec52c +Block 0012 [122]: 4d83b34b970f4d4f +Block 0012 [123]: 2a3e438748d1dc29 +Block 0012 [124]: c5ef48e4d9a7f09b +Block 0012 [125]: 762f8a841324bd19 +Block 0012 [126]: 65bec05883e5886e +Block 0012 [127]: b2fc97d678dbd986 +Block 0013 [ 0]: f75d1354c7eff19d +Block 0013 [ 1]: f5fd92f820842d7c +Block 0013 [ 2]: a711022a884ef6a1 +Block 0013 [ 3]: 796eb5ae4cebbf72 +Block 0013 [ 4]: 34f4edb4b0bb102a +Block 0013 [ 5]: 527c17ebdfc0c883 +Block 0013 [ 6]: bac872ffd4a899e9 +Block 0013 [ 7]: 0522808bceae9ae7 +Block 0013 [ 8]: eb3916bea08873f3 +Block 0013 [ 9]: b760bfb7537a57fa +Block 0013 [ 10]: 23d02fe031ecd3b5 +Block 0013 [ 11]: e400bae4a51546a9 +Block 0013 [ 12]: 49809cc34eecfd88 +Block 0013 [ 13]: e448e83b2b95201f +Block 0013 [ 14]: 2dc1a9d3a9c51942 +Block 0013 [ 15]: 8fef158e528ff970 +Block 0013 [ 16]: d661aadbbce68680 +Block 0013 [ 17]: ea34db317a216dd2 +Block 0013 [ 18]: 587895e1bf64fb03 +Block 0013 [ 19]: 64a9ed9c8bda7ab4 +Block 0013 [ 20]: 740cefd8d01b7666 +Block 0013 [ 21]: 4b6789a28b65f286 +Block 0013 [ 22]: f76c5b55c95c36f9 +Block 0013 [ 23]: 53f061c978252730 +Block 0013 [ 24]: 16a8ffa2013f1ff2 +Block 0013 [ 25]: 10ebd23ff30f48a2 +Block 0013 [ 26]: 3218fed20a63abf3 +Block 0013 [ 27]: e963d15f8d882329 +Block 0013 [ 28]: d26c43ad40e39071 +Block 0013 [ 29]: e6bb387045d95f5e +Block 0013 [ 30]: 9f68984830dd0c41 +Block 0013 [ 31]: 50c0a501f586171a +Block 0013 [ 32]: 015ae6072d8b2cba +Block 0013 [ 33]: b4141c1309479d7a +Block 0013 [ 34]: 120fc0ddf04bf858 +Block 0013 [ 35]: e3c3b1d547f1fbc2 +Block 0013 [ 36]: 3f440891de34519c +Block 0013 [ 37]: 859a4ece024def20 +Block 0013 [ 38]: b5f5a36371af5e5f +Block 0013 [ 39]: 3f5240a23a119f8c +Block 0013 [ 40]: 1ad71f0a68b88ca8 +Block 0013 [ 41]: b86e1a786107d5c8 +Block 0013 [ 42]: 01753f0f078fd87d +Block 0013 [ 43]: db2d2c4971651e47 +Block 0013 [ 44]: e47a46551a5218d7 +Block 0013 [ 45]: 8e2a4bec6d4106ae +Block 0013 [ 46]: 2e4c7722d94c4d90 +Block 0013 [ 47]: dffa15c8668c5cfd +Block 0013 [ 48]: 8ae2b1e76e12b127 +Block 0013 [ 49]: 49a5545f357b871b +Block 0013 [ 50]: 55aeb2fb9171edec +Block 0013 [ 51]: 1231e0a504d2971e +Block 0013 [ 52]: 84eac2f928b0a9d7 +Block 0013 [ 53]: fd1663ff5d624cff +Block 0013 [ 54]: e43cd597b2e3bddd +Block 0013 [ 55]: 7f1b719416fe0e8b +Block 0013 [ 56]: 3ae44722630c4674 +Block 0013 [ 57]: 465dcfb6ac8ce226 +Block 0013 [ 58]: ebd6211d53806927 +Block 0013 [ 59]: dd0cba9b6ee34124 +Block 0013 [ 60]: c77893c04e5e94e0 +Block 0013 [ 61]: 84acbc610447e84d +Block 0013 [ 62]: d133ad166027d506 +Block 0013 [ 63]: 51ea6c487d52417c +Block 0013 [ 64]: 5b13f5e040466e87 +Block 0013 [ 65]: 5bd01c7053fcf695 +Block 0013 [ 66]: dc6959bdff3c7319 +Block 0013 [ 67]: e07a1be4b5c6bf3a +Block 0013 [ 68]: f0a93277edf0c0fe +Block 0013 [ 69]: b2868562b862b79c +Block 0013 [ 70]: a75ec6c9f1625a7e +Block 0013 [ 71]: a916ca4fec36d981 +Block 0013 [ 72]: 7a7ef1190665727e +Block 0013 [ 73]: c8f525083c5e2f46 +Block 0013 [ 74]: 3236e7db95f7edba +Block 0013 [ 75]: e14e241dcb7d0a5f +Block 0013 [ 76]: 052ee041aa00b158 +Block 0013 [ 77]: aa201a671fecd938 +Block 0013 [ 78]: 5d3255300f8debe0 +Block 0013 [ 79]: 1dbe7f19c75a9a1c +Block 0013 [ 80]: c584df9197af7e54 +Block 0013 [ 81]: cf170f2644304dff +Block 0013 [ 82]: 6608d6d6b6ea219f +Block 0013 [ 83]: a6b43893a8363c79 +Block 0013 [ 84]: 6af3db3e1a954246 +Block 0013 [ 85]: a8ab0b1f021db354 +Block 0013 [ 86]: 89d22a874897ce37 +Block 0013 [ 87]: 631a49f4a9227896 +Block 0013 [ 88]: 597052bc91749582 +Block 0013 [ 89]: f731597f0238a1e9 +Block 0013 [ 90]: 98cd65e35a8a9de7 +Block 0013 [ 91]: 34b7630d576bdab0 +Block 0013 [ 92]: ab6cbc4905e83f76 +Block 0013 [ 93]: 65063cddd2cd614f +Block 0013 [ 94]: 5c6cf191124f0ca8 +Block 0013 [ 95]: 1d3130a17463b667 +Block 0013 [ 96]: b5998c71dc07fb0c +Block 0013 [ 97]: 9b47c94dc9ff3346 +Block 0013 [ 98]: 96b2173e4523582c +Block 0013 [ 99]: f0809f5374eec4a6 +Block 0013 [100]: ddf0752aeaad2081 +Block 0013 [101]: 8c1fb3710eedcadb +Block 0013 [102]: 988382d33a7f7cd1 +Block 0013 [103]: 8e5e7ea83a32557f +Block 0013 [104]: 55e74a052f3ddf11 +Block 0013 [105]: c1061700ffde6f76 +Block 0013 [106]: 102873e597b7160b +Block 0013 [107]: 642bbdc433f89d4b +Block 0013 [108]: 48135512e4835333 +Block 0013 [109]: 2ff1ae6b4e916b1e +Block 0013 [110]: d28b18bb3a370a8c +Block 0013 [111]: 67b7e874386777f0 +Block 0013 [112]: 66b00fdb00abf17c +Block 0013 [113]: d3ceed959b096696 +Block 0013 [114]: d44bb11bde2609d3 +Block 0013 [115]: 1bce7a85faa938ba +Block 0013 [116]: 6d7ccb20622593cb +Block 0013 [117]: e35a6dcd4dafdb81 +Block 0013 [118]: 2a755a917cf7f449 +Block 0013 [119]: 88ffa8fdf6960caa +Block 0013 [120]: b4b74a1f5928c3c2 +Block 0013 [121]: 704dc3689cc7cc99 +Block 0013 [122]: 95388c99ba9e902f +Block 0013 [123]: 76ce0e7b84b21455 +Block 0013 [124]: af618d480e8cc3dd +Block 0013 [125]: e3d0d2c733f20c6e +Block 0013 [126]: 47aedb4b4130ed9c +Block 0013 [127]: 630a965da8802d51 +Block 0014 [ 0]: a461476242d7a59e +Block 0014 [ 1]: 793e7b824d249885 +Block 0014 [ 2]: 8b31bf1c5251fa4f +Block 0014 [ 3]: 8419da321623d533 +Block 0014 [ 4]: c4e7b053013901b4 +Block 0014 [ 5]: 968287121fe56806 +Block 0014 [ 6]: 01dd360820ab43cd +Block 0014 [ 7]: d9747eb7cb1ae162 +Block 0014 [ 8]: aa61246c0096cea4 +Block 0014 [ 9]: 184744ac0181d478 +Block 0014 [ 10]: d33b25b159cbad6d +Block 0014 [ 11]: 57dae905157b326c +Block 0014 [ 12]: d2dfb8667245f623 +Block 0014 [ 13]: 53c48207f3560823 +Block 0014 [ 14]: 463becfdfd0dc65f +Block 0014 [ 15]: 3478ccf1587fa3e6 +Block 0014 [ 16]: ed43411af9589a5f +Block 0014 [ 17]: 498ac28bddf50caa +Block 0014 [ 18]: fa10436f3b1d9768 +Block 0014 [ 19]: 9c44f3528091dfe5 +Block 0014 [ 20]: d0fcba297c327462 +Block 0014 [ 21]: ea24e68ccd7e5881 +Block 0014 [ 22]: b57b40034030946a +Block 0014 [ 23]: 50d76f6d5c6246a2 +Block 0014 [ 24]: 4dc5fe0132ace88c +Block 0014 [ 25]: 085b1be1857617f4 +Block 0014 [ 26]: 8f0834b6fd83ba12 +Block 0014 [ 27]: c94afed014cdc9ee +Block 0014 [ 28]: 889fe873e29786bd +Block 0014 [ 29]: 99fca3a0f55bcbf6 +Block 0014 [ 30]: db6fe5823ed66e32 +Block 0014 [ 31]: 2bd9fcf53c862b1a +Block 0014 [ 32]: ce81207a7f1acfa4 +Block 0014 [ 33]: 5d71bf5f5f5acc02 +Block 0014 [ 34]: 739fbc4887d79690 +Block 0014 [ 35]: 6f4a792cde2fd5cc +Block 0014 [ 36]: d24cbfa7ff261450 +Block 0014 [ 37]: 360bd520e4115330 +Block 0014 [ 38]: fdea52ae2de55082 +Block 0014 [ 39]: 78f9158b431687a0 +Block 0014 [ 40]: 7133a4a752cf05a1 +Block 0014 [ 41]: 01c66f39cb89826e +Block 0014 [ 42]: 4ae0f9368cc3ad78 +Block 0014 [ 43]: b3db2b553f9b03b9 +Block 0014 [ 44]: 1469154cc172f9d1 +Block 0014 [ 45]: e1b64f1c6626069c +Block 0014 [ 46]: 879aea87b0a3d20b +Block 0014 [ 47]: 8455677d1bdc2c33 +Block 0014 [ 48]: e80237fe8e642e21 +Block 0014 [ 49]: 504e4b88eccfcc84 +Block 0014 [ 50]: 1fc697e8a26e91d5 +Block 0014 [ 51]: 9465a35e1648397c +Block 0014 [ 52]: 4f34578d6c381f62 +Block 0014 [ 53]: 25f545b54ff5ae63 +Block 0014 [ 54]: 5691ccb5637ad97d +Block 0014 [ 55]: caa0275684145e40 +Block 0014 [ 56]: 641968a1daa8cb41 +Block 0014 [ 57]: fb0ff3c67859c362 +Block 0014 [ 58]: dd0bca636e098eb6 +Block 0014 [ 59]: 25c5ea8ff9947ae7 +Block 0014 [ 60]: fe2a2e75cdde7486 +Block 0014 [ 61]: 9786b6dcda3a8002 +Block 0014 [ 62]: e33401fa5a304bcf +Block 0014 [ 63]: 17cdb217f104d8ed +Block 0014 [ 64]: 529ec3b59e120728 +Block 0014 [ 65]: e0f25bcbedbdeb14 +Block 0014 [ 66]: e87e2a611e9762c3 +Block 0014 [ 67]: 903b6e004f8e2466 +Block 0014 [ 68]: e769cc9b54e7fc0d +Block 0014 [ 69]: 88ba247a1459c620 +Block 0014 [ 70]: 8296682d67304ca4 +Block 0014 [ 71]: a197e9f9c9c2d027 +Block 0014 [ 72]: 70d6e5f97e4c08c3 +Block 0014 [ 73]: 1282284c67db0021 +Block 0014 [ 74]: 257e4df3e88791da +Block 0014 [ 75]: ea369d60cbbfc3b0 +Block 0014 [ 76]: 899327fe7af1696c +Block 0014 [ 77]: e3eb9f568072d39c +Block 0014 [ 78]: 61c6e4bae139da6e +Block 0014 [ 79]: 82d73a7b518a484a +Block 0014 [ 80]: ae1daa5055c3d728 +Block 0014 [ 81]: 181eb0a5605fe5f2 +Block 0014 [ 82]: 4adc3042c5c248f6 +Block 0014 [ 83]: 75720e34a8c4f9c1 +Block 0014 [ 84]: 184a961bbedf8d78 +Block 0014 [ 85]: 480f01987dc39470 +Block 0014 [ 86]: e5288386e93dbaa8 +Block 0014 [ 87]: 24a2631823663560 +Block 0014 [ 88]: 09a52a4f0522d21d +Block 0014 [ 89]: 685b6edb99314395 +Block 0014 [ 90]: 7caf3c4dfea8f03d +Block 0014 [ 91]: 4ba45b9e8df91dad +Block 0014 [ 92]: a0954b2eee1375a2 +Block 0014 [ 93]: 766c3dd0e8c84041 +Block 0014 [ 94]: 7d6854ff9c364cf3 +Block 0014 [ 95]: c3c18738f3b47743 +Block 0014 [ 96]: 73c732161b75d23a +Block 0014 [ 97]: 8b72fa77eaff6848 +Block 0014 [ 98]: 97f4169cdbbcc478 +Block 0014 [ 99]: cc08d746666366f8 +Block 0014 [100]: b5226b34853ccf1a +Block 0014 [101]: a463a634b3869611 +Block 0014 [102]: 2444d5021c683565 +Block 0014 [103]: 6fcbaa410bb39f3a +Block 0014 [104]: 3238537afdc9c134 +Block 0014 [105]: 58ed9109edbaceaf +Block 0014 [106]: a6355dad9a1b2ed3 +Block 0014 [107]: 710d861bd7de4875 +Block 0014 [108]: 9e8eec1be822f14b +Block 0014 [109]: c30a549d276e50a4 +Block 0014 [110]: 57038585a5eb2ceb +Block 0014 [111]: 97502c4b617e6d93 +Block 0014 [112]: e462aac2eab81993 +Block 0014 [113]: e35d06c7c51c8dc9 +Block 0014 [114]: 396e9f2aa5e74cde +Block 0014 [115]: c908d13b62e112fb +Block 0014 [116]: 35aa4755a42ba0fb +Block 0014 [117]: f9426c2be943b5a9 +Block 0014 [118]: e2931431f1fe9dd7 +Block 0014 [119]: 0a6f56e4e9558739 +Block 0014 [120]: 8ab84a163f6eaa0c +Block 0014 [121]: 42a0f15d6a6efb41 +Block 0014 [122]: 6d28afefc7dcfe58 +Block 0014 [123]: 4901be47a8c58453 +Block 0014 [124]: 73ec4fc7c75e84ef +Block 0014 [125]: 2920efbb06d8e325 +Block 0014 [126]: a6ecd7e4ef96dc05 +Block 0014 [127]: 1d0a9b2dc6418672 +Block 0015 [ 0]: fe7dd39a618e71e5 +Block 0015 [ 1]: 01c07c1b068c39c5 +Block 0015 [ 2]: b2a41ba7002b15b5 +Block 0015 [ 3]: ae477e64c1faa49b +Block 0015 [ 4]: f3dcfd9e46024f3c +Block 0015 [ 5]: 0e600176e0542726 +Block 0015 [ 6]: 56e014096bbfcee2 +Block 0015 [ 7]: 39844d9641076e23 +Block 0015 [ 8]: 8101229338fa9230 +Block 0015 [ 9]: fff04a34e83a1d04 +Block 0015 [ 10]: 0b76c8b60d1bddfc +Block 0015 [ 11]: daca86bb2aa461a4 +Block 0015 [ 12]: ccad5b535053995c +Block 0015 [ 13]: dc086420ea32e2c4 +Block 0015 [ 14]: 3e5f7db426829fa4 +Block 0015 [ 15]: 028179b0a2202f2a +Block 0015 [ 16]: 84664b21b0bed003 +Block 0015 [ 17]: 6b0b075c2720f673 +Block 0015 [ 18]: 3ab59f67edf1a91f +Block 0015 [ 19]: 49a00e47fcea9c9a +Block 0015 [ 20]: b0af9ca77eef6bd7 +Block 0015 [ 21]: 3ff02605e750fb68 +Block 0015 [ 22]: 6f888572cf623bde +Block 0015 [ 23]: 90792eba7c50bc6c +Block 0015 [ 24]: f76e260b80eab35c +Block 0015 [ 25]: c454977d76d885bb +Block 0015 [ 26]: 5ab8d0754e3af5db +Block 0015 [ 27]: a64a547249b6c6dc +Block 0015 [ 28]: d0ebccff364df8dc +Block 0015 [ 29]: b13f9c1b1bd1d3b6 +Block 0015 [ 30]: 134227e11312862a +Block 0015 [ 31]: 81a635d0de25be20 +Block 0015 [ 32]: 2bb3ff35c40ea726 +Block 0015 [ 33]: f84a0782feabb913 +Block 0015 [ 34]: 28d4f1889a890868 +Block 0015 [ 35]: d01673b6e235fc51 +Block 0015 [ 36]: 42c447fef3385aa3 +Block 0015 [ 37]: 50ca4b017f0bdecf +Block 0015 [ 38]: 9ac9f0ddccd1e52d +Block 0015 [ 39]: 21f8411108200f80 +Block 0015 [ 40]: 69e6d3d7b2c7a786 +Block 0015 [ 41]: ec8cf819bb02bbcb +Block 0015 [ 42]: 1fb8e462e6c4ff72 +Block 0015 [ 43]: cc89eb4748626454 +Block 0015 [ 44]: 6f0230ec870c485a +Block 0015 [ 45]: e9d1c047f8322b0d +Block 0015 [ 46]: 86b194b1353a70ba +Block 0015 [ 47]: 43d1307e773654bf +Block 0015 [ 48]: f47b4224fcb3488a +Block 0015 [ 49]: d7eee8fd41f4ba01 +Block 0015 [ 50]: a8fa5f257bab0e5e +Block 0015 [ 51]: f3931c2abded9a59 +Block 0015 [ 52]: e41fbeda83d18a71 +Block 0015 [ 53]: bab3d48f7589b45f +Block 0015 [ 54]: 7b9ed122cdc05112 +Block 0015 [ 55]: 660ee625e579e10a +Block 0015 [ 56]: 9a8420edb4efc070 +Block 0015 [ 57]: 71cdd65ab37df1aa +Block 0015 [ 58]: 59ec57a4d785ec5b +Block 0015 [ 59]: 56de28c195a6c9c1 +Block 0015 [ 60]: 38b77aa786eb4274 +Block 0015 [ 61]: 0339ba8813a04d23 +Block 0015 [ 62]: 5ff04478b159e5a8 +Block 0015 [ 63]: bb59a232c2fb822f +Block 0015 [ 64]: ce9b98e4d5505d4e +Block 0015 [ 65]: d94474d5044efad8 +Block 0015 [ 66]: dd7581fca67e6b47 +Block 0015 [ 67]: e5cf5ee7a1d303a6 +Block 0015 [ 68]: de54eb260e28d75d +Block 0015 [ 69]: 8dbc69487a475fbd +Block 0015 [ 70]: 2e8038ba499f6dbb +Block 0015 [ 71]: 322093a75c524f72 +Block 0015 [ 72]: aa559fe61ea1a37e +Block 0015 [ 73]: cb547e6a9106e64c +Block 0015 [ 74]: 67111f017926588a +Block 0015 [ 75]: 0e71f13aaedca44c +Block 0015 [ 76]: 885341674bd4987a +Block 0015 [ 77]: e0c5efe697c9b140 +Block 0015 [ 78]: 324ea9daaa3b6ba0 +Block 0015 [ 79]: 545898fe29df7e96 +Block 0015 [ 80]: 18ca585d12d3c743 +Block 0015 [ 81]: 04cdfe6bdd202450 +Block 0015 [ 82]: 3e6104bf852b8a6a +Block 0015 [ 83]: 08544bdc6f38ba5d +Block 0015 [ 84]: 7e49bfeec5d001f2 +Block 0015 [ 85]: 3906196d6e3c53ab +Block 0015 [ 86]: 4778aeb472a70184 +Block 0015 [ 87]: 8cc7e9a207cd88f0 +Block 0015 [ 88]: c1e1aed42d388dd7 +Block 0015 [ 89]: 93228c878bd09ded +Block 0015 [ 90]: b3e312be518f5ca0 +Block 0015 [ 91]: c63977ba692aacfe +Block 0015 [ 92]: 18ef5824532327a3 +Block 0015 [ 93]: daa17d2619b74141 +Block 0015 [ 94]: 3524418eb248f814 +Block 0015 [ 95]: 262e4eab5b257010 +Block 0015 [ 96]: aa45cdd8e749ae80 +Block 0015 [ 97]: 46dd2149ce337b8f +Block 0015 [ 98]: 425c1c35463031a0 +Block 0015 [ 99]: b1747326431aa01b +Block 0015 [100]: 07b504f49c05fc9e +Block 0015 [101]: fe8fc4dad3d269d8 +Block 0015 [102]: f18aff22d8f09960 +Block 0015 [103]: 5247cf1a92ba2294 +Block 0015 [104]: 5a0cc7c71bfd6734 +Block 0015 [105]: 0c926b5deed53fb9 +Block 0015 [106]: 6be5ac8ee2c31367 +Block 0015 [107]: cf808455894c338c +Block 0015 [108]: af04367baa4bba7c +Block 0015 [109]: 26397d26480e815b +Block 0015 [110]: a58ca838afb9ac8b +Block 0015 [111]: 75413a501ff0a6c0 +Block 0015 [112]: 1fac4f16e8ab214f +Block 0015 [113]: 19be611a230ce4f2 +Block 0015 [114]: 6530a63352ee1b61 +Block 0015 [115]: 00dcabf53a8e84ad +Block 0015 [116]: 4087c0f326283555 +Block 0015 [117]: 791eafa5a317015e +Block 0015 [118]: ef0f3079c2280b9d +Block 0015 [119]: 1035069b01d04a74 +Block 0015 [120]: 7fc066ca3a0df359 +Block 0015 [121]: 2c7e872cae3aeb64 +Block 0015 [122]: ff9d282ac9e3a146 +Block 0015 [123]: beffa43e452ce374 +Block 0015 [124]: a0f34d378d418f73 +Block 0015 [125]: 5790929a42de0b61 +Block 0015 [126]: 5b23ec6f6be2aa90 +Block 0015 [127]: d04c5f31efbeccc4 +Block 0016 [ 0]: ee4284bd7e01037d +Block 0016 [ 1]: f6725c9d044b3582 +Block 0016 [ 2]: efc6d8945d76028d +Block 0016 [ 3]: 29e9791ebfed5ec9 +Block 0016 [ 4]: 4c4d74485e886bb9 +Block 0016 [ 5]: 7a227580ea77203c +Block 0016 [ 6]: 8b8a892a45ce7773 +Block 0016 [ 7]: f552f61ef6b9987f +Block 0016 [ 8]: b0be9423022aa3c4 +Block 0016 [ 9]: a581a3a65719e8ed +Block 0016 [ 10]: 0ed1efa5c7b9cdb3 +Block 0016 [ 11]: 459d8670734b7440 +Block 0016 [ 12]: 0651d5c945182f07 +Block 0016 [ 13]: bced7850cfe86416 +Block 0016 [ 14]: e0c4f34534f1c63a +Block 0016 [ 15]: 2c6cd7aa929d8645 +Block 0016 [ 16]: dadf71c6c32421f0 +Block 0016 [ 17]: f4e8a2bdc76f0d3f +Block 0016 [ 18]: 418b1053a3257ffa +Block 0016 [ 19]: 012e877fde3e24c9 +Block 0016 [ 20]: 14d59b7c02a2e97c +Block 0016 [ 21]: ee8c0895a34f08b8 +Block 0016 [ 22]: 71cf5cadb05b7782 +Block 0016 [ 23]: 6a5c0717ec891466 +Block 0016 [ 24]: 9c1c845254e692f3 +Block 0016 [ 25]: f0a44a90e65aee66 +Block 0016 [ 26]: e222177e3bdec9bc +Block 0016 [ 27]: a5fec919612d165c +Block 0016 [ 28]: 020201b7a839067b +Block 0016 [ 29]: 84e786fba4a60afb +Block 0016 [ 30]: f7b1f4f6feb1c1c3 +Block 0016 [ 31]: 1c85f25c69ef9fd7 +Block 0016 [ 32]: 285122b6579f7056 +Block 0016 [ 33]: a9e1eec26a14de95 +Block 0016 [ 34]: fda85512de5464d0 +Block 0016 [ 35]: 71e076da7e3910bd +Block 0016 [ 36]: d30baaa4b044367a +Block 0016 [ 37]: 0b504eb61b0d6c26 +Block 0016 [ 38]: d3c30d0d974ed9af +Block 0016 [ 39]: 282158fd3005a366 +Block 0016 [ 40]: eeacca7d7d8c1519 +Block 0016 [ 41]: 4511c26cd8af6099 +Block 0016 [ 42]: 16adfdb6ba659689 +Block 0016 [ 43]: 3186aed45d7aeeb2 +Block 0016 [ 44]: 247da487eba794b7 +Block 0016 [ 45]: 584c74265acf4b10 +Block 0016 [ 46]: 93913d9a23a4fc60 +Block 0016 [ 47]: 4703bb124037e1a5 +Block 0016 [ 48]: 37239d7ace81e41d +Block 0016 [ 49]: ba7923d2d1abf6aa +Block 0016 [ 50]: 81cff74cc3030c46 +Block 0016 [ 51]: 80781fbda30f2c67 +Block 0016 [ 52]: 1072611bab0d1c25 +Block 0016 [ 53]: 6dafe937e223ffd4 +Block 0016 [ 54]: 0c58c5ecde11f220 +Block 0016 [ 55]: 808b5df6b010f5f0 +Block 0016 [ 56]: 4d2c7c97deb8bb3a +Block 0016 [ 57]: 297865d69ab1b78f +Block 0016 [ 58]: 15ef9ca22dcc25c2 +Block 0016 [ 59]: 8f01f2fbec1e1cda +Block 0016 [ 60]: a9db3a3d7e817b2a +Block 0016 [ 61]: 4f2f469445248c76 +Block 0016 [ 62]: 60fdb8c20980baa8 +Block 0016 [ 63]: e0af63046dfb4ec4 +Block 0016 [ 64]: 3d416ab4bed81fcb +Block 0016 [ 65]: da1ff08a91bab1ff +Block 0016 [ 66]: 7ddb3de6427f6dc2 +Block 0016 [ 67]: 02ac68f8d7b59827 +Block 0016 [ 68]: 2f8b56ade21b2a31 +Block 0016 [ 69]: 5479394c6e8c51c4 +Block 0016 [ 70]: beb501097c9b856e +Block 0016 [ 71]: f5b7e186fd0a6d74 +Block 0016 [ 72]: 8632eceb3c644fe5 +Block 0016 [ 73]: 578be5498c159f6d +Block 0016 [ 74]: b92cbafdd2bd1bd7 +Block 0016 [ 75]: cc7bc5fe2e10e8eb +Block 0016 [ 76]: 472df28e66c5e218 +Block 0016 [ 77]: 64494c08516ca24c +Block 0016 [ 78]: 29919b2152b46616 +Block 0016 [ 79]: c98bf2c8d5a59d7b +Block 0016 [ 80]: 7b4d78ce47083d2a +Block 0016 [ 81]: 2150d9fb4190dd49 +Block 0016 [ 82]: f4787d0cc450ddad +Block 0016 [ 83]: bca37f309b16b787 +Block 0016 [ 84]: 77f29e0273601339 +Block 0016 [ 85]: 5512896f2d009278 +Block 0016 [ 86]: ef63fc2dc268d2b3 +Block 0016 [ 87]: 2a796379964010fc +Block 0016 [ 88]: 6a7f8c157f4907f4 +Block 0016 [ 89]: 4a7f538aa5761182 +Block 0016 [ 90]: 29004d473d72bee3 +Block 0016 [ 91]: 834d5222c0011172 +Block 0016 [ 92]: bd2606194d2d148b +Block 0016 [ 93]: 38a5b0decd299c4f +Block 0016 [ 94]: abf149883113a697 +Block 0016 [ 95]: 34e170f49d93c917 +Block 0016 [ 96]: 53fc696fcc977325 +Block 0016 [ 97]: 3e28ab82d63594f6 +Block 0016 [ 98]: 915a3ff472e74518 +Block 0016 [ 99]: 69a618df6f6f84ae +Block 0016 [100]: c5d813be21361d83 +Block 0016 [101]: 03ac0914b557c176 +Block 0016 [102]: 4bdd25ac2aaa20fe +Block 0016 [103]: a3817cab3aa0e229 +Block 0016 [104]: 3155f6e8898d3626 +Block 0016 [105]: edf42f9307673e12 +Block 0016 [106]: e14daae30223ed73 +Block 0016 [107]: 82613039e7c17acd +Block 0016 [108]: 2b67bfa4ba3d75f2 +Block 0016 [109]: ce95d235cd915890 +Block 0016 [110]: 75624ef53a39d48b +Block 0016 [111]: ad0303b31652499e +Block 0016 [112]: e351b76ad04c39d7 +Block 0016 [113]: a9aa8650ea6734a5 +Block 0016 [114]: 527b776775eab895 +Block 0016 [115]: c41ab8f180e85ccd +Block 0016 [116]: 8ad4ef151659d1da +Block 0016 [117]: d94e5cf2654d7e64 +Block 0016 [118]: 7269fa6ebe4d0148 +Block 0016 [119]: c4f576c71186fe07 +Block 0016 [120]: 8ddce8b24b0b5bfb +Block 0016 [121]: 821a74dbd82c5a16 +Block 0016 [122]: 9695f6ac80338bfb +Block 0016 [123]: 728dee32c6c2475e +Block 0016 [124]: 7bac74994b5bacff +Block 0016 [125]: 3da6eea76bd3692f +Block 0016 [126]: 23cb9f7fa694eaa1 +Block 0016 [127]: cfe06a085d267a99 +Block 0017 [ 0]: f356666f01196720 +Block 0017 [ 1]: d5b86a80e04f9357 +Block 0017 [ 2]: 94511da0aa428e7c +Block 0017 [ 3]: 3b7adcefeb2b6f65 +Block 0017 [ 4]: 4d5283d8063472cc +Block 0017 [ 5]: 890aedd9f9a726b1 +Block 0017 [ 6]: 2711463e6bc5421a +Block 0017 [ 7]: 19923254aef59f6c +Block 0017 [ 8]: 559d243da7765ab0 +Block 0017 [ 9]: 59492428d9c4c089 +Block 0017 [ 10]: 669da2bd92b8c392 +Block 0017 [ 11]: 0d84cfb304ed2cb2 +Block 0017 [ 12]: 9183922fe8dc1321 +Block 0017 [ 13]: c9ddad6110958678 +Block 0017 [ 14]: 8c4ec6de6ef52270 +Block 0017 [ 15]: 158509f02ed33558 +Block 0017 [ 16]: 15f62a574d357bff +Block 0017 [ 17]: 9fc31aa7b10bdb39 +Block 0017 [ 18]: 14acd0af756da166 +Block 0017 [ 19]: 2ecf2d49440a608d +Block 0017 [ 20]: b5056c5192f93b7b +Block 0017 [ 21]: 8e19ba7cdd948025 +Block 0017 [ 22]: 34fbc0f77ec37398 +Block 0017 [ 23]: 03bb7138974402f0 +Block 0017 [ 24]: 9ad98d6af59e2f2e +Block 0017 [ 25]: e1bddfddc591121e +Block 0017 [ 26]: b2f16e8b68e6d9c1 +Block 0017 [ 27]: 49a32b416ceeae94 +Block 0017 [ 28]: b3ad11b80ce3df7e +Block 0017 [ 29]: 3ec29abc1f218b1e +Block 0017 [ 30]: fb3d6da7508f17bd +Block 0017 [ 31]: c790abf197c4c647 +Block 0017 [ 32]: 2a1110d48162fcd4 +Block 0017 [ 33]: 43f22c7b2d34617e +Block 0017 [ 34]: ebf0db27d136245d +Block 0017 [ 35]: 55aeb56679c1f189 +Block 0017 [ 36]: 8714d1a5bb55b389 +Block 0017 [ 37]: 075c04ac4d453c9a +Block 0017 [ 38]: 24c791b59a1a8330 +Block 0017 [ 39]: 8b62655e797d9396 +Block 0017 [ 40]: 162b218ffe8a7c58 +Block 0017 [ 41]: 51003cf43cc27c45 +Block 0017 [ 42]: 40cc3394355f3e30 +Block 0017 [ 43]: 91779f6973a7a103 +Block 0017 [ 44]: 15c5320b25394348 +Block 0017 [ 45]: 0f10820130a04127 +Block 0017 [ 46]: 319487b379c5f1fa +Block 0017 [ 47]: f9a7af31b5e73c6b +Block 0017 [ 48]: 127d7dd8a8a1c85c +Block 0017 [ 49]: acb5ef7d8732298c +Block 0017 [ 50]: 08332232ae0382e5 +Block 0017 [ 51]: 51250582ebb94ee8 +Block 0017 [ 52]: f84fd3e861577bbd +Block 0017 [ 53]: 6b26fb58367feb95 +Block 0017 [ 54]: df9f3d32ba3336ee +Block 0017 [ 55]: 5155ebd220efb0d2 +Block 0017 [ 56]: e178c553b64a81a2 +Block 0017 [ 57]: 098ba741f03ad24a +Block 0017 [ 58]: c16f280067cc2729 +Block 0017 [ 59]: 574811b3d231a4df +Block 0017 [ 60]: b7c1e511893af569 +Block 0017 [ 61]: 3b29211f0bfdcc03 +Block 0017 [ 62]: b6fdcdb1dfb27df4 +Block 0017 [ 63]: 2f0623a423bf9f9b +Block 0017 [ 64]: 00c97f0fa03bbdcd +Block 0017 [ 65]: 8e59dac12903971c +Block 0017 [ 66]: c71492c17ca1818d +Block 0017 [ 67]: 848aa69aa03ae0c8 +Block 0017 [ 68]: 8ca690303a718a1a +Block 0017 [ 69]: 7da40f323bc9ee34 +Block 0017 [ 70]: 41ea847cc9b2bd76 +Block 0017 [ 71]: 25a49ea6de3f0c52 +Block 0017 [ 72]: cf4d93c48f1e35a8 +Block 0017 [ 73]: 585128d5942b0376 +Block 0017 [ 74]: ab55eb453653dd3e +Block 0017 [ 75]: 2c12f55af3e1917f +Block 0017 [ 76]: 9ee6da77a8e82cec +Block 0017 [ 77]: 4bd6ddf3cf83631a +Block 0017 [ 78]: 30e4321586605141 +Block 0017 [ 79]: bed6fc4f0aa92e30 +Block 0017 [ 80]: 03c788844da03ad5 +Block 0017 [ 81]: 6de6b8a439c2334a +Block 0017 [ 82]: 334cb662ea6a20c0 +Block 0017 [ 83]: 261c2af8bb1cac22 +Block 0017 [ 84]: ea99a5a644b0d2c7 +Block 0017 [ 85]: 5b26ae0f91bf750c +Block 0017 [ 86]: d8fca02a32b73e10 +Block 0017 [ 87]: 6565907dcf1117c1 +Block 0017 [ 88]: 85d1ea8df3a60d46 +Block 0017 [ 89]: 5d19125acf3da900 +Block 0017 [ 90]: 9efb704db3d51276 +Block 0017 [ 91]: af54ed8281a78e58 +Block 0017 [ 92]: beb7449f1abb2e44 +Block 0017 [ 93]: f75330d91676f212 +Block 0017 [ 94]: a94814d6ebced6fd +Block 0017 [ 95]: 897d9e15c5dfdcb4 +Block 0017 [ 96]: d8e34107028ad021 +Block 0017 [ 97]: 293ebcd4466abd1d +Block 0017 [ 98]: 7254ba81b6ba11ad +Block 0017 [ 99]: 0390db567a96a4d9 +Block 0017 [100]: ccfe39f1c384118c +Block 0017 [101]: 43267d510015e12b +Block 0017 [102]: 280f4476d6f3ebd9 +Block 0017 [103]: 8760238c8360fcbf +Block 0017 [104]: 035d4cecf2bb1f1d +Block 0017 [105]: c142fe72cf22a6ae +Block 0017 [106]: 00ebf2d0e311b27e +Block 0017 [107]: 47798bfb775c7d54 +Block 0017 [108]: ce977fbfe5b65e34 +Block 0017 [109]: 92ff9b8cbe72c795 +Block 0017 [110]: a52f9937120521fa +Block 0017 [111]: 4584b9e83174b1e9 +Block 0017 [112]: dfe536bdd20cc1b4 +Block 0017 [113]: ecf8f4f29948ea49 +Block 0017 [114]: df7bc0f579ebb12a +Block 0017 [115]: a681fdb86e177244 +Block 0017 [116]: 79b17e4d1501eb36 +Block 0017 [117]: 0b690bd9f1abbcc1 +Block 0017 [118]: ecbc6a4e04ae26f1 +Block 0017 [119]: 779d3fcee066dac9 +Block 0017 [120]: f753cfc8cf14a180 +Block 0017 [121]: f80641ab303d1d0a +Block 0017 [122]: f6c8e8efda680da1 +Block 0017 [123]: 59c2c42e5080db17 +Block 0017 [124]: 2236f9288ec4ee14 +Block 0017 [125]: c55aa668a6c449be +Block 0017 [126]: 79d280f9c001c3da +Block 0017 [127]: 6f7e15d0071cc9b3 +Block 0018 [ 0]: 24c3e56d5f903fef +Block 0018 [ 1]: d1b0155e7ed77407 +Block 0018 [ 2]: 48027b4c6cf64f88 +Block 0018 [ 3]: 94c3af58d3faf91b +Block 0018 [ 4]: 74f92c253dca8e1c +Block 0018 [ 5]: 67b167f78d2d6020 +Block 0018 [ 6]: 0c7de09b37c02759 +Block 0018 [ 7]: 277affceef993cbf +Block 0018 [ 8]: c1995b671cded43b +Block 0018 [ 9]: dddad34e544c7881 +Block 0018 [ 10]: f4a3055714a6c8c7 +Block 0018 [ 11]: c0315efb62348bd2 +Block 0018 [ 12]: e6326929632dac14 +Block 0018 [ 13]: a6c25d68f8803e4b +Block 0018 [ 14]: 7acf39beabb63f94 +Block 0018 [ 15]: 2f83fce37c19e21c +Block 0018 [ 16]: 23ccecc2a8a38fb1 +Block 0018 [ 17]: fb91eb5c043d2716 +Block 0018 [ 18]: 43857050f463159a +Block 0018 [ 19]: e4690d9134bb6514 +Block 0018 [ 20]: 65871d3e136a8576 +Block 0018 [ 21]: 0941849804523512 +Block 0018 [ 22]: a76c754906d20fa3 +Block 0018 [ 23]: 720b4d043f954698 +Block 0018 [ 24]: e8e1b34b97efe5c6 +Block 0018 [ 25]: d65e0cafff3ca81b +Block 0018 [ 26]: 1015b96aff86a531 +Block 0018 [ 27]: 93db3f39dac63b89 +Block 0018 [ 28]: 27c64da54455bcf3 +Block 0018 [ 29]: fc07e831d5c9b636 +Block 0018 [ 30]: 7b32cf773c07e91a +Block 0018 [ 31]: eaaf151121b66a71 +Block 0018 [ 32]: 50734ccbd7fa7692 +Block 0018 [ 33]: 256941e161c2ca80 +Block 0018 [ 34]: d1b1558a980f6d5d +Block 0018 [ 35]: 70600d0b1c5f5a7c +Block 0018 [ 36]: 1889c20f14b6d47e +Block 0018 [ 37]: 5777eb45b6bc874d +Block 0018 [ 38]: 942a16b3b13eda53 +Block 0018 [ 39]: 0b03ac0435aa85ca +Block 0018 [ 40]: aad10114f5b3049d +Block 0018 [ 41]: 76a55e7d54f2b10c +Block 0018 [ 42]: f5965a11ddf92aa8 +Block 0018 [ 43]: 8b0f6ae29a2a6c7a +Block 0018 [ 44]: 135df7badfa08c89 +Block 0018 [ 45]: ea2401066fe560d4 +Block 0018 [ 46]: 562477e4bac2d2b8 +Block 0018 [ 47]: 3c71fb5ce80d6dc0 +Block 0018 [ 48]: fe7f4945d69e4cd8 +Block 0018 [ 49]: 04fee43cb4f3a04d +Block 0018 [ 50]: cfba36d25cc153f4 +Block 0018 [ 51]: d1463b7a0a975ab2 +Block 0018 [ 52]: 58dc72898c0d1d72 +Block 0018 [ 53]: c3334b968fe7170f +Block 0018 [ 54]: fd0741b983e69520 +Block 0018 [ 55]: 9b12d151bbd1836f +Block 0018 [ 56]: 7b9397a8e0fabde0 +Block 0018 [ 57]: beba98d7bda9bfee +Block 0018 [ 58]: 0d7395b3269cda03 +Block 0018 [ 59]: 32873a46cb76a56f +Block 0018 [ 60]: c3a4bce067ed614b +Block 0018 [ 61]: 240f6d3a4c6262b3 +Block 0018 [ 62]: 0d8cca9e57ad555b +Block 0018 [ 63]: abd6bfd9fea3bdb6 +Block 0018 [ 64]: cb82a692a45e3d10 +Block 0018 [ 65]: 91c6c5fddef8bdc6 +Block 0018 [ 66]: 50540941a55abb53 +Block 0018 [ 67]: 0fde1a645bd882cc +Block 0018 [ 68]: 82bb1379fa735cc9 +Block 0018 [ 69]: 592909a24cf2e71d +Block 0018 [ 70]: a4975ee76da39b0f +Block 0018 [ 71]: bc5eb397c2d15dd5 +Block 0018 [ 72]: 9ff9590633f36e98 +Block 0018 [ 73]: 6a4c0f97ab0100f7 +Block 0018 [ 74]: e2f2a364cd055c28 +Block 0018 [ 75]: 1082a32edba76a53 +Block 0018 [ 76]: 97bedd180d0ab0f2 +Block 0018 [ 77]: 841320c0656d5175 +Block 0018 [ 78]: e2bcd615276667ff +Block 0018 [ 79]: b6da9d70f45a817f +Block 0018 [ 80]: 05c1b04651e11c0a +Block 0018 [ 81]: b14db892c3cfcb2c +Block 0018 [ 82]: b127f0a55737c345 +Block 0018 [ 83]: ebfbd4f00fc01572 +Block 0018 [ 84]: 6e9f87e406f2f1e8 +Block 0018 [ 85]: 5385af9c9576c568 +Block 0018 [ 86]: 810ae26edb1dcf61 +Block 0018 [ 87]: 10a849c52efbefa6 +Block 0018 [ 88]: 34f45af18a0b340c +Block 0018 [ 89]: 1954ce64d34fee83 +Block 0018 [ 90]: e93701e0e0cbbd56 +Block 0018 [ 91]: ec8dea4b632d62db +Block 0018 [ 92]: 17f5f64702395fd3 +Block 0018 [ 93]: 0df98d15faacf9aa +Block 0018 [ 94]: bcf18c74021649d9 +Block 0018 [ 95]: 9f736366b0aaf256 +Block 0018 [ 96]: 8051586167b2167e +Block 0018 [ 97]: 6c3a10856e183e33 +Block 0018 [ 98]: 6e5a3236190684e3 +Block 0018 [ 99]: afa62b28d151194b +Block 0018 [100]: b1511ff8ff9de709 +Block 0018 [101]: 9456ec3070684f51 +Block 0018 [102]: f8b2e2c6b3a5ede1 +Block 0018 [103]: 957b0cff38ff5d65 +Block 0018 [104]: 80f65db2f4bef519 +Block 0018 [105]: 0a4b7424f557a97b +Block 0018 [106]: dbb46c78d3b16657 +Block 0018 [107]: 4fb97f89dbf34615 +Block 0018 [108]: 605a46364190bf07 +Block 0018 [109]: 82ab49f116e2d3a0 +Block 0018 [110]: 7bdca67b36403e69 +Block 0018 [111]: 76ddd2407cf40c49 +Block 0018 [112]: 816b6bdb860dcf94 +Block 0018 [113]: b1ef58ee0d58bf9e +Block 0018 [114]: 0ff5e16892fdc1e2 +Block 0018 [115]: 42e71d4690469785 +Block 0018 [116]: b18acdb8a0b68672 +Block 0018 [117]: f155ac095d6fa2ea +Block 0018 [118]: f60c65958b44f393 +Block 0018 [119]: ff5eb4d397fbae23 +Block 0018 [120]: 659e7b8fc27b481c +Block 0018 [121]: 0b0fee39c9b4978b +Block 0018 [122]: 66cd6e8f09ff280e +Block 0018 [123]: 66457a5d611d56b0 +Block 0018 [124]: c2af5b83515d5470 +Block 0018 [125]: e29fba1fd62392ca +Block 0018 [126]: 4d83dbe95866b4d4 +Block 0018 [127]: 7536f8c68069e3f3 +Block 0019 [ 0]: 722f273fc2dcb808 +Block 0019 [ 1]: b8ed98643c9037c8 +Block 0019 [ 2]: 7750cffa290e9bf5 +Block 0019 [ 3]: 70b53d0852adcc2d +Block 0019 [ 4]: ff012ca82a8502fd +Block 0019 [ 5]: dd31cf64aba30b03 +Block 0019 [ 6]: 1f8089c7e49c0295 +Block 0019 [ 7]: fb69aae42cd06e3c +Block 0019 [ 8]: 863ddde246472a00 +Block 0019 [ 9]: c43713ae38173c0b +Block 0019 [ 10]: f3b11690fd627fc2 +Block 0019 [ 11]: 8df098f89832649f +Block 0019 [ 12]: ee1808239b90adc6 +Block 0019 [ 13]: a1de235cd0a91f3a +Block 0019 [ 14]: c5ebc70a2c39e8ba +Block 0019 [ 15]: 7261ba38f8c0efc4 +Block 0019 [ 16]: 19ee91a1cfbf5b3d +Block 0019 [ 17]: f0332768e28a1b3a +Block 0019 [ 18]: 44edb26d9179e9c1 +Block 0019 [ 19]: 0cf32f79888b897a +Block 0019 [ 20]: 28a16746b980aa69 +Block 0019 [ 21]: 52fece763bc4b874 +Block 0019 [ 22]: 492462ddf0453667 +Block 0019 [ 23]: 9d5640570d88fc56 +Block 0019 [ 24]: 70757405d529a0e8 +Block 0019 [ 25]: 3b2af6a9e0c5eb14 +Block 0019 [ 26]: 42fa393692961d9d +Block 0019 [ 27]: acccc4f1b9fa4d77 +Block 0019 [ 28]: 00b0b01dc131a9c1 +Block 0019 [ 29]: 2b9dd58298aff850 +Block 0019 [ 30]: 1f9e9c8090846f83 +Block 0019 [ 31]: 66160b59c3f5914c +Block 0019 [ 32]: b9f5f550888de83b +Block 0019 [ 33]: c4a56854d14903c5 +Block 0019 [ 34]: c6d14f5cc3951abc +Block 0019 [ 35]: 08abd46128eb2bda +Block 0019 [ 36]: b9fdcd88d36e67f0 +Block 0019 [ 37]: 90fa2dd4e03640cb +Block 0019 [ 38]: fd16d218f1e56234 +Block 0019 [ 39]: 091acccd9d0e30d1 +Block 0019 [ 40]: e42811b626289ff9 +Block 0019 [ 41]: 1ece05985826d671 +Block 0019 [ 42]: c5f482a21ee796e0 +Block 0019 [ 43]: c06e692ca9f056c0 +Block 0019 [ 44]: e23ed7c9253dcaab +Block 0019 [ 45]: 6690fc1182d74429 +Block 0019 [ 46]: 6ef5a397f829abdd +Block 0019 [ 47]: 2683521b224ee50d +Block 0019 [ 48]: 0182b3c186f873a3 +Block 0019 [ 49]: 20c92c0febd05d7d +Block 0019 [ 50]: 01cc133fee6460de +Block 0019 [ 51]: c86d8364e693b5b9 +Block 0019 [ 52]: 23d64e599970dae2 +Block 0019 [ 53]: 0de884eb725ae3af +Block 0019 [ 54]: 517bcd0201644ed8 +Block 0019 [ 55]: 8df33bfe21658050 +Block 0019 [ 56]: 0c9930ca602516ad +Block 0019 [ 57]: 0ebf7d34c36aa33a +Block 0019 [ 58]: f6ee1dead03b43eb +Block 0019 [ 59]: b73cd68edd7f8248 +Block 0019 [ 60]: 4aa35e26918206fe +Block 0019 [ 61]: 3d876cdef4c6bd47 +Block 0019 [ 62]: 4e865ec2782bb709 +Block 0019 [ 63]: f74308f5e970cb9b +Block 0019 [ 64]: 2771aadf679ec45d +Block 0019 [ 65]: 226c76e4ba2a5dd7 +Block 0019 [ 66]: de0cddc2ae4427c8 +Block 0019 [ 67]: dd0c4bd379edeabd +Block 0019 [ 68]: 55fc60cd41a55679 +Block 0019 [ 69]: 82eefb6749f7d7c2 +Block 0019 [ 70]: 869e68618a19c7c7 +Block 0019 [ 71]: 442afd2c618bb724 +Block 0019 [ 72]: 3b0c6ff27923c66d +Block 0019 [ 73]: 4c982cc1c9926132 +Block 0019 [ 74]: 4985e72e8435d8ba +Block 0019 [ 75]: 73bb50df4a57233e +Block 0019 [ 76]: 54598373775f7082 +Block 0019 [ 77]: 989acb275bcd8f7e +Block 0019 [ 78]: 54fed75c76e59e7c +Block 0019 [ 79]: 48ca047ac54c6922 +Block 0019 [ 80]: 026b2df39c6a513d +Block 0019 [ 81]: 173bf4ba8e04d1da +Block 0019 [ 82]: 8acf7f1b9248060b +Block 0019 [ 83]: 46dc23cee3392db4 +Block 0019 [ 84]: f2c380c3aa45c2b5 +Block 0019 [ 85]: 3c7cfde74b2c36c0 +Block 0019 [ 86]: b6717d3bc372759f +Block 0019 [ 87]: dc311a8650a95f41 +Block 0019 [ 88]: 726c9df5a72d6b12 +Block 0019 [ 89]: a5c78f4fb2c4616a +Block 0019 [ 90]: 99752c728e64b11c +Block 0019 [ 91]: 2db8af40223e6337 +Block 0019 [ 92]: daf0df2c0fa99d1c +Block 0019 [ 93]: fa15f1ef7b4c253f +Block 0019 [ 94]: 55d5026d18fee917 +Block 0019 [ 95]: b28e3db01632bd47 +Block 0019 [ 96]: cf92192dec2a2c40 +Block 0019 [ 97]: cf6d5d9bc091e6f5 +Block 0019 [ 98]: dbce992d8c254db9 +Block 0019 [ 99]: 2e7ae686b8ca7ee8 +Block 0019 [100]: 384527ee71744859 +Block 0019 [101]: f5792f72aff7ce1f +Block 0019 [102]: 218acc6d548bffbd +Block 0019 [103]: c55a6901afdba4ee +Block 0019 [104]: 3f0321e8047687ac +Block 0019 [105]: 8c83bf546e2f4145 +Block 0019 [106]: f9ac4b2a66d9464d +Block 0019 [107]: c33356e2116f19e7 +Block 0019 [108]: aa1803bb336e1592 +Block 0019 [109]: bcb3bcda523ff128 +Block 0019 [110]: a8196da62d735972 +Block 0019 [111]: 83ac3bc10374503d +Block 0019 [112]: 82183e223bcdccdf +Block 0019 [113]: 6bf482af8ce0e92f +Block 0019 [114]: d33807071afa3e61 +Block 0019 [115]: a0889cc00ee25304 +Block 0019 [116]: ddcc3d96df20e1de +Block 0019 [117]: f31f7dab248a58b2 +Block 0019 [118]: 8d19be8959a8441a +Block 0019 [119]: de4916c0bdd8f395 +Block 0019 [120]: 08337c3616acbff2 +Block 0019 [121]: 1da9ee3be188c357 +Block 0019 [122]: e2be5499c55d69d5 +Block 0019 [123]: 8a88a87d2fcfaba3 +Block 0019 [124]: 57aa516673cb6b71 +Block 0019 [125]: e3f755c6f20e652b +Block 0019 [126]: 5a4131bef1f62b97 +Block 0019 [127]: 3db701be2103d01a +Block 0020 [ 0]: 70c6576f2e77e09a +Block 0020 [ 1]: 6601863f6b696595 +Block 0020 [ 2]: b91a34ab981fa137 +Block 0020 [ 3]: 736b66b7aab81706 +Block 0020 [ 4]: 65fb0a72aebe5b19 +Block 0020 [ 5]: f50ce081b2505436 +Block 0020 [ 6]: 021d3df7daa304bf +Block 0020 [ 7]: 61794a7f35b9385c +Block 0020 [ 8]: 17459a4b0e86f16d +Block 0020 [ 9]: 261d20aec867b2b1 +Block 0020 [ 10]: 7d6b10cb9e1ca1b6 +Block 0020 [ 11]: e771ea00bab91811 +Block 0020 [ 12]: 3b8d4966dba2fcee +Block 0020 [ 13]: b8cb7efbd136e0c5 +Block 0020 [ 14]: e905a8786d5c35d6 +Block 0020 [ 15]: 0febce01d9281167 +Block 0020 [ 16]: 030162e4b1bd5620 +Block 0020 [ 17]: 1d6c869d5abd924e +Block 0020 [ 18]: adae1f14c28c19c0 +Block 0020 [ 19]: a964bb0864bc9d52 +Block 0020 [ 20]: 648ef646997cadb1 +Block 0020 [ 21]: ca0321a35bf0cbdc +Block 0020 [ 22]: 59335968255b796e +Block 0020 [ 23]: 031511e73acec4df +Block 0020 [ 24]: 8c357525c9ec70e9 +Block 0020 [ 25]: 8b25fdfb42423ce6 +Block 0020 [ 26]: dfb06a7440745242 +Block 0020 [ 27]: 9e94b7cf234b4956 +Block 0020 [ 28]: 8c401a90a8168e37 +Block 0020 [ 29]: 431d28542972c237 +Block 0020 [ 30]: 344546c0e699c834 +Block 0020 [ 31]: aece7d9d6960069d +Block 0020 [ 32]: ea42707eb3a32685 +Block 0020 [ 33]: fd57e3a5f6e998cc +Block 0020 [ 34]: 52a662c2f6de431c +Block 0020 [ 35]: 0b255cf4fdd8ac5e +Block 0020 [ 36]: bc320584a71ba9e3 +Block 0020 [ 37]: c5fb2fee1e9e8106 +Block 0020 [ 38]: c2932e7718e22b16 +Block 0020 [ 39]: afb8c659f04a1d2e +Block 0020 [ 40]: 082e620daeb79466 +Block 0020 [ 41]: 043991be836d5eae +Block 0020 [ 42]: ad16fddbaa7ae57e +Block 0020 [ 43]: ab45c1663a1320cf +Block 0020 [ 44]: 3e2e2fad4ab6dd15 +Block 0020 [ 45]: 184d7c29d383f9cb +Block 0020 [ 46]: 11037c7773292bc4 +Block 0020 [ 47]: fa5cc51fb7a55375 +Block 0020 [ 48]: 9a2c041b82bdf603 +Block 0020 [ 49]: 63e9dad5b5d8e60c +Block 0020 [ 50]: d9750b241682d4bc +Block 0020 [ 51]: 970d5276092a0ea4 +Block 0020 [ 52]: 9dddabc29fe7edfa +Block 0020 [ 53]: 681055dcbfb3006a +Block 0020 [ 54]: 01900b21d31eff67 +Block 0020 [ 55]: 449abc581135982c +Block 0020 [ 56]: db2ae53eeee1c299 +Block 0020 [ 57]: 3dd54a6de8697c5b +Block 0020 [ 58]: f1e82c286114ddcd +Block 0020 [ 59]: adb5c79c12d8be22 +Block 0020 [ 60]: a09972fb6b077bb9 +Block 0020 [ 61]: 68eac35dcc5ff9e4 +Block 0020 [ 62]: 6364b9e7d921d09d +Block 0020 [ 63]: cb5f436ca07c7324 +Block 0020 [ 64]: 4aa340986fc7deaa +Block 0020 [ 65]: 458a6cfa537b5882 +Block 0020 [ 66]: 2a7a4bfe3923b89c +Block 0020 [ 67]: 1635e10d6f5d7235 +Block 0020 [ 68]: 28f5135a470b8332 +Block 0020 [ 69]: ff1eb2e7f4de0b70 +Block 0020 [ 70]: 12b3703e48703d4e +Block 0020 [ 71]: 1fb4586aca631990 +Block 0020 [ 72]: b39ea3c1335582eb +Block 0020 [ 73]: 0dc229d3c3fb5f8e +Block 0020 [ 74]: 35038bbcf50f7fb0 +Block 0020 [ 75]: b344ab23680de774 +Block 0020 [ 76]: 9d0ddb2f1c714c58 +Block 0020 [ 77]: 32a29abd2d42c740 +Block 0020 [ 78]: ac9856eb75f6da54 +Block 0020 [ 79]: 6e482388986341bb +Block 0020 [ 80]: 1aadb77781c10d89 +Block 0020 [ 81]: 06dd3907baa24d9b +Block 0020 [ 82]: ce12640b5e68b68a +Block 0020 [ 83]: 4dc6af7465c30b2e +Block 0020 [ 84]: e30c7faf4af19ed5 +Block 0020 [ 85]: f3bd1a9b0441641e +Block 0020 [ 86]: 8d0718fc38801ab2 +Block 0020 [ 87]: 329621668d8cac25 +Block 0020 [ 88]: 08fd2a23b99a3393 +Block 0020 [ 89]: 2f34f0550c5bf928 +Block 0020 [ 90]: 8af250cc80bc53c3 +Block 0020 [ 91]: 6e84810898ec71ca +Block 0020 [ 92]: 6d2f03ab20dcc568 +Block 0020 [ 93]: 7b6094febddf53a9 +Block 0020 [ 94]: f88eb9e8a6710cef +Block 0020 [ 95]: 015aebc0e7561485 +Block 0020 [ 96]: a2f1e67b4f53ef64 +Block 0020 [ 97]: b2f41b99adcabcb8 +Block 0020 [ 98]: 072c7441cad288fa +Block 0020 [ 99]: b7d76739d790000f +Block 0020 [100]: 8246205c8c8839ed +Block 0020 [101]: 36bf703de23ab32f +Block 0020 [102]: f50d0586961e5e1e +Block 0020 [103]: 0362b485dc0ecde9 +Block 0020 [104]: 3e8a15277d2384d3 +Block 0020 [105]: b00a398ae5bd9dcf +Block 0020 [106]: 07dbd6088a9b7b2e +Block 0020 [107]: a593dea22ee8de23 +Block 0020 [108]: 9dcc69bd05b50111 +Block 0020 [109]: f44fe5efbbe2a788 +Block 0020 [110]: 4c6ba01e0ce4a7bd +Block 0020 [111]: 2b29897c88458722 +Block 0020 [112]: f40cdc0d0d03360c +Block 0020 [113]: 4dd21c19c6bbca01 +Block 0020 [114]: 14a6671b6214c164 +Block 0020 [115]: 3a32de50b729cccf +Block 0020 [116]: c9187a994af18415 +Block 0020 [117]: 7fa0474d79569967 +Block 0020 [118]: 1b4425996a0c6378 +Block 0020 [119]: 076afc6c51ea4651 +Block 0020 [120]: 8e2cfd3f8ded4d1f +Block 0020 [121]: 15fe894d46c20a6f +Block 0020 [122]: a3f83bb955872823 +Block 0020 [123]: e6da877d40219104 +Block 0020 [124]: 1c8278e557d5a2db +Block 0020 [125]: 59846d21cfa0d9f6 +Block 0020 [126]: 81182cda9a926198 +Block 0020 [127]: 66c4a4c4af6cf770 +Block 0021 [ 0]: 97ba12617248d3a0 +Block 0021 [ 1]: a7474da1f3722804 +Block 0021 [ 2]: d812872de7c68fb0 +Block 0021 [ 3]: 77ff9583abecf493 +Block 0021 [ 4]: a115af0254d43eba +Block 0021 [ 5]: d859a2a9e6f64e30 +Block 0021 [ 6]: 74a626581f652ae9 +Block 0021 [ 7]: 2bf0ecb0ef299a6b +Block 0021 [ 8]: a3ecc9fe27c3c4fa +Block 0021 [ 9]: a6b5ee67c56a8a12 +Block 0021 [ 10]: ebb75bfd61ab58d5 +Block 0021 [ 11]: 140540d69b6b749c +Block 0021 [ 12]: 49dafaaea1750e39 +Block 0021 [ 13]: 9ce0775336a3f77a +Block 0021 [ 14]: d3efbd276ec1a746 +Block 0021 [ 15]: a1c82b2d2fd832a3 +Block 0021 [ 16]: 1b55d6ca561cf8f6 +Block 0021 [ 17]: 970ebebc2dbb4c47 +Block 0021 [ 18]: 55229dad6951aa65 +Block 0021 [ 19]: f3310d064331b06d +Block 0021 [ 20]: 76d95cafb7ff4bc0 +Block 0021 [ 21]: 8d5fd733bf770e1a +Block 0021 [ 22]: f637058052bcc6d1 +Block 0021 [ 23]: 4ab98283fba0118e +Block 0021 [ 24]: e8e525c902663eec +Block 0021 [ 25]: 644cca7d985c8a91 +Block 0021 [ 26]: c6c2de6b0e4ff1be +Block 0021 [ 27]: fc412f9b8a8cedd9 +Block 0021 [ 28]: 0e92b41df490818d +Block 0021 [ 29]: 1d0c2c517f488689 +Block 0021 [ 30]: 18b2da63716f204d +Block 0021 [ 31]: e554edf33f346126 +Block 0021 [ 32]: c08bda271a758810 +Block 0021 [ 33]: 5dd523abea7efb83 +Block 0021 [ 34]: d847a64de969361d +Block 0021 [ 35]: a4f36d26b3b54449 +Block 0021 [ 36]: 1921a0afad9f8fbf +Block 0021 [ 37]: 70da571767923985 +Block 0021 [ 38]: 6c5064a53ec3e555 +Block 0021 [ 39]: 62bcba250774bb08 +Block 0021 [ 40]: 2b5625ff6f5ba533 +Block 0021 [ 41]: c072367cce735fad +Block 0021 [ 42]: 8936f7691d34a967 +Block 0021 [ 43]: be608f7337bfed83 +Block 0021 [ 44]: c5644153fd94cc02 +Block 0021 [ 45]: b6976c4c85e42f9e +Block 0021 [ 46]: f8ad6580cc9a7eb0 +Block 0021 [ 47]: 3d824a32e3758d65 +Block 0021 [ 48]: f169ed5f08f9b944 +Block 0021 [ 49]: e87427a90507fbd4 +Block 0021 [ 50]: 931fb1fe7d965ede +Block 0021 [ 51]: 9b260a432ad72c1c +Block 0021 [ 52]: 79deb2541ce7342d +Block 0021 [ 53]: 69e5e734dba1fd9c +Block 0021 [ 54]: 1247ebe158d28acb +Block 0021 [ 55]: 7dbd681956aeb23a +Block 0021 [ 56]: 300321372051ac95 +Block 0021 [ 57]: 29a1f904e3279041 +Block 0021 [ 58]: d05fccea3fe647f4 +Block 0021 [ 59]: 2385827f254d2b4c +Block 0021 [ 60]: 56b9609de765952f +Block 0021 [ 61]: c94741ba55b5597a +Block 0021 [ 62]: 9e7913dccfeedd26 +Block 0021 [ 63]: 81fbd1291f9421ee +Block 0021 [ 64]: d6262e0e770aeb51 +Block 0021 [ 65]: c827cfb3a6abddfd +Block 0021 [ 66]: 278464d02be24499 +Block 0021 [ 67]: 6128073fae8d69e1 +Block 0021 [ 68]: a787862adac1f282 +Block 0021 [ 69]: 298346627e145ab3 +Block 0021 [ 70]: 13f37d5f03d860c0 +Block 0021 [ 71]: 472bc88d39141ca4 +Block 0021 [ 72]: a32d647eda32d4ef +Block 0021 [ 73]: adb7b6dbfd3ae3ee +Block 0021 [ 74]: e1269626ab25c0a2 +Block 0021 [ 75]: 0a81d0098dcb18b8 +Block 0021 [ 76]: 5a30c38f68fd8627 +Block 0021 [ 77]: 06680a83a31773f1 +Block 0021 [ 78]: 3bb8bfe6fdd1042b +Block 0021 [ 79]: 1991fe79ca1e3d2c +Block 0021 [ 80]: df82bee963637ef6 +Block 0021 [ 81]: f5f6405ea41a34d2 +Block 0021 [ 82]: fecb4282706d12a3 +Block 0021 [ 83]: 08944da6b98b49ff +Block 0021 [ 84]: da3991a854ebdb1e +Block 0021 [ 85]: 96d59a0a8eb94f1d +Block 0021 [ 86]: da88007dad0fb44d +Block 0021 [ 87]: 3a3a7c6401caadd1 +Block 0021 [ 88]: d1a4830ea6a0930c +Block 0021 [ 89]: 90ba4c240ce23c60 +Block 0021 [ 90]: 3ed84aa792e55aab +Block 0021 [ 91]: 69b4b96240dbeb77 +Block 0021 [ 92]: 2e83b29f76581a62 +Block 0021 [ 93]: 9b76934ba16a709c +Block 0021 [ 94]: 133875a80ec7e428 +Block 0021 [ 95]: 0cf80a0eb6cd800f +Block 0021 [ 96]: 875d7cacffadd659 +Block 0021 [ 97]: 6e7b01bd211dea78 +Block 0021 [ 98]: 6f414ca19d49a25c +Block 0021 [ 99]: 1a39a444f5f57861 +Block 0021 [100]: a49caaba3d8e8821 +Block 0021 [101]: b56b6106a9bd904a +Block 0021 [102]: ad2463203a51043e +Block 0021 [103]: e9093114910e868a +Block 0021 [104]: ab7afec2cd298c7f +Block 0021 [105]: 5ca3db0f2755ec4e +Block 0021 [106]: 930f28588ce3c4d9 +Block 0021 [107]: b9caed8e764da044 +Block 0021 [108]: 4ad9f43753450d1b +Block 0021 [109]: 2fd204073599e2e3 +Block 0021 [110]: 32e29607e96dcc49 +Block 0021 [111]: 346f9459d20813e1 +Block 0021 [112]: b9216cc91d1a0b93 +Block 0021 [113]: b2d7287641a5aedc +Block 0021 [114]: 64e3459f766c19a4 +Block 0021 [115]: a94828e02268bc34 +Block 0021 [116]: ab0bf58173c54029 +Block 0021 [117]: 34ece02bab456ed0 +Block 0021 [118]: faa3ac8c0f216393 +Block 0021 [119]: c72717b9c6cfa5e4 +Block 0021 [120]: de532f61d7c21181 +Block 0021 [121]: aaa343e41d74e64b +Block 0021 [122]: bed79982c13e22bd +Block 0021 [123]: a9d0acedec7fb082 +Block 0021 [124]: 33f9ee6919e5e69e +Block 0021 [125]: 9461e87f0d76e520 +Block 0021 [126]: 50d39455a480016a +Block 0021 [127]: 69d241940768dccf +Block 0022 [ 0]: 99ac09d3ecbcdbb4 +Block 0022 [ 1]: 514dda00e5127ffa +Block 0022 [ 2]: 03059e9afb29b1b3 +Block 0022 [ 3]: 5f2b16eedb2625c9 +Block 0022 [ 4]: 8421eca1dbfec1b2 +Block 0022 [ 5]: 1d9cd95877a17d18 +Block 0022 [ 6]: 29ad26ed44443664 +Block 0022 [ 7]: d5e9d0548f100140 +Block 0022 [ 8]: f2f96df7101178e1 +Block 0022 [ 9]: fcde7cc6e739d68c +Block 0022 [ 10]: 9da5994233b3b92c +Block 0022 [ 11]: ede676a1cfb49424 +Block 0022 [ 12]: 87f04a8bd8f02c3c +Block 0022 [ 13]: 793aa15c08c7d1cb +Block 0022 [ 14]: 6782338db894b187 +Block 0022 [ 15]: c4f72a9a6bcf2c10 +Block 0022 [ 16]: 00f5af2f848eb2f3 +Block 0022 [ 17]: decf9043e63c9b1a +Block 0022 [ 18]: 300b96ee9ee506c4 +Block 0022 [ 19]: d36b4e566db81299 +Block 0022 [ 20]: 90ce5819385cd408 +Block 0022 [ 21]: d2013dfebf9c5a82 +Block 0022 [ 22]: dfed4093841d7dee +Block 0022 [ 23]: f74c019e0b5502b9 +Block 0022 [ 24]: 14c8588c2533f91d +Block 0022 [ 25]: f1f261ad12cb3a9e +Block 0022 [ 26]: 46be19a1a1a0ba7d +Block 0022 [ 27]: 01cf062fa2e7b479 +Block 0022 [ 28]: c33e050c6fea3bc7 +Block 0022 [ 29]: 438d65b4399cf820 +Block 0022 [ 30]: f727a7bd6e61ec49 +Block 0022 [ 31]: f95dda0e791f32ff +Block 0022 [ 32]: cf91506b6b6351cd +Block 0022 [ 33]: 44aaf19ab3c4e0ba +Block 0022 [ 34]: fd54a5b7aa337d99 +Block 0022 [ 35]: a141b7ffddcdb8e3 +Block 0022 [ 36]: 9f79915e6dedfdaa +Block 0022 [ 37]: a69bc9b18050b6c0 +Block 0022 [ 38]: 2ce0fe170467aab2 +Block 0022 [ 39]: 94f3b3443bafb15e +Block 0022 [ 40]: f6368a58cb0d19c5 +Block 0022 [ 41]: c0f357c51f5bdb47 +Block 0022 [ 42]: a7273145bca106fe +Block 0022 [ 43]: ce91916807ea540d +Block 0022 [ 44]: 85af3d0bc3cbbbdf +Block 0022 [ 45]: c5e75b71391eed9a +Block 0022 [ 46]: e990ab8763434522 +Block 0022 [ 47]: 0a18de6ffcea0072 +Block 0022 [ 48]: b6b99c2642b1f93d +Block 0022 [ 49]: 880547abadac4ead +Block 0022 [ 50]: 9c824e5c3e3d840d +Block 0022 [ 51]: 71459956dc736b45 +Block 0022 [ 52]: d53fb6e0f374761c +Block 0022 [ 53]: 61b08dcef0ef837e +Block 0022 [ 54]: 584dfc7b7b1ac55d +Block 0022 [ 55]: 6d260c9b48104e21 +Block 0022 [ 56]: 74bd628609d0579b +Block 0022 [ 57]: 4da07fd544e14216 +Block 0022 [ 58]: 44699551cc96435d +Block 0022 [ 59]: 5cb6d7b5d4d32315 +Block 0022 [ 60]: 002c55ac837869de +Block 0022 [ 61]: 33910a7581ce0934 +Block 0022 [ 62]: c20bb59e0cb163b7 +Block 0022 [ 63]: 5724a2c79e0d567d +Block 0022 [ 64]: fc12585573a969a1 +Block 0022 [ 65]: 0f1802284711fc36 +Block 0022 [ 66]: d18a8169e1a758d7 +Block 0022 [ 67]: 55d40c0d1aa9d93c +Block 0022 [ 68]: 66f4cc1fd0b4a21c +Block 0022 [ 69]: 626c0c97a5746c99 +Block 0022 [ 70]: 5a8387f8935bd8d3 +Block 0022 [ 71]: 5774a5ef99ef0fa4 +Block 0022 [ 72]: 345753a67f42ffaa +Block 0022 [ 73]: d5c7db73671dd400 +Block 0022 [ 74]: 1c876fbd31b40929 +Block 0022 [ 75]: adb555c8cd4c682e +Block 0022 [ 76]: 4e35e1ec3a2fa91a +Block 0022 [ 77]: 97837b1d4e9d22e3 +Block 0022 [ 78]: db4de1fa218320cb +Block 0022 [ 79]: 6949e60bd0a77306 +Block 0022 [ 80]: 5a1a9285b471e18b +Block 0022 [ 81]: 133e1594f9013500 +Block 0022 [ 82]: 4fed50832b7552db +Block 0022 [ 83]: ea8ec75578b38f5e +Block 0022 [ 84]: 55f680462419d053 +Block 0022 [ 85]: 57a6bf1ae4c5cdda +Block 0022 [ 86]: 4490fb9d7437ec6c +Block 0022 [ 87]: 5c20149c3fdc0f19 +Block 0022 [ 88]: 3e05dd84d1b96161 +Block 0022 [ 89]: 8ee14ba173ef628c +Block 0022 [ 90]: 7c7335a772f5d1a0 +Block 0022 [ 91]: 218d2dc1909539f1 +Block 0022 [ 92]: c864e8ba266a87d9 +Block 0022 [ 93]: d05aa03f1c192d28 +Block 0022 [ 94]: 1a5afc3d25c10a33 +Block 0022 [ 95]: 06ebd6b0cab2a596 +Block 0022 [ 96]: ec56d04aa2cac393 +Block 0022 [ 97]: 84114dcff89ed7d6 +Block 0022 [ 98]: 9236b4914b6853c3 +Block 0022 [ 99]: 19b19c03c9f2cf00 +Block 0022 [100]: f89d5d10e0f2206d +Block 0022 [101]: b8c0768373077807 +Block 0022 [102]: 5f93b788171e6a3d +Block 0022 [103]: 06b4bffc543ba5ba +Block 0022 [104]: 2160cc4bcb298ce1 +Block 0022 [105]: a31ebc8cd3fb8e43 +Block 0022 [106]: 840ed2e07f648e5f +Block 0022 [107]: 44f7dabc1fa4ce16 +Block 0022 [108]: f3da6300d6853673 +Block 0022 [109]: 83a2d663f5bd1f39 +Block 0022 [110]: 467a553afb39e207 +Block 0022 [111]: 7e5d07e9e34aa631 +Block 0022 [112]: c18efe2cbee27f59 +Block 0022 [113]: 88c337ece41089b9 +Block 0022 [114]: 836dbe9587d964bd +Block 0022 [115]: d5dae636d08de614 +Block 0022 [116]: 8d10eb8da0c2f53f +Block 0022 [117]: 4a0f03949bc56298 +Block 0022 [118]: 2e2610735ed2c5e8 +Block 0022 [119]: 04d88eefe8be430f +Block 0022 [120]: b6f232d66a064d22 +Block 0022 [121]: 8b43f223c3bab19e +Block 0022 [122]: 42189f5dd777bdc7 +Block 0022 [123]: 26aebb9a0c7930c0 +Block 0022 [124]: 745a32b9b6d6ce9b +Block 0022 [125]: d82e6fa1d9eaa64c +Block 0022 [126]: f5226b2114974004 +Block 0022 [127]: d411871aafe92d03 +Block 0023 [ 0]: 099bad02ce6364d6 +Block 0023 [ 1]: 946434f53c381dfa +Block 0023 [ 2]: 7cc764145dcff211 +Block 0023 [ 3]: 863a1d0f6917e81f +Block 0023 [ 4]: b07148fffbf35d2e +Block 0023 [ 5]: 06e0a8c35d673389 +Block 0023 [ 6]: 0836a7016c46218d +Block 0023 [ 7]: f7448c33afda380d +Block 0023 [ 8]: 9d70de7501979872 +Block 0023 [ 9]: 5ec479e097342787 +Block 0023 [ 10]: 4c328e947adc0a3b +Block 0023 [ 11]: 673b567c3f825c7d +Block 0023 [ 12]: 88bbe75df8436559 +Block 0023 [ 13]: 31e8b9ff423389e9 +Block 0023 [ 14]: 7569469bba244732 +Block 0023 [ 15]: 0f019e02e9d44270 +Block 0023 [ 16]: 2cf0f216bb23dcbc +Block 0023 [ 17]: f942da467c94c759 +Block 0023 [ 18]: c531370dff6c7550 +Block 0023 [ 19]: 76eb32b05537d887 +Block 0023 [ 20]: 09be023c2f37ef6c +Block 0023 [ 21]: 913b6fb2ae92aa17 +Block 0023 [ 22]: 3905230d429ddb42 +Block 0023 [ 23]: 8dacca73716bd067 +Block 0023 [ 24]: b767e0600fbcad20 +Block 0023 [ 25]: fc4bbc20c754fe8f +Block 0023 [ 26]: 010fb475210b4052 +Block 0023 [ 27]: 55c219fa4a4e2d4a +Block 0023 [ 28]: 346444d97bc6ae08 +Block 0023 [ 29]: 51b0dc31dfae6277 +Block 0023 [ 30]: bd9651aca77ac723 +Block 0023 [ 31]: a6139c546b9d8a72 +Block 0023 [ 32]: e9e26f0535ae93f1 +Block 0023 [ 33]: d029451bda2edfd0 +Block 0023 [ 34]: 3f52bfe31df12f36 +Block 0023 [ 35]: d51d4d9383579576 +Block 0023 [ 36]: 918b16322ea2cd12 +Block 0023 [ 37]: 0fb4466b28e900dd +Block 0023 [ 38]: d06552715cb858c5 +Block 0023 [ 39]: 66700db36d68fd04 +Block 0023 [ 40]: 6c5248d72cc78817 +Block 0023 [ 41]: 6237033fbadc51c0 +Block 0023 [ 42]: 70ce5003d36e91fd +Block 0023 [ 43]: 9473b2ba7e1ea0b7 +Block 0023 [ 44]: 8570a1a79d0de212 +Block 0023 [ 45]: 38128c19a8cf3d94 +Block 0023 [ 46]: 996d86984478edb2 +Block 0023 [ 47]: 13a573e574db3c5f +Block 0023 [ 48]: 14c8a880130edffa +Block 0023 [ 49]: daa29af545495cbe +Block 0023 [ 50]: 2966004bbf930356 +Block 0023 [ 51]: 6254df94f338f8ea +Block 0023 [ 52]: 48ceb67f8fcfb1a1 +Block 0023 [ 53]: 054af1ac0f6f178a +Block 0023 [ 54]: bd24a125e957879e +Block 0023 [ 55]: 855df59044ecdbc7 +Block 0023 [ 56]: 2bdd65a1b699e3bd +Block 0023 [ 57]: 6cebfbc55dc696a6 +Block 0023 [ 58]: 3812eff0201089e2 +Block 0023 [ 59]: 012595753609368d +Block 0023 [ 60]: ae37b3e38d73252c +Block 0023 [ 61]: fb9610e25ae10d9a +Block 0023 [ 62]: fd0493c39dff6521 +Block 0023 [ 63]: 1abead7fa22e7ee7 +Block 0023 [ 64]: fa54f2336e7a816b +Block 0023 [ 65]: c9ef67deeb2238af +Block 0023 [ 66]: 3bd2bafd83abf2fa +Block 0023 [ 67]: 995385d15f693c1b +Block 0023 [ 68]: 35409549ee4db0c7 +Block 0023 [ 69]: 1e501283957b8d79 +Block 0023 [ 70]: 57edfd6799c7b1a0 +Block 0023 [ 71]: 42d993d322a85ca3 +Block 0023 [ 72]: 49842f3edfe3a13f +Block 0023 [ 73]: eaed319e568fe464 +Block 0023 [ 74]: 4839e1a7a8233599 +Block 0023 [ 75]: f2d5f7df30b2e85e +Block 0023 [ 76]: c9a770a607739db1 +Block 0023 [ 77]: 02c54ed70c63a598 +Block 0023 [ 78]: 27b1e90934def83a +Block 0023 [ 79]: 476fe1ecd08c315d +Block 0023 [ 80]: e546b55b51e06075 +Block 0023 [ 81]: 8bf363a6252cb544 +Block 0023 [ 82]: f712f271ef124632 +Block 0023 [ 83]: 19bd4969355d67b1 +Block 0023 [ 84]: b505bc0de2bc042f +Block 0023 [ 85]: 0461f15ec598306a +Block 0023 [ 86]: 7e0734c6a49752a4 +Block 0023 [ 87]: e97530b659023c82 +Block 0023 [ 88]: df66806a45af7ed4 +Block 0023 [ 89]: a1ee45ca25a4e8ef +Block 0023 [ 90]: 85f36f0919bda565 +Block 0023 [ 91]: af8d1c2bc3c6cda2 +Block 0023 [ 92]: d5c8b3905d6c4684 +Block 0023 [ 93]: 924285ed85d7f4fe +Block 0023 [ 94]: e667250c7fe0448d +Block 0023 [ 95]: f18072539252e69b +Block 0023 [ 96]: 98f930d88a11d73d +Block 0023 [ 97]: 40ddc2faea46a6fe +Block 0023 [ 98]: 55edf0abf338fe23 +Block 0023 [ 99]: 137afd6aac160ea4 +Block 0023 [100]: a930757fe62a632b +Block 0023 [101]: f26ea4497a99a22a +Block 0023 [102]: f7dd63b836565686 +Block 0023 [103]: e16156ef2389802e +Block 0023 [104]: e3e02a7fa444bc54 +Block 0023 [105]: d3e93563d3276e5a +Block 0023 [106]: 55e761b504d23408 +Block 0023 [107]: 4c1f0a70be317833 +Block 0023 [108]: 20a59044cc69cabc +Block 0023 [109]: e5642bf5fbf7694c +Block 0023 [110]: dc1e13a4fe52198e +Block 0023 [111]: 118b7c4b6335ca02 +Block 0023 [112]: 4f677c8f3f7d1653 +Block 0023 [113]: e3623052b8793124 +Block 0023 [114]: 64e8edf529114177 +Block 0023 [115]: 1b40d9ea83af342b +Block 0023 [116]: 68e7c45d6fe85d2b +Block 0023 [117]: 8d33a45c58de3420 +Block 0023 [118]: 6205c61932eac00e +Block 0023 [119]: 4c9001286a4a5748 +Block 0023 [120]: 629740cfc16c5f44 +Block 0023 [121]: aac9b6c66cf37178 +Block 0023 [122]: 362f773d06d7b5e5 +Block 0023 [123]: 7145aea05eabfbca +Block 0023 [124]: 3fa429c42644e339 +Block 0023 [125]: 026700c0b6e2e78c +Block 0023 [126]: 0db5145e9f66582e +Block 0023 [127]: f013125cd14c2aa2 +Block 0024 [ 0]: e2165971c08fea98 +Block 0024 [ 1]: 956b34362d16bde6 +Block 0024 [ 2]: 0a750c1da3669c5a +Block 0024 [ 3]: 28f0cc2dec551759 +Block 0024 [ 4]: b460b783bb6ce4d4 +Block 0024 [ 5]: ccd11552304ffe83 +Block 0024 [ 6]: 895f1451900d0571 +Block 0024 [ 7]: c718c33fc912a775 +Block 0024 [ 8]: 6ac891a642a415e0 +Block 0024 [ 9]: f9cc3a0b0bfd732e +Block 0024 [ 10]: 32c8c20180df24fc +Block 0024 [ 11]: 083ec47a8fc783bf +Block 0024 [ 12]: 10d4a62e2dfca22d +Block 0024 [ 13]: a7cbc7fe934df62d +Block 0024 [ 14]: 60b767b23c7b5434 +Block 0024 [ 15]: 013a9f1758cd46f4 +Block 0024 [ 16]: c521969bc47e72bb +Block 0024 [ 17]: c8c2805cf7474ad1 +Block 0024 [ 18]: d73691bff67d34eb +Block 0024 [ 19]: 0109966c69bf5c53 +Block 0024 [ 20]: bcef0f8a35acd7dc +Block 0024 [ 21]: b5ab773d7386f310 +Block 0024 [ 22]: ddbe3e6b9b29d885 +Block 0024 [ 23]: 53d4e2d94e14df8d +Block 0024 [ 24]: dd77c5edfdebd8dd +Block 0024 [ 25]: 4dfe82d7fcb944f8 +Block 0024 [ 26]: 1dda860fdb104746 +Block 0024 [ 27]: 690c21298d00576a +Block 0024 [ 28]: 31f616a8603ba209 +Block 0024 [ 29]: df15e6faf136ed42 +Block 0024 [ 30]: a2d0b72888d9a03b +Block 0024 [ 31]: f22e82632b4cd9f9 +Block 0024 [ 32]: e15829a9ca7c6ff9 +Block 0024 [ 33]: d0e0c25534f07259 +Block 0024 [ 34]: 39a144104a62a724 +Block 0024 [ 35]: ba85ed7991504855 +Block 0024 [ 36]: 29bb22ded5d822d1 +Block 0024 [ 37]: dc45c5b64f27ac67 +Block 0024 [ 38]: b5ab1d0a5d3ca66d +Block 0024 [ 39]: ebdec5e7d82f2f5f +Block 0024 [ 40]: 2660e8938068ecbf +Block 0024 [ 41]: fc5c71724b0cb677 +Block 0024 [ 42]: 84ee0dc836f79250 +Block 0024 [ 43]: 5b679856c2388af0 +Block 0024 [ 44]: fbf4eb8f24c8e20c +Block 0024 [ 45]: 2fe8cbd52863716c +Block 0024 [ 46]: fede1a5b69045a28 +Block 0024 [ 47]: 65809054232875e1 +Block 0024 [ 48]: f1a33e9b660490ae +Block 0024 [ 49]: f728418282376b71 +Block 0024 [ 50]: 910beb5b9d19dd01 +Block 0024 [ 51]: 0ef1de00ba9c6f07 +Block 0024 [ 52]: 7a669f3a91b22362 +Block 0024 [ 53]: 80fb3d95430597a7 +Block 0024 [ 54]: 10b373244e409034 +Block 0024 [ 55]: 71aaa62305372b2e +Block 0024 [ 56]: 787cdf237ee54aab +Block 0024 [ 57]: 956c44880fd8f8cb +Block 0024 [ 58]: 60c90815957df46f +Block 0024 [ 59]: 83f28fcaeaf7efdf +Block 0024 [ 60]: 7817d1a16c11f2b8 +Block 0024 [ 61]: 8d957aba9fe91cde +Block 0024 [ 62]: cc487239691feca9 +Block 0024 [ 63]: 7223ce9510cd99f0 +Block 0024 [ 64]: 574f63f3b893bd20 +Block 0024 [ 65]: 2f2654e8cf49ca0e +Block 0024 [ 66]: 338f89121a53ea59 +Block 0024 [ 67]: 511e9d8f0027e12d +Block 0024 [ 68]: 31d58a613f863ff8 +Block 0024 [ 69]: ff90079b882b3303 +Block 0024 [ 70]: 3dbbf7c9ff0da4f4 +Block 0024 [ 71]: bb52ab6617231643 +Block 0024 [ 72]: e62a9b54fc156ac1 +Block 0024 [ 73]: fca1f4a80bb48a37 +Block 0024 [ 74]: 04106b8fa9a32d1c +Block 0024 [ 75]: 64d243aa253f7eb1 +Block 0024 [ 76]: 2f763fbb0c2adac4 +Block 0024 [ 77]: edc93685822747f9 +Block 0024 [ 78]: d4cd3faa4576d0ff +Block 0024 [ 79]: cdd3212556200783 +Block 0024 [ 80]: 0f6c01aa978124bc +Block 0024 [ 81]: daf5f1d5f6ebc523 +Block 0024 [ 82]: a6a7d120838f1a38 +Block 0024 [ 83]: a29692c9d853e590 +Block 0024 [ 84]: 7190defba554d3dd +Block 0024 [ 85]: d778f0e9b1a010ea +Block 0024 [ 86]: efca87f19ffc3d91 +Block 0024 [ 87]: d83dc74dad48654f +Block 0024 [ 88]: 83bbcf53dbe87809 +Block 0024 [ 89]: 954a6988f2584a5e +Block 0024 [ 90]: 5fa4f2aa07e61f2d +Block 0024 [ 91]: 4419aa301b0edf63 +Block 0024 [ 92]: ae2a42774762f64f +Block 0024 [ 93]: e8c6383746f81621 +Block 0024 [ 94]: 29c3f2535d94b29c +Block 0024 [ 95]: 0a04988ad66aa658 +Block 0024 [ 96]: 554e3723e34d327f +Block 0024 [ 97]: b8f13dac291e9a97 +Block 0024 [ 98]: 07aecb10260d229f +Block 0024 [ 99]: 34df4da902134c48 +Block 0024 [100]: 6496134cfe2ba958 +Block 0024 [101]: 35b7391dfa167dc7 +Block 0024 [102]: 1b746919447ddb5e +Block 0024 [103]: c567f3eb1deeeaf0 +Block 0024 [104]: 6c38ac1788c46474 +Block 0024 [105]: d95e56354346a0b8 +Block 0024 [106]: cd077f86ac3d4edb +Block 0024 [107]: 1bb1f6b8dc1fb74c +Block 0024 [108]: 34a43954ba7d40b0 +Block 0024 [109]: 8648223359c3c41b +Block 0024 [110]: 91367335cda75388 +Block 0024 [111]: c4c21989dadcacb9 +Block 0024 [112]: ed6f4ff9c4d511b0 +Block 0024 [113]: fa9839f79f324c1f +Block 0024 [114]: f9d30bbf2c448265 +Block 0024 [115]: e77b01d0fb7a56a6 +Block 0024 [116]: 1b32529459898945 +Block 0024 [117]: 597b007f6fce7bd5 +Block 0024 [118]: c2b1361d1d167c45 +Block 0024 [119]: 3af3e20caa6c0158 +Block 0024 [120]: 9e61cd876ca97f38 +Block 0024 [121]: a93f46dfd68eb195 +Block 0024 [122]: cc1861552459b84e +Block 0024 [123]: 7aaf11c61f8ee8cd +Block 0024 [124]: 7010b56bb3d8d5a0 +Block 0024 [125]: eba510b51849285a +Block 0024 [126]: 1c1cdef86a925a57 +Block 0024 [127]: ef174658add9bc4e +Block 0025 [ 0]: 7fec1e914e41b561 +Block 0025 [ 1]: 8d453719a29ade82 +Block 0025 [ 2]: 4c44899c93e4fc6c +Block 0025 [ 3]: 29c0996cb00e492f +Block 0025 [ 4]: f8a70a32463afdaf +Block 0025 [ 5]: 3a7899c650c11af9 +Block 0025 [ 6]: bab6cbf971ef5305 +Block 0025 [ 7]: a8b4f7ba8b398784 +Block 0025 [ 8]: 73211324c30b68f3 +Block 0025 [ 9]: 623fe1e8f3cc900d +Block 0025 [ 10]: dc28af58c2f66a8d +Block 0025 [ 11]: 97cad6d2d8c6a9a0 +Block 0025 [ 12]: 7cd26c2cdb0b33a9 +Block 0025 [ 13]: 4794dfd6fbc171f0 +Block 0025 [ 14]: 05249ce01b3a8164 +Block 0025 [ 15]: b76e3ffe8767ee52 +Block 0025 [ 16]: 7beffefcb5523eff +Block 0025 [ 17]: bb5bc39e22e26736 +Block 0025 [ 18]: ab7961a2693b9b73 +Block 0025 [ 19]: 6209dfcad9e4dd27 +Block 0025 [ 20]: a1e4650c2db6be75 +Block 0025 [ 21]: fda9226ba7242240 +Block 0025 [ 22]: cf61b8b6356eb618 +Block 0025 [ 23]: ac2640d22df34c79 +Block 0025 [ 24]: 5024c3162fc67605 +Block 0025 [ 25]: 02256e53ff6da584 +Block 0025 [ 26]: 93ce393513783a84 +Block 0025 [ 27]: f66dadb003f85c57 +Block 0025 [ 28]: 0845f1d883f7459b +Block 0025 [ 29]: 00c32dc23c554d5d +Block 0025 [ 30]: 8a08a8902817f8a6 +Block 0025 [ 31]: 5308f47b7bb4a416 +Block 0025 [ 32]: 0cbef7467a40258b +Block 0025 [ 33]: e38877ed232a6297 +Block 0025 [ 34]: cd673cc2e015e8c3 +Block 0025 [ 35]: 6ae3ce670e62e29b +Block 0025 [ 36]: 78406412241f4dbf +Block 0025 [ 37]: 82340f60ec09dc7c +Block 0025 [ 38]: 0389649c90d3bd0d +Block 0025 [ 39]: 925d8d83d4a607ed +Block 0025 [ 40]: 2729cf9bf166d4cc +Block 0025 [ 41]: d116cfe5268cffc4 +Block 0025 [ 42]: 6b20a063a5057041 +Block 0025 [ 43]: 695aec8a0fec8f9f +Block 0025 [ 44]: 31ada27506d76516 +Block 0025 [ 45]: bf876ae720b84147 +Block 0025 [ 46]: ca643a7481f8052d +Block 0025 [ 47]: 3aff4d1535fa8346 +Block 0025 [ 48]: e32ffbfb48fa5a47 +Block 0025 [ 49]: ca4cac70a619a571 +Block 0025 [ 50]: d87acc4e60f2ed5b +Block 0025 [ 51]: a6759d0d86d5a6de +Block 0025 [ 52]: 22b94e6b1b2404c8 +Block 0025 [ 53]: 5d393398fcf14d57 +Block 0025 [ 54]: ed5ccc3e832ed159 +Block 0025 [ 55]: 147825a8a16b75a4 +Block 0025 [ 56]: 60e4990ac55196d2 +Block 0025 [ 57]: c274b29fa07122a5 +Block 0025 [ 58]: f508a05f24ed2a53 +Block 0025 [ 59]: 18f64b9695cc5087 +Block 0025 [ 60]: 41301013a11a2eea +Block 0025 [ 61]: cf1f820abded4e61 +Block 0025 [ 62]: f945403230120a27 +Block 0025 [ 63]: 143916edcea38206 +Block 0025 [ 64]: b468dd69c66bc0a2 +Block 0025 [ 65]: e983ac240732b25d +Block 0025 [ 66]: b96d92378b0dd639 +Block 0025 [ 67]: 468af3ef419975a3 +Block 0025 [ 68]: fa16fabd0450c504 +Block 0025 [ 69]: d876668000d8d18b +Block 0025 [ 70]: aa94e1c840e22475 +Block 0025 [ 71]: 0d8c86f2c096de62 +Block 0025 [ 72]: 295fb4a3ed96d94f +Block 0025 [ 73]: 47e05d1e6dbee24b +Block 0025 [ 74]: fd6243959bdbb659 +Block 0025 [ 75]: 10dd4a463ea83767 +Block 0025 [ 76]: 0eaa5cc32a273b99 +Block 0025 [ 77]: 88912904ce45fc60 +Block 0025 [ 78]: ccb0d9f387f74dbd +Block 0025 [ 79]: 405c47e118dee494 +Block 0025 [ 80]: b3f306cf8fea7d62 +Block 0025 [ 81]: 9c91b96d5bb9a697 +Block 0025 [ 82]: 3aa3a7334cb4c9d5 +Block 0025 [ 83]: 77aa2074e793da72 +Block 0025 [ 84]: 373258b45e261ad0 +Block 0025 [ 85]: a51b5dae4eb90126 +Block 0025 [ 86]: fdea9113f6951015 +Block 0025 [ 87]: ef0d4164c8ee9560 +Block 0025 [ 88]: 1d23cb4d4c9e43ac +Block 0025 [ 89]: 42416e0e356e80ab +Block 0025 [ 90]: 803d276ae917a23d +Block 0025 [ 91]: 8369f2919b947247 +Block 0025 [ 92]: 2a2aa71103176ab1 +Block 0025 [ 93]: 57658b2de0fcff86 +Block 0025 [ 94]: 66a2f1e9854343bf +Block 0025 [ 95]: 63a8e311a7610e18 +Block 0025 [ 96]: 6fb19e84fc761401 +Block 0025 [ 97]: 3524af3cb2f85c3e +Block 0025 [ 98]: 7868214e92c478d4 +Block 0025 [ 99]: e58934b63e931f63 +Block 0025 [100]: 0f6f38837b3640c4 +Block 0025 [101]: 7ba53b2d8568d174 +Block 0025 [102]: d4287578bc4b9c80 +Block 0025 [103]: 3b81ca6bb022200e +Block 0025 [104]: 4a1c1961b6f6abef +Block 0025 [105]: 60b02a0b6fe0e5b2 +Block 0025 [106]: 960fe18d397dfc00 +Block 0025 [107]: 497c1301e2120010 +Block 0025 [108]: 2743e5a8fa54d8fd +Block 0025 [109]: d91051c35b6937d9 +Block 0025 [110]: 61cf2d54b6a88b23 +Block 0025 [111]: aa97b9a04103678e +Block 0025 [112]: 88e8cc12ce6811d8 +Block 0025 [113]: 55ffb84df352154f +Block 0025 [114]: bc142122988a14af +Block 0025 [115]: 37de60d0a05f0003 +Block 0025 [116]: 8e24d02b3a35ec25 +Block 0025 [117]: 102c19d5020c7991 +Block 0025 [118]: ecd2c067a6d6325e +Block 0025 [119]: 924903bbe73407f7 +Block 0025 [120]: 672e27fff84fcd25 +Block 0025 [121]: 55952481cec95079 +Block 0025 [122]: 895d0739c3033a5c +Block 0025 [123]: 49849f73384e29a1 +Block 0025 [124]: d886142337a344d5 +Block 0025 [125]: 4059e0437a4c4d45 +Block 0025 [126]: ab9f890c59d37d30 +Block 0025 [127]: d35dccaa6b900138 +Block 0026 [ 0]: eee79f21af3c1e8e +Block 0026 [ 1]: cc2b33ab486fc093 +Block 0026 [ 2]: 7db236b8961a5233 +Block 0026 [ 3]: 319862e736fc58f1 +Block 0026 [ 4]: bdfa5963f1a5be5b +Block 0026 [ 5]: 5cf9608979c5355e +Block 0026 [ 6]: 4175701f1efa27d6 +Block 0026 [ 7]: 24ef75feaae50536 +Block 0026 [ 8]: 955e1030a76356d9 +Block 0026 [ 9]: d4c681c9bdc99c39 +Block 0026 [ 10]: d85f521c1aed09e7 +Block 0026 [ 11]: 45b8930d91788202 +Block 0026 [ 12]: 3d0729ae0f077706 +Block 0026 [ 13]: 6b0aedc4b086f3ee +Block 0026 [ 14]: b13861f6559ad8b2 +Block 0026 [ 15]: 6e5711968499f603 +Block 0026 [ 16]: 2922cc84dace481e +Block 0026 [ 17]: 7bf9a9a7faf8ad75 +Block 0026 [ 18]: 0ea59090b01bb758 +Block 0026 [ 19]: 89fc6435584e1314 +Block 0026 [ 20]: 7d0b42809c01601f +Block 0026 [ 21]: cd0195da60ebc4ca +Block 0026 [ 22]: 4837f09b307c04c7 +Block 0026 [ 23]: 36d3ca566e75c126 +Block 0026 [ 24]: a72fab6fed57b401 +Block 0026 [ 25]: 1ab0894c537871df +Block 0026 [ 26]: 6e53e4d625a51697 +Block 0026 [ 27]: 3da3deee9e4bc1b9 +Block 0026 [ 28]: 3524a0a179c6c924 +Block 0026 [ 29]: 840b3b1ba8ce34b6 +Block 0026 [ 30]: 53632d16b059cd40 +Block 0026 [ 31]: 647a5a5a55faac31 +Block 0026 [ 32]: 549d91d1f69ad199 +Block 0026 [ 33]: 2d0fa16485540e89 +Block 0026 [ 34]: 5a720ab2729b3793 +Block 0026 [ 35]: 22bcd8adb364c826 +Block 0026 [ 36]: a5f4256a78698151 +Block 0026 [ 37]: 5d0db6ce354e4290 +Block 0026 [ 38]: 947386a9e7360515 +Block 0026 [ 39]: 2a602fa9c315d38d +Block 0026 [ 40]: 3b5f77908f5ac97e +Block 0026 [ 41]: f62232e1a9e7c5f2 +Block 0026 [ 42]: 2ddc59304e07afff +Block 0026 [ 43]: 77270e436e65970a +Block 0026 [ 44]: 7f4850d45d0749e0 +Block 0026 [ 45]: d45d4e3f3366ddc9 +Block 0026 [ 46]: b93f772be1a3c78c +Block 0026 [ 47]: 4ef41e1a491b0786 +Block 0026 [ 48]: fa1b81838aadaf3f +Block 0026 [ 49]: 25699d36489510a7 +Block 0026 [ 50]: a545657caf170dd7 +Block 0026 [ 51]: 72017a211d0bbe62 +Block 0026 [ 52]: 1e9f826d09a0cab0 +Block 0026 [ 53]: f460f400efdd444f +Block 0026 [ 54]: a13fe8780376dbd1 +Block 0026 [ 55]: 98de57bda86100c4 +Block 0026 [ 56]: 45ffa1109383aebb +Block 0026 [ 57]: 51140cd9ad461755 +Block 0026 [ 58]: a851fb5f98b0d712 +Block 0026 [ 59]: 129097e9827e8523 +Block 0026 [ 60]: 08d008e8b91022dc +Block 0026 [ 61]: f928103deb0d802f +Block 0026 [ 62]: 38fcb3cbe1b11398 +Block 0026 [ 63]: 884212b2014cbcde +Block 0026 [ 64]: 6eb5e9ea0e3d1e5f +Block 0026 [ 65]: b45d847bfbcc5d82 +Block 0026 [ 66]: fbb702537bcfad8c +Block 0026 [ 67]: 8c61ddcb3cc2c197 +Block 0026 [ 68]: 37d5c6fb5974522f +Block 0026 [ 69]: 8356ebe985ec8ee8 +Block 0026 [ 70]: 80699d5d11742823 +Block 0026 [ 71]: 1bb1bb7a29b5f605 +Block 0026 [ 72]: 563409efa7d51aec +Block 0026 [ 73]: 91f6bbd7bd7840db +Block 0026 [ 74]: 62b862178bbbdeff +Block 0026 [ 75]: 4421a9f0633e5051 +Block 0026 [ 76]: 4a516a9ba47089e1 +Block 0026 [ 77]: 62a99ffac0b6ac28 +Block 0026 [ 78]: b5de42edd231de76 +Block 0026 [ 79]: ab223fa9002f8262 +Block 0026 [ 80]: aa5f21352cb23793 +Block 0026 [ 81]: 2e8aecaff5c1920d +Block 0026 [ 82]: 6fd6c1fa0bdfe9ad +Block 0026 [ 83]: f41b93489dd5d2fc +Block 0026 [ 84]: b5879ed954e3753e +Block 0026 [ 85]: a9a6346518d7265f +Block 0026 [ 86]: 7e55ef6f8be4f96f +Block 0026 [ 87]: 8915bc4f72f7e290 +Block 0026 [ 88]: e8f985beffef4195 +Block 0026 [ 89]: 0df30da439929ad8 +Block 0026 [ 90]: 65715634474e0c57 +Block 0026 [ 91]: cf051f53301a1280 +Block 0026 [ 92]: c13d30b7dbd59dc6 +Block 0026 [ 93]: 24161f8474d19be2 +Block 0026 [ 94]: 360846888ff2e5ed +Block 0026 [ 95]: 38715e7b8b17fc35 +Block 0026 [ 96]: a4741555b86046e8 +Block 0026 [ 97]: aa9a1a9591d65a3e +Block 0026 [ 98]: 767e5303940f01ff +Block 0026 [ 99]: b5247410c8d63475 +Block 0026 [100]: 3925646e1d5aee02 +Block 0026 [101]: 1803e317f46525a6 +Block 0026 [102]: ffcda1f5e28d1756 +Block 0026 [103]: 6567f296ff4f4122 +Block 0026 [104]: 653dd7e1836c5988 +Block 0026 [105]: 886f7c81c988d824 +Block 0026 [106]: 0d013b026518c3dd +Block 0026 [107]: 4fe2dfc65b4fe2d2 +Block 0026 [108]: 0bf2a1b164b22c42 +Block 0026 [109]: c043304c9083f586 +Block 0026 [110]: faea655742205723 +Block 0026 [111]: f42d636411a368a2 +Block 0026 [112]: 61c54f74a70abaf0 +Block 0026 [113]: 2018d953876f6124 +Block 0026 [114]: be334d3bae590130 +Block 0026 [115]: f13b8cf85d13f182 +Block 0026 [116]: f21645954df1cd54 +Block 0026 [117]: 9b737e10256a2fb8 +Block 0026 [118]: b3cf82a575fbe5ab +Block 0026 [119]: 5f265cad6ea1b14f +Block 0026 [120]: 7ac6b2d3ddf28088 +Block 0026 [121]: 8379ed4fae10de46 +Block 0026 [122]: e7079089c6dc636c +Block 0026 [123]: b7baecd0386b51b7 +Block 0026 [124]: 22c242b2a6d72f34 +Block 0026 [125]: 667fe4a58f5d2dcd +Block 0026 [126]: 95fa7431de515fd0 +Block 0026 [127]: e4d3fb6334c9ce97 +Block 0027 [ 0]: 95cc13c27dac11e0 +Block 0027 [ 1]: 9cd4b9d03cfb1dca +Block 0027 [ 2]: 99dc6b6b20905e25 +Block 0027 [ 3]: c65a7b0d85a1b052 +Block 0027 [ 4]: 615780330d0d4fcb +Block 0027 [ 5]: 91063aeab24cc367 +Block 0027 [ 6]: 7fef51645f233b87 +Block 0027 [ 7]: ea98795e8670e73f +Block 0027 [ 8]: b1835ec86b349192 +Block 0027 [ 9]: 98d2ac020adc50b3 +Block 0027 [ 10]: c64169feae7a03ab +Block 0027 [ 11]: 2a0401a8673c849d +Block 0027 [ 12]: 9ec963971adafe0d +Block 0027 [ 13]: 23c8ee325fe41f07 +Block 0027 [ 14]: 9cd9a0ab69d88679 +Block 0027 [ 15]: 70620926995771f7 +Block 0027 [ 16]: 412a42d7552db869 +Block 0027 [ 17]: 127a9d4f512c8c78 +Block 0027 [ 18]: b1f768cb54661374 +Block 0027 [ 19]: 4c40d442e2be9165 +Block 0027 [ 20]: 196a5e740a20c61a +Block 0027 [ 21]: cd756f83cc1e67d1 +Block 0027 [ 22]: 2bd8b214950f2a2b +Block 0027 [ 23]: 89d607084ba66af5 +Block 0027 [ 24]: 94b170d6c657e48d +Block 0027 [ 25]: 47e7d25dee2010a0 +Block 0027 [ 26]: 75274d0f5d1749e0 +Block 0027 [ 27]: ebca58ce3bc31452 +Block 0027 [ 28]: 776047d1eeedd606 +Block 0027 [ 29]: 3407ed41b231de65 +Block 0027 [ 30]: 28839677058efe92 +Block 0027 [ 31]: 4f0ad4617266354d +Block 0027 [ 32]: b58d45fc16ace760 +Block 0027 [ 33]: 0b469c2426665e50 +Block 0027 [ 34]: 9567c3437165695d +Block 0027 [ 35]: 6a33dbd1b503711a +Block 0027 [ 36]: 7fabae608ee3e8b8 +Block 0027 [ 37]: 83db64f31f42033e +Block 0027 [ 38]: a0e5e912cc5d3d3e +Block 0027 [ 39]: 2d7ed49e3cbf01cd +Block 0027 [ 40]: 96d3428f9fb93f11 +Block 0027 [ 41]: cb3ad898f8306b30 +Block 0027 [ 42]: 976498e32043cb2d +Block 0027 [ 43]: a7bf2d8c654826b9 +Block 0027 [ 44]: 1b979445eeb0247c +Block 0027 [ 45]: 4900f21dfd9f261f +Block 0027 [ 46]: 0be7ad994dd83751 +Block 0027 [ 47]: 2a28f760e8cfa6b3 +Block 0027 [ 48]: 4763d85a8b97536d +Block 0027 [ 49]: 03c4986b76d07230 +Block 0027 [ 50]: 9295e3f685a292c0 +Block 0027 [ 51]: 8a13bfda9f53a779 +Block 0027 [ 52]: e6fbc596a08c812f +Block 0027 [ 53]: 6f2c97960a54b9ff +Block 0027 [ 54]: a95b9bb892e33ad9 +Block 0027 [ 55]: 027bdcb1d4b52e75 +Block 0027 [ 56]: 93f6f341920ffdc7 +Block 0027 [ 57]: a1fd97e0f5da32af +Block 0027 [ 58]: 0bcf62886848b1e9 +Block 0027 [ 59]: 6e25a14e5433ac03 +Block 0027 [ 60]: 132fcbfe477f036c +Block 0027 [ 61]: 75a92ed68ce010d8 +Block 0027 [ 62]: 7c83f7bd5b194717 +Block 0027 [ 63]: 9518cd21fd0f176b +Block 0027 [ 64]: c373918eeaff9a99 +Block 0027 [ 65]: f9d5cb0527a0fab2 +Block 0027 [ 66]: 6b8052ee4e6c9eb8 +Block 0027 [ 67]: 4475452b265d8526 +Block 0027 [ 68]: 97ff0a402d283f29 +Block 0027 [ 69]: 47a28f8f668be30b +Block 0027 [ 70]: 0ce6135b75db2705 +Block 0027 [ 71]: f64a8a64b9a8b771 +Block 0027 [ 72]: e1e3bb7060a7fc4b +Block 0027 [ 73]: 02d019461560420d +Block 0027 [ 74]: 2a0c7f3203179483 +Block 0027 [ 75]: 1e53454b8473f274 +Block 0027 [ 76]: b82e79d9ee2fb12c +Block 0027 [ 77]: bf5bb18121a39453 +Block 0027 [ 78]: 13db251407e143e9 +Block 0027 [ 79]: a14c8eeac312f066 +Block 0027 [ 80]: bda30209efbfd004 +Block 0027 [ 81]: a816c337d880067b +Block 0027 [ 82]: 1514d0b15f85f6c5 +Block 0027 [ 83]: 14cfce4e0208bfa9 +Block 0027 [ 84]: 3f51407c083bdf83 +Block 0027 [ 85]: a8f28065fc004cc2 +Block 0027 [ 86]: f568afd0750735d8 +Block 0027 [ 87]: 4ac604a9699fbf25 +Block 0027 [ 88]: 34bb3001275762df +Block 0027 [ 89]: d82c054cbfec3252 +Block 0027 [ 90]: efb756acf812c5af +Block 0027 [ 91]: 5e0c11a707b379c8 +Block 0027 [ 92]: 0c0b52a5aa880fdb +Block 0027 [ 93]: 23895fe21b252e23 +Block 0027 [ 94]: 0e09635640fbadc0 +Block 0027 [ 95]: 39254b4e838b2f32 +Block 0027 [ 96]: ef5aaa0ecfbcbff9 +Block 0027 [ 97]: bb973544611c61b6 +Block 0027 [ 98]: 092b871664df6963 +Block 0027 [ 99]: 9f53a82922c82954 +Block 0027 [100]: dd6b16d4e8a4cc08 +Block 0027 [101]: 729f3afc047e52fa +Block 0027 [102]: bf5afa90e0abcb45 +Block 0027 [103]: d08500e0472967d1 +Block 0027 [104]: 8a01c778549f1d5b +Block 0027 [105]: 508e2cae29cbd162 +Block 0027 [106]: f8aadda50119c6dd +Block 0027 [107]: 6471e9aacb4d3110 +Block 0027 [108]: 587e2be246825736 +Block 0027 [109]: 1c4870ef364e8310 +Block 0027 [110]: 38ff3234b1eab64f +Block 0027 [111]: 4777693323256caa +Block 0027 [112]: 546824a3717104ef +Block 0027 [113]: 7063337898d609ef +Block 0027 [114]: c47e1708358f5032 +Block 0027 [115]: 85a4009bc5ffacc4 +Block 0027 [116]: 6512c7fe4585fe84 +Block 0027 [117]: 64f96860f4ba19d9 +Block 0027 [118]: eea974193a470d0e +Block 0027 [119]: 4123eac778690e31 +Block 0027 [120]: 9e8db8ec03ba056e +Block 0027 [121]: 8d1c8ab5487d9c9e +Block 0027 [122]: 27bc44f8b6608e52 +Block 0027 [123]: c5bd310b76c5194b +Block 0027 [124]: 2dae5cc9b0c327ef +Block 0027 [125]: cd0b20120f305504 +Block 0027 [126]: da0438041b4d5fa6 +Block 0027 [127]: 2ba18b31e43eade9 +Block 0028 [ 0]: ad8685e10cf2f919 +Block 0028 [ 1]: f6d22e193cac9b5f +Block 0028 [ 2]: caf5f2aabad6ad7b +Block 0028 [ 3]: ff5f32793e153b97 +Block 0028 [ 4]: c874a053b7eb1054 +Block 0028 [ 5]: 017ead4ebd2919e1 +Block 0028 [ 6]: 16b3b42213fe9b27 +Block 0028 [ 7]: 51c42934f453d785 +Block 0028 [ 8]: 8a39cfedde85b7fd +Block 0028 [ 9]: 80c9b2edb6cfa758 +Block 0028 [ 10]: 9afbbdc13ebb7c56 +Block 0028 [ 11]: 757e8f7715fb1aec +Block 0028 [ 12]: 4819c7e370720a42 +Block 0028 [ 13]: 6d76add26824ec7c +Block 0028 [ 14]: 61369c6d5ca30058 +Block 0028 [ 15]: 6a45b512fcefd574 +Block 0028 [ 16]: 4b18609149cefbb1 +Block 0028 [ 17]: b4f97ebade05e5d3 +Block 0028 [ 18]: 7daa2261afde9c2f +Block 0028 [ 19]: 66a98710a8c996b3 +Block 0028 [ 20]: 775ec612f0bac175 +Block 0028 [ 21]: 4bec6cc007f93196 +Block 0028 [ 22]: 6b5f0ba5117c13f1 +Block 0028 [ 23]: 3c8c904aea6eb348 +Block 0028 [ 24]: 77d851f25de2106e +Block 0028 [ 25]: 5bc8c342588b6280 +Block 0028 [ 26]: 3b84b6c6c38f1d93 +Block 0028 [ 27]: 3c8d8be0fe63e3a2 +Block 0028 [ 28]: 8e522662eab779fd +Block 0028 [ 29]: 0ecc0852e256f091 +Block 0028 [ 30]: be8f1bc3d5c71d67 +Block 0028 [ 31]: aed364e39a0f9f78 +Block 0028 [ 32]: e9e3a26f011cc0ca +Block 0028 [ 33]: afdca7a6ed0dd0ce +Block 0028 [ 34]: 05e9611dbb492b0c +Block 0028 [ 35]: b2d474ae67fcf6cc +Block 0028 [ 36]: cca9ff415d063e5f +Block 0028 [ 37]: ad9c2063ab1dcfbe +Block 0028 [ 38]: 4a9b800d68b88e2b +Block 0028 [ 39]: cbc3811f6957142f +Block 0028 [ 40]: 4d0503c9d66615c1 +Block 0028 [ 41]: ce3260f867eb4c95 +Block 0028 [ 42]: d1e76a7573c84e69 +Block 0028 [ 43]: c2c0cd96186c1781 +Block 0028 [ 44]: 9f36ee52a4329b7a +Block 0028 [ 45]: 87577edce1de66e6 +Block 0028 [ 46]: 816f80f6b2061edf +Block 0028 [ 47]: 17f9254bbdb5ac9e +Block 0028 [ 48]: e40ba54a1dc58fb0 +Block 0028 [ 49]: c3c1eb8de29e7f18 +Block 0028 [ 50]: 354e33ca9c7dc248 +Block 0028 [ 51]: f9641c60a1a69d30 +Block 0028 [ 52]: 9cbb5f6e87f8c5fd +Block 0028 [ 53]: 64d73e9d34cf28c1 +Block 0028 [ 54]: d242fc42d7f2ffdd +Block 0028 [ 55]: f79e36c08fa89318 +Block 0028 [ 56]: 49e82aaed9ec936f +Block 0028 [ 57]: 1240ee732e47d6a3 +Block 0028 [ 58]: facae1f5c6ac05f4 +Block 0028 [ 59]: 166a45523aeb1bfc +Block 0028 [ 60]: b30a305b36f190f3 +Block 0028 [ 61]: 7d2a4d7e5d29121d +Block 0028 [ 62]: 968f49abe714a1b2 +Block 0028 [ 63]: 1cc6c2145467657a +Block 0028 [ 64]: cc01c5f6fd8a42ff +Block 0028 [ 65]: 024febbd2427e866 +Block 0028 [ 66]: 60a9cee8fce0c2d2 +Block 0028 [ 67]: e1fceead57c03d4e +Block 0028 [ 68]: 726d7063bfa06784 +Block 0028 [ 69]: f688bd3a4835db4e +Block 0028 [ 70]: ddb6cbdf3bc1bb02 +Block 0028 [ 71]: 6fa7b201ec1bc4ca +Block 0028 [ 72]: 95cf4dc66e7625e1 +Block 0028 [ 73]: 6ed3c8efe613bd10 +Block 0028 [ 74]: 757e4772cea3852e +Block 0028 [ 75]: ec993d1bf6628c4e +Block 0028 [ 76]: aafa342b0fca8218 +Block 0028 [ 77]: 3874afd94e642562 +Block 0028 [ 78]: cba5970115ce5176 +Block 0028 [ 79]: a7b71cdd3ad1acb7 +Block 0028 [ 80]: 62333c9468ca0305 +Block 0028 [ 81]: f1ef305c21e55009 +Block 0028 [ 82]: 718435bd796146f8 +Block 0028 [ 83]: 622ccb59f1a22063 +Block 0028 [ 84]: 70f09c47e1a6037c +Block 0028 [ 85]: 63f46f14080976fd +Block 0028 [ 86]: 634f6d468361e03d +Block 0028 [ 87]: a46eb367a206683f +Block 0028 [ 88]: e70c1678cdf68f8e +Block 0028 [ 89]: cbfb3a46a4d51de7 +Block 0028 [ 90]: d9ee4028cebda472 +Block 0028 [ 91]: be5a5e7eb14f4e97 +Block 0028 [ 92]: 54980c3d0e11d17e +Block 0028 [ 93]: 650d4b43e8c1ea7c +Block 0028 [ 94]: 2b416705ae191d8b +Block 0028 [ 95]: 3eaffbb3c482a960 +Block 0028 [ 96]: bd0c8d5322ccc92b +Block 0028 [ 97]: 8fbb7f24539b0a83 +Block 0028 [ 98]: a556eaba9a3ea820 +Block 0028 [ 99]: 7a17a82dccc42eff +Block 0028 [100]: 4ce767729f962f45 +Block 0028 [101]: 2cb0ef025528422e +Block 0028 [102]: f2bd0ef295a5e7ac +Block 0028 [103]: 0c1c521fe8e6e437 +Block 0028 [104]: d89928a6b49ac759 +Block 0028 [105]: 54be46737f4e6f23 +Block 0028 [106]: 60bce70bb0d241d9 +Block 0028 [107]: 54d68c8a0ae774bd +Block 0028 [108]: f0a53cfa33bac937 +Block 0028 [109]: 60a10ff7da90dd83 +Block 0028 [110]: 6853b2706aadea1a +Block 0028 [111]: 24f9ce2b7bc8be46 +Block 0028 [112]: 6c0fe4b51a2e19cf +Block 0028 [113]: 5a982a426db92263 +Block 0028 [114]: 482d0dd31690892b +Block 0028 [115]: 8efdc4d5017429be +Block 0028 [116]: f575bc4565d51dd5 +Block 0028 [117]: 0ea5dd071321eaf6 +Block 0028 [118]: 52fbf8d427e76b99 +Block 0028 [119]: 46b3e05be5e398e8 +Block 0028 [120]: 3ddf2eb3c2b8e700 +Block 0028 [121]: bc78f822a065e9f3 +Block 0028 [122]: bdf8d5b4c5a8ba2d +Block 0028 [123]: f9c2b061b26bd2b7 +Block 0028 [124]: 33fe73f04f25bab5 +Block 0028 [125]: 62e764f93e73da37 +Block 0028 [126]: fa48fb80cf7a027a +Block 0028 [127]: 2fe93dab8fc62031 +Block 0029 [ 0]: 1c25114d080054b2 +Block 0029 [ 1]: 3049978dd3910faa +Block 0029 [ 2]: 630665bb66071a71 +Block 0029 [ 3]: 615f93e0080ad64a +Block 0029 [ 4]: 2e0e1c1bff1818bb +Block 0029 [ 5]: e71abf025fe71ad9 +Block 0029 [ 6]: 8083e314d46d24cb +Block 0029 [ 7]: ef0ec0198e11c2d6 +Block 0029 [ 8]: 9c25fd2cca5a3433 +Block 0029 [ 9]: 17d6327676bc3cbd +Block 0029 [ 10]: 083ba01aa922c0b9 +Block 0029 [ 11]: fc7476498b286d72 +Block 0029 [ 12]: 45ef0a52cb9120c0 +Block 0029 [ 13]: bc92315cd1ad1289 +Block 0029 [ 14]: 8adbd6b2d9def208 +Block 0029 [ 15]: ef7f1d7f6b273fdd +Block 0029 [ 16]: e1a66a8a177b0e92 +Block 0029 [ 17]: 7f0c17759a6a2c81 +Block 0029 [ 18]: 74f038a1222ade0b +Block 0029 [ 19]: e6b639a3ee39c877 +Block 0029 [ 20]: 8e8271212187b0ed +Block 0029 [ 21]: d1119b8a538012b7 +Block 0029 [ 22]: 9684a1db67815f03 +Block 0029 [ 23]: 92f13cbbc4511e8e +Block 0029 [ 24]: 04402e8baa138996 +Block 0029 [ 25]: 1421773017b7fcd0 +Block 0029 [ 26]: 425e4a2efb095890 +Block 0029 [ 27]: 615c4f54d6c05360 +Block 0029 [ 28]: 3cc3440506895656 +Block 0029 [ 29]: fbf3191e5e1dec36 +Block 0029 [ 30]: 00924a5c517f3ba5 +Block 0029 [ 31]: 641949bc41558437 +Block 0029 [ 32]: 95851f54663602d5 +Block 0029 [ 33]: 13518907e57abcab +Block 0029 [ 34]: 10df5be39581451d +Block 0029 [ 35]: 8c26dfc57214aa1f +Block 0029 [ 36]: 440d0670541231b7 +Block 0029 [ 37]: 22adc451023f7135 +Block 0029 [ 38]: bf90ad6b7d57a9d8 +Block 0029 [ 39]: 65f314a76571d0e6 +Block 0029 [ 40]: 4521c4fe7648e0e5 +Block 0029 [ 41]: a7819acc24b48997 +Block 0029 [ 42]: 9cbe988f344202aa +Block 0029 [ 43]: a5d8ca9a782a8d01 +Block 0029 [ 44]: 402a6cbbab4fbaac +Block 0029 [ 45]: bdcb98d56cf4b174 +Block 0029 [ 46]: 0fb55ee8828984d7 +Block 0029 [ 47]: cba941a9289119f2 +Block 0029 [ 48]: 406e10fe6482ae08 +Block 0029 [ 49]: 2ddf615535d61c97 +Block 0029 [ 50]: 1169c7db459d36b5 +Block 0029 [ 51]: 7c69e32963774bc5 +Block 0029 [ 52]: bab51bdf732a22a9 +Block 0029 [ 53]: 72338e75da6941d7 +Block 0029 [ 54]: 05cdf8d4d23c1510 +Block 0029 [ 55]: 2404f79400e9fa76 +Block 0029 [ 56]: 847854111a5076f3 +Block 0029 [ 57]: e28e0bbd9ac7c69e +Block 0029 [ 58]: f3fd0ca625676710 +Block 0029 [ 59]: 002d56307624a3de +Block 0029 [ 60]: 133b4d50c98238bc +Block 0029 [ 61]: 3db2517e7c12314a +Block 0029 [ 62]: 2887c63233a5c95c +Block 0029 [ 63]: 5b3df7053a5627f1 +Block 0029 [ 64]: f2373bec9848cf4b +Block 0029 [ 65]: 4f588754eec3c136 +Block 0029 [ 66]: 9b21f67a882b1990 +Block 0029 [ 67]: 243398980ba0d418 +Block 0029 [ 68]: b8a6edd946336b02 +Block 0029 [ 69]: 972f614eaf755f5d +Block 0029 [ 70]: 95074346cac8ed2b +Block 0029 [ 71]: 3ac12cf785f77d86 +Block 0029 [ 72]: 60f68806dd076b17 +Block 0029 [ 73]: d17fd5032a3d6b02 +Block 0029 [ 74]: 814f967198fec4c8 +Block 0029 [ 75]: 83f7d4dadafc179b +Block 0029 [ 76]: e709c02efada24c5 +Block 0029 [ 77]: 0d0580392c94ef2b +Block 0029 [ 78]: 046f19ac94b708f0 +Block 0029 [ 79]: f72fd5548fe8734f +Block 0029 [ 80]: cf00ecb33d557287 +Block 0029 [ 81]: e92d7ff78dade0f8 +Block 0029 [ 82]: 40598f10781e56ff +Block 0029 [ 83]: 040feadfeed71c71 +Block 0029 [ 84]: 1063149856339077 +Block 0029 [ 85]: 4aa74045e43ea7e2 +Block 0029 [ 86]: 26bc42c15328824a +Block 0029 [ 87]: 30a9638eaf11ce13 +Block 0029 [ 88]: 2dab95d3873af38f +Block 0029 [ 89]: 1118fe8e5f9278f5 +Block 0029 [ 90]: 16a7a469defe11a0 +Block 0029 [ 91]: db2c2013d8e6ea43 +Block 0029 [ 92]: 7b4773221d047734 +Block 0029 [ 93]: 4a1983262693af37 +Block 0029 [ 94]: f06ee2140af0a9f9 +Block 0029 [ 95]: 850d8f5b7be81399 +Block 0029 [ 96]: 1a32294f6575ad23 +Block 0029 [ 97]: fe3be63e5a2e6017 +Block 0029 [ 98]: 62805a7392fd4ffb +Block 0029 [ 99]: 1b33f67dec4b3903 +Block 0029 [100]: 9984dc27e9ad088f +Block 0029 [101]: 812c94fe8957095c +Block 0029 [102]: cc8fb61d7c16933a +Block 0029 [103]: 85f5d2ab0045cefd +Block 0029 [104]: 1503d44775433d09 +Block 0029 [105]: 652bfd106009a78e +Block 0029 [106]: e24f695c93fd5286 +Block 0029 [107]: 52404a1998c8ecff +Block 0029 [108]: 7e6ea513c1f5d6da +Block 0029 [109]: eb3a8171f4c3792f +Block 0029 [110]: e07da16a2319a335 +Block 0029 [111]: 381983c2feec9e07 +Block 0029 [112]: 714b1e5e148d6efb +Block 0029 [113]: e8058f7258172de5 +Block 0029 [114]: ca88c08a5a4b3cd1 +Block 0029 [115]: a7964146721530a4 +Block 0029 [116]: ebda1b93e6508268 +Block 0029 [117]: 1db938a8c1b0fb0d +Block 0029 [118]: 5fc6ea1a90e9039f +Block 0029 [119]: 460363f3dfbc6922 +Block 0029 [120]: 3c47febd956a90d4 +Block 0029 [121]: 5bf8e6cf0e64a21f +Block 0029 [122]: 1f453952acab6593 +Block 0029 [123]: 223e2d93bb88d64e +Block 0029 [124]: b444bb7bffbf06a9 +Block 0029 [125]: 6a38ebfc13ea2972 +Block 0029 [126]: e2eef6c6de25759d +Block 0029 [127]: 9768792450c49524 +Block 0030 [ 0]: 7ba3f579ddca2190 +Block 0030 [ 1]: 22d29b3c61068d60 +Block 0030 [ 2]: 87e20cd13655d9e0 +Block 0030 [ 3]: 504338f38abb9345 +Block 0030 [ 4]: 203c4012aeca1437 +Block 0030 [ 5]: 7329325b4838e0af +Block 0030 [ 6]: bb401b9ee25b488f +Block 0030 [ 7]: b1ef9f8114b85fa7 +Block 0030 [ 8]: 1040cc21ec703f3a +Block 0030 [ 9]: 4024e59925036861 +Block 0030 [ 10]: 4f81c9b2909a55da +Block 0030 [ 11]: a2cfa25e0e056fee +Block 0030 [ 12]: 83597c4710a6133e +Block 0030 [ 13]: 10b0b67df1881d63 +Block 0030 [ 14]: 32537c2d1bf8dbf4 +Block 0030 [ 15]: 2309f58471c388ef +Block 0030 [ 16]: 4a92e3537e0f7ec3 +Block 0030 [ 17]: 7d7bcdb20434f4b3 +Block 0030 [ 18]: 41ce82991845a620 +Block 0030 [ 19]: 941e16e476dd2690 +Block 0030 [ 20]: 6722b57a04e8a452 +Block 0030 [ 21]: b362caa175d37ccf +Block 0030 [ 22]: e6da12fe73f8a7a4 +Block 0030 [ 23]: ab91792510f58cc9 +Block 0030 [ 24]: 2f276058b3ca8b9e +Block 0030 [ 25]: d03fcd3844ead151 +Block 0030 [ 26]: 2bbbcbb509696ccc +Block 0030 [ 27]: a3c4cbea53e221b4 +Block 0030 [ 28]: 0ca8c51c32abbd85 +Block 0030 [ 29]: 12cecfde86337188 +Block 0030 [ 30]: 9115c3760647e3e0 +Block 0030 [ 31]: f0872dd56649161c +Block 0030 [ 32]: 8323778bd67875eb +Block 0030 [ 33]: 20a38125a1456cdf +Block 0030 [ 34]: c7132e10f95659b5 +Block 0030 [ 35]: 43550cbfaf96e971 +Block 0030 [ 36]: 906c6e43621fb3ab +Block 0030 [ 37]: a96773c8c2bf7bb8 +Block 0030 [ 38]: 77d9183329e7d8db +Block 0030 [ 39]: 976779ce3d284ef1 +Block 0030 [ 40]: fd3d3938f738f649 +Block 0030 [ 41]: 604939458597a8f2 +Block 0030 [ 42]: c16d61d770651c85 +Block 0030 [ 43]: 1788013376bf8022 +Block 0030 [ 44]: 22a75751a1a17395 +Block 0030 [ 45]: 7829de955a6b8108 +Block 0030 [ 46]: 0022a57f1fb5f1a2 +Block 0030 [ 47]: 41994f78614e71f8 +Block 0030 [ 48]: f90c7409006cdef3 +Block 0030 [ 49]: 6a5cfff126910613 +Block 0030 [ 50]: 71c80cab4e5b7d18 +Block 0030 [ 51]: fa8aa1522ce8b68d +Block 0030 [ 52]: 820294d934fd6ced +Block 0030 [ 53]: d5e0cc4de5354cd7 +Block 0030 [ 54]: fcceb29cda3fbb78 +Block 0030 [ 55]: b594083617ab7aa0 +Block 0030 [ 56]: e325471e296b5e13 +Block 0030 [ 57]: f5a3bfa29afd89d9 +Block 0030 [ 58]: 8365b026b7ae8265 +Block 0030 [ 59]: 06c4fdf81946a2d5 +Block 0030 [ 60]: 5c48237336016b39 +Block 0030 [ 61]: 09530a283cfd6aab +Block 0030 [ 62]: cc6a6548585a674c +Block 0030 [ 63]: 9ff25b0d09e3e588 +Block 0030 [ 64]: 74b16415b3a2942c +Block 0030 [ 65]: a2e929656474b2cc +Block 0030 [ 66]: f4c527bff2e0e132 +Block 0030 [ 67]: ed1f016e22c6bd7f +Block 0030 [ 68]: 6eabcdb711291cbf +Block 0030 [ 69]: 1afcd226b75700c6 +Block 0030 [ 70]: 38c0c65b11670ab6 +Block 0030 [ 71]: d8ce9e6ece91a980 +Block 0030 [ 72]: 798152643540f8d7 +Block 0030 [ 73]: c6b670b1959efccc +Block 0030 [ 74]: b1e22df81dd3fedf +Block 0030 [ 75]: 9e1f11ba0e058be6 +Block 0030 [ 76]: 07bd69d09794811a +Block 0030 [ 77]: 2ec47cbcbddeaeaf +Block 0030 [ 78]: 2df03bc4ba861b66 +Block 0030 [ 79]: ba773ed001496798 +Block 0030 [ 80]: 569b7778aff8670b +Block 0030 [ 81]: f46700e1c69e0435 +Block 0030 [ 82]: 5d74c9c45ba0de59 +Block 0030 [ 83]: 663e4cc2d268901a +Block 0030 [ 84]: 00ed57ccb43adc65 +Block 0030 [ 85]: f1028091a25d523a +Block 0030 [ 86]: b58ed0b0be701cb5 +Block 0030 [ 87]: 7ec399c9d0e0541e +Block 0030 [ 88]: a19d52d03c224f50 +Block 0030 [ 89]: aec2c87ef572e728 +Block 0030 [ 90]: 86cb9de77d58a1ed +Block 0030 [ 91]: 8916cdedc2f849a7 +Block 0030 [ 92]: 923cd22741ba9877 +Block 0030 [ 93]: bad3241c62d70131 +Block 0030 [ 94]: b8c8a46b492cd0cf +Block 0030 [ 95]: 583734e81f9b799f +Block 0030 [ 96]: 99f4c7482bd62b5f +Block 0030 [ 97]: 662934d9c8f13647 +Block 0030 [ 98]: ddde62fd5a66320a +Block 0030 [ 99]: 36b6b76c7659e86a +Block 0030 [100]: a8a030b06bf008c3 +Block 0030 [101]: 4091921778cf0f24 +Block 0030 [102]: f81c778387bdbe2a +Block 0030 [103]: 2d6fda29822ccf34 +Block 0030 [104]: 248cd0848efa0c98 +Block 0030 [105]: 2c95378b298a51b2 +Block 0030 [106]: beef562930250524 +Block 0030 [107]: 297b07c36a410f16 +Block 0030 [108]: 81610babf47ce7c5 +Block 0030 [109]: 1ef0a62159d4fe68 +Block 0030 [110]: 123b278bfdc3cd4c +Block 0030 [111]: cb138a7cf3457b3b +Block 0030 [112]: 824a513598683458 +Block 0030 [113]: b95ad1a909d09977 +Block 0030 [114]: f440f03dd9315c6d +Block 0030 [115]: 38f7b95bb7a655f9 +Block 0030 [116]: 1aa8af7867cf8c4a +Block 0030 [117]: efbbb9c8ec4864fc +Block 0030 [118]: 2a65eab6449268f7 +Block 0030 [119]: 78445cb93766fe81 +Block 0030 [120]: 91e91b63495526ae +Block 0030 [121]: 58472c829e44b0ce +Block 0030 [122]: d6979f417e37ce01 +Block 0030 [123]: 50e1ee7e7bbcadc6 +Block 0030 [124]: ac9e9063117ce00a +Block 0030 [125]: 724bbcb180df74f7 +Block 0030 [126]: 81731221098e1b21 +Block 0030 [127]: c8a2a98bbc450bcd +Block 0031 [ 0]: 045d89b2fef33cae +Block 0031 [ 1]: 4e612fc089c32623 +Block 0031 [ 2]: 619e71d9bb28fd39 +Block 0031 [ 3]: 27c3e53832cf0a19 +Block 0031 [ 4]: 64bb6a5d7ec18d9d +Block 0031 [ 5]: 18ed96ac0b1c3404 +Block 0031 [ 6]: 6c2d9ab21881ebd2 +Block 0031 [ 7]: bdfced95a3534f2e +Block 0031 [ 8]: 7b94334f82a87289 +Block 0031 [ 9]: 99ce29bbd4828ee3 +Block 0031 [ 10]: 1382201a56c62bd1 +Block 0031 [ 11]: 4c3aecadfffa1945 +Block 0031 [ 12]: 5d02d36270de91d2 +Block 0031 [ 13]: 194281f0b57ab6ca +Block 0031 [ 14]: 17990c3c8c43ea86 +Block 0031 [ 15]: c2613028a91da2bc +Block 0031 [ 16]: dc3c6a6ec19da0b0 +Block 0031 [ 17]: 36e4423274b42bf8 +Block 0031 [ 18]: ad8b2b684edeb541 +Block 0031 [ 19]: 08eb08aad913784e +Block 0031 [ 20]: 1cc66b7889948507 +Block 0031 [ 21]: 947d8151367f648b +Block 0031 [ 22]: 593aca6896c0d97f +Block 0031 [ 23]: d4302083d98bc450 +Block 0031 [ 24]: 5a8574574458868c +Block 0031 [ 25]: 1358e4ef5db7ba7d +Block 0031 [ 26]: 17069e66d9b3d800 +Block 0031 [ 27]: 576bcf035773c6b1 +Block 0031 [ 28]: 538d9e73892dd9f7 +Block 0031 [ 29]: 6674a874367c772c +Block 0031 [ 30]: b13ea5a6e9df9ec6 +Block 0031 [ 31]: dcad1575df673343 +Block 0031 [ 32]: 050f04429eb1712b +Block 0031 [ 33]: 264e02bb067c8b4a +Block 0031 [ 34]: fed0d6d4f132aff4 +Block 0031 [ 35]: de49da3e89765b84 +Block 0031 [ 36]: f310a259437af7b7 +Block 0031 [ 37]: 96cba3209fdb91a4 +Block 0031 [ 38]: e1713be8fe273a54 +Block 0031 [ 39]: 72aa9606b5970df7 +Block 0031 [ 40]: 2952b1adbf775bb1 +Block 0031 [ 41]: 16bbf6b77d65e6ec +Block 0031 [ 42]: 8320bcdca2785491 +Block 0031 [ 43]: 37d95f58b90bab98 +Block 0031 [ 44]: 328bfb2bbff04f24 +Block 0031 [ 45]: 60f95e2c47abf3c9 +Block 0031 [ 46]: 8114ebf4c06c1fd5 +Block 0031 [ 47]: 987744ea5dd44993 +Block 0031 [ 48]: 1a52f5fbf382b4a1 +Block 0031 [ 49]: d3da784814b828d0 +Block 0031 [ 50]: 52160ed0d7d97b05 +Block 0031 [ 51]: c2f4933259e6811f +Block 0031 [ 52]: 5185c163da681943 +Block 0031 [ 53]: 8b23845e2e3882da +Block 0031 [ 54]: 80d9fac6cb2145c7 +Block 0031 [ 55]: bd41dce9bf49293d +Block 0031 [ 56]: f9c2b9b968add98d +Block 0031 [ 57]: adc8c1c37a5b3d0e +Block 0031 [ 58]: 44425cb926b1bff6 +Block 0031 [ 59]: d1b13e628afc2ebf +Block 0031 [ 60]: 55eb2ae5a985d74f +Block 0031 [ 61]: 766c24a1bf79b78a +Block 0031 [ 62]: d51884b12c88cb82 +Block 0031 [ 63]: 5d0e445e6570dce8 +Block 0031 [ 64]: 4e21b48646f9a771 +Block 0031 [ 65]: 0bd4d6db21e72904 +Block 0031 [ 66]: 4da30953463891b9 +Block 0031 [ 67]: 0b0814f7ff59b523 +Block 0031 [ 68]: d35ade128a30c877 +Block 0031 [ 69]: 420b85f8cc8377d5 +Block 0031 [ 70]: 44daac39899181fc +Block 0031 [ 71]: a3878fc959ebeccb +Block 0031 [ 72]: 3bc2ccee5ae74f04 +Block 0031 [ 73]: 825aee9eed476634 +Block 0031 [ 74]: e59cf558fd5436ef +Block 0031 [ 75]: de17bb16683b18d5 +Block 0031 [ 76]: 97332d9e6a8a9ecf +Block 0031 [ 77]: f08e0091c43ee3d8 +Block 0031 [ 78]: 306922dc76b5ae0d +Block 0031 [ 79]: feff7c3426166bce +Block 0031 [ 80]: 777c10e8ddddde60 +Block 0031 [ 81]: 295055e9b9b5424f +Block 0031 [ 82]: cec9b5204d1939aa +Block 0031 [ 83]: c8bef3c029ca1f65 +Block 0031 [ 84]: 821259a846615ffe +Block 0031 [ 85]: 6d7ee283234891a8 +Block 0031 [ 86]: ecd0d3ed18aac687 +Block 0031 [ 87]: b996bb7bd69d65fd +Block 0031 [ 88]: 308a1a6df3ac818f +Block 0031 [ 89]: 8ef7e58d209370ee +Block 0031 [ 90]: 4fbdbaed220cc53c +Block 0031 [ 91]: fbd95a395f35c150 +Block 0031 [ 92]: e5dbdc7151568326 +Block 0031 [ 93]: bfeb05033d338aab +Block 0031 [ 94]: 6b46732eb7a71a53 +Block 0031 [ 95]: 9a92d880da129da1 +Block 0031 [ 96]: 0a37604a4211898c +Block 0031 [ 97]: f428a8da533063bb +Block 0031 [ 98]: cb0045208c1e3454 +Block 0031 [ 99]: 0f4d726112cc9b2f +Block 0031 [100]: 11f1e6024bcd910d +Block 0031 [101]: f7318f0bd5bee90d +Block 0031 [102]: a297c92f45a29d29 +Block 0031 [103]: 059bc108e5efce3a +Block 0031 [104]: 59e3a1e984eb056d +Block 0031 [105]: 46b15c158c83b579 +Block 0031 [106]: 806e5e022db2e538 +Block 0031 [107]: bd279d5e3ede5f38 +Block 0031 [108]: d2b1a4167a1a1137 +Block 0031 [109]: 2ea81a04f1325445 +Block 0031 [110]: e25e685daabbfbac +Block 0031 [111]: 2401ac591482c6e7 +Block 0031 [112]: 402eb1307a787cc2 +Block 0031 [113]: 57bd18111412a735 +Block 0031 [114]: 5725174a85050656 +Block 0031 [115]: fd12978efd937b2b +Block 0031 [116]: 2364d2d3f85cf135 +Block 0031 [117]: 5215c25a1af83d5f +Block 0031 [118]: cb2275ad0647eede +Block 0031 [119]: fef22902860e8f90 +Block 0031 [120]: 9e44297bb1235d52 +Block 0031 [121]: ec31c49dc6741f04 +Block 0031 [122]: 649cb1eb5bb62de1 +Block 0031 [123]: 4df8c0ca005c51c3 +Block 0031 [124]: 68cf72fccc7112b9 +Block 0031 [125]: 91e8c6f8bb0ad70d +Block 0031 [126]: 4f59c8bd65cbb765 +Block 0031 [127]: 71e436f035f30ed0 +Tag: c8 14 d9 d1 dc 7f 37 aa 13 f0 d7 7f 24 94 bd a1 c8 de 6b 01 6d d3 88 d2 99 52 a4 c4 67 2b 6c e8 diff --git a/deps/phc-winner-argon2-20190702/kats/argon2i.shasum b/deps/phc-winner-argon2-20190702/kats/argon2i.shasum new file mode 100644 index 000000000..eda8d2e3b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2i.shasum @@ -0,0 +1 @@ +40a3aeafb092d10cf457a8ee0139c114c911ecf97bd5accf5a99c7ddd6917061 argon2i diff --git a/deps/phc-winner-argon2-20190702/kats/argon2i_v16 b/deps/phc-winner-argon2-20190702/kats/argon2i_v16 new file mode 100644 index 000000000..173ec023d --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2i_v16 @@ -0,0 +1,12304 @@ +======================================= +Argon2i version number 16 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: 1c dc ec c8 58 ca 1b 6d 45 c7 3c 78 d0 00 76 c5 ec fc 5e df 14 45 b4 43 73 97 b1 b8 20 83 ff bf e3 c9 1a a8 f5 06 67 ad 8f b9 d4 e7 52 df b3 85 34 71 9f ba d2 22 61 33 7b 2b 55 29 81 44 09 af + + After pass 0: +Block 0000 [ 0]: 6126d83b5f468363 +Block 0000 [ 1]: 9cec095773e5c7f8 +Block 0000 [ 2]: a84490b8594d238b +Block 0000 [ 3]: 86d7c7521b274d47 +Block 0000 [ 4]: 16aac5132c95105a +Block 0000 [ 5]: 54cf92650efc678a +Block 0000 [ 6]: e5760496d9207afb +Block 0000 [ 7]: 73607b15c2c78c86 +Block 0000 [ 8]: 68c80dce96859e75 +Block 0000 [ 9]: 0db622c99a22a2c5 +Block 0000 [ 10]: 086c753c14616114 +Block 0000 [ 11]: 1fd8377e636de79a +Block 0000 [ 12]: 43f36cb6dbd379be +Block 0000 [ 13]: f3341d9504df2bcb +Block 0000 [ 14]: 3879688fac8074c2 +Block 0000 [ 15]: 71f8cfcd8d86a5ed +Block 0000 [ 16]: 15292c0733f9f8f3 +Block 0000 [ 17]: bf220d19096cccf9 +Block 0000 [ 18]: 6864881c48351e87 +Block 0000 [ 19]: 3f7b64feac03bce2 +Block 0000 [ 20]: 2fa888497c07adf2 +Block 0000 [ 21]: c83602a08906d723 +Block 0000 [ 22]: ed1689618b780c75 +Block 0000 [ 23]: 767529d68b6e5521 +Block 0000 [ 24]: 17c3be6adc708cb5 +Block 0000 [ 25]: b95620c1d8a30c10 +Block 0000 [ 26]: 9f31bffc559b4ad4 +Block 0000 [ 27]: 7b6b7f96f53bb140 +Block 0000 [ 28]: 22a444f84cff8b57 +Block 0000 [ 29]: ebbafed985afb9e8 +Block 0000 [ 30]: ee14d542a4a02cdf +Block 0000 [ 31]: 5344c6fb9868f64a +Block 0000 [ 32]: 9a735a38656ad1ac +Block 0000 [ 33]: 2d312367c8ed15d4 +Block 0000 [ 34]: a27c4eed35237b88 +Block 0000 [ 35]: 9a2738107e55c09d +Block 0000 [ 36]: 6469b001f096721e +Block 0000 [ 37]: e0c1fcda0c416371 +Block 0000 [ 38]: 7d93d0d141fc441e +Block 0000 [ 39]: e16df9690e7dfab6 +Block 0000 [ 40]: bcd40d45bc5f29b7 +Block 0000 [ 41]: 04e28612ee435e2d +Block 0000 [ 42]: f0503ca50e2613e0 +Block 0000 [ 43]: 16aff99842004bff +Block 0000 [ 44]: db80c479037c7341 +Block 0000 [ 45]: 3c0f3c5fb9df5453 +Block 0000 [ 46]: 2925f5e03e0fc637 +Block 0000 [ 47]: c355a96ae6aafd32 +Block 0000 [ 48]: 9e1de5a5c025a425 +Block 0000 [ 49]: d2771ce35d37f4a3 +Block 0000 [ 50]: 09a3d1fe048dab61 +Block 0000 [ 51]: 5a7a53f847dddeab +Block 0000 [ 52]: 09b1981f68879719 +Block 0000 [ 53]: 859259a2c6f6ecf9 +Block 0000 [ 54]: 7f1ae20e3c6194bd +Block 0000 [ 55]: 4976b29d1b927454 +Block 0000 [ 56]: 193f7c26c9631d2e +Block 0000 [ 57]: b64561e3fdb2eab1 +Block 0000 [ 58]: c258b7f17c258b1e +Block 0000 [ 59]: eaff69021f31833d +Block 0000 [ 60]: 8122ce733bef6097 +Block 0000 [ 61]: 3a0dfe60c8e1c168 +Block 0000 [ 62]: 482c1026fb53178a +Block 0000 [ 63]: 152902c04dce5e68 +Block 0000 [ 64]: 51d2259aed46e79c +Block 0000 [ 65]: 2e2eba00224ef895 +Block 0000 [ 66]: a551c68118673401 +Block 0000 [ 67]: c5f8bc7582a504a6 +Block 0000 [ 68]: 016006bd31e9ab43 +Block 0000 [ 69]: 481174e08a737735 +Block 0000 [ 70]: 20729d08a9c3b628 +Block 0000 [ 71]: b591394c7087860d +Block 0000 [ 72]: ea18d459ccaad353 +Block 0000 [ 73]: e7194fa273999f61 +Block 0000 [ 74]: 87b0fe402d666f40 +Block 0000 [ 75]: 024173d9a832f146 +Block 0000 [ 76]: 5bc42a7e424b22dc +Block 0000 [ 77]: 0fc06bb16b038380 +Block 0000 [ 78]: 383dc71785510d0d +Block 0000 [ 79]: c9d4f74c814623a6 +Block 0000 [ 80]: 641fe35196d102a0 +Block 0000 [ 81]: 7be5646169de6e15 +Block 0000 [ 82]: 4b63bbbfee994ef4 +Block 0000 [ 83]: f4d00905bed63c10 +Block 0000 [ 84]: f504a390bd52851b +Block 0000 [ 85]: c7fb46861975facc +Block 0000 [ 86]: e0de393085b3266d +Block 0000 [ 87]: 2a02a46e04ae3fa4 +Block 0000 [ 88]: e3fafc272d96d1b4 +Block 0000 [ 89]: e8ac1b6b0bad54b2 +Block 0000 [ 90]: b7dd7d62d0032fb8 +Block 0000 [ 91]: c1234d0d3389d412 +Block 0000 [ 92]: dd7ddcd2ffd6e04f +Block 0000 [ 93]: f2d7f262ecae94d9 +Block 0000 [ 94]: 419b597a15d167b6 +Block 0000 [ 95]: c4f2c9379b9a3154 +Block 0000 [ 96]: 006161370212d3b7 +Block 0000 [ 97]: e16892fa7f773edd +Block 0000 [ 98]: 90580be4dd441d12 +Block 0000 [ 99]: 78aeffd87f012ac5 +Block 0000 [100]: 0fb81138826cbc2b +Block 0000 [101]: 64a426a5e1791e8d +Block 0000 [102]: 3c66e38936a602f3 +Block 0000 [103]: a89c993bb0499fe2 +Block 0000 [104]: e6cbc1df59d1885e +Block 0000 [105]: bf38ae6bb2d4769a +Block 0000 [106]: 37ca1944b603ee41 +Block 0000 [107]: 8ff503377e1072d4 +Block 0000 [108]: 922633b17f9ccaf4 +Block 0000 [109]: 56d31d1f20067b7c +Block 0000 [110]: 1b4d792e51d685c7 +Block 0000 [111]: 91a44b2a93de6b8c +Block 0000 [112]: b15d5c7ff3e9c59d +Block 0000 [113]: e9592fbe759d075c +Block 0000 [114]: 57a8176f7ce9f926 +Block 0000 [115]: fe4d2b861ed7d098 +Block 0000 [116]: 032053e827a76ae4 +Block 0000 [117]: e36be8b30b418994 +Block 0000 [118]: 5f98474597bc3bec +Block 0000 [119]: 5957eaee755491e2 +Block 0000 [120]: d9e0725e803c1c07 +Block 0000 [121]: 266075388fd82552 +Block 0000 [122]: 445a45e21df8f188 +Block 0000 [123]: 60a723ac7c2094a4 +Block 0000 [124]: fc1a2264395abc60 +Block 0000 [125]: aff3ef6f5e074ab4 +Block 0000 [126]: 14a0d19a17b1dee6 +Block 0000 [127]: 88aca67a1ba1eb77 +Block 0001 [ 0]: 92f6a137c0116c49 +Block 0001 [ 1]: e5d1db692d347116 +Block 0001 [ 2]: cbbc23afa412c0ea +Block 0001 [ 3]: 4608ae1fefbf6190 +Block 0001 [ 4]: b6c69c46fe10980d +Block 0001 [ 5]: 3e8dc5292577d451 +Block 0001 [ 6]: b2e5fd338710a60f +Block 0001 [ 7]: 9b15da0956e750e9 +Block 0001 [ 8]: 38e6b65004ae22b7 +Block 0001 [ 9]: bb6f0805d7e41838 +Block 0001 [ 10]: f30692ae7925cd6f +Block 0001 [ 11]: c3aaecfd3bc42cab +Block 0001 [ 12]: 40ae8704cbc43eb3 +Block 0001 [ 13]: 396b0210df3d5259 +Block 0001 [ 14]: b1c6d3ef23e17d05 +Block 0001 [ 15]: e28b54f6f76dc643 +Block 0001 [ 16]: 6d37b5b3d8d148dc +Block 0001 [ 17]: 488fd552a2adf0cd +Block 0001 [ 18]: 20c3ec97ff51a0f9 +Block 0001 [ 19]: 4afbc70841dcb9a1 +Block 0001 [ 20]: 749d23053fef9e27 +Block 0001 [ 21]: d34e0743ccb60326 +Block 0001 [ 22]: 4c7003c00f6301c7 +Block 0001 [ 23]: a0c64f1efef2bbc0 +Block 0001 [ 24]: 68598d652cd039ac +Block 0001 [ 25]: ec6ef77eb3f130c7 +Block 0001 [ 26]: 4192ac59c1334185 +Block 0001 [ 27]: 3ba7656e7c7a2f56 +Block 0001 [ 28]: 8e7dc7a60815d820 +Block 0001 [ 29]: 476dc8d7b7d42d66 +Block 0001 [ 30]: 540b485f1a99f74c +Block 0001 [ 31]: e716e1fb8dc69710 +Block 0001 [ 32]: 6e195ca6cb50f9f3 +Block 0001 [ 33]: 8f36a6ee0da6dca7 +Block 0001 [ 34]: 7b5db8356ef1eb93 +Block 0001 [ 35]: 91140488c13fefbc +Block 0001 [ 36]: 5b56e3a18aff3217 +Block 0001 [ 37]: 370fc9d02e5fe3f3 +Block 0001 [ 38]: 4481fb4fb2ebc19d +Block 0001 [ 39]: ee8fba7c535c1bc1 +Block 0001 [ 40]: 4bcf4833510f8629 +Block 0001 [ 41]: 8b227c4bf2b48a58 +Block 0001 [ 42]: 2af8ade6f3ba0841 +Block 0001 [ 43]: d0db6ac77a485870 +Block 0001 [ 44]: 916c69962dc6559d +Block 0001 [ 45]: f4885d9b8596d135 +Block 0001 [ 46]: 4f7ae3e6c229d186 +Block 0001 [ 47]: 9a4e75876ca9f1ec +Block 0001 [ 48]: aee24bbeaaeecc3f +Block 0001 [ 49]: cb219d5fdbeaab9e +Block 0001 [ 50]: 5261aaea4dc3b83e +Block 0001 [ 51]: b385b79bc7afff44 +Block 0001 [ 52]: 4af98335575f5e2a +Block 0001 [ 53]: bda4053fd315675b +Block 0001 [ 54]: 41060f2406a1d20d +Block 0001 [ 55]: eb2c51d83ebbd8f1 +Block 0001 [ 56]: 89b7f8f524822057 +Block 0001 [ 57]: fa8cedb05e2f7f20 +Block 0001 [ 58]: 1ad99636edf5754c +Block 0001 [ 59]: 9227b48f92263da8 +Block 0001 [ 60]: 8379858725ac5a34 +Block 0001 [ 61]: e9175a515bc33fed +Block 0001 [ 62]: 45c1af539ca1533b +Block 0001 [ 63]: a750b46c1b9e2e48 +Block 0001 [ 64]: aa7fca933b3bb05b +Block 0001 [ 65]: e56faae612e75484 +Block 0001 [ 66]: 06fda8818cd441c6 +Block 0001 [ 67]: 2490ab894da253cc +Block 0001 [ 68]: 9658b30c03beead8 +Block 0001 [ 69]: 4c69b5b64065b426 +Block 0001 [ 70]: 66b2511ab48f50d8 +Block 0001 [ 71]: d5ad57400ce97db8 +Block 0001 [ 72]: 34878dab0a6554cc +Block 0001 [ 73]: d944d1b92feb67e1 +Block 0001 [ 74]: 8ecdec9887dbfbed +Block 0001 [ 75]: af2bc080b6d34198 +Block 0001 [ 76]: caa1dce2e4974dc8 +Block 0001 [ 77]: efc0177fbaebba33 +Block 0001 [ 78]: 48246fde6f3bf50e +Block 0001 [ 79]: 14347c1e4c9ad74d +Block 0001 [ 80]: c209d794edacac4a +Block 0001 [ 81]: f31388a91f3bc4d9 +Block 0001 [ 82]: 181e34af2ef27582 +Block 0001 [ 83]: 5842b6cd751dc7d5 +Block 0001 [ 84]: c21d7a803651f895 +Block 0001 [ 85]: 856fccb97b344959 +Block 0001 [ 86]: 92434d14dd17508d +Block 0001 [ 87]: f4381d6cfc07a63a +Block 0001 [ 88]: f518d3ea8402c5d7 +Block 0001 [ 89]: fe0bf4b0c78ee477 +Block 0001 [ 90]: ae3d7206a0eebf82 +Block 0001 [ 91]: f3dc7d33c1e5a11b +Block 0001 [ 92]: 47f59e53ce1d5866 +Block 0001 [ 93]: 10d77a10fa0b7fe8 +Block 0001 [ 94]: 08c1156c8d5ad237 +Block 0001 [ 95]: 0bdb8b7d95fef340 +Block 0001 [ 96]: 6b6340b64b078628 +Block 0001 [ 97]: 74538397e38f3063 +Block 0001 [ 98]: 9763d327a10b018b +Block 0001 [ 99]: 8c1ec3f8b67ef707 +Block 0001 [100]: a65855fb53b3cf03 +Block 0001 [101]: 8cd6cbe80fdda8a6 +Block 0001 [102]: 528561ab03e6bea0 +Block 0001 [103]: f3291f99743d5774 +Block 0001 [104]: 1872782ff0e09f79 +Block 0001 [105]: 1de6a683d5ba8800 +Block 0001 [106]: 6852b94ec920fd37 +Block 0001 [107]: aa5fe8aecba3dbd7 +Block 0001 [108]: 9548dcfb3649984d +Block 0001 [109]: ed7bf1bb77ec6a8c +Block 0001 [110]: 00919c392cf70d5d +Block 0001 [111]: c3fa99c16a895fba +Block 0001 [112]: d4a2013dd8193b51 +Block 0001 [113]: 164c8364b08aa019 +Block 0001 [114]: 1c361bb6197c21e6 +Block 0001 [115]: 6c5c0b2f1d028964 +Block 0001 [116]: bdc640b0cf73be16 +Block 0001 [117]: 4c7c28018a0967a1 +Block 0001 [118]: fff1ce82132d02c7 +Block 0001 [119]: 201194ce949e91c1 +Block 0001 [120]: 37f825509d769cf0 +Block 0001 [121]: 92c8a6398dfb5420 +Block 0001 [122]: d421323258148fbf +Block 0001 [123]: 884d799cfb6f9608 +Block 0001 [124]: 357c4fa87d8ea9c1 +Block 0001 [125]: 7ca853f594a806e4 +Block 0001 [126]: b24be8ccb1fd4e00 +Block 0001 [127]: d67d8ab9d0149c41 +Block 0002 [ 0]: 7cb64797e59c2898 +Block 0002 [ 1]: c2c69f1df26fe4f7 +Block 0002 [ 2]: 860e26b28a7f38e7 +Block 0002 [ 3]: 03cfde69ef53362f +Block 0002 [ 4]: ca8ad628ddfe0175 +Block 0002 [ 5]: 3e75216893b8f594 +Block 0002 [ 6]: 5982c82ad8d4f0b0 +Block 0002 [ 7]: dd49775772e79838 +Block 0002 [ 8]: 381be5cb41b74429 +Block 0002 [ 9]: 10e5363f909f7a2b +Block 0002 [ 10]: 0db1fd3b51c83a01 +Block 0002 [ 11]: db09eb1946c6ffbe +Block 0002 [ 12]: 690cc31db135feca +Block 0002 [ 13]: 2064f8998646e505 +Block 0002 [ 14]: 365a864afe9f4fa9 +Block 0002 [ 15]: 04711b105f55045b +Block 0002 [ 16]: 74f81257464e4670 +Block 0002 [ 17]: 81aa2ec1cf089f9d +Block 0002 [ 18]: d78e413290a42017 +Block 0002 [ 19]: 0710017afb761109 +Block 0002 [ 20]: 28ab93bf1da6eaf6 +Block 0002 [ 21]: db42dbd893083632 +Block 0002 [ 22]: 0b613e82d208d081 +Block 0002 [ 23]: f86ba76e6769ab87 +Block 0002 [ 24]: 37a53ed14eb96885 +Block 0002 [ 25]: 7fddf209b7a7aae0 +Block 0002 [ 26]: 27ee9147537a1ffa +Block 0002 [ 27]: 0d87db4ccb03dbd7 +Block 0002 [ 28]: 543598bf8db7090d +Block 0002 [ 29]: 72b4336c52c01431 +Block 0002 [ 30]: 71d3af6cae675c15 +Block 0002 [ 31]: 65b57dfc7adb95de +Block 0002 [ 32]: ce8b82f6d8a790bd +Block 0002 [ 33]: f14bf7489f1cfdea +Block 0002 [ 34]: 9779478ba92b8635 +Block 0002 [ 35]: e3c5d4eea1d1b38f +Block 0002 [ 36]: f726715c4e7d4596 +Block 0002 [ 37]: 460eda3b2a00f89a +Block 0002 [ 38]: f43a475d55f514a2 +Block 0002 [ 39]: debcfd04de87ef41 +Block 0002 [ 40]: ccb3c6e561b4c5c1 +Block 0002 [ 41]: ebf2866ca4dafa31 +Block 0002 [ 42]: 91bdefb27e3e4e1b +Block 0002 [ 43]: 528f3555c38a4d53 +Block 0002 [ 44]: 2497400fbe5afe51 +Block 0002 [ 45]: ff4b8c72c6e53f7f +Block 0002 [ 46]: 2c40cb7438aa7300 +Block 0002 [ 47]: 9943309c4e6444ab +Block 0002 [ 48]: 93bdb8c08c695d05 +Block 0002 [ 49]: 3e026f39af513ff6 +Block 0002 [ 50]: 94f1714790aabcef +Block 0002 [ 51]: 0795a3358040e131 +Block 0002 [ 52]: ae4830e6481ee1eb +Block 0002 [ 53]: 3ecc56c7b013fa4c +Block 0002 [ 54]: ddfff79f85dafcad +Block 0002 [ 55]: 1f0c9ef1a52df3ca +Block 0002 [ 56]: e909957e4e37ecc8 +Block 0002 [ 57]: c8a40a7602da74e9 +Block 0002 [ 58]: de8822670791deed +Block 0002 [ 59]: 65934f243e9e1e83 +Block 0002 [ 60]: 474cb0df3377639a +Block 0002 [ 61]: 1736eb3a980fd11d +Block 0002 [ 62]: 8fa8d44a066e5257 +Block 0002 [ 63]: 48e036872f7af05c +Block 0002 [ 64]: e521b7cd11db971b +Block 0002 [ 65]: 37f1ee21d8f892a6 +Block 0002 [ 66]: daf18f10b4c59135 +Block 0002 [ 67]: a92c39375926d19c +Block 0002 [ 68]: 61776d72b6dfcbf6 +Block 0002 [ 69]: 6cfd113b795956a6 +Block 0002 [ 70]: 41df6184c37d305d +Block 0002 [ 71]: da0ea530201657b3 +Block 0002 [ 72]: 0eaa8327f0b26deb +Block 0002 [ 73]: 749bef1979a66c54 +Block 0002 [ 74]: 0a4803ba5f98464d +Block 0002 [ 75]: aeef50b86747236a +Block 0002 [ 76]: 7c4204ccbdb87888 +Block 0002 [ 77]: a86c145c2617d45b +Block 0002 [ 78]: e6ec9cf481b74a97 +Block 0002 [ 79]: 52da1faf824b842b +Block 0002 [ 80]: eec0083945a6d2ed +Block 0002 [ 81]: 0d7b28e58b0982f0 +Block 0002 [ 82]: ec807b340dcde015 +Block 0002 [ 83]: ed0db6917d48a4d2 +Block 0002 [ 84]: 85bc55d932e3b3a5 +Block 0002 [ 85]: 71b54dd726a7a3dc +Block 0002 [ 86]: 86dacac98463a414 +Block 0002 [ 87]: 9d9adf7a9a974406 +Block 0002 [ 88]: 2b1ad483c47d825d +Block 0002 [ 89]: 1dd4baa8e20cc036 +Block 0002 [ 90]: 300f765115a0d235 +Block 0002 [ 91]: 34b0bbec6295a57d +Block 0002 [ 92]: 47c2dcab1c8dc56e +Block 0002 [ 93]: 909dcbf65dfd3e4a +Block 0002 [ 94]: bdf4ce01c995501f +Block 0002 [ 95]: 2692141f3829aa9b +Block 0002 [ 96]: d52f697f214d2ea2 +Block 0002 [ 97]: 4eec1c847a44b701 +Block 0002 [ 98]: a14e42edfcff1342 +Block 0002 [ 99]: 597274dab26579c9 +Block 0002 [100]: c8938ed8f54ade44 +Block 0002 [101]: bbdafc08ba8a311b +Block 0002 [102]: 1f77d352b3fb4974 +Block 0002 [103]: 94f2bc7fba84f2d0 +Block 0002 [104]: e2b7015dd2b71522 +Block 0002 [105]: 1a8d1766a4832f57 +Block 0002 [106]: c65a8b0b90388f29 +Block 0002 [107]: 4079af95ac5bb19e +Block 0002 [108]: 961a858ee6f4507d +Block 0002 [109]: e23387d57615d488 +Block 0002 [110]: ea54c14ae8386039 +Block 0002 [111]: c18c93179a7f881f +Block 0002 [112]: 8c8cf06e883a59d9 +Block 0002 [113]: 37cd8e83271d4f0d +Block 0002 [114]: d514a6baa9a22279 +Block 0002 [115]: ca7a1d07761bd380 +Block 0002 [116]: 6654e0ab9bddf7bd +Block 0002 [117]: 605c709efd511084 +Block 0002 [118]: 051a36cd71ce213b +Block 0002 [119]: 344cc6b3d6a1d436 +Block 0002 [120]: f455839c5d4d7a4f +Block 0002 [121]: 1c24c88988a49b33 +Block 0002 [122]: f01bf8d496ee65aa +Block 0002 [123]: e03b0ba3f6117b98 +Block 0002 [124]: 6bca08fdc5511ca7 +Block 0002 [125]: 7fb253076266795f +Block 0002 [126]: 1426489946579710 +Block 0002 [127]: 33d4fa27e9e37b58 +Block 0003 [ 0]: 046a31cd596782ec +Block 0003 [ 1]: bc54a531abfcfa7b +Block 0003 [ 2]: 4b77511da81d7d87 +Block 0003 [ 3]: 83b4ead00cda96fd +Block 0003 [ 4]: 8e7f5159419fa475 +Block 0003 [ 5]: dca90d89e4a289bb +Block 0003 [ 6]: 357863376708b679 +Block 0003 [ 7]: 39cbd5feb80d6deb +Block 0003 [ 8]: 36cc83eb85aca316 +Block 0003 [ 9]: a60c7bca46e83bf0 +Block 0003 [ 10]: b47654f5fb4b0af7 +Block 0003 [ 11]: 8a1f3a2a2a8379a9 +Block 0003 [ 12]: 794fe4476e91c2ac +Block 0003 [ 13]: 12e0f417e18416ba +Block 0003 [ 14]: b56e37032b2c5d1b +Block 0003 [ 15]: db9927e597d1feaf +Block 0003 [ 16]: 0f3d8291a8065f7f +Block 0003 [ 17]: c5bdad1ba4d491ac +Block 0003 [ 18]: b92dd3a668c599d0 +Block 0003 [ 19]: d3ed13931fd174f5 +Block 0003 [ 20]: dd56a98550e6d564 +Block 0003 [ 21]: e36bf64d1375e226 +Block 0003 [ 22]: 20deb434e56892c3 +Block 0003 [ 23]: 85f1359078ee2533 +Block 0003 [ 24]: f722f5fde663ada6 +Block 0003 [ 25]: 619831358089e591 +Block 0003 [ 26]: 7c580214447aefee +Block 0003 [ 27]: 3c2f950a7b194280 +Block 0003 [ 28]: 1aa7cc80aeff8f4a +Block 0003 [ 29]: ce8fa25f55bfe78f +Block 0003 [ 30]: 45dc872f693d4f0f +Block 0003 [ 31]: c9f8dbf8c2c180e0 +Block 0003 [ 32]: 8c312b4ef842d09b +Block 0003 [ 33]: c227867fddc7021b +Block 0003 [ 34]: 403eabd3b6b05550 +Block 0003 [ 35]: a9b1a0ee2cdba6ba +Block 0003 [ 36]: 4795c98a795d0c25 +Block 0003 [ 37]: c9e0d0c57a1241bd +Block 0003 [ 38]: 6c9928c206adef1c +Block 0003 [ 39]: ed3f418ed47e41c0 +Block 0003 [ 40]: 001154d3cc4ce182 +Block 0003 [ 41]: d1ad903c0f1f94b8 +Block 0003 [ 42]: c3c8cea43847addd +Block 0003 [ 43]: 15159c3d406282e4 +Block 0003 [ 44]: feda097ad8fb4a18 +Block 0003 [ 45]: b546ba8ab0e92e3e +Block 0003 [ 46]: d0f960d5f07c7716 +Block 0003 [ 47]: 93f1aeb83b8ccfa3 +Block 0003 [ 48]: b3a262d1b3fa3cb2 +Block 0003 [ 49]: 6a9aceae3eab8923 +Block 0003 [ 50]: 3dd182181b145c83 +Block 0003 [ 51]: b58be4a8bca5f09c +Block 0003 [ 52]: f3f5e5ccac8fe364 +Block 0003 [ 53]: f9cbfb4c276d7eb8 +Block 0003 [ 54]: c24235d25fdc45ce +Block 0003 [ 55]: d315a35ddcd17553 +Block 0003 [ 56]: e1cc7517fa37a8d4 +Block 0003 [ 57]: 308371963bdd138d +Block 0003 [ 58]: 013977ff0ffe9c54 +Block 0003 [ 59]: ad33021b070e8c14 +Block 0003 [ 60]: e710659ac74ab001 +Block 0003 [ 61]: 1bd0f3c858425586 +Block 0003 [ 62]: ed4295897e10f1a8 +Block 0003 [ 63]: 1053070c46b83401 +Block 0003 [ 64]: ca6b0e8a8ccdd08e +Block 0003 [ 65]: 7cedb28e772004b9 +Block 0003 [ 66]: bdaa36a79b505fae +Block 0003 [ 67]: 0d5698f9b8aa0f63 +Block 0003 [ 68]: 504ca8ea7543efa1 +Block 0003 [ 69]: 9610336b7f760920 +Block 0003 [ 70]: 5df8e1999e267562 +Block 0003 [ 71]: 803b49d953e979fa +Block 0003 [ 72]: bc983c4136089649 +Block 0003 [ 73]: edb1e4ffa2af0a7d +Block 0003 [ 74]: 49dc4796c1597e97 +Block 0003 [ 75]: 9ae9a350dbb18072 +Block 0003 [ 76]: 6a09bc7b6cddfa17 +Block 0003 [ 77]: 19eed074b1d94d1b +Block 0003 [ 78]: 5f79a4365291e828 +Block 0003 [ 79]: ed3903991e88d303 +Block 0003 [ 80]: e6b4f5655bf1a227 +Block 0003 [ 81]: a660d316b19c6cf5 +Block 0003 [ 82]: 1bba7c7f616017ec +Block 0003 [ 83]: 6efee2015ea709b5 +Block 0003 [ 84]: 7bca856327d86867 +Block 0003 [ 85]: f1d901fb696cfe6e +Block 0003 [ 86]: b61228cc0f5519e5 +Block 0003 [ 87]: f1cca47f7aa1de4c +Block 0003 [ 88]: c4b0874e7b7523bc +Block 0003 [ 89]: fbe80a4579da608b +Block 0003 [ 90]: 51065fdacf129897 +Block 0003 [ 91]: 5c98141f3b90991a +Block 0003 [ 92]: cd19889c4a4d7139 +Block 0003 [ 93]: f37f5d6b56d239a4 +Block 0003 [ 94]: 973d728bb837500d +Block 0003 [ 95]: 337e69253643f939 +Block 0003 [ 96]: 82e638ae9586e603 +Block 0003 [ 97]: cac9aee8ff136d3d +Block 0003 [ 98]: a1800829a1715101 +Block 0003 [ 99]: df0d298230fb784b +Block 0003 [100]: 6b13a7468f0c0a38 +Block 0003 [101]: 8f0d7471ac242b32 +Block 0003 [102]: f44e149f9b58111e +Block 0003 [103]: 067502de3af50b9f +Block 0003 [104]: fbb82fc217e4b529 +Block 0003 [105]: 7d9881a1bc0e688e +Block 0003 [106]: 30c4685e53b55a42 +Block 0003 [107]: ff9592613630fe41 +Block 0003 [108]: 8bf52e194266394e +Block 0003 [109]: fba0c347e59a5039 +Block 0003 [110]: a9c06323b6fa268a +Block 0003 [111]: c3bad73a55771917 +Block 0003 [112]: acc361d48a5ae241 +Block 0003 [113]: a943d90299f113eb +Block 0003 [114]: 044d325cedeceb09 +Block 0003 [115]: 8947b50203df6ac1 +Block 0003 [116]: 81bfe91acfdc25c9 +Block 0003 [117]: 2f855fd29282043f +Block 0003 [118]: aa61cf9492ad1d75 +Block 0003 [119]: 3b61c07d952c3c5c +Block 0003 [120]: 750c557fcb0419e2 +Block 0003 [121]: 4e111c1b09db20fa +Block 0003 [122]: 38bca5e15536cc63 +Block 0003 [123]: 5c302c1351c2027e +Block 0003 [124]: f02ca3291dec7a84 +Block 0003 [125]: d8a0d514adacb41f +Block 0003 [126]: 41839d029f843d21 +Block 0003 [127]: eaca093b268ad0ba +Block 0004 [ 0]: 4a6feab4b8d9a6aa +Block 0004 [ 1]: 0ec8b94daf8494c6 +Block 0004 [ 2]: 972a66e201c44775 +Block 0004 [ 3]: 81418e65b5078237 +Block 0004 [ 4]: 1df7116b310281b7 +Block 0004 [ 5]: 3d4997690fcf345e +Block 0004 [ 6]: 001b812e2e96b2b3 +Block 0004 [ 7]: d405f56aecafe337 +Block 0004 [ 8]: 5e4d67602b1feb88 +Block 0004 [ 9]: b4012dcdbfaa0f65 +Block 0004 [ 10]: f46b2fd7d7d7c3e8 +Block 0004 [ 11]: 7a72d1dc28a6bfc1 +Block 0004 [ 12]: c1b087e6e31ce345 +Block 0004 [ 13]: d9178f5cd1d422d5 +Block 0004 [ 14]: 2644c0c342f60248 +Block 0004 [ 15]: c115b4f1b91b13f7 +Block 0004 [ 16]: 4a0d701fd1916369 +Block 0004 [ 17]: dead3ce075e71585 +Block 0004 [ 18]: 5d1e8fc49ba9e218 +Block 0004 [ 19]: eebd4465be91bc50 +Block 0004 [ 20]: 589ebbd596dc3bb5 +Block 0004 [ 21]: 060dec3bbfcfdc3f +Block 0004 [ 22]: d845285a84c5e634 +Block 0004 [ 23]: a2955062ee1b9cb9 +Block 0004 [ 24]: 12f1189860b40ba2 +Block 0004 [ 25]: 0559be7877e4540c +Block 0004 [ 26]: fe890e64101def53 +Block 0004 [ 27]: 9c4840aef7a8e6d1 +Block 0004 [ 28]: 7cdffa34d374b5e1 +Block 0004 [ 29]: 34a58d6c1800aa7d +Block 0004 [ 30]: 013aab816c6af91f +Block 0004 [ 31]: d1b420ea039d2850 +Block 0004 [ 32]: 6831b26763d83168 +Block 0004 [ 33]: 4a501813320e3c48 +Block 0004 [ 34]: 21414a84abb62985 +Block 0004 [ 35]: eb1dfbac686d01c6 +Block 0004 [ 36]: ba34dcb11d258cce +Block 0004 [ 37]: 253065e795c10bd2 +Block 0004 [ 38]: 42479f2a35988b10 +Block 0004 [ 39]: 6b557161266ef5cd +Block 0004 [ 40]: 469ecbd406da560b +Block 0004 [ 41]: e23d234f1d05a4f3 +Block 0004 [ 42]: ca9c7960f939525e +Block 0004 [ 43]: e909a0ffbdb01d0b +Block 0004 [ 44]: 4fdb635d89483ec7 +Block 0004 [ 45]: 701151f5c1a33e07 +Block 0004 [ 46]: 6e3df7807c2f136a +Block 0004 [ 47]: 6b481771a4b587c3 +Block 0004 [ 48]: 784a686a8b5377a9 +Block 0004 [ 49]: af6b9b72b81bc979 +Block 0004 [ 50]: 2c531c77707496eb +Block 0004 [ 51]: 1b84970004449d05 +Block 0004 [ 52]: 11f6aee665db9d5e +Block 0004 [ 53]: 498bfbeb89786794 +Block 0004 [ 54]: b87e2adddba796d5 +Block 0004 [ 55]: bc96cf7212cc363f +Block 0004 [ 56]: 73f49d8035e3bb11 +Block 0004 [ 57]: 0af3303a963bf26a +Block 0004 [ 58]: 9ece6fc7aaebbe27 +Block 0004 [ 59]: 0ba41078e55b2dd8 +Block 0004 [ 60]: 148d93b8883cfcb0 +Block 0004 [ 61]: 28ca70d4d9951701 +Block 0004 [ 62]: 927b0485265f2fad +Block 0004 [ 63]: 7e4ec0be8d07f7a9 +Block 0004 [ 64]: 3d3b81c2d4b1ae15 +Block 0004 [ 65]: 122d786485d65f49 +Block 0004 [ 66]: 128a9238e8bf5f92 +Block 0004 [ 67]: 084139a82686dcc9 +Block 0004 [ 68]: c2753d962cfb45c1 +Block 0004 [ 69]: ed4317b6488d2ac4 +Block 0004 [ 70]: 1a481b6e1265293b +Block 0004 [ 71]: babc5d0e2bf24943 +Block 0004 [ 72]: 968f09611a557929 +Block 0004 [ 73]: f7634e9c15e1fe5f +Block 0004 [ 74]: e58dad4f0a4e3128 +Block 0004 [ 75]: 4c8100c8f517cb58 +Block 0004 [ 76]: adc2ff093d49c0bc +Block 0004 [ 77]: 0b1604ea8a1e4e67 +Block 0004 [ 78]: d2d82d3a7b47df02 +Block 0004 [ 79]: 119575d44af91d2d +Block 0004 [ 80]: c8744a6b6ef42198 +Block 0004 [ 81]: a0d452abd110d22f +Block 0004 [ 82]: f7b64c116254c2ba +Block 0004 [ 83]: 9e561c45cc5a1e50 +Block 0004 [ 84]: 881bca7ef16d5453 +Block 0004 [ 85]: eb70824146b76fa3 +Block 0004 [ 86]: b9e137f458dd4a4f +Block 0004 [ 87]: 1f9dcf6dbce23161 +Block 0004 [ 88]: e12e9a5372dc5bab +Block 0004 [ 89]: 2a2f664e8640cee1 +Block 0004 [ 90]: 52c789496b2e681d +Block 0004 [ 91]: 8f8d8cda2b15640d +Block 0004 [ 92]: 9fa2cd5d3d2cfbad +Block 0004 [ 93]: cba04f79b6f84afd +Block 0004 [ 94]: 503cc81918aa8bd2 +Block 0004 [ 95]: be6434cfd25eb26b +Block 0004 [ 96]: a66ff820241911fa +Block 0004 [ 97]: 40a982a33c6db17c +Block 0004 [ 98]: 1548a37aaa2f1bc4 +Block 0004 [ 99]: 1b5bed3a31c66cc2 +Block 0004 [100]: 5f3ffbc962f42ece +Block 0004 [101]: f36ec53e5c4b528a +Block 0004 [102]: 374516cf62043ac3 +Block 0004 [103]: d4ff691eaa9face7 +Block 0004 [104]: 02f5223343418fd0 +Block 0004 [105]: 5a661b3cbd12cb5f +Block 0004 [106]: 5e8da0dfc6608ca3 +Block 0004 [107]: f4d5dd36bf79a562 +Block 0004 [108]: 2a9987c9f4affcc2 +Block 0004 [109]: 6d64596b325a6b97 +Block 0004 [110]: 36acdce8f84fe5d8 +Block 0004 [111]: 7ec1222497a89aed +Block 0004 [112]: a6a766ae96d768d4 +Block 0004 [113]: 9df26ef4377da55d +Block 0004 [114]: 434c1c0bd115606e +Block 0004 [115]: 62037e156afcd340 +Block 0004 [116]: 29059457b8c8e505 +Block 0004 [117]: 3395589ee15940fd +Block 0004 [118]: 3eca700460f7fc72 +Block 0004 [119]: 58d784ed6d428152 +Block 0004 [120]: 1fcc76e9b80d0973 +Block 0004 [121]: 091bd0c42556bf76 +Block 0004 [122]: 38c09a184c120445 +Block 0004 [123]: a947cc2b9e52124f +Block 0004 [124]: dd743025e87af1d3 +Block 0004 [125]: be5f845d0929b7be +Block 0004 [126]: 3fe708f194a42cda +Block 0004 [127]: 867d4c61e71e0b67 +Block 0005 [ 0]: fb543df6749e523d +Block 0005 [ 1]: 8a78683e4ab04b93 +Block 0005 [ 2]: 02c841e680679b47 +Block 0005 [ 3]: 136516cc99423371 +Block 0005 [ 4]: a769b959d945e45b +Block 0005 [ 5]: 3a30bdb2c18f4de8 +Block 0005 [ 6]: 9ba3535a0f59c9cf +Block 0005 [ 7]: af1452e75ee21cd5 +Block 0005 [ 8]: c2d3a094e5573fc9 +Block 0005 [ 9]: 3b0730860b630abe +Block 0005 [ 10]: 990af4f8f2013efb +Block 0005 [ 11]: e8bb67f6fd509a41 +Block 0005 [ 12]: 1605d1f84eead1e9 +Block 0005 [ 13]: 2ea50d34856b87e6 +Block 0005 [ 14]: 4fe1a2161761fcd4 +Block 0005 [ 15]: 559c8caea9bcc491 +Block 0005 [ 16]: 1819c9b7b5dc24a1 +Block 0005 [ 17]: 416e8cecde86b2a1 +Block 0005 [ 18]: 88fbf997a5fb3fb6 +Block 0005 [ 19]: cb3f8e874f54615a +Block 0005 [ 20]: fcdf3457cbc48f47 +Block 0005 [ 21]: fe161ed6b5fa8562 +Block 0005 [ 22]: cb28c641f83c2721 +Block 0005 [ 23]: c447d47847225215 +Block 0005 [ 24]: 53f5947e2ac4a3c7 +Block 0005 [ 25]: d328ee7dddde7b7f +Block 0005 [ 26]: 6d418f9039e885a6 +Block 0005 [ 27]: c49bd9a76b507899 +Block 0005 [ 28]: 576fe9bb6ca62c00 +Block 0005 [ 29]: be801c3749b880c8 +Block 0005 [ 30]: 4b0059b06dd5e4a9 +Block 0005 [ 31]: 2c3a89bd77b33c57 +Block 0005 [ 32]: 68a1d3f04769b9d5 +Block 0005 [ 33]: f8fc066e5a6f0c9e +Block 0005 [ 34]: e42b2962808c4cf0 +Block 0005 [ 35]: c4c0584656e15e35 +Block 0005 [ 36]: 294d1e713a98b7d6 +Block 0005 [ 37]: afe0633eaac739e0 +Block 0005 [ 38]: af7222b24131006a +Block 0005 [ 39]: 6178bbfb2124d548 +Block 0005 [ 40]: 56f5c66b4fe10b8f +Block 0005 [ 41]: 53c90a148b2ebd77 +Block 0005 [ 42]: 417b844c1274d9d8 +Block 0005 [ 43]: c8907a79e976bd33 +Block 0005 [ 44]: 7064d869deaaa1b1 +Block 0005 [ 45]: 024ed97ff2245f12 +Block 0005 [ 46]: 14fdf38d1306d1b2 +Block 0005 [ 47]: cb298fbfc55f3ee4 +Block 0005 [ 48]: eecc9a5195beacdd +Block 0005 [ 49]: 9d9e953c57e3fa74 +Block 0005 [ 50]: 302d90e2c08746b1 +Block 0005 [ 51]: b002b433537ac056 +Block 0005 [ 52]: aff555002370f1d4 +Block 0005 [ 53]: f92f23141050b6ad +Block 0005 [ 54]: 06d4378ec748701c +Block 0005 [ 55]: 81eeed081edc7f48 +Block 0005 [ 56]: dfe8ae684fd0f17a +Block 0005 [ 57]: 92e63e7564fac228 +Block 0005 [ 58]: 86158a52ab99db1f +Block 0005 [ 59]: 8ed6cc492aac5b00 +Block 0005 [ 60]: 7f51ad01e4076720 +Block 0005 [ 61]: 45bea9c00a87bb9d +Block 0005 [ 62]: 45ec0de126d5ae46 +Block 0005 [ 63]: e427a45bc89c0131 +Block 0005 [ 64]: 0dd149ab71faba66 +Block 0005 [ 65]: cb2b2e0071fa7b53 +Block 0005 [ 66]: 71e77479e9ea7cb2 +Block 0005 [ 67]: ecd627c2257d5842 +Block 0005 [ 68]: 67e2ff459ff6512f +Block 0005 [ 69]: 18cbf83fc201d0a7 +Block 0005 [ 70]: 07c57ab8658d81ec +Block 0005 [ 71]: 6183584d0c49845f +Block 0005 [ 72]: 45e12ff25a656646 +Block 0005 [ 73]: d21335cd1ba3047c +Block 0005 [ 74]: 6b7378fc20768c3b +Block 0005 [ 75]: ee564c9a368c1e46 +Block 0005 [ 76]: d1d18cb6f72d0c79 +Block 0005 [ 77]: aebbeda36f0fc0e0 +Block 0005 [ 78]: 6580a8f2676dcdef +Block 0005 [ 79]: b34b0614331bd5fc +Block 0005 [ 80]: 2243be4dd2e49980 +Block 0005 [ 81]: 783960f9d625078a +Block 0005 [ 82]: b5fa94e6f91b72c9 +Block 0005 [ 83]: 2657b20f7f31b021 +Block 0005 [ 84]: a86de3ee9dd25b95 +Block 0005 [ 85]: 3af6e85645f80ea4 +Block 0005 [ 86]: 3a68ed98df3d594d +Block 0005 [ 87]: d2a68745e380dd7f +Block 0005 [ 88]: 437135cba7eaa3e7 +Block 0005 [ 89]: b80144de6b82a67b +Block 0005 [ 90]: ba03053d2bd25052 +Block 0005 [ 91]: dfe01934ef3be8df +Block 0005 [ 92]: cd9c64f1a2139ea9 +Block 0005 [ 93]: 5bd83d1399ed8a42 +Block 0005 [ 94]: a786e2e263c5e47b +Block 0005 [ 95]: e5cb1fbaaaf26d6d +Block 0005 [ 96]: 2a47e840cf6f84fa +Block 0005 [ 97]: b4a5f7d6cc8957b1 +Block 0005 [ 98]: a42e0f60094cc7cb +Block 0005 [ 99]: 335cd356be912b47 +Block 0005 [100]: d30485e50e27d062 +Block 0005 [101]: e59ebdfd8013f6d6 +Block 0005 [102]: 818a06f6b6266b88 +Block 0005 [103]: c995b852c6da3ca0 +Block 0005 [104]: b72676cffffaf86d +Block 0005 [105]: d2498a2128c52576 +Block 0005 [106]: 2debc84192d6fd30 +Block 0005 [107]: d48716be7be4e90d +Block 0005 [108]: 88f03985da415f6c +Block 0005 [109]: dff03e4cfdd02d4a +Block 0005 [110]: ae970d0e7425c8e4 +Block 0005 [111]: 53a3cee362ea1c8e +Block 0005 [112]: a000e14a36a528bc +Block 0005 [113]: 524c86fec28b74f3 +Block 0005 [114]: 0b528ba6288396a3 +Block 0005 [115]: 749c64a4b184569d +Block 0005 [116]: 2e9488cf658cbded +Block 0005 [117]: c587392b84ba8fb3 +Block 0005 [118]: 018fe60c724a8ba1 +Block 0005 [119]: 2d5b243a75ca9634 +Block 0005 [120]: 06b67ca8f1bd302c +Block 0005 [121]: 688d2272401624fd +Block 0005 [122]: b111f0c4872d900d +Block 0005 [123]: 33d51a30d35f4283 +Block 0005 [124]: b9464778209546b4 +Block 0005 [125]: 1e24119f455c36b2 +Block 0005 [126]: 41fca34623d8bd15 +Block 0005 [127]: dad7e567bc66f72c +Block 0006 [ 0]: a3a72e2c8604b578 +Block 0006 [ 1]: 4713a88b4d727ef8 +Block 0006 [ 2]: d750d3a721d9f31b +Block 0006 [ 3]: 6a465b3a9d114ce6 +Block 0006 [ 4]: 887a8704c786cd4c +Block 0006 [ 5]: d975e67288451b37 +Block 0006 [ 6]: e9c343f24b375d68 +Block 0006 [ 7]: eba23301fa7bd4bd +Block 0006 [ 8]: 14521b31b4bf1c46 +Block 0006 [ 9]: 8c13afd741f37d2b +Block 0006 [ 10]: 6f2b59d1cf12c855 +Block 0006 [ 11]: 5dd35e7e01350317 +Block 0006 [ 12]: 224a64109cc2743b +Block 0006 [ 13]: be90804f32ee3a28 +Block 0006 [ 14]: fe2a8bd84deb0852 +Block 0006 [ 15]: 01d3cf8a505adc92 +Block 0006 [ 16]: bc08b05300c76e75 +Block 0006 [ 17]: 999d681fb563dc43 +Block 0006 [ 18]: d1d4a0f963f8fa6f +Block 0006 [ 19]: 35b5d12da998aefc +Block 0006 [ 20]: 90ed25375fed8bb1 +Block 0006 [ 21]: 77daf28509710d25 +Block 0006 [ 22]: eee16b40398474df +Block 0006 [ 23]: 646f422d3bd880b6 +Block 0006 [ 24]: aa6c2956bd819ec5 +Block 0006 [ 25]: 17eef62e7bf6ca72 +Block 0006 [ 26]: 9b70680f409ebbbd +Block 0006 [ 27]: 101cae1679e39b1a +Block 0006 [ 28]: ae539343701e746d +Block 0006 [ 29]: 9ebe9838e1f9a97b +Block 0006 [ 30]: 1d7df5e0c1f03918 +Block 0006 [ 31]: f6d13d16d00019c7 +Block 0006 [ 32]: f373e4095564f479 +Block 0006 [ 33]: d442f06e4e98d587 +Block 0006 [ 34]: 3a69c10e6292e2f4 +Block 0006 [ 35]: 479e23c96fb7743d +Block 0006 [ 36]: 37ec26d28b38943c +Block 0006 [ 37]: 6c35b46dbb181347 +Block 0006 [ 38]: 28ab9b420f8d8b5d +Block 0006 [ 39]: f4c1deb2acc7dcde +Block 0006 [ 40]: ea7c5ea61f6e6ad3 +Block 0006 [ 41]: d7b4bff98caa97ab +Block 0006 [ 42]: fd2559b884c946ae +Block 0006 [ 43]: 62588e85fcce2f30 +Block 0006 [ 44]: 67ace8d1f36ec6cd +Block 0006 [ 45]: 7292a3420dba77c5 +Block 0006 [ 46]: e0d6c21b226e1f6b +Block 0006 [ 47]: ae1f28664a579217 +Block 0006 [ 48]: 4a5ab4b03d7380a6 +Block 0006 [ 49]: 8a2508f7c7f1b0f3 +Block 0006 [ 50]: 3567a420a49dc098 +Block 0006 [ 51]: 61ad122d9db36182 +Block 0006 [ 52]: d97878725887819b +Block 0006 [ 53]: e7e0ad17f72d3565 +Block 0006 [ 54]: 62bfa6c56235fbb9 +Block 0006 [ 55]: 19ba832db474c7da +Block 0006 [ 56]: 382213437f2b5e61 +Block 0006 [ 57]: 40f5b7b35538c7ad +Block 0006 [ 58]: d43ca697239bd77a +Block 0006 [ 59]: fa0faa43eea87e6b +Block 0006 [ 60]: 7e45f6c8dbd6821c +Block 0006 [ 61]: 7ffac662823ab66e +Block 0006 [ 62]: 8c3ffb2704479749 +Block 0006 [ 63]: 4cbfd18a06cfed3c +Block 0006 [ 64]: 3d4f99072714204a +Block 0006 [ 65]: 3ebc6d35e69c5b28 +Block 0006 [ 66]: de07a1e5ca926edb +Block 0006 [ 67]: 5571cf9aa39c3215 +Block 0006 [ 68]: 844ca33bf4947c5e +Block 0006 [ 69]: c6c99f7d74f39266 +Block 0006 [ 70]: a37b366ee3edb520 +Block 0006 [ 71]: 5c4ec2b2655a8a06 +Block 0006 [ 72]: 97a48f22a613f515 +Block 0006 [ 73]: 540a61e06b1c6ae3 +Block 0006 [ 74]: c865bc526dac7065 +Block 0006 [ 75]: a3a088fb6b1efa14 +Block 0006 [ 76]: 9beea238c77ab9f3 +Block 0006 [ 77]: 08b336770fbb1d8e +Block 0006 [ 78]: 409a15767d0707bf +Block 0006 [ 79]: 2825ba8f5eb9e2e5 +Block 0006 [ 80]: 6978f619ee3c20de +Block 0006 [ 81]: 6568588f224ce8ad +Block 0006 [ 82]: e0989069852bd360 +Block 0006 [ 83]: 9a203b316ac1558d +Block 0006 [ 84]: 405f2306f85335bd +Block 0006 [ 85]: f5e3c0dbc69f96d8 +Block 0006 [ 86]: 2a451adb35138baa +Block 0006 [ 87]: fffdc1f7a0148257 +Block 0006 [ 88]: 7d84d77440bee90a +Block 0006 [ 89]: 60e5f23c63fda19c +Block 0006 [ 90]: 5716d0a8c0650062 +Block 0006 [ 91]: 81c75ba2d5bf8206 +Block 0006 [ 92]: f93a47bde77c06e4 +Block 0006 [ 93]: 57dc3d4b8d84ba68 +Block 0006 [ 94]: 21eb9140c58ea159 +Block 0006 [ 95]: 8f3a87bbc66a532c +Block 0006 [ 96]: 93e91414d8d86305 +Block 0006 [ 97]: 334215982e161477 +Block 0006 [ 98]: 28bef7bb826b610b +Block 0006 [ 99]: 6ee7a816de4a890b +Block 0006 [100]: caff0d2a6443ab5b +Block 0006 [101]: f642a6b5153b3428 +Block 0006 [102]: c381f82d97488a06 +Block 0006 [103]: 9bd7117ff6ed1fa3 +Block 0006 [104]: c314e4ee3b0a9a1f +Block 0006 [105]: 76800ae8fba93619 +Block 0006 [106]: bd25cb81c4257d9f +Block 0006 [107]: 1ce3bf40c40723e5 +Block 0006 [108]: f5e417cbe472bb97 +Block 0006 [109]: 8cfd294fa8945406 +Block 0006 [110]: a4c5d94d07afe74d +Block 0006 [111]: bcb602e186f471ff +Block 0006 [112]: c02c0c2e0af63068 +Block 0006 [113]: bc27e62ff57050af +Block 0006 [114]: a6dc335ddf95c5b1 +Block 0006 [115]: b0e366f93847f756 +Block 0006 [116]: 7fe108fe80552259 +Block 0006 [117]: a49d9f9fca18b0f0 +Block 0006 [118]: 27aeee8d45049e51 +Block 0006 [119]: 314b70072932cf39 +Block 0006 [120]: 6ef20c87fc0697c9 +Block 0006 [121]: 19da493d127bbe55 +Block 0006 [122]: c5b5f7cc1c77beaa +Block 0006 [123]: f5e3973f36bdd3f1 +Block 0006 [124]: 52f7210c0f544bb2 +Block 0006 [125]: f7c8945cbbb13f68 +Block 0006 [126]: f30e60931430aa3b +Block 0006 [127]: 323c286c4ce01b9c +Block 0007 [ 0]: 6387ec0a9b706d60 +Block 0007 [ 1]: bb702446236f8be0 +Block 0007 [ 2]: f98b3dae492b7558 +Block 0007 [ 3]: caa8f2f9e58e5421 +Block 0007 [ 4]: 570bc5ea80d9d75e +Block 0007 [ 5]: 2f274d6c336d55bc +Block 0007 [ 6]: 977e5e3d3c58d830 +Block 0007 [ 7]: 85135d0217021ad5 +Block 0007 [ 8]: 740f76b2966956cb +Block 0007 [ 9]: 829305b653c36e53 +Block 0007 [ 10]: fe8820deb0a05b9a +Block 0007 [ 11]: 70487cca2fa7b66a +Block 0007 [ 12]: 9baf5077693e12ab +Block 0007 [ 13]: 86c7875c562e7817 +Block 0007 [ 14]: 6fda95b0820b7626 +Block 0007 [ 15]: 87759ed28fc95dc5 +Block 0007 [ 16]: 1914dd4b93217d74 +Block 0007 [ 17]: 3175851fcde71765 +Block 0007 [ 18]: 429d7afe1a305245 +Block 0007 [ 19]: dc47b73aeef3ed87 +Block 0007 [ 20]: 4ad7fe926a869547 +Block 0007 [ 21]: 08a805cc0ca53ee3 +Block 0007 [ 22]: 92eb59c00f0fc241 +Block 0007 [ 23]: 4a9207af3b1b09c2 +Block 0007 [ 24]: 00b6146a8e156963 +Block 0007 [ 25]: 30ab9619f07ea05b +Block 0007 [ 26]: f7b7b8ac33c5a933 +Block 0007 [ 27]: 8e245c42cf3cd563 +Block 0007 [ 28]: 5f46e9a882003c74 +Block 0007 [ 29]: 194b404af2af00cc +Block 0007 [ 30]: 0b4e9da19d8523b5 +Block 0007 [ 31]: a4b827d6768ad06a +Block 0007 [ 32]: 118a7958aae82170 +Block 0007 [ 33]: 3e8903e2c2ba80f4 +Block 0007 [ 34]: 07d87f37f9e20e96 +Block 0007 [ 35]: 05294a48cf03630b +Block 0007 [ 36]: b7f897cabe953dcb +Block 0007 [ 37]: a046083e04a24015 +Block 0007 [ 38]: eeb8efb5c70409f9 +Block 0007 [ 39]: bfe5de4db2fa7e0d +Block 0007 [ 40]: 24a7e8037b5d2ca0 +Block 0007 [ 41]: a315e9daa0998eb1 +Block 0007 [ 42]: bd52356dc28f6dac +Block 0007 [ 43]: 226fb1009dfc10be +Block 0007 [ 44]: a779004a2ded38af +Block 0007 [ 45]: 85c57f732e286ea9 +Block 0007 [ 46]: 30b6b1dbc7798fcf +Block 0007 [ 47]: c89e51d00e162333 +Block 0007 [ 48]: e4c9d91c7dcfd8e3 +Block 0007 [ 49]: 106ce6c585962d8f +Block 0007 [ 50]: 22cf9c3f79496b09 +Block 0007 [ 51]: d94d968fec6ea652 +Block 0007 [ 52]: fb0c6976e070caf2 +Block 0007 [ 53]: 1787da9837e8262e +Block 0007 [ 54]: 4e45822661217409 +Block 0007 [ 55]: 51f4c5bdba281a43 +Block 0007 [ 56]: 71f6f5746a9cdbc5 +Block 0007 [ 57]: dd45b228f797a3ed +Block 0007 [ 58]: 5829018cdd1ab9c6 +Block 0007 [ 59]: af606f89f13d4187 +Block 0007 [ 60]: faab7f9a3350f5ac +Block 0007 [ 61]: 09ec94cc822811a6 +Block 0007 [ 62]: 9bb2f1fb5c15a70e +Block 0007 [ 63]: fb37b1f9f3858291 +Block 0007 [ 64]: 12e2b535b7b01f3d +Block 0007 [ 65]: 319c071179726a9d +Block 0007 [ 66]: c4c40af8058a8900 +Block 0007 [ 67]: f52597b11ca98e1f +Block 0007 [ 68]: 0264495f476a7dde +Block 0007 [ 69]: 21d452f219468635 +Block 0007 [ 70]: 64cbc8315af032bb +Block 0007 [ 71]: 04629095edb84f96 +Block 0007 [ 72]: 42b7b37a32e08328 +Block 0007 [ 73]: a7c62acb4f22e113 +Block 0007 [ 74]: c93f84a445c8b8c4 +Block 0007 [ 75]: 210bf0fd5973d7a5 +Block 0007 [ 76]: c6598b4fb35eb70c +Block 0007 [ 77]: dc3ab8ae47c5ec9e +Block 0007 [ 78]: 932b8a0159b60161 +Block 0007 [ 79]: 1e886e331d1d815b +Block 0007 [ 80]: d57e42a90b5b5ea2 +Block 0007 [ 81]: c19836b4eebcf0e0 +Block 0007 [ 82]: 7bcf27db4f73cecf +Block 0007 [ 83]: 4f337cae713d7a49 +Block 0007 [ 84]: c74db29321d52f0a +Block 0007 [ 85]: 81757ef96322e580 +Block 0007 [ 86]: 1e4f7d1b8905b7a1 +Block 0007 [ 87]: 6fe9f441a85dac8d +Block 0007 [ 88]: bb2b2c459eaba1f5 +Block 0007 [ 89]: f7a9148b29d6bfeb +Block 0007 [ 90]: 0cc049b9c6e1237c +Block 0007 [ 91]: d297ff0079dbb8e3 +Block 0007 [ 92]: df4b35c29891f33b +Block 0007 [ 93]: 95c07dfb25bdb5d3 +Block 0007 [ 94]: a1b58642419c579d +Block 0007 [ 95]: e4f0ae1ce73b7a94 +Block 0007 [ 96]: 747795cbb741f532 +Block 0007 [ 97]: 58122055bd9967a8 +Block 0007 [ 98]: e6d2fe83ad0bb0c7 +Block 0007 [ 99]: 7c6733d7e587fece +Block 0007 [100]: 6b583826c192891a +Block 0007 [101]: 8ae9b5e57e175517 +Block 0007 [102]: 2f6e710fb49abdd8 +Block 0007 [103]: d5be1ac3dda22c8d +Block 0007 [104]: 5afff784fa1bf48b +Block 0007 [105]: 1fc1d96bc25caea1 +Block 0007 [106]: fb74ff65f0f24544 +Block 0007 [107]: e48fd5ba945b02a2 +Block 0007 [108]: b7de6a07cfbfdb0a +Block 0007 [109]: 151e19b16051ab9f +Block 0007 [110]: 9254ef841a98c808 +Block 0007 [111]: 4b373f36b0e31770 +Block 0007 [112]: a0d241c34ff8cfa6 +Block 0007 [113]: 76c7e4c042ec3aec +Block 0007 [114]: 4832326e33ed6314 +Block 0007 [115]: 2339915d2024ef5f +Block 0007 [116]: e0d8261905b27f66 +Block 0007 [117]: 2261a1333158bfdb +Block 0007 [118]: 78f4b91b214610b6 +Block 0007 [119]: 13d6a0120299a8d0 +Block 0007 [120]: 7c15f3b8582db3ab +Block 0007 [121]: 00b9f16978014f32 +Block 0007 [122]: c37476f83eab622f +Block 0007 [123]: 3b504a0cce417082 +Block 0007 [124]: 504d28bac5681fcf +Block 0007 [125]: 53fe3f3c188cfdfc +Block 0007 [126]: d2edb0da87468512 +Block 0007 [127]: 8dd7c8f05895eea8 +Block 0008 [ 0]: 5d390b079d0f3c47 +Block 0008 [ 1]: 631734483921758e +Block 0008 [ 2]: ed4bf986e07b5e28 +Block 0008 [ 3]: 9ffa103e77ebc487 +Block 0008 [ 4]: 5c194d18d89640e6 +Block 0008 [ 5]: 8603e18fc4fe0f6a +Block 0008 [ 6]: 00b9f5cee0eaadfc +Block 0008 [ 7]: 8b1ea916bb95a9f2 +Block 0008 [ 8]: 99099a16e443ef5f +Block 0008 [ 9]: b8e6ba465a8b10e9 +Block 0008 [ 10]: 756a2fbbf4f5a154 +Block 0008 [ 11]: 7bc7f48014c56e73 +Block 0008 [ 12]: 1e11511a7bf4bd41 +Block 0008 [ 13]: e949210b66327b58 +Block 0008 [ 14]: 051f0050d5aac874 +Block 0008 [ 15]: 1a2566c306ead6b9 +Block 0008 [ 16]: 930d022e7888d216 +Block 0008 [ 17]: 0582ec2e435a555f +Block 0008 [ 18]: fe0dd7d9465e1e29 +Block 0008 [ 19]: de2ee4564bce48a5 +Block 0008 [ 20]: 0d5072a51ecc0fa0 +Block 0008 [ 21]: 44427a90322926cf +Block 0008 [ 22]: 1d315d890f65e83d +Block 0008 [ 23]: e1f9ca311dc237b8 +Block 0008 [ 24]: 0baf3526a72a11bc +Block 0008 [ 25]: 9a0d03779403602c +Block 0008 [ 26]: b14361834efb1c72 +Block 0008 [ 27]: c93f96de539b5c4f +Block 0008 [ 28]: 0763882c2814ac4c +Block 0008 [ 29]: 1713c202a7fefb89 +Block 0008 [ 30]: a3d9d35d0f938ac9 +Block 0008 [ 31]: fa39df6510e6f52a +Block 0008 [ 32]: d0ad5e8ded8cb6af +Block 0008 [ 33]: 63fc4badd29ec94b +Block 0008 [ 34]: a4421774c98764ef +Block 0008 [ 35]: 3414be973e81f2ef +Block 0008 [ 36]: 74df078314799d9d +Block 0008 [ 37]: be229396be40f7b6 +Block 0008 [ 38]: e0d009aa0635bb4c +Block 0008 [ 39]: fab2695ac684c57a +Block 0008 [ 40]: 6c0a94812877f048 +Block 0008 [ 41]: 7dc440749ae442ab +Block 0008 [ 42]: d78523d4176e3f2f +Block 0008 [ 43]: b8019dac190a312e +Block 0008 [ 44]: 98750809c9fd9a29 +Block 0008 [ 45]: 97d93132f60ba799 +Block 0008 [ 46]: 4b78d6769101dec3 +Block 0008 [ 47]: 8dfc4271071b6374 +Block 0008 [ 48]: 0d93e5b71ba5accf +Block 0008 [ 49]: 55b8352ba3de28a7 +Block 0008 [ 50]: 1ff98ead8ed53bff +Block 0008 [ 51]: 4345c4c79dc0dc9b +Block 0008 [ 52]: 07a4077a5731b408 +Block 0008 [ 53]: ce6b2dda9f81e9d8 +Block 0008 [ 54]: a54293585c425cd6 +Block 0008 [ 55]: 75430004a8b7b2ff +Block 0008 [ 56]: cdff0f60d61ed3a9 +Block 0008 [ 57]: 40473d034cdc74cc +Block 0008 [ 58]: 9dace14d7adffd8b +Block 0008 [ 59]: cf19dab22e542598 +Block 0008 [ 60]: 3949259d09c091d8 +Block 0008 [ 61]: 7c81a97d86a30f01 +Block 0008 [ 62]: 4f676a32da1a29d0 +Block 0008 [ 63]: 66e8d05639fb0c14 +Block 0008 [ 64]: 4c1af73d9a85dd31 +Block 0008 [ 65]: 79e9b95889a88a16 +Block 0008 [ 66]: f9908b3531cc76ea +Block 0008 [ 67]: f6cfad223752eec7 +Block 0008 [ 68]: 41479ece4c58b371 +Block 0008 [ 69]: 82a169276b336f19 +Block 0008 [ 70]: d44954dbd75a21b8 +Block 0008 [ 71]: 1f95e2b453d4f78b +Block 0008 [ 72]: bced4e6da5ba36eb +Block 0008 [ 73]: 068eafdb44cbfbc2 +Block 0008 [ 74]: 0999d545028f9efe +Block 0008 [ 75]: eded6e0de0c417a7 +Block 0008 [ 76]: 29458d270d29c726 +Block 0008 [ 77]: ca47e3726b5c83b7 +Block 0008 [ 78]: 55d4767698536bfd +Block 0008 [ 79]: d6625a482a8db1b3 +Block 0008 [ 80]: 1cc4d3f6df69fe20 +Block 0008 [ 81]: e8b4b60c15d40dca +Block 0008 [ 82]: 32f048c6f0d48123 +Block 0008 [ 83]: 2f35db8679917a7e +Block 0008 [ 84]: 759b5ada93849d12 +Block 0008 [ 85]: 1ae3c2be42c6eea9 +Block 0008 [ 86]: 93e74ea55d8b0d66 +Block 0008 [ 87]: 68fcbcde1e1a6565 +Block 0008 [ 88]: 1889a5726a26da42 +Block 0008 [ 89]: 411b88d9b6db4828 +Block 0008 [ 90]: de23768fd2455c23 +Block 0008 [ 91]: 4f6067933ce44e02 +Block 0008 [ 92]: 8efa982c0485196c +Block 0008 [ 93]: 526025198657de26 +Block 0008 [ 94]: 419b492b3661f65d +Block 0008 [ 95]: fe15b81200f6eb75 +Block 0008 [ 96]: c6a9ecad13aadff8 +Block 0008 [ 97]: 0a76c404e5278377 +Block 0008 [ 98]: c8172a7c6942cc25 +Block 0008 [ 99]: 311b55b1905a0a60 +Block 0008 [100]: 724ab2c3127bfe21 +Block 0008 [101]: 75e4ec223a74f3f5 +Block 0008 [102]: 5764eaa3be4daec2 +Block 0008 [103]: d1ded8250f85689c +Block 0008 [104]: a2f7c754668a6481 +Block 0008 [105]: ead4eeb6d1d49959 +Block 0008 [106]: 47bb132a81f3c0da +Block 0008 [107]: f3051e81a5dd1079 +Block 0008 [108]: 9d12025fdde61890 +Block 0008 [109]: 63c8049a357ca2c0 +Block 0008 [110]: 83ebad4c3c2faba3 +Block 0008 [111]: 1007d48feef5049d +Block 0008 [112]: 88d09ba2a9e8e2a5 +Block 0008 [113]: 2afbe3f5d1b30d82 +Block 0008 [114]: 00004c21a628e91c +Block 0008 [115]: 0e46db5c9f6e12c9 +Block 0008 [116]: 9cf96fab1e4dd3f8 +Block 0008 [117]: a7703f68865b6af4 +Block 0008 [118]: ad53f4297b4dd1db +Block 0008 [119]: a012faa78331fc14 +Block 0008 [120]: d5aaf6aeabe110f8 +Block 0008 [121]: d6de328de4c92196 +Block 0008 [122]: 75827f679ab6b8a7 +Block 0008 [123]: fbf6da92a4f6ced0 +Block 0008 [124]: f9df80a3daf27bb8 +Block 0008 [125]: 0b35df003d687d2f +Block 0008 [126]: 69ebef0dc424ec77 +Block 0008 [127]: 150d2aaa755eee68 +Block 0009 [ 0]: ce8d377f08f7fe79 +Block 0009 [ 1]: 8c20bf58c17115cf +Block 0009 [ 2]: 9d58f26c303997fd +Block 0009 [ 3]: 908a17f607eafb21 +Block 0009 [ 4]: ca4c3bf6e41ffade +Block 0009 [ 5]: 9b23d7636fb3f276 +Block 0009 [ 6]: 31d57db44e9d7078 +Block 0009 [ 7]: 71494598e4916674 +Block 0009 [ 8]: 7f43fee7abb5a94f +Block 0009 [ 9]: cc0b2152cc614b56 +Block 0009 [ 10]: a4c240deb0eb1a93 +Block 0009 [ 11]: 8dc29aa7479a224a +Block 0009 [ 12]: 23d557074d98a0b7 +Block 0009 [ 13]: cbe656a292df3d02 +Block 0009 [ 14]: cb8dc6eefa34d7c8 +Block 0009 [ 15]: 8d5a12c06108e989 +Block 0009 [ 16]: bcf42fe767f10284 +Block 0009 [ 17]: 73e4f1efa605ee48 +Block 0009 [ 18]: 3b05f1b3e39ce7c4 +Block 0009 [ 19]: 44a0da643669026d +Block 0009 [ 20]: 730a137534d337bf +Block 0009 [ 21]: 007c05c1857fab4e +Block 0009 [ 22]: f99aac7ee7a70067 +Block 0009 [ 23]: e2c11ca64fb8518c +Block 0009 [ 24]: 2d0244c8a78b3f7f +Block 0009 [ 25]: 02d54c9795ed259d +Block 0009 [ 26]: 1ccb41de825eb282 +Block 0009 [ 27]: 094e02b949396d6a +Block 0009 [ 28]: fe86cfd514adaf77 +Block 0009 [ 29]: b92fa1cd5c496f06 +Block 0009 [ 30]: 278fcfe3a4b794fa +Block 0009 [ 31]: 8eb888dd3e6e1d0d +Block 0009 [ 32]: 39971bfaa759afc1 +Block 0009 [ 33]: 5efc9323d1eaa784 +Block 0009 [ 34]: 32fa6022074c0fcf +Block 0009 [ 35]: 484b81c4f4653609 +Block 0009 [ 36]: 7b8beed4c906adf7 +Block 0009 [ 37]: 2dbe5bb15be5770f +Block 0009 [ 38]: 71409b1f63ac2093 +Block 0009 [ 39]: de542f2668c63b10 +Block 0009 [ 40]: 44b0c9767d4418c8 +Block 0009 [ 41]: b90ef7ff84c5e1a4 +Block 0009 [ 42]: b9fd084eda79682b +Block 0009 [ 43]: d91a574bda76901f +Block 0009 [ 44]: 8bc9f293e1d45b6c +Block 0009 [ 45]: a55399657500adf4 +Block 0009 [ 46]: 4b12096ac90ccc73 +Block 0009 [ 47]: 715af0c0bb5895e3 +Block 0009 [ 48]: ef82a77202164329 +Block 0009 [ 49]: 3a8911d0d52aa2ee +Block 0009 [ 50]: dfe9a2c49fd37efc +Block 0009 [ 51]: 44b03a85493a87d1 +Block 0009 [ 52]: 67ef6a9d0b782657 +Block 0009 [ 53]: 7830301ca2b6de19 +Block 0009 [ 54]: b77da999c566c7f0 +Block 0009 [ 55]: 4f075e97d94a8e0a +Block 0009 [ 56]: 7f4072a94c94f761 +Block 0009 [ 57]: 16cdea91df85080d +Block 0009 [ 58]: 3874d09a0ea0f90c +Block 0009 [ 59]: cd40596f76232601 +Block 0009 [ 60]: 56c4d1d584fe9206 +Block 0009 [ 61]: 8353f143a48f7493 +Block 0009 [ 62]: 3b43a5839db205dd +Block 0009 [ 63]: 7911e3e5c874bea7 +Block 0009 [ 64]: a202515a2b192ac0 +Block 0009 [ 65]: 0389f1e56dc55e6a +Block 0009 [ 66]: 4e951464e5ad25c5 +Block 0009 [ 67]: 257ac4933f14f134 +Block 0009 [ 68]: 3287ef9942926b40 +Block 0009 [ 69]: 40cec3bd22c86041 +Block 0009 [ 70]: dbd6ec1749aa5e99 +Block 0009 [ 71]: 5788f14286b46a60 +Block 0009 [ 72]: 72760917498f959e +Block 0009 [ 73]: 9f36d2b48e2822b6 +Block 0009 [ 74]: 5081f0e45fb5fd67 +Block 0009 [ 75]: cc5fb925077bd013 +Block 0009 [ 76]: 6518a37a669fde5e +Block 0009 [ 77]: df366ef1564c60e4 +Block 0009 [ 78]: 55be980f77a07ec0 +Block 0009 [ 79]: f9873ade723e65b7 +Block 0009 [ 80]: f35f4a2816fc122c +Block 0009 [ 81]: cd1eb28cfa398921 +Block 0009 [ 82]: 09da96aa8bdac0d5 +Block 0009 [ 83]: eb6dc7aab11559dc +Block 0009 [ 84]: 25447fc0c67575d4 +Block 0009 [ 85]: 91a4d8daa8c810f5 +Block 0009 [ 86]: 9e31930d5aef7367 +Block 0009 [ 87]: 4f5a712ea723acc8 +Block 0009 [ 88]: edd07d6da9c84795 +Block 0009 [ 89]: 02d2177706dd53f7 +Block 0009 [ 90]: bf6c192b4cf63a91 +Block 0009 [ 91]: c78c4419b3ee8253 +Block 0009 [ 92]: a100748306111376 +Block 0009 [ 93]: 73ce0d73b1e79718 +Block 0009 [ 94]: 1014b78632ec0d41 +Block 0009 [ 95]: 734231d1617553de +Block 0009 [ 96]: 5988558d1a8d8e3a +Block 0009 [ 97]: 5629c3ede2e9d511 +Block 0009 [ 98]: 79e13d0d94340525 +Block 0009 [ 99]: f4c5c7336d169b86 +Block 0009 [100]: 5764cef5ad7fa93f +Block 0009 [101]: fb6234c6a6386257 +Block 0009 [102]: f4b994758a0f35e7 +Block 0009 [103]: 1a0cd87926b1fde2 +Block 0009 [104]: c72591e546983e39 +Block 0009 [105]: 0f7b07aaa5e224c3 +Block 0009 [106]: ab73b302681f5e62 +Block 0009 [107]: ce0ba76a4505aa4e +Block 0009 [108]: ff7210fcd2fde9a6 +Block 0009 [109]: 4629ed41f29c3515 +Block 0009 [110]: 13ec4b4caa1040d2 +Block 0009 [111]: d1ceeddad6ad578b +Block 0009 [112]: bac3f41626f8d3dc +Block 0009 [113]: ad4ff3709d35af50 +Block 0009 [114]: 5e9cf2efe0414e28 +Block 0009 [115]: 27ce4c9d35606793 +Block 0009 [116]: f46f2476963e3e88 +Block 0009 [117]: 5861232534f983cc +Block 0009 [118]: 0f9800c4a3832b80 +Block 0009 [119]: f1fcb7824c057729 +Block 0009 [120]: 945e20f06a155498 +Block 0009 [121]: ffa7dfbd69cd6bb1 +Block 0009 [122]: 9a1be0799dbe2856 +Block 0009 [123]: 681ba56766e190f6 +Block 0009 [124]: 5e326010ccbda0bd +Block 0009 [125]: 94f0f292bfb4113c +Block 0009 [126]: fa3b9bae5b239f61 +Block 0009 [127]: 37d071a4e980c4a0 +Block 0010 [ 0]: 6ae4225fd3354e7d +Block 0010 [ 1]: ae61c609843bcde0 +Block 0010 [ 2]: ed5854bb11b0d8f9 +Block 0010 [ 3]: 0120456d2ab6b157 +Block 0010 [ 4]: ab7db2b1fc378e9a +Block 0010 [ 5]: c97048fe8a2f5f4a +Block 0010 [ 6]: cba30aaab4ef2f74 +Block 0010 [ 7]: 56efcefbc8806464 +Block 0010 [ 8]: 47488cad6c56f9d0 +Block 0010 [ 9]: 5d99c80238f6ab3d +Block 0010 [ 10]: 2aaac7c0e0b8d7b2 +Block 0010 [ 11]: 54677ec26bdc9712 +Block 0010 [ 12]: 1aab36f7d8d09dbc +Block 0010 [ 13]: f437d5d7483ec013 +Block 0010 [ 14]: 707edb42a8a784d0 +Block 0010 [ 15]: e594c41a0b98992f +Block 0010 [ 16]: dbb919a6e327f5ac +Block 0010 [ 17]: 83bb58fbec7087d4 +Block 0010 [ 18]: 6cf134c837408aa5 +Block 0010 [ 19]: d871df3877e67200 +Block 0010 [ 20]: aa09bbdc731bec8c +Block 0010 [ 21]: 397bd2b0904d0eb4 +Block 0010 [ 22]: 12e5d0c755e90680 +Block 0010 [ 23]: 646867347d61108d +Block 0010 [ 24]: ae575603915fed70 +Block 0010 [ 25]: 963882db4d43ed3e +Block 0010 [ 26]: 331347bff0ca99fb +Block 0010 [ 27]: 85ec009fe77bbdf2 +Block 0010 [ 28]: 084715d977901d19 +Block 0010 [ 29]: 5d70ffa2c7e8fcd0 +Block 0010 [ 30]: aae90dd8c199a885 +Block 0010 [ 31]: 094f2087a840c4c3 +Block 0010 [ 32]: 78970a09ff9119ee +Block 0010 [ 33]: 19164104a0809a35 +Block 0010 [ 34]: 67cf795053fc548f +Block 0010 [ 35]: 15d39628c9533f25 +Block 0010 [ 36]: a8521d7d68c133f9 +Block 0010 [ 37]: da48eb5cbd765e6e +Block 0010 [ 38]: 1c4dbae1e77c7698 +Block 0010 [ 39]: 693ffe0f2fe3fe1d +Block 0010 [ 40]: 2d1edc2b4a72a1df +Block 0010 [ 41]: 8e561749154aad0e +Block 0010 [ 42]: 0fd72e31af0b850c +Block 0010 [ 43]: 165f1c19fbebadfe +Block 0010 [ 44]: b26ee88a45cb6beb +Block 0010 [ 45]: c0e826858ed46223 +Block 0010 [ 46]: f992b123f14f1cab +Block 0010 [ 47]: 8a347ffa03d4829d +Block 0010 [ 48]: 1c7682e743b0584d +Block 0010 [ 49]: 2d0ae08ec8c7aa45 +Block 0010 [ 50]: 01e6d7667bd54686 +Block 0010 [ 51]: 8f95e476ebd46d17 +Block 0010 [ 52]: 94ef46dbbba5d43f +Block 0010 [ 53]: 8d29e31a9f4cc10b +Block 0010 [ 54]: 1be3ba26e8284d00 +Block 0010 [ 55]: ad2cef78f2a69fbf +Block 0010 [ 56]: a10dfde3deac51a0 +Block 0010 [ 57]: 36376969357596b8 +Block 0010 [ 58]: c2d33dca853ea6a1 +Block 0010 [ 59]: 628d33bcabbefbef +Block 0010 [ 60]: f40ff3b9ccc10e17 +Block 0010 [ 61]: 1e5528923919f862 +Block 0010 [ 62]: 414e61378799210e +Block 0010 [ 63]: 62a81dce51d609a7 +Block 0010 [ 64]: 096e77f5d7249666 +Block 0010 [ 65]: 47820b3a33cd71d3 +Block 0010 [ 66]: 0bd5d6025f579a6c +Block 0010 [ 67]: a9fa38990d42aca5 +Block 0010 [ 68]: 27bd9b1bd1097a06 +Block 0010 [ 69]: 03dafb3b4f0a4028 +Block 0010 [ 70]: 5fb19963de1e3de9 +Block 0010 [ 71]: 4939211959107034 +Block 0010 [ 72]: 666da05a2d74db1c +Block 0010 [ 73]: f19cf56f0a6c1655 +Block 0010 [ 74]: 92c4b322f190d295 +Block 0010 [ 75]: 9ad74d6c542b329d +Block 0010 [ 76]: 989f4d9fa7c577ba +Block 0010 [ 77]: 225b7af5faafe2a4 +Block 0010 [ 78]: 5aa9ea1a78ec99e8 +Block 0010 [ 79]: 228e7be67b366548 +Block 0010 [ 80]: 150b81a49ddc73c6 +Block 0010 [ 81]: 2686be4153716d63 +Block 0010 [ 82]: ffebb344c1e28f03 +Block 0010 [ 83]: b08324cad8a5226d +Block 0010 [ 84]: 8d6d3d47c0d054ca +Block 0010 [ 85]: 3e184784291a476d +Block 0010 [ 86]: 32f84fc587b2c6b0 +Block 0010 [ 87]: a2b2b8f1589defd7 +Block 0010 [ 88]: 54977641b62ca3f6 +Block 0010 [ 89]: a28f16c81a04dc04 +Block 0010 [ 90]: 305249ff2c268843 +Block 0010 [ 91]: b1e0bd99bdb4c0bd +Block 0010 [ 92]: 7cf0826d7d7e0da9 +Block 0010 [ 93]: 52754123e360fc24 +Block 0010 [ 94]: 0526df5315c972ce +Block 0010 [ 95]: 99b71c3b595c570d +Block 0010 [ 96]: 3813b5c8bf718f26 +Block 0010 [ 97]: cc36301d8c899aca +Block 0010 [ 98]: a4de37d02e4590bf +Block 0010 [ 99]: 6f82a145af50d633 +Block 0010 [100]: de36d308ff4ef542 +Block 0010 [101]: 9a33a513b52c8d89 +Block 0010 [102]: ab2d45c941001698 +Block 0010 [103]: de21774c3a9e5d89 +Block 0010 [104]: 382200ec936fd74d +Block 0010 [105]: dd8d3ae52c7715fd +Block 0010 [106]: 842c4259c643aa09 +Block 0010 [107]: 0b829f3180e13902 +Block 0010 [108]: cec67d91ad380b93 +Block 0010 [109]: 4dc4beebbb42a6f5 +Block 0010 [110]: 5be736664c2d8d83 +Block 0010 [111]: e2f1024ba77d28fb +Block 0010 [112]: 81b0bb61533210ec +Block 0010 [113]: f83a00c51e3d5f38 +Block 0010 [114]: 7db95cbd56f98dcd +Block 0010 [115]: ee9f7501afa33446 +Block 0010 [116]: df7a7cf05087effe +Block 0010 [117]: 008776f8c2bb79ef +Block 0010 [118]: 64f2536d4fddec8a +Block 0010 [119]: 42233a0aaa87bd28 +Block 0010 [120]: aa47058137b994c5 +Block 0010 [121]: 79deaf8cb75ceefa +Block 0010 [122]: 88f20958cc05a49c +Block 0010 [123]: 2e3801065fdccaee +Block 0010 [124]: 53f1c983bea4c1ad +Block 0010 [125]: 6f75ee8921399ac7 +Block 0010 [126]: e1ef4f82c909106b +Block 0010 [127]: 2ad0bc617385b62e +Block 0011 [ 0]: 84a8bbec5e9ee507 +Block 0011 [ 1]: e8a03a4136c62548 +Block 0011 [ 2]: d6d377ef5a53f910 +Block 0011 [ 3]: 661ba9468903274e +Block 0011 [ 4]: 159beb64d3f0bc11 +Block 0011 [ 5]: 43118ec42adbd446 +Block 0011 [ 6]: c0f8908e19fdc2eb +Block 0011 [ 7]: 9f6c9cbf9f38a396 +Block 0011 [ 8]: ff27ec0e5b15b35b +Block 0011 [ 9]: a3c32c3786f7abed +Block 0011 [ 10]: de7a4b557b81bcd4 +Block 0011 [ 11]: 47f34f0379397d03 +Block 0011 [ 12]: a28b5dcc934a73ae +Block 0011 [ 13]: e5f091472cb1bfa1 +Block 0011 [ 14]: 21cface025922c20 +Block 0011 [ 15]: 34243b1d719f51b1 +Block 0011 [ 16]: 4646e791e97f3067 +Block 0011 [ 17]: 2c4737e43fc46a7c +Block 0011 [ 18]: 37576580cb2492c5 +Block 0011 [ 19]: 79f8b1d97f0e8175 +Block 0011 [ 20]: 54a860d192f9aa2c +Block 0011 [ 21]: 407cda5ad8c11036 +Block 0011 [ 22]: ea47f0af4b9e5a9a +Block 0011 [ 23]: 755da21d178d3913 +Block 0011 [ 24]: 3d220cc9bdc29123 +Block 0011 [ 25]: 890994f162b2fcb5 +Block 0011 [ 26]: 0ecd9a8a8ba69663 +Block 0011 [ 27]: 792867585bc69059 +Block 0011 [ 28]: 099c4e35d90e319b +Block 0011 [ 29]: f68ee3ac82745acb +Block 0011 [ 30]: 715ceab2ace61477 +Block 0011 [ 31]: add36ee92d210fd9 +Block 0011 [ 32]: 8941e202a8ac2505 +Block 0011 [ 33]: 337cbdd068139e15 +Block 0011 [ 34]: 493cc70a9def9bae +Block 0011 [ 35]: 726fa6f389708a0c +Block 0011 [ 36]: 791b092018711bae +Block 0011 [ 37]: ff5f50b1219a362e +Block 0011 [ 38]: 637297cc8f5aca78 +Block 0011 [ 39]: 384420634789c4da +Block 0011 [ 40]: da3e44be4ac76889 +Block 0011 [ 41]: 48394be7eeba3e3e +Block 0011 [ 42]: e176657fb6b322b8 +Block 0011 [ 43]: c513ffedae4caad1 +Block 0011 [ 44]: 4ddbc4eac9242fc7 +Block 0011 [ 45]: 362645696d67c92d +Block 0011 [ 46]: 95570dee7ffafff2 +Block 0011 [ 47]: 8f3b2a3d572a1ed0 +Block 0011 [ 48]: a79e0894ca3d905a +Block 0011 [ 49]: dce9aa88d8a9d75b +Block 0011 [ 50]: 2a82a5435a689d82 +Block 0011 [ 51]: 32d286f29f37cacf +Block 0011 [ 52]: b19ce4dca4005b60 +Block 0011 [ 53]: 40847a0db8fe5e34 +Block 0011 [ 54]: 6138dcc695f94762 +Block 0011 [ 55]: 491328f6caa72814 +Block 0011 [ 56]: d0b86718c90f93a6 +Block 0011 [ 57]: 48640b60a60db10b +Block 0011 [ 58]: ba701372be54710c +Block 0011 [ 59]: e89bf12522b18b59 +Block 0011 [ 60]: a0a5d8654266c996 +Block 0011 [ 61]: afe130022ad9628f +Block 0011 [ 62]: dd319661eb7f7aad +Block 0011 [ 63]: 98bf04f183e0b0bd +Block 0011 [ 64]: 521f230536266d1b +Block 0011 [ 65]: 4c964a1ca31865cf +Block 0011 [ 66]: 7983f4550bc3d6d2 +Block 0011 [ 67]: 0e164c3fbce581f2 +Block 0011 [ 68]: 637686674de50ddf +Block 0011 [ 69]: a19d2b703b28c51d +Block 0011 [ 70]: c504278031ca23f3 +Block 0011 [ 71]: 9026013bac4a5535 +Block 0011 [ 72]: 652a23d15b9afe84 +Block 0011 [ 73]: 2d45fc40abd2c9e6 +Block 0011 [ 74]: 0d920ca47339da99 +Block 0011 [ 75]: 19f051f1f60130b4 +Block 0011 [ 76]: e608f533dcd7a6e1 +Block 0011 [ 77]: 4d59c7dacc856135 +Block 0011 [ 78]: cdcc9c8f0b17ebfc +Block 0011 [ 79]: bb13ab77aeb72e83 +Block 0011 [ 80]: c5900c3d399e428d +Block 0011 [ 81]: ab7bd462910e6519 +Block 0011 [ 82]: f7dbc144cc0076c3 +Block 0011 [ 83]: 5d80b17f4bc6ccda +Block 0011 [ 84]: 55c0c5e537ee7d11 +Block 0011 [ 85]: f305d86abf28d135 +Block 0011 [ 86]: 668f8c1e60a8fffa +Block 0011 [ 87]: 8e6e92f12139d3e0 +Block 0011 [ 88]: 90b32c3b5e579f75 +Block 0011 [ 89]: 4804297542b36066 +Block 0011 [ 90]: 0d1933319e2a7ff9 +Block 0011 [ 91]: 290f8644fbf35131 +Block 0011 [ 92]: b358a81c7060c4fc +Block 0011 [ 93]: 45b588b79be669a3 +Block 0011 [ 94]: 31baa98245901537 +Block 0011 [ 95]: acd49bf29b0b0634 +Block 0011 [ 96]: 6d3f843799ff6816 +Block 0011 [ 97]: 26326dfc3bbbab3a +Block 0011 [ 98]: 9242f6493a116b59 +Block 0011 [ 99]: 67502898e5348f84 +Block 0011 [100]: 23571627a7c9d9e0 +Block 0011 [101]: 4d886d318333c3ee +Block 0011 [102]: 20ddc8838c57eccd +Block 0011 [103]: e601082750c1a449 +Block 0011 [104]: 7aa1f0317c03160a +Block 0011 [105]: 51b365b732b327db +Block 0011 [106]: e0763a1f51c3bb8f +Block 0011 [107]: ab1584266689907b +Block 0011 [108]: 389e5c3adfd8185e +Block 0011 [109]: c6442e5b62ed24d6 +Block 0011 [110]: 50af38d5cf0f09b5 +Block 0011 [111]: 1008d4f64bfc0129 +Block 0011 [112]: a364e313e91732fe +Block 0011 [113]: b226645180d50df3 +Block 0011 [114]: f163bc669cf4b70e +Block 0011 [115]: 187ce08474232ec3 +Block 0011 [116]: 59dd06d3949824d2 +Block 0011 [117]: 8bf0b3a673af1ab3 +Block 0011 [118]: c8b5d0c652513b9b +Block 0011 [119]: 76c43e6630c174ca +Block 0011 [120]: 8dc908bb6c08c8b4 +Block 0011 [121]: 0c76121879f3f9e2 +Block 0011 [122]: a9a9c39976c5da9a +Block 0011 [123]: 509e26ce42034853 +Block 0011 [124]: 9276f4686d96bab6 +Block 0011 [125]: 61bd632fddc5381c +Block 0011 [126]: af2cc8c6499fce15 +Block 0011 [127]: 55322a996015ca7e +Block 0012 [ 0]: 2de6a260b3dc7033 +Block 0012 [ 1]: b199b1c2a33061bc +Block 0012 [ 2]: 6934301e1592cc31 +Block 0012 [ 3]: 08329482bbd037a3 +Block 0012 [ 4]: 3b74c1c774a7c3ea +Block 0012 [ 5]: 29039e3efa32b00e +Block 0012 [ 6]: b71c527205dc00df +Block 0012 [ 7]: c0f4b25c94f538b0 +Block 0012 [ 8]: eca61e402daa6569 +Block 0012 [ 9]: ba4db20991e9824c +Block 0012 [ 10]: 3e869f7935d4a0d8 +Block 0012 [ 11]: 0b6273fb4e41db98 +Block 0012 [ 12]: a0f161fd742126cd +Block 0012 [ 13]: 163b553fa996c120 +Block 0012 [ 14]: 03519d81912f1029 +Block 0012 [ 15]: c8dace89c4d03838 +Block 0012 [ 16]: ea6b9219f18405a9 +Block 0012 [ 17]: 373bb78358988878 +Block 0012 [ 18]: bcd325dcfd7ceea5 +Block 0012 [ 19]: d2f1d6173a7ff965 +Block 0012 [ 20]: 947458a9bd5311e7 +Block 0012 [ 21]: 4a59302fc6fd2b1f +Block 0012 [ 22]: 78b06821a947c9b6 +Block 0012 [ 23]: 6f6089d041ec1ab6 +Block 0012 [ 24]: 52054e7c6e7d1dd3 +Block 0012 [ 25]: e08e2601656dac82 +Block 0012 [ 26]: bb4c9839ecfc7208 +Block 0012 [ 27]: 641f5afddf424d36 +Block 0012 [ 28]: 3b4433461c77cb42 +Block 0012 [ 29]: 4958d19b9f87a1d6 +Block 0012 [ 30]: dce1d42c81cf32bb +Block 0012 [ 31]: 919d8b4967b1c11d +Block 0012 [ 32]: 5483f958324ea9cc +Block 0012 [ 33]: e58572e35d604799 +Block 0012 [ 34]: 0f11afd06441b2ac +Block 0012 [ 35]: 9d32367932b3beef +Block 0012 [ 36]: be8229b34b4cce48 +Block 0012 [ 37]: 627d429986fd97a7 +Block 0012 [ 38]: f4d35eec751273f2 +Block 0012 [ 39]: 5cd90b57ccccc552 +Block 0012 [ 40]: 136897ab6168509e +Block 0012 [ 41]: 52e93c6b812b7c55 +Block 0012 [ 42]: 21b61e3e8248e02f +Block 0012 [ 43]: 80665bbe9536995b +Block 0012 [ 44]: 4ad516ad1744af03 +Block 0012 [ 45]: 58904e9d8d3bc697 +Block 0012 [ 46]: 20447941272fcfaf +Block 0012 [ 47]: 653141cbebb72f86 +Block 0012 [ 48]: de9a2934bef33099 +Block 0012 [ 49]: f05298f7aecaff8f +Block 0012 [ 50]: 6ad7aa44563c7750 +Block 0012 [ 51]: a354661a945226e9 +Block 0012 [ 52]: aade90283df08ab4 +Block 0012 [ 53]: 6ad86b10a2edb467 +Block 0012 [ 54]: 9cb6246359729643 +Block 0012 [ 55]: 5e775696928d0575 +Block 0012 [ 56]: 223c0aeeeaf88eb9 +Block 0012 [ 57]: b535c81ea45b395f +Block 0012 [ 58]: 7b3b6a488b140e18 +Block 0012 [ 59]: 78e63df0f33c4298 +Block 0012 [ 60]: 71626f7696d02487 +Block 0012 [ 61]: 33d189e34208a296 +Block 0012 [ 62]: 5b8628463bb8370e +Block 0012 [ 63]: 3d5297daeb8f37b4 +Block 0012 [ 64]: a15e54b4218955b2 +Block 0012 [ 65]: 51df554a50dd1ac5 +Block 0012 [ 66]: 469ebeeabe5cfa14 +Block 0012 [ 67]: af41090cd43b27c9 +Block 0012 [ 68]: 3dfc7c9a5249e757 +Block 0012 [ 69]: 8083dc62d2141666 +Block 0012 [ 70]: 2d0c10b32040a47e +Block 0012 [ 71]: 4f2f846df18c4408 +Block 0012 [ 72]: 645797be6008bdd9 +Block 0012 [ 73]: f884a7fb4b143954 +Block 0012 [ 74]: a98762ac97397fa2 +Block 0012 [ 75]: 36d8803c36f9d2fd +Block 0012 [ 76]: 8b29f727011addc1 +Block 0012 [ 77]: dbffb03d24c3da4f +Block 0012 [ 78]: 39daa7f462274b2f +Block 0012 [ 79]: 252aa6b07d2cc934 +Block 0012 [ 80]: 767071afdb1e350a +Block 0012 [ 81]: ed9a4efa0c0eb3f9 +Block 0012 [ 82]: 927fec2ec528d3e6 +Block 0012 [ 83]: 53a883fc6082b6b5 +Block 0012 [ 84]: 905abef6eb87256e +Block 0012 [ 85]: 78275c32b72139bf +Block 0012 [ 86]: 41bb9cfdf54b0482 +Block 0012 [ 87]: 3ebfdd007aadc9d1 +Block 0012 [ 88]: dd663de48827a68a +Block 0012 [ 89]: 0d429c3e4c10e1a5 +Block 0012 [ 90]: 8831e3e39090d478 +Block 0012 [ 91]: 872a68049b31b16d +Block 0012 [ 92]: 678981f3eba99ec9 +Block 0012 [ 93]: 948493a87aa77acc +Block 0012 [ 94]: 2cb67e3f3624efb7 +Block 0012 [ 95]: 159ba09c46348a0a +Block 0012 [ 96]: a6df6afbf948c76f +Block 0012 [ 97]: 5f3660d91d0610f0 +Block 0012 [ 98]: e10c380a75c30731 +Block 0012 [ 99]: a3380d1cb4baac6c +Block 0012 [100]: 412122860cd829d8 +Block 0012 [101]: 3d72e351561446cb +Block 0012 [102]: 0d5785e0927ba58a +Block 0012 [103]: 93c450bd6c5408f9 +Block 0012 [104]: c8355b234469e077 +Block 0012 [105]: 8c8c40d89ddec43a +Block 0012 [106]: f3691d1d60862edc +Block 0012 [107]: 9c065215f0575b2c +Block 0012 [108]: d04fa24b788a01ce +Block 0012 [109]: 64964611c2d67b52 +Block 0012 [110]: 34bdcf3613501bb2 +Block 0012 [111]: 39a15e92d0bcb765 +Block 0012 [112]: 84e3e3bd76d195a2 +Block 0012 [113]: 652826ce38d4132a +Block 0012 [114]: a7f30b86b195a2d9 +Block 0012 [115]: f5a9c54cd5550a81 +Block 0012 [116]: 86732d95071189b9 +Block 0012 [117]: dc95387282aace54 +Block 0012 [118]: d563b5079fbeb7d3 +Block 0012 [119]: 17cc96cb016981f6 +Block 0012 [120]: f944e8e5437e9952 +Block 0012 [121]: 37bafa81c06d834f +Block 0012 [122]: 22e4666dcab7f6fa +Block 0012 [123]: 233e45542ee96524 +Block 0012 [124]: 8a3f7acfe023efce +Block 0012 [125]: d477d8b3fb298a6c +Block 0012 [126]: 6d75071da1c053df +Block 0012 [127]: c093ab77397d2a75 +Block 0013 [ 0]: c934e1166fb27497 +Block 0013 [ 1]: c21b829ec1ba75ef +Block 0013 [ 2]: 1812447326ab1f03 +Block 0013 [ 3]: bc5755813b65d394 +Block 0013 [ 4]: 0c55b69fe830401e +Block 0013 [ 5]: f4c57cba458e7b69 +Block 0013 [ 6]: c62cbc15e1273ca6 +Block 0013 [ 7]: 4a15f61d64f24324 +Block 0013 [ 8]: 45a16d7ed87dac30 +Block 0013 [ 9]: 5a042bd17950b220 +Block 0013 [ 10]: 7439bea3d54b3792 +Block 0013 [ 11]: 3e1cfaf0e1b4f0f0 +Block 0013 [ 12]: 79b74477b3b8f188 +Block 0013 [ 13]: a15569fed14e9e1e +Block 0013 [ 14]: 38b701e8bfdfe751 +Block 0013 [ 15]: acdd26a445547733 +Block 0013 [ 16]: 004c8807ca75f2f9 +Block 0013 [ 17]: e7773758ddf0e773 +Block 0013 [ 18]: c17a446f90fb41cf +Block 0013 [ 19]: 2f39aa5712f469c0 +Block 0013 [ 20]: 68e1b4e5a9499402 +Block 0013 [ 21]: 957b2873c2f3338d +Block 0013 [ 22]: d4df5d49fbd9ed5a +Block 0013 [ 23]: e50d7395f7621dbf +Block 0013 [ 24]: 438023a14c97b6fd +Block 0013 [ 25]: aacac0eff810b018 +Block 0013 [ 26]: b3aea30d6fe91e2c +Block 0013 [ 27]: c584091675cc073f +Block 0013 [ 28]: ed36a29bf348e46f +Block 0013 [ 29]: acf0f6ff411f229e +Block 0013 [ 30]: 5d23587357b2ed19 +Block 0013 [ 31]: a7ec3719369e365a +Block 0013 [ 32]: f5ffc8f0c71cec6d +Block 0013 [ 33]: 2a1c6c9deb0fd24c +Block 0013 [ 34]: e1acb5bcfcb18757 +Block 0013 [ 35]: eac5c6ddb44af556 +Block 0013 [ 36]: 4dd3d82cac986cb7 +Block 0013 [ 37]: fe391a158b6ed299 +Block 0013 [ 38]: 911b2e37380edc23 +Block 0013 [ 39]: 3b0d4717aa0f1bf2 +Block 0013 [ 40]: 76db16591771fa79 +Block 0013 [ 41]: 311532f58f784756 +Block 0013 [ 42]: f53186855bac398c +Block 0013 [ 43]: 0bb05e55b79f24f3 +Block 0013 [ 44]: 5da0c076d4e66f1b +Block 0013 [ 45]: e7019aa47334131c +Block 0013 [ 46]: fa128e2a0ba6ea05 +Block 0013 [ 47]: a56fb7281e59f0d3 +Block 0013 [ 48]: 2dec34f65a6d6ceb +Block 0013 [ 49]: 846008f66a2e1bd8 +Block 0013 [ 50]: b722b27b2137e16a +Block 0013 [ 51]: 9158ec8c8966460b +Block 0013 [ 52]: 9be7de535630b177 +Block 0013 [ 53]: ac2f5e16909b6e24 +Block 0013 [ 54]: b5df85fe74b20693 +Block 0013 [ 55]: 360e07ff6b7e8bc6 +Block 0013 [ 56]: 2837a8ebf9aea4df +Block 0013 [ 57]: 755f9c69267634b5 +Block 0013 [ 58]: ea0b7c1912ae0ddb +Block 0013 [ 59]: 59a785481d7e94d2 +Block 0013 [ 60]: 02028a280cbf45a5 +Block 0013 [ 61]: 6b346c9114292b86 +Block 0013 [ 62]: 5ca8c8c68c670efa +Block 0013 [ 63]: 56b101657ac927a6 +Block 0013 [ 64]: ed2918c587aacf9b +Block 0013 [ 65]: ac661ef81f54d2df +Block 0013 [ 66]: 2bf19454b9253bf1 +Block 0013 [ 67]: b20e9398e7f84a5c +Block 0013 [ 68]: 82f05894b799e79c +Block 0013 [ 69]: ea7c2be4af767103 +Block 0013 [ 70]: b2864d47c9263edf +Block 0013 [ 71]: 822aec5441d8f031 +Block 0013 [ 72]: 1c2d2a70e5462d44 +Block 0013 [ 73]: 8b7f3a74a8194379 +Block 0013 [ 74]: 851d2805a7713935 +Block 0013 [ 75]: de57ab09d60d7670 +Block 0013 [ 76]: 150c1158ad23a5c7 +Block 0013 [ 77]: 3330b89c2ad3aa29 +Block 0013 [ 78]: 6996229e973d6fa8 +Block 0013 [ 79]: ac4a5134dd9ce25b +Block 0013 [ 80]: 170b80b260896799 +Block 0013 [ 81]: 9338012e71e3c028 +Block 0013 [ 82]: 2ffe8997c5501b2e +Block 0013 [ 83]: 3b508d7e08a587c4 +Block 0013 [ 84]: 1660331d4211cd03 +Block 0013 [ 85]: ddbddd90efbb854a +Block 0013 [ 86]: 2d19e60c554775cf +Block 0013 [ 87]: 7232777bb83c8091 +Block 0013 [ 88]: ae26f1d73ef906e2 +Block 0013 [ 89]: 0d0e0a3f9e33ecab +Block 0013 [ 90]: 3000d316d97d6ab3 +Block 0013 [ 91]: 3a0b66d12607e7de +Block 0013 [ 92]: 4b27c6b67ea6e15a +Block 0013 [ 93]: ab0dcdc3cf1999dc +Block 0013 [ 94]: 0285ba539708330e +Block 0013 [ 95]: 6427a3253ed229bf +Block 0013 [ 96]: 90594375f4cccd87 +Block 0013 [ 97]: b333fded244366f2 +Block 0013 [ 98]: a2aabc7bdfac9070 +Block 0013 [ 99]: 6be0afc5e0da2a78 +Block 0013 [100]: df9cf2b977e9fb08 +Block 0013 [101]: b13b6ab3692afa87 +Block 0013 [102]: ef38da964aef5164 +Block 0013 [103]: 7d02336c83eeb32d +Block 0013 [104]: d1dc7212202f4f3b +Block 0013 [105]: 55b795c3fb9d1d03 +Block 0013 [106]: 7bdc41fb15eea35a +Block 0013 [107]: c9c4b30e5bf50128 +Block 0013 [108]: 91699e9a73f24915 +Block 0013 [109]: 52c57d8c079bb422 +Block 0013 [110]: dab261157b8fd9d2 +Block 0013 [111]: fb51df0782c97c8c +Block 0013 [112]: ee63f89968c75234 +Block 0013 [113]: ce6aa08a457d9185 +Block 0013 [114]: 5c5b86551c42ca2e +Block 0013 [115]: 086d3b05312ef786 +Block 0013 [116]: eac057b016da257c +Block 0013 [117]: 7fae02b887d2cf96 +Block 0013 [118]: 49d9276493017238 +Block 0013 [119]: f8100fbad4b197f6 +Block 0013 [120]: d5fefd5c94672f5c +Block 0013 [121]: 57f41f71207b5bb5 +Block 0013 [122]: 3177eddf189dfefa +Block 0013 [123]: feb8bc98df27321f +Block 0013 [124]: b8aa1e5a76155617 +Block 0013 [125]: 568b228968f816d5 +Block 0013 [126]: e9d3c5ffe55a95b4 +Block 0013 [127]: 18c9f13295493060 +Block 0014 [ 0]: 751611a6dca217ef +Block 0014 [ 1]: f30d5326133f623f +Block 0014 [ 2]: 3348d361099f0d4c +Block 0014 [ 3]: 2efcfc874a138a09 +Block 0014 [ 4]: de42be1bb44d2dca +Block 0014 [ 5]: a626d8e36a9b0811 +Block 0014 [ 6]: 621d28f13cb2b6ba +Block 0014 [ 7]: 7aad6051000015fe +Block 0014 [ 8]: dd095ff42875292a +Block 0014 [ 9]: 801ee2fa2c5a64c6 +Block 0014 [ 10]: a2e0b624ee27581c +Block 0014 [ 11]: 01a1484d67c0f465 +Block 0014 [ 12]: 35bb3ad0a791c30c +Block 0014 [ 13]: 0d5eb3bd17797601 +Block 0014 [ 14]: 5bc25c1b31a89dbb +Block 0014 [ 15]: 24260bacab7442a7 +Block 0014 [ 16]: 177a9da3c6fcdea9 +Block 0014 [ 17]: d10744177252796c +Block 0014 [ 18]: 96892f2c00e816c2 +Block 0014 [ 19]: 87f1a18e861985db +Block 0014 [ 20]: 8f689942a92c0238 +Block 0014 [ 21]: dfbdc178de50e5a3 +Block 0014 [ 22]: bcd2f6bedc6cd773 +Block 0014 [ 23]: c01d8d73958f7fdf +Block 0014 [ 24]: af5e13a4d7875042 +Block 0014 [ 25]: c314e5fd4c872732 +Block 0014 [ 26]: b0efedef8a761145 +Block 0014 [ 27]: f4d46eddf74bfac0 +Block 0014 [ 28]: c85753d308fdcfb9 +Block 0014 [ 29]: 81be18ed087bc898 +Block 0014 [ 30]: b747d4c1e2d1321c +Block 0014 [ 31]: 3aebf5d50792e57f +Block 0014 [ 32]: fc1ef0d9219ec253 +Block 0014 [ 33]: e9280df09e9c11b7 +Block 0014 [ 34]: 994e37fe7614467f +Block 0014 [ 35]: 658cb28441ef2bd3 +Block 0014 [ 36]: da96518ad4a20c83 +Block 0014 [ 37]: 3b772763462c7f90 +Block 0014 [ 38]: 250390de0658fb04 +Block 0014 [ 39]: 07f7f41163308f82 +Block 0014 [ 40]: e28525fd41a4c30f +Block 0014 [ 41]: 0eabece269b5cbc6 +Block 0014 [ 42]: e14a2544deacd381 +Block 0014 [ 43]: e37ca1a406f2ee67 +Block 0014 [ 44]: 6efd3c0c1f01593a +Block 0014 [ 45]: b8bc58787428afbb +Block 0014 [ 46]: 714b0631106ebe7e +Block 0014 [ 47]: c3e96745f00db12f +Block 0014 [ 48]: ab68f71a401fbb43 +Block 0014 [ 49]: bb575726d4f2fd1a +Block 0014 [ 50]: a341648f21481b2f +Block 0014 [ 51]: bb6a9a5259ef911b +Block 0014 [ 52]: c9cea2228263bfb2 +Block 0014 [ 53]: c7f334b5bcd959de +Block 0014 [ 54]: e45a55828ebfaa40 +Block 0014 [ 55]: 6a630d357bacb358 +Block 0014 [ 56]: e36896f02c834c8d +Block 0014 [ 57]: 0aaa0006f56d9259 +Block 0014 [ 58]: 4b5c1d7ab0e03775 +Block 0014 [ 59]: 542dcdcb6922bf5e +Block 0014 [ 60]: b4cbccf8d655d557 +Block 0014 [ 61]: 22e9550073a55847 +Block 0014 [ 62]: 4d81e363a0bc3d7d +Block 0014 [ 63]: 88888fd834353993 +Block 0014 [ 64]: 3d24cdc7e52b1201 +Block 0014 [ 65]: 3d8b52965b0135a7 +Block 0014 [ 66]: cc9d378ef8def398 +Block 0014 [ 67]: bfa7c266b6442afa +Block 0014 [ 68]: 111e8c3e0da7dd1c +Block 0014 [ 69]: c5912da214c3b084 +Block 0014 [ 70]: 20e58f7585611c9a +Block 0014 [ 71]: 9f15f86d137b6a6a +Block 0014 [ 72]: 6f7a6213f30baf69 +Block 0014 [ 73]: 37fcf232b3e00ca5 +Block 0014 [ 74]: 05931457c9dac739 +Block 0014 [ 75]: 571448470ca168e9 +Block 0014 [ 76]: c27d607587d72d6c +Block 0014 [ 77]: 40d94f8aa07fd0f5 +Block 0014 [ 78]: 485dae40764e0136 +Block 0014 [ 79]: bddd055e69aa3228 +Block 0014 [ 80]: 80847e77d994fbcf +Block 0014 [ 81]: 2205602d7c7880a6 +Block 0014 [ 82]: 01b57845dc15aac7 +Block 0014 [ 83]: 0bcad09546e5910c +Block 0014 [ 84]: 822ed733aad0d4be +Block 0014 [ 85]: 36eff814bdbcce2a +Block 0014 [ 86]: d34eb84e1859a50a +Block 0014 [ 87]: 492482efab353be1 +Block 0014 [ 88]: c873ea2b88095564 +Block 0014 [ 89]: ea34805735c0e69b +Block 0014 [ 90]: 282dbc532a16f0b2 +Block 0014 [ 91]: 9d73a4d2b509f4ed +Block 0014 [ 92]: cbffe1430b613d50 +Block 0014 [ 93]: 5e76863adb84a188 +Block 0014 [ 94]: d54b2945b9d2bfd8 +Block 0014 [ 95]: eefee9aa2903e333 +Block 0014 [ 96]: 848e77aa097cad40 +Block 0014 [ 97]: fb9d26b96a14e021 +Block 0014 [ 98]: 1f2786497b51402f +Block 0014 [ 99]: 935d85b4dec778fa +Block 0014 [100]: 9f4c19a556583adc +Block 0014 [101]: 51b5266e1d568092 +Block 0014 [102]: e8857d4a180ea62c +Block 0014 [103]: 4dba7f4d5841f89c +Block 0014 [104]: 7fda01ec3ebe7925 +Block 0014 [105]: 4f81b02917212b96 +Block 0014 [106]: 0ef65535cb286212 +Block 0014 [107]: b2f2b7d55afd99cd +Block 0014 [108]: 0925aedc2dbed1e9 +Block 0014 [109]: 5e1427758f2d88d6 +Block 0014 [110]: 0a6dd2a5c2cd029f +Block 0014 [111]: 7de7196e1f00f1db +Block 0014 [112]: fa98e1bbc7c10663 +Block 0014 [113]: f289964e052b1262 +Block 0014 [114]: 1e283e3fd3c0d4fa +Block 0014 [115]: 7c9aa9705eb22b96 +Block 0014 [116]: f3bb07922a5d2279 +Block 0014 [117]: 34a8fcefce841ade +Block 0014 [118]: 0709034e1c06baa2 +Block 0014 [119]: 598a4c2c1c07c589 +Block 0014 [120]: 26d5573b1775fb83 +Block 0014 [121]: 9cc4fd42c8865d4f +Block 0014 [122]: cfcbe0a59328c84a +Block 0014 [123]: 6bb349e66195498b +Block 0014 [124]: 4be2f84e7f1a4bb7 +Block 0014 [125]: 625a08a3e55cc7ba +Block 0014 [126]: 703ca94204f1eb2e +Block 0014 [127]: ba100657462ad47b +Block 0015 [ 0]: 90f9cf97fdfb1212 +Block 0015 [ 1]: 4ebfd0eb7bde74fe +Block 0015 [ 2]: 5d4892b667d8fb9a +Block 0015 [ 3]: eee897de87730152 +Block 0015 [ 4]: bd8707434bfeaa0a +Block 0015 [ 5]: fd8aee451c60cd9d +Block 0015 [ 6]: c58c0e0ffcaaea7b +Block 0015 [ 7]: 03e0436c90051504 +Block 0015 [ 8]: 7ed836946cee6ad8 +Block 0015 [ 9]: 8b156f73ee007bdf +Block 0015 [ 10]: d541428ece1acb9e +Block 0015 [ 11]: c7a395429389dc5a +Block 0015 [ 12]: 010f3d509e0d6821 +Block 0015 [ 13]: 5fb4c498d4416f4c +Block 0015 [ 14]: 319941fd256f4759 +Block 0015 [ 15]: de2ecefec27cbf7a +Block 0015 [ 16]: ab5295b324401b40 +Block 0015 [ 17]: a41144e0c61bb357 +Block 0015 [ 18]: bf8edc2253a1dda5 +Block 0015 [ 19]: b6b3236c2bf5e09c +Block 0015 [ 20]: a41a3ebdf0eb9f03 +Block 0015 [ 21]: f037384bd85667d9 +Block 0015 [ 22]: cd3b6163484a9319 +Block 0015 [ 23]: de534447766d1f29 +Block 0015 [ 24]: 8c8cdb1d34d34914 +Block 0015 [ 25]: 11541705e8bcb3b2 +Block 0015 [ 26]: 801b40db1cd0a376 +Block 0015 [ 27]: 15ce882abff4aeb6 +Block 0015 [ 28]: 0b4eccb36e5447ce +Block 0015 [ 29]: 9305728451875b90 +Block 0015 [ 30]: d2640809e3215ee4 +Block 0015 [ 31]: cbd0dfb61bc5f357 +Block 0015 [ 32]: 1423c16dd0dec029 +Block 0015 [ 33]: d6dbef65de65761e +Block 0015 [ 34]: eb9546f8f440b03d +Block 0015 [ 35]: 25626b0b8c94132f +Block 0015 [ 36]: b6399c16cfbebc22 +Block 0015 [ 37]: c41694770a8a9b9f +Block 0015 [ 38]: 15ac9e81f8349080 +Block 0015 [ 39]: 52825e57cba50916 +Block 0015 [ 40]: 51d2c9935e17d98c +Block 0015 [ 41]: 5607b931b9cbc2f6 +Block 0015 [ 42]: c15e398a71664716 +Block 0015 [ 43]: 6196cb09666b8aa6 +Block 0015 [ 44]: d1f004bf865d712f +Block 0015 [ 45]: 71c4ab4eb1a8c76c +Block 0015 [ 46]: a6de3842bbbd1029 +Block 0015 [ 47]: b9ec26bd0cdfafac +Block 0015 [ 48]: 9b830f151684793e +Block 0015 [ 49]: a89763e63465931b +Block 0015 [ 50]: 9a85d13f5e810f61 +Block 0015 [ 51]: d310f5b7712d28da +Block 0015 [ 52]: 5b28e526e9fa2a09 +Block 0015 [ 53]: 966f7b02ae839c94 +Block 0015 [ 54]: 86a2d4c5e71e7ac8 +Block 0015 [ 55]: e96910b6d32b0b84 +Block 0015 [ 56]: 241237960baaadb8 +Block 0015 [ 57]: 93ee135d761f7ef1 +Block 0015 [ 58]: 458563f18c30d6ca +Block 0015 [ 59]: 20339a86a422f5dc +Block 0015 [ 60]: 8be24a5a13609cd0 +Block 0015 [ 61]: f2341abd8d040b8f +Block 0015 [ 62]: 9944dd3970485508 +Block 0015 [ 63]: b73d28e85eecf928 +Block 0015 [ 64]: b7bd00ecf6510e61 +Block 0015 [ 65]: e6eaaa07d887015b +Block 0015 [ 66]: e2201e7b73b2b762 +Block 0015 [ 67]: d22248c2d87a1e38 +Block 0015 [ 68]: c8e6b242348e7e4d +Block 0015 [ 69]: df21a46b6b9178b5 +Block 0015 [ 70]: f449e89387dd2d54 +Block 0015 [ 71]: f9588b623b526b80 +Block 0015 [ 72]: 70e38fa377d75afe +Block 0015 [ 73]: cbf379cb401301bd +Block 0015 [ 74]: 34a2ba0457b360b5 +Block 0015 [ 75]: 3fcd0772e15aa753 +Block 0015 [ 76]: e6a1ee7587f2b0cf +Block 0015 [ 77]: b2a399f2bb958f0c +Block 0015 [ 78]: cd702bc394a274d9 +Block 0015 [ 79]: 2cf2c4f609352e79 +Block 0015 [ 80]: 6f8742ba962af80a +Block 0015 [ 81]: 187d7781f5b58bcb +Block 0015 [ 82]: ea995eaf547b26f1 +Block 0015 [ 83]: 70ff6a3ec66b4560 +Block 0015 [ 84]: 335412fe69fff286 +Block 0015 [ 85]: d7d982d6bdc0eaf9 +Block 0015 [ 86]: 6a91a369ebe4c227 +Block 0015 [ 87]: bd7d3af9c4695372 +Block 0015 [ 88]: 517d76991499e3dd +Block 0015 [ 89]: 1b5a124e4c09386e +Block 0015 [ 90]: 9dc15484e994c472 +Block 0015 [ 91]: c30a4bf622feae78 +Block 0015 [ 92]: c15f1cf31d1d2e79 +Block 0015 [ 93]: fd4afd7d9800e3ca +Block 0015 [ 94]: 9abdcbeea24b166a +Block 0015 [ 95]: fad22e44fd945a51 +Block 0015 [ 96]: 187dbda78f640e08 +Block 0015 [ 97]: 6f2ad2ff1fddc51b +Block 0015 [ 98]: 5c9e3d2a789d01f4 +Block 0015 [ 99]: e17643ada188ca5d +Block 0015 [100]: daf7d892618a7687 +Block 0015 [101]: ac5aa9b82e8d53d9 +Block 0015 [102]: ae8c60a4c1bc63bb +Block 0015 [103]: b35f4d4e3ced26a2 +Block 0015 [104]: 55abe3d57678671a +Block 0015 [105]: eb15e0d818d1fd62 +Block 0015 [106]: b23a0d03863ed118 +Block 0015 [107]: cbc0e428e6d752fb +Block 0015 [108]: f1931d6c45be4320 +Block 0015 [109]: 2c8bd9097f39e50d +Block 0015 [110]: cc33e6016cc08ee6 +Block 0015 [111]: 2280ad7ea4fe9832 +Block 0015 [112]: 2a922a76400a5cbe +Block 0015 [113]: 2d1a097b36b2a380 +Block 0015 [114]: 25a31a1a2b373c9b +Block 0015 [115]: 77a19abf854f116a +Block 0015 [116]: fe66884f193b74d7 +Block 0015 [117]: 9dab1bf53a7a50b9 +Block 0015 [118]: fdd36d0f46d6abd6 +Block 0015 [119]: c32638540d68fb28 +Block 0015 [120]: 32788f09d80f0f11 +Block 0015 [121]: baf18788397a3a20 +Block 0015 [122]: 4729a150debebe00 +Block 0015 [123]: 98db2abeca755d0c +Block 0015 [124]: 9fa7f4acdbfc2075 +Block 0015 [125]: c79cc37a40fed18f +Block 0015 [126]: 0b1374123d496b56 +Block 0015 [127]: 723bd40bcc338eb9 +Block 0016 [ 0]: dba1631496e37081 +Block 0016 [ 1]: 7bcab81931f7fb3a +Block 0016 [ 2]: ec1b708517efc104 +Block 0016 [ 3]: 1d9620eab17a8af2 +Block 0016 [ 4]: 348e88a95a5b4836 +Block 0016 [ 5]: 08fd70a3903354b2 +Block 0016 [ 6]: 78878a368235854d +Block 0016 [ 7]: 94015822062f61f3 +Block 0016 [ 8]: e6261162790fc67a +Block 0016 [ 9]: d1bd71216db48ea3 +Block 0016 [ 10]: fa0163a85027dfef +Block 0016 [ 11]: 70d35155d8c744db +Block 0016 [ 12]: de5713bffb82c049 +Block 0016 [ 13]: 6a2f55255edc50b2 +Block 0016 [ 14]: 2de24cdba809978f +Block 0016 [ 15]: a9037f5f21ffcb62 +Block 0016 [ 16]: 61a14e0e21dfbbb3 +Block 0016 [ 17]: ff04c2acd3c56a2a +Block 0016 [ 18]: 0c34a70f918e0b8d +Block 0016 [ 19]: b41db4fe7e90d0c4 +Block 0016 [ 20]: 50fd52d4ac3dcef1 +Block 0016 [ 21]: 49f6930c4f261bbd +Block 0016 [ 22]: cebb8fc10d6916bd +Block 0016 [ 23]: d2a870eb3a73d5e8 +Block 0016 [ 24]: 026b068c396ee281 +Block 0016 [ 25]: 37e31bcb07d3d06d +Block 0016 [ 26]: 51e18129c808df2c +Block 0016 [ 27]: e38bd894c7346a95 +Block 0016 [ 28]: 4666a2e0a015d89b +Block 0016 [ 29]: 53080e6a73bd7b2b +Block 0016 [ 30]: ab69db3d9699ea9c +Block 0016 [ 31]: 0a5fff8051cd1caf +Block 0016 [ 32]: c16f87f1ff14ee00 +Block 0016 [ 33]: 4f8261979edac3f2 +Block 0016 [ 34]: 1a015a10b756c6ec +Block 0016 [ 35]: 66cdc7820398cc5c +Block 0016 [ 36]: 45706053e2b18e31 +Block 0016 [ 37]: 500d1855f2009c73 +Block 0016 [ 38]: eaab57647a45b537 +Block 0016 [ 39]: 92b7eedc890cec89 +Block 0016 [ 40]: 04f79aefec3bc0e9 +Block 0016 [ 41]: 144ac54f82047d86 +Block 0016 [ 42]: 2ae5c5f9e60f6674 +Block 0016 [ 43]: 29fb00da354c45ba +Block 0016 [ 44]: 6b9e88cc40d8650b +Block 0016 [ 45]: 843b907fe783927f +Block 0016 [ 46]: 09640d95f0038a53 +Block 0016 [ 47]: 556f347c654c5ab3 +Block 0016 [ 48]: 60531233a823cde3 +Block 0016 [ 49]: 97c638e1c4927b03 +Block 0016 [ 50]: 29d80aa6e06b0456 +Block 0016 [ 51]: 5d00fd9a7ca97121 +Block 0016 [ 52]: 765ffe668dfdc2c1 +Block 0016 [ 53]: 5a2331032829fd09 +Block 0016 [ 54]: 4373276735c93c1b +Block 0016 [ 55]: 23410a050fe40fc7 +Block 0016 [ 56]: c0396855da2eee42 +Block 0016 [ 57]: b69958feeb38026e +Block 0016 [ 58]: 02c4f30af9932784 +Block 0016 [ 59]: 89d2d63d9ff65483 +Block 0016 [ 60]: 69583bd38d980b3e +Block 0016 [ 61]: 1036e040b045969e +Block 0016 [ 62]: a87365c2d51d93b8 +Block 0016 [ 63]: 8047300e3464fbea +Block 0016 [ 64]: 7ba7e44ac1b4e18e +Block 0016 [ 65]: c9a5f9247ffa1caa +Block 0016 [ 66]: 2672f42a31dd76c9 +Block 0016 [ 67]: 600c1ca9792f48de +Block 0016 [ 68]: edc0454eb60f5efb +Block 0016 [ 69]: 24ca25768dac07e2 +Block 0016 [ 70]: 5a897a1a626401d2 +Block 0016 [ 71]: b873371b5c32a10d +Block 0016 [ 72]: a79f82e2fe9a33a9 +Block 0016 [ 73]: e17fbb6e884277b9 +Block 0016 [ 74]: 705da8d6af3afd19 +Block 0016 [ 75]: 351cc4f25d20e442 +Block 0016 [ 76]: efdc3cef63ed0468 +Block 0016 [ 77]: 109e45a160396cc3 +Block 0016 [ 78]: f61273c4f78110cb +Block 0016 [ 79]: a149ae2114ef95c9 +Block 0016 [ 80]: 9686ae2ab6e96c4b +Block 0016 [ 81]: 82e34d717130811f +Block 0016 [ 82]: 96b6238ab9e97331 +Block 0016 [ 83]: 10af26c305b949af +Block 0016 [ 84]: 73bc99c3c9614621 +Block 0016 [ 85]: 5c4c3ee6f3a0eda2 +Block 0016 [ 86]: 9b78611d8965dcc9 +Block 0016 [ 87]: 5704f8fa7d51b4ef +Block 0016 [ 88]: e1038992b0be6efd +Block 0016 [ 89]: 45d148b6187fe37f +Block 0016 [ 90]: 55bcd22852ed2762 +Block 0016 [ 91]: 0f64f49ccfa80f38 +Block 0016 [ 92]: b5fad479b4ff5934 +Block 0016 [ 93]: d7997477fbb706e0 +Block 0016 [ 94]: 8a959e6e9a047bfb +Block 0016 [ 95]: 34071c4c6c491070 +Block 0016 [ 96]: 287346060fa77813 +Block 0016 [ 97]: f1b6634dccf64cb8 +Block 0016 [ 98]: 790b18cf5d8f57b2 +Block 0016 [ 99]: 9d83ef55adbb4729 +Block 0016 [100]: d35f419bf33dc17e +Block 0016 [101]: 1e38549f1fd07181 +Block 0016 [102]: 5ab80e4b365c6a77 +Block 0016 [103]: 261245bb1406f154 +Block 0016 [104]: 8ebd555d5865a16a +Block 0016 [105]: fd4a78d20da3993b +Block 0016 [106]: 6cb78c2f1ca8d5cf +Block 0016 [107]: 49ce107e280365c8 +Block 0016 [108]: 55d5f2fabbdc5d25 +Block 0016 [109]: 5521ebac47859c8a +Block 0016 [110]: 042dd30ace63fef2 +Block 0016 [111]: e1ea2fea6c4e51e7 +Block 0016 [112]: c75573901eac10df +Block 0016 [113]: 3d3dcba0172f75b2 +Block 0016 [114]: 4869c7007eee34ce +Block 0016 [115]: 0597dfbf53b667bf +Block 0016 [116]: f9d4c4ef00f016cd +Block 0016 [117]: aabebc3cb036df01 +Block 0016 [118]: 27cbced80caa86fc +Block 0016 [119]: 7de1ba464cfdb5d4 +Block 0016 [120]: 14319a2c4420864d +Block 0016 [121]: 1fccc5e717075731 +Block 0016 [122]: af0125d5e39888e3 +Block 0016 [123]: ad39af88f22b67e3 +Block 0016 [124]: af50dd714b281182 +Block 0016 [125]: 718dd9ffe15c66a1 +Block 0016 [126]: 0acc2655ba4339a7 +Block 0016 [127]: be96794bc4a79dd0 +Block 0017 [ 0]: 7b5ba70f2c9ad40f +Block 0017 [ 1]: 36f0a9a53c4b55e5 +Block 0017 [ 2]: 5425515f3660e150 +Block 0017 [ 3]: fc8697830553a6b6 +Block 0017 [ 4]: 1edbcbccfc4e85a7 +Block 0017 [ 5]: fa7c7ec35e1768ec +Block 0017 [ 6]: ceff78f0f46f476a +Block 0017 [ 7]: f1e93938c38dd1e2 +Block 0017 [ 8]: 6047d8bd58ba9bca +Block 0017 [ 9]: 38cd284c1a5f1b37 +Block 0017 [ 10]: b8c0090901487ce8 +Block 0017 [ 11]: 9fa9f59f78f8ba47 +Block 0017 [ 12]: d76da75fc59dcac1 +Block 0017 [ 13]: 909bf97bdb3c3695 +Block 0017 [ 14]: fa5d1ebdfd13ec94 +Block 0017 [ 15]: 30d28c34a972f817 +Block 0017 [ 16]: 030bb56aea8cd4cb +Block 0017 [ 17]: ed751bf31759ec31 +Block 0017 [ 18]: c2bd766b1bc8addd +Block 0017 [ 19]: 4208e42284623d16 +Block 0017 [ 20]: 065b57cd2ddd5c5b +Block 0017 [ 21]: c61d4d148a518c1f +Block 0017 [ 22]: 192d41daeddc3371 +Block 0017 [ 23]: d107ec22d1460874 +Block 0017 [ 24]: 2325ca6bf51b9ec2 +Block 0017 [ 25]: bd758560a6ca5726 +Block 0017 [ 26]: 96d3f1c698632e5f +Block 0017 [ 27]: 1c97ae8f8065d4a1 +Block 0017 [ 28]: 78640186f05f5d2c +Block 0017 [ 29]: cf6d82819e18ed27 +Block 0017 [ 30]: 4d6ebb2f1b700728 +Block 0017 [ 31]: 97d8ddd7084eb125 +Block 0017 [ 32]: 09558992c97b4c0f +Block 0017 [ 33]: c0a6ad16e3c9be87 +Block 0017 [ 34]: 9b6a4e984e24c9fd +Block 0017 [ 35]: 5958f55b2a13037a +Block 0017 [ 36]: 2e147024c0cd4121 +Block 0017 [ 37]: ea367dabd7ab4246 +Block 0017 [ 38]: ea8ba7cbf2389d9d +Block 0017 [ 39]: 8738b7e8961c9462 +Block 0017 [ 40]: 37bc3c32461a8ba3 +Block 0017 [ 41]: 1a988f291046040f +Block 0017 [ 42]: ef0f85ad9a8b1836 +Block 0017 [ 43]: c78659d686fe952c +Block 0017 [ 44]: 6ee163f93d3b653a +Block 0017 [ 45]: 26152cf977f49a65 +Block 0017 [ 46]: d301680c980a2c51 +Block 0017 [ 47]: 70df093ef8894d17 +Block 0017 [ 48]: c96e160883c1827e +Block 0017 [ 49]: 989f8143b240ad5c +Block 0017 [ 50]: e16c1e6c01410167 +Block 0017 [ 51]: ee2f28e8df14830c +Block 0017 [ 52]: 7bacbee1e27659ad +Block 0017 [ 53]: fdeccb4e07c45761 +Block 0017 [ 54]: db3d31660a842a47 +Block 0017 [ 55]: 3ff4286194042d07 +Block 0017 [ 56]: 2a98eb4b903d0cc1 +Block 0017 [ 57]: e646d6112546a058 +Block 0017 [ 58]: 27f241d5db630dff +Block 0017 [ 59]: 5628d1ebd53f023a +Block 0017 [ 60]: ba56ca849da491cb +Block 0017 [ 61]: 9ecda254008b4e50 +Block 0017 [ 62]: f05f1f3722817ed2 +Block 0017 [ 63]: c3fa24f242c29b90 +Block 0017 [ 64]: 1eab33b1d0e2465b +Block 0017 [ 65]: b869cfee39139c0a +Block 0017 [ 66]: b2fd4681352495b5 +Block 0017 [ 67]: b4fa867b48fbccf1 +Block 0017 [ 68]: d1ff00418d9e5d6f +Block 0017 [ 69]: 98fb0e309c62edff +Block 0017 [ 70]: 9e5c8611322c3e74 +Block 0017 [ 71]: 5182de709dc58259 +Block 0017 [ 72]: 20931b51dcc31663 +Block 0017 [ 73]: bc90b255d0624f0b +Block 0017 [ 74]: 85322ecab55c9fb0 +Block 0017 [ 75]: 61d5ad563831d979 +Block 0017 [ 76]: b8d8aa275bbe6b4a +Block 0017 [ 77]: 4482a96f016b95ba +Block 0017 [ 78]: a5bfe0adace1726f +Block 0017 [ 79]: 3adab49f26f7bee9 +Block 0017 [ 80]: 140f7a360bfab47e +Block 0017 [ 81]: 5f31d06e631f52ac +Block 0017 [ 82]: 5915cbba03a5a890 +Block 0017 [ 83]: 04da8af5b2a4f869 +Block 0017 [ 84]: dc57e07f79a3c990 +Block 0017 [ 85]: 7a0497ae45c6982d +Block 0017 [ 86]: d14d30fea11a17e9 +Block 0017 [ 87]: 9de84c6eff9fa195 +Block 0017 [ 88]: 6b429b095cc24ef9 +Block 0017 [ 89]: a7c7f6ff316e378f +Block 0017 [ 90]: 2a3b2ac5d7607632 +Block 0017 [ 91]: ec137e7f80dd20fb +Block 0017 [ 92]: 22a8bd325c264ae2 +Block 0017 [ 93]: 7007457346e49179 +Block 0017 [ 94]: 2f217594c468138d +Block 0017 [ 95]: 578c7d6bb4817011 +Block 0017 [ 96]: 3a5d32b954ff5f25 +Block 0017 [ 97]: b5791614aa7bb694 +Block 0017 [ 98]: c827579c0a97168b +Block 0017 [ 99]: 5ca0639fd40b32d3 +Block 0017 [100]: 60d021d8b6af09de +Block 0017 [101]: 1a400c7e0c9c38c1 +Block 0017 [102]: 7baf9e6d7c46bcda +Block 0017 [103]: 2c55bc07321f9a05 +Block 0017 [104]: b89e768d47a785c1 +Block 0017 [105]: 39534ecb8b83e175 +Block 0017 [106]: 64ee6ce08a1052fc +Block 0017 [107]: bd3d62e2c912f0b5 +Block 0017 [108]: 59b4cf828ea54ee4 +Block 0017 [109]: a3b111d1605c01be +Block 0017 [110]: da7d23de96a490de +Block 0017 [111]: 7c75d813c58cb4f7 +Block 0017 [112]: 008950719cd0b4e5 +Block 0017 [113]: 179d3d56a1051f16 +Block 0017 [114]: 442b82c14e3edb7b +Block 0017 [115]: f6edb20604028f65 +Block 0017 [116]: ebe72e71d4c15cef +Block 0017 [117]: 550bfb8d9f4aae3c +Block 0017 [118]: 3f005851e118c76e +Block 0017 [119]: b778f46af664d0d0 +Block 0017 [120]: 314df035073b5033 +Block 0017 [121]: efc6f26a182fcb60 +Block 0017 [122]: ecbd01d4a2aad969 +Block 0017 [123]: 82d5571cce229a3f +Block 0017 [124]: d9045c594f34c332 +Block 0017 [125]: 6edb8400b36a321c +Block 0017 [126]: e603318505c4b41e +Block 0017 [127]: 53080a8ac05f8ee6 +Block 0018 [ 0]: 1c6575f9a10acd80 +Block 0018 [ 1]: 2a9e757fc1985b42 +Block 0018 [ 2]: 2a070582f4d7fd52 +Block 0018 [ 3]: ea86a49f36d096d4 +Block 0018 [ 4]: 9d8c34c6e3d60f08 +Block 0018 [ 5]: 1622e0f45989720a +Block 0018 [ 6]: f5a13aa7c469240c +Block 0018 [ 7]: dd068ad7fa4ddd64 +Block 0018 [ 8]: ce149b2e7c66a869 +Block 0018 [ 9]: e6856096802179be +Block 0018 [ 10]: 78ada9ed8703ae27 +Block 0018 [ 11]: 72020afe3448bfec +Block 0018 [ 12]: 3fddc3d8928c3b97 +Block 0018 [ 13]: a21b1a8a520e04d9 +Block 0018 [ 14]: 06690fadc6cd9f06 +Block 0018 [ 15]: cafb12d4baea0b81 +Block 0018 [ 16]: 86bbed9914ae8cf2 +Block 0018 [ 17]: bedc4febe4696bf8 +Block 0018 [ 18]: 9cf81017baec53a7 +Block 0018 [ 19]: 2d9dfeb07cb61303 +Block 0018 [ 20]: 8437a139617fd876 +Block 0018 [ 21]: 343fd4208419d50c +Block 0018 [ 22]: 0996be65d9fbcd0a +Block 0018 [ 23]: 3d0f66e79c7e8344 +Block 0018 [ 24]: f03c3694659bcf13 +Block 0018 [ 25]: 546982fe89617636 +Block 0018 [ 26]: c7dfd03bd4a2ac6a +Block 0018 [ 27]: 388400aeea1a4bdb +Block 0018 [ 28]: 41645c6cf37246b2 +Block 0018 [ 29]: 6c110f7bc4ac7599 +Block 0018 [ 30]: 159bf2f2d0528b8d +Block 0018 [ 31]: 7c0f6070254b07ec +Block 0018 [ 32]: 27b8114d303790c7 +Block 0018 [ 33]: 6e2eda0717b86cf0 +Block 0018 [ 34]: 59ded021767f3c97 +Block 0018 [ 35]: afc68e65f85bd36b +Block 0018 [ 36]: b86592e214789675 +Block 0018 [ 37]: 34e2c8570370feea +Block 0018 [ 38]: 58e92d613717584e +Block 0018 [ 39]: a37a32a2270a702c +Block 0018 [ 40]: ea60b7b999c47428 +Block 0018 [ 41]: 5ef5855061b18b9f +Block 0018 [ 42]: 3fa31397437f9ba5 +Block 0018 [ 43]: b6689ef5bf20ab34 +Block 0018 [ 44]: 132c885cc262e48f +Block 0018 [ 45]: ce57e7ce64ca9bb3 +Block 0018 [ 46]: 36b2e6285f8c6965 +Block 0018 [ 47]: bf007ccb66d99b55 +Block 0018 [ 48]: 3e28b50440f345d5 +Block 0018 [ 49]: e994a6e41a10f083 +Block 0018 [ 50]: b54b5d9057a568e5 +Block 0018 [ 51]: fb3d507834f0abeb +Block 0018 [ 52]: 72dbb34a878af028 +Block 0018 [ 53]: 1aee63ddfe080bfb +Block 0018 [ 54]: 0025dee0fed4e37e +Block 0018 [ 55]: 56292c8afd174199 +Block 0018 [ 56]: f0aa15dc972c2853 +Block 0018 [ 57]: 9024522f6bef47a1 +Block 0018 [ 58]: ee29d18b8eab9af9 +Block 0018 [ 59]: 23d3accf2bda84db +Block 0018 [ 60]: 074b4b5728ebb32d +Block 0018 [ 61]: aceacbf4a6a899cd +Block 0018 [ 62]: 6f354c27f02bf5d6 +Block 0018 [ 63]: 7ec9c7d50f228293 +Block 0018 [ 64]: 0d0a219e06a20d6c +Block 0018 [ 65]: 33ab995959bae7f0 +Block 0018 [ 66]: f59c2eb8d2386105 +Block 0018 [ 67]: df2f3cf73585bfc4 +Block 0018 [ 68]: a9fac0135ad5aed0 +Block 0018 [ 69]: 49556d419f8433b9 +Block 0018 [ 70]: dd3afeed8d935892 +Block 0018 [ 71]: b24e7e4f9fdeb0d7 +Block 0018 [ 72]: 0e8ddb6b5c6c053e +Block 0018 [ 73]: 9fb0b4b7040dff6f +Block 0018 [ 74]: 335c0af90c7326b1 +Block 0018 [ 75]: 2b3a8b28e360a720 +Block 0018 [ 76]: a38f7a1fcd4c6f18 +Block 0018 [ 77]: 2fc14a2922ba9086 +Block 0018 [ 78]: 06d2331d98825423 +Block 0018 [ 79]: 421f972c3f7780b0 +Block 0018 [ 80]: 202301ef938e0bad +Block 0018 [ 81]: 7a8c48b25afe353c +Block 0018 [ 82]: e791bbead44e88c3 +Block 0018 [ 83]: d3867de18af9ac71 +Block 0018 [ 84]: 52482b3fc98d7974 +Block 0018 [ 85]: fae31ef53fab928d +Block 0018 [ 86]: 4484e8d59a1d41e8 +Block 0018 [ 87]: 1a5864cb33974ce1 +Block 0018 [ 88]: 62ac9ca77f59a539 +Block 0018 [ 89]: 4d440ce8e80b0a44 +Block 0018 [ 90]: 3dd25a1e99e082f0 +Block 0018 [ 91]: 45b5b3fccd11c949 +Block 0018 [ 92]: 1b3a66418cd781e2 +Block 0018 [ 93]: 48a8ce412844a394 +Block 0018 [ 94]: de71390ba827ddbd +Block 0018 [ 95]: 85976922171b9790 +Block 0018 [ 96]: d8423a1ec6d5bab1 +Block 0018 [ 97]: 592b5d193a3b3609 +Block 0018 [ 98]: 7bd2b8149cb2495b +Block 0018 [ 99]: 02cbe78ebbd8270b +Block 0018 [100]: 1f626cc675e0140d +Block 0018 [101]: 423dac87eb9493d4 +Block 0018 [102]: eee2243fe0d74697 +Block 0018 [103]: 5a7074a3bdd5cfe4 +Block 0018 [104]: 957f4b71a6c0cd03 +Block 0018 [105]: ecbd98ef8d09798e +Block 0018 [106]: 8c46a8ed1afb3ed2 +Block 0018 [107]: 1cbf535b8e9a90cb +Block 0018 [108]: 52081ad1254109e7 +Block 0018 [109]: a7be109d2e24fc45 +Block 0018 [110]: 43c3d4693421c9c9 +Block 0018 [111]: 320187d82c7622aa +Block 0018 [112]: 3005f4a02db5cd47 +Block 0018 [113]: c9b593e108491b8d +Block 0018 [114]: 07b285d679681f35 +Block 0018 [115]: ff6ad0d67969793a +Block 0018 [116]: 371a921169811926 +Block 0018 [117]: 09f67f449b49116e +Block 0018 [118]: ec51b4a5f1646649 +Block 0018 [119]: f67366ba7a177373 +Block 0018 [120]: 74c538aa4fb2f123 +Block 0018 [121]: 8e454baf2b483190 +Block 0018 [122]: 68944332288eeeb7 +Block 0018 [123]: c1f577313d81ab15 +Block 0018 [124]: 6fdfb2cd1475387d +Block 0018 [125]: 2f5f80b2fe940caa +Block 0018 [126]: 6ff1d7b0f222212c +Block 0018 [127]: 92d7874653b70612 +Block 0019 [ 0]: 93acbaeacded228f +Block 0019 [ 1]: 04ffad08d7cf945e +Block 0019 [ 2]: 7da44d978886ff7e +Block 0019 [ 3]: ee06010d47c0e8a2 +Block 0019 [ 4]: 94286d1d3fabcd7f +Block 0019 [ 5]: ae490c824c9c668f +Block 0019 [ 6]: 5ae115d1ec752d80 +Block 0019 [ 7]: d2c876dd1b3610de +Block 0019 [ 8]: 88f2df0f35c1e7ee +Block 0019 [ 9]: b74d0ca61e7db938 +Block 0019 [ 10]: b1732a6f4fb48910 +Block 0019 [ 11]: d40c0f502021679f +Block 0019 [ 12]: ea19fc7983c1da39 +Block 0019 [ 13]: d2ee700063bbdc38 +Block 0019 [ 14]: f3df222db778b740 +Block 0019 [ 15]: 73f659a6f658f7cf +Block 0019 [ 16]: 325d3be05f9277c0 +Block 0019 [ 17]: 401dc2508f41181e +Block 0019 [ 18]: c4777c5dcfec3e9a +Block 0019 [ 19]: 850819df3005f9df +Block 0019 [ 20]: 98887f8b695a363d +Block 0019 [ 21]: 340a02bc90f72b07 +Block 0019 [ 22]: 8ee3a0a9f0109fa9 +Block 0019 [ 23]: 8627997126ab3ef9 +Block 0019 [ 24]: 42c3cb91c821ae6c +Block 0019 [ 25]: 52a80de8fe0d7818 +Block 0019 [ 26]: bf67209e92990da1 +Block 0019 [ 27]: 583f282cfa720749 +Block 0019 [ 28]: 803a59ff851a9629 +Block 0019 [ 29]: 19b5137c3e2855c1 +Block 0019 [ 30]: 7b3ee14ce1847f65 +Block 0019 [ 31]: f39c3c8919a04b8e +Block 0019 [ 32]: df6e94c2319f2fac +Block 0019 [ 33]: be81ad71d3da8b6e +Block 0019 [ 34]: 96b5d3134e72bbd7 +Block 0019 [ 35]: 01be7314fbab115b +Block 0019 [ 36]: 9b6573be1f901eaf +Block 0019 [ 37]: 0af9f25fc41f65f1 +Block 0019 [ 38]: ecf061cbec0301da +Block 0019 [ 39]: e1f6de6ecc2c51d9 +Block 0019 [ 40]: a21201bed7bc2ece +Block 0019 [ 41]: c1de087e0461f89b +Block 0019 [ 42]: 640531594f92810a +Block 0019 [ 43]: 2f7c47537c46dd26 +Block 0019 [ 44]: b9e806297c8e285d +Block 0019 [ 45]: 23fc05e71c7ca87f +Block 0019 [ 46]: 6947a7418de6e5d4 +Block 0019 [ 47]: 11006b4b6595fc58 +Block 0019 [ 48]: 41b286b38a4b607d +Block 0019 [ 49]: eba60946c062f7e9 +Block 0019 [ 50]: f38aae3089bff1e8 +Block 0019 [ 51]: e1d219dacc19a0aa +Block 0019 [ 52]: bbd69ed673b586b2 +Block 0019 [ 53]: f3604701136a8539 +Block 0019 [ 54]: ee988f9217ca7216 +Block 0019 [ 55]: 3ec40766c32f9872 +Block 0019 [ 56]: aa8e6f55082b9b3a +Block 0019 [ 57]: eaee4cbf152450a2 +Block 0019 [ 58]: 2d6d634a578c3768 +Block 0019 [ 59]: cd1b30693fc22fd3 +Block 0019 [ 60]: 9134ae73ba6a6338 +Block 0019 [ 61]: 55b9202e263576e2 +Block 0019 [ 62]: 5990cb5a6abdf6d4 +Block 0019 [ 63]: 90e9bf1096d341c3 +Block 0019 [ 64]: f1184eee8bf92bad +Block 0019 [ 65]: 11557621833c2667 +Block 0019 [ 66]: 7f4fe41022bbbe8f +Block 0019 [ 67]: 1ce4d6a3f00a45e2 +Block 0019 [ 68]: 4d1176a9d73fbd04 +Block 0019 [ 69]: 348095dd5ec67914 +Block 0019 [ 70]: f68943632a9b36f8 +Block 0019 [ 71]: 39cbd678a2013855 +Block 0019 [ 72]: d480608f385da36a +Block 0019 [ 73]: 543abadc4389aec2 +Block 0019 [ 74]: 4c0781a69dd4e5f0 +Block 0019 [ 75]: d70d0b4684ca6fdb +Block 0019 [ 76]: 9f69a1c7beebf974 +Block 0019 [ 77]: 3cc130fef00c1f6b +Block 0019 [ 78]: be0fcd7716b57997 +Block 0019 [ 79]: 91c8cce70af1d23c +Block 0019 [ 80]: f1780fc4eae113de +Block 0019 [ 81]: 9a650c9f13e21cfa +Block 0019 [ 82]: e2a32a8550f79448 +Block 0019 [ 83]: 45cdb0e228907359 +Block 0019 [ 84]: b12202933f6e041e +Block 0019 [ 85]: 1eb6ce2a66e64ad0 +Block 0019 [ 86]: 0fd90d326844b151 +Block 0019 [ 87]: bc9396831333f0ab +Block 0019 [ 88]: a046b58b763c42e1 +Block 0019 [ 89]: 9794be294b3c7fa1 +Block 0019 [ 90]: 8fe6176456bab7bf +Block 0019 [ 91]: aaa0183d2b59afec +Block 0019 [ 92]: 5fa1d31dacccd5a5 +Block 0019 [ 93]: 7f693802526c4520 +Block 0019 [ 94]: 19d1bb4a4461ea59 +Block 0019 [ 95]: e44b42735431ff9a +Block 0019 [ 96]: f346ac2045974039 +Block 0019 [ 97]: cf1da77245b6a0ad +Block 0019 [ 98]: 5936a6f1553ef342 +Block 0019 [ 99]: 812ddc076e3cb742 +Block 0019 [100]: bfaf4ac38c3e6141 +Block 0019 [101]: 14bb89ac7a67a8dd +Block 0019 [102]: b4f278d441a2b70d +Block 0019 [103]: 81abe3584ea009fa +Block 0019 [104]: 467ccf31d2d0db6f +Block 0019 [105]: 9ad73b369b947213 +Block 0019 [106]: 711dd4a31a270b27 +Block 0019 [107]: be20d05f48a4486a +Block 0019 [108]: 5b9bd8d50bbf51d9 +Block 0019 [109]: 6c761a9911cfe27b +Block 0019 [110]: de7b5c685a3a34d9 +Block 0019 [111]: c16444edde5c6871 +Block 0019 [112]: aee99d1b74c68d6d +Block 0019 [113]: 63cfa31ef288b980 +Block 0019 [114]: acc6f55eefa30a69 +Block 0019 [115]: be177ae1dcf072fc +Block 0019 [116]: e7f163e4b7836001 +Block 0019 [117]: 88a2d20a0a31b8e5 +Block 0019 [118]: ded1724eb03f5ff0 +Block 0019 [119]: c79e0c464b5894d2 +Block 0019 [120]: 6b6dc0b043b95513 +Block 0019 [121]: 0ab3dbe638e144f7 +Block 0019 [122]: 580714872c942d95 +Block 0019 [123]: e2133ff2c9b56f8f +Block 0019 [124]: 3f443e86590b195b +Block 0019 [125]: 9f0df786b9d11a62 +Block 0019 [126]: 6019a3f50eeef5ec +Block 0019 [127]: e3af4457c6c57d74 +Block 0020 [ 0]: 9615c6f04b125822 +Block 0020 [ 1]: bbc6a3cbad09ad63 +Block 0020 [ 2]: 8b33a8b1717ecfcd +Block 0020 [ 3]: d22a3d65e0e5dc56 +Block 0020 [ 4]: 5a9c7f600b17734a +Block 0020 [ 5]: 85f34ac002eaaadf +Block 0020 [ 6]: 19102949a7d35dba +Block 0020 [ 7]: eba5faf3e0c5162b +Block 0020 [ 8]: 8d92b1b1cfd06f92 +Block 0020 [ 9]: ab604d743633ee9d +Block 0020 [ 10]: 68e8508552ac02ca +Block 0020 [ 11]: 8dfb2cd0c8b11294 +Block 0020 [ 12]: b76523dd79a50b15 +Block 0020 [ 13]: 71a9e1dcc57a7e88 +Block 0020 [ 14]: fc3fe755fd7c2f49 +Block 0020 [ 15]: 73021f9dc36ac323 +Block 0020 [ 16]: 470194d113aee51d +Block 0020 [ 17]: 9610e1dfe0fa76e4 +Block 0020 [ 18]: f9650a6fdfa140f2 +Block 0020 [ 19]: bb46922d0495f3db +Block 0020 [ 20]: 637ca17912541ba3 +Block 0020 [ 21]: 8be12ee728df3bbe +Block 0020 [ 22]: 6781d218e518816c +Block 0020 [ 23]: b509d54cc8bc2d47 +Block 0020 [ 24]: cf6dbf9c499ecf06 +Block 0020 [ 25]: 907e1dcbd9445922 +Block 0020 [ 26]: d1cedb9860d7d44a +Block 0020 [ 27]: 4db3e6ea4f8e3939 +Block 0020 [ 28]: 2bd8107671b012dc +Block 0020 [ 29]: 1358200893cc352d +Block 0020 [ 30]: 4076651997b8041d +Block 0020 [ 31]: 99583565d39d102b +Block 0020 [ 32]: 9a369ae3653a4844 +Block 0020 [ 33]: ff517930e12d0fb3 +Block 0020 [ 34]: dfe95097f26f5912 +Block 0020 [ 35]: 347791101536883a +Block 0020 [ 36]: f6ebe0adc5e81a86 +Block 0020 [ 37]: 9ee257ca3cb95b47 +Block 0020 [ 38]: 98960e94bcd4efa8 +Block 0020 [ 39]: d2e3fe76d8616647 +Block 0020 [ 40]: d0b7771e1038c71d +Block 0020 [ 41]: 79746f8f40a842fe +Block 0020 [ 42]: ef76f485c0812c0e +Block 0020 [ 43]: 86a66bc0c07c2b7e +Block 0020 [ 44]: e75b56d4dbdbf024 +Block 0020 [ 45]: 32160a23df550a63 +Block 0020 [ 46]: 3ee01df8c98b32c0 +Block 0020 [ 47]: c77fdff62a8be1e8 +Block 0020 [ 48]: 9af667adde4e0ba0 +Block 0020 [ 49]: 7a82d438193aa28f +Block 0020 [ 50]: ca03ab93813051f7 +Block 0020 [ 51]: 97f07d37bafe132c +Block 0020 [ 52]: 7f27cb32f8866e02 +Block 0020 [ 53]: 1f8a6cf5a6d84fc7 +Block 0020 [ 54]: bfaf83737a01bcd3 +Block 0020 [ 55]: 7fef2c3149a0fef0 +Block 0020 [ 56]: 5674a6a7331b6a6d +Block 0020 [ 57]: 0ca447676d116f6b +Block 0020 [ 58]: 7452d755cd1b15c3 +Block 0020 [ 59]: 5681a228481aaacf +Block 0020 [ 60]: 870185f00101adb1 +Block 0020 [ 61]: 86e2191f974f08b0 +Block 0020 [ 62]: 40bd272e9e289567 +Block 0020 [ 63]: b17bb938155258da +Block 0020 [ 64]: 30718b28f21d46dd +Block 0020 [ 65]: 1cc99b8fc23bb1b5 +Block 0020 [ 66]: 498683869b7ecf4c +Block 0020 [ 67]: 58c22169dae7c96d +Block 0020 [ 68]: 0db1b1f0e729cf2d +Block 0020 [ 69]: 3a9085879af82b40 +Block 0020 [ 70]: 4db5e82575ef9d32 +Block 0020 [ 71]: b9e9488f9b515cfc +Block 0020 [ 72]: 8e81d7de5e6c4782 +Block 0020 [ 73]: a217c7f05630e843 +Block 0020 [ 74]: 1f1e764caf5ff5f9 +Block 0020 [ 75]: 3382e12b81b8fe90 +Block 0020 [ 76]: 74e7c5c8c55662c8 +Block 0020 [ 77]: 6b3d6ef4f0d5127e +Block 0020 [ 78]: 1f5927978da0630d +Block 0020 [ 79]: 3b736b8bd8408bd9 +Block 0020 [ 80]: 0dd0b3b98821f799 +Block 0020 [ 81]: 471755b90a64fcb6 +Block 0020 [ 82]: 50b6ac3114749ac5 +Block 0020 [ 83]: b557c9e857ccaadd +Block 0020 [ 84]: 88a2d12570bfe63d +Block 0020 [ 85]: 053d60a3e450e87c +Block 0020 [ 86]: eeb64921f5670705 +Block 0020 [ 87]: 2b1ec30ab15b52af +Block 0020 [ 88]: 23d5521b1e5f9957 +Block 0020 [ 89]: bd68c9ee34594385 +Block 0020 [ 90]: 8f5595c804b0b0cb +Block 0020 [ 91]: 1f7ca670dbae80e7 +Block 0020 [ 92]: 312d9a3dc213f619 +Block 0020 [ 93]: 917c68959a12da86 +Block 0020 [ 94]: ae6457d11e64ac5a +Block 0020 [ 95]: cf9ae240fcbf42d6 +Block 0020 [ 96]: 80336ea9a3d65f65 +Block 0020 [ 97]: 3b9b55736496fb29 +Block 0020 [ 98]: cdadaf18790a76f5 +Block 0020 [ 99]: 7aa4592b00522b5e +Block 0020 [100]: 27497d630ad191c2 +Block 0020 [101]: 885f2f8a1612535b +Block 0020 [102]: ba18ae7c42139005 +Block 0020 [103]: b3ae5a2310cf6cdf +Block 0020 [104]: b696d851371dda54 +Block 0020 [105]: 0d8026cd41c69440 +Block 0020 [106]: 2c724ccda4cef368 +Block 0020 [107]: 8b5300389120cbe7 +Block 0020 [108]: 63bd3c75a62a6b19 +Block 0020 [109]: a793cba536c65be9 +Block 0020 [110]: 311ca002baeec894 +Block 0020 [111]: e87ee22e79820e40 +Block 0020 [112]: bc3a2f78ed41d5d4 +Block 0020 [113]: d8e475e4faa40234 +Block 0020 [114]: c162560b8adc92d4 +Block 0020 [115]: 91b49d09f4ab3123 +Block 0020 [116]: 20f97e7e634a57f5 +Block 0020 [117]: 215f0e74cdcce539 +Block 0020 [118]: b91ad49b46090a89 +Block 0020 [119]: cff450a937dc6300 +Block 0020 [120]: f2f7cf24f1155489 +Block 0020 [121]: 108b2b71758f3215 +Block 0020 [122]: 620dd7da567e1eeb +Block 0020 [123]: a24dc8baad94e416 +Block 0020 [124]: b0d51a0f0414e089 +Block 0020 [125]: d3cf0eb94293600c +Block 0020 [126]: b64fcb808681de54 +Block 0020 [127]: 971f8b5cdc194991 +Block 0021 [ 0]: 5c7cfb56c8f911b3 +Block 0021 [ 1]: 8b7a71622e11aa73 +Block 0021 [ 2]: 1930406e86ee544b +Block 0021 [ 3]: 2f92752aee9653e5 +Block 0021 [ 4]: 1aa7899289031259 +Block 0021 [ 5]: 9276ab0e19abd61a +Block 0021 [ 6]: 8d97e0abed86d503 +Block 0021 [ 7]: 52102de7a0c2541d +Block 0021 [ 8]: a48fd49a819bc22d +Block 0021 [ 9]: 006985b359e6ef5e +Block 0021 [ 10]: 56bd98e477212867 +Block 0021 [ 11]: 87658890e4136505 +Block 0021 [ 12]: 36fcf1dac078bbe6 +Block 0021 [ 13]: c48fe29b58629a66 +Block 0021 [ 14]: c5e510b7790915b4 +Block 0021 [ 15]: c7915e58bc88b962 +Block 0021 [ 16]: 90c98628841ed410 +Block 0021 [ 17]: b948bf66a81acd79 +Block 0021 [ 18]: 20f00016b577ac52 +Block 0021 [ 19]: c0850950f5518e9e +Block 0021 [ 20]: 9cc22f365c9ce483 +Block 0021 [ 21]: d488a15d4f9a09ba +Block 0021 [ 22]: 671624e35e8524fd +Block 0021 [ 23]: fd9cb7702e5a6a18 +Block 0021 [ 24]: 4f6ceca22c7b8def +Block 0021 [ 25]: 35993124c3429808 +Block 0021 [ 26]: d480f9a34ae79284 +Block 0021 [ 27]: 41de8b418a16a33c +Block 0021 [ 28]: bfe94b084eb4cb62 +Block 0021 [ 29]: 1fc72a96b053ac3e +Block 0021 [ 30]: 1d7602e7c7a72141 +Block 0021 [ 31]: ec35d716ed423ae1 +Block 0021 [ 32]: 1457905f2311c807 +Block 0021 [ 33]: ac633f5403f7f962 +Block 0021 [ 34]: 29e5963ae5cafa7e +Block 0021 [ 35]: 05db765805f482aa +Block 0021 [ 36]: 73b42333acffddf7 +Block 0021 [ 37]: 0c7ff380d6f770be +Block 0021 [ 38]: 71155bb1f4cb4f64 +Block 0021 [ 39]: 35819e4d516ed1f1 +Block 0021 [ 40]: f86a4e927f75c684 +Block 0021 [ 41]: 3b94b76c1cebbc1b +Block 0021 [ 42]: 878bd26f6d680ee1 +Block 0021 [ 43]: c853a628c6a2ae2d +Block 0021 [ 44]: 9eb7a9fd5286ac26 +Block 0021 [ 45]: a71ad3bc763bd705 +Block 0021 [ 46]: 7a809af2e80d6e1c +Block 0021 [ 47]: e60a5368fc2f7dcf +Block 0021 [ 48]: ce424d140d2833d3 +Block 0021 [ 49]: 9e2ca4a277a9bfa7 +Block 0021 [ 50]: b6f56b2368f2b2b0 +Block 0021 [ 51]: 8d2831a80c681111 +Block 0021 [ 52]: efa2a6d6b54b372c +Block 0021 [ 53]: 2795838739598c33 +Block 0021 [ 54]: ad0898ef6e088b20 +Block 0021 [ 55]: 3bb14c01e2d26abb +Block 0021 [ 56]: 3715b7840dd14f3a +Block 0021 [ 57]: 11032380cfb1a4e3 +Block 0021 [ 58]: 657f3aa18721b06a +Block 0021 [ 59]: bbc4e34b1a57036f +Block 0021 [ 60]: bb5aab0086615334 +Block 0021 [ 61]: 243bff40cea40263 +Block 0021 [ 62]: 288a58457b364065 +Block 0021 [ 63]: ff3e5f084e886b5d +Block 0021 [ 64]: 266a88b7fa318607 +Block 0021 [ 65]: 46887c524b47738c +Block 0021 [ 66]: 05a41f5d76a98c33 +Block 0021 [ 67]: 1dfce7882e67acfe +Block 0021 [ 68]: 95d64866745a7c0a +Block 0021 [ 69]: 0ea59084765ae9d5 +Block 0021 [ 70]: 07a516edb29cfaba +Block 0021 [ 71]: 92428aea3ebb55a6 +Block 0021 [ 72]: c04928d77c86f0a6 +Block 0021 [ 73]: 74cfd4f2b2dea2f7 +Block 0021 [ 74]: 9a6e39c49f8b73d3 +Block 0021 [ 75]: 8576b61a109ddcd9 +Block 0021 [ 76]: 3f045563a643b7d3 +Block 0021 [ 77]: 10814c54c69bcc58 +Block 0021 [ 78]: 2a8db338c71915d9 +Block 0021 [ 79]: 4a3586847b1a4453 +Block 0021 [ 80]: 1795ab20987b66e8 +Block 0021 [ 81]: da147943c40a3b65 +Block 0021 [ 82]: 3cb7b96d98a10213 +Block 0021 [ 83]: 334d50efa35837ea +Block 0021 [ 84]: 718a8a5a89adcf22 +Block 0021 [ 85]: d0b88dd56ab65fdd +Block 0021 [ 86]: 20b6f89bc23153b4 +Block 0021 [ 87]: af569b830d970527 +Block 0021 [ 88]: 3284c6e30514ad11 +Block 0021 [ 89]: 5280e13f9029f0f1 +Block 0021 [ 90]: 849811b7dd25f028 +Block 0021 [ 91]: 47cb9f761527d86b +Block 0021 [ 92]: dbeacdc212f2ced3 +Block 0021 [ 93]: d7c78ff536cadd0b +Block 0021 [ 94]: 999673e828c35b56 +Block 0021 [ 95]: f87f792b57afadb9 +Block 0021 [ 96]: 29d82c85eced236d +Block 0021 [ 97]: 21be8a63f2ce3afe +Block 0021 [ 98]: 0dc79d3954446982 +Block 0021 [ 99]: 03ab07ee97d110de +Block 0021 [100]: acfbe4f974bb42f7 +Block 0021 [101]: 72e7650500174416 +Block 0021 [102]: 7d2b4bcd0b45804f +Block 0021 [103]: 3f82fcf386947bcb +Block 0021 [104]: b163d4a6610760bb +Block 0021 [105]: af9dee5e93e1628b +Block 0021 [106]: 78d71f93b81e5bd2 +Block 0021 [107]: 1336842f51e07e6e +Block 0021 [108]: be00ff96ecb0c7c3 +Block 0021 [109]: 949daf9fe70e5259 +Block 0021 [110]: d6e900117f863b9a +Block 0021 [111]: cb81b9f4a8f7297e +Block 0021 [112]: 5c65c123427d7bc3 +Block 0021 [113]: 1fc80884cfa7d639 +Block 0021 [114]: ab653c2ad98fe613 +Block 0021 [115]: f8a76a3b7183e378 +Block 0021 [116]: 5801569adbbec72f +Block 0021 [117]: 5dd8f25c9590a887 +Block 0021 [118]: 61db5e3c40bdef0a +Block 0021 [119]: 5c531abfe2cca2ce +Block 0021 [120]: 415c80196f173bf9 +Block 0021 [121]: a1769093654e290f +Block 0021 [122]: 3dded0331d22ead6 +Block 0021 [123]: 4aa06495cc77fb16 +Block 0021 [124]: ba821eca3ac7e893 +Block 0021 [125]: c3f6d28767c41456 +Block 0021 [126]: d09e98175a49ea3a +Block 0021 [127]: c71b672605fe10b8 +Block 0022 [ 0]: 64fd9b4965b7865c +Block 0022 [ 1]: b318e42646c614ab +Block 0022 [ 2]: b0acf9b55022d714 +Block 0022 [ 3]: 24c8da93562c711c +Block 0022 [ 4]: bc2a6302275eadd4 +Block 0022 [ 5]: 3ad682c508033828 +Block 0022 [ 6]: 1135c30b72574375 +Block 0022 [ 7]: 9f4e3111a45f174b +Block 0022 [ 8]: be83dc96a5b8a4ba +Block 0022 [ 9]: fcfe3ab091aca65a +Block 0022 [ 10]: 9390f7c4351730be +Block 0022 [ 11]: bf604eb636f62cc9 +Block 0022 [ 12]: f98ea9f7e17e70fb +Block 0022 [ 13]: 0b015cd145f26853 +Block 0022 [ 14]: ec9163fa13f74ce7 +Block 0022 [ 15]: 8ff97292d63bcab4 +Block 0022 [ 16]: d3feaf92c2d8b41f +Block 0022 [ 17]: d4566510bd20e7ec +Block 0022 [ 18]: afd8d144692a7f33 +Block 0022 [ 19]: e802522f54f2a988 +Block 0022 [ 20]: ac672a89864152a7 +Block 0022 [ 21]: 186e62c8651dd183 +Block 0022 [ 22]: 6e67bf8aea31dfbb +Block 0022 [ 23]: eb785c9679765811 +Block 0022 [ 24]: cae7b721f9066c1d +Block 0022 [ 25]: 87a4293682a4004f +Block 0022 [ 26]: 96748181c2c3c4fe +Block 0022 [ 27]: 0235a425b2c59625 +Block 0022 [ 28]: 32a9ad0c9ababac2 +Block 0022 [ 29]: a691969d4c8a0c62 +Block 0022 [ 30]: 8fde0adacef37668 +Block 0022 [ 31]: 116793c8d7eafcd9 +Block 0022 [ 32]: 22b38c1b92ffbcb7 +Block 0022 [ 33]: 6676a04278883071 +Block 0022 [ 34]: eb46aaf2e70c8316 +Block 0022 [ 35]: dbf45374f04b815e +Block 0022 [ 36]: 258bee0542c96efa +Block 0022 [ 37]: 907e4f6f7595a8ef +Block 0022 [ 38]: df765a9c4c218eae +Block 0022 [ 39]: 3d0e3375b574edbb +Block 0022 [ 40]: 35f13384a1c995ae +Block 0022 [ 41]: 3d0c667fe013a4a8 +Block 0022 [ 42]: 906807c8d09563b3 +Block 0022 [ 43]: fcc287c6a5bcd77b +Block 0022 [ 44]: 14367a708f16b036 +Block 0022 [ 45]: 4ba57f16db97c8eb +Block 0022 [ 46]: 2f970f37091fa261 +Block 0022 [ 47]: 6f40b4a61829c687 +Block 0022 [ 48]: 8ddbf5fd6a8b8d50 +Block 0022 [ 49]: 4a9338a492c0e4ab +Block 0022 [ 50]: ef65910de5dde029 +Block 0022 [ 51]: f1a5348f27802811 +Block 0022 [ 52]: d5af7a4002abceab +Block 0022 [ 53]: d7e088abfc4201df +Block 0022 [ 54]: 7e0dfe72426c89a4 +Block 0022 [ 55]: fad0116ee37d0d35 +Block 0022 [ 56]: e3ccd23e735c6370 +Block 0022 [ 57]: 14b635dad052af0e +Block 0022 [ 58]: bb4b95c0a662f3e1 +Block 0022 [ 59]: 9e1661bf69498511 +Block 0022 [ 60]: 9d3168e59f1d0ed6 +Block 0022 [ 61]: 054bbfbb6227b9c2 +Block 0022 [ 62]: 108a0be1a3e3437e +Block 0022 [ 63]: 8fd5bde2e8c51242 +Block 0022 [ 64]: ec830719ab04c9b7 +Block 0022 [ 65]: 21e51390f98ca718 +Block 0022 [ 66]: 7739557023bee6fc +Block 0022 [ 67]: 0bfff86bba432124 +Block 0022 [ 68]: 607dbfa6887d1a81 +Block 0022 [ 69]: 13060a984bf13d20 +Block 0022 [ 70]: f65ee280fc34e309 +Block 0022 [ 71]: 58ee7e200095a738 +Block 0022 [ 72]: 18453e4acd4adafe +Block 0022 [ 73]: 3b8541389d26247b +Block 0022 [ 74]: ca21feb22f02fd5e +Block 0022 [ 75]: 09caa3b763337817 +Block 0022 [ 76]: 0a6eb6fc271a194d +Block 0022 [ 77]: d0987e4b0bef2d4e +Block 0022 [ 78]: 4d95ded45c6ba518 +Block 0022 [ 79]: 934a752ae10e8b3c +Block 0022 [ 80]: 0903e0909bdea81b +Block 0022 [ 81]: 3534472f695ad1d7 +Block 0022 [ 82]: fe36851b1f2fe863 +Block 0022 [ 83]: 6a0458fca1095df9 +Block 0022 [ 84]: 17a70572293bad90 +Block 0022 [ 85]: e2a48e238aaddd2f +Block 0022 [ 86]: 3b2f3d364af66648 +Block 0022 [ 87]: b6ccb0a91ca2f8b5 +Block 0022 [ 88]: dfbd598aa7af5d05 +Block 0022 [ 89]: 3dea46fc047d9f8e +Block 0022 [ 90]: f35e090d51415634 +Block 0022 [ 91]: 5c0db506447169f3 +Block 0022 [ 92]: 590d2caff15b9a7f +Block 0022 [ 93]: bd6f691b9249e471 +Block 0022 [ 94]: 2e3c804924a7f4f0 +Block 0022 [ 95]: a370d8fd190c7576 +Block 0022 [ 96]: 88c7b5e26c6ff6b3 +Block 0022 [ 97]: 3e059d97d3e58cf1 +Block 0022 [ 98]: d7b099503b1b2fda +Block 0022 [ 99]: 708462a06022938b +Block 0022 [100]: e9c8ac7db507acaa +Block 0022 [101]: 442d1076e088613c +Block 0022 [102]: 9d7ce0f464ff1b07 +Block 0022 [103]: f63b65ffb38aa005 +Block 0022 [104]: 4b5c0033e9502909 +Block 0022 [105]: 6c773a3cd7b5e4f0 +Block 0022 [106]: 08f1e94be69a4fd6 +Block 0022 [107]: 1c373be886f35eb0 +Block 0022 [108]: b14dc4794c9b8cb1 +Block 0022 [109]: f3fbc1e0f5bb285b +Block 0022 [110]: b2d27593c7a712e4 +Block 0022 [111]: c9dfab152aa78ea7 +Block 0022 [112]: 06fb9ca2a671a544 +Block 0022 [113]: 05c4cd7d6203176f +Block 0022 [114]: b295a9ef3a79401a +Block 0022 [115]: 9451857213b32bbb +Block 0022 [116]: 92eb9750a6bae538 +Block 0022 [117]: 0cb4db498fc3bba0 +Block 0022 [118]: ca36208bf56a1e9c +Block 0022 [119]: 901d87ba10136d72 +Block 0022 [120]: 2cac1b66b391c7c6 +Block 0022 [121]: df54b5eab81b24bf +Block 0022 [122]: d3c88b759a23a4fe +Block 0022 [123]: 4097fe18adbfbc6f +Block 0022 [124]: 47a3bc5614d062a3 +Block 0022 [125]: 7c94001e1a2d2c65 +Block 0022 [126]: 0e80b1921c8637a5 +Block 0022 [127]: 5abc6ef9377e861b +Block 0023 [ 0]: 6f1853c5319f9562 +Block 0023 [ 1]: e2276855409e9046 +Block 0023 [ 2]: 8de58f45d20e98b0 +Block 0023 [ 3]: 67f609324d652b57 +Block 0023 [ 4]: 3a4bb948f39345b9 +Block 0023 [ 5]: 7ef1f641e620643c +Block 0023 [ 6]: 28462ac5919ab4ef +Block 0023 [ 7]: 8f62db1f9b18733c +Block 0023 [ 8]: 31cd7b2ea2476fb1 +Block 0023 [ 9]: 11b9623ab428c965 +Block 0023 [ 10]: 5c2020f5c2fe21de +Block 0023 [ 11]: df5626fef0b5978d +Block 0023 [ 12]: e5345a586ff7176c +Block 0023 [ 13]: 5188b696ebed647f +Block 0023 [ 14]: 7a92ccf8de6e893e +Block 0023 [ 15]: 9dc2f344b4e2c921 +Block 0023 [ 16]: a9b5b02623130ebf +Block 0023 [ 17]: f2ff269b618ba660 +Block 0023 [ 18]: fcf6c01de14de5ce +Block 0023 [ 19]: 2e3457136a7e83fb +Block 0023 [ 20]: 2b61c5171f8159b1 +Block 0023 [ 21]: 14e562091620ae2c +Block 0023 [ 22]: 2c9d26f9a7b5e6d2 +Block 0023 [ 23]: d0cc7ace37891cee +Block 0023 [ 24]: e21b920a63af6535 +Block 0023 [ 25]: b2c622542bd642bb +Block 0023 [ 26]: c6d62b3c28afa5ea +Block 0023 [ 27]: 97e8bb80322d3307 +Block 0023 [ 28]: 39848b62b609a793 +Block 0023 [ 29]: 37b886a95aafbaf3 +Block 0023 [ 30]: cb0cdc116b750327 +Block 0023 [ 31]: 52ab4414c2ac68e7 +Block 0023 [ 32]: bdf682bba57bdedb +Block 0023 [ 33]: 944852982e2c5134 +Block 0023 [ 34]: 18e61b320d8fe09f +Block 0023 [ 35]: 396de631d0da3b9d +Block 0023 [ 36]: 03360f528e36c8aa +Block 0023 [ 37]: 2192278da2fcaeb9 +Block 0023 [ 38]: 9dc55ef7840d826c +Block 0023 [ 39]: 03da781c403b16e8 +Block 0023 [ 40]: a39c8b8a7c670aba +Block 0023 [ 41]: 97493ed7fa5943b4 +Block 0023 [ 42]: 9f2a1463c375c544 +Block 0023 [ 43]: 01be7e591061e086 +Block 0023 [ 44]: d5b3537bd8a31e5f +Block 0023 [ 45]: 9ce6039b063e6265 +Block 0023 [ 46]: df1b651695071d84 +Block 0023 [ 47]: acb5903b1934a4b4 +Block 0023 [ 48]: 35d9e6c2b39909e7 +Block 0023 [ 49]: 64a8b6b286de343e +Block 0023 [ 50]: 2c2de51a549d5b57 +Block 0023 [ 51]: 4867625ed31c0f96 +Block 0023 [ 52]: 9faeae884d5791d8 +Block 0023 [ 53]: 5bdf23a008c25bb1 +Block 0023 [ 54]: d2878f03e4fe900f +Block 0023 [ 55]: 017cd24a913bd254 +Block 0023 [ 56]: e271daebf861cf5b +Block 0023 [ 57]: 75477c84426b8f73 +Block 0023 [ 58]: c96a6bebf91e1a14 +Block 0023 [ 59]: 8e4277cc1fa2ce6b +Block 0023 [ 60]: 68c4a44a97ffba2f +Block 0023 [ 61]: f6c2c2b99f342b8c +Block 0023 [ 62]: 6690a2192de3c87f +Block 0023 [ 63]: 36a0d3497baa7820 +Block 0023 [ 64]: 157f9015c0c7f9f0 +Block 0023 [ 65]: 79e419eb8e807756 +Block 0023 [ 66]: e66cc11ff8aa6f61 +Block 0023 [ 67]: 7e9b408465e7ce4e +Block 0023 [ 68]: 52c6a49a03883386 +Block 0023 [ 69]: f03fb132eebd2045 +Block 0023 [ 70]: cd567beb7556ec86 +Block 0023 [ 71]: 85982ac59523492a +Block 0023 [ 72]: 20ee64cb514ad474 +Block 0023 [ 73]: 4d1c99a6a8c08e4f +Block 0023 [ 74]: 5131c291ea29e9c2 +Block 0023 [ 75]: 6235198630fad95b +Block 0023 [ 76]: 70fe76acb0b18fbd +Block 0023 [ 77]: b206b78ef678c1ba +Block 0023 [ 78]: 56a6db19ae8589e5 +Block 0023 [ 79]: 72cdedfbd94dce70 +Block 0023 [ 80]: 7a50b0bf9fd61a9e +Block 0023 [ 81]: 0c85f95eeb886204 +Block 0023 [ 82]: 816c6be3d15ff55d +Block 0023 [ 83]: 20817fd396239ec1 +Block 0023 [ 84]: d05612a38e22672f +Block 0023 [ 85]: f972bd8da51d6fdf +Block 0023 [ 86]: 20fc3311fd080dd7 +Block 0023 [ 87]: a176747132531fce +Block 0023 [ 88]: 2b22d83144efdc3b +Block 0023 [ 89]: 4f558ac03d6f9bed +Block 0023 [ 90]: 09b7bca775f5d9e2 +Block 0023 [ 91]: d3265666a853a184 +Block 0023 [ 92]: 485da114eaeed42f +Block 0023 [ 93]: 2d4bed5cb24a661c +Block 0023 [ 94]: 2a1ce8bc3865294d +Block 0023 [ 95]: ffa252bb0cd9df9f +Block 0023 [ 96]: 1f5c37a3ccd57245 +Block 0023 [ 97]: 0718e569a201014e +Block 0023 [ 98]: 4bb1602a978086bf +Block 0023 [ 99]: ebbd6e7528af36a9 +Block 0023 [100]: 2b4ab8751bc9fe94 +Block 0023 [101]: 68553e85db3f32b4 +Block 0023 [102]: e31ed80700c9fdbc +Block 0023 [103]: 93afa5f880862c8f +Block 0023 [104]: 4660514a885ff84b +Block 0023 [105]: 19b38d1f248013b6 +Block 0023 [106]: 2e3c39ec54094983 +Block 0023 [107]: 96c1dcf93b6c6f29 +Block 0023 [108]: a683f243ac481cfb +Block 0023 [109]: 309a7c76f0304c9e +Block 0023 [110]: f75b27228b66cac7 +Block 0023 [111]: 8eb73c3b7595d5b9 +Block 0023 [112]: 69bc2ff710baec62 +Block 0023 [113]: 1602ea60ad1ee868 +Block 0023 [114]: 73ba0e151c086ee9 +Block 0023 [115]: 6fadbbbc8e00a7cf +Block 0023 [116]: f238a3ba1b46babc +Block 0023 [117]: dd3d5b22a7f66c81 +Block 0023 [118]: f1d34a91886de3fd +Block 0023 [119]: c1671928190cea58 +Block 0023 [120]: 47174dba3a407fed +Block 0023 [121]: c7ddfc44251d0ed0 +Block 0023 [122]: 72f4f8a5b1cec9ff +Block 0023 [123]: 20999d3b61bc0eb4 +Block 0023 [124]: 0a75094f49d3ad65 +Block 0023 [125]: dc9350409c61baed +Block 0023 [126]: 0fd7037aa67bac99 +Block 0023 [127]: e287e0e42246c7f4 +Block 0024 [ 0]: 0432574fbc9d5dd8 +Block 0024 [ 1]: c204e6cbddc0e513 +Block 0024 [ 2]: bff86a52bbb84772 +Block 0024 [ 3]: a4ad714647a24141 +Block 0024 [ 4]: 306dfb160cb0168b +Block 0024 [ 5]: 103af7fecdc4e474 +Block 0024 [ 6]: dc7c2fbc8418ae2c +Block 0024 [ 7]: f9b9db9b5b00530a +Block 0024 [ 8]: fdd811cc89258674 +Block 0024 [ 9]: c021d74c30791cad +Block 0024 [ 10]: e1e3a2611ee62cdc +Block 0024 [ 11]: b4376209f57ba102 +Block 0024 [ 12]: 485bad429d7a74d1 +Block 0024 [ 13]: 2f00dd21f7cba740 +Block 0024 [ 14]: eeedb2ea7180653e +Block 0024 [ 15]: 21bd09fbe74d0c42 +Block 0024 [ 16]: 1c3cf40409d194b3 +Block 0024 [ 17]: abb803645f3d4eef +Block 0024 [ 18]: 760aeea7a9b5cc3f +Block 0024 [ 19]: 19fae830355800be +Block 0024 [ 20]: 141dba19caf13520 +Block 0024 [ 21]: 8ca23b8f3cd2633e +Block 0024 [ 22]: 78b7a41e4ac99edc +Block 0024 [ 23]: 531d130dcf9774d8 +Block 0024 [ 24]: 837e14d422f7557e +Block 0024 [ 25]: 1a8dbdfb37af6c74 +Block 0024 [ 26]: 134301202c87ec18 +Block 0024 [ 27]: fcbb7a22c5b3df52 +Block 0024 [ 28]: 32f4e44e9fac6b59 +Block 0024 [ 29]: 13ef9cf9aaee02e2 +Block 0024 [ 30]: 80418abbff69af85 +Block 0024 [ 31]: 3fdc185377252bae +Block 0024 [ 32]: 313c10ca6661d457 +Block 0024 [ 33]: 11f9b04c374037ca +Block 0024 [ 34]: 8f318bc97ca0a623 +Block 0024 [ 35]: 25567955504565ab +Block 0024 [ 36]: 94a627d187cb82aa +Block 0024 [ 37]: 6312efdd2a1b6b15 +Block 0024 [ 38]: 578d72ee851807a4 +Block 0024 [ 39]: 0d7ea132d31936ad +Block 0024 [ 40]: 1e7a1b0c13069b01 +Block 0024 [ 41]: 0c0ac3cd3fb22d0e +Block 0024 [ 42]: 0d86238598ac86a4 +Block 0024 [ 43]: 4f8fc85ec52bd436 +Block 0024 [ 44]: 656e06c90e503727 +Block 0024 [ 45]: f879f0a09097b288 +Block 0024 [ 46]: e5de3d1a739a7d89 +Block 0024 [ 47]: c0f9d1fcf2ae3a40 +Block 0024 [ 48]: 5abc3ec589836477 +Block 0024 [ 49]: 2b1b22823ca247b4 +Block 0024 [ 50]: fa725af759926695 +Block 0024 [ 51]: 451275844fc4cee2 +Block 0024 [ 52]: d55319d56a1d94f7 +Block 0024 [ 53]: a013da8d2b0cd1f4 +Block 0024 [ 54]: ed7a84ba49aff786 +Block 0024 [ 55]: 89d502e82eb686b5 +Block 0024 [ 56]: 15952ee29e0e742b +Block 0024 [ 57]: 38bad0e41edf0fda +Block 0024 [ 58]: 0917ac2e67e4abf4 +Block 0024 [ 59]: 3f1d8424ff0b061b +Block 0024 [ 60]: b28a7c092d523671 +Block 0024 [ 61]: 648492402817887a +Block 0024 [ 62]: 98392a38e1d1cb57 +Block 0024 [ 63]: 6c3f7e8f7284210b +Block 0024 [ 64]: fdf9ed8aab0dddee +Block 0024 [ 65]: d7cd3a000a642aa5 +Block 0024 [ 66]: 818c0c07e43eabc2 +Block 0024 [ 67]: 8f0cec21539c9184 +Block 0024 [ 68]: 3290a8bf82fbb054 +Block 0024 [ 69]: 774f9f56cb180482 +Block 0024 [ 70]: 05c93d89441573e2 +Block 0024 [ 71]: 6d909bbec0f2b043 +Block 0024 [ 72]: 9f5fd6cd2e4972ec +Block 0024 [ 73]: 1529c07b366527fc +Block 0024 [ 74]: 046f880c84a32721 +Block 0024 [ 75]: 9ead89d33173d633 +Block 0024 [ 76]: 14db9d8f07af67f7 +Block 0024 [ 77]: 7a39735cb6469f13 +Block 0024 [ 78]: effbe25d83c95cef +Block 0024 [ 79]: 1c13ef9b8127cca1 +Block 0024 [ 80]: 8c6c66bf4007f535 +Block 0024 [ 81]: 0e43774693ab0d9f +Block 0024 [ 82]: ad94f20b17ac7409 +Block 0024 [ 83]: e7fc3a1411454e6c +Block 0024 [ 84]: 1ab8d0b17650a589 +Block 0024 [ 85]: 631bb50d34843850 +Block 0024 [ 86]: e4637482fe3a837b +Block 0024 [ 87]: 4904d626a5376682 +Block 0024 [ 88]: a2f694ab52ba264b +Block 0024 [ 89]: 4665d1ef7c41f849 +Block 0024 [ 90]: b4ea1371947d2810 +Block 0024 [ 91]: 79fb98770f2d912c +Block 0024 [ 92]: 2ce74cabf98919a3 +Block 0024 [ 93]: 762030a596c31be3 +Block 0024 [ 94]: 01f6ec6459e8170f +Block 0024 [ 95]: d43caf792539d9fb +Block 0024 [ 96]: 6100b03b6bede581 +Block 0024 [ 97]: b5524ced6d9dd33f +Block 0024 [ 98]: f7b50e455bcd2eba +Block 0024 [ 99]: fd24d6a38ab51643 +Block 0024 [100]: 35629cf1b450109a +Block 0024 [101]: 1f2304fe412e1390 +Block 0024 [102]: 81c4f114d70aee49 +Block 0024 [103]: cd63c0935c4c8e31 +Block 0024 [104]: 4111632fd7eaa644 +Block 0024 [105]: e4eba60023668c10 +Block 0024 [106]: 1b391550d1793d68 +Block 0024 [107]: f834a1e65bd10e66 +Block 0024 [108]: 04cf3169883c1761 +Block 0024 [109]: 3feb52f056a0ffb3 +Block 0024 [110]: 00b5f30a55a77677 +Block 0024 [111]: a885fd7ce60d83f6 +Block 0024 [112]: d2e107f102334203 +Block 0024 [113]: 3964a70ec5b6cab3 +Block 0024 [114]: b613b663f0093f9f +Block 0024 [115]: 35b11d5e2f64070d +Block 0024 [116]: 97965edbda06083a +Block 0024 [117]: b034b567199107ec +Block 0024 [118]: 95aca8d8108d34a2 +Block 0024 [119]: 02a7090233566f9b +Block 0024 [120]: 67a7495b336b06d2 +Block 0024 [121]: 4281aa7d3ee9611b +Block 0024 [122]: 468dea7a61d1edca +Block 0024 [123]: 238094066657c3fe +Block 0024 [124]: 0e1ab01381100ee6 +Block 0024 [125]: 0f1af8701c31727d +Block 0024 [126]: 9c94844cef907f44 +Block 0024 [127]: 902e335c261a32e7 +Block 0025 [ 0]: 6a33df8f52ad99bf +Block 0025 [ 1]: 1e4738940d06379b +Block 0025 [ 2]: b9f081d1f8243661 +Block 0025 [ 3]: 7df44c97870c6e9d +Block 0025 [ 4]: fbf7eaee7c04aab3 +Block 0025 [ 5]: c625e47ec737f9d4 +Block 0025 [ 6]: dfdb0e81b1004005 +Block 0025 [ 7]: 1bbc61627ecbd467 +Block 0025 [ 8]: 5bddb477803f2e65 +Block 0025 [ 9]: 9027be96a3f42340 +Block 0025 [ 10]: 558c0c7b4e389af7 +Block 0025 [ 11]: 448b3293b8a175b1 +Block 0025 [ 12]: 0a65e5e6cee01e24 +Block 0025 [ 13]: e599d714f1493875 +Block 0025 [ 14]: 0a7f22d619766c70 +Block 0025 [ 15]: fb02933939450b2a +Block 0025 [ 16]: 3f12eff85ecd0b82 +Block 0025 [ 17]: 956e0ca5e3c0c248 +Block 0025 [ 18]: 22ff792f503db151 +Block 0025 [ 19]: 17084ef5418273dc +Block 0025 [ 20]: ce747362530ae619 +Block 0025 [ 21]: 20b416abcb77c071 +Block 0025 [ 22]: deb39aca8d50640b +Block 0025 [ 23]: d31cdd0763cc5c81 +Block 0025 [ 24]: 84a8e613c349b233 +Block 0025 [ 25]: e8bc7a697643f7b5 +Block 0025 [ 26]: 0c36ddfc4171a8f8 +Block 0025 [ 27]: 4dbd968c9d34bed6 +Block 0025 [ 28]: e1d57c69a41636f3 +Block 0025 [ 29]: 766ae46b78df2f2e +Block 0025 [ 30]: 8f8f7f5a4c864ab9 +Block 0025 [ 31]: 878f468c99598ee7 +Block 0025 [ 32]: c4352b3d5e7b6a9f +Block 0025 [ 33]: b09e084d0f9e7188 +Block 0025 [ 34]: 2f9356019d974131 +Block 0025 [ 35]: 648b17019e5e2026 +Block 0025 [ 36]: fc5d8f769a45c489 +Block 0025 [ 37]: 02622e6a0de5e763 +Block 0025 [ 38]: ed36ab59ab7f18b8 +Block 0025 [ 39]: 4a7b050e74b8645f +Block 0025 [ 40]: 7221af6a190edb2a +Block 0025 [ 41]: b3f8f1aec73b76e7 +Block 0025 [ 42]: 0c8a615a280f8d8f +Block 0025 [ 43]: a46ec28c5ad8b7e2 +Block 0025 [ 44]: f038bfe29ade127b +Block 0025 [ 45]: 463ebb4801f169eb +Block 0025 [ 46]: 393b89ae6915a527 +Block 0025 [ 47]: 4c9de27e93368fcf +Block 0025 [ 48]: 476798d8e490924a +Block 0025 [ 49]: 58dd5a5031d795fb +Block 0025 [ 50]: 7c2b0b7e8ac62762 +Block 0025 [ 51]: c14ec516db75e3ce +Block 0025 [ 52]: 809ef653b7973236 +Block 0025 [ 53]: 6d0c17627f8457d0 +Block 0025 [ 54]: 5e4c5707ec7a312a +Block 0025 [ 55]: 10cc52c802e38f2a +Block 0025 [ 56]: 53832930d7f99e6f +Block 0025 [ 57]: e87111500e7eaf61 +Block 0025 [ 58]: 201807f71790abb0 +Block 0025 [ 59]: 6654a2ef4dbadf77 +Block 0025 [ 60]: abc3f86ab105500c +Block 0025 [ 61]: d5e670d24870e38a +Block 0025 [ 62]: 73df25444586e7e5 +Block 0025 [ 63]: 3604c5115f172cd6 +Block 0025 [ 64]: 3ea3445257cc3d20 +Block 0025 [ 65]: 0bf5afbad73b5237 +Block 0025 [ 66]: daf94be6af7bf1a0 +Block 0025 [ 67]: 370dde956abb776e +Block 0025 [ 68]: 802bd2a5fa2661e7 +Block 0025 [ 69]: ae052a4ce269f03c +Block 0025 [ 70]: d6ca5a4ac9dd3989 +Block 0025 [ 71]: ef2f6fe0822d0e9d +Block 0025 [ 72]: 0f28e85470f7823a +Block 0025 [ 73]: 241bf3e44e28ec45 +Block 0025 [ 74]: f304a89cb0cc1ae4 +Block 0025 [ 75]: 1967071e8d5f3958 +Block 0025 [ 76]: 15f52e78a9be5e6f +Block 0025 [ 77]: 36eb08b3e5658be2 +Block 0025 [ 78]: d4cf1ad4b5a79ed1 +Block 0025 [ 79]: fd4e0abe38be5444 +Block 0025 [ 80]: 297b66d84318d18b +Block 0025 [ 81]: 49b339bf3e8d42f0 +Block 0025 [ 82]: f282d4d78d5450c8 +Block 0025 [ 83]: 0064797664727d25 +Block 0025 [ 84]: ccbc9790b4fd936f +Block 0025 [ 85]: 15ac480e2508669b +Block 0025 [ 86]: fea4af22a8cb5003 +Block 0025 [ 87]: 1b4b21e63b6e9cda +Block 0025 [ 88]: 47e39f00b6418d15 +Block 0025 [ 89]: 33cab571c1aa93fc +Block 0025 [ 90]: 4fdadc07cc36e16d +Block 0025 [ 91]: bcf8cbe2a449f361 +Block 0025 [ 92]: b180fbeff2434f3d +Block 0025 [ 93]: 450472dcb53e8d52 +Block 0025 [ 94]: 51a5bdfc173ca0c6 +Block 0025 [ 95]: eba8b59eedcfe0f9 +Block 0025 [ 96]: fbe4510c8c404a78 +Block 0025 [ 97]: 0ed380b414a806e8 +Block 0025 [ 98]: a601ac4334f312b4 +Block 0025 [ 99]: 4c3df8d16dcc6031 +Block 0025 [100]: a9ee4854b8c57d47 +Block 0025 [101]: abebcdf52911dca8 +Block 0025 [102]: 6099abea1e246362 +Block 0025 [103]: f5f62963254c90d9 +Block 0025 [104]: 6fbbb44ecb8ac43c +Block 0025 [105]: 6a1ed1569ec8b87e +Block 0025 [106]: 4ae870e93ab864c3 +Block 0025 [107]: 0f2d84f09dd60efd +Block 0025 [108]: 5d2f346e77e5f9aa +Block 0025 [109]: 6ee2faa370274d62 +Block 0025 [110]: c7ef7e1d468fafae +Block 0025 [111]: 45b5d7078557dfed +Block 0025 [112]: 1df7503c1707885b +Block 0025 [113]: cf4db59f80be2658 +Block 0025 [114]: d075daea15b69025 +Block 0025 [115]: d46e2b1666564126 +Block 0025 [116]: b20de022658b0937 +Block 0025 [117]: 5bbdd8ea5ac84fdc +Block 0025 [118]: d11604e8a302ef3d +Block 0025 [119]: b7989bb11e8896fe +Block 0025 [120]: cd1a256af97a7065 +Block 0025 [121]: 3be04657757ea2c6 +Block 0025 [122]: 2bf0875d14cfb3fe +Block 0025 [123]: 7a17400be50e0372 +Block 0025 [124]: cfb3e6c1c5b72e4e +Block 0025 [125]: 51f1f3f96adc1d38 +Block 0025 [126]: cb6895cf3808177e +Block 0025 [127]: c372ac9e2280b766 +Block 0026 [ 0]: d4644b09c003253e +Block 0026 [ 1]: 12f7dd4cf4963e9f +Block 0026 [ 2]: 475ce25005e2660c +Block 0026 [ 3]: 0ee5d9d17575e7a5 +Block 0026 [ 4]: bff637afde37cda0 +Block 0026 [ 5]: 652429dbc2fffdfb +Block 0026 [ 6]: 0d600cbf7fdb1a88 +Block 0026 [ 7]: 49d337d8aa97c307 +Block 0026 [ 8]: 753808c8f5df9e29 +Block 0026 [ 9]: 70d05d603f8072fc +Block 0026 [ 10]: 3e38c9a4da895bb4 +Block 0026 [ 11]: 75173dd8ccb661b9 +Block 0026 [ 12]: 1f0fa6398c2162f5 +Block 0026 [ 13]: 905141a22ebf8360 +Block 0026 [ 14]: a070815d16d7cc44 +Block 0026 [ 15]: b2e0243bca0b9076 +Block 0026 [ 16]: f2da1f4202bfdd0d +Block 0026 [ 17]: 29c4deffd4129b54 +Block 0026 [ 18]: 053ffdde9e7578a3 +Block 0026 [ 19]: 93d82106bf559278 +Block 0026 [ 20]: d0c048e1c812fb7e +Block 0026 [ 21]: 8a60d0a5eba8b872 +Block 0026 [ 22]: 93a6956d1f540594 +Block 0026 [ 23]: 68d6c2c6d0cc49dc +Block 0026 [ 24]: 24add3c074371dee +Block 0026 [ 25]: 98425302f639d739 +Block 0026 [ 26]: b0f100a24e4e3c5c +Block 0026 [ 27]: f04de3ee7d7b230f +Block 0026 [ 28]: eebe1a10cc7a109a +Block 0026 [ 29]: 286d1aa98409a5a9 +Block 0026 [ 30]: 998eb27d9099fab7 +Block 0026 [ 31]: 782979936291e152 +Block 0026 [ 32]: f6e7a458a0dd3f32 +Block 0026 [ 33]: 1eee46fd1322e250 +Block 0026 [ 34]: d3be4374c23bb5a3 +Block 0026 [ 35]: 36a7f2642043491f +Block 0026 [ 36]: 0d8bb89da3a2d8c3 +Block 0026 [ 37]: 92a7d48e3745a5f8 +Block 0026 [ 38]: 02d855e4fddf98c3 +Block 0026 [ 39]: 3bd76c9b741fc555 +Block 0026 [ 40]: 9a58c2c02a3e8bb0 +Block 0026 [ 41]: 0d5587098b39ec0b +Block 0026 [ 42]: 0573c24e48f0c8e1 +Block 0026 [ 43]: 124716b689c0b68e +Block 0026 [ 44]: e71a1a03bbb1d432 +Block 0026 [ 45]: dfec9f9aa29448dc +Block 0026 [ 46]: 96e73736125c28ef +Block 0026 [ 47]: 389e19fca6820912 +Block 0026 [ 48]: db4a9c13301cb73d +Block 0026 [ 49]: 64b8097bc2acee2e +Block 0026 [ 50]: 6f13f445b46f092f +Block 0026 [ 51]: 2ca17f8ca1d0c9f0 +Block 0026 [ 52]: ad6814b85cdc3d75 +Block 0026 [ 53]: a2e9688b5c45d0b6 +Block 0026 [ 54]: 13b9954b1eff332f +Block 0026 [ 55]: bfb42ee6c61c2332 +Block 0026 [ 56]: 84b305a26d7d025a +Block 0026 [ 57]: d3b86917d5344169 +Block 0026 [ 58]: 309d160aaf7f21ee +Block 0026 [ 59]: 3a613153a6461ad3 +Block 0026 [ 60]: 6289de5bb1473da6 +Block 0026 [ 61]: 2931e93ed65c9c23 +Block 0026 [ 62]: de5613d1dd794cb5 +Block 0026 [ 63]: 45348e49103c2238 +Block 0026 [ 64]: d75eb060ca91922b +Block 0026 [ 65]: 3e841a14d2279025 +Block 0026 [ 66]: cfe5bf05de6129e7 +Block 0026 [ 67]: cc13a37b4b7fdbd4 +Block 0026 [ 68]: 2cfc21d2a742ed01 +Block 0026 [ 69]: 48358561341ccf61 +Block 0026 [ 70]: 7bac9e21d22b5d0b +Block 0026 [ 71]: 3d4f67f5dd597ce2 +Block 0026 [ 72]: 4b3dece6f7e0b1ee +Block 0026 [ 73]: 821441b39b6550ed +Block 0026 [ 74]: 0e7ad63d6847df36 +Block 0026 [ 75]: d5b6800ce41af41a +Block 0026 [ 76]: 2ab97c68612fe7e6 +Block 0026 [ 77]: 6e1c48f0697fe866 +Block 0026 [ 78]: d91966706c816313 +Block 0026 [ 79]: c270124d3ba5d069 +Block 0026 [ 80]: 3b98e12b91834469 +Block 0026 [ 81]: 921de3f47bb28efa +Block 0026 [ 82]: a9ffcbbefa055af8 +Block 0026 [ 83]: fc739c1f52d29c26 +Block 0026 [ 84]: 51c10952e7468dfa +Block 0026 [ 85]: b36cda035eedcfca +Block 0026 [ 86]: 9345c125f02e59cd +Block 0026 [ 87]: 77c8410841bf9f1b +Block 0026 [ 88]: 45ebed6372f51109 +Block 0026 [ 89]: bde310d799c65859 +Block 0026 [ 90]: f6751c32b3de8aa5 +Block 0026 [ 91]: bfd9e8b6ec61500d +Block 0026 [ 92]: 3878727b18396b95 +Block 0026 [ 93]: c44e906a21a72ae0 +Block 0026 [ 94]: 0709e625a56972cd +Block 0026 [ 95]: 02e1c37389617f94 +Block 0026 [ 96]: be53ee0cd959341d +Block 0026 [ 97]: 149d1af43d748caa +Block 0026 [ 98]: 68a219dd25c29566 +Block 0026 [ 99]: a865c2b5613af47b +Block 0026 [100]: 926200d4e41c8575 +Block 0026 [101]: 66c9d78f346bddd6 +Block 0026 [102]: 8ca35ac9bc3429c0 +Block 0026 [103]: 5f6e6c772d04c958 +Block 0026 [104]: 6876462dcbd7cf6e +Block 0026 [105]: dc96acd154a932e8 +Block 0026 [106]: 169dd1dfed20ede8 +Block 0026 [107]: 427e326fc5947488 +Block 0026 [108]: d1f9248337185dd5 +Block 0026 [109]: ef948dfb4d3cfe6f +Block 0026 [110]: 7c3b1733fa34d810 +Block 0026 [111]: 4f3678050ba9b9a5 +Block 0026 [112]: 6d2b0ab3102f5e0c +Block 0026 [113]: 1b129019ac99b656 +Block 0026 [114]: 61b7cb5bf8d5bfe6 +Block 0026 [115]: 8a9962b673ceb4bd +Block 0026 [116]: 266264ff1a486ee8 +Block 0026 [117]: e9bae0cc052322f2 +Block 0026 [118]: 264fdf5a1384c5a3 +Block 0026 [119]: 0da1f3a192b8f17d +Block 0026 [120]: ab5b52630aee7555 +Block 0026 [121]: e1c6aca80af029b7 +Block 0026 [122]: 7faad66596f50406 +Block 0026 [123]: 0afb5266837fc857 +Block 0026 [124]: 49836a76ba3f17f5 +Block 0026 [125]: a4f2be896b9a7faa +Block 0026 [126]: 896d8796bedac776 +Block 0026 [127]: 54c0cec184484beb +Block 0027 [ 0]: f61ccbc977a56f2a +Block 0027 [ 1]: 16a2fc666566d811 +Block 0027 [ 2]: dbdcef27043ee92c +Block 0027 [ 3]: 7bf75d5f65e78a65 +Block 0027 [ 4]: 0a15def59f31c142 +Block 0027 [ 5]: 831022f386d0b2a2 +Block 0027 [ 6]: 932e0543e746b58a +Block 0027 [ 7]: 496766ab72544725 +Block 0027 [ 8]: 355cfe19f9116a8d +Block 0027 [ 9]: 88d0d1a1d56bef94 +Block 0027 [ 10]: 3d19de35a7a14699 +Block 0027 [ 11]: ae51010a38de2ffd +Block 0027 [ 12]: 801daa838f87964a +Block 0027 [ 13]: 07b4368ee07db13d +Block 0027 [ 14]: 50b5f86bff7d4ab8 +Block 0027 [ 15]: 9df3735a949255bd +Block 0027 [ 16]: a8f2cb1fccf4258e +Block 0027 [ 17]: b78d1707330d5940 +Block 0027 [ 18]: 22e52dec13656ede +Block 0027 [ 19]: d9169565e082d981 +Block 0027 [ 20]: 9201b66dd9cc75df +Block 0027 [ 21]: de3b5b1d58b0a378 +Block 0027 [ 22]: ac99bd46131880bc +Block 0027 [ 23]: 8ba435f5db7fd1a1 +Block 0027 [ 24]: bd66ac15d4312fd7 +Block 0027 [ 25]: d6ded2fbdcf07f22 +Block 0027 [ 26]: ffdd843379defc18 +Block 0027 [ 27]: 175c1d853ab71b75 +Block 0027 [ 28]: aa2852e60c337b14 +Block 0027 [ 29]: 4b653b3ba64d4260 +Block 0027 [ 30]: c87559ba9bdc7d9d +Block 0027 [ 31]: 269034d8bf7b97f2 +Block 0027 [ 32]: bc6aa987a9a62dae +Block 0027 [ 33]: 90d49b0713c77323 +Block 0027 [ 34]: c48082b5b4a54927 +Block 0027 [ 35]: 51b5179740948ce8 +Block 0027 [ 36]: a68528d3e9f7ec4d +Block 0027 [ 37]: d4ffa0faa6cc3e32 +Block 0027 [ 38]: e1a43960e3fe86e0 +Block 0027 [ 39]: 9ed0c70304b2b51c +Block 0027 [ 40]: b89813269c079a30 +Block 0027 [ 41]: 8feb1556e23194f2 +Block 0027 [ 42]: bd439d3c8324dd8f +Block 0027 [ 43]: 647365a561b4f90d +Block 0027 [ 44]: d112b5668642c8d7 +Block 0027 [ 45]: fedfa6bc506a5cca +Block 0027 [ 46]: 8f3a47e825ac7e6e +Block 0027 [ 47]: 5974748b49bf0f5b +Block 0027 [ 48]: d1712b6d08e1775e +Block 0027 [ 49]: 7d63514c4c7b44e7 +Block 0027 [ 50]: d276fe180222463a +Block 0027 [ 51]: d409b7d46cbb8991 +Block 0027 [ 52]: c8bde5ae23928e0c +Block 0027 [ 53]: 257f8a112f710427 +Block 0027 [ 54]: 99307b3d2515b0b5 +Block 0027 [ 55]: 56f7bffe335d7bdb +Block 0027 [ 56]: 36bcfee53e19166b +Block 0027 [ 57]: f4ec1ab9701e3895 +Block 0027 [ 58]: 1c5df9cda8fc7cd6 +Block 0027 [ 59]: fb688c2afeeaa596 +Block 0027 [ 60]: 50b6afe08a28dafb +Block 0027 [ 61]: 64ab62e27c9d676d +Block 0027 [ 62]: 573e46f4f67708fb +Block 0027 [ 63]: 63659fcb0d92a75b +Block 0027 [ 64]: 51f92b0593c5b597 +Block 0027 [ 65]: 3f9a9f503844da60 +Block 0027 [ 66]: 2784db967aa7752a +Block 0027 [ 67]: 83f1a4885aba587c +Block 0027 [ 68]: c736f3d979e01d86 +Block 0027 [ 69]: 838c3a38d5df2224 +Block 0027 [ 70]: f5101255016d63fa +Block 0027 [ 71]: 6a2d21ac3cdb4216 +Block 0027 [ 72]: 5dfdfc52471007a6 +Block 0027 [ 73]: 8e0494b3ae831e6e +Block 0027 [ 74]: 0ca49adfe68d6e46 +Block 0027 [ 75]: e212b64996b824ec +Block 0027 [ 76]: 3bf7a8b725b94547 +Block 0027 [ 77]: 0c70cff5245765dc +Block 0027 [ 78]: b02efdf665ad2ce7 +Block 0027 [ 79]: add07405dc8f4bbb +Block 0027 [ 80]: 58bdb3ce3fa596ce +Block 0027 [ 81]: f46e119a901ef320 +Block 0027 [ 82]: 3d9b2c5765e6a815 +Block 0027 [ 83]: 8bc0e93794000096 +Block 0027 [ 84]: 3f2ef8e5cc121cf8 +Block 0027 [ 85]: 9c16d0dcf88aa1e4 +Block 0027 [ 86]: d12ace2887043640 +Block 0027 [ 87]: c8264013644d8e79 +Block 0027 [ 88]: 30e6157603308b2e +Block 0027 [ 89]: 5e5f2fe403cf044e +Block 0027 [ 90]: ccbad96f2d1ab536 +Block 0027 [ 91]: b036220cbfe7a195 +Block 0027 [ 92]: d80a67932c54111f +Block 0027 [ 93]: c3d187db6e9107e0 +Block 0027 [ 94]: 753b5db43665d4b8 +Block 0027 [ 95]: db0ff374dbaa1a09 +Block 0027 [ 96]: 514410f945dd118f +Block 0027 [ 97]: 57be8156f07071d6 +Block 0027 [ 98]: 20831c61b0b1efb2 +Block 0027 [ 99]: 66ffa9cc28cb58df +Block 0027 [100]: 5277e5ed3417bb29 +Block 0027 [101]: 74cd388100954b51 +Block 0027 [102]: 3f77adb63994e9cc +Block 0027 [103]: b114e4175adb6f67 +Block 0027 [104]: 584c55bf7efe2059 +Block 0027 [105]: f761b03aca13740b +Block 0027 [106]: f43ef2edb5b1c54f +Block 0027 [107]: f79c3eb23dbfc248 +Block 0027 [108]: 81cd4a75d42e1e27 +Block 0027 [109]: 3166561195b94ac4 +Block 0027 [110]: 826f483d5befa9ee +Block 0027 [111]: 1d9d8e376a6f48b8 +Block 0027 [112]: 25017bc5b9a0dd4c +Block 0027 [113]: 15f0fbf1e2f697ce +Block 0027 [114]: 9418301b7413dc13 +Block 0027 [115]: 6d4eb8ca015f7bd9 +Block 0027 [116]: 55cf81dd7bf59dab +Block 0027 [117]: 3acfb1bf664fac56 +Block 0027 [118]: 998d482b2c6fafff +Block 0027 [119]: ba9136aaac2f7dd8 +Block 0027 [120]: 3c057d31fb558e0e +Block 0027 [121]: c6b8fa4d73cfe12f +Block 0027 [122]: 4afd2610bce623fc +Block 0027 [123]: 8735afac2aef1c73 +Block 0027 [124]: d10aa2652a6b0eda +Block 0027 [125]: 66f953bde6d06ea7 +Block 0027 [126]: 39652bf53e0ee8e6 +Block 0027 [127]: 89a6db078ffde367 +Block 0028 [ 0]: 088aac2c3857a577 +Block 0028 [ 1]: a0b6fed09124ac4b +Block 0028 [ 2]: 362ffa99f02943c9 +Block 0028 [ 3]: 642585817f143c4a +Block 0028 [ 4]: 208cdb81bd9b3d70 +Block 0028 [ 5]: 0e8678f22bebe281 +Block 0028 [ 6]: f1c23f381e42bffe +Block 0028 [ 7]: 80239e3f68f08461 +Block 0028 [ 8]: a1a3854533eff47b +Block 0028 [ 9]: cef9e5e06b8f5d1c +Block 0028 [ 10]: 4b500e643d6e2a75 +Block 0028 [ 11]: cd40cd86e0c473d1 +Block 0028 [ 12]: a0f5a6551cf8b3a5 +Block 0028 [ 13]: 966f11064e299e87 +Block 0028 [ 14]: eb918189c4486e01 +Block 0028 [ 15]: c52bd0d591f11524 +Block 0028 [ 16]: d85699f0dd4d09cb +Block 0028 [ 17]: a998379519b903d2 +Block 0028 [ 18]: 8233976a1289a10d +Block 0028 [ 19]: a908225bc32e5bbb +Block 0028 [ 20]: b783103dd9dbcc87 +Block 0028 [ 21]: e179ccd6917bcd5c +Block 0028 [ 22]: ddca54948b1a3d91 +Block 0028 [ 23]: 02bd15a442b61f38 +Block 0028 [ 24]: f9a5a27a56dd5c77 +Block 0028 [ 25]: d1922e84331e4a15 +Block 0028 [ 26]: 0968424d0a903155 +Block 0028 [ 27]: fbb63f95b1027d55 +Block 0028 [ 28]: 9b1be6806db0be87 +Block 0028 [ 29]: b21ddfd09c727934 +Block 0028 [ 30]: 0d277d7fe3649aa5 +Block 0028 [ 31]: dae278bdc8f4e2c0 +Block 0028 [ 32]: 709a6d6c85fa293e +Block 0028 [ 33]: a842ba1029339035 +Block 0028 [ 34]: 168829ae6706aa0a +Block 0028 [ 35]: 3f984a5e4fdb2013 +Block 0028 [ 36]: adbe084b6c4dcc9a +Block 0028 [ 37]: 9700c392f4b4bf99 +Block 0028 [ 38]: a35e4e093e46bda8 +Block 0028 [ 39]: dc1d5c11087128cb +Block 0028 [ 40]: 6a88231cbb42f9ef +Block 0028 [ 41]: b06b59352d903657 +Block 0028 [ 42]: dd2d0e40b3c26c89 +Block 0028 [ 43]: 52394f18a73620fa +Block 0028 [ 44]: c4549f455acd5498 +Block 0028 [ 45]: 9a84a37bebc72e51 +Block 0028 [ 46]: 9ab08cb35b3a30b0 +Block 0028 [ 47]: bb110b5dbe5976d9 +Block 0028 [ 48]: ba0bbf9ea786754d +Block 0028 [ 49]: 13b07b4afb7dcee3 +Block 0028 [ 50]: fa94d4c9fcc3234d +Block 0028 [ 51]: 5adba4b8489fc0e2 +Block 0028 [ 52]: 1c0b608a49d31305 +Block 0028 [ 53]: 1ed3c3c41a036183 +Block 0028 [ 54]: f0f0b7a20ef30fb0 +Block 0028 [ 55]: 3303b0304d01be85 +Block 0028 [ 56]: f1c10f3b34586772 +Block 0028 [ 57]: 37bf3b20abe148dd +Block 0028 [ 58]: 08dd78d309816e36 +Block 0028 [ 59]: 606df5b9c82c35fa +Block 0028 [ 60]: a93bcb45203e4766 +Block 0028 [ 61]: 18e782252b192fe5 +Block 0028 [ 62]: a5b432fe27b22a6b +Block 0028 [ 63]: 815befa4dbfb304c +Block 0028 [ 64]: 44b8a91d7d1945c3 +Block 0028 [ 65]: 5fe76cf485a03ea3 +Block 0028 [ 66]: 6d39d90222a44ea5 +Block 0028 [ 67]: 5b6a2edd580ba743 +Block 0028 [ 68]: 440f7c6240bb750a +Block 0028 [ 69]: d2b85d4e3d80d7a3 +Block 0028 [ 70]: 4d28137d3f7ded74 +Block 0028 [ 71]: de28ddfce56388df +Block 0028 [ 72]: a2108b11c471e2d4 +Block 0028 [ 73]: 4298b69f391e4244 +Block 0028 [ 74]: ac65036956570a74 +Block 0028 [ 75]: c45a698f324c1be7 +Block 0028 [ 76]: 89bde3ac62e3798f +Block 0028 [ 77]: 9b5ba6bd4a39a824 +Block 0028 [ 78]: 06a98f7479d97126 +Block 0028 [ 79]: 9fb5f80568d1e565 +Block 0028 [ 80]: 25da5865646da062 +Block 0028 [ 81]: 056993803daee9e4 +Block 0028 [ 82]: d79b510e6a2497ad +Block 0028 [ 83]: e57cccea49ab9d2e +Block 0028 [ 84]: 0573cd7a8a9f686b +Block 0028 [ 85]: e0bdb3957003d683 +Block 0028 [ 86]: 4cf9e311e9eb0697 +Block 0028 [ 87]: 1de23f2b155fa2c6 +Block 0028 [ 88]: 713f6f60a9ac9366 +Block 0028 [ 89]: 40660511f45d715c +Block 0028 [ 90]: 3d044bc452be348e +Block 0028 [ 91]: b1a3d26f9109e36c +Block 0028 [ 92]: b70831d9b9ad1111 +Block 0028 [ 93]: 45df8d4fca891faa +Block 0028 [ 94]: d71dac9055088d48 +Block 0028 [ 95]: 13a504472229514e +Block 0028 [ 96]: 8d8bd291fe868bfd +Block 0028 [ 97]: 1f66d37590815231 +Block 0028 [ 98]: b859beb049bd4b66 +Block 0028 [ 99]: 89829ed4ffb5170b +Block 0028 [100]: 52e8375395a467d7 +Block 0028 [101]: dcca6c6931e8cdde +Block 0028 [102]: 00f90463fbd8fc5a +Block 0028 [103]: 0a5f42e01c5b667b +Block 0028 [104]: e46cf47f24bedf8e +Block 0028 [105]: 034b1dd0073689d1 +Block 0028 [106]: a612861d03331e5f +Block 0028 [107]: 68ac52c319095484 +Block 0028 [108]: 350bc6c86e048311 +Block 0028 [109]: c1ae658f7f8af644 +Block 0028 [110]: 3c4c6ec5e982d732 +Block 0028 [111]: 3a7dea9db1cf7e6f +Block 0028 [112]: a00f6c189a25561f +Block 0028 [113]: d705eb5c682176f3 +Block 0028 [114]: 8195aed15af503da +Block 0028 [115]: 6ea0bc3009ae67b9 +Block 0028 [116]: bb40bd941cefcc70 +Block 0028 [117]: 60f5cc6a11061338 +Block 0028 [118]: 51e2aef2ef59d60e +Block 0028 [119]: b70676b31c174219 +Block 0028 [120]: 6a2ba18907524637 +Block 0028 [121]: 9d7c64aefab310f4 +Block 0028 [122]: 997067b75f51b90e +Block 0028 [123]: dc3bfa47e95a49a6 +Block 0028 [124]: eaec533ed804b5b7 +Block 0028 [125]: 5547101d57e37aef +Block 0028 [126]: 799dfdd22151025a +Block 0028 [127]: 90cc16f473dba724 +Block 0029 [ 0]: 572f1144c32f7dab +Block 0029 [ 1]: c31548f5a66c3fb6 +Block 0029 [ 2]: ca490b90ff80f8de +Block 0029 [ 3]: b146116df806ef35 +Block 0029 [ 4]: 6d600a5153b6a469 +Block 0029 [ 5]: 2da404efd679d833 +Block 0029 [ 6]: dbeb8ec42cc45f9e +Block 0029 [ 7]: 88739fea24e59cca +Block 0029 [ 8]: ca9ff1be0ebab86c +Block 0029 [ 9]: 7cdd3f4397352ced +Block 0029 [ 10]: e41b1f1cf69b0cc6 +Block 0029 [ 11]: 7e8932d1c89a6ed9 +Block 0029 [ 12]: 046c06abfd2f94e4 +Block 0029 [ 13]: 2a9fdb55d946d935 +Block 0029 [ 14]: 1eb8f81ae510e952 +Block 0029 [ 15]: 081ea3edc46f7990 +Block 0029 [ 16]: f189d1aa25714359 +Block 0029 [ 17]: 2614f7d8b82ca013 +Block 0029 [ 18]: 58787f4689125662 +Block 0029 [ 19]: 1e9f16c6744d5785 +Block 0029 [ 20]: 171cf29f14bcee0c +Block 0029 [ 21]: 9bdbd58787ca6a0c +Block 0029 [ 22]: 375d6ea49ab671d6 +Block 0029 [ 23]: 2ccefc0df4a3db19 +Block 0029 [ 24]: 5e2503088efa948f +Block 0029 [ 25]: a78105b291f531e6 +Block 0029 [ 26]: 418f0c8f58232cfa +Block 0029 [ 27]: bb3151e53430f7c0 +Block 0029 [ 28]: c080596a5a33fdc0 +Block 0029 [ 29]: ab40cbac0a446b74 +Block 0029 [ 30]: a4d39e0180a840d8 +Block 0029 [ 31]: e486a9d4701353a1 +Block 0029 [ 32]: 1980896626f0214c +Block 0029 [ 33]: 5e2b407a0b8452aa +Block 0029 [ 34]: 0ff5680993263bea +Block 0029 [ 35]: d8f68bc617df56c1 +Block 0029 [ 36]: 7a09a3bc6e3f2115 +Block 0029 [ 37]: 3de17c917e933d70 +Block 0029 [ 38]: 7d5f24bffa2f5bb0 +Block 0029 [ 39]: 28dbfce634746d88 +Block 0029 [ 40]: 378806628dd28ec9 +Block 0029 [ 41]: 531568e58a28c770 +Block 0029 [ 42]: 31228f6199722c5a +Block 0029 [ 43]: 1ed5d3b9e627c8c4 +Block 0029 [ 44]: 608a0a1d3af68c46 +Block 0029 [ 45]: 973dcfd310312d48 +Block 0029 [ 46]: 813e441942018cb7 +Block 0029 [ 47]: 13dc1955ca36589b +Block 0029 [ 48]: 7e5ead81cdeda257 +Block 0029 [ 49]: 0f4367bbc560ef51 +Block 0029 [ 50]: 5dc3771d1decf53d +Block 0029 [ 51]: cfbec72c90933cf2 +Block 0029 [ 52]: c1a6158ea9e320aa +Block 0029 [ 53]: 33c06d86c91ed670 +Block 0029 [ 54]: 85467d056d9b4f04 +Block 0029 [ 55]: 4a039fca79da2fb7 +Block 0029 [ 56]: d3b862a69ea8455a +Block 0029 [ 57]: 8df2d2a5ef2884d2 +Block 0029 [ 58]: ded0120bb11702e2 +Block 0029 [ 59]: 7c9c6143da42a5a2 +Block 0029 [ 60]: 8f5e253428b8c855 +Block 0029 [ 61]: 5bf874199625330c +Block 0029 [ 62]: b93ce12a653f7d23 +Block 0029 [ 63]: 67a439b00b8e30f7 +Block 0029 [ 64]: c266ff756d585cb8 +Block 0029 [ 65]: 1e42a8b331e42a23 +Block 0029 [ 66]: 7a160fbda5d05715 +Block 0029 [ 67]: 12920934bcce7a7a +Block 0029 [ 68]: 9c3f9b96c11b8bc7 +Block 0029 [ 69]: 1597088b19ac236a +Block 0029 [ 70]: f0211c610b4e66ca +Block 0029 [ 71]: a6ecc66bab3fcf49 +Block 0029 [ 72]: 3c16a295685c5d8a +Block 0029 [ 73]: c0d3f25b295e2acc +Block 0029 [ 74]: 6a25ba69a766c8aa +Block 0029 [ 75]: 15dac6fcd74d2ca7 +Block 0029 [ 76]: d66ee559cf707ee1 +Block 0029 [ 77]: 376cf4b0a389b1d1 +Block 0029 [ 78]: 95b7cccaa711e62a +Block 0029 [ 79]: 045137ff521630b6 +Block 0029 [ 80]: e80209e08c0b77d4 +Block 0029 [ 81]: 6f7d6fdb47d99fa6 +Block 0029 [ 82]: ca327877c6ea5a6c +Block 0029 [ 83]: aa2e63dc8dfa2102 +Block 0029 [ 84]: 6d074e9ebe45b594 +Block 0029 [ 85]: 43b8a4e840ade226 +Block 0029 [ 86]: 270b901b540052b0 +Block 0029 [ 87]: 4dfddc88d72aeff2 +Block 0029 [ 88]: 8bf43db820319d2f +Block 0029 [ 89]: 331ca9d80f2ec3e0 +Block 0029 [ 90]: 060830ef760715bc +Block 0029 [ 91]: 8a8325d30998d393 +Block 0029 [ 92]: aeaa2f11004e419d +Block 0029 [ 93]: fa8d7e4b5e7ab8c8 +Block 0029 [ 94]: 1baabae972b14d49 +Block 0029 [ 95]: 76d1394e3ba03bd8 +Block 0029 [ 96]: a0a0953687d17827 +Block 0029 [ 97]: 051b864ddf100caf +Block 0029 [ 98]: 514e508badc56cbf +Block 0029 [ 99]: d7a8c578e557b1d5 +Block 0029 [100]: caed014550fae99b +Block 0029 [101]: 0836242ac75e3bdb +Block 0029 [102]: 64a6302124675915 +Block 0029 [103]: f1c003c69d8e303f +Block 0029 [104]: fa0d37a15250c31c +Block 0029 [105]: f8e1724351bba255 +Block 0029 [106]: 667b6b5f6cc79af9 +Block 0029 [107]: ddc2b84fd4bd3e79 +Block 0029 [108]: 50d991c07f996c66 +Block 0029 [109]: 02c92496716cf522 +Block 0029 [110]: 04ab44d396d9c9c4 +Block 0029 [111]: 96c9ae1f87be0ad7 +Block 0029 [112]: f7796644baaf6e90 +Block 0029 [113]: 0f249954ee125408 +Block 0029 [114]: b0d2205cb60bf289 +Block 0029 [115]: b9c5ec1762ebc57c +Block 0029 [116]: 31f029ed8dfc27dd +Block 0029 [117]: 0893c028683bf03b +Block 0029 [118]: e830266fd7940a0e +Block 0029 [119]: 5485c0e009244e39 +Block 0029 [120]: a0432c001528bd5b +Block 0029 [121]: b0d05b8d644891d9 +Block 0029 [122]: 83199ca64c50deef +Block 0029 [123]: f26cb6a7a2b998aa +Block 0029 [124]: 05006e76730d7ad4 +Block 0029 [125]: cb1707a747abe93c +Block 0029 [126]: ca20245fdf028ad9 +Block 0029 [127]: 0eaa767ba568dda0 +Block 0030 [ 0]: 35eec3a1bdd9dcdf +Block 0030 [ 1]: b6d1023e5b82a174 +Block 0030 [ 2]: 5a08eb6fc3b96090 +Block 0030 [ 3]: c22a681ecb82a62d +Block 0030 [ 4]: 5cf2c83f5feaf5bb +Block 0030 [ 5]: d58d528b0d9792a8 +Block 0030 [ 6]: e269e6a6101c9310 +Block 0030 [ 7]: 0c71f9e54ed5b711 +Block 0030 [ 8]: daa5bc93c7835c15 +Block 0030 [ 9]: 0e733d8eafc9075d +Block 0030 [ 10]: a98ad05698c3ebb9 +Block 0030 [ 11]: cad1a03b880005b8 +Block 0030 [ 12]: 264d34c610ff7458 +Block 0030 [ 13]: 8120a277df740d4a +Block 0030 [ 14]: 0f0df615f4690f6e +Block 0030 [ 15]: 460c0f1ebed7ba74 +Block 0030 [ 16]: 98b68c7ea1bfc4dc +Block 0030 [ 17]: 0c3770b51f0ef728 +Block 0030 [ 18]: bf5a91880cec573b +Block 0030 [ 19]: 00dec1a05964e9c8 +Block 0030 [ 20]: 91472db675baf6aa +Block 0030 [ 21]: 57b966cc8b970571 +Block 0030 [ 22]: fe83863b3b423d83 +Block 0030 [ 23]: c4511487b6e058bf +Block 0030 [ 24]: f866ad2a5e3ef155 +Block 0030 [ 25]: d00d1a3b6d7e2143 +Block 0030 [ 26]: 09ccaa4d528b7f6f +Block 0030 [ 27]: 443a1754209266bb +Block 0030 [ 28]: 0658c243f1d4e623 +Block 0030 [ 29]: 1f15e52d01020370 +Block 0030 [ 30]: 3d29b62d3a00e90f +Block 0030 [ 31]: c801d874113fb712 +Block 0030 [ 32]: 31f1a0f6fa357f53 +Block 0030 [ 33]: d8a3901a28ad6915 +Block 0030 [ 34]: 6514a01c4bba4865 +Block 0030 [ 35]: 96d805c9c39a91fa +Block 0030 [ 36]: 0b53a27c8f27fbba +Block 0030 [ 37]: 61135b0d7c903e3c +Block 0030 [ 38]: 02a6bcae74e89195 +Block 0030 [ 39]: 0183b5104d995a56 +Block 0030 [ 40]: 8e6f77bb221c1b2f +Block 0030 [ 41]: 94257e6f522ab7e9 +Block 0030 [ 42]: 7935f5eb602ae0f0 +Block 0030 [ 43]: c190b3613d89e268 +Block 0030 [ 44]: fa8027f56884201f +Block 0030 [ 45]: 8452d5d1e97c7b9a +Block 0030 [ 46]: a744289083376f31 +Block 0030 [ 47]: 955ea0a65d356d40 +Block 0030 [ 48]: c7e8ebd7c1035444 +Block 0030 [ 49]: 32ee6c0c63df2a06 +Block 0030 [ 50]: c9c50a65fdcfa136 +Block 0030 [ 51]: 7c3949da834717e4 +Block 0030 [ 52]: 749ee2a2e64ef7e2 +Block 0030 [ 53]: 354171f4cf739fe8 +Block 0030 [ 54]: 6acdc20bc8cfff15 +Block 0030 [ 55]: 16332b8970b0b731 +Block 0030 [ 56]: 39a030c4e7303b1e +Block 0030 [ 57]: 0a8c7141990a51fd +Block 0030 [ 58]: 4994ff90a28e39d3 +Block 0030 [ 59]: 2b5f4aa3c04531ec +Block 0030 [ 60]: b4ca924c16740047 +Block 0030 [ 61]: 907c8e5f7fdac555 +Block 0030 [ 62]: 663590f5934b831a +Block 0030 [ 63]: 4814910e7ae9334e +Block 0030 [ 64]: 42f7f287225986de +Block 0030 [ 65]: a0a7c150090e9296 +Block 0030 [ 66]: e280f437ed51ac54 +Block 0030 [ 67]: 3aa6abcd3a48d52f +Block 0030 [ 68]: 4f3401719d462eb9 +Block 0030 [ 69]: f834a32b293e01bd +Block 0030 [ 70]: c2810f77328910af +Block 0030 [ 71]: 627f172bf1a181f2 +Block 0030 [ 72]: 64d92ef494745621 +Block 0030 [ 73]: 2cf202565cc16c7d +Block 0030 [ 74]: 737df2974bcb0abf +Block 0030 [ 75]: acf603206208444f +Block 0030 [ 76]: fa6edee39a5297d3 +Block 0030 [ 77]: cc4623ae6d994d2a +Block 0030 [ 78]: fd3675f83fde5920 +Block 0030 [ 79]: 2bb1331f7bd2ea92 +Block 0030 [ 80]: fb52ae43c3c284dd +Block 0030 [ 81]: 4825a51327dd0b90 +Block 0030 [ 82]: 45bd078cd0197078 +Block 0030 [ 83]: 71c34f74f169fa00 +Block 0030 [ 84]: ef1ad43c0d37519f +Block 0030 [ 85]: be67d13de95a25ac +Block 0030 [ 86]: 5629c929e6e1b125 +Block 0030 [ 87]: 91af1482e10844f5 +Block 0030 [ 88]: dcf844cf39afaf79 +Block 0030 [ 89]: e47b0b0d29cfaf1f +Block 0030 [ 90]: ac6f4fee2312428c +Block 0030 [ 91]: 3c8a03041548a4d3 +Block 0030 [ 92]: c34935ad9024a98e +Block 0030 [ 93]: 3282a01b8e51f0b2 +Block 0030 [ 94]: 48c5ff2f324f1d28 +Block 0030 [ 95]: 6b35fc1a36a9ecf6 +Block 0030 [ 96]: a41e7feb2b71d512 +Block 0030 [ 97]: e94cecb45a14c029 +Block 0030 [ 98]: 5aa3f223b12c8de9 +Block 0030 [ 99]: c6d730ea67389b8c +Block 0030 [100]: d488cfc4528666c0 +Block 0030 [101]: 600f2ccc30b2208b +Block 0030 [102]: 8d5c68cd498eb292 +Block 0030 [103]: 5f909bb9f8fc4aae +Block 0030 [104]: 033d0c61f989ea55 +Block 0030 [105]: 8a5c19ca84fb2c16 +Block 0030 [106]: a1b0a2c8dcc38ad5 +Block 0030 [107]: 8603876466cd7a1d +Block 0030 [108]: 6a282ca5a8f9dee4 +Block 0030 [109]: 0ded75533e1fa4d0 +Block 0030 [110]: 605949936666b3a5 +Block 0030 [111]: 5103e954515f21a5 +Block 0030 [112]: bf640ae5e6d30198 +Block 0030 [113]: 501e4517d702b2bd +Block 0030 [114]: bbb83c6ed92fde1d +Block 0030 [115]: e24b7bf1f4048387 +Block 0030 [116]: 27a75bde0d4482a5 +Block 0030 [117]: 1fee004f4ea1caa8 +Block 0030 [118]: a35697de43230d57 +Block 0030 [119]: 8e1a3dee6d4fc04e +Block 0030 [120]: 7137020314cc8f22 +Block 0030 [121]: b7df79f263c55815 +Block 0030 [122]: 5ae620c98adcc163 +Block 0030 [123]: 6f3cdde1d908d6cd +Block 0030 [124]: 0df0a1525bb95f5a +Block 0030 [125]: 8ec8f8c55d340d8a +Block 0030 [126]: a350788bd3453cc8 +Block 0030 [127]: 6d8d2e9626e4a502 +Block 0031 [ 0]: 17f04bbc11e7dc2d +Block 0031 [ 1]: 56fa16e87ce4a877 +Block 0031 [ 2]: 414aacac928886f9 +Block 0031 [ 3]: c278b12dd24e8545 +Block 0031 [ 4]: 900bbae93aa324a2 +Block 0031 [ 5]: e565209f68e87880 +Block 0031 [ 6]: e12768818997bd3a +Block 0031 [ 7]: ec463ae609e2980d +Block 0031 [ 8]: ef1eda834df17eed +Block 0031 [ 9]: ea6c80cd4897d934 +Block 0031 [ 10]: 4759ca11b6b43585 +Block 0031 [ 11]: 0a700649d273d4ff +Block 0031 [ 12]: a0292650159af12c +Block 0031 [ 13]: 5c51f53ededcb01d +Block 0031 [ 14]: b1eb730446485b2a +Block 0031 [ 15]: 28e955476e94c4c8 +Block 0031 [ 16]: cda545bde429a516 +Block 0031 [ 17]: a163659a8296eb0f +Block 0031 [ 18]: 554ef34819b72063 +Block 0031 [ 19]: 593178b25e0048b1 +Block 0031 [ 20]: 466f63e300bd02de +Block 0031 [ 21]: cd588de4d77a35cb +Block 0031 [ 22]: d1ebe193548aa8ac +Block 0031 [ 23]: 660dfe5583b59609 +Block 0031 [ 24]: 7caa8441a5730345 +Block 0031 [ 25]: ccc888ec843789e4 +Block 0031 [ 26]: 9103953a6cf5c334 +Block 0031 [ 27]: 5c422704f88d39ba +Block 0031 [ 28]: c8be51040c12db07 +Block 0031 [ 29]: 84858398a40042ad +Block 0031 [ 30]: dfcaa049225d167c +Block 0031 [ 31]: 98f2cc9f4e4258d0 +Block 0031 [ 32]: f3fae3fa4db6bfb0 +Block 0031 [ 33]: 8bfa9c45c8a401d2 +Block 0031 [ 34]: ab66cd15c2f7af11 +Block 0031 [ 35]: 62e64fbaf0892bb1 +Block 0031 [ 36]: 078c18524a46e818 +Block 0031 [ 37]: 8f6b27dda6f09cb9 +Block 0031 [ 38]: a906170570ca0e20 +Block 0031 [ 39]: 44369154789511f4 +Block 0031 [ 40]: 4f859124dc22dc99 +Block 0031 [ 41]: d968707bbce205da +Block 0031 [ 42]: 7ff0fd984ff0a1c6 +Block 0031 [ 43]: b944db9fec0c5cb1 +Block 0031 [ 44]: 5f54ca0bce6d4739 +Block 0031 [ 45]: 3c1776b8a9b1e6a0 +Block 0031 [ 46]: f4243052fe6111ac +Block 0031 [ 47]: 09731689890469fd +Block 0031 [ 48]: ee8c13fe19a0fc7d +Block 0031 [ 49]: cca002284ad8f54c +Block 0031 [ 50]: 11e37c8ef20aae2d +Block 0031 [ 51]: 8af27a895dc48c82 +Block 0031 [ 52]: 807a0952da78d9cf +Block 0031 [ 53]: bad0e80749fe807e +Block 0031 [ 54]: 076a367d0ed3de20 +Block 0031 [ 55]: 4c8f43e0f8ea7a22 +Block 0031 [ 56]: 02000f1a9bd4d6d9 +Block 0031 [ 57]: 25f514284bf170c0 +Block 0031 [ 58]: ebf76a18430a3683 +Block 0031 [ 59]: 9d7f67409a259d66 +Block 0031 [ 60]: 3b50b369a4c34bd1 +Block 0031 [ 61]: f385dcc6299ce473 +Block 0031 [ 62]: 1d22709b4dd07705 +Block 0031 [ 63]: 92ff35c57fb9a700 +Block 0031 [ 64]: 0d50a1ac1ca57f4b +Block 0031 [ 65]: 7ee41d83eb6124ab +Block 0031 [ 66]: 5691ff7e8fa8e58a +Block 0031 [ 67]: b3e4310469c63efa +Block 0031 [ 68]: e24a8771310b52a2 +Block 0031 [ 69]: a733c130da1b32eb +Block 0031 [ 70]: 44c32f9cd6c3ed90 +Block 0031 [ 71]: 4b20203253583d31 +Block 0031 [ 72]: 996147e6477e0ad6 +Block 0031 [ 73]: d86db7272010bbeb +Block 0031 [ 74]: c7fc45ee0dec0947 +Block 0031 [ 75]: 25a1645723db3526 +Block 0031 [ 76]: 7da54338e579e32d +Block 0031 [ 77]: 5f29c738c150bb1f +Block 0031 [ 78]: 34dcc2d8376aeb0e +Block 0031 [ 79]: 1921234d4052d257 +Block 0031 [ 80]: 004f0640368bd0c2 +Block 0031 [ 81]: 89f931c647d8f9b4 +Block 0031 [ 82]: 1f4a7045198e2d2a +Block 0031 [ 83]: e49345423ffa0203 +Block 0031 [ 84]: 42f67a45efede962 +Block 0031 [ 85]: 51ebcf52c66ad71b +Block 0031 [ 86]: 8c93f1d50c18862c +Block 0031 [ 87]: f9cbe34de0b63e22 +Block 0031 [ 88]: dc02d2c3e2a0e1d2 +Block 0031 [ 89]: f8fe0b8ce04e52f2 +Block 0031 [ 90]: 08b3785b2ed9f6b4 +Block 0031 [ 91]: a39851d6ab2f3f70 +Block 0031 [ 92]: b69af0d633f40c6e +Block 0031 [ 93]: 9a1aaa50cc9336ca +Block 0031 [ 94]: 64455ddbd424fb68 +Block 0031 [ 95]: 512cadd6b83a7da9 +Block 0031 [ 96]: 74439d194a299b98 +Block 0031 [ 97]: 09e7891d17775e57 +Block 0031 [ 98]: 863f478b9c56d481 +Block 0031 [ 99]: 0156ad653deb9a3a +Block 0031 [100]: 35ef7b185e953464 +Block 0031 [101]: bb34f03813de8918 +Block 0031 [102]: f73a6350becbab3b +Block 0031 [103]: a1dedf24e6b0e9aa +Block 0031 [104]: b61134a8ce3b8f8d +Block 0031 [105]: 5c24eb885f2838ec +Block 0031 [106]: c74db3229966d2b3 +Block 0031 [107]: 7f146ecea2afb556 +Block 0031 [108]: b59cbee73722bfe7 +Block 0031 [109]: 97a08d2807abf018 +Block 0031 [110]: a202a7d3bc2c1631 +Block 0031 [111]: f0f2c48ba5fb6065 +Block 0031 [112]: 669d543a28958dca +Block 0031 [113]: 3384de016a7ddbbf +Block 0031 [114]: a5881297663e6707 +Block 0031 [115]: a70d745c38904dc4 +Block 0031 [116]: 9f4d179cc16fe173 +Block 0031 [117]: aa6771a8009e295e +Block 0031 [118]: fb1a4e991991c6f3 +Block 0031 [119]: f2505e38b73a62ea +Block 0031 [120]: b3016d3b6191fc27 +Block 0031 [121]: 9fb9d1486ebe88c8 +Block 0031 [122]: a37b0ffd9bee0c99 +Block 0031 [123]: ff109aeefd852972 +Block 0031 [124]: 7f7e2156c126d827 +Block 0031 [125]: 8d0ed8ad89cac26e +Block 0031 [126]: ca21425508286511 +Block 0031 [127]: c5a87589413a5f41 + + After pass 1: +Block 0000 [ 0]: e9550cb7441be892 +Block 0000 [ 1]: a3fd96fddca6f69d +Block 0000 [ 2]: 0a0727a61a894945 +Block 0000 [ 3]: 11fe2d86c258ae46 +Block 0000 [ 4]: a9ef7448a0ccab00 +Block 0000 [ 5]: 06d8a79699b1e047 +Block 0000 [ 6]: 7fcb9ae69b0aaac7 +Block 0000 [ 7]: 69343012c3076ea1 +Block 0000 [ 8]: 6e00d67ace2ec3f8 +Block 0000 [ 9]: a49d58c0eba07a30 +Block 0000 [ 10]: 90926900f4773099 +Block 0000 [ 11]: a3da3441347fe815 +Block 0000 [ 12]: a79e6d347b657244 +Block 0000 [ 13]: 4285744253dfd00e +Block 0000 [ 14]: aa1fa5ed81b624df +Block 0000 [ 15]: 3d9b7373f8597467 +Block 0000 [ 16]: bd4379f32f94f0fc +Block 0000 [ 17]: 40355ac4178d53f3 +Block 0000 [ 18]: bd78c72572a6af61 +Block 0000 [ 19]: 281f99f8dc8d9050 +Block 0000 [ 20]: c97e563c83178d2f +Block 0000 [ 21]: 8d9d1e26b9db8034 +Block 0000 [ 22]: 3902197d294ef4aa +Block 0000 [ 23]: 1b57f06a2a0b709f +Block 0000 [ 24]: 277f75af34316bac +Block 0000 [ 25]: 32bc11625c1b2751 +Block 0000 [ 26]: a76f4d56e2bbd31c +Block 0000 [ 27]: 4383d549b9fee150 +Block 0000 [ 28]: ec4da4283ee19a25 +Block 0000 [ 29]: db40a685d75a97eb +Block 0000 [ 30]: f7e95a4293a58b67 +Block 0000 [ 31]: 459ce6d7ad8fb97e +Block 0000 [ 32]: e5da1d30fe9710fb +Block 0000 [ 33]: d47c35f1319eb43f +Block 0000 [ 34]: 4a3baab52a5da348 +Block 0000 [ 35]: 581d9990ca7d2c5c +Block 0000 [ 36]: f035855e7c5a0dba +Block 0000 [ 37]: 11729bc0a2cc2e05 +Block 0000 [ 38]: 2439be4b37549988 +Block 0000 [ 39]: 15fc82bfc2bc04e4 +Block 0000 [ 40]: f1560d8eafded40c +Block 0000 [ 41]: d139264a0bca6726 +Block 0000 [ 42]: 3ebd6bebc32c796f +Block 0000 [ 43]: 3c6dab5ba747707a +Block 0000 [ 44]: 83ec6820e1b375c7 +Block 0000 [ 45]: 0660dfa463fc9981 +Block 0000 [ 46]: a38630c563e0783d +Block 0000 [ 47]: bc7d652ca8672d8e +Block 0000 [ 48]: bfb5d9999448c339 +Block 0000 [ 49]: e56e2a8aaf192956 +Block 0000 [ 50]: 2d444595302a6f8f +Block 0000 [ 51]: 7ee4948d1aa843e8 +Block 0000 [ 52]: 40225ab51ab422af +Block 0000 [ 53]: 30c483daeb628c24 +Block 0000 [ 54]: 9025b7151da6425c +Block 0000 [ 55]: 8d032f891b7d9f4c +Block 0000 [ 56]: 769969c276f48220 +Block 0000 [ 57]: a935b2664cb6de87 +Block 0000 [ 58]: 388e764dc3e2db3a +Block 0000 [ 59]: 91191a07635348d1 +Block 0000 [ 60]: f2141c06c59d34f4 +Block 0000 [ 61]: 75cefd44bf8d34cc +Block 0000 [ 62]: 564f6e178f57da02 +Block 0000 [ 63]: b0288d8fb8ec24c6 +Block 0000 [ 64]: 53f404b6bada7fd5 +Block 0000 [ 65]: ce387b78af2e7da9 +Block 0000 [ 66]: 961019ec3bf5a7ba +Block 0000 [ 67]: 9c707e03c2138397 +Block 0000 [ 68]: b6e4104f00124c70 +Block 0000 [ 69]: f3ffa2968fa42fe1 +Block 0000 [ 70]: b41ac152d1da73dd +Block 0000 [ 71]: 546289e70071e674 +Block 0000 [ 72]: 6937af57f76368e8 +Block 0000 [ 73]: daffc82f1b00a6ec +Block 0000 [ 74]: dc8a1f1f6c1a3769 +Block 0000 [ 75]: 20d75bd00bfe8391 +Block 0000 [ 76]: 83dcbf84758e8b00 +Block 0000 [ 77]: 3c52616b112557bd +Block 0000 [ 78]: a6416f1995e460da +Block 0000 [ 79]: b0a1591f1e34c1d8 +Block 0000 [ 80]: 4602f24366054da3 +Block 0000 [ 81]: 808e8b80d660df50 +Block 0000 [ 82]: 93f7ff5247d8f563 +Block 0000 [ 83]: be9bd2e8847c9cfd +Block 0000 [ 84]: 78fe2bda93162b53 +Block 0000 [ 85]: 9ec83bb297e1f2ee +Block 0000 [ 86]: b90706d2bf061ff3 +Block 0000 [ 87]: 186c3646c266ca2c +Block 0000 [ 88]: 628050acddf15f79 +Block 0000 [ 89]: cc88eb65b6f03fec +Block 0000 [ 90]: de96108afee33c3e +Block 0000 [ 91]: c156d449313bfd02 +Block 0000 [ 92]: 58a2c3a3fc41adae +Block 0000 [ 93]: 3dfeb8dff8aa5b80 +Block 0000 [ 94]: a28048dfd71dc8d8 +Block 0000 [ 95]: b0d8d6bbc430f3ee +Block 0000 [ 96]: cbf2194f578d6db2 +Block 0000 [ 97]: 01ccb4d39161aac4 +Block 0000 [ 98]: f44fe5fff3ae387e +Block 0000 [ 99]: b1813dfa99c6953d +Block 0000 [100]: 5bca760ee97db409 +Block 0000 [101]: 3ce9ff5ec3099a35 +Block 0000 [102]: 9e1cb135ab1b42a0 +Block 0000 [103]: b251228dd5eb5ae0 +Block 0000 [104]: 66304590c17b8117 +Block 0000 [105]: a46257f0e6f256ed +Block 0000 [106]: 14e299ab4f2d187e +Block 0000 [107]: 24228dec25e8772d +Block 0000 [108]: f8f029106762c0d7 +Block 0000 [109]: 2f261305d9b518d1 +Block 0000 [110]: c6b27f4786596697 +Block 0000 [111]: 7e9a5e51425764ad +Block 0000 [112]: f6674f15be253b39 +Block 0000 [113]: 0922afec1f60f831 +Block 0000 [114]: 6c729428d9d0a23f +Block 0000 [115]: b673cf5b43402f36 +Block 0000 [116]: 9010b9a37fa13310 +Block 0000 [117]: 7b3b5f677ab6c0a1 +Block 0000 [118]: 6f0099ca29449c51 +Block 0000 [119]: 08941902d462588f +Block 0000 [120]: e7180fff290542e9 +Block 0000 [121]: 0ee4cd5dfee583ec +Block 0000 [122]: 7a60e32fe35b330e +Block 0000 [123]: daf1ffa261adc82f +Block 0000 [124]: 1a160254df704091 +Block 0000 [125]: ac5bf3535385f59a +Block 0000 [126]: f9decabf3ad9b4a4 +Block 0000 [127]: f7654a3f226adfa7 +Block 0001 [ 0]: bc459e0eea13a1f3 +Block 0001 [ 1]: 49eef4a59a5aa372 +Block 0001 [ 2]: 401c002334495016 +Block 0001 [ 3]: 88b39619877d25ff +Block 0001 [ 4]: 9f7cb547d36211b6 +Block 0001 [ 5]: 6cc6287d95e294a8 +Block 0001 [ 6]: d0e2fa02854d590e +Block 0001 [ 7]: e0370ab791652bac +Block 0001 [ 8]: eacbc294d4a30a44 +Block 0001 [ 9]: aeb62d61bc7705c0 +Block 0001 [ 10]: 1c6ec07f7cea9f47 +Block 0001 [ 11]: 6417fa6afaa2c5cf +Block 0001 [ 12]: c2f9504724c3bc92 +Block 0001 [ 13]: 83f7e665d693c1a0 +Block 0001 [ 14]: 0c6380b41a0201b9 +Block 0001 [ 15]: 7579e63288ae9d3a +Block 0001 [ 16]: d82ca980319e8378 +Block 0001 [ 17]: 5e71e4d4f0c94f01 +Block 0001 [ 18]: e2ae1815182d371a +Block 0001 [ 19]: 4dc20804ef3373b3 +Block 0001 [ 20]: ce746d95dc63549d +Block 0001 [ 21]: 5b0dca46deda0e87 +Block 0001 [ 22]: ed85a89304dee634 +Block 0001 [ 23]: ac266927481f3736 +Block 0001 [ 24]: cb290eb0eee448f7 +Block 0001 [ 25]: 6ed16ca8b8a80515 +Block 0001 [ 26]: 7ddef21f6d32effb +Block 0001 [ 27]: a698cfebc42f8b78 +Block 0001 [ 28]: 586ac3c8ca8a541b +Block 0001 [ 29]: fe5d850bfd7dc57b +Block 0001 [ 30]: 9118360b7d2bc4c9 +Block 0001 [ 31]: 80c528b10fb625d7 +Block 0001 [ 32]: 747b7d55cd6d5f31 +Block 0001 [ 33]: c5d7ead5b3d77159 +Block 0001 [ 34]: 0b587e890235e645 +Block 0001 [ 35]: c2484fa9b0f2be70 +Block 0001 [ 36]: 1c8a3c5bf70785db +Block 0001 [ 37]: f0eee081b3f166e3 +Block 0001 [ 38]: 53107934144a5cd8 +Block 0001 [ 39]: 0e460822accb4724 +Block 0001 [ 40]: 9fa234759c8ca51b +Block 0001 [ 41]: 73398d40f1ad7336 +Block 0001 [ 42]: ac0ffffe28ec0bd6 +Block 0001 [ 43]: 126739a06ed1fabb +Block 0001 [ 44]: 778065fea1b348d4 +Block 0001 [ 45]: 9e149c4d19c48b7d +Block 0001 [ 46]: 3ab9809fb1e88ea4 +Block 0001 [ 47]: 24edb1342bd45b11 +Block 0001 [ 48]: 794fd23b6fd32b33 +Block 0001 [ 49]: a793ee83b72c1c48 +Block 0001 [ 50]: 89b55cdc62adb18b +Block 0001 [ 51]: ccec9d11f1f473aa +Block 0001 [ 52]: ead0ddbdcf12d5da +Block 0001 [ 53]: 7f1b64e493de3a42 +Block 0001 [ 54]: 6b9a688eacb29c53 +Block 0001 [ 55]: 041ff10a56bfd124 +Block 0001 [ 56]: 11bcdfea9f4778ba +Block 0001 [ 57]: 5c3452982c95f36d +Block 0001 [ 58]: 78043a6334282ade +Block 0001 [ 59]: 2e6b32801d204496 +Block 0001 [ 60]: eda1e9230c69988f +Block 0001 [ 61]: b1e38ba52270d65a +Block 0001 [ 62]: 59867bea79e81eea +Block 0001 [ 63]: 4950d787032cab9c +Block 0001 [ 64]: a2e26164012c30ac +Block 0001 [ 65]: 47ffcfe006607e62 +Block 0001 [ 66]: 75e57bb2c0fecc99 +Block 0001 [ 67]: 8377f8cb872ff188 +Block 0001 [ 68]: 4f2f480425512165 +Block 0001 [ 69]: f11118f5c806ed9f +Block 0001 [ 70]: 5371a6d76715055a +Block 0001 [ 71]: dc71cfd303bcbbed +Block 0001 [ 72]: 432d3e34de79ea75 +Block 0001 [ 73]: b3c05a6624da3011 +Block 0001 [ 74]: b2b40d56350b73fe +Block 0001 [ 75]: 3f2065a4bdde3ef8 +Block 0001 [ 76]: d5d8a80cc0ace697 +Block 0001 [ 77]: 4f3bb1e4743984e7 +Block 0001 [ 78]: 52025366f9be8b92 +Block 0001 [ 79]: e476f5f80de3d2f3 +Block 0001 [ 80]: 4342bb1beb580982 +Block 0001 [ 81]: 67990f5680d612b2 +Block 0001 [ 82]: e2b764c69f871d05 +Block 0001 [ 83]: 5c115c46a9d77e7f +Block 0001 [ 84]: 1277b1cc8d0822a2 +Block 0001 [ 85]: 87483e53ebb66247 +Block 0001 [ 86]: f41b286b6678a395 +Block 0001 [ 87]: 39be6db92f34b25d +Block 0001 [ 88]: 05c798faca043d57 +Block 0001 [ 89]: 339176afa15c57e4 +Block 0001 [ 90]: addfacb21e7b3899 +Block 0001 [ 91]: 347baed2dc7e123e +Block 0001 [ 92]: c8e17e46dd176bf4 +Block 0001 [ 93]: ccb8aad34aa26683 +Block 0001 [ 94]: 6ebf6b0c3d9dca90 +Block 0001 [ 95]: aa78863c92270242 +Block 0001 [ 96]: 4b045aa366cce2d8 +Block 0001 [ 97]: 5d81d95a2df235c3 +Block 0001 [ 98]: bde894f1a74a76dc +Block 0001 [ 99]: ed38f15b1391dd95 +Block 0001 [100]: cabbae2dc702f85e +Block 0001 [101]: 31af49571ab46d58 +Block 0001 [102]: f6018e52178a3abd +Block 0001 [103]: 0b931029db37f1f3 +Block 0001 [104]: d335f2a1a4506271 +Block 0001 [105]: 47dee6e4d062a924 +Block 0001 [106]: 712500aad5917547 +Block 0001 [107]: ce52485b1c1c0c96 +Block 0001 [108]: 5201c069725f1e4a +Block 0001 [109]: 0baed79cad097c37 +Block 0001 [110]: 5ac9a6873ff1723c +Block 0001 [111]: 981afe97c87bf63c +Block 0001 [112]: c663cda5fc535e6f +Block 0001 [113]: c420f671a527e73e +Block 0001 [114]: 466add63b316c409 +Block 0001 [115]: 94b0804574e0bd8e +Block 0001 [116]: aa686639b37e98dc +Block 0001 [117]: 14907009742c9497 +Block 0001 [118]: e113a3c0fce07bbb +Block 0001 [119]: 7fc91c5d001b7b66 +Block 0001 [120]: d8857f78a9765b73 +Block 0001 [121]: 7b95fd0a7f2c2019 +Block 0001 [122]: 7d4b660fef058423 +Block 0001 [123]: d09a7312abec290a +Block 0001 [124]: 4526d55249dbaef2 +Block 0001 [125]: ed73e279750b1079 +Block 0001 [126]: 104eda79f420b860 +Block 0001 [127]: 8c421efbfcb0e58d +Block 0002 [ 0]: 8ea6f3005dc0961e +Block 0002 [ 1]: ec57014cac3899fa +Block 0002 [ 2]: 0a17bf60fd070a86 +Block 0002 [ 3]: ced6318e68a05ee3 +Block 0002 [ 4]: 3102b5632405b609 +Block 0002 [ 5]: 945825ed9f453504 +Block 0002 [ 6]: 46db680acf41a392 +Block 0002 [ 7]: eb65ee89868ba4fd +Block 0002 [ 8]: a5f85f09d827ec4b +Block 0002 [ 9]: 4d96ccbe256e70d0 +Block 0002 [ 10]: 6135bfdc5221cd76 +Block 0002 [ 11]: 7cdc62f1d3090016 +Block 0002 [ 12]: 4b8dfa10673895b0 +Block 0002 [ 13]: 81730e01622d73e7 +Block 0002 [ 14]: 0ed2a4e5cfd12538 +Block 0002 [ 15]: 76e6f0a376770db5 +Block 0002 [ 16]: 1f264bfa43ab6bcb +Block 0002 [ 17]: 76018b12515c9f17 +Block 0002 [ 18]: 4dabcc6ba9eef055 +Block 0002 [ 19]: 1d9b4b208308d0a5 +Block 0002 [ 20]: a5416a049c3e72b0 +Block 0002 [ 21]: 2ddd518f7db7c3eb +Block 0002 [ 22]: 82fc34c909e9d5cc +Block 0002 [ 23]: 0b7e631ea36dc9c7 +Block 0002 [ 24]: b4af6334fe3f2bf2 +Block 0002 [ 25]: 9900eef4c64644cd +Block 0002 [ 26]: 3023e322496d1d24 +Block 0002 [ 27]: b522c4417bd3e4a6 +Block 0002 [ 28]: e1f0b6d0e64ddc94 +Block 0002 [ 29]: 89391fd4c6bb340f +Block 0002 [ 30]: 1266543a5647e447 +Block 0002 [ 31]: 7a7af30f1460bedc +Block 0002 [ 32]: 0571774e124ed17a +Block 0002 [ 33]: c90b8125f3e09457 +Block 0002 [ 34]: 2c666a53b7d80823 +Block 0002 [ 35]: f03a8512d71da199 +Block 0002 [ 36]: 84501a2dc0eac1ca +Block 0002 [ 37]: 4c6ff369671d3097 +Block 0002 [ 38]: e019828aef77eb48 +Block 0002 [ 39]: 08324da56e7ec80c +Block 0002 [ 40]: 47c3fea7a541ad83 +Block 0002 [ 41]: bcd3e94fbfa1a121 +Block 0002 [ 42]: 914a7ea99ef847fd +Block 0002 [ 43]: 49d81b057bdb45a5 +Block 0002 [ 44]: 8d579d6ad1c0e128 +Block 0002 [ 45]: 1d5a3539225b32d1 +Block 0002 [ 46]: 70b078ed8c701e4e +Block 0002 [ 47]: b35f51f72d549a13 +Block 0002 [ 48]: 005cf45452fd26c1 +Block 0002 [ 49]: 795b4bb077b874d1 +Block 0002 [ 50]: 4d71a5da9eb1cba7 +Block 0002 [ 51]: 3187129a79216fc2 +Block 0002 [ 52]: ac146ec59c7e5314 +Block 0002 [ 53]: 85bafe512fac7623 +Block 0002 [ 54]: 60550bce77e85eca +Block 0002 [ 55]: 3ab28c531280f09b +Block 0002 [ 56]: 9b11b44f7ccb1823 +Block 0002 [ 57]: 668f4045e06ba4c3 +Block 0002 [ 58]: 879f1b67e5d8c5b8 +Block 0002 [ 59]: cc60238d7597d594 +Block 0002 [ 60]: 4e2a2cb3015a0467 +Block 0002 [ 61]: 7ef9528b0ae50aae +Block 0002 [ 62]: 7d8beaec217e81d8 +Block 0002 [ 63]: 348b9275fbfa1ff5 +Block 0002 [ 64]: ed1fb63138e1f50d +Block 0002 [ 65]: 9562d27cab09e659 +Block 0002 [ 66]: d806069af50f7794 +Block 0002 [ 67]: 8d0aff57a148caaf +Block 0002 [ 68]: 421250e9be352352 +Block 0002 [ 69]: 2b4fe8b0e3bf35e4 +Block 0002 [ 70]: 18211dcc5cc9deca +Block 0002 [ 71]: 540b72659f89c190 +Block 0002 [ 72]: 670c27e851cf8a60 +Block 0002 [ 73]: 71acec32b29a2caa +Block 0002 [ 74]: 0450e5f6eee18092 +Block 0002 [ 75]: a34227efcd51b86b +Block 0002 [ 76]: 5771a997c605dc6c +Block 0002 [ 77]: bf0edb63ee2e0696 +Block 0002 [ 78]: 22ff838a15ca6ff2 +Block 0002 [ 79]: e7d11842b9259ad8 +Block 0002 [ 80]: 9cc9014a99f2611f +Block 0002 [ 81]: 0712115fb800308e +Block 0002 [ 82]: b96fc2b34d47d68e +Block 0002 [ 83]: 09a3e5aebd720b56 +Block 0002 [ 84]: b8d5d104ab68646e +Block 0002 [ 85]: c73444d9a5bd5654 +Block 0002 [ 86]: d47e4cc54ffcaa43 +Block 0002 [ 87]: d8a7927fb3c75190 +Block 0002 [ 88]: 29a0cd526e8dbb27 +Block 0002 [ 89]: b686f1b621196790 +Block 0002 [ 90]: 631b2f9b530a956b +Block 0002 [ 91]: 4e18d6969ba0469d +Block 0002 [ 92]: 481c27be7030bf9d +Block 0002 [ 93]: 70c84dbe84d309a4 +Block 0002 [ 94]: 256841264bac123a +Block 0002 [ 95]: f908a6a11dfb21a6 +Block 0002 [ 96]: 6b4b356c30c62feb +Block 0002 [ 97]: 3dd9a072eecbe065 +Block 0002 [ 98]: c1d53bba775c35f0 +Block 0002 [ 99]: b8df34d4f7524d02 +Block 0002 [100]: 7b0deca6efdcc24d +Block 0002 [101]: 41cd9462a7992850 +Block 0002 [102]: 09e79c11f183be33 +Block 0002 [103]: 790cb6ea025ffb3f +Block 0002 [104]: 8698c499823ef322 +Block 0002 [105]: 58420a3826a66ddd +Block 0002 [106]: 3960ba6dcab5a023 +Block 0002 [107]: 4ce166e82c51c7f4 +Block 0002 [108]: 5bad585f7b816ff0 +Block 0002 [109]: 16f986b7b02f37d8 +Block 0002 [110]: 2fdf5d3c4e2fe48f +Block 0002 [111]: ab8562fe42ed05ed +Block 0002 [112]: e877cee731f0bdd1 +Block 0002 [113]: 0b4db86764860ebe +Block 0002 [114]: a391de7c10742d2a +Block 0002 [115]: 51e83db8e0dbffae +Block 0002 [116]: aa61f4616c0435bf +Block 0002 [117]: 6aa788d842071eb4 +Block 0002 [118]: 6f26ca76fe57f044 +Block 0002 [119]: 7fbefcb634977e04 +Block 0002 [120]: 040c1c551559d36e +Block 0002 [121]: 815326b814713dce +Block 0002 [122]: 21f8873f3284b327 +Block 0002 [123]: a7e2847d61bc0562 +Block 0002 [124]: 8aee0731ab4fec14 +Block 0002 [125]: 9391faf54a0cee1d +Block 0002 [126]: 6de600cf8c504229 +Block 0002 [127]: 51c20222f3371f26 +Block 0003 [ 0]: defbdd269247dccf +Block 0003 [ 1]: a917d017cd53d490 +Block 0003 [ 2]: c3fc89bccf53c160 +Block 0003 [ 3]: 7376b84e5a2841c0 +Block 0003 [ 4]: 27b9260af8a1fa18 +Block 0003 [ 5]: 0cd10e63618be28c +Block 0003 [ 6]: 688e75fad0999fa0 +Block 0003 [ 7]: 2f87962677d4456a +Block 0003 [ 8]: e6e8a06140ae4a8f +Block 0003 [ 9]: 43727e81157c3358 +Block 0003 [ 10]: 5f1af471ccecfecd +Block 0003 [ 11]: 282523c737f3ce59 +Block 0003 [ 12]: 4a4b20d1ca4a9f17 +Block 0003 [ 13]: 23f214ca8b99105d +Block 0003 [ 14]: 7f0bfc572d230507 +Block 0003 [ 15]: 921657836a1dc6e2 +Block 0003 [ 16]: d973ca4bd087d756 +Block 0003 [ 17]: 68dee0aaf60192c9 +Block 0003 [ 18]: f6b7b805b67d4c7d +Block 0003 [ 19]: f8e1402819b76190 +Block 0003 [ 20]: e45aee5f37907bf1 +Block 0003 [ 21]: 74d4bbcc731d7953 +Block 0003 [ 22]: 9c538094d34703c0 +Block 0003 [ 23]: 049f293341fd0f49 +Block 0003 [ 24]: 56d1af89b6934f7b +Block 0003 [ 25]: c06d5f12a9b959a0 +Block 0003 [ 26]: 0a738ab49d7f1140 +Block 0003 [ 27]: 4974722a08b9fb21 +Block 0003 [ 28]: 5515a5cdb9883b82 +Block 0003 [ 29]: 6ef52e56c7851f82 +Block 0003 [ 30]: 188325e68f1cd2a6 +Block 0003 [ 31]: 32a4559fe61d175e +Block 0003 [ 32]: e05943e39bc77ba1 +Block 0003 [ 33]: c63d13028907a676 +Block 0003 [ 34]: d2e643ec53311e10 +Block 0003 [ 35]: 831b2fd9c1d12049 +Block 0003 [ 36]: ec518b7b076fda55 +Block 0003 [ 37]: d0365d93bf0a67d8 +Block 0003 [ 38]: d12bab124b767c5c +Block 0003 [ 39]: 6debf3c5a3a87481 +Block 0003 [ 40]: 9b76bacb4feda29d +Block 0003 [ 41]: 972e482832ed1908 +Block 0003 [ 42]: f321cb74fc7ff73c +Block 0003 [ 43]: fef7f9306e1cadfe +Block 0003 [ 44]: 78bcc32d5bd4a468 +Block 0003 [ 45]: 05bb30b58e106a1c +Block 0003 [ 46]: 458e661c3edbb4f2 +Block 0003 [ 47]: c815023fe10e2953 +Block 0003 [ 48]: 5b9afadba0a0e2c2 +Block 0003 [ 49]: 9060bd4a68ba7683 +Block 0003 [ 50]: bd96ae69c1b0579c +Block 0003 [ 51]: 3c600e6edc5fb733 +Block 0003 [ 52]: 44f2242a97981614 +Block 0003 [ 53]: 2b8f3f6bcc388531 +Block 0003 [ 54]: 91975b293e5949ae +Block 0003 [ 55]: 7cd6d80733367b44 +Block 0003 [ 56]: 2893286bf377e181 +Block 0003 [ 57]: 9e9f576eb644c715 +Block 0003 [ 58]: aa0c95c6c0a9480a +Block 0003 [ 59]: ea0d7c84fb9073c2 +Block 0003 [ 60]: 6ea5293ca5a921dd +Block 0003 [ 61]: 00dbac8af8a1e88a +Block 0003 [ 62]: c29aa3e9e50972de +Block 0003 [ 63]: 0268e6c5804c49f2 +Block 0003 [ 64]: f6a3c6f98b724c4d +Block 0003 [ 65]: 2d179d15f41417c0 +Block 0003 [ 66]: 4a857320b45dac41 +Block 0003 [ 67]: 37b8660f7f759f67 +Block 0003 [ 68]: 3b37a0016af45092 +Block 0003 [ 69]: fd1a3627e2181f91 +Block 0003 [ 70]: 94136a9d4c1638b6 +Block 0003 [ 71]: 96bf6341988daf8f +Block 0003 [ 72]: ba9d427269beb6d8 +Block 0003 [ 73]: 338d43784b16339e +Block 0003 [ 74]: 258c9e2de5604f9f +Block 0003 [ 75]: bcc5d156fa5d3ee9 +Block 0003 [ 76]: f9ea8ceb3436b998 +Block 0003 [ 77]: 6681d34ea3bd3ac2 +Block 0003 [ 78]: 21230fcd512e1244 +Block 0003 [ 79]: a4c206a99699b869 +Block 0003 [ 80]: 23ca11323d64870f +Block 0003 [ 81]: 69d4bd4b5aecd7bc +Block 0003 [ 82]: 7926fc7c4fd85592 +Block 0003 [ 83]: f9981dc25da060dc +Block 0003 [ 84]: a56518aab4d26c6c +Block 0003 [ 85]: 5ebd99314579c81a +Block 0003 [ 86]: 697e53bcc2ce74da +Block 0003 [ 87]: ea7023bbe8c224b7 +Block 0003 [ 88]: 02ca6e8b3f6245d7 +Block 0003 [ 89]: bc369564806f736c +Block 0003 [ 90]: 74b2b79ff4a09b6e +Block 0003 [ 91]: ef509a784173335a +Block 0003 [ 92]: 7fdfed2b6024ecfe +Block 0003 [ 93]: f94c2475c3c2d394 +Block 0003 [ 94]: 70b5e9ca66108b36 +Block 0003 [ 95]: d833ab68bb44ffc4 +Block 0003 [ 96]: f77ece8ea46e2580 +Block 0003 [ 97]: 1ae7df31658e35a2 +Block 0003 [ 98]: ab0db62f9e77a1be +Block 0003 [ 99]: c46e14bf97493e69 +Block 0003 [100]: 5e103177d0a282df +Block 0003 [101]: 1d407aa0d722553c +Block 0003 [102]: 9a1b070f453e77eb +Block 0003 [103]: 7a49e2ccb043e84b +Block 0003 [104]: 128fa604e2049e13 +Block 0003 [105]: e8b0460a76453345 +Block 0003 [106]: ad6bbcbd5aad6663 +Block 0003 [107]: 86602cf6d3c04a63 +Block 0003 [108]: ddf5ed92306f5bb8 +Block 0003 [109]: a6d8b31feff6b5d5 +Block 0003 [110]: 0b31d395a152d5f2 +Block 0003 [111]: 8e19f1722242b1c7 +Block 0003 [112]: 4a2789d0abf4b6da +Block 0003 [113]: 91c7ea611376ca9c +Block 0003 [114]: 383d8259508783d3 +Block 0003 [115]: 2832818d509c32cf +Block 0003 [116]: 9bb26c92a26c6eed +Block 0003 [117]: baae366114f3ca3e +Block 0003 [118]: 09c413ff09704cbe +Block 0003 [119]: 5fc1338780cf93eb +Block 0003 [120]: 352469a1770e3e65 +Block 0003 [121]: 09d9489be33e8698 +Block 0003 [122]: 293a5c2b387975cf +Block 0003 [123]: 4d830525800bf49a +Block 0003 [124]: f60036d7c3126c7e +Block 0003 [125]: cce1956b6bb6f18e +Block 0003 [126]: b8e6e522b7f67d04 +Block 0003 [127]: b1833790bfe9a358 +Block 0004 [ 0]: 3d0218d3c7b74ca8 +Block 0004 [ 1]: d775ea77a653a27c +Block 0004 [ 2]: c176afeeeeec983f +Block 0004 [ 3]: 2f56b580b3d2038a +Block 0004 [ 4]: dd4f6cb833299896 +Block 0004 [ 5]: 36280f762b6d9d1f +Block 0004 [ 6]: e7931d5f58536e7f +Block 0004 [ 7]: 816acd37e673e4b1 +Block 0004 [ 8]: 252097ce80cf4471 +Block 0004 [ 9]: 53b5435ba1c7f8c3 +Block 0004 [ 10]: 64d876af9ba2b092 +Block 0004 [ 11]: f596aaf38f0d531c +Block 0004 [ 12]: daf15fd14343faf1 +Block 0004 [ 13]: 653e245995afa924 +Block 0004 [ 14]: 5d7490c3b74a7283 +Block 0004 [ 15]: 2938b33cd3959722 +Block 0004 [ 16]: fad161088d3d6d90 +Block 0004 [ 17]: a20f95889e04cc34 +Block 0004 [ 18]: ad95b5eff6f7e807 +Block 0004 [ 19]: 9c6a5409137873ec +Block 0004 [ 20]: d69f52d77ced25a0 +Block 0004 [ 21]: 30326cf9e8b26b65 +Block 0004 [ 22]: 27840208a4f1c105 +Block 0004 [ 23]: 9447a046e4644347 +Block 0004 [ 24]: 56087f6a44fdb588 +Block 0004 [ 25]: 6dc364d36cbf26d5 +Block 0004 [ 26]: 87b683d67201cdad +Block 0004 [ 27]: ba8742cda32586ce +Block 0004 [ 28]: b6cde1778051b9f3 +Block 0004 [ 29]: 1b82b268556f6c57 +Block 0004 [ 30]: 8339ec4f63995a93 +Block 0004 [ 31]: d606bc0fd42b9e00 +Block 0004 [ 32]: 15f734c2f1851101 +Block 0004 [ 33]: f506350a9337d1b1 +Block 0004 [ 34]: ddea2ea066855ca4 +Block 0004 [ 35]: 9854e88b7a91c00d +Block 0004 [ 36]: b9192978b32d53a4 +Block 0004 [ 37]: 525af839f9719cb5 +Block 0004 [ 38]: f0dd9f4c07a3c131 +Block 0004 [ 39]: 45168595c23f263c +Block 0004 [ 40]: 69b2bb5c381988d8 +Block 0004 [ 41]: 61ae296ca95aa156 +Block 0004 [ 42]: 61cc529c1199b52e +Block 0004 [ 43]: 6c7bea9a5fd4bd67 +Block 0004 [ 44]: ab7369fc537d81ee +Block 0004 [ 45]: 3cfe32d2a3865e9b +Block 0004 [ 46]: da5f06ec7db73c9d +Block 0004 [ 47]: d30bd62324bc5f48 +Block 0004 [ 48]: bdc0079a0cd32c12 +Block 0004 [ 49]: 102579dd0f6cbe7c +Block 0004 [ 50]: d28913132bdfa5a2 +Block 0004 [ 51]: 0c8d094baa236d78 +Block 0004 [ 52]: 06e461788c5b69a9 +Block 0004 [ 53]: 371dbf3107c1193b +Block 0004 [ 54]: f6aaab2550a65da8 +Block 0004 [ 55]: 428d89d340f1606f +Block 0004 [ 56]: 0533b686a16599e3 +Block 0004 [ 57]: 9b0a6ecddeea2536 +Block 0004 [ 58]: 4ec61df5ae2925ba +Block 0004 [ 59]: 889f3f5d3ab01086 +Block 0004 [ 60]: 1ba9860ad05bba5e +Block 0004 [ 61]: 44ae777798e36c5a +Block 0004 [ 62]: b2c5b481c53e9d60 +Block 0004 [ 63]: 4b880b2cf31f1b39 +Block 0004 [ 64]: 31c4ad49902e93f8 +Block 0004 [ 65]: c3406a45d218a4de +Block 0004 [ 66]: c55c240f9476ed2d +Block 0004 [ 67]: 8536df39d71e4bb2 +Block 0004 [ 68]: 880364005d870893 +Block 0004 [ 69]: f0399130b975e981 +Block 0004 [ 70]: 2a1cc94a9540bbc2 +Block 0004 [ 71]: 66ddc8498908dd94 +Block 0004 [ 72]: 29da7f4fb91fcafd +Block 0004 [ 73]: 3da5be32b39d893c +Block 0004 [ 74]: 400c926600b93260 +Block 0004 [ 75]: 3c0bc8a864c63ac5 +Block 0004 [ 76]: 1fa284b1929fedda +Block 0004 [ 77]: d8fbff92df12283a +Block 0004 [ 78]: 6f8a370ab6454744 +Block 0004 [ 79]: a8353ea2070b0cb0 +Block 0004 [ 80]: 8d1d9a211ae4a7b6 +Block 0004 [ 81]: e75caccf836fec07 +Block 0004 [ 82]: 13cd97d9ce0fd07e +Block 0004 [ 83]: a0acba9e9458bbe2 +Block 0004 [ 84]: da451f32ace6d295 +Block 0004 [ 85]: aeb5717f0b40d2a3 +Block 0004 [ 86]: 871bb5d3228b213e +Block 0004 [ 87]: e652337cacaea165 +Block 0004 [ 88]: 00827f84524518ab +Block 0004 [ 89]: 1dc3281fe4bbd871 +Block 0004 [ 90]: 070965dd4c53abbf +Block 0004 [ 91]: 01d7e50991766fb4 +Block 0004 [ 92]: 764d7031b5313c1f +Block 0004 [ 93]: a09cf477a95cb6be +Block 0004 [ 94]: 72f8e7681d5fff45 +Block 0004 [ 95]: 683674587d64b187 +Block 0004 [ 96]: b6b323e20a11c95f +Block 0004 [ 97]: 2efd915bd3a4378a +Block 0004 [ 98]: 70be9263eed7a411 +Block 0004 [ 99]: 6639b57c9775cd57 +Block 0004 [100]: 7111d121f936a543 +Block 0004 [101]: cc0465d2ded37ea0 +Block 0004 [102]: c1bc4dcc13cf1463 +Block 0004 [103]: faeaf234269d808b +Block 0004 [104]: 608c4812ec403401 +Block 0004 [105]: e6c45eb5bd0df3f5 +Block 0004 [106]: 157fc891efe07dd8 +Block 0004 [107]: f6063de8c707fbe1 +Block 0004 [108]: ea0cf9feb531ee49 +Block 0004 [109]: 7f03acb918dbed1b +Block 0004 [110]: 84d076272170fc4d +Block 0004 [111]: d630f0dab96da15f +Block 0004 [112]: cfc05aed43413a43 +Block 0004 [113]: 16cfe392a4b08a15 +Block 0004 [114]: f24f9093be143b5e +Block 0004 [115]: 4213be434fbf3ef1 +Block 0004 [116]: 8323183a4feccd4a +Block 0004 [117]: 0874e2b43461cff1 +Block 0004 [118]: 6bda6c5beef6b654 +Block 0004 [119]: b94f755575072464 +Block 0004 [120]: a0f1e43e0a95d678 +Block 0004 [121]: d99619485b84aed5 +Block 0004 [122]: 05a4613a31743eef +Block 0004 [123]: 9fb6cbf1a149fd72 +Block 0004 [124]: 9f5e4bd27a21db84 +Block 0004 [125]: de2deee92e6a36dc +Block 0004 [126]: 865c61eedf06610d +Block 0004 [127]: 5df4327e934a0615 +Block 0005 [ 0]: ebe0a110a19e35f6 +Block 0005 [ 1]: 008d2bc14ad221da +Block 0005 [ 2]: 7b650b6ffcc7419b +Block 0005 [ 3]: 3abb4c43361f8a2e +Block 0005 [ 4]: 91f87a4a3f6ee7db +Block 0005 [ 5]: 11426d9377c1fc47 +Block 0005 [ 6]: a87dceffb866d6d7 +Block 0005 [ 7]: dc1f68c91ea3b945 +Block 0005 [ 8]: 58baa73c25e5a80d +Block 0005 [ 9]: b4726199470be696 +Block 0005 [ 10]: 0f19e0f822013b8b +Block 0005 [ 11]: 5ec73451f5da8127 +Block 0005 [ 12]: e4a685a8b846beae +Block 0005 [ 13]: 7ab8a6acfb017f42 +Block 0005 [ 14]: 1b697272c549671a +Block 0005 [ 15]: e7cafbec03487054 +Block 0005 [ 16]: 6169e3164a21d81f +Block 0005 [ 17]: ebd69195322ce5f3 +Block 0005 [ 18]: c2e7ea52115ef8fe +Block 0005 [ 19]: 4505bdda7f1ec096 +Block 0005 [ 20]: e6223c84cb44d2bb +Block 0005 [ 21]: 9a66897d2f668bb1 +Block 0005 [ 22]: 361a9d11f702134c +Block 0005 [ 23]: 225333e618b38c82 +Block 0005 [ 24]: 938b95b671a477da +Block 0005 [ 25]: 12c1b35d3d957d84 +Block 0005 [ 26]: a8de7a408626987e +Block 0005 [ 27]: be99d2a21d4e6aaa +Block 0005 [ 28]: 3e00b15f24872c30 +Block 0005 [ 29]: 25da7df53480716b +Block 0005 [ 30]: d763b510a5b5176e +Block 0005 [ 31]: fb750bfaa121d443 +Block 0005 [ 32]: 29f3320b70f1fd51 +Block 0005 [ 33]: d8d0f3d810ea4631 +Block 0005 [ 34]: 249cfce46ad07796 +Block 0005 [ 35]: 48e2df9063c20c0a +Block 0005 [ 36]: d156ca43b733ee10 +Block 0005 [ 37]: 6e3211c3e811ef2e +Block 0005 [ 38]: b07c3324072f3e60 +Block 0005 [ 39]: f0876351201cd7e6 +Block 0005 [ 40]: 1d6b7c6248336fad +Block 0005 [ 41]: 711e290de918ef7e +Block 0005 [ 42]: db4cb24ab1ba3de1 +Block 0005 [ 43]: 04922f11be1c59d4 +Block 0005 [ 44]: d176c2007870606a +Block 0005 [ 45]: 3f9de1763ca7b9ac +Block 0005 [ 46]: 9e907691b4a675ef +Block 0005 [ 47]: 8a844094fdc5a88d +Block 0005 [ 48]: 511a7bdd9977d2d1 +Block 0005 [ 49]: 4c9b696660f251bf +Block 0005 [ 50]: 6564036fa992787e +Block 0005 [ 51]: e42d539963cacd5d +Block 0005 [ 52]: 21062cfef86ee74e +Block 0005 [ 53]: d3d66a92c9290c5b +Block 0005 [ 54]: e1cf3b28dbafede3 +Block 0005 [ 55]: b92371b18732fabc +Block 0005 [ 56]: 361ebd40a008b0f5 +Block 0005 [ 57]: 808be947d48db0a1 +Block 0005 [ 58]: c06627cff85764e2 +Block 0005 [ 59]: 6a5386c596fa2f1a +Block 0005 [ 60]: 2fb06a7a33185b99 +Block 0005 [ 61]: 3466d1791387669c +Block 0005 [ 62]: 6ddf4d98b1fdfdbf +Block 0005 [ 63]: a556957e3fd45eb2 +Block 0005 [ 64]: 10f86898cd368eb9 +Block 0005 [ 65]: 150e99f8016f90fa +Block 0005 [ 66]: 37ceaa78780b2975 +Block 0005 [ 67]: 53f47026278b7aa5 +Block 0005 [ 68]: 793cd8d42494022d +Block 0005 [ 69]: 28ebaa1ba5f09bb8 +Block 0005 [ 70]: 1e7e3efd8fa75642 +Block 0005 [ 71]: f74412432c5a7339 +Block 0005 [ 72]: 1e6634dab86ffc70 +Block 0005 [ 73]: 2a853b1f0398398e +Block 0005 [ 74]: b77ade9731734f4d +Block 0005 [ 75]: 5eb23b7a5395d0f5 +Block 0005 [ 76]: 65eb315d342866fb +Block 0005 [ 77]: 953b95837df8e936 +Block 0005 [ 78]: 599f63583bbde92d +Block 0005 [ 79]: 42b78d9dd0e0029f +Block 0005 [ 80]: 9f7d0390e5b45eb3 +Block 0005 [ 81]: 751ad633e588ae66 +Block 0005 [ 82]: c2d4bea00853cde0 +Block 0005 [ 83]: 4fd032806ea5b569 +Block 0005 [ 84]: fba664901a55f304 +Block 0005 [ 85]: 6c7c644ba5157365 +Block 0005 [ 86]: 23542e368ec13c64 +Block 0005 [ 87]: 04f8fadd8b735b7d +Block 0005 [ 88]: 0d145631c75c088e +Block 0005 [ 89]: eb1e0e1fe5cd7995 +Block 0005 [ 90]: deab81e9e69fcd13 +Block 0005 [ 91]: db8c1140e5e91a33 +Block 0005 [ 92]: 2fb6401714e6c913 +Block 0005 [ 93]: d5a647aae640d351 +Block 0005 [ 94]: 7ff7506e47258938 +Block 0005 [ 95]: 44e5d15a02d6f281 +Block 0005 [ 96]: 298a1c196621f326 +Block 0005 [ 97]: 8fd931f209c2a308 +Block 0005 [ 98]: 8f4b8fe6227c86d2 +Block 0005 [ 99]: 9cdb3001ef490ce4 +Block 0005 [100]: 13dde2bb569cbb44 +Block 0005 [101]: 1b0e09c4897bbb9f +Block 0005 [102]: 7956ff7a15ee636b +Block 0005 [103]: e1aafb98d48a4eb3 +Block 0005 [104]: 92f32b059f056a35 +Block 0005 [105]: 884387d7450e6955 +Block 0005 [106]: bfe97055990c8bb4 +Block 0005 [107]: 5e992b7b49084a96 +Block 0005 [108]: 28e360b2c013b884 +Block 0005 [109]: 1f9e7336eb1bb691 +Block 0005 [110]: 47c117348af2a6f8 +Block 0005 [111]: ccc5140886ca66b4 +Block 0005 [112]: 9b9c7e02d210182a +Block 0005 [113]: 4bf5e7c7b5c586d8 +Block 0005 [114]: 1b64a31ed9c6a34e +Block 0005 [115]: bfecc90bf4fa043b +Block 0005 [116]: 6e0a25e5fb276cf0 +Block 0005 [117]: c1baa5232ad374e7 +Block 0005 [118]: 4f68f109df6c02d5 +Block 0005 [119]: cb004fb5c813273b +Block 0005 [120]: fa71b52ef5384747 +Block 0005 [121]: b5a18bd9701b0c1f +Block 0005 [122]: 31e001f95dfa27db +Block 0005 [123]: d66ee543167724a2 +Block 0005 [124]: 4170180f6fa36c26 +Block 0005 [125]: 5ab82751d0014c9b +Block 0005 [126]: fdd4df1f9de608d1 +Block 0005 [127]: dbee35b29953798d +Block 0006 [ 0]: 953da22d91b4cdf1 +Block 0006 [ 1]: 9676f207e657a260 +Block 0006 [ 2]: 9060fb9cc1ee9e6f +Block 0006 [ 3]: 7e0c7d3e2a542fd3 +Block 0006 [ 4]: 6a61b82d82d10d4a +Block 0006 [ 5]: a32383166b9bcd0e +Block 0006 [ 6]: 4c3eee661bf1c858 +Block 0006 [ 7]: 0968e35bc6cccd6c +Block 0006 [ 8]: 741e38f728c12bcb +Block 0006 [ 9]: ff2f75f3742598b3 +Block 0006 [ 10]: 83ba2331f338c6e5 +Block 0006 [ 11]: a63ef474f95b8b64 +Block 0006 [ 12]: a3f5994b4d5b907b +Block 0006 [ 13]: 941c1189b8f92824 +Block 0006 [ 14]: 70aaf42c80f88f0a +Block 0006 [ 15]: 1aa7b30acb6c4b53 +Block 0006 [ 16]: 4e3b293be10ddaac +Block 0006 [ 17]: 9147f8c3764087cc +Block 0006 [ 18]: 51c784834665e149 +Block 0006 [ 19]: 360469980c63db76 +Block 0006 [ 20]: 4e95eac04f96ae83 +Block 0006 [ 21]: 2983d0f8d9631a7c +Block 0006 [ 22]: a16e8c2b0e6b6a42 +Block 0006 [ 23]: f61fa745edf7e028 +Block 0006 [ 24]: 9f706afd3abf305d +Block 0006 [ 25]: 309486cc6bf90c4f +Block 0006 [ 26]: be344cda4ca29fbf +Block 0006 [ 27]: 12b16f6034f6d56f +Block 0006 [ 28]: 4bea1e5d93ffb5aa +Block 0006 [ 29]: 903f34584a5c9d85 +Block 0006 [ 30]: eef4fb8144be4ec0 +Block 0006 [ 31]: a003f06275ca97ec +Block 0006 [ 32]: a8d5232e929c0325 +Block 0006 [ 33]: d468707146178f06 +Block 0006 [ 34]: 35afe4cf3e359f4e +Block 0006 [ 35]: c37deaea22cf78f8 +Block 0006 [ 36]: c32828ebe2f5f03f +Block 0006 [ 37]: 35544b4bc72bb7e5 +Block 0006 [ 38]: 0ff984bebbe4332f +Block 0006 [ 39]: aa90abc10b8bf925 +Block 0006 [ 40]: a30fae740369aeaa +Block 0006 [ 41]: b0d40ff0e1405b0b +Block 0006 [ 42]: 41e0ebd013434b43 +Block 0006 [ 43]: 93329fd5a2a0a615 +Block 0006 [ 44]: c5ce5a077ae78cfb +Block 0006 [ 45]: 2d7603c16f625bbe +Block 0006 [ 46]: 6d448aa77a0ba910 +Block 0006 [ 47]: 734effe2c30da157 +Block 0006 [ 48]: 6467bdbcac0a2e60 +Block 0006 [ 49]: a4a967217ec67c6e +Block 0006 [ 50]: 84088bfdd1f8fd6c +Block 0006 [ 51]: ceb0dff92ef2bf56 +Block 0006 [ 52]: e8d89cbeb4e6aafd +Block 0006 [ 53]: d7577f5276c6efff +Block 0006 [ 54]: 7b8666cbd445a194 +Block 0006 [ 55]: 283cbe1fca02ff49 +Block 0006 [ 56]: c1130c6e56caad55 +Block 0006 [ 57]: e703eb1b9cfb064b +Block 0006 [ 58]: 20681d5f25a51792 +Block 0006 [ 59]: 6b99ced7f66ff2f2 +Block 0006 [ 60]: ede2f8f94072ed04 +Block 0006 [ 61]: 35d4fdb152f85e55 +Block 0006 [ 62]: 5972cde3573436c5 +Block 0006 [ 63]: 514169dadd86b036 +Block 0006 [ 64]: dfb4a43b017afa26 +Block 0006 [ 65]: f3659113f547fc9d +Block 0006 [ 66]: f783483cc199a4cd +Block 0006 [ 67]: 880a64abd07e7226 +Block 0006 [ 68]: da74ccf3914aa25b +Block 0006 [ 69]: 0ef7529a6523ac67 +Block 0006 [ 70]: c7b2350d91c2ad1d +Block 0006 [ 71]: 00fe4d981f08cda3 +Block 0006 [ 72]: f109e3bea43047b4 +Block 0006 [ 73]: b11a591cabae2527 +Block 0006 [ 74]: 8584e130c4aa28f6 +Block 0006 [ 75]: e6cc066b517f3bf2 +Block 0006 [ 76]: c61d848b3604f406 +Block 0006 [ 77]: a6e481e6f62d417e +Block 0006 [ 78]: 98374fb8b642277d +Block 0006 [ 79]: 3cd691a8e368c1a3 +Block 0006 [ 80]: f5e4b070e60c6371 +Block 0006 [ 81]: ae704193c93f858a +Block 0006 [ 82]: 91ba194d1daa0855 +Block 0006 [ 83]: 94733c71d403736b +Block 0006 [ 84]: 2ba3e7fd9c6a3cd5 +Block 0006 [ 85]: 1afb61c7bf872e72 +Block 0006 [ 86]: d3725b5b472693e9 +Block 0006 [ 87]: 5a37d40a1ea35b2f +Block 0006 [ 88]: fb9b6b1b8c900513 +Block 0006 [ 89]: 9ccf2941f4f80c3c +Block 0006 [ 90]: 0c987b97df5adf27 +Block 0006 [ 91]: 76174bbba6dbfe6f +Block 0006 [ 92]: 94aac5d0f17cb183 +Block 0006 [ 93]: 3c1c6d2e3ba1ee47 +Block 0006 [ 94]: 830b0554211273d4 +Block 0006 [ 95]: c0be78c4cfb035d6 +Block 0006 [ 96]: 6d73af45c4760ff7 +Block 0006 [ 97]: 7f1c9d632ff58ddf +Block 0006 [ 98]: 4d28f566ec1be67b +Block 0006 [ 99]: ddddae2263706ff7 +Block 0006 [100]: b7d1ea8ff5b40ed9 +Block 0006 [101]: 060f1e1a15cf24c0 +Block 0006 [102]: b8ef978d9367132b +Block 0006 [103]: 75051540922cf5f7 +Block 0006 [104]: 9acab99071475dca +Block 0006 [105]: 9cf6fa671ba3c5e8 +Block 0006 [106]: da306220d6d92f3f +Block 0006 [107]: 96f370ed24c0a715 +Block 0006 [108]: eef65720ca00c62c +Block 0006 [109]: d0a4896fef4fbb76 +Block 0006 [110]: 34cb832b72571c57 +Block 0006 [111]: b6f372cf70846a46 +Block 0006 [112]: 089b00b51e7e7bb3 +Block 0006 [113]: 3a67f4f3a4e2ba6d +Block 0006 [114]: 3efe256bac84de46 +Block 0006 [115]: 7e12bd4d6af4d9f3 +Block 0006 [116]: 6081aefcc1b62159 +Block 0006 [117]: 9eee22656bd81016 +Block 0006 [118]: ab2ec3390f6456a0 +Block 0006 [119]: 7a3555752b91ecb3 +Block 0006 [120]: a32e7434fd10c015 +Block 0006 [121]: 1475b5ce252f4f53 +Block 0006 [122]: d75c74f6e22b18f0 +Block 0006 [123]: ea383d46ae76a8f5 +Block 0006 [124]: b9439a5a2a0342d7 +Block 0006 [125]: 0866fc6c0bc150dd +Block 0006 [126]: 1a48b3e6e8e7128f +Block 0006 [127]: f99acc084060ccc6 +Block 0007 [ 0]: 002beefd6242b6fc +Block 0007 [ 1]: ccd632cc9923d203 +Block 0007 [ 2]: 811448a01c1cee37 +Block 0007 [ 3]: bdb5d29914d0fd4b +Block 0007 [ 4]: aa8a6e84e5b9862d +Block 0007 [ 5]: 5cfe285ab264bdd1 +Block 0007 [ 6]: 9e007b855f8c4198 +Block 0007 [ 7]: a26ae8c98fd60957 +Block 0007 [ 8]: 8898a87f9d06ea7c +Block 0007 [ 9]: fc5224caf8054b51 +Block 0007 [ 10]: 6da6869d93083849 +Block 0007 [ 11]: c1816abe2cb148d3 +Block 0007 [ 12]: 6d526b4c8d7a7194 +Block 0007 [ 13]: b9b0ee4d9e221379 +Block 0007 [ 14]: 5eb5a2c637d58307 +Block 0007 [ 15]: 699550723f3335b9 +Block 0007 [ 16]: 8bd3efa71abca2da +Block 0007 [ 17]: 286304f7c483ef5f +Block 0007 [ 18]: 4b9273444ac054aa +Block 0007 [ 19]: 6665269cc5fe3c67 +Block 0007 [ 20]: 028c169ce962a690 +Block 0007 [ 21]: 932821205bda6248 +Block 0007 [ 22]: 12e7e8141030e59f +Block 0007 [ 23]: 6e53a28d9d6ed667 +Block 0007 [ 24]: a1b5387b05bbf7aa +Block 0007 [ 25]: eb32cc77b091f595 +Block 0007 [ 26]: ce2c166ab58cbbe0 +Block 0007 [ 27]: 03b1037106b358e2 +Block 0007 [ 28]: 3f92863ea1f614d0 +Block 0007 [ 29]: f05841d5cd327092 +Block 0007 [ 30]: 91e0fd9692bff005 +Block 0007 [ 31]: afd5f332341584c6 +Block 0007 [ 32]: 15071f83f2203c21 +Block 0007 [ 33]: 43ebdc1864818a2a +Block 0007 [ 34]: 0156f8f1493fce68 +Block 0007 [ 35]: f64e6ebe8e490ce8 +Block 0007 [ 36]: 6eed6c06e9e02dd6 +Block 0007 [ 37]: 9922babb8a661298 +Block 0007 [ 38]: b813c6bddbb4ac83 +Block 0007 [ 39]: 5b698fe61fc5208f +Block 0007 [ 40]: e706c9f769eba549 +Block 0007 [ 41]: df0f332b5b107970 +Block 0007 [ 42]: 0da80b0ad28623de +Block 0007 [ 43]: cf850bcda6e3de54 +Block 0007 [ 44]: 169055a58391024e +Block 0007 [ 45]: f92b9ffcf48a04df +Block 0007 [ 46]: 4124880c61e033e2 +Block 0007 [ 47]: e8345420f69b7b09 +Block 0007 [ 48]: db8e71e39ff08397 +Block 0007 [ 49]: 05bdc9300e0865d2 +Block 0007 [ 50]: 3109c1b72e9e5fc0 +Block 0007 [ 51]: f12bee6915c31c92 +Block 0007 [ 52]: c7d8812129b1e13f +Block 0007 [ 53]: 63fe835118a4449c +Block 0007 [ 54]: 66134014e4f99a06 +Block 0007 [ 55]: e03ed3e8aed721b1 +Block 0007 [ 56]: be7ddd16a45ed362 +Block 0007 [ 57]: 5d85f460481ef486 +Block 0007 [ 58]: 0d4e3d285acb2128 +Block 0007 [ 59]: a999dea8ad365308 +Block 0007 [ 60]: ca02a8b6803967e2 +Block 0007 [ 61]: a1c4d8818baeeb35 +Block 0007 [ 62]: 555ce5d78543ede5 +Block 0007 [ 63]: eb9ff1a5add111e3 +Block 0007 [ 64]: 439f9aea1de62ee3 +Block 0007 [ 65]: 7b59bf01ff510d8c +Block 0007 [ 66]: da2ac155c61c1f0b +Block 0007 [ 67]: 331dbc2c66eed4f2 +Block 0007 [ 68]: 652a5f3ab977b23b +Block 0007 [ 69]: 83fb468bb3e13696 +Block 0007 [ 70]: 03de2ebdd3f9bb1c +Block 0007 [ 71]: 5b3ca2644926db6c +Block 0007 [ 72]: 297776bedec9267b +Block 0007 [ 73]: 95beda56a6edbb35 +Block 0007 [ 74]: 94071492eece3348 +Block 0007 [ 75]: d77a89f14e33d1ee +Block 0007 [ 76]: d76fd7c32602756e +Block 0007 [ 77]: 1200fa9a61602f57 +Block 0007 [ 78]: 574bec69a352b0db +Block 0007 [ 79]: d42f7ae3ce87fc4e +Block 0007 [ 80]: a217f4ec297fe743 +Block 0007 [ 81]: 0d01f7578cf0e679 +Block 0007 [ 82]: ec97b5ce481abc89 +Block 0007 [ 83]: 656c1293bab962fb +Block 0007 [ 84]: 297a9721b48fa834 +Block 0007 [ 85]: 70a5ff29c7941f90 +Block 0007 [ 86]: b60f45feda3af7a6 +Block 0007 [ 87]: 548bdd7d053a03bd +Block 0007 [ 88]: 62d72d1ef6df5827 +Block 0007 [ 89]: 6131ae7350b40cc0 +Block 0007 [ 90]: 6b9f43233ba759c6 +Block 0007 [ 91]: 176cdac2adb09b47 +Block 0007 [ 92]: 6267a0329806fa44 +Block 0007 [ 93]: 3c305808bd0d2120 +Block 0007 [ 94]: 6479e3f470857aca +Block 0007 [ 95]: 8b0cf70ea2dc68d0 +Block 0007 [ 96]: 3de9c929d4af52fb +Block 0007 [ 97]: f80508a3f0cf5428 +Block 0007 [ 98]: 515b50830dc5d290 +Block 0007 [ 99]: bdcd51b2125a83ec +Block 0007 [100]: 3ed75ff8432271e0 +Block 0007 [101]: 4ba6ec3635b0e76b +Block 0007 [102]: 9ded925bce57397c +Block 0007 [103]: b93bdb8173bed393 +Block 0007 [104]: a11d019347a2c33c +Block 0007 [105]: 94101a31465b3284 +Block 0007 [106]: 7479e1eb888e7500 +Block 0007 [107]: b92a49c6d49f27bf +Block 0007 [108]: adf40d53776ed568 +Block 0007 [109]: f53fbe73cda6090f +Block 0007 [110]: 9b808347790c5d5a +Block 0007 [111]: 9622af5b138e5d69 +Block 0007 [112]: 4b659ba374ae26c0 +Block 0007 [113]: 24b1b1604d43976f +Block 0007 [114]: 1f8a68ffcab10d30 +Block 0007 [115]: 4535ac37b39b03b8 +Block 0007 [116]: 8f7f3080deaf81a1 +Block 0007 [117]: 603995246b14f01b +Block 0007 [118]: a780b701f2faaa04 +Block 0007 [119]: 156703383b497d9f +Block 0007 [120]: 38f0ec51b9bb66e0 +Block 0007 [121]: 1036342f66765314 +Block 0007 [122]: eb7c88a00e41ace8 +Block 0007 [123]: 9845e713fc5c9e5d +Block 0007 [124]: 1c99a9eaec15012c +Block 0007 [125]: 86fc425ad1459f8c +Block 0007 [126]: ecff41d17bc36118 +Block 0007 [127]: 0a65099375079ce5 +Block 0008 [ 0]: c7b8373a03afcf19 +Block 0008 [ 1]: a909269230364d43 +Block 0008 [ 2]: d799ffd1c5da04bd +Block 0008 [ 3]: 05f61178010cbb0b +Block 0008 [ 4]: 64b06d70c562fe17 +Block 0008 [ 5]: aa26efa251b45eb5 +Block 0008 [ 6]: 043edbf927768e4c +Block 0008 [ 7]: 4687854c9c446387 +Block 0008 [ 8]: 2ae6746e9e695849 +Block 0008 [ 9]: d632eaddeed40e2e +Block 0008 [ 10]: 2e1894229225f690 +Block 0008 [ 11]: cc681f3a01d12db0 +Block 0008 [ 12]: 59aa54aacd5118eb +Block 0008 [ 13]: b329a0950a899a89 +Block 0008 [ 14]: 49e3b4972c0de6f3 +Block 0008 [ 15]: 202fae02c2e5620a +Block 0008 [ 16]: f95b327c27fc70f3 +Block 0008 [ 17]: 3d5bb13789a7f840 +Block 0008 [ 18]: ca538a32e5cf05d7 +Block 0008 [ 19]: 6adc8c09af9cdd36 +Block 0008 [ 20]: 8009e1c4be9c7f1a +Block 0008 [ 21]: b6d9ebf3902cc509 +Block 0008 [ 22]: edfdc70b68ffe682 +Block 0008 [ 23]: 85971773ea2e2aa4 +Block 0008 [ 24]: fd5713a4dd2aae2f +Block 0008 [ 25]: 7fc21515c6515c23 +Block 0008 [ 26]: 134b73c32ec830e7 +Block 0008 [ 27]: 16835d88c1333f50 +Block 0008 [ 28]: 3bb27ca7d7a87a53 +Block 0008 [ 29]: 95714e2ec1a0baa0 +Block 0008 [ 30]: cc22ea124de03f5c +Block 0008 [ 31]: 6904cc3dfb20281f +Block 0008 [ 32]: 01f0d8396bee58ef +Block 0008 [ 33]: 01eec7dd2eff4865 +Block 0008 [ 34]: ed2bc2842d0add18 +Block 0008 [ 35]: 939c7b2dfe867802 +Block 0008 [ 36]: c5f57f1b42747a1f +Block 0008 [ 37]: 18af1227ebd86903 +Block 0008 [ 38]: 29b7dc33247912c4 +Block 0008 [ 39]: 00f4e97989cc3d8b +Block 0008 [ 40]: 61dd12b31336dd1d +Block 0008 [ 41]: 4b03857af3a06d71 +Block 0008 [ 42]: 725514d41421a49b +Block 0008 [ 43]: 23b3cbb357607d19 +Block 0008 [ 44]: 9b3927ecce07ceb9 +Block 0008 [ 45]: d0b7796042bfa8c6 +Block 0008 [ 46]: dd05d92323d8f813 +Block 0008 [ 47]: edf698eca5b99165 +Block 0008 [ 48]: b1dfdf82b4674811 +Block 0008 [ 49]: d5ca255656a63e19 +Block 0008 [ 50]: 197aac7dc09b8972 +Block 0008 [ 51]: d8d7a090740cf39a +Block 0008 [ 52]: b3ba2e7e524e0333 +Block 0008 [ 53]: 15ee29644b30bc96 +Block 0008 [ 54]: 12659f1a6a71b53b +Block 0008 [ 55]: e660b364e9e01413 +Block 0008 [ 56]: d8e60ba470f76e03 +Block 0008 [ 57]: 2268390a9c96548c +Block 0008 [ 58]: c2718c9dad08f162 +Block 0008 [ 59]: 65873efcb59a5197 +Block 0008 [ 60]: 2e05ebb8441f3edc +Block 0008 [ 61]: 6a9d2c0ab8c851db +Block 0008 [ 62]: ad24c928e658d046 +Block 0008 [ 63]: 50b6fc4bb8747b9b +Block 0008 [ 64]: 9be93e96d85b3f3a +Block 0008 [ 65]: c5ddc41b9c0c0433 +Block 0008 [ 66]: 5951b4a1ef885444 +Block 0008 [ 67]: dda7ec0d8457ebdf +Block 0008 [ 68]: 3ea34e7424121003 +Block 0008 [ 69]: 6351dfbe0f2744ef +Block 0008 [ 70]: baae70fdb538a0eb +Block 0008 [ 71]: 4e3a6085ef5f6c36 +Block 0008 [ 72]: bc0b3847702a388c +Block 0008 [ 73]: 2632f243eae0de51 +Block 0008 [ 74]: 83f4c3031c53da8f +Block 0008 [ 75]: 7ca1d5c056c3212c +Block 0008 [ 76]: e91d5c35bf2ac359 +Block 0008 [ 77]: 6ef5fcb669f8ba32 +Block 0008 [ 78]: a2d6070fb37dcea8 +Block 0008 [ 79]: d97f93802d983edb +Block 0008 [ 80]: 6f8d6d93927e937f +Block 0008 [ 81]: 539b8ba74e47a85a +Block 0008 [ 82]: d267a050f43e6edd +Block 0008 [ 83]: 9d606704b2663688 +Block 0008 [ 84]: 8b2648fb1289be9a +Block 0008 [ 85]: 21423b5e0d4e0114 +Block 0008 [ 86]: 502ea60aafcca859 +Block 0008 [ 87]: 2a71e295504afee6 +Block 0008 [ 88]: e27ca4bbe595d9c9 +Block 0008 [ 89]: 5b6f28b95c8ef12d +Block 0008 [ 90]: fa7883e79e4ebc9d +Block 0008 [ 91]: 74e9bd98da31842a +Block 0008 [ 92]: e7b9a0a7b5a3bf38 +Block 0008 [ 93]: dd3e398aebf1a877 +Block 0008 [ 94]: 07695e81f360ae4e +Block 0008 [ 95]: b6b30c9f4a29c2e8 +Block 0008 [ 96]: a9e06a63186894a6 +Block 0008 [ 97]: 7eb26e252eaa9995 +Block 0008 [ 98]: 93c64e8f318d7406 +Block 0008 [ 99]: 3adec85056ae3778 +Block 0008 [100]: 27f889dd9c85f165 +Block 0008 [101]: bd35ba0e789faee7 +Block 0008 [102]: 2c7c406b25d07593 +Block 0008 [103]: fb8a4b223e6131d3 +Block 0008 [104]: b5420c0981e94c1c +Block 0008 [105]: c2c33dc496497614 +Block 0008 [106]: 29df3353953d0207 +Block 0008 [107]: 5549a76b170723a4 +Block 0008 [108]: c20d3ae7f46d1982 +Block 0008 [109]: 422a49338347bbf8 +Block 0008 [110]: bfdec4da70aaedda +Block 0008 [111]: d91860f96421332f +Block 0008 [112]: 7b83b4377f28e210 +Block 0008 [113]: 45883aaa3c712c74 +Block 0008 [114]: 5b9bf0574f48e65a +Block 0008 [115]: 1ca2c6c126b50d21 +Block 0008 [116]: 9c1d4d9a7b519d7a +Block 0008 [117]: d1b495c6e63178de +Block 0008 [118]: c7f5aedc253cc38a +Block 0008 [119]: c10d67ddd0010dcd +Block 0008 [120]: d26f4968efdf04e4 +Block 0008 [121]: 254d3c73de94f530 +Block 0008 [122]: ee5fe9b21a65c3c2 +Block 0008 [123]: 0da2241e73889e92 +Block 0008 [124]: 15e1ecdf444ae9d9 +Block 0008 [125]: 5a0c111eb92c79ed +Block 0008 [126]: be331ef95f53d838 +Block 0008 [127]: 77474ea5a67680d4 +Block 0009 [ 0]: df0b91c201ac9942 +Block 0009 [ 1]: 6f84a33c554aa710 +Block 0009 [ 2]: 35ba5e6d84d3003f +Block 0009 [ 3]: b9456bd3dbb0a7f0 +Block 0009 [ 4]: 414d82dc7ee872f1 +Block 0009 [ 5]: a691e74cb34e90e1 +Block 0009 [ 6]: 221c06abd68740bc +Block 0009 [ 7]: ffad697908129e72 +Block 0009 [ 8]: 62a15c20d7cd2102 +Block 0009 [ 9]: d673060f04c04527 +Block 0009 [ 10]: cb6edf766a1bb01a +Block 0009 [ 11]: 0935c95a41b7811c +Block 0009 [ 12]: 448cb94eb2908b5b +Block 0009 [ 13]: ec311c1e42dce2e6 +Block 0009 [ 14]: 62982ffdc03b54a1 +Block 0009 [ 15]: a717faed7ee8fe1f +Block 0009 [ 16]: ba087cf64c4f938b +Block 0009 [ 17]: 6c895b58388893e9 +Block 0009 [ 18]: 3aca50c898a8b894 +Block 0009 [ 19]: 6f42216ee699b812 +Block 0009 [ 20]: f1a0099713f54a5b +Block 0009 [ 21]: e8e9afff66b861a8 +Block 0009 [ 22]: d5a17492de8da115 +Block 0009 [ 23]: 88acec5c381891ef +Block 0009 [ 24]: b094197c22566803 +Block 0009 [ 25]: 09139c3d2e44ffd2 +Block 0009 [ 26]: a41e2680e6f77d5c +Block 0009 [ 27]: 9e5dfcf66915ec5c +Block 0009 [ 28]: ece54cdfb9c923bb +Block 0009 [ 29]: 6b26d1a619995eb8 +Block 0009 [ 30]: 1fde8b780d9e7644 +Block 0009 [ 31]: 5b20ab006f62f2ea +Block 0009 [ 32]: e7fb9f5efb397851 +Block 0009 [ 33]: ec03581a4debc462 +Block 0009 [ 34]: 2739621c0dc6a51c +Block 0009 [ 35]: 43a677040f16655f +Block 0009 [ 36]: 8a86af39727c0788 +Block 0009 [ 37]: 67f66e4a6f77a496 +Block 0009 [ 38]: 3706c9a8b8ce7405 +Block 0009 [ 39]: 7c64362723e93e2a +Block 0009 [ 40]: d5ff005efd480c4e +Block 0009 [ 41]: 35f1600688530496 +Block 0009 [ 42]: 6aab73eb7272c1f7 +Block 0009 [ 43]: 6e4358e5606a2975 +Block 0009 [ 44]: a9f7d62b60fde122 +Block 0009 [ 45]: c8feb2c548dc793d +Block 0009 [ 46]: 9fe4708f7b2674b6 +Block 0009 [ 47]: 77a810d3a075fb57 +Block 0009 [ 48]: 3c0aa6c3fd7c85c5 +Block 0009 [ 49]: f2ffdbe790966f93 +Block 0009 [ 50]: 124ac9d5b645bc85 +Block 0009 [ 51]: 3060cc4d585e3d3e +Block 0009 [ 52]: 6dc9615348e9a3a2 +Block 0009 [ 53]: 853c7f38065107a9 +Block 0009 [ 54]: 421c82c549418317 +Block 0009 [ 55]: 3876db61dfb07871 +Block 0009 [ 56]: df06b1a43b9f66e4 +Block 0009 [ 57]: dff0f687fb927041 +Block 0009 [ 58]: 28cea38d6bd0ad43 +Block 0009 [ 59]: 0919aefbb62cae91 +Block 0009 [ 60]: 5746f327f0d2c535 +Block 0009 [ 61]: bb1365ac1e29ed76 +Block 0009 [ 62]: 93e745dad8a15140 +Block 0009 [ 63]: 3e3b193f8039d2fc +Block 0009 [ 64]: 85f0282c2d6a7563 +Block 0009 [ 65]: 0817805a055c26d1 +Block 0009 [ 66]: bfc51a96ba75a093 +Block 0009 [ 67]: 373fa1d846b62445 +Block 0009 [ 68]: e5cca7f5e9a9cbfa +Block 0009 [ 69]: a9ae844f885d9717 +Block 0009 [ 70]: 033be7201ffbb7fb +Block 0009 [ 71]: fe195a9b641b8799 +Block 0009 [ 72]: 6faba5c8e09d08a7 +Block 0009 [ 73]: 741b0907be8041ad +Block 0009 [ 74]: a96e074f55d6e5d4 +Block 0009 [ 75]: c6357f6ea02ffebd +Block 0009 [ 76]: b73816039f6bfb08 +Block 0009 [ 77]: f751a43d44b91ae2 +Block 0009 [ 78]: 1c3f09adcb6ba95d +Block 0009 [ 79]: cf75b0d707c9076d +Block 0009 [ 80]: 0a36fbe33c195174 +Block 0009 [ 81]: 453d81dcc483bdfd +Block 0009 [ 82]: 167edac1e41e46a7 +Block 0009 [ 83]: 328951c98589b0c0 +Block 0009 [ 84]: 160b54035815a09b +Block 0009 [ 85]: 00c1a36ce87d19ea +Block 0009 [ 86]: ef89588811143eae +Block 0009 [ 87]: 937f4f7560fce6a6 +Block 0009 [ 88]: 6cdec3ff6d2fa1e5 +Block 0009 [ 89]: 1a4ce03b83a4756e +Block 0009 [ 90]: da04b76d964e22c1 +Block 0009 [ 91]: a687274ca5a25edb +Block 0009 [ 92]: 84550fb207c15e94 +Block 0009 [ 93]: 55750f5fc80b47cd +Block 0009 [ 94]: cad236b1b597349e +Block 0009 [ 95]: 4e727ce399eff6d4 +Block 0009 [ 96]: 9d505481b2e3a51d +Block 0009 [ 97]: d5dfe11e287ed9d8 +Block 0009 [ 98]: 8ce7404ff599fc0d +Block 0009 [ 99]: 470204f510acde3d +Block 0009 [100]: 7ba66fe889c92854 +Block 0009 [101]: 87a5e69764636033 +Block 0009 [102]: 1e9001e57e736fd8 +Block 0009 [103]: 314909f6a2145aeb +Block 0009 [104]: efcf1e079bd105d6 +Block 0009 [105]: 8d242a18dcaa54e8 +Block 0009 [106]: a0a0573d9ce69ea3 +Block 0009 [107]: 938f115268396030 +Block 0009 [108]: c0378868d849d6e3 +Block 0009 [109]: ff1ee578eb3efd31 +Block 0009 [110]: d99a19b5bab336b5 +Block 0009 [111]: 1a7ba6b9c5872d86 +Block 0009 [112]: f9def2da6991a973 +Block 0009 [113]: 66a1e2cfaf0e0306 +Block 0009 [114]: 08fc893a0791480b +Block 0009 [115]: 1a73d52f72c63b82 +Block 0009 [116]: a33f2756e9253bbf +Block 0009 [117]: db0eff2fe9b13cd1 +Block 0009 [118]: 20973b7c758a661b +Block 0009 [119]: 2ff8806c93d75f4d +Block 0009 [120]: 9f1b9a5847d11da0 +Block 0009 [121]: 7d3b5cf7a4b7480d +Block 0009 [122]: 1d9fc165c758470b +Block 0009 [123]: 20b09f8a91462fef +Block 0009 [124]: 2129bc88a3e6a062 +Block 0009 [125]: f60f313a41a62bc4 +Block 0009 [126]: b2b2b34de8ebc90b +Block 0009 [127]: c6fd6b970f06e693 +Block 0010 [ 0]: 7f28485fae41c61c +Block 0010 [ 1]: fa0e3699cacc16d6 +Block 0010 [ 2]: a39c1aeed6d8b1c5 +Block 0010 [ 3]: 2883a312a09ad027 +Block 0010 [ 4]: cd3dd30e9b73b638 +Block 0010 [ 5]: 0c230d1074fe6f1f +Block 0010 [ 6]: 872452b98d232b2d +Block 0010 [ 7]: d775c1dacfaa7291 +Block 0010 [ 8]: 4d18e07ff6ca6eca +Block 0010 [ 9]: c348c6fbe35488f1 +Block 0010 [ 10]: 0c5f31be7aa5dd25 +Block 0010 [ 11]: 19d25fc35b7d789c +Block 0010 [ 12]: 7d366311f524a40a +Block 0010 [ 13]: fd82d9e641be9ce2 +Block 0010 [ 14]: f36648db501fc410 +Block 0010 [ 15]: 1fc0a7744abcfa1d +Block 0010 [ 16]: 2a74b93921014e03 +Block 0010 [ 17]: b3a6cfb22b82411f +Block 0010 [ 18]: 51e31c21bf3b2e34 +Block 0010 [ 19]: 6fb5abccf04dd2ec +Block 0010 [ 20]: 6dec81c70a782857 +Block 0010 [ 21]: 7d6c3372de7fbc24 +Block 0010 [ 22]: b5b6db12d3950a7e +Block 0010 [ 23]: 0e302839a31adc16 +Block 0010 [ 24]: 7cfba0473276dfc8 +Block 0010 [ 25]: e76109ead5cb5713 +Block 0010 [ 26]: 977e8bb574655f2f +Block 0010 [ 27]: c018185c2e3194dc +Block 0010 [ 28]: af61a2e2ebd8d8b4 +Block 0010 [ 29]: ee452ff8638d2b76 +Block 0010 [ 30]: ad55d266b0a40fb7 +Block 0010 [ 31]: 9889b7b971559a8e +Block 0010 [ 32]: a0fc23672a1e3bdf +Block 0010 [ 33]: 22ce2f07ad81e8de +Block 0010 [ 34]: 36ad96edda3bc8ca +Block 0010 [ 35]: 798d57c8c93f90e8 +Block 0010 [ 36]: e92afe4eabe2a1fa +Block 0010 [ 37]: 2dbb943d1de32244 +Block 0010 [ 38]: 84185c9ff10b4bcd +Block 0010 [ 39]: 25dae614f6f1e22b +Block 0010 [ 40]: ff3eee5a96aaf550 +Block 0010 [ 41]: 81381c491228560f +Block 0010 [ 42]: 803068857fd344e6 +Block 0010 [ 43]: c262bae576bdc7a9 +Block 0010 [ 44]: dfcec333f8b614b2 +Block 0010 [ 45]: 0aea3363bc3f344f +Block 0010 [ 46]: e18f0e0fcfa93d3c +Block 0010 [ 47]: 163e0a5dc3385a98 +Block 0010 [ 48]: 33c39e1b90c79bd6 +Block 0010 [ 49]: 5103572896584153 +Block 0010 [ 50]: 96623b63a57b0bcc +Block 0010 [ 51]: 8e5ee0c45887b09e +Block 0010 [ 52]: 7d6a8e036120ab2d +Block 0010 [ 53]: 32e46fc380011af5 +Block 0010 [ 54]: 557a7fb0b35b654f +Block 0010 [ 55]: 1d761afb9840f219 +Block 0010 [ 56]: afdad24da5bb7960 +Block 0010 [ 57]: bec28f0e94eec4a2 +Block 0010 [ 58]: b7fa86989ab8d5b4 +Block 0010 [ 59]: 66a4445fc047769a +Block 0010 [ 60]: 77e19aa42c9d10dc +Block 0010 [ 61]: 07a2a97a497dddca +Block 0010 [ 62]: b3571484eb5cdd0d +Block 0010 [ 63]: e175aa9b42cf3f42 +Block 0010 [ 64]: ddca20a6db44c602 +Block 0010 [ 65]: ef338426828143e3 +Block 0010 [ 66]: dd54632ca39231d3 +Block 0010 [ 67]: da1a2aa2859745fe +Block 0010 [ 68]: 74c97c8b2f33815a +Block 0010 [ 69]: c587421d57acf7f7 +Block 0010 [ 70]: 40d9dac9740b5349 +Block 0010 [ 71]: 0079c459c34cbc1f +Block 0010 [ 72]: 11e22f1682a3d113 +Block 0010 [ 73]: 9f49acd929fb413a +Block 0010 [ 74]: 8d55e456f55ed16d +Block 0010 [ 75]: cde96d37e1873857 +Block 0010 [ 76]: d1085cc95b3f405c +Block 0010 [ 77]: 37d477127dbef7bb +Block 0010 [ 78]: ead42fea0cf6cc80 +Block 0010 [ 79]: 044df94d21ddf550 +Block 0010 [ 80]: c53012b904c24725 +Block 0010 [ 81]: 95525031d1d04639 +Block 0010 [ 82]: 3863c49fc1087d2c +Block 0010 [ 83]: e6cf4f4ff7ce84da +Block 0010 [ 84]: bf23a90a9ae33ca2 +Block 0010 [ 85]: c47710c3a39f7fb6 +Block 0010 [ 86]: 948a6ccc2dfebdde +Block 0010 [ 87]: 7e021070b78e487a +Block 0010 [ 88]: 8ca241ffb7134f11 +Block 0010 [ 89]: 53cc15226ffa4c7b +Block 0010 [ 90]: bda5cfd2e8dd1214 +Block 0010 [ 91]: 8013e83689e4af42 +Block 0010 [ 92]: 832f073728faedfc +Block 0010 [ 93]: 2b696689ba886915 +Block 0010 [ 94]: f0122a38f0387b7b +Block 0010 [ 95]: d937260fe6a46278 +Block 0010 [ 96]: b623d52be1e296b9 +Block 0010 [ 97]: b49b26e8a40c5ae9 +Block 0010 [ 98]: 070f2c1b5c164fbd +Block 0010 [ 99]: ae118485ef77d8a2 +Block 0010 [100]: 1ccd3e8d85b1349d +Block 0010 [101]: df681302bae21e79 +Block 0010 [102]: a3e3e386c1566cd8 +Block 0010 [103]: dbf2c62d8af9d80b +Block 0010 [104]: 3fbd2fe86a0b078c +Block 0010 [105]: fd47ca2204a21f5b +Block 0010 [106]: 29cae7cb46b8a80b +Block 0010 [107]: 591c6568a46874b5 +Block 0010 [108]: 3f9df5a1623a987c +Block 0010 [109]: 11078c2b31dc9255 +Block 0010 [110]: 573467550986e576 +Block 0010 [111]: 5e6d3a4952a53546 +Block 0010 [112]: f0028177e38f421f +Block 0010 [113]: faf300a788ac70f8 +Block 0010 [114]: 1d79e8592eccf877 +Block 0010 [115]: 9f54739a8ac85f76 +Block 0010 [116]: a9e12fbae12e7a33 +Block 0010 [117]: 2584032801e3d559 +Block 0010 [118]: 11ff32939bd33fc2 +Block 0010 [119]: dd1e2b237b40a4d5 +Block 0010 [120]: 40b45c342afb5ed2 +Block 0010 [121]: 61bebe9cc3085fd4 +Block 0010 [122]: f4414aa37eab423e +Block 0010 [123]: 883c290ebbd8386e +Block 0010 [124]: ceeee1728db78c38 +Block 0010 [125]: 1e9954eaf177ed07 +Block 0010 [126]: 80018b0ffa4ada6b +Block 0010 [127]: 69ea0fe2bdb6aa7a +Block 0011 [ 0]: d823f2ebb073e169 +Block 0011 [ 1]: 46519cc7f32a3184 +Block 0011 [ 2]: 4f848c9df11c5dda +Block 0011 [ 3]: 0f95888556fe6484 +Block 0011 [ 4]: 5911f3c5a44cdb8f +Block 0011 [ 5]: 047ccd76c309cd9d +Block 0011 [ 6]: 8c7b47757a961e06 +Block 0011 [ 7]: a04e66f30643b51a +Block 0011 [ 8]: 7e9952d3090e28c7 +Block 0011 [ 9]: 27affecba3781f12 +Block 0011 [ 10]: 9655174693d550f4 +Block 0011 [ 11]: ee56b2a2a45941c6 +Block 0011 [ 12]: 8444478ca6156892 +Block 0011 [ 13]: 2744ee006e719b9d +Block 0011 [ 14]: c206b56f3ad73389 +Block 0011 [ 15]: 90eeab895899816c +Block 0011 [ 16]: 47b96ec2889a0e0b +Block 0011 [ 17]: 42ad9f254176d076 +Block 0011 [ 18]: f2f0875c81641f2c +Block 0011 [ 19]: d22978dd69845640 +Block 0011 [ 20]: ac102ad40d55b4f2 +Block 0011 [ 21]: 7dd10f15753e0c69 +Block 0011 [ 22]: a5af151b885e7e1c +Block 0011 [ 23]: 0f61a9031d9ad58a +Block 0011 [ 24]: 96147a38e8dd8e86 +Block 0011 [ 25]: 03b33d8df8bd05c1 +Block 0011 [ 26]: 2eb2d3b258561281 +Block 0011 [ 27]: 10340f5f1464ceda +Block 0011 [ 28]: e84e6ce48d91c47c +Block 0011 [ 29]: 2f52565f4b181ee7 +Block 0011 [ 30]: 99a673ad0f52411c +Block 0011 [ 31]: d238746f84d376a7 +Block 0011 [ 32]: ca2e030fb3e59fac +Block 0011 [ 33]: b33a1e2a6e6c32c8 +Block 0011 [ 34]: 4f5c8d8b74603beb +Block 0011 [ 35]: 5815912b2102decb +Block 0011 [ 36]: a6342080776818bc +Block 0011 [ 37]: 65465d7fe8ba063c +Block 0011 [ 38]: 924c3979ef6625a7 +Block 0011 [ 39]: 5f7b5b4d3f1a7de7 +Block 0011 [ 40]: 1387c91b9e3db3c2 +Block 0011 [ 41]: 3f969d2f0cf22e3d +Block 0011 [ 42]: 2ca2cda6f702248a +Block 0011 [ 43]: 07c264c15cb53a0a +Block 0011 [ 44]: 4d68922b1bf0578f +Block 0011 [ 45]: 9f4c622f27a9a767 +Block 0011 [ 46]: 551068996b9b9536 +Block 0011 [ 47]: 5ce843c9978c4d5f +Block 0011 [ 48]: d2af7fa4b7eb3eca +Block 0011 [ 49]: 4f1f0be1f941743a +Block 0011 [ 50]: b4ac8888be21332c +Block 0011 [ 51]: 270213a33fd89c67 +Block 0011 [ 52]: 4c9a215ddea4eebd +Block 0011 [ 53]: d0d8fb405477e881 +Block 0011 [ 54]: 3228f4ef397151a0 +Block 0011 [ 55]: a65c58eff39fa3d3 +Block 0011 [ 56]: 69c1497ca3b35d50 +Block 0011 [ 57]: 6b3aefd106898e22 +Block 0011 [ 58]: f4c3551419449f2b +Block 0011 [ 59]: a83c18e589503f1c +Block 0011 [ 60]: c97a73e6930cd38c +Block 0011 [ 61]: d11ab42796550a96 +Block 0011 [ 62]: 21bb952c8d1522ba +Block 0011 [ 63]: b3efb673edd0a50f +Block 0011 [ 64]: 6f3405964b106ed3 +Block 0011 [ 65]: 0fd159cc65a4e29f +Block 0011 [ 66]: a446f1dadfe504ce +Block 0011 [ 67]: 09bf99d9e804173e +Block 0011 [ 68]: 8470e09c51c6888c +Block 0011 [ 69]: e322d994f8b8e653 +Block 0011 [ 70]: 03e5107f547300e7 +Block 0011 [ 71]: 231647ee75a19f77 +Block 0011 [ 72]: 792ebd93791dd994 +Block 0011 [ 73]: 6684d2596987264d +Block 0011 [ 74]: 990e8bb7a7203131 +Block 0011 [ 75]: e432392c73dfc169 +Block 0011 [ 76]: 6aa53e7f024864bb +Block 0011 [ 77]: 90b67a6404e4845e +Block 0011 [ 78]: cbb23f233d34e66f +Block 0011 [ 79]: ff24fa04d9641ec6 +Block 0011 [ 80]: 778a4af4e74881db +Block 0011 [ 81]: 55907243faa69d05 +Block 0011 [ 82]: 4d4eabb494518c3b +Block 0011 [ 83]: 51c8c63a21531614 +Block 0011 [ 84]: cb1f11f105d6527a +Block 0011 [ 85]: 8fa5d40948ca6b4b +Block 0011 [ 86]: aeec5faad1b394de +Block 0011 [ 87]: 566679c3acdfdc7f +Block 0011 [ 88]: 6aeaa509ee1684f3 +Block 0011 [ 89]: e5e1f3b93ab07726 +Block 0011 [ 90]: 8cc62c076b72fe44 +Block 0011 [ 91]: f050819d8070c2d8 +Block 0011 [ 92]: a1654238bfb3e902 +Block 0011 [ 93]: 3e144a6601da32e4 +Block 0011 [ 94]: 8533f4d5df28925b +Block 0011 [ 95]: a0bf7983730213ee +Block 0011 [ 96]: 2d567f30d0b78b29 +Block 0011 [ 97]: fc8ffa1db1747998 +Block 0011 [ 98]: 7a79aea920f07bf1 +Block 0011 [ 99]: 60af46d99fb415d9 +Block 0011 [100]: 98a8e3eac4feab2f +Block 0011 [101]: cde6076dc1e41778 +Block 0011 [102]: 81b0b241fbfd5723 +Block 0011 [103]: 54d86946e10611d4 +Block 0011 [104]: be570072842ef00c +Block 0011 [105]: da8ba670370d14d9 +Block 0011 [106]: c9a8c79266e18357 +Block 0011 [107]: 4662021e96128f26 +Block 0011 [108]: b8890ef03513d9bd +Block 0011 [109]: b1e765b25512b72b +Block 0011 [110]: acc815dc214f985a +Block 0011 [111]: f2ff2d27f6197b46 +Block 0011 [112]: b0a04bbe8189bd51 +Block 0011 [113]: 038adddc71436c5c +Block 0011 [114]: 78be2a6b143beef9 +Block 0011 [115]: d47ef4fc71fd2449 +Block 0011 [116]: 1ac251a8b10bdaa5 +Block 0011 [117]: 38b1bdca6eb395b5 +Block 0011 [118]: 91cdd37a5d6d2917 +Block 0011 [119]: 6468c1d2a90a4b95 +Block 0011 [120]: f38298e9fbc627c5 +Block 0011 [121]: 281974ebb62f612f +Block 0011 [122]: dae84d62736df3f7 +Block 0011 [123]: 883fd538755b4678 +Block 0011 [124]: 0cb05ee801034510 +Block 0011 [125]: 380a81fcaae4ffe7 +Block 0011 [126]: 1c67d5d638d87f6e +Block 0011 [127]: b411a4d3d2ec2e9a +Block 0012 [ 0]: 255a9eb92510e44c +Block 0012 [ 1]: ab09530dd4233898 +Block 0012 [ 2]: cc05fd96a7df19de +Block 0012 [ 3]: 5da89b50eb7b0b3a +Block 0012 [ 4]: 312be76cd0558c61 +Block 0012 [ 5]: 6f5bcb47082a3df8 +Block 0012 [ 6]: 9f3c3393b98d51af +Block 0012 [ 7]: 5920d6c03f222d41 +Block 0012 [ 8]: 6f8a719295acfb80 +Block 0012 [ 9]: 6d7eed73e7fe9237 +Block 0012 [ 10]: 50ef8a3b6ebca6e9 +Block 0012 [ 11]: 99630c77a40fd8a3 +Block 0012 [ 12]: 9f9c89e408a22382 +Block 0012 [ 13]: e7e28e5874c52548 +Block 0012 [ 14]: 622a178029f344dc +Block 0012 [ 15]: b67d1c8303474a0a +Block 0012 [ 16]: 8bcede5c0ce2b4bb +Block 0012 [ 17]: a8b113091a2d1018 +Block 0012 [ 18]: 6fb492543aef040b +Block 0012 [ 19]: 0fdd1b28f42219fd +Block 0012 [ 20]: 8747821d660abab9 +Block 0012 [ 21]: 1911fb0f8d6a8859 +Block 0012 [ 22]: 729b9d38a3a185ac +Block 0012 [ 23]: 22154ac1267c55f6 +Block 0012 [ 24]: 768581ee4cbf975a +Block 0012 [ 25]: d25cdb1b4eab5257 +Block 0012 [ 26]: c8d1be9a40ebb82a +Block 0012 [ 27]: 90fdbe85e0f2fa15 +Block 0012 [ 28]: 054f461c93f2cec6 +Block 0012 [ 29]: a7496a0a5b20aeff +Block 0012 [ 30]: e01336457c5f1c2f +Block 0012 [ 31]: 69b6b95906a2eeaf +Block 0012 [ 32]: af2080da4ac007b2 +Block 0012 [ 33]: dc62b604cb5a4602 +Block 0012 [ 34]: 2b75460cd6b53759 +Block 0012 [ 35]: 9c947680980c66e9 +Block 0012 [ 36]: 2046e8f3c6a206f6 +Block 0012 [ 37]: c7e1eb7be31fa0b7 +Block 0012 [ 38]: 10b8eb7cc13e0991 +Block 0012 [ 39]: bea9cad97d149702 +Block 0012 [ 40]: b024e48f310144e0 +Block 0012 [ 41]: b9567a121acd2beb +Block 0012 [ 42]: 13b54389c87bd0b9 +Block 0012 [ 43]: e840a59948b3ec6f +Block 0012 [ 44]: 4909028080039634 +Block 0012 [ 45]: 0940ce4447d5a1e3 +Block 0012 [ 46]: 7ace92df7b8ad234 +Block 0012 [ 47]: 70a2a6faedf67a19 +Block 0012 [ 48]: d95b9fa5d551d6ca +Block 0012 [ 49]: d28fea58f9706160 +Block 0012 [ 50]: 4f6a0afa04d55adc +Block 0012 [ 51]: 4aec847e4b35b540 +Block 0012 [ 52]: 4798eedea9043c96 +Block 0012 [ 53]: 29fcb2a949e28343 +Block 0012 [ 54]: 50fee2618212eac1 +Block 0012 [ 55]: a2deb2055db58493 +Block 0012 [ 56]: 2130cae1cfaa3b52 +Block 0012 [ 57]: ed2a5651338720be +Block 0012 [ 58]: 74f9f622c7c4cb2c +Block 0012 [ 59]: c7f914e1e1ee88e9 +Block 0012 [ 60]: 4dd5bdd2e0dfb82d +Block 0012 [ 61]: 761e7529cfa5d50a +Block 0012 [ 62]: aee434fec94bea69 +Block 0012 [ 63]: 4fb829ad4214b9a3 +Block 0012 [ 64]: 45a6f3618a66137b +Block 0012 [ 65]: 759f870df4bb89ff +Block 0012 [ 66]: d5d451ab02f2fb17 +Block 0012 [ 67]: 065ee57f45efe776 +Block 0012 [ 68]: c440fda2ebae75a1 +Block 0012 [ 69]: 3619f9566b18cb66 +Block 0012 [ 70]: 4f694a31736272c0 +Block 0012 [ 71]: 83dcedfe72f8a5a6 +Block 0012 [ 72]: fd5ed48b69e26467 +Block 0012 [ 73]: c3ad2a9085b2350a +Block 0012 [ 74]: 0fa2a974fa66c2c5 +Block 0012 [ 75]: 824b1a0c0e320544 +Block 0012 [ 76]: 481a05e369d0b679 +Block 0012 [ 77]: 88d130e03144508c +Block 0012 [ 78]: 8fee335301144988 +Block 0012 [ 79]: 07497f7f4f8f897f +Block 0012 [ 80]: ebadd1b8bab2e986 +Block 0012 [ 81]: 1fdc42aa71ec04af +Block 0012 [ 82]: c830f16a2bce327f +Block 0012 [ 83]: 5c3422bc14a97050 +Block 0012 [ 84]: 555dc50f03762d67 +Block 0012 [ 85]: 465d7bb016a6feb5 +Block 0012 [ 86]: 2846817750c5d35d +Block 0012 [ 87]: 39543ba8b29341bc +Block 0012 [ 88]: b57a159c3bb2983b +Block 0012 [ 89]: 83a82c2208e51f99 +Block 0012 [ 90]: 60af61a328b09433 +Block 0012 [ 91]: d88f44d23202be03 +Block 0012 [ 92]: d766959e1b39aee3 +Block 0012 [ 93]: f8f2f9fef0993a41 +Block 0012 [ 94]: 3d4ef27f410409b0 +Block 0012 [ 95]: be039e6fec5957e7 +Block 0012 [ 96]: 088f51f404d0521d +Block 0012 [ 97]: 9b65dc9f2cc2aede +Block 0012 [ 98]: dc7536661a38a7a6 +Block 0012 [ 99]: bdd0ab6161ff4b1f +Block 0012 [100]: 389e53c15ff15cfd +Block 0012 [101]: 5defd83b8336d489 +Block 0012 [102]: 82302e22360576cc +Block 0012 [103]: 63dbfb98dc759bf0 +Block 0012 [104]: d320499ef0240bff +Block 0012 [105]: 867e9e1e82eeea0b +Block 0012 [106]: 11892cf6c3b16ea4 +Block 0012 [107]: 97425b3f8cc22294 +Block 0012 [108]: 6b60c1ee9c86bcac +Block 0012 [109]: 8f670c048b878783 +Block 0012 [110]: 1cbc5ee997483f3f +Block 0012 [111]: 4e5f800e1f0ed9fb +Block 0012 [112]: ac4d54811845bca5 +Block 0012 [113]: 83d6a4180f6c8246 +Block 0012 [114]: 87152434ac5293c0 +Block 0012 [115]: d396cbfe0bc020d8 +Block 0012 [116]: 332f6ef4428d5b67 +Block 0012 [117]: 24cc04221d2e1699 +Block 0012 [118]: effe0e0dce6c104f +Block 0012 [119]: 1deeabd514dc5327 +Block 0012 [120]: 7d59839dee7245b2 +Block 0012 [121]: 0f700c906b853913 +Block 0012 [122]: a2d8cc9aaf4d3706 +Block 0012 [123]: b7e258900647c992 +Block 0012 [124]: 5bec1c3ad11b4eb1 +Block 0012 [125]: 6c80045a4fee4b05 +Block 0012 [126]: e1552dff02e38133 +Block 0012 [127]: 679e80e021c84ecd +Block 0013 [ 0]: 1723ee8ce9fe1cac +Block 0013 [ 1]: d2f1cf9a4efa84b5 +Block 0013 [ 2]: 21587dbfcad9c4f5 +Block 0013 [ 3]: 5f871948d46daee6 +Block 0013 [ 4]: 068d97e3ae68ef93 +Block 0013 [ 5]: d538dcb328807ab7 +Block 0013 [ 6]: 113a40488be45963 +Block 0013 [ 7]: 37012839c0b5d310 +Block 0013 [ 8]: 8d6f6941e2bd76e9 +Block 0013 [ 9]: aa2ffed5d74653c8 +Block 0013 [ 10]: e9164847b7b793b8 +Block 0013 [ 11]: b7539783560cb3ab +Block 0013 [ 12]: 8de392422de03196 +Block 0013 [ 13]: 7b38cb4bbe90d7f9 +Block 0013 [ 14]: 20a86166f8a23ddb +Block 0013 [ 15]: 8b97d267f05b6cfa +Block 0013 [ 16]: 911169ae5649dd39 +Block 0013 [ 17]: 768d987294702a52 +Block 0013 [ 18]: 8bdfb68d467ab96d +Block 0013 [ 19]: 9bf0c3c34022df10 +Block 0013 [ 20]: bc787b4af1321929 +Block 0013 [ 21]: a8a08098fa5e3ea1 +Block 0013 [ 22]: 7b2bb14c18b18dac +Block 0013 [ 23]: 2bf9072250cfbd58 +Block 0013 [ 24]: 10712cfa1552dc46 +Block 0013 [ 25]: 1fdedfc0b64c31dd +Block 0013 [ 26]: 7e366ca0e007c421 +Block 0013 [ 27]: f73cb101f76605d5 +Block 0013 [ 28]: c7f412423441e907 +Block 0013 [ 29]: d287f4339efbb55b +Block 0013 [ 30]: 9769f3f35d0f638b +Block 0013 [ 31]: 35208e3a65e08351 +Block 0013 [ 32]: 36fddf107a016fc4 +Block 0013 [ 33]: be86c0425851e7b0 +Block 0013 [ 34]: b941755a95f42f24 +Block 0013 [ 35]: aca5df3e21444d03 +Block 0013 [ 36]: a4a0384e3a78c869 +Block 0013 [ 37]: 010bbb7f8f85b95b +Block 0013 [ 38]: e55b719afc352f94 +Block 0013 [ 39]: acae794987894403 +Block 0013 [ 40]: bd806954f12b3ba8 +Block 0013 [ 41]: 7da659f1b0c29ad2 +Block 0013 [ 42]: e3b91d833ae0ecf4 +Block 0013 [ 43]: 8347b8bb6a793d24 +Block 0013 [ 44]: b488b65397e96b6d +Block 0013 [ 45]: 5be99ed08c53a17d +Block 0013 [ 46]: a1ca5de1c1efcbae +Block 0013 [ 47]: 689c9bdec537707d +Block 0013 [ 48]: cf934aabeb0cb430 +Block 0013 [ 49]: fb07ca7786243a5a +Block 0013 [ 50]: 9777c81195f714d5 +Block 0013 [ 51]: 74d6b3d255765f83 +Block 0013 [ 52]: d00c729a6e17621e +Block 0013 [ 53]: a5286754e36a2203 +Block 0013 [ 54]: 7adcc00eeff68ddc +Block 0013 [ 55]: 9a2e26a365eff54d +Block 0013 [ 56]: 9cabb250d5fa0e23 +Block 0013 [ 57]: 0938223fe49c9b73 +Block 0013 [ 58]: 21de6e98149643e5 +Block 0013 [ 59]: 333f16a2bafe6b2e +Block 0013 [ 60]: 8cb6959855ac3912 +Block 0013 [ 61]: d0a62347d3e64023 +Block 0013 [ 62]: 0a60c2b8e08acf42 +Block 0013 [ 63]: 1ef0860ef26f3312 +Block 0013 [ 64]: 30d01dfc4917ece0 +Block 0013 [ 65]: d85ea32036c4831c +Block 0013 [ 66]: b28f30aee13c8a12 +Block 0013 [ 67]: 65fa8757876a80ed +Block 0013 [ 68]: 29042b6a76ac23ec +Block 0013 [ 69]: 72b48bf0a7a0e204 +Block 0013 [ 70]: 894b73d9ef351322 +Block 0013 [ 71]: b2c87ae7c7e6d450 +Block 0013 [ 72]: 48cd6faeb75b7817 +Block 0013 [ 73]: 68461c999cea7fea +Block 0013 [ 74]: 1214f93aae6260ed +Block 0013 [ 75]: 0cb603e467252906 +Block 0013 [ 76]: 9cd6831e38c65b5a +Block 0013 [ 77]: 65c0a8e3497f195f +Block 0013 [ 78]: 7b0d1aecc3c1795c +Block 0013 [ 79]: 62993f6f4b2c06a8 +Block 0013 [ 80]: 5641d96b7e258f5a +Block 0013 [ 81]: 8420cc555ff8fe86 +Block 0013 [ 82]: 7bb68c81a5e30422 +Block 0013 [ 83]: 61e4006de902467f +Block 0013 [ 84]: c2e36bc580b71a6d +Block 0013 [ 85]: 797567bb6f7b5f08 +Block 0013 [ 86]: c1c88c12cd86592e +Block 0013 [ 87]: 0f381934cb0eb20b +Block 0013 [ 88]: e3fd14470d2fb3b1 +Block 0013 [ 89]: 5ad7c316da0754ab +Block 0013 [ 90]: 2fd4793ba5ce45d3 +Block 0013 [ 91]: 160895ed4541c2ea +Block 0013 [ 92]: e4c8a7fc865ef8fc +Block 0013 [ 93]: c20c133ca98bc6dc +Block 0013 [ 94]: 35006a7edd252d4a +Block 0013 [ 95]: 087391913b15a62e +Block 0013 [ 96]: df00d5e689294f1a +Block 0013 [ 97]: 91574a55e924a080 +Block 0013 [ 98]: 31b5d04701a2f55d +Block 0013 [ 99]: cc6255b36e700629 +Block 0013 [100]: e23b9c536e5388ad +Block 0013 [101]: 4f73f1b7fb7c103b +Block 0013 [102]: 59e564baecaac210 +Block 0013 [103]: 593a399aa604bb7e +Block 0013 [104]: 4f844dcf478e5a28 +Block 0013 [105]: c5a527ec4bf2ceef +Block 0013 [106]: 646f87228d0f36ac +Block 0013 [107]: ef7b4c95a2c43d9a +Block 0013 [108]: c7175c798fc1cebc +Block 0013 [109]: fb091b378f8cd986 +Block 0013 [110]: 3e6ad6b16c8dd94d +Block 0013 [111]: 5781768ab765ed4e +Block 0013 [112]: f82a9a6a9cbb2a7a +Block 0013 [113]: 88213573967f2637 +Block 0013 [114]: f9fdec29c0653e8b +Block 0013 [115]: 28029582a0c7a607 +Block 0013 [116]: 08f4d18472a711b7 +Block 0013 [117]: 46f99803f13ab2a0 +Block 0013 [118]: b8850f6995e1e41c +Block 0013 [119]: baaeaa2334a63967 +Block 0013 [120]: d833632166dfe229 +Block 0013 [121]: af0d68b77fb4b447 +Block 0013 [122]: 2ae378be285f6729 +Block 0013 [123]: 627e3307d7300095 +Block 0013 [124]: 200c8902704a45f8 +Block 0013 [125]: 343efdcf7c4ffa75 +Block 0013 [126]: bb6dc112ef5e114b +Block 0013 [127]: d159229bbf65f47c +Block 0014 [ 0]: 3dd943aa31f9a0b1 +Block 0014 [ 1]: c5bc6fd1670258cb +Block 0014 [ 2]: 18e6da67d66b9d53 +Block 0014 [ 3]: 81b4aa65e75e9b58 +Block 0014 [ 4]: d6cd172a4942404c +Block 0014 [ 5]: bdfe9d1b90dc4cf7 +Block 0014 [ 6]: e774682eba357510 +Block 0014 [ 7]: 9bf9e106f2cd11f2 +Block 0014 [ 8]: cbb5a04871e1a89f +Block 0014 [ 9]: 546e0edc7e7fc7e3 +Block 0014 [ 10]: cc7f7879341493c4 +Block 0014 [ 11]: fc96d04ca1ae2938 +Block 0014 [ 12]: 287b2d8c7efff3f1 +Block 0014 [ 13]: 20bc2acd3175e0c3 +Block 0014 [ 14]: 6cac2eb9def0d010 +Block 0014 [ 15]: b25cd833fd0b0574 +Block 0014 [ 16]: 88ea49aca89c0d1d +Block 0014 [ 17]: 52f984ec11c6cbc5 +Block 0014 [ 18]: 103c897b024d6b14 +Block 0014 [ 19]: a8c5efeb3fbe112f +Block 0014 [ 20]: 8ac8deaf1292e525 +Block 0014 [ 21]: 7ce42b5ef1ce3574 +Block 0014 [ 22]: b79c78fc9d327ad0 +Block 0014 [ 23]: 2188e50592bc5be2 +Block 0014 [ 24]: 495d110805fadcd4 +Block 0014 [ 25]: 2a9d1c998c7c3540 +Block 0014 [ 26]: 0395da083459ffd4 +Block 0014 [ 27]: 498ecca4b155842c +Block 0014 [ 28]: e381623e361cf077 +Block 0014 [ 29]: 8d07c9891cc2f309 +Block 0014 [ 30]: d02d5dc9f6cca3cb +Block 0014 [ 31]: fed2d25cec28e05c +Block 0014 [ 32]: c9e92f090bf0d04c +Block 0014 [ 33]: 47a0990fa9157507 +Block 0014 [ 34]: 7e1bf44a16c871bb +Block 0014 [ 35]: 9f6c048c95381368 +Block 0014 [ 36]: 8063de969373331e +Block 0014 [ 37]: 7324b36e0b9f90de +Block 0014 [ 38]: a07493f91f829c82 +Block 0014 [ 39]: 23cae39877ead327 +Block 0014 [ 40]: 8dd2a700ff49698b +Block 0014 [ 41]: 676482fa3081bc05 +Block 0014 [ 42]: cad059f5f87db5ce +Block 0014 [ 43]: dc8480c0389142cd +Block 0014 [ 44]: f116d8e5fe656eec +Block 0014 [ 45]: cf3f2882b2e22c4a +Block 0014 [ 46]: 7e168a8d46c08b5c +Block 0014 [ 47]: 13b2d64679c8f22f +Block 0014 [ 48]: 6c2725e46c4c33ee +Block 0014 [ 49]: 20c13cc1814b51b5 +Block 0014 [ 50]: caa64bc4dbc09904 +Block 0014 [ 51]: 054539afaca09ca4 +Block 0014 [ 52]: 4f8bcdc220da40c7 +Block 0014 [ 53]: 700931050e282836 +Block 0014 [ 54]: 2e05c642fb88539a +Block 0014 [ 55]: bb8e2fa2b15b66cd +Block 0014 [ 56]: 166a88d4afe3b3a6 +Block 0014 [ 57]: f576f0924284caf9 +Block 0014 [ 58]: 09340b71709aee33 +Block 0014 [ 59]: b82d179ec03a5d78 +Block 0014 [ 60]: c532af4d7e5cc29a +Block 0014 [ 61]: 7f67a63723bd08d0 +Block 0014 [ 62]: 7a277c9c32390651 +Block 0014 [ 63]: 7998e89ea54051cb +Block 0014 [ 64]: 51aec979c6fb169d +Block 0014 [ 65]: e38fa59e7f37e8a0 +Block 0014 [ 66]: e6e78774d14022e6 +Block 0014 [ 67]: c09c69967c73416f +Block 0014 [ 68]: 94d52919c6ab33bd +Block 0014 [ 69]: 7db4b6c8e6f8791a +Block 0014 [ 70]: f8b7978d2cb7365b +Block 0014 [ 71]: 4d85b5c76fa67522 +Block 0014 [ 72]: 483495d94dcec2fc +Block 0014 [ 73]: ec09c3a7b1e17f3a +Block 0014 [ 74]: 596bb09b4d921b21 +Block 0014 [ 75]: 850a53a2f88792fa +Block 0014 [ 76]: 9d99c3421c09d6c2 +Block 0014 [ 77]: 24453adc8bf994cc +Block 0014 [ 78]: bd76bcd6b7a011d5 +Block 0014 [ 79]: 396ca885fbec8c16 +Block 0014 [ 80]: fc6bb33caee725ee +Block 0014 [ 81]: 2a080b313e6c4f2d +Block 0014 [ 82]: 86ec7cb50654b1ba +Block 0014 [ 83]: 0b92269a68747a49 +Block 0014 [ 84]: a98e133d367630a6 +Block 0014 [ 85]: 75b450bfdad3ef46 +Block 0014 [ 86]: 6813552bd0497e69 +Block 0014 [ 87]: f07fe4afdb8ea39d +Block 0014 [ 88]: 54d6068dbeb342e0 +Block 0014 [ 89]: a15aaf21c44ee8d0 +Block 0014 [ 90]: b63ee2cbe2c95663 +Block 0014 [ 91]: 166f73caabf49c4c +Block 0014 [ 92]: 76c8835f88e53e8c +Block 0014 [ 93]: ba720e37091d56c5 +Block 0014 [ 94]: f2fb3992b75480ea +Block 0014 [ 95]: 70100e90ad4018bc +Block 0014 [ 96]: e05af6957917481d +Block 0014 [ 97]: 22d8926bca1eea81 +Block 0014 [ 98]: 41e68fc80ea5f78a +Block 0014 [ 99]: 0db147a5541b7be8 +Block 0014 [100]: 6fa71cc135c40318 +Block 0014 [101]: c3a5d25e006850f5 +Block 0014 [102]: 78dd6b4586b53616 +Block 0014 [103]: 956f727c8d423a5a +Block 0014 [104]: 13a2c0b038967c05 +Block 0014 [105]: 81188925c367f9ae +Block 0014 [106]: 61d42f2b5c2bafff +Block 0014 [107]: 94e70ed21445617c +Block 0014 [108]: e3c84a00a8a71f34 +Block 0014 [109]: 9dfd45ca105a6a1c +Block 0014 [110]: 6b4b2fa24d42cf81 +Block 0014 [111]: 5d61008fbef90a71 +Block 0014 [112]: 6d901238e1b52e4e +Block 0014 [113]: 5babe5134ec46268 +Block 0014 [114]: 69f295aedc81d28d +Block 0014 [115]: faccc7d986350652 +Block 0014 [116]: e974271561377bb4 +Block 0014 [117]: 0e06e727ece35f86 +Block 0014 [118]: 03649503edee0552 +Block 0014 [119]: 3a19e21c2c08225f +Block 0014 [120]: 983714b28acfa352 +Block 0014 [121]: aec143ba15c3ae13 +Block 0014 [122]: eda04483d75a4442 +Block 0014 [123]: 1915bf9e51452160 +Block 0014 [124]: 14bbe5004ccafb94 +Block 0014 [125]: 160191ad91cfa45c +Block 0014 [126]: 5797b27c188b9f46 +Block 0014 [127]: 07ef94bd73c522ec +Block 0015 [ 0]: 1fcd62604579cf9a +Block 0015 [ 1]: f7472d4cf4966feb +Block 0015 [ 2]: 40070f3f8b371041 +Block 0015 [ 3]: 1c5f4fa46291cff6 +Block 0015 [ 4]: 50d96202fa98746f +Block 0015 [ 5]: 28bae24d7859cd0f +Block 0015 [ 6]: 6f29c3214bf42a3f +Block 0015 [ 7]: 0f43542ad0d68908 +Block 0015 [ 8]: 64f7623b19206023 +Block 0015 [ 9]: 0e5bb2b9695c3f2b +Block 0015 [ 10]: 4bd6cf02b5053f13 +Block 0015 [ 11]: 3cf06693539f0209 +Block 0015 [ 12]: 933c76f4958f88c7 +Block 0015 [ 13]: 224ba767c721b85e +Block 0015 [ 14]: bd89d30e7b07f405 +Block 0015 [ 15]: 621659f508fea9c1 +Block 0015 [ 16]: 93b29390eb009b18 +Block 0015 [ 17]: cb0b2c63381c225e +Block 0015 [ 18]: a9df8f2f799b3895 +Block 0015 [ 19]: 9540633258d0559b +Block 0015 [ 20]: 5799b367a1035c27 +Block 0015 [ 21]: ab039ef579d12f72 +Block 0015 [ 22]: fd4e1f97bbcec3f9 +Block 0015 [ 23]: 58020468792e3149 +Block 0015 [ 24]: f80fbbef9020ba14 +Block 0015 [ 25]: edb184adc37f8bac +Block 0015 [ 26]: ddf6607be258d11b +Block 0015 [ 27]: d6d3c7b02fd17a59 +Block 0015 [ 28]: 61f878685218fbfe +Block 0015 [ 29]: c4e7098d87c5131e +Block 0015 [ 30]: e3b30f966a024bcf +Block 0015 [ 31]: 7042a343ad0ac25d +Block 0015 [ 32]: 57c131ab1ce93055 +Block 0015 [ 33]: 587673bd57cbc69f +Block 0015 [ 34]: 027e042e33b06a63 +Block 0015 [ 35]: 1f8adfff35f9340c +Block 0015 [ 36]: 7d4d3c87affa8399 +Block 0015 [ 37]: 4ee69b09b0b7ff8c +Block 0015 [ 38]: 7362cbcb388e62fb +Block 0015 [ 39]: 1f610ec02a68ba5b +Block 0015 [ 40]: 9f7de6ce0b8ed8ab +Block 0015 [ 41]: ba792317ef6dbc5c +Block 0015 [ 42]: 1132f78837fea094 +Block 0015 [ 43]: 40a59b89aa43d01e +Block 0015 [ 44]: 6a09803f185e3ff2 +Block 0015 [ 45]: 07c1eecad1350467 +Block 0015 [ 46]: 09d90f88782c0bfe +Block 0015 [ 47]: b35c6cfa35224654 +Block 0015 [ 48]: 823bce98edaaecba +Block 0015 [ 49]: cbafd6a0c0bb6e02 +Block 0015 [ 50]: 61fe96f3b326f598 +Block 0015 [ 51]: 4fb52b9081149314 +Block 0015 [ 52]: 91663e8113a6ce4e +Block 0015 [ 53]: d476a59721dd319f +Block 0015 [ 54]: e4ccc1ce980d0c4c +Block 0015 [ 55]: f25acea299080098 +Block 0015 [ 56]: e90608f35587edff +Block 0015 [ 57]: aefcf2950ba5b9d9 +Block 0015 [ 58]: cc1af8155c48305f +Block 0015 [ 59]: 53dcfac38ec8f86f +Block 0015 [ 60]: fc1bb1f2e32d255b +Block 0015 [ 61]: 99284548c15668e5 +Block 0015 [ 62]: 27a476f03f858b6f +Block 0015 [ 63]: b825e395361306bc +Block 0015 [ 64]: dac2f0f879838706 +Block 0015 [ 65]: 386a43788954e7b6 +Block 0015 [ 66]: 1386add44c82e486 +Block 0015 [ 67]: 08f3bc30f205f92a +Block 0015 [ 68]: 472237068205e714 +Block 0015 [ 69]: 1201daecc5585bf1 +Block 0015 [ 70]: c5220e46003ba5af +Block 0015 [ 71]: c868b77f92aa8ee9 +Block 0015 [ 72]: a420eaa74ae15349 +Block 0015 [ 73]: 012441dcfc778c24 +Block 0015 [ 74]: e17ee3e175498905 +Block 0015 [ 75]: a95c4b9354624bd9 +Block 0015 [ 76]: 9fbfee215c9f6c86 +Block 0015 [ 77]: cc06de59a8c1d3cd +Block 0015 [ 78]: 15de5b29f117cd89 +Block 0015 [ 79]: c5afb057b3707956 +Block 0015 [ 80]: 46ddbeb2548e5444 +Block 0015 [ 81]: 7acaa8b02a4ee9d1 +Block 0015 [ 82]: f2c310c24529d4fd +Block 0015 [ 83]: 4687e251ff0c69de +Block 0015 [ 84]: 0637bec2b4fa9428 +Block 0015 [ 85]: cf3cf91402099626 +Block 0015 [ 86]: f5367cfdb8e40c50 +Block 0015 [ 87]: fee6d52ad443fd1f +Block 0015 [ 88]: 3729210175b2e368 +Block 0015 [ 89]: 61034e7d4b15c174 +Block 0015 [ 90]: e967558ab3fb8207 +Block 0015 [ 91]: 1b5d9942a291afc5 +Block 0015 [ 92]: 0042a21711dfe84e +Block 0015 [ 93]: c7e5cc3dfae41eb5 +Block 0015 [ 94]: 8d6815ea8462e1e0 +Block 0015 [ 95]: 24ddc84f6012c07a +Block 0015 [ 96]: dde6c9697b197fb7 +Block 0015 [ 97]: c1d334ede0e974a0 +Block 0015 [ 98]: 9b6e88f1fac64efc +Block 0015 [ 99]: 73a77f1cec717036 +Block 0015 [100]: 00ae8968991efbc1 +Block 0015 [101]: 2fcd04ae7f546d1d +Block 0015 [102]: 0a740ec11d3a5148 +Block 0015 [103]: 45b310eb7fd15383 +Block 0015 [104]: 4c958457fa24116a +Block 0015 [105]: 03da5f6480bda485 +Block 0015 [106]: 7f35c38b67402824 +Block 0015 [107]: 656b4a01fd263d60 +Block 0015 [108]: aad8afd7d59def4f +Block 0015 [109]: 75cf46c914b75c59 +Block 0015 [110]: ed93be8debefe186 +Block 0015 [111]: 9b7ec89183978119 +Block 0015 [112]: e20f3d6e8843d5c1 +Block 0015 [113]: d7bb812401bebff1 +Block 0015 [114]: 3f8d6dd1ecc81f66 +Block 0015 [115]: bc14386a3526f895 +Block 0015 [116]: 7e5b6f713419c4c1 +Block 0015 [117]: 2a64698fce16995d +Block 0015 [118]: d000adb7e6c0e4cd +Block 0015 [119]: 434f679a9fc3e1fe +Block 0015 [120]: dd426ee945045809 +Block 0015 [121]: 65aae23f6aea9ad2 +Block 0015 [122]: 7143ebecafad3dca +Block 0015 [123]: da4bd54be8467ce8 +Block 0015 [124]: f0fa70e0d98c6d2b +Block 0015 [125]: aea09c38188881df +Block 0015 [126]: 0e157482fd1280cd +Block 0015 [127]: 2ff51beaf585df53 +Block 0016 [ 0]: 828f2c485352fa60 +Block 0016 [ 1]: ee9c2f3cdcdb75e7 +Block 0016 [ 2]: 6d2e391e86d67ea9 +Block 0016 [ 3]: 596b9e719c06cc50 +Block 0016 [ 4]: 975e16e18ae5361c +Block 0016 [ 5]: 5c298c05b5f32e6e +Block 0016 [ 6]: 2916891dda24445a +Block 0016 [ 7]: 9f4a2af86a69d3e2 +Block 0016 [ 8]: 9d73dc719f872257 +Block 0016 [ 9]: b85fdf131fd717bf +Block 0016 [ 10]: 684eb6e9ed1c01e2 +Block 0016 [ 11]: 58839608215647dd +Block 0016 [ 12]: 206f268b4bb14be4 +Block 0016 [ 13]: 3d5b535329a6e403 +Block 0016 [ 14]: 2d568898552d4f8d +Block 0016 [ 15]: cfa37381a03a351c +Block 0016 [ 16]: c5028c29947c2d50 +Block 0016 [ 17]: 5a1d933fbd3848d5 +Block 0016 [ 18]: f59bf46a0f063ed1 +Block 0016 [ 19]: f6918f04111ddf7e +Block 0016 [ 20]: 7c1a166bb214a687 +Block 0016 [ 21]: 030c31f7244caa61 +Block 0016 [ 22]: cdb9751e424616cd +Block 0016 [ 23]: 4f3781a5f53bfa20 +Block 0016 [ 24]: 3b738ad910526fe5 +Block 0016 [ 25]: 34ab1ab51eb39bbf +Block 0016 [ 26]: 17f0896ca1d91ba2 +Block 0016 [ 27]: b26a95d6456610bc +Block 0016 [ 28]: 03dc598e5cb3b7bb +Block 0016 [ 29]: e1fb90ce6575dec7 +Block 0016 [ 30]: 51d6e111b898b9c9 +Block 0016 [ 31]: 3f4558387cd2857d +Block 0016 [ 32]: 2ac861cb9daba66e +Block 0016 [ 33]: fda318969d2509d3 +Block 0016 [ 34]: d1ab2a61acf0255f +Block 0016 [ 35]: 0a9e98014ff5cf4b +Block 0016 [ 36]: ff43d5718bf7cbb3 +Block 0016 [ 37]: 72c67b78b2e7f5bd +Block 0016 [ 38]: a86c7fe600e056bd +Block 0016 [ 39]: db522fb8a02ae5b5 +Block 0016 [ 40]: e1e0e75d8068687f +Block 0016 [ 41]: 3c941e212ba6b1e9 +Block 0016 [ 42]: 45569ae66e23158f +Block 0016 [ 43]: df5c11c7b63709ae +Block 0016 [ 44]: 983865fb4f8604c9 +Block 0016 [ 45]: 7e9b885b83d8778d +Block 0016 [ 46]: 111f961443264301 +Block 0016 [ 47]: 9cfd8ed196e60d9e +Block 0016 [ 48]: bf7213b901a84b8e +Block 0016 [ 49]: c978661dccd27fff +Block 0016 [ 50]: 332866198ac75a46 +Block 0016 [ 51]: 1c2a325ed328f960 +Block 0016 [ 52]: 3c90439149af1767 +Block 0016 [ 53]: 64358b7436fd7e49 +Block 0016 [ 54]: 4f1b49d1a5ab7c61 +Block 0016 [ 55]: c0020c4113fa374c +Block 0016 [ 56]: 011fb18c45527243 +Block 0016 [ 57]: e3307f47d8975757 +Block 0016 [ 58]: f11e000f080d427f +Block 0016 [ 59]: 8a1c4f73ecc4cc6c +Block 0016 [ 60]: ede7aa790f594024 +Block 0016 [ 61]: 1e9da7f180802051 +Block 0016 [ 62]: b61dde0eb7fbd6a7 +Block 0016 [ 63]: 18f38ca82589db1e +Block 0016 [ 64]: 1528f9a1be07c0e7 +Block 0016 [ 65]: b4db60957f7f7843 +Block 0016 [ 66]: 2ae17ca586b28099 +Block 0016 [ 67]: ca802df042e060a0 +Block 0016 [ 68]: 66e6272aa9b71072 +Block 0016 [ 69]: c6936825f7ea9448 +Block 0016 [ 70]: ef51f540db1acddd +Block 0016 [ 71]: 8e369ac72e128edd +Block 0016 [ 72]: ec3326007dfed530 +Block 0016 [ 73]: 481e96df8097d470 +Block 0016 [ 74]: a24dcf16cfcf0fd2 +Block 0016 [ 75]: fb2479a8d49620df +Block 0016 [ 76]: 23414d1bad1076ab +Block 0016 [ 77]: c38b43413e97af83 +Block 0016 [ 78]: b41ff2ea8766dea1 +Block 0016 [ 79]: 3b7889f6916fe377 +Block 0016 [ 80]: fb186b87a016d7e7 +Block 0016 [ 81]: f9f91628758f3d8a +Block 0016 [ 82]: 8e03f7277994f2bb +Block 0016 [ 83]: 3765d40583c11dd6 +Block 0016 [ 84]: 6eee2373f6845dc4 +Block 0016 [ 85]: 2d2c93802e0b7b1f +Block 0016 [ 86]: 9b56e3de8c9284ac +Block 0016 [ 87]: 949074807d4ae859 +Block 0016 [ 88]: fa061f193f91a1e2 +Block 0016 [ 89]: 866754e4d501c4e1 +Block 0016 [ 90]: f0f62ee9946919c2 +Block 0016 [ 91]: bc6601547ee7ea0a +Block 0016 [ 92]: 86ddb62db8a4ad05 +Block 0016 [ 93]: 7c2ca09bb50b0457 +Block 0016 [ 94]: dacdf825d404c6a8 +Block 0016 [ 95]: aa08d84ff6cba406 +Block 0016 [ 96]: f6535c1116e5584d +Block 0016 [ 97]: 3e704757e9cde846 +Block 0016 [ 98]: d45aeab671b384c2 +Block 0016 [ 99]: 3d62e2b86d26fcbc +Block 0016 [100]: 8646641e89e86d48 +Block 0016 [101]: 7228a5842048e2f8 +Block 0016 [102]: 5b119dd26a1e68fd +Block 0016 [103]: 429a898d9d3ce5d7 +Block 0016 [104]: cc6e4b52a982d9e0 +Block 0016 [105]: d103b261bcdbeca3 +Block 0016 [106]: b8a7f23f4e37272f +Block 0016 [107]: 394e766157d29364 +Block 0016 [108]: de712ec28a18e23a +Block 0016 [109]: 0099369d1b32a993 +Block 0016 [110]: c2e3a4bd0b76be77 +Block 0016 [111]: 0a114ec44e541a6c +Block 0016 [112]: 4bf70291b97e5fab +Block 0016 [113]: 58a20499d06c57b5 +Block 0016 [114]: 61475e499642a467 +Block 0016 [115]: 7236975c5f0543a2 +Block 0016 [116]: ff5105b25e9e2406 +Block 0016 [117]: 0bc2e103b353c08f +Block 0016 [118]: 11661c9354381a9c +Block 0016 [119]: 007a690c3be22cf7 +Block 0016 [120]: dfc24ca0f9fe2f3d +Block 0016 [121]: 3e0f8b301beff690 +Block 0016 [122]: 64fcc11a9d2784ff +Block 0016 [123]: e09df3c52e21b280 +Block 0016 [124]: ee0b7ad59d2e4023 +Block 0016 [125]: aae7d5b2bb5fea4b +Block 0016 [126]: 959230be28937e41 +Block 0016 [127]: dba56bccbac64216 +Block 0017 [ 0]: ce89ee786b4ad569 +Block 0017 [ 1]: 7f47eb49a6a2def9 +Block 0017 [ 2]: 917b0181dd4105a1 +Block 0017 [ 3]: 07237dccaedf6cd3 +Block 0017 [ 4]: 12929ecda91d89f6 +Block 0017 [ 5]: 00b197a5047feea3 +Block 0017 [ 6]: 0c297a666e52cddc +Block 0017 [ 7]: 7434d14db56879b2 +Block 0017 [ 8]: bcb39c6b20f1f1df +Block 0017 [ 9]: cbb3b0039d74b088 +Block 0017 [ 10]: 7f59794de02e8ecb +Block 0017 [ 11]: 0b00abbd728f59f5 +Block 0017 [ 12]: 953a6e0bfc2990fb +Block 0017 [ 13]: 757fa841f8272e10 +Block 0017 [ 14]: b3a6ad2578bf0524 +Block 0017 [ 15]: 01580bb744060c8c +Block 0017 [ 16]: 09f46e44bb89ab50 +Block 0017 [ 17]: bff0a3e576ce3a29 +Block 0017 [ 18]: 57e01d4799886e73 +Block 0017 [ 19]: fcbd0ba0b95b90c8 +Block 0017 [ 20]: 5915db9b56ccf74b +Block 0017 [ 21]: 3d5047a4c1b29cc4 +Block 0017 [ 22]: d44becc901d3505c +Block 0017 [ 23]: 7a63ffe683770972 +Block 0017 [ 24]: 282df0a2d43f0d8e +Block 0017 [ 25]: 819737a32c170191 +Block 0017 [ 26]: 18639d1ca84fd3de +Block 0017 [ 27]: 139d002bc502eed1 +Block 0017 [ 28]: cc15c143c4160e0b +Block 0017 [ 29]: ca15cd9ed3ceee15 +Block 0017 [ 30]: cd914797b4580e11 +Block 0017 [ 31]: d30007cd76eb5135 +Block 0017 [ 32]: a6b3d1c21f962019 +Block 0017 [ 33]: e9e17570fbf99c2d +Block 0017 [ 34]: 06b7f2b094af388b +Block 0017 [ 35]: 3a69df521f36251c +Block 0017 [ 36]: aa87a601f41bd67e +Block 0017 [ 37]: 9229f8b1a24e5b67 +Block 0017 [ 38]: 5ab8c75edb0059b0 +Block 0017 [ 39]: 56643d5fca625320 +Block 0017 [ 40]: ed6fa0b07679d6cc +Block 0017 [ 41]: 7a926a3962dce5f0 +Block 0017 [ 42]: 2e7c1a857712e07d +Block 0017 [ 43]: 4dbb3257c9e970c9 +Block 0017 [ 44]: 0ba7bfae2aa6d059 +Block 0017 [ 45]: 1e2693085a857605 +Block 0017 [ 46]: 8c4dc6356e6b63bc +Block 0017 [ 47]: e7a68e11969060d9 +Block 0017 [ 48]: af934b59932e7ce5 +Block 0017 [ 49]: 422b2f5359c2a256 +Block 0017 [ 50]: 1f1b19d8966dc78a +Block 0017 [ 51]: 660b8ae28928d1a2 +Block 0017 [ 52]: 392835f375a3af76 +Block 0017 [ 53]: 3c6935b1b3486332 +Block 0017 [ 54]: c31ea11b1e409293 +Block 0017 [ 55]: b21e17ef8df2ef53 +Block 0017 [ 56]: dc4178e3d0a64cb0 +Block 0017 [ 57]: fa75d4ad1fa3d373 +Block 0017 [ 58]: 4eac80114c6c6158 +Block 0017 [ 59]: 55f95b24bbb020ab +Block 0017 [ 60]: 16e59f5e48cd1bb6 +Block 0017 [ 61]: f9b03ec078552e6e +Block 0017 [ 62]: be5279d4eb39a799 +Block 0017 [ 63]: 328f860bd398d08b +Block 0017 [ 64]: 5a2703aecc6123b4 +Block 0017 [ 65]: 3c536d8d1b2c0a62 +Block 0017 [ 66]: bbc3db06535d4571 +Block 0017 [ 67]: 3268741c1d27962a +Block 0017 [ 68]: a3805e8aba7ea59e +Block 0017 [ 69]: 9cfbfe725de47a2a +Block 0017 [ 70]: decf2774dbfa59fd +Block 0017 [ 71]: a72c3ba7a281d12d +Block 0017 [ 72]: d72902af4fd00bcd +Block 0017 [ 73]: 76390014d18f1677 +Block 0017 [ 74]: ee8e96345cf54d5f +Block 0017 [ 75]: b922dd921b1fb99e +Block 0017 [ 76]: f37ec8053e0a744b +Block 0017 [ 77]: 2b251571cb4e3ae8 +Block 0017 [ 78]: 148910b407121353 +Block 0017 [ 79]: e137db2fd45ee69d +Block 0017 [ 80]: d3a8552ea211ac6c +Block 0017 [ 81]: e39ebc4e55c4e37a +Block 0017 [ 82]: 3d3f2f341fefd6ef +Block 0017 [ 83]: a15f09d4c3515aa4 +Block 0017 [ 84]: ddcfe559098640f8 +Block 0017 [ 85]: 52fefc5d7f069b8d +Block 0017 [ 86]: abf081ef47ab4cbd +Block 0017 [ 87]: 3a9858342a54b761 +Block 0017 [ 88]: 4efe1d20e12d73c5 +Block 0017 [ 89]: a6d1453039a41e47 +Block 0017 [ 90]: b1d47dae231d0d96 +Block 0017 [ 91]: f0e2ce92b7dfde39 +Block 0017 [ 92]: 156f6ba6e2c11d91 +Block 0017 [ 93]: d6684423fcccdaf0 +Block 0017 [ 94]: 871ceabb32883b09 +Block 0017 [ 95]: a436eb1d424978a5 +Block 0017 [ 96]: aba685bbc36e6d44 +Block 0017 [ 97]: 801ca6d910fd784c +Block 0017 [ 98]: dd575ba7405b9867 +Block 0017 [ 99]: 315ede332333372d +Block 0017 [100]: 12b3dd1cecdd07fc +Block 0017 [101]: a70b713c012a83d6 +Block 0017 [102]: 40688d2f420f956f +Block 0017 [103]: d5b2cc8a746b8091 +Block 0017 [104]: 2c1d498434463441 +Block 0017 [105]: 61fd1e197d6f8f86 +Block 0017 [106]: 1c51a98dd35e3943 +Block 0017 [107]: e44df0b88a454f73 +Block 0017 [108]: 8bef184df0b10365 +Block 0017 [109]: 7d2fd9f74196fa5e +Block 0017 [110]: 467821ae9c30a343 +Block 0017 [111]: 8dfa81eac2bf791c +Block 0017 [112]: 68591ee38e2be85e +Block 0017 [113]: 4c20506c12f9c8cb +Block 0017 [114]: af9e7d7413a73de9 +Block 0017 [115]: f4da9e2ec5bae137 +Block 0017 [116]: b06eae767eda651b +Block 0017 [117]: a7708b469b78bfe1 +Block 0017 [118]: dc46cbb4f8f38ff5 +Block 0017 [119]: 57e84ca7c9457579 +Block 0017 [120]: ac9f054f49663052 +Block 0017 [121]: 7f1de271ca02e347 +Block 0017 [122]: 15a54e4e09cd829b +Block 0017 [123]: 39a9d0616902cc17 +Block 0017 [124]: e1553e5d4ba03e55 +Block 0017 [125]: cb4e29473f8d4e18 +Block 0017 [126]: e016eab995590f27 +Block 0017 [127]: e5c9315c3fe9e037 +Block 0018 [ 0]: d73e6cb4f600d92e +Block 0018 [ 1]: 4ff7703a923020fe +Block 0018 [ 2]: 4411633c5a210fb1 +Block 0018 [ 3]: fd544fe9e0e9fdaa +Block 0018 [ 4]: 067626b375f3e8b4 +Block 0018 [ 5]: f64824c7a0c9bdf0 +Block 0018 [ 6]: 65507b2d7cb1fb42 +Block 0018 [ 7]: 97fb9eb3215e84b6 +Block 0018 [ 8]: 35912760e121dba3 +Block 0018 [ 9]: 70d05b2b45d3fcb3 +Block 0018 [ 10]: 6f3c9f75e54cb571 +Block 0018 [ 11]: 50b765e15fb480b2 +Block 0018 [ 12]: 5c1a3001a2530b03 +Block 0018 [ 13]: 256ad981d34f716e +Block 0018 [ 14]: f233c26131fd0541 +Block 0018 [ 15]: 1bd106c75c804353 +Block 0018 [ 16]: f22341bd2cd671b4 +Block 0018 [ 17]: 36126083ed04bd4c +Block 0018 [ 18]: 06ab2af20b4d85a4 +Block 0018 [ 19]: f34414b1c4800e19 +Block 0018 [ 20]: eb1dcf5c4c788abb +Block 0018 [ 21]: da8b8fdee6a4b98a +Block 0018 [ 22]: 2d11a43e6b207fda +Block 0018 [ 23]: 56765cf6baf60079 +Block 0018 [ 24]: 33dd629347c11c5e +Block 0018 [ 25]: f7eda83186e4886e +Block 0018 [ 26]: 2aebe5a3f0b4b297 +Block 0018 [ 27]: 5382619de4eb3788 +Block 0018 [ 28]: 4684d6997e414414 +Block 0018 [ 29]: 9dee04efbe7b2e82 +Block 0018 [ 30]: 6f0a3cd1e45ac162 +Block 0018 [ 31]: dd84e7982526cdbd +Block 0018 [ 32]: f4b17125344b6916 +Block 0018 [ 33]: 25eddc5a7fe26243 +Block 0018 [ 34]: db8c36c50f7bc812 +Block 0018 [ 35]: 58fbe2f0d288772e +Block 0018 [ 36]: 6b49d7be66155606 +Block 0018 [ 37]: e1f9c8ea25df1450 +Block 0018 [ 38]: 16e995512253005a +Block 0018 [ 39]: 37c3d7d37d78351b +Block 0018 [ 40]: e949d536bc8d6387 +Block 0018 [ 41]: 9efef5f12072a753 +Block 0018 [ 42]: 867fafe2afc9a465 +Block 0018 [ 43]: 0dafd80edaaa5872 +Block 0018 [ 44]: 6952f071a1c64048 +Block 0018 [ 45]: 56bff386a78386f3 +Block 0018 [ 46]: 9760b6f85d0c5c4d +Block 0018 [ 47]: eda2dcbb0efb9077 +Block 0018 [ 48]: b1d892f1748b0004 +Block 0018 [ 49]: 2e122bfcbdcf902e +Block 0018 [ 50]: 0ec3ebd60bac9671 +Block 0018 [ 51]: 975c7b0e154db60f +Block 0018 [ 52]: 3c0c3947068dac74 +Block 0018 [ 53]: 0370cfde4fc9316b +Block 0018 [ 54]: 056b25931cd1ee5b +Block 0018 [ 55]: f6f424d19e6afbe6 +Block 0018 [ 56]: e0ef6348fffb105a +Block 0018 [ 57]: 0d23302398aa31d5 +Block 0018 [ 58]: 1066b74ec1400fa9 +Block 0018 [ 59]: 2a05cd7fce6a2910 +Block 0018 [ 60]: eb51397926f7d88a +Block 0018 [ 61]: 728f3bd5238b8cb0 +Block 0018 [ 62]: 72a124a00a7a4df1 +Block 0018 [ 63]: d2db366281f2bdbc +Block 0018 [ 64]: 6e2f9b75321efbae +Block 0018 [ 65]: 7f514005c44610d9 +Block 0018 [ 66]: cf19d6e9232b1a5c +Block 0018 [ 67]: f8abdf7c86dcd958 +Block 0018 [ 68]: c3f1174767399f88 +Block 0018 [ 69]: 9245d5ef34aaaac6 +Block 0018 [ 70]: 60ca2b939a60556d +Block 0018 [ 71]: 868adc9ef194e4d4 +Block 0018 [ 72]: 1386a0335edcd1eb +Block 0018 [ 73]: 6a23a25059e5f2a8 +Block 0018 [ 74]: 2d641127b0301ef5 +Block 0018 [ 75]: daefe2bb3a31a00e +Block 0018 [ 76]: 2c11b078b722b266 +Block 0018 [ 77]: 6a23c72c4b218626 +Block 0018 [ 78]: fe528c5309492c9c +Block 0018 [ 79]: fdca411f1c0afa6d +Block 0018 [ 80]: f76b41c6ab138d85 +Block 0018 [ 81]: 989699d1634c6df6 +Block 0018 [ 82]: e8a767bac83906bc +Block 0018 [ 83]: caefa4594e0dd565 +Block 0018 [ 84]: 3f4c782be2bcb4a8 +Block 0018 [ 85]: 8197ac8d57d06e73 +Block 0018 [ 86]: 61278eca7c5c1e5f +Block 0018 [ 87]: 229b2d380d87d45c +Block 0018 [ 88]: 21b608cd3f165344 +Block 0018 [ 89]: c0ffd42b993ea5dd +Block 0018 [ 90]: 78dafbd6d85212d6 +Block 0018 [ 91]: 4ca01529d90f1566 +Block 0018 [ 92]: 8a60560d75426e37 +Block 0018 [ 93]: 07017df87b5faa68 +Block 0018 [ 94]: d480dba8df4ee24f +Block 0018 [ 95]: 171853f0c7b9e99f +Block 0018 [ 96]: b77ae974ab8f2c8f +Block 0018 [ 97]: b3ede770aa3bb08b +Block 0018 [ 98]: 945ba501a3770bf1 +Block 0018 [ 99]: 3fe6e485d4993670 +Block 0018 [100]: 56a70e0511dff037 +Block 0018 [101]: 5a7b44bcf455425e +Block 0018 [102]: 13b8f7ceb3154c5b +Block 0018 [103]: a6ce1a824666c259 +Block 0018 [104]: 0f85b8ebc2b82e58 +Block 0018 [105]: e51da2e0d636f019 +Block 0018 [106]: 14af0a6aa3d06111 +Block 0018 [107]: 1f28c97aa3505adc +Block 0018 [108]: aaf9a553387b914d +Block 0018 [109]: d1e1cad1e47e6ef9 +Block 0018 [110]: 990bbd3ef7b12da5 +Block 0018 [111]: feb392b66f7f164d +Block 0018 [112]: 5a9ec205e41b7b8a +Block 0018 [113]: 0df4470a3854ce68 +Block 0018 [114]: a4324c6a3b2998c9 +Block 0018 [115]: 305d72d1ffaece34 +Block 0018 [116]: de4ae4a306ed3089 +Block 0018 [117]: 15c9c221e4856d2e +Block 0018 [118]: 822ce405f96cabcb +Block 0018 [119]: 6f9d0074fdfa6fcb +Block 0018 [120]: 50eeefcb50d1e0fb +Block 0018 [121]: a8ca87a02c7dd5f5 +Block 0018 [122]: 87e6756b1c1f9a88 +Block 0018 [123]: c83b55d91835afd4 +Block 0018 [124]: f8b21499a265096b +Block 0018 [125]: d2c88fc6864098d1 +Block 0018 [126]: d31599a122ec4b33 +Block 0018 [127]: b2a8a53f6cc6c035 +Block 0019 [ 0]: c0a747c4e28329e1 +Block 0019 [ 1]: e5903abdd4685ea0 +Block 0019 [ 2]: f624dbf4eab2eac1 +Block 0019 [ 3]: a7bdb44367b6d439 +Block 0019 [ 4]: bb398b8a231ca85e +Block 0019 [ 5]: e4204b07902d3f6e +Block 0019 [ 6]: 4cf5c1556e8a6a99 +Block 0019 [ 7]: 8e4b37c7c8196407 +Block 0019 [ 8]: 9b9c40f5d78e30aa +Block 0019 [ 9]: e7ab522bc1a9e428 +Block 0019 [ 10]: e598184e9e82ac8d +Block 0019 [ 11]: 85d11f6a0ec8e397 +Block 0019 [ 12]: feb1e8fb825dfa31 +Block 0019 [ 13]: 093d569d83fd45ec +Block 0019 [ 14]: aba7cb862bd83ccf +Block 0019 [ 15]: b903dd3e66e5fad7 +Block 0019 [ 16]: 6c9163634e7d4721 +Block 0019 [ 17]: 3891d444fc59e86c +Block 0019 [ 18]: 106020d458ffd0b1 +Block 0019 [ 19]: 70c32531ff689b86 +Block 0019 [ 20]: f2c322c30200d1bb +Block 0019 [ 21]: 0ba7383adf6e0690 +Block 0019 [ 22]: 2467345100b70ae8 +Block 0019 [ 23]: b158590311fe6486 +Block 0019 [ 24]: 484daadfb022e2af +Block 0019 [ 25]: b1097ef6f21175bd +Block 0019 [ 26]: 270dabd2d26940b9 +Block 0019 [ 27]: 18983ac19d92c698 +Block 0019 [ 28]: a8b17d5ba3423a19 +Block 0019 [ 29]: a87220ce023ac5bc +Block 0019 [ 30]: a36bb40525f87baf +Block 0019 [ 31]: 4bf5ed1ea08d2b1d +Block 0019 [ 32]: 9c7dceaf23358f5b +Block 0019 [ 33]: 5e6b6a50b9317e1b +Block 0019 [ 34]: fba24c695b6d9940 +Block 0019 [ 35]: 44e6d0d7c8f3c59d +Block 0019 [ 36]: 7e1b616776b587d3 +Block 0019 [ 37]: a335932288c6b015 +Block 0019 [ 38]: 70029a6ff40cbc91 +Block 0019 [ 39]: bf199bf017a4dd32 +Block 0019 [ 40]: 4d0e92e558b43b51 +Block 0019 [ 41]: 19752bbee2635be6 +Block 0019 [ 42]: 9eaaf852febb4173 +Block 0019 [ 43]: 766784a43f0a887e +Block 0019 [ 44]: 7c6d151066f51ced +Block 0019 [ 45]: 24f6521ec26f2069 +Block 0019 [ 46]: 4e960d6ea50022ea +Block 0019 [ 47]: 9049d12e39ce2484 +Block 0019 [ 48]: fd2ff51c2f5f8821 +Block 0019 [ 49]: ccf41c9939ca7d20 +Block 0019 [ 50]: e50aee1c5e97559b +Block 0019 [ 51]: 92b6559486a3382b +Block 0019 [ 52]: e649679609765362 +Block 0019 [ 53]: af60c4de383ea2c1 +Block 0019 [ 54]: 4e208398efa77945 +Block 0019 [ 55]: 1d01cc680dc510e6 +Block 0019 [ 56]: 70ed10fb8a669ee6 +Block 0019 [ 57]: 4ad094cc1b463933 +Block 0019 [ 58]: d1c6678cb703cf1e +Block 0019 [ 59]: 5932c03c8411ca45 +Block 0019 [ 60]: 7a3f6207de673d9c +Block 0019 [ 61]: 08c1ead7ae9bc357 +Block 0019 [ 62]: 3aed1f0b8721f33b +Block 0019 [ 63]: 4f9b463e022ebb8b +Block 0019 [ 64]: e21373749f526c05 +Block 0019 [ 65]: 15f877a94e4cc28c +Block 0019 [ 66]: b6f4ee9b7a853074 +Block 0019 [ 67]: feddee4b7089ab99 +Block 0019 [ 68]: 177cbe49bb7f1c47 +Block 0019 [ 69]: d2f486e7840fa52e +Block 0019 [ 70]: 1efbe813d77b3386 +Block 0019 [ 71]: 204ad6780ac5dbda +Block 0019 [ 72]: 4ef70ce7237e9423 +Block 0019 [ 73]: 56c850fae048f8d5 +Block 0019 [ 74]: 272f156eb2b5e4f1 +Block 0019 [ 75]: fdaed8f20cbb428f +Block 0019 [ 76]: 7dd9edf940b064e2 +Block 0019 [ 77]: 2ba1f25cd640890d +Block 0019 [ 78]: cd62db094c06521c +Block 0019 [ 79]: fd309eaa17862655 +Block 0019 [ 80]: fdd1a5f7f2e77ef6 +Block 0019 [ 81]: 2ced967d6a27fbb5 +Block 0019 [ 82]: d13b492e289631cb +Block 0019 [ 83]: 0299503d00b6af73 +Block 0019 [ 84]: 037ebf2f3ab92248 +Block 0019 [ 85]: d1eba5f6791d01af +Block 0019 [ 86]: 2a8c256540a80ec6 +Block 0019 [ 87]: e5d327a9af2ffed5 +Block 0019 [ 88]: 7238fd1a386a597b +Block 0019 [ 89]: 8305be11f9cd3923 +Block 0019 [ 90]: 7ac3169632caca5d +Block 0019 [ 91]: e711a9fda50e3844 +Block 0019 [ 92]: 3f2ec23d73a53df1 +Block 0019 [ 93]: e85438d9247b7063 +Block 0019 [ 94]: 369701c20fc048b8 +Block 0019 [ 95]: f147196fe629cad4 +Block 0019 [ 96]: eff4bd0fe6e9d785 +Block 0019 [ 97]: 55b98aae7df801f8 +Block 0019 [ 98]: 473bd8bf72e9d80f +Block 0019 [ 99]: 372113d6a79fbd61 +Block 0019 [100]: 5ec994ad59527b5d +Block 0019 [101]: 370957d1ba5eb9cd +Block 0019 [102]: b94bf1c3a9b67714 +Block 0019 [103]: c384f86146bce9a9 +Block 0019 [104]: ae5905325523c818 +Block 0019 [105]: 313d63f1a1ca488e +Block 0019 [106]: 408bd8f292c44421 +Block 0019 [107]: 2c7809887d5a742e +Block 0019 [108]: e481163da10fd561 +Block 0019 [109]: 5aac3786bf38ed9d +Block 0019 [110]: 61a76e808c1333c3 +Block 0019 [111]: 9b7955f93efbd457 +Block 0019 [112]: d3281738a72230e2 +Block 0019 [113]: 170818a8479da122 +Block 0019 [114]: c62bf1703287d997 +Block 0019 [115]: 032a13da2248d702 +Block 0019 [116]: dddbcd0ac02f9f71 +Block 0019 [117]: 713bae2d25fa4e42 +Block 0019 [118]: fd8ae9d115a20f7c +Block 0019 [119]: 229ceef5f318ddce +Block 0019 [120]: 1f29d53de834e081 +Block 0019 [121]: bb291d7d59f10f19 +Block 0019 [122]: b8dbcf3c3f3583bb +Block 0019 [123]: 9753f2819307b322 +Block 0019 [124]: ebd2fb222df580fc +Block 0019 [125]: c948516bf1b366d1 +Block 0019 [126]: 52cdc69534a37726 +Block 0019 [127]: 2ef56f44cf9436f9 +Block 0020 [ 0]: 734e629a628dd5de +Block 0020 [ 1]: 5a58aafa604d7cea +Block 0020 [ 2]: decd1fa291ea7349 +Block 0020 [ 3]: a6d23612f86139d7 +Block 0020 [ 4]: a5af09fbf4a787ac +Block 0020 [ 5]: ef9d693b8a2de764 +Block 0020 [ 6]: 505c1353a5bae511 +Block 0020 [ 7]: 1200f97cfd770359 +Block 0020 [ 8]: 477d6b28d05cf49c +Block 0020 [ 9]: b8e6c1e506c7b188 +Block 0020 [ 10]: 4c3ed38e467d8962 +Block 0020 [ 11]: ff09466393490693 +Block 0020 [ 12]: f42acf0d7a204245 +Block 0020 [ 13]: 4c828fbde0a65ff1 +Block 0020 [ 14]: 63aab903dc0ea9fb +Block 0020 [ 15]: f7dd14cd6009a8e8 +Block 0020 [ 16]: c25eebdc89fdf70d +Block 0020 [ 17]: 430f2f1baa30da8c +Block 0020 [ 18]: dbc784f1638697ff +Block 0020 [ 19]: e6e761901024928c +Block 0020 [ 20]: 63f5db6ab1252d0c +Block 0020 [ 21]: a16b91f6d5ee2d14 +Block 0020 [ 22]: f8460fc61abc3765 +Block 0020 [ 23]: e5a7daf71f12150f +Block 0020 [ 24]: 8727e6edc4cb70f7 +Block 0020 [ 25]: f5fb5eac08f0ee73 +Block 0020 [ 26]: d5d2b60b4cbb1b7d +Block 0020 [ 27]: 0bc179a997f53853 +Block 0020 [ 28]: 88d40013d3c597da +Block 0020 [ 29]: 8520fd776fea57d1 +Block 0020 [ 30]: ff41c92a18c1f5e6 +Block 0020 [ 31]: 7d1170ecd08a140f +Block 0020 [ 32]: 9e9ecb61bdbecba1 +Block 0020 [ 33]: 8a05443ef9e3fd46 +Block 0020 [ 34]: 49ee58c153b1c903 +Block 0020 [ 35]: c4809f9cebbb67c1 +Block 0020 [ 36]: 8d05a31a29871b15 +Block 0020 [ 37]: 1f7fe6dbf3a2d1ff +Block 0020 [ 38]: 1d462a2121191cf8 +Block 0020 [ 39]: e752ebf763b17942 +Block 0020 [ 40]: 3f9d429a5326ea77 +Block 0020 [ 41]: ead587a738e81dcb +Block 0020 [ 42]: a9bcdecf85c217fd +Block 0020 [ 43]: a26d47b8c1238157 +Block 0020 [ 44]: 651a66b3bb581f2c +Block 0020 [ 45]: cfa955096506a3f7 +Block 0020 [ 46]: 035c92416aae689b +Block 0020 [ 47]: 87b078db6f37b7ec +Block 0020 [ 48]: 488698e807ebe8de +Block 0020 [ 49]: dacebd9d66eff4fb +Block 0020 [ 50]: 576420c8fb5df97f +Block 0020 [ 51]: 59c8ff43f450eef5 +Block 0020 [ 52]: c24907642efa69f8 +Block 0020 [ 53]: c2780f0f0ca49e23 +Block 0020 [ 54]: b8b7ed7ed06fe78a +Block 0020 [ 55]: dba3e1ea470d7fc5 +Block 0020 [ 56]: 8afdb154ef51f907 +Block 0020 [ 57]: 0f6e3c0f727f3195 +Block 0020 [ 58]: 155cc979261a61f4 +Block 0020 [ 59]: 2fa61a7f141c36c9 +Block 0020 [ 60]: 03ea29e722963040 +Block 0020 [ 61]: 0b872d389e13e0f1 +Block 0020 [ 62]: af9883b7f36b8a79 +Block 0020 [ 63]: e423bfee1d544df7 +Block 0020 [ 64]: c6a2b6850e3d148d +Block 0020 [ 65]: 2bded84ad45688c0 +Block 0020 [ 66]: 012306a6d0350fc4 +Block 0020 [ 67]: e241389275cbae09 +Block 0020 [ 68]: 35817c5ede994e82 +Block 0020 [ 69]: e8e061fe79ffa788 +Block 0020 [ 70]: a7047fdafab17a66 +Block 0020 [ 71]: 9b283ba2aacc46ca +Block 0020 [ 72]: 48df0e8e03643311 +Block 0020 [ 73]: d5bb8debb5655152 +Block 0020 [ 74]: e6067c7db547dabf +Block 0020 [ 75]: 6be963ea0e0aed0a +Block 0020 [ 76]: 6b33437061cb8be1 +Block 0020 [ 77]: d0bd3e644206102e +Block 0020 [ 78]: 78a388f73a7b53a6 +Block 0020 [ 79]: 5d24627ef8abb4f9 +Block 0020 [ 80]: 055be9e53c43c554 +Block 0020 [ 81]: e32509d26029caa5 +Block 0020 [ 82]: b3d8f6b2fd6bb726 +Block 0020 [ 83]: 2b4c4351318bdbc7 +Block 0020 [ 84]: df8a4d376a62be6f +Block 0020 [ 85]: 275bc692f96b3a4b +Block 0020 [ 86]: 3b91dbf87b274d2e +Block 0020 [ 87]: b0d17c2b706ebdc5 +Block 0020 [ 88]: e25acdbf9bdf0f66 +Block 0020 [ 89]: a5af03b271405b48 +Block 0020 [ 90]: a2a1d259bb89d2dd +Block 0020 [ 91]: ec334f738b812ea8 +Block 0020 [ 92]: 2b4502c4ef6d706c +Block 0020 [ 93]: 5d59dbc73eb0c655 +Block 0020 [ 94]: 62dd5829cecbfab6 +Block 0020 [ 95]: 61d3300680db7001 +Block 0020 [ 96]: ff825644b486bc24 +Block 0020 [ 97]: fa770c7fc3c288b3 +Block 0020 [ 98]: 5993533c0cc4f3ae +Block 0020 [ 99]: 3c8fb5b08245af96 +Block 0020 [100]: dec90adee7025117 +Block 0020 [101]: fb6af315a87846e5 +Block 0020 [102]: cb6df9e5f37b9030 +Block 0020 [103]: 46a9e3bf64dd2107 +Block 0020 [104]: 91bba1949e9e2858 +Block 0020 [105]: 89b5583cf4442bb0 +Block 0020 [106]: 2ef8ecf98a0d53a0 +Block 0020 [107]: a3fd11ccd3d2e41e +Block 0020 [108]: 197f99094a56452b +Block 0020 [109]: 893307690eeda57e +Block 0020 [110]: 04027b05e83cf5dd +Block 0020 [111]: 4e0240c99df4a613 +Block 0020 [112]: acfc2275643fdab0 +Block 0020 [113]: f63b244b2fbd5148 +Block 0020 [114]: edab8427721c3f75 +Block 0020 [115]: 72d7f7d722f2065e +Block 0020 [116]: a822ddfd1bc95aa2 +Block 0020 [117]: 9e6ff4809803e545 +Block 0020 [118]: 8dd66544283171fb +Block 0020 [119]: ddac6524728f6767 +Block 0020 [120]: a798cc0c897cbc15 +Block 0020 [121]: 3eee203dd63489c5 +Block 0020 [122]: 84ec9fb95b124ef8 +Block 0020 [123]: a52586f61e51857b +Block 0020 [124]: d62a8a6195a96220 +Block 0020 [125]: e64fbb51d72dadcc +Block 0020 [126]: 77256737a1bfb5b0 +Block 0020 [127]: b8de0df9be9d957e +Block 0021 [ 0]: 48f20b10689f4e83 +Block 0021 [ 1]: 39e62f37a525d865 +Block 0021 [ 2]: 4e47ab2acb135d33 +Block 0021 [ 3]: c42c2049323a9ce2 +Block 0021 [ 4]: 7026754810320262 +Block 0021 [ 5]: fdabf4cc98d526f2 +Block 0021 [ 6]: de98230ccc90e91d +Block 0021 [ 7]: 091a9b3d240576e6 +Block 0021 [ 8]: 68afd8c0f731cc3f +Block 0021 [ 9]: c78bf9764d661a01 +Block 0021 [ 10]: 5bea6ba0ff4287bb +Block 0021 [ 11]: 45454840c15c0c3e +Block 0021 [ 12]: b35b87954cbcddb5 +Block 0021 [ 13]: 573a5477da3314cb +Block 0021 [ 14]: 70f7bf27c2ce76a8 +Block 0021 [ 15]: e4368c992fceecac +Block 0021 [ 16]: ba96394ad6d02e53 +Block 0021 [ 17]: 641bfb72dc066998 +Block 0021 [ 18]: 65e25ca33cccf184 +Block 0021 [ 19]: ed8d73c34e56770a +Block 0021 [ 20]: 720a1d1d280cf938 +Block 0021 [ 21]: 75ced9e0e3a035af +Block 0021 [ 22]: c88e8062d9f9c06b +Block 0021 [ 23]: 00fef53c0c05d145 +Block 0021 [ 24]: 67cf04ecd6d30055 +Block 0021 [ 25]: 8377a625564c8266 +Block 0021 [ 26]: f688bacf63fe2148 +Block 0021 [ 27]: f6fcdfe3932894fb +Block 0021 [ 28]: 951c5ecc941392f9 +Block 0021 [ 29]: 3250b3ba358c5582 +Block 0021 [ 30]: 90b4f720fa9e460c +Block 0021 [ 31]: f963935871671ca0 +Block 0021 [ 32]: eceeb74ebc564d21 +Block 0021 [ 33]: b39c5c19445b7b9f +Block 0021 [ 34]: 0c7997285ec7189b +Block 0021 [ 35]: 2ecb5769ee985f73 +Block 0021 [ 36]: 83c9fcfabb40a364 +Block 0021 [ 37]: 0d792da304cc4f2c +Block 0021 [ 38]: c812537235db19f0 +Block 0021 [ 39]: ae460c73e6c63488 +Block 0021 [ 40]: 08a215922c6041de +Block 0021 [ 41]: c97a377b4a718b36 +Block 0021 [ 42]: fca614307204c74a +Block 0021 [ 43]: 3ef0c90941c10f62 +Block 0021 [ 44]: ebe065caa726b6ba +Block 0021 [ 45]: 587f7d1fb0a2cc4c +Block 0021 [ 46]: 4982d8334e60f667 +Block 0021 [ 47]: c1df28b2ec657562 +Block 0021 [ 48]: 02f1ea6a2701137e +Block 0021 [ 49]: b9a461776c3fd823 +Block 0021 [ 50]: d0324040a86b75a4 +Block 0021 [ 51]: ad3fd886752ccf0d +Block 0021 [ 52]: f1918a52c6e8c4df +Block 0021 [ 53]: d1b7ad59e221c111 +Block 0021 [ 54]: f5f4a3e2afd0f619 +Block 0021 [ 55]: 65ead9ca48410c43 +Block 0021 [ 56]: 1f5bac3f2b3a0481 +Block 0021 [ 57]: 6c750bb2492f27e5 +Block 0021 [ 58]: 47d3af1c99ff70f5 +Block 0021 [ 59]: 3f9213b0e327063a +Block 0021 [ 60]: 5df60788e29688d2 +Block 0021 [ 61]: 8cb58a31f2df38b8 +Block 0021 [ 62]: ac6f9bb436912716 +Block 0021 [ 63]: 0fd04153e2dff0b8 +Block 0021 [ 64]: 77194b4b3557e8c6 +Block 0021 [ 65]: ab697cf5b4580f90 +Block 0021 [ 66]: 3ed2f55b7a42844a +Block 0021 [ 67]: 604a957093fae6a0 +Block 0021 [ 68]: e5b816f30faf227c +Block 0021 [ 69]: 344c389ed851b0a7 +Block 0021 [ 70]: e4cda77cbf72b80f +Block 0021 [ 71]: 4ef8b3e43d395020 +Block 0021 [ 72]: a10e58d927f9f9b4 +Block 0021 [ 73]: 49b8db015f4dae6c +Block 0021 [ 74]: dcf8799bd62305f6 +Block 0021 [ 75]: 0aae21512005eda1 +Block 0021 [ 76]: a425eb287bb0d675 +Block 0021 [ 77]: 624d06068c67cb67 +Block 0021 [ 78]: 9ba0e3ab7d63b33f +Block 0021 [ 79]: e7883082beee3ea5 +Block 0021 [ 80]: 72a7baae685ab8fa +Block 0021 [ 81]: 77624b29d9937c07 +Block 0021 [ 82]: fd015836bb1dd973 +Block 0021 [ 83]: fc334f9178f9b1ba +Block 0021 [ 84]: 0dc2b5797a4fc547 +Block 0021 [ 85]: 632ab6ef84e992dc +Block 0021 [ 86]: da79d4b3e5c42721 +Block 0021 [ 87]: 6b75fb145aaf3905 +Block 0021 [ 88]: 76b4485790fb7531 +Block 0021 [ 89]: b6f39ef0d1f3215b +Block 0021 [ 90]: 7edd8123d87869e5 +Block 0021 [ 91]: 5670f2bc2d962483 +Block 0021 [ 92]: 5d574c361b64ecc4 +Block 0021 [ 93]: 6b57df741d9a6420 +Block 0021 [ 94]: 78e76645eddb15fd +Block 0021 [ 95]: f4383deaae902412 +Block 0021 [ 96]: 3a81a7f781de1169 +Block 0021 [ 97]: 1bcf6da80c7a9f6a +Block 0021 [ 98]: 39c5577fd931dd80 +Block 0021 [ 99]: b16dfc78e8f90081 +Block 0021 [100]: f833577181c9b58e +Block 0021 [101]: 55fe82a0d6b525ec +Block 0021 [102]: 32f776a8dfa3c62e +Block 0021 [103]: e0e24059fb11ef83 +Block 0021 [104]: bb196f3c2e138f6e +Block 0021 [105]: 668483f4d9d9afe8 +Block 0021 [106]: fdc40fd165bd8d81 +Block 0021 [107]: 2e3eca136e35b37a +Block 0021 [108]: 3fe1ab36fb63b066 +Block 0021 [109]: 3ab084f6f91109cc +Block 0021 [110]: ea32e83f7d7f53cc +Block 0021 [111]: 9bd8c601a541a041 +Block 0021 [112]: 056399de05e2d664 +Block 0021 [113]: 84bee8b3ad9a1002 +Block 0021 [114]: 53b65ae6f2ac7620 +Block 0021 [115]: 1266879844255f8f +Block 0021 [116]: f1b1e45e64da8ace +Block 0021 [117]: ef8fb8ebe51bfe21 +Block 0021 [118]: 834b1615e554d69d +Block 0021 [119]: bc44d1a4080cff7b +Block 0021 [120]: 60642bf7a867e050 +Block 0021 [121]: 0b0d757e35e73640 +Block 0021 [122]: 5909d96b6a9defef +Block 0021 [123]: c60ce5d733fd4646 +Block 0021 [124]: f5a292fb1e0043ed +Block 0021 [125]: 40f6cfb2c8902681 +Block 0021 [126]: 0dec03fdf115dfc2 +Block 0021 [127]: c985316bfe35e532 +Block 0022 [ 0]: 804791fca9c1392b +Block 0022 [ 1]: e4c1e426881c2e87 +Block 0022 [ 2]: 344b8889ea4ad4ac +Block 0022 [ 3]: 1a04e6befb3d575b +Block 0022 [ 4]: 5bef6e064c648074 +Block 0022 [ 5]: 11c161d08bf9428f +Block 0022 [ 6]: d067ddca34550faf +Block 0022 [ 7]: 69ef5611390631e5 +Block 0022 [ 8]: 6afe225214318138 +Block 0022 [ 9]: 80af3c0b4b02a81a +Block 0022 [ 10]: 14bf5b64af634b3f +Block 0022 [ 11]: 9abcb0455be97f1d +Block 0022 [ 12]: ea75c0baee66705c +Block 0022 [ 13]: fe701bea2d3b26ca +Block 0022 [ 14]: 67c4c6258ed27322 +Block 0022 [ 15]: 429a289edde69d6e +Block 0022 [ 16]: f4f4c2d615d9a7be +Block 0022 [ 17]: 59f7a6c990794400 +Block 0022 [ 18]: 0bdd7b9e5fcb9d42 +Block 0022 [ 19]: c853bb1b4bca7df7 +Block 0022 [ 20]: 52f6bc0c799da19a +Block 0022 [ 21]: 943bdeab5accea7b +Block 0022 [ 22]: 73d7bd65c013fa43 +Block 0022 [ 23]: 1ad34d66c52d0ec5 +Block 0022 [ 24]: b6094fcbf860e74a +Block 0022 [ 25]: e7422f4d5128dcb5 +Block 0022 [ 26]: 87ef0706c8c88aad +Block 0022 [ 27]: ea9163e940b85771 +Block 0022 [ 28]: 0042fd3e3c33bbb3 +Block 0022 [ 29]: 16afcdb6b697a7f8 +Block 0022 [ 30]: 82a36bc54241dc84 +Block 0022 [ 31]: 3c32121ed362c31a +Block 0022 [ 32]: 71b3b15fbb31d804 +Block 0022 [ 33]: 7f11cdbd64ac602b +Block 0022 [ 34]: 6c2c665c0c0b1422 +Block 0022 [ 35]: 13273bca3537684c +Block 0022 [ 36]: d2797a8549da57c7 +Block 0022 [ 37]: f486e3f08054fbb8 +Block 0022 [ 38]: 2749de998f4434bb +Block 0022 [ 39]: b04d3f88514a28bf +Block 0022 [ 40]: 89e0e0f8e42d378a +Block 0022 [ 41]: 9635003f04a988b6 +Block 0022 [ 42]: ba273189836e43a2 +Block 0022 [ 43]: a3e7e916b15ec2ed +Block 0022 [ 44]: 933afb5cbbc5a346 +Block 0022 [ 45]: b2fe858fb64c56ec +Block 0022 [ 46]: 93397c330c834d3b +Block 0022 [ 47]: 9ac6374db29ba4af +Block 0022 [ 48]: 9abbf0baf99066b9 +Block 0022 [ 49]: 53fe093bcfa30abf +Block 0022 [ 50]: 59f06188b9aeac95 +Block 0022 [ 51]: 4f203567486f8e1f +Block 0022 [ 52]: 399c129eb1954981 +Block 0022 [ 53]: 9e8f3df04edd855c +Block 0022 [ 54]: c7839759458f28b7 +Block 0022 [ 55]: 0680b6a90eab4916 +Block 0022 [ 56]: cec145b80fe78247 +Block 0022 [ 57]: 808b65ea6e63e98b +Block 0022 [ 58]: 2c1e5538262fdfec +Block 0022 [ 59]: 81b30dc073b434c5 +Block 0022 [ 60]: c0707436657289e6 +Block 0022 [ 61]: 120a7eca718d4092 +Block 0022 [ 62]: 3175853539247ab9 +Block 0022 [ 63]: 5d0c743b9b6ffd0b +Block 0022 [ 64]: d8c28ec0886e9d48 +Block 0022 [ 65]: 594d6544fd87ae3a +Block 0022 [ 66]: a0758e83bad55871 +Block 0022 [ 67]: 19629e54112a76c1 +Block 0022 [ 68]: c39adb24ef1e776e +Block 0022 [ 69]: 99ad43408d60ab08 +Block 0022 [ 70]: 33d692124c11d9ae +Block 0022 [ 71]: ca6ae3cd5e089872 +Block 0022 [ 72]: 96128569361b5183 +Block 0022 [ 73]: 3264c5006587f2f5 +Block 0022 [ 74]: 927b19661155b67d +Block 0022 [ 75]: 27577a0564c02580 +Block 0022 [ 76]: 4be4137d71a8d20f +Block 0022 [ 77]: e8fbb27cfb3dd116 +Block 0022 [ 78]: c546d54308c8238b +Block 0022 [ 79]: 0e6ea22a889661de +Block 0022 [ 80]: df0e770ab52e0f23 +Block 0022 [ 81]: 912c757dd483dcd1 +Block 0022 [ 82]: 28b07c4d25d2f527 +Block 0022 [ 83]: f833999f75dfde74 +Block 0022 [ 84]: 3f3bfa3feb61ff0e +Block 0022 [ 85]: fde9b05908908e32 +Block 0022 [ 86]: f37ac6a234f6d531 +Block 0022 [ 87]: 3002a06806c5a7b7 +Block 0022 [ 88]: 0ced9647463145f0 +Block 0022 [ 89]: f7103a918f8fc100 +Block 0022 [ 90]: c4533d7cc476b9fc +Block 0022 [ 91]: 100e0006dd1153e5 +Block 0022 [ 92]: 6a811c609480f8f1 +Block 0022 [ 93]: 510c39c9cd86173e +Block 0022 [ 94]: 2246697bda28e904 +Block 0022 [ 95]: d868a2e13c102004 +Block 0022 [ 96]: 6034a466933b698e +Block 0022 [ 97]: 8fc5e7a66acb11df +Block 0022 [ 98]: 2910e9f3ee967fef +Block 0022 [ 99]: 001b92fb7e89022f +Block 0022 [100]: ca87fa7b53499719 +Block 0022 [101]: 0154d784444d9cbd +Block 0022 [102]: 1bfa559512ce29d4 +Block 0022 [103]: 1e1d40d77e9b399e +Block 0022 [104]: f88aae2191055b90 +Block 0022 [105]: 504de7f12bff97d5 +Block 0022 [106]: ab03a38e37df0236 +Block 0022 [107]: 46bc61f156525399 +Block 0022 [108]: 5a36598201775ada +Block 0022 [109]: ef27216b243ec78b +Block 0022 [110]: c2013097bf9ec3cf +Block 0022 [111]: fde08a7d93d60ceb +Block 0022 [112]: 0080c53706f954e4 +Block 0022 [113]: b4588d78793f9818 +Block 0022 [114]: 1662c3cb14cabdf2 +Block 0022 [115]: b0c52775f338135a +Block 0022 [116]: d80afb191b9680cb +Block 0022 [117]: 01517fed70270cba +Block 0022 [118]: 7278e7ac5099dcb0 +Block 0022 [119]: 18b2779f192c0034 +Block 0022 [120]: d12a9b462f01e32e +Block 0022 [121]: 728c46acedd7f19c +Block 0022 [122]: a05306d6b31b2833 +Block 0022 [123]: d331c8c206fa1146 +Block 0022 [124]: 04605c92d2bfcc35 +Block 0022 [125]: ef83c4117b4716d2 +Block 0022 [126]: f612d22f4c162415 +Block 0022 [127]: 4a95bc5ff1436d26 +Block 0023 [ 0]: 1c27f28962d9a429 +Block 0023 [ 1]: ce6c0454be7f138d +Block 0023 [ 2]: fa0537b5173deb1e +Block 0023 [ 3]: c81af57b4e80e20a +Block 0023 [ 4]: e9c46fbaafffbd2d +Block 0023 [ 5]: 0cc31492e65580b5 +Block 0023 [ 6]: 2d51c8f8079dc721 +Block 0023 [ 7]: 74bb329130090ca2 +Block 0023 [ 8]: ef4e6d8e93662b43 +Block 0023 [ 9]: 283af41e7ee42300 +Block 0023 [ 10]: 743f3e00e4c57e0b +Block 0023 [ 11]: 8136ce7b15199709 +Block 0023 [ 12]: 047c5f46fbfc2269 +Block 0023 [ 13]: 02a5b806ee4bf5a2 +Block 0023 [ 14]: 09d40c72fefc6003 +Block 0023 [ 15]: b4e2241710c816ae +Block 0023 [ 16]: 855c2cac8c80c773 +Block 0023 [ 17]: 00e22cc97a97a901 +Block 0023 [ 18]: ba6785d60b8b5829 +Block 0023 [ 19]: d0678d50aa3b6566 +Block 0023 [ 20]: b0a18530b287b9c4 +Block 0023 [ 21]: 1425826dfb827651 +Block 0023 [ 22]: 3d79c30454292023 +Block 0023 [ 23]: ed52ad874ea725cb +Block 0023 [ 24]: 2f558b4c56382176 +Block 0023 [ 25]: 6dfbbf532ea34f0e +Block 0023 [ 26]: 9d86b03d15bb15f7 +Block 0023 [ 27]: dc229f5621ef7476 +Block 0023 [ 28]: 7f3914d304294e74 +Block 0023 [ 29]: c0cb249d4790157e +Block 0023 [ 30]: 1b549da01f8a3df0 +Block 0023 [ 31]: ba62cf7efd468685 +Block 0023 [ 32]: f454b7eeaa12a6c9 +Block 0023 [ 33]: a91074d5378b8494 +Block 0023 [ 34]: 88bce18fb76b8c48 +Block 0023 [ 35]: cfc04ad4fe68543e +Block 0023 [ 36]: df2057be18d33517 +Block 0023 [ 37]: 13226baa4125c349 +Block 0023 [ 38]: ef72cb1c23da3691 +Block 0023 [ 39]: da5f4f3db8bd3806 +Block 0023 [ 40]: 359ecf2233bbdd88 +Block 0023 [ 41]: 2da0dce2855ec11f +Block 0023 [ 42]: 53923497e1825a07 +Block 0023 [ 43]: 315b7d8242ce8993 +Block 0023 [ 44]: e6c20a9f32744b30 +Block 0023 [ 45]: b8280f049700fad3 +Block 0023 [ 46]: 9f86dfc83e311396 +Block 0023 [ 47]: 3d5389c7505ed7bc +Block 0023 [ 48]: 92f5d210510ee9ac +Block 0023 [ 49]: 5946a782c5e82902 +Block 0023 [ 50]: c2d548fa66061623 +Block 0023 [ 51]: e7bad6532357494d +Block 0023 [ 52]: d321776f0276918c +Block 0023 [ 53]: bd456bc123259f0c +Block 0023 [ 54]: 54a21561cdf88a8c +Block 0023 [ 55]: 5e358a502537b2f7 +Block 0023 [ 56]: 99b132361d154089 +Block 0023 [ 57]: 84f703f283fe9a3d +Block 0023 [ 58]: 69eb4b5540c63b45 +Block 0023 [ 59]: 1ccbb5de665d2f72 +Block 0023 [ 60]: fcaf74364ac9f8f8 +Block 0023 [ 61]: 5a8d6fc4175344c8 +Block 0023 [ 62]: 429cf28518d1d6b1 +Block 0023 [ 63]: 12fda086ea0009d9 +Block 0023 [ 64]: 2ec00664a4b15dd8 +Block 0023 [ 65]: 140a9b9ef7dfc853 +Block 0023 [ 66]: eddb2f43f8549e7c +Block 0023 [ 67]: 5782bd1f045fd9d0 +Block 0023 [ 68]: b8c6d19545590a92 +Block 0023 [ 69]: 7d575aadcfc41096 +Block 0023 [ 70]: 2c670dc169fca4d4 +Block 0023 [ 71]: 969e7c181c013882 +Block 0023 [ 72]: 707699fae53be225 +Block 0023 [ 73]: 599817453061b3aa +Block 0023 [ 74]: de50b8984deb3024 +Block 0023 [ 75]: 6577cebcd06675c7 +Block 0023 [ 76]: bf27f2775367d22a +Block 0023 [ 77]: 128b7a09850d97c6 +Block 0023 [ 78]: 3f505f36eb4ffd30 +Block 0023 [ 79]: 60d9c8a881890405 +Block 0023 [ 80]: a7f7eb087c7fcde3 +Block 0023 [ 81]: 87e5ffb94b2ccd52 +Block 0023 [ 82]: a2b3896a1578b3d0 +Block 0023 [ 83]: c730dc0d5c857ae6 +Block 0023 [ 84]: b78c67dd4544d4dc +Block 0023 [ 85]: e85429d5ddd6af9d +Block 0023 [ 86]: 91f7ba9e9b8195df +Block 0023 [ 87]: 1d0aa5dcb28f18a0 +Block 0023 [ 88]: 0ba3b3eeb02a966d +Block 0023 [ 89]: 6c8ceaf6d8f05ed7 +Block 0023 [ 90]: 2c969fc5f825097b +Block 0023 [ 91]: 548be2850059ff36 +Block 0023 [ 92]: 0493917ec9802a30 +Block 0023 [ 93]: fc068b2212e7cac1 +Block 0023 [ 94]: 7cc3b76b0709e28a +Block 0023 [ 95]: 81dbc467d1c7ae3a +Block 0023 [ 96]: 682dafd7341f6c2b +Block 0023 [ 97]: f4b958705828befb +Block 0023 [ 98]: c33bfff261f156b1 +Block 0023 [ 99]: fe8c617a34065ba0 +Block 0023 [100]: 6a6450fdd5369973 +Block 0023 [101]: a9ec838e3d01cf5c +Block 0023 [102]: d3624f4619c4ed6b +Block 0023 [103]: 2e27333b8045636f +Block 0023 [104]: 4302af176e71aabb +Block 0023 [105]: 47a021cc276346df +Block 0023 [106]: acab4e93993f3d4c +Block 0023 [107]: 915fc7ff50fec218 +Block 0023 [108]: 38d6b82052587c54 +Block 0023 [109]: 1785046ff7d042fc +Block 0023 [110]: 377a9b13fc1b9ea5 +Block 0023 [111]: 7265d3d78a9c6b2a +Block 0023 [112]: 6ccc5f6b63b72992 +Block 0023 [113]: 3d955c8dbd4680e2 +Block 0023 [114]: 1958ed0640792519 +Block 0023 [115]: 96d15acd6268fac3 +Block 0023 [116]: fce9b335ff6813bf +Block 0023 [117]: 31944f568c7a6e61 +Block 0023 [118]: 62474e159b6a69d0 +Block 0023 [119]: ba17ccc3e51ad03a +Block 0023 [120]: 06a4820b0ac6731d +Block 0023 [121]: 12d6b8463c7ee240 +Block 0023 [122]: 21ad64133acd11e4 +Block 0023 [123]: 9626ab9a178836a0 +Block 0023 [124]: 26427719be3fe4d2 +Block 0023 [125]: 43c7d5348eb934ac +Block 0023 [126]: a37be69b3f09895c +Block 0023 [127]: da21d8760a0a86df +Block 0024 [ 0]: cf8f96856b27bef3 +Block 0024 [ 1]: 538374b5db2e53df +Block 0024 [ 2]: 77081bd0b0d9303c +Block 0024 [ 3]: 71ea9b2f87d82f65 +Block 0024 [ 4]: b84b47aafe046d8d +Block 0024 [ 5]: 32281e46cb82140b +Block 0024 [ 6]: d74a975383daa261 +Block 0024 [ 7]: eb8ddf6fef2eab2c +Block 0024 [ 8]: 85efa5cdd2797a28 +Block 0024 [ 9]: 8988c6d6537f20cf +Block 0024 [ 10]: afa3befc0a1d0bd3 +Block 0024 [ 11]: 68594b431cfa9b37 +Block 0024 [ 12]: 8b4e0694766c9879 +Block 0024 [ 13]: 194ae444c11e14ae +Block 0024 [ 14]: 41c1f537433d5b74 +Block 0024 [ 15]: 32d80469d8e340f1 +Block 0024 [ 16]: 9c95332fe3ede149 +Block 0024 [ 17]: ba7e3eb54c1902f2 +Block 0024 [ 18]: a95e5ac9d8efdafc +Block 0024 [ 19]: 764b2f25047d6bc7 +Block 0024 [ 20]: 89beee560f2d500e +Block 0024 [ 21]: 17c78d78930ad71b +Block 0024 [ 22]: 703ee2ce41a0897d +Block 0024 [ 23]: 410353a71ad59e8b +Block 0024 [ 24]: ce133957feae7ab6 +Block 0024 [ 25]: ed83c399c42aba92 +Block 0024 [ 26]: ad9f3f30874f6cb1 +Block 0024 [ 27]: 353a7816060b52f3 +Block 0024 [ 28]: 55d24c9cd5567345 +Block 0024 [ 29]: 9576e73cb0f9cd57 +Block 0024 [ 30]: 3e4a93744b472b59 +Block 0024 [ 31]: 094a77da6bcb9b8f +Block 0024 [ 32]: 21cc11ecbc0347c7 +Block 0024 [ 33]: 858eab66e89d80a3 +Block 0024 [ 34]: a373da912a23fff5 +Block 0024 [ 35]: 6d01a0e582a1eb6a +Block 0024 [ 36]: cef03bd93495ff85 +Block 0024 [ 37]: 71f0d1a6b596741d +Block 0024 [ 38]: eb089e9710cf726d +Block 0024 [ 39]: f4ad37046aee8555 +Block 0024 [ 40]: 51a415a98700ba18 +Block 0024 [ 41]: 7492605ee6b50bf5 +Block 0024 [ 42]: e9d0aa6cf26ef7dc +Block 0024 [ 43]: fae3257644711601 +Block 0024 [ 44]: ef4ea37a228d87ab +Block 0024 [ 45]: 8cb0e52f96ad89c8 +Block 0024 [ 46]: 3a9beaac8a7c6673 +Block 0024 [ 47]: 2b8b083eaf9e5bea +Block 0024 [ 48]: b7017c5a9b985cc8 +Block 0024 [ 49]: ac45b63f5c03446e +Block 0024 [ 50]: 603871e8fa7c1798 +Block 0024 [ 51]: 95108dd25de5bf40 +Block 0024 [ 52]: 1b39f2a620715e4b +Block 0024 [ 53]: e7f278a6c8d5ef0a +Block 0024 [ 54]: 4522cbafa997ee91 +Block 0024 [ 55]: c5c456681b67ba2f +Block 0024 [ 56]: a5738a9048687c75 +Block 0024 [ 57]: 26f555b171320f58 +Block 0024 [ 58]: a37fae3c988a9d41 +Block 0024 [ 59]: 5070dedba406729b +Block 0024 [ 60]: 27b120850e97e811 +Block 0024 [ 61]: ca12b508cf982bd3 +Block 0024 [ 62]: d8f86605ff5ad305 +Block 0024 [ 63]: 27fff09a65e13879 +Block 0024 [ 64]: 80302fa5d0884bd4 +Block 0024 [ 65]: 218a5d3bc896af5f +Block 0024 [ 66]: 0782c41608278c7a +Block 0024 [ 67]: f06173fdf5887776 +Block 0024 [ 68]: 3f413e52c28415fc +Block 0024 [ 69]: 6ed1d893f9aee791 +Block 0024 [ 70]: 4a4438fdc957d30c +Block 0024 [ 71]: 048018874b319afa +Block 0024 [ 72]: f8b978784278cb81 +Block 0024 [ 73]: 195c322da4ada50a +Block 0024 [ 74]: f1f4fa13504e30ab +Block 0024 [ 75]: 0b5f3914ca1e9f56 +Block 0024 [ 76]: 43ccdf096c495bca +Block 0024 [ 77]: 147f901fdd3f63d6 +Block 0024 [ 78]: 641a252f4db1fb6a +Block 0024 [ 79]: 2af292c339ad3501 +Block 0024 [ 80]: b42ca580e00a0cfa +Block 0024 [ 81]: d2a6f637d9ff9533 +Block 0024 [ 82]: dd7000216156156a +Block 0024 [ 83]: bd4efc849861550a +Block 0024 [ 84]: 8cde35a8e7597756 +Block 0024 [ 85]: a2beeb20448d9965 +Block 0024 [ 86]: b29f413d5ce01443 +Block 0024 [ 87]: 53a07a46cf956d2f +Block 0024 [ 88]: 843f107c4755d038 +Block 0024 [ 89]: 270ce395f4d98ba0 +Block 0024 [ 90]: 16936e6d71963d18 +Block 0024 [ 91]: d1cfb0e9575879e3 +Block 0024 [ 92]: e430bc6bccf2553b +Block 0024 [ 93]: 6ca082f5aa5d3883 +Block 0024 [ 94]: 2fd0d4cabae6c843 +Block 0024 [ 95]: 062e2b70c3ac9f47 +Block 0024 [ 96]: 9e08deeeffdcfd2c +Block 0024 [ 97]: e0aea6ad8b918f2d +Block 0024 [ 98]: b5a3ae6b8fb101a5 +Block 0024 [ 99]: e4d6ce06de13dbda +Block 0024 [100]: e47bd4c9d5920c29 +Block 0024 [101]: 2ad1bf91ee2b946e +Block 0024 [102]: 1c7af48ddd4ab92f +Block 0024 [103]: 49d9829c93509027 +Block 0024 [104]: 7e16b2f4434eaf60 +Block 0024 [105]: 3b5fce28515d3e55 +Block 0024 [106]: ee5184f0bd0bc316 +Block 0024 [107]: 34f3fefa21929e75 +Block 0024 [108]: 29d7be32d5d1308f +Block 0024 [109]: 1af91678babbf821 +Block 0024 [110]: 4735c7e9971b1e95 +Block 0024 [111]: 6f5bdec6c62d2cf6 +Block 0024 [112]: 7b57d917f7916d98 +Block 0024 [113]: 4c305d9e6fe35298 +Block 0024 [114]: d078638df882056f +Block 0024 [115]: 3b319b154d4fa0d0 +Block 0024 [116]: 06900db2cbfe81c1 +Block 0024 [117]: 06673712431a59ae +Block 0024 [118]: 60f0a1274bae4374 +Block 0024 [119]: afcfbb81ba9212f6 +Block 0024 [120]: 6ecac6530deab23f +Block 0024 [121]: 69ae57c629abb352 +Block 0024 [122]: 266f0dabe5af7624 +Block 0024 [123]: 33eed4df71113084 +Block 0024 [124]: c6f13e96d5f6112d +Block 0024 [125]: 02efdc43c4e48b02 +Block 0024 [126]: 42283c13cdbfcd2c +Block 0024 [127]: 0436a1af463de562 +Block 0025 [ 0]: 5b9abfa7feb2a37c +Block 0025 [ 1]: 5d485f04bba0a1f8 +Block 0025 [ 2]: 46765ebb62cc41c3 +Block 0025 [ 3]: 557b8cfa9bd9e7df +Block 0025 [ 4]: 0e7716504d681b97 +Block 0025 [ 5]: 0b6bcf29374a050f +Block 0025 [ 6]: e98f9633d70cb263 +Block 0025 [ 7]: 800a0bb3298debd0 +Block 0025 [ 8]: d9f3f7cbabf9771c +Block 0025 [ 9]: 132e4129d1daffd1 +Block 0025 [ 10]: 39489c7cc8c2a06b +Block 0025 [ 11]: 9c2fdc9cda85c204 +Block 0025 [ 12]: 73a42d407e3a97bf +Block 0025 [ 13]: 59997a9a9ccd5086 +Block 0025 [ 14]: 475f0aa67e8087d5 +Block 0025 [ 15]: bdaee394ba5cf10a +Block 0025 [ 16]: ea729a7408010680 +Block 0025 [ 17]: 56a1679ad9ad4ebe +Block 0025 [ 18]: 1cc56e01ad0b38c4 +Block 0025 [ 19]: d46ece129d9a289a +Block 0025 [ 20]: 1390f7ce5344e77e +Block 0025 [ 21]: 8f781e2c5ab8fe80 +Block 0025 [ 22]: 997e9d8fd86ed661 +Block 0025 [ 23]: c6e26d91f5e89382 +Block 0025 [ 24]: 81ae4d5b3b765fa8 +Block 0025 [ 25]: 264e78c06f79d41e +Block 0025 [ 26]: 19e2b6aebb075733 +Block 0025 [ 27]: 4acc50b54032408a +Block 0025 [ 28]: 5ac7f30e4aaae5f4 +Block 0025 [ 29]: 0397e9e0f5d6e6ad +Block 0025 [ 30]: 0e711ba1239e83a4 +Block 0025 [ 31]: 0895d50a8ec9f19a +Block 0025 [ 32]: 3af5724f6e6c1e8d +Block 0025 [ 33]: 5af8c0606a4dc339 +Block 0025 [ 34]: 8096410d4630434c +Block 0025 [ 35]: 5cfdd78aa4075d16 +Block 0025 [ 36]: 2154a4ecd25dc45c +Block 0025 [ 37]: f0bb154e287e08e9 +Block 0025 [ 38]: 114f2bed186ce33e +Block 0025 [ 39]: 6d9c780293d2cd4c +Block 0025 [ 40]: 23612d45f0d156c9 +Block 0025 [ 41]: fa5e7e052ae2ba8e +Block 0025 [ 42]: 9eb8416e705b3c2c +Block 0025 [ 43]: ba6586685b87bd09 +Block 0025 [ 44]: 361a1cca5d78684f +Block 0025 [ 45]: f045f145f1047ecd +Block 0025 [ 46]: b66a58c8db976ddc +Block 0025 [ 47]: 1ff9eabf3e99d098 +Block 0025 [ 48]: bf57a4d81e63a4e5 +Block 0025 [ 49]: e9ba5c410ed8eeca +Block 0025 [ 50]: c2d46dbc68733832 +Block 0025 [ 51]: 5efc7dcb9b5bfe6d +Block 0025 [ 52]: 4154c8d811ee1e5a +Block 0025 [ 53]: b4cc77c95c0185c8 +Block 0025 [ 54]: 3d6ee2f21788c74a +Block 0025 [ 55]: 27588eb02b04eb8e +Block 0025 [ 56]: 28fb9544bf40218d +Block 0025 [ 57]: ca084c249c06f53d +Block 0025 [ 58]: d60b3b0c9ad45f54 +Block 0025 [ 59]: 65af42b7955016c8 +Block 0025 [ 60]: ddcff7cb451a8a7a +Block 0025 [ 61]: 399126720a6c58fb +Block 0025 [ 62]: cb9ca1ce53e78936 +Block 0025 [ 63]: 93a027cf494dd4d0 +Block 0025 [ 64]: 35ed9cd12a3a26eb +Block 0025 [ 65]: 4290e096ff8d8e24 +Block 0025 [ 66]: 45321339efcabf66 +Block 0025 [ 67]: a7721e8468b60e4c +Block 0025 [ 68]: 7cbc7aa27492601a +Block 0025 [ 69]: e1f50ea06a229f6c +Block 0025 [ 70]: 5691f85c4f126e26 +Block 0025 [ 71]: 874a48f6977c98b0 +Block 0025 [ 72]: 202b5f82a5b84018 +Block 0025 [ 73]: 7b32c5128fecb612 +Block 0025 [ 74]: a37ea9f179c0d7a0 +Block 0025 [ 75]: 327b8fc50cce958b +Block 0025 [ 76]: a8e2a1258fb1da80 +Block 0025 [ 77]: f80691238a1eef40 +Block 0025 [ 78]: 6c182b612af57ece +Block 0025 [ 79]: 178e573cc0d200e5 +Block 0025 [ 80]: bb8b504ceae9afe2 +Block 0025 [ 81]: 3c59e39992ae4a3c +Block 0025 [ 82]: 22b54658fd492202 +Block 0025 [ 83]: 52aea26785cac12b +Block 0025 [ 84]: 7c29b08458b0e3c3 +Block 0025 [ 85]: fd88eab7d627a17c +Block 0025 [ 86]: 37f909c6bd36b704 +Block 0025 [ 87]: 9f52cb379a083d4c +Block 0025 [ 88]: caee6a1fcad15eb9 +Block 0025 [ 89]: f7fd9d1a6b2bb28a +Block 0025 [ 90]: 304f7769dd3975f1 +Block 0025 [ 91]: 212c30fd3d98e27a +Block 0025 [ 92]: fef3d2bf4c3f7d45 +Block 0025 [ 93]: 2f0beb68030bb52e +Block 0025 [ 94]: ea352eb79030ef21 +Block 0025 [ 95]: 8d79331061c22ba6 +Block 0025 [ 96]: 770e83d3e6b823b1 +Block 0025 [ 97]: 89a9ec7c4487297f +Block 0025 [ 98]: 8dbcad4c4e11be67 +Block 0025 [ 99]: 8b7d38ef5fec1601 +Block 0025 [100]: e93c587d6bf2cbf9 +Block 0025 [101]: a53137a33d258830 +Block 0025 [102]: 7a0d11ca5acf1788 +Block 0025 [103]: b3dbaa7d7ecebd4d +Block 0025 [104]: d882e019de21daf8 +Block 0025 [105]: 45d2cdf54ca6be9a +Block 0025 [106]: 33d36d64d12442b6 +Block 0025 [107]: 8fc0b56aa86049d0 +Block 0025 [108]: 0b3fd87ac5ed9c10 +Block 0025 [109]: f3865aaea80fc664 +Block 0025 [110]: 5c85cbd5e3bbfcac +Block 0025 [111]: a2cc7235f21769e3 +Block 0025 [112]: 5ec5ce43bf29dd82 +Block 0025 [113]: de410519cd682004 +Block 0025 [114]: 3267444c60d75f3f +Block 0025 [115]: acd6ba02e82c6225 +Block 0025 [116]: 0322e9d6a5053284 +Block 0025 [117]: 4df45251e620c948 +Block 0025 [118]: adccf0d3de3bea09 +Block 0025 [119]: cb5bca189109f1ca +Block 0025 [120]: af2f65bee48c15b5 +Block 0025 [121]: 52989089263dd3d8 +Block 0025 [122]: 793c1f6d08cbe93f +Block 0025 [123]: d990a75b2ad2ff08 +Block 0025 [124]: 24e34bd7efd6d0d0 +Block 0025 [125]: c31b33bd91bcd47a +Block 0025 [126]: 34b1e70c5d8a133e +Block 0025 [127]: dd9b5f4b960c1c19 +Block 0026 [ 0]: dee9b2aa87871f5c +Block 0026 [ 1]: dd29e85f6d4b3046 +Block 0026 [ 2]: 983313f6040a4701 +Block 0026 [ 3]: 60e421701b903eb5 +Block 0026 [ 4]: aa1760fc7944b723 +Block 0026 [ 5]: 5e9cfdd75c022ec3 +Block 0026 [ 6]: 2344dd4599365deb +Block 0026 [ 7]: 46bcf69ff591ace9 +Block 0026 [ 8]: 67e126c5dffc41b8 +Block 0026 [ 9]: 6d03149e72cd6ad2 +Block 0026 [ 10]: ffd3ebb4669f8fb5 +Block 0026 [ 11]: 4f1f99d9f00858c8 +Block 0026 [ 12]: d188674d4f5880d3 +Block 0026 [ 13]: 4a9ed6f5c0f1136c +Block 0026 [ 14]: 293fac32e9fe652f +Block 0026 [ 15]: ca87659e3a8cb9f2 +Block 0026 [ 16]: 37f8096aae66b859 +Block 0026 [ 17]: 88efabca999b09d5 +Block 0026 [ 18]: f531a630ca5aea1f +Block 0026 [ 19]: c8d98dbee1b05b62 +Block 0026 [ 20]: 12296953234eed5f +Block 0026 [ 21]: 9d339201956f944d +Block 0026 [ 22]: eeda4cdc2976f262 +Block 0026 [ 23]: ba41e3628c946c9f +Block 0026 [ 24]: 1216bb9dce7018b2 +Block 0026 [ 25]: 1b261d6a529167cd +Block 0026 [ 26]: 4125bad6e4a3384d +Block 0026 [ 27]: db476851fa256b4a +Block 0026 [ 28]: b2fc7dc141cadae7 +Block 0026 [ 29]: c5eb5cb966d9dad9 +Block 0026 [ 30]: 3393e3a31b11a880 +Block 0026 [ 31]: ac872ec83d51cd5f +Block 0026 [ 32]: 29c51b4bd0274682 +Block 0026 [ 33]: c6c83089cb723994 +Block 0026 [ 34]: 1b0d4fe0d6e9f14b +Block 0026 [ 35]: 3cdce9f955907277 +Block 0026 [ 36]: 875c09bda8862c96 +Block 0026 [ 37]: 1d4e56b54e562742 +Block 0026 [ 38]: 12d9c0e0ac84c079 +Block 0026 [ 39]: ae01999edf7225b0 +Block 0026 [ 40]: 0e20472caed467fe +Block 0026 [ 41]: 6e487ddc7ea710e7 +Block 0026 [ 42]: a280d9ea0a29224c +Block 0026 [ 43]: 98126e05f1ce5ad4 +Block 0026 [ 44]: 9eb6223f8a3d336c +Block 0026 [ 45]: 60cec3a9a070e8e0 +Block 0026 [ 46]: 017adf6fe630672e +Block 0026 [ 47]: 3b7a7736523bc3bc +Block 0026 [ 48]: 9d5fb41cbf6adb09 +Block 0026 [ 49]: 48600b688c8c577e +Block 0026 [ 50]: 1051ce0ea3a4cfbc +Block 0026 [ 51]: a50896f93ece5cd0 +Block 0026 [ 52]: 4ff442fe3230ad8b +Block 0026 [ 53]: 604ceece7911b994 +Block 0026 [ 54]: 6541af944a04d111 +Block 0026 [ 55]: 8e987b86a8afdddd +Block 0026 [ 56]: ccac943c5646f2a4 +Block 0026 [ 57]: 86b5be6691aa654c +Block 0026 [ 58]: 412c474818edcb3b +Block 0026 [ 59]: 4b49534018da9114 +Block 0026 [ 60]: 9340dfc1b986dfa3 +Block 0026 [ 61]: dc0730e95c51f794 +Block 0026 [ 62]: f169981fadfc5549 +Block 0026 [ 63]: c71a8ee88ffef06c +Block 0026 [ 64]: eef8c797696883bd +Block 0026 [ 65]: 3dd92ac77d49f446 +Block 0026 [ 66]: 496d5985927355d0 +Block 0026 [ 67]: 5284e7cb68c2ca1b +Block 0026 [ 68]: 3c9719c5303b55fc +Block 0026 [ 69]: e3fb82f8ad2e8391 +Block 0026 [ 70]: d30b1110f61916d3 +Block 0026 [ 71]: 32512588b786c1fb +Block 0026 [ 72]: e010bdf498d961c9 +Block 0026 [ 73]: 074b5eb7e84d6ca2 +Block 0026 [ 74]: 44f8b7e9a934e38f +Block 0026 [ 75]: dde33fd942e913eb +Block 0026 [ 76]: f28b6b5e26433af4 +Block 0026 [ 77]: 8bbe1f779ca8dd98 +Block 0026 [ 78]: a804df4bb4ec3dd8 +Block 0026 [ 79]: daa6d81df64040fe +Block 0026 [ 80]: 842e1580985fd685 +Block 0026 [ 81]: 3c81fdf208936747 +Block 0026 [ 82]: 2f66d5edb35d9b3e +Block 0026 [ 83]: f0237f2a4fc163db +Block 0026 [ 84]: f019ee576d7661c2 +Block 0026 [ 85]: 0f7c9a4b83b83b05 +Block 0026 [ 86]: 5d6298890f9310f6 +Block 0026 [ 87]: 0ede0453519b1eda +Block 0026 [ 88]: 13af8affb04a2663 +Block 0026 [ 89]: 80872076367bfc81 +Block 0026 [ 90]: 2ea2f0780da7f2be +Block 0026 [ 91]: a99f73ce6a2a05c4 +Block 0026 [ 92]: b80dc9d2a2600dca +Block 0026 [ 93]: d4b9bc8454ffab5b +Block 0026 [ 94]: d200e46e43f879a9 +Block 0026 [ 95]: 537c6054435cb95c +Block 0026 [ 96]: 01b1a480310f40f5 +Block 0026 [ 97]: c05eec0798009539 +Block 0026 [ 98]: 47d145ed55765f11 +Block 0026 [ 99]: bc359cf5298fb1fb +Block 0026 [100]: 7a4fc2282e858a1e +Block 0026 [101]: 922e6d1261fe72a1 +Block 0026 [102]: 9233e06069f676ae +Block 0026 [103]: 28fd56cf04f236e6 +Block 0026 [104]: 2af5cbbab60a6994 +Block 0026 [105]: 8a035717c193c0e1 +Block 0026 [106]: be4d991be04daf58 +Block 0026 [107]: d62d6c8670910ca6 +Block 0026 [108]: ac8f20c64229cf79 +Block 0026 [109]: a0be7a6a741cb355 +Block 0026 [110]: 23a995532d6388a1 +Block 0026 [111]: b1538a43a24cd9f4 +Block 0026 [112]: e77500799ebece8d +Block 0026 [113]: ca127140631ad537 +Block 0026 [114]: 60a4f9f085cc5132 +Block 0026 [115]: 8e8bed70b3926177 +Block 0026 [116]: 208e7b4eb75dfb2e +Block 0026 [117]: 3b8f8ba0e8efffc7 +Block 0026 [118]: 8f18cb6e7a8d0f29 +Block 0026 [119]: 8f37d725599de412 +Block 0026 [120]: e14a83c050008162 +Block 0026 [121]: d2d6e966cbf9611a +Block 0026 [122]: ba9a2378c5dac511 +Block 0026 [123]: ba716dabf5ccd414 +Block 0026 [124]: 877f060b5aed5b8a +Block 0026 [125]: ad9db071b4cbcb75 +Block 0026 [126]: cab1f62b8803c369 +Block 0026 [127]: f050f7dbe5e6fd66 +Block 0027 [ 0]: 6cee4b9d191832e4 +Block 0027 [ 1]: a9ed71c242860d65 +Block 0027 [ 2]: 9d57bd98dc8c821a +Block 0027 [ 3]: 059bde7efdbfd8c1 +Block 0027 [ 4]: 269e8e1f20a45148 +Block 0027 [ 5]: 151e005fb247eb07 +Block 0027 [ 6]: d50170ee221d6e0e +Block 0027 [ 7]: 2c15fd72d852f3f9 +Block 0027 [ 8]: a170b2c99c039fbb +Block 0027 [ 9]: bb540d6fe2f80c7b +Block 0027 [ 10]: 26be1fccf08e833b +Block 0027 [ 11]: bec687afce3a11b5 +Block 0027 [ 12]: 49fbc628b10960c1 +Block 0027 [ 13]: 9ed97c1da2275ef6 +Block 0027 [ 14]: 67023b2e3ed8d148 +Block 0027 [ 15]: 6aaaff9a46cf4044 +Block 0027 [ 16]: ef946e6176c9df2d +Block 0027 [ 17]: 1924ca3e69fe39f1 +Block 0027 [ 18]: 3ab1dfab6b50980c +Block 0027 [ 19]: b70e0bc7440fc385 +Block 0027 [ 20]: fecdf018f791586e +Block 0027 [ 21]: 1236618a4c2e1d64 +Block 0027 [ 22]: aadc58b1c7562781 +Block 0027 [ 23]: 74394ced4218af4d +Block 0027 [ 24]: 1aef33449aa870fa +Block 0027 [ 25]: 20effaa9d742e0b6 +Block 0027 [ 26]: 2eac80dba70985a0 +Block 0027 [ 27]: a398c86bf53fc422 +Block 0027 [ 28]: b77b10e2168cc4d1 +Block 0027 [ 29]: fce8d4978068cf3d +Block 0027 [ 30]: 8bde6bd1a6bfb867 +Block 0027 [ 31]: 1a37ab91af293735 +Block 0027 [ 32]: ab2284a7ceced18a +Block 0027 [ 33]: 6d23a4a8dd5fcac2 +Block 0027 [ 34]: 01783511ff88040f +Block 0027 [ 35]: 0bfaa3cdd7629a5f +Block 0027 [ 36]: d1466859d1700abf +Block 0027 [ 37]: a323bfe6d5924ef6 +Block 0027 [ 38]: b0630ada9d4fa447 +Block 0027 [ 39]: 07621e3b349c5909 +Block 0027 [ 40]: fff27196da746f6e +Block 0027 [ 41]: ea43e184f8a6532e +Block 0027 [ 42]: 1998186d499f4e18 +Block 0027 [ 43]: 402e532b78357606 +Block 0027 [ 44]: e0a649a10d61d091 +Block 0027 [ 45]: 1eaf8a6209b93c4f +Block 0027 [ 46]: e1010b48889983a3 +Block 0027 [ 47]: 25655970b2a8d6de +Block 0027 [ 48]: 00a51d8b8c8e84e4 +Block 0027 [ 49]: 4f5db1b5e6dc5525 +Block 0027 [ 50]: fcc650fae81b515f +Block 0027 [ 51]: 0f676bb6cf68c300 +Block 0027 [ 52]: 860a1250580ae58d +Block 0027 [ 53]: eeef9111751458da +Block 0027 [ 54]: a789af0aaa552763 +Block 0027 [ 55]: ce24c29680c629d8 +Block 0027 [ 56]: 34ed0a8ee22bf010 +Block 0027 [ 57]: 3b0a4c70c76ffa93 +Block 0027 [ 58]: e9772cfe2b1b4614 +Block 0027 [ 59]: 0e0497ca49fd7322 +Block 0027 [ 60]: 85d0a7c5fdf74b8d +Block 0027 [ 61]: cd3891e2f2e49aa0 +Block 0027 [ 62]: 230c209081749b87 +Block 0027 [ 63]: 7295114e617d5b51 +Block 0027 [ 64]: 83d5c5fc1bfc5c22 +Block 0027 [ 65]: 2b9a2dfe113c5c95 +Block 0027 [ 66]: f388a2a9b91c3ed0 +Block 0027 [ 67]: ec61a56fc4028a0a +Block 0027 [ 68]: 7f32595cfd7865a8 +Block 0027 [ 69]: 85b7093f80093890 +Block 0027 [ 70]: 0b4d7bda002ad0de +Block 0027 [ 71]: 5b2b1bf027012ab1 +Block 0027 [ 72]: 9325569531e2db66 +Block 0027 [ 73]: 6c1ff4360235586d +Block 0027 [ 74]: d8ba96751d53a852 +Block 0027 [ 75]: 83410fdb0a21173a +Block 0027 [ 76]: 790fb01da6186465 +Block 0027 [ 77]: 7d3904d42d029f49 +Block 0027 [ 78]: c4ce0b7f94be6679 +Block 0027 [ 79]: c612310f9131c614 +Block 0027 [ 80]: d61e9b1f7a785d1f +Block 0027 [ 81]: f185e40a8bd95c05 +Block 0027 [ 82]: 4b6fb8883a1666e1 +Block 0027 [ 83]: ab03fcd9e323c69f +Block 0027 [ 84]: 42de84498a783ae8 +Block 0027 [ 85]: 7d16a844e4d8dcc9 +Block 0027 [ 86]: e81580d22a7bb2c1 +Block 0027 [ 87]: 7ed219f3a8c679b9 +Block 0027 [ 88]: 68f7c86d984e6784 +Block 0027 [ 89]: 7d123922ed59bbb9 +Block 0027 [ 90]: b45c03de2d713b60 +Block 0027 [ 91]: 99788dd95bc08ca7 +Block 0027 [ 92]: 09139929de450f31 +Block 0027 [ 93]: e76251a2f16af5f7 +Block 0027 [ 94]: f7087f98b0f45cad +Block 0027 [ 95]: 9d0dbd832c11fed4 +Block 0027 [ 96]: 49cfad882ed6c191 +Block 0027 [ 97]: 6aeb515660237856 +Block 0027 [ 98]: 02c5740c70202deb +Block 0027 [ 99]: 577d95f21e2e3bbf +Block 0027 [100]: c03e5473a2080989 +Block 0027 [101]: c262c10f462a8bc2 +Block 0027 [102]: 6fa94f1eacda3c70 +Block 0027 [103]: 45faae378c209581 +Block 0027 [104]: c7c7058e5f11b1b7 +Block 0027 [105]: 575cf1e4b381d95d +Block 0027 [106]: f5f663d9108800d4 +Block 0027 [107]: cb1fb7f209fd05d5 +Block 0027 [108]: 4841189501751a1b +Block 0027 [109]: 39a866af5fe517d2 +Block 0027 [110]: f9bbd9eec0fc0977 +Block 0027 [111]: 084fde551a81270d +Block 0027 [112]: 96923f1be57c5de3 +Block 0027 [113]: 808364e601919381 +Block 0027 [114]: 87bd3c59be533277 +Block 0027 [115]: 4e8f81a1886691f8 +Block 0027 [116]: 37e1a86f4b0f6f29 +Block 0027 [117]: 2bcd52d24d0d5585 +Block 0027 [118]: e583d419264bac50 +Block 0027 [119]: ba04b34eaa228f04 +Block 0027 [120]: 734b7b7ed2514509 +Block 0027 [121]: 8d48fa46cdf4380a +Block 0027 [122]: 07755610226a02a9 +Block 0027 [123]: d982c0b08c29f64a +Block 0027 [124]: 0213185434795e00 +Block 0027 [125]: 3f91b4136d9ab75e +Block 0027 [126]: 75a3cccc78dc560d +Block 0027 [127]: ca7664e9950ea00b +Block 0028 [ 0]: 021ba1bcdde6ad58 +Block 0028 [ 1]: 05754433d559cc24 +Block 0028 [ 2]: 13d1a128aa990eef +Block 0028 [ 3]: 1c5ba0f62141a511 +Block 0028 [ 4]: 8af1f026e263b7ab +Block 0028 [ 5]: e78a7881940a6c49 +Block 0028 [ 6]: cac7b0b9c260d131 +Block 0028 [ 7]: ce6a8fb8aa5ea347 +Block 0028 [ 8]: 244f1b3865d09688 +Block 0028 [ 9]: aa0a003891c3bfd7 +Block 0028 [ 10]: 3fe713094ec02d02 +Block 0028 [ 11]: ea6b606d3bce5251 +Block 0028 [ 12]: 9d66dfa678ded00a +Block 0028 [ 13]: c40de07bdf0185b6 +Block 0028 [ 14]: a3c77fc2f3c0fbb6 +Block 0028 [ 15]: 946bb60ad124c187 +Block 0028 [ 16]: c167a3e4cc7cfa26 +Block 0028 [ 17]: 54bc0c1e2d674273 +Block 0028 [ 18]: 105fc327f7e8ee3d +Block 0028 [ 19]: 16f039b56fc0a5a7 +Block 0028 [ 20]: a37bb14db8a46a9a +Block 0028 [ 21]: 48a54dec7fc69d51 +Block 0028 [ 22]: 9bce116e5facd867 +Block 0028 [ 23]: eb04c9f0019a2662 +Block 0028 [ 24]: b04eb3fd473a5d7b +Block 0028 [ 25]: 94b871a19cd1649a +Block 0028 [ 26]: 9ed5121361ce3387 +Block 0028 [ 27]: 6a1d11715db6979f +Block 0028 [ 28]: 59e15eddeb67ab7a +Block 0028 [ 29]: 839ccd2cb4c3318c +Block 0028 [ 30]: 7024ee61e96cee9f +Block 0028 [ 31]: 311c0401c64c981c +Block 0028 [ 32]: 65fc4884b80591cd +Block 0028 [ 33]: 3108e4165add79c1 +Block 0028 [ 34]: 0a3d0907c7ec23d5 +Block 0028 [ 35]: 94a38dd3f4ee55ab +Block 0028 [ 36]: 72faac9eabdaecca +Block 0028 [ 37]: 7a82e8dce2ea29f8 +Block 0028 [ 38]: 13c99f27feba2587 +Block 0028 [ 39]: 65c726d1264eb57c +Block 0028 [ 40]: 3f8c0497ad70ada4 +Block 0028 [ 41]: 0298113f4159a8ab +Block 0028 [ 42]: 458c01cb8c3ea337 +Block 0028 [ 43]: 1cf949c1a75e5e92 +Block 0028 [ 44]: 1e7253bebed45d79 +Block 0028 [ 45]: d55a5ec3329d8193 +Block 0028 [ 46]: e519244e1d684c9c +Block 0028 [ 47]: 7a0fa26b4cdc9472 +Block 0028 [ 48]: b0bf49049bc0740d +Block 0028 [ 49]: 1a7fc20aabf75ef8 +Block 0028 [ 50]: 38e09ddc184047e0 +Block 0028 [ 51]: 8516c0eec030039b +Block 0028 [ 52]: 6f9ea72875456583 +Block 0028 [ 53]: 4f013974f9881a3c +Block 0028 [ 54]: d0e3b2abf57f9778 +Block 0028 [ 55]: 4e114931fa4f38e3 +Block 0028 [ 56]: aa2c1b90c2b84707 +Block 0028 [ 57]: 7cf9e1bec166fa3c +Block 0028 [ 58]: 1d14ff9ce7c7c685 +Block 0028 [ 59]: 9b88487090e17bf9 +Block 0028 [ 60]: 150c3ca35ccf0b87 +Block 0028 [ 61]: daac811c31be3821 +Block 0028 [ 62]: bcdd701f9e1b680f +Block 0028 [ 63]: 9efb7a1bade02efb +Block 0028 [ 64]: 965ec869ef55fa1f +Block 0028 [ 65]: bc5ebba00a595680 +Block 0028 [ 66]: d230a4dc0284e46b +Block 0028 [ 67]: 823fec805865fb74 +Block 0028 [ 68]: fed454a3199ac15d +Block 0028 [ 69]: 68bf5dcdfd59023a +Block 0028 [ 70]: 03fb3802c49c76d3 +Block 0028 [ 71]: 640356823d9e1f25 +Block 0028 [ 72]: 9af81ea04ffae2d6 +Block 0028 [ 73]: dfe109e2b7d0bf40 +Block 0028 [ 74]: 66fc8c0daf88a898 +Block 0028 [ 75]: c75315d22fe1aa30 +Block 0028 [ 76]: f0caf3aea9d40a17 +Block 0028 [ 77]: afdbdabb57ab2819 +Block 0028 [ 78]: 174e7c9c1c84c955 +Block 0028 [ 79]: b6a536c200abab95 +Block 0028 [ 80]: d613e8709aa02577 +Block 0028 [ 81]: 39241a2e6f32c0af +Block 0028 [ 82]: 2f5332d5bf68ae62 +Block 0028 [ 83]: 92c842d69e754894 +Block 0028 [ 84]: dcb13e9f3e408523 +Block 0028 [ 85]: b3d1ecfdc8704dd6 +Block 0028 [ 86]: aaee559c5be890d6 +Block 0028 [ 87]: 393b7f63de100e35 +Block 0028 [ 88]: 322cf47045b22301 +Block 0028 [ 89]: 19ff6b2aa2ac9277 +Block 0028 [ 90]: dce7764521ba0a7b +Block 0028 [ 91]: ec055028f6e83fb8 +Block 0028 [ 92]: f2f20eeb21b515e9 +Block 0028 [ 93]: b9fd8d709f86f77e +Block 0028 [ 94]: f87e5b1d24d6bec3 +Block 0028 [ 95]: 5545693938b9b1b0 +Block 0028 [ 96]: d79b6740a34e5f86 +Block 0028 [ 97]: 1019c5dbba476ad9 +Block 0028 [ 98]: 9a55366e9030da6f +Block 0028 [ 99]: d43822683b3e8be4 +Block 0028 [100]: f966c8e1e7a36675 +Block 0028 [101]: fbf3966b8b80870d +Block 0028 [102]: 66d11762697d27b0 +Block 0028 [103]: 75969a1a3942deb2 +Block 0028 [104]: f28afc2f58cf33d6 +Block 0028 [105]: 55d35c2336ca57ee +Block 0028 [106]: 667d8b6d12f977e1 +Block 0028 [107]: 771b375bfff2802b +Block 0028 [108]: 21dc11f30d79569c +Block 0028 [109]: f02c16d785001d38 +Block 0028 [110]: aacb1ac75e686919 +Block 0028 [111]: 4ab85ab2b6c1835c +Block 0028 [112]: 049a59753bcfea7c +Block 0028 [113]: d8ec0bbcaff19bf1 +Block 0028 [114]: 555b8fb2fb3fc18a +Block 0028 [115]: 8c21368e54c09192 +Block 0028 [116]: f63dc13c28a441d3 +Block 0028 [117]: a9fe5883c3d89563 +Block 0028 [118]: 08d8ea5088dffb01 +Block 0028 [119]: dca841375d9b9868 +Block 0028 [120]: 667c3365686b7486 +Block 0028 [121]: 49bf1533c8b4064f +Block 0028 [122]: 602aea24f66274ea +Block 0028 [123]: bfc3de51f2c4d4c4 +Block 0028 [124]: ec8c6cdd1a00e16b +Block 0028 [125]: a9193f90093496b2 +Block 0028 [126]: 256c38224299ea19 +Block 0028 [127]: 57639a4bcfa0922e +Block 0029 [ 0]: bd80fcc7c493a4cc +Block 0029 [ 1]: c5023918f090ee9e +Block 0029 [ 2]: 120c321b4380db6a +Block 0029 [ 3]: af7830696eae7fca +Block 0029 [ 4]: eae34d49a4d64266 +Block 0029 [ 5]: 90ae58d5d4b35e0e +Block 0029 [ 6]: c7e27180eb24ab38 +Block 0029 [ 7]: 41a8a21726d95593 +Block 0029 [ 8]: aa48d5fffffa1bec +Block 0029 [ 9]: cd0a98894a346d20 +Block 0029 [ 10]: e9918f3944c6c57a +Block 0029 [ 11]: 0d51b503be8b7d3f +Block 0029 [ 12]: c01a39d6e5a816d3 +Block 0029 [ 13]: d98714fb42090c9a +Block 0029 [ 14]: 5b0f8b46c6552043 +Block 0029 [ 15]: f67ebb64f9c95c72 +Block 0029 [ 16]: 7a327ab56661672d +Block 0029 [ 17]: 014e44f8e1d6f4d0 +Block 0029 [ 18]: 22b0135ae6ce2169 +Block 0029 [ 19]: 5acb3fe8583bbbd4 +Block 0029 [ 20]: 8b77215be2ee636d +Block 0029 [ 21]: e1ceeab70e75a00b +Block 0029 [ 22]: 23bfe2afcc7274cb +Block 0029 [ 23]: e999907479ac7504 +Block 0029 [ 24]: 1a6263a273550a10 +Block 0029 [ 25]: 1d859d178a3556ee +Block 0029 [ 26]: d64aaa268bb5dfd5 +Block 0029 [ 27]: e5828d9d546d97cd +Block 0029 [ 28]: 6d1b4cd3c40591cc +Block 0029 [ 29]: 0661a62919dcf007 +Block 0029 [ 30]: fe81c4564cb304a9 +Block 0029 [ 31]: 79cf16a922a779bc +Block 0029 [ 32]: ff1c06acaca27742 +Block 0029 [ 33]: 23560b1205c5d4b1 +Block 0029 [ 34]: cecc64bc877212ae +Block 0029 [ 35]: 825465623ee4a468 +Block 0029 [ 36]: eea58b7496232e66 +Block 0029 [ 37]: 183cb64d603654f4 +Block 0029 [ 38]: 8f8bd8e1ba69fa6c +Block 0029 [ 39]: 46f47e6e0d443920 +Block 0029 [ 40]: 9278985cd955bac8 +Block 0029 [ 41]: eac6643986183a3f +Block 0029 [ 42]: 192c91da027c23de +Block 0029 [ 43]: f57b6cc6e82866cd +Block 0029 [ 44]: d231ac4c4df30e2c +Block 0029 [ 45]: 2cd3b6b6246d7aca +Block 0029 [ 46]: 7c1568e891d26f7b +Block 0029 [ 47]: 9021075d21c78aed +Block 0029 [ 48]: aefe6fca182c4173 +Block 0029 [ 49]: 636f6b7c9baf5612 +Block 0029 [ 50]: b03144eca38c224f +Block 0029 [ 51]: f2b62ee56a803d3a +Block 0029 [ 52]: 8f74f5b5a60a3836 +Block 0029 [ 53]: c7178cc43f208500 +Block 0029 [ 54]: 7f13626ba8001211 +Block 0029 [ 55]: 488a9269357691d2 +Block 0029 [ 56]: d7cb7779d0658d00 +Block 0029 [ 57]: 9b149d43a08de81a +Block 0029 [ 58]: 5e7353a6bb2c1b8c +Block 0029 [ 59]: dfe5cf98b5a80325 +Block 0029 [ 60]: b3650e30db17f3f8 +Block 0029 [ 61]: 6175497305602f2c +Block 0029 [ 62]: cdb7de41d2d8920c +Block 0029 [ 63]: 2f1c8b7cdc478ba1 +Block 0029 [ 64]: 3ff1f88d8c4322b6 +Block 0029 [ 65]: 536a009eddf2acc2 +Block 0029 [ 66]: 1d1f7900970142d0 +Block 0029 [ 67]: be173300ae594dc5 +Block 0029 [ 68]: d834bc0fb7c26737 +Block 0029 [ 69]: d0e6a394e14a8afa +Block 0029 [ 70]: 1c6f7dc2b61a68ba +Block 0029 [ 71]: 6d4108d773a24064 +Block 0029 [ 72]: 165a18fae86da727 +Block 0029 [ 73]: 2c630bded29340eb +Block 0029 [ 74]: d5484247b2b1b85b +Block 0029 [ 75]: fac0b38c5baeca1b +Block 0029 [ 76]: 910314fa78a08093 +Block 0029 [ 77]: 45e5737d9f5ba290 +Block 0029 [ 78]: 7e16e0d27234eda1 +Block 0029 [ 79]: 87090ffaf76b4dc8 +Block 0029 [ 80]: d5a96bdc6813af4f +Block 0029 [ 81]: 8c76742877047af9 +Block 0029 [ 82]: a8e3c59550fdaa11 +Block 0029 [ 83]: e63a45ddb7435b1e +Block 0029 [ 84]: 6f6ce4dd69a8b71f +Block 0029 [ 85]: f68f28b76c6af71d +Block 0029 [ 86]: ad52a1a38c74efae +Block 0029 [ 87]: c0025f62b2b43ca1 +Block 0029 [ 88]: bdfab290d7ceef39 +Block 0029 [ 89]: 4d997d3fcd108ee8 +Block 0029 [ 90]: 6e24a833e1d8a49f +Block 0029 [ 91]: 349585e1656c0931 +Block 0029 [ 92]: 7a38ee0f7efd88dc +Block 0029 [ 93]: 77f60e1ef786ab0b +Block 0029 [ 94]: 29490d414e566f59 +Block 0029 [ 95]: e9093cb773a67699 +Block 0029 [ 96]: 5636f645e6065f9b +Block 0029 [ 97]: 413cdadedad007a6 +Block 0029 [ 98]: 3ce17b377bb2ad09 +Block 0029 [ 99]: 9521a534bacb031b +Block 0029 [100]: 546c24c320ead0ef +Block 0029 [101]: e0675e71649d878b +Block 0029 [102]: a47fad1344a99e2e +Block 0029 [103]: 408876c4f82c47dc +Block 0029 [104]: dca85e162f8d0d36 +Block 0029 [105]: 6877846c40c7f0f2 +Block 0029 [106]: d864a84891ab5412 +Block 0029 [107]: f258de875bdca86d +Block 0029 [108]: 03e85378a491acbf +Block 0029 [109]: ef4333022e5e2266 +Block 0029 [110]: 7e5cab39863e81d4 +Block 0029 [111]: afda4f13115bf9e9 +Block 0029 [112]: 0862355e4c705112 +Block 0029 [113]: 0adbeb157deff933 +Block 0029 [114]: 059707393cc95e97 +Block 0029 [115]: fd3182b6cc4b166c +Block 0029 [116]: 2c961278c9d1f4b5 +Block 0029 [117]: a26f46272f117fe1 +Block 0029 [118]: d6cc93a6f359730d +Block 0029 [119]: d3c00e15a7b16c88 +Block 0029 [120]: 126313ed08ab6177 +Block 0029 [121]: 07fedc02098d9756 +Block 0029 [122]: 3eea4cd3ad6e17df +Block 0029 [123]: 77383c002c96a26f +Block 0029 [124]: 6f84dcc0df35965f +Block 0029 [125]: fda794b95a3ed635 +Block 0029 [126]: 17c31f69d737fecd +Block 0029 [127]: 1d0bb16832a5d8d9 +Block 0030 [ 0]: 06faaf86c4357a63 +Block 0030 [ 1]: 187215eb774ab9c4 +Block 0030 [ 2]: e5d6061e3a116325 +Block 0030 [ 3]: 56360afd6c76444b +Block 0030 [ 4]: e2ae61086f6baa40 +Block 0030 [ 5]: 95404adbf442bf22 +Block 0030 [ 6]: 17f373fd6aafa6e8 +Block 0030 [ 7]: a41d44529d3c7702 +Block 0030 [ 8]: f16f0c58c5a515a3 +Block 0030 [ 9]: 2cf725568683bad4 +Block 0030 [ 10]: 46fb319e77174ad4 +Block 0030 [ 11]: 0e7ad98d8b446f88 +Block 0030 [ 12]: 11001e00646f1339 +Block 0030 [ 13]: d13329ad0f7eeca2 +Block 0030 [ 14]: f87b30bd41ec5063 +Block 0030 [ 15]: 83f6de915368cb97 +Block 0030 [ 16]: 1d72642a0cfc2c12 +Block 0030 [ 17]: 1c49f60f8fe27a9d +Block 0030 [ 18]: e14c4a9eb832fb0a +Block 0030 [ 19]: 0558b1e4c804f704 +Block 0030 [ 20]: ae214c39704454c7 +Block 0030 [ 21]: e1543cded2b2b1a4 +Block 0030 [ 22]: 50025cf0f167f678 +Block 0030 [ 23]: 1ddd862ffe3480aa +Block 0030 [ 24]: 767efd1c4f0c72d0 +Block 0030 [ 25]: 02801327344e815f +Block 0030 [ 26]: 9501d4e0f2971e86 +Block 0030 [ 27]: fd0c9541a4739bc0 +Block 0030 [ 28]: af1851ea44b3e369 +Block 0030 [ 29]: 37215e2791a82a3e +Block 0030 [ 30]: d0c64eeb8306a627 +Block 0030 [ 31]: 1f592f7e1dcc4ea0 +Block 0030 [ 32]: 2ffe7eeb807e5dd1 +Block 0030 [ 33]: ecd4afdf62b6a263 +Block 0030 [ 34]: 588674ffb6710991 +Block 0030 [ 35]: bbe3344c63d991fe +Block 0030 [ 36]: 4d25aba6ecb0ab9e +Block 0030 [ 37]: b97c6198cb98993a +Block 0030 [ 38]: faf1d9e4b742e20b +Block 0030 [ 39]: a0fa95a0d9036fed +Block 0030 [ 40]: 10c92928749af328 +Block 0030 [ 41]: a2f08707d69942f0 +Block 0030 [ 42]: 14ed52c3376fbbb1 +Block 0030 [ 43]: 491744b39b23ec69 +Block 0030 [ 44]: 3d6fb0f811e1fa93 +Block 0030 [ 45]: b16b0918d1822cd1 +Block 0030 [ 46]: 4e9e24e3d83f58d7 +Block 0030 [ 47]: 937438d4d16a045d +Block 0030 [ 48]: 5c4dfe9183e7027d +Block 0030 [ 49]: 242d26fab41e8429 +Block 0030 [ 50]: 837997f2bcb0a989 +Block 0030 [ 51]: 733af3308f05666b +Block 0030 [ 52]: 9e7eff9d395b0d26 +Block 0030 [ 53]: f5eddbcb0359d70a +Block 0030 [ 54]: 6fb6f80eee13ee63 +Block 0030 [ 55]: 79705f3b3e8f50e6 +Block 0030 [ 56]: d400902a38bf8231 +Block 0030 [ 57]: 87905ac331d93527 +Block 0030 [ 58]: 759a79c21cdbe946 +Block 0030 [ 59]: 6e1bab338c267a63 +Block 0030 [ 60]: 2aaeddc1fd55ec08 +Block 0030 [ 61]: 73dcdb99d6529922 +Block 0030 [ 62]: fc20a90382ff207e +Block 0030 [ 63]: cd9951922068a854 +Block 0030 [ 64]: 99a2d615ce8f36d0 +Block 0030 [ 65]: 214b493680f9162a +Block 0030 [ 66]: 82a32c9170dd7706 +Block 0030 [ 67]: e7480d0108c76bee +Block 0030 [ 68]: 8a7f18a34fffdc27 +Block 0030 [ 69]: 2b2785750dcc7550 +Block 0030 [ 70]: 481082b18dbf5424 +Block 0030 [ 71]: 52583c728ae14666 +Block 0030 [ 72]: 5f5f694e2b724738 +Block 0030 [ 73]: 36f9c65d26534609 +Block 0030 [ 74]: 62cc88761fca9a68 +Block 0030 [ 75]: 0dd13380d7ac1f16 +Block 0030 [ 76]: 35fb9d078427ad24 +Block 0030 [ 77]: 1700fcdf1b796e53 +Block 0030 [ 78]: 158003d77db2d9d0 +Block 0030 [ 79]: 7cb7c0c420b5d9b1 +Block 0030 [ 80]: 782c4d56a15aebcd +Block 0030 [ 81]: ffe85632965712b0 +Block 0030 [ 82]: 129aee8c44b285ed +Block 0030 [ 83]: 21190577528afe47 +Block 0030 [ 84]: db9c19d775e6f11d +Block 0030 [ 85]: ac43b65cd70c76d2 +Block 0030 [ 86]: d325e5810a76c6b5 +Block 0030 [ 87]: 8f034f7e0eb746e5 +Block 0030 [ 88]: c8df3124c2cb3557 +Block 0030 [ 89]: 2f12b6192f15485a +Block 0030 [ 90]: ddb7107ff4a7f86b +Block 0030 [ 91]: 2887b68c44815c3e +Block 0030 [ 92]: 857831851a4949cc +Block 0030 [ 93]: a1f5e6dade25bc50 +Block 0030 [ 94]: 484f51bbb5b197e7 +Block 0030 [ 95]: b0d74bffbdee2ded +Block 0030 [ 96]: 6385f08f32511be4 +Block 0030 [ 97]: 4a67a1191db0dfa1 +Block 0030 [ 98]: 805ca6260698783f +Block 0030 [ 99]: 96c092604ed6b946 +Block 0030 [100]: 66893b81339d9ca9 +Block 0030 [101]: 51369a103bfb3948 +Block 0030 [102]: a8aa1fa92bf61251 +Block 0030 [103]: 6e09aaba9f66053c +Block 0030 [104]: c5ce3eb103dd370a +Block 0030 [105]: 4a2aaa9aaf6215ee +Block 0030 [106]: c67a60f23cc8a558 +Block 0030 [107]: a55e72a95dd53eea +Block 0030 [108]: dc97febd17830de0 +Block 0030 [109]: 635d64d5daf2bae4 +Block 0030 [110]: 6a2c19df26561bf8 +Block 0030 [111]: 1c87e6f1395ecce8 +Block 0030 [112]: 30654b9719440212 +Block 0030 [113]: 3eaf14e4981b3a4c +Block 0030 [114]: 39ec1251215373a9 +Block 0030 [115]: 5409e426ae48c456 +Block 0030 [116]: 438a2a14e43f1c87 +Block 0030 [117]: ffa3bfcd4f2e9316 +Block 0030 [118]: 0d0731d2e6465b95 +Block 0030 [119]: 6a8389557c831fd5 +Block 0030 [120]: 87f96e864fd48bc3 +Block 0030 [121]: 21cff67fa2b9db4a +Block 0030 [122]: 715fe10e95ff3746 +Block 0030 [123]: f2ade635af167312 +Block 0030 [124]: f7b3dd2ddbbbc129 +Block 0030 [125]: e3318db2d934c7f1 +Block 0030 [126]: e859c153c96218ce +Block 0030 [127]: 164fe9bc73bb26b4 +Block 0031 [ 0]: 1b75efd5304f056d +Block 0031 [ 1]: bf463e41d488275c +Block 0031 [ 2]: 941b47873adff5fe +Block 0031 [ 3]: 2e9b6397d72d3c3f +Block 0031 [ 4]: 5c5cbd4b38fbb99c +Block 0031 [ 5]: 35c8fb736f64ceeb +Block 0031 [ 6]: f09d8a73916dac38 +Block 0031 [ 7]: 93fba50823df06e6 +Block 0031 [ 8]: 0b7757128f783ae7 +Block 0031 [ 9]: bdee6f93051c40aa +Block 0031 [ 10]: c66cbdc6778c0eac +Block 0031 [ 11]: b033a39dac87bfd7 +Block 0031 [ 12]: 02b71a0ce04fadbe +Block 0031 [ 13]: 22e11dc3dc9e2bbd +Block 0031 [ 14]: b34ca0ba5283da3d +Block 0031 [ 15]: 6d6e3e83c2054d72 +Block 0031 [ 16]: cee1e38f20aabb40 +Block 0031 [ 17]: e60fd2fca2962346 +Block 0031 [ 18]: 6271c1ea64d3acab +Block 0031 [ 19]: e53b94baf089a82a +Block 0031 [ 20]: 986c8964a9c8856e +Block 0031 [ 21]: 634dab64bedb01cd +Block 0031 [ 22]: 3f102b85059c1b57 +Block 0031 [ 23]: 56bb3aa72f1cfe45 +Block 0031 [ 24]: 624cad38f78c2c7c +Block 0031 [ 25]: a41c872fb170de87 +Block 0031 [ 26]: fca6abd7af42e829 +Block 0031 [ 27]: 656d576d3c7dcf23 +Block 0031 [ 28]: 5a3ea0d15d914a77 +Block 0031 [ 29]: 68b39ed03d43822c +Block 0031 [ 30]: 326f2a39f2cf6e71 +Block 0031 [ 31]: 87032ea9406a27a3 +Block 0031 [ 32]: 290b8ca6f768dcd5 +Block 0031 [ 33]: 971ad7984f60d557 +Block 0031 [ 34]: f969c776d05a6ba2 +Block 0031 [ 35]: 568f1669228eae4f +Block 0031 [ 36]: 66c7df737d2d098c +Block 0031 [ 37]: 5991c4325083ca15 +Block 0031 [ 38]: 0a33cadfa5489d6b +Block 0031 [ 39]: 85161c0f20ada2e7 +Block 0031 [ 40]: 753e2541d4f26d3c +Block 0031 [ 41]: 529bd28c7b89855c +Block 0031 [ 42]: f37985cd14b0fc66 +Block 0031 [ 43]: 0d543ab4a2ab4a2c +Block 0031 [ 44]: d9821ac717c5da03 +Block 0031 [ 45]: 13aa09d388b150ca +Block 0031 [ 46]: 9d892c542b2da4f8 +Block 0031 [ 47]: 4596a049a50684c7 +Block 0031 [ 48]: 25fb0e9d2e35a2a6 +Block 0031 [ 49]: d53a3dde8446ae68 +Block 0031 [ 50]: 7a3670321ac561e6 +Block 0031 [ 51]: bb08107f2560b09f +Block 0031 [ 52]: 14c3857b159792dc +Block 0031 [ 53]: 6210affb7186cee3 +Block 0031 [ 54]: 7e1eb58956a1fb4a +Block 0031 [ 55]: e2b2d6ce4588401d +Block 0031 [ 56]: 5a6f61240e364ad2 +Block 0031 [ 57]: b6c884fdf1050aeb +Block 0031 [ 58]: f6286b150c1da490 +Block 0031 [ 59]: bb8e51a87b94f8a0 +Block 0031 [ 60]: 332ce9283f68d85e +Block 0031 [ 61]: c38fdd3f7434f32d +Block 0031 [ 62]: 228866b2c26e34c8 +Block 0031 [ 63]: f85ebc1618b79b6d +Block 0031 [ 64]: b518f14fc56caef6 +Block 0031 [ 65]: 752a292663431849 +Block 0031 [ 66]: 9d5fe9dac0697517 +Block 0031 [ 67]: b535a68f65c57dc0 +Block 0031 [ 68]: e348ea1cdac43f44 +Block 0031 [ 69]: 13f1334d6e9bf85e +Block 0031 [ 70]: 283b8fe3a17c3fea +Block 0031 [ 71]: 21bd877a7a74957a +Block 0031 [ 72]: ee156e24dd64640c +Block 0031 [ 73]: 22cfce14f0330ae5 +Block 0031 [ 74]: eb54556dd37c24d1 +Block 0031 [ 75]: 7d801f2118f7fa33 +Block 0031 [ 76]: 4c617d0148a382a9 +Block 0031 [ 77]: 58bf2b668a7c045d +Block 0031 [ 78]: 4cb48eb731183f86 +Block 0031 [ 79]: c3079adbfc30460d +Block 0031 [ 80]: 49215e84eb3b907f +Block 0031 [ 81]: f152c24a4624747e +Block 0031 [ 82]: 450842e74d33266d +Block 0031 [ 83]: 572ae15c16095fa3 +Block 0031 [ 84]: 5a5fc57805f2adc5 +Block 0031 [ 85]: 05c3fb94ed3ea6fa +Block 0031 [ 86]: 780589833f0abe13 +Block 0031 [ 87]: 87825a64c89e9a64 +Block 0031 [ 88]: ddaf109d7b13c739 +Block 0031 [ 89]: e8ebb94b4825d7bb +Block 0031 [ 90]: 62a82e219106de32 +Block 0031 [ 91]: f39e2861606df718 +Block 0031 [ 92]: e6210ab24e5b2584 +Block 0031 [ 93]: 770ea215d0556c76 +Block 0031 [ 94]: c974eef2fe9709e2 +Block 0031 [ 95]: fccb2cd4fe87501e +Block 0031 [ 96]: f12e254dc0df1911 +Block 0031 [ 97]: 26f01267d74549b5 +Block 0031 [ 98]: f9945591c29e5796 +Block 0031 [ 99]: f25bf3d06f6e0cdb +Block 0031 [100]: 29dd601fc1ebd250 +Block 0031 [101]: 9e1a251ecd42416a +Block 0031 [102]: c5f64ffca0f15a94 +Block 0031 [103]: 6b77e4cd72364bc2 +Block 0031 [104]: 87d514d8c7a2177a +Block 0031 [105]: b78b0f6991278189 +Block 0031 [106]: 3d2bcaa959d93492 +Block 0031 [107]: f45032027a4fcb81 +Block 0031 [108]: 9d96e07f3d41419c +Block 0031 [109]: 8e83ef21420b0263 +Block 0031 [110]: 0b834ffee596a9f1 +Block 0031 [111]: 987b7f1f2c86475d +Block 0031 [112]: 24840f2805ee7c0f +Block 0031 [113]: 23629efc11196286 +Block 0031 [114]: 56fd8771a0bc617a +Block 0031 [115]: 125e85de9586d448 +Block 0031 [116]: 4f194efe3a546712 +Block 0031 [117]: 0aabaee1afd9f936 +Block 0031 [118]: 47cb3f180ec29af9 +Block 0031 [119]: 8d3169c8810c7258 +Block 0031 [120]: cc9ab6861463e518 +Block 0031 [121]: cb72c54e6e7bd740 +Block 0031 [122]: a3161c47c51f546d +Block 0031 [123]: 38292d24214a65ab +Block 0031 [124]: a67ff90c16266a3c +Block 0031 [125]: 241fe584e4283bd8 +Block 0031 [126]: 16e73c7bc1067de9 +Block 0031 [127]: 78f5f3c568b26d50 + + After pass 2: +Block 0000 [ 0]: b2db2cba8393858f +Block 0000 [ 1]: b1645132ef755439 +Block 0000 [ 2]: c65526cc5b1ba836 +Block 0000 [ 3]: 0ceb6fde5a697c6d +Block 0000 [ 4]: cfba7c49d2c8a63e +Block 0000 [ 5]: ecca6830247751b0 +Block 0000 [ 6]: dfbcd384882e51bd +Block 0000 [ 7]: 0fae5c46e1916edd +Block 0000 [ 8]: b66226556fb54ed2 +Block 0000 [ 9]: 42677ba7315d3bdf +Block 0000 [ 10]: 51e965bd9678b787 +Block 0000 [ 11]: 41c58891359f7528 +Block 0000 [ 12]: 07c3c951dd9888f4 +Block 0000 [ 13]: b962bd19f8ad4887 +Block 0000 [ 14]: d9bcf1cb6d828ed1 +Block 0000 [ 15]: 1df7994029c16524 +Block 0000 [ 16]: 2c7c3b51da8ff0aa +Block 0000 [ 17]: 1419e9fa233b18a5 +Block 0000 [ 18]: 3a214d367965963a +Block 0000 [ 19]: 43b20d50ee8bdda7 +Block 0000 [ 20]: df32702230d38d42 +Block 0000 [ 21]: 7ee13d5892a9fde2 +Block 0000 [ 22]: fae7bfbcc7f2aae1 +Block 0000 [ 23]: 40045b3b20d1866a +Block 0000 [ 24]: 83d006d8e9595c48 +Block 0000 [ 25]: e1212375d386d373 +Block 0000 [ 26]: 0b72f1ff6dfae513 +Block 0000 [ 27]: 9bcd8a180ed0bbf9 +Block 0000 [ 28]: 3e1a3d7fa172da36 +Block 0000 [ 29]: 3bac80b4cedb219e +Block 0000 [ 30]: 3c3459c96616599e +Block 0000 [ 31]: b592b19385558ea1 +Block 0000 [ 32]: fbd2493ed10bb2a7 +Block 0000 [ 33]: 250e933ef6c9c020 +Block 0000 [ 34]: 0d7e0cefe3d0a15a +Block 0000 [ 35]: 6a7662c61a16f7fe +Block 0000 [ 36]: 245ee24b96eb96f1 +Block 0000 [ 37]: f06fce3e54a2d2bf +Block 0000 [ 38]: 89645646c43d254d +Block 0000 [ 39]: 1d6e702c0b24a3e2 +Block 0000 [ 40]: 4f29b5744156c572 +Block 0000 [ 41]: e510c23181c5b3ff +Block 0000 [ 42]: c19e9621e1c84234 +Block 0000 [ 43]: 97a28b13fd5bc3ce +Block 0000 [ 44]: d9e3c96741d996fa +Block 0000 [ 45]: 1b76d65989002d8c +Block 0000 [ 46]: 6dcb12f59eb46a20 +Block 0000 [ 47]: cdea2a6952939ac9 +Block 0000 [ 48]: 73cde7598b16f5e6 +Block 0000 [ 49]: 6e8d427a1fa79cc6 +Block 0000 [ 50]: 09231b609a9afff8 +Block 0000 [ 51]: daa1b5f0188f0433 +Block 0000 [ 52]: 893dfceae459725d +Block 0000 [ 53]: 592be1b00b7b28c8 +Block 0000 [ 54]: ac7c1b8ab820cf31 +Block 0000 [ 55]: 781a15a64a128347 +Block 0000 [ 56]: eb8d6ff2c23512dd +Block 0000 [ 57]: ec5bc9d05a4e273c +Block 0000 [ 58]: bd384a622836102a +Block 0000 [ 59]: 5076d7e3dcf92f7d +Block 0000 [ 60]: 439801ec770beae5 +Block 0000 [ 61]: 85ac3cddfe44da89 +Block 0000 [ 62]: 99b614b31261a345 +Block 0000 [ 63]: e2933b5f9611fc54 +Block 0000 [ 64]: 3037fa06b1ece01e +Block 0000 [ 65]: c9e51071135fa751 +Block 0000 [ 66]: 05bb076f2cc813f6 +Block 0000 [ 67]: 9f4717653db38ec9 +Block 0000 [ 68]: 41c71e48750cee5c +Block 0000 [ 69]: 9a0efdc6a8348896 +Block 0000 [ 70]: e8d34542f503625f +Block 0000 [ 71]: 6ac59a202acd31be +Block 0000 [ 72]: 0c6c398fd2b99bed +Block 0000 [ 73]: d7ed380318328435 +Block 0000 [ 74]: e1298d4fc69251c3 +Block 0000 [ 75]: 1b2f183356e54668 +Block 0000 [ 76]: 6eebc1ee8ed6cb90 +Block 0000 [ 77]: c261fa0c99a39c45 +Block 0000 [ 78]: 6df71efdef5b48c9 +Block 0000 [ 79]: 07162892169da587 +Block 0000 [ 80]: 5e736de2bdac47a6 +Block 0000 [ 81]: fde80f2d0a04bdfc +Block 0000 [ 82]: fd8486ce15f751d2 +Block 0000 [ 83]: e0f22c17510e70ac +Block 0000 [ 84]: 6a30ca58582063c8 +Block 0000 [ 85]: b325e44084988694 +Block 0000 [ 86]: 89f74d37d22ff300 +Block 0000 [ 87]: e9c409d05c38072b +Block 0000 [ 88]: 5fe0a89cb1e2e19b +Block 0000 [ 89]: c090cb619dbb525d +Block 0000 [ 90]: 0507d89abbab17f6 +Block 0000 [ 91]: 2fee6db9325d264f +Block 0000 [ 92]: e3fd1f8eedbda3e4 +Block 0000 [ 93]: 3424a4136765270d +Block 0000 [ 94]: c5b19c3af1971bbc +Block 0000 [ 95]: 6cb49826baeea0fd +Block 0000 [ 96]: b9b340de7a225a23 +Block 0000 [ 97]: 4b725cbedf9b7b08 +Block 0000 [ 98]: 7c75fc3b73e1b6d2 +Block 0000 [ 99]: fcd2e45c0fcd34aa +Block 0000 [100]: a5ad7705b674a22e +Block 0000 [101]: 6e2745f70d2e377d +Block 0000 [102]: 59006b446c4c82bb +Block 0000 [103]: 703f52dcee2e81d1 +Block 0000 [104]: 3f6b82b93effffb4 +Block 0000 [105]: 13ed467534c82418 +Block 0000 [106]: a55f4cb20247b2ee +Block 0000 [107]: 7131d4f50e8b890a +Block 0000 [108]: 73490c08292f39ff +Block 0000 [109]: 850a4da396b62427 +Block 0000 [110]: 1c1b4d28ed1be0a3 +Block 0000 [111]: bb9dc05ac200bc36 +Block 0000 [112]: eb87ae6d49a2fea9 +Block 0000 [113]: 8b01b4b60607e7b7 +Block 0000 [114]: 5601e9b4050e26a4 +Block 0000 [115]: 1a708020cf30e8c4 +Block 0000 [116]: 357787f560b3e117 +Block 0000 [117]: 270c70ba1394aeb3 +Block 0000 [118]: e974ce82f577c8af +Block 0000 [119]: e99a323c29101242 +Block 0000 [120]: df5246c0a22ef3aa +Block 0000 [121]: faa08f3454fa7b73 +Block 0000 [122]: 7703d220dfff70de +Block 0000 [123]: 3572d880754b85de +Block 0000 [124]: 74fd304cf2220306 +Block 0000 [125]: 0efda171378283b6 +Block 0000 [126]: 95d2fb71f0e67df6 +Block 0000 [127]: 5281bd4c8f8e3bfc +Block 0001 [ 0]: a601dc0876e7f5d2 +Block 0001 [ 1]: e8156a6fee9202a4 +Block 0001 [ 2]: e10d48d53f592f17 +Block 0001 [ 3]: 2112303d6ee471f4 +Block 0001 [ 4]: f625e1a0f9017d96 +Block 0001 [ 5]: 5b17ed2f17876d0f +Block 0001 [ 6]: 0c890126ce1adb94 +Block 0001 [ 7]: 78dff2e392d3a0c6 +Block 0001 [ 8]: f282dbd5f3ef11a5 +Block 0001 [ 9]: 524cb81ea5960dae +Block 0001 [ 10]: 4004d121dc3f834e +Block 0001 [ 11]: 774715d1bbafb642 +Block 0001 [ 12]: f99dd9b032874b77 +Block 0001 [ 13]: dffa663def2f79f6 +Block 0001 [ 14]: 16b48144484f1878 +Block 0001 [ 15]: b13072d77e12ced8 +Block 0001 [ 16]: 165681d7f28c89d7 +Block 0001 [ 17]: aec8db840bc885be +Block 0001 [ 18]: 02c41c5cc33323f6 +Block 0001 [ 19]: ac51867a32fae7d3 +Block 0001 [ 20]: a6662cf115cab5e4 +Block 0001 [ 21]: a7dfac6e1453e9ca +Block 0001 [ 22]: ecccdc35fe6a81da +Block 0001 [ 23]: 27a9a3e8bfc62791 +Block 0001 [ 24]: 2b33ed723d62b490 +Block 0001 [ 25]: 19568a46fb5516d7 +Block 0001 [ 26]: f204bae6ccfaa8b5 +Block 0001 [ 27]: 996cba2cf431026e +Block 0001 [ 28]: 61f7dd05475d6ee6 +Block 0001 [ 29]: 2962068995d86580 +Block 0001 [ 30]: 418e5d7ec95f73a4 +Block 0001 [ 31]: dbdc12a8702d4c8d +Block 0001 [ 32]: 749b9bc8a38f50d6 +Block 0001 [ 33]: 7a0f8357fd40f318 +Block 0001 [ 34]: 7cb99e83a49df9ea +Block 0001 [ 35]: f448e5b423259aa5 +Block 0001 [ 36]: fbb55be1b0dc18f1 +Block 0001 [ 37]: f9d3e9671ac793a5 +Block 0001 [ 38]: d7ed26cad3bd50dd +Block 0001 [ 39]: 7bdc2b25b7b4380e +Block 0001 [ 40]: 564193ed46bbd38f +Block 0001 [ 41]: bf93c93f54ad58fb +Block 0001 [ 42]: 968566bd98935a80 +Block 0001 [ 43]: 32aea1755a271495 +Block 0001 [ 44]: 1070a94cbe2953f5 +Block 0001 [ 45]: 400ea4d9f1a3fa35 +Block 0001 [ 46]: 7c935e65d9c735a1 +Block 0001 [ 47]: a8175cb4c5a150cc +Block 0001 [ 48]: 443e38c447553835 +Block 0001 [ 49]: ce0dff4aacadc471 +Block 0001 [ 50]: 53be5d9176c17ca0 +Block 0001 [ 51]: 3256ac925d114b7e +Block 0001 [ 52]: c48e34ab7016cf82 +Block 0001 [ 53]: 6785fc5ebe921c3f +Block 0001 [ 54]: dc79dc6a77fe9386 +Block 0001 [ 55]: 9d6d1d9be125d35c +Block 0001 [ 56]: 712b2f8118afd099 +Block 0001 [ 57]: d809acd71157d73a +Block 0001 [ 58]: ff16fadc5fb7dd6d +Block 0001 [ 59]: d67b1cb17bd3725b +Block 0001 [ 60]: 3daccb55beb052d8 +Block 0001 [ 61]: 35c964dec1386806 +Block 0001 [ 62]: bc105f476a5e1249 +Block 0001 [ 63]: 46ecb66699fa57e2 +Block 0001 [ 64]: f88e5a59aefe6cf2 +Block 0001 [ 65]: 5eadb66d6c148e37 +Block 0001 [ 66]: 7cf87f7735867538 +Block 0001 [ 67]: f6be4a2544f47f38 +Block 0001 [ 68]: 55266e0cead300c7 +Block 0001 [ 69]: 7e11af1a2670a739 +Block 0001 [ 70]: 9a2af3f6913c8ee4 +Block 0001 [ 71]: 394a6f1984e6d539 +Block 0001 [ 72]: ff7ed615ae767138 +Block 0001 [ 73]: d3ceb96f26db3d27 +Block 0001 [ 74]: 30d3b4ba1b1a0af8 +Block 0001 [ 75]: 0e45f476265b4d99 +Block 0001 [ 76]: cdbad3cd5ff77a1e +Block 0001 [ 77]: ef3187975a8f442b +Block 0001 [ 78]: c1308929690f0031 +Block 0001 [ 79]: 6d85c6d286a25367 +Block 0001 [ 80]: dac2896b549657a4 +Block 0001 [ 81]: 23e32881a1b09a6d +Block 0001 [ 82]: ec20c667fcbdeb4e +Block 0001 [ 83]: 87bbeb980e67d712 +Block 0001 [ 84]: 20cfdefef627dd01 +Block 0001 [ 85]: 621ae179a533c9a2 +Block 0001 [ 86]: a84be778d4427ffd +Block 0001 [ 87]: d0855b3fe58411a3 +Block 0001 [ 88]: 9754baed0bbe3f81 +Block 0001 [ 89]: 1f4bc2bd47559c8c +Block 0001 [ 90]: e9ee56d7d1e3fa45 +Block 0001 [ 91]: 19f21b10f69a7a56 +Block 0001 [ 92]: b40c652a7f4731d8 +Block 0001 [ 93]: 81e38a68107cbc0f +Block 0001 [ 94]: 49560f11e34b7439 +Block 0001 [ 95]: bbfdc16f8fbd75bf +Block 0001 [ 96]: e31edc9e8fceabcf +Block 0001 [ 97]: 32b1765671372267 +Block 0001 [ 98]: 8ad8dae552057de1 +Block 0001 [ 99]: 346aae886e91cc51 +Block 0001 [100]: b5531256bf78f06b +Block 0001 [101]: d79ecff14855b40f +Block 0001 [102]: 242357b9aed4b7d1 +Block 0001 [103]: 84845b5d45408e08 +Block 0001 [104]: d7dbef959f78cea2 +Block 0001 [105]: 21618b4913dfaa30 +Block 0001 [106]: 45761e263069a8a9 +Block 0001 [107]: 10994f746838cb8a +Block 0001 [108]: 9103b613cdcab634 +Block 0001 [109]: 7836e88870955857 +Block 0001 [110]: 8f0c4de9d1a2f683 +Block 0001 [111]: 30b4a1e9ab436f45 +Block 0001 [112]: f33c6c4d38df040b +Block 0001 [113]: 2f85731764ed984a +Block 0001 [114]: 30fbf7039eef9644 +Block 0001 [115]: ad98773602b57959 +Block 0001 [116]: 497ae71d5f2a1d4a +Block 0001 [117]: b21fa18653c5cdbc +Block 0001 [118]: ef19121d61008f70 +Block 0001 [119]: 66b6825d50197690 +Block 0001 [120]: 843664a09f8c1636 +Block 0001 [121]: 16a7ce3bd9d2eb0b +Block 0001 [122]: b22c00136e008148 +Block 0001 [123]: 7ea52a8d4177b05e +Block 0001 [124]: 18989952ed74fa99 +Block 0001 [125]: bce998118659ba50 +Block 0001 [126]: 3928fafd8927bcca +Block 0001 [127]: 68902f7910072951 +Block 0002 [ 0]: e81e0bbaf6f28522 +Block 0002 [ 1]: 396861783abb23b8 +Block 0002 [ 2]: 3d5d4742fb81fbd5 +Block 0002 [ 3]: 4fa13942992ac0da +Block 0002 [ 4]: b561199a7d8503a0 +Block 0002 [ 5]: c21da733b005a908 +Block 0002 [ 6]: c26444122b6b9274 +Block 0002 [ 7]: 36a63f4646df05b8 +Block 0002 [ 8]: 6b2a0c7fb0b6adc5 +Block 0002 [ 9]: c156d6f3856e3678 +Block 0002 [ 10]: 4c504d2c87841d81 +Block 0002 [ 11]: 4905e03cf1e6f0ee +Block 0002 [ 12]: 87a0c471ff7526ce +Block 0002 [ 13]: 26367649350d355e +Block 0002 [ 14]: 00e857202c91a68a +Block 0002 [ 15]: f9d076b2e46ebdaa +Block 0002 [ 16]: 9611b8a77b3aa7f3 +Block 0002 [ 17]: b14be5ae4ac7412e +Block 0002 [ 18]: 1eeebb9c268d7ef3 +Block 0002 [ 19]: d86c569647cbd1ad +Block 0002 [ 20]: a8fa312f44927434 +Block 0002 [ 21]: 82dcc374e99677b9 +Block 0002 [ 22]: 93ab2bccf995139d +Block 0002 [ 23]: 9b3ca0906a1d8569 +Block 0002 [ 24]: 705ba90bec5e96a5 +Block 0002 [ 25]: 737cd17db84d185b +Block 0002 [ 26]: 309057ac43fd66d9 +Block 0002 [ 27]: 220a24df79ee088d +Block 0002 [ 28]: 9d33ecdbf98b6765 +Block 0002 [ 29]: 52cb5ef7639b9dfe +Block 0002 [ 30]: 9007776749321e4a +Block 0002 [ 31]: db73be5f61995fe6 +Block 0002 [ 32]: 2dc127b7bee524b6 +Block 0002 [ 33]: b5abec945d264219 +Block 0002 [ 34]: 0031ea20aa52c2a2 +Block 0002 [ 35]: 3eed4344c253c7e0 +Block 0002 [ 36]: 6437a60bd66f53c4 +Block 0002 [ 37]: 6615df9a4e849340 +Block 0002 [ 38]: 8f86a3766032871a +Block 0002 [ 39]: ca4d635a6e057619 +Block 0002 [ 40]: 4390465343d27c46 +Block 0002 [ 41]: 3f2043373696faf4 +Block 0002 [ 42]: de93732af23f352a +Block 0002 [ 43]: da6778068e73ddd4 +Block 0002 [ 44]: 7453b8124450b27e +Block 0002 [ 45]: 5f51a2d57181f2b9 +Block 0002 [ 46]: de9c940fa9ab4c04 +Block 0002 [ 47]: 9d6d029e75c9a64f +Block 0002 [ 48]: 9073d8c7c776ac96 +Block 0002 [ 49]: 465b289ca08e6714 +Block 0002 [ 50]: aa890c575a2d7ec8 +Block 0002 [ 51]: 1cdb78c4199a40c5 +Block 0002 [ 52]: bce111d86807b484 +Block 0002 [ 53]: 3ab2d84a54074b6c +Block 0002 [ 54]: b8cc3aa6e3d80a02 +Block 0002 [ 55]: f1acd8318d693ac8 +Block 0002 [ 56]: 5eecf38eadaf104f +Block 0002 [ 57]: 4e79ef3026ab811b +Block 0002 [ 58]: 235310779616b594 +Block 0002 [ 59]: 73438a3256d1eaea +Block 0002 [ 60]: f4495e9185ed3c12 +Block 0002 [ 61]: c7a28910ae700391 +Block 0002 [ 62]: 742a596e1015c48f +Block 0002 [ 63]: 41178157bc7ce775 +Block 0002 [ 64]: edc6a55966707331 +Block 0002 [ 65]: 39497b1bd3a41980 +Block 0002 [ 66]: f4a3315a41c01d71 +Block 0002 [ 67]: 297dc5267a33faab +Block 0002 [ 68]: 170949ed98cc4fce +Block 0002 [ 69]: d2dc12ec69896786 +Block 0002 [ 70]: 434d5a5851822fe8 +Block 0002 [ 71]: 00118dec328147d3 +Block 0002 [ 72]: 03c8fc8c4d44db96 +Block 0002 [ 73]: ae231e8f920cac47 +Block 0002 [ 74]: d6b307e598cc639a +Block 0002 [ 75]: 2469cf2fe0950b18 +Block 0002 [ 76]: 0d9c209438395613 +Block 0002 [ 77]: e335d06493895f16 +Block 0002 [ 78]: b1b305629be232bd +Block 0002 [ 79]: 22b2c7be104a04f2 +Block 0002 [ 80]: 42956faf6651efdc +Block 0002 [ 81]: 98ffb95158f24920 +Block 0002 [ 82]: 4850d302878117b6 +Block 0002 [ 83]: a5d4ed41b0c9d2d8 +Block 0002 [ 84]: 4e3c6348c9371002 +Block 0002 [ 85]: 88608e6e14bffbc2 +Block 0002 [ 86]: 6cd8c4cf2259886c +Block 0002 [ 87]: 45139c5b12f9478d +Block 0002 [ 88]: 1f48e72c84f9dda5 +Block 0002 [ 89]: 6c546f01160e44a7 +Block 0002 [ 90]: 8b4efbca6310e636 +Block 0002 [ 91]: 40a500807dc6cd0e +Block 0002 [ 92]: dc02b2343fddfa24 +Block 0002 [ 93]: 4c4089218010c44b +Block 0002 [ 94]: 27eb0fc83d7da899 +Block 0002 [ 95]: c47a3ba94694ceb4 +Block 0002 [ 96]: 335f4d446479fd60 +Block 0002 [ 97]: 7e9c301621d8ab89 +Block 0002 [ 98]: 5fda24db61006fba +Block 0002 [ 99]: ff01a0a153fe3d37 +Block 0002 [100]: ab885dbb1dad5aa1 +Block 0002 [101]: 6da318547e8e48b3 +Block 0002 [102]: c67697e19524a439 +Block 0002 [103]: ea239bcd02527492 +Block 0002 [104]: edd3ee8a9021717f +Block 0002 [105]: ab51683a66552c40 +Block 0002 [106]: 2c887237f11c913d +Block 0002 [107]: 3f61e4b082c3b242 +Block 0002 [108]: c50d3d277054c9a7 +Block 0002 [109]: 2778d9b6e554a6e6 +Block 0002 [110]: 09641d71ffe05a4d +Block 0002 [111]: 58b8442be16e21a6 +Block 0002 [112]: d44d5b2dc2f9c20a +Block 0002 [113]: 677f96f5bbf6f9e5 +Block 0002 [114]: 06f53f76f2eb2e5a +Block 0002 [115]: b9e4fb1a579ac9b6 +Block 0002 [116]: 8252a5262e683358 +Block 0002 [117]: 11101fdb6e7d6be8 +Block 0002 [118]: 68a3174bf60b8d0f +Block 0002 [119]: cc1f471969d8661f +Block 0002 [120]: 6e2eb3874dfb9351 +Block 0002 [121]: 3dfe41bca6aeb9b6 +Block 0002 [122]: 2ca94479c1d9d9c3 +Block 0002 [123]: cd4cd1e58f0c1a4d +Block 0002 [124]: 220bc444db0c796e +Block 0002 [125]: 0165437e149e3cb5 +Block 0002 [126]: 2c8f5ef3fb489b1c +Block 0002 [127]: c74852363b7f3587 +Block 0003 [ 0]: 367c594bdf96b819 +Block 0003 [ 1]: 862711026ec3ec03 +Block 0003 [ 2]: 4291182dfe50a8a4 +Block 0003 [ 3]: 1968e610fb9b86ff +Block 0003 [ 4]: 1f73c18425908927 +Block 0003 [ 5]: 661b7f342e040cd4 +Block 0003 [ 6]: 8b88a35abe465f87 +Block 0003 [ 7]: 2b53235fa03d495e +Block 0003 [ 8]: 737a290089b25de2 +Block 0003 [ 9]: bf9058e3c9eec8d0 +Block 0003 [ 10]: 99b0126fab231886 +Block 0003 [ 11]: 16bdcc5a061cc916 +Block 0003 [ 12]: 667e764247e2e7be +Block 0003 [ 13]: 65a6b50454441f43 +Block 0003 [ 14]: be337b287eac42d9 +Block 0003 [ 15]: d5bed46e6c3349b1 +Block 0003 [ 16]: c2ea41bc5b6d4bd7 +Block 0003 [ 17]: 4ca8e1e8433670e4 +Block 0003 [ 18]: 759ab2d889551680 +Block 0003 [ 19]: e378158572542bfa +Block 0003 [ 20]: 6b1da15ac3fa96c0 +Block 0003 [ 21]: 8d36589f4cf25ddc +Block 0003 [ 22]: 503549d93ab6c1b7 +Block 0003 [ 23]: b8e8322845e29937 +Block 0003 [ 24]: 180c25fd2dbb1b48 +Block 0003 [ 25]: 6202f1842ab61832 +Block 0003 [ 26]: 5d4c894f0c4737c9 +Block 0003 [ 27]: 88f5a64b933a33df +Block 0003 [ 28]: 84eb153038e7aecc +Block 0003 [ 29]: 0d2621f75b1ae3e9 +Block 0003 [ 30]: b9123ff33039d4fe +Block 0003 [ 31]: 9ed38c24a4e1f8fb +Block 0003 [ 32]: 0c31e521335c8456 +Block 0003 [ 33]: db817288bd62628e +Block 0003 [ 34]: 7ff3b354dbaf962f +Block 0003 [ 35]: e183c8060ab80c30 +Block 0003 [ 36]: 9da848355b0a6225 +Block 0003 [ 37]: 0ceea1cf2734396c +Block 0003 [ 38]: 4432eeb03658f476 +Block 0003 [ 39]: b5b618f8b86b216b +Block 0003 [ 40]: 0d2d80ffd5e95700 +Block 0003 [ 41]: 159c8064f2989f4a +Block 0003 [ 42]: 760c9bcc3f6593ff +Block 0003 [ 43]: 8762acb41bfb6c63 +Block 0003 [ 44]: 4f7ea2fafcaa0e88 +Block 0003 [ 45]: c74933b7dbed9627 +Block 0003 [ 46]: cce5fe1d79ea5c75 +Block 0003 [ 47]: 4b231f4b26c89beb +Block 0003 [ 48]: caaea7d2fd4fd308 +Block 0003 [ 49]: 86b9c4f42595461d +Block 0003 [ 50]: 7ebf7c975364fa90 +Block 0003 [ 51]: 677efa86562f6c9c +Block 0003 [ 52]: 0e82d10cf9f1219a +Block 0003 [ 53]: d670593b1e019fd2 +Block 0003 [ 54]: 972cfb60ed8dba68 +Block 0003 [ 55]: f911987a43fc0a10 +Block 0003 [ 56]: 234a4ede8f00bc1f +Block 0003 [ 57]: 7967eb7e80ae4e59 +Block 0003 [ 58]: fb1a0481cc491916 +Block 0003 [ 59]: 0b058ac506301f85 +Block 0003 [ 60]: a74df515d9e08d97 +Block 0003 [ 61]: 383be2d3251aae14 +Block 0003 [ 62]: b3fd02e917a223ce +Block 0003 [ 63]: 29f39b011fad54c0 +Block 0003 [ 64]: f680bd509bcfdccd +Block 0003 [ 65]: 04d6aefd19cf741c +Block 0003 [ 66]: 0f1252791a746f17 +Block 0003 [ 67]: ab65eb095a9eeafd +Block 0003 [ 68]: c2928de1fe693493 +Block 0003 [ 69]: 048c2309b1815c9b +Block 0003 [ 70]: 8c54712e30b1bd31 +Block 0003 [ 71]: c63b79997378fcaa +Block 0003 [ 72]: 06a86dd8ad9696b5 +Block 0003 [ 73]: c38fc208cb319dc2 +Block 0003 [ 74]: 11cd45107d1f2e50 +Block 0003 [ 75]: e1d87aa8c5e1632e +Block 0003 [ 76]: 5ecdb4d890540442 +Block 0003 [ 77]: 686823fdee54d4ad +Block 0003 [ 78]: 6baade1b2d66b8bf +Block 0003 [ 79]: d55142011ebdea9c +Block 0003 [ 80]: 3c550a40516b719b +Block 0003 [ 81]: 09f369f036292023 +Block 0003 [ 82]: 7211fc8b5f134080 +Block 0003 [ 83]: 956d062cc49f7e15 +Block 0003 [ 84]: 7d04474795e014b4 +Block 0003 [ 85]: 0e8e5948404b3ac4 +Block 0003 [ 86]: 218ff6e138727371 +Block 0003 [ 87]: a1df22c6fbdf78f9 +Block 0003 [ 88]: 290465977b3b3ab9 +Block 0003 [ 89]: 862b0d5bfbf64d5a +Block 0003 [ 90]: c9b4eb5dceb436f5 +Block 0003 [ 91]: 480aa45ac4592905 +Block 0003 [ 92]: 1b42e2a9df42461f +Block 0003 [ 93]: 976e78dabb9a1f6d +Block 0003 [ 94]: 861d4a9050ee9931 +Block 0003 [ 95]: 5b4ae97afa1f29f0 +Block 0003 [ 96]: 61678bcd4367c07f +Block 0003 [ 97]: acefa26ea748ab48 +Block 0003 [ 98]: 0dbf00fa98bb3e54 +Block 0003 [ 99]: 7c8e72baf51824ce +Block 0003 [100]: b8f04cd864a6ff07 +Block 0003 [101]: 371431c4a64aa613 +Block 0003 [102]: 6ff7f3a454608db7 +Block 0003 [103]: cd7fdda08d309d9a +Block 0003 [104]: fc26af4ae96673b0 +Block 0003 [105]: 1e6021dc4f2fdd58 +Block 0003 [106]: 3e11ed915f93ea58 +Block 0003 [107]: 0b1d721f76ca5c50 +Block 0003 [108]: 74d56f4a98df89fd +Block 0003 [109]: 4ab79e7dece12d01 +Block 0003 [110]: 953ff63d4231cb98 +Block 0003 [111]: 29c749ebc02147e1 +Block 0003 [112]: ed59f5603d2dd69b +Block 0003 [113]: 42e81940699fdaf5 +Block 0003 [114]: 4fafbaf8edd4fab0 +Block 0003 [115]: 9591251ce09a535e +Block 0003 [116]: 2a17d91f13eefd80 +Block 0003 [117]: df438c508fc636ad +Block 0003 [118]: 94b1054862d5203a +Block 0003 [119]: 6e4f1e45898dba82 +Block 0003 [120]: 2b00c9cda99f2824 +Block 0003 [121]: f68ddd0fd8c7efe0 +Block 0003 [122]: 4faf35b95430fc43 +Block 0003 [123]: 09adc28b97ecf942 +Block 0003 [124]: 8bef2eb8712226f2 +Block 0003 [125]: 1be57ca4510531d2 +Block 0003 [126]: db6b46a50db33ef9 +Block 0003 [127]: d9871aeb9860bdc4 +Block 0004 [ 0]: 5f103c79d2da016e +Block 0004 [ 1]: eee0f4e13e3d408a +Block 0004 [ 2]: 5dac3a3b0c267dc0 +Block 0004 [ 3]: e7e4dd5e37f8be65 +Block 0004 [ 4]: cec7474083af3f60 +Block 0004 [ 5]: 95fb7feaf43b8be6 +Block 0004 [ 6]: 85d6a9e5c3a3f907 +Block 0004 [ 7]: e829e06d777ca98e +Block 0004 [ 8]: dcfd1b0ec732826c +Block 0004 [ 9]: 2cdefd109e8d3664 +Block 0004 [ 10]: 23ba90d2242bd021 +Block 0004 [ 11]: f86bd3217354cc3c +Block 0004 [ 12]: f79ce3b15e828607 +Block 0004 [ 13]: 83aae383ff27522f +Block 0004 [ 14]: 1d71b7ce3d807890 +Block 0004 [ 15]: 5d95cfd58d4d1f8c +Block 0004 [ 16]: 278cf931bd1e902a +Block 0004 [ 17]: 68fa20d22ba2aa27 +Block 0004 [ 18]: 9327a826bc94458f +Block 0004 [ 19]: 2501172b7436fe18 +Block 0004 [ 20]: 6f1c6c6d7179888e +Block 0004 [ 21]: f4446befe7c6ef7b +Block 0004 [ 22]: 84d0a72f5234af5a +Block 0004 [ 23]: 7394bf556f42d372 +Block 0004 [ 24]: acb72c38ced2fce7 +Block 0004 [ 25]: dea10a43040e26b2 +Block 0004 [ 26]: e77f7881689a7e3f +Block 0004 [ 27]: 83113c6790591257 +Block 0004 [ 28]: fe9c162fd48cb7d8 +Block 0004 [ 29]: 98ce1459c8390957 +Block 0004 [ 30]: bd0966102efc0163 +Block 0004 [ 31]: 1dc21f406c8f4ca5 +Block 0004 [ 32]: d8454639a35d8f9e +Block 0004 [ 33]: bf881beb1f767534 +Block 0004 [ 34]: 26288b46058cc1da +Block 0004 [ 35]: 413dd03618a00931 +Block 0004 [ 36]: f075d2081403a45b +Block 0004 [ 37]: 3cc6fea5be9893e4 +Block 0004 [ 38]: 22729e702fee4ce4 +Block 0004 [ 39]: 433011e48bc915db +Block 0004 [ 40]: 7e7d28c42751a323 +Block 0004 [ 41]: c67c60627460056b +Block 0004 [ 42]: 67a62b635341b39f +Block 0004 [ 43]: 0035c747ab878c83 +Block 0004 [ 44]: 4f0159abc209fa70 +Block 0004 [ 45]: 7696bf70050e4504 +Block 0004 [ 46]: 26fc497cdec0484d +Block 0004 [ 47]: 7be5f428ff505ed0 +Block 0004 [ 48]: 8bbe65a740edbbd9 +Block 0004 [ 49]: fd0216c36ed4ec06 +Block 0004 [ 50]: 353980216bb85309 +Block 0004 [ 51]: 5209b3883318741a +Block 0004 [ 52]: e299cd297f7b2f28 +Block 0004 [ 53]: c75e1bc0a94122b5 +Block 0004 [ 54]: 30bd876ace118de3 +Block 0004 [ 55]: c30156b792358312 +Block 0004 [ 56]: b06c27e9ae5a2e89 +Block 0004 [ 57]: 0ed2f057d2a6d8d9 +Block 0004 [ 58]: cbfbec25de3432fb +Block 0004 [ 59]: 32468164b6e0674d +Block 0004 [ 60]: b98ad9729363b082 +Block 0004 [ 61]: e2947ae8ab741abd +Block 0004 [ 62]: 8f3197f4de5f96a3 +Block 0004 [ 63]: 1dbc661b48b411f7 +Block 0004 [ 64]: 3509f4a7e745c326 +Block 0004 [ 65]: cfb820680c8d9be2 +Block 0004 [ 66]: 684ca83f500fda1b +Block 0004 [ 67]: 0de75f8640a01f43 +Block 0004 [ 68]: 325fbc7a5cba9916 +Block 0004 [ 69]: 1d18d81e36e58e94 +Block 0004 [ 70]: e71446e04328bed6 +Block 0004 [ 71]: ebd7f55759aa2912 +Block 0004 [ 72]: f5742bb63f673fef +Block 0004 [ 73]: 59a68c6bbdded65d +Block 0004 [ 74]: 85b002cb9cd71d15 +Block 0004 [ 75]: 0ac41456c7bddad7 +Block 0004 [ 76]: 6ac6ce40c3366d27 +Block 0004 [ 77]: 1a20a174adc1fbfb +Block 0004 [ 78]: 58f79bbc86149583 +Block 0004 [ 79]: 694506e12f0d36f8 +Block 0004 [ 80]: f8f2c809554e5b1a +Block 0004 [ 81]: 53a7dc845be334fe +Block 0004 [ 82]: 4a9131d02ccf2006 +Block 0004 [ 83]: 53a54f39969a27ee +Block 0004 [ 84]: 01cfbabc16bc8017 +Block 0004 [ 85]: 5a8e945f16d66035 +Block 0004 [ 86]: 8bbbe36c9b09a75d +Block 0004 [ 87]: b40e4c1cb50dc463 +Block 0004 [ 88]: a413bb190d1ce779 +Block 0004 [ 89]: dbdd0e71c83dfc68 +Block 0004 [ 90]: 32ba1eb6c9f3f028 +Block 0004 [ 91]: bcc99f21a9599f46 +Block 0004 [ 92]: 574636b0906e2dd3 +Block 0004 [ 93]: df111f20ab6f8e1a +Block 0004 [ 94]: c2d8a911b5f5d9a5 +Block 0004 [ 95]: 72bec94da09ffe7f +Block 0004 [ 96]: 1f14cea9804067db +Block 0004 [ 97]: 9d6c3f1bc1083432 +Block 0004 [ 98]: 73a2aadbe11f1f22 +Block 0004 [ 99]: 296f99c2f5d56e0b +Block 0004 [100]: fe74b6ff494c6fb0 +Block 0004 [101]: 6d2ebdd6ed290d80 +Block 0004 [102]: a3912c85e1036671 +Block 0004 [103]: 896a9c1bba98abdd +Block 0004 [104]: f174ddf24e51901f +Block 0004 [105]: 814150ce82c9a2d5 +Block 0004 [106]: 2d37595c363875f7 +Block 0004 [107]: 619771e8822004e7 +Block 0004 [108]: 935b811317780722 +Block 0004 [109]: c80e5b3e2f6ef79f +Block 0004 [110]: 62d855626bee4e94 +Block 0004 [111]: 8b43e0e640d7047b +Block 0004 [112]: 7c5fce5d045b0f97 +Block 0004 [113]: 2f9fd0f39d32d1d8 +Block 0004 [114]: cbb11bb386457bd2 +Block 0004 [115]: 0585288d1d9c986e +Block 0004 [116]: 613cbb2ffa954b64 +Block 0004 [117]: 6f5afd9be23f168e +Block 0004 [118]: dde300cbf5d3dc44 +Block 0004 [119]: 553b142212a32a0b +Block 0004 [120]: 042c170ebc9db65d +Block 0004 [121]: e551aed0fb8d12bd +Block 0004 [122]: 548a9bb03e34feda +Block 0004 [123]: d0a2064746a8003d +Block 0004 [124]: 8833977b70ec7fa4 +Block 0004 [125]: 192397378ba94c61 +Block 0004 [126]: 6ff2940ba5b14026 +Block 0004 [127]: 1ab6430ee436c0dd +Block 0005 [ 0]: 0de966218271a4ef +Block 0005 [ 1]: a2cfeb2c0d84198d +Block 0005 [ 2]: cfa60d565dfffca1 +Block 0005 [ 3]: 412f4c2588c3cc19 +Block 0005 [ 4]: 2728830ca24bb956 +Block 0005 [ 5]: b49f93ae79d1312f +Block 0005 [ 6]: 7306da5787f5ec0e +Block 0005 [ 7]: 1b8a34fdc9622b8c +Block 0005 [ 8]: e36370b335d7d928 +Block 0005 [ 9]: 49b86dbdccf03005 +Block 0005 [ 10]: 3b28005aa830ac5d +Block 0005 [ 11]: ca9b1344d3837c42 +Block 0005 [ 12]: 45c0c9b592e9b02f +Block 0005 [ 13]: cf0d005546e76fcd +Block 0005 [ 14]: e2def891d0fc245b +Block 0005 [ 15]: e90e1fc95f6596b3 +Block 0005 [ 16]: 0d62ca02afae51d9 +Block 0005 [ 17]: 93fc60ae47aa667c +Block 0005 [ 18]: 3718672a4e69c6d4 +Block 0005 [ 19]: da994e550ec5fdd3 +Block 0005 [ 20]: 80a8774d11086f21 +Block 0005 [ 21]: 57409662528e89c6 +Block 0005 [ 22]: 78558bcff1421a62 +Block 0005 [ 23]: 4ab11538852e391b +Block 0005 [ 24]: 13b25048138916a9 +Block 0005 [ 25]: 6148f40c5a20e12b +Block 0005 [ 26]: 4810c828883bf1df +Block 0005 [ 27]: f5fcb4e0a1a969c3 +Block 0005 [ 28]: a40583814da5f417 +Block 0005 [ 29]: 1cf1c7155698d64b +Block 0005 [ 30]: aa3ad1d538a2d02c +Block 0005 [ 31]: 4de3e769c1a3ad08 +Block 0005 [ 32]: 682669d5d0c75064 +Block 0005 [ 33]: f736e483fc776e37 +Block 0005 [ 34]: baa34ad440f7e5da +Block 0005 [ 35]: 2d3124c6a820d898 +Block 0005 [ 36]: c10dbfe5c258327a +Block 0005 [ 37]: 304c1f87ae94460e +Block 0005 [ 38]: 47a434b76b85d0be +Block 0005 [ 39]: 38e23fe30cc250a9 +Block 0005 [ 40]: d4fea920dc38e276 +Block 0005 [ 41]: 0b7ffb666eefc033 +Block 0005 [ 42]: 70338ebcb4e61d73 +Block 0005 [ 43]: 84bded0682d10c94 +Block 0005 [ 44]: dc5a559cdead2372 +Block 0005 [ 45]: 21c73103fb718573 +Block 0005 [ 46]: f9bbdac6c16e68d0 +Block 0005 [ 47]: b2bd3a0fe844c85f +Block 0005 [ 48]: 2ab10c961a078f5b +Block 0005 [ 49]: 39325e7ee2529990 +Block 0005 [ 50]: 9e6c5c8a54327c97 +Block 0005 [ 51]: 52ad7165f82b5620 +Block 0005 [ 52]: b5cc621f5c656ff2 +Block 0005 [ 53]: 380688bbca3ecd58 +Block 0005 [ 54]: 883889c2ea9d3295 +Block 0005 [ 55]: e079e44a0a62c366 +Block 0005 [ 56]: b8284494c8213bf1 +Block 0005 [ 57]: cdbe7f6c9ba93301 +Block 0005 [ 58]: 2d823bfcc8436620 +Block 0005 [ 59]: 1e158609ca45522a +Block 0005 [ 60]: 407a6f26a9fb16a7 +Block 0005 [ 61]: 218cf687d2746ee7 +Block 0005 [ 62]: 722be79206a7e5ad +Block 0005 [ 63]: 6bdc5a7cda224de3 +Block 0005 [ 64]: d8f66abdb2a506f5 +Block 0005 [ 65]: 2d54821b6d9a1cff +Block 0005 [ 66]: df77e54336ec9c2b +Block 0005 [ 67]: c499fdccf24a0513 +Block 0005 [ 68]: 87c5a41b01c159fe +Block 0005 [ 69]: db244459e270a8ef +Block 0005 [ 70]: 4aee9e7b4763c17a +Block 0005 [ 71]: 8f205d84ac9a1280 +Block 0005 [ 72]: 49197ac6271bbb2e +Block 0005 [ 73]: cdaf49b7a1767e0b +Block 0005 [ 74]: f7cf565d6c117301 +Block 0005 [ 75]: 88346bc563cf09c3 +Block 0005 [ 76]: 6ff639fb39b9d0c3 +Block 0005 [ 77]: e48aba9275f3daa9 +Block 0005 [ 78]: 7541718c0f5c899e +Block 0005 [ 79]: a422f5b2f1400761 +Block 0005 [ 80]: 8d6a5c361a594604 +Block 0005 [ 81]: e50ed69a6300ff68 +Block 0005 [ 82]: d16049e9eb4e38e8 +Block 0005 [ 83]: aa15939e849c1ebd +Block 0005 [ 84]: 059eb7b453f27287 +Block 0005 [ 85]: 45fb8533f5c7c986 +Block 0005 [ 86]: 4c76c301de9ab48c +Block 0005 [ 87]: 90b1a56887fd2c48 +Block 0005 [ 88]: 9fd7813a1508ff41 +Block 0005 [ 89]: 2a326b09fb8c9b9a +Block 0005 [ 90]: efb4350edbcdd5e6 +Block 0005 [ 91]: 7a36dc0b9babdeee +Block 0005 [ 92]: a25fe4ca39355228 +Block 0005 [ 93]: 5303077523d42415 +Block 0005 [ 94]: e026575393d878e2 +Block 0005 [ 95]: 373ce0152a6ee33c +Block 0005 [ 96]: 4f54a4afbcac993d +Block 0005 [ 97]: 36f7cc82d6a97698 +Block 0005 [ 98]: feddd35fdb839178 +Block 0005 [ 99]: a396259146239082 +Block 0005 [100]: cc1856fafbb4f906 +Block 0005 [101]: 85a1cf13ea55a8e6 +Block 0005 [102]: 16625d5ecefd1f48 +Block 0005 [103]: 6787085c993ce90f +Block 0005 [104]: 6d29d9f3d8e7dc82 +Block 0005 [105]: 44a6fbff8f68674c +Block 0005 [106]: ca8e8d86a15d66fe +Block 0005 [107]: 5cdcedee5006de76 +Block 0005 [108]: 2b090088bb3e641d +Block 0005 [109]: 258237f0878ffef1 +Block 0005 [110]: 8196ca4021a3eb70 +Block 0005 [111]: a2b8fe6e9572cff6 +Block 0005 [112]: c6d7aa973cf67d73 +Block 0005 [113]: 819e4db32d3f0c59 +Block 0005 [114]: 649053f6570cc68c +Block 0005 [115]: 3a3d451dc343d91d +Block 0005 [116]: 686e60f8c4207de9 +Block 0005 [117]: 3ee6eb06f251a0b8 +Block 0005 [118]: 32bf0426e100dc27 +Block 0005 [119]: af48b2f87b27c29f +Block 0005 [120]: 9b203f41b8d56660 +Block 0005 [121]: 100656e1838e23a3 +Block 0005 [122]: f3c1c20a03b2b109 +Block 0005 [123]: c14358b21020c956 +Block 0005 [124]: 100d50847f25bac5 +Block 0005 [125]: 6e474ffc741155a5 +Block 0005 [126]: d3837abc5cafb4b4 +Block 0005 [127]: 73413ce42e07707a +Block 0006 [ 0]: 207b10db5cffe8cc +Block 0006 [ 1]: 7313b549d3e7287a +Block 0006 [ 2]: 9a98eb99c3deb891 +Block 0006 [ 3]: 10069e28d0435cbf +Block 0006 [ 4]: e8ca034c80738973 +Block 0006 [ 5]: f1cb47ee4a476ca4 +Block 0006 [ 6]: f98e0d9a7b3678a9 +Block 0006 [ 7]: d87ddc69b89c26e3 +Block 0006 [ 8]: 5fb6984dca5a0935 +Block 0006 [ 9]: a74dc6254fd7a241 +Block 0006 [ 10]: fd190e53b4b1128a +Block 0006 [ 11]: da794330c18a845e +Block 0006 [ 12]: a1172aceb9a39806 +Block 0006 [ 13]: c73e42398788695a +Block 0006 [ 14]: db7ce46bae7ae7f8 +Block 0006 [ 15]: a1ba8bd31fb8f0ee +Block 0006 [ 16]: 74012a4340f94011 +Block 0006 [ 17]: efa47c287cf1a3ad +Block 0006 [ 18]: 6dc566a1c1f9638e +Block 0006 [ 19]: 3613a14178c896da +Block 0006 [ 20]: 0e38b0039e779469 +Block 0006 [ 21]: cf9888dc3ee62faf +Block 0006 [ 22]: 7367cf6b70ec5012 +Block 0006 [ 23]: d2f068c75b9b7789 +Block 0006 [ 24]: eb2a65901b5e03ee +Block 0006 [ 25]: 648b57529bde77bc +Block 0006 [ 26]: 4aff37b8b76729e6 +Block 0006 [ 27]: 609cbf9c2e072b5f +Block 0006 [ 28]: 46e369a4d063dedb +Block 0006 [ 29]: 373eb5b30e919ac0 +Block 0006 [ 30]: aa9243610f11f8b8 +Block 0006 [ 31]: 4fce70d711ae62ba +Block 0006 [ 32]: 564d752fbb623966 +Block 0006 [ 33]: a1f6ba47632f0206 +Block 0006 [ 34]: 62367c5cce6f7e03 +Block 0006 [ 35]: 82de40ea4cae8fc2 +Block 0006 [ 36]: 1309ab5fb6673aba +Block 0006 [ 37]: 4aca55f3f9f4aeb5 +Block 0006 [ 38]: b7b531d28376686a +Block 0006 [ 39]: f26fd9a982569b7b +Block 0006 [ 40]: 5b9ce5ded879f6e2 +Block 0006 [ 41]: 18c59a8d77053b18 +Block 0006 [ 42]: c499ad269fa61497 +Block 0006 [ 43]: 6e8b4060b8c502a8 +Block 0006 [ 44]: 9a8cb6bad14c9d0f +Block 0006 [ 45]: 1e98359f33b83bf7 +Block 0006 [ 46]: 1604438faacfdc2a +Block 0006 [ 47]: bedd53bcdb427d14 +Block 0006 [ 48]: 1dae57588a99d154 +Block 0006 [ 49]: 0fdcb29413b7167b +Block 0006 [ 50]: 23ce479ac77ec8fe +Block 0006 [ 51]: 3057176fbc13ce27 +Block 0006 [ 52]: 9d97168136290f32 +Block 0006 [ 53]: 10e9f9dfb8be79b7 +Block 0006 [ 54]: bf046bc5effedc65 +Block 0006 [ 55]: 1d119988b12ea53a +Block 0006 [ 56]: 62f88ac4a406d5f5 +Block 0006 [ 57]: 36e3dad6d5889c8f +Block 0006 [ 58]: c03ad9fdedb44c1a +Block 0006 [ 59]: 2ca0a0a505d6ad48 +Block 0006 [ 60]: 47b8d37b661e5d02 +Block 0006 [ 61]: d63f3d361ad0e2e8 +Block 0006 [ 62]: 0fec955ea758c8bd +Block 0006 [ 63]: de10b7c48004cb60 +Block 0006 [ 64]: 8e986ea33b73db2f +Block 0006 [ 65]: bb8e714f470452b1 +Block 0006 [ 66]: cdc713d39cd1ab4c +Block 0006 [ 67]: c05a6a8689e023c8 +Block 0006 [ 68]: 120b9b26cfd19db7 +Block 0006 [ 69]: b67ef16cc74f266b +Block 0006 [ 70]: 86cb36ab2f361439 +Block 0006 [ 71]: 29e7c9695a1d2a49 +Block 0006 [ 72]: 83f364c881607b8f +Block 0006 [ 73]: 23f6fa8bd886a772 +Block 0006 [ 74]: bed21643e5e7e5e1 +Block 0006 [ 75]: e2e97a56b51a2859 +Block 0006 [ 76]: 4d393e0b6d1d88bf +Block 0006 [ 77]: 35003e2abf8863ac +Block 0006 [ 78]: 0f488382a32f7c19 +Block 0006 [ 79]: 9ca2d208e38ce69f +Block 0006 [ 80]: 9625b25216944457 +Block 0006 [ 81]: 7e32ef15494d8452 +Block 0006 [ 82]: 4b1054077944dd66 +Block 0006 [ 83]: 1c036bb21867b709 +Block 0006 [ 84]: 303cd1949081adad +Block 0006 [ 85]: a0feb5be65aa2980 +Block 0006 [ 86]: a33c51024a269ba8 +Block 0006 [ 87]: 72035f020c2d5116 +Block 0006 [ 88]: c1b8f4a8bb0d6bef +Block 0006 [ 89]: 0c24bdf244970c9e +Block 0006 [ 90]: 458bdb8d42dff226 +Block 0006 [ 91]: da9ade8459a83877 +Block 0006 [ 92]: c62aa75f3ad8af18 +Block 0006 [ 93]: f3b0115b81a85189 +Block 0006 [ 94]: 4f8d10e3c8fa60bc +Block 0006 [ 95]: a8dc8bb82dd96d89 +Block 0006 [ 96]: ffbd8ca9279e0cab +Block 0006 [ 97]: fca3dc86e42bd209 +Block 0006 [ 98]: ea64792c1ebc8f5f +Block 0006 [ 99]: 3591955004fca6ee +Block 0006 [100]: 0ac25778983c4707 +Block 0006 [101]: 74368e8884bcdfec +Block 0006 [102]: 7151d6032e06d71c +Block 0006 [103]: c5c71b6560554c76 +Block 0006 [104]: de23bf17c2bb8819 +Block 0006 [105]: cfbb7295c3416e6a +Block 0006 [106]: 5df2f35264853653 +Block 0006 [107]: 1975d4925e2750d7 +Block 0006 [108]: 38c55cb4882a2065 +Block 0006 [109]: 9981db2c4bde5e81 +Block 0006 [110]: 7b60c41a8467a595 +Block 0006 [111]: 1f293556774eb26e +Block 0006 [112]: 41a0d1cbb6b9aebe +Block 0006 [113]: 74283de191cbbe30 +Block 0006 [114]: 6b4304c9721b5bed +Block 0006 [115]: e28ef6c6cb719ebb +Block 0006 [116]: 0008cae5ec0089d9 +Block 0006 [117]: ad90327c0ee207de +Block 0006 [118]: 447a5a24fcd4685d +Block 0006 [119]: 7facf44fef9d195e +Block 0006 [120]: 867f839cbc6f4034 +Block 0006 [121]: f06f3f89a4a07ca3 +Block 0006 [122]: 4edf63ff12b9ec51 +Block 0006 [123]: f3b59e506fa26a18 +Block 0006 [124]: d0076e1bcff93428 +Block 0006 [125]: 883962735cdcb10e +Block 0006 [126]: 91a342d726712b8d +Block 0006 [127]: ca9bfa6141a1cd99 +Block 0007 [ 0]: 92639f7eb0201bd1 +Block 0007 [ 1]: bff508c654d0a316 +Block 0007 [ 2]: c9e10ded181c85ba +Block 0007 [ 3]: dd0aa4c62496168a +Block 0007 [ 4]: 53e56c347c3e1748 +Block 0007 [ 5]: a7667ba20750c0ba +Block 0007 [ 6]: a61e71761bd77790 +Block 0007 [ 7]: 71aa5648045f8cc6 +Block 0007 [ 8]: 69c05be9057e6342 +Block 0007 [ 9]: e364571564765b59 +Block 0007 [ 10]: 9238a5a2f5275a39 +Block 0007 [ 11]: 258858e5c66c9c22 +Block 0007 [ 12]: 90001218c66bf46e +Block 0007 [ 13]: 62c859ae59c89890 +Block 0007 [ 14]: be72cd6ac393716e +Block 0007 [ 15]: 3d0e18a8bcfa640a +Block 0007 [ 16]: b375985c889a06fc +Block 0007 [ 17]: 7c13c1a3ac44b123 +Block 0007 [ 18]: 0c1fe0ed44844d8d +Block 0007 [ 19]: 67a5e7752a98dcdf +Block 0007 [ 20]: 1d3b696ebf5de5d1 +Block 0007 [ 21]: 90359e733d5c16c5 +Block 0007 [ 22]: 449f5afedd4f6996 +Block 0007 [ 23]: 97bcc0ff0a526ea9 +Block 0007 [ 24]: 13ed6824d6340099 +Block 0007 [ 25]: 354e5fbc6ca1ee51 +Block 0007 [ 26]: 9adfd16d27171d30 +Block 0007 [ 27]: 7f6316276addaf9c +Block 0007 [ 28]: b101e4b18cec1fa2 +Block 0007 [ 29]: d722bb7c8ddaa4cf +Block 0007 [ 30]: 724909c312c8404b +Block 0007 [ 31]: acf2bc435642575e +Block 0007 [ 32]: a39218a487e82583 +Block 0007 [ 33]: 8d14f885962058a5 +Block 0007 [ 34]: 9851440cfcde2435 +Block 0007 [ 35]: 492f52a3a4a9b67d +Block 0007 [ 36]: 970b91f982d92634 +Block 0007 [ 37]: 8442989dac511e75 +Block 0007 [ 38]: 203380bb904165df +Block 0007 [ 39]: d58a7d10d08d2272 +Block 0007 [ 40]: 79d5c3c7a956e43e +Block 0007 [ 41]: f7a74819963be129 +Block 0007 [ 42]: 061b0ae3c553a728 +Block 0007 [ 43]: a7721db2c9fcebeb +Block 0007 [ 44]: 3b1d4a9bbab3af2a +Block 0007 [ 45]: 811931ac1fa3f917 +Block 0007 [ 46]: acb7322a63fb6bda +Block 0007 [ 47]: 4984832580dd5c34 +Block 0007 [ 48]: 9ad12e5479f0c30c +Block 0007 [ 49]: d9473ecdaea89765 +Block 0007 [ 50]: c8caaf4bdf8f477e +Block 0007 [ 51]: 2fdaab5ff4b494e1 +Block 0007 [ 52]: fdef30421b7a39cd +Block 0007 [ 53]: 967217fa1e92ec59 +Block 0007 [ 54]: 728d382342a4159c +Block 0007 [ 55]: 1be6595bce295dbc +Block 0007 [ 56]: b4c40d238800cfc5 +Block 0007 [ 57]: 607c2d4a27c2b5e4 +Block 0007 [ 58]: 4fc7458f38ac2e19 +Block 0007 [ 59]: 846fea2ac878596d +Block 0007 [ 60]: af34e79d00b74c2a +Block 0007 [ 61]: 3956cc0c34643e42 +Block 0007 [ 62]: ba6d0365319d1bec +Block 0007 [ 63]: 60e4e131ada578d1 +Block 0007 [ 64]: 341af8d301af17ba +Block 0007 [ 65]: 9e9f8e4207a22688 +Block 0007 [ 66]: 9f79b73e65d02b06 +Block 0007 [ 67]: 59301917c3c15263 +Block 0007 [ 68]: 63e34dd709186a30 +Block 0007 [ 69]: ec7fd27fc8dbb1e5 +Block 0007 [ 70]: 440aa98a418a2131 +Block 0007 [ 71]: f9c5ba9031b1d826 +Block 0007 [ 72]: 0f4d36a43c029a63 +Block 0007 [ 73]: 1284d8e357e3bd01 +Block 0007 [ 74]: 3146e0c36173477b +Block 0007 [ 75]: 9c2fcd46d491155d +Block 0007 [ 76]: d25b78f7801545fd +Block 0007 [ 77]: cee8bc67c23b793e +Block 0007 [ 78]: f287bddf96962f7b +Block 0007 [ 79]: 890f655ea4780197 +Block 0007 [ 80]: 4ccdb583e3e68835 +Block 0007 [ 81]: 8e49d38352df80a8 +Block 0007 [ 82]: 9007f0b9b1644498 +Block 0007 [ 83]: 669e52534a22731f +Block 0007 [ 84]: 3ee66d53b92d25db +Block 0007 [ 85]: 3fa32c7f315a0bee +Block 0007 [ 86]: 75b06f3b0a679c4f +Block 0007 [ 87]: ce797b9e220966bf +Block 0007 [ 88]: fc782c6fe2e4bf15 +Block 0007 [ 89]: 508a1982385f1673 +Block 0007 [ 90]: 44713c78ff218860 +Block 0007 [ 91]: 5c57bb791463b88a +Block 0007 [ 92]: b556c28d6fffd834 +Block 0007 [ 93]: 02c839a4bea833dd +Block 0007 [ 94]: 1a6657fa702d17eb +Block 0007 [ 95]: 0aab5f5ea6a8025e +Block 0007 [ 96]: acac9efcbcf36c9c +Block 0007 [ 97]: 8656aec03615c4aa +Block 0007 [ 98]: 6bf56fc498e7d86f +Block 0007 [ 99]: 0dded31589058143 +Block 0007 [100]: bc0a945089635b30 +Block 0007 [101]: 11a4b1441f22f9e7 +Block 0007 [102]: 1e0f1d0b550519fa +Block 0007 [103]: b274b5ad1da912df +Block 0007 [104]: 9ca07448302011e4 +Block 0007 [105]: d9a97724cf0aef36 +Block 0007 [106]: a98a48483cf87837 +Block 0007 [107]: 16fe627774fe37f2 +Block 0007 [108]: 70ae49b3f2cba3de +Block 0007 [109]: c6019a28d8a84f51 +Block 0007 [110]: eeafcdadd890b0de +Block 0007 [111]: 612d51f03688bc5a +Block 0007 [112]: fe6e77f4f6aca6a5 +Block 0007 [113]: ae8b12a53d5578c6 +Block 0007 [114]: 4da5f1027fd097c3 +Block 0007 [115]: 1bdab124d64647aa +Block 0007 [116]: d4826060be069d2a +Block 0007 [117]: 408604168027ec6d +Block 0007 [118]: cd600a0f0e5aeaa4 +Block 0007 [119]: 6fbb6c43c9599aff +Block 0007 [120]: a2333bb2cd3ac800 +Block 0007 [121]: e66d8b6a4c823ae4 +Block 0007 [122]: 8e0606698decd1e7 +Block 0007 [123]: 92641e8250e01937 +Block 0007 [124]: fced8360f3192cb3 +Block 0007 [125]: 336ab5f395df00ad +Block 0007 [126]: 8a9c07658ef7a919 +Block 0007 [127]: 5ec2585c7bfc1859 +Block 0008 [ 0]: d7a32f2a0827cf48 +Block 0008 [ 1]: fe8e9442ca7c4a62 +Block 0008 [ 2]: 1ac3dc6903359815 +Block 0008 [ 3]: 0b8aa4ccce92d934 +Block 0008 [ 4]: 190ec5dd8cdd386e +Block 0008 [ 5]: 71029c05d16f33fe +Block 0008 [ 6]: 40fd5e4026f04da3 +Block 0008 [ 7]: 21ae9adc0a409886 +Block 0008 [ 8]: 3527516b3b50cd47 +Block 0008 [ 9]: fae211122ef4573f +Block 0008 [ 10]: b966633eefce1852 +Block 0008 [ 11]: 60286b42d102da9c +Block 0008 [ 12]: d2e444236395a76d +Block 0008 [ 13]: f3ceb35748329935 +Block 0008 [ 14]: 319a9a0cc9a31169 +Block 0008 [ 15]: 3df93869b18eba70 +Block 0008 [ 16]: c57e131d63fcedbc +Block 0008 [ 17]: 385aa44fdb7ff617 +Block 0008 [ 18]: cf0c30a4cc6101d3 +Block 0008 [ 19]: ed75e4cc5671b6d4 +Block 0008 [ 20]: 620b7dc94ff1745a +Block 0008 [ 21]: c0999aae6e9a6811 +Block 0008 [ 22]: b109ebd952882999 +Block 0008 [ 23]: 08544ca1ac4126c9 +Block 0008 [ 24]: 737cd559fcf13146 +Block 0008 [ 25]: 99381d9f2e261370 +Block 0008 [ 26]: 4d6bc4fbfe2a7172 +Block 0008 [ 27]: dc1979f94ea499e3 +Block 0008 [ 28]: 96067d03816361c7 +Block 0008 [ 29]: c63e0755acec2839 +Block 0008 [ 30]: c1e7c6a51b2d7641 +Block 0008 [ 31]: 08d90379743b61bd +Block 0008 [ 32]: 1c44e7b97c4219de +Block 0008 [ 33]: 857e0800382ca589 +Block 0008 [ 34]: 8433eebf9e376bd4 +Block 0008 [ 35]: 608b1b0186eea6a0 +Block 0008 [ 36]: 353d894da9c34618 +Block 0008 [ 37]: 4639dad690f86eba +Block 0008 [ 38]: f298b2ad3a061766 +Block 0008 [ 39]: d6f200ebb8e1690d +Block 0008 [ 40]: d3f9dd948ade14d4 +Block 0008 [ 41]: 31fdfe49f48b9ab1 +Block 0008 [ 42]: cf4cb128bd5b1eef +Block 0008 [ 43]: b5738119a2e3d243 +Block 0008 [ 44]: ffe9215e317c3db3 +Block 0008 [ 45]: fac8155e1d260771 +Block 0008 [ 46]: 1ca35710531e97f8 +Block 0008 [ 47]: 63980f2b3269a767 +Block 0008 [ 48]: 4a19b88413d2406e +Block 0008 [ 49]: ccb23a68dace3ab4 +Block 0008 [ 50]: db2e6cfd5f51b867 +Block 0008 [ 51]: e581eb27d138b8a4 +Block 0008 [ 52]: f3ba0e830dfa85ea +Block 0008 [ 53]: b19f82a630ccde90 +Block 0008 [ 54]: 7ca6e40cc6ea95cf +Block 0008 [ 55]: 02cc3c74c2ac7018 +Block 0008 [ 56]: 5b75a9db29883cdb +Block 0008 [ 57]: 68fd811e9657d448 +Block 0008 [ 58]: d0c70b19b4dc4445 +Block 0008 [ 59]: 337a8e2f147a9ac4 +Block 0008 [ 60]: 48ec26c7bcb09b5d +Block 0008 [ 61]: 7ee3b7f669944a69 +Block 0008 [ 62]: 85cbafaaabc1b7c0 +Block 0008 [ 63]: d378282d6a4fb14b +Block 0008 [ 64]: b5c4a859f972ba41 +Block 0008 [ 65]: 32f0e6bf92d52494 +Block 0008 [ 66]: 07a59fe5a1dcbefb +Block 0008 [ 67]: 65b8f375d97a8db7 +Block 0008 [ 68]: 094215233f0b5f31 +Block 0008 [ 69]: d4b8d0f377e48fb9 +Block 0008 [ 70]: 4d78725fbff27412 +Block 0008 [ 71]: 82b5f15be44fee37 +Block 0008 [ 72]: 6f08db1d8df4f3cf +Block 0008 [ 73]: faf6cede70806639 +Block 0008 [ 74]: ea2eba07c4477062 +Block 0008 [ 75]: 3482d24b81175403 +Block 0008 [ 76]: da24ea0a67f78c64 +Block 0008 [ 77]: 65e8b030ef344807 +Block 0008 [ 78]: 6c1c6aa7ee9efa9f +Block 0008 [ 79]: 5000bebc24e9ef81 +Block 0008 [ 80]: a6c7736f0d6b9957 +Block 0008 [ 81]: 7707cc16f7366011 +Block 0008 [ 82]: 10929dbf80c11f98 +Block 0008 [ 83]: 2c7d3a22de876b27 +Block 0008 [ 84]: 80fba4b809012410 +Block 0008 [ 85]: 056466ea9c0247b5 +Block 0008 [ 86]: 36956578b3fddd5f +Block 0008 [ 87]: 4e5743b85aa96859 +Block 0008 [ 88]: be09680812e0851e +Block 0008 [ 89]: 1e5bec4834ac4753 +Block 0008 [ 90]: d0f9372e3f60a200 +Block 0008 [ 91]: 5ab4bcef8bb03df9 +Block 0008 [ 92]: e2aea9de802983af +Block 0008 [ 93]: ffb26f08985e0ef1 +Block 0008 [ 94]: bb27500db2718bd8 +Block 0008 [ 95]: b45c0e6aaa63c7a5 +Block 0008 [ 96]: aa8b69bb102e1432 +Block 0008 [ 97]: 67f4724f3fe700e9 +Block 0008 [ 98]: b1fa8f95fa91138c +Block 0008 [ 99]: 74dcfc6303efd795 +Block 0008 [100]: 697820b63ee7881b +Block 0008 [101]: f1d5749128d4d216 +Block 0008 [102]: ca5eb06b4b2187ec +Block 0008 [103]: 6d4799a6e896b61c +Block 0008 [104]: 843d5dc3b6fbd6ef +Block 0008 [105]: e361b3c450ecbe54 +Block 0008 [106]: 3f2a65193e245e32 +Block 0008 [107]: ae54b6aaa09ce1c1 +Block 0008 [108]: 70a4df8bbfa5261c +Block 0008 [109]: 5df00fda80ad67f3 +Block 0008 [110]: 3ac1c4e9fb82980c +Block 0008 [111]: ea1f0237d8bd0dad +Block 0008 [112]: adafe0783378514b +Block 0008 [113]: efb23364e431ea53 +Block 0008 [114]: c884c5872ee09321 +Block 0008 [115]: 068919a5229618d7 +Block 0008 [116]: 7139accfe2fd404f +Block 0008 [117]: a2547790240851ef +Block 0008 [118]: 95eb676d47ba8dda +Block 0008 [119]: 4b9972623559149a +Block 0008 [120]: 57ff7b71148c3c54 +Block 0008 [121]: 8ffa691b244d70d4 +Block 0008 [122]: 09f8ffb1e6a08534 +Block 0008 [123]: 70a88fcae9d3ee9d +Block 0008 [124]: adcc44492f34a7fd +Block 0008 [125]: 62b1621dd05211f6 +Block 0008 [126]: 7c8764d0b5fba3a1 +Block 0008 [127]: d3ea7a45dd01bd53 +Block 0009 [ 0]: d08bd259d340d3c6 +Block 0009 [ 1]: 429557aed2016d51 +Block 0009 [ 2]: 77d12b978a1e2319 +Block 0009 [ 3]: c31ca96bc3b42584 +Block 0009 [ 4]: 962c4d3cc4a5e623 +Block 0009 [ 5]: 232c507b19dcc018 +Block 0009 [ 6]: e674558b67e49478 +Block 0009 [ 7]: 0c738b0c0e08dc01 +Block 0009 [ 8]: a3a4cea8b57f348e +Block 0009 [ 9]: 0b0bcc420dc8797d +Block 0009 [ 10]: 08de0203f13d7df6 +Block 0009 [ 11]: 59a6c3129e0ca977 +Block 0009 [ 12]: 313d1fe2cf306fff +Block 0009 [ 13]: 22aa2ef78c7bd925 +Block 0009 [ 14]: 509e5b5e3f9caa3d +Block 0009 [ 15]: d35f6e1bad7c86c0 +Block 0009 [ 16]: b8d48c2439aa2a25 +Block 0009 [ 17]: 2903a4a01fbf6f28 +Block 0009 [ 18]: 9837daa60b4a5d60 +Block 0009 [ 19]: e73aa62e324f8def +Block 0009 [ 20]: 7a8dedaef7c8081d +Block 0009 [ 21]: 8883f66b856f9b32 +Block 0009 [ 22]: bfc326c218d22ba8 +Block 0009 [ 23]: b8caa2dd6e3571fe +Block 0009 [ 24]: 65a52b4fca1522ce +Block 0009 [ 25]: 25cbc74d57b444df +Block 0009 [ 26]: 26fdc5d7ddf5b9e7 +Block 0009 [ 27]: 88228a1eeffe1815 +Block 0009 [ 28]: 8c45034ca552fcaf +Block 0009 [ 29]: 18e4642b4e82d914 +Block 0009 [ 30]: 4ff981f2eaf571b5 +Block 0009 [ 31]: 6e157fb736d60562 +Block 0009 [ 32]: 2b10660f514d312b +Block 0009 [ 33]: 22bf3a2837801aff +Block 0009 [ 34]: 61eafbb9e3b6fca0 +Block 0009 [ 35]: 823bd01b1aecd107 +Block 0009 [ 36]: b2a19bdfe12307ab +Block 0009 [ 37]: 8927f7176f855d06 +Block 0009 [ 38]: d4aef8e75777bdf1 +Block 0009 [ 39]: 206d9dccb1b939c8 +Block 0009 [ 40]: ac91b41fba63216e +Block 0009 [ 41]: b5b84fbdd569bfec +Block 0009 [ 42]: 146e312d7f6172c6 +Block 0009 [ 43]: de088fc95a4d0346 +Block 0009 [ 44]: b3c6e981c37559cb +Block 0009 [ 45]: 1001b9616071239d +Block 0009 [ 46]: 6bea9f89abb17a30 +Block 0009 [ 47]: 4a5a14d2853f60da +Block 0009 [ 48]: 41f418210e2573df +Block 0009 [ 49]: 5e39b91f69b7c397 +Block 0009 [ 50]: b521aaa82df655fc +Block 0009 [ 51]: 2f64b711ee0fc787 +Block 0009 [ 52]: d221cf816168ba5e +Block 0009 [ 53]: a39af1e90a530697 +Block 0009 [ 54]: aee2d02a683e92c2 +Block 0009 [ 55]: b5daa3e78190eec5 +Block 0009 [ 56]: cafd3d830ab10c85 +Block 0009 [ 57]: dbd796641fce27f9 +Block 0009 [ 58]: d24bfc0d8a99ab4b +Block 0009 [ 59]: 830bdc94684153de +Block 0009 [ 60]: 5b78fd0467e15764 +Block 0009 [ 61]: 55137012f62f906d +Block 0009 [ 62]: 866455113a07ed78 +Block 0009 [ 63]: 2191af3b847267ea +Block 0009 [ 64]: e5ebaa3dade7a97d +Block 0009 [ 65]: 5d8fb9aecb948a7f +Block 0009 [ 66]: 427619aedba4c182 +Block 0009 [ 67]: fb24b376bee4df10 +Block 0009 [ 68]: 95135cf1d29f80e2 +Block 0009 [ 69]: 2c51e533bdede03c +Block 0009 [ 70]: 52893b83af5480a4 +Block 0009 [ 71]: 1e0e0da7ac8c89d8 +Block 0009 [ 72]: f7c523e21b168bad +Block 0009 [ 73]: ea4e481e5969e7a9 +Block 0009 [ 74]: 39237fe8a127f2ea +Block 0009 [ 75]: 9c6d958103b2d551 +Block 0009 [ 76]: 75e38e8091abc932 +Block 0009 [ 77]: 3ddc63b07a1be378 +Block 0009 [ 78]: f11233b5add5cdff +Block 0009 [ 79]: 864ffb38776d09a1 +Block 0009 [ 80]: b6c93a2056ee2423 +Block 0009 [ 81]: f3b5e151ea4b7cf7 +Block 0009 [ 82]: bda60b0a42c98afc +Block 0009 [ 83]: 206c01f4b12908a5 +Block 0009 [ 84]: f9def6d5ac997ba6 +Block 0009 [ 85]: 01b680f90d692a0b +Block 0009 [ 86]: c4a90cb124152693 +Block 0009 [ 87]: 14d55e7fa42e375b +Block 0009 [ 88]: 2b8018bd80552d61 +Block 0009 [ 89]: 8eddde6c73a88c9d +Block 0009 [ 90]: 30c144a558c0e6c6 +Block 0009 [ 91]: 4f6c61db03719125 +Block 0009 [ 92]: 6771f4cdf1120f56 +Block 0009 [ 93]: a4a063679ad7d497 +Block 0009 [ 94]: 75aa05ef51f93d80 +Block 0009 [ 95]: 325c97906db37c77 +Block 0009 [ 96]: f09a14aa1fb090e1 +Block 0009 [ 97]: fa726606823f5fad +Block 0009 [ 98]: f8eb5b5c0703b09b +Block 0009 [ 99]: 228067ce5a3320ba +Block 0009 [100]: 1e74f435eb43fb9a +Block 0009 [101]: 004d5f043957d65a +Block 0009 [102]: 20dcf6bc285d9d0d +Block 0009 [103]: 848a0e38582a8944 +Block 0009 [104]: 3c1c49835ec69491 +Block 0009 [105]: 20063d3af3417cdc +Block 0009 [106]: 87dc824cb5c06c12 +Block 0009 [107]: 6525776d6502bb13 +Block 0009 [108]: 2e026670ca887659 +Block 0009 [109]: bd8efc8d29eb72af +Block 0009 [110]: 74991100959b9f7a +Block 0009 [111]: a5a2288c26fee2bb +Block 0009 [112]: 7283dd8ffcb0940d +Block 0009 [113]: 16a092fca662c662 +Block 0009 [114]: 5ed480134578c559 +Block 0009 [115]: 2663252693a54b82 +Block 0009 [116]: 95cf4c81e9f4ab71 +Block 0009 [117]: 4ab2f95d78af71da +Block 0009 [118]: 66eec9677f23b9f3 +Block 0009 [119]: 87ed8660f5c913c0 +Block 0009 [120]: fc892530429a248a +Block 0009 [121]: 03589e9cea760810 +Block 0009 [122]: 5b399da3f98c3128 +Block 0009 [123]: 26dcf9d52c2b9e31 +Block 0009 [124]: 5424678fc32d6683 +Block 0009 [125]: dc1009703fe5413b +Block 0009 [126]: 03ce3ad9c886da37 +Block 0009 [127]: f1a4cfd3a16361cf +Block 0010 [ 0]: f7102b7819862507 +Block 0010 [ 1]: df56220925ba6a2f +Block 0010 [ 2]: f51393014936014f +Block 0010 [ 3]: 15625042d501fdb0 +Block 0010 [ 4]: b21e29b86660cac3 +Block 0010 [ 5]: d29185b644e83366 +Block 0010 [ 6]: fa2820732246e503 +Block 0010 [ 7]: 7010a476d2a6d4d5 +Block 0010 [ 8]: ce54fa5cfee22a4a +Block 0010 [ 9]: f1ee891589e25001 +Block 0010 [ 10]: e25da33d7e215be9 +Block 0010 [ 11]: 384f8897822a8f92 +Block 0010 [ 12]: 65ee848c4bf3d662 +Block 0010 [ 13]: a945e8a041ebf8ff +Block 0010 [ 14]: fbcdf5feb172a921 +Block 0010 [ 15]: edd4b6fc18863cfa +Block 0010 [ 16]: 3ea4af86b1b8bcf1 +Block 0010 [ 17]: 5090e9061cdffe2b +Block 0010 [ 18]: 4ed2f171a8d3dc71 +Block 0010 [ 19]: 1d34acc8a37014b0 +Block 0010 [ 20]: 435fde3f03d94963 +Block 0010 [ 21]: ef7e011a248d9ab4 +Block 0010 [ 22]: b2713d0d04158674 +Block 0010 [ 23]: 34eda70ee54044aa +Block 0010 [ 24]: c17ffee696268e67 +Block 0010 [ 25]: bcf94972d44ac6aa +Block 0010 [ 26]: 62d4b2a710f28bc4 +Block 0010 [ 27]: cd3e1061b949f164 +Block 0010 [ 28]: 66bb3435151cb7c0 +Block 0010 [ 29]: 04927566e052dc70 +Block 0010 [ 30]: c6098d954b703238 +Block 0010 [ 31]: 6b38cac5f7e384fd +Block 0010 [ 32]: ad827462ecc594a1 +Block 0010 [ 33]: dc7dffd943b711d8 +Block 0010 [ 34]: 48acb309728fc0f3 +Block 0010 [ 35]: 23990349a973f2bd +Block 0010 [ 36]: 9858087a1350d908 +Block 0010 [ 37]: 830e4c7c0d3063ff +Block 0010 [ 38]: 353c20afdd0ce145 +Block 0010 [ 39]: 477c80401d92b4bb +Block 0010 [ 40]: 223aaa363c3131bc +Block 0010 [ 41]: 92bf771465be2dc7 +Block 0010 [ 42]: 4962650f4ca85833 +Block 0010 [ 43]: 9ff477d2bc5a5b4f +Block 0010 [ 44]: cedea84b3e0ae182 +Block 0010 [ 45]: 9bbb316a0430e7af +Block 0010 [ 46]: de5b2d55ef08bc41 +Block 0010 [ 47]: 4a68404c3af4cc55 +Block 0010 [ 48]: 322aa531e0e70d38 +Block 0010 [ 49]: d732a5c235c785f2 +Block 0010 [ 50]: d194b97d72dc3a39 +Block 0010 [ 51]: 6dbc081f1151718d +Block 0010 [ 52]: 82a2d3af9f897794 +Block 0010 [ 53]: 43d7a43718dc4bd2 +Block 0010 [ 54]: db61a4b356a2743a +Block 0010 [ 55]: 9ab6f0349b657e9f +Block 0010 [ 56]: 2c6065c9334fd4db +Block 0010 [ 57]: 5e2704a1d1060351 +Block 0010 [ 58]: 582a4a05cedddd44 +Block 0010 [ 59]: b958a045ff37830f +Block 0010 [ 60]: a34c2c509ac32f79 +Block 0010 [ 61]: 02ef34ca4730d0fa +Block 0010 [ 62]: 239172f43950d8fd +Block 0010 [ 63]: b79d7a305227b957 +Block 0010 [ 64]: ce660699f2567824 +Block 0010 [ 65]: 2226ac90308bc88b +Block 0010 [ 66]: 74afc00999644831 +Block 0010 [ 67]: 3b0ee6ea37495e91 +Block 0010 [ 68]: 6d04170b6116e08e +Block 0010 [ 69]: 57a1fffb9171a6c5 +Block 0010 [ 70]: 8e042dce88bf04e5 +Block 0010 [ 71]: a1f101a34208d1ff +Block 0010 [ 72]: 77be77d55ba39cf1 +Block 0010 [ 73]: f2f5463a10c77c0a +Block 0010 [ 74]: 54f36a5d93ebf9e0 +Block 0010 [ 75]: 1c270347feab23c3 +Block 0010 [ 76]: 4a4f45c009372f5f +Block 0010 [ 77]: 210b3203bd710469 +Block 0010 [ 78]: 0e3b847d4b92d146 +Block 0010 [ 79]: b3f0c7a18d6da095 +Block 0010 [ 80]: 53d3d14e7bc0cc98 +Block 0010 [ 81]: 3b8a954fce979752 +Block 0010 [ 82]: 8571c0ff14544b35 +Block 0010 [ 83]: cf52cb49f383d078 +Block 0010 [ 84]: 34b9a8d088b46a7d +Block 0010 [ 85]: 0c02556204f91c44 +Block 0010 [ 86]: 4ff85a111866656c +Block 0010 [ 87]: e8b7f0a60d9d78b0 +Block 0010 [ 88]: 7d50a0180d5ab40e +Block 0010 [ 89]: 5f26a2da9d155f4a +Block 0010 [ 90]: cb8e7b8dccbb09e2 +Block 0010 [ 91]: 548c3d903b2c3721 +Block 0010 [ 92]: dbed09ba9901f9af +Block 0010 [ 93]: 8f3bd6baed72f42f +Block 0010 [ 94]: c0523988601177b1 +Block 0010 [ 95]: 9479077ded200101 +Block 0010 [ 96]: 22bb9c0414c5311d +Block 0010 [ 97]: 0aa62726ef5006b1 +Block 0010 [ 98]: 65725877f28d41c0 +Block 0010 [ 99]: 1bf3fbbf62dc434f +Block 0010 [100]: 8d24325a2de1c34c +Block 0010 [101]: ad1ebc03915d3632 +Block 0010 [102]: a80744af224bc6e5 +Block 0010 [103]: a42f36ce1b331fa7 +Block 0010 [104]: 7f5b84c2264dde29 +Block 0010 [105]: 9d68aa35b0346155 +Block 0010 [106]: 106ec871bc9af474 +Block 0010 [107]: 0f30036315e3358f +Block 0010 [108]: ea0e307ee2de4cc0 +Block 0010 [109]: b8c78ff0b390416c +Block 0010 [110]: cb061486cafe634b +Block 0010 [111]: 1f65dc0a96c2df8c +Block 0010 [112]: 63509f1498fc4195 +Block 0010 [113]: 7958c9554127aa5d +Block 0010 [114]: aea53f20e9ae91f8 +Block 0010 [115]: d96a52977e99cfa9 +Block 0010 [116]: 9dd0669bf8bb9e4c +Block 0010 [117]: 17335cfb0b4a101b +Block 0010 [118]: ac83e8c088b3faa2 +Block 0010 [119]: e2d00f77ebdcb5d5 +Block 0010 [120]: 8953e063a53473cb +Block 0010 [121]: 0bf9340b692adf71 +Block 0010 [122]: 18e1d770623f5000 +Block 0010 [123]: b7f46f05950588e5 +Block 0010 [124]: bf82a3830897c743 +Block 0010 [125]: 45388ba792780880 +Block 0010 [126]: f298b7d1db9beaed +Block 0010 [127]: 80d82aaf83329f45 +Block 0011 [ 0]: 52b29e21da352337 +Block 0011 [ 1]: 2f0c85e24b2bb285 +Block 0011 [ 2]: 8bf5ede2af27b80b +Block 0011 [ 3]: d1d7798e3b7628b5 +Block 0011 [ 4]: 763577566ec4d2fb +Block 0011 [ 5]: 3e99eae6b9383da2 +Block 0011 [ 6]: 221dec4413c09f83 +Block 0011 [ 7]: f904d4d3e4bc9689 +Block 0011 [ 8]: 8f21dcec402bf89f +Block 0011 [ 9]: 68de13304dae5f9c +Block 0011 [ 10]: c464d43bf7ffb197 +Block 0011 [ 11]: 20d3b21625176b70 +Block 0011 [ 12]: e07b11307fa74f2e +Block 0011 [ 13]: 2a9fa72207dde048 +Block 0011 [ 14]: de300c37b9d59c53 +Block 0011 [ 15]: 8ed2a9fec9001675 +Block 0011 [ 16]: a411fa308bfb9948 +Block 0011 [ 17]: 01ae829642ff7219 +Block 0011 [ 18]: 5921b35dbafc1448 +Block 0011 [ 19]: cd2799228fd0dc30 +Block 0011 [ 20]: 00230c328bf3ef57 +Block 0011 [ 21]: d5a491d6021ae832 +Block 0011 [ 22]: c82ec6c1daaa93be +Block 0011 [ 23]: 40463c0836a29bd1 +Block 0011 [ 24]: 634d1419bbf24614 +Block 0011 [ 25]: 4a76864de4c728d4 +Block 0011 [ 26]: ccd8b6c9e22139c8 +Block 0011 [ 27]: b5e12193d76044c9 +Block 0011 [ 28]: 6d419f9ca6b2da18 +Block 0011 [ 29]: 631a3d2466f751c7 +Block 0011 [ 30]: eee3161ed510c1bc +Block 0011 [ 31]: 5c205b1ec867db89 +Block 0011 [ 32]: 57847ca52d6d1ca8 +Block 0011 [ 33]: a29a80eae282a2f9 +Block 0011 [ 34]: f75a6d57836ce3e3 +Block 0011 [ 35]: 46c644fe81a06770 +Block 0011 [ 36]: 89f77255596c64e7 +Block 0011 [ 37]: 557c8a199b0f3e57 +Block 0011 [ 38]: eece7fb87c820f63 +Block 0011 [ 39]: e9933bd1bfcb2efa +Block 0011 [ 40]: bc50e18635f727bb +Block 0011 [ 41]: d9abdabbba515124 +Block 0011 [ 42]: 3cf140d714fa3ab9 +Block 0011 [ 43]: 68b66ca1c4946d68 +Block 0011 [ 44]: 2cbe90f574d0aa6c +Block 0011 [ 45]: 942b66c749d50e3d +Block 0011 [ 46]: 14fe3b269ae7f924 +Block 0011 [ 47]: c34e24597c89e72d +Block 0011 [ 48]: 7db2d50634769bfc +Block 0011 [ 49]: 26b7f4115e5fa3e6 +Block 0011 [ 50]: 5c8811c8bb1f8518 +Block 0011 [ 51]: 5ccbd037664bbe60 +Block 0011 [ 52]: ae1a273e7682b4a7 +Block 0011 [ 53]: 992756342215636f +Block 0011 [ 54]: 41dd622f491d72ec +Block 0011 [ 55]: 157f7c4d6fa92e6b +Block 0011 [ 56]: 57f7c8e41f0843d8 +Block 0011 [ 57]: 06f4a658f7020d2f +Block 0011 [ 58]: b1900511e44d09ae +Block 0011 [ 59]: 2c636b5655bdca66 +Block 0011 [ 60]: f0cd0d2759b2a414 +Block 0011 [ 61]: aaa255272e910ba1 +Block 0011 [ 62]: f6cdfda91907a87b +Block 0011 [ 63]: 4daff4894e8c371c +Block 0011 [ 64]: 4b3fc1ed98b5c960 +Block 0011 [ 65]: 45aff93643e9bed6 +Block 0011 [ 66]: e57396cddcb85de0 +Block 0011 [ 67]: 453f06ae61b1ae84 +Block 0011 [ 68]: 92abd804af471c8c +Block 0011 [ 69]: de3db2263d007ea9 +Block 0011 [ 70]: 1cf00b12f02d302c +Block 0011 [ 71]: 4c98f282e6ed2ff4 +Block 0011 [ 72]: 7013d0175b3e1ade +Block 0011 [ 73]: 7d901f769d0fd762 +Block 0011 [ 74]: 554be32102a647ed +Block 0011 [ 75]: f027c617e3d22010 +Block 0011 [ 76]: 6e82b9c24aa56fea +Block 0011 [ 77]: dae2d2bbf585d44a +Block 0011 [ 78]: 8670017c6f7d7c45 +Block 0011 [ 79]: 95f5b9cc9521bf43 +Block 0011 [ 80]: 377311361d5e899f +Block 0011 [ 81]: c94963d5ff411540 +Block 0011 [ 82]: fd0a1ed433ef0547 +Block 0011 [ 83]: 0f52b42c428ecfa8 +Block 0011 [ 84]: 3da24c53fd340e11 +Block 0011 [ 85]: bc740a59bf3b9d91 +Block 0011 [ 86]: 47f7f84d80da6885 +Block 0011 [ 87]: cc33ce5dda2b18cd +Block 0011 [ 88]: a1079f9f43146d8d +Block 0011 [ 89]: 347b41316856a399 +Block 0011 [ 90]: de2a70e8fe948431 +Block 0011 [ 91]: 18f7a1e23950188c +Block 0011 [ 92]: e894053df2fb27d0 +Block 0011 [ 93]: 0bf2d7f61afac33a +Block 0011 [ 94]: f032f17390e9b43f +Block 0011 [ 95]: 76c2d93bdc87a6b2 +Block 0011 [ 96]: 5f94f381efd95cf0 +Block 0011 [ 97]: 780711e49c97fbf0 +Block 0011 [ 98]: ac9c82eade6bdeee +Block 0011 [ 99]: 5f55749397478696 +Block 0011 [100]: b6b8ee8ff05567af +Block 0011 [101]: 6215630fc4c7cd17 +Block 0011 [102]: c558c8971ccea93d +Block 0011 [103]: 55ba80c1a0b927b5 +Block 0011 [104]: f570ae43f549994c +Block 0011 [105]: 959ef14d47a74adf +Block 0011 [106]: 4ad49eefa6970106 +Block 0011 [107]: 32cd02e6655349bf +Block 0011 [108]: 3097c4d675de4902 +Block 0011 [109]: e1fdfd6688d3737f +Block 0011 [110]: 652ebc315836722f +Block 0011 [111]: 40f5ebd42d545915 +Block 0011 [112]: fbff4103ef433bc3 +Block 0011 [113]: 74d1748ea3a5bcd8 +Block 0011 [114]: 040978aca26fc2dd +Block 0011 [115]: 3650e07dce35b076 +Block 0011 [116]: 79100977dfc30b24 +Block 0011 [117]: ecc54d3e4c8bd3a6 +Block 0011 [118]: fe9a8fa9060ac214 +Block 0011 [119]: 850e726eeec182b6 +Block 0011 [120]: a21893e9f7760054 +Block 0011 [121]: bcb7f6992bd1051e +Block 0011 [122]: 69cc6743de97b4fc +Block 0011 [123]: 78a246a84319d5bc +Block 0011 [124]: 6719991920301152 +Block 0011 [125]: 62d3c940b1c82c4d +Block 0011 [126]: b8d54eaa8eefc9f1 +Block 0011 [127]: ef7cbc469902080a +Block 0012 [ 0]: b41d6643cd2d35e7 +Block 0012 [ 1]: 451993e7a1f452c9 +Block 0012 [ 2]: 19281a7c2c187a74 +Block 0012 [ 3]: f131ed721856f22c +Block 0012 [ 4]: f5aa54c24851e293 +Block 0012 [ 5]: 6daf0679c90cc7de +Block 0012 [ 6]: 6485b2c039fa9d7d +Block 0012 [ 7]: c6c2d967bf31e9aa +Block 0012 [ 8]: 6a373dfeb854197f +Block 0012 [ 9]: e721c34905b59088 +Block 0012 [ 10]: 177fe1b6c1bba1f4 +Block 0012 [ 11]: bdedea02f28e67ae +Block 0012 [ 12]: d96cf43dbb140033 +Block 0012 [ 13]: bc90d7ece2f06f22 +Block 0012 [ 14]: b1b149dbf7aafbf9 +Block 0012 [ 15]: 543a2bc21a6ef1c7 +Block 0012 [ 16]: c6adf0b95602151b +Block 0012 [ 17]: 1fa634a5014e68e0 +Block 0012 [ 18]: 156388d5b2cc39a4 +Block 0012 [ 19]: 3fa5584b8347398b +Block 0012 [ 20]: b80171c006813e45 +Block 0012 [ 21]: 93484f2494cb26a2 +Block 0012 [ 22]: d2a44226231d38b4 +Block 0012 [ 23]: 455dce0f0897d143 +Block 0012 [ 24]: 42a964a2f8b736a5 +Block 0012 [ 25]: 7b689eaed9d611cc +Block 0012 [ 26]: 748fac9d29981ff4 +Block 0012 [ 27]: 872a2f30efd85b27 +Block 0012 [ 28]: cc407811a5c3f5a3 +Block 0012 [ 29]: 5c901be277ec8973 +Block 0012 [ 30]: 1c2dd0eb9e25b060 +Block 0012 [ 31]: 57a92565827a07e5 +Block 0012 [ 32]: 1d1700d8734c11ec +Block 0012 [ 33]: 1edccd23555de63b +Block 0012 [ 34]: 10d90e9483ffdc52 +Block 0012 [ 35]: 9659c355ed944511 +Block 0012 [ 36]: df47ea500fa0a91f +Block 0012 [ 37]: c8eec40887899cb3 +Block 0012 [ 38]: 5afbb3990d6eb059 +Block 0012 [ 39]: c70615e230e7c4f6 +Block 0012 [ 40]: b7bafcae05874a33 +Block 0012 [ 41]: fa5d359d3482072a +Block 0012 [ 42]: 25106f2afcad8db9 +Block 0012 [ 43]: 1b5a77262e0c9ba6 +Block 0012 [ 44]: 5be08c2e2a919eae +Block 0012 [ 45]: 44bdb7ca0710d72e +Block 0012 [ 46]: 397cb3144bacf2ab +Block 0012 [ 47]: 511b264d429427f7 +Block 0012 [ 48]: aea9bc9f1b764af3 +Block 0012 [ 49]: 8d4a43506453f1d4 +Block 0012 [ 50]: 9806a89a986b115f +Block 0012 [ 51]: 0459b1632e869a12 +Block 0012 [ 52]: 4523dd7dd5485183 +Block 0012 [ 53]: f9c89833fdbda2ee +Block 0012 [ 54]: b89588ce4d5ba944 +Block 0012 [ 55]: afafcb5633f00c84 +Block 0012 [ 56]: 3677b05a67fa39bf +Block 0012 [ 57]: eafbe7bb4e4b8646 +Block 0012 [ 58]: 909a0b6387f8e49f +Block 0012 [ 59]: 6e858a5ea6670358 +Block 0012 [ 60]: 96915161672d880c +Block 0012 [ 61]: c179a9e40d93249a +Block 0012 [ 62]: e90403400d9b3166 +Block 0012 [ 63]: 1752659b1bae5d9f +Block 0012 [ 64]: 6fd39575db6a44e8 +Block 0012 [ 65]: 013de9bf0dbbdd11 +Block 0012 [ 66]: 73463d2189ada915 +Block 0012 [ 67]: 630fc52f88cb47b3 +Block 0012 [ 68]: ca4773724596e785 +Block 0012 [ 69]: cb5c2febf665f7b7 +Block 0012 [ 70]: 4e93e7dd9addea58 +Block 0012 [ 71]: 743c251ec9a34932 +Block 0012 [ 72]: 2056026bdde0ddaf +Block 0012 [ 73]: 8a2be10548d1b30b +Block 0012 [ 74]: a288353ffe05df65 +Block 0012 [ 75]: 5249529f94c8b330 +Block 0012 [ 76]: b4550cbf29ecdc90 +Block 0012 [ 77]: 962d8f1e68ef1beb +Block 0012 [ 78]: 84f687b4f6d8bb6e +Block 0012 [ 79]: 7444c30f326decca +Block 0012 [ 80]: 6fd686446a43aef2 +Block 0012 [ 81]: de5c7a070b961f9b +Block 0012 [ 82]: 21b25a9cd4f19753 +Block 0012 [ 83]: 88775ad5cdd7ea52 +Block 0012 [ 84]: aed154cdf4b74243 +Block 0012 [ 85]: 4ae9f92e0709773d +Block 0012 [ 86]: 107ff1bb7b349ad5 +Block 0012 [ 87]: aadc86f968bd0dcf +Block 0012 [ 88]: b4fed81d3a24dea6 +Block 0012 [ 89]: f2294093f5adcd7f +Block 0012 [ 90]: 7bb112a949891139 +Block 0012 [ 91]: dd9cd22cca3d4b50 +Block 0012 [ 92]: d3189d2bb0251c29 +Block 0012 [ 93]: 9d4ef66818294568 +Block 0012 [ 94]: fd6dbeeda6d42b41 +Block 0012 [ 95]: 34beb6e1fa79d1ff +Block 0012 [ 96]: 611fcfb5ea500a95 +Block 0012 [ 97]: 95c907722fb52e7e +Block 0012 [ 98]: ff44d6d256799080 +Block 0012 [ 99]: a0bed9defcd56afb +Block 0012 [100]: b580d489e3f02e54 +Block 0012 [101]: 72c5370840bf7f9b +Block 0012 [102]: 43441a6eab55953f +Block 0012 [103]: 945f22a7f40bb828 +Block 0012 [104]: dc99449d78dc5f4d +Block 0012 [105]: c7258afc1d62d9f3 +Block 0012 [106]: 53502b7babad94d8 +Block 0012 [107]: e44bb55a7247d194 +Block 0012 [108]: 703624923d1c44ac +Block 0012 [109]: de3b62036f77a962 +Block 0012 [110]: fdace61fd734e777 +Block 0012 [111]: e31fb59abb89ff5e +Block 0012 [112]: e0a50c2aa645a460 +Block 0012 [113]: 364d99f0e8cfaf47 +Block 0012 [114]: 0a3ceb5e14ae97fd +Block 0012 [115]: 068cf774cccf0b87 +Block 0012 [116]: 9078bf33cc1ea4cf +Block 0012 [117]: 102bdc8556c4aadc +Block 0012 [118]: 3d8218690d0a2275 +Block 0012 [119]: 02f8bb9d9554011e +Block 0012 [120]: b89e8162dfdc469e +Block 0012 [121]: e44a945e2c65f5d0 +Block 0012 [122]: af1e6328c8235052 +Block 0012 [123]: 1e841c1f63dea326 +Block 0012 [124]: 2db7659be0b50d50 +Block 0012 [125]: 50dccdf28a626d0e +Block 0012 [126]: d7c52028c281cd8c +Block 0012 [127]: e529fc89af20d455 +Block 0013 [ 0]: 3f79f1e30b5e7726 +Block 0013 [ 1]: 6b6c441852a1437f +Block 0013 [ 2]: 524c143552902847 +Block 0013 [ 3]: f9b339800d2d28cb +Block 0013 [ 4]: cf55d282c610193a +Block 0013 [ 5]: bf832f49274a60b8 +Block 0013 [ 6]: 45a4e7155816ac7e +Block 0013 [ 7]: e64bec13052f6941 +Block 0013 [ 8]: d6242b89535de78a +Block 0013 [ 9]: 918e2e27f15f721a +Block 0013 [ 10]: 31f4ea9a9d2857ff +Block 0013 [ 11]: 4c319ff476195c38 +Block 0013 [ 12]: d4355f6d48776116 +Block 0013 [ 13]: 93ffbeccc98cf397 +Block 0013 [ 14]: 25cfa21890d33df7 +Block 0013 [ 15]: cf5a579647ea0d8d +Block 0013 [ 16]: d727a14fcba6e5a0 +Block 0013 [ 17]: 6071de36f5e1028e +Block 0013 [ 18]: c93483002c5999dc +Block 0013 [ 19]: e58513e2865352fa +Block 0013 [ 20]: 03ca90a9f479c70e +Block 0013 [ 21]: e3a1a02a869e3683 +Block 0013 [ 22]: dacc0c5f28ba73cf +Block 0013 [ 23]: e1ae25441e581087 +Block 0013 [ 24]: 2e5a29a2d4985b3e +Block 0013 [ 25]: 6de6b2e0f421263f +Block 0013 [ 26]: 53dc84682df0c994 +Block 0013 [ 27]: f888d4cba517b460 +Block 0013 [ 28]: ff439db232b6fc9e +Block 0013 [ 29]: 7d58f7a83ac2c2e1 +Block 0013 [ 30]: c9b857272b2969d0 +Block 0013 [ 31]: 51855dab8e1357c6 +Block 0013 [ 32]: 16417e3b16743c74 +Block 0013 [ 33]: 0b32891249dc6a63 +Block 0013 [ 34]: a43b213b7bb8af74 +Block 0013 [ 35]: d4ed5f9f0696585a +Block 0013 [ 36]: e7082aad8d1d9fed +Block 0013 [ 37]: ccb027b71e7d70cf +Block 0013 [ 38]: 1908f7d226bd2374 +Block 0013 [ 39]: cd2c56282338cf35 +Block 0013 [ 40]: 465723b104c27515 +Block 0013 [ 41]: 6ebb42a9d3221d0d +Block 0013 [ 42]: 3edb4eacf01bbf7d +Block 0013 [ 43]: 86effc21d67d7342 +Block 0013 [ 44]: a18cb75bdb19e26b +Block 0013 [ 45]: 031ebbc38fca0940 +Block 0013 [ 46]: 9dca893dba6fabe7 +Block 0013 [ 47]: 16dc0a306d559c2c +Block 0013 [ 48]: 05d692d2e8d71369 +Block 0013 [ 49]: 7529565f8a9d4191 +Block 0013 [ 50]: 9dc457838464926f +Block 0013 [ 51]: 98dd7fe4c8308784 +Block 0013 [ 52]: 83f4a014c9dd1ebd +Block 0013 [ 53]: d1cf7b70be1c12a4 +Block 0013 [ 54]: df7fafe2f2b05c5c +Block 0013 [ 55]: 89f33833c8bb9933 +Block 0013 [ 56]: f8983927ab303c4f +Block 0013 [ 57]: ab385ef38e912d62 +Block 0013 [ 58]: 96b4e9e50cd94e26 +Block 0013 [ 59]: f8011b1cbea250a9 +Block 0013 [ 60]: 06cc68c9612a8547 +Block 0013 [ 61]: 9eb5fdb60d7dd9ff +Block 0013 [ 62]: 0ab426dd8341c5af +Block 0013 [ 63]: 6f5a384f223e4bda +Block 0013 [ 64]: 43a425b96623aad2 +Block 0013 [ 65]: 58a19d4d1e96aac2 +Block 0013 [ 66]: fefcab43331184f0 +Block 0013 [ 67]: 352a12578ddeebe8 +Block 0013 [ 68]: 5a8ba5c164aff53b +Block 0013 [ 69]: fd34095dec7f6a43 +Block 0013 [ 70]: 59ef6a514af304ee +Block 0013 [ 71]: b3f28a6b50e9eefc +Block 0013 [ 72]: f364142ad5f6f2a0 +Block 0013 [ 73]: 14c080411768f284 +Block 0013 [ 74]: 369ee6619b655c82 +Block 0013 [ 75]: 0e1b76fd96acdbe3 +Block 0013 [ 76]: 88616fdcf90cefd8 +Block 0013 [ 77]: a57f0eb8309ec5d2 +Block 0013 [ 78]: e46225f231033231 +Block 0013 [ 79]: 0f7bff3fb56060d0 +Block 0013 [ 80]: 864926034a3d58be +Block 0013 [ 81]: b4f4ff182a193fa9 +Block 0013 [ 82]: 42a9eda20b28ce4d +Block 0013 [ 83]: 48942f8c13152016 +Block 0013 [ 84]: b52c3f1d87a6b25e +Block 0013 [ 85]: c76ccf82bd8ace4a +Block 0013 [ 86]: eb6225fcafb3d553 +Block 0013 [ 87]: b38eeac9c4ed180b +Block 0013 [ 88]: 0e3726f21e5833e5 +Block 0013 [ 89]: 134bac0f131f4988 +Block 0013 [ 90]: 75d5e1d3db15b9ff +Block 0013 [ 91]: 7b85824230fe3a0c +Block 0013 [ 92]: ebd181d68697d465 +Block 0013 [ 93]: f197bfb66bc00c9f +Block 0013 [ 94]: 22bf2bfb071c6456 +Block 0013 [ 95]: d082ebcd3e459d4c +Block 0013 [ 96]: f44ca9dbaddfc73e +Block 0013 [ 97]: 0f4bd40e2efc8bcc +Block 0013 [ 98]: 9a177f8107cf3d7c +Block 0013 [ 99]: 35c4f26aad7c9e5b +Block 0013 [100]: 3a113403023d6b10 +Block 0013 [101]: 89daa9698721de5a +Block 0013 [102]: 0010e90c8d3451fb +Block 0013 [103]: ab8cea9f5a22f47b +Block 0013 [104]: abea62261666385e +Block 0013 [105]: c2fa2c669d87a44f +Block 0013 [106]: e97d4fee1a2ad6e5 +Block 0013 [107]: 39f4c7c19abf0718 +Block 0013 [108]: e902f38fd4a7f2e5 +Block 0013 [109]: 7883dc63e607eddf +Block 0013 [110]: d0d19d2d6ba8a80b +Block 0013 [111]: e87329db2f6aaf67 +Block 0013 [112]: efaabe1b2bf88c42 +Block 0013 [113]: f616ae68edba0dc3 +Block 0013 [114]: 58bf7d614b08eadd +Block 0013 [115]: b209c040f8a23484 +Block 0013 [116]: 1cde8c5201fb1b69 +Block 0013 [117]: 13b4333e71d45941 +Block 0013 [118]: 946305a39fe8b48b +Block 0013 [119]: 78a4c0885a91e21f +Block 0013 [120]: bc3fab5ac339e717 +Block 0013 [121]: 7d72b057bbb11f71 +Block 0013 [122]: a848b011f3c9bd93 +Block 0013 [123]: ba5bf9f6a7e1e947 +Block 0013 [124]: 4c929b7f7c4125d3 +Block 0013 [125]: c779bbe51677c684 +Block 0013 [126]: 7ce69656016bc8cc +Block 0013 [127]: 4060f77a3f4f375e +Block 0014 [ 0]: 36eb877e2cb684d6 +Block 0014 [ 1]: f9e8ab338f6c1e51 +Block 0014 [ 2]: 52faedc92b2e8b61 +Block 0014 [ 3]: 9bb1469da336c2a0 +Block 0014 [ 4]: 585fa4eec702f668 +Block 0014 [ 5]: fd7c1e2b7777ef25 +Block 0014 [ 6]: 2a7173209ca4ff4d +Block 0014 [ 7]: 0fcb08a71c391504 +Block 0014 [ 8]: 3b610bc5a7a224f5 +Block 0014 [ 9]: 25dd0a482210acc5 +Block 0014 [ 10]: 9694d8f19a8a0a91 +Block 0014 [ 11]: adfa18f2c0ca7f44 +Block 0014 [ 12]: 8ee2b1e1409e71bd +Block 0014 [ 13]: bea7a5183e79e431 +Block 0014 [ 14]: 98bd569af79c14f5 +Block 0014 [ 15]: b4dd008366f82442 +Block 0014 [ 16]: e9f3b4fc450e4d19 +Block 0014 [ 17]: bc9b583e1ee06e2c +Block 0014 [ 18]: 25cd0f442e01ed38 +Block 0014 [ 19]: edd96c9655cc3214 +Block 0014 [ 20]: 2b19a0e6b9ccb78a +Block 0014 [ 21]: 6b71b8e90c93cea0 +Block 0014 [ 22]: ad0b9f452be42586 +Block 0014 [ 23]: 52e78d83f9aee524 +Block 0014 [ 24]: c78174b11c8d5c1f +Block 0014 [ 25]: 0bd632f0fb2eae74 +Block 0014 [ 26]: 8c75e9efe3f75b38 +Block 0014 [ 27]: 712469cdfa1db23b +Block 0014 [ 28]: 625175cc28636029 +Block 0014 [ 29]: f7414204e9b1abb5 +Block 0014 [ 30]: cb2d8243eb03a7fd +Block 0014 [ 31]: b25d487501f1232d +Block 0014 [ 32]: 7ba19300c55e1518 +Block 0014 [ 33]: f380f524ba88d8fe +Block 0014 [ 34]: 23bdbd7438c69060 +Block 0014 [ 35]: a521773558402ff0 +Block 0014 [ 36]: dfdcb5870ffef2cc +Block 0014 [ 37]: c9fdcf18dc1f0529 +Block 0014 [ 38]: 2f9087ce5ac19e93 +Block 0014 [ 39]: 73b60c28230016b8 +Block 0014 [ 40]: f3ed5041b360449b +Block 0014 [ 41]: bbd4bc9021b7619d +Block 0014 [ 42]: ae9c40ba07422d8c +Block 0014 [ 43]: 09785605bd9eda18 +Block 0014 [ 44]: a6f7aa266270f957 +Block 0014 [ 45]: 051cdfcd704e0384 +Block 0014 [ 46]: 7387dbbf3e1a10c4 +Block 0014 [ 47]: 5dc0e14b24286a1f +Block 0014 [ 48]: e1d8bf350ff87374 +Block 0014 [ 49]: b9a99daa52530e06 +Block 0014 [ 50]: 116ffffb006a2144 +Block 0014 [ 51]: dd7a66d2e636a525 +Block 0014 [ 52]: 61db77a021ac3926 +Block 0014 [ 53]: 30d1f7744e647694 +Block 0014 [ 54]: 96fd74b22f5fcac1 +Block 0014 [ 55]: c1adc9f2b5a985ad +Block 0014 [ 56]: f09d8dacf51ec7c2 +Block 0014 [ 57]: aefd81d2e006dc85 +Block 0014 [ 58]: 9376229c3023edd2 +Block 0014 [ 59]: ae18700eda3b7964 +Block 0014 [ 60]: 8b997011c74aa16e +Block 0014 [ 61]: 4a552a9044f14799 +Block 0014 [ 62]: 9b5a9b4c5a5da0d0 +Block 0014 [ 63]: 3b8ee69a48ad75d5 +Block 0014 [ 64]: 87aec64397996f21 +Block 0014 [ 65]: 04eb7548c1fef388 +Block 0014 [ 66]: 6341ec25b8aa3747 +Block 0014 [ 67]: 35317eb9c4abfac9 +Block 0014 [ 68]: 45ea12041a15a084 +Block 0014 [ 69]: fda06c6db17ba115 +Block 0014 [ 70]: 7779d9b3b76283be +Block 0014 [ 71]: da844a2473775aac +Block 0014 [ 72]: 89f91c2c6564a50c +Block 0014 [ 73]: c8cd0aa7a3b1ddd7 +Block 0014 [ 74]: ff6abb5a4a485dad +Block 0014 [ 75]: d1ed559cae3e4b62 +Block 0014 [ 76]: 7b8437f83c6fc847 +Block 0014 [ 77]: 4e0be6962713d580 +Block 0014 [ 78]: 4443da814792ef38 +Block 0014 [ 79]: a93d0ea553d8a296 +Block 0014 [ 80]: a528a4bf080ac4c0 +Block 0014 [ 81]: 49dd9762b2f9aef2 +Block 0014 [ 82]: b2c920ce86a13d59 +Block 0014 [ 83]: 3dacedf3585ea447 +Block 0014 [ 84]: cbe8d2c6d0ad075a +Block 0014 [ 85]: a52b9f3aaa3b273c +Block 0014 [ 86]: ed2b0107316af4da +Block 0014 [ 87]: 5a10f265bb50b93d +Block 0014 [ 88]: 1417bf78895d5e7f +Block 0014 [ 89]: f5bcd9d996444e4d +Block 0014 [ 90]: 590307488b720fa3 +Block 0014 [ 91]: dea8e9d408b06dea +Block 0014 [ 92]: 872b059e9003b56b +Block 0014 [ 93]: 2ed43f98fd6f6254 +Block 0014 [ 94]: 93f57c98bd5b6cd7 +Block 0014 [ 95]: 9beeeb8e9207043f +Block 0014 [ 96]: dd54000038b5110d +Block 0014 [ 97]: 5332e79251d56378 +Block 0014 [ 98]: 5e48996dcaff378b +Block 0014 [ 99]: d56e7faf27afcffb +Block 0014 [100]: 90b6bed608144802 +Block 0014 [101]: 45cccf54d9317392 +Block 0014 [102]: 54ed8e4ac5dc2b76 +Block 0014 [103]: 885c812d8ff62a5f +Block 0014 [104]: bbcc2cb34eb38c9a +Block 0014 [105]: 9e9ebda71224a82f +Block 0014 [106]: 41b45afcdbc3c630 +Block 0014 [107]: 91d46218f582c264 +Block 0014 [108]: 0827c73740b561b5 +Block 0014 [109]: c4a54b4d6ec74a50 +Block 0014 [110]: 024ae95eaae719dc +Block 0014 [111]: 17117b346ffd2a35 +Block 0014 [112]: 39b7db4226a72f84 +Block 0014 [113]: 92886993615d1335 +Block 0014 [114]: 12b61372d0e851e0 +Block 0014 [115]: 8c4001f05b029c7c +Block 0014 [116]: 8a53cdb6444a882b +Block 0014 [117]: 3c685889fc62db28 +Block 0014 [118]: cfdc76e52e7c5f13 +Block 0014 [119]: f7f1a83420e11a14 +Block 0014 [120]: d5cb9b8ce8d28da4 +Block 0014 [121]: bed926b463fc5156 +Block 0014 [122]: a5f62e9940463b0a +Block 0014 [123]: a4089b6edc533caf +Block 0014 [124]: 097ac21fa0279d86 +Block 0014 [125]: 8c794c5f42e95e72 +Block 0014 [126]: d9d2a89c3ff25c4b +Block 0014 [127]: e012ba6c11d061f5 +Block 0015 [ 0]: fae64e566868810a +Block 0015 [ 1]: 8d81e940b129371d +Block 0015 [ 2]: 60106c5b4eb20b4c +Block 0015 [ 3]: 6e42f90ad23c62f6 +Block 0015 [ 4]: 131cc364e92de603 +Block 0015 [ 5]: de343b93a6d3549d +Block 0015 [ 6]: 1515a10f85cb86b3 +Block 0015 [ 7]: b57a75500f76cba3 +Block 0015 [ 8]: 75a2e082477a26e6 +Block 0015 [ 9]: 9a308ff19ea5aae9 +Block 0015 [ 10]: a8ad46a547e00b2f +Block 0015 [ 11]: 7275c3e38c70e7ff +Block 0015 [ 12]: 746ed2626d4cd88d +Block 0015 [ 13]: e922d7d439ec9044 +Block 0015 [ 14]: c0632b55bf466718 +Block 0015 [ 15]: ef8b572c9176d1f2 +Block 0015 [ 16]: f4492a45664b88f3 +Block 0015 [ 17]: 07527af74fabd39f +Block 0015 [ 18]: cb49229072c2db98 +Block 0015 [ 19]: 461026f699be3402 +Block 0015 [ 20]: b745dc7f8ebf58a0 +Block 0015 [ 21]: 194b7c920c12c491 +Block 0015 [ 22]: 1536ca06f172ea55 +Block 0015 [ 23]: 830173431c36eede +Block 0015 [ 24]: 463d0c62573022d6 +Block 0015 [ 25]: 62c887bed7ffa30b +Block 0015 [ 26]: ee75ec33cb8c4aa4 +Block 0015 [ 27]: 592d8ee4f8d69036 +Block 0015 [ 28]: b9a3ce12337d4c0f +Block 0015 [ 29]: 781e9fcad1891be8 +Block 0015 [ 30]: db46bad27e7e1dfe +Block 0015 [ 31]: 9028a7155a0860aa +Block 0015 [ 32]: a01a5ec2351afc02 +Block 0015 [ 33]: a09fb40edf104427 +Block 0015 [ 34]: 262fcbe6832677f2 +Block 0015 [ 35]: 5f52e7ce1df6560d +Block 0015 [ 36]: dc190299cc11093e +Block 0015 [ 37]: 34281d9238950010 +Block 0015 [ 38]: 225a27cf8bee7277 +Block 0015 [ 39]: 3429996a5c48f38d +Block 0015 [ 40]: c87e9a63ad2c0282 +Block 0015 [ 41]: 018b4e3e01fc9ecd +Block 0015 [ 42]: 392312f8091a3d85 +Block 0015 [ 43]: 7fd5794b59cd95fe +Block 0015 [ 44]: ef83133e4e2d939b +Block 0015 [ 45]: d0580c8013286eec +Block 0015 [ 46]: 5bbf1246d831f631 +Block 0015 [ 47]: 0054687cd3a0dec5 +Block 0015 [ 48]: 90ac0d297fa9aab7 +Block 0015 [ 49]: 51f36150003f7e04 +Block 0015 [ 50]: b9ef0b30c558aba6 +Block 0015 [ 51]: 460bc7e1538d62fd +Block 0015 [ 52]: 6d3e852ceeb68b69 +Block 0015 [ 53]: 568de03409ae5007 +Block 0015 [ 54]: c6ffdcfbeeaa12cb +Block 0015 [ 55]: 6a5e7db56071847c +Block 0015 [ 56]: d28c5793ae7d1d55 +Block 0015 [ 57]: 0267fd8e150f21be +Block 0015 [ 58]: 00bc5f653b17bf7b +Block 0015 [ 59]: 585da8b6ec306b61 +Block 0015 [ 60]: 1353061d1e353110 +Block 0015 [ 61]: 2fa207e0f1f0a407 +Block 0015 [ 62]: 7c977b733683ac75 +Block 0015 [ 63]: 241449dccd64fb26 +Block 0015 [ 64]: 338082d508dafcb0 +Block 0015 [ 65]: 3cd8e424bce5d327 +Block 0015 [ 66]: 31cce94299bf729a +Block 0015 [ 67]: f17f0248495e1a5b +Block 0015 [ 68]: 36e2da2618aa0127 +Block 0015 [ 69]: 38b639fb327e03b1 +Block 0015 [ 70]: a43510ced8f7dc89 +Block 0015 [ 71]: b3bfbbf1b59bbd75 +Block 0015 [ 72]: 75c1d4dff925a032 +Block 0015 [ 73]: 77c09a0b485faa19 +Block 0015 [ 74]: 8dd892fbb9ff328a +Block 0015 [ 75]: 017b4d0408cf7bbe +Block 0015 [ 76]: 51f3c7cba9a58139 +Block 0015 [ 77]: 049e4a5ccc4b17f9 +Block 0015 [ 78]: 19616ffc15a221e6 +Block 0015 [ 79]: 2ce8c0e5d2e7d1ab +Block 0015 [ 80]: 79c0d484fb10455e +Block 0015 [ 81]: a3fc63a5f8a9b9c0 +Block 0015 [ 82]: 9cfebe8a3d549467 +Block 0015 [ 83]: 09c06fe1b4c3a7c7 +Block 0015 [ 84]: 8607f6041ada778b +Block 0015 [ 85]: fae4e290100273e7 +Block 0015 [ 86]: fdd1e469396a400b +Block 0015 [ 87]: 4cd57f460af7a766 +Block 0015 [ 88]: 23321695a8adaf2e +Block 0015 [ 89]: fdfa218394a41fc8 +Block 0015 [ 90]: 9db89b71db54b466 +Block 0015 [ 91]: b405819d71bee318 +Block 0015 [ 92]: f7696c155cbb0ba0 +Block 0015 [ 93]: b5bee158592d57e7 +Block 0015 [ 94]: 618aa1003551b462 +Block 0015 [ 95]: b61d64015dc2a730 +Block 0015 [ 96]: 5b4387973c664b83 +Block 0015 [ 97]: c2fa9ee8ac6b02f9 +Block 0015 [ 98]: e3221b93bea4bf64 +Block 0015 [ 99]: 6dee17d482d317fd +Block 0015 [100]: 1130d6a3d3173623 +Block 0015 [101]: c9b57db857fdc466 +Block 0015 [102]: 9318a307bd7dd5df +Block 0015 [103]: f3efea82eb010ea7 +Block 0015 [104]: 835aa1bb7f95a2a6 +Block 0015 [105]: 97788be80f52b675 +Block 0015 [106]: 064691f59ec2de3d +Block 0015 [107]: 4aad4ab8889ac979 +Block 0015 [108]: 9f77af86a93272be +Block 0015 [109]: 57e46db473688315 +Block 0015 [110]: 9f45f229a6d63e5e +Block 0015 [111]: 37858db05cfa4789 +Block 0015 [112]: abe16cff88d854a9 +Block 0015 [113]: 85fef1d6f322d26c +Block 0015 [114]: 85558f7f6c6bf35d +Block 0015 [115]: 54be5379ce62b83b +Block 0015 [116]: f0427f7a71563307 +Block 0015 [117]: 695bd133f77e11a2 +Block 0015 [118]: 9efe3ed4696fdc1e +Block 0015 [119]: 703c4220f9092896 +Block 0015 [120]: ee71111a428823a2 +Block 0015 [121]: 2bdf0bc45eec47de +Block 0015 [122]: 50f379acec7ee7b8 +Block 0015 [123]: 6a7ce42b0a5ebc49 +Block 0015 [124]: 974e974bd88474c1 +Block 0015 [125]: d861a0a5c5c10163 +Block 0015 [126]: 73bdaf6e50134eb1 +Block 0015 [127]: acf7664666733c67 +Block 0016 [ 0]: 50ab0f9bfac24f78 +Block 0016 [ 1]: 76e94cfff68ea616 +Block 0016 [ 2]: c00150a5b14757e7 +Block 0016 [ 3]: 4d19657ab2083347 +Block 0016 [ 4]: 017ccdbd18f7aa76 +Block 0016 [ 5]: c8627a4acfcf9382 +Block 0016 [ 6]: 635afa6f665f6306 +Block 0016 [ 7]: 82a8a745b4d6d8ae +Block 0016 [ 8]: 4582bba135f3b4a1 +Block 0016 [ 9]: 526f1a88af7428bd +Block 0016 [ 10]: 9494aa25932ca80f +Block 0016 [ 11]: 90887f9ad9692795 +Block 0016 [ 12]: 967c01323dd819cc +Block 0016 [ 13]: b15b74896960da9a +Block 0016 [ 14]: b25030a5374f74da +Block 0016 [ 15]: e3383256ba6017ff +Block 0016 [ 16]: d999eb0ee0664b0c +Block 0016 [ 17]: f641eb0285a3c506 +Block 0016 [ 18]: 1b3bbbabcdb8314a +Block 0016 [ 19]: bb0fefad44cf0cac +Block 0016 [ 20]: e8e80497833606fc +Block 0016 [ 21]: dd7d61d1f3e68772 +Block 0016 [ 22]: 7ef78dd8add877e7 +Block 0016 [ 23]: 92a015aad5502ec8 +Block 0016 [ 24]: 4d31d23941318dd6 +Block 0016 [ 25]: e2559bbb689e5fb4 +Block 0016 [ 26]: e2503c10c55eaf2a +Block 0016 [ 27]: f903e0f1ac637eb5 +Block 0016 [ 28]: 5fa77cf36d36fc99 +Block 0016 [ 29]: b49c467b28d24b67 +Block 0016 [ 30]: c71141752046355f +Block 0016 [ 31]: 4f02b25bf2fbd626 +Block 0016 [ 32]: 266976c4945f8a20 +Block 0016 [ 33]: 4dff49abef037976 +Block 0016 [ 34]: 1db92cf72045c0ce +Block 0016 [ 35]: 646d8c11e8cc7da8 +Block 0016 [ 36]: d69609eed1e112eb +Block 0016 [ 37]: f71f70d33e21865e +Block 0016 [ 38]: 99723999d0b88330 +Block 0016 [ 39]: 602c4d8d6bc8f7d5 +Block 0016 [ 40]: 0675d32998c77081 +Block 0016 [ 41]: 74ec88c7c20a9ce9 +Block 0016 [ 42]: 2d6be9f55b35e386 +Block 0016 [ 43]: c5dceca8c3e9aa0e +Block 0016 [ 44]: ef7c553de2ac1b6e +Block 0016 [ 45]: ed1d4f23e7a0ec44 +Block 0016 [ 46]: ecaa70a863786230 +Block 0016 [ 47]: 6c00fb7c75083cba +Block 0016 [ 48]: 358ab6100cfadb0e +Block 0016 [ 49]: d355f128ad812a42 +Block 0016 [ 50]: 6e5ff1b32f8cd116 +Block 0016 [ 51]: b652b670ced34b15 +Block 0016 [ 52]: 869f55f7d310d958 +Block 0016 [ 53]: 1c7ab17e1b2a923c +Block 0016 [ 54]: 9bb5d4bcc6c5fb44 +Block 0016 [ 55]: abdd670dcbc1ab98 +Block 0016 [ 56]: 13f1ea2cd9968cf2 +Block 0016 [ 57]: 4468b4a8063832f4 +Block 0016 [ 58]: 5cd65db1b412d694 +Block 0016 [ 59]: 15ccb512736cd4f8 +Block 0016 [ 60]: ba3e10fd0ca3138b +Block 0016 [ 61]: da3c85d02e8eb749 +Block 0016 [ 62]: de0b8e8e36f82366 +Block 0016 [ 63]: 0842ec8f33175a3c +Block 0016 [ 64]: 2a1bc0208d7d4a97 +Block 0016 [ 65]: 16530cb323ff1d7d +Block 0016 [ 66]: 1f0966930be20b84 +Block 0016 [ 67]: bb9512a98ef21706 +Block 0016 [ 68]: bdd948ccde317cd6 +Block 0016 [ 69]: 7fa5e561bc345638 +Block 0016 [ 70]: 6fc7243a84e185dc +Block 0016 [ 71]: dfad6179cb99a475 +Block 0016 [ 72]: 9e61c0bb96277f9b +Block 0016 [ 73]: e6b08e6cad02b1cd +Block 0016 [ 74]: 78ac4aeb2e48dc4b +Block 0016 [ 75]: 6abc9082cae40c99 +Block 0016 [ 76]: 51a1fdb5e4afbb95 +Block 0016 [ 77]: 55740e7c226f47ba +Block 0016 [ 78]: d38187c139231aa1 +Block 0016 [ 79]: 9f8284a871165782 +Block 0016 [ 80]: 9e825895c153205a +Block 0016 [ 81]: 7e4c90935b6ffe4e +Block 0016 [ 82]: a357f20371f2a364 +Block 0016 [ 83]: 318e03f3f2513efb +Block 0016 [ 84]: 1c42a251389bd43a +Block 0016 [ 85]: 8564c0d088201c30 +Block 0016 [ 86]: 7fca97b124234e78 +Block 0016 [ 87]: b00bd077743cda70 +Block 0016 [ 88]: b055fd596a99aca0 +Block 0016 [ 89]: 34771a1332ffd9b4 +Block 0016 [ 90]: 78064a51b2f57bb7 +Block 0016 [ 91]: b6978318f72a3ccc +Block 0016 [ 92]: 3d3f08940ddfa044 +Block 0016 [ 93]: 87c148a2bcc7728f +Block 0016 [ 94]: e4cd764d8ab0deb1 +Block 0016 [ 95]: 549d8816dc2c1d5b +Block 0016 [ 96]: 0247cc6a27c0578c +Block 0016 [ 97]: 571f950746e01e76 +Block 0016 [ 98]: 900bf2c386989787 +Block 0016 [ 99]: 9e4c53d37c530595 +Block 0016 [100]: bb6db1a208af1e6a +Block 0016 [101]: b6cac57f894b24b7 +Block 0016 [102]: d16d7ef19e90d4bd +Block 0016 [103]: c8d8ef59dbe1a8c2 +Block 0016 [104]: c1f551eebbf00b0d +Block 0016 [105]: fe625b5dfd27d1f1 +Block 0016 [106]: d4aca3870d30cfa4 +Block 0016 [107]: 53b585bf2b9a34eb +Block 0016 [108]: e554344eab7dec31 +Block 0016 [109]: 8ca4ee2b6de70004 +Block 0016 [110]: 8612d6c8a635b35e +Block 0016 [111]: 494263004ad7e202 +Block 0016 [112]: 5e80b92e4d0d81e2 +Block 0016 [113]: c189db989da4db9a +Block 0016 [114]: 9fadfa6afccbbe8a +Block 0016 [115]: 6b69af4f59accb96 +Block 0016 [116]: 315bf00062219e81 +Block 0016 [117]: 471cc1fd1305a04a +Block 0016 [118]: 753f539eb4dd0e81 +Block 0016 [119]: 8927ac6207b8482a +Block 0016 [120]: 7f8216083c95518f +Block 0016 [121]: 8d5a275aabb839f2 +Block 0016 [122]: 53cdeeb793a608e9 +Block 0016 [123]: 1fb14ce52c620b71 +Block 0016 [124]: c37c9e2533a5c59e +Block 0016 [125]: 563255fb5ee7c5f7 +Block 0016 [126]: 46b2bc381f2d0cdb +Block 0016 [127]: 022b6a3f91aa7fe6 +Block 0017 [ 0]: f148c6ecfacf9073 +Block 0017 [ 1]: 4c2e5320c6a82272 +Block 0017 [ 2]: c85fa2b8cc946410 +Block 0017 [ 3]: 8641a7078f51c3bb +Block 0017 [ 4]: 1a1a5660deb38c86 +Block 0017 [ 5]: 9f9021e30fef3113 +Block 0017 [ 6]: 162b92533a701e91 +Block 0017 [ 7]: 1ff3c3be2ca424fc +Block 0017 [ 8]: 9863521a2fcc57d3 +Block 0017 [ 9]: 48a8854bcaf7a038 +Block 0017 [ 10]: 146063d72bc22e43 +Block 0017 [ 11]: 24df9b1f4ea286a8 +Block 0017 [ 12]: 2790a76d3c1763b7 +Block 0017 [ 13]: 1bc7152d8e234249 +Block 0017 [ 14]: d8e02822fd457154 +Block 0017 [ 15]: 70ceee9275bfacb2 +Block 0017 [ 16]: 9d3772a593d4dbcd +Block 0017 [ 17]: 422e9bfe5dc92050 +Block 0017 [ 18]: 60e0d65beab7c333 +Block 0017 [ 19]: 236ec0961a3ec888 +Block 0017 [ 20]: 370f39ef4114dc14 +Block 0017 [ 21]: d84485b6ed907549 +Block 0017 [ 22]: d84b2719fdea3830 +Block 0017 [ 23]: afabab6a0aef3b37 +Block 0017 [ 24]: b20c3789e2428092 +Block 0017 [ 25]: fe219a3fccb3f109 +Block 0017 [ 26]: 49a2b15d29d94d35 +Block 0017 [ 27]: a8a33c545ca0a806 +Block 0017 [ 28]: 87ee050651ec250c +Block 0017 [ 29]: cf2d7d720281726d +Block 0017 [ 30]: 39c95dd1a0cc479e +Block 0017 [ 31]: bf7ba9a85a58dfeb +Block 0017 [ 32]: 8a58d87bc1d64e80 +Block 0017 [ 33]: 1c1e5872a341c842 +Block 0017 [ 34]: f6ed8ebe2c5fb8f7 +Block 0017 [ 35]: 204e8c80cb442cf6 +Block 0017 [ 36]: 439feed11ebdc53d +Block 0017 [ 37]: f2a15c2e5e9203f9 +Block 0017 [ 38]: fdb84ef6548b0d53 +Block 0017 [ 39]: 27eabee46992a24b +Block 0017 [ 40]: 3d85395558467bef +Block 0017 [ 41]: ee324a06a5df5c58 +Block 0017 [ 42]: a22120d5f734e984 +Block 0017 [ 43]: 2bc5053e90ba8225 +Block 0017 [ 44]: e09f8948fbf44b20 +Block 0017 [ 45]: 896d207c32bd6b2d +Block 0017 [ 46]: 7bfa2e74b6011818 +Block 0017 [ 47]: 0889d124b7c363aa +Block 0017 [ 48]: b8ce5f77da6250aa +Block 0017 [ 49]: 7411129130218a47 +Block 0017 [ 50]: 37bdb739c55b5dd0 +Block 0017 [ 51]: 539e3e5695d9132e +Block 0017 [ 52]: d45f10156352999a +Block 0017 [ 53]: 3589cd477c5dec79 +Block 0017 [ 54]: 0ed10a28987665fc +Block 0017 [ 55]: 8eb3aaf7cb073a56 +Block 0017 [ 56]: f025d1b5eff402b3 +Block 0017 [ 57]: 6f5327448591fb37 +Block 0017 [ 58]: f530dcea50113637 +Block 0017 [ 59]: 75d2d8f0b0697456 +Block 0017 [ 60]: 8bd10f66b3aebaca +Block 0017 [ 61]: 6f93760f7113d397 +Block 0017 [ 62]: 42e8504c969a9ca3 +Block 0017 [ 63]: d122bf99d1f2738a +Block 0017 [ 64]: 050f1ef18fe956dd +Block 0017 [ 65]: 7f9a0b2a550f4886 +Block 0017 [ 66]: c211410f6f6346b7 +Block 0017 [ 67]: d21fac80ef0580f7 +Block 0017 [ 68]: 313089c250c94891 +Block 0017 [ 69]: 5b8c12ab6f45d396 +Block 0017 [ 70]: 0cc757071306a08c +Block 0017 [ 71]: 0cd18b8157d80d65 +Block 0017 [ 72]: 5378531ce24a9fe0 +Block 0017 [ 73]: 619ac127f25314b8 +Block 0017 [ 74]: 289666e9273cd9cf +Block 0017 [ 75]: 9d683046f40fd118 +Block 0017 [ 76]: 48056be7488a4d3b +Block 0017 [ 77]: 4cee9208e330d9da +Block 0017 [ 78]: 531b8009a08f8667 +Block 0017 [ 79]: bd5736dfe9c65709 +Block 0017 [ 80]: e9386f17671521bc +Block 0017 [ 81]: 640ff74bd3f62e82 +Block 0017 [ 82]: 2d298c4e677a4ae6 +Block 0017 [ 83]: 1b8df78a8d84216f +Block 0017 [ 84]: 9933fca3997cf107 +Block 0017 [ 85]: 08e19896c2ef82b5 +Block 0017 [ 86]: f55bae80ac972a6c +Block 0017 [ 87]: ebc1fdd921f50518 +Block 0017 [ 88]: c526c7fff85c0cd6 +Block 0017 [ 89]: 958988f409748aa8 +Block 0017 [ 90]: 9f53bfc38a3f99f8 +Block 0017 [ 91]: 30cb279e1a4180b0 +Block 0017 [ 92]: 68cbb795935906b6 +Block 0017 [ 93]: bbe023cd06ba4bec +Block 0017 [ 94]: ba0b431efd7f641d +Block 0017 [ 95]: 7f830d88ec16d7c7 +Block 0017 [ 96]: f51bc5bb8e0f60f3 +Block 0017 [ 97]: 6a090a16ea0664a5 +Block 0017 [ 98]: b60a6b89b78d5a41 +Block 0017 [ 99]: 3ee08774310d4b7f +Block 0017 [100]: 8cf3a2caa05293ee +Block 0017 [101]: 029abaacc0f9e5ec +Block 0017 [102]: aa5b96c1138bc2fb +Block 0017 [103]: 33f5ffa151ca2c41 +Block 0017 [104]: 723b07282d65a43a +Block 0017 [105]: 05d3f744eb0afc52 +Block 0017 [106]: 04d5d592022801dd +Block 0017 [107]: 3a85abb4dae37695 +Block 0017 [108]: 64930e7129ed9f6f +Block 0017 [109]: 569521d11e337955 +Block 0017 [110]: 0019d5e39e6101db +Block 0017 [111]: 7bb63a5d60fe40b7 +Block 0017 [112]: 086e09b78786e706 +Block 0017 [113]: a82a6aaa0d0e37c5 +Block 0017 [114]: d202447290bdfa0e +Block 0017 [115]: 50f4ac3092a59fe8 +Block 0017 [116]: 607d6f205e9684f8 +Block 0017 [117]: 2f0fcf52aa5c84fe +Block 0017 [118]: 71497f707f6c2992 +Block 0017 [119]: 6488988f6a29f694 +Block 0017 [120]: 9b1841ebe4358b52 +Block 0017 [121]: de02ad91f6ff73e7 +Block 0017 [122]: da7a221d3a007196 +Block 0017 [123]: e15636f251d68894 +Block 0017 [124]: c737efef4be1c6cd +Block 0017 [125]: bec2c5eb4b1f4b1f +Block 0017 [126]: 1bff0563b0dbfffb +Block 0017 [127]: e09006a90e6ead01 +Block 0018 [ 0]: faa545eff119cfb9 +Block 0018 [ 1]: 95d936643121d1da +Block 0018 [ 2]: ae713aa879b76334 +Block 0018 [ 3]: 2db08b3dc9fdb7be +Block 0018 [ 4]: 63485723e7e088b1 +Block 0018 [ 5]: a8b1ff1d0d8ad0fc +Block 0018 [ 6]: 157c01d987bcf4f6 +Block 0018 [ 7]: e9d5737671f2fc98 +Block 0018 [ 8]: 08931d6bba1ec789 +Block 0018 [ 9]: ecd9633e941073ea +Block 0018 [ 10]: 27850a0730f28ddf +Block 0018 [ 11]: df919fb65835d9d0 +Block 0018 [ 12]: be70c1c2f80a744f +Block 0018 [ 13]: 5f42037e0810283e +Block 0018 [ 14]: 1fa0a087aca0d0f5 +Block 0018 [ 15]: 88850bd42d42433c +Block 0018 [ 16]: 4c351ab8ac31727b +Block 0018 [ 17]: 032e362e9961c2c0 +Block 0018 [ 18]: a46fd3113d1903f0 +Block 0018 [ 19]: 76df2ea4d4fc4cd3 +Block 0018 [ 20]: 6360aef426b20c5f +Block 0018 [ 21]: c6c75e30d3125b04 +Block 0018 [ 22]: 2b4604dcc9fa89f0 +Block 0018 [ 23]: 71809018e3f08fd1 +Block 0018 [ 24]: eae38831b0434502 +Block 0018 [ 25]: 12354e8863578f73 +Block 0018 [ 26]: cc67649ed524fcda +Block 0018 [ 27]: f3fa35e89b0a0628 +Block 0018 [ 28]: dd4b39ce157c3917 +Block 0018 [ 29]: 79b3eac67611c5b3 +Block 0018 [ 30]: 18d646a35047896f +Block 0018 [ 31]: 7ad67c7909c4214a +Block 0018 [ 32]: 0f85a71cea5458fb +Block 0018 [ 33]: 5a496c5b9a42a99e +Block 0018 [ 34]: f41955d00a6cb89b +Block 0018 [ 35]: 6979ed134db972e2 +Block 0018 [ 36]: c52bc00afcba0bd5 +Block 0018 [ 37]: 0b593fa777b11fdc +Block 0018 [ 38]: ec522ff3dbdc5727 +Block 0018 [ 39]: 5d3c6969d329ff41 +Block 0018 [ 40]: 9c3eee30b62c351c +Block 0018 [ 41]: a5e4421accee4716 +Block 0018 [ 42]: 2dd1bbb8a07019c1 +Block 0018 [ 43]: be3f1ebb698a80fa +Block 0018 [ 44]: 25f84725c715ba2b +Block 0018 [ 45]: de0fa263fc4ef327 +Block 0018 [ 46]: 3309df9d4cab5b46 +Block 0018 [ 47]: 191d6e408413ccc2 +Block 0018 [ 48]: 4ffa07c911bd50b1 +Block 0018 [ 49]: 51513298dcb7e64f +Block 0018 [ 50]: bd61e5ebbb03d888 +Block 0018 [ 51]: 113fd47c82d2bfbc +Block 0018 [ 52]: 7ebc5acf30a5427b +Block 0018 [ 53]: 401178ea14ff6343 +Block 0018 [ 54]: 3dd4c60b0f20b1a0 +Block 0018 [ 55]: 24bec1bc4a96ebeb +Block 0018 [ 56]: dd6f9948397d00f7 +Block 0018 [ 57]: 6e7d7f79b6f68812 +Block 0018 [ 58]: 1ee287e74910a6fc +Block 0018 [ 59]: 32af1d9c9b8b5759 +Block 0018 [ 60]: f55d837645ddc363 +Block 0018 [ 61]: ee8fcf0ba4de85e4 +Block 0018 [ 62]: 0389e54df125e829 +Block 0018 [ 63]: 7b3147558a74ae2b +Block 0018 [ 64]: b3e867428af1fef8 +Block 0018 [ 65]: 3335faa99d817c04 +Block 0018 [ 66]: 9c451ddf0a477fc3 +Block 0018 [ 67]: 248deb6f91ea029a +Block 0018 [ 68]: 9505f628226f2289 +Block 0018 [ 69]: f2bc362d1106f544 +Block 0018 [ 70]: 19a8d07be37f7f36 +Block 0018 [ 71]: c8a3e7b320ee2940 +Block 0018 [ 72]: 20ad585907ffe654 +Block 0018 [ 73]: e5035ad9e307c077 +Block 0018 [ 74]: dbbb5bb28adecaa3 +Block 0018 [ 75]: e036b59cd6ebbca7 +Block 0018 [ 76]: dbf0ead323d11f90 +Block 0018 [ 77]: 32f54a06d8aed030 +Block 0018 [ 78]: 3130833bfebc3fa1 +Block 0018 [ 79]: 3afd1ffe68ed72be +Block 0018 [ 80]: 7ee64d0db46abd24 +Block 0018 [ 81]: 1aebcb1924869cd3 +Block 0018 [ 82]: ede2f00caa0a1709 +Block 0018 [ 83]: c20e575ac91f9e57 +Block 0018 [ 84]: 9895a20bc7b8ceb6 +Block 0018 [ 85]: a4568ccf1f27ca68 +Block 0018 [ 86]: 38e5616cefcb46dc +Block 0018 [ 87]: c8b38ec003578587 +Block 0018 [ 88]: 1558b927e2b931ff +Block 0018 [ 89]: 5f1573189ec111a8 +Block 0018 [ 90]: 744851f93a97bfea +Block 0018 [ 91]: f43418a1064d0e4b +Block 0018 [ 92]: 8f5a287077430279 +Block 0018 [ 93]: d57f9b51bb604f0e +Block 0018 [ 94]: fb3569fb2c75a1db +Block 0018 [ 95]: 698fe004d6cfbb9e +Block 0018 [ 96]: 3d16340d04a7867e +Block 0018 [ 97]: 4f12b922e3535727 +Block 0018 [ 98]: e322253e8d863075 +Block 0018 [ 99]: 70a9f11b9df32318 +Block 0018 [100]: 7b18fa5540acc374 +Block 0018 [101]: dcc69cc272dc099c +Block 0018 [102]: 79dddaee86527df3 +Block 0018 [103]: 71bde3173831260e +Block 0018 [104]: 553a53f6947f6ac8 +Block 0018 [105]: 385427965d6dd5c4 +Block 0018 [106]: 27c9cf044489d353 +Block 0018 [107]: 6c531adefac2ea14 +Block 0018 [108]: f484b2f5da906611 +Block 0018 [109]: 653af921e8b2dbd6 +Block 0018 [110]: 0613e26bb5977c9c +Block 0018 [111]: 2739f8817b25d1c2 +Block 0018 [112]: a561daf1a53fca8c +Block 0018 [113]: 0222fce2fd94825d +Block 0018 [114]: ff6fc60ed882c744 +Block 0018 [115]: 128a12162a13f8ba +Block 0018 [116]: b6ee7893fe13a3a2 +Block 0018 [117]: eca30b64cd3fe660 +Block 0018 [118]: d1e97f13d096b037 +Block 0018 [119]: 24010b30f6f9e86e +Block 0018 [120]: 3ec7a219f8ad7f02 +Block 0018 [121]: 921f39d9d108de43 +Block 0018 [122]: 99d4628829193a58 +Block 0018 [123]: 64edb398a333656d +Block 0018 [124]: eddc6a51f7ace163 +Block 0018 [125]: 64929280d38ce455 +Block 0018 [126]: 03510f854d5915aa +Block 0018 [127]: ee55ebedae2bcfee +Block 0019 [ 0]: 51156b1e59b20401 +Block 0019 [ 1]: a0cfc6bae59d1b2e +Block 0019 [ 2]: 74b5c25d0f7ab4b5 +Block 0019 [ 3]: 1c914ed0a727b1d0 +Block 0019 [ 4]: 72c91b18095608c3 +Block 0019 [ 5]: 715a5de0af7d9766 +Block 0019 [ 6]: 09d3d606f47b011d +Block 0019 [ 7]: 16c20f8f77c792fe +Block 0019 [ 8]: b3273069a0e10f98 +Block 0019 [ 9]: da691a5910c208e2 +Block 0019 [ 10]: cbf00e60d6a3de8d +Block 0019 [ 11]: 6278b92100223543 +Block 0019 [ 12]: 8d914b69ccc4fddb +Block 0019 [ 13]: 8d7764485ef210c7 +Block 0019 [ 14]: 38825b734f595024 +Block 0019 [ 15]: e3156907a6e20477 +Block 0019 [ 16]: 513e73ce59181e8b +Block 0019 [ 17]: 9a07ef1bb6ba4098 +Block 0019 [ 18]: 814cc7d9baa18105 +Block 0019 [ 19]: 930ff0e7542c339b +Block 0019 [ 20]: 13b4c760a11bd633 +Block 0019 [ 21]: 271e942aa0d31858 +Block 0019 [ 22]: b78d78f9b71e233a +Block 0019 [ 23]: 150cda71b9d5693b +Block 0019 [ 24]: bdf8115d41b0a85b +Block 0019 [ 25]: 3c3135d676d3c5f3 +Block 0019 [ 26]: 63a686736848d856 +Block 0019 [ 27]: ae8e8caf724b1a86 +Block 0019 [ 28]: 62b0cef1adc0882c +Block 0019 [ 29]: bd890c5b29317812 +Block 0019 [ 30]: 6ae86cf1fbf29ecc +Block 0019 [ 31]: 2363bbb76324e527 +Block 0019 [ 32]: e2155105647d2c32 +Block 0019 [ 33]: d751ac49af5305b6 +Block 0019 [ 34]: 87cd90883e5f4e4a +Block 0019 [ 35]: 1ea924e56f888b93 +Block 0019 [ 36]: c51aa77e288a938a +Block 0019 [ 37]: 08b4a2c85b40d94e +Block 0019 [ 38]: d6aa32c1ef08d3c2 +Block 0019 [ 39]: 77c3660ec5353f19 +Block 0019 [ 40]: 07c9e33daeb74568 +Block 0019 [ 41]: 9bd8f6448761708a +Block 0019 [ 42]: eb874940d021d769 +Block 0019 [ 43]: 6151f0ede0583917 +Block 0019 [ 44]: fcbb88e020140621 +Block 0019 [ 45]: 0e532e3d4bc81dc0 +Block 0019 [ 46]: 2da87c43744e95e4 +Block 0019 [ 47]: a65ccd771e8f10a1 +Block 0019 [ 48]: cd3fe32ccd77935b +Block 0019 [ 49]: 37aa26376d20f6ae +Block 0019 [ 50]: 1bf80fbff942c050 +Block 0019 [ 51]: 76b51d1eb128cbe5 +Block 0019 [ 52]: 8788a0ccf97411ae +Block 0019 [ 53]: 0628b1237ec140b3 +Block 0019 [ 54]: b2147e4a8c83871e +Block 0019 [ 55]: 181d78bd66418200 +Block 0019 [ 56]: 431ff7c40ae96867 +Block 0019 [ 57]: 88548a84877077df +Block 0019 [ 58]: 378d340893c16a54 +Block 0019 [ 59]: 2151705d33bf835a +Block 0019 [ 60]: fc79c670c5413994 +Block 0019 [ 61]: 16c5bd79dbfa8967 +Block 0019 [ 62]: da634c6f7a83f03a +Block 0019 [ 63]: b420552b64b33783 +Block 0019 [ 64]: 06ac23a0f3b74e58 +Block 0019 [ 65]: a7327fee9ac0294f +Block 0019 [ 66]: f191e1ad2217703a +Block 0019 [ 67]: e53781ab62f0818c +Block 0019 [ 68]: f72f0cd8463f8228 +Block 0019 [ 69]: ccf24473c682f82b +Block 0019 [ 70]: 4cf42b53bec904cc +Block 0019 [ 71]: ed68232d9606760e +Block 0019 [ 72]: 4ee6da37428d239c +Block 0019 [ 73]: eb519e362a49f472 +Block 0019 [ 74]: 1cb3b7e393614967 +Block 0019 [ 75]: 7498007ec5defa40 +Block 0019 [ 76]: eb29564f5a80ce82 +Block 0019 [ 77]: ab56822a376bec75 +Block 0019 [ 78]: e646e9ced0205651 +Block 0019 [ 79]: cb56383cab821219 +Block 0019 [ 80]: d983a7932f436ca4 +Block 0019 [ 81]: 5a4dc7700cfe9515 +Block 0019 [ 82]: ec041f5ca30771db +Block 0019 [ 83]: 79d89b4394c9f93f +Block 0019 [ 84]: df61390b9e6f09bb +Block 0019 [ 85]: ead82beea5c58374 +Block 0019 [ 86]: 420ec98edea624fb +Block 0019 [ 87]: 82c6ba1d1d626c10 +Block 0019 [ 88]: 5d9505914adf649b +Block 0019 [ 89]: 8772eb7b04f29a02 +Block 0019 [ 90]: 8877a6e531032495 +Block 0019 [ 91]: b959c48e2c45a09f +Block 0019 [ 92]: 98bade59b92f14df +Block 0019 [ 93]: d80e8b763aa82afe +Block 0019 [ 94]: 90a62a4170b0afd9 +Block 0019 [ 95]: 4b6592da812760c2 +Block 0019 [ 96]: a121ecfb71c1eb1c +Block 0019 [ 97]: db1a767dcea7a999 +Block 0019 [ 98]: e5da01ee35c87e2e +Block 0019 [ 99]: 94ef21581c109698 +Block 0019 [100]: 870d7a1b74517e73 +Block 0019 [101]: 21193745713987d4 +Block 0019 [102]: 9a1e85064a182266 +Block 0019 [103]: 1f9124bb0d2cb4d2 +Block 0019 [104]: ff6902372d42a1a3 +Block 0019 [105]: c98b73edf2c207c7 +Block 0019 [106]: b0f6926ce2b9ce80 +Block 0019 [107]: 0e908f07eafb7898 +Block 0019 [108]: 8cbc193b329811d2 +Block 0019 [109]: d664f2d6272d3043 +Block 0019 [110]: 9c8450d1be037ef3 +Block 0019 [111]: cda6a04729fee455 +Block 0019 [112]: 1b96fd0c0e48ee86 +Block 0019 [113]: 4edfd43166ff8978 +Block 0019 [114]: 69d814cf195ff166 +Block 0019 [115]: 93656f22239260af +Block 0019 [116]: 6bbcaeff4a7a65a5 +Block 0019 [117]: 597cfeb021b3a839 +Block 0019 [118]: 07630947c089ea53 +Block 0019 [119]: 54544623c47a5e06 +Block 0019 [120]: f7acde6ac2995642 +Block 0019 [121]: 9d72c9bd012683a5 +Block 0019 [122]: 9c79f0e0bcaa18dc +Block 0019 [123]: 7cabc98e881b8fd5 +Block 0019 [124]: ac3a9a98ad95aae3 +Block 0019 [125]: 229a698070456d46 +Block 0019 [126]: f32db81398e49b5c +Block 0019 [127]: 83ab49dd8530b868 +Block 0020 [ 0]: e85992534b52b52e +Block 0020 [ 1]: f61354ae69bf8266 +Block 0020 [ 2]: 2189370fe268fc96 +Block 0020 [ 3]: 3ac2683aeb082adc +Block 0020 [ 4]: 6675872a5f886c76 +Block 0020 [ 5]: 594cc7787962d384 +Block 0020 [ 6]: 22d19fcad3648a3b +Block 0020 [ 7]: 7cbc8c3dec075825 +Block 0020 [ 8]: ee9f47c460c21add +Block 0020 [ 9]: 3641c274622ad42a +Block 0020 [ 10]: d51e286ed408b52f +Block 0020 [ 11]: b6e079c56147eb83 +Block 0020 [ 12]: f1c571e5c2dd437a +Block 0020 [ 13]: 170fcb05bed6e518 +Block 0020 [ 14]: 993c03f74b4f2f0e +Block 0020 [ 15]: 61cf7ac5747d9e17 +Block 0020 [ 16]: 2a8f513411963e3b +Block 0020 [ 17]: 4210c7f3dca178ef +Block 0020 [ 18]: 685c12a359327905 +Block 0020 [ 19]: cbd3fe04536f559f +Block 0020 [ 20]: 48ca877575d6674e +Block 0020 [ 21]: 271824743d2baff8 +Block 0020 [ 22]: ddf15d645723b79b +Block 0020 [ 23]: 71ec825ec5920c7c +Block 0020 [ 24]: c41f5cac7e0cf7ca +Block 0020 [ 25]: 7239a2d67055bcd1 +Block 0020 [ 26]: d773129866bcca99 +Block 0020 [ 27]: 567e5380bf4023b6 +Block 0020 [ 28]: 2265061bedd0f5e2 +Block 0020 [ 29]: ae15b953f2f6075c +Block 0020 [ 30]: 3197600cca3ecc16 +Block 0020 [ 31]: 52331e2bdf3d7f35 +Block 0020 [ 32]: cc661f4d0d802264 +Block 0020 [ 33]: 4abb5d426a4c05bb +Block 0020 [ 34]: 4b4ab952f30f21d8 +Block 0020 [ 35]: e47bf862aabe3e43 +Block 0020 [ 36]: a56438e599749cff +Block 0020 [ 37]: 7e88f730db0f5a51 +Block 0020 [ 38]: 02bd9a4ecd19dca1 +Block 0020 [ 39]: 789f62a6a44aa6a0 +Block 0020 [ 40]: 608cfe89b7c64305 +Block 0020 [ 41]: 9b0a9e3421114bf1 +Block 0020 [ 42]: 550d3f8d2bd63adc +Block 0020 [ 43]: 8733fcf078850b5d +Block 0020 [ 44]: 9866076a077c6fb5 +Block 0020 [ 45]: 6fb0147fa3e62c27 +Block 0020 [ 46]: a99f21e68aee3e65 +Block 0020 [ 47]: 589f8ff0158d1a23 +Block 0020 [ 48]: 31bcc76a59d047c9 +Block 0020 [ 49]: 9acdc9ab75f3a2d5 +Block 0020 [ 50]: 6868dfabd0fcf609 +Block 0020 [ 51]: e8aeaa973386a2ae +Block 0020 [ 52]: b0d60c3ddd71dc28 +Block 0020 [ 53]: d3d1cd9f303d3566 +Block 0020 [ 54]: 135d83379d63f3d8 +Block 0020 [ 55]: 265efc06899b4ed7 +Block 0020 [ 56]: c3895da03fa54b01 +Block 0020 [ 57]: bc0827502c9f333d +Block 0020 [ 58]: 335cf97881ed15af +Block 0020 [ 59]: 6b2bf00fb0fddd51 +Block 0020 [ 60]: 79fc0cf1f58be11c +Block 0020 [ 61]: 475e5b6f80b01e2b +Block 0020 [ 62]: 5f75c519a34aabc6 +Block 0020 [ 63]: 78c40a13e5360eac +Block 0020 [ 64]: d5baae967881b47f +Block 0020 [ 65]: f5f084c072b3cb4d +Block 0020 [ 66]: a68f891b7c71f817 +Block 0020 [ 67]: 562984e5d6215c7c +Block 0020 [ 68]: 6d7bd3c4f1a4ca8b +Block 0020 [ 69]: 5e730c9b9dc46542 +Block 0020 [ 70]: a4960b310ef10938 +Block 0020 [ 71]: 63764644a4183792 +Block 0020 [ 72]: 10822c35fef06151 +Block 0020 [ 73]: e5405919f5c8c53b +Block 0020 [ 74]: 58bb97e26251352b +Block 0020 [ 75]: dfd2ba15930180ef +Block 0020 [ 76]: 4b94d59c8069f5f4 +Block 0020 [ 77]: 2783164757466e67 +Block 0020 [ 78]: 82a63e11c945edd9 +Block 0020 [ 79]: ded3949304f2233a +Block 0020 [ 80]: c63e9a32698d7505 +Block 0020 [ 81]: 05ad1f94bc351c70 +Block 0020 [ 82]: 5491ac37abc73f1a +Block 0020 [ 83]: 164f3bb7d7765b93 +Block 0020 [ 84]: eca8c78b3c984428 +Block 0020 [ 85]: 5b9fabc93ad5d131 +Block 0020 [ 86]: 7fba9cf868e3f45f +Block 0020 [ 87]: c381821248a668c9 +Block 0020 [ 88]: 2f587c8807d8b617 +Block 0020 [ 89]: 459ca25197ebb81e +Block 0020 [ 90]: 3e5affb81962a6dd +Block 0020 [ 91]: b070badc22c2dbb4 +Block 0020 [ 92]: 0733d88dca0ba766 +Block 0020 [ 93]: 902b8fbc9e12f340 +Block 0020 [ 94]: 7bc7921592e9a5ad +Block 0020 [ 95]: a8fd1807f6d40c01 +Block 0020 [ 96]: 5ae0ab72dc04eedd +Block 0020 [ 97]: fa802d4a9821620e +Block 0020 [ 98]: 8baba494675f4156 +Block 0020 [ 99]: ff5ec2b3a0d5fcdf +Block 0020 [100]: a6460e7d5190118c +Block 0020 [101]: 4444827f3408cb94 +Block 0020 [102]: fb0b35803100ae19 +Block 0020 [103]: 9eed6e1a3abadd09 +Block 0020 [104]: 9b7b0600d055aeb2 +Block 0020 [105]: 77864bc48531546a +Block 0020 [106]: a53237e754c26b62 +Block 0020 [107]: 72bbd37fa894c2f0 +Block 0020 [108]: ed3eb4b2d686977d +Block 0020 [109]: 8d89e405248d512d +Block 0020 [110]: d8fb95216b5e0fd4 +Block 0020 [111]: 33bae91d35125e6d +Block 0020 [112]: 7117375e729dc431 +Block 0020 [113]: 68c443e213bb91c3 +Block 0020 [114]: 7ac856210ec3cfa4 +Block 0020 [115]: dea14ee7fed209f1 +Block 0020 [116]: 1d7dfcc3060859c8 +Block 0020 [117]: 049728f7bddf2f37 +Block 0020 [118]: b2d10f09f53a3be9 +Block 0020 [119]: 3149a2ec78e05acc +Block 0020 [120]: b2b2e4015754424d +Block 0020 [121]: 09622de722d9b4c0 +Block 0020 [122]: ed71dda8b87529c9 +Block 0020 [123]: 53e64f56cef18c5a +Block 0020 [124]: d9c6011c8605417c +Block 0020 [125]: 0c36da5b8af617e3 +Block 0020 [126]: eae8ed3d7d9bfcee +Block 0020 [127]: 9e92d4f5cc6930b8 +Block 0021 [ 0]: 44985db9e0d0d5cd +Block 0021 [ 1]: 7956b565c894de54 +Block 0021 [ 2]: f6e635f3c0db6f2d +Block 0021 [ 3]: fa78335d39a6d106 +Block 0021 [ 4]: cd831adb42c2eeba +Block 0021 [ 5]: dce9ca3d0982e302 +Block 0021 [ 6]: a9f3c863d73ddcf3 +Block 0021 [ 7]: 5b2b8053f70e71d6 +Block 0021 [ 8]: 926e3e83f2779add +Block 0021 [ 9]: 7d12ee3c87a7e354 +Block 0021 [ 10]: 244574f45210fa3c +Block 0021 [ 11]: 9ca1f0da6e24c4ed +Block 0021 [ 12]: de23064711375377 +Block 0021 [ 13]: e6b3575a0d6530ec +Block 0021 [ 14]: cb37b6cb29c790ea +Block 0021 [ 15]: 0d7394ad50729ec1 +Block 0021 [ 16]: ee4511db89da128d +Block 0021 [ 17]: 60c263f7e0943e58 +Block 0021 [ 18]: 74ff35474102dd03 +Block 0021 [ 19]: fe8da1de78cae60a +Block 0021 [ 20]: 8378dc12ff0411a0 +Block 0021 [ 21]: ef43399ed115049b +Block 0021 [ 22]: ce60008f30dc972b +Block 0021 [ 23]: fd48adaefb079b60 +Block 0021 [ 24]: 00dc34d2f5e9e336 +Block 0021 [ 25]: a168e8e31ce93d72 +Block 0021 [ 26]: b206314a6d3852e1 +Block 0021 [ 27]: 32945a1b34ccf798 +Block 0021 [ 28]: b6a2d70441e25d74 +Block 0021 [ 29]: 5189961081aedaf3 +Block 0021 [ 30]: d089d9ae0e6ac5ed +Block 0021 [ 31]: a4e562c76ebc01c7 +Block 0021 [ 32]: 5b1498a98c21068e +Block 0021 [ 33]: 4973ca78752b0432 +Block 0021 [ 34]: 7bf9c40a387df3d9 +Block 0021 [ 35]: 55a1778719be59c3 +Block 0021 [ 36]: 5500e9f3a7369575 +Block 0021 [ 37]: c69c8ef4d7f206fb +Block 0021 [ 38]: c67db3b601347b37 +Block 0021 [ 39]: 64939709d97d89e9 +Block 0021 [ 40]: b4948a1be2068243 +Block 0021 [ 41]: a5d7fd8e568b5cf9 +Block 0021 [ 42]: 09be3ebd25b0f943 +Block 0021 [ 43]: a04507d93f31fe78 +Block 0021 [ 44]: e732c2df513e8110 +Block 0021 [ 45]: b802e0d7c1a290d4 +Block 0021 [ 46]: 4b6bf519c99ae9b0 +Block 0021 [ 47]: 85792737e8be632e +Block 0021 [ 48]: 564fc5a46434e372 +Block 0021 [ 49]: aa8ce8ef23751750 +Block 0021 [ 50]: df75fdd2692a5d60 +Block 0021 [ 51]: 1e34ef41f7558203 +Block 0021 [ 52]: 85c68a3c8d591bb2 +Block 0021 [ 53]: 95ffccb84560b190 +Block 0021 [ 54]: c6329218a27e2430 +Block 0021 [ 55]: e8156443949278ec +Block 0021 [ 56]: 44bf970f7595eeb3 +Block 0021 [ 57]: 7f4745a48d409f34 +Block 0021 [ 58]: 283bb7b02e09a7c2 +Block 0021 [ 59]: e4f46238114fdd65 +Block 0021 [ 60]: 10535b408b72de34 +Block 0021 [ 61]: 3c64d16cfd92bd3f +Block 0021 [ 62]: 398092839b05a0a7 +Block 0021 [ 63]: 5f90e13e1c2f6143 +Block 0021 [ 64]: 8801a1020f792fe7 +Block 0021 [ 65]: 22009e6c49c289c1 +Block 0021 [ 66]: 7728eed80c2a225c +Block 0021 [ 67]: ae8b07a069418ee5 +Block 0021 [ 68]: e388086ae4de33c8 +Block 0021 [ 69]: 969308d65d29f310 +Block 0021 [ 70]: e26c571c259f52dd +Block 0021 [ 71]: 2a4a8580482b06cc +Block 0021 [ 72]: 5bcb5a34fffb96df +Block 0021 [ 73]: c819c17d707e281a +Block 0021 [ 74]: 47edf648395c27e0 +Block 0021 [ 75]: 247d4a2ca0f4dc59 +Block 0021 [ 76]: 183dc03432665caf +Block 0021 [ 77]: e9475ae82292c354 +Block 0021 [ 78]: cb4fe59e9130040d +Block 0021 [ 79]: 67e9681701be322d +Block 0021 [ 80]: 238953b3c2a838bf +Block 0021 [ 81]: 9f0ccae6e48a3061 +Block 0021 [ 82]: 17c218b8b8a799a4 +Block 0021 [ 83]: 6d77392eddc506b7 +Block 0021 [ 84]: 1d871bc3cc1ffb1f +Block 0021 [ 85]: b854e20d68df0832 +Block 0021 [ 86]: 739148762da737cf +Block 0021 [ 87]: ddb87e4b0773508d +Block 0021 [ 88]: 8bfbcffb98ed3b64 +Block 0021 [ 89]: 7ee8acf2f2d2af37 +Block 0021 [ 90]: 0c1ce1ab8bf0cd37 +Block 0021 [ 91]: 0208258d0e1ce2da +Block 0021 [ 92]: e54eeb09da26d0da +Block 0021 [ 93]: 6b62121f7f624310 +Block 0021 [ 94]: 66596927e38bd357 +Block 0021 [ 95]: 22b936173f0670e0 +Block 0021 [ 96]: 42d6b168957c9057 +Block 0021 [ 97]: 2dea30b7ad13294c +Block 0021 [ 98]: ef66a9ebc13538fd +Block 0021 [ 99]: abb52bb31f79729e +Block 0021 [100]: e24db95af6322403 +Block 0021 [101]: ebdb0c859fffcd60 +Block 0021 [102]: d1a06b46377eec61 +Block 0021 [103]: e2d31763aed1ed82 +Block 0021 [104]: ffe24b1f9d5c98b7 +Block 0021 [105]: a4c2e29ed729ab15 +Block 0021 [106]: e726cc9788e7d9db +Block 0021 [107]: c97057fbbe9e7cbe +Block 0021 [108]: d62f0209ac1a3070 +Block 0021 [109]: 2cdae15e7d2da1d3 +Block 0021 [110]: d9cd90c13b3a3646 +Block 0021 [111]: 57fde2b7db2b52e5 +Block 0021 [112]: 1d5cf0b89f587221 +Block 0021 [113]: 78013d6bba9ef856 +Block 0021 [114]: 3995718292542768 +Block 0021 [115]: b1671c5b8290bac1 +Block 0021 [116]: c5a2c85029dbe997 +Block 0021 [117]: b87428b2ccbe4eb7 +Block 0021 [118]: 0dec848541a1d9c3 +Block 0021 [119]: e6c9b99297b41448 +Block 0021 [120]: 788939a6276d7865 +Block 0021 [121]: 713fb3b29fc991be +Block 0021 [122]: 321a3868527330a2 +Block 0021 [123]: 7cf41f165199b48d +Block 0021 [124]: 5fc478500e5d2f18 +Block 0021 [125]: e4f2597a03e914c3 +Block 0021 [126]: 555d961eb62d4030 +Block 0021 [127]: 8ff3daa8c0416f13 +Block 0022 [ 0]: 359ea034194e9837 +Block 0022 [ 1]: d78550ca0ab16474 +Block 0022 [ 2]: 40ba684936f5571b +Block 0022 [ 3]: d5123d27cf585581 +Block 0022 [ 4]: 2416be15e92484f4 +Block 0022 [ 5]: f3fa77ad7aaa55c1 +Block 0022 [ 6]: 583928692aec8b0e +Block 0022 [ 7]: ed3df1623952b0ea +Block 0022 [ 8]: c57e9f7c7c0bcad3 +Block 0022 [ 9]: 885ab6cd1c632566 +Block 0022 [ 10]: 1290294c7c6580ad +Block 0022 [ 11]: fa01cbb3169e5bb7 +Block 0022 [ 12]: 6ec333a957dcb800 +Block 0022 [ 13]: 9d42f781b8392cbf +Block 0022 [ 14]: 1af51dd0d78a0777 +Block 0022 [ 15]: 27ca875f7007076d +Block 0022 [ 16]: d45bd1b2b7496a3f +Block 0022 [ 17]: 71d0bc4df457c664 +Block 0022 [ 18]: cff1e3749eff7fc3 +Block 0022 [ 19]: 9547fd4c77ca5038 +Block 0022 [ 20]: 6a888adc9f599a51 +Block 0022 [ 21]: 9b809dbb86136958 +Block 0022 [ 22]: 430f8942f4df64df +Block 0022 [ 23]: 0e90501ceeb9b589 +Block 0022 [ 24]: 806e49712709b024 +Block 0022 [ 25]: 1742e2f60a8cd3a6 +Block 0022 [ 26]: dbfc8e83d1d512ad +Block 0022 [ 27]: 0cf7f132a3e20ad1 +Block 0022 [ 28]: 9e873b4c0dc1dac6 +Block 0022 [ 29]: 89945226c2272e7a +Block 0022 [ 30]: b5d181ce274a0b0c +Block 0022 [ 31]: 116b16c196bc7d09 +Block 0022 [ 32]: 2d8c6d3a492cddbb +Block 0022 [ 33]: ce8279161863b53b +Block 0022 [ 34]: b8df4aa4a78722b6 +Block 0022 [ 35]: 8c7e68419060d08c +Block 0022 [ 36]: 0d68f7355f83d095 +Block 0022 [ 37]: e0d6b93af3c1f8e8 +Block 0022 [ 38]: 8e7ab9c04b9304f9 +Block 0022 [ 39]: 2e1aea547be324fa +Block 0022 [ 40]: 452ee11bfe9775f2 +Block 0022 [ 41]: b40b63ca6ca959f7 +Block 0022 [ 42]: c7e2522bdf39ee22 +Block 0022 [ 43]: 3252b7ea0f42c364 +Block 0022 [ 44]: bf83748abdd885a8 +Block 0022 [ 45]: 3a41fbd16b55e560 +Block 0022 [ 46]: 1bdc3ad30ab8281e +Block 0022 [ 47]: f43e3102c2b2f31e +Block 0022 [ 48]: aaf357cba9b1fcdf +Block 0022 [ 49]: 89dd304402be8aa2 +Block 0022 [ 50]: 0f096417aa7934f0 +Block 0022 [ 51]: 9ed6d449bcbb0f4a +Block 0022 [ 52]: ec6fbbd7257fa97c +Block 0022 [ 53]: d258163a989c0cb1 +Block 0022 [ 54]: f87de0405bfd2a85 +Block 0022 [ 55]: 8fadee635ca3bf8b +Block 0022 [ 56]: 8c2b49b3389dd1b6 +Block 0022 [ 57]: 0965075129b75a38 +Block 0022 [ 58]: 5ca5e173f8903715 +Block 0022 [ 59]: 45eff6a7d24a1f97 +Block 0022 [ 60]: 9b51a40c8c8988c6 +Block 0022 [ 61]: 637b89f48ff3fec8 +Block 0022 [ 62]: 728f9d6f9bb2b21a +Block 0022 [ 63]: 89bc904decbb53b6 +Block 0022 [ 64]: db8e98e0e80c8c9b +Block 0022 [ 65]: 6a4f479b00afcdf0 +Block 0022 [ 66]: d3746d207db7569a +Block 0022 [ 67]: 708951244e5efdb3 +Block 0022 [ 68]: 0e39a86b20244617 +Block 0022 [ 69]: 89c550440a864e0d +Block 0022 [ 70]: 18f302e1690bdddc +Block 0022 [ 71]: d4d88aeb6aa90eb3 +Block 0022 [ 72]: 3ed14399fd19860a +Block 0022 [ 73]: 36771b7d82612ee4 +Block 0022 [ 74]: b316cc4bdae219f0 +Block 0022 [ 75]: 0912a4991e79007e +Block 0022 [ 76]: 4855b6f6cc5af6c8 +Block 0022 [ 77]: d2204ba86d9e3306 +Block 0022 [ 78]: 7c4afeed2a1d6ea8 +Block 0022 [ 79]: 3a23c2802e4cd40e +Block 0022 [ 80]: c22a2e7614514d95 +Block 0022 [ 81]: f313d4c25b03d71c +Block 0022 [ 82]: 479ca05314ec2c7d +Block 0022 [ 83]: 97c41ff46cfafc0a +Block 0022 [ 84]: a60ff47aba2ce596 +Block 0022 [ 85]: b391956a26acb634 +Block 0022 [ 86]: cdfe906b5c69ffc4 +Block 0022 [ 87]: 4f6721d63000152a +Block 0022 [ 88]: 5231ddf2b368af61 +Block 0022 [ 89]: 57a45b3ca6f71734 +Block 0022 [ 90]: 81d6271b2f60cabd +Block 0022 [ 91]: 2950a00d07534dec +Block 0022 [ 92]: 74e039f97e8aa73b +Block 0022 [ 93]: b4b2578228ce5af6 +Block 0022 [ 94]: 7b8a152b75883d1d +Block 0022 [ 95]: d207419167a96c24 +Block 0022 [ 96]: 0a523f2a8a05ae17 +Block 0022 [ 97]: b7f339aa5cc88542 +Block 0022 [ 98]: 9df6fd53a0623750 +Block 0022 [ 99]: cc1f852330d28cbd +Block 0022 [100]: 1d0a822c3693df89 +Block 0022 [101]: 6aaf30c9ddcdfc08 +Block 0022 [102]: 7ef3d4bec6351a5b +Block 0022 [103]: 6bba1464a14c1035 +Block 0022 [104]: 39c41d54e5f6f1b4 +Block 0022 [105]: 653ccaab162e37f1 +Block 0022 [106]: fa8694d3ba064670 +Block 0022 [107]: 910c761a8683388c +Block 0022 [108]: a733cb24de424eea +Block 0022 [109]: d1898453e8fa3db0 +Block 0022 [110]: 017ce73367ee47ea +Block 0022 [111]: 558eb8c4c3d20b56 +Block 0022 [112]: 969ac56f171863bc +Block 0022 [113]: 0858ecb8b8c6eb6b +Block 0022 [114]: deb137af8f3eda8c +Block 0022 [115]: 0957d06a65ca1dc4 +Block 0022 [116]: 05f09e10f775c81b +Block 0022 [117]: 2b076311329a4de4 +Block 0022 [118]: 756805c001922f19 +Block 0022 [119]: 05362ff8a52ebdba +Block 0022 [120]: 6ea323dd5b100acd +Block 0022 [121]: 28356b4faf87aca5 +Block 0022 [122]: 0dcdf79812e24903 +Block 0022 [123]: 2ad46475db731dfe +Block 0022 [124]: ed69c60c6bd370e2 +Block 0022 [125]: d2278b5b0062c149 +Block 0022 [126]: f4beefe92919c42f +Block 0022 [127]: c74f504d0b914a3b +Block 0023 [ 0]: 9ecdaf0f036d9ce1 +Block 0023 [ 1]: 15bb004c9a72d549 +Block 0023 [ 2]: 98c6ea40c940ce55 +Block 0023 [ 3]: 22ddd937c9c8d11c +Block 0023 [ 4]: 47479edda8ec7d63 +Block 0023 [ 5]: 3170bd3d10b6085e +Block 0023 [ 6]: c4409c14ffbc7e23 +Block 0023 [ 7]: a23c1d3d828c0386 +Block 0023 [ 8]: 9be7bbe3ce098999 +Block 0023 [ 9]: c24d972e14b96d6c +Block 0023 [ 10]: 5cee6a54dd460a3a +Block 0023 [ 11]: a49b4acbe7c13c60 +Block 0023 [ 12]: 3d39dc57c0c1d9d4 +Block 0023 [ 13]: 393a08415acbe137 +Block 0023 [ 14]: 6c12cd1742129218 +Block 0023 [ 15]: 34c456e39a4db7a5 +Block 0023 [ 16]: 77ce8fbc96d845ad +Block 0023 [ 17]: 5edee26d8cd5eca7 +Block 0023 [ 18]: 61ec669dea36a9b2 +Block 0023 [ 19]: 4787a5cc99a772bf +Block 0023 [ 20]: c73394f2ccffbc07 +Block 0023 [ 21]: 671d17c8d052dfed +Block 0023 [ 22]: b1b88ea17fbfd701 +Block 0023 [ 23]: 9959c72ac7eec701 +Block 0023 [ 24]: c3cd2df338951e0f +Block 0023 [ 25]: ddd17a9cde144bbf +Block 0023 [ 26]: a911e79da9825e9d +Block 0023 [ 27]: e0a95e40de7e7382 +Block 0023 [ 28]: cc2dc82e6831f869 +Block 0023 [ 29]: b6e5f24cd89351c5 +Block 0023 [ 30]: 69427de8682af684 +Block 0023 [ 31]: 6de1377357db2537 +Block 0023 [ 32]: e64c80f7e437a546 +Block 0023 [ 33]: 2241320a7b0aa93d +Block 0023 [ 34]: 7d010e32a1d2f256 +Block 0023 [ 35]: 48f7fae3620d0480 +Block 0023 [ 36]: 54031a0fd9d37022 +Block 0023 [ 37]: c983112ebbb5577b +Block 0023 [ 38]: 7247d8d4af455e74 +Block 0023 [ 39]: fa37b1bf19707b2b +Block 0023 [ 40]: 1c058b748007d18f +Block 0023 [ 41]: 2329b9492da173f6 +Block 0023 [ 42]: a8041bb66c9d96ce +Block 0023 [ 43]: bb83baef9acfc540 +Block 0023 [ 44]: 73408477183e2d79 +Block 0023 [ 45]: 3add56150f9d7204 +Block 0023 [ 46]: a5f7f5331c633042 +Block 0023 [ 47]: 9daeca7cf30a5c23 +Block 0023 [ 48]: 2cc58e8b2baa07c3 +Block 0023 [ 49]: e61a53aef76f133a +Block 0023 [ 50]: ebd6b3e48a056905 +Block 0023 [ 51]: b39932f0b836380c +Block 0023 [ 52]: 3e09ce899bff870b +Block 0023 [ 53]: 112e5f19f35c392f +Block 0023 [ 54]: 90748bbcb7404a8c +Block 0023 [ 55]: 27cef22f1eab2918 +Block 0023 [ 56]: 0093c1bff0ae57c3 +Block 0023 [ 57]: 75fb7bc0725e013c +Block 0023 [ 58]: 8c8599b959463f3b +Block 0023 [ 59]: b6542538c6a52c8a +Block 0023 [ 60]: b24a4df10594c149 +Block 0023 [ 61]: 5c7cee7c1cb8c0ab +Block 0023 [ 62]: c340366544c200ed +Block 0023 [ 63]: 4321cb1f4b967b2a +Block 0023 [ 64]: 374c3b926409f144 +Block 0023 [ 65]: 4aaafaae953a4c57 +Block 0023 [ 66]: f6a5da47b793e418 +Block 0023 [ 67]: 99708b9fb00f25d6 +Block 0023 [ 68]: da07362b0cc5dbc0 +Block 0023 [ 69]: 988a57c3161a6c40 +Block 0023 [ 70]: 1d1cc8be2f734650 +Block 0023 [ 71]: a45ad1cae81bd6e2 +Block 0023 [ 72]: 95bca8f0129ec299 +Block 0023 [ 73]: 4ab488175d7722db +Block 0023 [ 74]: 1a7e32485afd1c14 +Block 0023 [ 75]: 489731ed70ac12f5 +Block 0023 [ 76]: f4d27e08c22a40b3 +Block 0023 [ 77]: b5d68acf7a4254e0 +Block 0023 [ 78]: 8a6caec3444e603d +Block 0023 [ 79]: 7c0e44ba09f71c7d +Block 0023 [ 80]: c9b6b103b57878e1 +Block 0023 [ 81]: ebbc7a32b28ab234 +Block 0023 [ 82]: 17219f0386f3711f +Block 0023 [ 83]: 916a5dae24a64bf1 +Block 0023 [ 84]: aa935a0cccf96eae +Block 0023 [ 85]: 1040a92200392b52 +Block 0023 [ 86]: 352255483f46b903 +Block 0023 [ 87]: a978a95cb8cb0690 +Block 0023 [ 88]: 56c1ab16770cbc9b +Block 0023 [ 89]: 10ec2e950f5019a9 +Block 0023 [ 90]: 5e63ede0ae88dd9c +Block 0023 [ 91]: 70edb6a07f8797cf +Block 0023 [ 92]: 380536c55eb0b657 +Block 0023 [ 93]: 99c90414e820bfe8 +Block 0023 [ 94]: 47d46b72322e67c8 +Block 0023 [ 95]: fb848a7235f26a57 +Block 0023 [ 96]: 554aca7cd22b15ac +Block 0023 [ 97]: 379eeafe44ac5c97 +Block 0023 [ 98]: 45bd5bf613ad3fbc +Block 0023 [ 99]: 4c075438f295c44b +Block 0023 [100]: 7a45259b4559b474 +Block 0023 [101]: 92e838e8f0d7514e +Block 0023 [102]: aafdbbc3728f02e5 +Block 0023 [103]: a8e5e2bde478bae6 +Block 0023 [104]: 4c04ee73d4039bab +Block 0023 [105]: 586028282e5a2b3b +Block 0023 [106]: 022ad23278d18381 +Block 0023 [107]: cf51eb4d0d0bee7a +Block 0023 [108]: c7899e6732468800 +Block 0023 [109]: 82ffce02be29df97 +Block 0023 [110]: 6e036a2149410e95 +Block 0023 [111]: e0fbf0b38edbd512 +Block 0023 [112]: 334146973c3d6796 +Block 0023 [113]: 8ee18e6e829696dc +Block 0023 [114]: df103a940c74bbb8 +Block 0023 [115]: 8a46aa1191367d55 +Block 0023 [116]: f6a251ccb3620d10 +Block 0023 [117]: 7d3c88419220f214 +Block 0023 [118]: 26d3efe32bfedbf4 +Block 0023 [119]: 358e3d026b5f1178 +Block 0023 [120]: 32fa00e6c78ead6a +Block 0023 [121]: fcfdf868bc542c1a +Block 0023 [122]: f782e4caddde1d36 +Block 0023 [123]: 063cc660d7e819ca +Block 0023 [124]: 227a62857637cb1f +Block 0023 [125]: 82f3260fc275ab7a +Block 0023 [126]: 5b258ef618e41d5a +Block 0023 [127]: 9fb85be580e013c8 +Block 0024 [ 0]: 4990efe3269d5190 +Block 0024 [ 1]: de2c7f2e0c863a82 +Block 0024 [ 2]: 2fc9b3b341c04b15 +Block 0024 [ 3]: 3cf7381ab954a760 +Block 0024 [ 4]: 3408457092a69446 +Block 0024 [ 5]: 07d5d09002020f66 +Block 0024 [ 6]: 6f91ac20f06809b2 +Block 0024 [ 7]: 7b7a1387adfd44ca +Block 0024 [ 8]: 195bd6087a492267 +Block 0024 [ 9]: fd32ea59e44f93e0 +Block 0024 [ 10]: d1a3ec8e6a5a6f05 +Block 0024 [ 11]: 7f4c56252644fb33 +Block 0024 [ 12]: 8c4222c5464aa757 +Block 0024 [ 13]: c5326c5b79c1a2ba +Block 0024 [ 14]: 69afb22efed068e0 +Block 0024 [ 15]: 2603fd0ad02aaefd +Block 0024 [ 16]: c6edb5b04d0b579b +Block 0024 [ 17]: 9c68f8b1f3174966 +Block 0024 [ 18]: 79cf677075fba1d4 +Block 0024 [ 19]: 06e7cd18bef5a8bb +Block 0024 [ 20]: ccfc328dd4eebf8c +Block 0024 [ 21]: eba236e2136dfb89 +Block 0024 [ 22]: 7a67510261cc7eb1 +Block 0024 [ 23]: 6bd8b5df55f8b189 +Block 0024 [ 24]: 3305f90891829603 +Block 0024 [ 25]: 57e22d3264c1c974 +Block 0024 [ 26]: e918af423b0e7ace +Block 0024 [ 27]: a14c87f217094fe6 +Block 0024 [ 28]: 5e1313148ffaa2f6 +Block 0024 [ 29]: a00b46a3ed740d35 +Block 0024 [ 30]: 6472f8cb7670d61f +Block 0024 [ 31]: 6212299758ed000b +Block 0024 [ 32]: d2c50ca6a7359192 +Block 0024 [ 33]: 4e4d28d7a3810410 +Block 0024 [ 34]: 4238403cbcc1811d +Block 0024 [ 35]: 25b212262b1f6f34 +Block 0024 [ 36]: ef1f75a6346ada54 +Block 0024 [ 37]: 0f525c2ea4c32274 +Block 0024 [ 38]: 6c9395bfdaa1dbcf +Block 0024 [ 39]: c546ecc90cf6e07f +Block 0024 [ 40]: fd5b00b32147080a +Block 0024 [ 41]: 1c334957e7f45b7a +Block 0024 [ 42]: 88746c5e040809f1 +Block 0024 [ 43]: 1ac21097902fe27f +Block 0024 [ 44]: b50743a5490fc1dd +Block 0024 [ 45]: aeb2f2e0a3e6963a +Block 0024 [ 46]: 50e7629dc0fca8d4 +Block 0024 [ 47]: 634eb720976d1003 +Block 0024 [ 48]: cf926f81c7565370 +Block 0024 [ 49]: 04de21ea98c18906 +Block 0024 [ 50]: 09142b802328cfa8 +Block 0024 [ 51]: 152ef632d6c6ae7a +Block 0024 [ 52]: 9648d7f59744787e +Block 0024 [ 53]: 91bd54a13baa8696 +Block 0024 [ 54]: cadc45d3793b4719 +Block 0024 [ 55]: bdf2781f42523f09 +Block 0024 [ 56]: 78d8660f7981b790 +Block 0024 [ 57]: 4eda5ebdf5661493 +Block 0024 [ 58]: c254878496ae6395 +Block 0024 [ 59]: bdb4be227efa75ec +Block 0024 [ 60]: f32b3ef66ddd6a1e +Block 0024 [ 61]: 48ee09f020365f7c +Block 0024 [ 62]: ca415ffea519bff8 +Block 0024 [ 63]: c9cf7b1e7d3c05c2 +Block 0024 [ 64]: 37c77300cea00abe +Block 0024 [ 65]: 36e86532cac039e1 +Block 0024 [ 66]: 7b6e3d9501dcb1cc +Block 0024 [ 67]: 6a0bb5ff356e9afe +Block 0024 [ 68]: b874304d7cb5fc40 +Block 0024 [ 69]: 2dd866d1436d39b3 +Block 0024 [ 70]: dbb43f77cad44c96 +Block 0024 [ 71]: c6b3721f8d6602b1 +Block 0024 [ 72]: c4b3809a4a4f408e +Block 0024 [ 73]: a51c769bdfeaf335 +Block 0024 [ 74]: 41081e8888f060df +Block 0024 [ 75]: 4d2ce53a9c342b5d +Block 0024 [ 76]: 5dad598c2776ba1a +Block 0024 [ 77]: c4775d2b1722a14f +Block 0024 [ 78]: 504200a6ac05d630 +Block 0024 [ 79]: 111b8bafc6c72466 +Block 0024 [ 80]: f5a33557e079957e +Block 0024 [ 81]: 5804085cc0549387 +Block 0024 [ 82]: bdaa7d6a7d1e7d1c +Block 0024 [ 83]: a6b9fad1ceb81824 +Block 0024 [ 84]: 899a505eb3391c27 +Block 0024 [ 85]: b3b40c70b9c66298 +Block 0024 [ 86]: 3eade0f6f5a9a69a +Block 0024 [ 87]: 8248d3340a7e619b +Block 0024 [ 88]: 16992f40e4158081 +Block 0024 [ 89]: 88499feb90e076f9 +Block 0024 [ 90]: d354bea70857875e +Block 0024 [ 91]: 19e861311fd36926 +Block 0024 [ 92]: 6f7790ebb65649b4 +Block 0024 [ 93]: cc7c3b143901e609 +Block 0024 [ 94]: 5cec2c0da25e936b +Block 0024 [ 95]: acd296bbbdeee1e2 +Block 0024 [ 96]: 402648821a389d58 +Block 0024 [ 97]: e890e079b9bd16d7 +Block 0024 [ 98]: 6acd81b06dec0c16 +Block 0024 [ 99]: ea87dab66e6fc421 +Block 0024 [100]: 0f3bbf2dc7c30982 +Block 0024 [101]: 3d1587feca99c0c4 +Block 0024 [102]: e8f6a80acf77a2c9 +Block 0024 [103]: 8814ba98d498427d +Block 0024 [104]: 4a34a60453fb977d +Block 0024 [105]: d04ccdd2f9a3f548 +Block 0024 [106]: 8c34e54ce961698e +Block 0024 [107]: 836c4707f77a4aae +Block 0024 [108]: 7fabdff455eace22 +Block 0024 [109]: 571b7698bdee8f84 +Block 0024 [110]: eb4100011b8ea9c3 +Block 0024 [111]: 40d475bcd627d0d3 +Block 0024 [112]: 32015db9bfea8194 +Block 0024 [113]: 37ef2a82ea82a822 +Block 0024 [114]: fe1032d3b905860d +Block 0024 [115]: a64397eda2c55368 +Block 0024 [116]: 615d50ceaf17c2ad +Block 0024 [117]: 59834237582754bf +Block 0024 [118]: a8c401a6a54999b0 +Block 0024 [119]: 59bb3ab34c05bda7 +Block 0024 [120]: 4e6a17e54f84868a +Block 0024 [121]: f189612ce7bfb6a6 +Block 0024 [122]: f232b4146d455183 +Block 0024 [123]: 298ca1081e693861 +Block 0024 [124]: 4c1982293ae974f1 +Block 0024 [125]: be436e96e2b3315c +Block 0024 [126]: 8c202ac8e574a446 +Block 0024 [127]: a2e7143eac000937 +Block 0025 [ 0]: 83fb6773de7ee2a3 +Block 0025 [ 1]: 2f3f9a6e1097d055 +Block 0025 [ 2]: 4c58fde56056258c +Block 0025 [ 3]: 4800796ee0c17895 +Block 0025 [ 4]: 7b7b6e9b672619b5 +Block 0025 [ 5]: 34f5a9e9f27f1a0b +Block 0025 [ 6]: 98b0e4c973e59b81 +Block 0025 [ 7]: 6d6001fffd3a09e1 +Block 0025 [ 8]: d7eaaebdcaeed771 +Block 0025 [ 9]: e88750c97cc45fbc +Block 0025 [ 10]: 75b10f14afb791a3 +Block 0025 [ 11]: 0f1a1b3808dbfa46 +Block 0025 [ 12]: cc35f51b6c288799 +Block 0025 [ 13]: 2926ff23d9fc1949 +Block 0025 [ 14]: 58254c89114006d6 +Block 0025 [ 15]: 9b899c4474155956 +Block 0025 [ 16]: 9f0470e645231c0b +Block 0025 [ 17]: a8e8d9fd81d99af7 +Block 0025 [ 18]: e8f5cc60fa860462 +Block 0025 [ 19]: fe355997e93e244c +Block 0025 [ 20]: 57452ab41cb95712 +Block 0025 [ 21]: 2b26bc00f6214e40 +Block 0025 [ 22]: 44ef8f293b8f1c11 +Block 0025 [ 23]: 089ae8103f3d4570 +Block 0025 [ 24]: 5d494295b9843491 +Block 0025 [ 25]: f1cb3831ffac7950 +Block 0025 [ 26]: 953d0f93faff8597 +Block 0025 [ 27]: ebd32513d2d9e83d +Block 0025 [ 28]: e00e64064b795a05 +Block 0025 [ 29]: cc1ce85b988b2930 +Block 0025 [ 30]: 31b45b9e5913546a +Block 0025 [ 31]: fbc8663cbc5b3c8a +Block 0025 [ 32]: a0874e3d61998c17 +Block 0025 [ 33]: 2366253e2ce491a5 +Block 0025 [ 34]: 0dfa45c95520aade +Block 0025 [ 35]: cec2ff4872e41c30 +Block 0025 [ 36]: 6321e4ff66dacaa0 +Block 0025 [ 37]: d0a5ec07b94fa10b +Block 0025 [ 38]: ccf37ab4f06dc63c +Block 0025 [ 39]: 56c3a31b8a4df791 +Block 0025 [ 40]: 83fff10db0078edc +Block 0025 [ 41]: 8f1a6a3fad3deee0 +Block 0025 [ 42]: 355f982b93c0f558 +Block 0025 [ 43]: 2a104e98645f490a +Block 0025 [ 44]: 26329d3151f97586 +Block 0025 [ 45]: f237846adf58e843 +Block 0025 [ 46]: d1d0d81185241166 +Block 0025 [ 47]: bd0cd9d7753072f7 +Block 0025 [ 48]: 14d4456cea2d67f9 +Block 0025 [ 49]: b81c2dc3628c7a8c +Block 0025 [ 50]: 8377344995ea8f48 +Block 0025 [ 51]: a5fbdca45d23262e +Block 0025 [ 52]: 5405165af97282a2 +Block 0025 [ 53]: d7d8c5a6ef3d9636 +Block 0025 [ 54]: 7394338a30f9141d +Block 0025 [ 55]: 064f55f35c47c381 +Block 0025 [ 56]: 367133384ae9180c +Block 0025 [ 57]: c74c9847614cfcb5 +Block 0025 [ 58]: 69d72fce07cbfdda +Block 0025 [ 59]: 6290c4b0a2e5e4d7 +Block 0025 [ 60]: d34cf7fb1b36f0e7 +Block 0025 [ 61]: 79107022ff338846 +Block 0025 [ 62]: 59959d367d0afc7c +Block 0025 [ 63]: 2f4345e5dd70a2e0 +Block 0025 [ 64]: aa6cbc0ca3123b15 +Block 0025 [ 65]: 182754d354e32e42 +Block 0025 [ 66]: 42408d91ef9bef4e +Block 0025 [ 67]: 213a0d2a2221598f +Block 0025 [ 68]: 0c4db076adcf874d +Block 0025 [ 69]: f5f16511a505658b +Block 0025 [ 70]: afe3a3731826ea43 +Block 0025 [ 71]: e21e33ce36edcb3a +Block 0025 [ 72]: 5cc73976cd2aaeaa +Block 0025 [ 73]: f275f27ca3e29acf +Block 0025 [ 74]: f3ef40acfe1d2b26 +Block 0025 [ 75]: 0ca134ce6045384d +Block 0025 [ 76]: 19b70338de252080 +Block 0025 [ 77]: 494a7e5b797427f4 +Block 0025 [ 78]: 1e79faba6fe15775 +Block 0025 [ 79]: d5f42e805029c0e3 +Block 0025 [ 80]: 2de1c5e2403fbc13 +Block 0025 [ 81]: 4a29e0cb9a65a3dc +Block 0025 [ 82]: 36c4842e37c2e07d +Block 0025 [ 83]: 026ae795b0a9f8b8 +Block 0025 [ 84]: 28a421d6a6cb2dbf +Block 0025 [ 85]: 95ad6b9ad86aa9ab +Block 0025 [ 86]: 5032fa51cd430007 +Block 0025 [ 87]: f78595ca07627684 +Block 0025 [ 88]: 465d8ed01526d77d +Block 0025 [ 89]: ac72274a02829c93 +Block 0025 [ 90]: 3de7df864a1e4f02 +Block 0025 [ 91]: 7ffa83d36ca1d61f +Block 0025 [ 92]: 15168df4da4775bf +Block 0025 [ 93]: ee9c34ba1a22ea61 +Block 0025 [ 94]: 4e3f3840f0d16db6 +Block 0025 [ 95]: b35fc77b895c3520 +Block 0025 [ 96]: d61bd96d8e1eaf08 +Block 0025 [ 97]: 22e57bbd848a9a73 +Block 0025 [ 98]: b693b10703481d23 +Block 0025 [ 99]: e7ad60adc325637d +Block 0025 [100]: 5fc51fe5584dc47b +Block 0025 [101]: 69fc11a044cb4d63 +Block 0025 [102]: 848d29cf57a45cc5 +Block 0025 [103]: 9e6696565e4584c4 +Block 0025 [104]: b597941cf768d408 +Block 0025 [105]: 6bed7072ef2144c7 +Block 0025 [106]: 776e13b6104dabb2 +Block 0025 [107]: 17666dc6fbe4840e +Block 0025 [108]: 9cf43d0ee9a9e822 +Block 0025 [109]: a1c11bda92e88ebb +Block 0025 [110]: 578bae4e9c1422ab +Block 0025 [111]: 8e0da066b8d902cb +Block 0025 [112]: e0a073edaf4ce1c3 +Block 0025 [113]: 3196d4508872812c +Block 0025 [114]: 7e7556b7c1b17f23 +Block 0025 [115]: d6ac91eee3bb6d46 +Block 0025 [116]: cccf91331656dff0 +Block 0025 [117]: ab87613dd7be1b14 +Block 0025 [118]: 2aad5227e58efc81 +Block 0025 [119]: 5018f9becceee5b0 +Block 0025 [120]: 49fe66a791ae8a46 +Block 0025 [121]: 299180a2768e190e +Block 0025 [122]: 76ae76a2fc1f75c7 +Block 0025 [123]: 7a4df9344eb55360 +Block 0025 [124]: 8e5772c8e118692b +Block 0025 [125]: 8408d3b455eb9437 +Block 0025 [126]: f9c9413266d6934a +Block 0025 [127]: e7eef672fbce6f1c +Block 0026 [ 0]: 1d7f4927cf91b037 +Block 0026 [ 1]: b36f320a28dfa026 +Block 0026 [ 2]: 4ad8b0cf2627ee42 +Block 0026 [ 3]: 0e38890d5df29444 +Block 0026 [ 4]: cf130312e3b781c0 +Block 0026 [ 5]: f27a461c0c52ba67 +Block 0026 [ 6]: 8830659de72797b6 +Block 0026 [ 7]: ec5a1697788f2be5 +Block 0026 [ 8]: 3324bcfa95092292 +Block 0026 [ 9]: 5444e023e975233e +Block 0026 [ 10]: 17f17a88758745a6 +Block 0026 [ 11]: 905851cf4421945c +Block 0026 [ 12]: 425408f96645858a +Block 0026 [ 13]: b68e85073ba4560a +Block 0026 [ 14]: 8eb4e618a957c503 +Block 0026 [ 15]: 305d2389814e00ae +Block 0026 [ 16]: 1613bfd014f3863b +Block 0026 [ 17]: 124258b390774c76 +Block 0026 [ 18]: f54f555e709aed15 +Block 0026 [ 19]: 7851eb99d58f2d46 +Block 0026 [ 20]: 8e09eca1320c689f +Block 0026 [ 21]: aee8d938c18a8c86 +Block 0026 [ 22]: 4afe50ff7d4bee03 +Block 0026 [ 23]: 11bf5c86116564c1 +Block 0026 [ 24]: 2d5f27ffac73811f +Block 0026 [ 25]: 0fa8c081b90eb9b2 +Block 0026 [ 26]: e2ce79be549933e7 +Block 0026 [ 27]: 1ea09ba7396e97e4 +Block 0026 [ 28]: 4b15fefc4863125a +Block 0026 [ 29]: 7758686a57392a75 +Block 0026 [ 30]: 6c43ead08b17d18a +Block 0026 [ 31]: f9d1a4e2bf73bc26 +Block 0026 [ 32]: 7ccef85867766cd1 +Block 0026 [ 33]: 2bb5ded12fe3e02a +Block 0026 [ 34]: bec9fda8bfa42f84 +Block 0026 [ 35]: 478be943487266c6 +Block 0026 [ 36]: 9002b673f9edfd55 +Block 0026 [ 37]: ddf42d90f8a74261 +Block 0026 [ 38]: 20b556c2f2e0e6a3 +Block 0026 [ 39]: d42493e8a60bc244 +Block 0026 [ 40]: 01465bcb695bc90c +Block 0026 [ 41]: 3a7c2d16c3992ad4 +Block 0026 [ 42]: 6308ef7380ab5f06 +Block 0026 [ 43]: 001a0e8c275832fd +Block 0026 [ 44]: e44a6b19e4d42cd8 +Block 0026 [ 45]: 4a2ba8cd72cbb52f +Block 0026 [ 46]: ace3f2f2acdf83fb +Block 0026 [ 47]: 26ac91bbae138132 +Block 0026 [ 48]: 7a2a681a01b40d1f +Block 0026 [ 49]: 7531b75bf6547ded +Block 0026 [ 50]: a3635ecd6aeec9b3 +Block 0026 [ 51]: 41243a17c9b41fe6 +Block 0026 [ 52]: c8d4da0b24b4544b +Block 0026 [ 53]: 3fada7d00f7414b3 +Block 0026 [ 54]: 8010bd0c0fdac063 +Block 0026 [ 55]: 230dbac6bc804ba7 +Block 0026 [ 56]: 70b351bdfd17062c +Block 0026 [ 57]: c40153db32947b71 +Block 0026 [ 58]: 32303a32a5423c24 +Block 0026 [ 59]: cc7b4a7e222623f5 +Block 0026 [ 60]: 0be07177569be4b6 +Block 0026 [ 61]: 09626cfd002e5705 +Block 0026 [ 62]: a2723a44848ddf64 +Block 0026 [ 63]: 226e8e82c0a835c0 +Block 0026 [ 64]: 4b2b3d701a2de1e5 +Block 0026 [ 65]: 7cd8435a86fad908 +Block 0026 [ 66]: 37b6e6c9d066e67f +Block 0026 [ 67]: db0cc96460d11f0b +Block 0026 [ 68]: 9f2dac0a2723c7c3 +Block 0026 [ 69]: 0e57f0560eafb201 +Block 0026 [ 70]: d771d6806fb188d9 +Block 0026 [ 71]: 5929952563b4ed22 +Block 0026 [ 72]: 994276262b7e4ab1 +Block 0026 [ 73]: befac9989fed281f +Block 0026 [ 74]: 16f13e5571e13be3 +Block 0026 [ 75]: 06cd705ada9f5c1c +Block 0026 [ 76]: 76763ad787351b02 +Block 0026 [ 77]: 2511361d83fe6e48 +Block 0026 [ 78]: b17e849b57e3ccd7 +Block 0026 [ 79]: 5b8eaf1c99be1ae0 +Block 0026 [ 80]: b6388ba2df9110d7 +Block 0026 [ 81]: 7f950313727a4b9c +Block 0026 [ 82]: 03dbf52f47e9ab21 +Block 0026 [ 83]: 1665660ce900a15e +Block 0026 [ 84]: 399e52875c07ed05 +Block 0026 [ 85]: 9eebf23eb3158a72 +Block 0026 [ 86]: 39efc5fb6b50e8ee +Block 0026 [ 87]: 02f7af4888f1fe47 +Block 0026 [ 88]: da6f6b90c0824864 +Block 0026 [ 89]: e871096ed23c51c0 +Block 0026 [ 90]: 435550640fd29909 +Block 0026 [ 91]: 9e2000a4691e2c7e +Block 0026 [ 92]: 53b2e98931e022af +Block 0026 [ 93]: 8548b40e0782ef18 +Block 0026 [ 94]: a343286e3be791e9 +Block 0026 [ 95]: d4a4262e32be6ded +Block 0026 [ 96]: d1451f414ea309f6 +Block 0026 [ 97]: 1caa15323232d92d +Block 0026 [ 98]: 7998831dffde384f +Block 0026 [ 99]: 3f6edbdb62446b2e +Block 0026 [100]: ef7cb7f074dc2fbd +Block 0026 [101]: 878afe5b75496afb +Block 0026 [102]: 91ff31fd58fe0def +Block 0026 [103]: c362ee5cd095f0e2 +Block 0026 [104]: d0e01f0cd9c2c496 +Block 0026 [105]: 49ea9bdcf1af8406 +Block 0026 [106]: 82e7e34660e1af7f +Block 0026 [107]: 0418d8471413ebf7 +Block 0026 [108]: 0fc73170d4dd1bc4 +Block 0026 [109]: 09c9249f15bfd20f +Block 0026 [110]: 1e173eb678957dcf +Block 0026 [111]: bf4cbf2f50b1638e +Block 0026 [112]: 9b6b09ffe7ad97b8 +Block 0026 [113]: 333156bf88027c1d +Block 0026 [114]: a24da656f801a65b +Block 0026 [115]: 521e82065aaed63f +Block 0026 [116]: 8a612eac6157b096 +Block 0026 [117]: 2aed99d6d7bbfd85 +Block 0026 [118]: 347cb6498a5f56fb +Block 0026 [119]: dcfa294054e70dbd +Block 0026 [120]: da4b9b4be8d545ee +Block 0026 [121]: b70a983c8de64987 +Block 0026 [122]: cb6a7222c7f95960 +Block 0026 [123]: 3f434acae0d95acf +Block 0026 [124]: 1ef173dee9eb44aa +Block 0026 [125]: 99356ed40eb7f3b8 +Block 0026 [126]: ba6b9c1c50492163 +Block 0026 [127]: e16309f90bcac92f +Block 0027 [ 0]: 439badfadf3479ca +Block 0027 [ 1]: 10f2cab73da23168 +Block 0027 [ 2]: 14ae9e557289684e +Block 0027 [ 3]: 6dad6cd6175b9497 +Block 0027 [ 4]: 102397f5c9c719e0 +Block 0027 [ 5]: a7eec5535492fd55 +Block 0027 [ 6]: 0b07bfcc45032b83 +Block 0027 [ 7]: 44fc1bcecf90e4e9 +Block 0027 [ 8]: eed8c2e02524204f +Block 0027 [ 9]: 935100ae85d08641 +Block 0027 [ 10]: 4aaebb5f361261cf +Block 0027 [ 11]: 1b8d7a9d97940db2 +Block 0027 [ 12]: 4318646c94c73b35 +Block 0027 [ 13]: d6655631500b729d +Block 0027 [ 14]: c2a9b85b96924a8e +Block 0027 [ 15]: 418c589a875653bb +Block 0027 [ 16]: bf082ba5c245765d +Block 0027 [ 17]: ccfc9eda23db1947 +Block 0027 [ 18]: 2de1c5c6f46db28a +Block 0027 [ 19]: 9cd06b50cf2bd2dd +Block 0027 [ 20]: dd962d2da10fc57c +Block 0027 [ 21]: a4b0686c11d81fb1 +Block 0027 [ 22]: bbc792a8c5c45ed4 +Block 0027 [ 23]: ac4483c0b511e762 +Block 0027 [ 24]: 5ad3c417ae5d8871 +Block 0027 [ 25]: 3a19b24b75fa3514 +Block 0027 [ 26]: c521b53027336b12 +Block 0027 [ 27]: d203b85c63c61d3d +Block 0027 [ 28]: c6a2d3ec7903561f +Block 0027 [ 29]: 9f3f4f2f68dab3b1 +Block 0027 [ 30]: b6ed64cc82dd7184 +Block 0027 [ 31]: 66d3d950dae1ea0d +Block 0027 [ 32]: 3302197c3166af1e +Block 0027 [ 33]: 2de9bcdd7e955b18 +Block 0027 [ 34]: 91774354af3f130e +Block 0027 [ 35]: 49fd29c31e5afa37 +Block 0027 [ 36]: cf15127b9889ccff +Block 0027 [ 37]: bf32b130475e7d2b +Block 0027 [ 38]: 8f6baa093c6922c4 +Block 0027 [ 39]: e536f69deb3f39f7 +Block 0027 [ 40]: b3aa896557db63a9 +Block 0027 [ 41]: cd5fadd0b10d9fbd +Block 0027 [ 42]: 1b2b35742385b35c +Block 0027 [ 43]: 968f676a7871062f +Block 0027 [ 44]: a9781975ef83fb7c +Block 0027 [ 45]: 03afc77a1c96d39d +Block 0027 [ 46]: 06e3fc87d2ec14b5 +Block 0027 [ 47]: 9f39adf7aeb1428a +Block 0027 [ 48]: 65792cbead640b35 +Block 0027 [ 49]: 1b01e121b917630e +Block 0027 [ 50]: 8f723e7ce5b7055a +Block 0027 [ 51]: 56e9cd8c13dcc689 +Block 0027 [ 52]: 779dcb4521e9450f +Block 0027 [ 53]: 4f816a3a79510b60 +Block 0027 [ 54]: 940968d0ff51043f +Block 0027 [ 55]: e3eb22ae71285ae3 +Block 0027 [ 56]: 5352d586b008f4b7 +Block 0027 [ 57]: 8968e2c80e34acf6 +Block 0027 [ 58]: 2fe4cbd66f0f62bd +Block 0027 [ 59]: 4412e98455d6b3c4 +Block 0027 [ 60]: 63dc9bd7674922fa +Block 0027 [ 61]: d62b9d372afaa8f8 +Block 0027 [ 62]: 3a3006d8fb94068e +Block 0027 [ 63]: 815e5f34f114968f +Block 0027 [ 64]: 884b99ab2472754c +Block 0027 [ 65]: f1b2eee8980314d2 +Block 0027 [ 66]: afcd0ea9ab782db0 +Block 0027 [ 67]: b9f1099e5dd97c02 +Block 0027 [ 68]: 9d6a1efbaf0cf440 +Block 0027 [ 69]: 11a007aa120f33d5 +Block 0027 [ 70]: 71a3f28332e22030 +Block 0027 [ 71]: 1ce6c4c0557f9c71 +Block 0027 [ 72]: e73571a85fd50173 +Block 0027 [ 73]: b64062eeeff4f8a6 +Block 0027 [ 74]: 1d4cc08c7c2a207b +Block 0027 [ 75]: 0413f787be8d7ca2 +Block 0027 [ 76]: d6287956626cc661 +Block 0027 [ 77]: 3159344b2e846c85 +Block 0027 [ 78]: 43d31539e09f2836 +Block 0027 [ 79]: c2f5b559e744a524 +Block 0027 [ 80]: 36a04346972a8e8d +Block 0027 [ 81]: 2b042a7c4e11eb16 +Block 0027 [ 82]: 2d6f6d59abca49af +Block 0027 [ 83]: c5e53fcc980a48fd +Block 0027 [ 84]: 97e35b537b4026ab +Block 0027 [ 85]: 909f2b09fa4a1cc2 +Block 0027 [ 86]: 62d2991a26be778b +Block 0027 [ 87]: a2425e86eb634fc8 +Block 0027 [ 88]: fb5640a059777a34 +Block 0027 [ 89]: 6a6eadde6ac7d594 +Block 0027 [ 90]: c0dbcd91d345ae09 +Block 0027 [ 91]: bf86ddc82ffd7d46 +Block 0027 [ 92]: ee815de26480a96b +Block 0027 [ 93]: b8ec956a34ee0486 +Block 0027 [ 94]: 07c555d99b043186 +Block 0027 [ 95]: 50a6ccdf83ee32dc +Block 0027 [ 96]: 48c40754eb0e5f57 +Block 0027 [ 97]: 39f05bbdd7b34d53 +Block 0027 [ 98]: 44a0e87f40e81992 +Block 0027 [ 99]: 7b32b1e3c6cb70a8 +Block 0027 [100]: 48c0c2e5a96f4309 +Block 0027 [101]: b0511dbd8b6f12e7 +Block 0027 [102]: 2327388ee4d6a519 +Block 0027 [103]: fcad9620b5f1d221 +Block 0027 [104]: ada988a1f98ae5fb +Block 0027 [105]: 941ab7d039656ff3 +Block 0027 [106]: a76b601d1469fc73 +Block 0027 [107]: 14840c333bd2fef9 +Block 0027 [108]: 9379106ce5adb55d +Block 0027 [109]: cd8e74667be14476 +Block 0027 [110]: f85336be53c43cb4 +Block 0027 [111]: f77eac2a589fae03 +Block 0027 [112]: 5eca210b987e2152 +Block 0027 [113]: 0f4c81d45eec28cc +Block 0027 [114]: a3677c3e83fc85b2 +Block 0027 [115]: ad84372c49345a2c +Block 0027 [116]: c936edbc9678f9d1 +Block 0027 [117]: 108af1465cebeeb2 +Block 0027 [118]: 4c69155540d282ca +Block 0027 [119]: 301cd4b7c6dfbc68 +Block 0027 [120]: 156f18eb609f9765 +Block 0027 [121]: 6e71b4bd0d6080cc +Block 0027 [122]: 3302923e332b9357 +Block 0027 [123]: e6dd3be8a881de18 +Block 0027 [124]: b2b04b33b588c3e6 +Block 0027 [125]: ce90c3fe9a0f4fd8 +Block 0027 [126]: 9028ea580a0f0a34 +Block 0027 [127]: d1201d962a6ef6c4 +Block 0028 [ 0]: a41067023facdbf1 +Block 0028 [ 1]: 42117505215fc851 +Block 0028 [ 2]: 108e80c173bd1c3f +Block 0028 [ 3]: 9141f7051483092c +Block 0028 [ 4]: 88b65a6f33e76738 +Block 0028 [ 5]: 274cc7845b9c6bcf +Block 0028 [ 6]: bda833869a62b8ec +Block 0028 [ 7]: 9baaae5b2628bf1b +Block 0028 [ 8]: 43d0f6acfbd5dd99 +Block 0028 [ 9]: a4ebf0896a3ae6e6 +Block 0028 [ 10]: fb9f2b0ff49710b8 +Block 0028 [ 11]: 7d0d05487d725a95 +Block 0028 [ 12]: 5c6a9fdd3885e820 +Block 0028 [ 13]: 94538a83eab9a2fc +Block 0028 [ 14]: 2e67502e854ccabd +Block 0028 [ 15]: 7f64f88fcce2535d +Block 0028 [ 16]: ed492c4e4992f88f +Block 0028 [ 17]: 9ecd515f9bf644cf +Block 0028 [ 18]: 192662dc782b6033 +Block 0028 [ 19]: c9e27c60336ef812 +Block 0028 [ 20]: f13adf1dba915c6f +Block 0028 [ 21]: e16ae4b064097259 +Block 0028 [ 22]: ba6acd840f6a95b9 +Block 0028 [ 23]: bd28c64416c87497 +Block 0028 [ 24]: a5694c6e1739296c +Block 0028 [ 25]: 2837fe7f1fc557f5 +Block 0028 [ 26]: 08adc15f77d25f7e +Block 0028 [ 27]: e76b6f75fc8c2044 +Block 0028 [ 28]: cf0755893ea4cbd2 +Block 0028 [ 29]: fe6bde1aa534077f +Block 0028 [ 30]: e0e8dca015cdaf13 +Block 0028 [ 31]: 1e12ce621518c367 +Block 0028 [ 32]: a46d5f31d4ad951d +Block 0028 [ 33]: bf9f1f29eec79a2b +Block 0028 [ 34]: 75fb87621dfaca5e +Block 0028 [ 35]: aa99a18fba30b9f4 +Block 0028 [ 36]: f340a2b9afe49e12 +Block 0028 [ 37]: a0c81166fe523ec0 +Block 0028 [ 38]: 18c5679fa18d8dec +Block 0028 [ 39]: 857f448b84cc46a6 +Block 0028 [ 40]: 28cfbe6f6fa9b7a5 +Block 0028 [ 41]: 1ff21c3f36c2108c +Block 0028 [ 42]: 2f66b9fb1363117f +Block 0028 [ 43]: dc0e82d652c2af78 +Block 0028 [ 44]: da14d9d236e1fed8 +Block 0028 [ 45]: 69204ca8ee4a6ed0 +Block 0028 [ 46]: 6ba8d0459653c081 +Block 0028 [ 47]: e98016f805291524 +Block 0028 [ 48]: 18f419584af64630 +Block 0028 [ 49]: 43bc85ffca0777e9 +Block 0028 [ 50]: b580e2fc779e6b2b +Block 0028 [ 51]: 28c19f5fa2ff0cc4 +Block 0028 [ 52]: e442186be0b5bba6 +Block 0028 [ 53]: dee3e42871bf79f1 +Block 0028 [ 54]: 64657b9b60bbe4c8 +Block 0028 [ 55]: 57a9f6c1a5fa724d +Block 0028 [ 56]: ccd48a4a80eeb087 +Block 0028 [ 57]: fb27c006c1b2f679 +Block 0028 [ 58]: 2fb81d57f7ad6cdc +Block 0028 [ 59]: bd3d9dbcd1118622 +Block 0028 [ 60]: 226e915fbad9b815 +Block 0028 [ 61]: 30a8efcbcd761a5c +Block 0028 [ 62]: fd5a51699d07d18e +Block 0028 [ 63]: 60feb45effa98a6f +Block 0028 [ 64]: e389526027b2d2f9 +Block 0028 [ 65]: e9a895742299a978 +Block 0028 [ 66]: 836cce4801d4f3f4 +Block 0028 [ 67]: 63a827f820eb9a56 +Block 0028 [ 68]: e2463a1337fa5ecb +Block 0028 [ 69]: 538e061174fe9d02 +Block 0028 [ 70]: ff3da50f9eacc5b7 +Block 0028 [ 71]: 72ff747a14b4deaf +Block 0028 [ 72]: 562a5e613f9216a6 +Block 0028 [ 73]: 09b455e274ecf7b9 +Block 0028 [ 74]: 4571adb359ffae0f +Block 0028 [ 75]: 77d145773f85eb65 +Block 0028 [ 76]: 653321f0978aa9b0 +Block 0028 [ 77]: d833640bae64a928 +Block 0028 [ 78]: 134c2d009161de97 +Block 0028 [ 79]: 572a9974caf440ce +Block 0028 [ 80]: 6e34acfc2479246b +Block 0028 [ 81]: 94fbf1aecbe288e9 +Block 0028 [ 82]: 8369eb0748dc31dc +Block 0028 [ 83]: 83a3a5121aadb6ba +Block 0028 [ 84]: 264e9a697238aa7b +Block 0028 [ 85]: e6ffe60119c76ed8 +Block 0028 [ 86]: 2c430f7143906fec +Block 0028 [ 87]: 9238a6c9d5f4afba +Block 0028 [ 88]: c00da35614c2881f +Block 0028 [ 89]: dfbc346cc39bf049 +Block 0028 [ 90]: 0656ce19387c8113 +Block 0028 [ 91]: 4a4cde62fb6ff8ab +Block 0028 [ 92]: 6e55b2f1984647e6 +Block 0028 [ 93]: 007cafd08b7aaad7 +Block 0028 [ 94]: 0384f97188460e76 +Block 0028 [ 95]: 4338c2b4b83d2539 +Block 0028 [ 96]: b73322013357363d +Block 0028 [ 97]: 451e6927a0913d00 +Block 0028 [ 98]: 58b2043cdd7c6a0d +Block 0028 [ 99]: 183122cadbe9185f +Block 0028 [100]: 81ee6f18af45d9b6 +Block 0028 [101]: e327593257a949fc +Block 0028 [102]: af66fc72039ece5d +Block 0028 [103]: 64c3f12a6828d7e6 +Block 0028 [104]: 535baf0447dd7dc9 +Block 0028 [105]: ab3685133dcea01c +Block 0028 [106]: 63521d74e4720a83 +Block 0028 [107]: 62fdb26fb8a968cc +Block 0028 [108]: 890dc6bee39e6960 +Block 0028 [109]: b3a588db142d1862 +Block 0028 [110]: d454509c53f9c707 +Block 0028 [111]: cc13b42b0dda6ff1 +Block 0028 [112]: 93b74454d71b4c67 +Block 0028 [113]: 9408f46f656aa155 +Block 0028 [114]: 7916c34481f18bc1 +Block 0028 [115]: adc72713cc045345 +Block 0028 [116]: efc93c7841bdfbb8 +Block 0028 [117]: 72cd273c12380207 +Block 0028 [118]: b52e668f7efbb3fb +Block 0028 [119]: 03bab24694276f9c +Block 0028 [120]: 3c204b2118460028 +Block 0028 [121]: c909683316566d5a +Block 0028 [122]: 5ed142b9097de57e +Block 0028 [123]: 7fde438b177fd13e +Block 0028 [124]: c690af7205e3ccfe +Block 0028 [125]: 8b26df008256dd60 +Block 0028 [126]: 5f029a090522e2f5 +Block 0028 [127]: 88b8989232f47a0d +Block 0029 [ 0]: 313681c3e41acd60 +Block 0029 [ 1]: d91bca0ae66c637a +Block 0029 [ 2]: 04e8251a37da2c17 +Block 0029 [ 3]: 07da61fc730e3511 +Block 0029 [ 4]: 6f9ffac85007ca4d +Block 0029 [ 5]: 3f58445980f06d19 +Block 0029 [ 6]: 09b199b3c76b4124 +Block 0029 [ 7]: 6ec402f46805c58d +Block 0029 [ 8]: d2eace042511a80a +Block 0029 [ 9]: f8da4c2a47e93bd4 +Block 0029 [ 10]: 4953ed5a237778ae +Block 0029 [ 11]: b705e27de76a555b +Block 0029 [ 12]: b0a7712f715a3503 +Block 0029 [ 13]: 2135389da8281211 +Block 0029 [ 14]: 5b599493e2f700f1 +Block 0029 [ 15]: 5a3533a86bc338d6 +Block 0029 [ 16]: d6fb3dd373c3fb84 +Block 0029 [ 17]: 9c4ccc8d1de3d9e7 +Block 0029 [ 18]: 4ea73fc13e1fd243 +Block 0029 [ 19]: b0b41da7ddc2d3a6 +Block 0029 [ 20]: d67556a766650ca3 +Block 0029 [ 21]: 7a87f2feea5c1da9 +Block 0029 [ 22]: ecfc385d0e2cf083 +Block 0029 [ 23]: 45368d1461cd994c +Block 0029 [ 24]: 407868af14ee24fb +Block 0029 [ 25]: a571550c7a1f0a73 +Block 0029 [ 26]: bc1ee9e657c9c105 +Block 0029 [ 27]: de2cc5016e459ee6 +Block 0029 [ 28]: ac85c053069088a0 +Block 0029 [ 29]: bd6aeb9b0ac2ead5 +Block 0029 [ 30]: d82d50fd33a3e8e2 +Block 0029 [ 31]: 307f52bdb3c29795 +Block 0029 [ 32]: 77a59a437b39120e +Block 0029 [ 33]: fce9e3144f78a966 +Block 0029 [ 34]: 3e1cc37711a7e326 +Block 0029 [ 35]: 2c628f1777d983a0 +Block 0029 [ 36]: 77648411897e4a1b +Block 0029 [ 37]: 98ab98c193783931 +Block 0029 [ 38]: ad036d72d5f29806 +Block 0029 [ 39]: 847bd5a73b146f88 +Block 0029 [ 40]: cd354a5bd2ccf5b4 +Block 0029 [ 41]: e806000c105fa663 +Block 0029 [ 42]: e070bb267fcd1243 +Block 0029 [ 43]: 120004ab2f855dfd +Block 0029 [ 44]: b2bbc2f65eabe428 +Block 0029 [ 45]: 4a098eb8a9a91ff3 +Block 0029 [ 46]: 1c00224e70a288a3 +Block 0029 [ 47]: 6d6a3fbd85a2f765 +Block 0029 [ 48]: 86b7c5d758c179a9 +Block 0029 [ 49]: b9418fcf1228990a +Block 0029 [ 50]: f3c6fa47d9a5da91 +Block 0029 [ 51]: afff8e6eb6b0d7d8 +Block 0029 [ 52]: fbe80c00bb485eb6 +Block 0029 [ 53]: 01378709c95d69e3 +Block 0029 [ 54]: 0d2b433f15c611ef +Block 0029 [ 55]: 7981be0be2a9d437 +Block 0029 [ 56]: 0d022dd3b0fef0b9 +Block 0029 [ 57]: 09b6fab3474a2f73 +Block 0029 [ 58]: 0d91c6a6e3cc9ec7 +Block 0029 [ 59]: f87b83735d308ba8 +Block 0029 [ 60]: 54b4dba310bd88f0 +Block 0029 [ 61]: 5ea520e83c20b705 +Block 0029 [ 62]: 59d2670bc502f17f +Block 0029 [ 63]: 721ca4b5908f7718 +Block 0029 [ 64]: ef0e946d1bf3bcb9 +Block 0029 [ 65]: 62fa48ad21c43e0c +Block 0029 [ 66]: 2a04832751467d97 +Block 0029 [ 67]: b2ec95e1d26942a8 +Block 0029 [ 68]: 8327ee8a28c749a1 +Block 0029 [ 69]: a5d8165578262604 +Block 0029 [ 70]: f0ea267b8c26b91c +Block 0029 [ 71]: 084cb7cf5531ef87 +Block 0029 [ 72]: 2732e9aaef147d79 +Block 0029 [ 73]: 1b6381fd914644c4 +Block 0029 [ 74]: 7419b71780d0d784 +Block 0029 [ 75]: f201bac39c320b37 +Block 0029 [ 76]: ce42070184066dd5 +Block 0029 [ 77]: 1df651ec7cf8e733 +Block 0029 [ 78]: ad1d8f667d73481e +Block 0029 [ 79]: 1f78565b46eb434a +Block 0029 [ 80]: 1a3f3009b4522979 +Block 0029 [ 81]: 6cd47ef6d04267d9 +Block 0029 [ 82]: 4a39fd5f469d8cc7 +Block 0029 [ 83]: 65f91813538053bc +Block 0029 [ 84]: a9a31eb605527161 +Block 0029 [ 85]: 2fd1255b5bcd6375 +Block 0029 [ 86]: 3f8542e21d0b690f +Block 0029 [ 87]: 114947f1e9ec2f9d +Block 0029 [ 88]: 4eebd36c8b747ca1 +Block 0029 [ 89]: 6c79dc594ac2b6d2 +Block 0029 [ 90]: 15ec09b5e91b9baa +Block 0029 [ 91]: 6b679f91d2e70b05 +Block 0029 [ 92]: 9044112a597d98ff +Block 0029 [ 93]: cd7356cf331ed49e +Block 0029 [ 94]: 2289fbcca68f8155 +Block 0029 [ 95]: 8e5210925b9bb7ab +Block 0029 [ 96]: 6102352f068f8cf4 +Block 0029 [ 97]: f75c6f5b364bdf6e +Block 0029 [ 98]: 4adb44d199e1b21d +Block 0029 [ 99]: 8572a78f72832a67 +Block 0029 [100]: 8a9be9459af145e7 +Block 0029 [101]: 7bbeb2a6194f8e9f +Block 0029 [102]: 946d6c9ce885afe8 +Block 0029 [103]: 2987514adc28fdef +Block 0029 [104]: d0ce50a68492e30a +Block 0029 [105]: 1dd87ea896a6cfda +Block 0029 [106]: 52018b7afc5d29c8 +Block 0029 [107]: 3f330a5203e6aba8 +Block 0029 [108]: 1ab316917f2550ec +Block 0029 [109]: 6f8eab32629a33bf +Block 0029 [110]: d946f816df91e2a9 +Block 0029 [111]: df0394272a8cf558 +Block 0029 [112]: c16fa502a1922da4 +Block 0029 [113]: 78981886ab7de65a +Block 0029 [114]: afc8ec9eddb17556 +Block 0029 [115]: 6095037aac2aac51 +Block 0029 [116]: be57b59cfec2d1ac +Block 0029 [117]: 32c35f6fb6388eab +Block 0029 [118]: f999903a5ee8f53d +Block 0029 [119]: 3b31837023238e6a +Block 0029 [120]: 7f0aef84e38845aa +Block 0029 [121]: b95f6cc42f15da2b +Block 0029 [122]: a110466efa197c33 +Block 0029 [123]: d672b963a4412d2a +Block 0029 [124]: 5cff9e860875e69e +Block 0029 [125]: e54a688a18a957dc +Block 0029 [126]: 4ea7386eb37b515b +Block 0029 [127]: 832110aef15e3a90 +Block 0030 [ 0]: 408b6edf7b6d76e8 +Block 0030 [ 1]: cdaec40a044edb88 +Block 0030 [ 2]: 67889ab6152afdcb +Block 0030 [ 3]: 9c05e196f92a3324 +Block 0030 [ 4]: 29b2b7b66c085796 +Block 0030 [ 5]: 15cfb2dca4c5ba8e +Block 0030 [ 6]: a6e2210668385b94 +Block 0030 [ 7]: 304e1faa20dde4eb +Block 0030 [ 8]: e020b30a1328a914 +Block 0030 [ 9]: 0bb51200dbae1919 +Block 0030 [ 10]: 1f89827bd0cd2685 +Block 0030 [ 11]: 4cf3c6e4183bb1d8 +Block 0030 [ 12]: 5b5df3a9e149e3e7 +Block 0030 [ 13]: 709b4402dafd008d +Block 0030 [ 14]: db17b2eafdb45f94 +Block 0030 [ 15]: 7d58b94409ca3b26 +Block 0030 [ 16]: 6a7a2a97933ce9f5 +Block 0030 [ 17]: 99c1673a757ca868 +Block 0030 [ 18]: 66be0bde99848db5 +Block 0030 [ 19]: 76778cdc3fd87363 +Block 0030 [ 20]: 8f7ba763e2500708 +Block 0030 [ 21]: 0030035d07ec5fdc +Block 0030 [ 22]: 9aec4aef00b2caf7 +Block 0030 [ 23]: ea91bb0a91fd2fd4 +Block 0030 [ 24]: e855a4fef28c4723 +Block 0030 [ 25]: a8ba555f79797dd8 +Block 0030 [ 26]: dba4f3b6d82436fb +Block 0030 [ 27]: 8e8937633dad67b1 +Block 0030 [ 28]: f3dcb5ff246778ce +Block 0030 [ 29]: 90f60fec9a7fe473 +Block 0030 [ 30]: a8f3330c49c7604f +Block 0030 [ 31]: c206d8fc6e4d656c +Block 0030 [ 32]: 472f2e4653c80e9d +Block 0030 [ 33]: a005dce2b9f47d49 +Block 0030 [ 34]: d211d4ea5cd4b7d6 +Block 0030 [ 35]: fe0f1444120846c6 +Block 0030 [ 36]: fa15fd1def127e14 +Block 0030 [ 37]: ac5dcf2b0a9576e0 +Block 0030 [ 38]: 455f0aa7ccc51e38 +Block 0030 [ 39]: 2359b04ce4ffa824 +Block 0030 [ 40]: e67bcab71417291e +Block 0030 [ 41]: c9842a22e6413101 +Block 0030 [ 42]: 40d66ed0eec1ff05 +Block 0030 [ 43]: e619379508a2380d +Block 0030 [ 44]: ed3128999706b8d4 +Block 0030 [ 45]: daf43ff2b3798f3b +Block 0030 [ 46]: 2297a50f89ea911e +Block 0030 [ 47]: 24974ef6978c6171 +Block 0030 [ 48]: af122d8bc2966070 +Block 0030 [ 49]: 3b1395bede3a62d0 +Block 0030 [ 50]: f2c9c53f8acc34b5 +Block 0030 [ 51]: 09592eed7eca3ba6 +Block 0030 [ 52]: 6265fa73035f278c +Block 0030 [ 53]: 27453b057745b250 +Block 0030 [ 54]: 58e561ff7c846a07 +Block 0030 [ 55]: d703c5f4913bc827 +Block 0030 [ 56]: 36271bffda0486c9 +Block 0030 [ 57]: d2d39c21360fe92e +Block 0030 [ 58]: e672846c80d55aef +Block 0030 [ 59]: 7d105fc325c91c5a +Block 0030 [ 60]: 68f9b57df6b83bff +Block 0030 [ 61]: 2082748779c8daf8 +Block 0030 [ 62]: 5a9c85cdc522417f +Block 0030 [ 63]: e96bcd019b9b486c +Block 0030 [ 64]: 235ee28d5d55e0c3 +Block 0030 [ 65]: eb3a4896469f0ec4 +Block 0030 [ 66]: a9463daca7c68291 +Block 0030 [ 67]: db08678f6153d8c7 +Block 0030 [ 68]: 1ec5fe9d4876f955 +Block 0030 [ 69]: 438d1307299993f2 +Block 0030 [ 70]: b0072c378b6cfb5d +Block 0030 [ 71]: 301ce10babee8f5d +Block 0030 [ 72]: 7c9b9bb3656e2db4 +Block 0030 [ 73]: 2d5b823e615ed753 +Block 0030 [ 74]: 4d673c349f7f8f13 +Block 0030 [ 75]: 50563f67797ec11f +Block 0030 [ 76]: 2685632a636d8aad +Block 0030 [ 77]: f83472de5cbbe1c6 +Block 0030 [ 78]: 0a6afea051cfb234 +Block 0030 [ 79]: eb98b35bf0f22db7 +Block 0030 [ 80]: 33ae1a95abbc098c +Block 0030 [ 81]: e91616e1ee4ef918 +Block 0030 [ 82]: 85716d42d5117cac +Block 0030 [ 83]: 8b0cfd81e670d7fe +Block 0030 [ 84]: c4bcb8dfeab2d5f1 +Block 0030 [ 85]: 8e0919c4bba64c94 +Block 0030 [ 86]: 4975b344cea18ee4 +Block 0030 [ 87]: 113039374ab49733 +Block 0030 [ 88]: f45ac779ae82a794 +Block 0030 [ 89]: dc1997bc3e941b34 +Block 0030 [ 90]: 17e3bdb9964e15a4 +Block 0030 [ 91]: 96ef0d0a598f7fd1 +Block 0030 [ 92]: df40353b051d5733 +Block 0030 [ 93]: e9332d784569c844 +Block 0030 [ 94]: e1d787472d41400a +Block 0030 [ 95]: e2869b0fa1f50af8 +Block 0030 [ 96]: af4af34b650d6926 +Block 0030 [ 97]: cfbcf7752b18c771 +Block 0030 [ 98]: 14887d9431f8c85a +Block 0030 [ 99]: 0cabbcef9a8e83ae +Block 0030 [100]: 62603de80ca6f069 +Block 0030 [101]: 460cce0f55659156 +Block 0030 [102]: 45f9e9b01da609cb +Block 0030 [103]: 957f9ba08dc91aea +Block 0030 [104]: 2716e73926fee4e8 +Block 0030 [105]: 9f30d53562bf353f +Block 0030 [106]: 0c91e8e4bd2ad7d0 +Block 0030 [107]: f31e079c8f7caeee +Block 0030 [108]: 05088ae684266d49 +Block 0030 [109]: b2413829a2145da5 +Block 0030 [110]: e1d9ad663aeb39fa +Block 0030 [111]: 4da017dc0924aa29 +Block 0030 [112]: a349f9eab20ea439 +Block 0030 [113]: 4752d31b48cbae21 +Block 0030 [114]: fbd84024e44caf92 +Block 0030 [115]: ba45887fb5412ff6 +Block 0030 [116]: 8de783c468d6448b +Block 0030 [117]: 7caa49cbd2592562 +Block 0030 [118]: 0cba3416ddd50181 +Block 0030 [119]: f2a52ea38b17cd73 +Block 0030 [120]: 2b627bf5f43c795f +Block 0030 [121]: d4f2048eed46a1cf +Block 0030 [122]: 9869b787c2659a03 +Block 0030 [123]: 291e0afd857d3d1d +Block 0030 [124]: ab227091de0a2ff0 +Block 0030 [125]: 0c09f15ca0e8bd34 +Block 0030 [126]: 6f4f9df1ea2ff4ca +Block 0030 [127]: d30af31b90a27ba7 +Block 0031 [ 0]: 89c7770e0637993f +Block 0031 [ 1]: 07197d828987a604 +Block 0031 [ 2]: 1eb45ba81728e842 +Block 0031 [ 3]: bb5a9840b6356a29 +Block 0031 [ 4]: af7780e7c496d1ff +Block 0031 [ 5]: dc8dccbf1fc8877a +Block 0031 [ 6]: 415d6cd8f543d990 +Block 0031 [ 7]: 4ea854c764c72a91 +Block 0031 [ 8]: 23fa956665955178 +Block 0031 [ 9]: 9a623692c01c8c3b +Block 0031 [ 10]: feb64166768fdbe9 +Block 0031 [ 11]: 4bcc60ef9434362c +Block 0031 [ 12]: 1fe8f1363f2c7b8c +Block 0031 [ 13]: 1f534df306ebb6a1 +Block 0031 [ 14]: ca7cc8fa8a7ccdf6 +Block 0031 [ 15]: cffc2531375c9e14 +Block 0031 [ 16]: 5a2bc32f0685bf45 +Block 0031 [ 17]: 3623f096a638438b +Block 0031 [ 18]: 57f791cf43d44568 +Block 0031 [ 19]: 470709fe0f7cdb14 +Block 0031 [ 20]: ea55cd16896a0b6b +Block 0031 [ 21]: 88bcb41ef6b2b157 +Block 0031 [ 22]: facb052f4d2c0d29 +Block 0031 [ 23]: 0a9b9eee1015ec4c +Block 0031 [ 24]: 13a0ade94e8d5555 +Block 0031 [ 25]: 96d74483bbc65425 +Block 0031 [ 26]: 5c5b3ca4b394be63 +Block 0031 [ 27]: 7ba2bfd959972e5f +Block 0031 [ 28]: b6522c3447665f79 +Block 0031 [ 29]: 64f6d68df4731ab4 +Block 0031 [ 30]: 560814a1051309c3 +Block 0031 [ 31]: 66ddf600fc6df4ee +Block 0031 [ 32]: 9900dc54c58d033f +Block 0031 [ 33]: 47f59e6b327d8e20 +Block 0031 [ 34]: bf33aa2244234bf1 +Block 0031 [ 35]: d3f691ecfe8c299b +Block 0031 [ 36]: 9e873b677f39ab86 +Block 0031 [ 37]: 75280f1c41300133 +Block 0031 [ 38]: 871e6602bb3ffb07 +Block 0031 [ 39]: 2a6319f258314678 +Block 0031 [ 40]: 97c2aaa125822db6 +Block 0031 [ 41]: e7bf880a1c7206ea +Block 0031 [ 42]: 196205598ec8f3b8 +Block 0031 [ 43]: cc6facefe12a1646 +Block 0031 [ 44]: a084acb57b445ceb +Block 0031 [ 45]: 052a7e2f7445bd31 +Block 0031 [ 46]: 7aa75e11161a5c24 +Block 0031 [ 47]: 686b9c4f2f5a23f6 +Block 0031 [ 48]: caa72eb4f8224ccf +Block 0031 [ 49]: a49541af0e3e242f +Block 0031 [ 50]: 3d2466672beea318 +Block 0031 [ 51]: c06207046ee65d5b +Block 0031 [ 52]: fe85635b22b6c656 +Block 0031 [ 53]: 229f18db75c70852 +Block 0031 [ 54]: 7dd9b36113efb72d +Block 0031 [ 55]: def0c1642032db45 +Block 0031 [ 56]: f320411dd1e888cd +Block 0031 [ 57]: 941e400b71a1335a +Block 0031 [ 58]: 67096e11cbc4fd48 +Block 0031 [ 59]: 4da96e1352bfcbfe +Block 0031 [ 60]: 156d67b4034efb2e +Block 0031 [ 61]: 7c3382bc2090a28f +Block 0031 [ 62]: 4bfa37978e24699a +Block 0031 [ 63]: 0bd050e6315619cf +Block 0031 [ 64]: 655205650866af61 +Block 0031 [ 65]: 017af77ec3ade1f6 +Block 0031 [ 66]: 9e9a2de2b181699d +Block 0031 [ 67]: b0146094deb7f12d +Block 0031 [ 68]: a8af88fffce3f712 +Block 0031 [ 69]: b109acbac6a3c08a +Block 0031 [ 70]: f80e22eac1c0e74e +Block 0031 [ 71]: 0ae3ce8462a0c4b5 +Block 0031 [ 72]: b9dd83c924e9009c +Block 0031 [ 73]: 5641c337ad3ec86e +Block 0031 [ 74]: d9f5563f75b4bf20 +Block 0031 [ 75]: bce9dbc659678f09 +Block 0031 [ 76]: 79250dd6a0392f8d +Block 0031 [ 77]: f8bef33608540e87 +Block 0031 [ 78]: d1c55b7b0584153a +Block 0031 [ 79]: 57776b6e818f7892 +Block 0031 [ 80]: c142b628cc6ee052 +Block 0031 [ 81]: e96b4db38bca244e +Block 0031 [ 82]: 556f1f3a16838b79 +Block 0031 [ 83]: bc475f68d72ddd98 +Block 0031 [ 84]: 7052f29f0da9b557 +Block 0031 [ 85]: 7b0cd825716d371b +Block 0031 [ 86]: 39ad7edbd2183ec5 +Block 0031 [ 87]: 84bef8ba060cefee +Block 0031 [ 88]: 812874fe8c3d0e0e +Block 0031 [ 89]: 11221a9493e8000a +Block 0031 [ 90]: ece764a8577a86f5 +Block 0031 [ 91]: a2f854d90a6987e0 +Block 0031 [ 92]: b1ea4324413dee11 +Block 0031 [ 93]: 4d76b35d0630f2ce +Block 0031 [ 94]: 1c14e37978e625c7 +Block 0031 [ 95]: a7a2956659999cfb +Block 0031 [ 96]: 2a1bc299a08be7d5 +Block 0031 [ 97]: 8b1de787db57d8b6 +Block 0031 [ 98]: 84546aabc8dcec8d +Block 0031 [ 99]: 74c55dc4c475fdd6 +Block 0031 [100]: 2fb4398a4f038499 +Block 0031 [101]: b3c6fa84200af9ab +Block 0031 [102]: 6a238dbd35570832 +Block 0031 [103]: 93a6a66d30e78ca7 +Block 0031 [104]: c2cf43cab843ba27 +Block 0031 [105]: 693cd69603e50ea4 +Block 0031 [106]: 6c14b77422c297a3 +Block 0031 [107]: d4fde0d4961b0b2a +Block 0031 [108]: 17f5c37030ca0df1 +Block 0031 [109]: 0a59e439206f2146 +Block 0031 [110]: 893f7ea1fce91480 +Block 0031 [111]: 0e89dfb3c481025f +Block 0031 [112]: d353be1933487620 +Block 0031 [113]: 88281e8286858847 +Block 0031 [114]: 2121b95d14d599b2 +Block 0031 [115]: e8dbf256a428526d +Block 0031 [116]: f7a6a26ab63a5bd4 +Block 0031 [117]: a05b9862052e1a49 +Block 0031 [118]: cf06bdbbda98c3f6 +Block 0031 [119]: 2001d765e3a3df2d +Block 0031 [120]: 33cb41b5981d1d85 +Block 0031 [121]: ffde63f1ee689564 +Block 0031 [122]: d2285236a47f5f22 +Block 0031 [123]: 2137a6082473dd47 +Block 0031 [124]: b350898ce34e6313 +Block 0031 [125]: 0e6a8437f71591eb +Block 0031 [126]: 262f62ad801339fe +Block 0031 [127]: 5e74704b5c91286c +Tag: 87 ae ed d6 51 7a b8 30 cd 97 65 cd 82 31 ab b2 e6 47 a5 de e0 8f 7c 05 e0 2f cb 76 33 35 d0 fd diff --git a/deps/phc-winner-argon2-20190702/kats/argon2i_v16.shasum b/deps/phc-winner-argon2-20190702/kats/argon2i_v16.shasum new file mode 100644 index 000000000..d36ecf6bc --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2i_v16.shasum @@ -0,0 +1 @@ +334f03e627afb67b946a530b90d2e11fb2e6abb44df992c0fb3198c7bacf5930 argon2i_v16 diff --git a/deps/phc-winner-argon2-20190702/kats/argon2id b/deps/phc-winner-argon2-20190702/kats/argon2id new file mode 100644 index 000000000..e5cdc6bb4 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2id @@ -0,0 +1,12304 @@ +======================================= +Argon2id version number 19 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: 28 89 de 48 7e b4 2a e5 00 c0 00 7e d9 25 2f 10 69 ea de c4 0d 57 65 b4 85 de 6d c2 43 7a 67 b8 54 6a 2f 0a cc 1a 08 82 db 8f cf 74 71 4b 47 2e 94 df 42 1a 5d a1 11 2f fa 11 43 43 70 a1 e9 97 + + After pass 0: +Block 0000 [ 0]: 6b2e09f10671bd43 +Block 0000 [ 1]: f69f5c27918a21be +Block 0000 [ 2]: dea7810ea41290e1 +Block 0000 [ 3]: 6787f7171870f893 +Block 0000 [ 4]: ca5aa8f5067b374c +Block 0000 [ 5]: 44cfcab94f414104 +Block 0000 [ 6]: 52525e831cf8cd52 +Block 0000 [ 7]: 3a1dcb76ae77f701 +Block 0000 [ 8]: db83ddac706d23d2 +Block 0000 [ 9]: ff63a62e68b98fa3 +Block 0000 [ 10]: 41ed55a99544e453 +Block 0000 [ 11]: 2ff6fa0d226c86fd +Block 0000 [ 12]: d7bf6d9a64e8b77b +Block 0000 [ 13]: a91ad24e61bffd45 +Block 0000 [ 14]: 7ebe9eea09adcd6c +Block 0000 [ 15]: e36884638b4c2996 +Block 0000 [ 16]: 5a54f32034697f4f +Block 0000 [ 17]: c885338cc4b929b7 +Block 0000 [ 18]: 51ba0bc044e3824c +Block 0000 [ 19]: ed9f60beee0ef312 +Block 0000 [ 20]: 6b169d498354fc50 +Block 0000 [ 21]: 32558851498c40ab +Block 0000 [ 22]: 8ba7642fbeb45909 +Block 0000 [ 23]: 8f9116af74ac6f46 +Block 0000 [ 24]: 2bff5ab7dbafffc7 +Block 0000 [ 25]: e49180713e66f3b3 +Block 0000 [ 26]: 332fe6daa4470665 +Block 0000 [ 27]: 7020c366c240dcfb +Block 0000 [ 28]: e5d88f78ac3e34dd +Block 0000 [ 29]: c52d58be17414590 +Block 0000 [ 30]: 3352cf25776e1689 +Block 0000 [ 31]: a08e922d19fdd765 +Block 0000 [ 32]: e810be2e50ffb55b +Block 0000 [ 33]: b159f1df83ab1136 +Block 0000 [ 34]: 0bf0fc23087ada59 +Block 0000 [ 35]: 991bfc5546f666a1 +Block 0000 [ 36]: 53a8168331d2e667 +Block 0000 [ 37]: 0a22a7e602c9abf5 +Block 0000 [ 38]: f646df091f9fab89 +Block 0000 [ 39]: 443c5ccb1ce10fc4 +Block 0000 [ 40]: 5fd384c9733ed4db +Block 0000 [ 41]: ce9a8f3699656a0d +Block 0000 [ 42]: cd37f767761c01ce +Block 0000 [ 43]: 2cc83d42946298b7 +Block 0000 [ 44]: 2bf5e7f0cb3dcb42 +Block 0000 [ 45]: e7a9e9eb031220ef +Block 0000 [ 46]: f78ddc5798e9be61 +Block 0000 [ 47]: c1bae043cab313a2 +Block 0000 [ 48]: 20e56ae7aa583904 +Block 0000 [ 49]: 0427402b61da57e0 +Block 0000 [ 50]: 770213016f71783c +Block 0000 [ 51]: 0b27d25052c1318b +Block 0000 [ 52]: d0caa69623b7e3ca +Block 0000 [ 53]: 9d7687e6a4ddce68 +Block 0000 [ 54]: e11ccf69d0f43b9c +Block 0000 [ 55]: 3f5a72caca81768b +Block 0000 [ 56]: e176a61b2e4da20f +Block 0000 [ 57]: 78a1aadbd9034284 +Block 0000 [ 58]: 49c049c7e00f9f59 +Block 0000 [ 59]: 6516f857a388f947 +Block 0000 [ 60]: a20d291c489e2e8b +Block 0000 [ 61]: e458d45b639d473c +Block 0000 [ 62]: 710c8c68ea1a26f7 +Block 0000 [ 63]: b290e665e27ab467 +Block 0000 [ 64]: 5c7633ea3703456b +Block 0000 [ 65]: 97571c02d657ce16 +Block 0000 [ 66]: 7b74cb951bc63514 +Block 0000 [ 67]: 23df75070130eb01 +Block 0000 [ 68]: eaace1e4ef1c8468 +Block 0000 [ 69]: d4dbceb8be3b1453 +Block 0000 [ 70]: 6a9fbba608aef476 +Block 0000 [ 71]: ddde0d99a8064a7a +Block 0000 [ 72]: 441a8cb66f88155b +Block 0000 [ 73]: 4a4c89ff8ea10fb4 +Block 0000 [ 74]: 3150ca9f9aed17cd +Block 0000 [ 75]: 6fc43b923d8ef6bd +Block 0000 [ 76]: 0b052515cb3197ab +Block 0000 [ 77]: 2a7f5d8c9f488664 +Block 0000 [ 78]: 110677ccfae3c81d +Block 0000 [ 79]: 1361f368edc978a2 +Block 0000 [ 80]: 51ad3a92b967d0c9 +Block 0000 [ 81]: 0f2ea496b44e1770 +Block 0000 [ 82]: 6f9c634a373cd5ff +Block 0000 [ 83]: aa21db063b0fb2be +Block 0000 [ 84]: 9ee5aa9033b8f489 +Block 0000 [ 85]: 3f56fd9d86dadea5 +Block 0000 [ 86]: 66f16b9849a00547 +Block 0000 [ 87]: 36171aaaeec11729 +Block 0000 [ 88]: 727119a32839d715 +Block 0000 [ 89]: 6278f4ba2188b967 +Block 0000 [ 90]: 6016719be569d76d +Block 0000 [ 91]: 36ac551e8e4a7bb5 +Block 0000 [ 92]: 06856164afe00095 +Block 0000 [ 93]: b8352672d69e8fd3 +Block 0000 [ 94]: 14926dad97d80627 +Block 0000 [ 95]: 6580259e95e8bd50 +Block 0000 [ 96]: 1932b5ff8287678f +Block 0000 [ 97]: 5d1a6bc6990f5960 +Block 0000 [ 98]: d7c5f4e4c3a7d856 +Block 0000 [ 99]: 88ad4b387d04817c +Block 0000 [100]: 38274590e64966c4 +Block 0000 [101]: 3ff81dc3610d60c6 +Block 0000 [102]: fbdc0c109a21d105 +Block 0000 [103]: bd77872efc5408ab +Block 0000 [104]: 6fa6bf9d96867be7 +Block 0000 [105]: f9cadf98fd4cf9ed +Block 0000 [106]: b23ffef15cbc7050 +Block 0000 [107]: 18aaa665bcc3b0e2 +Block 0000 [108]: 01070129cd4180f2 +Block 0000 [109]: f2514e7444d5cc41 +Block 0000 [110]: 998b45553a602fdd +Block 0000 [111]: 60094a7dc2ea8067 +Block 0000 [112]: faf57e40a119f4cf +Block 0000 [113]: 0b8c446b4b92020e +Block 0000 [114]: 6328254d21dcd105 +Block 0000 [115]: 7d88651de8ae3b6d +Block 0000 [116]: 03b5dcb7d1c28dbb +Block 0000 [117]: a61907655686f033 +Block 0000 [118]: 72831d520ad11387 +Block 0000 [119]: 33c98216d672085a +Block 0000 [120]: 578c5b7e80bf4671 +Block 0000 [121]: 52ddcbcc04e51448 +Block 0000 [122]: 01d951ee5923331b +Block 0000 [123]: d4a4597a1810415c +Block 0000 [124]: 420f07791bc9ecc3 +Block 0000 [125]: 3cd3138619d3f4fa +Block 0000 [126]: 137074e156a0690a +Block 0000 [127]: 8e4dd579ca1c1da0 +Block 0001 [ 0]: f727b5d2f5c54303 +Block 0001 [ 1]: 2fc5a656b980caa6 +Block 0001 [ 2]: 5c08c32e1796ab0e +Block 0001 [ 3]: 4ca1ed895a4692d5 +Block 0001 [ 4]: 68f05910c89460ef +Block 0001 [ 5]: 1ec8ac48623f9981 +Block 0001 [ 6]: 79bbc5c7317644d5 +Block 0001 [ 7]: 0d863b20b80d7266 +Block 0001 [ 8]: 8aa4ed020a3baeb2 +Block 0001 [ 9]: 8f72ae567b348b9d +Block 0001 [ 10]: a1f7a1370c9b7573 +Block 0001 [ 11]: 41d52ec493493843 +Block 0001 [ 12]: 780010b2f82c41e2 +Block 0001 [ 13]: 9227cb89939c4cf1 +Block 0001 [ 14]: 6d47b74940af209f +Block 0001 [ 15]: 22cf0b5f094be138 +Block 0001 [ 16]: eb3e235ec8745428 +Block 0001 [ 17]: fe2c2122d0d5741c +Block 0001 [ 18]: 48ca66bf709ae635 +Block 0001 [ 19]: 15975e305ed93fa3 +Block 0001 [ 20]: d6505e1ef94f37d0 +Block 0001 [ 21]: 0694f39f81e3a524 +Block 0001 [ 22]: 070c243d124b0a45 +Block 0001 [ 23]: b4492e0d58c75f3d +Block 0001 [ 24]: 26cdf6dc18a05336 +Block 0001 [ 25]: a1d074f1742e7363 +Block 0001 [ 26]: 45573fceeb9df977 +Block 0001 [ 27]: dcf4f450214c6422 +Block 0001 [ 28]: be560e719551ec36 +Block 0001 [ 29]: 22047152294cf78f +Block 0001 [ 30]: b1a69d55260c455b +Block 0001 [ 31]: a5b140ee053a67fe +Block 0001 [ 32]: 504074e4519947c8 +Block 0001 [ 33]: 0c956c5016864c1e +Block 0001 [ 34]: 38252f16cd4047f3 +Block 0001 [ 35]: 98c45cddb7290653 +Block 0001 [ 36]: 4e2cb095a3c32d7b +Block 0001 [ 37]: 27bc5bdf70afa578 +Block 0001 [ 38]: ed72b0e3ef683363 +Block 0001 [ 39]: 073f517b2dd80ea8 +Block 0001 [ 40]: 3be98a1a15a06f5f +Block 0001 [ 41]: 45f8a0bb8c3311f9 +Block 0001 [ 42]: 2652050c60058b35 +Block 0001 [ 43]: 220db5da269c42e9 +Block 0001 [ 44]: c9873eca93f9284d +Block 0001 [ 45]: 51e541e20ed3b717 +Block 0001 [ 46]: ab5577167a08dbe0 +Block 0001 [ 47]: dba843bcce1a4f97 +Block 0001 [ 48]: 7522310037167b42 +Block 0001 [ 49]: ae4f7625ac90fe15 +Block 0001 [ 50]: d0e88f7c46c53b68 +Block 0001 [ 51]: 44493d819ccf6116 +Block 0001 [ 52]: fb4a375515aac232 +Block 0001 [ 53]: 4eaf852bb04d832b +Block 0001 [ 54]: e004532fdf1f8a77 +Block 0001 [ 55]: 9e42ab4ede979be6 +Block 0001 [ 56]: eca0e805ad14469d +Block 0001 [ 57]: 2376bdd6b2a4e830 +Block 0001 [ 58]: fd4e52a9d1bbcb1e +Block 0001 [ 59]: 98fe361ab93d4cad +Block 0001 [ 60]: 6eaba863b1306d52 +Block 0001 [ 61]: 3e3eba82e84b50ce +Block 0001 [ 62]: 109393a39574f740 +Block 0001 [ 63]: 71d8dff2a4631238 +Block 0001 [ 64]: 023b3d3a21dbd6bf +Block 0001 [ 65]: 5777a50dbb69bbea +Block 0001 [ 66]: 67d2e2b98a33d217 +Block 0001 [ 67]: 2770484d5df31656 +Block 0001 [ 68]: 44ad2348a99a53e6 +Block 0001 [ 69]: 192bdd10c8741f1c +Block 0001 [ 70]: 26bc650bf48813cf +Block 0001 [ 71]: 00b6212dd45770e3 +Block 0001 [ 72]: d3b303f8d0e40ad7 +Block 0001 [ 73]: 511f3b88d352e54b +Block 0001 [ 74]: d39bc6144ac34aaa +Block 0001 [ 75]: 655c0808fdbd0c47 +Block 0001 [ 76]: d47c00e57c1d9dc4 +Block 0001 [ 77]: 27047a13946a7b07 +Block 0001 [ 78]: ba6afef7bf5c92d9 +Block 0001 [ 79]: 06a21ec0edb3ef37 +Block 0001 [ 80]: 78fad9da3ec74d75 +Block 0001 [ 81]: 2c5ee3cf300d5035 +Block 0001 [ 82]: 48cd34c84833254b +Block 0001 [ 83]: c72859ba124c6410 +Block 0001 [ 84]: 1a95c95581d67a24 +Block 0001 [ 85]: 469ff3df7e307532 +Block 0001 [ 86]: 7f1b94f113685691 +Block 0001 [ 87]: 91302b3fb0dc0f5e +Block 0001 [ 88]: c2307db64d2c4b4f +Block 0001 [ 89]: f2e3aeaea45bf48b +Block 0001 [ 90]: a3a4456787fe1021 +Block 0001 [ 91]: f9d9f56ed79a693e +Block 0001 [ 92]: d499174ccec1aa6a +Block 0001 [ 93]: 9d736ac57aec8096 +Block 0001 [ 94]: 7d02face37b3f3f5 +Block 0001 [ 95]: 26b5b9d2ccf4936b +Block 0001 [ 96]: 91d5c0393d5e4342 +Block 0001 [ 97]: 56594cb140bc3e21 +Block 0001 [ 98]: 35d8e19e19052a57 +Block 0001 [ 99]: 76a3e30c157a2394 +Block 0001 [100]: 3931ad30ac2f1385 +Block 0001 [101]: 7be8a2faaab85a90 +Block 0001 [102]: 02c7a5787f806c64 +Block 0001 [103]: 45b6a0efbe86d4b2 +Block 0001 [104]: deb784749dde8bc7 +Block 0001 [105]: a66bb8858e7500cb +Block 0001 [106]: bd8d508588c76ec4 +Block 0001 [107]: 6cb11235b27459a1 +Block 0001 [108]: 98e417a18c80222a +Block 0001 [109]: 39d142ff0552ddfb +Block 0001 [110]: 743c8580c0b99adb +Block 0001 [111]: f636e439e816b733 +Block 0001 [112]: 93b827603b32c52d +Block 0001 [113]: bba4334422741b32 +Block 0001 [114]: 2f4de2810b3a5cad +Block 0001 [115]: 5d0d8ccf002b95be +Block 0001 [116]: 921acd65ef4dd220 +Block 0001 [117]: 0fb7f4732577649f +Block 0001 [118]: 262d7ab021de8924 +Block 0001 [119]: 29aff84fbb4f249e +Block 0001 [120]: a503d32085ca5f78 +Block 0001 [121]: e244661f87621638 +Block 0001 [122]: 93f2ff03e3997016 +Block 0001 [123]: 69c2d47c210f47e5 +Block 0001 [124]: e782c3726723d164 +Block 0001 [125]: cac6f9d71f31beae +Block 0001 [126]: ed0e35037219abf0 +Block 0001 [127]: c56325d142c23d49 +Block 0002 [ 0]: 37542c2df4c423ff +Block 0002 [ 1]: 6cf1d602626f0fc1 +Block 0002 [ 2]: 449e5a5d622d8883 +Block 0002 [ 3]: 79ec5285f3ba957c +Block 0002 [ 4]: cc62f30b0b412ef0 +Block 0002 [ 5]: b47e35f1c950a027 +Block 0002 [ 6]: c5a5c6ab91729a64 +Block 0002 [ 7]: 020dbf60ec862cd5 +Block 0002 [ 8]: cf41de734d20ea2a +Block 0002 [ 9]: f9deadfe55574976 +Block 0002 [ 10]: ed50e4af98091491 +Block 0002 [ 11]: 500489fa3ba28742 +Block 0002 [ 12]: da566e1b85f51522 +Block 0002 [ 13]: b8f8ef6271893952 +Block 0002 [ 14]: cc1705c220d77c80 +Block 0002 [ 15]: 1e4dcb35323c2b1f +Block 0002 [ 16]: 0454a227bbf5c043 +Block 0002 [ 17]: e8a04d31c4d0918d +Block 0002 [ 18]: 6869e1be1a48b6e8 +Block 0002 [ 19]: 9fc384834694d4a3 +Block 0002 [ 20]: a14a4ff00ef57672 +Block 0002 [ 21]: c1a352faf5ec4bf7 +Block 0002 [ 22]: b5304731b08b2bca +Block 0002 [ 23]: 1524a444b939f583 +Block 0002 [ 24]: dfdfc62e544ee931 +Block 0002 [ 25]: 5b419d64efb6b859 +Block 0002 [ 26]: 1cad24e9741c95a9 +Block 0002 [ 27]: 9f3d3cd6121481be +Block 0002 [ 28]: 2bcf04a2f0a5ab51 +Block 0002 [ 29]: 6ab606ce39530d4e +Block 0002 [ 30]: b3d73d18a2d59067 +Block 0002 [ 31]: 73d5536c83faca70 +Block 0002 [ 32]: 1643a26ee60dd698 +Block 0002 [ 33]: b696edd0dcf041ab +Block 0002 [ 34]: 59374f36716bf5e4 +Block 0002 [ 35]: 15f5b0bc4ef1e83e +Block 0002 [ 36]: 51593489c4070cd7 +Block 0002 [ 37]: 8ea9d72e8ed25933 +Block 0002 [ 38]: ec1cff045b2851da +Block 0002 [ 39]: fc8ca9e07c1e5b94 +Block 0002 [ 40]: a80f56f79969cb47 +Block 0002 [ 41]: bce30dd5ee75b67b +Block 0002 [ 42]: 1b92c884e1fc7dcd +Block 0002 [ 43]: f6cdb641c3499906 +Block 0002 [ 44]: d7a61c7ceda83b95 +Block 0002 [ 45]: ef369d5b2addc65a +Block 0002 [ 46]: 41a37a1593450b26 +Block 0002 [ 47]: d67ee1a0ed052b6f +Block 0002 [ 48]: 790670599857280d +Block 0002 [ 49]: ef09a474d602a71f +Block 0002 [ 50]: 5c848619faeb4345 +Block 0002 [ 51]: 11ed266e34885c8b +Block 0002 [ 52]: 441142a800d7110e +Block 0002 [ 53]: c38c2899b733098d +Block 0002 [ 54]: 28ba4d75aca037e4 +Block 0002 [ 55]: 68090ec72cb7c46b +Block 0002 [ 56]: 760c2760e04a7c2a +Block 0002 [ 57]: 9b97c70acceb8c92 +Block 0002 [ 58]: 5fba5c38b2e15641 +Block 0002 [ 59]: 50f86dd277b866a4 +Block 0002 [ 60]: 8039c1367519c219 +Block 0002 [ 61]: 5e757c150da38ee9 +Block 0002 [ 62]: 07b859d43b600353 +Block 0002 [ 63]: 75c2360defe114f1 +Block 0002 [ 64]: a7759837a37400b7 +Block 0002 [ 65]: ba58e8ee8b8f1c39 +Block 0002 [ 66]: 864efeada86a8473 +Block 0002 [ 67]: 771d733623a03670 +Block 0002 [ 68]: 82ae44a9cec2888c +Block 0002 [ 69]: 39767840d86b49f9 +Block 0002 [ 70]: 862efb1223f3dd57 +Block 0002 [ 71]: 6c0a1554741c61bc +Block 0002 [ 72]: 220c6a98d43773a3 +Block 0002 [ 73]: 666ce3eb68da30ff +Block 0002 [ 74]: 4aabf6192271b063 +Block 0002 [ 75]: b97d63b09305732b +Block 0002 [ 76]: 9c036e99fdc41a86 +Block 0002 [ 77]: 0c9553db473231e8 +Block 0002 [ 78]: d3943f668c0b6c0b +Block 0002 [ 79]: 07cd9bf597d17086 +Block 0002 [ 80]: be683d427fc7bd35 +Block 0002 [ 81]: 278c7dac1544b192 +Block 0002 [ 82]: 251fefb71350aed4 +Block 0002 [ 83]: 85f9242deb8e6dc2 +Block 0002 [ 84]: 6c2d92e5b026defa +Block 0002 [ 85]: 8a6e5a2c0dd4f320 +Block 0002 [ 86]: 9feb2206de02a227 +Block 0002 [ 87]: ebf895ed6bf28049 +Block 0002 [ 88]: 4370fe0c90ded371 +Block 0002 [ 89]: 3e15ac9b74b8bd29 +Block 0002 [ 90]: 6aee88d8288707eb +Block 0002 [ 91]: a2c4a130ef335227 +Block 0002 [ 92]: 49e0065e1e168905 +Block 0002 [ 93]: 7c8f1d39d365f761 +Block 0002 [ 94]: 17f3a79f154e7af3 +Block 0002 [ 95]: 8556abf3d775a8cb +Block 0002 [ 96]: e92cb241d42d215d +Block 0002 [ 97]: e27038d2dc363774 +Block 0002 [ 98]: c698e01379eee779 +Block 0002 [ 99]: 0e9851af7296a899 +Block 0002 [100]: 35796451a0ba1749 +Block 0002 [101]: a699ea7d0e2a1754 +Block 0002 [102]: b16fb729ee40602a +Block 0002 [103]: ae3d2de416b7a411 +Block 0002 [104]: d009f76fb4349a93 +Block 0002 [105]: 82e6e58f5f7af70f +Block 0002 [106]: 16e405c51698662e +Block 0002 [107]: 95f4af34a6330e64 +Block 0002 [108]: 94f7bf613dbaa17f +Block 0002 [109]: 5152a3ff25691dbc +Block 0002 [110]: 5e86235d0c82f951 +Block 0002 [111]: d8ac241b4ceb3803 +Block 0002 [112]: 9244e793ca60a5f3 +Block 0002 [113]: 76dab340096fabbf +Block 0002 [114]: c5adf98472940f8a +Block 0002 [115]: 106b551d058f8f19 +Block 0002 [116]: bb258b750fc215de +Block 0002 [117]: ad7140812d40e929 +Block 0002 [118]: 3ad057869afaed79 +Block 0002 [119]: c254bf68bb31355b +Block 0002 [120]: ac8b17e9691a2c01 +Block 0002 [121]: a0f5d368cc92d6b2 +Block 0002 [122]: 57e474eee518e257 +Block 0002 [123]: 4eb432e176d82c1e +Block 0002 [124]: e8dc2a67bc27044e +Block 0002 [125]: ccca0b36894bae07 +Block 0002 [126]: c50e115a40135881 +Block 0002 [127]: 31ab7e9610be77cb +Block 0003 [ 0]: 033a9a825c0e3375 +Block 0003 [ 1]: ffb04963be6b3b77 +Block 0003 [ 2]: a5cd46d300b6dd82 +Block 0003 [ 3]: ec36c67ff576986c +Block 0003 [ 4]: 437b5a54375ab6c7 +Block 0003 [ 5]: 927811ef085e09c0 +Block 0003 [ 6]: 51c5e874382b475c +Block 0003 [ 7]: 13b5997ee7466630 +Block 0003 [ 8]: 84521039bc284d2f +Block 0003 [ 9]: 34791762f12cdc8c +Block 0003 [ 10]: f82a6cea29c3f956 +Block 0003 [ 11]: cecc35a9a9869d35 +Block 0003 [ 12]: 921553f94b2ad7b1 +Block 0003 [ 13]: bd151a3ae8982435 +Block 0003 [ 14]: e44961547aa6b6e8 +Block 0003 [ 15]: 35791c0b88a53841 +Block 0003 [ 16]: 6c1f506cd6b169f4 +Block 0003 [ 17]: c3d5841e25436bc4 +Block 0003 [ 18]: 9865ad21e2f62b1f +Block 0003 [ 19]: 65447e3aa9771e88 +Block 0003 [ 20]: 1a215926fc24f395 +Block 0003 [ 21]: 511db9dcacc2fde0 +Block 0003 [ 22]: 688e9980afdd513c +Block 0003 [ 23]: 902888d7ee355198 +Block 0003 [ 24]: e1888488338e8264 +Block 0003 [ 25]: 6f8d93269dc9670c +Block 0003 [ 26]: 0ea20bdd457c7ec7 +Block 0003 [ 27]: d6f10dea0ab8fa38 +Block 0003 [ 28]: dd69440b4f6d86bb +Block 0003 [ 29]: f218fbd09c06ff41 +Block 0003 [ 30]: 00fbfd70204fc266 +Block 0003 [ 31]: ab4a93d83956e58b +Block 0003 [ 32]: d7a6b398a589f492 +Block 0003 [ 33]: be8ceac4195f4c7e +Block 0003 [ 34]: e82963ea0389aef3 +Block 0003 [ 35]: 3adba6ba5dfbc70b +Block 0003 [ 36]: 959083b7cabe53dd +Block 0003 [ 37]: f5537e16031a1451 +Block 0003 [ 38]: 70689da6075493cc +Block 0003 [ 39]: 86054b0238ed2f05 +Block 0003 [ 40]: 5a4ae91c92ed9852 +Block 0003 [ 41]: 482499c5469d6a79 +Block 0003 [ 42]: ba459a7de4e0170b +Block 0003 [ 43]: 42009024a1939a39 +Block 0003 [ 44]: ff24fe13344a4ea2 +Block 0003 [ 45]: a9881fa40b1d5c30 +Block 0003 [ 46]: 76fbff24e8820359 +Block 0003 [ 47]: 1e12b2bfee1d5674 +Block 0003 [ 48]: 3973d0650a945227 +Block 0003 [ 49]: 7f5916266bf603ad +Block 0003 [ 50]: 95977d0c7146a89e +Block 0003 [ 51]: db9d6047fbbc11d9 +Block 0003 [ 52]: 165175c973740ccd +Block 0003 [ 53]: 980c7be752aa9399 +Block 0003 [ 54]: 310d0c54051b9783 +Block 0003 [ 55]: 6d66372da35a61d7 +Block 0003 [ 56]: 25512dba862b2c55 +Block 0003 [ 57]: f9519f53a64c2007 +Block 0003 [ 58]: 412c96e8a04d50dc +Block 0003 [ 59]: e267e74a4f486eca +Block 0003 [ 60]: 1692d421119d95f1 +Block 0003 [ 61]: 59acacdf9054a080 +Block 0003 [ 62]: e21e41c233e654dd +Block 0003 [ 63]: 776c9d31c68eeac1 +Block 0003 [ 64]: 469a74646cbff04f +Block 0003 [ 65]: cdc326fbc1217c85 +Block 0003 [ 66]: 9839d2208cf23d14 +Block 0003 [ 67]: 7f8d6f4fdd508aac +Block 0003 [ 68]: ec2c7129c1ede201 +Block 0003 [ 69]: eaa1d41993b894ac +Block 0003 [ 70]: 62a6ff95af57746e +Block 0003 [ 71]: e3cfb9e09b389b62 +Block 0003 [ 72]: e5d8e6b2f5c56087 +Block 0003 [ 73]: fea52606f876dd3d +Block 0003 [ 74]: 09d42ae72aab03ed +Block 0003 [ 75]: 469ca64f7e95bd2f +Block 0003 [ 76]: 03a141e08956df41 +Block 0003 [ 77]: 0c675a6d49a093ce +Block 0003 [ 78]: 904622e9fc3aeeea +Block 0003 [ 79]: 352fa38b9134c932 +Block 0003 [ 80]: 68e940494610d7cb +Block 0003 [ 81]: 37fc53a67dedf748 +Block 0003 [ 82]: fd3a7cd03312fec2 +Block 0003 [ 83]: 5cad438e52ed4347 +Block 0003 [ 84]: 80ebab1679b71b8b +Block 0003 [ 85]: 87497f358d6563f0 +Block 0003 [ 86]: 4a8b3c7f3126291a +Block 0003 [ 87]: d39ab8372acfa450 +Block 0003 [ 88]: db936c859ee7eec1 +Block 0003 [ 89]: d0e3658c3584931b +Block 0003 [ 90]: 70b321e145b7fde0 +Block 0003 [ 91]: 4b378a260b92af14 +Block 0003 [ 92]: 3b0726497f9ec36d +Block 0003 [ 93]: da1ef2a3ae8bed54 +Block 0003 [ 94]: 66d75fc3b087213d +Block 0003 [ 95]: f4c8a72b9d79bf0c +Block 0003 [ 96]: a2b1447f1b6df16d +Block 0003 [ 97]: 7d5a9efbc2dce79b +Block 0003 [ 98]: 62fbf22cf1fc124e +Block 0003 [ 99]: 4242820b9c5e47ef +Block 0003 [100]: 9f10556f00ffe526 +Block 0003 [101]: 6a08ccdc012d3608 +Block 0003 [102]: 9c4f3aefa54c172e +Block 0003 [103]: 04c665a5be09ef37 +Block 0003 [104]: 513f5ecfd230b7a4 +Block 0003 [105]: 9af91bcb5a94e05a +Block 0003 [106]: 67e742dd8815f572 +Block 0003 [107]: 3bb0fc4e2dbc9c6b +Block 0003 [108]: 140a635b9dce287f +Block 0003 [109]: 07f4465d81127d05 +Block 0003 [110]: 689d3f84aa045d3f +Block 0003 [111]: a60b928eeb7c986c +Block 0003 [112]: fd2f18537d468745 +Block 0003 [113]: 0c23e02868032019 +Block 0003 [114]: f68a25333b834b6b +Block 0003 [115]: 8a4ed24e784b3a47 +Block 0003 [116]: 46bf8147421a0572 +Block 0003 [117]: 369fa72d40415b7f +Block 0003 [118]: 6882dabd6a068f34 +Block 0003 [119]: dc8e2cdfe017dbee +Block 0003 [120]: e0f8c59632b31b30 +Block 0003 [121]: 7ce3a83234277cc4 +Block 0003 [122]: 7523755ddae51a70 +Block 0003 [123]: 727cbd57e13e08bb +Block 0003 [124]: 3d25e43aeb8ab15a +Block 0003 [125]: bb434251e358c81e +Block 0003 [126]: ccfcf5ef39898f2f +Block 0003 [127]: 5c7b6af56dc93d90 +Block 0004 [ 0]: 4aad2c9e9615357d +Block 0004 [ 1]: ce6a489393264830 +Block 0004 [ 2]: 44f6dd677120c34c +Block 0004 [ 3]: 9b54b4c637722c0d +Block 0004 [ 4]: 36b59880f89ce66b +Block 0004 [ 5]: f9941dacf99fa3b2 +Block 0004 [ 6]: 0561133fe2413998 +Block 0004 [ 7]: 3624f439f0356886 +Block 0004 [ 8]: 7f69556b861dc791 +Block 0004 [ 9]: 2b2c080682a158f9 +Block 0004 [ 10]: b5cd679b5b98078b +Block 0004 [ 11]: f50bda1f106687ab +Block 0004 [ 12]: 6a7fd322c9d0e356 +Block 0004 [ 13]: c0d57b7d551517f0 +Block 0004 [ 14]: cb0076497b271329 +Block 0004 [ 15]: 1ee3a218ac2e94bb +Block 0004 [ 16]: f81fd9c8ad33ab94 +Block 0004 [ 17]: 06f74124853c642c +Block 0004 [ 18]: af67e59ca12aba8b +Block 0004 [ 19]: c69ab433b4e3f026 +Block 0004 [ 20]: 066b5f97e6f94a14 +Block 0004 [ 21]: a660fc3551a8ccdb +Block 0004 [ 22]: f6e647def8255386 +Block 0004 [ 23]: deeaae8a41569d89 +Block 0004 [ 24]: 502dfea1f3866170 +Block 0004 [ 25]: 0055e5035ee2effd +Block 0004 [ 26]: ea1bc368a36a4989 +Block 0004 [ 27]: d187d3b09c31bd2e +Block 0004 [ 28]: ecc108964a73eea1 +Block 0004 [ 29]: 6f03013c3375bea4 +Block 0004 [ 30]: 4d2b4f01c9a594a1 +Block 0004 [ 31]: 6afa1c3705bceb93 +Block 0004 [ 32]: 29a3def8590e29e2 +Block 0004 [ 33]: 388e0b50d37ca6fb +Block 0004 [ 34]: a9a2be5abc3ae355 +Block 0004 [ 35]: 655154a45cf28d3f +Block 0004 [ 36]: b4bf1f57bcb985a5 +Block 0004 [ 37]: 74ac80093cc72816 +Block 0004 [ 38]: dc10be4b89ecc2c9 +Block 0004 [ 39]: a8f3d3892d18f8c5 +Block 0004 [ 40]: 2a9bedb7783e517e +Block 0004 [ 41]: 8fb2d64cdddb85e2 +Block 0004 [ 42]: c9426c402d69e384 +Block 0004 [ 43]: b4d887a9f0e27244 +Block 0004 [ 44]: 131338affae1913f +Block 0004 [ 45]: bea6e8197ecf2b57 +Block 0004 [ 46]: 2beb9a0a4629ea26 +Block 0004 [ 47]: a0b1321c16b6df16 +Block 0004 [ 48]: 5e803cc0fda654b4 +Block 0004 [ 49]: 51d8ea1da44ff8c8 +Block 0004 [ 50]: 31724ec603231a0f +Block 0004 [ 51]: 11e7d7c7d3f87451 +Block 0004 [ 52]: 73a6efc08a63c816 +Block 0004 [ 53]: 0f5007b3893fde88 +Block 0004 [ 54]: 9639fa7d1f9ba15d +Block 0004 [ 55]: 75857f3fc55b11b3 +Block 0004 [ 56]: e16f7ae209135d5b +Block 0004 [ 57]: 4c9884238bfb53ec +Block 0004 [ 58]: c66cbb76ade05220 +Block 0004 [ 59]: 7060a8642a6358f1 +Block 0004 [ 60]: e1441ddd05e3e94a +Block 0004 [ 61]: 40eb35e6b1fe60a4 +Block 0004 [ 62]: 32db0c582a9a1c4b +Block 0004 [ 63]: 156d62abf13c8d42 +Block 0004 [ 64]: 6386901cfaf4cd5f +Block 0004 [ 65]: d485163ee2894a0a +Block 0004 [ 66]: 5bbd9371b6ddbda8 +Block 0004 [ 67]: 617f0a95d0d1ebad +Block 0004 [ 68]: ddda42edd989a5de +Block 0004 [ 69]: bf6218a5e8a4fc7f +Block 0004 [ 70]: 948c99e73dcef198 +Block 0004 [ 71]: d2dae1cc5189a2ac +Block 0004 [ 72]: 9ab9309c75d14489 +Block 0004 [ 73]: 0096c018c9922cc0 +Block 0004 [ 74]: c55d076c6afdfb36 +Block 0004 [ 75]: 6940a46c5f5f8ff7 +Block 0004 [ 76]: 1f821452ed6805d5 +Block 0004 [ 77]: a5e13572d196c88f +Block 0004 [ 78]: fb84aca56c950808 +Block 0004 [ 79]: db36d78614fdcae1 +Block 0004 [ 80]: f74f05e57df8e0a6 +Block 0004 [ 81]: 4a6cd2d0b706fd77 +Block 0004 [ 82]: 77b1998388a62f9d +Block 0004 [ 83]: 843d8aa68f4738e7 +Block 0004 [ 84]: e50d81d9d86bb937 +Block 0004 [ 85]: b35517d78153e1f0 +Block 0004 [ 86]: 4d6667011dc0f5c9 +Block 0004 [ 87]: bdfbb81b05906373 +Block 0004 [ 88]: ff1c544cb9c55da0 +Block 0004 [ 89]: 7be55700f0926509 +Block 0004 [ 90]: 0a049f631a618979 +Block 0004 [ 91]: e185e5ca1f799f6e +Block 0004 [ 92]: a810f75491b3cfb7 +Block 0004 [ 93]: af77d89abab3e2d8 +Block 0004 [ 94]: c7c7fcf6f7e1fb7e +Block 0004 [ 95]: de4a29cc78702394 +Block 0004 [ 96]: 71e58cf077d6d85d +Block 0004 [ 97]: b73fc4a749b34ead +Block 0004 [ 98]: ffeccad0666cc6af +Block 0004 [ 99]: 69fbdea85dcd455f +Block 0004 [100]: 278f863ba6acabc5 +Block 0004 [101]: e66965a305bc4c40 +Block 0004 [102]: b9423de0dce901b7 +Block 0004 [103]: 15e0c769d840331e +Block 0004 [104]: 928eec9442a6b06f +Block 0004 [105]: db36ba9eca162aa9 +Block 0004 [106]: 11ce79a96c435d1e +Block 0004 [107]: c4950d5470035ce8 +Block 0004 [108]: 1730ef3bde3b5b6a +Block 0004 [109]: ac80f0e3f59a5d5c +Block 0004 [110]: 8ea557f8180c1661 +Block 0004 [111]: 1bf6e898445a963d +Block 0004 [112]: c004558618166516 +Block 0004 [113]: 4fbb7d0b5c4c5f59 +Block 0004 [114]: c81240d4eae498d0 +Block 0004 [115]: a6671d0bcaa177dc +Block 0004 [116]: 1b413c8e690567d0 +Block 0004 [117]: f5f3e1c8221f09e0 +Block 0004 [118]: 9c8f5fec57d0e3c0 +Block 0004 [119]: e343869ffa9b4f43 +Block 0004 [120]: 29dc7ffa4ba5bc92 +Block 0004 [121]: 708cb720e2816ba8 +Block 0004 [122]: 52a1d85807f13c6a +Block 0004 [123]: 561e4a36786d4bef +Block 0004 [124]: 2966f347c17a3914 +Block 0004 [125]: 3dc4aac7982d3f1c +Block 0004 [126]: aae55b9282ac0bb3 +Block 0004 [127]: 0f4767a8e4081496 +Block 0005 [ 0]: a2f1f29ea7aa2805 +Block 0005 [ 1]: d8c3cbc2ebbf0eb4 +Block 0005 [ 2]: a6b62b7344e68672 +Block 0005 [ 3]: e5dad5558824578c +Block 0005 [ 4]: 7f4977662f4a9dcd +Block 0005 [ 5]: 9740712b639051f1 +Block 0005 [ 6]: 76d060bce2adac18 +Block 0005 [ 7]: e00a0d348c440e6c +Block 0005 [ 8]: 3ee6477fdaa4d664 +Block 0005 [ 9]: 64008d83e1dfc177 +Block 0005 [ 10]: 430dc48d1c295406 +Block 0005 [ 11]: 9552e22ed145e6c1 +Block 0005 [ 12]: 57bd17aae86ad663 +Block 0005 [ 13]: 606091bc16a9bba7 +Block 0005 [ 14]: 28194ab3da1ac0a2 +Block 0005 [ 15]: 5e56b17cd078d2f4 +Block 0005 [ 16]: c248a735043acb68 +Block 0005 [ 17]: 42e8f874f7436184 +Block 0005 [ 18]: 376109d627e2c7b5 +Block 0005 [ 19]: e991290d19bfafbe +Block 0005 [ 20]: 2d6674137d9e9a54 +Block 0005 [ 21]: 281d16baf189e1b0 +Block 0005 [ 22]: 2ccf19eeb3111b77 +Block 0005 [ 23]: 6d296a58e66dc49d +Block 0005 [ 24]: c6f697703d9dc1d6 +Block 0005 [ 25]: b05254caf35910c6 +Block 0005 [ 26]: 3c72ab46ee180152 +Block 0005 [ 27]: 213a5becbe4615e1 +Block 0005 [ 28]: 4d84d1ee510b9e93 +Block 0005 [ 29]: 0160bed22edeeb55 +Block 0005 [ 30]: c1433fd0b0655b60 +Block 0005 [ 31]: 32632df221174ebc +Block 0005 [ 32]: 2a2e3e2f009f4034 +Block 0005 [ 33]: 0bbfc3da3267d57b +Block 0005 [ 34]: 0a14a644572cee42 +Block 0005 [ 35]: 7e77789809f9720d +Block 0005 [ 36]: 563ecb03c2c90611 +Block 0005 [ 37]: dbac4b6bbe26ad50 +Block 0005 [ 38]: 6af6d1b08b1e4c18 +Block 0005 [ 39]: 4e33c9a639b36584 +Block 0005 [ 40]: a5ec9a23696f2405 +Block 0005 [ 41]: 54c69b780e8359a4 +Block 0005 [ 42]: 1b6458e286139e45 +Block 0005 [ 43]: 4bb6edeecdc79d8f +Block 0005 [ 44]: 87a0dfbfedb05191 +Block 0005 [ 45]: e5e875ee54c10ac7 +Block 0005 [ 46]: 412b2c305de89dfb +Block 0005 [ 47]: c6968cb2716aee54 +Block 0005 [ 48]: 9c17a0b772b6afa9 +Block 0005 [ 49]: b37a9be1538f0d5c +Block 0005 [ 50]: 3783ecd08d568855 +Block 0005 [ 51]: 66a9730d0497e4a8 +Block 0005 [ 52]: 946f1aa176c96d55 +Block 0005 [ 53]: b932be7315159d78 +Block 0005 [ 54]: 82c9b2f8adf545bd +Block 0005 [ 55]: 939c6ec3e66ab28b +Block 0005 [ 56]: b705f1ba2b442544 +Block 0005 [ 57]: cbfc1c2c0437fe1e +Block 0005 [ 58]: b5d171e06a5b5d94 +Block 0005 [ 59]: b65e7548e4290c0f +Block 0005 [ 60]: f6c904d14c184ba5 +Block 0005 [ 61]: 821801c0227e5b4f +Block 0005 [ 62]: bb008a3cd10a6657 +Block 0005 [ 63]: c8291b37511aba68 +Block 0005 [ 64]: ece5c306e15e7e96 +Block 0005 [ 65]: acee9e6ec3a7d921 +Block 0005 [ 66]: 8d8bebf10b2b4e4a +Block 0005 [ 67]: 409a9c93cf143f39 +Block 0005 [ 68]: 8c4ff0acc0d623a8 +Block 0005 [ 69]: 5ac7f3561a57f8d7 +Block 0005 [ 70]: fe65f00fb63d9dc7 +Block 0005 [ 71]: 01ff21e3cc1f8c6d +Block 0005 [ 72]: 84ffd934b4ebac8d +Block 0005 [ 73]: d21cd538a03232b2 +Block 0005 [ 74]: 781980610b7ec7cc +Block 0005 [ 75]: 2dbdd60528669805 +Block 0005 [ 76]: dc589c07d2a661e0 +Block 0005 [ 77]: 6cdcdafe025e33bd +Block 0005 [ 78]: a6ee8906b4c238df +Block 0005 [ 79]: c7143cca9dfeb415 +Block 0005 [ 80]: aa309e94e2fd2005 +Block 0005 [ 81]: d5bc5fd1818a2a9c +Block 0005 [ 82]: b0bcb4f73a966742 +Block 0005 [ 83]: 691034d3a4ea3d87 +Block 0005 [ 84]: 624b83b2ae0a36de +Block 0005 [ 85]: ccf54a71ef5cea9e +Block 0005 [ 86]: 98bd28052ea1d0f6 +Block 0005 [ 87]: 991501ef48472656 +Block 0005 [ 88]: c1d7473fdfb08370 +Block 0005 [ 89]: 2aa6152966242ae0 +Block 0005 [ 90]: 2d40e50c8215c370 +Block 0005 [ 91]: 56021a10aadab2e1 +Block 0005 [ 92]: 428a2318bda6f282 +Block 0005 [ 93]: c9e69a34fb9adcab +Block 0005 [ 94]: f1268c07cafdd8f1 +Block 0005 [ 95]: fd32e5974bf062eb +Block 0005 [ 96]: 1cdd56ebf5ba0507 +Block 0005 [ 97]: 5e3b11a31da2c99f +Block 0005 [ 98]: e5415a8ecdafc162 +Block 0005 [ 99]: 94a646f31cc04a45 +Block 0005 [100]: dc9b968dee2c9fa4 +Block 0005 [101]: f11bfa8be33bc828 +Block 0005 [102]: 1e2665e7c975664b +Block 0005 [103]: 91e3dd22bf7a1234 +Block 0005 [104]: 5582d2aacadf6df0 +Block 0005 [105]: 849d237cdd44ae40 +Block 0005 [106]: a13b1559d1af395e +Block 0005 [107]: 9cce1d491b39e1c6 +Block 0005 [108]: 70eaf0cc0fabdec7 +Block 0005 [109]: 58afa558c5085ad4 +Block 0005 [110]: 1df4bf8dc0d9fdc7 +Block 0005 [111]: 374ccf1f6c700a11 +Block 0005 [112]: f2359455e8a72dee +Block 0005 [113]: 783b339c402acef2 +Block 0005 [114]: 68db356ec17dd7e5 +Block 0005 [115]: e0a6272e6e7d4674 +Block 0005 [116]: 4378e4ce8e70fdd1 +Block 0005 [117]: fde5aad0d4eabc79 +Block 0005 [118]: fee53869ca65168f +Block 0005 [119]: 0693da99c2db079a +Block 0005 [120]: 634b973c45b8868e +Block 0005 [121]: e92f4f9f9e1bc735 +Block 0005 [122]: b139bd321251d73a +Block 0005 [123]: fdc440e07c89d790 +Block 0005 [124]: c1aa16205718b13e +Block 0005 [125]: 9025eabecbc713a9 +Block 0005 [126]: 3908a16b231be5ed +Block 0005 [127]: f25730b2867d5c06 +Block 0006 [ 0]: 7b857b3d24027d7a +Block 0006 [ 1]: 670e23eb8eddb301 +Block 0006 [ 2]: 98ea5e36eb4479e4 +Block 0006 [ 3]: acd0b9ac97eff6d6 +Block 0006 [ 4]: 2d5d6e6fff1f133e +Block 0006 [ 5]: 3e9c9726b56417fd +Block 0006 [ 6]: 0b2113fa483c195b +Block 0006 [ 7]: 0d7815ec05700375 +Block 0006 [ 8]: c9ce6d95ea5b4118 +Block 0006 [ 9]: 84d2a7f11bb92f51 +Block 0006 [ 10]: ff88f9ad86a45ec7 +Block 0006 [ 11]: daabf03c40b04299 +Block 0006 [ 12]: a36b60cd4f1f18d9 +Block 0006 [ 13]: 5276d5d41107068d +Block 0006 [ 14]: 3c8812f7fae8511a +Block 0006 [ 15]: 00ea06ce780472ef +Block 0006 [ 16]: da887f5b84c9446a +Block 0006 [ 17]: 22963be370b288ac +Block 0006 [ 18]: e28b0a612196ecfb +Block 0006 [ 19]: 3464fdec28ec9b0a +Block 0006 [ 20]: fa6ec6bad95f4402 +Block 0006 [ 21]: 432bef4e4df0f410 +Block 0006 [ 22]: 65a1743f094c0a95 +Block 0006 [ 23]: 6d5fe021a6e4c314 +Block 0006 [ 24]: 063eefd04decef61 +Block 0006 [ 25]: 9ba8d1161a35e920 +Block 0006 [ 26]: c07b0a96bd9d8ad9 +Block 0006 [ 27]: bb3445c95c196591 +Block 0006 [ 28]: 03be97064ca1affa +Block 0006 [ 29]: 2c3516d2305cc315 +Block 0006 [ 30]: 9ee9f1966dba334a +Block 0006 [ 31]: c0084070fe554f10 +Block 0006 [ 32]: 9748b391ae2fab76 +Block 0006 [ 33]: 33126d30ae96ffa3 +Block 0006 [ 34]: 39014f0169e1c26f +Block 0006 [ 35]: bc404f8df7c3b6ac +Block 0006 [ 36]: 6f38d8b40e328fa7 +Block 0006 [ 37]: ea41a3c6af4de161 +Block 0006 [ 38]: 3c6ce1d92d28b6f7 +Block 0006 [ 39]: 0f21c2beb3532f2f +Block 0006 [ 40]: e97e210adf0719ed +Block 0006 [ 41]: 675a5e9cb9db4567 +Block 0006 [ 42]: 31e1a7b269d6b285 +Block 0006 [ 43]: 44ac563ff5e53808 +Block 0006 [ 44]: d0d372a450bc4ada +Block 0006 [ 45]: 56920c3e83187e3f +Block 0006 [ 46]: 6050aeab33d1bc78 +Block 0006 [ 47]: d3531018166aadcb +Block 0006 [ 48]: e17ecc7ab99821d8 +Block 0006 [ 49]: 6d834b4f7339ffb0 +Block 0006 [ 50]: 3204684b11bc5980 +Block 0006 [ 51]: ea1151eabade396e +Block 0006 [ 52]: 6128c25e683d160c +Block 0006 [ 53]: 8c0ef568267bea08 +Block 0006 [ 54]: 03b1bd05ca7e5001 +Block 0006 [ 55]: 38cac78af248a0b9 +Block 0006 [ 56]: 10ffb451715cee6b +Block 0006 [ 57]: ef6d04a4f1ec1d74 +Block 0006 [ 58]: 6a297e69b85cd261 +Block 0006 [ 59]: 2bc18ab7193c4c21 +Block 0006 [ 60]: cb7f4bc462ef08b2 +Block 0006 [ 61]: 4ee107eb89fb137e +Block 0006 [ 62]: be0f603727354ad1 +Block 0006 [ 63]: afd1b9370c0d7968 +Block 0006 [ 64]: 0305d9efc0311865 +Block 0006 [ 65]: 1032112aeaa89455 +Block 0006 [ 66]: ce49fb76a0b83076 +Block 0006 [ 67]: ec6e151b76fa77d8 +Block 0006 [ 68]: 371418d689a2d5a4 +Block 0006 [ 69]: d9c5334e0c47a1cd +Block 0006 [ 70]: 913eaa395a285969 +Block 0006 [ 71]: f08763e057afa76e +Block 0006 [ 72]: 7631cdccff84471b +Block 0006 [ 73]: a342a0f5e6f83766 +Block 0006 [ 74]: 4d695ec17f4bbedb +Block 0006 [ 75]: 0b545b7424550c2a +Block 0006 [ 76]: ee0ed6a60ba12640 +Block 0006 [ 77]: feedf9c1dd874bbb +Block 0006 [ 78]: d98bc0d816cb95a7 +Block 0006 [ 79]: eb0741af1baad547 +Block 0006 [ 80]: 8e93a084a2424ad7 +Block 0006 [ 81]: c3cd385ac22c3c52 +Block 0006 [ 82]: 1c77772d8c2c0027 +Block 0006 [ 83]: 21b2168299524a1b +Block 0006 [ 84]: 9567267e57296be0 +Block 0006 [ 85]: b56c8396a3b091b0 +Block 0006 [ 86]: c7c10a15a74e8571 +Block 0006 [ 87]: ea1c3042c44207d6 +Block 0006 [ 88]: 6742e3b27f35614e +Block 0006 [ 89]: bce288c416a4a1a0 +Block 0006 [ 90]: 65fcd11e00339496 +Block 0006 [ 91]: e67e7eded2b536a1 +Block 0006 [ 92]: 5d098437a8a3ebd4 +Block 0006 [ 93]: 31795fa9106a4bc0 +Block 0006 [ 94]: a7ce44f182090b1b +Block 0006 [ 95]: 751260bb3a27d1aa +Block 0006 [ 96]: 33503caa08511bf0 +Block 0006 [ 97]: 536660418ba83289 +Block 0006 [ 98]: 87b8a807cc5293b5 +Block 0006 [ 99]: 51d441ea07531a62 +Block 0006 [100]: e81ae81332626b23 +Block 0006 [101]: 198f2e7ad0bdde83 +Block 0006 [102]: 6602ecd3435f38fa +Block 0006 [103]: ef4ed5ae8c04a191 +Block 0006 [104]: ad7118965ce19207 +Block 0006 [105]: beceb37944041b29 +Block 0006 [106]: 9950cc0263c218af +Block 0006 [107]: dd901769a63cf8ad +Block 0006 [108]: e937cffb5bcf57da +Block 0006 [109]: 757d31c1038a3efc +Block 0006 [110]: e707bd06b982ec9b +Block 0006 [111]: 344b079fdaefe261 +Block 0006 [112]: c948b487c045297f +Block 0006 [113]: 7c5efd50b6b9fc05 +Block 0006 [114]: 793518d8884351b5 +Block 0006 [115]: 03a220cc3b6b0bac +Block 0006 [116]: 8acaeeb52f5bf9db +Block 0006 [117]: 6b6ca24c516f3630 +Block 0006 [118]: f1f18a0d0dabb238 +Block 0006 [119]: 3b6dd6c80029e41c +Block 0006 [120]: 61e47fac13560b97 +Block 0006 [121]: 40f95b60e3f455b3 +Block 0006 [122]: c5c12caa860093d0 +Block 0006 [123]: d6eebf3713c71294 +Block 0006 [124]: e8771758ded57a2a +Block 0006 [125]: 2ffc02a6788b96fb +Block 0006 [126]: a40be550c4eddc5f +Block 0006 [127]: 81549e4142e1e679 +Block 0007 [ 0]: cbd74b5de20ab9d1 +Block 0007 [ 1]: 069f835c6c371c52 +Block 0007 [ 2]: 549921e520e39b0b +Block 0007 [ 3]: ecafef6e201dd829 +Block 0007 [ 4]: e895078c61997563 +Block 0007 [ 5]: eeee9440731fef0e +Block 0007 [ 6]: e95318ed6834ae3b +Block 0007 [ 7]: 027475fbbf66dcdf +Block 0007 [ 8]: a43a9293b3e38f3b +Block 0007 [ 9]: 1f9915da007f1592 +Block 0007 [ 10]: ae236073ad2102cc +Block 0007 [ 11]: 9e25b23b79285968 +Block 0007 [ 12]: 7b706f1d817899d4 +Block 0007 [ 13]: 84539b7008808bfe +Block 0007 [ 14]: 0950e99c573cedc3 +Block 0007 [ 15]: e66b2657900c9272 +Block 0007 [ 16]: 0b96a42e35afbc8b +Block 0007 [ 17]: d478a0000f487073 +Block 0007 [ 18]: 20ed2e94d9ad0fee +Block 0007 [ 19]: b2c41d52cfd89c96 +Block 0007 [ 20]: 34b98f3bdd359a1b +Block 0007 [ 21]: f4b8f4cd882469b5 +Block 0007 [ 22]: de740288c4dd8814 +Block 0007 [ 23]: bb6c3dcddd7bf5e1 +Block 0007 [ 24]: d4d1dd393a008f68 +Block 0007 [ 25]: 075eff96e269493a +Block 0007 [ 26]: b86e3218edd9bc08 +Block 0007 [ 27]: 42961d0ae2475362 +Block 0007 [ 28]: 36e917be404ad4ae +Block 0007 [ 29]: 7b85718ee0d3a183 +Block 0007 [ 30]: cff2414b88a46e65 +Block 0007 [ 31]: 4d16a9abae20145f +Block 0007 [ 32]: 9af2efcbda4d978b +Block 0007 [ 33]: a298fc0b755813ba +Block 0007 [ 34]: b25ada405da06d1e +Block 0007 [ 35]: fa055c5401c7d4f1 +Block 0007 [ 36]: 5510c526f81544ec +Block 0007 [ 37]: 5220eac16fa61f19 +Block 0007 [ 38]: ca9217915cfebd40 +Block 0007 [ 39]: 21dce31f7e0bbf6e +Block 0007 [ 40]: 735629aba76c5193 +Block 0007 [ 41]: 5650bebd950400f9 +Block 0007 [ 42]: d88244c4ea7e1988 +Block 0007 [ 43]: 978894543c3aced7 +Block 0007 [ 44]: 05ff38136fd6eb33 +Block 0007 [ 45]: b5688908d324bcdf +Block 0007 [ 46]: 2bbab520f88ef570 +Block 0007 [ 47]: 7a7c83601701b57c +Block 0007 [ 48]: 255efc836007b5e6 +Block 0007 [ 49]: 1b30dd3585c9b70b +Block 0007 [ 50]: a8bd72c447522052 +Block 0007 [ 51]: 1403f1e5e5fe134b +Block 0007 [ 52]: ff1216684f23c30b +Block 0007 [ 53]: fcd6579dc09d9f85 +Block 0007 [ 54]: fce3fac568271041 +Block 0007 [ 55]: b12b60ff57582a3f +Block 0007 [ 56]: 1e2dd9bba2500f5b +Block 0007 [ 57]: 9a7de93d03ced58a +Block 0007 [ 58]: 4d3df93e0200e39b +Block 0007 [ 59]: e1788059b82c7370 +Block 0007 [ 60]: 3f7ecc5a406cdd2f +Block 0007 [ 61]: 06349b60a500246a +Block 0007 [ 62]: 4c98b89ece9ff485 +Block 0007 [ 63]: 5bb16f3627484aa5 +Block 0007 [ 64]: 813f6f26460cc402 +Block 0007 [ 65]: 67410f23f96e2365 +Block 0007 [ 66]: 73e92652b073b3b0 +Block 0007 [ 67]: ebff9c4a696d5e98 +Block 0007 [ 68]: 9fb510070498976f +Block 0007 [ 69]: be13bab83c7eec26 +Block 0007 [ 70]: 653e037d01574d3a +Block 0007 [ 71]: e97d4817e3df0f7c +Block 0007 [ 72]: 5d7324090040b36e +Block 0007 [ 73]: bf38fc9dedb9f5f2 +Block 0007 [ 74]: e5c653ec3e6a4793 +Block 0007 [ 75]: 4da77df57c179235 +Block 0007 [ 76]: 2c649e286f0c43ed +Block 0007 [ 77]: be652eadd041075f +Block 0007 [ 78]: 79069677f34cffd3 +Block 0007 [ 79]: 8521077f81ee5286 +Block 0007 [ 80]: 32ffd57924cce5e3 +Block 0007 [ 81]: a08d28a183c2820f +Block 0007 [ 82]: 084ddd57f4e7a4af +Block 0007 [ 83]: f20ece27cf7b3070 +Block 0007 [ 84]: 92765b71341157c3 +Block 0007 [ 85]: fece00bc6540950b +Block 0007 [ 86]: d535974bf65eff54 +Block 0007 [ 87]: 56381f317bfdcbf4 +Block 0007 [ 88]: 99ad3075084c09b3 +Block 0007 [ 89]: e77a51ba4c432c1d +Block 0007 [ 90]: 23414e1a6a2cb731 +Block 0007 [ 91]: 2eb44b11c04487cc +Block 0007 [ 92]: eb7fa79b38d738b9 +Block 0007 [ 93]: 2186fe3f06fe37be +Block 0007 [ 94]: 09d20f838aed21e6 +Block 0007 [ 95]: 20763bae6782ed73 +Block 0007 [ 96]: 7f77e32f99cb82a5 +Block 0007 [ 97]: 54732576ff03cd99 +Block 0007 [ 98]: f24943112b33c21b +Block 0007 [ 99]: ba870e486d3d25fb +Block 0007 [100]: f2f0d442cdee87f6 +Block 0007 [101]: 9967a1189153605a +Block 0007 [102]: 0659c8d86e94106e +Block 0007 [103]: d15c1188dbf88255 +Block 0007 [104]: 49c1b38e89bff99e +Block 0007 [105]: 897a56428d590bea +Block 0007 [106]: 8a69fc0a8d9fdc49 +Block 0007 [107]: 4053e20eedb6240f +Block 0007 [108]: bda7f38ff8060e5b +Block 0007 [109]: 26662d48fec1b428 +Block 0007 [110]: dd1807eb486ca979 +Block 0007 [111]: fbd38679dbda71ce +Block 0007 [112]: 7a003a6a3f9a8337 +Block 0007 [113]: 1b97d4193f09c77c +Block 0007 [114]: 4102e8562e63c88e +Block 0007 [115]: d7113253d81dab54 +Block 0007 [116]: fb4d461dbb0f2503 +Block 0007 [117]: 6ce29c2c44c5bc85 +Block 0007 [118]: ad164eeb092acedc +Block 0007 [119]: 8dcd7d0a350897e6 +Block 0007 [120]: d31c533da647ca96 +Block 0007 [121]: 0fbbd94ef2a850a8 +Block 0007 [122]: 87a1f639157371a0 +Block 0007 [123]: 963a2edc6b8eea2b +Block 0007 [124]: 4d85f73159a7c1d2 +Block 0007 [125]: 521258a9c11cf845 +Block 0007 [126]: b1e156d3aded4403 +Block 0007 [127]: bab4461b92a6d246 +Block 0008 [ 0]: 49810a135d23848d +Block 0008 [ 1]: c5fb6b64acec2f07 +Block 0008 [ 2]: b21039c31baa6a85 +Block 0008 [ 3]: 59ddd031e891f6c1 +Block 0008 [ 4]: fbd02629488b6f03 +Block 0008 [ 5]: 750daf568847dcec +Block 0008 [ 6]: 5a831b03655916bb +Block 0008 [ 7]: 13e56690ccfea95e +Block 0008 [ 8]: 8d0ebc46bbca100f +Block 0008 [ 9]: ea51440b7e612514 +Block 0008 [ 10]: 335baaae9400aaac +Block 0008 [ 11]: b5933841b061ce8a +Block 0008 [ 12]: 19508e7ed81c705a +Block 0008 [ 13]: 1fab466e7a08e521 +Block 0008 [ 14]: 0eb76ec6880aabc5 +Block 0008 [ 15]: 38ede80f16088a3f +Block 0008 [ 16]: 9bd9db78e66ba36c +Block 0008 [ 17]: 59ac330b234f7859 +Block 0008 [ 18]: 5471aae498410f2d +Block 0008 [ 19]: e46c4a537ac489fc +Block 0008 [ 20]: 1e150a4fc119f670 +Block 0008 [ 21]: 1f46297a17317c1b +Block 0008 [ 22]: 77ea0959747eff81 +Block 0008 [ 23]: 49fd0b629bb908a2 +Block 0008 [ 24]: f992e47ff5e9d868 +Block 0008 [ 25]: a3413f49c7c9d95e +Block 0008 [ 26]: cf82992aa2d170b0 +Block 0008 [ 27]: 6c5af6b653da5d23 +Block 0008 [ 28]: db2c84f1046363a5 +Block 0008 [ 29]: 0162677ae885ebbd +Block 0008 [ 30]: 4ad08976d9ac5cd5 +Block 0008 [ 31]: cab94bb197e87fde +Block 0008 [ 32]: b8108a671bd72082 +Block 0008 [ 33]: 0bc24e9246cc32df +Block 0008 [ 34]: b8372308888de12a +Block 0008 [ 35]: a3c9f48c3da21e62 +Block 0008 [ 36]: 4950e962fb134b36 +Block 0008 [ 37]: b2a057b57cbb42f8 +Block 0008 [ 38]: 48d43b3afb165bcf +Block 0008 [ 39]: 437889cf607a9e60 +Block 0008 [ 40]: 06151c357288e43f +Block 0008 [ 41]: dd22524b377abd1f +Block 0008 [ 42]: 2991dc1a5ba6a272 +Block 0008 [ 43]: 6e8462e3c4c4a52e +Block 0008 [ 44]: c29b6c46e28d584e +Block 0008 [ 45]: c42ea1bbbc1b2850 +Block 0008 [ 46]: 7dbaebcb56d11ba8 +Block 0008 [ 47]: 708d3efac76f39a9 +Block 0008 [ 48]: 4a2f95422230c076 +Block 0008 [ 49]: 9a0a954e98315e7b +Block 0008 [ 50]: 5defbf0083498f26 +Block 0008 [ 51]: 52bf33f0e7c85da4 +Block 0008 [ 52]: 59145e8443478adc +Block 0008 [ 53]: 6b19b474dd7f76ba +Block 0008 [ 54]: 3f45c02a6b921241 +Block 0008 [ 55]: 840224b795f8b504 +Block 0008 [ 56]: f0d45196a750b0b0 +Block 0008 [ 57]: 25a127d6701f5652 +Block 0008 [ 58]: ff91a51c1a397e29 +Block 0008 [ 59]: 2dcafc69b2117ecc +Block 0008 [ 60]: 6435dac1235931b5 +Block 0008 [ 61]: 0a4ad316c9bbe7c8 +Block 0008 [ 62]: 859f3b5ce4df8f7d +Block 0008 [ 63]: 2160d3995fc309d1 +Block 0008 [ 64]: f75150bda784be85 +Block 0008 [ 65]: 43209c0f168d6ccd +Block 0008 [ 66]: d722ce6d5236fe8e +Block 0008 [ 67]: 61ab9b1730e0a0f2 +Block 0008 [ 68]: 0dd835d189f07128 +Block 0008 [ 69]: 6262694c58a27366 +Block 0008 [ 70]: 953fcc80a60a385a +Block 0008 [ 71]: d66a9dc26fa4270f +Block 0008 [ 72]: 8c576d5d2bdc352b +Block 0008 [ 73]: 2393381634b054c8 +Block 0008 [ 74]: b7c1d4a34dd6fa51 +Block 0008 [ 75]: 78e43d59bd6ee5c7 +Block 0008 [ 76]: b0d26b781e9db988 +Block 0008 [ 77]: a3d1a106c4bdce54 +Block 0008 [ 78]: 2d0ea43d9f3e1ccb +Block 0008 [ 79]: b5190de85c5ede44 +Block 0008 [ 80]: db944f7005a335dc +Block 0008 [ 81]: 4792f06c1c01aa49 +Block 0008 [ 82]: 447bc88f6aad8315 +Block 0008 [ 83]: 2e0f90160429ba9e +Block 0008 [ 84]: 8d3e34c597304f3b +Block 0008 [ 85]: b074f272830745ca +Block 0008 [ 86]: c57f98d934bfb801 +Block 0008 [ 87]: c4f9f1e0778d1b75 +Block 0008 [ 88]: 7b65c984cd76a09b +Block 0008 [ 89]: 99ab030c32f5c65f +Block 0008 [ 90]: 533ed86b000db977 +Block 0008 [ 91]: fb2e743093cb4a6a +Block 0008 [ 92]: a037ae30c9bbab47 +Block 0008 [ 93]: b79a3d0425bb1fb5 +Block 0008 [ 94]: 8f3bffc4de6c8a1c +Block 0008 [ 95]: 337f68561fca37de +Block 0008 [ 96]: 71e8a7aecc2c8e5b +Block 0008 [ 97]: a069fdd75748f6c2 +Block 0008 [ 98]: d0b72d9d6f35f9ff +Block 0008 [ 99]: c60ddb9972fa9637 +Block 0008 [100]: 67d8d738d603c096 +Block 0008 [101]: c01884c88af7e5eb +Block 0008 [102]: 233ea0fb4074af49 +Block 0008 [103]: fc512d625685a05c +Block 0008 [104]: 825a1ad4f9b32360 +Block 0008 [105]: a8140fbebb3e9f88 +Block 0008 [106]: 2c75b6eb2e0c729d +Block 0008 [107]: 2245291ba5bb71f1 +Block 0008 [108]: 0f8b727153c9dd26 +Block 0008 [109]: 5ffbc2a779f4f875 +Block 0008 [110]: 5403a28def13fdb7 +Block 0008 [111]: e2b550641220e443 +Block 0008 [112]: daab51866915e110 +Block 0008 [113]: 6ef62f9d1561ddd8 +Block 0008 [114]: 07be6b68fffb670e +Block 0008 [115]: 8b2f23c509e7a758 +Block 0008 [116]: d3f2d3974ac24e65 +Block 0008 [117]: d03efadd3456fe74 +Block 0008 [118]: 24e47b1737f64d0b +Block 0008 [119]: 096eacd3c4542623 +Block 0008 [120]: 69004ef3d7635037 +Block 0008 [121]: f58c7cb54f9a7dc0 +Block 0008 [122]: 596f8e75930c52d7 +Block 0008 [123]: 020df1d3b0948128 +Block 0008 [124]: 7c47d5b3983b3c68 +Block 0008 [125]: 052123dc6c678c3f +Block 0008 [126]: 0960000fab5b881a +Block 0008 [127]: d79461cc07c58a09 +Block 0009 [ 0]: 8f10324fec56e694 +Block 0009 [ 1]: d7ed856c90f1792b +Block 0009 [ 2]: 81c93c47655d28e1 +Block 0009 [ 3]: 00f1a9f07340d401 +Block 0009 [ 4]: c1f826207229e1de +Block 0009 [ 5]: f0d4e3753fe51344 +Block 0009 [ 6]: c247c5e6b921fa36 +Block 0009 [ 7]: 533b9c2edadba55c +Block 0009 [ 8]: 9bdbbede3a72fa25 +Block 0009 [ 9]: ce4640f3d00d0efb +Block 0009 [ 10]: a81d8a468d49bda4 +Block 0009 [ 11]: 8b5d127765966b11 +Block 0009 [ 12]: 9e0523bb613da0a8 +Block 0009 [ 13]: 0d384fbafe2fbb48 +Block 0009 [ 14]: 9797872ada1e40e6 +Block 0009 [ 15]: dc4f1ab87690ac0c +Block 0009 [ 16]: df15fe4e883a1279 +Block 0009 [ 17]: 309fe51a46dbacbb +Block 0009 [ 18]: 514715fbb6e3495e +Block 0009 [ 19]: d84f1004b3b0fee1 +Block 0009 [ 20]: 4eedebbcc5229e81 +Block 0009 [ 21]: 6a462f88c59008c8 +Block 0009 [ 22]: f77c6c77c51c98f4 +Block 0009 [ 23]: 33fb105b08c16694 +Block 0009 [ 24]: f99547074a293b3d +Block 0009 [ 25]: 249c163feda9fd8d +Block 0009 [ 26]: dcad1e67251ceb28 +Block 0009 [ 27]: 804887249ad5f39b +Block 0009 [ 28]: 2308ad17da1325e8 +Block 0009 [ 29]: 86597bbcfaa35975 +Block 0009 [ 30]: bd680ac7468b0754 +Block 0009 [ 31]: 342c12b38df254c7 +Block 0009 [ 32]: af68032dd2f83449 +Block 0009 [ 33]: 27bb2dfa39194e08 +Block 0009 [ 34]: 3f59dd7618ff8dc0 +Block 0009 [ 35]: 0107202b45469b55 +Block 0009 [ 36]: c0d5858005acdaeb +Block 0009 [ 37]: 458e2dd418b389ca +Block 0009 [ 38]: 6797aa6e279ff000 +Block 0009 [ 39]: 377d84675641a0b2 +Block 0009 [ 40]: 8ab76786012cf2ca +Block 0009 [ 41]: 682e9edbf126ce86 +Block 0009 [ 42]: 2c8027347b86cdb8 +Block 0009 [ 43]: a6b43bd58d550cc3 +Block 0009 [ 44]: c85e4ed50e2825fd +Block 0009 [ 45]: aa468c840ed8925c +Block 0009 [ 46]: 33dce055f80b3e04 +Block 0009 [ 47]: 5cf91043e6438686 +Block 0009 [ 48]: 7027e073ee1e6a0d +Block 0009 [ 49]: d6523597b0efd084 +Block 0009 [ 50]: 06beff55ac8ad958 +Block 0009 [ 51]: 11a7295f9c49415c +Block 0009 [ 52]: 2d6ad8ebe51699e6 +Block 0009 [ 53]: c669cf5a75cded9c +Block 0009 [ 54]: f9cbe12aaa048c0f +Block 0009 [ 55]: 61f64d7b974376ec +Block 0009 [ 56]: 27ed0511d5d62b2e +Block 0009 [ 57]: d6c99d8a5a63b963 +Block 0009 [ 58]: 6cf61de8bf3b3c34 +Block 0009 [ 59]: 260c0c298313625b +Block 0009 [ 60]: 5f2f13989a4e3ac7 +Block 0009 [ 61]: f6348e4014ced3ea +Block 0009 [ 62]: 8f64770fff6e8e52 +Block 0009 [ 63]: d98d39df837a1d24 +Block 0009 [ 64]: 42cd4f3d324607f9 +Block 0009 [ 65]: 6a05b3eb6bc86b52 +Block 0009 [ 66]: 54ab7895dfd5ef3e +Block 0009 [ 67]: 87ce4c55ce837d03 +Block 0009 [ 68]: 0dd5bf6275289bde +Block 0009 [ 69]: 013249225e8064f1 +Block 0009 [ 70]: 9e3d201d4565f7c8 +Block 0009 [ 71]: 2fdae8c6facce85b +Block 0009 [ 72]: d5bc766cfb5a3a28 +Block 0009 [ 73]: 439960f185fce94a +Block 0009 [ 74]: ece23c957b11e9d5 +Block 0009 [ 75]: f6e0b3533a9f3f95 +Block 0009 [ 76]: a22fc51d008e4bf9 +Block 0009 [ 77]: cb680f02e1990cfa +Block 0009 [ 78]: 185c7bdaa5dcf252 +Block 0009 [ 79]: 453f6e9af5d0f170 +Block 0009 [ 80]: aa5b6c77c3fb3d90 +Block 0009 [ 81]: 93eb8c30d16ffc4d +Block 0009 [ 82]: a39c62ec54134634 +Block 0009 [ 83]: e0a7caafc2db836c +Block 0009 [ 84]: 83875234b21af749 +Block 0009 [ 85]: da643b9c28847b1f +Block 0009 [ 86]: 351aa155caaea342 +Block 0009 [ 87]: 0bcdf67e7b60d68f +Block 0009 [ 88]: dd02d20ca2b455de +Block 0009 [ 89]: d1ff457af51b13e2 +Block 0009 [ 90]: ad85fd80a21341a7 +Block 0009 [ 91]: 49e4c98c7993c631 +Block 0009 [ 92]: 10e271200df6f8dd +Block 0009 [ 93]: 3f2f7eb823487a2f +Block 0009 [ 94]: c5a47081e476ea08 +Block 0009 [ 95]: 8d9ce2305405aa84 +Block 0009 [ 96]: 458a19672aed7d90 +Block 0009 [ 97]: 717e5c2a2b0072a1 +Block 0009 [ 98]: 798ca280ae0916d9 +Block 0009 [ 99]: 5682c3918180e4e3 +Block 0009 [100]: 4415c9d3b81cf579 +Block 0009 [101]: f33257c46ac83ff5 +Block 0009 [102]: d8a0f2223c150a81 +Block 0009 [103]: 754789e94abc1903 +Block 0009 [104]: 2ad6c644cef873b3 +Block 0009 [105]: 89c251b261082328 +Block 0009 [106]: 677d37f1ba1b3057 +Block 0009 [107]: cdd6475b9ad6217d +Block 0009 [108]: 7f4ded50c6fe7f40 +Block 0009 [109]: a4cda2e8d74eaceb +Block 0009 [110]: 904b3a87abc580f1 +Block 0009 [111]: 4e7cbfca207fd75e +Block 0009 [112]: 77bf2f8d2fb3795a +Block 0009 [113]: c688b3b54922e3c2 +Block 0009 [114]: 2ecfaff08f7126c4 +Block 0009 [115]: cc4d3d8658ed74cc +Block 0009 [116]: b89ce6baa994bc9a +Block 0009 [117]: 3730d3da60644764 +Block 0009 [118]: a7a865cceffafce8 +Block 0009 [119]: 1109b27e1103515a +Block 0009 [120]: 1d4c47d0c96e6910 +Block 0009 [121]: 482ffef73d24e21c +Block 0009 [122]: 21c2b643561ae19e +Block 0009 [123]: 1afe123081bf17f6 +Block 0009 [124]: 482515b28e1e40d7 +Block 0009 [125]: 60089b8f8007589c +Block 0009 [126]: 9a36c2163a57af6b +Block 0009 [127]: 2691dac7ff440545 +Block 0010 [ 0]: 4c0cae7a5f3383b2 +Block 0010 [ 1]: 2746eaf25922ad05 +Block 0010 [ 2]: e9e80804d1b3f226 +Block 0010 [ 3]: 59fa228adb1eda14 +Block 0010 [ 4]: e582cbb4f3b9576f +Block 0010 [ 5]: b80c019e0ea7eab8 +Block 0010 [ 6]: a73739cc9db1ad73 +Block 0010 [ 7]: a7b0cd338fa1cf1b +Block 0010 [ 8]: 252c67d72c6ac4a8 +Block 0010 [ 9]: 0c3c0e6781f3eb81 +Block 0010 [ 10]: fe1f102df9f0b806 +Block 0010 [ 11]: b89b9e173019c6cf +Block 0010 [ 12]: c5013011387f50f6 +Block 0010 [ 13]: 2eab89d0488a9a7e +Block 0010 [ 14]: 02ca43db72497e3e +Block 0010 [ 15]: 307203eb009cf75b +Block 0010 [ 16]: 05b01e3aefd4878f +Block 0010 [ 17]: 3612ac74f0d5170a +Block 0010 [ 18]: 8daf36dce9f2e9a7 +Block 0010 [ 19]: 54c3330f25910c57 +Block 0010 [ 20]: f87715fa424a0839 +Block 0010 [ 21]: ad1332fccae47161 +Block 0010 [ 22]: b8a422e2b5582533 +Block 0010 [ 23]: e5befd94beb663cd +Block 0010 [ 24]: 60c4ea23220d90b7 +Block 0010 [ 25]: 901eaf711ce8764e +Block 0010 [ 26]: d6580e9182bd3903 +Block 0010 [ 27]: b65cac8618125e29 +Block 0010 [ 28]: 9ecf0b829ca00680 +Block 0010 [ 29]: 38a8a24b66b897f0 +Block 0010 [ 30]: 484c4c95e098e64a +Block 0010 [ 31]: 1a6ae9168d0447cd +Block 0010 [ 32]: cf313c511f61b901 +Block 0010 [ 33]: 8bae89882d5e7a01 +Block 0010 [ 34]: 656441ea59351b15 +Block 0010 [ 35]: e31514645b38d9a0 +Block 0010 [ 36]: 1d6dadf5597c1815 +Block 0010 [ 37]: 3da76ad8a5c580bb +Block 0010 [ 38]: e5e3c09d8c592f29 +Block 0010 [ 39]: 16f27dddce30cf95 +Block 0010 [ 40]: 79f1bea8070d35a0 +Block 0010 [ 41]: bd7b9a3490b907ad +Block 0010 [ 42]: a07cc139ec3bd656 +Block 0010 [ 43]: 5233b458e20d03f6 +Block 0010 [ 44]: 4acbe33dcfa5c649 +Block 0010 [ 45]: 87d5ad1d40b8b202 +Block 0010 [ 46]: 3976aa47398125c9 +Block 0010 [ 47]: d291614f69de847e +Block 0010 [ 48]: 13a16f5b281fb9d4 +Block 0010 [ 49]: 1c797bc612ca1f82 +Block 0010 [ 50]: f5beae4f224c9321 +Block 0010 [ 51]: 7db0d5ed4c07630d +Block 0010 [ 52]: beb7330445c2ca6d +Block 0010 [ 53]: e731beeb9d467c0b +Block 0010 [ 54]: 1d54feb368611ee7 +Block 0010 [ 55]: 867e42cb54d1de3c +Block 0010 [ 56]: 0cbed3a4b9f2cb06 +Block 0010 [ 57]: 5fd4987bd2232365 +Block 0010 [ 58]: cdb5d06722188f40 +Block 0010 [ 59]: 1874ea0a91f80e61 +Block 0010 [ 60]: a2eee7960b21f392 +Block 0010 [ 61]: 9be712e323a7b2c3 +Block 0010 [ 62]: 34579ed0a814abd8 +Block 0010 [ 63]: f91ecee07025c62c +Block 0010 [ 64]: b1152f25e6c4975e +Block 0010 [ 65]: 5423198f63ac9610 +Block 0010 [ 66]: 2c047a3e33046d0d +Block 0010 [ 67]: e4b7fb2fa554697f +Block 0010 [ 68]: 0a5119fe103e2e42 +Block 0010 [ 69]: 76628fe4b3ddc06e +Block 0010 [ 70]: e25bdee1ab84b29f +Block 0010 [ 71]: b3c66c128c6e172b +Block 0010 [ 72]: 1c1ed217a2064416 +Block 0010 [ 73]: 09c7294bb8a49019 +Block 0010 [ 74]: 50eb01126d9ce564 +Block 0010 [ 75]: 940cc33aa111befd +Block 0010 [ 76]: 3de5ddd735a13811 +Block 0010 [ 77]: 7588285dc6ddede1 +Block 0010 [ 78]: 49346c2f2215fc55 +Block 0010 [ 79]: 48b6752b1b61c33f +Block 0010 [ 80]: e26c26a0794051fe +Block 0010 [ 81]: 31d38c5a3509612d +Block 0010 [ 82]: 6146c61851115d95 +Block 0010 [ 83]: 47e6aabfc5ff3e65 +Block 0010 [ 84]: 3a839fe889b3af91 +Block 0010 [ 85]: ba2d3f73d2136b84 +Block 0010 [ 86]: 16e05e4258596fd5 +Block 0010 [ 87]: f2e9314743ae4056 +Block 0010 [ 88]: 4ed85292abee248a +Block 0010 [ 89]: 4180aadcaeabdba4 +Block 0010 [ 90]: 7243e54a9e5b66a6 +Block 0010 [ 91]: 23fefc955c79e003 +Block 0010 [ 92]: ea06ca4f79b525c8 +Block 0010 [ 93]: a5064ee3381b5ab3 +Block 0010 [ 94]: c4893642bf4855fd +Block 0010 [ 95]: cc7e6a851f510ac8 +Block 0010 [ 96]: 275f83a560de48eb +Block 0010 [ 97]: dadbbca628c47c37 +Block 0010 [ 98]: 43ea6bf21aaa217c +Block 0010 [ 99]: f6671c25326c25e2 +Block 0010 [100]: 9fe3da8da6fd66b1 +Block 0010 [101]: 1035284ec7d5cce8 +Block 0010 [102]: bcb76977f690ebd0 +Block 0010 [103]: 97c1c31326790609 +Block 0010 [104]: 60fe481489c8c7e0 +Block 0010 [105]: af3be98f8809a66e +Block 0010 [106]: 9efe199ec3055305 +Block 0010 [107]: a4178436d0019dc1 +Block 0010 [108]: adbe3754fd2a5efc +Block 0010 [109]: 13ba4c060bf37fa5 +Block 0010 [110]: 966fb1a7c7e3c345 +Block 0010 [111]: 24bc28eacb75fba4 +Block 0010 [112]: 6f3e77e11f50a350 +Block 0010 [113]: f10a1ad34d072b69 +Block 0010 [114]: a5eb7b5284a30af7 +Block 0010 [115]: 452bea2326fc9279 +Block 0010 [116]: 4f2620c07573e27c +Block 0010 [117]: 12ec5c1510264364 +Block 0010 [118]: 1f80f928362f38e2 +Block 0010 [119]: 5f237e27d0f4ecb9 +Block 0010 [120]: a339a5fb171dddbe +Block 0010 [121]: 2bfc05c38f009206 +Block 0010 [122]: b99f8b1cfb89a9fd +Block 0010 [123]: f69ed6324e29ded2 +Block 0010 [124]: e106652bf5c4359c +Block 0010 [125]: 43e7d05dd5d3a025 +Block 0010 [126]: 95abfc33449e7724 +Block 0010 [127]: 48442542e1841324 +Block 0011 [ 0]: 7d75ce5fa7bff5b8 +Block 0011 [ 1]: 7f2e89d0a725ab36 +Block 0011 [ 2]: 2c3c03e9df7c7105 +Block 0011 [ 3]: 74b4814e87507e51 +Block 0011 [ 4]: 05197c1924b2f07e +Block 0011 [ 5]: 7120ecede87fd521 +Block 0011 [ 6]: ad19163b841847fa +Block 0011 [ 7]: 9f763fdab3d9b36b +Block 0011 [ 8]: eb936f33fd7b5ff7 +Block 0011 [ 9]: f120e7f05bb937d1 +Block 0011 [ 10]: b6f7cc7f4fe84750 +Block 0011 [ 11]: dbd7c9d78d20bc0d +Block 0011 [ 12]: 87e06285a63783c9 +Block 0011 [ 13]: 0d5ddbfd00f5ea5b +Block 0011 [ 14]: 7c489013dd470b1b +Block 0011 [ 15]: 83ec59292926733c +Block 0011 [ 16]: ac257f950008cd69 +Block 0011 [ 17]: a2d7ecc111c3a0a9 +Block 0011 [ 18]: 760ba922715999ea +Block 0011 [ 19]: 8f4b4e79229250d8 +Block 0011 [ 20]: 93698a5454d1e5d2 +Block 0011 [ 21]: 356f4c72fdef4c47 +Block 0011 [ 22]: 016317b9a7bab55c +Block 0011 [ 23]: a065ec2988075b38 +Block 0011 [ 24]: 74954845ab8f5e37 +Block 0011 [ 25]: 695fcb3c9b2022ef +Block 0011 [ 26]: b4cefacc655d91b0 +Block 0011 [ 27]: 3102128e494987be +Block 0011 [ 28]: de17e55c8e103800 +Block 0011 [ 29]: 99dcb0473277c31d +Block 0011 [ 30]: 3bf83e1004706630 +Block 0011 [ 31]: 8290bfd936d4b300 +Block 0011 [ 32]: 025b012c50744ed5 +Block 0011 [ 33]: 6434159aecf89ea5 +Block 0011 [ 34]: 5bcd6a922a522af2 +Block 0011 [ 35]: 0a32efa2193ef3c4 +Block 0011 [ 36]: 413e02628d5bba55 +Block 0011 [ 37]: 10e072e4d52b2e8f +Block 0011 [ 38]: 308bbdf27f5c5ec1 +Block 0011 [ 39]: e0231b4d70374d20 +Block 0011 [ 40]: b938efa9c5cb6803 +Block 0011 [ 41]: b6b7f40f63d57ca1 +Block 0011 [ 42]: 1cd0b3715b504879 +Block 0011 [ 43]: 41f040cbbd927796 +Block 0011 [ 44]: b8dd16700e5f1a81 +Block 0011 [ 45]: 86b2df0d5ef0af94 +Block 0011 [ 46]: 37cc4cfbfd2e8337 +Block 0011 [ 47]: 65c41fe7bf004d02 +Block 0011 [ 48]: 1a525ca0ea028384 +Block 0011 [ 49]: 6e32af56d64bae96 +Block 0011 [ 50]: 7c67c0b0cf2354d1 +Block 0011 [ 51]: 9e6557336cad5f50 +Block 0011 [ 52]: 652baadcc1b11edc +Block 0011 [ 53]: ed9a449e0ff3d91e +Block 0011 [ 54]: b7f42bb2d1b8044f +Block 0011 [ 55]: 6e10cd8504194195 +Block 0011 [ 56]: 44324821824d14a3 +Block 0011 [ 57]: 7748f553748cce54 +Block 0011 [ 58]: 3388449102791469 +Block 0011 [ 59]: 525f839f18b87655 +Block 0011 [ 60]: 2239393539b2c86b +Block 0011 [ 61]: e3a316be17ab8107 +Block 0011 [ 62]: a6eddc9b040c199f +Block 0011 [ 63]: 62d1e6c9fb86d8a3 +Block 0011 [ 64]: 46d51d807d430972 +Block 0011 [ 65]: 4105dab993959ac0 +Block 0011 [ 66]: 5ffc090c3a929ead +Block 0011 [ 67]: 96e520ccdf93dfd2 +Block 0011 [ 68]: b6c210605de8d022 +Block 0011 [ 69]: 36f0c76223b2118b +Block 0011 [ 70]: 1ac03a506b84230a +Block 0011 [ 71]: 56702701f4c5a27b +Block 0011 [ 72]: 9a945ff533305f3d +Block 0011 [ 73]: 7cbea0f13d5dbf79 +Block 0011 [ 74]: 82274a2996cde7eb +Block 0011 [ 75]: 2c2d132fb2f58964 +Block 0011 [ 76]: b2b87eca7228d56c +Block 0011 [ 77]: 3a317d54a1d0048b +Block 0011 [ 78]: bf30630cceb13b33 +Block 0011 [ 79]: a4bd496da07527c5 +Block 0011 [ 80]: 16be6e1abab4689a +Block 0011 [ 81]: 870725dc928766c0 +Block 0011 [ 82]: b48e00a90347041a +Block 0011 [ 83]: 6d067251f331ae0c +Block 0011 [ 84]: 8f71090940cfca1d +Block 0011 [ 85]: 8e34c70df30e8c5a +Block 0011 [ 86]: bff713c1bda82f91 +Block 0011 [ 87]: 155d9e44ef0fc0b8 +Block 0011 [ 88]: 9bcec01ffc3698d1 +Block 0011 [ 89]: 3a338a45cf09ac03 +Block 0011 [ 90]: e36cd0e18e526e88 +Block 0011 [ 91]: 15f9626e5c77678f +Block 0011 [ 92]: 957b1847d0c89faf +Block 0011 [ 93]: 4a01a3d9db34519f +Block 0011 [ 94]: a03bdf4dac769213 +Block 0011 [ 95]: f4e37a15121e7c8b +Block 0011 [ 96]: 0374f95ee3ef5a2c +Block 0011 [ 97]: 6c849b52d5534909 +Block 0011 [ 98]: 28ff9c5ff87184d2 +Block 0011 [ 99]: a4223029e0b33123 +Block 0011 [100]: d149a075822d818d +Block 0011 [101]: 0a44cb9a3f0ef28d +Block 0011 [102]: df4da9204f1c039c +Block 0011 [103]: afac39d02c8afb71 +Block 0011 [104]: eee021deffed678d +Block 0011 [105]: d9a05d6d5b4f100d +Block 0011 [106]: 1cc09a57c9758d0d +Block 0011 [107]: 0e7556e329adbf17 +Block 0011 [108]: 13e6e5b2d9c0dd04 +Block 0011 [109]: bd463eb78a6d781f +Block 0011 [110]: a574a71e8b9bb8e0 +Block 0011 [111]: e4c7da41ff696fb5 +Block 0011 [112]: eb5ed56726da5bc6 +Block 0011 [113]: 5c07bbf9cd4f0539 +Block 0011 [114]: 501627fbad7ec4e0 +Block 0011 [115]: 95b770f2c1cb8346 +Block 0011 [116]: 518881e38b2824fb +Block 0011 [117]: b18951d660d4b6a8 +Block 0011 [118]: 90a160786aeb030a +Block 0011 [119]: c410a74193a2e691 +Block 0011 [120]: ef904dddb38d6417 +Block 0011 [121]: 3bbe7862a4fcb3e3 +Block 0011 [122]: c479db89c8121be5 +Block 0011 [123]: 4b36d107268a163c +Block 0011 [124]: e3d1ba33dc695cda +Block 0011 [125]: e81631c9b7968018 +Block 0011 [126]: 253f79b55ca7e1b0 +Block 0011 [127]: fd8e591864884fe2 +Block 0012 [ 0]: 1a0f6b8bd90a8f6b +Block 0012 [ 1]: 3f148e75f890d12e +Block 0012 [ 2]: b0e4ad7278b53c00 +Block 0012 [ 3]: 5f75cd0153783d80 +Block 0012 [ 4]: 4e56a55713194945 +Block 0012 [ 5]: 73de9e24d2add2f8 +Block 0012 [ 6]: 5c2bb2c5c8abb760 +Block 0012 [ 7]: ecceb3494123cdcb +Block 0012 [ 8]: aa6fae9b4396b84e +Block 0012 [ 9]: efde2dcd2b59052c +Block 0012 [ 10]: 2ef556dc87d5253f +Block 0012 [ 11]: a3991d1311a4f9b3 +Block 0012 [ 12]: b7059de7de2bb844 +Block 0012 [ 13]: bf011dca91c7e273 +Block 0012 [ 14]: c2e6134ad765db8b +Block 0012 [ 15]: c1919d11a4b00cb1 +Block 0012 [ 16]: 86523fcc48c8f0f6 +Block 0012 [ 17]: c250fe494cd0cb21 +Block 0012 [ 18]: c399c6549c49e114 +Block 0012 [ 19]: 3a820ca5281b0fff +Block 0012 [ 20]: 8559650005ca9fc7 +Block 0012 [ 21]: 730dd261c68edca1 +Block 0012 [ 22]: 4f28617d9790df64 +Block 0012 [ 23]: 83c104c3c5ea6f97 +Block 0012 [ 24]: 0fa8dd73f8607c76 +Block 0012 [ 25]: 272f75c6177ae094 +Block 0012 [ 26]: ddb498b135aac7a1 +Block 0012 [ 27]: 8c0d78b3e4e48313 +Block 0012 [ 28]: 43d1f1cf0c96233a +Block 0012 [ 29]: c9c9b06a3b555527 +Block 0012 [ 30]: abd3b3725979428f +Block 0012 [ 31]: 8669315d316ad7a3 +Block 0012 [ 32]: 5292d2808a046200 +Block 0012 [ 33]: a63717f5f4a24e37 +Block 0012 [ 34]: 41ba0350e19b3a75 +Block 0012 [ 35]: 43f2101a657de10a +Block 0012 [ 36]: d0095f929c14a82b +Block 0012 [ 37]: ac0883a2214af148 +Block 0012 [ 38]: 2c1fe77ae7fde7cc +Block 0012 [ 39]: 493d2debae0e95e4 +Block 0012 [ 40]: f3c3c98e07ecc949 +Block 0012 [ 41]: b370498229161188 +Block 0012 [ 42]: 70ba98dc3b17b2ea +Block 0012 [ 43]: d8009b297ec52812 +Block 0012 [ 44]: cbe0b026ba0c41a5 +Block 0012 [ 45]: 1d3e537f321cd9b4 +Block 0012 [ 46]: a691dda68fa6a57a +Block 0012 [ 47]: 77d7e2829a6fd056 +Block 0012 [ 48]: c61add89b7e17a03 +Block 0012 [ 49]: 8e61eaab8e9c4898 +Block 0012 [ 50]: 3650b222230bea53 +Block 0012 [ 51]: de129062ae4d78d2 +Block 0012 [ 52]: da20af31bbb90c04 +Block 0012 [ 53]: 4b00bae7eb8dbc7d +Block 0012 [ 54]: ed4567ce76c1d897 +Block 0012 [ 55]: 1e2a7f8a0d959306 +Block 0012 [ 56]: fefb51b8fc4b90db +Block 0012 [ 57]: e0aa1ee1bfca5d5e +Block 0012 [ 58]: 6732b1b2d7b4938b +Block 0012 [ 59]: 340a69cde3609951 +Block 0012 [ 60]: ed09fdea837845c0 +Block 0012 [ 61]: a06202e5db3a827b +Block 0012 [ 62]: cdb5fc28fd93966b +Block 0012 [ 63]: f4db11521a821378 +Block 0012 [ 64]: 0684d55a3b041eed +Block 0012 [ 65]: 41b1618f070e568b +Block 0012 [ 66]: 7c8e0bb4b5dfeab9 +Block 0012 [ 67]: a66bc80228683b6c +Block 0012 [ 68]: 0b28c1b7a888dd1d +Block 0012 [ 69]: c580445de500dcf5 +Block 0012 [ 70]: 93e59092902873da +Block 0012 [ 71]: 7b2fd4c1e522b87d +Block 0012 [ 72]: e4fed98fd79e533c +Block 0012 [ 73]: 496f026546e203a8 +Block 0012 [ 74]: 6d23a500ffb4fb77 +Block 0012 [ 75]: c47216920d8051ee +Block 0012 [ 76]: 31f82579385688b5 +Block 0012 [ 77]: b981e4cbbe00fe6b +Block 0012 [ 78]: 751b005aff1af776 +Block 0012 [ 79]: f3f53e2a82b3dd4d +Block 0012 [ 80]: 59a5b0923b01eeff +Block 0012 [ 81]: eccddd7c199344d1 +Block 0012 [ 82]: 2ca389e5c3dfb601 +Block 0012 [ 83]: c1da5ba037f769b2 +Block 0012 [ 84]: f2254420165887d3 +Block 0012 [ 85]: 9bdd424e42fb8ac9 +Block 0012 [ 86]: 86fb7baf70bbf2fb +Block 0012 [ 87]: 2b2d10e8f3bef9c9 +Block 0012 [ 88]: 2565f40d83456e2e +Block 0012 [ 89]: cffffd2f8773cfff +Block 0012 [ 90]: e2c3da055e49a29d +Block 0012 [ 91]: 69fd03274ac5f972 +Block 0012 [ 92]: 617379ad227cdba7 +Block 0012 [ 93]: 75b8e9a5226d60c0 +Block 0012 [ 94]: c334dc62de54a707 +Block 0012 [ 95]: e10f057ea8ca79d8 +Block 0012 [ 96]: eb7578bcf8f91690 +Block 0012 [ 97]: 425d6867253950a0 +Block 0012 [ 98]: 4adf5f12fe580e80 +Block 0012 [ 99]: 3b150fa0259d5a29 +Block 0012 [100]: 724683f2870b357f +Block 0012 [101]: a70ff766a5dec7f2 +Block 0012 [102]: bb26aac1eca8ad4f +Block 0012 [103]: 2a96bcef60d625bd +Block 0012 [104]: 03d1a4ae39e15fe9 +Block 0012 [105]: 609a20dd739a73a6 +Block 0012 [106]: 6cdc368e10912c82 +Block 0012 [107]: f86603e14f2349dc +Block 0012 [108]: 326c08a9609a812f +Block 0012 [109]: 1236430f64cc8466 +Block 0012 [110]: a5101a852da2b1a6 +Block 0012 [111]: af36da8f2afb00b5 +Block 0012 [112]: c337670fc34ee15b +Block 0012 [113]: ee6de63f856faf8d +Block 0012 [114]: 2c7bfea979dfc827 +Block 0012 [115]: 599f095c9a74bf90 +Block 0012 [116]: c08d305518a79a2e +Block 0012 [117]: aa2b928943937431 +Block 0012 [118]: 49afefc091ee6c9e +Block 0012 [119]: 61dda0dd29a1b55d +Block 0012 [120]: b25ceb200c524ded +Block 0012 [121]: 1f61aeae22d7737b +Block 0012 [122]: 75eb6d9ac881e97a +Block 0012 [123]: b6d4098a91934f5e +Block 0012 [124]: 334052b5ff62e98c +Block 0012 [125]: 9feccb8757580ece +Block 0012 [126]: 5702c6ec61ba797c +Block 0012 [127]: 82b8728b9614e1e6 +Block 0013 [ 0]: eaedddbe8af5aa2d +Block 0013 [ 1]: eaf925271bb772a9 +Block 0013 [ 2]: 2d52d74cf80f7f01 +Block 0013 [ 3]: 2b3dfef3de0f72a3 +Block 0013 [ 4]: b78c1d365ac715ca +Block 0013 [ 5]: ca3be4f4d86ed487 +Block 0013 [ 6]: bde70152fc817d13 +Block 0013 [ 7]: 7849235bcca4fe00 +Block 0013 [ 8]: ff1834255d9b0889 +Block 0013 [ 9]: 473ce32fac80f41d +Block 0013 [ 10]: aea46e05204bde46 +Block 0013 [ 11]: 66652914efed3406 +Block 0013 [ 12]: 3c341756d52915c2 +Block 0013 [ 13]: 2b1ba4fe3b0dc84f +Block 0013 [ 14]: 9937c961d64aeea4 +Block 0013 [ 15]: 27c2ef5ccf7c4d78 +Block 0013 [ 16]: 6a8fb6caad026005 +Block 0013 [ 17]: cba08dd959b1af0c +Block 0013 [ 18]: 75eb392a6e373db0 +Block 0013 [ 19]: fa107b1d60385685 +Block 0013 [ 20]: 64e4cb093dc69ee7 +Block 0013 [ 21]: 86034fe04390fb84 +Block 0013 [ 22]: 2a15637b8bfdb518 +Block 0013 [ 23]: 04262d2c68a9fb36 +Block 0013 [ 24]: 8869385ea5c0cea8 +Block 0013 [ 25]: 7a86c32291c7ff6e +Block 0013 [ 26]: be1e8f1d75cdbf2f +Block 0013 [ 27]: 58ce0de04a34cccd +Block 0013 [ 28]: 6f01e5967938b60c +Block 0013 [ 29]: 3a40f4a0dc93af25 +Block 0013 [ 30]: 88551df24fef2831 +Block 0013 [ 31]: 8654d6f1a3dce07b +Block 0013 [ 32]: baca7a9bf3a39df2 +Block 0013 [ 33]: 1c18fa53b02620f2 +Block 0013 [ 34]: 450203b941e55a6b +Block 0013 [ 35]: bf7c2e108a5de644 +Block 0013 [ 36]: 4417511c93c0dac9 +Block 0013 [ 37]: 24ffae020a5271ec +Block 0013 [ 38]: 69ee3ae4f949cb5e +Block 0013 [ 39]: 6478ca927bbfc07d +Block 0013 [ 40]: d6ce680d1e16842f +Block 0013 [ 41]: b992d6d900efdab2 +Block 0013 [ 42]: 310fe3c85b5d034d +Block 0013 [ 43]: 1c0dbe4c1f8ef62f +Block 0013 [ 44]: a46a74e0b2e9c447 +Block 0013 [ 45]: ad08f0145b3ea23c +Block 0013 [ 46]: 22a925dbe1442573 +Block 0013 [ 47]: aa6a1baef218fcb9 +Block 0013 [ 48]: 60c92121636f3dd4 +Block 0013 [ 49]: afe5802f9891e2bc +Block 0013 [ 50]: 92e099d0d5629dac +Block 0013 [ 51]: a9957aa663b6c719 +Block 0013 [ 52]: a1a95d7da22e9ffd +Block 0013 [ 53]: e715e53f426b0777 +Block 0013 [ 54]: 6e75377d68214b21 +Block 0013 [ 55]: eb04609119f57bf0 +Block 0013 [ 56]: 67889f4c9664d51a +Block 0013 [ 57]: 5411bbc4b8581969 +Block 0013 [ 58]: de2e7ffdabeff744 +Block 0013 [ 59]: 2deef12e5291bd14 +Block 0013 [ 60]: c86a647b52a5741f +Block 0013 [ 61]: 0394fe241338b4a6 +Block 0013 [ 62]: 186f28e9a9ac3ecf +Block 0013 [ 63]: 1d1722559db5565b +Block 0013 [ 64]: 4415f30c59b9d38d +Block 0013 [ 65]: d6269156a21ce3f0 +Block 0013 [ 66]: 92677e2f8134ec2c +Block 0013 [ 67]: c931b7415a95b276 +Block 0013 [ 68]: 716b0900181c27c7 +Block 0013 [ 69]: 0bf16f91499d7cbc +Block 0013 [ 70]: 24bbec0fe3215012 +Block 0013 [ 71]: 01bf2fcb5b05b6fa +Block 0013 [ 72]: a61e758aa17c3052 +Block 0013 [ 73]: 276ba08d67f150e2 +Block 0013 [ 74]: 22458dd5ee4542fa +Block 0013 [ 75]: 15eaa2f726b1deeb +Block 0013 [ 76]: 98754f686e166252 +Block 0013 [ 77]: c6c4887f77c1a9bf +Block 0013 [ 78]: da5651b242cf01fe +Block 0013 [ 79]: a02bd8001bd9d144 +Block 0013 [ 80]: 3e983a05c2b09cb9 +Block 0013 [ 81]: 7ef8ebad3c99e296 +Block 0013 [ 82]: 20370b5f68fe88a6 +Block 0013 [ 83]: 410fc8b8a3d86a66 +Block 0013 [ 84]: 088156fc052f6b47 +Block 0013 [ 85]: 6c708714938d49bb +Block 0013 [ 86]: be01727481ba5050 +Block 0013 [ 87]: ae8304c820f46aae +Block 0013 [ 88]: 27035fb860b61d9b +Block 0013 [ 89]: a1f5a3b7563660c4 +Block 0013 [ 90]: 4979cee149320d6d +Block 0013 [ 91]: 18497836284ca22b +Block 0013 [ 92]: 2878ce670185ee41 +Block 0013 [ 93]: dc8ffb1d7ea3c8df +Block 0013 [ 94]: 39ef70ffdf088fc7 +Block 0013 [ 95]: 0db82c5c234434b4 +Block 0013 [ 96]: aaca65cbabcbcf0f +Block 0013 [ 97]: 9185fb1315bae27e +Block 0013 [ 98]: 9d1c06a4bdd28482 +Block 0013 [ 99]: 9bd183dfb7f54cf4 +Block 0013 [100]: 3a695d353dfe6678 +Block 0013 [101]: f317b70f64f99610 +Block 0013 [102]: 4c1714fdc792a6e7 +Block 0013 [103]: aa3279d8c71e496e +Block 0013 [104]: d116e54970b5bf96 +Block 0013 [105]: bc89a65d590e3ca7 +Block 0013 [106]: eb48ceb2b57199ea +Block 0013 [107]: 2d43919e25c5f31e +Block 0013 [108]: cc035b7aa6c3a661 +Block 0013 [109]: 588a1e634e20470f +Block 0013 [110]: 418fbd6f77c03100 +Block 0013 [111]: 69ee0ffada874b58 +Block 0013 [112]: 754f34b783f15b81 +Block 0013 [113]: 419f3bd6c0eb4125 +Block 0013 [114]: 4251821a6d37d18b +Block 0013 [115]: 7331d86f98b0fc61 +Block 0013 [116]: ea664445edff9a79 +Block 0013 [117]: bdb834e86f0ee159 +Block 0013 [118]: 5cb72085004e82b5 +Block 0013 [119]: f23b2f4fbdcf5630 +Block 0013 [120]: 7a6732b1bd75a364 +Block 0013 [121]: d6e72bf9884e9967 +Block 0013 [122]: ed7718afffa3d73e +Block 0013 [123]: 682a608b55b3b23e +Block 0013 [124]: 1b74eb5bdc16cea1 +Block 0013 [125]: f05f334d68ec7da1 +Block 0013 [126]: 5177e2e0715c6108 +Block 0013 [127]: 766ae72a7c5c3aaa +Block 0014 [ 0]: 5b2550e4dbc7fa18 +Block 0014 [ 1]: 6b354d6d6b10cac7 +Block 0014 [ 2]: 0ca396bc8d3c4b0c +Block 0014 [ 3]: 000380927b45a85c +Block 0014 [ 4]: e7244935d8f887b1 +Block 0014 [ 5]: 200a8bedc1f6f499 +Block 0014 [ 6]: e427956b507ba1d8 +Block 0014 [ 7]: 6a81cda7910edc35 +Block 0014 [ 8]: 0cfe0f81f9f471a8 +Block 0014 [ 9]: 4b63ce3ecfaaf474 +Block 0014 [ 10]: 75e7cf9ad2a4841f +Block 0014 [ 11]: a3ee8e6cc201c825 +Block 0014 [ 12]: 73dafadc861c7df2 +Block 0014 [ 13]: 6be0047a88a0238e +Block 0014 [ 14]: 9f8bb8d87202d10b +Block 0014 [ 15]: 813971bc045d2c3c +Block 0014 [ 16]: 56e8be12b1264a52 +Block 0014 [ 17]: 276607bedf97436d +Block 0014 [ 18]: ac106bf67df98c68 +Block 0014 [ 19]: 14320d22ab2b8bec +Block 0014 [ 20]: e475a0090015d65f +Block 0014 [ 21]: fb3669a47ffda9a2 +Block 0014 [ 22]: fb70122cd1be3d5d +Block 0014 [ 23]: ee01966d661ab3de +Block 0014 [ 24]: 4dd4c509dc6db43e +Block 0014 [ 25]: 1ba046bdee661628 +Block 0014 [ 26]: 759e90552ec1ed7e +Block 0014 [ 27]: df0886efca925c51 +Block 0014 [ 28]: 23e9c7649656d24e +Block 0014 [ 29]: f7238ddfa18b24c2 +Block 0014 [ 30]: a45035e54a7bc958 +Block 0014 [ 31]: 378186a620803ba2 +Block 0014 [ 32]: cea0ebd7326ea234 +Block 0014 [ 33]: 54ebe0504125676b +Block 0014 [ 34]: 8e36f6d9013959c4 +Block 0014 [ 35]: 38cdcf121287b284 +Block 0014 [ 36]: e967d2462682298c +Block 0014 [ 37]: cea743b39e721689 +Block 0014 [ 38]: 64edd2b710dfb750 +Block 0014 [ 39]: 2d08633513a5ad71 +Block 0014 [ 40]: b895ddebbba5fefb +Block 0014 [ 41]: 02a7678001e2d450 +Block 0014 [ 42]: 27ef9e13015d8dec +Block 0014 [ 43]: 7a1eb3493df50849 +Block 0014 [ 44]: fe1303ec8c91a5bb +Block 0014 [ 45]: 1f9bd7cf219083e6 +Block 0014 [ 46]: c6bb9a21589475af +Block 0014 [ 47]: 873a0fc391188d09 +Block 0014 [ 48]: 190e7438692bf635 +Block 0014 [ 49]: 6ec2aa43c5e2bbe3 +Block 0014 [ 50]: 96ef69d3e95556c8 +Block 0014 [ 51]: ba7fdbdd8a70de10 +Block 0014 [ 52]: 4882e9ddcd522412 +Block 0014 [ 53]: f79160e8864da5c0 +Block 0014 [ 54]: c59223402b843174 +Block 0014 [ 55]: 761b74085fb46dc0 +Block 0014 [ 56]: ca3bbd50a8d27333 +Block 0014 [ 57]: 6cfdf0de3135521a +Block 0014 [ 58]: 79f989869f12e370 +Block 0014 [ 59]: 7d32646711d7741c +Block 0014 [ 60]: fa27ea9d16dc3dd9 +Block 0014 [ 61]: c7956b2f34e15b5e +Block 0014 [ 62]: 314442e9edc14f26 +Block 0014 [ 63]: 6218d35af723ed10 +Block 0014 [ 64]: cc31ba85bb2f651b +Block 0014 [ 65]: 8f7da3844d1645f4 +Block 0014 [ 66]: 0fba3bc9e0d62b47 +Block 0014 [ 67]: eb98f7c11eb98b8e +Block 0014 [ 68]: 5cace434044bfb20 +Block 0014 [ 69]: 6fb70bebb1a8a8a9 +Block 0014 [ 70]: 3375536d4cb653c2 +Block 0014 [ 71]: 64a94ec4d81b77f9 +Block 0014 [ 72]: e531b41790e67c68 +Block 0014 [ 73]: 82d347e282201bb8 +Block 0014 [ 74]: 80bc6a0af7bfc60f +Block 0014 [ 75]: f318824f23cfb4eb +Block 0014 [ 76]: 329345055d886557 +Block 0014 [ 77]: b3c2ec627aa4363a +Block 0014 [ 78]: 4962272584497597 +Block 0014 [ 79]: 7692ceb70ff5980f +Block 0014 [ 80]: f319241988a13e94 +Block 0014 [ 81]: eb94732cfdeea4af +Block 0014 [ 82]: fcddd9e2c11c393a +Block 0014 [ 83]: 3d6ac4f492d7df7a +Block 0014 [ 84]: 9d912c5c969aaaf5 +Block 0014 [ 85]: a91136e982c7f4da +Block 0014 [ 86]: 0a7cda3f50f68fd2 +Block 0014 [ 87]: 903eb02643c18396 +Block 0014 [ 88]: a0649fbd5f0b970b +Block 0014 [ 89]: c10eb8ea019f102c +Block 0014 [ 90]: 17c34c7c16665e57 +Block 0014 [ 91]: 27254dd5e6f4709f +Block 0014 [ 92]: 3d7772bc8265a912 +Block 0014 [ 93]: a0172dafb378d99b +Block 0014 [ 94]: 778d8f7d9b515750 +Block 0014 [ 95]: 944406206db979ea +Block 0014 [ 96]: 509d1f46f87cc0a7 +Block 0014 [ 97]: 33f6690915ed2412 +Block 0014 [ 98]: f34179142c23746e +Block 0014 [ 99]: a78c7b1cdc3ce7da +Block 0014 [100]: d640afa9bd498f05 +Block 0014 [101]: bc20596310df8b3c +Block 0014 [102]: 14dafd36a5a4d228 +Block 0014 [103]: e1b0807ba915d237 +Block 0014 [104]: 3a30e6af3668fd21 +Block 0014 [105]: fc4e6de5a31ff542 +Block 0014 [106]: 6c39a88ef296ed5a +Block 0014 [107]: 05e873d69b4438f7 +Block 0014 [108]: fae4b618526422d4 +Block 0014 [109]: 16123e4dd6f2a12e +Block 0014 [110]: e2c4bf1ac9b284e1 +Block 0014 [111]: 2ead3cdbfbe99ed7 +Block 0014 [112]: 6e2d576c0c2ae51b +Block 0014 [113]: 95626ec048beb8a7 +Block 0014 [114]: 328db9b409d90732 +Block 0014 [115]: 31e631764dcd4f5f +Block 0014 [116]: 3bdbf0835a077ce6 +Block 0014 [117]: ab57496d09a6756e +Block 0014 [118]: 6fc0f3ff3af34c5e +Block 0014 [119]: c4eb12c1e9ee0082 +Block 0014 [120]: bdf93172143e9b0e +Block 0014 [121]: 96475254ea6bce21 +Block 0014 [122]: b951bc13b50b8d94 +Block 0014 [123]: c74e588c176a5ac4 +Block 0014 [124]: f50cbab1174678bf +Block 0014 [125]: 9c0ab31431c2ef5d +Block 0014 [126]: 61dbaeec02095a86 +Block 0014 [127]: 26257729719307f2 +Block 0015 [ 0]: bffa5134f891815d +Block 0015 [ 1]: c9d1e86859077437 +Block 0015 [ 2]: 77d57dca52d915e4 +Block 0015 [ 3]: d9c785a6fe75a1c1 +Block 0015 [ 4]: 0b70b72c7f07897d +Block 0015 [ 5]: a3be1edec51134ab +Block 0015 [ 6]: a2c658c0c467bfcb +Block 0015 [ 7]: 0d793e8f6b15d9b8 +Block 0015 [ 8]: 597e8e8b9f5f50bd +Block 0015 [ 9]: a81216501f4f3790 +Block 0015 [ 10]: 5124ccd8eb141ab3 +Block 0015 [ 11]: 2aadc51f9f1db29c +Block 0015 [ 12]: 595d8bfc6ab47015 +Block 0015 [ 13]: c8f2521f504b34c4 +Block 0015 [ 14]: 49920f23c3e00a08 +Block 0015 [ 15]: 8b5e8857dcc09534 +Block 0015 [ 16]: 3446613c42b95a3d +Block 0015 [ 17]: f311d4e2180cddf6 +Block 0015 [ 18]: 330dcbb4036f4c43 +Block 0015 [ 19]: c1abc25872408257 +Block 0015 [ 20]: ea8ca75355745b41 +Block 0015 [ 21]: 3edbc39cabf21ddc +Block 0015 [ 22]: a7453f4b18499b7a +Block 0015 [ 23]: 42508913574e3416 +Block 0015 [ 24]: 7c3c53f6522e1e58 +Block 0015 [ 25]: 4ac931ea5a311b70 +Block 0015 [ 26]: bcf6e7a4a8050c6b +Block 0015 [ 27]: 98c6e929c86f3fa2 +Block 0015 [ 28]: 25451aaace81f7ee +Block 0015 [ 29]: 5313185413450a07 +Block 0015 [ 30]: 69293c347974ba7a +Block 0015 [ 31]: d48883fdfdc19477 +Block 0015 [ 32]: 3a0ce3cc08024172 +Block 0015 [ 33]: 66bd0a95bf2b998a +Block 0015 [ 34]: 8ab3300f23d9abe2 +Block 0015 [ 35]: aaac3dcf691b6fa1 +Block 0015 [ 36]: ef4ac0dd37e0aba3 +Block 0015 [ 37]: 311431df9bb602c5 +Block 0015 [ 38]: 74edd18f5de5bf86 +Block 0015 [ 39]: 4ffd577d73bcbd05 +Block 0015 [ 40]: 214f9d188d2f36d9 +Block 0015 [ 41]: b446680a08db1c7f +Block 0015 [ 42]: 44f50256a68647f4 +Block 0015 [ 43]: 2456dd7fb1a98133 +Block 0015 [ 44]: 5a4f92d4794ac4c3 +Block 0015 [ 45]: f7fd907c3384360d +Block 0015 [ 46]: cb979d6a0dd8436b +Block 0015 [ 47]: 0f7dec5cf75ce956 +Block 0015 [ 48]: bc9227dc2eb2db73 +Block 0015 [ 49]: 94cafc1d1646ed66 +Block 0015 [ 50]: f3a475e8f020b13a +Block 0015 [ 51]: 22b0f1229ae9a821 +Block 0015 [ 52]: 333762086c0d1d63 +Block 0015 [ 53]: 69e584834b611f03 +Block 0015 [ 54]: ccc3dbf7c70523fe +Block 0015 [ 55]: b976aa72c341c6dc +Block 0015 [ 56]: c57a56dce39435e1 +Block 0015 [ 57]: e3ad1c396a6e98d1 +Block 0015 [ 58]: e1eb535fc12f237a +Block 0015 [ 59]: 31b646b18f7a60a7 +Block 0015 [ 60]: 8b5aedc11623526c +Block 0015 [ 61]: 6946cbcf48d09dde +Block 0015 [ 62]: 881b0e743e1f8c04 +Block 0015 [ 63]: 04db0580164c9224 +Block 0015 [ 64]: bd8c78074008c1cf +Block 0015 [ 65]: 662baa93b93e46ad +Block 0015 [ 66]: 3b6e57fee4d1eef2 +Block 0015 [ 67]: ea5709e05b86b1e3 +Block 0015 [ 68]: f6114fe2c56f8a91 +Block 0015 [ 69]: 3e1a3204a2616fa5 +Block 0015 [ 70]: 420210852fdf71ee +Block 0015 [ 71]: 006a843a0c6cc9c6 +Block 0015 [ 72]: 896cddd3e1719215 +Block 0015 [ 73]: 59a6b53c4f06fb52 +Block 0015 [ 74]: b819297575c796ad +Block 0015 [ 75]: 130d7e7b3c82284c +Block 0015 [ 76]: a6e0893c54adda2e +Block 0015 [ 77]: cacdc1057579975e +Block 0015 [ 78]: 8eaaff716864cf5c +Block 0015 [ 79]: 6aa150222002d534 +Block 0015 [ 80]: 2ad6f73b950c9641 +Block 0015 [ 81]: 042b0a08f2daf138 +Block 0015 [ 82]: d77dca90a93ea577 +Block 0015 [ 83]: 1be098db6c2283bb +Block 0015 [ 84]: a8ef13df654b6224 +Block 0015 [ 85]: ac70aaa59942e32e +Block 0015 [ 86]: 049cade3d2bd666a +Block 0015 [ 87]: 6f95a90efbc8f023 +Block 0015 [ 88]: 1ad8afc58cd1852c +Block 0015 [ 89]: c1f8c28aab6c0a2c +Block 0015 [ 90]: 1deb0ff6f03546b6 +Block 0015 [ 91]: 2919e466740b12ec +Block 0015 [ 92]: 6068f5c8e3687356 +Block 0015 [ 93]: 94c6e3c042e0c45b +Block 0015 [ 94]: 299f2690cdc3f2ae +Block 0015 [ 95]: 371e0b2f24c55dd1 +Block 0015 [ 96]: 68b2d5a79a498a9d +Block 0015 [ 97]: f90d22cd6b28fbcb +Block 0015 [ 98]: 0a540f5bb4c626da +Block 0015 [ 99]: 22a7872cc893ccbc +Block 0015 [100]: 3f88c5459cb3d544 +Block 0015 [101]: c4ea6b59c1c6b0a7 +Block 0015 [102]: d4bdb7a882c60a7b +Block 0015 [103]: 6de6f73d38b41093 +Block 0015 [104]: 75eea05cb9d3455f +Block 0015 [105]: e3e2ee7697b87d31 +Block 0015 [106]: a5229ba65fed9c39 +Block 0015 [107]: bae498bf96e2bb0d +Block 0015 [108]: 9929fb2d2d6a097e +Block 0015 [109]: d2dfe8b87b7474d9 +Block 0015 [110]: bf2d786bfa03556b +Block 0015 [111]: 2037ef5875f48234 +Block 0015 [112]: 79fc5cc5dcb41d0d +Block 0015 [113]: 5956deb9a21e81cc +Block 0015 [114]: ee7fb1ac03532faf +Block 0015 [115]: 3c3640a2fc5ccf9f +Block 0015 [116]: 249ae749f07b477e +Block 0015 [117]: 3dfb90c35bae2e4c +Block 0015 [118]: 656a4faf5d4139d0 +Block 0015 [119]: 49d42d1ec6342c7d +Block 0015 [120]: 3a0f3ecf42effdd9 +Block 0015 [121]: 1ee8e527e656374f +Block 0015 [122]: 8d027e114f72d46b +Block 0015 [123]: 16219eeebed66173 +Block 0015 [124]: dbaa98ff73905ee1 +Block 0015 [125]: e1bb04410cc1bc8b +Block 0015 [126]: ca336c250756275f +Block 0015 [127]: 1bfba5b1b19c3f88 +Block 0016 [ 0]: 6010e5a01db5f196 +Block 0016 [ 1]: ef7ac9e4440495c3 +Block 0016 [ 2]: da642ab2564f83df +Block 0016 [ 3]: 422fbcb748ee5d27 +Block 0016 [ 4]: c5b382f0a17717bf +Block 0016 [ 5]: d4425eca0af816fb +Block 0016 [ 6]: e024f3f05918d81a +Block 0016 [ 7]: 53d9fc82bfcc0ff7 +Block 0016 [ 8]: 0d0ffa5876f6e615 +Block 0016 [ 9]: 7fa7188fff681a48 +Block 0016 [ 10]: 28f5d8b757cb69d2 +Block 0016 [ 11]: f59ff3e8dcabb89b +Block 0016 [ 12]: c086251a5ad5708f +Block 0016 [ 13]: 10f5b28138ae33ab +Block 0016 [ 14]: 1273805b77cb7e11 +Block 0016 [ 15]: b3d83b7e6cf2b8d6 +Block 0016 [ 16]: 68b4cab9ec0bb673 +Block 0016 [ 17]: 9db6bb436dc180a3 +Block 0016 [ 18]: f8941e643334bd45 +Block 0016 [ 19]: 60f497755d89255c +Block 0016 [ 20]: 41d7f475a441ec8a +Block 0016 [ 21]: 4d662dce1c1c6cd8 +Block 0016 [ 22]: 6d61fde8d9a5f590 +Block 0016 [ 23]: 949d73cecd9a94af +Block 0016 [ 24]: 2a621fcccc89a379 +Block 0016 [ 25]: e3b9f35f13264c99 +Block 0016 [ 26]: 665090516cab8704 +Block 0016 [ 27]: 54358d6530ea9a16 +Block 0016 [ 28]: 484b3f465d14d230 +Block 0016 [ 29]: 7f14f35e09e986bf +Block 0016 [ 30]: 1f25c14168d491a2 +Block 0016 [ 31]: a86ffa29322d3c60 +Block 0016 [ 32]: 4dbe9a8213819da6 +Block 0016 [ 33]: 79a23c6d9e0b6eab +Block 0016 [ 34]: 030791bdea94c4e9 +Block 0016 [ 35]: a791b204d75e3f3d +Block 0016 [ 36]: 81d8761e8890bcab +Block 0016 [ 37]: 050fe1821d706207 +Block 0016 [ 38]: 18825ead7299224e +Block 0016 [ 39]: 001a96583c7d6f09 +Block 0016 [ 40]: 0001d2e81148000f +Block 0016 [ 41]: 372fc268847321c6 +Block 0016 [ 42]: 9d07aad08cff66f9 +Block 0016 [ 43]: 69ed41995677bedc +Block 0016 [ 44]: 7019349cab952e6d +Block 0016 [ 45]: a5e5b7c45b17ffe5 +Block 0016 [ 46]: 6dac282c45d97b01 +Block 0016 [ 47]: 824ff45d1aa89d6d +Block 0016 [ 48]: 813df0ece26aa83e +Block 0016 [ 49]: 1ab5dd2ab168553c +Block 0016 [ 50]: 1cb81038942c1ea0 +Block 0016 [ 51]: a992785912314770 +Block 0016 [ 52]: 56da8dcd757f3f9c +Block 0016 [ 53]: 6d9a48dc8fb83789 +Block 0016 [ 54]: b08051aeeefb1bd3 +Block 0016 [ 55]: 557f90a417a97732 +Block 0016 [ 56]: df1e927d53570ac2 +Block 0016 [ 57]: 5a61d6997a74e714 +Block 0016 [ 58]: 6d493a2ff2550d90 +Block 0016 [ 59]: ef3747c93347f033 +Block 0016 [ 60]: e4e55b94cfe605f0 +Block 0016 [ 61]: 22d8d26ec147d337 +Block 0016 [ 62]: c81d012c9200276f +Block 0016 [ 63]: 359774aa24a65129 +Block 0016 [ 64]: 9f4b8f9fb5cefffc +Block 0016 [ 65]: 0d933ec3e5e2a12a +Block 0016 [ 66]: 9b91aa03e72879cd +Block 0016 [ 67]: d663e27e00b62076 +Block 0016 [ 68]: f4b8905b594a2974 +Block 0016 [ 69]: e62dfc1510ebcecd +Block 0016 [ 70]: 9c0148ce0ee08434 +Block 0016 [ 71]: 99c1407c889dffab +Block 0016 [ 72]: 9048f4117c0cc6d3 +Block 0016 [ 73]: 98b2b397d668d6e8 +Block 0016 [ 74]: cc063ea8e2f217a9 +Block 0016 [ 75]: 9aaaa458736bd6c1 +Block 0016 [ 76]: 48e7a37c45aff5ba +Block 0016 [ 77]: 8b5e80eb8a66e2b6 +Block 0016 [ 78]: ea967076787d21cf +Block 0016 [ 79]: 4b47a086ab30cf99 +Block 0016 [ 80]: 2a37cf84213864aa +Block 0016 [ 81]: fe9988bd22317576 +Block 0016 [ 82]: 04d3c4a70f6eaa56 +Block 0016 [ 83]: 8121c0c9771de687 +Block 0016 [ 84]: 8e900e643824ff7d +Block 0016 [ 85]: 70b3c663c2497b1a +Block 0016 [ 86]: fc2bc4df54195dcb +Block 0016 [ 87]: ec6a71b75fabcfd4 +Block 0016 [ 88]: 99bb729eb37d40d7 +Block 0016 [ 89]: 6c1cf32dbae62277 +Block 0016 [ 90]: 1dd8a791c33baf55 +Block 0016 [ 91]: 3fcde3086a1bbe80 +Block 0016 [ 92]: afba9f9bbe6fd48e +Block 0016 [ 93]: b2cfce14af04208e +Block 0016 [ 94]: eac8a967896115ec +Block 0016 [ 95]: ea2143acd19ef83a +Block 0016 [ 96]: 701456ec354ba67e +Block 0016 [ 97]: 49d65a46e413858a +Block 0016 [ 98]: 8f07bd7412b0e8f1 +Block 0016 [ 99]: 68a8f4cc7f10eb91 +Block 0016 [100]: 9c01a08f0af1afa5 +Block 0016 [101]: b820f47feba63788 +Block 0016 [102]: 03190ea5d4871819 +Block 0016 [103]: 3b651df26d5cd723 +Block 0016 [104]: 26ca939e5080c15b +Block 0016 [105]: cc70e85496103f56 +Block 0016 [106]: 80ffd1c901698be2 +Block 0016 [107]: 522441509970ea18 +Block 0016 [108]: 1022a4692594b2bd +Block 0016 [109]: 2985962eb8b814b3 +Block 0016 [110]: 264aa5f3c50eaa8b +Block 0016 [111]: eadbbfa147a88690 +Block 0016 [112]: 878ea9e03d8fde59 +Block 0016 [113]: 85ecf7c34da61ad3 +Block 0016 [114]: a2d465943921114e +Block 0016 [115]: 3f515b15670ca854 +Block 0016 [116]: 78682e4a3d933c57 +Block 0016 [117]: 0741db2c00eaf60c +Block 0016 [118]: 14aebc91873c8271 +Block 0016 [119]: bfcb1cf854c7ffef +Block 0016 [120]: 1ff0f28ec53228dc +Block 0016 [121]: 665ded777f9ff07c +Block 0016 [122]: bf3a4430fc18db0d +Block 0016 [123]: 111121717f28e4b0 +Block 0016 [124]: 0a7e2d46fa48c688 +Block 0016 [125]: 1d9111141c20dd7d +Block 0016 [126]: 97dc7f23a15e420d +Block 0016 [127]: 7d0f97200592ac0f +Block 0017 [ 0]: 6c854de359a27b14 +Block 0017 [ 1]: ab170011524b516b +Block 0017 [ 2]: d9ca751dd898771a +Block 0017 [ 3]: 8c4633d5f1018345 +Block 0017 [ 4]: 644e77aaccec2780 +Block 0017 [ 5]: ca368c8fc382be50 +Block 0017 [ 6]: a3750492ea2d3743 +Block 0017 [ 7]: 710724317321ea99 +Block 0017 [ 8]: 506e1f6c741c754b +Block 0017 [ 9]: 0b20985a71e306ce +Block 0017 [ 10]: 6aff8cd2138fb4a4 +Block 0017 [ 11]: c6f99c5928d42e0e +Block 0017 [ 12]: 5474a832d3fec864 +Block 0017 [ 13]: 4e2c6f89c04b4ce3 +Block 0017 [ 14]: 20951424bd88158f +Block 0017 [ 15]: 049ddd7039249b57 +Block 0017 [ 16]: 9d11626ed63e9d75 +Block 0017 [ 17]: 5dcd2c7b8fed81df +Block 0017 [ 18]: 32e63465360993cf +Block 0017 [ 19]: e5291e13dac657ef +Block 0017 [ 20]: 19b49c016d92ef9f +Block 0017 [ 21]: 25c4060f2e5a141b +Block 0017 [ 22]: 01c62152a6855bd0 +Block 0017 [ 23]: 5614450e855dff8e +Block 0017 [ 24]: 3dea2a55b44ed33d +Block 0017 [ 25]: 1e9ee197c2152f09 +Block 0017 [ 26]: 35ed915e6967ed30 +Block 0017 [ 27]: 4653b34c57a70bee +Block 0017 [ 28]: 6d7aef2d7c05145e +Block 0017 [ 29]: 17adee6b3e41fb2a +Block 0017 [ 30]: 8e12058d65ac98d6 +Block 0017 [ 31]: 0046d2058b5368ee +Block 0017 [ 32]: e212e8b2e97a58f0 +Block 0017 [ 33]: 8d36be0c3106f8ba +Block 0017 [ 34]: 48c69e10aa22904d +Block 0017 [ 35]: 8ebd7ca19f445bce +Block 0017 [ 36]: f03a9a76d79f28a1 +Block 0017 [ 37]: 70c4181d29e54c96 +Block 0017 [ 38]: 77a364b32253cf9d +Block 0017 [ 39]: 3391b9f1953c8b37 +Block 0017 [ 40]: aa993339b8e0bfb0 +Block 0017 [ 41]: ec54e0387ad67f2d +Block 0017 [ 42]: 2134419c0745c71b +Block 0017 [ 43]: 793be7c16a647a0f +Block 0017 [ 44]: c69c2aad8535c856 +Block 0017 [ 45]: b39230bf5914c583 +Block 0017 [ 46]: 6a22086fafce953c +Block 0017 [ 47]: 4db7d73d6688a25d +Block 0017 [ 48]: ac9b96d3af4ad9eb +Block 0017 [ 49]: e6a8d0830e5f9a8a +Block 0017 [ 50]: 8ead43f5c86a6c53 +Block 0017 [ 51]: ee14b2ad8035a82e +Block 0017 [ 52]: aedad0d1aeee646a +Block 0017 [ 53]: fd496ca2fa94be9f +Block 0017 [ 54]: 704655cfbf0bb174 +Block 0017 [ 55]: 643542ce119cfce6 +Block 0017 [ 56]: 2756dd234a28b75e +Block 0017 [ 57]: 46774c4f9c4faeef +Block 0017 [ 58]: e880c1a7748827da +Block 0017 [ 59]: 7ed6aa78f60fb5b2 +Block 0017 [ 60]: 996be9d3a1251b76 +Block 0017 [ 61]: def3a7360b6b00e0 +Block 0017 [ 62]: fd47dff4e7918935 +Block 0017 [ 63]: 8e1a79b1ab106b77 +Block 0017 [ 64]: 4bc31eacee4bd340 +Block 0017 [ 65]: 68194d5d5b0de56d +Block 0017 [ 66]: 2386852248a5f801 +Block 0017 [ 67]: 1f5a334f4ccf1a17 +Block 0017 [ 68]: 026e07926322d862 +Block 0017 [ 69]: eb5210fcb5e9bb76 +Block 0017 [ 70]: 491d5a771e931209 +Block 0017 [ 71]: 0711fe3ff0b0102a +Block 0017 [ 72]: 32652a737fa96536 +Block 0017 [ 73]: 1ad92094bb31a0c5 +Block 0017 [ 74]: 2ec5dd2510484a03 +Block 0017 [ 75]: e6602baec448ceea +Block 0017 [ 76]: 6dd6c94678ff2b44 +Block 0017 [ 77]: 6c2145a06e193d1c +Block 0017 [ 78]: 0924fba0cdad5d27 +Block 0017 [ 79]: 29e57377cbe5aef7 +Block 0017 [ 80]: ef001f269aa4ee67 +Block 0017 [ 81]: dbfb6698ab8f3bc7 +Block 0017 [ 82]: 29b3658753624eb5 +Block 0017 [ 83]: e0b1c5dba16f8047 +Block 0017 [ 84]: a13b1b94185ffa59 +Block 0017 [ 85]: abc67b4f1d7f428d +Block 0017 [ 86]: 1a83e1d56da1feaa +Block 0017 [ 87]: c4d6aca2025b742c +Block 0017 [ 88]: f89b51f7fb2ead81 +Block 0017 [ 89]: 7a2c8bdfbad523ba +Block 0017 [ 90]: f146ec07790bdc42 +Block 0017 [ 91]: 18424f72b9b1807c +Block 0017 [ 92]: b348077960d66ab3 +Block 0017 [ 93]: f6e54d7ecbe2bf1d +Block 0017 [ 94]: c6d51695b65c1709 +Block 0017 [ 95]: 18afc845c30ff3b4 +Block 0017 [ 96]: 3ffccd9ef3011b87 +Block 0017 [ 97]: c7bc87390fa969e1 +Block 0017 [ 98]: 34a9bafacf6fa83c +Block 0017 [ 99]: c5e6c743af000704 +Block 0017 [100]: 6af212c30a350c1d +Block 0017 [101]: 88d55b4862fc3d9c +Block 0017 [102]: cc48a109df597048 +Block 0017 [103]: 09ef4343d8c9fc76 +Block 0017 [104]: c6c72a8f20bfc65d +Block 0017 [105]: af5d9436947d2da2 +Block 0017 [106]: 83e806505df923fc +Block 0017 [107]: 4d1b57f48a901f47 +Block 0017 [108]: 3a7224caac737486 +Block 0017 [109]: 9ad46a15a95bd9b9 +Block 0017 [110]: 2c605f1dd6fb13b0 +Block 0017 [111]: 5b58702ada82fb6d +Block 0017 [112]: 56ad71be835153be +Block 0017 [113]: 702a54e878158665 +Block 0017 [114]: bc63b93cb901b390 +Block 0017 [115]: bf5286b83aeacabe +Block 0017 [116]: 2447ce3ac7607e12 +Block 0017 [117]: 18591f38ccec50b0 +Block 0017 [118]: 2f43769546a049c3 +Block 0017 [119]: 875a0634f2bdb29b +Block 0017 [120]: ff423c951924c37f +Block 0017 [121]: f3fdc563e8968307 +Block 0017 [122]: ef523a21adfa27a9 +Block 0017 [123]: 4b97c503e8f1c16a +Block 0017 [124]: 49fbc58c69cf60e3 +Block 0017 [125]: 9d083b9159a3342e +Block 0017 [126]: e6150d9b263368e9 +Block 0017 [127]: 91c8e3518b925665 +Block 0018 [ 0]: 09169bcd34088b6b +Block 0018 [ 1]: 86acc703eeac4a74 +Block 0018 [ 2]: acb4afde4e700884 +Block 0018 [ 3]: f74c9f748888b3d2 +Block 0018 [ 4]: 053604400798d750 +Block 0018 [ 5]: dbfb2e0558912262 +Block 0018 [ 6]: 434957deab5f0be5 +Block 0018 [ 7]: 1d1a36215fab5839 +Block 0018 [ 8]: 2b3c96e646cb7b58 +Block 0018 [ 9]: 5f0c334b5cf5e76d +Block 0018 [ 10]: 25c500806d58bb88 +Block 0018 [ 11]: c363a6a0ea48185a +Block 0018 [ 12]: 72a9ca02fd66fb79 +Block 0018 [ 13]: 3e098c02b5525add +Block 0018 [ 14]: 38abb765bebc5ef9 +Block 0018 [ 15]: c166ffc83198c88e +Block 0018 [ 16]: fb77428692d231d3 +Block 0018 [ 17]: 3539b44b84631eb5 +Block 0018 [ 18]: f4123116001a9a3c +Block 0018 [ 19]: 8939910fa3c492f0 +Block 0018 [ 20]: c9a9f3ca2aa9b956 +Block 0018 [ 21]: 733b09b7c6e375b4 +Block 0018 [ 22]: 4be150262a693b43 +Block 0018 [ 23]: 80c2356af1c3e4e2 +Block 0018 [ 24]: 78f6b4660d1fcbd4 +Block 0018 [ 25]: b5cb5cc48f8ce6d8 +Block 0018 [ 26]: 6163248cf38ee860 +Block 0018 [ 27]: 3149c7c21d9c1bcc +Block 0018 [ 28]: a46dd5ce559b3301 +Block 0018 [ 29]: 82a377709679db16 +Block 0018 [ 30]: df41d3ae50c3e9fa +Block 0018 [ 31]: 20cc71102bcbc203 +Block 0018 [ 32]: 87c7cefcafdd7f1a +Block 0018 [ 33]: 974b1dd1e6abcf25 +Block 0018 [ 34]: 0c957cfeacbba93e +Block 0018 [ 35]: 624b4138281d73cb +Block 0018 [ 36]: 5e5376ec02786a25 +Block 0018 [ 37]: cd87356fed667155 +Block 0018 [ 38]: 22da3a402996ee25 +Block 0018 [ 39]: d61015447f0e6bf2 +Block 0018 [ 40]: 636d57f3d02a806c +Block 0018 [ 41]: 298521b455db8a42 +Block 0018 [ 42]: 863be3dca5457525 +Block 0018 [ 43]: 6a2bc1f83f302d42 +Block 0018 [ 44]: 20fc3e21514b4937 +Block 0018 [ 45]: 9066233a2cdfac93 +Block 0018 [ 46]: 2f7acb4b162ac38c +Block 0018 [ 47]: 1e9e4cc0ff3d03de +Block 0018 [ 48]: 1dd520d008ee3700 +Block 0018 [ 49]: d422d313c724d22e +Block 0018 [ 50]: bd2891bb12d658cb +Block 0018 [ 51]: ee7255f1b11eb395 +Block 0018 [ 52]: 6a5c5a4933ff4d0c +Block 0018 [ 53]: 938ea358a4fcdaa0 +Block 0018 [ 54]: faea433823bec653 +Block 0018 [ 55]: 5a8cbbd843d89aad +Block 0018 [ 56]: 00a4ab591ec20403 +Block 0018 [ 57]: dfef10cd77bb704c +Block 0018 [ 58]: 84fe88c092442226 +Block 0018 [ 59]: e945709daa309822 +Block 0018 [ 60]: 5f5f457b0f044e15 +Block 0018 [ 61]: 0962103719625665 +Block 0018 [ 62]: 392e21509f3e2b85 +Block 0018 [ 63]: 79db0d5e62d4a35f +Block 0018 [ 64]: b1cc4815490b2a15 +Block 0018 [ 65]: 2a27bd31361243ff +Block 0018 [ 66]: 534931fd3119c337 +Block 0018 [ 67]: f2de675fd4477358 +Block 0018 [ 68]: 3ce1d2a9d12283a3 +Block 0018 [ 69]: 3529aeb38b7f494c +Block 0018 [ 70]: 859608bcef46cd68 +Block 0018 [ 71]: 92e002e9919eb521 +Block 0018 [ 72]: e94a244299ef800e +Block 0018 [ 73]: 3b52ecf16f8af708 +Block 0018 [ 74]: 7ba9b8b344d26286 +Block 0018 [ 75]: 65c1c368b537a81b +Block 0018 [ 76]: 0a00be152dce8df4 +Block 0018 [ 77]: 8a5639a940bdce45 +Block 0018 [ 78]: 41767d6c8bf15e7c +Block 0018 [ 79]: 5215d97498dd4741 +Block 0018 [ 80]: c70d80194c256712 +Block 0018 [ 81]: c8f08d28ec7265b5 +Block 0018 [ 82]: 394757f13699ce10 +Block 0018 [ 83]: 00184fc5a16919ba +Block 0018 [ 84]: 4f9a458762b2ff08 +Block 0018 [ 85]: e92b2319026bb801 +Block 0018 [ 86]: 14e47983ebef3da7 +Block 0018 [ 87]: b7afe7d7785d842c +Block 0018 [ 88]: da2999c313f6bebd +Block 0018 [ 89]: dbb0219158918ad4 +Block 0018 [ 90]: 0ff465d811aea3a4 +Block 0018 [ 91]: bb700ac4d2a8934a +Block 0018 [ 92]: 40552366f56fa6e8 +Block 0018 [ 93]: 9bc93fc38182a556 +Block 0018 [ 94]: bec6d8f0f9967bb9 +Block 0018 [ 95]: 6d6a8136627b7a9c +Block 0018 [ 96]: d2662137f57a7c6c +Block 0018 [ 97]: 5bb3b7ddf0963885 +Block 0018 [ 98]: 2e862fc79af5d102 +Block 0018 [ 99]: 2184d2e48441702b +Block 0018 [100]: 06d9bd4aedc4e8d5 +Block 0018 [101]: 4724e53387679683 +Block 0018 [102]: 6aac974179446794 +Block 0018 [103]: d7e60f9c73e24088 +Block 0018 [104]: 9db1ee2eacf97545 +Block 0018 [105]: dbaed3874219a120 +Block 0018 [106]: 76dbbdc4483bde99 +Block 0018 [107]: 39a4b5d1b9d35ec4 +Block 0018 [108]: ba2913d05acbc99d +Block 0018 [109]: 3938947bec18c8d3 +Block 0018 [110]: 7e4d1a1004fc2bf8 +Block 0018 [111]: 19a777b4f19d49f9 +Block 0018 [112]: dcc44d359edf7ba7 +Block 0018 [113]: 187b0ef4c810a9c6 +Block 0018 [114]: b073241a034b70cb +Block 0018 [115]: 4f30b75c95304517 +Block 0018 [116]: d431a15ac9c55e98 +Block 0018 [117]: 97b7e619a567d98e +Block 0018 [118]: 0b86895e716fe184 +Block 0018 [119]: 8f232e76cccd2fec +Block 0018 [120]: fb6b2f0ac4ee2162 +Block 0018 [121]: 35850bcb3c03430b +Block 0018 [122]: 6b7a17b5c64c950f +Block 0018 [123]: 024be1006b69f750 +Block 0018 [124]: 587cb3d3632ce41b +Block 0018 [125]: 44e4206f94a46c91 +Block 0018 [126]: 9d92bd06844fd42e +Block 0018 [127]: 1a362e419ebc0ebf +Block 0019 [ 0]: fb1a18dd9d7050cf +Block 0019 [ 1]: 8003990d8ce31314 +Block 0019 [ 2]: 5a1fe2fd55f52157 +Block 0019 [ 3]: f2c627a6c5b50c9c +Block 0019 [ 4]: 7df91a65f111fc48 +Block 0019 [ 5]: 4373c58ce1b6834d +Block 0019 [ 6]: 7a63036740cfc7e9 +Block 0019 [ 7]: f706a4864759b418 +Block 0019 [ 8]: 93acd66513889d55 +Block 0019 [ 9]: 48854dbcd9a36a91 +Block 0019 [ 10]: dc3409afd0b364d2 +Block 0019 [ 11]: 82d5350cc4216ae5 +Block 0019 [ 12]: 67656d5e97f0d6f3 +Block 0019 [ 13]: 08ffde5c41840d3d +Block 0019 [ 14]: a6e2e49699662cf6 +Block 0019 [ 15]: 1165624c23dc6a59 +Block 0019 [ 16]: 9b257613376b98bb +Block 0019 [ 17]: 5b3b3a9b22f18fc6 +Block 0019 [ 18]: 8e180a717652d9de +Block 0019 [ 19]: ee887439b80d6210 +Block 0019 [ 20]: 7dad12f1ebf23f4a +Block 0019 [ 21]: 8fbcd1a17cfc4382 +Block 0019 [ 22]: 9569665875fc1a39 +Block 0019 [ 23]: 32ef4ca936ecd698 +Block 0019 [ 24]: 6b143f4ff90bc9b8 +Block 0019 [ 25]: 3125e294dc69e551 +Block 0019 [ 26]: 8dfeae4343a1ab97 +Block 0019 [ 27]: 0d515500a7396b53 +Block 0019 [ 28]: f9aff1f427be7093 +Block 0019 [ 29]: 661148ebd0368628 +Block 0019 [ 30]: 405568cdd4f64a35 +Block 0019 [ 31]: 68db03ab59e58d23 +Block 0019 [ 32]: 4852cd76fea75ea2 +Block 0019 [ 33]: ef11900d02739bd6 +Block 0019 [ 34]: e54ac5c2a8fed901 +Block 0019 [ 35]: ebac4ca2e70572af +Block 0019 [ 36]: 11f503055e2f369a +Block 0019 [ 37]: 3cb7ec7a47ece701 +Block 0019 [ 38]: 741ac40ccb35b5f6 +Block 0019 [ 39]: 0988537de00f2f86 +Block 0019 [ 40]: 03c72d2e04a2b7d1 +Block 0019 [ 41]: bcdcf97b2046cf23 +Block 0019 [ 42]: e6abec7d693a2d78 +Block 0019 [ 43]: 17b3a2364d5d591e +Block 0019 [ 44]: 635b0613ef26c2f6 +Block 0019 [ 45]: f2dac357e00b0473 +Block 0019 [ 46]: 7b3f889632f9216f +Block 0019 [ 47]: b276ed10296d8bc0 +Block 0019 [ 48]: ca7bf1ac91f14ae3 +Block 0019 [ 49]: 67f2fbcfac4f0b3e +Block 0019 [ 50]: 3d410c3d2788dfc0 +Block 0019 [ 51]: e82b4e26ed7c2956 +Block 0019 [ 52]: 1b1ebf1749f98ac5 +Block 0019 [ 53]: 7606f41eb6e43647 +Block 0019 [ 54]: 72d8654a0024c77f +Block 0019 [ 55]: e8931c577a41a343 +Block 0019 [ 56]: c87455bf23cf0d7d +Block 0019 [ 57]: fd35a720c62f1148 +Block 0019 [ 58]: 740ba36ec29256dc +Block 0019 [ 59]: 3e58d08b19c34732 +Block 0019 [ 60]: 20b08e2a659869b6 +Block 0019 [ 61]: abf550ee47b890c4 +Block 0019 [ 62]: 6b51a125c9a5b1c8 +Block 0019 [ 63]: 8c2f07fa117246fc +Block 0019 [ 64]: d9dcd942493ffc8b +Block 0019 [ 65]: a67f91a1888767dd +Block 0019 [ 66]: cb0a25f005618897 +Block 0019 [ 67]: fe031e918884083e +Block 0019 [ 68]: b5f2696212d55bf4 +Block 0019 [ 69]: d6f0f120d54a2056 +Block 0019 [ 70]: b8aa60ecefdbf3ea +Block 0019 [ 71]: b1d50e6dba68c17a +Block 0019 [ 72]: ee748a952573ecdb +Block 0019 [ 73]: 9ca785a74983ceae +Block 0019 [ 74]: 44ec1f1bbc910c5e +Block 0019 [ 75]: 0fec54467df78766 +Block 0019 [ 76]: 624b8e56f6d980ec +Block 0019 [ 77]: fa07a5f17f84a623 +Block 0019 [ 78]: cd00a41e8aa5b6ce +Block 0019 [ 79]: 5697364234152d21 +Block 0019 [ 80]: 7b8a32e4f0d1af0d +Block 0019 [ 81]: 5d64cc8f68a0f974 +Block 0019 [ 82]: 7dcb4f15a3b8f121 +Block 0019 [ 83]: 9367b5b9258a325b +Block 0019 [ 84]: 4de4da6d8e0866d9 +Block 0019 [ 85]: c7b3b0f3abc15394 +Block 0019 [ 86]: d33b87d1eed4a337 +Block 0019 [ 87]: b9ed2e72bb6ebea4 +Block 0019 [ 88]: 10572f65d1efbe1f +Block 0019 [ 89]: 9e7a73cc84aba6fb +Block 0019 [ 90]: a53e0e4dda2544d6 +Block 0019 [ 91]: 65c60263116b0f00 +Block 0019 [ 92]: 83c981db596413a1 +Block 0019 [ 93]: cf570ce8ecef3c30 +Block 0019 [ 94]: 2260ce8de0bfabec +Block 0019 [ 95]: 7ad56b5059153188 +Block 0019 [ 96]: 802fe70bfdf0be5c +Block 0019 [ 97]: cacfaf3c2282467d +Block 0019 [ 98]: 8c51a731d976194b +Block 0019 [ 99]: 8ff60d9c20b335b6 +Block 0019 [100]: 7d574bc7d328545a +Block 0019 [101]: aa1c5b56f88145dd +Block 0019 [102]: a488018cf5b62cd4 +Block 0019 [103]: ccd5645cf5740f5a +Block 0019 [104]: 704c1487b8459aa3 +Block 0019 [105]: 01c90b93b0ec25f7 +Block 0019 [106]: 41bd7eb3eb05c641 +Block 0019 [107]: 49c7afa99bb7c26c +Block 0019 [108]: 9d20a21a25836732 +Block 0019 [109]: 463ce6f1868c2f65 +Block 0019 [110]: e4f900a4886c99f0 +Block 0019 [111]: ee60e1befabcb60e +Block 0019 [112]: 0f7b00260ee93605 +Block 0019 [113]: e42b603722eda7d4 +Block 0019 [114]: e7a6276083514d86 +Block 0019 [115]: 02c2b63554903e2c +Block 0019 [116]: 4f859183eddd47dd +Block 0019 [117]: 0f03d0c14a6dc8d6 +Block 0019 [118]: 6dccfeb204bb0ca6 +Block 0019 [119]: b81012e04b46c739 +Block 0019 [120]: 6ae65826188c494f +Block 0019 [121]: 5f1d0ccc8cc57df8 +Block 0019 [122]: 99a54746e5107aaa +Block 0019 [123]: ca505c81f9fa3408 +Block 0019 [124]: c6a0cd042b95a9c7 +Block 0019 [125]: 36249fc5a945bd11 +Block 0019 [126]: bd2b9f7b8007a925 +Block 0019 [127]: bd6acb937aa3d609 +Block 0020 [ 0]: 93e99e1a4d5cafe6 +Block 0020 [ 1]: a72d7a8f6c8bd7b1 +Block 0020 [ 2]: 2e3721ed3f80e3a3 +Block 0020 [ 3]: 67d1c3ab3ca8fb8c +Block 0020 [ 4]: 58473a4fb39b5fc8 +Block 0020 [ 5]: baacddb76a1ec395 +Block 0020 [ 6]: 352536841d5ec4c2 +Block 0020 [ 7]: fcdffbff05cbedc8 +Block 0020 [ 8]: 8d714be4151cd6c6 +Block 0020 [ 9]: dfecaef9c28affba +Block 0020 [ 10]: a7858f9938883a19 +Block 0020 [ 11]: e4c53a0816a41501 +Block 0020 [ 12]: 377d5cf1a6986c84 +Block 0020 [ 13]: a9ac07e1b5a080e9 +Block 0020 [ 14]: ae99f8c51cd373ec +Block 0020 [ 15]: 12384a0487d433fc +Block 0020 [ 16]: 4698f7ce1fa3b1b0 +Block 0020 [ 17]: 97244a2a1f70a34b +Block 0020 [ 18]: 66be91d82e66baed +Block 0020 [ 19]: 50082984074633db +Block 0020 [ 20]: 78790f2200af5109 +Block 0020 [ 21]: 9cdbb17e403ff77d +Block 0020 [ 22]: 6c7093dcf04ec559 +Block 0020 [ 23]: da5a75b7609646c9 +Block 0020 [ 24]: 9891ed3d657a93a2 +Block 0020 [ 25]: 6633e0030e2ccbaa +Block 0020 [ 26]: ac54b0cae8689083 +Block 0020 [ 27]: 5ca70788548dc642 +Block 0020 [ 28]: 4ef57fc92ba214e2 +Block 0020 [ 29]: 63c98636e210fea3 +Block 0020 [ 30]: 30a067f161164299 +Block 0020 [ 31]: 3a90bc7c0aab6dcb +Block 0020 [ 32]: 22d0b830145dd692 +Block 0020 [ 33]: 58eb216edaf79a23 +Block 0020 [ 34]: 761a26319013323c +Block 0020 [ 35]: 3faa99cd9bfa1a7a +Block 0020 [ 36]: 39f41dd6dbd06fa3 +Block 0020 [ 37]: 5afed9b5a2b82ca5 +Block 0020 [ 38]: 9c443f55e47693d1 +Block 0020 [ 39]: a473bda54f0dc5f6 +Block 0020 [ 40]: 1e395aa2ff689e85 +Block 0020 [ 41]: 849554a9fa1f5be3 +Block 0020 [ 42]: 5c4eac11a2154c7a +Block 0020 [ 43]: 20ff6540e40a983e +Block 0020 [ 44]: 3d3d4e80e458026d +Block 0020 [ 45]: 0522d503f1d01502 +Block 0020 [ 46]: 84baad09aa6b20dc +Block 0020 [ 47]: a106f6f61dcf6dbe +Block 0020 [ 48]: d9d379be17e5967a +Block 0020 [ 49]: f185e3a9bb50534f +Block 0020 [ 50]: 3da8b9f6d098a6b8 +Block 0020 [ 51]: 6e6f730ea70d8786 +Block 0020 [ 52]: 81b1e83fe22360b9 +Block 0020 [ 53]: 86dac8a4879d9fb5 +Block 0020 [ 54]: 45af3825912fc730 +Block 0020 [ 55]: f1a9b71aca4f6551 +Block 0020 [ 56]: e1d9b026f0b7938a +Block 0020 [ 57]: 8df5dd6c6294fc4a +Block 0020 [ 58]: 4e80499d795899b6 +Block 0020 [ 59]: 12dfd949141111a5 +Block 0020 [ 60]: 3c9ffe57f82daf39 +Block 0020 [ 61]: 9a7f1c23364f5009 +Block 0020 [ 62]: 186a6ada368e4893 +Block 0020 [ 63]: 0a17d3a733979d36 +Block 0020 [ 64]: 4f5aa0f6fe22c3c2 +Block 0020 [ 65]: 86ec04d35b55a87c +Block 0020 [ 66]: 0a388fa14d9e6216 +Block 0020 [ 67]: a7246e7258fab3d4 +Block 0020 [ 68]: b97873950381dbf3 +Block 0020 [ 69]: a89a63ec31e7cd17 +Block 0020 [ 70]: 974570cf18ddf858 +Block 0020 [ 71]: e69fcff456743df7 +Block 0020 [ 72]: 7270cd2d21b3fe4f +Block 0020 [ 73]: 5dd9c708a90939c9 +Block 0020 [ 74]: 4f0a8e1d1c27911b +Block 0020 [ 75]: f2956630ced19a12 +Block 0020 [ 76]: 8c26559e9f4aeeb3 +Block 0020 [ 77]: 832bd56ed44df813 +Block 0020 [ 78]: a0a56833974fbd01 +Block 0020 [ 79]: 906d7fe71992e65b +Block 0020 [ 80]: d4c217803f3a7716 +Block 0020 [ 81]: dc1a97ad52f78526 +Block 0020 [ 82]: 582c9767fdda19c9 +Block 0020 [ 83]: ce76b52dc1bf15e5 +Block 0020 [ 84]: 0268d969d029150a +Block 0020 [ 85]: 88052230b7458333 +Block 0020 [ 86]: 5e1f7b9ba31b1333 +Block 0020 [ 87]: 8242632c3b0864d5 +Block 0020 [ 88]: 0cd8f1f8f00971ca +Block 0020 [ 89]: bd962d94ea033a5c +Block 0020 [ 90]: d63a1b79c3e6242b +Block 0020 [ 91]: 01a22d486e6b8e9c +Block 0020 [ 92]: a661c99fa0781484 +Block 0020 [ 93]: 1113254c08f73e66 +Block 0020 [ 94]: 6ae7da400d7b7dfa +Block 0020 [ 95]: 6c0b3a4352aae071 +Block 0020 [ 96]: 9b28401625f225a3 +Block 0020 [ 97]: 244431aaaa2ef136 +Block 0020 [ 98]: 6789a61760180eb2 +Block 0020 [ 99]: 2bfb1ebfd7ff7106 +Block 0020 [100]: 1cbce3dbe1abe62a +Block 0020 [101]: 0a6ff21405d9f53a +Block 0020 [102]: ee640dd0cc788bf6 +Block 0020 [103]: ca888e3c4fd1b3c9 +Block 0020 [104]: e8d377e280f8f3f4 +Block 0020 [105]: 523230c4f5a953ef +Block 0020 [106]: abfa551596ebb0b4 +Block 0020 [107]: 2e0410edfcd22b5d +Block 0020 [108]: ef0dbab28d43cbdd +Block 0020 [109]: 2eff15435fab9442 +Block 0020 [110]: 0457c09ddbfedefc +Block 0020 [111]: b80cf1f200f6e482 +Block 0020 [112]: 7fe4d532644492df +Block 0020 [113]: 05bea3f2cbcfb741 +Block 0020 [114]: 72819b801a6ffbe8 +Block 0020 [115]: 71ddf2972b276d32 +Block 0020 [116]: 4ecdc15a724bb226 +Block 0020 [117]: ec507010237304a5 +Block 0020 [118]: 2448b19e22bd07a3 +Block 0020 [119]: 0897f27fd48afee3 +Block 0020 [120]: 4cd72010a43a8c50 +Block 0020 [121]: 75ab73a21d166ef1 +Block 0020 [122]: c339bd901702475f +Block 0020 [123]: 617029f43a64733b +Block 0020 [124]: fefec09ffe51f09b +Block 0020 [125]: d6758bc1df4e59de +Block 0020 [126]: 129f67a4801e5ee8 +Block 0020 [127]: be78463817131abc +Block 0021 [ 0]: e9e21481f3ee3f3a +Block 0021 [ 1]: fed52a84c085c6ed +Block 0021 [ 2]: 709f85b64e624464 +Block 0021 [ 3]: b3505f6446a9c658 +Block 0021 [ 4]: 56e6bbc2de2b8686 +Block 0021 [ 5]: a01832cc4d381458 +Block 0021 [ 6]: 28792d5e35039a14 +Block 0021 [ 7]: b68293379e015981 +Block 0021 [ 8]: d91a438da9e8148f +Block 0021 [ 9]: f284b0068ccbb947 +Block 0021 [ 10]: d82aff158b7ff636 +Block 0021 [ 11]: 62453db3456f56a9 +Block 0021 [ 12]: fb9be58c6e337392 +Block 0021 [ 13]: f15f76741214a579 +Block 0021 [ 14]: 89040978229c8229 +Block 0021 [ 15]: 445a51444b4ed6d2 +Block 0021 [ 16]: 0c2016bcdd4444f8 +Block 0021 [ 17]: cc58c2e1f7a8ef74 +Block 0021 [ 18]: c56685d74767ab8d +Block 0021 [ 19]: 05b0ce7ea4729d75 +Block 0021 [ 20]: c2679824b11d3a7b +Block 0021 [ 21]: e530c3134cb491ec +Block 0021 [ 22]: a1d54a6ff8e08c8c +Block 0021 [ 23]: 3723a2fec2faf94a +Block 0021 [ 24]: 8be73a3427edb4ff +Block 0021 [ 25]: e23b14038a2cdc8d +Block 0021 [ 26]: 23f92fec3c845d10 +Block 0021 [ 27]: 62dc4b7f7fe4baff +Block 0021 [ 28]: dfa4860130a123d8 +Block 0021 [ 29]: 41e6014b50bda4a2 +Block 0021 [ 30]: b742c21808987bc7 +Block 0021 [ 31]: ce3351e6589dfa12 +Block 0021 [ 32]: 1b107becc66f8cc8 +Block 0021 [ 33]: 7c1b0a560d8d31dd +Block 0021 [ 34]: fb90ae2933aa6acd +Block 0021 [ 35]: 240d3e273b67cb83 +Block 0021 [ 36]: ffc9b0b54f41adc7 +Block 0021 [ 37]: ad002fb0bb2adf07 +Block 0021 [ 38]: af1393d8bee411e8 +Block 0021 [ 39]: c19215172044891d +Block 0021 [ 40]: e65121884cf94253 +Block 0021 [ 41]: 2768d775293609b5 +Block 0021 [ 42]: 1fc4a96085da417b +Block 0021 [ 43]: 5b1ea60d366ddb87 +Block 0021 [ 44]: 588eeca5735e0d4d +Block 0021 [ 45]: 13b5eebb92686954 +Block 0021 [ 46]: 0f268f398fa1d4f7 +Block 0021 [ 47]: b2418155a9b0bb20 +Block 0021 [ 48]: 858e8cd90b227b5c +Block 0021 [ 49]: 6edb7199a0bb2d89 +Block 0021 [ 50]: 2d49d5351079c672 +Block 0021 [ 51]: b5c2cd06e4f80951 +Block 0021 [ 52]: 107e74d83f7d4b69 +Block 0021 [ 53]: 4831e86b26067716 +Block 0021 [ 54]: e24aa23186ef628b +Block 0021 [ 55]: 99cd343ea5a67ac0 +Block 0021 [ 56]: ffb7d321efcf243f +Block 0021 [ 57]: 1d6ac055a62ef2fa +Block 0021 [ 58]: 4c87aa50ec37d94e +Block 0021 [ 59]: 08c40682ba554409 +Block 0021 [ 60]: f00e40bf4a8d090a +Block 0021 [ 61]: ad5bf9861e7832c5 +Block 0021 [ 62]: cdf5453220419e2c +Block 0021 [ 63]: 5e035115961ff553 +Block 0021 [ 64]: ac014e59931b1719 +Block 0021 [ 65]: 84d65f93135d21b5 +Block 0021 [ 66]: 2d96485bd6dcf756 +Block 0021 [ 67]: f2cc93cb5dcd9f02 +Block 0021 [ 68]: b6f93e1c657a780e +Block 0021 [ 69]: 5f81025581879599 +Block 0021 [ 70]: 9e3102b71c46f3b8 +Block 0021 [ 71]: 828d1a2f8bc61193 +Block 0021 [ 72]: a461cbeb81445a3b +Block 0021 [ 73]: f2ed387337c2b77a +Block 0021 [ 74]: 3466edf9fd5c7475 +Block 0021 [ 75]: 19015d8ff2e0668e +Block 0021 [ 76]: 1a595c4a11abf791 +Block 0021 [ 77]: b00ca0d08cea35f2 +Block 0021 [ 78]: 86f1738ddd5f5c7f +Block 0021 [ 79]: 98a41e9eac5e201a +Block 0021 [ 80]: 315f0615eace01ec +Block 0021 [ 81]: 67ef04d09e49d1f9 +Block 0021 [ 82]: 7c95edab62fb113c +Block 0021 [ 83]: f258ea5ffde8eeae +Block 0021 [ 84]: 2c0ca0a6f3de727a +Block 0021 [ 85]: adef8be4987599ee +Block 0021 [ 86]: acd4da447f9fb36d +Block 0021 [ 87]: c7442fac27ee58f2 +Block 0021 [ 88]: 63ef62153ec0219f +Block 0021 [ 89]: 5912c663cee52508 +Block 0021 [ 90]: 43b80d1f08e25858 +Block 0021 [ 91]: b11d841a93c9ab57 +Block 0021 [ 92]: 573381ecc2746f28 +Block 0021 [ 93]: da95a423b8aaa3f6 +Block 0021 [ 94]: a74baf9b9b9cd1d6 +Block 0021 [ 95]: d3bdb02257e0ead2 +Block 0021 [ 96]: de9a1d8345598394 +Block 0021 [ 97]: 2c520473e0b78004 +Block 0021 [ 98]: 2b45c427d526d9f7 +Block 0021 [ 99]: 5c42be040a4bcb6d +Block 0021 [100]: 732d0f4b457582cb +Block 0021 [101]: 800260cc6bc9e2b6 +Block 0021 [102]: bfdee932c42edd4a +Block 0021 [103]: ca96276597473186 +Block 0021 [104]: 0f7244fcb34b528e +Block 0021 [105]: 7218c8c434ecdb4c +Block 0021 [106]: 745223365be6f238 +Block 0021 [107]: 2240cdda4143f9d1 +Block 0021 [108]: 683ae21c2e68a835 +Block 0021 [109]: f4d8be8f482bc078 +Block 0021 [110]: aade23a2859475a0 +Block 0021 [111]: 7ef8552d415107b4 +Block 0021 [112]: 50b6f85bde4b95d5 +Block 0021 [113]: 72c68fd8083bdb4b +Block 0021 [114]: 8430408343777d38 +Block 0021 [115]: d531368e35fa0bfc +Block 0021 [116]: b838e6201bccf0ca +Block 0021 [117]: 48c2bfb75a462bd6 +Block 0021 [118]: c33044442c9b393f +Block 0021 [119]: e474e5d7d70d880d +Block 0021 [120]: 4dfe1dc828adec32 +Block 0021 [121]: 3ef49af889009bc3 +Block 0021 [122]: cc2489247a2514e0 +Block 0021 [123]: 646482202c13e4ae +Block 0021 [124]: a49464d18f5e58ba +Block 0021 [125]: d6590167ad99694a +Block 0021 [126]: 41b6882b4cb13285 +Block 0021 [127]: f44b1ce4e610ff1d +Block 0022 [ 0]: 10516fe48bd992d6 +Block 0022 [ 1]: 6e80ad662a5249a0 +Block 0022 [ 2]: 9e4c06f4c020cfd2 +Block 0022 [ 3]: 61c51d3b26043155 +Block 0022 [ 4]: a6e8e47d334b4620 +Block 0022 [ 5]: 7103ec6a7b808730 +Block 0022 [ 6]: ab7207bd00414df1 +Block 0022 [ 7]: fd847b3057de9efa +Block 0022 [ 8]: 2fd0a594818276a8 +Block 0022 [ 9]: 708eee6a6bad30fd +Block 0022 [ 10]: 955bf28de3f535dd +Block 0022 [ 11]: 6d002962ec0c3b62 +Block 0022 [ 12]: ed3789bea8e1cb91 +Block 0022 [ 13]: cec3c50996e4d7a5 +Block 0022 [ 14]: 99a41b50ca1ed0a6 +Block 0022 [ 15]: 160e0ab9a0a4bc11 +Block 0022 [ 16]: 25bdb628732f1036 +Block 0022 [ 17]: f83b95562f875270 +Block 0022 [ 18]: e1161c3e5e33ae07 +Block 0022 [ 19]: e0d2924a83aa3a87 +Block 0022 [ 20]: c17673d548c6b215 +Block 0022 [ 21]: 5157a65c923beb29 +Block 0022 [ 22]: e94d6cbd03cda367 +Block 0022 [ 23]: 35d5aa15e62a946c +Block 0022 [ 24]: ec42ddc3f35fd651 +Block 0022 [ 25]: 1f4467ff293980ea +Block 0022 [ 26]: fd1b51fd8670f1c4 +Block 0022 [ 27]: eb484dd78071a143 +Block 0022 [ 28]: 8ac6e5fc54ab2f6b +Block 0022 [ 29]: 64463e0b03e7b07d +Block 0022 [ 30]: 0640bcfd3d78dc7d +Block 0022 [ 31]: f83e88ee65da93ea +Block 0022 [ 32]: d6df547213734546 +Block 0022 [ 33]: f029efdf2eaada54 +Block 0022 [ 34]: f785a308b8742c3f +Block 0022 [ 35]: ab6fb9b561569ae2 +Block 0022 [ 36]: c1bfad8d27e5b694 +Block 0022 [ 37]: 23bc68913631aa36 +Block 0022 [ 38]: 93f6b948c9fdef23 +Block 0022 [ 39]: 5edbee1a84d1f0a7 +Block 0022 [ 40]: 5bedf33c32a8665a +Block 0022 [ 41]: aa5a5d90dcac3d50 +Block 0022 [ 42]: eafcf9c119242b16 +Block 0022 [ 43]: e0e8518fcbe1abaf +Block 0022 [ 44]: 1cac6136bba6de36 +Block 0022 [ 45]: 9d83d72eec3e7108 +Block 0022 [ 46]: 3ffafb300b518e01 +Block 0022 [ 47]: 6fa4d3a312908d27 +Block 0022 [ 48]: 142c69037840cd39 +Block 0022 [ 49]: 280e1c649ba0260a +Block 0022 [ 50]: 55dc74836fe074df +Block 0022 [ 51]: 9703e674a4721656 +Block 0022 [ 52]: c069c595578ce657 +Block 0022 [ 53]: ac365998563c1143 +Block 0022 [ 54]: c85611d8d5d27e34 +Block 0022 [ 55]: ba4c934267f56ef5 +Block 0022 [ 56]: 103b25f8f428f4ce +Block 0022 [ 57]: e06848354bf96054 +Block 0022 [ 58]: aa5e6ba9c44c7a4b +Block 0022 [ 59]: 978bcbd3eede5e10 +Block 0022 [ 60]: 626d30eac9c66050 +Block 0022 [ 61]: 7479182c697b1ec6 +Block 0022 [ 62]: c1f34e2bdcdb7717 +Block 0022 [ 63]: ab17a27bd9e11520 +Block 0022 [ 64]: df9389a6153b5408 +Block 0022 [ 65]: 46a5ea923a45aabe +Block 0022 [ 66]: b8adeb3d2292be64 +Block 0022 [ 67]: 11e599917a19aee6 +Block 0022 [ 68]: 623ec355fc76dd16 +Block 0022 [ 69]: a51ac58cfe62691b +Block 0022 [ 70]: 2bd1c93b73345e7a +Block 0022 [ 71]: 0616e323173f8d81 +Block 0022 [ 72]: 2c3a81db077e2fba +Block 0022 [ 73]: cc66b376b64785d8 +Block 0022 [ 74]: 200d21fcf32e37ea +Block 0022 [ 75]: 13fef3f2b68463a0 +Block 0022 [ 76]: 28733ed577c7f7a5 +Block 0022 [ 77]: cfb7a1fd8a7da043 +Block 0022 [ 78]: 8502c5188ec6f568 +Block 0022 [ 79]: fff355982c5d5a35 +Block 0022 [ 80]: 3a2c65bd989cd16a +Block 0022 [ 81]: ac5d14d1805f8b4b +Block 0022 [ 82]: 9383626d4a1c5102 +Block 0022 [ 83]: 9803d583927d0984 +Block 0022 [ 84]: 498897d793f168c2 +Block 0022 [ 85]: 10251e23be6ac284 +Block 0022 [ 86]: 87919d5d2320d30d +Block 0022 [ 87]: 2f14689f30ea0eb8 +Block 0022 [ 88]: cb59ab5a48c10a12 +Block 0022 [ 89]: caaa6b45434178ca +Block 0022 [ 90]: ed5eae615338303e +Block 0022 [ 91]: 322586e5fc7a210c +Block 0022 [ 92]: c3bfb2fa7b1d8c70 +Block 0022 [ 93]: ed9cd80167917df4 +Block 0022 [ 94]: 49a1812cfb438ffa +Block 0022 [ 95]: 19f731eb01464eaa +Block 0022 [ 96]: 0369b5bddf4a867f +Block 0022 [ 97]: 7bfdd90aa04766e1 +Block 0022 [ 98]: 06a00edab882cc0c +Block 0022 [ 99]: 26d2c21ae47a0a3e +Block 0022 [100]: 673148ac664b927d +Block 0022 [101]: 5371f1dacb6189ab +Block 0022 [102]: dfd2dd883cf0ebf3 +Block 0022 [103]: 3dd89111bf1405b7 +Block 0022 [104]: 87d8e5833a8a4d8a +Block 0022 [105]: c28cc9f25cc89887 +Block 0022 [106]: 94f708bddbd46d36 +Block 0022 [107]: ba69d4f56b3b6f00 +Block 0022 [108]: 8d2d9679e0e99180 +Block 0022 [109]: 38c61e2d8f3c3a6c +Block 0022 [110]: 42fca3d24f84e642 +Block 0022 [111]: 5d59762e5a3944ff +Block 0022 [112]: 8ccf9047384acd68 +Block 0022 [113]: 6a0bd116f828077a +Block 0022 [114]: e807ea99cb1bc3e1 +Block 0022 [115]: 600c98e9e25fa233 +Block 0022 [116]: bee422c9314529e4 +Block 0022 [117]: 137d1cdcdcb07e6a +Block 0022 [118]: 9064f3eccd37e15e +Block 0022 [119]: 65a371f3bc67a32c +Block 0022 [120]: 8a30ca0e610902a2 +Block 0022 [121]: 7fe6c6b430c1d9a9 +Block 0022 [122]: 23e3a862121bac8e +Block 0022 [123]: 9d11401f5b21ef70 +Block 0022 [124]: 7fe3e8254eb4b904 +Block 0022 [125]: 8fd618e2b06951c9 +Block 0022 [126]: f0f4543eb4268123 +Block 0022 [127]: f82a3b4cbb64e6ff +Block 0023 [ 0]: 51b8f26d399c69bc +Block 0023 [ 1]: c071fa67c98eb6ab +Block 0023 [ 2]: cdab8aaa7131c6c1 +Block 0023 [ 3]: 75492b8715e5cf49 +Block 0023 [ 4]: c5b2b58f9b1a600d +Block 0023 [ 5]: a72ab04580d73772 +Block 0023 [ 6]: a9118d6a68c5b451 +Block 0023 [ 7]: 1a43b68a96e27b34 +Block 0023 [ 8]: bfc42018edd2ad91 +Block 0023 [ 9]: 5d1a6a93d9cd45cc +Block 0023 [ 10]: 3389bc0ca66422ab +Block 0023 [ 11]: d819b30b62996b9b +Block 0023 [ 12]: fca4eee794dcb19a +Block 0023 [ 13]: 824c758dafa29d8e +Block 0023 [ 14]: 96acaefa149817f9 +Block 0023 [ 15]: 554c904f393d2266 +Block 0023 [ 16]: ce8f97770d672269 +Block 0023 [ 17]: 8c643e7b155b1645 +Block 0023 [ 18]: 1e921a6839e64a92 +Block 0023 [ 19]: 82c49b54962e5525 +Block 0023 [ 20]: c805f82c3c20e36d +Block 0023 [ 21]: 69c9422e6d381027 +Block 0023 [ 22]: b04f13b7d1000957 +Block 0023 [ 23]: a307a1a3f4c2b044 +Block 0023 [ 24]: 111d0db7963f011f +Block 0023 [ 25]: 693d84f951fb010b +Block 0023 [ 26]: 38408ba11be93312 +Block 0023 [ 27]: 0f14c006cef1fcb2 +Block 0023 [ 28]: ebe364aeed4b3ec8 +Block 0023 [ 29]: c7712fdf99b74c7d +Block 0023 [ 30]: 01673c55e0bfdd6d +Block 0023 [ 31]: 60d075cd5efcbc0b +Block 0023 [ 32]: 647a26de4adf2227 +Block 0023 [ 33]: 585c686a2b7f32fa +Block 0023 [ 34]: 8cbc3c41b6d6fff3 +Block 0023 [ 35]: 8f101fdaf888b67e +Block 0023 [ 36]: 76df5f51b1d1a638 +Block 0023 [ 37]: f858bcc3c4e06420 +Block 0023 [ 38]: 0f72ef7a092b0a23 +Block 0023 [ 39]: 8bf7b4639413c9bd +Block 0023 [ 40]: 29a6c46f51ebe568 +Block 0023 [ 41]: a40fc18bf17b5490 +Block 0023 [ 42]: 98645e432602caca +Block 0023 [ 43]: 27f6f7eff49ede5e +Block 0023 [ 44]: 822b275c48e9d987 +Block 0023 [ 45]: bd8c451a58146d33 +Block 0023 [ 46]: cbd9150b80ba7822 +Block 0023 [ 47]: 762e616beb4ff189 +Block 0023 [ 48]: b7faabd20293c82d +Block 0023 [ 49]: c0ea5ba064106a91 +Block 0023 [ 50]: fc8d4176e1956aa3 +Block 0023 [ 51]: eef76c2a172e309d +Block 0023 [ 52]: 028b9a0678496439 +Block 0023 [ 53]: 02431190caf3229e +Block 0023 [ 54]: 93f958d07904ba5c +Block 0023 [ 55]: 7f9228bea5b3e7d3 +Block 0023 [ 56]: f7e8a67449b73db5 +Block 0023 [ 57]: e184d8d39ebfd9d7 +Block 0023 [ 58]: 458c260628950d29 +Block 0023 [ 59]: d5d59493f4f3ab49 +Block 0023 [ 60]: 52810f0d895154e6 +Block 0023 [ 61]: 48890c4359d36387 +Block 0023 [ 62]: d9ed391fc01aa28f +Block 0023 [ 63]: 7dc15dfc8848a73e +Block 0023 [ 64]: 0f5e24c089911cf7 +Block 0023 [ 65]: fb2d00b5197c5a9f +Block 0023 [ 66]: a585c2cd2050c293 +Block 0023 [ 67]: 822f77775f03bc9d +Block 0023 [ 68]: da1d24c62e225517 +Block 0023 [ 69]: c19dde644105c3f1 +Block 0023 [ 70]: e73998960ea21e02 +Block 0023 [ 71]: 18b22d33c3a507e1 +Block 0023 [ 72]: 92efaec756b407f2 +Block 0023 [ 73]: 69b5b5b9ac8e6902 +Block 0023 [ 74]: b92f44a99a2ed037 +Block 0023 [ 75]: 55c9ef9deced5f41 +Block 0023 [ 76]: adafa68c9b162398 +Block 0023 [ 77]: c81ddc531fe06ae2 +Block 0023 [ 78]: e04b242b72f95238 +Block 0023 [ 79]: 51c490474495bd78 +Block 0023 [ 80]: fb6f199815333b03 +Block 0023 [ 81]: 7112249b96f1b0e4 +Block 0023 [ 82]: 83231ce5117bcd91 +Block 0023 [ 83]: aa7e1b7fb06c7d1e +Block 0023 [ 84]: 3a2d3d8b02473340 +Block 0023 [ 85]: de732586a74d9314 +Block 0023 [ 86]: 7298cf9215c7f6b1 +Block 0023 [ 87]: 35ce550af4ddbc36 +Block 0023 [ 88]: b3030a9d8df310cc +Block 0023 [ 89]: d49daa0e515db0b6 +Block 0023 [ 90]: a408538a1a3757ce +Block 0023 [ 91]: 03cc331f9ac38ffe +Block 0023 [ 92]: 1fbe448017465116 +Block 0023 [ 93]: 53cc67fc2adf1894 +Block 0023 [ 94]: d16c84dc21a96369 +Block 0023 [ 95]: 45c1d58d1c6635cc +Block 0023 [ 96]: 3e9fdcaeb9ead4a3 +Block 0023 [ 97]: 453f5fbdb21f9e1a +Block 0023 [ 98]: 853b01fa14cffe9e +Block 0023 [ 99]: 429987c05c91ef53 +Block 0023 [100]: a2072cb67ffc5a65 +Block 0023 [101]: 37454a3792e46599 +Block 0023 [102]: 167b3dd6a5c04120 +Block 0023 [103]: 2a1f42086bfca6d1 +Block 0023 [104]: 3e13e3d094a55227 +Block 0023 [105]: 700908d898fd16de +Block 0023 [106]: b4ebced8311a6bbf +Block 0023 [107]: 4190aed4811f39c0 +Block 0023 [108]: 2a58b7961c373ac6 +Block 0023 [109]: e665ef6a1251f3c7 +Block 0023 [110]: d9add80a10d174dd +Block 0023 [111]: 90adc031a2dbf94c +Block 0023 [112]: 699c684665ad5329 +Block 0023 [113]: 872a3b6d8bbef466 +Block 0023 [114]: a20f7b5c18ce00fb +Block 0023 [115]: d07632df9d2f5403 +Block 0023 [116]: 237ac845201a666a +Block 0023 [117]: 04f4008ea14c1e58 +Block 0023 [118]: 67f8329c63fcfc8b +Block 0023 [119]: 1f2483d57a31386c +Block 0023 [120]: 9bc69c6b59e71be3 +Block 0023 [121]: 85f450aba2d1577b +Block 0023 [122]: fcb1312231908bf0 +Block 0023 [123]: 237d458ea94e6b6d +Block 0023 [124]: e49fba5fdf5c3936 +Block 0023 [125]: d2fdeee74597fb69 +Block 0023 [126]: 4928a8d471128e8b +Block 0023 [127]: 1a6082c717abd94c +Block 0024 [ 0]: 5958a22b70bf98ca +Block 0024 [ 1]: 57f117fb171d2dbd +Block 0024 [ 2]: 34312fb32bd1c304 +Block 0024 [ 3]: 8f2cd82a0db46627 +Block 0024 [ 4]: 298399822348198c +Block 0024 [ 5]: 7288500bf16998fe +Block 0024 [ 6]: dd3c003edb9de752 +Block 0024 [ 7]: fba874c3a38ab35b +Block 0024 [ 8]: 3a800e3301af7c15 +Block 0024 [ 9]: c8cccd3056b2e62a +Block 0024 [ 10]: 306cb44417a427f6 +Block 0024 [ 11]: caaf0cb8f35d653d +Block 0024 [ 12]: 4fe793dac54e868f +Block 0024 [ 13]: d52bda7f705b6301 +Block 0024 [ 14]: 82299afb64fb7cf3 +Block 0024 [ 15]: 1dd68220ead6db39 +Block 0024 [ 16]: f89c457e0b441514 +Block 0024 [ 17]: f6ed96b4cc9d62d7 +Block 0024 [ 18]: 9de2a04caa98deca +Block 0024 [ 19]: d0d9a743cdad41f1 +Block 0024 [ 20]: 092684735b3f7ed0 +Block 0024 [ 21]: ba06f39a89ddeac5 +Block 0024 [ 22]: cf5bf8b8feb52f7f +Block 0024 [ 23]: 2a1a3ebfd5664ee5 +Block 0024 [ 24]: 715c4f5c10c7df9b +Block 0024 [ 25]: 17e1625499f291ee +Block 0024 [ 26]: e42bb7eb1c580aca +Block 0024 [ 27]: e15b4ea4978bcf4e +Block 0024 [ 28]: a4ef3f981f368ac3 +Block 0024 [ 29]: dd2be60dc6fa8fe0 +Block 0024 [ 30]: 00bc12eb1460e664 +Block 0024 [ 31]: 6df456cc5c9a8e30 +Block 0024 [ 32]: 81ee03abc1b94e11 +Block 0024 [ 33]: 229eee89fa6765ba +Block 0024 [ 34]: 05c980ceda880f9e +Block 0024 [ 35]: 144fb8a0cbb32810 +Block 0024 [ 36]: 9d15ce141d201e80 +Block 0024 [ 37]: b83ba7e41fc01637 +Block 0024 [ 38]: 37418fc74877b29d +Block 0024 [ 39]: 3f539195743daba2 +Block 0024 [ 40]: 3973112b38cb695b +Block 0024 [ 41]: 690ac2df3a6e866a +Block 0024 [ 42]: b820d3887c305fda +Block 0024 [ 43]: 96398cc15455712e +Block 0024 [ 44]: 302d7154b452879a +Block 0024 [ 45]: 2a068b244898efe1 +Block 0024 [ 46]: c7f92e307cb22ece +Block 0024 [ 47]: 65360372a6062f65 +Block 0024 [ 48]: e1bb18c2e2e801b0 +Block 0024 [ 49]: 917ba27e80909276 +Block 0024 [ 50]: 893817757c7712ee +Block 0024 [ 51]: 1b8f1913ca9115ee +Block 0024 [ 52]: e66dbbc3f5b52329 +Block 0024 [ 53]: 1a3c941cab6e616a +Block 0024 [ 54]: 9c1d4791e9e03dd1 +Block 0024 [ 55]: d0bcd8855fec2860 +Block 0024 [ 56]: f4753fc9d00e3f17 +Block 0024 [ 57]: ee417f71c775107f +Block 0024 [ 58]: e5d134ad67ce823f +Block 0024 [ 59]: 73603420f330dc9b +Block 0024 [ 60]: 16cc64de47137a67 +Block 0024 [ 61]: abd7703e1a9697b4 +Block 0024 [ 62]: 9fe7e2341ea7d03a +Block 0024 [ 63]: 35e71533e92a5003 +Block 0024 [ 64]: 0cfb5d944e248005 +Block 0024 [ 65]: 0de2faf144671ca5 +Block 0024 [ 66]: 57a900216c27fa3c +Block 0024 [ 67]: 856a2968ecb60014 +Block 0024 [ 68]: ad045c92a406d6b6 +Block 0024 [ 69]: 55b8ccc11f289add +Block 0024 [ 70]: 485aa0c406a78646 +Block 0024 [ 71]: 598beecd4819c981 +Block 0024 [ 72]: 3e484b387f29eb7f +Block 0024 [ 73]: 5dffd582a0b86268 +Block 0024 [ 74]: e02bd64109d369c5 +Block 0024 [ 75]: 8ae28641db25300a +Block 0024 [ 76]: 349c098672bcacc1 +Block 0024 [ 77]: e513fedd3a71aa98 +Block 0024 [ 78]: 5b9db396f85b4b5e +Block 0024 [ 79]: c69258b2c8510a52 +Block 0024 [ 80]: 282e375ed617f67b +Block 0024 [ 81]: c7500ba4a34668cd +Block 0024 [ 82]: 096a1dc27f0d1c36 +Block 0024 [ 83]: 542bdf2ef5fab14f +Block 0024 [ 84]: eb7d48d2d0946bfb +Block 0024 [ 85]: 86cc9ba19e5d1b0a +Block 0024 [ 86]: af4ff929a67207a2 +Block 0024 [ 87]: 3b1a65ca42d52005 +Block 0024 [ 88]: 6f30cf327e92c077 +Block 0024 [ 89]: 26a74ed43084c50e +Block 0024 [ 90]: f139cd5c4604a050 +Block 0024 [ 91]: 65d1584ad83cff5d +Block 0024 [ 92]: 465ab84996ad2ad2 +Block 0024 [ 93]: 966ad44cd9213b19 +Block 0024 [ 94]: 3bb32bded3e109f1 +Block 0024 [ 95]: ec424f052913176c +Block 0024 [ 96]: d3f8b90bd9d7a44e +Block 0024 [ 97]: a57c3f3d5f7e3894 +Block 0024 [ 98]: dd295ea31e430456 +Block 0024 [ 99]: fa5d6f3c749c02b2 +Block 0024 [100]: 464ad61952defe18 +Block 0024 [101]: 35e8649acef1722f +Block 0024 [102]: ee5ae50599920a74 +Block 0024 [103]: f3824a188dde4bb6 +Block 0024 [104]: 95af191695fabeb1 +Block 0024 [105]: 303b94514b6547b8 +Block 0024 [106]: 038c732c6e2d8596 +Block 0024 [107]: f759939b268ab594 +Block 0024 [108]: a56dff1812e139bc +Block 0024 [109]: 98b71668f976ce94 +Block 0024 [110]: 6c29893f6b176e92 +Block 0024 [111]: 460d68ff632de327 +Block 0024 [112]: 87e56f61054566d3 +Block 0024 [113]: 5e40442c09947b73 +Block 0024 [114]: 8f55f37db55c1dfa +Block 0024 [115]: d6939ee647a66aea +Block 0024 [116]: ca69515ea441ad2f +Block 0024 [117]: 50ca5d2bdaff963f +Block 0024 [118]: eb78460ef25de562 +Block 0024 [119]: cbc0fd708d5c0dab +Block 0024 [120]: 66f619ea39fddc1f +Block 0024 [121]: d4446cedd28cafbb +Block 0024 [122]: 1777b81c1958776f +Block 0024 [123]: bdcabfc84292b6fe +Block 0024 [124]: 7d940c9fa0dde6bd +Block 0024 [125]: 1c177188c4335364 +Block 0024 [126]: cd9baecf1bb872ef +Block 0024 [127]: fbc047fb9b439a29 +Block 0025 [ 0]: fffb955af57af90b +Block 0025 [ 1]: e4871b8f02f26ecb +Block 0025 [ 2]: b89f59c3a5f723e6 +Block 0025 [ 3]: 6a8a73613f18f0ff +Block 0025 [ 4]: 040d4829377eb6ae +Block 0025 [ 5]: b94070732353e4d1 +Block 0025 [ 6]: fca08ebbbcdce029 +Block 0025 [ 7]: cdd7097aab05e4ab +Block 0025 [ 8]: f75a8252080cef39 +Block 0025 [ 9]: 1e961f4e04b6f7af +Block 0025 [ 10]: 0ce9670791be9695 +Block 0025 [ 11]: da78cba39e099ce9 +Block 0025 [ 12]: 3e636f44b1f40d7f +Block 0025 [ 13]: 6e37649cb5b98488 +Block 0025 [ 14]: 7fbe2099551d03d7 +Block 0025 [ 15]: 4a7a23f6d644562e +Block 0025 [ 16]: c4409c1f9e401137 +Block 0025 [ 17]: a4e562c13b8d87a1 +Block 0025 [ 18]: 1224688a119818cf +Block 0025 [ 19]: eeb1a045a905ea51 +Block 0025 [ 20]: 95a8e3c3ac0353c3 +Block 0025 [ 21]: 54678ef6109a8f3f +Block 0025 [ 22]: 97803b357d69c9b1 +Block 0025 [ 23]: 8e411ea1f50c55ba +Block 0025 [ 24]: 1d48fbcb0f4be52e +Block 0025 [ 25]: 4ea786fff3a71734 +Block 0025 [ 26]: dc2ee88f078ffbe6 +Block 0025 [ 27]: b3d61433d92e6848 +Block 0025 [ 28]: 7ebb5413bb1a23f8 +Block 0025 [ 29]: 338e907d6713761e +Block 0025 [ 30]: 612968dd685c9da2 +Block 0025 [ 31]: 64e5797faad44d22 +Block 0025 [ 32]: b1b4a32066421b11 +Block 0025 [ 33]: 7c110e3f427e61d6 +Block 0025 [ 34]: 6cd462dd0ab4293a +Block 0025 [ 35]: e4c99723248a7290 +Block 0025 [ 36]: eadfc82582c03ea0 +Block 0025 [ 37]: 129612d57eb1dfbb +Block 0025 [ 38]: 6a8862a2b2688716 +Block 0025 [ 39]: abef922090105cff +Block 0025 [ 40]: cf0f91207c4df18a +Block 0025 [ 41]: 4bda9ddc69523982 +Block 0025 [ 42]: 105980383d263220 +Block 0025 [ 43]: c4cafc2fa2a587a3 +Block 0025 [ 44]: bf50382c61e8fe19 +Block 0025 [ 45]: 692c2622e148a03e +Block 0025 [ 46]: 2a6d1d440295bcd0 +Block 0025 [ 47]: d62efe2d0f92e710 +Block 0025 [ 48]: 826da3a890c5e1e2 +Block 0025 [ 49]: 663723f1834287b5 +Block 0025 [ 50]: f46454259bead5fa +Block 0025 [ 51]: 1e1a2680b594fd39 +Block 0025 [ 52]: 52a4a56d81b88b95 +Block 0025 [ 53]: 92748b0473ce8d9f +Block 0025 [ 54]: ee6f171b385e5d19 +Block 0025 [ 55]: aacfdddac7c3f517 +Block 0025 [ 56]: 539a85613e58bf5d +Block 0025 [ 57]: 2b4cf3a7835ff74c +Block 0025 [ 58]: 45483cef811ca2e8 +Block 0025 [ 59]: c6873023ebf4778b +Block 0025 [ 60]: 9e5089ac1526d66f +Block 0025 [ 61]: 5cd34c48f407df18 +Block 0025 [ 62]: 2bac068ca9b03ef4 +Block 0025 [ 63]: 915a96c8e754fd66 +Block 0025 [ 64]: cf074a9cc0a6b214 +Block 0025 [ 65]: fb1fd47a829329e5 +Block 0025 [ 66]: b580c0a7affee031 +Block 0025 [ 67]: b3370d02e6d57513 +Block 0025 [ 68]: c88763d6f3f26905 +Block 0025 [ 69]: 824015be540107e8 +Block 0025 [ 70]: 974852db1cc7cfd9 +Block 0025 [ 71]: c0c548f28c6acdaa +Block 0025 [ 72]: 74c0e45d099d474c +Block 0025 [ 73]: e01c4e0b64b77834 +Block 0025 [ 74]: 0533c14d980c6add +Block 0025 [ 75]: 7931a36cd22d2a8b +Block 0025 [ 76]: 647eed006a3fc885 +Block 0025 [ 77]: 88940919b5005bf1 +Block 0025 [ 78]: 1332011b4b4e24c7 +Block 0025 [ 79]: bd4d710d4b931591 +Block 0025 [ 80]: 3d89c84970ea6107 +Block 0025 [ 81]: b04c056f00571ca2 +Block 0025 [ 82]: d0bd666534c0d44f +Block 0025 [ 83]: 9f1164e75cf94894 +Block 0025 [ 84]: c6c56ddd0f5f4493 +Block 0025 [ 85]: 1ed747a48ee8f87d +Block 0025 [ 86]: 9cac80352e623c0a +Block 0025 [ 87]: cbdea7a2df6bfb4e +Block 0025 [ 88]: 3d6ecb1d982994e9 +Block 0025 [ 89]: d4c792872c764c15 +Block 0025 [ 90]: 79faf69807727613 +Block 0025 [ 91]: 1c405ccc2f32aa26 +Block 0025 [ 92]: e96dc0bfec0ffe37 +Block 0025 [ 93]: 1ddcf2a5a9a12c0c +Block 0025 [ 94]: 3b21043c19368275 +Block 0025 [ 95]: 58c025bc65af4427 +Block 0025 [ 96]: daa87500eb620a38 +Block 0025 [ 97]: 3790f46f2d01a114 +Block 0025 [ 98]: 087569d8c107b1d9 +Block 0025 [ 99]: 10f1119e07b0104a +Block 0025 [100]: 981b39ea26ef6710 +Block 0025 [101]: a40aca9a880d40c2 +Block 0025 [102]: 276ad3400db54205 +Block 0025 [103]: be927efd5bb6802f +Block 0025 [104]: 6b1117aad52e6712 +Block 0025 [105]: e3869b2533e5096b +Block 0025 [106]: 710997b71098645e +Block 0025 [107]: 95dd77a863f9a024 +Block 0025 [108]: 6c76d5d9e63fc207 +Block 0025 [109]: dfcf1703e32fbfa5 +Block 0025 [110]: 2983d700ab45e0a3 +Block 0025 [111]: c841bfe21f9eb608 +Block 0025 [112]: 72d9ff6681ba6a74 +Block 0025 [113]: 711238b8a95c3e82 +Block 0025 [114]: 272454ca5092cf79 +Block 0025 [115]: 5f4bcda7442c1e30 +Block 0025 [116]: b66944c097396096 +Block 0025 [117]: ed46ed6d53e1f5db +Block 0025 [118]: b36d5660ece1b88b +Block 0025 [119]: 88e858ca46e2305e +Block 0025 [120]: 11108330154b20c1 +Block 0025 [121]: ae10945de50396a1 +Block 0025 [122]: 00601fe44af3dc39 +Block 0025 [123]: cded1287f7aa43cd +Block 0025 [124]: 6125ca775f4cfc39 +Block 0025 [125]: 3706dc4eb6d80eb1 +Block 0025 [126]: 5ce8104cd2e618f5 +Block 0025 [127]: 7f16a3db08aab211 +Block 0026 [ 0]: 3b6d558b7fccdd53 +Block 0026 [ 1]: a544c949c207d436 +Block 0026 [ 2]: 4f05ca25a912bec0 +Block 0026 [ 3]: a6b6f42c94bc91f3 +Block 0026 [ 4]: 4c4eb732113ce6fe +Block 0026 [ 5]: 6afec4690e064a81 +Block 0026 [ 6]: a9323369420d2f5b +Block 0026 [ 7]: 96c7bc19f69257a9 +Block 0026 [ 8]: 9d7db71bd4074103 +Block 0026 [ 9]: 88d2a1c41a6ce81a +Block 0026 [ 10]: e40db3394f14b5a5 +Block 0026 [ 11]: a967fefac9d7e8a3 +Block 0026 [ 12]: 2fd7352e854b1206 +Block 0026 [ 13]: be2e6a28eab6128d +Block 0026 [ 14]: a9729098c0f878d9 +Block 0026 [ 15]: 0e1b105835094b57 +Block 0026 [ 16]: f4f8507148d7f0cc +Block 0026 [ 17]: 35847eb6b06e585b +Block 0026 [ 18]: fe0df436b8c4df7c +Block 0026 [ 19]: b54dfc1bddb831e0 +Block 0026 [ 20]: 94264483b7a844c8 +Block 0026 [ 21]: dcb003a6f54fdf81 +Block 0026 [ 22]: ae895c4749947d07 +Block 0026 [ 23]: bed43306a1331e1e +Block 0026 [ 24]: 2a4edc085592e99f +Block 0026 [ 25]: 1d06dca4f7fb434e +Block 0026 [ 26]: e11459b38294321c +Block 0026 [ 27]: 09649d2543a5580d +Block 0026 [ 28]: a5b7173e47b3406c +Block 0026 [ 29]: e7cf3f358b5ab1f1 +Block 0026 [ 30]: 8aff441ef512a931 +Block 0026 [ 31]: 7be19ef04fdc3d2c +Block 0026 [ 32]: c81d7667a07aaa9e +Block 0026 [ 33]: fe4823fbe0bb8a55 +Block 0026 [ 34]: f73b8a0ac6af9b7c +Block 0026 [ 35]: 1ca6b1c30eabb8d3 +Block 0026 [ 36]: b0b4bcc8c37d93d7 +Block 0026 [ 37]: 72469952f139ff3a +Block 0026 [ 38]: d40d54c30124b2ed +Block 0026 [ 39]: d84403e6a4c3e34e +Block 0026 [ 40]: d93aaad4d2527f83 +Block 0026 [ 41]: f1f949a66f3a18d7 +Block 0026 [ 42]: c7d30c69a5f5c6cf +Block 0026 [ 43]: 76ae6fdef0d1071b +Block 0026 [ 44]: ab5c585cdfcb6660 +Block 0026 [ 45]: 75b33764c05e3c1c +Block 0026 [ 46]: 8d2f1ddc99b4d99b +Block 0026 [ 47]: 9132c9b1d5e1e4e3 +Block 0026 [ 48]: 9c95a9501e691354 +Block 0026 [ 49]: a1c0ea6541164f7e +Block 0026 [ 50]: 1a49c52ea7f4184d +Block 0026 [ 51]: f838de5180921654 +Block 0026 [ 52]: f2e2dff13e56428d +Block 0026 [ 53]: 71a8509caea45532 +Block 0026 [ 54]: 4e0da0f5e8cbdb8d +Block 0026 [ 55]: d39178911c31f23d +Block 0026 [ 56]: 4d059db4fe3d169c +Block 0026 [ 57]: 26587aa03357b26c +Block 0026 [ 58]: a47c0cf82a6040d3 +Block 0026 [ 59]: a07bf1b71f367b38 +Block 0026 [ 60]: 2b342ef89c62082b +Block 0026 [ 61]: a3cc586fb2337cab +Block 0026 [ 62]: 7eefd8d0cd7df4c2 +Block 0026 [ 63]: 52afa96dbe082021 +Block 0026 [ 64]: 30f55321f2854f92 +Block 0026 [ 65]: 115d29bd6dece5fd +Block 0026 [ 66]: 1d0f141ad5d8719b +Block 0026 [ 67]: 4afbed23cc14e230 +Block 0026 [ 68]: 30ec5385851eb75f +Block 0026 [ 69]: f942b6889c0db151 +Block 0026 [ 70]: 0ce65f36b9fc6e1e +Block 0026 [ 71]: ac1adbd125d68e79 +Block 0026 [ 72]: b68d2c6c2fbe117a +Block 0026 [ 73]: 4232b02967e3bcbf +Block 0026 [ 74]: 8ef379e8c5e55b42 +Block 0026 [ 75]: d4ed00451596a830 +Block 0026 [ 76]: bd35cd14d571e4d7 +Block 0026 [ 77]: 30bd60dfda09b19e +Block 0026 [ 78]: cdfac1b883b76655 +Block 0026 [ 79]: e3d86b100591fb9d +Block 0026 [ 80]: 59ac24671e7d91af +Block 0026 [ 81]: 1025f27f0920055d +Block 0026 [ 82]: 5c02dce58a113ddb +Block 0026 [ 83]: acea7e212c79dee5 +Block 0026 [ 84]: 23d9b815b356c83b +Block 0026 [ 85]: aaa4b234d49dad9e +Block 0026 [ 86]: 444d0ee609380e75 +Block 0026 [ 87]: 654226c4b8f021d2 +Block 0026 [ 88]: 8a35cd5fd6e1f1ab +Block 0026 [ 89]: 862ed14517163100 +Block 0026 [ 90]: 84c0af64eecbf39c +Block 0026 [ 91]: 7e0e4dda300a5a06 +Block 0026 [ 92]: 3d9c7f8c3f41b725 +Block 0026 [ 93]: a35832a7eed21f0a +Block 0026 [ 94]: 0e6bd91ab1c37748 +Block 0026 [ 95]: 3b3f02996786041a +Block 0026 [ 96]: ca39b69b0189da7b +Block 0026 [ 97]: 85685752f7f2a6ee +Block 0026 [ 98]: 8083b8fef5bce9e7 +Block 0026 [ 99]: a04409fb917324af +Block 0026 [100]: 5149daf90529e164 +Block 0026 [101]: fd670942829b7d61 +Block 0026 [102]: 044c3084bb345c6d +Block 0026 [103]: 7bc15cb8f326fb8d +Block 0026 [104]: 9d5fed35368ce865 +Block 0026 [105]: 032b26359ab11c29 +Block 0026 [106]: dde5da90ee01852e +Block 0026 [107]: dfde2792e941c242 +Block 0026 [108]: 45a07e3678367b66 +Block 0026 [109]: e4edb6bde64b0e64 +Block 0026 [110]: 1286bd9d9c15602e +Block 0026 [111]: 1a6f9332b8991cd6 +Block 0026 [112]: 51462feab66fe436 +Block 0026 [113]: 41b7a2049b1d12aa +Block 0026 [114]: 957d14cf0a3493b5 +Block 0026 [115]: b6babfaffaa0bbd5 +Block 0026 [116]: d0e64434099d290b +Block 0026 [117]: 98fbc6565c59cd02 +Block 0026 [118]: deb0588aea27fbba +Block 0026 [119]: 468f0be17af8d3ff +Block 0026 [120]: 94c95df708a119cc +Block 0026 [121]: 6feeb4e265a0b9c9 +Block 0026 [122]: 60e9bdaed056d95e +Block 0026 [123]: feaee97d93a661b5 +Block 0026 [124]: 1a9af81d81a90039 +Block 0026 [125]: 67d6562cf870264e +Block 0026 [126]: 0879f3db8106fff8 +Block 0026 [127]: c43a9b2adb848626 +Block 0027 [ 0]: e31278b9d98ae491 +Block 0027 [ 1]: d91a581dc45b28ca +Block 0027 [ 2]: e538e13966ffa8f6 +Block 0027 [ 3]: ac33db0c5c683ccf +Block 0027 [ 4]: 0a2cdded2dd669be +Block 0027 [ 5]: 91159d8febc616a2 +Block 0027 [ 6]: 491e41276e638eda +Block 0027 [ 7]: a450647808334031 +Block 0027 [ 8]: a49dc91b02dd152a +Block 0027 [ 9]: a1df5af93a458258 +Block 0027 [ 10]: 460ce6ddd889f093 +Block 0027 [ 11]: 2b83ec3afbce05d7 +Block 0027 [ 12]: 1feb1038e4a41337 +Block 0027 [ 13]: d894f759db4aa187 +Block 0027 [ 14]: 9cd3e83bd2ce2a3c +Block 0027 [ 15]: 122329bec91f22ae +Block 0027 [ 16]: 3164305c06597ed1 +Block 0027 [ 17]: 15ea332d31d63ba0 +Block 0027 [ 18]: 332575da2a0d5a15 +Block 0027 [ 19]: d3a985b92cd0052a +Block 0027 [ 20]: 7a3093d0e4099f67 +Block 0027 [ 21]: ba30f2011e951173 +Block 0027 [ 22]: 4f642efd6120e0a2 +Block 0027 [ 23]: 30da68372ea56477 +Block 0027 [ 24]: a8c50c022cc2621c +Block 0027 [ 25]: 1843c5f366fa233b +Block 0027 [ 26]: 81977f521ced01ed +Block 0027 [ 27]: 8ff95bacc0bf5d46 +Block 0027 [ 28]: 371e8ae93b4429ae +Block 0027 [ 29]: 30b09e60a2275b62 +Block 0027 [ 30]: 421c4df3058f5fc8 +Block 0027 [ 31]: 1d844cdbfc4783e1 +Block 0027 [ 32]: 209fd5f6c6242e1f +Block 0027 [ 33]: e31964f0c87dd5a3 +Block 0027 [ 34]: 0bff3b23315f2228 +Block 0027 [ 35]: 7ee79794c7d9698c +Block 0027 [ 36]: c2078da63d1be25a +Block 0027 [ 37]: 54cfc650dc428f86 +Block 0027 [ 38]: c1170df8c640ac41 +Block 0027 [ 39]: f6374626601c138f +Block 0027 [ 40]: b3305d99f063651f +Block 0027 [ 41]: 5fa3a3b86034d02c +Block 0027 [ 42]: 43d617ee14d7394c +Block 0027 [ 43]: f0b3e3740ecad01a +Block 0027 [ 44]: 1484e54190aaefad +Block 0027 [ 45]: 886306c94039c2e5 +Block 0027 [ 46]: 453f49ff9990d8f4 +Block 0027 [ 47]: a160b0bf87129ee1 +Block 0027 [ 48]: 14b6ebec2855245e +Block 0027 [ 49]: be87ad9bbb8fc5d5 +Block 0027 [ 50]: 4e4f69ba2205542d +Block 0027 [ 51]: eeec95e6f93b691b +Block 0027 [ 52]: 2374eda0b7e30be3 +Block 0027 [ 53]: 4f375a04345486a9 +Block 0027 [ 54]: c16f94d33a670c38 +Block 0027 [ 55]: edce5f8c4a99318a +Block 0027 [ 56]: c7bd4b43701dd32b +Block 0027 [ 57]: c5a828d63f58f1f7 +Block 0027 [ 58]: d9d5ff2b896b3531 +Block 0027 [ 59]: 883a28b0478db04d +Block 0027 [ 60]: 2aa444c3b59378c8 +Block 0027 [ 61]: 8af8d16ebf538d25 +Block 0027 [ 62]: 67a9d02865c2ab42 +Block 0027 [ 63]: 4a6439bdb7311890 +Block 0027 [ 64]: f935e598a1205145 +Block 0027 [ 65]: 8d4ae634d1a9a333 +Block 0027 [ 66]: 05657afa85fe632a +Block 0027 [ 67]: 079e46ed57d012c5 +Block 0027 [ 68]: 03230abf66c1b425 +Block 0027 [ 69]: c54bebb4faccaee9 +Block 0027 [ 70]: 6b28e6219d1019bd +Block 0027 [ 71]: 16d88dd182ed969a +Block 0027 [ 72]: 626866912c3eb137 +Block 0027 [ 73]: 193204f7038cb9ac +Block 0027 [ 74]: 156377647e514c90 +Block 0027 [ 75]: 29f72e6ff7e69cc7 +Block 0027 [ 76]: a6145fd88785d18a +Block 0027 [ 77]: ea5e0c3735fee25c +Block 0027 [ 78]: f2e3c04a7f3d6d3f +Block 0027 [ 79]: 3420eedce88e6a7d +Block 0027 [ 80]: 527cbae723451344 +Block 0027 [ 81]: 01c3b478819839eb +Block 0027 [ 82]: f43ca33dd55c49ec +Block 0027 [ 83]: 84722b68ed9b37a1 +Block 0027 [ 84]: 71aaae11c3523d4e +Block 0027 [ 85]: 0cab426f58a8fbde +Block 0027 [ 86]: 2f5fc56279063dd9 +Block 0027 [ 87]: fd3487c76bdfdfdc +Block 0027 [ 88]: b1fcd893026ef087 +Block 0027 [ 89]: ae175ee5084c0d71 +Block 0027 [ 90]: 1c70e03b18315565 +Block 0027 [ 91]: b4e8b34398ea69aa +Block 0027 [ 92]: 07ae38f296bb69fa +Block 0027 [ 93]: 2faee36940f2aa3c +Block 0027 [ 94]: 1e941b12ecb46c33 +Block 0027 [ 95]: 47f49d65e574cad5 +Block 0027 [ 96]: 0a5724315ec4a324 +Block 0027 [ 97]: 2c4efcb88bcad6a0 +Block 0027 [ 98]: ed6990a06e8bf816 +Block 0027 [ 99]: 6df7b115876ed9fd +Block 0027 [100]: 3c3f84384e37e9e7 +Block 0027 [101]: 4b709add16911961 +Block 0027 [102]: 7082128e781fb92f +Block 0027 [103]: 836d704d595fc0a5 +Block 0027 [104]: 0d9e0264bfabdc41 +Block 0027 [105]: fad2dbb39cf7aad9 +Block 0027 [106]: 6e9a57fb1ce6b7b9 +Block 0027 [107]: 625b2973f4342d84 +Block 0027 [108]: 24aa411e48a6ec83 +Block 0027 [109]: 2cc130bd20f276a2 +Block 0027 [110]: 509f9bd51c0dd4ae +Block 0027 [111]: 63a7c8803249998f +Block 0027 [112]: a384c027387b681e +Block 0027 [113]: 701a14dc10ed445f +Block 0027 [114]: 9b4a9df7cf4cba15 +Block 0027 [115]: aa8620c74110cd2c +Block 0027 [116]: 55fb138ff1bbf400 +Block 0027 [117]: 434796a4f710f9be +Block 0027 [118]: a186f7c79917528c +Block 0027 [119]: 314348a58aa47154 +Block 0027 [120]: 0d274caa7dd6c7bc +Block 0027 [121]: 78dfe448ab422a4c +Block 0027 [122]: ea252bcb1be302c2 +Block 0027 [123]: 11761870538cf90f +Block 0027 [124]: f4aa00a486ac10fa +Block 0027 [125]: ee815be93ebf5894 +Block 0027 [126]: 0aaf12c8aec427b7 +Block 0027 [127]: 7b96d15b1284c04e +Block 0028 [ 0]: 82408712ce17f7a9 +Block 0028 [ 1]: f3e8c6e4c2f3e305 +Block 0028 [ 2]: a1581ca69ca9f63b +Block 0028 [ 3]: 50375c67927594de +Block 0028 [ 4]: 03b078c2c1613ef7 +Block 0028 [ 5]: f25f8649d71d7906 +Block 0028 [ 6]: d404193575b2833d +Block 0028 [ 7]: 0875a307b451cb1b +Block 0028 [ 8]: fea3dc97668368ed +Block 0028 [ 9]: 410ef3337a1a4548 +Block 0028 [ 10]: ec3acd7c9bc49f3c +Block 0028 [ 11]: ea5cbdc2f31e3bb2 +Block 0028 [ 12]: 3a061ca85fa84ea9 +Block 0028 [ 13]: d14f05b512c0e069 +Block 0028 [ 14]: ab58a9b9c9d15251 +Block 0028 [ 15]: 6a04b0b1c6a5c825 +Block 0028 [ 16]: 9ae70846c06f4457 +Block 0028 [ 17]: ee90f2fd9876bd4b +Block 0028 [ 18]: 42507e9f20bfd886 +Block 0028 [ 19]: 311aa207eeee0e0d +Block 0028 [ 20]: 6c9695e4d7e07918 +Block 0028 [ 21]: 011cdbb9ef07be82 +Block 0028 [ 22]: aa0a6e601a7bae7c +Block 0028 [ 23]: a3a986d785723d13 +Block 0028 [ 24]: f09ae3599dc42a45 +Block 0028 [ 25]: dab459b86f3f5ac2 +Block 0028 [ 26]: a54c5e996255ca2c +Block 0028 [ 27]: 3dcb342379aff5fa +Block 0028 [ 28]: 0ba802ee0df38dbe +Block 0028 [ 29]: 19515b83587e110a +Block 0028 [ 30]: a12d0bed5dab0a06 +Block 0028 [ 31]: ac84bf5e3a98b0be +Block 0028 [ 32]: e79e0e2a508e9386 +Block 0028 [ 33]: f1cde8b958b67cf4 +Block 0028 [ 34]: 4a13d79c7f6cb7a0 +Block 0028 [ 35]: 2f300090f464a21c +Block 0028 [ 36]: b6fc86496fc9aec2 +Block 0028 [ 37]: 3dfc35eca793cb7f +Block 0028 [ 38]: d2e1696c9a5a2928 +Block 0028 [ 39]: 7c795e7fffd86289 +Block 0028 [ 40]: 52c0ee95ea6fdd02 +Block 0028 [ 41]: b311d199b6aa9218 +Block 0028 [ 42]: 8d56ba4b30fb07e3 +Block 0028 [ 43]: ce62133b53ec1832 +Block 0028 [ 44]: 058384bef5f3d313 +Block 0028 [ 45]: fc95f2620df24e07 +Block 0028 [ 46]: f431e68bf6a58395 +Block 0028 [ 47]: 85ee8f4c9006b459 +Block 0028 [ 48]: cd5fa5365ae87a42 +Block 0028 [ 49]: 1f2288fd8d5dee5c +Block 0028 [ 50]: cd6374c3e2531ff9 +Block 0028 [ 51]: ba608140ca8b7b5c +Block 0028 [ 52]: 9aff6af649f3f64f +Block 0028 [ 53]: 2303c6e1cc4e2dd0 +Block 0028 [ 54]: ef87ff083178fa81 +Block 0028 [ 55]: 26ea3aad00f9e95f +Block 0028 [ 56]: 2e57136f63ca2fd8 +Block 0028 [ 57]: e61e0f60a1830217 +Block 0028 [ 58]: 0bacb0ed448e2b29 +Block 0028 [ 59]: 0f317990dade48ed +Block 0028 [ 60]: c3e2cb9770557283 +Block 0028 [ 61]: 8f97cbf5fc705c60 +Block 0028 [ 62]: 288061965c9746da +Block 0028 [ 63]: b154d61f4849d1ec +Block 0028 [ 64]: 8e9397a83d213b4e +Block 0028 [ 65]: 3e6ad59c9c4acb0f +Block 0028 [ 66]: 8fcf18a12abee65a +Block 0028 [ 67]: d5388ddf42a6c674 +Block 0028 [ 68]: cda99d9620ef82c6 +Block 0028 [ 69]: a119d3c283ed8468 +Block 0028 [ 70]: 30cdcad011da7a62 +Block 0028 [ 71]: a64f272088e46d39 +Block 0028 [ 72]: e672d69e8780b365 +Block 0028 [ 73]: e13f1c2a7ba72820 +Block 0028 [ 74]: 45343118a2755927 +Block 0028 [ 75]: b1ec327fd0a4ff57 +Block 0028 [ 76]: d1e0af3240192798 +Block 0028 [ 77]: 24ec1776f40433bf +Block 0028 [ 78]: 47d7132f3de6411f +Block 0028 [ 79]: 02d281c561b8ced6 +Block 0028 [ 80]: 2caed014dd19d801 +Block 0028 [ 81]: 6545a1f9c40f7e7c +Block 0028 [ 82]: 88258916728f5bb7 +Block 0028 [ 83]: d97be6e93280df68 +Block 0028 [ 84]: 6a4f41e251970d36 +Block 0028 [ 85]: c284daf1359e41d9 +Block 0028 [ 86]: 1fea88bb5cc85cc7 +Block 0028 [ 87]: f1b628fc85ecf74b +Block 0028 [ 88]: 35060adb5334aa39 +Block 0028 [ 89]: f0da6211239f1269 +Block 0028 [ 90]: f1e5bf17338128c2 +Block 0028 [ 91]: b5db0ef6368d57ce +Block 0028 [ 92]: 0d1481e26bf9adb5 +Block 0028 [ 93]: 8c03a83009478238 +Block 0028 [ 94]: dbaf06e92da90e37 +Block 0028 [ 95]: c69d1544bd0221b4 +Block 0028 [ 96]: 36e0a7c126fb9e05 +Block 0028 [ 97]: 5aa9391a902aaf36 +Block 0028 [ 98]: 77c19e82519e5f61 +Block 0028 [ 99]: 9acdb0dc8e2ad24a +Block 0028 [100]: de2075d90c6af446 +Block 0028 [101]: df405d10e227bd96 +Block 0028 [102]: eecb434ab0e99e4c +Block 0028 [103]: 6f464c7524235641 +Block 0028 [104]: 681e7bb3b3f94a16 +Block 0028 [105]: c814771fb2efa395 +Block 0028 [106]: c0b3c7fa8bec6349 +Block 0028 [107]: bf9dfc97a5f3249d +Block 0028 [108]: 34801d8873481e24 +Block 0028 [109]: 15675a609abee274 +Block 0028 [110]: 02e87c0225da6405 +Block 0028 [111]: d28117b6afe29a54 +Block 0028 [112]: 2c542767ebc86fd3 +Block 0028 [113]: 9114939163ffd3a2 +Block 0028 [114]: 39a0e8876489cce5 +Block 0028 [115]: bbe0cc86440e5373 +Block 0028 [116]: 5c952928c554bc57 +Block 0028 [117]: 34adbba55eccd688 +Block 0028 [118]: 7265edb6c99b1b04 +Block 0028 [119]: 011de91e6ab8b36d +Block 0028 [120]: d7726399cd53e5b3 +Block 0028 [121]: 8baf8b805bed1886 +Block 0028 [122]: c8395bc031b6ccf6 +Block 0028 [123]: 0f71ca7ca368a89e +Block 0028 [124]: a5a1786001895577 +Block 0028 [125]: 709d49b068d06531 +Block 0028 [126]: 0b27ca67ef1d7153 +Block 0028 [127]: 7e427c6463689e90 +Block 0029 [ 0]: ce34cb10538a4488 +Block 0029 [ 1]: 211d7a9991acb9e3 +Block 0029 [ 2]: 75f08e5bb287cf6c +Block 0029 [ 3]: 4eeced3480b5d365 +Block 0029 [ 4]: 6caec38b6e905cd4 +Block 0029 [ 5]: d58d7afd8bcc419d +Block 0029 [ 6]: 28c97c8881b3dd13 +Block 0029 [ 7]: cb7b9b3bfaf46afe +Block 0029 [ 8]: dbc42c4b47931b08 +Block 0029 [ 9]: 805428575a21e671 +Block 0029 [ 10]: 0e64fc553cdc48f2 +Block 0029 [ 11]: bffbd5d1dd48fb3f +Block 0029 [ 12]: 58abded29f1e14b4 +Block 0029 [ 13]: 957d09bfd9417b5e +Block 0029 [ 14]: 757184cd6a80c2ca +Block 0029 [ 15]: fffb01be941b2719 +Block 0029 [ 16]: b1bac4e2e7d85eb2 +Block 0029 [ 17]: 6b6df4ba8b62d354 +Block 0029 [ 18]: 37ab98e92c226ac1 +Block 0029 [ 19]: 8da51813d943ef0e +Block 0029 [ 20]: 7c5ecf9ef55246d8 +Block 0029 [ 21]: afcb74a0b3c74e32 +Block 0029 [ 22]: 9ff7327fb6626ec6 +Block 0029 [ 23]: 6d88801c470a838c +Block 0029 [ 24]: e381a1d478169f61 +Block 0029 [ 25]: c4f6ed8539d52fb6 +Block 0029 [ 26]: 9dd42394f963ec51 +Block 0029 [ 27]: 608e7c79c7e9ebd7 +Block 0029 [ 28]: 635bf787f483f095 +Block 0029 [ 29]: ba3ea37f512a88e1 +Block 0029 [ 30]: d59c8e73f3f6f620 +Block 0029 [ 31]: 0bcab889d84e2297 +Block 0029 [ 32]: eba1a6994b5a806d +Block 0029 [ 33]: e5800b70faf85d82 +Block 0029 [ 34]: 17543408abf86929 +Block 0029 [ 35]: d2742aed91d14b30 +Block 0029 [ 36]: 8d864eb756300f8f +Block 0029 [ 37]: 2602a7f3885d0b00 +Block 0029 [ 38]: 38a96b1f178072af +Block 0029 [ 39]: 99f063fa0e0257b0 +Block 0029 [ 40]: 553e5382a39016b2 +Block 0029 [ 41]: 40e5c09d46bf467c +Block 0029 [ 42]: 151efa072d8c3041 +Block 0029 [ 43]: e6b90bff69fb7364 +Block 0029 [ 44]: 2f3d83591040ef91 +Block 0029 [ 45]: 9a51b0677c6883cd +Block 0029 [ 46]: e954652d3758b685 +Block 0029 [ 47]: efc3b3718b8b9d5e +Block 0029 [ 48]: e3b40fcd501db6b2 +Block 0029 [ 49]: 007b05e3352c4a78 +Block 0029 [ 50]: f66361d2e4399495 +Block 0029 [ 51]: 0e6b2a8c1385c597 +Block 0029 [ 52]: 3d8955a1de9f30e2 +Block 0029 [ 53]: 4eaecd9633dc2db8 +Block 0029 [ 54]: 0b0db104ae05c9e2 +Block 0029 [ 55]: b8d8a61f200d677c +Block 0029 [ 56]: e9b85044e092c51f +Block 0029 [ 57]: 9aa1b914b367bf0c +Block 0029 [ 58]: f87f835683f94dc6 +Block 0029 [ 59]: ea3d166054271b20 +Block 0029 [ 60]: bbb5e4b368a6a76a +Block 0029 [ 61]: 2ebacce22764c387 +Block 0029 [ 62]: eea281c46296adc7 +Block 0029 [ 63]: f6b70768992d4a3f +Block 0029 [ 64]: 008caf1824393415 +Block 0029 [ 65]: 6e1e17e781647ede +Block 0029 [ 66]: 96471c30c4fad451 +Block 0029 [ 67]: dbea40a67071a38d +Block 0029 [ 68]: 6a68c126f7df8502 +Block 0029 [ 69]: 55f3b484495c01f5 +Block 0029 [ 70]: 71f1ceeebaab92ba +Block 0029 [ 71]: aa7d9f1f1d542cd3 +Block 0029 [ 72]: 57a7e002e8148b3f +Block 0029 [ 73]: d066574b2673ec63 +Block 0029 [ 74]: fa064ece3661f27c +Block 0029 [ 75]: 59c0c37896842666 +Block 0029 [ 76]: b9907779bbbfefdd +Block 0029 [ 77]: 3a3c0948985d0305 +Block 0029 [ 78]: 4399ad0a4be323a9 +Block 0029 [ 79]: 016efe5c4529314a +Block 0029 [ 80]: 7345362c79299fbe +Block 0029 [ 81]: 3890e8bd3dc199ed +Block 0029 [ 82]: a9f84b570d9caf19 +Block 0029 [ 83]: 12e79bf3de2f764d +Block 0029 [ 84]: e1279245288ab28c +Block 0029 [ 85]: c042d0f79b5efb78 +Block 0029 [ 86]: 4b595741415f2dd7 +Block 0029 [ 87]: 661557ace1e3bda7 +Block 0029 [ 88]: a4ebbccc3c16fe3e +Block 0029 [ 89]: 97b76196c5c64fb0 +Block 0029 [ 90]: 6ab0d520070ae215 +Block 0029 [ 91]: cf04f4e7f61c6ddd +Block 0029 [ 92]: 39bbdca29baf8767 +Block 0029 [ 93]: 4728cb7d2d918220 +Block 0029 [ 94]: 8cea866afb3619b5 +Block 0029 [ 95]: 983d3c2dd31d6d69 +Block 0029 [ 96]: c16d0d3adc9f83b3 +Block 0029 [ 97]: 9010a83289cfb845 +Block 0029 [ 98]: 65cc7b1c436419ca +Block 0029 [ 99]: a50cf5e64562c1ec +Block 0029 [100]: 0f45ea095a9b45f7 +Block 0029 [101]: 550cc6f9be6b48f6 +Block 0029 [102]: c9a3f23adc2dd645 +Block 0029 [103]: 6ffa2f9d7f00f22b +Block 0029 [104]: 3f491b65d9a190da +Block 0029 [105]: 9da25d64e68ef5c7 +Block 0029 [106]: 4e9c12aeb5b97c2f +Block 0029 [107]: b59116c75353ce2a +Block 0029 [108]: 78bde1417564ec29 +Block 0029 [109]: 6fe1002528bdf6a0 +Block 0029 [110]: a965b63d2265c7f3 +Block 0029 [111]: 3f3222d651afad85 +Block 0029 [112]: 78964a97c84f4574 +Block 0029 [113]: a1f7808dfb3a8d18 +Block 0029 [114]: 53c18846d2abe738 +Block 0029 [115]: c07f6787ec22fff1 +Block 0029 [116]: e0b52b87e0f04cc4 +Block 0029 [117]: 0a67631a61fa149f +Block 0029 [118]: c17063aa02acb80a +Block 0029 [119]: 435f430b7080099d +Block 0029 [120]: 02eda91081cbf64c +Block 0029 [121]: 3a1fef6339dfbeec +Block 0029 [122]: 821837c795d62201 +Block 0029 [123]: f7415295fd0566f8 +Block 0029 [124]: 002af4e7624778e0 +Block 0029 [125]: 44c86de1dba9e648 +Block 0029 [126]: d13799f233f47269 +Block 0029 [127]: 62a153063663a128 +Block 0030 [ 0]: cb74d134bab6af1e +Block 0030 [ 1]: ab9139ca3e85e177 +Block 0030 [ 2]: 9621e7b27594caba +Block 0030 [ 3]: 4a56f22b1f95e350 +Block 0030 [ 4]: 7ba0a9626274b5aa +Block 0030 [ 5]: f1e47cfd11b89c41 +Block 0030 [ 6]: 6e60e2043581457e +Block 0030 [ 7]: b5baadc50e169bd4 +Block 0030 [ 8]: 35d0006692605bcc +Block 0030 [ 9]: 89285fd649487c0f +Block 0030 [ 10]: eed082cc1ca0a043 +Block 0030 [ 11]: 4d9b0cd9d0281f25 +Block 0030 [ 12]: b55bb9d61c0b63e6 +Block 0030 [ 13]: ccfc302b1ab3e413 +Block 0030 [ 14]: f5da9ad788fdf771 +Block 0030 [ 15]: 5869f718f687b0c8 +Block 0030 [ 16]: 4380f6ac31d55bb7 +Block 0030 [ 17]: fd59c18a39161816 +Block 0030 [ 18]: 2c82dd132b577957 +Block 0030 [ 19]: b90e90d65d0218c2 +Block 0030 [ 20]: c7933579f4e7371b +Block 0030 [ 21]: 25738f968c48b489 +Block 0030 [ 22]: 663ea3e6e1060896 +Block 0030 [ 23]: fe99b4410d933510 +Block 0030 [ 24]: 65ca199967fc758b +Block 0030 [ 25]: fc90f25e8372fb67 +Block 0030 [ 26]: fb913979e7f4b1e4 +Block 0030 [ 27]: 864b7e4de3fc5054 +Block 0030 [ 28]: d183f3e8faf284d4 +Block 0030 [ 29]: f5b2909c45867bfd +Block 0030 [ 30]: fa6a2176bbf0d3a7 +Block 0030 [ 31]: 008c78a9bab195cc +Block 0030 [ 32]: bdf9a2cb8d1c3a97 +Block 0030 [ 33]: f84c7c9cbab7d537 +Block 0030 [ 34]: 0bd511cb729e9313 +Block 0030 [ 35]: b4700a2eef01d3d5 +Block 0030 [ 36]: 6e4e3a5dad8e2b39 +Block 0030 [ 37]: 6e4175da89e007e1 +Block 0030 [ 38]: 359996202e7388a9 +Block 0030 [ 39]: 54584a0d03f2c6a8 +Block 0030 [ 40]: e427aee0fcbf2ed2 +Block 0030 [ 41]: a7e40b854431f3e0 +Block 0030 [ 42]: 5bf9228dca48af5e +Block 0030 [ 43]: 94c0ccd190109464 +Block 0030 [ 44]: 7a2df0d59d50f12e +Block 0030 [ 45]: c002ab1a1baed32e +Block 0030 [ 46]: 682d82c9a7884da3 +Block 0030 [ 47]: 9b1487167135ae71 +Block 0030 [ 48]: bf2a8533abb8919d +Block 0030 [ 49]: 26e7c343260a13d7 +Block 0030 [ 50]: 7a362cbe6db84f0a +Block 0030 [ 51]: 7e9d180198969377 +Block 0030 [ 52]: cb69a25076a05638 +Block 0030 [ 53]: dc0e76db9f2f52a3 +Block 0030 [ 54]: ce43a758d54a4f41 +Block 0030 [ 55]: 356825d901de7161 +Block 0030 [ 56]: 315a55a0af60ad63 +Block 0030 [ 57]: 4824c7effdfbd07b +Block 0030 [ 58]: c638523a5383ba1a +Block 0030 [ 59]: 4edc3a0bc3c78832 +Block 0030 [ 60]: 8ac605905eb84c4e +Block 0030 [ 61]: d2900261470e1a67 +Block 0030 [ 62]: 05d65c06e6a24220 +Block 0030 [ 63]: 8435ff377b5ff7e0 +Block 0030 [ 64]: 2bcd4b532b81bdf6 +Block 0030 [ 65]: ec252e030064a0b4 +Block 0030 [ 66]: 524cf8e135a3b747 +Block 0030 [ 67]: 278f7b7951c7e470 +Block 0030 [ 68]: 0f77150c9e415e43 +Block 0030 [ 69]: 99caa3c58f33c0e1 +Block 0030 [ 70]: ce440f899289cc0d +Block 0030 [ 71]: 9e26e5b9a2dfe6c7 +Block 0030 [ 72]: 7e11aa36d81f216a +Block 0030 [ 73]: 79ed978e247bb8a9 +Block 0030 [ 74]: 732b4d5012bbdd26 +Block 0030 [ 75]: e82b506b197611ba +Block 0030 [ 76]: 82ced7eae9605c32 +Block 0030 [ 77]: de31b9ed48fc41c3 +Block 0030 [ 78]: c8bde09405c92a1c +Block 0030 [ 79]: 3e1a29cf3f4a5776 +Block 0030 [ 80]: fd7e85092fc9a5be +Block 0030 [ 81]: f68ed9c8d8bc10b4 +Block 0030 [ 82]: 8db739301e460d8b +Block 0030 [ 83]: 016ee7802d808790 +Block 0030 [ 84]: c7334fbbe7c7617e +Block 0030 [ 85]: bd7cb0187038f41a +Block 0030 [ 86]: cf4f5bb891351075 +Block 0030 [ 87]: 57a50cc2a966e2b3 +Block 0030 [ 88]: 4df30e75df349360 +Block 0030 [ 89]: f6ee30a92abccd66 +Block 0030 [ 90]: 330110ce83d23bc6 +Block 0030 [ 91]: 7a2d87b1916840f9 +Block 0030 [ 92]: 6480fafbacf1bf46 +Block 0030 [ 93]: 8c8df72a73b670f0 +Block 0030 [ 94]: 509f06fe2f62ed7a +Block 0030 [ 95]: 3ca2dacea09e846c +Block 0030 [ 96]: b2c0f93dd6edc763 +Block 0030 [ 97]: f35e434d06f52de1 +Block 0030 [ 98]: 4cd8554a66f8fd3a +Block 0030 [ 99]: 36464d67ffd919cb +Block 0030 [100]: d159b776820b30d5 +Block 0030 [101]: c520a82f0474cd8d +Block 0030 [102]: b86f0ac925d8a02b +Block 0030 [103]: 32078216de9940ee +Block 0030 [104]: e5237ffb6a726a31 +Block 0030 [105]: 5c6d7d3176378cc2 +Block 0030 [106]: 31929784e802d335 +Block 0030 [107]: 70215d61e6fb7cfe +Block 0030 [108]: 29211cace6a7f1d8 +Block 0030 [109]: faeef455cd5b7582 +Block 0030 [110]: fc0a0780010b856b +Block 0030 [111]: fe71632fb6931fcd +Block 0030 [112]: da0efe624942d9fd +Block 0030 [113]: 7ad3b463f50f27cd +Block 0030 [114]: 995014de8f61fbfb +Block 0030 [115]: af5d8a32f37e474d +Block 0030 [116]: 37fb11c2566e3136 +Block 0030 [117]: ca1b55d0775da139 +Block 0030 [118]: 6dcb9acd9f90a0e7 +Block 0030 [119]: 575bea75322eee40 +Block 0030 [120]: 03388524c06fc342 +Block 0030 [121]: b87fba57be6a7d1e +Block 0030 [122]: ece9497a243c32bc +Block 0030 [123]: 5a01f4734f05fbe2 +Block 0030 [124]: fc6e4fa8a0b860b2 +Block 0030 [125]: 7002e3123bfdb5df +Block 0030 [126]: 7804b63c35fbe698 +Block 0030 [127]: c9c8f414df7820cb +Block 0031 [ 0]: b2ad75524c3d2a81 +Block 0031 [ 1]: fab04039a96af6d0 +Block 0031 [ 2]: 8494705bd7a6eaa4 +Block 0031 [ 3]: 814756c584e7272d +Block 0031 [ 4]: 927c5b0c90d75d6b +Block 0031 [ 5]: f888d4ed7afe38a6 +Block 0031 [ 6]: 982046c3b2d45322 +Block 0031 [ 7]: c24ce29090879caa +Block 0031 [ 8]: a4b4eb89764c8d01 +Block 0031 [ 9]: 1f09e9c76fcd765c +Block 0031 [ 10]: 1659b74e12faff66 +Block 0031 [ 11]: bf5b57bc59958c88 +Block 0031 [ 12]: 0eec19264c1d7051 +Block 0031 [ 13]: 1715310a772896f3 +Block 0031 [ 14]: 557e296e0f059142 +Block 0031 [ 15]: ac4535969b81e7d7 +Block 0031 [ 16]: aaba64a3051b10c6 +Block 0031 [ 17]: 13afbdc722284e8a +Block 0031 [ 18]: 5546653a8b26b3df +Block 0031 [ 19]: 8384fe398ed31455 +Block 0031 [ 20]: a2697ab5df6b271e +Block 0031 [ 21]: 8e1d55e24a96e84b +Block 0031 [ 22]: 0e654de47d5a74ee +Block 0031 [ 23]: 4e7ac436b7f97825 +Block 0031 [ 24]: 3591d7151256c14e +Block 0031 [ 25]: 0b6607c547626a3d +Block 0031 [ 26]: 0ea9d4e533da04b7 +Block 0031 [ 27]: b519298b2333dbe0 +Block 0031 [ 28]: c9cb7b614d5c918a +Block 0031 [ 29]: f0a5f1041cab56ae +Block 0031 [ 30]: d1442001904abff9 +Block 0031 [ 31]: b097acb54c2d261b +Block 0031 [ 32]: c1d50486ebb4f4e1 +Block 0031 [ 33]: 6dfb55d658d7e408 +Block 0031 [ 34]: 65182f413c8a6f35 +Block 0031 [ 35]: 4fc028be89308272 +Block 0031 [ 36]: a0c559768bb48b2e +Block 0031 [ 37]: 42770640b289c67f +Block 0031 [ 38]: 8796a70b12d4e4bb +Block 0031 [ 39]: b7f621233f598131 +Block 0031 [ 40]: 2f506feb2e3ec6e6 +Block 0031 [ 41]: de73f26918d7cd59 +Block 0031 [ 42]: dbc7b351f3247b08 +Block 0031 [ 43]: 28ea9c36274ce050 +Block 0031 [ 44]: 2abebad94846282d +Block 0031 [ 45]: 83eb22a616227ead +Block 0031 [ 46]: 342a5e9acca0cf39 +Block 0031 [ 47]: 840ba32a918920d7 +Block 0031 [ 48]: f5aa7f6f0df6e05b +Block 0031 [ 49]: 906884611a46cf58 +Block 0031 [ 50]: e3a046400e2ee967 +Block 0031 [ 51]: 8e76abba13b3814a +Block 0031 [ 52]: 75b5822697cfe363 +Block 0031 [ 53]: c3627120cc9bc843 +Block 0031 [ 54]: 0328e0f870076cc6 +Block 0031 [ 55]: 831f34dbcbdc6961 +Block 0031 [ 56]: ce2d8f9f7aeeef1a +Block 0031 [ 57]: 609845487b08ba98 +Block 0031 [ 58]: 6f726d45e2e3b3a0 +Block 0031 [ 59]: ba0632a27042f031 +Block 0031 [ 60]: 46c959e91f4a5b3f +Block 0031 [ 61]: 583c6d6e3a34d9f9 +Block 0031 [ 62]: befa926623f509d2 +Block 0031 [ 63]: 4a4915a0a0e22615 +Block 0031 [ 64]: 1f2646e77fdc1e4e +Block 0031 [ 65]: 0caa62caf21df1f1 +Block 0031 [ 66]: f311e1d1f8213e5c +Block 0031 [ 67]: ec49f4c725ae6e90 +Block 0031 [ 68]: 9ff8475fddb053ee +Block 0031 [ 69]: 0bb1bd705e94b7b1 +Block 0031 [ 70]: fd35b76f36338f73 +Block 0031 [ 71]: 6474c9a0a5b6c69f +Block 0031 [ 72]: 91921541f2e2291f +Block 0031 [ 73]: 5e2acd572e3fc12e +Block 0031 [ 74]: 9bb771e4e18a755f +Block 0031 [ 75]: 8caf6c26722198cf +Block 0031 [ 76]: 33dbf836dae269d3 +Block 0031 [ 77]: c841bcc4839a9e52 +Block 0031 [ 78]: b15fd0aa30b4a4e4 +Block 0031 [ 79]: b1d063d4fe67e21c +Block 0031 [ 80]: d4a1a03300a6e442 +Block 0031 [ 81]: f81d00de7f973647 +Block 0031 [ 82]: dcd91b2b94d78125 +Block 0031 [ 83]: 76da9792b43e75b8 +Block 0031 [ 84]: a7e3f6568c0a0388 +Block 0031 [ 85]: 566feb89b3d88185 +Block 0031 [ 86]: 8c4d3688f80e91b6 +Block 0031 [ 87]: 8fe53124e6104a2e +Block 0031 [ 88]: da5da5041344dd1b +Block 0031 [ 89]: 721b41ec066d2189 +Block 0031 [ 90]: 074debbac6f9761b +Block 0031 [ 91]: 6a07879fc9bf2ec9 +Block 0031 [ 92]: ccc3e1eb61fad409 +Block 0031 [ 93]: 3be4750e63efdf7b +Block 0031 [ 94]: 013c1f56ea5b8ce9 +Block 0031 [ 95]: 2072659db16979f8 +Block 0031 [ 96]: be5ac68e4277d087 +Block 0031 [ 97]: 65e7fcc9935f7384 +Block 0031 [ 98]: 2af35d2546b9a4b3 +Block 0031 [ 99]: 50d9bc80f125eeef +Block 0031 [100]: 31573ae31f5913b8 +Block 0031 [101]: aa2fe8799d89d353 +Block 0031 [102]: 0dd3e255f4addbe8 +Block 0031 [103]: 48d05bb4cf7721ad +Block 0031 [104]: 0158e051ef3d08cf +Block 0031 [105]: 0a56281c57ad20c4 +Block 0031 [106]: 80396de3b32e46c3 +Block 0031 [107]: 6bcc4e1db72d4e2c +Block 0031 [108]: 1d723a0ad2f4e794 +Block 0031 [109]: 7ff3511be9bcb0eb +Block 0031 [110]: cc6493fcb3730f84 +Block 0031 [111]: 9ecdcbc35ead32f5 +Block 0031 [112]: 426b36f39c969d5b +Block 0031 [113]: 25e66eca6aeed6af +Block 0031 [114]: 94eeb55600b80f69 +Block 0031 [115]: 5e1f278e6ea9b3fe +Block 0031 [116]: 903011fc53d26f6e +Block 0031 [117]: 800522387513c939 +Block 0031 [118]: 25125a6704c6bc7e +Block 0031 [119]: 2fa464d5b41a34fb +Block 0031 [120]: c72f0545be5542a3 +Block 0031 [121]: a10f157445827b48 +Block 0031 [122]: d2d0f854a21a9fb2 +Block 0031 [123]: 35bf180e3e99d207 +Block 0031 [124]: 377fa81666dc7f2b +Block 0031 [125]: 50e586398a9c39c8 +Block 0031 [126]: 6f732732a550924a +Block 0031 [127]: 81f88b28683ea8e5 + + After pass 1: +Block 0000 [ 0]: 3653ec9d01583df9 +Block 0000 [ 1]: 69ef53a72d1e1fd3 +Block 0000 [ 2]: 35635631744ab54f +Block 0000 [ 3]: 599512e96a37ab6e +Block 0000 [ 4]: 11391e9e42d1727c +Block 0000 [ 5]: 68d9d83a0713308b +Block 0000 [ 6]: 444c077ac115bb06 +Block 0000 [ 7]: fa68fa58d2b1fe8c +Block 0000 [ 8]: 8cf2e516a943abc4 +Block 0000 [ 9]: 891ca59c509138e1 +Block 0000 [ 10]: 7291b599e55eef18 +Block 0000 [ 11]: 1cf3e52886b2d9a4 +Block 0000 [ 12]: f3d4f1c26d3bc3a7 +Block 0000 [ 13]: ebc0f159103930fb +Block 0000 [ 14]: 9d0e061ef578e457 +Block 0000 [ 15]: 657a0e383db3614f +Block 0000 [ 16]: 2f1a908810976771 +Block 0000 [ 17]: 2ee9ce495a10b1bf +Block 0000 [ 18]: 0a60ade9f8611f08 +Block 0000 [ 19]: 907562b6de768481 +Block 0000 [ 20]: abbc7c71a02ff51c +Block 0000 [ 21]: 0a4e54f1106b6829 +Block 0000 [ 22]: 19937636107aa126 +Block 0000 [ 23]: 94f317629d1e115e +Block 0000 [ 24]: 01735b70329da1ba +Block 0000 [ 25]: 2da84930050a9c85 +Block 0000 [ 26]: 9f5332bdeed5ddeb +Block 0000 [ 27]: f42fecaeb7c25ba7 +Block 0000 [ 28]: db04f73f19403546 +Block 0000 [ 29]: 50697466fc80a862 +Block 0000 [ 30]: 78e038fe6c14fbb6 +Block 0000 [ 31]: 9b3de1088ce8033b +Block 0000 [ 32]: a63d4e4238b04a7a +Block 0000 [ 33]: 23ebc3adb723f426 +Block 0000 [ 34]: 1e421bae1038fd72 +Block 0000 [ 35]: f32e959bd493074a +Block 0000 [ 36]: 54e7f63fbdb5120c +Block 0000 [ 37]: 5f13118507e32e40 +Block 0000 [ 38]: 8cfd2f530eb342c6 +Block 0000 [ 39]: 42a4662bc122631e +Block 0000 [ 40]: 2f2a42c25eb6b1d0 +Block 0000 [ 41]: c614544be8fd0242 +Block 0000 [ 42]: 8bff294407d8be83 +Block 0000 [ 43]: 379e972199be20d0 +Block 0000 [ 44]: 7cdcb86a483bdb13 +Block 0000 [ 45]: 7a9efb775d45fd5d +Block 0000 [ 46]: 805dde2ff0070620 +Block 0000 [ 47]: 90dd43d77ad18c6f +Block 0000 [ 48]: 7ff0f47c081cd430 +Block 0000 [ 49]: 3b4bc5b40c3a8bb0 +Block 0000 [ 50]: 244fd293bf92f6f0 +Block 0000 [ 51]: 918b5d7d87043317 +Block 0000 [ 52]: 325716b7c7d591ac +Block 0000 [ 53]: 5827e7dc7460861d +Block 0000 [ 54]: 3afde4f1a339ba42 +Block 0000 [ 55]: 113ebacbd3fc27b5 +Block 0000 [ 56]: 7a392c2c66580dd2 +Block 0000 [ 57]: e78dc05db58e9e56 +Block 0000 [ 58]: 2ce081c891f27df0 +Block 0000 [ 59]: 498e7444269edb84 +Block 0000 [ 60]: 30f49d0dff3d19d9 +Block 0000 [ 61]: ebf523ff60b33bdf +Block 0000 [ 62]: 0c526595a91783b3 +Block 0000 [ 63]: bf93e7a4c4ca448a +Block 0000 [ 64]: eccc571eea4e0e3c +Block 0000 [ 65]: 0515ef24beec6eba +Block 0000 [ 66]: d4c7f0191146a785 +Block 0000 [ 67]: 28510792c00ea028 +Block 0000 [ 68]: eabbb492bb8ddc72 +Block 0000 [ 69]: 2b5630d0f66edb76 +Block 0000 [ 70]: c7900d53d49bd11a +Block 0000 [ 71]: a7397a31b873a4ed +Block 0000 [ 72]: a934024c7831ee82 +Block 0000 [ 73]: 99687c5827049c6e +Block 0000 [ 74]: 2463b0944f7afc99 +Block 0000 [ 75]: 127d0cea387336aa +Block 0000 [ 76]: cc47e487d5302850 +Block 0000 [ 77]: d0c679f4fb3f254f +Block 0000 [ 78]: 4de0fe5b2c042730 +Block 0000 [ 79]: 087acaa178249a56 +Block 0000 [ 80]: 716b39281e7f58e8 +Block 0000 [ 81]: 9684bb90ccd593d9 +Block 0000 [ 82]: e19085d10568c895 +Block 0000 [ 83]: bdc586c127426313 +Block 0000 [ 84]: e33ec65fad156adf +Block 0000 [ 85]: bd93ce1323fa699f +Block 0000 [ 86]: 3756176df8374754 +Block 0000 [ 87]: 1091998d92ded6ac +Block 0000 [ 88]: 683e5b4e92cb1ca6 +Block 0000 [ 89]: 778091253835a3eb +Block 0000 [ 90]: 07e28c26450e8693 +Block 0000 [ 91]: 1da773d2e6d92769 +Block 0000 [ 92]: 3989bc2c07ba9834 +Block 0000 [ 93]: 0d93ca091aad8e43 +Block 0000 [ 94]: 37af1ccf9e1cefa3 +Block 0000 [ 95]: 0fd62080ccb4ce31 +Block 0000 [ 96]: 03a1b7f8d0162e46 +Block 0000 [ 97]: 6ac173fb65e1cbbf +Block 0000 [ 98]: 189075a0659f064f +Block 0000 [ 99]: c29a285760117d92 +Block 0000 [100]: 247843ddcddc7890 +Block 0000 [101]: 1be24f8cb903a20a +Block 0000 [102]: 46eb5d3b470786ce +Block 0000 [103]: be56c4d643934ba1 +Block 0000 [104]: 9e651893bc735d5d +Block 0000 [105]: 4f871eaf1f794e49 +Block 0000 [106]: 56273f5a6c3b89f5 +Block 0000 [107]: 02ffd0b92501d42f +Block 0000 [108]: 4a5227dd9f8fa8d1 +Block 0000 [109]: 0a99d3c9b46c7166 +Block 0000 [110]: bb35852244977767 +Block 0000 [111]: 7cb7a53b429942f3 +Block 0000 [112]: 8e33186e83a78946 +Block 0000 [113]: 0f32b608e1669ccc +Block 0000 [114]: 21e1bff9df3954b3 +Block 0000 [115]: 75296cac5717c7cd +Block 0000 [116]: 8872ab5cd801dc1b +Block 0000 [117]: c603b4e7ead82b88 +Block 0000 [118]: 4947f3d801e8b66f +Block 0000 [119]: 5041f62cd217a07c +Block 0000 [120]: 71dfe74776cc6427 +Block 0000 [121]: 88c82a82688ebec4 +Block 0000 [122]: 0653c4287a96288b +Block 0000 [123]: 861f5e03145e80e3 +Block 0000 [124]: 1b6d130eb435f36c +Block 0000 [125]: d7e886df048e697c +Block 0000 [126]: 22b36cb1baeb62cd +Block 0000 [127]: b77f140e91100813 +Block 0001 [ 0]: 81124fce35cc5710 +Block 0001 [ 1]: 43ec50543b0faaac +Block 0001 [ 2]: 6c565d6733116dec +Block 0001 [ 3]: 1759dc023b510979 +Block 0001 [ 4]: 1b5519894c7b2078 +Block 0001 [ 5]: bc4bed6befe8d304 +Block 0001 [ 6]: 178492a875711577 +Block 0001 [ 7]: e1cbb4c720abb332 +Block 0001 [ 8]: 733611dc7bbae615 +Block 0001 [ 9]: 567709079916a34a +Block 0001 [ 10]: 36858b8177a813dc +Block 0001 [ 11]: 0dd1613f2a714398 +Block 0001 [ 12]: c5e7877dfbd1eaae +Block 0001 [ 13]: a315d2540b581798 +Block 0001 [ 14]: f18cfd0db8736089 +Block 0001 [ 15]: e7072ac65ddb839b +Block 0001 [ 16]: 3bed624365a97822 +Block 0001 [ 17]: 304a75bc092ee455 +Block 0001 [ 18]: 32a64b19179742b1 +Block 0001 [ 19]: c82223ccdc54d357 +Block 0001 [ 20]: 1eb47f0156342bbc +Block 0001 [ 21]: b36bebef735e1852 +Block 0001 [ 22]: 7fe800c212f0906c +Block 0001 [ 23]: 579d6218ce6fe61e +Block 0001 [ 24]: d4b3493b26c9f785 +Block 0001 [ 25]: 775ab9715439d3c5 +Block 0001 [ 26]: 2e630456603452e6 +Block 0001 [ 27]: 834cd73b296d494e +Block 0001 [ 28]: 553bbbf94cfff19c +Block 0001 [ 29]: e78310bf508983a6 +Block 0001 [ 30]: a352a63a40dda197 +Block 0001 [ 31]: e9cad1f6ed343b8b +Block 0001 [ 32]: 204d0835f3bf7718 +Block 0001 [ 33]: 47b32e01810c9d29 +Block 0001 [ 34]: c957ec19cd11646a +Block 0001 [ 35]: 255112dd67affbec +Block 0001 [ 36]: 348b305e17163ed5 +Block 0001 [ 37]: 56a926ac34bca1c8 +Block 0001 [ 38]: fa7a6a2922b31af6 +Block 0001 [ 39]: 1bd79c636e0f2a74 +Block 0001 [ 40]: 42519d33f9f14e23 +Block 0001 [ 41]: a85dda53cf3578dc +Block 0001 [ 42]: 304d870f2b18c29a +Block 0001 [ 43]: b892e91867ad87a3 +Block 0001 [ 44]: 0367569c89868574 +Block 0001 [ 45]: c047ce8c1af8ed45 +Block 0001 [ 46]: 7f6b62534d011f4f +Block 0001 [ 47]: 3b8a08ed0cd898bc +Block 0001 [ 48]: 579b179396a0c222 +Block 0001 [ 49]: 60111f485f3242b6 +Block 0001 [ 50]: ef8f04ab050255e2 +Block 0001 [ 51]: 5ca4ce2a56f8a405 +Block 0001 [ 52]: 1d0bc04b788dd5bf +Block 0001 [ 53]: fe0b8ea94c6e44fd +Block 0001 [ 54]: ac51b0ea5463fb69 +Block 0001 [ 55]: b53cc41288485a16 +Block 0001 [ 56]: 3b172d8c9ba1f26c +Block 0001 [ 57]: 755aaeabee7d1ed1 +Block 0001 [ 58]: ae6f57837889a218 +Block 0001 [ 59]: c4b68cf3ba7e9d31 +Block 0001 [ 60]: 785c5926588d66ad +Block 0001 [ 61]: 16ee9e11e724cac2 +Block 0001 [ 62]: 99aa9c0135bbd6c9 +Block 0001 [ 63]: fe66ef3ee8b5e358 +Block 0001 [ 64]: 7f6bd31c05aaea24 +Block 0001 [ 65]: 8c81895933056445 +Block 0001 [ 66]: 05a4b86707aa6002 +Block 0001 [ 67]: 4d096ba83f4475dc +Block 0001 [ 68]: b490dfd82309ef2a +Block 0001 [ 69]: 5a9260540e60db06 +Block 0001 [ 70]: 2474f0859aa0ac72 +Block 0001 [ 71]: 7300eacf9d86d2c1 +Block 0001 [ 72]: 1556af20a3ef8067 +Block 0001 [ 73]: 86c16a21ce83eb70 +Block 0001 [ 74]: 6b5302cadc4572c5 +Block 0001 [ 75]: 9b7922765f0e0354 +Block 0001 [ 76]: e3f2198c12a9712a +Block 0001 [ 77]: bf9819c3f7cc5a86 +Block 0001 [ 78]: afee5f2d3320b0bd +Block 0001 [ 79]: 379115408f928093 +Block 0001 [ 80]: 908219f9bcb28820 +Block 0001 [ 81]: 4665baf819453030 +Block 0001 [ 82]: c90a059a656fc183 +Block 0001 [ 83]: 33c3291622ecdf31 +Block 0001 [ 84]: 775a68f8b3966014 +Block 0001 [ 85]: 53ef801db9388b80 +Block 0001 [ 86]: 81cbda0dfbf65fa1 +Block 0001 [ 87]: fd4ac24b61d3c8d7 +Block 0001 [ 88]: 5e7046798be87806 +Block 0001 [ 89]: aa4e6b8bfcca95fb +Block 0001 [ 90]: a2001d03233b2f0e +Block 0001 [ 91]: 7d538530f96085a0 +Block 0001 [ 92]: d38f62f231f9b52e +Block 0001 [ 93]: 8dc3081a086d9daa +Block 0001 [ 94]: 883c50417dbaf081 +Block 0001 [ 95]: bd002bb540f35485 +Block 0001 [ 96]: cc68837fc25c9a87 +Block 0001 [ 97]: 4ed107bce88e73c1 +Block 0001 [ 98]: e7ff0c41a1e3bc4a +Block 0001 [ 99]: 488b1809f472dc9d +Block 0001 [100]: 35410408ece21800 +Block 0001 [101]: 7b50848a016e79cb +Block 0001 [102]: e985719d6f64a9b2 +Block 0001 [103]: 006df69a7bca976f +Block 0001 [104]: e890b263c7cc5970 +Block 0001 [105]: 35979016181fbbd2 +Block 0001 [106]: e4fff85feadc39b9 +Block 0001 [107]: 87f8a036894442e2 +Block 0001 [108]: 2c4dfff4c9de094a +Block 0001 [109]: 51b8eea696cbde4c +Block 0001 [110]: b8768c7bf0ac6cdb +Block 0001 [111]: 03ade3d5b85bd0de +Block 0001 [112]: 3e34032d46be2e95 +Block 0001 [113]: d552fe73d03a380d +Block 0001 [114]: 610b3c1ec2e06ab6 +Block 0001 [115]: fff69e45577af380 +Block 0001 [116]: cd645a3a107953e7 +Block 0001 [117]: 99edaeb0890c5417 +Block 0001 [118]: ac44c680e31c3d51 +Block 0001 [119]: 9b6a30e934f83dad +Block 0001 [120]: 31b9d0d40d03a80f +Block 0001 [121]: 1dc2ec1683f87714 +Block 0001 [122]: 4e6fd78afefad588 +Block 0001 [123]: 0a7857fe9c9ae15d +Block 0001 [124]: 5a894bc70b57a8f5 +Block 0001 [125]: 82a6248eefbd8c0c +Block 0001 [126]: ac1200ef990a5f7f +Block 0001 [127]: 7e2b809c5e620aca +Block 0002 [ 0]: ab531950d650d8de +Block 0002 [ 1]: afbbd0a8f33b8f3f +Block 0002 [ 2]: eae43ba8d1fada95 +Block 0002 [ 3]: 37a7c613b7bc4b8e +Block 0002 [ 4]: 797c0187f0118661 +Block 0002 [ 5]: e975fc3402de84be +Block 0002 [ 6]: 5f7211c91b7f2f1f +Block 0002 [ 7]: a82fccd7a5c06f12 +Block 0002 [ 8]: 99a47006ee9f1139 +Block 0002 [ 9]: f539ccdbc25a4cc1 +Block 0002 [ 10]: e71e6596f62cdd5a +Block 0002 [ 11]: 451148e009460163 +Block 0002 [ 12]: d9ee486b10b2806e +Block 0002 [ 13]: 33f5d1433c73585e +Block 0002 [ 14]: a8490151cb101d0d +Block 0002 [ 15]: da549e6dd1679df6 +Block 0002 [ 16]: 809e74b211e1b935 +Block 0002 [ 17]: df0bd60e619d438a +Block 0002 [ 18]: a6e4f669e3ef3bd6 +Block 0002 [ 19]: 2dbb7b100306ab24 +Block 0002 [ 20]: 9ec25a6c655e51da +Block 0002 [ 21]: 12c2c6acc71c45ef +Block 0002 [ 22]: 4a3b0beb690d22dc +Block 0002 [ 23]: c4bd5a1b4d874685 +Block 0002 [ 24]: 4eb892c29db734d7 +Block 0002 [ 25]: 682d40abc1e166f4 +Block 0002 [ 26]: 2f78b0124d8e32d7 +Block 0002 [ 27]: 2d2c778215c4ea0c +Block 0002 [ 28]: 6adfd023b9c5f338 +Block 0002 [ 29]: 05db2297aaf11e44 +Block 0002 [ 30]: a0f73a984d9e0238 +Block 0002 [ 31]: 2dd204256a5cb98b +Block 0002 [ 32]: 0ed19af8022fa4c1 +Block 0002 [ 33]: 627728cb1394e70d +Block 0002 [ 34]: 69672f8719e2e5dd +Block 0002 [ 35]: b39ccb2cbead4f2d +Block 0002 [ 36]: b43115927b03a204 +Block 0002 [ 37]: b29801888849ff61 +Block 0002 [ 38]: 2264364d78cf3b02 +Block 0002 [ 39]: f7ba1d0121f6ef7c +Block 0002 [ 40]: fa25d47c97fa15ac +Block 0002 [ 41]: 89d5f89c7be0bb71 +Block 0002 [ 42]: c49cb4541a91cff2 +Block 0002 [ 43]: 874cd8a4985d7834 +Block 0002 [ 44]: c19261e8fcea632c +Block 0002 [ 45]: 5c1502cfccc2fd3f +Block 0002 [ 46]: 2da9a13eda8e52a1 +Block 0002 [ 47]: 02f150e62533f71f +Block 0002 [ 48]: edee37caa7ee96f9 +Block 0002 [ 49]: e4f1a0e7a4b3c668 +Block 0002 [ 50]: fc406148b9820e81 +Block 0002 [ 51]: 61483457659a1799 +Block 0002 [ 52]: 0e1206f1271f31c8 +Block 0002 [ 53]: 3ff4bbc6d461f3ac +Block 0002 [ 54]: 9e90a4737c444a98 +Block 0002 [ 55]: 22842091eb2c29a4 +Block 0002 [ 56]: 1ca1cde6be37047e +Block 0002 [ 57]: f1e25e0707ef49aa +Block 0002 [ 58]: a38d779f21fb8b07 +Block 0002 [ 59]: 74da26b2d7e0d0de +Block 0002 [ 60]: 46940323ba8bef91 +Block 0002 [ 61]: c9847d40fab9bfa0 +Block 0002 [ 62]: a9ccbe9433dbf6b6 +Block 0002 [ 63]: 62d4ee530f84a01e +Block 0002 [ 64]: 5369331cd64476b9 +Block 0002 [ 65]: 71ba63d911ac6a6b +Block 0002 [ 66]: 8cc19167baf65398 +Block 0002 [ 67]: 3fe137a2879f96b4 +Block 0002 [ 68]: 23dfc6dd2b17a041 +Block 0002 [ 69]: fd166bb09127747f +Block 0002 [ 70]: f3af31fbfab8d809 +Block 0002 [ 71]: 1d2ea2a7374e0840 +Block 0002 [ 72]: ac710d268cf4fedf +Block 0002 [ 73]: d6beb900625d1592 +Block 0002 [ 74]: 3b1486fa3ecd52d7 +Block 0002 [ 75]: 5dfd7eb55f80fff5 +Block 0002 [ 76]: c4920a178a657dee +Block 0002 [ 77]: 3063bc7bc258632e +Block 0002 [ 78]: 08c72633ff8367e8 +Block 0002 [ 79]: de6c96890b8211fa +Block 0002 [ 80]: d533e2e5b99f9a89 +Block 0002 [ 81]: 42b6177c238f3592 +Block 0002 [ 82]: 45db675f166d2098 +Block 0002 [ 83]: 1aa0362d889db002 +Block 0002 [ 84]: 5fb5a8a899e7bbcc +Block 0002 [ 85]: ec4a77566773352f +Block 0002 [ 86]: 2809156527466d15 +Block 0002 [ 87]: 2395d97c5e4a147a +Block 0002 [ 88]: b7c8d8a20eb785cf +Block 0002 [ 89]: 55929cfe6fed4017 +Block 0002 [ 90]: 796542310b3a982b +Block 0002 [ 91]: 430a76aedcbd90e8 +Block 0002 [ 92]: 91ca8acd0ac2e067 +Block 0002 [ 93]: 8e50acb8e6952585 +Block 0002 [ 94]: 16df2d074b132b4b +Block 0002 [ 95]: 6ba2c1cefbcd3d32 +Block 0002 [ 96]: 4ca35f90ee6f3c02 +Block 0002 [ 97]: 1f4823f43e7e6f71 +Block 0002 [ 98]: b903b08436d87058 +Block 0002 [ 99]: 38245ec648896e53 +Block 0002 [100]: 14e189a61fd2515a +Block 0002 [101]: ef047f9f62ff6510 +Block 0002 [102]: e72313e49aea7f82 +Block 0002 [103]: 9d9d1757de6992f5 +Block 0002 [104]: ea4e379b2df83c29 +Block 0002 [105]: 4478302ccd041aad +Block 0002 [106]: 4990a52062b9ac3a +Block 0002 [107]: 83a0f64a2dea0624 +Block 0002 [108]: d55acd58d33318fd +Block 0002 [109]: e458ab245697ea63 +Block 0002 [110]: 49d0c9d161371688 +Block 0002 [111]: ea5b74ea5b08df9d +Block 0002 [112]: 1a8c184bdd4c5d10 +Block 0002 [113]: f2f629e6d8394674 +Block 0002 [114]: 220964837a6027fe +Block 0002 [115]: 0bc1a4f85c884971 +Block 0002 [116]: c3f1f53a0ac51dc6 +Block 0002 [117]: 80a8dc394d87d919 +Block 0002 [118]: 6d1280c6a5c91b09 +Block 0002 [119]: eccddb278024b896 +Block 0002 [120]: 52647d0bba74326c +Block 0002 [121]: 7f3932ec89410d41 +Block 0002 [122]: 191c10651d52883e +Block 0002 [123]: 090ec2202a9104ba +Block 0002 [124]: da6067ea0f944450 +Block 0002 [125]: 9c0972bbbc1bf1ae +Block 0002 [126]: 3c76df28bddfe68c +Block 0002 [127]: 0c5f6c7f878eeb0b +Block 0003 [ 0]: 900b4b46200c544c +Block 0003 [ 1]: 615068c6f1fa70ed +Block 0003 [ 2]: 541d13b0280f8175 +Block 0003 [ 3]: 2082941de980cd5a +Block 0003 [ 4]: e8bccb1c26ab9eca +Block 0003 [ 5]: 0eb12abb2cf24ebe +Block 0003 [ 6]: bab6e5aaa8018b20 +Block 0003 [ 7]: 89c0c47763af65c5 +Block 0003 [ 8]: 95a65ab140f1a880 +Block 0003 [ 9]: fa3be1c08532ac8c +Block 0003 [ 10]: abd4a26b5bca2cef +Block 0003 [ 11]: 9508af0ae337fb13 +Block 0003 [ 12]: 13cdb71b243ba1f5 +Block 0003 [ 13]: b8bd7f941f99939b +Block 0003 [ 14]: eedb84a6e3a05437 +Block 0003 [ 15]: ee12d5518952c311 +Block 0003 [ 16]: 8112689e24a4e808 +Block 0003 [ 17]: 7636f3bf1162eacb +Block 0003 [ 18]: a0c0dc2987fd137c +Block 0003 [ 19]: c0ddfb772fca4563 +Block 0003 [ 20]: aae0e0cd7d6ebd31 +Block 0003 [ 21]: b2379a164f186276 +Block 0003 [ 22]: f19ea49023ba40d6 +Block 0003 [ 23]: d105094e90aef0f4 +Block 0003 [ 24]: 7318160321ff1700 +Block 0003 [ 25]: 341d4c2f419d17e0 +Block 0003 [ 26]: 9d0f35e38570b55e +Block 0003 [ 27]: 6bec7aa0ed8e99e2 +Block 0003 [ 28]: c25d45befa00a97f +Block 0003 [ 29]: 88fed968820f8c7a +Block 0003 [ 30]: bd3ba51f94404e43 +Block 0003 [ 31]: 505f67420bf9ff3b +Block 0003 [ 32]: aadc81c468be4ade +Block 0003 [ 33]: d9d04aa55df15541 +Block 0003 [ 34]: a9d4605b808b26ed +Block 0003 [ 35]: 77c0c653d677e5f4 +Block 0003 [ 36]: 66cf4b2c33ba1287 +Block 0003 [ 37]: 2159d8f669619152 +Block 0003 [ 38]: 277494e693e2260c +Block 0003 [ 39]: 6a4efa2a28476fbb +Block 0003 [ 40]: 6d89a658a8eb3a87 +Block 0003 [ 41]: 6643282f4e2e20b7 +Block 0003 [ 42]: 8d73318f6b37ba20 +Block 0003 [ 43]: 7ac12f40ea088cc1 +Block 0003 [ 44]: 039ab18a2301f45e +Block 0003 [ 45]: ee739603d11dd438 +Block 0003 [ 46]: a2d0758ff2bb7b61 +Block 0003 [ 47]: 6f7513923aa239c5 +Block 0003 [ 48]: 479251793a6d48a8 +Block 0003 [ 49]: bbd36f9d5c56e87a +Block 0003 [ 50]: 31f653eaa9248c6c +Block 0003 [ 51]: 59178b13140a219d +Block 0003 [ 52]: f0c95af03d8f1f07 +Block 0003 [ 53]: a0d93bfd437f6a41 +Block 0003 [ 54]: 9921b64737fbc37c +Block 0003 [ 55]: d513001e5cb70077 +Block 0003 [ 56]: e90e86c3875d03f9 +Block 0003 [ 57]: f77c90cb5f773667 +Block 0003 [ 58]: 842c4f09e1d44a70 +Block 0003 [ 59]: 9473717f368e17ef +Block 0003 [ 60]: 2fa7191e160f1367 +Block 0003 [ 61]: 188343023d77c117 +Block 0003 [ 62]: f90ab2a6f3513ddb +Block 0003 [ 63]: ef07e1df547670de +Block 0003 [ 64]: 490a9760f108ceba +Block 0003 [ 65]: e6bba096cca0cc3d +Block 0003 [ 66]: 88afb830cf0d6afc +Block 0003 [ 67]: a24603d655ac3411 +Block 0003 [ 68]: c92928a948c09aaf +Block 0003 [ 69]: 0b235502de082b53 +Block 0003 [ 70]: 68e2d92139a102a1 +Block 0003 [ 71]: db636a19651b1a8f +Block 0003 [ 72]: 55fb8586acbeb7bd +Block 0003 [ 73]: 59ee9cfe10e2852e +Block 0003 [ 74]: 9cfce7017ba9c310 +Block 0003 [ 75]: ce69b85ed419b61d +Block 0003 [ 76]: 8e537f5cd92f07d5 +Block 0003 [ 77]: 0936bcb0af45c502 +Block 0003 [ 78]: addef0747ad3a8b3 +Block 0003 [ 79]: 9f33d7ea62dbaaf0 +Block 0003 [ 80]: cc7c8f4bd3d7277c +Block 0003 [ 81]: 63a72c0deaaeedba +Block 0003 [ 82]: 388eab0b99643af1 +Block 0003 [ 83]: 043e0dbc4e83be89 +Block 0003 [ 84]: 3ff59b09ab580288 +Block 0003 [ 85]: 70e006315ebdd36f +Block 0003 [ 86]: 47539c3896477284 +Block 0003 [ 87]: 0e94787998b6ef6c +Block 0003 [ 88]: be9581f1e03e87c9 +Block 0003 [ 89]: f601b4d2eb8452a9 +Block 0003 [ 90]: d833a7b59bf0ce2e +Block 0003 [ 91]: 636c7c907e257e8c +Block 0003 [ 92]: 9e60534288ef4d3f +Block 0003 [ 93]: 06e24a4afbfe1966 +Block 0003 [ 94]: a583680ac97a5613 +Block 0003 [ 95]: e095788f1dff0b5b +Block 0003 [ 96]: 24dbe8854bbd48d2 +Block 0003 [ 97]: 7319443a645f08f9 +Block 0003 [ 98]: 1cf2b175e298deca +Block 0003 [ 99]: 2d2763dc7e9eda81 +Block 0003 [100]: dc126b0b72b35bf1 +Block 0003 [101]: 93a439b4fd315f79 +Block 0003 [102]: 78d19ab12b8c62e6 +Block 0003 [103]: 6a99a2c98bb11d86 +Block 0003 [104]: 0eb95ec61f83e17d +Block 0003 [105]: 52f93eae017bdcde +Block 0003 [106]: f17fe7695bfab7db +Block 0003 [107]: 383c915348e737f8 +Block 0003 [108]: 7914b38aba5db79c +Block 0003 [109]: d8d1c709cb8f241e +Block 0003 [110]: 294637fa5e5c37ed +Block 0003 [111]: 141f9ef0a4fe5043 +Block 0003 [112]: d8b7cff4b0ee2ad1 +Block 0003 [113]: eecd8ab86cd37c3b +Block 0003 [114]: 687500a2b5b4f93f +Block 0003 [115]: 44d162fe6c806b6e +Block 0003 [116]: 1ec5716982b0455c +Block 0003 [117]: cd14a043b1d36a07 +Block 0003 [118]: 65e6ba21c7bc7a01 +Block 0003 [119]: 75dd70547da224a6 +Block 0003 [120]: 34f11d3e0d8cc470 +Block 0003 [121]: a570799323b61b23 +Block 0003 [122]: b5179a8f90876b2c +Block 0003 [123]: ca8c1f20370d6660 +Block 0003 [124]: b2cc48f3ba63ce4a +Block 0003 [125]: b7d244b86a5bec49 +Block 0003 [126]: 652da4cd7f33df45 +Block 0003 [127]: 428a6992769973ce +Block 0004 [ 0]: 61b02e80b3742763 +Block 0004 [ 1]: 7e4bbe3e73625805 +Block 0004 [ 2]: 9790e6cd9c3c8462 +Block 0004 [ 3]: 1df4ccf80bf227b5 +Block 0004 [ 4]: 4ff867d3cbffcba1 +Block 0004 [ 5]: 95bd5d47bbf4659f +Block 0004 [ 6]: 09a513dbaf9233e3 +Block 0004 [ 7]: f1baabf4d227a53a +Block 0004 [ 8]: e50869ba195d6894 +Block 0004 [ 9]: ff35af7749193c12 +Block 0004 [ 10]: 5e7bc4a2e3ebbe22 +Block 0004 [ 11]: 11b86088eb9621f6 +Block 0004 [ 12]: 86e651a025016040 +Block 0004 [ 13]: 55e06a939610f6a9 +Block 0004 [ 14]: fc2beb0ea89cc482 +Block 0004 [ 15]: c8ad6ac2bae5f83e +Block 0004 [ 16]: 03bc33fff2eb1397 +Block 0004 [ 17]: b5c261acc0f09c2a +Block 0004 [ 18]: 4341b9dbdf7fc906 +Block 0004 [ 19]: 50087675709002b7 +Block 0004 [ 20]: 31b7a5a936823271 +Block 0004 [ 21]: daafcb9b596d616f +Block 0004 [ 22]: 110b5732b99d44e8 +Block 0004 [ 23]: 398968e362e86395 +Block 0004 [ 24]: 504a5d24eaf60bd9 +Block 0004 [ 25]: ac01c13c036ce4ea +Block 0004 [ 26]: 5a78894638c5997d +Block 0004 [ 27]: d036b615e6fad450 +Block 0004 [ 28]: 19590cb7addd10d3 +Block 0004 [ 29]: df16c271a9d2f62f +Block 0004 [ 30]: 77c26a898e5afeb8 +Block 0004 [ 31]: c94fe3300508a570 +Block 0004 [ 32]: 0459cadd307ce63c +Block 0004 [ 33]: a788a865094778af +Block 0004 [ 34]: 87d7fff2870f9b3a +Block 0004 [ 35]: beac32cc09233860 +Block 0004 [ 36]: c742017d94927d64 +Block 0004 [ 37]: 96eb65f7d55dc6b8 +Block 0004 [ 38]: 743f7a221041ffbd +Block 0004 [ 39]: 08770530af9fa225 +Block 0004 [ 40]: a6f3a50f3e197a38 +Block 0004 [ 41]: 412cd2c6a82d7310 +Block 0004 [ 42]: afa426a667e12057 +Block 0004 [ 43]: 5782330a3c19f0b6 +Block 0004 [ 44]: be1c3e6883a0cb0e +Block 0004 [ 45]: 3df0ec64890ea638 +Block 0004 [ 46]: 56288a35cf5aafbf +Block 0004 [ 47]: 55ecfc3aab7211ac +Block 0004 [ 48]: 362fd07efe33163c +Block 0004 [ 49]: 10320ae4802a7e1a +Block 0004 [ 50]: db36f926291f2f23 +Block 0004 [ 51]: bd8ef19f5cb6749a +Block 0004 [ 52]: 362419cdfa58aa47 +Block 0004 [ 53]: 6ccc46d502e8389b +Block 0004 [ 54]: d489a2400b6489ff +Block 0004 [ 55]: 6781ec15707fedbd +Block 0004 [ 56]: b3b2f0f1f23caa08 +Block 0004 [ 57]: 382870e8ab1f2bcb +Block 0004 [ 58]: 00fac8357b77af84 +Block 0004 [ 59]: 1d1bb0ac845b3bb3 +Block 0004 [ 60]: bf88c0aac2057a72 +Block 0004 [ 61]: 5224c313bf757c14 +Block 0004 [ 62]: 9cb8edce4fcd9f3d +Block 0004 [ 63]: ee5b8b3f1b45c6bc +Block 0004 [ 64]: 92941e57904256e2 +Block 0004 [ 65]: 3410ce980b6075cd +Block 0004 [ 66]: 4c2a6351368555d4 +Block 0004 [ 67]: 7192ebc6e89fa9da +Block 0004 [ 68]: ae566e908918769e +Block 0004 [ 69]: 469bdcf0eb62d144 +Block 0004 [ 70]: 7605e6b1f8d0ebe9 +Block 0004 [ 71]: 5ad66be7fc63f10d +Block 0004 [ 72]: 184ae200186ceaba +Block 0004 [ 73]: a2fd668b31a0247e +Block 0004 [ 74]: 6cfa785e22b348f8 +Block 0004 [ 75]: 09b9f880d8d0e434 +Block 0004 [ 76]: 642517279598b38e +Block 0004 [ 77]: cd70e90d7bc4844a +Block 0004 [ 78]: 1cf34c8fbc595a38 +Block 0004 [ 79]: 92d7f6b098188e10 +Block 0004 [ 80]: 9fff24b7d7e875ff +Block 0004 [ 81]: 89fb31a1adecd0ca +Block 0004 [ 82]: 390c984f20f90dd8 +Block 0004 [ 83]: db611b87ccee8357 +Block 0004 [ 84]: d7c03146d2095e03 +Block 0004 [ 85]: 0d673441a5213ee2 +Block 0004 [ 86]: 3bf960e76ad98bf2 +Block 0004 [ 87]: 15ba7ca167b4fc58 +Block 0004 [ 88]: 2f8e1e77cb6059f3 +Block 0004 [ 89]: 230ad60f2c671f48 +Block 0004 [ 90]: c126fbb6f4664282 +Block 0004 [ 91]: bc37cb058c16f1af +Block 0004 [ 92]: 25b5b798646af7b8 +Block 0004 [ 93]: 41660c72b268e9fc +Block 0004 [ 94]: ac7bd5845cdb1ad1 +Block 0004 [ 95]: 9071233c92d8571b +Block 0004 [ 96]: 262c8f321ce0f391 +Block 0004 [ 97]: 3bb8082c589edf4f +Block 0004 [ 98]: 9d995d6561df731c +Block 0004 [ 99]: a68fcc1451a03d2a +Block 0004 [100]: 47ba7944bbd6d890 +Block 0004 [101]: 241167f695259047 +Block 0004 [102]: b3aead0264ffffd1 +Block 0004 [103]: 6c1a163b6c3a5822 +Block 0004 [104]: b03149730b57a7f9 +Block 0004 [105]: e5ba3f27b2107055 +Block 0004 [106]: d2b99238801a8045 +Block 0004 [107]: 4d64f86efc903560 +Block 0004 [108]: 91d8cfea06ed3527 +Block 0004 [109]: d89d6a658d7b6d16 +Block 0004 [110]: 5bdff6f547dd7cf9 +Block 0004 [111]: 68a46fd7b88d76ca +Block 0004 [112]: 7a139992edf32a73 +Block 0004 [113]: d8d8f02739b14a2c +Block 0004 [114]: 4afc51977b857384 +Block 0004 [115]: 593d06a3b1553ab4 +Block 0004 [116]: d21e157f895b9e53 +Block 0004 [117]: c36a81244ef9742a +Block 0004 [118]: acb7d5a719a87b5f +Block 0004 [119]: c81acf2539e71b78 +Block 0004 [120]: cb8b1d5dc9ab6dae +Block 0004 [121]: 40fb035745072ee1 +Block 0004 [122]: 33995806abd29a5b +Block 0004 [123]: 32095e26c80ce6e4 +Block 0004 [124]: 59b15a44c845141d +Block 0004 [125]: bd3f0650de4e7544 +Block 0004 [126]: 9e7a71f80dc928fa +Block 0004 [127]: 15cb1ef5d3503f23 +Block 0005 [ 0]: 2407d195e807548c +Block 0005 [ 1]: ad26e752874ecef7 +Block 0005 [ 2]: 8e956c0210f8a850 +Block 0005 [ 3]: f0823911ea3dc266 +Block 0005 [ 4]: 8ca2efdc25c95c1a +Block 0005 [ 5]: b1b295e6d5938e90 +Block 0005 [ 6]: 61e589e7bc7ee50a +Block 0005 [ 7]: 70f8b036f79e182c +Block 0005 [ 8]: d3b2034f7eb8397e +Block 0005 [ 9]: ed85a59503e729b2 +Block 0005 [ 10]: a59b1e9d7ac407f0 +Block 0005 [ 11]: 18e4697aff4d626e +Block 0005 [ 12]: 48f23c53a192e907 +Block 0005 [ 13]: 0353e7f7a3399bc7 +Block 0005 [ 14]: c20df991d82562c8 +Block 0005 [ 15]: 87e4856a098eff96 +Block 0005 [ 16]: c6609c87275e754e +Block 0005 [ 17]: 648ab718ca0925cf +Block 0005 [ 18]: e8697ef67043a622 +Block 0005 [ 19]: 269e9739151af066 +Block 0005 [ 20]: f770e93308cd4431 +Block 0005 [ 21]: a04fcb290799218f +Block 0005 [ 22]: 59794f1b24bf075b +Block 0005 [ 23]: be22ca6ca634779f +Block 0005 [ 24]: e513bdcc17002a69 +Block 0005 [ 25]: 990138964e16fdab +Block 0005 [ 26]: fcc15a89ed35c704 +Block 0005 [ 27]: 72d582eaac1af2b9 +Block 0005 [ 28]: 967f93d54b867ef4 +Block 0005 [ 29]: 26b2833e0a4acd9f +Block 0005 [ 30]: 879536890775795c +Block 0005 [ 31]: deda9793b9079cbc +Block 0005 [ 32]: 40277ca0d59f9553 +Block 0005 [ 33]: fd363f7c9c4a6785 +Block 0005 [ 34]: f9de8f1d3f2c0e67 +Block 0005 [ 35]: 71369da8fff5907c +Block 0005 [ 36]: bce335eab4d82e69 +Block 0005 [ 37]: 9fc21e6cdd0d1703 +Block 0005 [ 38]: e434cb9db85055b1 +Block 0005 [ 39]: 9d46064ec1920847 +Block 0005 [ 40]: 215478858606f725 +Block 0005 [ 41]: 6f5cebdb2261f718 +Block 0005 [ 42]: 581ec1c91f3d7950 +Block 0005 [ 43]: ec09884a2f860205 +Block 0005 [ 44]: 016e9b7dd3e34056 +Block 0005 [ 45]: ecf6fadac4ec557e +Block 0005 [ 46]: 911fdf83e6dd3f16 +Block 0005 [ 47]: 43e1c6222f494622 +Block 0005 [ 48]: 67ccba4578b4514a +Block 0005 [ 49]: 518530888f2bf6c1 +Block 0005 [ 50]: cab80f10eb75afc7 +Block 0005 [ 51]: c1311903e3e18720 +Block 0005 [ 52]: 24b9703f88280748 +Block 0005 [ 53]: bc46a3e55ea93315 +Block 0005 [ 54]: 2ef89852f18c8127 +Block 0005 [ 55]: af8a0afc790b5578 +Block 0005 [ 56]: 62fb6e62bbc51408 +Block 0005 [ 57]: 867eee397ba52395 +Block 0005 [ 58]: be71ea6f48ab5c12 +Block 0005 [ 59]: 9f69cc05adf942d6 +Block 0005 [ 60]: 83a151c54916331b +Block 0005 [ 61]: 5d3a15c2e8af73f4 +Block 0005 [ 62]: f9f93eb16073140d +Block 0005 [ 63]: 0910cd3454b972f2 +Block 0005 [ 64]: d005e33b360488ce +Block 0005 [ 65]: a736866bbcf4ffca +Block 0005 [ 66]: b28e1240544033f8 +Block 0005 [ 67]: efd0572e93a73dc2 +Block 0005 [ 68]: eca676cca54e0ab7 +Block 0005 [ 69]: 3cee98c6a68f966f +Block 0005 [ 70]: a64b18091a53a60d +Block 0005 [ 71]: a995405e7bae7c46 +Block 0005 [ 72]: 2f78d1dcb0d0b9d1 +Block 0005 [ 73]: 1599269b0c2b7437 +Block 0005 [ 74]: 10aea6df58285014 +Block 0005 [ 75]: eb818d62aef8326c +Block 0005 [ 76]: 2d0dcaf1692efb64 +Block 0005 [ 77]: 5bacab67370fccd0 +Block 0005 [ 78]: 009f834eb54066b0 +Block 0005 [ 79]: 74864cfcea1d792a +Block 0005 [ 80]: 12ac904270b3fc5d +Block 0005 [ 81]: c006df57f8fd380c +Block 0005 [ 82]: 3ef11bbc90a1db48 +Block 0005 [ 83]: 889ef4b880ea6ecb +Block 0005 [ 84]: 4df0d8edb2998f16 +Block 0005 [ 85]: 3244d5eb9c8f6c52 +Block 0005 [ 86]: db58706bfff2bb30 +Block 0005 [ 87]: 8acb6d2afb8d1c9d +Block 0005 [ 88]: 8dd675246a44ed27 +Block 0005 [ 89]: f74402d04b7ec003 +Block 0005 [ 90]: d65b9bad8454198d +Block 0005 [ 91]: 3a797de67bd036be +Block 0005 [ 92]: 276fdd9689e47ba3 +Block 0005 [ 93]: 5f7038a2ab05ed2c +Block 0005 [ 94]: fe99c638c6fd40b7 +Block 0005 [ 95]: e3b66576ea866d69 +Block 0005 [ 96]: 8e71e25e4507d7c7 +Block 0005 [ 97]: 66c0a136a58be7df +Block 0005 [ 98]: ff379f99bf7eff87 +Block 0005 [ 99]: 7efd44f99e27d64e +Block 0005 [100]: 14a4178d8cbceaa0 +Block 0005 [101]: 127f27d7ac910aa2 +Block 0005 [102]: 6d1b02b836d71016 +Block 0005 [103]: 9e3d713b59e00ec2 +Block 0005 [104]: b20d6c08dc20ba5f +Block 0005 [105]: 829c1593f35d8c24 +Block 0005 [106]: dfbc57940e7617f4 +Block 0005 [107]: c9307700a9a945d8 +Block 0005 [108]: e3ffdba608ed4a2b +Block 0005 [109]: e4e0a880030cfd51 +Block 0005 [110]: e82581940a60a73f +Block 0005 [111]: 961f7c02492c8ad0 +Block 0005 [112]: 7b68992d2ec8bfec +Block 0005 [113]: a9ed907126332abe +Block 0005 [114]: 1e9ff58ebb76a6e1 +Block 0005 [115]: 6df86aab244d8840 +Block 0005 [116]: df4e831b85698b17 +Block 0005 [117]: 11207ef7be5bfb12 +Block 0005 [118]: 3f01cfd40c02f939 +Block 0005 [119]: acde7f4b1ef88c4a +Block 0005 [120]: 16ba6e86679b1fc6 +Block 0005 [121]: 0425258ae0bff899 +Block 0005 [122]: dd3f322d634c7ee4 +Block 0005 [123]: facf4e27f9226ef2 +Block 0005 [124]: 5219c0be52c577cb +Block 0005 [125]: 5d75edbd61cfcd91 +Block 0005 [126]: 1e605cef3901869b +Block 0005 [127]: efb73d6caa30c73e +Block 0006 [ 0]: 3ff3a1afd0287ee4 +Block 0006 [ 1]: 8ca4bc3a401187fd +Block 0006 [ 2]: d6deee7adb44fba7 +Block 0006 [ 3]: 8470d1f12ed83a47 +Block 0006 [ 4]: 360da0d7a0ef1a64 +Block 0006 [ 5]: 9445900620a0a602 +Block 0006 [ 6]: 74f4f0bfdfb57627 +Block 0006 [ 7]: a9554312a94fba41 +Block 0006 [ 8]: 440d33dddeb8e7a4 +Block 0006 [ 9]: 1cfeca050ed3777f +Block 0006 [ 10]: 378d6e95e3ba9e2e +Block 0006 [ 11]: c7873bfc22f0b158 +Block 0006 [ 12]: 7615f8f3ea9d5066 +Block 0006 [ 13]: c192d1eace8734c7 +Block 0006 [ 14]: 59001048d79ce77a +Block 0006 [ 15]: 24a85dd3291370d1 +Block 0006 [ 16]: 26015473273796de +Block 0006 [ 17]: 2111331b5d78a152 +Block 0006 [ 18]: 59a673addca8de42 +Block 0006 [ 19]: 01af263b093990d1 +Block 0006 [ 20]: 51164c5ef3541c08 +Block 0006 [ 21]: 1fd97bf87d831222 +Block 0006 [ 22]: 06062501657f1216 +Block 0006 [ 23]: ce7591de5d57b2c6 +Block 0006 [ 24]: 66c5854489d1e428 +Block 0006 [ 25]: 645ef5b210eba0a2 +Block 0006 [ 26]: 1f491e6a4e84ea25 +Block 0006 [ 27]: 7213087c5172a501 +Block 0006 [ 28]: c7b25be9ee141c2b +Block 0006 [ 29]: 9976c16c2781fdba +Block 0006 [ 30]: c29356f98d3db616 +Block 0006 [ 31]: aa386b24200a43dc +Block 0006 [ 32]: fe70bb4bec6b5b41 +Block 0006 [ 33]: 32c2b83189c14540 +Block 0006 [ 34]: a23a4380e66c805b +Block 0006 [ 35]: b8ab5c47ad64932f +Block 0006 [ 36]: 10725e3944caf2cc +Block 0006 [ 37]: f2e966b3dbc19222 +Block 0006 [ 38]: 30e5235f28c74dc7 +Block 0006 [ 39]: b54130ec0ccbec56 +Block 0006 [ 40]: f3625f5da42b7608 +Block 0006 [ 41]: 03ac15b3e4169a49 +Block 0006 [ 42]: 2b6a38cb869b0513 +Block 0006 [ 43]: 2eaeccba916989e2 +Block 0006 [ 44]: 05de41a48fd7b5f3 +Block 0006 [ 45]: 0803930bd83b9dfd +Block 0006 [ 46]: 8f9df1a8fbc17c4f +Block 0006 [ 47]: fec29c915cc85d6f +Block 0006 [ 48]: d59694a63eb621bb +Block 0006 [ 49]: ad0039ddfa6f7c94 +Block 0006 [ 50]: e6c51080e91e2c65 +Block 0006 [ 51]: 9af773fba01cfa91 +Block 0006 [ 52]: d5925d2b89484ba4 +Block 0006 [ 53]: ecf696532e4fdd23 +Block 0006 [ 54]: f0df670517da09bc +Block 0006 [ 55]: ea7e01665a3cf857 +Block 0006 [ 56]: 5bc706445614cb34 +Block 0006 [ 57]: d8c70f6ea4efa21c +Block 0006 [ 58]: 65cece98eb9de6b0 +Block 0006 [ 59]: 034d88bb29152fe2 +Block 0006 [ 60]: 5a87695852af3a27 +Block 0006 [ 61]: c1dc8d2c14ed9a61 +Block 0006 [ 62]: 7085ba9e2f9465e9 +Block 0006 [ 63]: 4f27ca7fc1d5e71b +Block 0006 [ 64]: fb73df4ffb4471c5 +Block 0006 [ 65]: 34ddabe0f1cb85a0 +Block 0006 [ 66]: 722b6f02d3545f03 +Block 0006 [ 67]: 0a58e8a36fddff54 +Block 0006 [ 68]: 2e97d1e015bf2f63 +Block 0006 [ 69]: 776125a3910e5d4f +Block 0006 [ 70]: 729397c1d34cdea8 +Block 0006 [ 71]: 64597d1994f4d652 +Block 0006 [ 72]: d6992e763e6b1840 +Block 0006 [ 73]: 3993b16e66ede21a +Block 0006 [ 74]: a0be3073b4e14898 +Block 0006 [ 75]: f46816ac0e771788 +Block 0006 [ 76]: a46a90f9a7afeccb +Block 0006 [ 77]: fccd118b8fea8bd5 +Block 0006 [ 78]: b54dab5d51abd35b +Block 0006 [ 79]: 547391e2f8849128 +Block 0006 [ 80]: 3419a829cc70d369 +Block 0006 [ 81]: f360b66e6e553ad0 +Block 0006 [ 82]: 4fd56e15625edc4d +Block 0006 [ 83]: c9a47e605b88d954 +Block 0006 [ 84]: 0664eb35ef23db11 +Block 0006 [ 85]: cae0f76f194aa390 +Block 0006 [ 86]: c7dfd32a29944973 +Block 0006 [ 87]: 752bc7b7cf0fcb1b +Block 0006 [ 88]: bfe3dc9327344fcc +Block 0006 [ 89]: 9896372af3cd20ef +Block 0006 [ 90]: 7b4ede0b565b084c +Block 0006 [ 91]: 5b487d697f173dc4 +Block 0006 [ 92]: 1daa7c1f5f228977 +Block 0006 [ 93]: 7a6c2f3b95e1caff +Block 0006 [ 94]: 7f36d68986a0d334 +Block 0006 [ 95]: 200bee502f854de3 +Block 0006 [ 96]: 888eb05b94542d07 +Block 0006 [ 97]: d8351131c91ec207 +Block 0006 [ 98]: 93a9257e9aa1fea1 +Block 0006 [ 99]: e4aa639e529bcd51 +Block 0006 [100]: f399e0dd84eb87d4 +Block 0006 [101]: e30a3a4b710ab0e0 +Block 0006 [102]: 201575d6c8b2cf4c +Block 0006 [103]: 4f2f409fa698e1c6 +Block 0006 [104]: c31d6e53d8ff5c77 +Block 0006 [105]: 2a03c26df00ad954 +Block 0006 [106]: 7bf48d33462027ac +Block 0006 [107]: 69c7a27ac1f42530 +Block 0006 [108]: 5f8655cb9f1caf86 +Block 0006 [109]: c75036252990cd7a +Block 0006 [110]: 836c76f7f654afa3 +Block 0006 [111]: 1f662ad2c72fb72a +Block 0006 [112]: c3193d05baf51ec5 +Block 0006 [113]: be6f4e4e3d55b8f2 +Block 0006 [114]: 6357f734699f9364 +Block 0006 [115]: e010aa2880f76f07 +Block 0006 [116]: c63892677e1ca8d7 +Block 0006 [117]: a97c8af5b70ad709 +Block 0006 [118]: 485e66af8cf92518 +Block 0006 [119]: 3d2554521a20a959 +Block 0006 [120]: ecaad94a70b67b4d +Block 0006 [121]: 28d5edff6ba11007 +Block 0006 [122]: 5203c747cc86bc72 +Block 0006 [123]: 1039392bca8ed32a +Block 0006 [124]: 90e4d2fd2838c6b8 +Block 0006 [125]: 1df342bc30f9e4b3 +Block 0006 [126]: 824417f3d1e2d67a +Block 0006 [127]: 49f96e7286a4e916 +Block 0007 [ 0]: 84354e382811563e +Block 0007 [ 1]: 45743b71925744fc +Block 0007 [ 2]: 3ba51f6da99da397 +Block 0007 [ 3]: e7153d5f0689ff7d +Block 0007 [ 4]: 9a7ea4aa9d5d501c +Block 0007 [ 5]: e602de901d1e0157 +Block 0007 [ 6]: 16809cb4f1197684 +Block 0007 [ 7]: ab2de4cb53458600 +Block 0007 [ 8]: 845c5a7a2bee2d83 +Block 0007 [ 9]: a0745796de1efd92 +Block 0007 [ 10]: 419624f4df71da51 +Block 0007 [ 11]: 76bbe67f53d2c67a +Block 0007 [ 12]: 3539abbbb0b07204 +Block 0007 [ 13]: eb8503675fe3c338 +Block 0007 [ 14]: 1d937c7a62ab6702 +Block 0007 [ 15]: 059a53998e17631f +Block 0007 [ 16]: 6d990f3234b4951a +Block 0007 [ 17]: 4932b85c51c10895 +Block 0007 [ 18]: 0201b22ddd936f3d +Block 0007 [ 19]: a690abdce969b3ff +Block 0007 [ 20]: 07e773ac444aa3af +Block 0007 [ 21]: 6c0eae8430a1ded7 +Block 0007 [ 22]: 5ac933f9d33495c8 +Block 0007 [ 23]: 724fd0a679dbc18e +Block 0007 [ 24]: 8a877920c8ca8eba +Block 0007 [ 25]: 532913359620fe2a +Block 0007 [ 26]: 43722492fb8181c6 +Block 0007 [ 27]: e8ae5979a35787db +Block 0007 [ 28]: b2e7e6fb8f466bb4 +Block 0007 [ 29]: 33647c4c1e55316a +Block 0007 [ 30]: 3d91ecccab5b22e6 +Block 0007 [ 31]: 3184dc8fb3d09ecc +Block 0007 [ 32]: e95ffd2964578bd2 +Block 0007 [ 33]: f794fb50980a42a0 +Block 0007 [ 34]: 028aed107dc68f09 +Block 0007 [ 35]: f4f799b91100aaf2 +Block 0007 [ 36]: b523dd437403fe2e +Block 0007 [ 37]: 0b6a883c2834f238 +Block 0007 [ 38]: 4d1a1e1cf7462f91 +Block 0007 [ 39]: 90467f9adfd369cc +Block 0007 [ 40]: 0737252fe727088d +Block 0007 [ 41]: 036daf3edf06ad86 +Block 0007 [ 42]: 22cea14d595c060b +Block 0007 [ 43]: 313f948ca727d091 +Block 0007 [ 44]: 5699968513387150 +Block 0007 [ 45]: e21ec1b28d52caae +Block 0007 [ 46]: 4f64f523d5fda9a2 +Block 0007 [ 47]: d6d18166064574ee +Block 0007 [ 48]: 783f5c64134a8883 +Block 0007 [ 49]: b29e30cc712b31b9 +Block 0007 [ 50]: 95f12fbfae39c0bf +Block 0007 [ 51]: fda076c8d35ae9fc +Block 0007 [ 52]: b82f473fc8631979 +Block 0007 [ 53]: 4f6970787ac503de +Block 0007 [ 54]: cadff9d6e5647f89 +Block 0007 [ 55]: 4a831039e1f31433 +Block 0007 [ 56]: ade6d8cd941f47ea +Block 0007 [ 57]: f88ae33e5050d752 +Block 0007 [ 58]: 799c3b44d09fd711 +Block 0007 [ 59]: 8e4011e1f5c0bf7f +Block 0007 [ 60]: f3beb9b4b5e9eecc +Block 0007 [ 61]: 463050ab643a76bb +Block 0007 [ 62]: a5ff9886a55515ed +Block 0007 [ 63]: 32d4cc9d0768f0f5 +Block 0007 [ 64]: e5e9367d6dbfb5df +Block 0007 [ 65]: 9bf89cf290ebd025 +Block 0007 [ 66]: b9dc0ca9a6066c11 +Block 0007 [ 67]: d9e6a7a7d1549407 +Block 0007 [ 68]: 708b02a53354d50d +Block 0007 [ 69]: fcd4038bd4ed92e4 +Block 0007 [ 70]: 879afb895a5562ac +Block 0007 [ 71]: f84b300e452230e8 +Block 0007 [ 72]: 1e056e1eb0df87eb +Block 0007 [ 73]: a4f406ae37a5bfb0 +Block 0007 [ 74]: cfd6acf7f684477c +Block 0007 [ 75]: 9a0c3bd9bfa97762 +Block 0007 [ 76]: 7dc2fd0cf9c1698f +Block 0007 [ 77]: 5a6803439aa62d7c +Block 0007 [ 78]: a300c3f035c0a906 +Block 0007 [ 79]: 7d93e3df4d332583 +Block 0007 [ 80]: 9f0a41eb6cf81aa3 +Block 0007 [ 81]: 090d4d5491402f2f +Block 0007 [ 82]: db71454163e4d82f +Block 0007 [ 83]: f280fbe4abd57828 +Block 0007 [ 84]: 7ba860252f9fca17 +Block 0007 [ 85]: 8f97f52ff384b305 +Block 0007 [ 86]: a5ac80ed19180eac +Block 0007 [ 87]: 4271fc976d660442 +Block 0007 [ 88]: 7ffbac72edba0eb4 +Block 0007 [ 89]: 2507d3a8c064829f +Block 0007 [ 90]: ae63553febe76e59 +Block 0007 [ 91]: 5f980ae5b5d227c6 +Block 0007 [ 92]: 6c6e292330408622 +Block 0007 [ 93]: 86ff7aa8e27fe84f +Block 0007 [ 94]: 191145bd78a49426 +Block 0007 [ 95]: 5245342b117c9e22 +Block 0007 [ 96]: 639aa498da7959b9 +Block 0007 [ 97]: a8ab257350cd755b +Block 0007 [ 98]: 2a865d9545a18b9a +Block 0007 [ 99]: 03253d93314b53a9 +Block 0007 [100]: 8253d22ddb5d6bec +Block 0007 [101]: b6e36234dad1aba7 +Block 0007 [102]: 68830cbc1c67cc2b +Block 0007 [103]: 3329e21d4d26fe24 +Block 0007 [104]: c12e237cc006fac7 +Block 0007 [105]: 10cd1052f800660c +Block 0007 [106]: d21a79dfe11e09e1 +Block 0007 [107]: 1e13955a2b50bce6 +Block 0007 [108]: 9f49277660c9eae2 +Block 0007 [109]: 6404ee69235748b8 +Block 0007 [110]: 91fe5838faba8e93 +Block 0007 [111]: 92edcd3e257759b3 +Block 0007 [112]: 7f2b1a31c0f364b0 +Block 0007 [113]: 09f0b9b566fd7e16 +Block 0007 [114]: e36832a08f2aa2af +Block 0007 [115]: 1305d3b423f27290 +Block 0007 [116]: b98b05f6f4ada98e +Block 0007 [117]: fe4b59fea117a0cc +Block 0007 [118]: e32a71359fc93132 +Block 0007 [119]: d623901ca1f81d14 +Block 0007 [120]: 5a81370130e84352 +Block 0007 [121]: b426f6c7233c9577 +Block 0007 [122]: e437e7ab8d1b79dc +Block 0007 [123]: 90588535ecf2e177 +Block 0007 [124]: 915c2947d730404e +Block 0007 [125]: 3afc9bc412d60ec7 +Block 0007 [126]: 52968dd0d114c6fd +Block 0007 [127]: 349bf7ebd16f7787 +Block 0008 [ 0]: a4adfe4d99910cf4 +Block 0008 [ 1]: c351bfb2ad7543fc +Block 0008 [ 2]: ab7df1fb899a8162 +Block 0008 [ 3]: 84a70a38b48d6841 +Block 0008 [ 4]: 8cf53bd5d8be66b2 +Block 0008 [ 5]: fb54f442f6eb52b8 +Block 0008 [ 6]: 88adf1690f5ec2ed +Block 0008 [ 7]: 41380e64b80584c9 +Block 0008 [ 8]: 3d4641ace2233214 +Block 0008 [ 9]: ffa746589d1272b4 +Block 0008 [ 10]: 2725655f6415ce90 +Block 0008 [ 11]: 04be018f0b904cf9 +Block 0008 [ 12]: 5384ff540a51785f +Block 0008 [ 13]: 666d47030ccbde5e +Block 0008 [ 14]: f213da828329e2f0 +Block 0008 [ 15]: 75f9c65103f5f46c +Block 0008 [ 16]: e2ae9c2ee2f4816c +Block 0008 [ 17]: 52e1c215442ecfcf +Block 0008 [ 18]: 9cfb83358ca0ec12 +Block 0008 [ 19]: 8a5b5cc7efc4a9ac +Block 0008 [ 20]: 6a19c286f0a8c950 +Block 0008 [ 21]: 30177985adb92f43 +Block 0008 [ 22]: 20424653cddc8ff3 +Block 0008 [ 23]: 9e4c2cd726e699d5 +Block 0008 [ 24]: 88eee79981120ff7 +Block 0008 [ 25]: f57cb3fe062a3966 +Block 0008 [ 26]: 4aaf82b7910e692d +Block 0008 [ 27]: 1cb38ac0c88552e0 +Block 0008 [ 28]: b79d8c8cd58a1d65 +Block 0008 [ 29]: db54e9d4af253bdd +Block 0008 [ 30]: c1b223dbd47298d9 +Block 0008 [ 31]: 9b3d45d10d3c1d55 +Block 0008 [ 32]: ea124c969e5bc7a9 +Block 0008 [ 33]: 3980294920c96453 +Block 0008 [ 34]: 8f78b5e306f50322 +Block 0008 [ 35]: 4b3d1b73f5c51af2 +Block 0008 [ 36]: d4838a6dbf5a9c58 +Block 0008 [ 37]: 73d5ccd5a3f0051f +Block 0008 [ 38]: bad7923df6b64217 +Block 0008 [ 39]: cbc27176d94d8498 +Block 0008 [ 40]: 1bd98448f65a8b40 +Block 0008 [ 41]: 68046fcd71bdbed8 +Block 0008 [ 42]: 324abd87c40e8445 +Block 0008 [ 43]: 959a955259823db0 +Block 0008 [ 44]: 2048e1d260ea23d2 +Block 0008 [ 45]: 057b0df5e8d5e41a +Block 0008 [ 46]: f258852b6cf19613 +Block 0008 [ 47]: 50062fb8f780806e +Block 0008 [ 48]: 30547b8f4794d029 +Block 0008 [ 49]: 012c05500a35cde0 +Block 0008 [ 50]: 92f444164303e83f +Block 0008 [ 51]: 1672d08bf96d6f0e +Block 0008 [ 52]: f6a0ded2c321e7e4 +Block 0008 [ 53]: 320b4bffaae2630a +Block 0008 [ 54]: 3be9b3af44cef7fa +Block 0008 [ 55]: 4a7e4f662cd9e95c +Block 0008 [ 56]: 5960721992ad56b6 +Block 0008 [ 57]: dcd75636e45c61c1 +Block 0008 [ 58]: aab8dae08205ab21 +Block 0008 [ 59]: ebc5255b469a3007 +Block 0008 [ 60]: 9f3d591c663d9fbf +Block 0008 [ 61]: 3d2c288bcff83b4f +Block 0008 [ 62]: 06cc6f2c6628cdfe +Block 0008 [ 63]: 87550de6e0e963a2 +Block 0008 [ 64]: 23c6f424e3e75f4d +Block 0008 [ 65]: 8b9f92a37e9e0344 +Block 0008 [ 66]: d868b102a5d6b48d +Block 0008 [ 67]: 8447e4e667c0f561 +Block 0008 [ 68]: 3b744353d55d66b4 +Block 0008 [ 69]: 85a405846a2b4b86 +Block 0008 [ 70]: 83608220e4b3e470 +Block 0008 [ 71]: 55ee0e8c99df68e4 +Block 0008 [ 72]: b67848f9d16ec6c7 +Block 0008 [ 73]: 91fa8ec5b14a0193 +Block 0008 [ 74]: 5fb3f547492c3bfe +Block 0008 [ 75]: 99aa6950926c7bbb +Block 0008 [ 76]: 2868d23e0f3ba62c +Block 0008 [ 77]: 54a21971a3e6da83 +Block 0008 [ 78]: a7983f5690608187 +Block 0008 [ 79]: eda562b615edd8d0 +Block 0008 [ 80]: b143f81d4b57824b +Block 0008 [ 81]: 74989288dffa4df4 +Block 0008 [ 82]: 9dc7eb0a82f1d679 +Block 0008 [ 83]: 7fd6bc8054abd40f +Block 0008 [ 84]: 4a48ff43f5bc9a80 +Block 0008 [ 85]: 082ecbf4328c43b2 +Block 0008 [ 86]: 2e62efd01a152b8c +Block 0008 [ 87]: 9af6685e941965cc +Block 0008 [ 88]: 5ea16be4325897b4 +Block 0008 [ 89]: a3e786beb9ecac26 +Block 0008 [ 90]: 46373672e4bcaf5b +Block 0008 [ 91]: 1b37a65c3723de2b +Block 0008 [ 92]: 02d2cbcdf3b176a6 +Block 0008 [ 93]: cf60c07520e43204 +Block 0008 [ 94]: a9dd60666862b745 +Block 0008 [ 95]: d19216d3b85289b2 +Block 0008 [ 96]: a9d0aabe8fb0372c +Block 0008 [ 97]: be4b2f13878b6352 +Block 0008 [ 98]: 34e617f56db7b896 +Block 0008 [ 99]: d4805ff266e25b86 +Block 0008 [100]: 1a5a5256713b4124 +Block 0008 [101]: 86522d688fdd84bd +Block 0008 [102]: 7aa5fd0f76300aa4 +Block 0008 [103]: a8d4aa55e2b89413 +Block 0008 [104]: 0a998b3dc3bf2286 +Block 0008 [105]: 23b251906b5d1e24 +Block 0008 [106]: 21343137b70583fb +Block 0008 [107]: cc7d731a0ce049fb +Block 0008 [108]: d9832268500fba4c +Block 0008 [109]: cd23dae93244b015 +Block 0008 [110]: 97d872af6b818e31 +Block 0008 [111]: 50334b1da8bc7bcc +Block 0008 [112]: 2e490372855964ab +Block 0008 [113]: f982b1ac2b70bcb6 +Block 0008 [114]: d2bc8ddd5b404223 +Block 0008 [115]: 662e20f88734c872 +Block 0008 [116]: 3a803c69c553cc66 +Block 0008 [117]: ee233774c332dfc5 +Block 0008 [118]: e2e869ba8cdc3903 +Block 0008 [119]: e1664fc0d03b347b +Block 0008 [120]: ad772ab8bc1bf39c +Block 0008 [121]: 08dcd88f94d043f1 +Block 0008 [122]: 9fe0e02801d766f7 +Block 0008 [123]: 97308e7df7cfdadf +Block 0008 [124]: 49652ba3d55c20cf +Block 0008 [125]: 90e173da7f1ed0bc +Block 0008 [126]: cf9ed0890c4db7bc +Block 0008 [127]: 7e19886a294ac8db +Block 0009 [ 0]: 09f17821e07e1488 +Block 0009 [ 1]: 0554c6983ae28b5d +Block 0009 [ 2]: 8ee2caa35450bbad +Block 0009 [ 3]: 01c4a311d85f2003 +Block 0009 [ 4]: 47abed6fae824a3a +Block 0009 [ 5]: dab8aa500bb36756 +Block 0009 [ 6]: 3c423358682ce690 +Block 0009 [ 7]: fc56cd8481c94c36 +Block 0009 [ 8]: 9bcd7052c2c57813 +Block 0009 [ 9]: 3176b04677072ef9 +Block 0009 [ 10]: 0e40514b0f205bc4 +Block 0009 [ 11]: 5cfaf5cda95b5e0a +Block 0009 [ 12]: 9178402699e0f83c +Block 0009 [ 13]: 6352ff0713d6ece0 +Block 0009 [ 14]: 5b51c880851011ce +Block 0009 [ 15]: d70b2cbcb65a0f17 +Block 0009 [ 16]: 0bf009b67d4c8d93 +Block 0009 [ 17]: 6b1aafe855552a0a +Block 0009 [ 18]: e5eec0f59e9b4d80 +Block 0009 [ 19]: f90e33441caf7aca +Block 0009 [ 20]: f214ea315a60a5f6 +Block 0009 [ 21]: 0fd7c5216bc8ebed +Block 0009 [ 22]: 9722d73114abecbc +Block 0009 [ 23]: e009b1ef945a8936 +Block 0009 [ 24]: db081479f27340b0 +Block 0009 [ 25]: e2de9dffd79edb4e +Block 0009 [ 26]: 2cc6c9f0fd511465 +Block 0009 [ 27]: 3b5333ee1d8a2224 +Block 0009 [ 28]: 44e8af9a7430f239 +Block 0009 [ 29]: 9750f732ae9076a0 +Block 0009 [ 30]: 36b3884c52b1af6e +Block 0009 [ 31]: e348d29ed7a38013 +Block 0009 [ 32]: 19f6e8d1091eabbf +Block 0009 [ 33]: fb504d067a79ee87 +Block 0009 [ 34]: dc0ba069d7b9931a +Block 0009 [ 35]: 1709287edac154ce +Block 0009 [ 36]: d2617168f799c765 +Block 0009 [ 37]: bee76e43b816db93 +Block 0009 [ 38]: 08220ebdd94c3483 +Block 0009 [ 39]: e4c3aeba402c8638 +Block 0009 [ 40]: d860d8f3168e0eb6 +Block 0009 [ 41]: 8c706849ef5d2401 +Block 0009 [ 42]: 6d4c71aaaf0a530a +Block 0009 [ 43]: 6d1bc6e62a4c7a30 +Block 0009 [ 44]: 726e724258001102 +Block 0009 [ 45]: 380d272cdda1e903 +Block 0009 [ 46]: 9847d7ed2c1c338f +Block 0009 [ 47]: a200ae61c442cc25 +Block 0009 [ 48]: 815db01a7abec286 +Block 0009 [ 49]: fba18c65c3a93858 +Block 0009 [ 50]: fcf116b5e2222869 +Block 0009 [ 51]: 7508f3f16631617c +Block 0009 [ 52]: b52195f06b14bdf0 +Block 0009 [ 53]: 8a06e98b5b5b613a +Block 0009 [ 54]: 49422e71e2234817 +Block 0009 [ 55]: 8de98eea443a260c +Block 0009 [ 56]: 5136fc901d80e8f3 +Block 0009 [ 57]: a8c7dbb57a73b022 +Block 0009 [ 58]: ba64ee6d819d2f3f +Block 0009 [ 59]: 13b3e12f58c43960 +Block 0009 [ 60]: 48192ef6f55be023 +Block 0009 [ 61]: c04ec3cea66c260c +Block 0009 [ 62]: eaf4df200430c2c4 +Block 0009 [ 63]: c1330fc0dda60a8f +Block 0009 [ 64]: e2c7288214e2c0b9 +Block 0009 [ 65]: 45445f674fc36f02 +Block 0009 [ 66]: 399650904d856e33 +Block 0009 [ 67]: 6f521e3ce0776e50 +Block 0009 [ 68]: 90c29418e38f5286 +Block 0009 [ 69]: 33539205795b2e63 +Block 0009 [ 70]: aa12f6a11f38ef2c +Block 0009 [ 71]: 19e8c3ee38fca760 +Block 0009 [ 72]: 9915a4b915d55aef +Block 0009 [ 73]: c9378ab272fc0be3 +Block 0009 [ 74]: 9d6658d8a490556d +Block 0009 [ 75]: 8ac8734763fcf96a +Block 0009 [ 76]: 958fc74e8fe74cb5 +Block 0009 [ 77]: ff88ff2708eaccad +Block 0009 [ 78]: 340b5e67653d2214 +Block 0009 [ 79]: d1518d5a212ed742 +Block 0009 [ 80]: f6035f27a7435d1c +Block 0009 [ 81]: 3df889579023879e +Block 0009 [ 82]: bc2cb961e5e0cd29 +Block 0009 [ 83]: 06844112e407e60b +Block 0009 [ 84]: 598dc02a9a0428b9 +Block 0009 [ 85]: ca1cf5e0d56f7662 +Block 0009 [ 86]: 26db48300084fa3c +Block 0009 [ 87]: 575426242bc7e8a0 +Block 0009 [ 88]: 32982bb40322f4f2 +Block 0009 [ 89]: 8e24407528115daf +Block 0009 [ 90]: 956edfaf67d87ae3 +Block 0009 [ 91]: 1b2f925a514bcc53 +Block 0009 [ 92]: b3355bd8dda18359 +Block 0009 [ 93]: a44ea31b9e7b6365 +Block 0009 [ 94]: 9a31090deb917e2a +Block 0009 [ 95]: 0bacdf86671a9864 +Block 0009 [ 96]: 157ea61ef1e8b98e +Block 0009 [ 97]: a3b2090dcdaed2c6 +Block 0009 [ 98]: 9a894301b2305c71 +Block 0009 [ 99]: e39b034c47a9c2cb +Block 0009 [100]: 19f37631d9364cc9 +Block 0009 [101]: 482137d0abe23a00 +Block 0009 [102]: f74577849b6b85b3 +Block 0009 [103]: d4b3699288d88fbe +Block 0009 [104]: 24e2f75d49900d15 +Block 0009 [105]: d03357e4681ffbe6 +Block 0009 [106]: 3bf863ce22c7b264 +Block 0009 [107]: 09e48b1c12a8e22a +Block 0009 [108]: 5ecedc63d6d4fdae +Block 0009 [109]: d4152d6ad81f7f49 +Block 0009 [110]: ec521ae1d465e34d +Block 0009 [111]: 1cf63c849f966159 +Block 0009 [112]: bbe8f99053e9c272 +Block 0009 [113]: 22c8313fcdf6dd2b +Block 0009 [114]: 5a33b67ef927a384 +Block 0009 [115]: 45eb429e89648b5e +Block 0009 [116]: 6a70eebb130273bb +Block 0009 [117]: 279d1b9a1c92987a +Block 0009 [118]: 8e87f531707bad10 +Block 0009 [119]: e28fb73bc2645dcb +Block 0009 [120]: e101cbcb663ae481 +Block 0009 [121]: e13638603439422f +Block 0009 [122]: 31ab2be0b269b032 +Block 0009 [123]: 94ed21ee47b10cad +Block 0009 [124]: f870cdcc24169da9 +Block 0009 [125]: 36d7d00fdf82170d +Block 0009 [126]: 3803dacdc76a154e +Block 0009 [127]: 977e4fa3ffa1fce6 +Block 0010 [ 0]: 2cd2736a0c31ac9d +Block 0010 [ 1]: dcc65d317a7255b8 +Block 0010 [ 2]: d0b0e18c3e5a8ced +Block 0010 [ 3]: 472d60d4c41fa394 +Block 0010 [ 4]: 6f37e1f6c0e9cfb4 +Block 0010 [ 5]: d5d419fe7c4458a5 +Block 0010 [ 6]: 5fca139c0b7b7e73 +Block 0010 [ 7]: 3580da18ec70231e +Block 0010 [ 8]: d33560fda3ebfb80 +Block 0010 [ 9]: 43ecf3f017da5852 +Block 0010 [ 10]: 42875a570ead27c0 +Block 0010 [ 11]: a34885ed7ee14e47 +Block 0010 [ 12]: 7d6d2f6dcb52a0c2 +Block 0010 [ 13]: 784941bde6ce9680 +Block 0010 [ 14]: caf67a8b7846409b +Block 0010 [ 15]: 0626914ae112efce +Block 0010 [ 16]: aea97d1be487d29c +Block 0010 [ 17]: 74db6aa3ab481fde +Block 0010 [ 18]: b75f913dc34d0736 +Block 0010 [ 19]: 276708b32e055bef +Block 0010 [ 20]: c13113ed4225fdcd +Block 0010 [ 21]: 25f85027d97a3a99 +Block 0010 [ 22]: bde953054d7c7005 +Block 0010 [ 23]: 6efb2749e94eb5f1 +Block 0010 [ 24]: b24b2abb0bd4d463 +Block 0010 [ 25]: 965b9abee3eec977 +Block 0010 [ 26]: 4fc350cecc888839 +Block 0010 [ 27]: d46aed5e86aee3a5 +Block 0010 [ 28]: eeb73b706839f597 +Block 0010 [ 29]: 54e359783ca6afcb +Block 0010 [ 30]: 07981e7399d2a1e4 +Block 0010 [ 31]: 3f6a165af1041a1a +Block 0010 [ 32]: 9211fb454c73bee6 +Block 0010 [ 33]: 54601d385755903a +Block 0010 [ 34]: cbe9cd78be150f78 +Block 0010 [ 35]: 71dd09ef23a29059 +Block 0010 [ 36]: 076ea4fd1ca5e7bf +Block 0010 [ 37]: 878b5d6b4b5e4f24 +Block 0010 [ 38]: 30dbe4a9a1fee881 +Block 0010 [ 39]: eab7308f1f869ef9 +Block 0010 [ 40]: f166aa28a9230046 +Block 0010 [ 41]: e0a76678b27c054e +Block 0010 [ 42]: 4214eb3dbe411aab +Block 0010 [ 43]: 7f1f277a3838c0bb +Block 0010 [ 44]: a1c1fbad31bf29bc +Block 0010 [ 45]: df12890cbd39bb6b +Block 0010 [ 46]: ad1db3698cbb8a59 +Block 0010 [ 47]: 5d19cf1c7323e374 +Block 0010 [ 48]: f027c256ee46d7a9 +Block 0010 [ 49]: 931057e2d0031fc0 +Block 0010 [ 50]: abae826e0949155a +Block 0010 [ 51]: 12b61077f83a110e +Block 0010 [ 52]: a441fb7eb8bded8f +Block 0010 [ 53]: eafca6ccb9ca3b45 +Block 0010 [ 54]: d21d577c96969983 +Block 0010 [ 55]: 84ca9a33efb36cc3 +Block 0010 [ 56]: 4b7aab67b2056e06 +Block 0010 [ 57]: 5f5c3987109e8148 +Block 0010 [ 58]: 5ac22f97baac7ee6 +Block 0010 [ 59]: ccde1c3d416b0a2b +Block 0010 [ 60]: d058c4af79ae2615 +Block 0010 [ 61]: e7cf10480cc90823 +Block 0010 [ 62]: 423f4c0f01616a13 +Block 0010 [ 63]: 5dfbcaf113167b33 +Block 0010 [ 64]: 7246e0389e71b4be +Block 0010 [ 65]: e5ed12c82501482c +Block 0010 [ 66]: b76896f90ab7ca0a +Block 0010 [ 67]: d64da0fa30ddb24f +Block 0010 [ 68]: c576b92ebf881110 +Block 0010 [ 69]: 7f95954959d11974 +Block 0010 [ 70]: 2ab42627d90c8ba2 +Block 0010 [ 71]: 40547841497f36f8 +Block 0010 [ 72]: eb3f2ad272f78ec1 +Block 0010 [ 73]: 22b73352e10f41ae +Block 0010 [ 74]: 90d25ab70e6314c6 +Block 0010 [ 75]: 23a3e76a227e11ba +Block 0010 [ 76]: a29fdd5f72e3706b +Block 0010 [ 77]: 0062d09724e9f921 +Block 0010 [ 78]: ff10f4c4b92fc872 +Block 0010 [ 79]: 6d032244533214f8 +Block 0010 [ 80]: ebaa8e53dbb544e9 +Block 0010 [ 81]: 3dfcfb35ce8415fc +Block 0010 [ 82]: a1db26743136be25 +Block 0010 [ 83]: 08da5ebe546aa00a +Block 0010 [ 84]: 328ff22d9350a5b0 +Block 0010 [ 85]: c90d2a256453e3c7 +Block 0010 [ 86]: c20d55b299a46cc3 +Block 0010 [ 87]: 76f774e1da4ed025 +Block 0010 [ 88]: 9d16640a64b2a68d +Block 0010 [ 89]: 49c4888454b71b63 +Block 0010 [ 90]: 68877f13347ae22a +Block 0010 [ 91]: 6e4c2912cc08f132 +Block 0010 [ 92]: d782009fb171ef5f +Block 0010 [ 93]: 55a323816326dec3 +Block 0010 [ 94]: 49ef50ca0e06e7fb +Block 0010 [ 95]: f121a1f5e771d82a +Block 0010 [ 96]: e1674249ba7eb13f +Block 0010 [ 97]: a4e34d3547a55437 +Block 0010 [ 98]: 1efabf15dd59ca9e +Block 0010 [ 99]: 38035e0f6d953c25 +Block 0010 [100]: 61c54328b018e179 +Block 0010 [101]: 5c8acc1033e41bd7 +Block 0010 [102]: cb0590ec61f7547f +Block 0010 [103]: f16395274831b1d4 +Block 0010 [104]: 2cd896877bc900c9 +Block 0010 [105]: 6e89957d98c368db +Block 0010 [106]: 1bde150709223401 +Block 0010 [107]: f53b7684c366a59a +Block 0010 [108]: 05f7a3c51c6fa561 +Block 0010 [109]: 1c79ecc5c88f4294 +Block 0010 [110]: 43401ccb858beb97 +Block 0010 [111]: b1ff788ac449a9bc +Block 0010 [112]: afc78a2a7b2f8df7 +Block 0010 [113]: 5c4be1d58dcb21d6 +Block 0010 [114]: fbf8923851ea390f +Block 0010 [115]: ad469cac1beb1c25 +Block 0010 [116]: 440f0a4b28b9857c +Block 0010 [117]: 2237d018e37b09cc +Block 0010 [118]: 04e3b98e10c07b8d +Block 0010 [119]: 40cc39ec5451fd13 +Block 0010 [120]: 9ddda8cba4ba5cca +Block 0010 [121]: 1780b1d3fc89c520 +Block 0010 [122]: 41a26a9570784453 +Block 0010 [123]: 294f98302d4dcb1f +Block 0010 [124]: a738b915d18269f7 +Block 0010 [125]: 31ca696d21c1e964 +Block 0010 [126]: 262a41789e59e5e8 +Block 0010 [127]: 6ec7d6dba9d819a1 +Block 0011 [ 0]: 0f6421dd331b68b8 +Block 0011 [ 1]: 9413d7c0380a4d33 +Block 0011 [ 2]: 6b45410505eff308 +Block 0011 [ 3]: a6f16907b9695bb4 +Block 0011 [ 4]: aa1748d117d465d1 +Block 0011 [ 5]: 01f4898f474f9d23 +Block 0011 [ 6]: 75723750b635c9ac +Block 0011 [ 7]: af079cf715419ac9 +Block 0011 [ 8]: aa83ee3d9d07606d +Block 0011 [ 9]: 4747e13ef6d298bf +Block 0011 [ 10]: 20a2ade15d33fc37 +Block 0011 [ 11]: 42e60057b83fb44e +Block 0011 [ 12]: ee98b76ec63deffc +Block 0011 [ 13]: 419e5830efe4e409 +Block 0011 [ 14]: 76b6283fdc169e13 +Block 0011 [ 15]: 46e3a31e70abd7cf +Block 0011 [ 16]: c884f047bad0bf39 +Block 0011 [ 17]: 791c979423d7c3a2 +Block 0011 [ 18]: 9782203d7c5362c1 +Block 0011 [ 19]: 061473dc9597fdb4 +Block 0011 [ 20]: 5b1ea358780aaa6b +Block 0011 [ 21]: d299edc50d5d3e96 +Block 0011 [ 22]: 060bb17f50a3894d +Block 0011 [ 23]: 6310b765febd6abc +Block 0011 [ 24]: 6e1ea1dc10032c2b +Block 0011 [ 25]: 650e5f41f0f2a992 +Block 0011 [ 26]: 86b0974ac30a726e +Block 0011 [ 27]: 8e07f730a4d9fb09 +Block 0011 [ 28]: b298d0f2abc1e051 +Block 0011 [ 29]: 1c97e22a82872845 +Block 0011 [ 30]: 3c7afb67a01d9fbf +Block 0011 [ 31]: f97947fe02896866 +Block 0011 [ 32]: 64ddd9338e040673 +Block 0011 [ 33]: ca32b60af15430d0 +Block 0011 [ 34]: ac82cf7952571c60 +Block 0011 [ 35]: e49b241ed1479725 +Block 0011 [ 36]: 94d8bd284469e7f4 +Block 0011 [ 37]: 3cd12e6ac8f2908d +Block 0011 [ 38]: 86b4b6a7ee8cb8ea +Block 0011 [ 39]: 66ac6958355ce1cd +Block 0011 [ 40]: f0386d92899099d0 +Block 0011 [ 41]: ae778abc76351811 +Block 0011 [ 42]: 1debb933e04038ee +Block 0011 [ 43]: d2c247b52435f51d +Block 0011 [ 44]: f472cc4452e1ba9d +Block 0011 [ 45]: 715d658a7579e3b6 +Block 0011 [ 46]: 3468752ad88c0800 +Block 0011 [ 47]: 5d734fd451962958 +Block 0011 [ 48]: 8f3cae63cc94fbd1 +Block 0011 [ 49]: 0ed93eeb2a695b7f +Block 0011 [ 50]: 538bff2fe68fb26d +Block 0011 [ 51]: 535f13594389cc58 +Block 0011 [ 52]: 016c66a1fa857ada +Block 0011 [ 53]: 8167376a56a3ffe8 +Block 0011 [ 54]: 05d622a6c5d7ccc4 +Block 0011 [ 55]: 99582c4d66b60ec5 +Block 0011 [ 56]: 8eefee640a12d44c +Block 0011 [ 57]: 0d65ce7b71a01dbd +Block 0011 [ 58]: 68c10cdeb6fb7df3 +Block 0011 [ 59]: 427cf7bd7b9d8de3 +Block 0011 [ 60]: 81a91f6e0691e347 +Block 0011 [ 61]: 25bdf7508bdff3eb +Block 0011 [ 62]: 8921ddc40ad9116a +Block 0011 [ 63]: c3b1b8a27d0f423d +Block 0011 [ 64]: ccdbdc89c8597ada +Block 0011 [ 65]: ecb2e8b2e7a8029a +Block 0011 [ 66]: 1bf60102f57e1d60 +Block 0011 [ 67]: c83a409a09df2a59 +Block 0011 [ 68]: 42651a751bd12911 +Block 0011 [ 69]: c61a61ba19ef7d31 +Block 0011 [ 70]: 4350de115dfc549e +Block 0011 [ 71]: 53029cf951569652 +Block 0011 [ 72]: e6596db8f557adc6 +Block 0011 [ 73]: e3e97f2eb8d1f70d +Block 0011 [ 74]: 373826b668131e1d +Block 0011 [ 75]: 741d95fcdb504062 +Block 0011 [ 76]: 2d8f911340f42f6a +Block 0011 [ 77]: 4474f5c71c4bc0fb +Block 0011 [ 78]: b4c4237d4433fb15 +Block 0011 [ 79]: ad8293c1e42fb43f +Block 0011 [ 80]: ed72954da0ad7fdf +Block 0011 [ 81]: e3ae9b0886c8d0b0 +Block 0011 [ 82]: 48d24c36990ec552 +Block 0011 [ 83]: 7f4da5fc0275065d +Block 0011 [ 84]: 2c1b31339565a745 +Block 0011 [ 85]: 616eedeac31c2781 +Block 0011 [ 86]: 6d468bbf6faf2dd9 +Block 0011 [ 87]: 59f69b71c6b459d9 +Block 0011 [ 88]: 783e7a635929d6e9 +Block 0011 [ 89]: 87bb13d51620b4c0 +Block 0011 [ 90]: 861e265d55e3b85e +Block 0011 [ 91]: 237cbd385ffd69a1 +Block 0011 [ 92]: 7babcd805ad96950 +Block 0011 [ 93]: ae71fea660d0fe46 +Block 0011 [ 94]: 6b3810a5232a039c +Block 0011 [ 95]: 2e87a630dae147e3 +Block 0011 [ 96]: 9d0fc975282cc88c +Block 0011 [ 97]: 9c35c8dcb1527fd0 +Block 0011 [ 98]: 99acd6a25ed6832a +Block 0011 [ 99]: f800832e202306bc +Block 0011 [100]: 154425c5c3070b92 +Block 0011 [101]: 033363274ed6b05d +Block 0011 [102]: 848069f7be4fa5c0 +Block 0011 [103]: 5d096e92cb952782 +Block 0011 [104]: a5c9710bff476a41 +Block 0011 [105]: 1ce68073e94d5602 +Block 0011 [106]: 123f120f04020240 +Block 0011 [107]: baf32cb1dfec19c4 +Block 0011 [108]: 1fb86ac5927d03da +Block 0011 [109]: 51c31b1882823de3 +Block 0011 [110]: f576c0710e67d98b +Block 0011 [111]: 4d0c15d414d97441 +Block 0011 [112]: bc5c5ee50ce748b6 +Block 0011 [113]: 6ced2e7f71ae5b2e +Block 0011 [114]: 6f029d91e0b73516 +Block 0011 [115]: 994dbd69f5b63c41 +Block 0011 [116]: ae45ee977791b483 +Block 0011 [117]: d7648f8fa1274743 +Block 0011 [118]: a6ff2d48dc1038f9 +Block 0011 [119]: e0b8353327619fc0 +Block 0011 [120]: ab88d74f0f3fbb52 +Block 0011 [121]: 6405b628531b4e3f +Block 0011 [122]: 8107aad4c2445a1c +Block 0011 [123]: 7af51bc5013db8c3 +Block 0011 [124]: 3b11a69b3cafd3d7 +Block 0011 [125]: 99c8791112918afc +Block 0011 [126]: e40140d75b01ebd2 +Block 0011 [127]: 421f17c323b1999a +Block 0012 [ 0]: 57b45e2155eb09a6 +Block 0012 [ 1]: e4c2f41f5c9422d1 +Block 0012 [ 2]: 805fc558ad63876c +Block 0012 [ 3]: f20bc926472e526a +Block 0012 [ 4]: 9cb136333a7f408b +Block 0012 [ 5]: f56a257cf12bd95a +Block 0012 [ 6]: 73677f0919085ceb +Block 0012 [ 7]: ec308986d1942ad1 +Block 0012 [ 8]: 67797afdca9d0e01 +Block 0012 [ 9]: 3d9eda562601b379 +Block 0012 [ 10]: 05841d4e15c878d8 +Block 0012 [ 11]: 305f2848b06d57ba +Block 0012 [ 12]: caa5f6f7a0a27afd +Block 0012 [ 13]: 62953adc90c85900 +Block 0012 [ 14]: da34c2d07a919662 +Block 0012 [ 15]: f4e763cabfaefb12 +Block 0012 [ 16]: 134b35d39509ea42 +Block 0012 [ 17]: 6bdedb78e7034c61 +Block 0012 [ 18]: 59a488e36bbedcc7 +Block 0012 [ 19]: 4a1e6deab9ba69f6 +Block 0012 [ 20]: 41302fa4cd7d9d2c +Block 0012 [ 21]: c6e1a3e3382aaa5e +Block 0012 [ 22]: 6fb61a14363537ed +Block 0012 [ 23]: d037afec313500fa +Block 0012 [ 24]: be19c63a67ced569 +Block 0012 [ 25]: 7927ca951ae66c45 +Block 0012 [ 26]: 377278d9c42dfce2 +Block 0012 [ 27]: d094448fc4dca475 +Block 0012 [ 28]: 8fe33e63b5464cd7 +Block 0012 [ 29]: 534c6bfd73b1664d +Block 0012 [ 30]: 2349185e29a74d3e +Block 0012 [ 31]: 874af27d7ebfefc3 +Block 0012 [ 32]: f3db4272da3cb08d +Block 0012 [ 33]: 07adcb591bf14309 +Block 0012 [ 34]: 4bdbafae807c3807 +Block 0012 [ 35]: fa27aa7f5667425b +Block 0012 [ 36]: 471d38e55b583a78 +Block 0012 [ 37]: 96f6c0c0a1240588 +Block 0012 [ 38]: 75401db0a1c25736 +Block 0012 [ 39]: 1398216942c7c35c +Block 0012 [ 40]: 5343467b1ae7b457 +Block 0012 [ 41]: fa32b8553f7446c2 +Block 0012 [ 42]: c2c850718c009070 +Block 0012 [ 43]: 366dfd2bc6951ed0 +Block 0012 [ 44]: 5bb3d45dc4af7ae8 +Block 0012 [ 45]: b085e329d6294897 +Block 0012 [ 46]: a95768badd7960f6 +Block 0012 [ 47]: 80413c11bd367b42 +Block 0012 [ 48]: 5a9807a2c57b5fcd +Block 0012 [ 49]: d2a9b8e1d8d0e483 +Block 0012 [ 50]: b0465723a123b002 +Block 0012 [ 51]: 1bcf94c7e694c4fb +Block 0012 [ 52]: 92423c23eb077412 +Block 0012 [ 53]: 3932c2fbba7db8d4 +Block 0012 [ 54]: 5b3bccb0b9cf3829 +Block 0012 [ 55]: b29df488af3b7740 +Block 0012 [ 56]: 0b9538420af6f746 +Block 0012 [ 57]: 4bd159e8c22fceba +Block 0012 [ 58]: 1b772f85b3153005 +Block 0012 [ 59]: dcb156af6d11d4e6 +Block 0012 [ 60]: 58156afd7dc41c29 +Block 0012 [ 61]: 7d3b2509e63033d5 +Block 0012 [ 62]: 6f1c580bb2f3d9b1 +Block 0012 [ 63]: c6c37c1d6eb4daee +Block 0012 [ 64]: cfeb8d6cb8866495 +Block 0012 [ 65]: dd17d3852ed6a6e8 +Block 0012 [ 66]: e41c7e41f538dbe7 +Block 0012 [ 67]: 5768bf57b3a5ed86 +Block 0012 [ 68]: 78046e27e202f6aa +Block 0012 [ 69]: a3e201aefc301b70 +Block 0012 [ 70]: 50a0d5a4a91b8af4 +Block 0012 [ 71]: a5e559a8a6c437d6 +Block 0012 [ 72]: fac6cd8e65d46ff9 +Block 0012 [ 73]: 0d9fa685d3eb2111 +Block 0012 [ 74]: 9623a5bd74bbf9df +Block 0012 [ 75]: cc8c1640de946f03 +Block 0012 [ 76]: 45895a3b3b44202b +Block 0012 [ 77]: fc89b3976c685cdc +Block 0012 [ 78]: cd752649ff454671 +Block 0012 [ 79]: 93772ab678e8e9ca +Block 0012 [ 80]: 298a19530983c336 +Block 0012 [ 81]: de1d36ad501353d6 +Block 0012 [ 82]: dd964f96de8650e4 +Block 0012 [ 83]: 25ae2833905c7023 +Block 0012 [ 84]: 519edf230c5711f2 +Block 0012 [ 85]: 256dc6f35b268020 +Block 0012 [ 86]: 9e3b5315d2df8c07 +Block 0012 [ 87]: a492a2843836e071 +Block 0012 [ 88]: b93bcf95d01975d9 +Block 0012 [ 89]: 48db0c4bc87eff40 +Block 0012 [ 90]: 2d78c22e82fdba57 +Block 0012 [ 91]: 39d7e857cd35e0ce +Block 0012 [ 92]: 41482071123589ac +Block 0012 [ 93]: b8d24d5a6203255f +Block 0012 [ 94]: cb4c0f936f2ae1ac +Block 0012 [ 95]: cc2c6d7046f20ea6 +Block 0012 [ 96]: 611bb8e43b69c470 +Block 0012 [ 97]: cb76f40096c7a527 +Block 0012 [ 98]: 041160b6d87e85b3 +Block 0012 [ 99]: 14a808513a59ddeb +Block 0012 [100]: 3146e51118b5d3f0 +Block 0012 [101]: a4d48814108462aa +Block 0012 [102]: b09a74a839ffd0e3 +Block 0012 [103]: 41887c72e8ecefac +Block 0012 [104]: a39e60aca9f9c1c6 +Block 0012 [105]: 94d3fed99796f4c5 +Block 0012 [106]: 915e01be08a71f60 +Block 0012 [107]: 5bc9a224b7417179 +Block 0012 [108]: 9b5ea49fadf9ea41 +Block 0012 [109]: b5734c9ea85c13c6 +Block 0012 [110]: 3ddc1878140e662e +Block 0012 [111]: 62878bb723c8e92c +Block 0012 [112]: 8d25065038213031 +Block 0012 [113]: c0ce352747559d71 +Block 0012 [114]: af42da990cb5f109 +Block 0012 [115]: 8f0854be4578b5a9 +Block 0012 [116]: 52633445299a0dc7 +Block 0012 [117]: 55b95c2c08739647 +Block 0012 [118]: a514cc136aac3485 +Block 0012 [119]: bed4bd5515c62d15 +Block 0012 [120]: bb4dc5594c8bde63 +Block 0012 [121]: 7088341e9ec16414 +Block 0012 [122]: ac9f56158d64d176 +Block 0012 [123]: 8170c10d3291daa2 +Block 0012 [124]: eb1e1b04ccc6ebc5 +Block 0012 [125]: c691cccb6c298e64 +Block 0012 [126]: 28db423772d9387d +Block 0012 [127]: fd201e0664640880 +Block 0013 [ 0]: 00ec39c939db9894 +Block 0013 [ 1]: 4420dfaadbee3c0b +Block 0013 [ 2]: 22cd108c9c63be9d +Block 0013 [ 3]: 20d0476679e15210 +Block 0013 [ 4]: 2dcee690366bb2c1 +Block 0013 [ 5]: a02c85486eb5afb1 +Block 0013 [ 6]: eb947f30e07f57b8 +Block 0013 [ 7]: 39071f737c63767a +Block 0013 [ 8]: 8c6f6c62ab515304 +Block 0013 [ 9]: 76e6e0129fefa947 +Block 0013 [ 10]: 755233c73eaeca92 +Block 0013 [ 11]: 175b46741a8bbd82 +Block 0013 [ 12]: 701ecdbaafa63a3f +Block 0013 [ 13]: f617280a7cb6df16 +Block 0013 [ 14]: ec2232a64ca32ca7 +Block 0013 [ 15]: 30b4d00845ef206b +Block 0013 [ 16]: ba9401ae6e780dce +Block 0013 [ 17]: 5b3e6e06b9a491af +Block 0013 [ 18]: d4fb8f043100e234 +Block 0013 [ 19]: 57e533e169fea374 +Block 0013 [ 20]: 01161771c7a81f08 +Block 0013 [ 21]: 0eefac8dbffd9218 +Block 0013 [ 22]: f23c581ed1df6a37 +Block 0013 [ 23]: 3553c1f8392e6ea8 +Block 0013 [ 24]: 169ae5c8916d1e80 +Block 0013 [ 25]: f7769df26dfc84a0 +Block 0013 [ 26]: acb68b419526eaec +Block 0013 [ 27]: 1291357db928c5cd +Block 0013 [ 28]: 5b6d8961bd429b19 +Block 0013 [ 29]: 4ff6515925c988fe +Block 0013 [ 30]: fdca8898314dbe4a +Block 0013 [ 31]: fd36e4c1d14ba7ca +Block 0013 [ 32]: 22009a75e3fc39df +Block 0013 [ 33]: dc7fe86e4949f847 +Block 0013 [ 34]: 59ef8d7b9e7ba1cb +Block 0013 [ 35]: eb72886e925b1acb +Block 0013 [ 36]: 5fad5d3c38006489 +Block 0013 [ 37]: 82dba341d15d2d56 +Block 0013 [ 38]: 05905e9e7ba6a663 +Block 0013 [ 39]: 7f3abe8f31b94ff2 +Block 0013 [ 40]: 3856453ab6d5c126 +Block 0013 [ 41]: 09b5552fc65cd05e +Block 0013 [ 42]: 2722b2ff56ee67fd +Block 0013 [ 43]: 44d9b85865a9b868 +Block 0013 [ 44]: 3090dc42cb77ced4 +Block 0013 [ 45]: 7acf325fabaaa4a8 +Block 0013 [ 46]: f61a814966f6c305 +Block 0013 [ 47]: 5f542e6b87babffc +Block 0013 [ 48]: f0425b7d0f75d5f4 +Block 0013 [ 49]: c5cbf2e60208c5f4 +Block 0013 [ 50]: 5b973edabe0361a2 +Block 0013 [ 51]: 7f5fe5324e325ab8 +Block 0013 [ 52]: ccec55217f3b82b4 +Block 0013 [ 53]: d676cba9ec6dd723 +Block 0013 [ 54]: 05da0d6ac5ecc58e +Block 0013 [ 55]: 6d6272bec3a4b8e8 +Block 0013 [ 56]: af31a6e8e6fb4cb9 +Block 0013 [ 57]: 29f435a830199118 +Block 0013 [ 58]: b9fc088f00f87093 +Block 0013 [ 59]: d68752cc88ab7438 +Block 0013 [ 60]: 8a9efac1e54c242d +Block 0013 [ 61]: 0fbfc535af7c20ff +Block 0013 [ 62]: 2cea3ebba917e008 +Block 0013 [ 63]: 55433086e2f6a6f6 +Block 0013 [ 64]: b0df96ad91c9e607 +Block 0013 [ 65]: 2fd6cfe69c5836f6 +Block 0013 [ 66]: 6c67ba628134d091 +Block 0013 [ 67]: fbd246e6c7e42035 +Block 0013 [ 68]: 651f33a83004fc17 +Block 0013 [ 69]: e1cbf99d4ec8b300 +Block 0013 [ 70]: ebd68429770d021a +Block 0013 [ 71]: 4fa7c8d34bb4ee9c +Block 0013 [ 72]: c6931ce85af3d3be +Block 0013 [ 73]: 287d02f736567dfd +Block 0013 [ 74]: 4df9653cd7145f81 +Block 0013 [ 75]: 3c61284f1698bfff +Block 0013 [ 76]: ccd0ea56458bc87d +Block 0013 [ 77]: dc15ea6cb6c7c8b7 +Block 0013 [ 78]: 9502b9bb7e8ca6e1 +Block 0013 [ 79]: 299464cddd3989db +Block 0013 [ 80]: 16dbe8345daf1e54 +Block 0013 [ 81]: 775459707e99df40 +Block 0013 [ 82]: c2b6e5a6cc36de56 +Block 0013 [ 83]: 9469ef94adebd6aa +Block 0013 [ 84]: e35eef9407cda49b +Block 0013 [ 85]: ddd463c60effea37 +Block 0013 [ 86]: c226c4c1033ae080 +Block 0013 [ 87]: a7f4bfd8c2100edb +Block 0013 [ 88]: ea2510b8c5811c62 +Block 0013 [ 89]: dcd044cdbbdfb940 +Block 0013 [ 90]: 938cc1cbfc8b94b7 +Block 0013 [ 91]: 437bc57fa90a3bbb +Block 0013 [ 92]: 7aa81548d40db03a +Block 0013 [ 93]: f8a292046d2fa796 +Block 0013 [ 94]: f2897d6e468bf8f6 +Block 0013 [ 95]: 901e412b7dc65309 +Block 0013 [ 96]: fb4891cd5a32b7db +Block 0013 [ 97]: 1a60255326e37f8a +Block 0013 [ 98]: 59c7a05cf45dc39a +Block 0013 [ 99]: 1b5b8c8670e944ff +Block 0013 [100]: 47145bf58a812d96 +Block 0013 [101]: 26e8ccd5429be8d0 +Block 0013 [102]: 046f3c2096f6bbc4 +Block 0013 [103]: 8482a9a6df7a65e4 +Block 0013 [104]: 50f04dcaf51f2d3d +Block 0013 [105]: 48d5efc4ddb27a70 +Block 0013 [106]: 2cb4d612eef96b21 +Block 0013 [107]: 7d49b448cca8912e +Block 0013 [108]: 129f7b291b96760f +Block 0013 [109]: 0493b40e6e7f3570 +Block 0013 [110]: 098c8184c1d123d0 +Block 0013 [111]: 8e42072653043cc7 +Block 0013 [112]: 6be95bddd1de01b2 +Block 0013 [113]: e06f858fad85516e +Block 0013 [114]: 43ffbff8f1706507 +Block 0013 [115]: eefd484bb56c691b +Block 0013 [116]: 61b105589d9b338c +Block 0013 [117]: 8e990037df282132 +Block 0013 [118]: 9763cc54d2f2cfc4 +Block 0013 [119]: 56e6c9eb670a2adc +Block 0013 [120]: a212057df0c0f6ea +Block 0013 [121]: f98be4183c32d1af +Block 0013 [122]: 478533919d7eaa3c +Block 0013 [123]: af360d62679b4f94 +Block 0013 [124]: a9acbd9a987da35e +Block 0013 [125]: b122a3845a30bf92 +Block 0013 [126]: a2d07821a856e6b2 +Block 0013 [127]: 04f46f78a0683224 +Block 0014 [ 0]: d0a71e6d68c6aecf +Block 0014 [ 1]: befd296e9a6f7bf7 +Block 0014 [ 2]: eb23e47984363429 +Block 0014 [ 3]: 9b4787767e96a598 +Block 0014 [ 4]: 08abd2c594da070c +Block 0014 [ 5]: 24cce834cf67ad28 +Block 0014 [ 6]: 1b09c6978feb2fc9 +Block 0014 [ 7]: ee90c0baca774d1a +Block 0014 [ 8]: 3708f4a4039a19eb +Block 0014 [ 9]: 0d496aa6634c2540 +Block 0014 [ 10]: 6bc152a0b15b3a2b +Block 0014 [ 11]: d10bfad6b4b43f2c +Block 0014 [ 12]: e96e477855119ddc +Block 0014 [ 13]: 1a544b91b3ce7fbc +Block 0014 [ 14]: cafc0eb55c122d6f +Block 0014 [ 15]: 037d2bc2a0f7530a +Block 0014 [ 16]: 95c2dd7aff0844be +Block 0014 [ 17]: 585ab21fe56d6e98 +Block 0014 [ 18]: 5b904ca8d183d28a +Block 0014 [ 19]: a2448fed9c557e8f +Block 0014 [ 20]: bc185e3656899faa +Block 0014 [ 21]: f4c474da33d146bb +Block 0014 [ 22]: 909b452e8713fe6f +Block 0014 [ 23]: cd9d52c628288b86 +Block 0014 [ 24]: 61e30da08cc69ad7 +Block 0014 [ 25]: 05e27f3a2c9cab56 +Block 0014 [ 26]: 4f6ce1ac6e1ae127 +Block 0014 [ 27]: a8f7e36d3e33f1f3 +Block 0014 [ 28]: b71335ed65487cce +Block 0014 [ 29]: 6ab069bebe4243a7 +Block 0014 [ 30]: 619ede30c4ef2624 +Block 0014 [ 31]: 692a41b133b0675f +Block 0014 [ 32]: 00215d331c4ce791 +Block 0014 [ 33]: f80accc7ba9eacd3 +Block 0014 [ 34]: 66c0e64361080502 +Block 0014 [ 35]: 561863112c28976f +Block 0014 [ 36]: 38d087594c680141 +Block 0014 [ 37]: 3fa2c7b0be344d66 +Block 0014 [ 38]: f3f51a71ee9ca468 +Block 0014 [ 39]: 95f467cf50cc8fc3 +Block 0014 [ 40]: d4a888b561d86fb0 +Block 0014 [ 41]: de87bb7e76a0dd0a +Block 0014 [ 42]: 61a14fb5723e3c91 +Block 0014 [ 43]: bfeb22754475e5e8 +Block 0014 [ 44]: f0b89172e3f1bc5b +Block 0014 [ 45]: d98d5b096ea38b76 +Block 0014 [ 46]: b6b790d56ab53d4c +Block 0014 [ 47]: 5ffd1be544675851 +Block 0014 [ 48]: 87b87fa919bd7fa7 +Block 0014 [ 49]: c478617f8f272678 +Block 0014 [ 50]: fb8fe0c3f64a0ccf +Block 0014 [ 51]: 8b551243e6d9382d +Block 0014 [ 52]: e1f38e5d1b03713e +Block 0014 [ 53]: e745fd4b6020c5f6 +Block 0014 [ 54]: 16f084e01fbc7f76 +Block 0014 [ 55]: fb9d312f55c899d4 +Block 0014 [ 56]: 380ceef8173536a8 +Block 0014 [ 57]: ed8d72a941db2c19 +Block 0014 [ 58]: 4002123ba862890e +Block 0014 [ 59]: 8a04fb41a64f5768 +Block 0014 [ 60]: fc1e9a8656875926 +Block 0014 [ 61]: f786b160707ffa14 +Block 0014 [ 62]: 987cf0bd188183ec +Block 0014 [ 63]: dcf2fe8c41728578 +Block 0014 [ 64]: f7e5aca070f4b430 +Block 0014 [ 65]: 96eb8b8b4d8cf4c8 +Block 0014 [ 66]: 866d2f63f3029682 +Block 0014 [ 67]: 2047180121f91c40 +Block 0014 [ 68]: 348ef39663476deb +Block 0014 [ 69]: fac01230e6089aba +Block 0014 [ 70]: 89f17de15e72ebe2 +Block 0014 [ 71]: 36e1d38205fa23f2 +Block 0014 [ 72]: 29faa8623e80e6ae +Block 0014 [ 73]: 76a33f8dc35f3290 +Block 0014 [ 74]: 1937ab138d449122 +Block 0014 [ 75]: e2aa81e221944c31 +Block 0014 [ 76]: fae8a6eab442f6af +Block 0014 [ 77]: 96a75c5ecae96184 +Block 0014 [ 78]: bbba5f15491b96a7 +Block 0014 [ 79]: 3dac0a6277186f87 +Block 0014 [ 80]: 2d026ceb7958bc42 +Block 0014 [ 81]: 2f5fcb9728eb62ce +Block 0014 [ 82]: 555e861c60727892 +Block 0014 [ 83]: 75daea44d6cbaa81 +Block 0014 [ 84]: b24c44f14fc25965 +Block 0014 [ 85]: 857b89408e44d277 +Block 0014 [ 86]: eca4d2d1efa199a3 +Block 0014 [ 87]: 33088d7ed812412e +Block 0014 [ 88]: 0263a5d914d3b296 +Block 0014 [ 89]: 83a093e24510f6f6 +Block 0014 [ 90]: aa67ef4b716938f7 +Block 0014 [ 91]: 6e7b4232ff800496 +Block 0014 [ 92]: 4297489b99c5964b +Block 0014 [ 93]: 9153dd490c532185 +Block 0014 [ 94]: 103733d2498559da +Block 0014 [ 95]: 36fac0d23f9ea533 +Block 0014 [ 96]: d736564ae0dda60d +Block 0014 [ 97]: abed530c0d96db44 +Block 0014 [ 98]: 266962ee099dcd61 +Block 0014 [ 99]: 6f3940d172461d85 +Block 0014 [100]: 731737d40a0b355f +Block 0014 [101]: f72f0c4d4441d25c +Block 0014 [102]: bec49deeb8ef1984 +Block 0014 [103]: d0859ff42db3710e +Block 0014 [104]: 99ff2ce81eb466c5 +Block 0014 [105]: ee5306c14d628890 +Block 0014 [106]: 40ea0b4fd6716f3d +Block 0014 [107]: b7c4ac4c8d4332a9 +Block 0014 [108]: a597ac3013e292c7 +Block 0014 [109]: da6fbb8fcc6b97a1 +Block 0014 [110]: f10c43f6c9e5ccd3 +Block 0014 [111]: 5b47d9496ff528ed +Block 0014 [112]: 91acaa483333c642 +Block 0014 [113]: 1ad7706921b3b8a9 +Block 0014 [114]: d9d2b9b18576072e +Block 0014 [115]: 210a8f3abe9db6b5 +Block 0014 [116]: ca41fc26bb135d0a +Block 0014 [117]: 384e457b4d13f8d8 +Block 0014 [118]: de698e11114e709d +Block 0014 [119]: 816dd5eebeca22c8 +Block 0014 [120]: 239a7c8bb28894fd +Block 0014 [121]: 6aba2b3bed305bdd +Block 0014 [122]: 668ccac32780f6e0 +Block 0014 [123]: 021c76c0b0d47e7f +Block 0014 [124]: 4b5939ee4c221e0f +Block 0014 [125]: e80bcb585f7ccc31 +Block 0014 [126]: 684c34269fa69d57 +Block 0014 [127]: 6051e4b2d171b880 +Block 0015 [ 0]: 923f88bc8b5c3f52 +Block 0015 [ 1]: 578d8d59d1604075 +Block 0015 [ 2]: 8db95b3e67603af3 +Block 0015 [ 3]: aeea5af3a1f5ebe4 +Block 0015 [ 4]: 669c71c88c1b0c60 +Block 0015 [ 5]: 03f5e673d2527562 +Block 0015 [ 6]: b0848a843a9482bb +Block 0015 [ 7]: afbb02cefb95a4d7 +Block 0015 [ 8]: b7e5388eeb15745d +Block 0015 [ 9]: 588e578329ef8f4e +Block 0015 [ 10]: 2caddb62b1e9c5d6 +Block 0015 [ 11]: 3303a6fbc816f592 +Block 0015 [ 12]: 16737e3f4ed44a71 +Block 0015 [ 13]: a8b076096115662b +Block 0015 [ 14]: 16647f89bd24e716 +Block 0015 [ 15]: d0f259b51d08173f +Block 0015 [ 16]: a5927a2b6b3cf0cf +Block 0015 [ 17]: 3dbd0814a2f17812 +Block 0015 [ 18]: b79afd45fff6c5e5 +Block 0015 [ 19]: 03d017c92f2dcf22 +Block 0015 [ 20]: bf6ec040d37e2e9e +Block 0015 [ 21]: a701255712aec166 +Block 0015 [ 22]: a270f973b6012ccc +Block 0015 [ 23]: a1567cbeec8ddabc +Block 0015 [ 24]: d7c5214c306eae0d +Block 0015 [ 25]: aaec001997c49c8a +Block 0015 [ 26]: cbb52fa37bfd7250 +Block 0015 [ 27]: f7995bb6508a5700 +Block 0015 [ 28]: bd8a678f71474623 +Block 0015 [ 29]: 8452544953085607 +Block 0015 [ 30]: ceae2bf6b80a08a0 +Block 0015 [ 31]: fab325a1606b95b7 +Block 0015 [ 32]: c60c406dc5bc8cf0 +Block 0015 [ 33]: d341ebfa38d4f533 +Block 0015 [ 34]: 29952b959eb7a7cf +Block 0015 [ 35]: 2435ccdb02c1647b +Block 0015 [ 36]: d4d48fdfd42fc50c +Block 0015 [ 37]: 33894bd3e7a843a6 +Block 0015 [ 38]: 931856766f61418f +Block 0015 [ 39]: 155b15cb5f31088a +Block 0015 [ 40]: 36e19042006d6ae4 +Block 0015 [ 41]: 26902564c5616d2d +Block 0015 [ 42]: 3d871267705f550e +Block 0015 [ 43]: 468c267fda5c995e +Block 0015 [ 44]: 0419b87d2e3443a1 +Block 0015 [ 45]: b379cb451c29225f +Block 0015 [ 46]: 15e1d708a734946c +Block 0015 [ 47]: 9457cc9185579480 +Block 0015 [ 48]: ab504b97cc71044e +Block 0015 [ 49]: c63d7adb7bda6984 +Block 0015 [ 50]: 630b7c072eb9859a +Block 0015 [ 51]: c242e7abbe745fb5 +Block 0015 [ 52]: 2b33e28cdde69822 +Block 0015 [ 53]: 5790e885c8928ec9 +Block 0015 [ 54]: b9dc2d755ec7ce01 +Block 0015 [ 55]: 163c9515259b0cc0 +Block 0015 [ 56]: 106cc0c8480f9779 +Block 0015 [ 57]: 2ba3947ecac1e765 +Block 0015 [ 58]: 9d447f56b9396f2e +Block 0015 [ 59]: 89f3ce4303d2d00a +Block 0015 [ 60]: 9a078e49f2a8274b +Block 0015 [ 61]: 81387c0c5d7360e0 +Block 0015 [ 62]: 78682bf4c2a1ed78 +Block 0015 [ 63]: f84c95533b6aee11 +Block 0015 [ 64]: 580a5a9f3738e4f8 +Block 0015 [ 65]: c8d7f364e82ad3de +Block 0015 [ 66]: 5875aba510ec2da2 +Block 0015 [ 67]: 88478a8b3b59dcea +Block 0015 [ 68]: 01547ea51866c827 +Block 0015 [ 69]: afc771726e09e872 +Block 0015 [ 70]: f26b84f1b29a9348 +Block 0015 [ 71]: 303d359c7983a4d8 +Block 0015 [ 72]: eed535f30aefb0e3 +Block 0015 [ 73]: b35dac44826075af +Block 0015 [ 74]: 9ca73ef717f6088d +Block 0015 [ 75]: 35cd92ec0fc882ba +Block 0015 [ 76]: f1cf7a2fb713126f +Block 0015 [ 77]: 6969c74bb3141567 +Block 0015 [ 78]: 9d334636658af1df +Block 0015 [ 79]: 6150b2c859b234f3 +Block 0015 [ 80]: d037be4342803988 +Block 0015 [ 81]: f0da5e16bba7397f +Block 0015 [ 82]: 3790c5cdec48ad9b +Block 0015 [ 83]: 93242fd303780d00 +Block 0015 [ 84]: 2fa1418df86105d7 +Block 0015 [ 85]: 0a44dd03fa02f75b +Block 0015 [ 86]: d48a3861b1e3a969 +Block 0015 [ 87]: 65fd27ced6dc8d8a +Block 0015 [ 88]: b8d911426f028ffe +Block 0015 [ 89]: 3cb6290c59a92c01 +Block 0015 [ 90]: df4bef9b8bb44949 +Block 0015 [ 91]: 4e4b57b894398fde +Block 0015 [ 92]: b55bbdb66340f7fd +Block 0015 [ 93]: 97a871f202f9ce22 +Block 0015 [ 94]: 6be3274e3c7061ad +Block 0015 [ 95]: e251e778d2c93834 +Block 0015 [ 96]: 70c4773d57021e1e +Block 0015 [ 97]: 798995170b281ec9 +Block 0015 [ 98]: f52ff5999ad3eb1e +Block 0015 [ 99]: a237d0e96b97782b +Block 0015 [100]: 1b7c02de9a73e9a9 +Block 0015 [101]: 1ee14242dd56c19c +Block 0015 [102]: 2487022c07200707 +Block 0015 [103]: 0921886a5777e70b +Block 0015 [104]: 3f0efb8959d4b9bf +Block 0015 [105]: 84e1a5aa909ff0f3 +Block 0015 [106]: 1ebf8bb3129f68d1 +Block 0015 [107]: f9b9c60235424d48 +Block 0015 [108]: 76a095cb8fbb24db +Block 0015 [109]: 99db66cf266191e9 +Block 0015 [110]: 66c87dc70f5d5ba8 +Block 0015 [111]: f7444d7763b939e1 +Block 0015 [112]: 858d7c9b41041901 +Block 0015 [113]: 1e89ff599a30d4e1 +Block 0015 [114]: f2f8685605d12f90 +Block 0015 [115]: 099ed67176ce729d +Block 0015 [116]: 8173bec3b6783e38 +Block 0015 [117]: db8b13db63f43ee8 +Block 0015 [118]: 4384ccd8d151b2ca +Block 0015 [119]: a29fbce4bd7b522d +Block 0015 [120]: 8c88929d17922135 +Block 0015 [121]: 3165fa6c0833ba1d +Block 0015 [122]: 02d6b259de6986fe +Block 0015 [123]: 488a4f9ac7f2b3e4 +Block 0015 [124]: 066aa29e0239ad1a +Block 0015 [125]: eefaf94deba147e8 +Block 0015 [126]: 81a56974feab366b +Block 0015 [127]: 0cf0d0f0e9684b43 +Block 0016 [ 0]: a58755fd5aba14e1 +Block 0016 [ 1]: 4bba15d271ff7b86 +Block 0016 [ 2]: 2af24b430abe13dd +Block 0016 [ 3]: fdfc62a4a6465f25 +Block 0016 [ 4]: 0110b3c714fa6324 +Block 0016 [ 5]: 44eaab03c972e7c5 +Block 0016 [ 6]: bab5296e3e127f16 +Block 0016 [ 7]: 221dd2a707de8136 +Block 0016 [ 8]: bae66312a437d33c +Block 0016 [ 9]: 41b70180f3c522cc +Block 0016 [ 10]: 01d87bb602992349 +Block 0016 [ 11]: fa9ec46adc863906 +Block 0016 [ 12]: 55236bf04fcec435 +Block 0016 [ 13]: c2b853f237529a47 +Block 0016 [ 14]: b1b2b7599d8d3389 +Block 0016 [ 15]: 50e07c48ec97fafc +Block 0016 [ 16]: efbc4a65ee24334c +Block 0016 [ 17]: e65f79b3c431511f +Block 0016 [ 18]: 83e3c9ff15b0ad16 +Block 0016 [ 19]: ff122406db689e4d +Block 0016 [ 20]: f724e24cd66a82ba +Block 0016 [ 21]: e96fa8228fe49099 +Block 0016 [ 22]: 1ebcf3357fa22834 +Block 0016 [ 23]: 8706c397861d4952 +Block 0016 [ 24]: d7d2622673c4f5fb +Block 0016 [ 25]: acd59a1abf98b00a +Block 0016 [ 26]: a80d7e6af7bcdd24 +Block 0016 [ 27]: 95e87ac9fd9082fc +Block 0016 [ 28]: e0f922992d427fbb +Block 0016 [ 29]: e67de2dece52c91c +Block 0016 [ 30]: 2353af574cc5d73a +Block 0016 [ 31]: 351ea23270c34b97 +Block 0016 [ 32]: a66303a5404984ed +Block 0016 [ 33]: 62502bd41ad3c8ea +Block 0016 [ 34]: bc0818e328e16211 +Block 0016 [ 35]: 1830d7f7a26ad737 +Block 0016 [ 36]: 0e2e1872ef33a31a +Block 0016 [ 37]: e07e2056add9fe1d +Block 0016 [ 38]: cecb5b5225a9d577 +Block 0016 [ 39]: 211cac8b11c45352 +Block 0016 [ 40]: f650fd25271b9c5a +Block 0016 [ 41]: 4a010b0f77e26da8 +Block 0016 [ 42]: 1f6f7df490099b1b +Block 0016 [ 43]: 36022d365802f027 +Block 0016 [ 44]: e35a379738a296e5 +Block 0016 [ 45]: 6491f8b4a212791c +Block 0016 [ 46]: b2d54c7989b5b0c1 +Block 0016 [ 47]: a0a7315c0eb890eb +Block 0016 [ 48]: 940c2febc8456f00 +Block 0016 [ 49]: afe584e0974acadc +Block 0016 [ 50]: 0237152efebb2203 +Block 0016 [ 51]: 519b38e94ad527c9 +Block 0016 [ 52]: 9e499dfc5a979151 +Block 0016 [ 53]: 45cbafa954f7b16f +Block 0016 [ 54]: 71124a4a9b161aee +Block 0016 [ 55]: b380225a3fc8298f +Block 0016 [ 56]: b8515b64f5e35d14 +Block 0016 [ 57]: 82d8b9dbe548ccd5 +Block 0016 [ 58]: 24c4387c54c4d022 +Block 0016 [ 59]: 850905f5110be9e8 +Block 0016 [ 60]: f8c0e31453bcb207 +Block 0016 [ 61]: 8a251ccea3671489 +Block 0016 [ 62]: ae373b1f897efb7f +Block 0016 [ 63]: ac8d3162c76d1c2c +Block 0016 [ 64]: 0d11769e3e5db3f2 +Block 0016 [ 65]: 02b25c0908ce43e4 +Block 0016 [ 66]: e61e2f849cec89d4 +Block 0016 [ 67]: d52c8897b2f3d019 +Block 0016 [ 68]: 75a7a2ae83d80ae6 +Block 0016 [ 69]: 9f18bcbdc9f84991 +Block 0016 [ 70]: e517fce50ccfd1e9 +Block 0016 [ 71]: 980bc68313152f3f +Block 0016 [ 72]: 4eee0692b9465b9d +Block 0016 [ 73]: 3d2e94a50e49e795 +Block 0016 [ 74]: 7943364021b4fea2 +Block 0016 [ 75]: bd284dd3f7ad94c7 +Block 0016 [ 76]: 8221ee08403f3e10 +Block 0016 [ 77]: a40cc63f8c9de094 +Block 0016 [ 78]: 6e6f2f7d80d7d21e +Block 0016 [ 79]: 91c0201f23fd6e6c +Block 0016 [ 80]: 8ed2b314946e622b +Block 0016 [ 81]: dd48c6c2a1d335d4 +Block 0016 [ 82]: 41ee6f41ab208bf2 +Block 0016 [ 83]: 31a77119b6432a9c +Block 0016 [ 84]: 1b2cafacf9b54382 +Block 0016 [ 85]: 5eebbe897674fa7a +Block 0016 [ 86]: b73ac43a8686afc1 +Block 0016 [ 87]: 1f18f754b7db2092 +Block 0016 [ 88]: 186a7e1729c70dd8 +Block 0016 [ 89]: b7bf5151c6cf12bc +Block 0016 [ 90]: a31c2209f7d6c042 +Block 0016 [ 91]: e4db5452b81a01a7 +Block 0016 [ 92]: e73013b5645ff098 +Block 0016 [ 93]: a72bcbd72ec7b4b5 +Block 0016 [ 94]: d210d34e4b8e4532 +Block 0016 [ 95]: 09ee1b5d61bce6c2 +Block 0016 [ 96]: 86b41575fd474119 +Block 0016 [ 97]: 75be5fc8ece614b5 +Block 0016 [ 98]: 96e9e61dee37c9c5 +Block 0016 [ 99]: 994b01e9f1345ba2 +Block 0016 [100]: e80cc816ade968fc +Block 0016 [101]: b6484de03360d188 +Block 0016 [102]: 1b5c090b15e4c7c0 +Block 0016 [103]: 81d0ca62028f558e +Block 0016 [104]: 1b888c6c14f4bad0 +Block 0016 [105]: 7eb7c64e6674cc77 +Block 0016 [106]: 27823d303ac7ab60 +Block 0016 [107]: 9bd5fc1e140bea6a +Block 0016 [108]: d3d5b0ec1bcc3af2 +Block 0016 [109]: a36ec3bae283e8c0 +Block 0016 [110]: a7ff28d89cdd37b1 +Block 0016 [111]: 10177e9779913f70 +Block 0016 [112]: e9cd34aca1c47853 +Block 0016 [113]: cd309025c34ee78c +Block 0016 [114]: 4b8ffe18a3795079 +Block 0016 [115]: 5739338964cdf1b6 +Block 0016 [116]: e12aa70c2d91e4e5 +Block 0016 [117]: 618f77eeb7756c59 +Block 0016 [118]: a2f6ed98f55b12db +Block 0016 [119]: 7b7c4a38542aa6e7 +Block 0016 [120]: 3de134f1ba20445f +Block 0016 [121]: 7e2d2dc86a558720 +Block 0016 [122]: 5d239acb1ace723f +Block 0016 [123]: 57a5a103088725d5 +Block 0016 [124]: 3d4216b97e1d53fd +Block 0016 [125]: 8e2a754bad98d6fa +Block 0016 [126]: a4a1b2c34a1e2235 +Block 0016 [127]: a893790880d4e4af +Block 0017 [ 0]: 6a568b087362d599 +Block 0017 [ 1]: f4d0b004b7cfb215 +Block 0017 [ 2]: 24a403b15457faf9 +Block 0017 [ 3]: 7d6970151918144c +Block 0017 [ 4]: af8a64ff39a95eae +Block 0017 [ 5]: 13595c675e901bbe +Block 0017 [ 6]: c813ac2e1400d481 +Block 0017 [ 7]: 4e2af4e6504acfe0 +Block 0017 [ 8]: d488199a10e3c70e +Block 0017 [ 9]: f0621ceecae39807 +Block 0017 [ 10]: c37349a0628508cb +Block 0017 [ 11]: 00a2ca683ec5d0ff +Block 0017 [ 12]: b3d531564dffb295 +Block 0017 [ 13]: 96707bff9634dffe +Block 0017 [ 14]: bfd49981867297ca +Block 0017 [ 15]: 2795dbda22feda25 +Block 0017 [ 16]: 2a5b8637c6281074 +Block 0017 [ 17]: 18ec37929c342379 +Block 0017 [ 18]: c5e6f284b4821ac9 +Block 0017 [ 19]: 1ece865da7d295ed +Block 0017 [ 20]: e6b4925e308e6c53 +Block 0017 [ 21]: 5fb9738e778c653f +Block 0017 [ 22]: 19c8799cf625c2e6 +Block 0017 [ 23]: 407f2e253c3af503 +Block 0017 [ 24]: c062e4fb2bb75df6 +Block 0017 [ 25]: c9d993dbf3164d9d +Block 0017 [ 26]: d0f246dc1158028c +Block 0017 [ 27]: d1a0f91ccf9fcc7f +Block 0017 [ 28]: e97b91e45fce6044 +Block 0017 [ 29]: 7bc62e06a2248cf4 +Block 0017 [ 30]: c281b558f2f173c7 +Block 0017 [ 31]: 6548c47523b7b599 +Block 0017 [ 32]: c8af3c342b29b9ba +Block 0017 [ 33]: 0ee797539b104687 +Block 0017 [ 34]: 05b4ae0694f8472f +Block 0017 [ 35]: ec28f954ce73d75b +Block 0017 [ 36]: 956f6450c1306ae2 +Block 0017 [ 37]: e724ccd7925f9f45 +Block 0017 [ 38]: 0ed70803fc818da5 +Block 0017 [ 39]: b572f98a6f8a7408 +Block 0017 [ 40]: e93f48a2b46521ca +Block 0017 [ 41]: 0ebdc3c0b4a01fce +Block 0017 [ 42]: 1ec3dc824a30c790 +Block 0017 [ 43]: eee337efed2704ef +Block 0017 [ 44]: e801fa17db118356 +Block 0017 [ 45]: c20c79e85d2d88fa +Block 0017 [ 46]: 53359a3630c47888 +Block 0017 [ 47]: aee440b14a6c2c65 +Block 0017 [ 48]: 7cc5eae37cb7130e +Block 0017 [ 49]: 5641a3381f4bd0b5 +Block 0017 [ 50]: ada41bdbe746d269 +Block 0017 [ 51]: 22c263b7a9cedb8d +Block 0017 [ 52]: ada822e4bb4dfc81 +Block 0017 [ 53]: d91077f9e2b69e6c +Block 0017 [ 54]: 9dda916a85e71ba0 +Block 0017 [ 55]: 34c6398e727921de +Block 0017 [ 56]: 656e3e5b64f11348 +Block 0017 [ 57]: bf722197a87a9e52 +Block 0017 [ 58]: 3412696cf67a0536 +Block 0017 [ 59]: 61afa66a68537b17 +Block 0017 [ 60]: b81c87fc04ae41db +Block 0017 [ 61]: 2006797527ace218 +Block 0017 [ 62]: cdf9ed1a65c5523a +Block 0017 [ 63]: 81bfcdc44b341b2a +Block 0017 [ 64]: f8dfcaa6a6ed8007 +Block 0017 [ 65]: c9780e1c6c00a316 +Block 0017 [ 66]: 39569b0ad9ecf7bb +Block 0017 [ 67]: 369c5f6bf36daf32 +Block 0017 [ 68]: 2ef698ce1aabd3df +Block 0017 [ 69]: 5a3c9c147d106e0c +Block 0017 [ 70]: 6058270a1c6223b2 +Block 0017 [ 71]: 3e8ff7df68b29d00 +Block 0017 [ 72]: 0b2f4f395130e03c +Block 0017 [ 73]: 6ff710b6c6a86c61 +Block 0017 [ 74]: c16f6cc4ad8cfb65 +Block 0017 [ 75]: 759be4c5c0300c9a +Block 0017 [ 76]: dcae568becb44d58 +Block 0017 [ 77]: 4033bfa7607e6be6 +Block 0017 [ 78]: b445e7f3dbdef860 +Block 0017 [ 79]: ed0713c8f7d26751 +Block 0017 [ 80]: c84474035912a985 +Block 0017 [ 81]: 736f9184cdaa51f0 +Block 0017 [ 82]: ca0200924a6c76ba +Block 0017 [ 83]: d2e7fa645197c8e7 +Block 0017 [ 84]: 684cff2a784c969a +Block 0017 [ 85]: a81dbbbd245b5e1d +Block 0017 [ 86]: ed7a637fa3edc4b5 +Block 0017 [ 87]: 5f633a937e8ac431 +Block 0017 [ 88]: d25f821a1705e8f7 +Block 0017 [ 89]: d70c4299eb339515 +Block 0017 [ 90]: eff333ecf0353a1a +Block 0017 [ 91]: f401acd34391980f +Block 0017 [ 92]: 0295ac459f82e8c7 +Block 0017 [ 93]: 8b3ad6255b4780f7 +Block 0017 [ 94]: d2e7679d3ab1059d +Block 0017 [ 95]: 113876dd59c72996 +Block 0017 [ 96]: 17402099db10b612 +Block 0017 [ 97]: 0b01e2395ce384ba +Block 0017 [ 98]: 6bf5bb488801618b +Block 0017 [ 99]: 478b5a50bc3a2c4e +Block 0017 [100]: 0691aed65eefc1cb +Block 0017 [101]: 26ca3fad5466834e +Block 0017 [102]: 13113afc925a6817 +Block 0017 [103]: aa0e3ed28b3748e2 +Block 0017 [104]: b05cab417dac8424 +Block 0017 [105]: 0d6e4d86a0c912f7 +Block 0017 [106]: 9296ffd1c9e73921 +Block 0017 [107]: 1e03c605386af466 +Block 0017 [108]: 91cb867eeda11be3 +Block 0017 [109]: 3f1d5547f2c285c5 +Block 0017 [110]: 5a44678b78e7f616 +Block 0017 [111]: e5c07179aa7f608c +Block 0017 [112]: 083d0125aef8a233 +Block 0017 [113]: 179fd2d54fd4b257 +Block 0017 [114]: 7317cfd85758e269 +Block 0017 [115]: a21a270edc02b12e +Block 0017 [116]: 1a91dea7cd6e3221 +Block 0017 [117]: 55e99b07ffbeb71b +Block 0017 [118]: 5d6602f3d5351f15 +Block 0017 [119]: 1ddeb23652a7e470 +Block 0017 [120]: 41f0237d9948fc2d +Block 0017 [121]: 5ff55d244a864d70 +Block 0017 [122]: 8a6286abb55ce32f +Block 0017 [123]: f43c75e4d707e357 +Block 0017 [124]: 0b4c2b087242ca7c +Block 0017 [125]: 004f4ad50e58ac07 +Block 0017 [126]: 8648d433233bb2f5 +Block 0017 [127]: ee0bb08cd06e652f +Block 0018 [ 0]: 74bf48c25eaede69 +Block 0018 [ 1]: 0400a05f89a28857 +Block 0018 [ 2]: 0ab09e32a93bef73 +Block 0018 [ 3]: 05057d01ce0ef39f +Block 0018 [ 4]: 5c7978beb2277bb5 +Block 0018 [ 5]: a5d253e71f9ccae2 +Block 0018 [ 6]: c1f315aa6f3e9f74 +Block 0018 [ 7]: e72ff5afa533a4d4 +Block 0018 [ 8]: ecb3208c2142c54a +Block 0018 [ 9]: 0e2f949b8ee280ca +Block 0018 [ 10]: 7e3c92a4356588c0 +Block 0018 [ 11]: 9964e66e407bf3df +Block 0018 [ 12]: db714a9185258f27 +Block 0018 [ 13]: e65e22001dc81e32 +Block 0018 [ 14]: 90d8961c9c3756c7 +Block 0018 [ 15]: e2591928d215597e +Block 0018 [ 16]: c73cf20184efb1bc +Block 0018 [ 17]: 4f1a1044384c6f4f +Block 0018 [ 18]: 7e6b458e6fb0da22 +Block 0018 [ 19]: 8643245d817c7fbb +Block 0018 [ 20]: 11fdba7a2f78305b +Block 0018 [ 21]: f83ea63c173e06b1 +Block 0018 [ 22]: 9c7a045abe8c90a8 +Block 0018 [ 23]: b36c2a3626317afa +Block 0018 [ 24]: 3a44cafe43247699 +Block 0018 [ 25]: 0a141875b2a3608e +Block 0018 [ 26]: fcff57382918c295 +Block 0018 [ 27]: 8953eebab5b47e2b +Block 0018 [ 28]: 304750d888f8cf36 +Block 0018 [ 29]: 7eda590b3eecc804 +Block 0018 [ 30]: 65387915616d50d9 +Block 0018 [ 31]: 3227c1b6926315ea +Block 0018 [ 32]: b66da09195679368 +Block 0018 [ 33]: 5d3680c936733dc9 +Block 0018 [ 34]: 787cb30e129ab8bf +Block 0018 [ 35]: d356deaf9969ecd8 +Block 0018 [ 36]: e1cbceb0c6301fec +Block 0018 [ 37]: b65960ffae6c48c7 +Block 0018 [ 38]: 26a3712c2c111301 +Block 0018 [ 39]: 3579927152608c6a +Block 0018 [ 40]: ee4ca14008db9e5a +Block 0018 [ 41]: 012d00b0c4f6d234 +Block 0018 [ 42]: fe0f71ad0c37f2c5 +Block 0018 [ 43]: 63278fe0caa8ae1b +Block 0018 [ 44]: a304e7cadc483280 +Block 0018 [ 45]: f05f6bd6733075d4 +Block 0018 [ 46]: 534f8814741a4e0f +Block 0018 [ 47]: 8c21885188289bbb +Block 0018 [ 48]: d84ae9b0b404d205 +Block 0018 [ 49]: b3bc7c1e0afb6704 +Block 0018 [ 50]: 12c688be5d993b2e +Block 0018 [ 51]: aba988c6fc3bdb09 +Block 0018 [ 52]: 19b70cbd0d319bca +Block 0018 [ 53]: a51c29abe752369f +Block 0018 [ 54]: 4b0c55f1078c21b6 +Block 0018 [ 55]: ec9469aa4c1641e5 +Block 0018 [ 56]: dce1e647f70717c8 +Block 0018 [ 57]: c0887888f6060dd7 +Block 0018 [ 58]: 62af261baa0346ef +Block 0018 [ 59]: 3791ff08130c2ec5 +Block 0018 [ 60]: 40db56c530ff4828 +Block 0018 [ 61]: ad33136573457d2d +Block 0018 [ 62]: 4798cf53b26c7995 +Block 0018 [ 63]: bec038a566ee052f +Block 0018 [ 64]: 28fea35a44a8ad77 +Block 0018 [ 65]: 87922d63a04a7714 +Block 0018 [ 66]: 9fd1568b3961a755 +Block 0018 [ 67]: b814da74cb12e514 +Block 0018 [ 68]: 1e27e85db17b9b89 +Block 0018 [ 69]: 792060548ca6833f +Block 0018 [ 70]: 7f2633d664ef5ae0 +Block 0018 [ 71]: 93141a17f55c38d6 +Block 0018 [ 72]: c425ffa62860b3c4 +Block 0018 [ 73]: 126d931e23550e3a +Block 0018 [ 74]: f564b0e7a0fecec7 +Block 0018 [ 75]: 04fa1b585c310f79 +Block 0018 [ 76]: 61a14482bfc01919 +Block 0018 [ 77]: d63d6673e239bab0 +Block 0018 [ 78]: 98497f450519caf4 +Block 0018 [ 79]: 77a388d80ef61859 +Block 0018 [ 80]: afb4830ccf82147c +Block 0018 [ 81]: 56c5184493808a78 +Block 0018 [ 82]: 61b0745753eb147a +Block 0018 [ 83]: f3dc622060ceeddb +Block 0018 [ 84]: 2c16e6a7f4f85a80 +Block 0018 [ 85]: b5a812a2eaa530ce +Block 0018 [ 86]: 7355aec5721f7c5a +Block 0018 [ 87]: c8ad08d26497df3b +Block 0018 [ 88]: 8e0e0ca4e4e6a84b +Block 0018 [ 89]: 6574239609c73bee +Block 0018 [ 90]: 400d0a8a2958e233 +Block 0018 [ 91]: 0d12d5aaedfa7ee2 +Block 0018 [ 92]: ce01ba6a21f45b55 +Block 0018 [ 93]: 64fc77da92ebace2 +Block 0018 [ 94]: d94e61b2c96c1b88 +Block 0018 [ 95]: 46e4dff70fbb78e0 +Block 0018 [ 96]: 27e6ff694f3a7e44 +Block 0018 [ 97]: ba79e628d78eccdb +Block 0018 [ 98]: d3896748607f61f3 +Block 0018 [ 99]: 854a68e059d889e7 +Block 0018 [100]: 17cec322e53e3376 +Block 0018 [101]: e2a0da69fbe10025 +Block 0018 [102]: 125d98efed8be71b +Block 0018 [103]: 554a109e66331278 +Block 0018 [104]: 5f7d27d772887cf9 +Block 0018 [105]: 06666ff797d87c2b +Block 0018 [106]: 7a5e44a65427fbf1 +Block 0018 [107]: 3fefa1be4c489aaf +Block 0018 [108]: 031406bfb5cfdcf3 +Block 0018 [109]: d26b2c2a6f1a7bbe +Block 0018 [110]: 6fe546818e5f0997 +Block 0018 [111]: 05fbde7911b35967 +Block 0018 [112]: 922377a3eb2369cb +Block 0018 [113]: 754e283ffb70c99e +Block 0018 [114]: 3b7334104b59591c +Block 0018 [115]: cab8aeb7fc317a77 +Block 0018 [116]: f58d70ddb079d0af +Block 0018 [117]: 869d96630428ee86 +Block 0018 [118]: f792876a73b5557b +Block 0018 [119]: d95d44f60a27c85f +Block 0018 [120]: 1ce5feae87c3c213 +Block 0018 [121]: b5a536920eefc202 +Block 0018 [122]: b4b10901d5a76a60 +Block 0018 [123]: 37fec8e389f4692e +Block 0018 [124]: 3a2d7166807e2a10 +Block 0018 [125]: 97b37652df6d8c82 +Block 0018 [126]: c10e61a6454af63f +Block 0018 [127]: 7543572a7389b452 +Block 0019 [ 0]: 722ded4f56a565fb +Block 0019 [ 1]: 66f81b75a79a68f9 +Block 0019 [ 2]: 2ed3e3524e669534 +Block 0019 [ 3]: 3d0249646b4e5ceb +Block 0019 [ 4]: 23702f362b010609 +Block 0019 [ 5]: 66c14af9081b479c +Block 0019 [ 6]: fe76e828c7874bb5 +Block 0019 [ 7]: c9df351081f32a1a +Block 0019 [ 8]: f10f2645d1a94c61 +Block 0019 [ 9]: 8882d7a1ac2ebb6b +Block 0019 [ 10]: 60942a191d37a892 +Block 0019 [ 11]: 5d13500bcaf64c75 +Block 0019 [ 12]: e82b0f549cef7b8c +Block 0019 [ 13]: eaadf7ce53b92191 +Block 0019 [ 14]: 99bcb35755b3e095 +Block 0019 [ 15]: 37d06d28a2bc5920 +Block 0019 [ 16]: 96bfe103e6756fc6 +Block 0019 [ 17]: 9998b5c265a72545 +Block 0019 [ 18]: 2a19f9ad33a764f4 +Block 0019 [ 19]: 1f58324f51536c9d +Block 0019 [ 20]: cc1ed217c0b8fa81 +Block 0019 [ 21]: 8ddea022746359cb +Block 0019 [ 22]: 598c823a015eff37 +Block 0019 [ 23]: b61185018876e8d7 +Block 0019 [ 24]: a2c60b6f3af802e3 +Block 0019 [ 25]: f687430b8a1995e1 +Block 0019 [ 26]: 408885fd6d7e25e8 +Block 0019 [ 27]: b6c64003bb3f1fbf +Block 0019 [ 28]: 5685b41a4d53d6b8 +Block 0019 [ 29]: 4275961a2e03b3bf +Block 0019 [ 30]: ba8c2c7d52ce5eef +Block 0019 [ 31]: 4b7a2193a5a42fb6 +Block 0019 [ 32]: 82ef795089ef1b6b +Block 0019 [ 33]: b92848e62bb47aba +Block 0019 [ 34]: e3ada75122fc94c0 +Block 0019 [ 35]: c0100b3a7a64a3eb +Block 0019 [ 36]: 81a50e5cf971bfdf +Block 0019 [ 37]: 54b58468e7722c0d +Block 0019 [ 38]: 5be0ac9c0bbadf47 +Block 0019 [ 39]: 8bbc079daf10cd6c +Block 0019 [ 40]: c15bcc3683e366df +Block 0019 [ 41]: 8b5e324a9ed3f23f +Block 0019 [ 42]: 4aa03e81d768546d +Block 0019 [ 43]: fea6138015a2067f +Block 0019 [ 44]: 8c551c9fa08bc353 +Block 0019 [ 45]: abc876b122520670 +Block 0019 [ 46]: 2cd7558d5b3be7e0 +Block 0019 [ 47]: ccf6a4b816c33ec8 +Block 0019 [ 48]: baba433c49797864 +Block 0019 [ 49]: 197ede8f7c567203 +Block 0019 [ 50]: fae9d3460ac15df5 +Block 0019 [ 51]: f3adae0f64326ece +Block 0019 [ 52]: 6e528bdb47402901 +Block 0019 [ 53]: 2492762ac597d40a +Block 0019 [ 54]: 6ba4c5c3d5bb98f1 +Block 0019 [ 55]: cd54dbf31e0abbdc +Block 0019 [ 56]: 54a77ea4cd91551f +Block 0019 [ 57]: dbb8c88ac1eaa8c0 +Block 0019 [ 58]: f88ca1ca32f1e921 +Block 0019 [ 59]: 3cf0026636693684 +Block 0019 [ 60]: fe13df5cdc931e0e +Block 0019 [ 61]: 3e568d869926bfc6 +Block 0019 [ 62]: 12b1e4f3b127b510 +Block 0019 [ 63]: 9571189e9fc54658 +Block 0019 [ 64]: d8e0280cc71d7261 +Block 0019 [ 65]: 1414ad7e77dec5b5 +Block 0019 [ 66]: 9d50c531d4e3b1f1 +Block 0019 [ 67]: a837736eb0b178bf +Block 0019 [ 68]: c7c3f7c72c12f553 +Block 0019 [ 69]: 514e9b4b12844d0a +Block 0019 [ 70]: 099df6d12c31f66c +Block 0019 [ 71]: 6c6130e568dae72b +Block 0019 [ 72]: 026ffd1b61ef6c3f +Block 0019 [ 73]: 85efd65d354c2027 +Block 0019 [ 74]: 8d228ab3cc044105 +Block 0019 [ 75]: 3a7e4faeeccb8b06 +Block 0019 [ 76]: e1ead5f1b2a58f7c +Block 0019 [ 77]: 80e45edbc5b44843 +Block 0019 [ 78]: 417757c3dc6e2c89 +Block 0019 [ 79]: c5cef9b96a73f341 +Block 0019 [ 80]: d2d3360debbc854b +Block 0019 [ 81]: ea796d996d79773a +Block 0019 [ 82]: 43b9ec58d25ccb0d +Block 0019 [ 83]: 909a2980fafca057 +Block 0019 [ 84]: 957bbb801c361db5 +Block 0019 [ 85]: ce623364956f8eb1 +Block 0019 [ 86]: a9e1ea98da49fcfb +Block 0019 [ 87]: 084eb35a88326f27 +Block 0019 [ 88]: 80507bdf2e3a52c1 +Block 0019 [ 89]: 65e09bdedcdbfe26 +Block 0019 [ 90]: f9c5e870eab6e090 +Block 0019 [ 91]: 64c80b52255ace7e +Block 0019 [ 92]: cb9a1a29583766a7 +Block 0019 [ 93]: da6dbd5eb460785c +Block 0019 [ 94]: a78ad96bb297cb22 +Block 0019 [ 95]: 56f43ee98185b433 +Block 0019 [ 96]: 0be8bfd2f08db3c4 +Block 0019 [ 97]: 9a7df19eee797962 +Block 0019 [ 98]: b6846d0300b15563 +Block 0019 [ 99]: 2926611424a3c93a +Block 0019 [100]: 4e4bb76824d55a36 +Block 0019 [101]: 6390753096176e1b +Block 0019 [102]: b7fa767b6bfc44fb +Block 0019 [103]: d23a521d68c0cf75 +Block 0019 [104]: 51addd0e823b81ed +Block 0019 [105]: ec0627f8110db6a7 +Block 0019 [106]: db4f2d5cac87bd60 +Block 0019 [107]: 4c3cee848d16c717 +Block 0019 [108]: 7648ac62be70e5be +Block 0019 [109]: f5c6484cb942ac44 +Block 0019 [110]: b43fc27e9e6a4773 +Block 0019 [111]: b82a706ea829cb5b +Block 0019 [112]: 982b0c739e53385d +Block 0019 [113]: 1ebb4a34c10626c0 +Block 0019 [114]: 3e59c0dff3f1ec58 +Block 0019 [115]: 37a5c1a1a05f14ef +Block 0019 [116]: fe04a5fb0a9c8c3d +Block 0019 [117]: 736febc5e56a2aae +Block 0019 [118]: 01c6ae60f536f04c +Block 0019 [119]: 10ac08179e2a0a44 +Block 0019 [120]: 62eda4c56851c55a +Block 0019 [121]: 3655c086ab4dc453 +Block 0019 [122]: 6204a37f1668346b +Block 0019 [123]: d06115aa65a09d31 +Block 0019 [124]: cf4b6b55d0123805 +Block 0019 [125]: f205092073e33b99 +Block 0019 [126]: 33200ae2e1abaa05 +Block 0019 [127]: 44fc4dde9d1ebe43 +Block 0020 [ 0]: 41b07971e71a2e54 +Block 0020 [ 1]: 6f2089d15ada03ee +Block 0020 [ 2]: 6d0330debb1e1bc7 +Block 0020 [ 3]: 9d7ab01519234721 +Block 0020 [ 4]: b7183d6569ecf0b9 +Block 0020 [ 5]: 853a4e3facbc0533 +Block 0020 [ 6]: b06e176fa56954a7 +Block 0020 [ 7]: 27f4c2e2b2be4b39 +Block 0020 [ 8]: 33080d0850a86c1b +Block 0020 [ 9]: 2d8b3a453d3cbb50 +Block 0020 [ 10]: f4147219e8bcd1d4 +Block 0020 [ 11]: 430706f6860388f2 +Block 0020 [ 12]: 51c540fee2514f0d +Block 0020 [ 13]: 8ccdad415ea6ee66 +Block 0020 [ 14]: f520cd207b48edc6 +Block 0020 [ 15]: 87a9d3aba575a7ce +Block 0020 [ 16]: 210f9df0bc9e9108 +Block 0020 [ 17]: ee022c298f3942b6 +Block 0020 [ 18]: 9bc38103277c849c +Block 0020 [ 19]: c75db3f801f64ec0 +Block 0020 [ 20]: 2ae94ab7f9f8942f +Block 0020 [ 21]: a257534ac5235d94 +Block 0020 [ 22]: 188a094687c623a3 +Block 0020 [ 23]: d08168250ca805e3 +Block 0020 [ 24]: f3e4d78cf027612a +Block 0020 [ 25]: 392503cd6ae2f3b0 +Block 0020 [ 26]: 00a1bc98866892b4 +Block 0020 [ 27]: 52d5b875e04684e0 +Block 0020 [ 28]: 10eaadda403ba853 +Block 0020 [ 29]: 31fb34dee9418d93 +Block 0020 [ 30]: 19e4ab017f8d5d32 +Block 0020 [ 31]: 58154f814ce6de3b +Block 0020 [ 32]: 300d30a35d50ff55 +Block 0020 [ 33]: 5bc5a82f48804532 +Block 0020 [ 34]: 1b0f36ce4856deb0 +Block 0020 [ 35]: 825a2dbdb23e6f97 +Block 0020 [ 36]: 77966bdabcdbc0a5 +Block 0020 [ 37]: e4399601c93be292 +Block 0020 [ 38]: d8af3dc1dc33bf15 +Block 0020 [ 39]: 86ef6420ae6283cc +Block 0020 [ 40]: 455268aba83b61f2 +Block 0020 [ 41]: d2c002689ec6cfb7 +Block 0020 [ 42]: 2045ec9ab1b82eaa +Block 0020 [ 43]: f090b6215091285b +Block 0020 [ 44]: db2f72dbec97da20 +Block 0020 [ 45]: ad4d8b2ff8b2135e +Block 0020 [ 46]: a5b25c830e505d23 +Block 0020 [ 47]: a9faa876a6161e58 +Block 0020 [ 48]: 9aacdb2111fa9989 +Block 0020 [ 49]: 6f29852abb002e42 +Block 0020 [ 50]: 147df596b36eb419 +Block 0020 [ 51]: 70059f6668ce6269 +Block 0020 [ 52]: 7636a5a116415e7a +Block 0020 [ 53]: de880241472a104b +Block 0020 [ 54]: bcc7b804ee025dcd +Block 0020 [ 55]: 3b7ecef3fd470a6a +Block 0020 [ 56]: 6139fcff135af1a9 +Block 0020 [ 57]: 703ef43ec763d407 +Block 0020 [ 58]: edfa811c241aaab8 +Block 0020 [ 59]: 4505a1b1377c7490 +Block 0020 [ 60]: 017655ace5ef1544 +Block 0020 [ 61]: e65824ab647d2c63 +Block 0020 [ 62]: bbf0c4e392476d22 +Block 0020 [ 63]: 09222639f2e1b822 +Block 0020 [ 64]: 1b45cf3b00b6cb95 +Block 0020 [ 65]: 4550026be5fa7271 +Block 0020 [ 66]: c06ad1f579d397ea +Block 0020 [ 67]: 64af21038c5e7b8a +Block 0020 [ 68]: 5b20ab16b33f03b9 +Block 0020 [ 69]: e849677673c9f8a8 +Block 0020 [ 70]: 3fe654d05ce1ae5e +Block 0020 [ 71]: 5825aba0671ac6e7 +Block 0020 [ 72]: 426d8a7b658fae5e +Block 0020 [ 73]: 0b7c48925a17445d +Block 0020 [ 74]: cd814a10d3c250a9 +Block 0020 [ 75]: e1b89d7598c24c73 +Block 0020 [ 76]: 8fd426f1e17e74c5 +Block 0020 [ 77]: f5a5ee0f82556b39 +Block 0020 [ 78]: 493624eb4ef93c0e +Block 0020 [ 79]: aea2a200cbc14750 +Block 0020 [ 80]: 808720a7c98fe9ff +Block 0020 [ 81]: 38ef2a776caad830 +Block 0020 [ 82]: 03ebc1bc2b48add4 +Block 0020 [ 83]: e0b48d9257cffc58 +Block 0020 [ 84]: b65a3be5a325716c +Block 0020 [ 85]: 45978217eda2c997 +Block 0020 [ 86]: 733948d9a58f9ae9 +Block 0020 [ 87]: b7b731f51be4173a +Block 0020 [ 88]: 9b28a46c6801aefc +Block 0020 [ 89]: 3e7391b2e7dfcbe4 +Block 0020 [ 90]: 8ea972520400f578 +Block 0020 [ 91]: 91949581521e1e4b +Block 0020 [ 92]: 1d9aab7d0c9209c6 +Block 0020 [ 93]: 9e289a904e90a578 +Block 0020 [ 94]: c580ae13f3a13a7f +Block 0020 [ 95]: 0975acd1f64f31c2 +Block 0020 [ 96]: d880c8480b663a97 +Block 0020 [ 97]: b20a8a30f36969b2 +Block 0020 [ 98]: 494bbd11053ada9d +Block 0020 [ 99]: 6c5976a5348e6cf7 +Block 0020 [100]: 7f6c2e22a6603550 +Block 0020 [101]: a7fa0251004384bb +Block 0020 [102]: a7a22b9632283a45 +Block 0020 [103]: fc0986d873115470 +Block 0020 [104]: 71555418129d0b36 +Block 0020 [105]: 9e00a18a599c1fea +Block 0020 [106]: 6deaac74ca260a50 +Block 0020 [107]: e1c8fe4ef7a9de6d +Block 0020 [108]: 01171cb695ed590d +Block 0020 [109]: 47bb44260c897574 +Block 0020 [110]: 530fc16d6918e1b9 +Block 0020 [111]: e8df2c3b9139fd0b +Block 0020 [112]: 4cb5e096924f0984 +Block 0020 [113]: 027123d359f10fb0 +Block 0020 [114]: 55027b0c9f2435bd +Block 0020 [115]: 272d5f7961436e9c +Block 0020 [116]: e5b9d9a32412556f +Block 0020 [117]: 457880a2978e3c7d +Block 0020 [118]: 035359bb4cc2bf39 +Block 0020 [119]: 106c5417cb96c096 +Block 0020 [120]: 3873b238fbff0942 +Block 0020 [121]: 17ae8af56a1c42e0 +Block 0020 [122]: d1ba5b1140949f1f +Block 0020 [123]: e47d23a41498eb54 +Block 0020 [124]: 0c90f5bafd925619 +Block 0020 [125]: 9ea964113672b524 +Block 0020 [126]: 57728a9955920a13 +Block 0020 [127]: 35977a9645b06609 +Block 0021 [ 0]: 99c90699f26a1583 +Block 0021 [ 1]: d62506b1691ce83e +Block 0021 [ 2]: f95c5d44ea02239c +Block 0021 [ 3]: fcf27c44241cd6c8 +Block 0021 [ 4]: a0d86491c7ceb500 +Block 0021 [ 5]: 4dd10f8ab9541a9f +Block 0021 [ 6]: ae17a91916abe872 +Block 0021 [ 7]: 9d67d7d00fbe0a70 +Block 0021 [ 8]: f1a88d532cd28a63 +Block 0021 [ 9]: 39dd4f50229a82bf +Block 0021 [ 10]: 76a06d0dee8b8ade +Block 0021 [ 11]: 9aef30b84382c629 +Block 0021 [ 12]: 6ac22e4389612006 +Block 0021 [ 13]: d6f9d4d874e6e975 +Block 0021 [ 14]: 93dca20f9d1e625c +Block 0021 [ 15]: 2b264238671a0857 +Block 0021 [ 16]: a0bd56d8e2e3f336 +Block 0021 [ 17]: 9e854d3d7dba0d74 +Block 0021 [ 18]: a1e92df035152bd8 +Block 0021 [ 19]: 99d496cda4159e13 +Block 0021 [ 20]: a774e449e3e60348 +Block 0021 [ 21]: d1ac8ce6802fc4a8 +Block 0021 [ 22]: 97e20ec345140420 +Block 0021 [ 23]: 9f61750cd5ad600c +Block 0021 [ 24]: 7fe30c292f6519a2 +Block 0021 [ 25]: 45b180ba23bd51ec +Block 0021 [ 26]: a21343dd46c044f3 +Block 0021 [ 27]: 7bbb471ba8cff820 +Block 0021 [ 28]: 3ecad47da26e6430 +Block 0021 [ 29]: 61cb0da0292bcba7 +Block 0021 [ 30]: e419902f76899dee +Block 0021 [ 31]: 38525a26a35795dd +Block 0021 [ 32]: fcb9b939e7f343f0 +Block 0021 [ 33]: 6494c6a7a62d017f +Block 0021 [ 34]: d4a8a76c81242c2a +Block 0021 [ 35]: 7a6343b883eca4c3 +Block 0021 [ 36]: 6b52b95e7513d6cf +Block 0021 [ 37]: bce9e80e22a770db +Block 0021 [ 38]: 34996a31fed99173 +Block 0021 [ 39]: d75d7573d84fa88e +Block 0021 [ 40]: cc9e1bac5dad04de +Block 0021 [ 41]: a3b704494d792b36 +Block 0021 [ 42]: 0b0e12bcf6320ed3 +Block 0021 [ 43]: d28103a70d3e3655 +Block 0021 [ 44]: a177e02a07d98275 +Block 0021 [ 45]: 79ea910a8dd1c191 +Block 0021 [ 46]: fb03b764354a515f +Block 0021 [ 47]: 68a2728a2f946b07 +Block 0021 [ 48]: 996e901859fe60c4 +Block 0021 [ 49]: 5527efc44a3296a2 +Block 0021 [ 50]: 5845975faf68289b +Block 0021 [ 51]: 73d6ec705f545c49 +Block 0021 [ 52]: 5fa6778e2931528c +Block 0021 [ 53]: d9b6ddfe8040afd0 +Block 0021 [ 54]: 47a62e52424a7e33 +Block 0021 [ 55]: 47d07505251483e4 +Block 0021 [ 56]: 22ab3a448d5d134f +Block 0021 [ 57]: 4ce926e1a6df0cb8 +Block 0021 [ 58]: 72e00206862d8fa3 +Block 0021 [ 59]: 4b21559bab3f86f9 +Block 0021 [ 60]: 5a980c3b46d2be8e +Block 0021 [ 61]: 2ad9c2bcfe81e3b0 +Block 0021 [ 62]: 3bc624dfc37b8678 +Block 0021 [ 63]: 6d0d890bf0e9383f +Block 0021 [ 64]: 13d4089c25ec8ffe +Block 0021 [ 65]: c6e423ff6deb38d0 +Block 0021 [ 66]: ed6efbb604ad58c3 +Block 0021 [ 67]: efff5f38588ee612 +Block 0021 [ 68]: e3a7dae5a4ed29f1 +Block 0021 [ 69]: 38f2b792dfa1f064 +Block 0021 [ 70]: 94df3e2e745001a8 +Block 0021 [ 71]: 191a9276726070d9 +Block 0021 [ 72]: a510d07a141e7c38 +Block 0021 [ 73]: 5187183f8bb6e37a +Block 0021 [ 74]: a89e8c635f78a474 +Block 0021 [ 75]: ef39d133b7b710bd +Block 0021 [ 76]: ca5d7f377ef97849 +Block 0021 [ 77]: d7fb3c6e198ce5c4 +Block 0021 [ 78]: 16df2cc9d3071253 +Block 0021 [ 79]: 304e49111ea36b61 +Block 0021 [ 80]: 5919cd2abde8b09b +Block 0021 [ 81]: b27c8cb92e63932c +Block 0021 [ 82]: a03cfa230885f078 +Block 0021 [ 83]: 8855f9e6a50e0f00 +Block 0021 [ 84]: 83776b22df33ddf2 +Block 0021 [ 85]: 9275ae6a25ef9eb7 +Block 0021 [ 86]: 77f4f48c8d1fe5aa +Block 0021 [ 87]: 69e9c3ee6a313b91 +Block 0021 [ 88]: 34b2295d5b3cdfcb +Block 0021 [ 89]: 12ff0fd856bf17ec +Block 0021 [ 90]: 587825e8731f7532 +Block 0021 [ 91]: 7dc7d996c3b4dce1 +Block 0021 [ 92]: 5f94801d9ed7653b +Block 0021 [ 93]: 348f649bc8b74dac +Block 0021 [ 94]: dad511c9cd3dcd6c +Block 0021 [ 95]: 0d917c4a0c43537f +Block 0021 [ 96]: 543656e021e84162 +Block 0021 [ 97]: 1b5ad2836aeceb01 +Block 0021 [ 98]: 4ec9892cdf9bfaab +Block 0021 [ 99]: 8d95edf99171f888 +Block 0021 [100]: e184a5d6e42b9a7d +Block 0021 [101]: 23d27bc89de6801d +Block 0021 [102]: 236dc56a8fb5bb28 +Block 0021 [103]: f4e9ad75c9164dfb +Block 0021 [104]: ca92660dd6587d3a +Block 0021 [105]: 2822f9d7244bcc6d +Block 0021 [106]: 48b9cdca7b7159e1 +Block 0021 [107]: 97aa097f37692268 +Block 0021 [108]: 55e71fb044d7240a +Block 0021 [109]: fda7d8cead56d549 +Block 0021 [110]: af1e22ae2acae662 +Block 0021 [111]: 0bcbdf3af40e9c02 +Block 0021 [112]: 36b682b884dd3d7f +Block 0021 [113]: 5d29a9d2d1151a44 +Block 0021 [114]: 854dba4dc22926c5 +Block 0021 [115]: 75bccec357d65282 +Block 0021 [116]: 5fde2a2fd1a4d824 +Block 0021 [117]: ed6998c95c8c6031 +Block 0021 [118]: e42e6570c0ad8465 +Block 0021 [119]: 5363ae9589974f9d +Block 0021 [120]: 40209c1636899495 +Block 0021 [121]: 12f654e59f60f899 +Block 0021 [122]: 823fe8ba8eeb4649 +Block 0021 [123]: aa89425aa56b89b0 +Block 0021 [124]: 1c9a89ffa7aa2e7d +Block 0021 [125]: 0a1444d8cc22176f +Block 0021 [126]: d609a1c4ba94fa64 +Block 0021 [127]: ced53958b80bec2b +Block 0022 [ 0]: 1da00099e66ef42d +Block 0022 [ 1]: 60051fa3148b044e +Block 0022 [ 2]: 5dffa61c0c4dd432 +Block 0022 [ 3]: 18ac1fc7126204a2 +Block 0022 [ 4]: 753c3e883f63ef2f +Block 0022 [ 5]: a06af327af4c353b +Block 0022 [ 6]: 2c7e5aeb619e62cd +Block 0022 [ 7]: 067369e344526c25 +Block 0022 [ 8]: cf2dc2a2129f8283 +Block 0022 [ 9]: 6a7c0f5c06bffe14 +Block 0022 [ 10]: 4dd26b4524d0ea86 +Block 0022 [ 11]: a2e396830d604849 +Block 0022 [ 12]: ef540d936920acf0 +Block 0022 [ 13]: 53ef06d1f724d53a +Block 0022 [ 14]: 54ae1738225434d1 +Block 0022 [ 15]: d1835a92bc86f620 +Block 0022 [ 16]: 2aab6f075442a3cc +Block 0022 [ 17]: 603b2ca9761f8d49 +Block 0022 [ 18]: c6568ac3285d529e +Block 0022 [ 19]: 58fdad7c1b55134e +Block 0022 [ 20]: 90624214e9a57b86 +Block 0022 [ 21]: a6cd63cab7904bfb +Block 0022 [ 22]: 83ad727778cde839 +Block 0022 [ 23]: 9ab8afa2286e842e +Block 0022 [ 24]: edbdb92663550224 +Block 0022 [ 25]: fbd29a092c3e61d4 +Block 0022 [ 26]: c8e6d473fa37ab66 +Block 0022 [ 27]: d673deaa1518e949 +Block 0022 [ 28]: bab2538d9670730a +Block 0022 [ 29]: 8781d6b5b1282389 +Block 0022 [ 30]: 889a278999b787f5 +Block 0022 [ 31]: 5c9130cc500dcff6 +Block 0022 [ 32]: 2aa0f7ccb6d323ce +Block 0022 [ 33]: 98aa0c33857b56ae +Block 0022 [ 34]: dd2d61bed7326a1f +Block 0022 [ 35]: e8ae346eaa70e1b9 +Block 0022 [ 36]: 0ca297ee47dc5c23 +Block 0022 [ 37]: a85828fd8f6a48f1 +Block 0022 [ 38]: 3fada5811a2f45ff +Block 0022 [ 39]: a4a18e6dec23bce2 +Block 0022 [ 40]: 9dde4721c7b04949 +Block 0022 [ 41]: 8fd9ad826dbd0158 +Block 0022 [ 42]: c1ed3966f87f77cc +Block 0022 [ 43]: aa5fc4506ce403a0 +Block 0022 [ 44]: ac4850b5ea87864e +Block 0022 [ 45]: f5735e71c2cb42a4 +Block 0022 [ 46]: 823529430c10d420 +Block 0022 [ 47]: 446df0a78e000e46 +Block 0022 [ 48]: 8771cc750136b8e5 +Block 0022 [ 49]: 2e2628823443a8db +Block 0022 [ 50]: c6a6187323f4cd6b +Block 0022 [ 51]: 265ab59a5990dc4f +Block 0022 [ 52]: b0c3110cdc2358f1 +Block 0022 [ 53]: bcf49b9c3004c09d +Block 0022 [ 54]: 9e83ebc5241caa96 +Block 0022 [ 55]: ef830b3712383b1f +Block 0022 [ 56]: 17f539868f6e9713 +Block 0022 [ 57]: db242d8e258930e1 +Block 0022 [ 58]: 88f6704ee750c93d +Block 0022 [ 59]: 98009f6dfda71343 +Block 0022 [ 60]: 211be7123434fa67 +Block 0022 [ 61]: 06d86941cf2a41d4 +Block 0022 [ 62]: 934e8ed1001c3173 +Block 0022 [ 63]: 5ff02cafaab08125 +Block 0022 [ 64]: 0e9cbe1181a2d948 +Block 0022 [ 65]: d604a87b2427a6d7 +Block 0022 [ 66]: 067b185ccdf74dfe +Block 0022 [ 67]: 52e829ca3ed629ea +Block 0022 [ 68]: 9736d99f80701d87 +Block 0022 [ 69]: 974b0fcce11b2b77 +Block 0022 [ 70]: bd0d279e5421bbb8 +Block 0022 [ 71]: 29ee3bee260e3d67 +Block 0022 [ 72]: ee83a1cb54c014e2 +Block 0022 [ 73]: 2e0108d2ddb29065 +Block 0022 [ 74]: b927a78661625a92 +Block 0022 [ 75]: d320d1edd78cdea1 +Block 0022 [ 76]: 90216cccaa408bcb +Block 0022 [ 77]: a30bf5e18568c173 +Block 0022 [ 78]: c4eeff092463f5bc +Block 0022 [ 79]: 6a02e06c90988918 +Block 0022 [ 80]: 75aa0513c85bee76 +Block 0022 [ 81]: 0d90c10fbfc98f6a +Block 0022 [ 82]: 22b1277d2a8a16f5 +Block 0022 [ 83]: cee277dd005434d8 +Block 0022 [ 84]: 74b9b4123bcd58d4 +Block 0022 [ 85]: 9f595ac2fae9e5d0 +Block 0022 [ 86]: 11abb45b6c9e5e94 +Block 0022 [ 87]: a5b6868faac30a9a +Block 0022 [ 88]: beb8eb90a2d94bdc +Block 0022 [ 89]: 85a2eb37e235c906 +Block 0022 [ 90]: 9812df8e1698ebeb +Block 0022 [ 91]: 80fd679454d57b52 +Block 0022 [ 92]: dedd235f5d241dc2 +Block 0022 [ 93]: 58dc832f313f86c9 +Block 0022 [ 94]: ca49428581158610 +Block 0022 [ 95]: 5592c3992f35b6a0 +Block 0022 [ 96]: e918d5519bc97f48 +Block 0022 [ 97]: dbed179659801803 +Block 0022 [ 98]: f3d1e84ec1682838 +Block 0022 [ 99]: 81d088fb0163ce0c +Block 0022 [100]: 44ab8f0a5f398e60 +Block 0022 [101]: 44d8d113cd76dd7e +Block 0022 [102]: 36bec6685b0e2d9f +Block 0022 [103]: 0eb2d2eac32b9963 +Block 0022 [104]: 4319f79d45e9a910 +Block 0022 [105]: e91892e798e42160 +Block 0022 [106]: fc49ca22cf5ee046 +Block 0022 [107]: ae47cad9b1a1efc0 +Block 0022 [108]: 7a2169fbcb66d15a +Block 0022 [109]: 8f288a3ed7cfb7a4 +Block 0022 [110]: 54c6d694a74d8134 +Block 0022 [111]: eb036b45a1f164cd +Block 0022 [112]: 1c2b92bfca286309 +Block 0022 [113]: d8f1e23b89f1b7fe +Block 0022 [114]: 226ed913a04440a9 +Block 0022 [115]: 820a7e2c62b61278 +Block 0022 [116]: 317c3873e97ad322 +Block 0022 [117]: 5fd5401f349640d4 +Block 0022 [118]: 6c261c7094ca1894 +Block 0022 [119]: 6382563616dde40e +Block 0022 [120]: a38efddd2856ad4e +Block 0022 [121]: 1a69eefa3f5d897c +Block 0022 [122]: d7facfcc348f5df3 +Block 0022 [123]: 774ad01cea97b6a1 +Block 0022 [124]: 310b32b642e47ac4 +Block 0022 [125]: 5cf3f59234fdabd9 +Block 0022 [126]: afcde19d8250f01a +Block 0022 [127]: 73328111c1ff8e50 +Block 0023 [ 0]: faf8e9819ed5bddf +Block 0023 [ 1]: eccb38057063208a +Block 0023 [ 2]: 3adf2ab57c6b8f56 +Block 0023 [ 3]: 7dcf4b78f7bb04b3 +Block 0023 [ 4]: 4d2f1ba17b270c57 +Block 0023 [ 5]: c864e4d4a99505c3 +Block 0023 [ 6]: a982c508981e425a +Block 0023 [ 7]: 84cb024b0c7d338b +Block 0023 [ 8]: 029d5ef435e63d19 +Block 0023 [ 9]: fc3e60863ada3dae +Block 0023 [ 10]: 737600c47f97ce5e +Block 0023 [ 11]: 65217fb0d1dadfca +Block 0023 [ 12]: bedac75aceac13be +Block 0023 [ 13]: 13462535ec401e42 +Block 0023 [ 14]: b90362ff75f3748c +Block 0023 [ 15]: 2f14623975e76b86 +Block 0023 [ 16]: 5da24444ab904020 +Block 0023 [ 17]: cbe1f774a01e2f3b +Block 0023 [ 18]: c5d93ae8ce4b962b +Block 0023 [ 19]: 222078ec418a87f9 +Block 0023 [ 20]: 80eda9084671249c +Block 0023 [ 21]: 407a498fce9f0d04 +Block 0023 [ 22]: d2b0138e498b6e94 +Block 0023 [ 23]: c59c1082ad4b29f6 +Block 0023 [ 24]: 46825537441ee810 +Block 0023 [ 25]: 1042ed08a5bf3469 +Block 0023 [ 26]: 3c0e1d1399319bcc +Block 0023 [ 27]: 123d3ce43366c509 +Block 0023 [ 28]: 00d397e032073e5e +Block 0023 [ 29]: 530fe801dab60de3 +Block 0023 [ 30]: ef7ad81167eb858a +Block 0023 [ 31]: 9492afcc63f9ea32 +Block 0023 [ 32]: bfe0b391b47f7973 +Block 0023 [ 33]: b639f555332b4fe3 +Block 0023 [ 34]: e1129cba1e65010f +Block 0023 [ 35]: e9b83917c8c13e91 +Block 0023 [ 36]: d2670a2b61cacd37 +Block 0023 [ 37]: 4e78ec9b164e5bf1 +Block 0023 [ 38]: 3092b980e27b7a1f +Block 0023 [ 39]: 793e9e597fae61ec +Block 0023 [ 40]: 7dda455f6c75d509 +Block 0023 [ 41]: bec876d0c771025f +Block 0023 [ 42]: b78a89de75325485 +Block 0023 [ 43]: a9f8958f42f33a10 +Block 0023 [ 44]: 0b3447955fb4e758 +Block 0023 [ 45]: 28446ee528e4cd59 +Block 0023 [ 46]: 604e8bd784cd3ba6 +Block 0023 [ 47]: 3c912cc538cca5b3 +Block 0023 [ 48]: 741c792f2c3a4a0b +Block 0023 [ 49]: b4722b59af1a557a +Block 0023 [ 50]: e52547909fcce41c +Block 0023 [ 51]: 68b46f3279fbf078 +Block 0023 [ 52]: 85f8e8bc7cf12bf3 +Block 0023 [ 53]: ad38c4a35d905536 +Block 0023 [ 54]: 063595dad207d323 +Block 0023 [ 55]: f71031a227512f69 +Block 0023 [ 56]: 4ac439cdebafec2d +Block 0023 [ 57]: e078b646b0719629 +Block 0023 [ 58]: 1c4b81ae2e88830d +Block 0023 [ 59]: 79f0d8cdd68f73b6 +Block 0023 [ 60]: a1fafd44511427c7 +Block 0023 [ 61]: 66d93adf43233b03 +Block 0023 [ 62]: 1636143df56e8772 +Block 0023 [ 63]: 5cedadb5f28e2570 +Block 0023 [ 64]: c6ff0ff6a873f2f7 +Block 0023 [ 65]: 199c0fe56105dbd8 +Block 0023 [ 66]: 1d536db41a15e3ec +Block 0023 [ 67]: 2f3c1ccac0000382 +Block 0023 [ 68]: a1f851c2d4b678ff +Block 0023 [ 69]: 0b36f32d125eb826 +Block 0023 [ 70]: 930f979e90e57598 +Block 0023 [ 71]: 12333ed69bef1402 +Block 0023 [ 72]: e687b3b4a3161910 +Block 0023 [ 73]: 12892d2c474af808 +Block 0023 [ 74]: 0a49954cfa818951 +Block 0023 [ 75]: 941d67e1c257e64b +Block 0023 [ 76]: 7e1dab4cc29a7933 +Block 0023 [ 77]: 5680a5c2b4a0093b +Block 0023 [ 78]: 1c8ebc520f63dc7d +Block 0023 [ 79]: 954009640c5cd903 +Block 0023 [ 80]: 55c38777364d760d +Block 0023 [ 81]: ce1a639680c6a023 +Block 0023 [ 82]: 511ee04acd10108e +Block 0023 [ 83]: d1510a9008f09249 +Block 0023 [ 84]: 7b9a19216657b159 +Block 0023 [ 85]: faa8582af2b3db8e +Block 0023 [ 86]: c4061811ead08447 +Block 0023 [ 87]: cad84668ae016d39 +Block 0023 [ 88]: ef3640496cc9588a +Block 0023 [ 89]: ac39f3b0ceb4aa9a +Block 0023 [ 90]: b26a9ecd567574dc +Block 0023 [ 91]: 00998111e686b2c9 +Block 0023 [ 92]: 973a00f3999a3a92 +Block 0023 [ 93]: c161a546f0c3e1b2 +Block 0023 [ 94]: de438b4c09d5854c +Block 0023 [ 95]: 54d7959cb76b95c8 +Block 0023 [ 96]: 55f7e6bcaac2d916 +Block 0023 [ 97]: 2a5de324b05240c4 +Block 0023 [ 98]: 1ac57ed83b36faad +Block 0023 [ 99]: da4099839839045b +Block 0023 [100]: 948131c194fe93e7 +Block 0023 [101]: 25001100a7255b6f +Block 0023 [102]: 7d5e296f2bf89d76 +Block 0023 [103]: 14a719781b1d50c8 +Block 0023 [104]: b5e48bd6f1ae0d9c +Block 0023 [105]: 69fe928c15164672 +Block 0023 [106]: 84aedfb328f02943 +Block 0023 [107]: ef8562e07624e197 +Block 0023 [108]: 5a6c16acadaa34be +Block 0023 [109]: 88867f07c62771b1 +Block 0023 [110]: f64097b47fe933c2 +Block 0023 [111]: 51859b2ba28f5018 +Block 0023 [112]: c96039bb54f111cc +Block 0023 [113]: e1b258bd6911df4e +Block 0023 [114]: 0815493ac5753d45 +Block 0023 [115]: 1f518bdb944073fb +Block 0023 [116]: 5333e99b8fba57ce +Block 0023 [117]: b6f8303b0458a5b4 +Block 0023 [118]: 1aa8b1886f0b33bf +Block 0023 [119]: 2c35ae0c01ff50ef +Block 0023 [120]: 6654fb783d5aa92d +Block 0023 [121]: 1e4340d082bc77c4 +Block 0023 [122]: 69d9b51e51cd50ec +Block 0023 [123]: 4235db7b068113c4 +Block 0023 [124]: fdc2d233d7d7bafa +Block 0023 [125]: a18c7f0cdd7e8890 +Block 0023 [126]: 5b42758a3efe822b +Block 0023 [127]: f4638cf24778606d +Block 0024 [ 0]: eede245f62d6b577 +Block 0024 [ 1]: c6b62ea9fdc6142b +Block 0024 [ 2]: 07a53b2091483089 +Block 0024 [ 3]: 1c93aea4d9a35d62 +Block 0024 [ 4]: c1c60c54c0c0d661 +Block 0024 [ 5]: 332221c32a0d4d91 +Block 0024 [ 6]: f308d5930bec5a1d +Block 0024 [ 7]: c82a96464710a6db +Block 0024 [ 8]: 13baec0de6add849 +Block 0024 [ 9]: b21027d16856a35c +Block 0024 [ 10]: d4120090de5d2acf +Block 0024 [ 11]: d59cf58286fd56b6 +Block 0024 [ 12]: f1eee49bc25f62ea +Block 0024 [ 13]: 80dcd989334316cb +Block 0024 [ 14]: 8fa965baa1026e5e +Block 0024 [ 15]: 23004dfde370bcff +Block 0024 [ 16]: 1bf2b01c7eaea454 +Block 0024 [ 17]: f28c8ba81c2679e2 +Block 0024 [ 18]: 48a7f8e65ea3c438 +Block 0024 [ 19]: 1860f45e52dbdff8 +Block 0024 [ 20]: a6541ed3cfe56f87 +Block 0024 [ 21]: c0c390bf2874899f +Block 0024 [ 22]: 8cda1867dd43bae3 +Block 0024 [ 23]: 7e3737d3238e4828 +Block 0024 [ 24]: 0554841098d2f975 +Block 0024 [ 25]: ba874d0cfbe4b8ab +Block 0024 [ 26]: 3d4ee63595093a5a +Block 0024 [ 27]: 1831ccf9f743da0f +Block 0024 [ 28]: 256415728708fdcf +Block 0024 [ 29]: b89ac656cc195d25 +Block 0024 [ 30]: 762e4d59c63b9928 +Block 0024 [ 31]: 1c8e480bbeca26b1 +Block 0024 [ 32]: 338efb2028c0d276 +Block 0024 [ 33]: 4e65e5221e6c5930 +Block 0024 [ 34]: 7be1b555ee8e1874 +Block 0024 [ 35]: 73de51347a49cc52 +Block 0024 [ 36]: 5151e631e2068475 +Block 0024 [ 37]: cb849b87e9fbb077 +Block 0024 [ 38]: a80d236c4eaad045 +Block 0024 [ 39]: c4743fd9a8ab34f2 +Block 0024 [ 40]: 05086ce35f1883f3 +Block 0024 [ 41]: f0c6c851c57f3f3a +Block 0024 [ 42]: baee7da68afca3f7 +Block 0024 [ 43]: 9df2ab3434594dd8 +Block 0024 [ 44]: 21de27a863a0aff4 +Block 0024 [ 45]: 8c6e79b495631870 +Block 0024 [ 46]: f0040b82d1f897ab +Block 0024 [ 47]: 4997a4b76d71ff0f +Block 0024 [ 48]: 77d45defbcbac7d3 +Block 0024 [ 49]: 4a6d6b54eefd88f3 +Block 0024 [ 50]: a25ebeab65950052 +Block 0024 [ 51]: d1479e6759f85ac8 +Block 0024 [ 52]: 73b34805eb4c7a5d +Block 0024 [ 53]: 1839fb1fa6848c68 +Block 0024 [ 54]: b16fcedc4a4c8c10 +Block 0024 [ 55]: 16742af6d1a4e07f +Block 0024 [ 56]: 38902d0357d9cd3b +Block 0024 [ 57]: e876ace74310956a +Block 0024 [ 58]: 625cc2ce73444d0e +Block 0024 [ 59]: 5f56ff8c51eae272 +Block 0024 [ 60]: 07d4f94ae96c62e9 +Block 0024 [ 61]: 8995abc4d648eb30 +Block 0024 [ 62]: 61a9f3fe748a4f06 +Block 0024 [ 63]: cf61aa691d442796 +Block 0024 [ 64]: 338b61d249f3b5e9 +Block 0024 [ 65]: 717365edf81451f1 +Block 0024 [ 66]: 9a742011e04f375d +Block 0024 [ 67]: 3c0252fe6de830ef +Block 0024 [ 68]: 6899219a79fdc193 +Block 0024 [ 69]: 504a88f79250caa8 +Block 0024 [ 70]: f4e05155f4831a41 +Block 0024 [ 71]: 62fee29baa3057cb +Block 0024 [ 72]: 3390df119145c16c +Block 0024 [ 73]: d906cdd000e605a7 +Block 0024 [ 74]: 325fb08618b04c18 +Block 0024 [ 75]: 2acbe70a78ff91aa +Block 0024 [ 76]: 5c96139edb859139 +Block 0024 [ 77]: 8da58b7f1bd0ac62 +Block 0024 [ 78]: 8e2f4141ed578ad4 +Block 0024 [ 79]: caea07cd0ce4b5bb +Block 0024 [ 80]: a7c2ffdd3516b9e4 +Block 0024 [ 81]: ac43c5e993b9ce14 +Block 0024 [ 82]: 481b6801f8c2063d +Block 0024 [ 83]: 0841d396219513f6 +Block 0024 [ 84]: 3d80af294dfd644d +Block 0024 [ 85]: 1befd999c362b731 +Block 0024 [ 86]: dea7977c821944f3 +Block 0024 [ 87]: 4da1b2e0d258d35d +Block 0024 [ 88]: 23a9c13ca2a0b486 +Block 0024 [ 89]: 7ba4f890dfd2b82c +Block 0024 [ 90]: 27cfe434289ae1c4 +Block 0024 [ 91]: 68ae670da4c955bf +Block 0024 [ 92]: a1c07262a98aeb32 +Block 0024 [ 93]: 2f6b00fabadaac7c +Block 0024 [ 94]: 0b5225ee63dabb02 +Block 0024 [ 95]: 3a6700470ef3e0e2 +Block 0024 [ 96]: c27e4da0a2ee8b4d +Block 0024 [ 97]: 4ce0d0d2911807e5 +Block 0024 [ 98]: 884397c050782809 +Block 0024 [ 99]: 381d7284b47cc0c7 +Block 0024 [100]: 76218d054ed13066 +Block 0024 [101]: 3e55924005389d0e +Block 0024 [102]: 4e4e054ee33ce746 +Block 0024 [103]: bf52a035a9414a25 +Block 0024 [104]: 7aa1b6ccaf1d8994 +Block 0024 [105]: 3dc748c450ed599e +Block 0024 [106]: 8cacad0b108b0f28 +Block 0024 [107]: 1a432b914c8d5210 +Block 0024 [108]: 7d818e692d3f9972 +Block 0024 [109]: edea37c6abb5dfa2 +Block 0024 [110]: cd092a596f8ec84d +Block 0024 [111]: d126fb730532177a +Block 0024 [112]: 3644902afe1a1fb5 +Block 0024 [113]: ab379711a8617714 +Block 0024 [114]: 5cedc841b324d74f +Block 0024 [115]: 7a1923e48401c96b +Block 0024 [116]: 0d13f3c7afedf5ce +Block 0024 [117]: 3a254a12b84e65c2 +Block 0024 [118]: d2b9727614bd0d81 +Block 0024 [119]: 44e2f34c09858189 +Block 0024 [120]: 166b8e0202435648 +Block 0024 [121]: ccabaea87b867ba8 +Block 0024 [122]: 04730c71031c17b0 +Block 0024 [123]: 5dc755d938cb2582 +Block 0024 [124]: a959def8cc5e35b5 +Block 0024 [125]: 0be10f243c731296 +Block 0024 [126]: 0b297eb58896c6b3 +Block 0024 [127]: 7824efd8483d8404 +Block 0025 [ 0]: 889096729509e78f +Block 0025 [ 1]: 26504b43a3100a77 +Block 0025 [ 2]: fbd049c773a1b6ad +Block 0025 [ 3]: eb252d4ae7f1aa63 +Block 0025 [ 4]: f9589a22c2b52a79 +Block 0025 [ 5]: cee8068ebcc7d015 +Block 0025 [ 6]: 21d4347432ee8ffb +Block 0025 [ 7]: 0f47228c6bb465a0 +Block 0025 [ 8]: bdc2c807d0b93a9e +Block 0025 [ 9]: 93b6f9ff6cf28394 +Block 0025 [ 10]: 269f5146a44db948 +Block 0025 [ 11]: 582214ba08e90d6b +Block 0025 [ 12]: a9a68dba1d170a12 +Block 0025 [ 13]: ef85ecbd10051753 +Block 0025 [ 14]: 06851cfd8c42322f +Block 0025 [ 15]: a4d5a440a88d43be +Block 0025 [ 16]: 989dc221ec5b9c58 +Block 0025 [ 17]: 474f59f0f6ff1af4 +Block 0025 [ 18]: 125416e66c19634f +Block 0025 [ 19]: 10215d521ffcd58e +Block 0025 [ 20]: e3f09f59d9104eb3 +Block 0025 [ 21]: 586e10dccc5020b9 +Block 0025 [ 22]: 0a768305fbc81885 +Block 0025 [ 23]: d14874001b4e4e1b +Block 0025 [ 24]: c8547ecfa52d48c7 +Block 0025 [ 25]: ce6b1e03845c17bd +Block 0025 [ 26]: fe11c378c83a2fbe +Block 0025 [ 27]: 8d1d43284d915d96 +Block 0025 [ 28]: 5727fa24758d9ed0 +Block 0025 [ 29]: 5b0b345f44d4f221 +Block 0025 [ 30]: 5c49add60390df39 +Block 0025 [ 31]: d1e23f9755e06462 +Block 0025 [ 32]: 3eb908b7f7ac2f1e +Block 0025 [ 33]: 7a3e86d7ff618c2c +Block 0025 [ 34]: c6b860295828261a +Block 0025 [ 35]: aa89774a7391397f +Block 0025 [ 36]: b3c4c8a8e2d6bce2 +Block 0025 [ 37]: 7ec5d12cd0535cc1 +Block 0025 [ 38]: 921353ef549581ee +Block 0025 [ 39]: bd1222482408e2fd +Block 0025 [ 40]: d4e2ba07d4b4b8cc +Block 0025 [ 41]: bafd05d23599cee3 +Block 0025 [ 42]: de67ee39feea0dc8 +Block 0025 [ 43]: 2b78f8b27eb882b4 +Block 0025 [ 44]: e9b625124d311892 +Block 0025 [ 45]: 98b2752764b4242a +Block 0025 [ 46]: 9362523bc3747c43 +Block 0025 [ 47]: 1c2a20d8c40f7892 +Block 0025 [ 48]: 5dd771a35bc3a0f9 +Block 0025 [ 49]: b08916d994485d92 +Block 0025 [ 50]: 9cc23af3e5b71b77 +Block 0025 [ 51]: fdc1a420cfdbfeeb +Block 0025 [ 52]: 671430b738686c6d +Block 0025 [ 53]: 9e263c7e72dcd4e4 +Block 0025 [ 54]: 808ef8d04feaed7e +Block 0025 [ 55]: 0c3977d862a087b3 +Block 0025 [ 56]: da21711205931d65 +Block 0025 [ 57]: 57e9163e89a92b2d +Block 0025 [ 58]: f6d9b7c75e22884a +Block 0025 [ 59]: 53df53f21c5ea344 +Block 0025 [ 60]: ce09a21b516d77c2 +Block 0025 [ 61]: dc90da4a018d70d5 +Block 0025 [ 62]: 9c2bee3bf5be28f9 +Block 0025 [ 63]: 9b14f3d069e0cc8f +Block 0025 [ 64]: 5dfa874c5de65c73 +Block 0025 [ 65]: 41d8f48bf256f7b5 +Block 0025 [ 66]: 2c54c97b6bdd1922 +Block 0025 [ 67]: 8fdd86c673d73ceb +Block 0025 [ 68]: 2ddcdadc28e483ec +Block 0025 [ 69]: 448999231656a9a2 +Block 0025 [ 70]: c5c6a22e814c20da +Block 0025 [ 71]: fb4b60da77b78d76 +Block 0025 [ 72]: 8d75e91ace57a779 +Block 0025 [ 73]: dce603b830d17e29 +Block 0025 [ 74]: c0fb7a05b851bb35 +Block 0025 [ 75]: bec24336a6634ce4 +Block 0025 [ 76]: b55f22fde59c3c73 +Block 0025 [ 77]: bb8ec536ffb476bc +Block 0025 [ 78]: c0071e75308ba8bb +Block 0025 [ 79]: 0bbf0dd52d5a7851 +Block 0025 [ 80]: 15162c10635898d5 +Block 0025 [ 81]: 0bf8bf14a900705f +Block 0025 [ 82]: 080296ee3c6634a9 +Block 0025 [ 83]: 00b4294bf795c0fa +Block 0025 [ 84]: c54eedcb4aa6b04d +Block 0025 [ 85]: 4dce146af1deee86 +Block 0025 [ 86]: b5756a48df564404 +Block 0025 [ 87]: 3b57c67dab0f2b0d +Block 0025 [ 88]: ea8543a2e6c25c74 +Block 0025 [ 89]: 7e0b4eed8f64f29a +Block 0025 [ 90]: ab6d723b4b394b67 +Block 0025 [ 91]: af40edc026dc2ba1 +Block 0025 [ 92]: 3c29390e269e5370 +Block 0025 [ 93]: 5dd8288dc9b5d1df +Block 0025 [ 94]: 580507dfc21aacfb +Block 0025 [ 95]: 71ded7a2579ce4f7 +Block 0025 [ 96]: 11960be7aaa8b291 +Block 0025 [ 97]: 4c1ad7455e167c48 +Block 0025 [ 98]: ace29f6a0682b5cf +Block 0025 [ 99]: be946a8dc92261e1 +Block 0025 [100]: 222c5dd20af62343 +Block 0025 [101]: a0775badb4aff215 +Block 0025 [102]: 3c9f963838fb6d7e +Block 0025 [103]: 4610d1f8e37983e0 +Block 0025 [104]: dbf7cef0b1205e12 +Block 0025 [105]: 2e9bc9577a01c3d5 +Block 0025 [106]: 4b6af5055b61fa2b +Block 0025 [107]: b34c71830d8049d2 +Block 0025 [108]: 950edfdd91e5039a +Block 0025 [109]: 2d6a84d97cadb803 +Block 0025 [110]: f39c28169a8e3866 +Block 0025 [111]: ec6b338b4691fdc4 +Block 0025 [112]: bdfd62ce06287de0 +Block 0025 [113]: ca64badc1cdd288b +Block 0025 [114]: ddbe34f9611eb577 +Block 0025 [115]: ff863bdd914bec12 +Block 0025 [116]: e10bb8be4463770c +Block 0025 [117]: 6f8f73d44abb7141 +Block 0025 [118]: e4b1d9c741f6a21c +Block 0025 [119]: 1c04f10cdd385724 +Block 0025 [120]: b174b35f63d28944 +Block 0025 [121]: 456e620925bf1183 +Block 0025 [122]: 3e842a5ffbcaff84 +Block 0025 [123]: 5f15a4541e8d31c2 +Block 0025 [124]: 4a1fb9f305052b69 +Block 0025 [125]: dd5a871c34527adf +Block 0025 [126]: 8c9555e9a3e8db72 +Block 0025 [127]: 916f214630c35e17 +Block 0026 [ 0]: 2326110607fb8417 +Block 0026 [ 1]: 21b903b553877ad5 +Block 0026 [ 2]: 7bf33b6460d88269 +Block 0026 [ 3]: bba47143c058e26b +Block 0026 [ 4]: 2afe479df5bc918c +Block 0026 [ 5]: b5c079c195f10ebb +Block 0026 [ 6]: a044c29d531bf3b5 +Block 0026 [ 7]: 56f1163c045bb5fe +Block 0026 [ 8]: b1ce2026934db6a6 +Block 0026 [ 9]: 960e96adf333dca7 +Block 0026 [ 10]: 18bf65450e272e42 +Block 0026 [ 11]: f5a21856543a7b9d +Block 0026 [ 12]: 645ea64c689df21b +Block 0026 [ 13]: e88bf5f0b955b02f +Block 0026 [ 14]: 173079ea4b1f8103 +Block 0026 [ 15]: 3d84f3c858f0ccd3 +Block 0026 [ 16]: 760b040af26a6bf2 +Block 0026 [ 17]: bbfb4c8b40e1d3e6 +Block 0026 [ 18]: 94d0e5dd9242dade +Block 0026 [ 19]: 2e2442678afc3aa3 +Block 0026 [ 20]: 353afcd33f4afa1a +Block 0026 [ 21]: ee4e5d3cee3e4781 +Block 0026 [ 22]: 6da71c25f9f701ce +Block 0026 [ 23]: 22f0b96255b98c5a +Block 0026 [ 24]: acda353def1501a8 +Block 0026 [ 25]: 6e2ab8c1cc80c3c2 +Block 0026 [ 26]: e1346169d7e5b09c +Block 0026 [ 27]: 45c9152befd73b11 +Block 0026 [ 28]: 8c05ab64b0ca9770 +Block 0026 [ 29]: 2de1a8a073329d58 +Block 0026 [ 30]: f8f6cc6e4937aa1b +Block 0026 [ 31]: b393299e7441c42b +Block 0026 [ 32]: 0e1e9127e5d82ca7 +Block 0026 [ 33]: d9e7f884fb9ee6ea +Block 0026 [ 34]: 55d357a28fcf5eea +Block 0026 [ 35]: f576e6e9dec9afd7 +Block 0026 [ 36]: 636f2ad51c9aa17f +Block 0026 [ 37]: 8295f555f60629fa +Block 0026 [ 38]: 221787f92c6c7b8c +Block 0026 [ 39]: ee58f217a2ab0f23 +Block 0026 [ 40]: 8829bc3c625a98e5 +Block 0026 [ 41]: c881d4c765796859 +Block 0026 [ 42]: 1b64a1dc1b25c4c8 +Block 0026 [ 43]: f721e2fe7139e377 +Block 0026 [ 44]: d772ffbaff52e88d +Block 0026 [ 45]: 025700398018d483 +Block 0026 [ 46]: 91e64ffe14eae36f +Block 0026 [ 47]: cc697adbae578f77 +Block 0026 [ 48]: 6f08adbdca0bdcca +Block 0026 [ 49]: 98b466ad258f6b37 +Block 0026 [ 50]: a0f5d3967adf3fca +Block 0026 [ 51]: 7f55d062e14d1007 +Block 0026 [ 52]: 35d6e09308b0911e +Block 0026 [ 53]: 388da57d96f7e6d9 +Block 0026 [ 54]: 1852c831a455e118 +Block 0026 [ 55]: ee9971f15fe61186 +Block 0026 [ 56]: 3d9082f42b74ad35 +Block 0026 [ 57]: a438c3d34632fe2a +Block 0026 [ 58]: b4662befdf3c5ef1 +Block 0026 [ 59]: 48c830419f16033c +Block 0026 [ 60]: d73a1597abfd5bd9 +Block 0026 [ 61]: 92c1097e4689a942 +Block 0026 [ 62]: 23af79f5ad04dfed +Block 0026 [ 63]: 17cfa050f7849186 +Block 0026 [ 64]: 2ddfa8eff84229be +Block 0026 [ 65]: d2497269ae78a31f +Block 0026 [ 66]: aed694da1b5e26c2 +Block 0026 [ 67]: 440119e2e1622879 +Block 0026 [ 68]: c20615b4339db9e5 +Block 0026 [ 69]: 40507bb2ae718a09 +Block 0026 [ 70]: 009544db73aca08f +Block 0026 [ 71]: e3cbc7a0b359738e +Block 0026 [ 72]: 5f5c27f846aae2ab +Block 0026 [ 73]: 90a2ac6ad788b5a7 +Block 0026 [ 74]: 7c62662eebd39cff +Block 0026 [ 75]: 8a74179c8de76ffb +Block 0026 [ 76]: ddc0b6c5d5b098fe +Block 0026 [ 77]: d2ece0d030c8fbb0 +Block 0026 [ 78]: 997b8866ce9776ea +Block 0026 [ 79]: a43e344f370b3a57 +Block 0026 [ 80]: bac0ea91e352be1c +Block 0026 [ 81]: f01b639687e116bc +Block 0026 [ 82]: 960021d6f3a14e28 +Block 0026 [ 83]: 66da0b9f7a6f4578 +Block 0026 [ 84]: cfeabacf62e0980f +Block 0026 [ 85]: 91e586937a842ba8 +Block 0026 [ 86]: 3d1edbdf53bcc328 +Block 0026 [ 87]: fe5db209ef765995 +Block 0026 [ 88]: 09dae8069afa3d9f +Block 0026 [ 89]: 642b6eefcc740e1d +Block 0026 [ 90]: 4e966039b4a33618 +Block 0026 [ 91]: 43a2c47ee03be541 +Block 0026 [ 92]: ef2d8306430732d2 +Block 0026 [ 93]: ba85666f042ac669 +Block 0026 [ 94]: 6feec7335af83185 +Block 0026 [ 95]: fa2030d6bd78c524 +Block 0026 [ 96]: 47f0b74e4cbb7eda +Block 0026 [ 97]: 6da6378c64c7ce1f +Block 0026 [ 98]: 5a9e6857b6a5289c +Block 0026 [ 99]: caade4b95bdfd06f +Block 0026 [100]: a2d84e8435913de6 +Block 0026 [101]: 34cc36e53cb7bcb9 +Block 0026 [102]: 702ea8254a5b7678 +Block 0026 [103]: aca6662a073790b3 +Block 0026 [104]: d3e8062924413a1d +Block 0026 [105]: d35eb40e29a1ab60 +Block 0026 [106]: d7d8dace18d04b73 +Block 0026 [107]: a485fec173de15ed +Block 0026 [108]: 9e985148c2f9e73e +Block 0026 [109]: 1bc9a4156367266f +Block 0026 [110]: 92088b95d082b203 +Block 0026 [111]: 7411e3d921612b6b +Block 0026 [112]: d7a0707c5b8dfffb +Block 0026 [113]: 3a69e8206ac6bab2 +Block 0026 [114]: 681fcdcf147b5797 +Block 0026 [115]: e3f729a959d114f1 +Block 0026 [116]: 1c27652b63160462 +Block 0026 [117]: aa4a57250c8ba710 +Block 0026 [118]: 7749feff623165bd +Block 0026 [119]: c7424c1ba697125e +Block 0026 [120]: c8c9202a695524c7 +Block 0026 [121]: 8557a3857e1ce2ae +Block 0026 [122]: bdd7467b6dcb5b80 +Block 0026 [123]: 818b955fdbe8ea65 +Block 0026 [124]: 5b4cba042cf69bd4 +Block 0026 [125]: 4c5de11255f2c061 +Block 0026 [126]: ef15e5aeca3dbb79 +Block 0026 [127]: 6d08853bd67bf454 +Block 0027 [ 0]: 1b9e0a2a48f03548 +Block 0027 [ 1]: 79d13f7464dfe544 +Block 0027 [ 2]: ae09bc1e24b9eb78 +Block 0027 [ 3]: 5c9dc0dade572ed1 +Block 0027 [ 4]: f5938effd3acac03 +Block 0027 [ 5]: 1c07f12951ab8c4d +Block 0027 [ 6]: 24430282ba5c1d54 +Block 0027 [ 7]: a6b6b6e3ad35b065 +Block 0027 [ 8]: 867d937a7f04fc08 +Block 0027 [ 9]: 530134b0935bab05 +Block 0027 [ 10]: 2ba6e88fbc07b2ae +Block 0027 [ 11]: ba41f5c456dc4700 +Block 0027 [ 12]: adce9ae24bbd8c39 +Block 0027 [ 13]: d2fd86dde81b100c +Block 0027 [ 14]: 7af41baa6ea9a086 +Block 0027 [ 15]: 6eabe51c178df50f +Block 0027 [ 16]: 201e933537af8b09 +Block 0027 [ 17]: d25c2965cb10515d +Block 0027 [ 18]: b1efcc4a704af07d +Block 0027 [ 19]: 8785462fbd5cf444 +Block 0027 [ 20]: b57c06385432db42 +Block 0027 [ 21]: 70dd9f26e498c6a1 +Block 0027 [ 22]: cc22b2a4f0abdd3b +Block 0027 [ 23]: 1194085fcfe927a4 +Block 0027 [ 24]: db74fcdece66f9f4 +Block 0027 [ 25]: 3ccd6b68246b978b +Block 0027 [ 26]: ca025c07ce8350f8 +Block 0027 [ 27]: 5e8982b4a36d138a +Block 0027 [ 28]: bf37b6c0aa764378 +Block 0027 [ 29]: bbfa64d026622763 +Block 0027 [ 30]: 751189774b34475d +Block 0027 [ 31]: 5438b191939688ee +Block 0027 [ 32]: 736af831e42315b8 +Block 0027 [ 33]: e7189b709e88e8d6 +Block 0027 [ 34]: 37eee5970edc1e23 +Block 0027 [ 35]: b80aaf8f94ee1561 +Block 0027 [ 36]: 9141705d6a2c0863 +Block 0027 [ 37]: 10cd015b94f60ac6 +Block 0027 [ 38]: 373292f9c6b9e3d3 +Block 0027 [ 39]: 4906ca8fd4933a34 +Block 0027 [ 40]: 5425ba952f1c2b16 +Block 0027 [ 41]: ba91ab6c019d10b5 +Block 0027 [ 42]: ae1813ab9eb3f165 +Block 0027 [ 43]: 80ce5f31929c977e +Block 0027 [ 44]: 9cb8f3c169cfc2ea +Block 0027 [ 45]: caeafec4696d86fb +Block 0027 [ 46]: b5d1dab3619428b8 +Block 0027 [ 47]: 2dc1b1f6148a1945 +Block 0027 [ 48]: 2b36aa468d722a62 +Block 0027 [ 49]: f89f92967c61807b +Block 0027 [ 50]: 8bb5c07804484e62 +Block 0027 [ 51]: 1f495abf9906b02c +Block 0027 [ 52]: f8d4f663a8db2006 +Block 0027 [ 53]: 37b5730fc4bc7bb8 +Block 0027 [ 54]: 474e85daaa7f8f4c +Block 0027 [ 55]: 103c08f71ca71f7d +Block 0027 [ 56]: f6ee3f551142f93d +Block 0027 [ 57]: df49d32e32813a59 +Block 0027 [ 58]: 7893d42f39de58c1 +Block 0027 [ 59]: 612d282bf0114e57 +Block 0027 [ 60]: 06526d52faa7c46f +Block 0027 [ 61]: ef0a4a21543b4210 +Block 0027 [ 62]: 659aad06a6dac23b +Block 0027 [ 63]: 83349711eaf33ff6 +Block 0027 [ 64]: 2619d9d15a1f40a1 +Block 0027 [ 65]: 0d6e01f3a6780617 +Block 0027 [ 66]: 537b02711650672b +Block 0027 [ 67]: f2f8e6138ef4f708 +Block 0027 [ 68]: c979e70587b593e8 +Block 0027 [ 69]: 598534c232f66a7b +Block 0027 [ 70]: aaa5368ca7adf19e +Block 0027 [ 71]: fbd81073ff635f77 +Block 0027 [ 72]: c511c8fdb4816452 +Block 0027 [ 73]: dabdda9675b10982 +Block 0027 [ 74]: ce6811b03950e826 +Block 0027 [ 75]: fc9eaed22fc499aa +Block 0027 [ 76]: f7ab1b9e96c241f1 +Block 0027 [ 77]: 90f391f585de581d +Block 0027 [ 78]: 3393d992ef6ec67d +Block 0027 [ 79]: dc1542690885d37b +Block 0027 [ 80]: 3b6a43d43bb4a8f1 +Block 0027 [ 81]: 1ccbba638d9ebf11 +Block 0027 [ 82]: 34e474ffaa3ae841 +Block 0027 [ 83]: 10b28634c65339de +Block 0027 [ 84]: 89962338c5ec0536 +Block 0027 [ 85]: 4066ccc9321462bf +Block 0027 [ 86]: 9158b68f05139c91 +Block 0027 [ 87]: eafb568fd6c32965 +Block 0027 [ 88]: 5d0afd995ccf6838 +Block 0027 [ 89]: 5467f717aa461520 +Block 0027 [ 90]: 3f46d011a0aa6852 +Block 0027 [ 91]: 5be8246d25d1e221 +Block 0027 [ 92]: 0411b41ce73cf8d3 +Block 0027 [ 93]: f4603c9d26fdabc5 +Block 0027 [ 94]: 0bea0ce54205b484 +Block 0027 [ 95]: 676106d61b20001a +Block 0027 [ 96]: ae1363d24d05bb51 +Block 0027 [ 97]: b137b076a0bd62c3 +Block 0027 [ 98]: b2a47ba9c55e2008 +Block 0027 [ 99]: cb536401ca240734 +Block 0027 [100]: bc644a7e4db2fbcb +Block 0027 [101]: d4657f37c824c0b1 +Block 0027 [102]: 2e43c799ce19ba2a +Block 0027 [103]: 71f4e39a7105f08c +Block 0027 [104]: cd60684a48c35aae +Block 0027 [105]: 630e5d2c33dd141e +Block 0027 [106]: 644c3710f4e576b8 +Block 0027 [107]: e0a79b23fcecda7e +Block 0027 [108]: ae487ac85808d582 +Block 0027 [109]: 310c4b78ed84735f +Block 0027 [110]: 8869ccf9539f8d29 +Block 0027 [111]: e961d241232d8eb4 +Block 0027 [112]: e08dbd615c20c18b +Block 0027 [113]: d27009a6d7f7383a +Block 0027 [114]: fb086f56179222d1 +Block 0027 [115]: 318b6465bf6f11e6 +Block 0027 [116]: 1096b60a36bc2adc +Block 0027 [117]: 5a19cb04e9138bd5 +Block 0027 [118]: d70194664ef36242 +Block 0027 [119]: 66b5846972e6d4b5 +Block 0027 [120]: a9ed1ab8cf8eda55 +Block 0027 [121]: ac4a13bc160e8dbc +Block 0027 [122]: 36c095d46c0fd19f +Block 0027 [123]: d884e38b9dbee228 +Block 0027 [124]: 19fd4af11f29f87f +Block 0027 [125]: c59730708224a0ad +Block 0027 [126]: ab650e5c4054b735 +Block 0027 [127]: 70f375ab9c7e144e +Block 0028 [ 0]: 97232791402bcb44 +Block 0028 [ 1]: 35f792c0b2f4984b +Block 0028 [ 2]: 3226a2aea0ebf600 +Block 0028 [ 3]: 7fe74755e5f13d9e +Block 0028 [ 4]: f3d5b6f172056b7d +Block 0028 [ 5]: e94896db4a53432b +Block 0028 [ 6]: 45630e66b33caf9d +Block 0028 [ 7]: 5b3b5a0b10aad49b +Block 0028 [ 8]: 309b69543ee4a396 +Block 0028 [ 9]: 7d170df8695dfdc0 +Block 0028 [ 10]: 294542494a30d442 +Block 0028 [ 11]: 3ffe9c43d6b9c1df +Block 0028 [ 12]: db7ef4608692decc +Block 0028 [ 13]: fbc4dca927251720 +Block 0028 [ 14]: 5039450e98f1c2a1 +Block 0028 [ 15]: 8bc1f444fa5731ae +Block 0028 [ 16]: 83d87fd302dfec84 +Block 0028 [ 17]: abbd969ea7fc60db +Block 0028 [ 18]: b4e0305c8e8631dc +Block 0028 [ 19]: da6a912f0b3017cf +Block 0028 [ 20]: 9d0be0c7dad3eac9 +Block 0028 [ 21]: 0b88a014922d1de9 +Block 0028 [ 22]: b543e19840551a05 +Block 0028 [ 23]: 270e6f8a4712c6e4 +Block 0028 [ 24]: e95d6fb939fa034e +Block 0028 [ 25]: e8e03357bebe3443 +Block 0028 [ 26]: b405c25554d5c7b5 +Block 0028 [ 27]: b32ec2395f791b42 +Block 0028 [ 28]: d2813288d84d51f4 +Block 0028 [ 29]: e4f492ae99d62fc9 +Block 0028 [ 30]: e58241d84db85374 +Block 0028 [ 31]: d4270cccafb0d652 +Block 0028 [ 32]: 0f504b2abf3fffdd +Block 0028 [ 33]: 942c9a112e819d77 +Block 0028 [ 34]: cf69b53975cd82ac +Block 0028 [ 35]: cbdcbd422cfdeaae +Block 0028 [ 36]: 04e8634692186628 +Block 0028 [ 37]: 0fc7ca7bc72f1a50 +Block 0028 [ 38]: 35a9f84173bd61bd +Block 0028 [ 39]: 045006fdb2984625 +Block 0028 [ 40]: a66cf861729ba243 +Block 0028 [ 41]: 51b2bae79c014af5 +Block 0028 [ 42]: 51d30a112158b84a +Block 0028 [ 43]: 00bf5e0aac36c45d +Block 0028 [ 44]: 81bf6d928cd7d70a +Block 0028 [ 45]: 6980b3c243c53ab8 +Block 0028 [ 46]: f21ad5f134ad738b +Block 0028 [ 47]: 5e68587e40d67c25 +Block 0028 [ 48]: 1601c62c372c34f7 +Block 0028 [ 49]: ef991ed46d8962bb +Block 0028 [ 50]: c46aaf9aad78363c +Block 0028 [ 51]: ae3d60d0f936b476 +Block 0028 [ 52]: 586497acea9f825f +Block 0028 [ 53]: 1e5e9b93f8e908b4 +Block 0028 [ 54]: 84150a537817bbed +Block 0028 [ 55]: 9c90f15684c67664 +Block 0028 [ 56]: 748bce5e9ace006c +Block 0028 [ 57]: 40806573bfee5c67 +Block 0028 [ 58]: e3733f18a4c45c64 +Block 0028 [ 59]: 57daf992dedd6bd8 +Block 0028 [ 60]: 576e707078a8fdf4 +Block 0028 [ 61]: a666874b98a57c09 +Block 0028 [ 62]: 2f46e59e30aced2e +Block 0028 [ 63]: 227c2fbdab49e93b +Block 0028 [ 64]: 22dc42d4f0c4ff92 +Block 0028 [ 65]: 68d18cd2f1a92b20 +Block 0028 [ 66]: f0901635eb95dfe6 +Block 0028 [ 67]: ebbf5fc8f1c08a24 +Block 0028 [ 68]: 3560e312285ddca2 +Block 0028 [ 69]: 286222d30dd6e292 +Block 0028 [ 70]: 0e38078f4970af1a +Block 0028 [ 71]: a4b5730f656a7f48 +Block 0028 [ 72]: 5490a1f601b9815d +Block 0028 [ 73]: a55db213eb190453 +Block 0028 [ 74]: 31e4ae9fe533b445 +Block 0028 [ 75]: 1785f0289aefae64 +Block 0028 [ 76]: 7335275f1235e537 +Block 0028 [ 77]: 4bbf52e14238737a +Block 0028 [ 78]: 6861fe9ddce61ee8 +Block 0028 [ 79]: e60dadb10ce28e0e +Block 0028 [ 80]: 814f56901266955d +Block 0028 [ 81]: b70226ef0a619175 +Block 0028 [ 82]: 655ee0e452b64755 +Block 0028 [ 83]: 559e78bc00e00d4c +Block 0028 [ 84]: 2d365d7d806b2c66 +Block 0028 [ 85]: a76e099c88382c82 +Block 0028 [ 86]: 7c54f1a662d1b2f0 +Block 0028 [ 87]: f8d6b44f41b1fbde +Block 0028 [ 88]: aec2525faee8e074 +Block 0028 [ 89]: 3ba7df6ba9154052 +Block 0028 [ 90]: 10ab17547d300b4b +Block 0028 [ 91]: 631645cf561c2263 +Block 0028 [ 92]: 38deeb67de925bd6 +Block 0028 [ 93]: 247d70ecaea720a9 +Block 0028 [ 94]: 3942012c3e59cd0a +Block 0028 [ 95]: 79a8e59965f50d74 +Block 0028 [ 96]: ae64ce04808b8731 +Block 0028 [ 97]: a82922e0aef538b3 +Block 0028 [ 98]: 4896dd57583cf5c1 +Block 0028 [ 99]: 1b54a6fe3f0402fe +Block 0028 [100]: a3bbdef1744dedd2 +Block 0028 [101]: 50d7c4ec590c94d8 +Block 0028 [102]: 0412d51b93b7c6fa +Block 0028 [103]: b284143fa99ccfed +Block 0028 [104]: 26afb8dcd15eb953 +Block 0028 [105]: 780412654e5192b6 +Block 0028 [106]: 1b5a25166f37ae89 +Block 0028 [107]: a2fe1bdcc97ff964 +Block 0028 [108]: 0a76accb203f1b96 +Block 0028 [109]: a3776057d2937236 +Block 0028 [110]: 97a41d4001d420ea +Block 0028 [111]: 1983d7acbfe92b00 +Block 0028 [112]: 467fc549919b5a61 +Block 0028 [113]: 102dd46280e147de +Block 0028 [114]: 82fced5a379d04e5 +Block 0028 [115]: 34c59296d5c25fee +Block 0028 [116]: 33984b7359faf528 +Block 0028 [117]: 19644a6bbb96873b +Block 0028 [118]: a8e0d86b9c37af6d +Block 0028 [119]: 26772e3696ef3b35 +Block 0028 [120]: 53441d026ca0b04b +Block 0028 [121]: f6369a5b0acb8901 +Block 0028 [122]: d39b69a195db4abd +Block 0028 [123]: e4ea5c6afc40960f +Block 0028 [124]: 7eb6485d679d4104 +Block 0028 [125]: f8eddbdf128b40cb +Block 0028 [126]: aa922a03672a8939 +Block 0028 [127]: bbfa96187ed10163 +Block 0029 [ 0]: 4404e79fd03776e5 +Block 0029 [ 1]: 808f9962df1ae158 +Block 0029 [ 2]: 5f35ae1b31a76bb2 +Block 0029 [ 3]: 3fc4547a07bf1854 +Block 0029 [ 4]: 488f357d253a1362 +Block 0029 [ 5]: 7d6ab99447468ed2 +Block 0029 [ 6]: e101c05afc23a427 +Block 0029 [ 7]: 54c4ef1b9b855bd3 +Block 0029 [ 8]: a1d03a62e43f8292 +Block 0029 [ 9]: 12b6785de8a09162 +Block 0029 [ 10]: 000aff43ee79c784 +Block 0029 [ 11]: d8a67d7f4a0d5d5d +Block 0029 [ 12]: 974e8d8c31633393 +Block 0029 [ 13]: 0023f6283566393b +Block 0029 [ 14]: 0f8e8e0a9c856b92 +Block 0029 [ 15]: f0e6de7574e8de59 +Block 0029 [ 16]: 1511602535645209 +Block 0029 [ 17]: 4c1ec498b136967f +Block 0029 [ 18]: 6c8f610c2eb03554 +Block 0029 [ 19]: d263fd514948af88 +Block 0029 [ 20]: 202e17af99bb4866 +Block 0029 [ 21]: 9ac97f5b38973aef +Block 0029 [ 22]: cb2fb07f80b1f4c1 +Block 0029 [ 23]: a5fe298d9d72f14e +Block 0029 [ 24]: 0aa60ccb80278f06 +Block 0029 [ 25]: 34445d153a674af2 +Block 0029 [ 26]: a5ae2e22aae768ed +Block 0029 [ 27]: 537de1e920729bd6 +Block 0029 [ 28]: 1801f662131749ca +Block 0029 [ 29]: 97d8767044f9da6a +Block 0029 [ 30]: d29160e91e40ce69 +Block 0029 [ 31]: 1978451d11883970 +Block 0029 [ 32]: d45fa773f4c17640 +Block 0029 [ 33]: df102fe3ad8418fe +Block 0029 [ 34]: 1f4383bb94bfeb5c +Block 0029 [ 35]: f204dd9bf62006e6 +Block 0029 [ 36]: f5e9aa1cc8f2c452 +Block 0029 [ 37]: 68c8e2541b2eb1e1 +Block 0029 [ 38]: bd6a08255d83d623 +Block 0029 [ 39]: 141d4413b7e27035 +Block 0029 [ 40]: 8fc28425f1c6ddc8 +Block 0029 [ 41]: 315763c020ce0df9 +Block 0029 [ 42]: 2ef188655ccd4d54 +Block 0029 [ 43]: 2504ded0510bf310 +Block 0029 [ 44]: e00bb1157c2e8c4f +Block 0029 [ 45]: 05ae8d1643d868c5 +Block 0029 [ 46]: 1fff0638a5999406 +Block 0029 [ 47]: 283b28c741de7e21 +Block 0029 [ 48]: 2c493d2dacdf78d7 +Block 0029 [ 49]: 26ec38c4797ec312 +Block 0029 [ 50]: 0a8fbbb46f9d7121 +Block 0029 [ 51]: 9a46c3b15aa183b4 +Block 0029 [ 52]: 8ed11099f2761e80 +Block 0029 [ 53]: 90dd32bb0a45c3a5 +Block 0029 [ 54]: 34f51968efdca622 +Block 0029 [ 55]: e457943a6bc598f9 +Block 0029 [ 56]: ed880470e5758747 +Block 0029 [ 57]: a85c6ca1aedc0d64 +Block 0029 [ 58]: 520e443c4e066074 +Block 0029 [ 59]: 48b78160b6d911d3 +Block 0029 [ 60]: 2f9656ebb9d37abc +Block 0029 [ 61]: c3d117cc1ab3c489 +Block 0029 [ 62]: 5f997145c2c8ebbf +Block 0029 [ 63]: e12b0fa58ed93dd1 +Block 0029 [ 64]: 4543581fe2f0990a +Block 0029 [ 65]: ce9ec79474f06130 +Block 0029 [ 66]: 13d572daac86fdb1 +Block 0029 [ 67]: ae6cd4b262974a62 +Block 0029 [ 68]: 23497b36a1c78cec +Block 0029 [ 69]: 63b4c4217de59bfc +Block 0029 [ 70]: 3155fe204edc09b1 +Block 0029 [ 71]: fbdf0237d6ac506a +Block 0029 [ 72]: ee79105c9807021e +Block 0029 [ 73]: 6bfb8a1bbb310ef3 +Block 0029 [ 74]: 74622d1cca0ed342 +Block 0029 [ 75]: c539105c9e727e74 +Block 0029 [ 76]: c0a399a42230055c +Block 0029 [ 77]: 203053df632abe24 +Block 0029 [ 78]: 13732ba10ce9e8e0 +Block 0029 [ 79]: 92d8c6a7eb4cba2f +Block 0029 [ 80]: 8827ab8b69c0f7f9 +Block 0029 [ 81]: 88f40ead7dfa7fb2 +Block 0029 [ 82]: 431eccb39d1abf56 +Block 0029 [ 83]: dacff364cb26e27d +Block 0029 [ 84]: 241bc13751a6e283 +Block 0029 [ 85]: 46cb1c43864dc5b8 +Block 0029 [ 86]: 49d69a774a299d69 +Block 0029 [ 87]: 2bff0e7b35995290 +Block 0029 [ 88]: 3a659105b325fb4e +Block 0029 [ 89]: b5bce292f719867c +Block 0029 [ 90]: 80090c29789ca112 +Block 0029 [ 91]: 15a5ca1fa6e2aaea +Block 0029 [ 92]: de25532e31966d8c +Block 0029 [ 93]: f8ffde1a1c637f85 +Block 0029 [ 94]: 9171e29e4280937d +Block 0029 [ 95]: 90b45cfcb848b517 +Block 0029 [ 96]: edfd832a481a152b +Block 0029 [ 97]: f810f6f8064f465f +Block 0029 [ 98]: 39d750ed2039d0bf +Block 0029 [ 99]: fa4a1e1447324c92 +Block 0029 [100]: 824aadeb266b642e +Block 0029 [101]: 9f4c17afc1a606bd +Block 0029 [102]: 09bf69caf3c721d6 +Block 0029 [103]: b25dc5501a7f4814 +Block 0029 [104]: 881d3b32751e2a35 +Block 0029 [105]: a88d79d4c1fba15e +Block 0029 [106]: 4fe4c1bbe47dee02 +Block 0029 [107]: 23bf5f2de21587cd +Block 0029 [108]: df7aa3ce6c9c0a09 +Block 0029 [109]: a02e74446e2657e6 +Block 0029 [110]: cc60e31e33d6c4f6 +Block 0029 [111]: a09f2da2481b0763 +Block 0029 [112]: 0b2b1384f2124f27 +Block 0029 [113]: 89c63ba718168c82 +Block 0029 [114]: 5a61043d96d13192 +Block 0029 [115]: ebb1ce98d35b8f90 +Block 0029 [116]: 9dc50f8e18d13718 +Block 0029 [117]: e7d6c964ead7f9da +Block 0029 [118]: 90b675087a3940b3 +Block 0029 [119]: 5eef50e3c9b68430 +Block 0029 [120]: 62af3a224e6ce28c +Block 0029 [121]: 96984c57b60d4916 +Block 0029 [122]: aba3c89e948b9f92 +Block 0029 [123]: 57544a942bb5af40 +Block 0029 [124]: f66ae56a55153ab6 +Block 0029 [125]: 97309420faef1165 +Block 0029 [126]: a6cb3a785aea74fb +Block 0029 [127]: e1a5f37573462dbe +Block 0030 [ 0]: c4a8fd9627c5a47d +Block 0030 [ 1]: d372d170bd35b961 +Block 0030 [ 2]: 42a1b3a62c1169b2 +Block 0030 [ 3]: 9ab6aa1587d3eddf +Block 0030 [ 4]: f84406b7bd4594e4 +Block 0030 [ 5]: 6ddfeddd2b6bdc53 +Block 0030 [ 6]: 687c4b18ffbf9edd +Block 0030 [ 7]: a15d1e1b71b743d0 +Block 0030 [ 8]: 52730cd446dbd63e +Block 0030 [ 9]: fbbe0a5c53261dca +Block 0030 [ 10]: 33047cce19568e37 +Block 0030 [ 11]: addb511156a7a1af +Block 0030 [ 12]: c5477d82bbf2559a +Block 0030 [ 13]: 70b11daf1aaf02bb +Block 0030 [ 14]: 27251b8da2d89443 +Block 0030 [ 15]: 03b0356e4fd322ed +Block 0030 [ 16]: 9d4406baa010c2a1 +Block 0030 [ 17]: b005a3f65cd63694 +Block 0030 [ 18]: 29d46007f3ee0b7e +Block 0030 [ 19]: 64da2e53786f2126 +Block 0030 [ 20]: fe798fa3c3e26050 +Block 0030 [ 21]: 12a97db444270c96 +Block 0030 [ 22]: 2e0b9d47bf16f5f2 +Block 0030 [ 23]: cdcc69ab3c8ef1f2 +Block 0030 [ 24]: 4741e45445a6678e +Block 0030 [ 25]: 45abf8aebeb6f00a +Block 0030 [ 26]: 226f2f6953ec7ca3 +Block 0030 [ 27]: 13bc983dbcc285ed +Block 0030 [ 28]: 72d40c37c20a02c4 +Block 0030 [ 29]: 4c102717d6d656a9 +Block 0030 [ 30]: 5e79aaa2746e67d8 +Block 0030 [ 31]: 42cc680d6b4afd2b +Block 0030 [ 32]: b9d632fae3cc28d5 +Block 0030 [ 33]: c64d4ab875cb86b6 +Block 0030 [ 34]: 67c11e81b2ba60b4 +Block 0030 [ 35]: 6a6c40d772023a89 +Block 0030 [ 36]: e19dd8badb2e4216 +Block 0030 [ 37]: 53be5e4e20b1a601 +Block 0030 [ 38]: e4fc0a59fa146e1f +Block 0030 [ 39]: 99758907b065fbd5 +Block 0030 [ 40]: a80984191480bba0 +Block 0030 [ 41]: 5025c806e0569a00 +Block 0030 [ 42]: c0a535e23e65470d +Block 0030 [ 43]: e77995c440572a44 +Block 0030 [ 44]: d7c79537a8455c12 +Block 0030 [ 45]: 2b0bcc76eb68b8b8 +Block 0030 [ 46]: 0031fb133528a9ad +Block 0030 [ 47]: ebca5f4fca5a5287 +Block 0030 [ 48]: dba025e2aee7ee4a +Block 0030 [ 49]: de18654fd5a6daec +Block 0030 [ 50]: 68354a5bb40295bb +Block 0030 [ 51]: c7076ac90199a35f +Block 0030 [ 52]: 114405fe1c60af8d +Block 0030 [ 53]: 947ce0c0a8c90790 +Block 0030 [ 54]: 3361310a6fdea716 +Block 0030 [ 55]: 02bb9db176c892e7 +Block 0030 [ 56]: f90d5706fd35e35a +Block 0030 [ 57]: e2156232141eeb9f +Block 0030 [ 58]: 08f4471efa0ff800 +Block 0030 [ 59]: 3974a0f6c247c3bd +Block 0030 [ 60]: fed6515e21fbecea +Block 0030 [ 61]: 30ea20c394760c0c +Block 0030 [ 62]: d87e4d6eddbbb745 +Block 0030 [ 63]: 7b8cccfb2880810b +Block 0030 [ 64]: f1c99e4632e9f1ce +Block 0030 [ 65]: 6948a03ef039d701 +Block 0030 [ 66]: edca546e83989230 +Block 0030 [ 67]: 241d8f3bfa875aa7 +Block 0030 [ 68]: afd7565f7cd31111 +Block 0030 [ 69]: 7e36338afc723b26 +Block 0030 [ 70]: a0a901bf1ef2491d +Block 0030 [ 71]: 9704ec662a6f2274 +Block 0030 [ 72]: 1b9be6bf68a5f7b4 +Block 0030 [ 73]: 001627847aaaee2d +Block 0030 [ 74]: 43161987fbb74519 +Block 0030 [ 75]: dd31369e9bb1335c +Block 0030 [ 76]: 33814586064f1d5f +Block 0030 [ 77]: cc77565fc68364b1 +Block 0030 [ 78]: 89cc92134c98053c +Block 0030 [ 79]: ca22c6467315c0a5 +Block 0030 [ 80]: 49a66c3163bc8199 +Block 0030 [ 81]: 60abfd7551756c62 +Block 0030 [ 82]: 371443ce3e11231c +Block 0030 [ 83]: 49abdd0cc8d76912 +Block 0030 [ 84]: d4cb7475a4aa3404 +Block 0030 [ 85]: 8e824478b5989403 +Block 0030 [ 86]: 3886b07905fd269a +Block 0030 [ 87]: 1f0dc4948652f82a +Block 0030 [ 88]: b62bad9cb5c30a59 +Block 0030 [ 89]: aeae875734cf2887 +Block 0030 [ 90]: 0c986e320f30ee81 +Block 0030 [ 91]: 4b827cd42945a6d9 +Block 0030 [ 92]: e9cb7e75d24e1356 +Block 0030 [ 93]: d6d32db5b7ec3445 +Block 0030 [ 94]: 16aa7c5a5bad7059 +Block 0030 [ 95]: 43d59f33f342c8b5 +Block 0030 [ 96]: 2dcc68bca46025d2 +Block 0030 [ 97]: 429ac7c8ee851217 +Block 0030 [ 98]: 90c904513d9aa7bf +Block 0030 [ 99]: ba350b48edc86579 +Block 0030 [100]: 426a30161f7839d5 +Block 0030 [101]: c25cc2d336a32e58 +Block 0030 [102]: b958cfc711b9f939 +Block 0030 [103]: 1d4229ac7bb5dd8c +Block 0030 [104]: c5e93255ecab4ce0 +Block 0030 [105]: 2b86aa91c6e2e4fa +Block 0030 [106]: 0cc7a6672d285c49 +Block 0030 [107]: c2d7eee9234269e5 +Block 0030 [108]: f0707ce0a1f4d8a8 +Block 0030 [109]: 8378a40dcbfca7a7 +Block 0030 [110]: 1d127ac9de087e9b +Block 0030 [111]: 3fe93574207e1ad1 +Block 0030 [112]: b776f8bb45223858 +Block 0030 [113]: f7c51e3003714e52 +Block 0030 [114]: 3501b4ec55b44791 +Block 0030 [115]: 2bce85a6e98b7159 +Block 0030 [116]: aee18f3255b44e69 +Block 0030 [117]: 3993a16d5f337dd2 +Block 0030 [118]: a79ef642ab3a25f7 +Block 0030 [119]: fd5598a10072459a +Block 0030 [120]: e5a711c5649ed84a +Block 0030 [121]: 87b3640e02241add +Block 0030 [122]: ac919e23ba1fb501 +Block 0030 [123]: 5d44ecc8c2749ba8 +Block 0030 [124]: 8d41f01e81fc287f +Block 0030 [125]: 183a90a82f6b00e8 +Block 0030 [126]: 8620ea87468a36fb +Block 0030 [127]: 8165d72c97466f11 +Block 0031 [ 0]: 575e616d866cded1 +Block 0031 [ 1]: d0c56fd53ebd74ff +Block 0031 [ 2]: 2a86edaf4d858805 +Block 0031 [ 3]: f639bf1987b479e5 +Block 0031 [ 4]: 730a432c62f491c5 +Block 0031 [ 5]: 1202b29b1cda7af8 +Block 0031 [ 6]: ce2dd01e1073741d +Block 0031 [ 7]: 36cb3d0949b5025b +Block 0031 [ 8]: 13e050ab11ea1337 +Block 0031 [ 9]: b4f44504e0be684d +Block 0031 [ 10]: 5c9fc9aebb6d6612 +Block 0031 [ 11]: ea0d448cd81ca4ac +Block 0031 [ 12]: a82b03ccf692d521 +Block 0031 [ 13]: 3d06ef267f0bbe24 +Block 0031 [ 14]: c5f8328a157b9f06 +Block 0031 [ 15]: 20a38ddff1a49442 +Block 0031 [ 16]: 5dcb0b307bf4d126 +Block 0031 [ 17]: c01b94bac0a4e5e9 +Block 0031 [ 18]: 11c3448ab906e24e +Block 0031 [ 19]: 355a0574c7d70dee +Block 0031 [ 20]: 0ea006d78c090c69 +Block 0031 [ 21]: 2ddcc814e8f5ec0c +Block 0031 [ 22]: fff0739c85757a45 +Block 0031 [ 23]: 7ee4982a1bfc4d86 +Block 0031 [ 24]: 3b67e4e2526ff9b7 +Block 0031 [ 25]: d7f70eb9fa227ead +Block 0031 [ 26]: 3544acf4b54868ec +Block 0031 [ 27]: 8bc614f0e28b6a92 +Block 0031 [ 28]: d2a934f539079ac3 +Block 0031 [ 29]: db0f9b2faf6c2b37 +Block 0031 [ 30]: fdcd90fa6b0f84ba +Block 0031 [ 31]: 8d0a2beb899c00fd +Block 0031 [ 32]: dc25a4332c55ea3d +Block 0031 [ 33]: 50881241f8e00f6e +Block 0031 [ 34]: 41cfcce5a5b3880a +Block 0031 [ 35]: 11614daf5026c828 +Block 0031 [ 36]: 3ddd9b304e9728d8 +Block 0031 [ 37]: e818ac2a459b8457 +Block 0031 [ 38]: 5cb8cdc8827cb247 +Block 0031 [ 39]: d5efdbab1707f2e9 +Block 0031 [ 40]: 7c65151a829c07dc +Block 0031 [ 41]: 7f6338d31e6fc39e +Block 0031 [ 42]: 8af2bcf2ed1333c8 +Block 0031 [ 43]: dda0aefa5afd4b09 +Block 0031 [ 44]: 5facf7534d9abe1f +Block 0031 [ 45]: 8ffe5101be9bd433 +Block 0031 [ 46]: 7e1a89924bab3829 +Block 0031 [ 47]: e0661ca19ba8b1bf +Block 0031 [ 48]: a8e58db69a52cdf9 +Block 0031 [ 49]: 2bcd1dd9262df44b +Block 0031 [ 50]: 2f555295c6346155 +Block 0031 [ 51]: 03f489ded473a2fb +Block 0031 [ 52]: f28bc8d4dbc4b7ec +Block 0031 [ 53]: 26d6c84798ffe2e3 +Block 0031 [ 54]: 97fae729b30dd563 +Block 0031 [ 55]: b12635047eb3acee +Block 0031 [ 56]: aff7ba90ab778f21 +Block 0031 [ 57]: 67fe61d236c7c6cf +Block 0031 [ 58]: cbae983adaf97906 +Block 0031 [ 59]: 30e8875063ca7545 +Block 0031 [ 60]: 19bf0a1582f83725 +Block 0031 [ 61]: 4c8341ee3ebf8e31 +Block 0031 [ 62]: a4a540b030e4792b +Block 0031 [ 63]: 138e0472265a2539 +Block 0031 [ 64]: 7fd36c1c40af40ec +Block 0031 [ 65]: 38be5ae88c76e298 +Block 0031 [ 66]: 18c6155b61fdc2a6 +Block 0031 [ 67]: d32f23f583f7b9c0 +Block 0031 [ 68]: 47c87ed6db4f5c38 +Block 0031 [ 69]: 9360da426e7b9ec5 +Block 0031 [ 70]: 471ca3f4eb2c7fd6 +Block 0031 [ 71]: 29ec5e7bc232e2a3 +Block 0031 [ 72]: 7686edcfdfed7037 +Block 0031 [ 73]: c35f7c9ac6b415a3 +Block 0031 [ 74]: fc56d6e6f2c6b330 +Block 0031 [ 75]: 802fb1c790d59658 +Block 0031 [ 76]: 919bf5530ba7c278 +Block 0031 [ 77]: 3a8aa8e56fd3c622 +Block 0031 [ 78]: 7d88cdd1f416e205 +Block 0031 [ 79]: 5e87c9fbc69552fc +Block 0031 [ 80]: e498a967d0ff8ec3 +Block 0031 [ 81]: 7c4349736a7b011b +Block 0031 [ 82]: 12adf2f4f56813de +Block 0031 [ 83]: d39787d17315a62d +Block 0031 [ 84]: 5a8a67341b955b7b +Block 0031 [ 85]: 8b65860241795c97 +Block 0031 [ 86]: 2c23d7d3bb43b2d6 +Block 0031 [ 87]: 43563f6cebd735b9 +Block 0031 [ 88]: 2aac7340a8a95510 +Block 0031 [ 89]: 79d30b598e436c93 +Block 0031 [ 90]: 1ca23b39c9a1f01a +Block 0031 [ 91]: 6d0bbace3cb89348 +Block 0031 [ 92]: 6268a2d39a912f00 +Block 0031 [ 93]: f5e167b29717e9ff +Block 0031 [ 94]: c5adfac7cfb2e07c +Block 0031 [ 95]: fe31b165de131497 +Block 0031 [ 96]: eda3b5f044a5650c +Block 0031 [ 97]: f2ffe58385c2cc7d +Block 0031 [ 98]: c85a79c4a8b5ed65 +Block 0031 [ 99]: a7063351c8c83c32 +Block 0031 [100]: ceafa39d17f8c3d9 +Block 0031 [101]: 341cd82e8aedd1ca +Block 0031 [102]: 0a42ae65f74aaf51 +Block 0031 [103]: e3d41dd612a09b65 +Block 0031 [104]: f3ae25982ef782f8 +Block 0031 [105]: ff109e3fbd5ee836 +Block 0031 [106]: c03d53f10518d1fc +Block 0031 [107]: 14d022a4b677f1be +Block 0031 [108]: 1c130fc69a5e1c06 +Block 0031 [109]: e2b85a1ca95da14c +Block 0031 [110]: 85d97caf315c08ef +Block 0031 [111]: 30029f09eb2e6383 +Block 0031 [112]: 2921e8257b92bcbe +Block 0031 [113]: fb97db2b711a3e60 +Block 0031 [114]: ff464a83e7152778 +Block 0031 [115]: 3b8f587cfef05f26 +Block 0031 [116]: 04d9e75c766c2b45 +Block 0031 [117]: d7bc0ceef1fd32d6 +Block 0031 [118]: 8ae936c2ca91af09 +Block 0031 [119]: d777bdec939101d6 +Block 0031 [120]: d3b1abe83999ee4c +Block 0031 [121]: 6ff4ee863c1ade4b +Block 0031 [122]: 17fa2286d2d5536e +Block 0031 [123]: d16cb8c7377ff3ab +Block 0031 [124]: 4d4b435cea35caa6 +Block 0031 [125]: c582210d99ad1359 +Block 0031 [126]: d087971b36fd6d77 +Block 0031 [127]: a55222a93754c692 + + After pass 2: +Block 0000 [ 0]: 942363968ce597a4 +Block 0000 [ 1]: a22448c0bdad5760 +Block 0000 [ 2]: a5f80662b6fa8748 +Block 0000 [ 3]: a0f9b9ce392f719f +Block 0000 [ 4]: 24771fac2c17fe57 +Block 0000 [ 5]: 6e05b2f1ffe5958f +Block 0000 [ 6]: cc45370bae5b130c +Block 0000 [ 7]: 0461f05eb0d65592 +Block 0000 [ 8]: 2eea1c82a49d6d34 +Block 0000 [ 9]: 12272607e15dfaa6 +Block 0000 [ 10]: 216906860b21749d +Block 0000 [ 11]: 00f651387251d250 +Block 0000 [ 12]: bcd2a5a392a2a43b +Block 0000 [ 13]: 9ee681ed300fdaaa +Block 0000 [ 14]: 318842723fcaae05 +Block 0000 [ 15]: d85a06bed01fb22b +Block 0000 [ 16]: 046350dc9c48ebbc +Block 0000 [ 17]: 647ee04f98fa7866 +Block 0000 [ 18]: 4dbe4ba16bfe120d +Block 0000 [ 19]: b45bca27a0cc788f +Block 0000 [ 20]: 7389557b3110dc12 +Block 0000 [ 21]: f67c7e37ff5ca6ca +Block 0000 [ 22]: 8d537efc16faac0d +Block 0000 [ 23]: 7a1eec8e08032c79 +Block 0000 [ 24]: 18bd8c2566663679 +Block 0000 [ 25]: 37593d71f6d59696 +Block 0000 [ 26]: 5f3d78a4aa578228 +Block 0000 [ 27]: e7cc793ba9a67c95 +Block 0000 [ 28]: 11761062c6beafc8 +Block 0000 [ 29]: 7a83734d47c94656 +Block 0000 [ 30]: 696353b55d34a549 +Block 0000 [ 31]: 0aa08d75ceaa2e4f +Block 0000 [ 32]: 020d1de2ccff07b8 +Block 0000 [ 33]: 3ac26f355b98a77f +Block 0000 [ 34]: 586b7fb7feac8d82 +Block 0000 [ 35]: 93520e3647f3fe9c +Block 0000 [ 36]: 3c40d90c4b43341b +Block 0000 [ 37]: 08d66d2abf80b9f5 +Block 0000 [ 38]: 1449609ac46a56d9 +Block 0000 [ 39]: 3ba305ee8fe112da +Block 0000 [ 40]: 75cb629b14266f70 +Block 0000 [ 41]: a27b5b5bfd1c5714 +Block 0000 [ 42]: 49f36a01e2990b54 +Block 0000 [ 43]: f5931fd9cdc548b0 +Block 0000 [ 44]: 126f15612a2b63ce +Block 0000 [ 45]: 16a3669213a9a111 +Block 0000 [ 46]: 86401a84f8178304 +Block 0000 [ 47]: af79709b402f275c +Block 0000 [ 48]: d8930abf6da1c122 +Block 0000 [ 49]: ce56fbf6ebc01e9f +Block 0000 [ 50]: bd302509949084b3 +Block 0000 [ 51]: 64571e4fbbb3a212 +Block 0000 [ 52]: 56989272fe4320c3 +Block 0000 [ 53]: cb17c879d6d1f781 +Block 0000 [ 54]: d47a5d5f78d8f717 +Block 0000 [ 55]: 7bd868fbb7d3bf87 +Block 0000 [ 56]: 3e06553276dd63fe +Block 0000 [ 57]: 96466ee2d93c3caf +Block 0000 [ 58]: c2795e4533e384ab +Block 0000 [ 59]: 4ecabafa9d24c35e +Block 0000 [ 60]: 3e49dda72dfec548 +Block 0000 [ 61]: d027a1cb462d9ece +Block 0000 [ 62]: c93fe06270637d9d +Block 0000 [ 63]: 9ec49544e821fe72 +Block 0000 [ 64]: 97422029aef16a01 +Block 0000 [ 65]: 509e9e1054482d9d +Block 0000 [ 66]: 4d81c6d9e4fc0b4a +Block 0000 [ 67]: 59d4d46649466f76 +Block 0000 [ 68]: 7cb23f332c9e4b4c +Block 0000 [ 69]: bb795a50d4cd9f67 +Block 0000 [ 70]: 03b3a556f49e6d9f +Block 0000 [ 71]: 46a55683aa7cef1e +Block 0000 [ 72]: c7ede4dc5bc2f8e7 +Block 0000 [ 73]: 9533f8b974ea3cdd +Block 0000 [ 74]: b14b8a6d3399fb80 +Block 0000 [ 75]: 27c6b38badcaaeb8 +Block 0000 [ 76]: d7f483a98d2fa5ef +Block 0000 [ 77]: 4dce2ae80c619079 +Block 0000 [ 78]: 76219242e50e0e96 +Block 0000 [ 79]: a6d693a4c51dae38 +Block 0000 [ 80]: 2dcfbb729b1c3980 +Block 0000 [ 81]: 25f0264a26573a39 +Block 0000 [ 82]: b33a6ef25e1913bb +Block 0000 [ 83]: 7517c5c1acea4bea +Block 0000 [ 84]: 2c4ef6504acd5c35 +Block 0000 [ 85]: 129b9cb8b3cdd94d +Block 0000 [ 86]: dbdd6a53ddf36d6e +Block 0000 [ 87]: 78afa24a3cb6b14b +Block 0000 [ 88]: 53bce6911d203682 +Block 0000 [ 89]: 1a34077b1e8e0eef +Block 0000 [ 90]: ae9e591ae3feb90b +Block 0000 [ 91]: 691a26ef618ecf6d +Block 0000 [ 92]: 8bb8d772358e5b1e +Block 0000 [ 93]: cffd14266ff9bb4d +Block 0000 [ 94]: 3ba46898bd5d5cfe +Block 0000 [ 95]: 77ad33988adec25a +Block 0000 [ 96]: ed3dead883350bea +Block 0000 [ 97]: 5d0a7ac353b24c31 +Block 0000 [ 98]: 6e6ac3e921ba46c9 +Block 0000 [ 99]: bed9e5b4d3899d3f +Block 0000 [100]: 9c0a0d3141428032 +Block 0000 [101]: 4a7f5f1c6292066b +Block 0000 [102]: 8761870ad510760d +Block 0000 [103]: 34938635ae1e4ad2 +Block 0000 [104]: 319eef4153643e18 +Block 0000 [105]: 27c87dfc969ea38d +Block 0000 [106]: 1737ef12f143cf54 +Block 0000 [107]: f815a1261999f96c +Block 0000 [108]: b5a14e371b524464 +Block 0000 [109]: 375979aa1d218a95 +Block 0000 [110]: cc671fe6a831c39d +Block 0000 [111]: 066dfa49ab4e6a24 +Block 0000 [112]: a4e5ab7b49e89ee7 +Block 0000 [113]: 314a326354659a90 +Block 0000 [114]: 6a0b43eff1de6f34 +Block 0000 [115]: 511b2e464fbc1f54 +Block 0000 [116]: 9937ac736a9569bb +Block 0000 [117]: d4259cc337fc3d15 +Block 0000 [118]: 588c20cfd35c4f5a +Block 0000 [119]: 6de3c00c4bc54f53 +Block 0000 [120]: f59c53752dd831a3 +Block 0000 [121]: 0f0d13178cea41b4 +Block 0000 [122]: a2eb999a027b86bf +Block 0000 [123]: e3559fb8e02731a4 +Block 0000 [124]: 8f9d752260ae9a4e +Block 0000 [125]: 29610b46dc6b52d2 +Block 0000 [126]: 42c6958af7594776 +Block 0000 [127]: 3b85740e71d4f71c +Block 0001 [ 0]: 8933e64816bc3c32 +Block 0001 [ 1]: 6b5d511f307c772b +Block 0001 [ 2]: 640e9c6f13125dac +Block 0001 [ 3]: c92724968dd54857 +Block 0001 [ 4]: d01ef9226eea4842 +Block 0001 [ 5]: e4655aa75ade15e7 +Block 0001 [ 6]: d477f48bed63310e +Block 0001 [ 7]: 69446abfe437eed2 +Block 0001 [ 8]: c4d1ea35f24a6f9a +Block 0001 [ 9]: b722107dc9c051e5 +Block 0001 [ 10]: 7750e4d202970704 +Block 0001 [ 11]: 8f8d1225a1bb42b7 +Block 0001 [ 12]: 4815590b75935d30 +Block 0001 [ 13]: 8208be64cc777087 +Block 0001 [ 14]: 73658f6c3af494a8 +Block 0001 [ 15]: 8b45b07ebadf1b2e +Block 0001 [ 16]: f34672d581652805 +Block 0001 [ 17]: 3e3c2ed161e9783c +Block 0001 [ 18]: a96412916e27cc5e +Block 0001 [ 19]: 06c01bf7826e9676 +Block 0001 [ 20]: 9f2f79747ae9907d +Block 0001 [ 21]: 86d22c1e939b23c8 +Block 0001 [ 22]: 860e87de53661ec9 +Block 0001 [ 23]: 1b19dd2913f34830 +Block 0001 [ 24]: c482338b59ef1ceb +Block 0001 [ 25]: eef02a98bb1718f8 +Block 0001 [ 26]: 2a3028c482d0d6b8 +Block 0001 [ 27]: 41a33e0a0ee4ca9d +Block 0001 [ 28]: 9a9456826ba1f74b +Block 0001 [ 29]: dc7a699855869415 +Block 0001 [ 30]: 852d03d25c3c5552 +Block 0001 [ 31]: d2ee86e4fbf9a4e1 +Block 0001 [ 32]: e2a9984de71206b5 +Block 0001 [ 33]: 728a26a15dbe1fb8 +Block 0001 [ 34]: ec818010efee7f6b +Block 0001 [ 35]: f4c8deb3dda7c786 +Block 0001 [ 36]: 6cfb96299a245412 +Block 0001 [ 37]: 7c5d4798b69ca9db +Block 0001 [ 38]: 5117608953ac40a3 +Block 0001 [ 39]: 1ff1030837f3a401 +Block 0001 [ 40]: 0129f0e17cf81a8d +Block 0001 [ 41]: c1f67504af11f24b +Block 0001 [ 42]: 7c9d811e29ef25a8 +Block 0001 [ 43]: 81f677f8e4fb8d59 +Block 0001 [ 44]: 6a40f0cc7a8a67c9 +Block 0001 [ 45]: e364bcdbac9c6792 +Block 0001 [ 46]: 29dad8b26f8cc597 +Block 0001 [ 47]: 1de18f044b5ba657 +Block 0001 [ 48]: 560dcf64c69a6c6a +Block 0001 [ 49]: 6aa1734eeb3f606b +Block 0001 [ 50]: 832b835316929e03 +Block 0001 [ 51]: 515d7e6ed1bf35c7 +Block 0001 [ 52]: 44d6de77335af04b +Block 0001 [ 53]: cf83557f9c2f3136 +Block 0001 [ 54]: 1251e369a95fcbbd +Block 0001 [ 55]: 608ba509ab302690 +Block 0001 [ 56]: 0423987eaafa50ab +Block 0001 [ 57]: d6cc93d3499879ee +Block 0001 [ 58]: 2456b39d82c2cba5 +Block 0001 [ 59]: fb07b4c94e7fa26f +Block 0001 [ 60]: eef2846f701cfa79 +Block 0001 [ 61]: 396ef23e96ed436b +Block 0001 [ 62]: dfa3b158325a5a2b +Block 0001 [ 63]: 8328fe5f61fb1f69 +Block 0001 [ 64]: 67c5143d52a8bfa7 +Block 0001 [ 65]: 19c43cb4735b5a86 +Block 0001 [ 66]: c810ae9fa3aa1c65 +Block 0001 [ 67]: 644eaeb65e569d04 +Block 0001 [ 68]: e10b2172426640c7 +Block 0001 [ 69]: 8082ae7cea9ae7a7 +Block 0001 [ 70]: 4dad45a8e8ddcd81 +Block 0001 [ 71]: dbd1226270739902 +Block 0001 [ 72]: 68635f3be55dd5ce +Block 0001 [ 73]: b457f93d06b180fb +Block 0001 [ 74]: a0d61375996e95f0 +Block 0001 [ 75]: 12a32b840ad8cd18 +Block 0001 [ 76]: 7809824b4aaf59a5 +Block 0001 [ 77]: 606f87eaf9341152 +Block 0001 [ 78]: 1683a54b647f2788 +Block 0001 [ 79]: 8df012b829206704 +Block 0001 [ 80]: bb1e1e560210a4a5 +Block 0001 [ 81]: 085ce09838b355f0 +Block 0001 [ 82]: 1cbe49273e85fb04 +Block 0001 [ 83]: fdcb4b14f445be52 +Block 0001 [ 84]: 1741411a9c533a72 +Block 0001 [ 85]: a7754cc877040650 +Block 0001 [ 86]: 547b7149971b51e6 +Block 0001 [ 87]: 3ca1ecc928d222b5 +Block 0001 [ 88]: 89e6059b31bd2f39 +Block 0001 [ 89]: 5e89a65cfd712b20 +Block 0001 [ 90]: 8631701b830060cc +Block 0001 [ 91]: c26929b72cca2ba2 +Block 0001 [ 92]: 71e0ce4bc264c5bc +Block 0001 [ 93]: dbebf21eab539724 +Block 0001 [ 94]: 7e1172df492bc6ac +Block 0001 [ 95]: 1a5b7631e6107903 +Block 0001 [ 96]: 0b1f56228c4984ee +Block 0001 [ 97]: 9197c0f66deb44a2 +Block 0001 [ 98]: 2f590db75fecbcda +Block 0001 [ 99]: cc5337b5eac68e3c +Block 0001 [100]: 29dde35d7b47d989 +Block 0001 [101]: ef51d99f8cee0410 +Block 0001 [102]: b11819e8450fa788 +Block 0001 [103]: 7ddbf15350186d69 +Block 0001 [104]: 568a1d424a1f63a4 +Block 0001 [105]: 7484d6c5e05e9998 +Block 0001 [106]: 2ac73044bf7528d3 +Block 0001 [107]: 433686c08c23d13f +Block 0001 [108]: 02dfbbff143a2605 +Block 0001 [109]: 9b0b16287f9868ae +Block 0001 [110]: f0f555d7f2b42574 +Block 0001 [111]: 5753eae110f92768 +Block 0001 [112]: 1558a16313a709c0 +Block 0001 [113]: 00e7dd7e011f526b +Block 0001 [114]: 47b62bca94aabcb8 +Block 0001 [115]: c44a080576b41634 +Block 0001 [116]: 51d000afc76f6940 +Block 0001 [117]: e8f146885de969e6 +Block 0001 [118]: 7d755b45c4babd6d +Block 0001 [119]: e8dcb75ff43079d7 +Block 0001 [120]: cd8686c282174b8e +Block 0001 [121]: 0437758a4f2771cb +Block 0001 [122]: 36547a9cf289cecd +Block 0001 [123]: 73eb73f11a143bc1 +Block 0001 [124]: 77a96e30c3bbbe56 +Block 0001 [125]: 3adf14fe652f6b47 +Block 0001 [126]: c39db9672c033a5e +Block 0001 [127]: 5428b1c8e77ae9bd +Block 0002 [ 0]: 27143d2f1efffa3b +Block 0002 [ 1]: 92054d8203ce8b23 +Block 0002 [ 2]: 7adfb7b6bcc72a95 +Block 0002 [ 3]: 2e9b30722a801455 +Block 0002 [ 4]: 07d38bb53dc981b9 +Block 0002 [ 5]: 50aef2f924d4aeec +Block 0002 [ 6]: 63356ab028532887 +Block 0002 [ 7]: 3d81696f259e64e0 +Block 0002 [ 8]: b7687d4458cd64ef +Block 0002 [ 9]: 2bd8d2f76c5905d0 +Block 0002 [ 10]: 79f82c385784f252 +Block 0002 [ 11]: 1c81144344d2b68e +Block 0002 [ 12]: 883d9dc766b4a30c +Block 0002 [ 13]: 611e0378bc6a49c8 +Block 0002 [ 14]: 7a9cad2711172433 +Block 0002 [ 15]: 787c5fb132ea2d0a +Block 0002 [ 16]: d27f3d126ba19edd +Block 0002 [ 17]: 02dde8594c9906eb +Block 0002 [ 18]: 3c6e00c96752f958 +Block 0002 [ 19]: 4fddb42e97f8d0d3 +Block 0002 [ 20]: 3f19d4814968bf82 +Block 0002 [ 21]: e08abaf6f1035dd9 +Block 0002 [ 22]: b80a7e82adf0f85c +Block 0002 [ 23]: 298a9a8108dbf8e9 +Block 0002 [ 24]: 784856c72cf9ac8f +Block 0002 [ 25]: ffaccb829fa5f65c +Block 0002 [ 26]: ed2bf64259ea583f +Block 0002 [ 27]: ffe048699cd2a692 +Block 0002 [ 28]: f564e04d1a8a4252 +Block 0002 [ 29]: 6902f9c761dadfe7 +Block 0002 [ 30]: f3875beb4192b204 +Block 0002 [ 31]: ed38974911bda5e5 +Block 0002 [ 32]: 41e7282b8648818e +Block 0002 [ 33]: 457d44a3523f3b8a +Block 0002 [ 34]: 26140075cd70fb63 +Block 0002 [ 35]: c12aa89584f45da2 +Block 0002 [ 36]: 445c6774b1be85b5 +Block 0002 [ 37]: d82f3fe66a9835de +Block 0002 [ 38]: 272b4c1b006f6458 +Block 0002 [ 39]: e18a80e5de5f8f92 +Block 0002 [ 40]: b279ec48aba4a2cc +Block 0002 [ 41]: 2ef21bdf8fc95896 +Block 0002 [ 42]: f9378d25e10c2b8a +Block 0002 [ 43]: 9d2e6cea6629a6c0 +Block 0002 [ 44]: 2eae57a0d6ba83ad +Block 0002 [ 45]: 2eb4d8a56c8ca748 +Block 0002 [ 46]: ee9ddb4fd7973dad +Block 0002 [ 47]: c4bf57a84c7bf795 +Block 0002 [ 48]: 6c4d217528dbf560 +Block 0002 [ 49]: 7d6f8af4eab0cd59 +Block 0002 [ 50]: 776bd3efb2f3b8fe +Block 0002 [ 51]: 8e0795aba13eb6a6 +Block 0002 [ 52]: dd5aae2ed78391da +Block 0002 [ 53]: d53a11f1b81cfee2 +Block 0002 [ 54]: c344c6012479f24d +Block 0002 [ 55]: f86d097070bba89a +Block 0002 [ 56]: 85403fe0759bd9c0 +Block 0002 [ 57]: 6e351347eced8994 +Block 0002 [ 58]: 170574bf614f349e +Block 0002 [ 59]: 4a7477ce0bc54b02 +Block 0002 [ 60]: 2bec0e0a6e1f375a +Block 0002 [ 61]: 7216226a67c5d6ba +Block 0002 [ 62]: b44cf28046c7a845 +Block 0002 [ 63]: 3f0c4129f395817e +Block 0002 [ 64]: ffc0ff91b9057736 +Block 0002 [ 65]: ab1078ce910f14e2 +Block 0002 [ 66]: b2e8408a2695b35d +Block 0002 [ 67]: 8c1848ddfa66636f +Block 0002 [ 68]: 1faec37f9f1428ba +Block 0002 [ 69]: 19a8ca8cb3592af5 +Block 0002 [ 70]: 8c55e560993ea226 +Block 0002 [ 71]: 2b466f00788d83c3 +Block 0002 [ 72]: 04219396cc82f878 +Block 0002 [ 73]: 644028c105701847 +Block 0002 [ 74]: 71a90499ea6846bf +Block 0002 [ 75]: 1eafc2706c7debdf +Block 0002 [ 76]: 32d47b4a9d6c04f0 +Block 0002 [ 77]: b3e8d611184079c8 +Block 0002 [ 78]: 60c1676692032ccd +Block 0002 [ 79]: 51b6316cf58681da +Block 0002 [ 80]: fdd554b4196037df +Block 0002 [ 81]: 7311347f4036ef59 +Block 0002 [ 82]: 54da8cce51af74bb +Block 0002 [ 83]: 15dc8d1e1fcc4c47 +Block 0002 [ 84]: e1242b600438eb26 +Block 0002 [ 85]: 5e9af3576b040c3a +Block 0002 [ 86]: 9d498016f4513d1f +Block 0002 [ 87]: dc77cdca25c279da +Block 0002 [ 88]: 64b1c3dafd531d4c +Block 0002 [ 89]: daa8b3064bcd92f8 +Block 0002 [ 90]: 18c717b9bd23c6ff +Block 0002 [ 91]: 641efa1283ce1a64 +Block 0002 [ 92]: e812f651876e59d6 +Block 0002 [ 93]: dc93172e4dfdd48d +Block 0002 [ 94]: cb833b72b2363cde +Block 0002 [ 95]: 1e55a82cf0179cb9 +Block 0002 [ 96]: 898d29a991b9d2a1 +Block 0002 [ 97]: f08ac0673cb42432 +Block 0002 [ 98]: c70ab8e1546f0596 +Block 0002 [ 99]: d04126ac1778f91d +Block 0002 [100]: 4d89cc5ac78f54da +Block 0002 [101]: e61701e9ef2fd2ed +Block 0002 [102]: 27a0a559bfed8bc1 +Block 0002 [103]: 8bc653b6f5616da6 +Block 0002 [104]: b25b95c11540f139 +Block 0002 [105]: 935de0b89e2bf3a3 +Block 0002 [106]: c1ca9175889860ae +Block 0002 [107]: bad4d3e6aeef6ab6 +Block 0002 [108]: 8227429a091f7cac +Block 0002 [109]: bdaaa59b9599f80e +Block 0002 [110]: a5e0837fe0c873c4 +Block 0002 [111]: 218d782e87b94143 +Block 0002 [112]: c0697881686f0cbe +Block 0002 [113]: 08708761b2c12a57 +Block 0002 [114]: 990e8e0e2cc49a1a +Block 0002 [115]: 8159be87497fee30 +Block 0002 [116]: 770200c1ce09a3ee +Block 0002 [117]: 46f87161802bf7ae +Block 0002 [118]: 4d8ecc452b78cdb2 +Block 0002 [119]: eb42428ee6d8ebad +Block 0002 [120]: 6791a4843ae97f7e +Block 0002 [121]: 0844f63752143720 +Block 0002 [122]: 6d4ec9812e538900 +Block 0002 [123]: cac8c8d555e27212 +Block 0002 [124]: 50f57f07badc20af +Block 0002 [125]: 6878628488adcd8c +Block 0002 [126]: 456985a0caaca233 +Block 0002 [127]: 69bed6dacc1aecc6 +Block 0003 [ 0]: 4b0e087d223f8e25 +Block 0003 [ 1]: 910b21c025d932ed +Block 0003 [ 2]: 0f6b2e762d91655e +Block 0003 [ 3]: 7c0f520bc631d589 +Block 0003 [ 4]: 9823f0419761c5fe +Block 0003 [ 5]: bb8812442cf4a512 +Block 0003 [ 6]: 2ee03b353b0d5d03 +Block 0003 [ 7]: b73de85aea332935 +Block 0003 [ 8]: 0a633692f8316ba4 +Block 0003 [ 9]: 8b1c009d2c67cc73 +Block 0003 [ 10]: 1ecce5d630554dd9 +Block 0003 [ 11]: 443732d25e36560b +Block 0003 [ 12]: 544796fd126802aa +Block 0003 [ 13]: b04709f729b457ae +Block 0003 [ 14]: fcc5e7a2070bbbff +Block 0003 [ 15]: 1303b873028b16d8 +Block 0003 [ 16]: 8281b07b71a7b53b +Block 0003 [ 17]: ae345eb749a3b061 +Block 0003 [ 18]: f8c3c7d848a57090 +Block 0003 [ 19]: 2bc012ffd8e67259 +Block 0003 [ 20]: daa5f0425df20682 +Block 0003 [ 21]: 633c21a777c64b34 +Block 0003 [ 22]: 760a52c5bd088239 +Block 0003 [ 23]: 680d3b03371886cb +Block 0003 [ 24]: 1ddaff5ab4514179 +Block 0003 [ 25]: 3fc2baa599d33474 +Block 0003 [ 26]: 9331275233ff8127 +Block 0003 [ 27]: 6d8f7b0d99b8b9d6 +Block 0003 [ 28]: f11fdc68569752a4 +Block 0003 [ 29]: 46b1545d247bcdca +Block 0003 [ 30]: 07a9fa589f450696 +Block 0003 [ 31]: f94751714c942d6b +Block 0003 [ 32]: e936d6d0f1a555c1 +Block 0003 [ 33]: 9f23639b50f7b3eb +Block 0003 [ 34]: 77ecd6638ee94110 +Block 0003 [ 35]: 96692e332c8b554f +Block 0003 [ 36]: 5c0d272f724ef7d7 +Block 0003 [ 37]: c1522f5e06bd81a6 +Block 0003 [ 38]: 0b5c007bf5f11d0d +Block 0003 [ 39]: 62c5150317c2cdf5 +Block 0003 [ 40]: c97d944f9acbb3c8 +Block 0003 [ 41]: 9715798f0363471c +Block 0003 [ 42]: 1c1b4fef37aa3c9c +Block 0003 [ 43]: 7a86df1842374201 +Block 0003 [ 44]: 4f47ea46bef1b0da +Block 0003 [ 45]: fd6fa9c86175a7ea +Block 0003 [ 46]: 0f9f9b1230c86278 +Block 0003 [ 47]: 3995b03527037d27 +Block 0003 [ 48]: c263efdc370cdce2 +Block 0003 [ 49]: 84f20badc86c03f8 +Block 0003 [ 50]: 7c1005ec5f211ed6 +Block 0003 [ 51]: f8d06c05e9a72026 +Block 0003 [ 52]: 4aae8636403d1108 +Block 0003 [ 53]: 4546835813223393 +Block 0003 [ 54]: 1c2764d4cd5313cf +Block 0003 [ 55]: 725136f3051ef360 +Block 0003 [ 56]: b4d0034de3d614b0 +Block 0003 [ 57]: 792103a24761ffd4 +Block 0003 [ 58]: 4e38609d0044e97c +Block 0003 [ 59]: 9afa00b1d5dd4333 +Block 0003 [ 60]: 97dd3b7a6fa89f13 +Block 0003 [ 61]: e6092892e8bf751c +Block 0003 [ 62]: 6f55cba23b48301f +Block 0003 [ 63]: f1dccdff20ae0d89 +Block 0003 [ 64]: c3a9a019a2058563 +Block 0003 [ 65]: 765f13d5212bbed6 +Block 0003 [ 66]: be12cda3cad84c16 +Block 0003 [ 67]: ae93875e493e512f +Block 0003 [ 68]: 7ebc4b263a43ffb8 +Block 0003 [ 69]: 437953643dddd941 +Block 0003 [ 70]: 6e505fc1442766f0 +Block 0003 [ 71]: fee308509c0fb33a +Block 0003 [ 72]: 5636969202552bf8 +Block 0003 [ 73]: 27676e0c252b1003 +Block 0003 [ 74]: 186b7418403aa6e5 +Block 0003 [ 75]: 558cfdc97fbd6c3f +Block 0003 [ 76]: 631f97c52eb34738 +Block 0003 [ 77]: 9b3fc9f6107fa759 +Block 0003 [ 78]: cfd95882728d049b +Block 0003 [ 79]: 9c7f58fb99e270f7 +Block 0003 [ 80]: 7e38dc0cca98a684 +Block 0003 [ 81]: 198f7cf761235866 +Block 0003 [ 82]: 5319b61c46bda215 +Block 0003 [ 83]: f8c46a363243225b +Block 0003 [ 84]: d2740b3e180bb236 +Block 0003 [ 85]: 8254e42ad7fe9ca4 +Block 0003 [ 86]: 1d008ab69a2fd975 +Block 0003 [ 87]: b207601e992f963d +Block 0003 [ 88]: 3184eff21f0bfb58 +Block 0003 [ 89]: a9a6ddda5b3d04af +Block 0003 [ 90]: ca7eb6a074c159be +Block 0003 [ 91]: 22a707e28bf36d07 +Block 0003 [ 92]: d2274395db860d0e +Block 0003 [ 93]: 9532e6a03fbe3374 +Block 0003 [ 94]: 722c4483d24e0771 +Block 0003 [ 95]: 09529f5e75d973d7 +Block 0003 [ 96]: e6fde2e300ac1149 +Block 0003 [ 97]: e5ea399e35b56d85 +Block 0003 [ 98]: 76b8fccf34f67e03 +Block 0003 [ 99]: 685031d32e27fe9e +Block 0003 [100]: 21fd6ea20cfc5f82 +Block 0003 [101]: 888bffd8fe0e3b39 +Block 0003 [102]: 20056565ed74a83b +Block 0003 [103]: 86ae5f8cfec26527 +Block 0003 [104]: 045f8635c5deb96b +Block 0003 [105]: bf46419a235d6a27 +Block 0003 [106]: ed55a12bd839eefd +Block 0003 [107]: a46b03852768129f +Block 0003 [108]: e9392a5d93768be7 +Block 0003 [109]: 1755683d48f0c69b +Block 0003 [110]: f06e2709a9cd9675 +Block 0003 [111]: e589e4292cf704b5 +Block 0003 [112]: 6603b685775f4b74 +Block 0003 [113]: 6c64f5abd9163d64 +Block 0003 [114]: 8701c20eb13acd97 +Block 0003 [115]: 9d2f0e480ee351b5 +Block 0003 [116]: 7e2c0a9376088c82 +Block 0003 [117]: 6aa8c72815a770f1 +Block 0003 [118]: 0feb7b00d5113c68 +Block 0003 [119]: 72e79efd4e6f678c +Block 0003 [120]: 9c24b446c6641bd4 +Block 0003 [121]: 92a43699ecc3988f +Block 0003 [122]: 9dd3422d698d52c4 +Block 0003 [123]: 586130e96521c849 +Block 0003 [124]: a3a9e2624c22e9e2 +Block 0003 [125]: 7e982432d8e1761c +Block 0003 [126]: de238c4c31ab9518 +Block 0003 [127]: 9806bfa8d721de9f +Block 0004 [ 0]: db756afb20d0f801 +Block 0004 [ 1]: 52403c4b7098c439 +Block 0004 [ 2]: 060476b1eb46d30b +Block 0004 [ 3]: 28981d0098506ae3 +Block 0004 [ 4]: 0f05c643aa615a21 +Block 0004 [ 5]: cf2cc1388fa6c1d2 +Block 0004 [ 6]: 86fc3b76a8468c99 +Block 0004 [ 7]: a84397030daf6d8a +Block 0004 [ 8]: c650eb82be15bb19 +Block 0004 [ 9]: 253cf6e26b4655a8 +Block 0004 [ 10]: 085677dbf1566016 +Block 0004 [ 11]: 40fe9d75102201a6 +Block 0004 [ 12]: 613a5d61cdeb1b35 +Block 0004 [ 13]: fadad5a34a9cf63b +Block 0004 [ 14]: c3dd954823b55935 +Block 0004 [ 15]: b67522507c43fb2b +Block 0004 [ 16]: 601c060f0e8e6141 +Block 0004 [ 17]: ea466cf84f084dbd +Block 0004 [ 18]: f23820d8c13abd43 +Block 0004 [ 19]: b0e74adb6b084535 +Block 0004 [ 20]: c78e726fcffcbe09 +Block 0004 [ 21]: 398b885ddca727ab +Block 0004 [ 22]: 8e78fcdbf9a66417 +Block 0004 [ 23]: 5dbc6191b2232c06 +Block 0004 [ 24]: d706a14b2fc8ce39 +Block 0004 [ 25]: e4535ac6c8a26ed0 +Block 0004 [ 26]: 3805dfffecd51d9f +Block 0004 [ 27]: b4c63b72deaba3a6 +Block 0004 [ 28]: adb0c3bbb220b8e1 +Block 0004 [ 29]: 830dd01847112438 +Block 0004 [ 30]: c65d1ed36fe0fa0a +Block 0004 [ 31]: 449b624d9f7e4314 +Block 0004 [ 32]: 47856deea66fd6b6 +Block 0004 [ 33]: 336fd6e2c0b459dd +Block 0004 [ 34]: b24c5155dc84165f +Block 0004 [ 35]: 5b2785f6a2715313 +Block 0004 [ 36]: 4e1898ef2bf8c505 +Block 0004 [ 37]: d8b9094a47f656f2 +Block 0004 [ 38]: 12519f417bf4dfa7 +Block 0004 [ 39]: a977d962d47e354f +Block 0004 [ 40]: 691f4e137dbf082e +Block 0004 [ 41]: 5ad29eed2bac7fec +Block 0004 [ 42]: 427572e48fd7644e +Block 0004 [ 43]: 1b8cf180a1c73237 +Block 0004 [ 44]: 1aabf9f1184937da +Block 0004 [ 45]: 891cbda9e37ba68d +Block 0004 [ 46]: 0418daabe2c16169 +Block 0004 [ 47]: 64a7382e19d51973 +Block 0004 [ 48]: 8dbb4ef40e24566f +Block 0004 [ 49]: b11b05b045872fda +Block 0004 [ 50]: f3a6e55d9b5e47ff +Block 0004 [ 51]: b014a28f4444c68d +Block 0004 [ 52]: 36fd09913e88cc14 +Block 0004 [ 53]: 57dd73f3f6d83016 +Block 0004 [ 54]: 4fa25ff086004319 +Block 0004 [ 55]: 935ac3b9db1501e2 +Block 0004 [ 56]: 6e1a4444010c3cb4 +Block 0004 [ 57]: bde290d21f347b04 +Block 0004 [ 58]: 05fd38a4d47f0af6 +Block 0004 [ 59]: a3fbc08baf1fbede +Block 0004 [ 60]: 9595005e75362334 +Block 0004 [ 61]: 0b2ecde0552078e7 +Block 0004 [ 62]: be64f75e7900a732 +Block 0004 [ 63]: dfb4eb288d7eb5e4 +Block 0004 [ 64]: 20b14d8b83924244 +Block 0004 [ 65]: 04868735f30b39cf +Block 0004 [ 66]: c64982adce3c469f +Block 0004 [ 67]: 5b7b474fede2087a +Block 0004 [ 68]: 2c0a1912ad737151 +Block 0004 [ 69]: 1f4b24117b480cd2 +Block 0004 [ 70]: effcecfccbcfff8e +Block 0004 [ 71]: 2b0cb96832d4dc16 +Block 0004 [ 72]: e7fccf6dfa07ecd8 +Block 0004 [ 73]: 953afc6f861b1c94 +Block 0004 [ 74]: 725f8ba6d97ef823 +Block 0004 [ 75]: 5d2c69fd94b7e3d5 +Block 0004 [ 76]: f9fc85d4bd30520b +Block 0004 [ 77]: 54450477c83e21d1 +Block 0004 [ 78]: 2acbb625eda3b2f6 +Block 0004 [ 79]: 65ce6cc83e36847c +Block 0004 [ 80]: 157b6fcc033f9508 +Block 0004 [ 81]: 1e87646b58a7f2ad +Block 0004 [ 82]: 67d06c966e2ec700 +Block 0004 [ 83]: 7bb67c9e07139485 +Block 0004 [ 84]: 3c2a6ffb331055e9 +Block 0004 [ 85]: 3222341a5a4bfaa8 +Block 0004 [ 86]: 925790ae0fa10d1f +Block 0004 [ 87]: f2ef3171c9df4d0e +Block 0004 [ 88]: e3222a1744853453 +Block 0004 [ 89]: cc4a70c90ed4e3d1 +Block 0004 [ 90]: a6acce36d3cbff61 +Block 0004 [ 91]: 7d50ae85b9affa5d +Block 0004 [ 92]: 568200dc03447ed8 +Block 0004 [ 93]: 71ff3b3a01fab487 +Block 0004 [ 94]: 1c985317bb54925c +Block 0004 [ 95]: 05f623542b7f3397 +Block 0004 [ 96]: be9b653e7d14f39b +Block 0004 [ 97]: bf0c1f7dd51c1302 +Block 0004 [ 98]: bf86d9a6345007e9 +Block 0004 [ 99]: b820c3d21badb127 +Block 0004 [100]: 02834afe16035acc +Block 0004 [101]: 7fa95f3e1a84f66d +Block 0004 [102]: 515b912d57908619 +Block 0004 [103]: baa33b5032e8fcd6 +Block 0004 [104]: 7483cbfdef56254c +Block 0004 [105]: 3832871e97423269 +Block 0004 [106]: 72c7246ea679e000 +Block 0004 [107]: c9f8babb13cc69b0 +Block 0004 [108]: fb8757f84e77c30e +Block 0004 [109]: 9fdde5e1bb0e383e +Block 0004 [110]: 1766df9e43c5e58f +Block 0004 [111]: c618e86b1af6da02 +Block 0004 [112]: d7d9c781b3015ab0 +Block 0004 [113]: 51841b0d440e3795 +Block 0004 [114]: 282e5dcc69d5d2ec +Block 0004 [115]: 8cdad5cc0e82a1dc +Block 0004 [116]: e68c2af47545fd32 +Block 0004 [117]: 8350a28d7b542bb9 +Block 0004 [118]: 91372fdbb5b852bb +Block 0004 [119]: ded3484130d33a67 +Block 0004 [120]: f185eaf9a77023b2 +Block 0004 [121]: 26205250ddc11c7f +Block 0004 [122]: 39c3a7fcd987d77e +Block 0004 [123]: 8ff0734fe37406ac +Block 0004 [124]: 776c54ae235ecceb +Block 0004 [125]: 1df84f1a5ef7bc3d +Block 0004 [126]: f02e8b997b65c12f +Block 0004 [127]: d0efa6b02e97ed1d +Block 0005 [ 0]: 97365ec5d5feb9dc +Block 0005 [ 1]: 405a3347fb59461c +Block 0005 [ 2]: f9e0c320e8d154ed +Block 0005 [ 3]: 93d762daab5535f2 +Block 0005 [ 4]: e1279c771bb7ad39 +Block 0005 [ 5]: 2ddd3606c554bc2c +Block 0005 [ 6]: 6450a2130996c4f6 +Block 0005 [ 7]: 885bb49a481d2fe7 +Block 0005 [ 8]: 362b94e89df1c117 +Block 0005 [ 9]: 5ab9b69f2c8ac46c +Block 0005 [ 10]: 40ad27720d57185a +Block 0005 [ 11]: 8d50540d4e6e6d7b +Block 0005 [ 12]: 83a9e4ef385fe9d5 +Block 0005 [ 13]: b9b54d8b8f2984f5 +Block 0005 [ 14]: e1735ae8748ed910 +Block 0005 [ 15]: 0e446a07067a4e8e +Block 0005 [ 16]: c647cabca2bf8f7a +Block 0005 [ 17]: 94b2083ffab378f8 +Block 0005 [ 18]: ac8c8efc5e9ebb71 +Block 0005 [ 19]: a3c091fb4042d4fb +Block 0005 [ 20]: 0d3396a94e8f94e3 +Block 0005 [ 21]: 96d1456fabae1b0b +Block 0005 [ 22]: 26c474009eba6d80 +Block 0005 [ 23]: 5957c46a8e1c0c39 +Block 0005 [ 24]: d5aafbccb10c5642 +Block 0005 [ 25]: 1dd59c0f842f7fca +Block 0005 [ 26]: e3fa2b6c3eeca025 +Block 0005 [ 27]: 67c4520871b2e932 +Block 0005 [ 28]: 5ebd6871c2fc0b59 +Block 0005 [ 29]: 90d2edee6c1d9005 +Block 0005 [ 30]: dad34dbac094b87f +Block 0005 [ 31]: e54438ecb4b24f62 +Block 0005 [ 32]: 6eb10b8511b48f6d +Block 0005 [ 33]: 863ac85b81bb1c2b +Block 0005 [ 34]: 00ec6014392eb5b3 +Block 0005 [ 35]: 20c55c34c775b35b +Block 0005 [ 36]: 6a2efc2c5917a502 +Block 0005 [ 37]: b8cb8a562d9fd683 +Block 0005 [ 38]: f42931a0a29ccba2 +Block 0005 [ 39]: c3964b6d73dd347e +Block 0005 [ 40]: f23949b6fa10adc0 +Block 0005 [ 41]: 19a24ae861a83ccc +Block 0005 [ 42]: 49b34dc230aa14f5 +Block 0005 [ 43]: 277cc5b873776b0e +Block 0005 [ 44]: 6732bd0cbadb9619 +Block 0005 [ 45]: 2be9ae36f860f161 +Block 0005 [ 46]: 61592c3eb719855a +Block 0005 [ 47]: d2b629caba2aebec +Block 0005 [ 48]: 96247c1ae0664282 +Block 0005 [ 49]: 655c7c4537585a3c +Block 0005 [ 50]: 60b569ae13b6c8b1 +Block 0005 [ 51]: f335d545e50a4530 +Block 0005 [ 52]: 0bbbfaf0be722cbf +Block 0005 [ 53]: dfc61e9e557e44e5 +Block 0005 [ 54]: f15ae5152f91946f +Block 0005 [ 55]: 8b10184967e65648 +Block 0005 [ 56]: ee62ab86f357fbf6 +Block 0005 [ 57]: a676cd316f73b00a +Block 0005 [ 58]: e15dd8ae85ef70f7 +Block 0005 [ 59]: 0ed5e6375469b87b +Block 0005 [ 60]: bf4ad0c50a762ab1 +Block 0005 [ 61]: 0895b67633c14add +Block 0005 [ 62]: d4e44141246331d4 +Block 0005 [ 63]: 7bfc4a0d5c60bd78 +Block 0005 [ 64]: c88fee400aba9ca4 +Block 0005 [ 65]: b2bb482d8f37f64b +Block 0005 [ 66]: 8d19eb8ae10bb8e0 +Block 0005 [ 67]: 71647d13b3f2df80 +Block 0005 [ 68]: 330809743e2acd7a +Block 0005 [ 69]: 0b0a6e291fdd4d64 +Block 0005 [ 70]: 6ed960c9c7d0147a +Block 0005 [ 71]: 3d3453b5908f2eaf +Block 0005 [ 72]: 666a42e1953f7783 +Block 0005 [ 73]: 563179451c527b5e +Block 0005 [ 74]: 98de158b342a81a9 +Block 0005 [ 75]: 70ea5bed36f0c27c +Block 0005 [ 76]: c5d48e5c75044ac4 +Block 0005 [ 77]: 131d1cf79497fce4 +Block 0005 [ 78]: 502d4f9d9722d95a +Block 0005 [ 79]: 8cfd3119d03532ba +Block 0005 [ 80]: 847c8fed220b551f +Block 0005 [ 81]: 2de629f67b80ab43 +Block 0005 [ 82]: 366f96d310b73f7a +Block 0005 [ 83]: 882854c6aad02e67 +Block 0005 [ 84]: 655b8de717029a52 +Block 0005 [ 85]: ec848e02d002b2e7 +Block 0005 [ 86]: f468bcae80307e3b +Block 0005 [ 87]: e945840327a82759 +Block 0005 [ 88]: 44a9540fbc154202 +Block 0005 [ 89]: 92ecb8e9953e4b4a +Block 0005 [ 90]: 507abd983ab15f66 +Block 0005 [ 91]: 4b74dd58863117aa +Block 0005 [ 92]: 8f0c16a602e827b6 +Block 0005 [ 93]: 04dabe99055c7911 +Block 0005 [ 94]: 751498662fa26b4c +Block 0005 [ 95]: cab90768d911184e +Block 0005 [ 96]: f788ce69a19245e2 +Block 0005 [ 97]: d82096d5861d09b4 +Block 0005 [ 98]: d5a49556dd1a64a3 +Block 0005 [ 99]: 33c5d1ff3108f1c3 +Block 0005 [100]: 7000ced324095021 +Block 0005 [101]: 9c0b106f237035b0 +Block 0005 [102]: 5b0a824629eefaad +Block 0005 [103]: 9f3a70a53f500991 +Block 0005 [104]: 738807452e3a3632 +Block 0005 [105]: 2ed22603a5665055 +Block 0005 [106]: afe9ee256c051b3f +Block 0005 [107]: ac36d88864dd45fc +Block 0005 [108]: 4fcaa3b6e807e1ce +Block 0005 [109]: c149207930dabc97 +Block 0005 [110]: 2ac814034dc81dfc +Block 0005 [111]: 71edb390a916a67f +Block 0005 [112]: 20cf554180ffe9e0 +Block 0005 [113]: bb54c1d8ea79d355 +Block 0005 [114]: 2eb620e1e1811427 +Block 0005 [115]: 58d664027883cedf +Block 0005 [116]: a8fec49038889919 +Block 0005 [117]: a3bdcbb52bd4b630 +Block 0005 [118]: f6cd25ab758341dd +Block 0005 [119]: ae448eb1a7acb711 +Block 0005 [120]: 5d0d3d360339943f +Block 0005 [121]: 6b9a3ecd474aba3b +Block 0005 [122]: 2c534ae7c2a3b04f +Block 0005 [123]: e892ccac17c6456d +Block 0005 [124]: 7ff808f37169c921 +Block 0005 [125]: b8614be60c9c41bc +Block 0005 [126]: 439810b13ed01e1c +Block 0005 [127]: ca192babb18518cb +Block 0006 [ 0]: 5567c3fe090dd28e +Block 0006 [ 1]: 8d67a7ba019c88dc +Block 0006 [ 2]: 8caff62eff631181 +Block 0006 [ 3]: d72eddba14b5c03d +Block 0006 [ 4]: d7630af139b87bd7 +Block 0006 [ 5]: 750853f41bb331a8 +Block 0006 [ 6]: f8d103c297762291 +Block 0006 [ 7]: 2dae083ec585a586 +Block 0006 [ 8]: 626b2b63d161498a +Block 0006 [ 9]: c81de669dfeb13aa +Block 0006 [ 10]: 9c41b20f9889274c +Block 0006 [ 11]: 5c064dc661bbc6d6 +Block 0006 [ 12]: d8f6cb69aa556f7d +Block 0006 [ 13]: 569c7a1de808caf8 +Block 0006 [ 14]: f212e8fc9864aa7f +Block 0006 [ 15]: 784a66ec8fded6bf +Block 0006 [ 16]: 7b3644d8c7cc6ee2 +Block 0006 [ 17]: 47de720ab8662dc8 +Block 0006 [ 18]: b60758c5f35d33a3 +Block 0006 [ 19]: e82bc4ee11789ccd +Block 0006 [ 20]: b4b14f39ad071939 +Block 0006 [ 21]: cdc572feb64c77f6 +Block 0006 [ 22]: 4f1d233e9d2afb7a +Block 0006 [ 23]: 083f6f09f3589c18 +Block 0006 [ 24]: 91e9bb64b39eedc6 +Block 0006 [ 25]: ff631632c44b9be5 +Block 0006 [ 26]: 5f1d74f19fcf9ebb +Block 0006 [ 27]: c18575702765f410 +Block 0006 [ 28]: cb4c1f6b4b92ae73 +Block 0006 [ 29]: 2c47acff08aa3b6a +Block 0006 [ 30]: 7614e988f5de7f0d +Block 0006 [ 31]: 00aef92bc84ab36c +Block 0006 [ 32]: 8d568e3899bc329d +Block 0006 [ 33]: 93ee0cbb3fa97312 +Block 0006 [ 34]: 13d5658a3a5c3c06 +Block 0006 [ 35]: a19ab4c531fc3f3f +Block 0006 [ 36]: 0339f774914c7335 +Block 0006 [ 37]: 54e78c34c50dd35c +Block 0006 [ 38]: e222bc860018290d +Block 0006 [ 39]: 9c28c86cd7f61b70 +Block 0006 [ 40]: a85380135b847fc1 +Block 0006 [ 41]: 225414a9bdb19b61 +Block 0006 [ 42]: a0fbd39ccb46aa3f +Block 0006 [ 43]: 1ca6eb4988648f69 +Block 0006 [ 44]: 01695df4d0f0409a +Block 0006 [ 45]: d3b450827a33f3a7 +Block 0006 [ 46]: f5bfe4e78dc9b627 +Block 0006 [ 47]: 100ab041786e41d4 +Block 0006 [ 48]: 9d9d415f459fbe98 +Block 0006 [ 49]: 853fd4f2e9a42867 +Block 0006 [ 50]: ea657b6b10faf0d4 +Block 0006 [ 51]: 259e1b12b0f171fa +Block 0006 [ 52]: e8976ec91290563d +Block 0006 [ 53]: 1e412ebf6e0db035 +Block 0006 [ 54]: 849d615c1c6cfca2 +Block 0006 [ 55]: 5c11d9c6ce174cdb +Block 0006 [ 56]: 30b41a0e826fd9c2 +Block 0006 [ 57]: 31d73e96955f1340 +Block 0006 [ 58]: 14f074b7e26e3baa +Block 0006 [ 59]: 8eb1bec37ae581dc +Block 0006 [ 60]: 746facce259c02c9 +Block 0006 [ 61]: 03d1f7778abbe63f +Block 0006 [ 62]: eeff2118997dc86d +Block 0006 [ 63]: 90627027834a05e4 +Block 0006 [ 64]: 4bd0242cc3f044f7 +Block 0006 [ 65]: 519c2452cd1ca543 +Block 0006 [ 66]: e0ae6c47d727d6be +Block 0006 [ 67]: a913d15ae450d102 +Block 0006 [ 68]: 2823ac24a8d8fb6c +Block 0006 [ 69]: e907eb50e28565b1 +Block 0006 [ 70]: be0384795f998c29 +Block 0006 [ 71]: 3e3f5d9c252d4a47 +Block 0006 [ 72]: ed46fba6166a296e +Block 0006 [ 73]: 411e90d0cc8328fa +Block 0006 [ 74]: 332ca370c5b19bed +Block 0006 [ 75]: ac912248b236590e +Block 0006 [ 76]: 3ebd9154aea3189b +Block 0006 [ 77]: f3adf95f07c7edeb +Block 0006 [ 78]: 832321ca2483199f +Block 0006 [ 79]: 4b3578726e6d548e +Block 0006 [ 80]: b00c1ef3d8cbd83a +Block 0006 [ 81]: 7c29df3c99839f71 +Block 0006 [ 82]: 7825fea5c6892b1e +Block 0006 [ 83]: e99043733d5c8d15 +Block 0006 [ 84]: 3caccd923a60f855 +Block 0006 [ 85]: 2a3e154af80bf594 +Block 0006 [ 86]: 6688cc7c4764e11e +Block 0006 [ 87]: fa6ca05d1a601f5e +Block 0006 [ 88]: 04b5e8c105dd4562 +Block 0006 [ 89]: cbac7817e2e863ba +Block 0006 [ 90]: 58cd92a6c13b357e +Block 0006 [ 91]: ce4db34ad1d1bcbe +Block 0006 [ 92]: 68e21a26f2c97d49 +Block 0006 [ 93]: 53e396abb44d6f2c +Block 0006 [ 94]: 5cd31a0480291e4b +Block 0006 [ 95]: c91a9f8b190a4897 +Block 0006 [ 96]: 02ff4635b1f7bd99 +Block 0006 [ 97]: 6cea31788a0a3c45 +Block 0006 [ 98]: f22d5bf22fd3eb77 +Block 0006 [ 99]: 910e7439df3e5050 +Block 0006 [100]: ff94f950ee74b111 +Block 0006 [101]: b05178c84ae6c19f +Block 0006 [102]: eb2a7088c937b565 +Block 0006 [103]: 50d5dd2aea376866 +Block 0006 [104]: 7f629a6dd240c30b +Block 0006 [105]: 08a59c5edfe98396 +Block 0006 [106]: 55b920176a53d4c7 +Block 0006 [107]: 472c966c32a73ab0 +Block 0006 [108]: 6a1bcc98b4f8ed3d +Block 0006 [109]: b721fed948523009 +Block 0006 [110]: a0b34a33f38b99e6 +Block 0006 [111]: e748ba007b3555cd +Block 0006 [112]: e250a1b0cf3d4a97 +Block 0006 [113]: d0bc4b21724a5ef7 +Block 0006 [114]: 7b76eda1a50018cc +Block 0006 [115]: 71e663016941db15 +Block 0006 [116]: 9d11173466ba18c0 +Block 0006 [117]: 897602359be6f8c5 +Block 0006 [118]: 992dc7c6cfe686d7 +Block 0006 [119]: 69ed7655026d535b +Block 0006 [120]: 43619f859b7aa47e +Block 0006 [121]: 6f5f09231bc6deed +Block 0006 [122]: a7417d3014bb3f89 +Block 0006 [123]: cbf7dc5b9be3b6b4 +Block 0006 [124]: 61d700db25e0f849 +Block 0006 [125]: 70873a47587525cf +Block 0006 [126]: 58adc5e65f2ab161 +Block 0006 [127]: 6372caf551890b02 +Block 0007 [ 0]: e5af68ac92e3ce1d +Block 0007 [ 1]: 8ab48a815360139e +Block 0007 [ 2]: 599ee02270046677 +Block 0007 [ 3]: 3115b3b36ec22e74 +Block 0007 [ 4]: 133e5b0cc50ea01e +Block 0007 [ 5]: 66f56e0ec496e469 +Block 0007 [ 6]: 3c1fffec56f01c76 +Block 0007 [ 7]: e43cc0fb2e85690f +Block 0007 [ 8]: 85862c5ce7ac45c4 +Block 0007 [ 9]: 186e2f634a9f3780 +Block 0007 [ 10]: 24ef18172244e1cd +Block 0007 [ 11]: 943f3473b412bd6c +Block 0007 [ 12]: a477e8ba6d59ca13 +Block 0007 [ 13]: 5336924c59df8222 +Block 0007 [ 14]: abb2069e9dc9fb01 +Block 0007 [ 15]: 3d292c01089a9fe9 +Block 0007 [ 16]: 3b5d694eecf98e24 +Block 0007 [ 17]: e92b9a00a8274bf3 +Block 0007 [ 18]: a6d88a75c29b9553 +Block 0007 [ 19]: 9fe8d0d1b63840ce +Block 0007 [ 20]: 41d4833824e399d5 +Block 0007 [ 21]: 2e4556d5479df56b +Block 0007 [ 22]: d7beb6ba52a5e3cf +Block 0007 [ 23]: 60179b8e6b5bd794 +Block 0007 [ 24]: 9f76a53ba039b1c6 +Block 0007 [ 25]: 5ed48af982352227 +Block 0007 [ 26]: d58547fca3fb1f52 +Block 0007 [ 27]: 4ced6a9525b712c4 +Block 0007 [ 28]: f9e3aa78460a304b +Block 0007 [ 29]: b104cf2a586b2933 +Block 0007 [ 30]: 75eb7a8bca1ab23f +Block 0007 [ 31]: 3cdffacf21180e11 +Block 0007 [ 32]: 58d54ba682343f53 +Block 0007 [ 33]: 1ef6dcc2c4f22240 +Block 0007 [ 34]: 4d70211dafb7c9e8 +Block 0007 [ 35]: 2e3401d6c153aeff +Block 0007 [ 36]: a4829109c6b8d4c9 +Block 0007 [ 37]: d450dfd117330fc2 +Block 0007 [ 38]: bf9e6e9530001a66 +Block 0007 [ 39]: 35da1a2fa6ee32ce +Block 0007 [ 40]: f50b3d2a1f42afc6 +Block 0007 [ 41]: fedc5dfd801eb77e +Block 0007 [ 42]: 75bb865d03ea9a33 +Block 0007 [ 43]: 0ce9dfee891b34da +Block 0007 [ 44]: 965b86361b92d34c +Block 0007 [ 45]: 21c534a143787b87 +Block 0007 [ 46]: 872689c786a12d77 +Block 0007 [ 47]: 82c87d77434d10f1 +Block 0007 [ 48]: 31dbd1a3f4dcb526 +Block 0007 [ 49]: 98401b45be41281c +Block 0007 [ 50]: 493b2c530ac904ab +Block 0007 [ 51]: e64002673ddbe2c4 +Block 0007 [ 52]: ffa237b4d9f7c6b1 +Block 0007 [ 53]: f5c89a2d0c692df0 +Block 0007 [ 54]: ceaa1fcc80d1a707 +Block 0007 [ 55]: f0ed73be2d486643 +Block 0007 [ 56]: 2ce9741d5fd0d29a +Block 0007 [ 57]: b45b037a600dd4a8 +Block 0007 [ 58]: b6b867bf58753eba +Block 0007 [ 59]: dd0ba939cdef4048 +Block 0007 [ 60]: 67d73557e89394ab +Block 0007 [ 61]: f74e86f788e87bf0 +Block 0007 [ 62]: d2d266baf5e9202b +Block 0007 [ 63]: 995f928b5e0dc659 +Block 0007 [ 64]: b07a140277d0f7c8 +Block 0007 [ 65]: f05e1ae0444eccc6 +Block 0007 [ 66]: 33b96c500cb1d1b6 +Block 0007 [ 67]: 45136441ee11fd1b +Block 0007 [ 68]: 84c8824ae1e5edc3 +Block 0007 [ 69]: 860ba57d1b23aa52 +Block 0007 [ 70]: c84a54c4c7720146 +Block 0007 [ 71]: 2c35fbedbdace5a3 +Block 0007 [ 72]: ee3471988c8956d5 +Block 0007 [ 73]: c8e562b360fd8beb +Block 0007 [ 74]: 3ce39b5be84dc44f +Block 0007 [ 75]: 8e9a81d4cf5091e7 +Block 0007 [ 76]: 2661b97ce55a2d40 +Block 0007 [ 77]: 40f1554966b6a83a +Block 0007 [ 78]: b6a91f1e82939351 +Block 0007 [ 79]: 1ea224ba61929ccf +Block 0007 [ 80]: 24bbb716c04b5a1d +Block 0007 [ 81]: 3463f2a6a33663ba +Block 0007 [ 82]: 88c8abbed9e2fdf0 +Block 0007 [ 83]: 8124cf569702027c +Block 0007 [ 84]: 72d2441e9ad6a642 +Block 0007 [ 85]: bc4b5dcf6644ede7 +Block 0007 [ 86]: dccb3ae0b36a046c +Block 0007 [ 87]: 6634272be8ced6f9 +Block 0007 [ 88]: 891305818c792103 +Block 0007 [ 89]: f34a4ad0981c2e3d +Block 0007 [ 90]: 14c59749c7a6612d +Block 0007 [ 91]: 03f986b1327f47a6 +Block 0007 [ 92]: 43d9aeba262bce21 +Block 0007 [ 93]: 34f1ac6a86561bab +Block 0007 [ 94]: cdcb3b817cd99bcd +Block 0007 [ 95]: 95643e60b01b6c29 +Block 0007 [ 96]: 461a3563fc0e56f7 +Block 0007 [ 97]: bd3a2d183f293aab +Block 0007 [ 98]: d5789e856dd151bd +Block 0007 [ 99]: 7ed20b41f22451ac +Block 0007 [100]: 49712994024f26bb +Block 0007 [101]: a6d211b07780fd1d +Block 0007 [102]: 4f66c78a2f221653 +Block 0007 [103]: 0bc1dd9aa0830a9e +Block 0007 [104]: 250eeda980c9d642 +Block 0007 [105]: d201c949e6b6e459 +Block 0007 [106]: 576cde4cea26ab80 +Block 0007 [107]: 0bfc56658c0245d4 +Block 0007 [108]: e9f18a507c911fa4 +Block 0007 [109]: 2af0d6ca54f00132 +Block 0007 [110]: 297e9aaabf0d2ffa +Block 0007 [111]: 9f27fcd100c680dc +Block 0007 [112]: 8d39aeff9847b7ee +Block 0007 [113]: c80985dc01487e1e +Block 0007 [114]: f2fa0eb778c7af62 +Block 0007 [115]: f6394cf305a48740 +Block 0007 [116]: 015e6eabbb90e264 +Block 0007 [117]: bab21f929b7aab7e +Block 0007 [118]: dd466aed8166cfb7 +Block 0007 [119]: 4b6cb5dee28bc25b +Block 0007 [120]: 6098a17ecfe1a437 +Block 0007 [121]: b17491387f8bf0c0 +Block 0007 [122]: e8150e053b31d264 +Block 0007 [123]: 9603509225977b3c +Block 0007 [124]: bc8cd3f9c06cad39 +Block 0007 [125]: 3eaa4a01951d171c +Block 0007 [126]: 2ced5b180814e072 +Block 0007 [127]: 0060e85c62d0a2ec +Block 0008 [ 0]: 3bb7ae9e189f4b3f +Block 0008 [ 1]: 4871d3c6722a6c16 +Block 0008 [ 2]: 49d7f564e969f85c +Block 0008 [ 3]: 226bfa8e3fb66cc5 +Block 0008 [ 4]: 815d9f89ac664b79 +Block 0008 [ 5]: 7ca4a873f2e1ddbf +Block 0008 [ 6]: 0b3d92d79b49ee8c +Block 0008 [ 7]: 51c76e7c8fd0fb4f +Block 0008 [ 8]: 878b42e3b329ddb1 +Block 0008 [ 9]: 0c80181f9f2f6526 +Block 0008 [ 10]: 47eb5ddebb1291ff +Block 0008 [ 11]: 1c488d86f2f956a7 +Block 0008 [ 12]: 81063e175c0a41a9 +Block 0008 [ 13]: 78c27945ab3a11d0 +Block 0008 [ 14]: fa89b846df65fa62 +Block 0008 [ 15]: 54c262700a93c68f +Block 0008 [ 16]: b00923d64112c59c +Block 0008 [ 17]: f74e7ffa228ce2f0 +Block 0008 [ 18]: f2cfb80fec37299d +Block 0008 [ 19]: 43c5da6cb3d29e09 +Block 0008 [ 20]: 37c1cc0b0b683be4 +Block 0008 [ 21]: dbe418ef69d874c7 +Block 0008 [ 22]: c3a4dc36b63bdc1b +Block 0008 [ 23]: 4ad7a00fd1e79824 +Block 0008 [ 24]: af828d9bdb440528 +Block 0008 [ 25]: 7d89ae469511193d +Block 0008 [ 26]: f8569a874d5b7dba +Block 0008 [ 27]: e8966f0eff46620d +Block 0008 [ 28]: 221fd7081112bdb9 +Block 0008 [ 29]: 93b8a531f5841506 +Block 0008 [ 30]: 0f91faef8f459fe8 +Block 0008 [ 31]: ca2bd49cc88768f9 +Block 0008 [ 32]: 06e4a1f88407371e +Block 0008 [ 33]: a0658ae49d0e9b23 +Block 0008 [ 34]: 1e4cb8e54cc2324e +Block 0008 [ 35]: 2203d1a291721284 +Block 0008 [ 36]: d770a74079e19623 +Block 0008 [ 37]: 7206051e5574dd29 +Block 0008 [ 38]: cd399fada5c4aaaa +Block 0008 [ 39]: 0cb6960a5fa42edf +Block 0008 [ 40]: 5635ab47d64748d7 +Block 0008 [ 41]: 2bc716b701300050 +Block 0008 [ 42]: cef5872ca6db902e +Block 0008 [ 43]: 7160475a5e5c24b9 +Block 0008 [ 44]: 6f46f4222ed2e9ea +Block 0008 [ 45]: 9654e52ebcf77fc7 +Block 0008 [ 46]: 66ada969429a579c +Block 0008 [ 47]: dd4e6035012a1865 +Block 0008 [ 48]: 4c58b068f5496cd1 +Block 0008 [ 49]: ca46c2e8b1bc480b +Block 0008 [ 50]: b03db2a00420d0e6 +Block 0008 [ 51]: b0104b03cd81c752 +Block 0008 [ 52]: ccb51bf267691516 +Block 0008 [ 53]: 6f1b00350c4eb690 +Block 0008 [ 54]: 7a7d94de4caa1729 +Block 0008 [ 55]: d1e775ab9a27e50c +Block 0008 [ 56]: 2006ab215b5eae17 +Block 0008 [ 57]: 8876c48940376930 +Block 0008 [ 58]: 04f7adad534d0b43 +Block 0008 [ 59]: f36daf3f73b7648d +Block 0008 [ 60]: 11e7f9899d271b42 +Block 0008 [ 61]: 8ac2f8f3de06d2d4 +Block 0008 [ 62]: f258d11c38c78a60 +Block 0008 [ 63]: 0b4ebd059552ee96 +Block 0008 [ 64]: 9231af72054c88a6 +Block 0008 [ 65]: b2d22d56255d6a4c +Block 0008 [ 66]: 208809ca11cf7847 +Block 0008 [ 67]: 8df34a7478f9f5dd +Block 0008 [ 68]: 810e372ab981ce4b +Block 0008 [ 69]: 89c6f38f39971b50 +Block 0008 [ 70]: 900b46092a6eb453 +Block 0008 [ 71]: 63557a31e1c33595 +Block 0008 [ 72]: bb476c42a9874589 +Block 0008 [ 73]: d18c6d27105e48d2 +Block 0008 [ 74]: 67b78021633eb776 +Block 0008 [ 75]: 26a4cc2ec7627975 +Block 0008 [ 76]: 7a41ebe91b61c303 +Block 0008 [ 77]: 8719434029afdeb2 +Block 0008 [ 78]: 5ccc65a3dca58b5e +Block 0008 [ 79]: 151cf064fd68cf19 +Block 0008 [ 80]: 099a4141eaf944c9 +Block 0008 [ 81]: 1a00a7b15177c815 +Block 0008 [ 82]: 9617f3c9d79165e5 +Block 0008 [ 83]: 0633785f3798595f +Block 0008 [ 84]: 82989ddd8ed0cddc +Block 0008 [ 85]: f971723863681e7f +Block 0008 [ 86]: 006885f72ad83a6e +Block 0008 [ 87]: 0eea05ecafdf9994 +Block 0008 [ 88]: 3becdde2c8756f9b +Block 0008 [ 89]: ba5b7af0494782b9 +Block 0008 [ 90]: 8e093c4a112c3c00 +Block 0008 [ 91]: b6c1189d04a1d340 +Block 0008 [ 92]: 4d319e9ab94d3e23 +Block 0008 [ 93]: 6eeaecfc749aa50d +Block 0008 [ 94]: 3ec3286ab90d3c76 +Block 0008 [ 95]: 4d6f7eab345c86ac +Block 0008 [ 96]: 2468ec86927b1207 +Block 0008 [ 97]: c8545e1af6328683 +Block 0008 [ 98]: 18358c7f4c4e0a2f +Block 0008 [ 99]: d5a6d7e7269f1227 +Block 0008 [100]: c8554d835c547ae6 +Block 0008 [101]: 36c2c174e2e5a35b +Block 0008 [102]: acbb1f4892e38b4f +Block 0008 [103]: 841fed21e8a055fe +Block 0008 [104]: 9210713ecb31879c +Block 0008 [105]: 4a94e2cc4ea5c9f5 +Block 0008 [106]: e16adbea83dc65c4 +Block 0008 [107]: d1886e10ac7639b8 +Block 0008 [108]: b7567cc205f8d932 +Block 0008 [109]: 686815e7e302618a +Block 0008 [110]: 52d2241453c9f024 +Block 0008 [111]: 675cd693897661df +Block 0008 [112]: 25da19f17758d75b +Block 0008 [113]: 680c603aeea91871 +Block 0008 [114]: 0422985fee134a01 +Block 0008 [115]: 4876e8adceacc9b1 +Block 0008 [116]: 11d14285f3963391 +Block 0008 [117]: e7d41ef32a1da72e +Block 0008 [118]: e2ed3e4d9b6c04a1 +Block 0008 [119]: 4aabfde7e0b605cf +Block 0008 [120]: 83889bda82352bec +Block 0008 [121]: 137f3bfdce40f1cf +Block 0008 [122]: f5a57480af315e41 +Block 0008 [123]: 215ab203e038df23 +Block 0008 [124]: 1cfd21d6e3ef2735 +Block 0008 [125]: c956265ca56c41e8 +Block 0008 [126]: fc7298a18032efb9 +Block 0008 [127]: 62f5cc7e96f7a920 +Block 0009 [ 0]: 7df42ba8721fe889 +Block 0009 [ 1]: b6111ac624204424 +Block 0009 [ 2]: 486c98ce436fbd12 +Block 0009 [ 3]: 5e04a7f67216dcc6 +Block 0009 [ 4]: 65139d842c4ef511 +Block 0009 [ 5]: 60d706c1b4966e8d +Block 0009 [ 6]: 7a4d779951af65a7 +Block 0009 [ 7]: 80e0677d98c29149 +Block 0009 [ 8]: 515c99c1666d19ff +Block 0009 [ 9]: ec2aeec569c003c8 +Block 0009 [ 10]: 3bf671e9aa667761 +Block 0009 [ 11]: 140f53c675250fdb +Block 0009 [ 12]: 384950521419cf61 +Block 0009 [ 13]: dd96fe61cd894c12 +Block 0009 [ 14]: a54a4ef56712c263 +Block 0009 [ 15]: 686ca4e06fdea640 +Block 0009 [ 16]: c1d579d5fbe3b115 +Block 0009 [ 17]: bb1b7cd496096326 +Block 0009 [ 18]: a1f841ee18949ddd +Block 0009 [ 19]: e2d3370969b910c1 +Block 0009 [ 20]: 36d89c41fe3b46f5 +Block 0009 [ 21]: c63f9856d0426952 +Block 0009 [ 22]: fe27ac9b573089d3 +Block 0009 [ 23]: 6d6260bfd54cf612 +Block 0009 [ 24]: e0f205707d67ffe4 +Block 0009 [ 25]: 6bd588e661ba4e14 +Block 0009 [ 26]: 9bf7be2e77cbf233 +Block 0009 [ 27]: b6f5fdaa0dc4cd84 +Block 0009 [ 28]: 576a8562230ab47c +Block 0009 [ 29]: f4ccb57d9ab736ab +Block 0009 [ 30]: 8b0e76738b5fc872 +Block 0009 [ 31]: f7803b666ec8957a +Block 0009 [ 32]: 3f78fe043e0cfb43 +Block 0009 [ 33]: c913f2699d20c470 +Block 0009 [ 34]: 0ab2e84f3bcf8e09 +Block 0009 [ 35]: f5e7b0abee13f4f1 +Block 0009 [ 36]: cc161bdb34537218 +Block 0009 [ 37]: 7944df80e54a3be5 +Block 0009 [ 38]: 50356cde8f0d4d57 +Block 0009 [ 39]: 82502cbfd481d12e +Block 0009 [ 40]: 3ba30a673984c1ad +Block 0009 [ 41]: 56039a33423c9980 +Block 0009 [ 42]: 0f13c649e5a88821 +Block 0009 [ 43]: dfbbb9d225918f1b +Block 0009 [ 44]: fb8c47279fb810ab +Block 0009 [ 45]: ed67b9d5c4e6646d +Block 0009 [ 46]: 7bb9fea2ec9ddcce +Block 0009 [ 47]: f0daea90ef3b24f6 +Block 0009 [ 48]: 5845fd237b74c7a7 +Block 0009 [ 49]: f45163287bbf8b0a +Block 0009 [ 50]: 163c3282c762765a +Block 0009 [ 51]: c3b1de32025b97d9 +Block 0009 [ 52]: 5974b7e5aa241d3d +Block 0009 [ 53]: 0b8b540ed5bab753 +Block 0009 [ 54]: 6fbe481d7973d25f +Block 0009 [ 55]: 3882cf518bede3f7 +Block 0009 [ 56]: 960cb62d91c9c8f6 +Block 0009 [ 57]: 110dbc0c5ca2aef5 +Block 0009 [ 58]: c1309fbafeb3a68c +Block 0009 [ 59]: 064288ce0deb4656 +Block 0009 [ 60]: b2a7d1d41301758e +Block 0009 [ 61]: af9697b91850edda +Block 0009 [ 62]: 4d24cea246737528 +Block 0009 [ 63]: 784b376cfb2d0ba6 +Block 0009 [ 64]: d1f48e9c5e8af3de +Block 0009 [ 65]: 20eedfb6217c4983 +Block 0009 [ 66]: 7d2f4abd53e7c5b9 +Block 0009 [ 67]: 58f1ece95d65b46e +Block 0009 [ 68]: bc4b428f80c0af7c +Block 0009 [ 69]: 4585bb3525f1e55a +Block 0009 [ 70]: f324251c9d77b113 +Block 0009 [ 71]: 33f191b5173a42eb +Block 0009 [ 72]: 28ebdc374de36598 +Block 0009 [ 73]: 32f3a953382a498b +Block 0009 [ 74]: d35e9c131e3608a7 +Block 0009 [ 75]: f689a7d106420841 +Block 0009 [ 76]: 30995ce163c77fa5 +Block 0009 [ 77]: e8faa3ecf1de154c +Block 0009 [ 78]: 57530aa7a61fc0cc +Block 0009 [ 79]: 35efd5a0d158dcdc +Block 0009 [ 80]: 4e73e2d6aa2ac171 +Block 0009 [ 81]: 15771f08e1ef7fe5 +Block 0009 [ 82]: e66a3071a132f10c +Block 0009 [ 83]: 843e20be6f0785b0 +Block 0009 [ 84]: b07328be06c772eb +Block 0009 [ 85]: f9e991fed1add433 +Block 0009 [ 86]: cc2f21af35d479ca +Block 0009 [ 87]: 8e8419f0ca164d71 +Block 0009 [ 88]: 2cd7dcf212b3abfe +Block 0009 [ 89]: 2d64fac5a0b31d64 +Block 0009 [ 90]: 3ba34d7c079bebb6 +Block 0009 [ 91]: 90f66d7ee104c55f +Block 0009 [ 92]: e1456b346478113d +Block 0009 [ 93]: 0c285835265f3be3 +Block 0009 [ 94]: 7f9309a63daa86b8 +Block 0009 [ 95]: ac44c96a04460a00 +Block 0009 [ 96]: d135bc938ce01955 +Block 0009 [ 97]: 54fc07c195ab1407 +Block 0009 [ 98]: 39274ffa1a180bcd +Block 0009 [ 99]: 49cb9ea57622632f +Block 0009 [100]: b1f6e49b17a8d39f +Block 0009 [101]: 99b4eaef9f2e5908 +Block 0009 [102]: c027417b95f7828f +Block 0009 [103]: d98dfdbb969617a4 +Block 0009 [104]: 86032385ce09b244 +Block 0009 [105]: 786206950707f208 +Block 0009 [106]: d6d6aa444b93e383 +Block 0009 [107]: 6f3d16d5d71e52bc +Block 0009 [108]: ff6886abc5180c26 +Block 0009 [109]: 7ec9e1efd2d57ca5 +Block 0009 [110]: 497ca9c5dc68f98e +Block 0009 [111]: b4b70a21809a2988 +Block 0009 [112]: ddde3f879a1408ec +Block 0009 [113]: 35d73f42f4bee7b3 +Block 0009 [114]: 86bb8179313e38b2 +Block 0009 [115]: fbf1f7eb83326ddd +Block 0009 [116]: 7c362173a3a1d41b +Block 0009 [117]: cb9c8ca6a2c391fb +Block 0009 [118]: 16a3ab8a50ebc7c1 +Block 0009 [119]: b47dbea03b193d60 +Block 0009 [120]: 6e61db495e175da2 +Block 0009 [121]: e2dfec565ea44be2 +Block 0009 [122]: 62b2cd09575b9f1b +Block 0009 [123]: a86f0c012f643b10 +Block 0009 [124]: 4df4c66286c2beb3 +Block 0009 [125]: f92d1ef872a19f93 +Block 0009 [126]: 239813284a14780c +Block 0009 [127]: 2b8b5b9e47737d9b +Block 0010 [ 0]: d49f88dd8c8f6dca +Block 0010 [ 1]: 360d985177d3eb44 +Block 0010 [ 2]: 56e7f795256a450d +Block 0010 [ 3]: 016e1e47163f4bd7 +Block 0010 [ 4]: fcdd1debf16667bc +Block 0010 [ 5]: 4a0f1022f7a85f2c +Block 0010 [ 6]: e251feccd36d554d +Block 0010 [ 7]: d36d92ecc2b785cf +Block 0010 [ 8]: f2e379c0e8fc1248 +Block 0010 [ 9]: c3ba2a1d541d48a2 +Block 0010 [ 10]: f616ffee327e5c77 +Block 0010 [ 11]: 1a66afea7fe7a12f +Block 0010 [ 12]: b49783cdc2c97ff5 +Block 0010 [ 13]: dd9d58b1dee8b006 +Block 0010 [ 14]: 52fdd6bc21a7d42e +Block 0010 [ 15]: 89ee24884725e7dd +Block 0010 [ 16]: 19a9257c35240187 +Block 0010 [ 17]: 8fbefe8e54c3e278 +Block 0010 [ 18]: 546556e542abe8f5 +Block 0010 [ 19]: 336fe46a3902f155 +Block 0010 [ 20]: a2845437c78ec507 +Block 0010 [ 21]: c3fbb5a6fc4a4ddb +Block 0010 [ 22]: 1f2b44c37f824805 +Block 0010 [ 23]: 094c983c04543c5d +Block 0010 [ 24]: fb6b47e6cdce5891 +Block 0010 [ 25]: be5642c616a0c685 +Block 0010 [ 26]: 0db4788cd321d134 +Block 0010 [ 27]: 058a7158a4cca32e +Block 0010 [ 28]: 93fb20628ea97197 +Block 0010 [ 29]: 1a67eefe57587edb +Block 0010 [ 30]: feccbe28169abf9e +Block 0010 [ 31]: f23b74ca80971ba3 +Block 0010 [ 32]: 5c8fdeb0ddef1927 +Block 0010 [ 33]: 259d3c1365429795 +Block 0010 [ 34]: 6bf4940821839897 +Block 0010 [ 35]: ebaa2c513a084143 +Block 0010 [ 36]: 69bcf4a9aca7694f +Block 0010 [ 37]: bfbdda770ce93f75 +Block 0010 [ 38]: 8d444baf0f379a72 +Block 0010 [ 39]: 7ae56503dd3a1bcb +Block 0010 [ 40]: 2b899d8e61c4940f +Block 0010 [ 41]: bd879011317e4fa4 +Block 0010 [ 42]: 27fbc73f925b5004 +Block 0010 [ 43]: 254a67007562e302 +Block 0010 [ 44]: f73bd24b48e0ef31 +Block 0010 [ 45]: 0ddd73fb51ede360 +Block 0010 [ 46]: 1022a4004d4afb08 +Block 0010 [ 47]: a9df352deae2801e +Block 0010 [ 48]: 06006b210dfe4dda +Block 0010 [ 49]: 5c8edeb2290aeb31 +Block 0010 [ 50]: bcd906b29d549f4f +Block 0010 [ 51]: 02a71e9974436135 +Block 0010 [ 52]: d55765d1ec13a881 +Block 0010 [ 53]: 564a87e2a5d3c32c +Block 0010 [ 54]: 78be17f315291f85 +Block 0010 [ 55]: 12c3fe39d3c08b81 +Block 0010 [ 56]: 0f2055677ab1abbd +Block 0010 [ 57]: 19b266cbb045ad88 +Block 0010 [ 58]: 3927c1ec77870400 +Block 0010 [ 59]: 92170da5db938208 +Block 0010 [ 60]: 645e079da5039e12 +Block 0010 [ 61]: f2173bb060d3dcdb +Block 0010 [ 62]: 2c50ac91eed833fb +Block 0010 [ 63]: 3a6c74dd1f99824a +Block 0010 [ 64]: e3b11ae8f06a4f4e +Block 0010 [ 65]: 2f3b265788c439b1 +Block 0010 [ 66]: 352355d6897b041e +Block 0010 [ 67]: da1fecab11ff2979 +Block 0010 [ 68]: 5edb674437a9b9b0 +Block 0010 [ 69]: 05752057c0bb1191 +Block 0010 [ 70]: 480910f6930fde33 +Block 0010 [ 71]: df4e2f47f791170e +Block 0010 [ 72]: b3f1dcf371a00e65 +Block 0010 [ 73]: 726c421348a10f7d +Block 0010 [ 74]: 41233522f097cb65 +Block 0010 [ 75]: 76af4be633a5ceb6 +Block 0010 [ 76]: 53b1493022908c55 +Block 0010 [ 77]: 438211be870d4a48 +Block 0010 [ 78]: 0bdb60cc8666ddc2 +Block 0010 [ 79]: 2dcfc92e4aff5d2d +Block 0010 [ 80]: 279ed9fc4f5c6aa9 +Block 0010 [ 81]: 26dc91dc7bd21318 +Block 0010 [ 82]: 023588e6b690addc +Block 0010 [ 83]: 16e0b899efea3059 +Block 0010 [ 84]: 444c13f234914022 +Block 0010 [ 85]: ed59783c05ac18b2 +Block 0010 [ 86]: bf921c1b5d40b7b7 +Block 0010 [ 87]: 13b6d88fdede6b59 +Block 0010 [ 88]: fdb2cdb9b0928760 +Block 0010 [ 89]: afe345c0aa8f90d1 +Block 0010 [ 90]: 056db68149846e3e +Block 0010 [ 91]: bae26f87d7e35c28 +Block 0010 [ 92]: f1884846cb258f29 +Block 0010 [ 93]: 8afcddda851c8896 +Block 0010 [ 94]: beba967b77f35c8d +Block 0010 [ 95]: 78f26d6f9670cd7f +Block 0010 [ 96]: 6439369632df21fd +Block 0010 [ 97]: 1e1cc5433abf0e2f +Block 0010 [ 98]: cbc9411fda3913ed +Block 0010 [ 99]: 2364eb785d28c211 +Block 0010 [100]: d391a1f40d206429 +Block 0010 [101]: 4db905b5e46aa4bc +Block 0010 [102]: 6023079f7ad4d5b0 +Block 0010 [103]: 8c784b971cfeab58 +Block 0010 [104]: d1522490e5dd6703 +Block 0010 [105]: 6796509ff2b72dd0 +Block 0010 [106]: e858ef632e8b3308 +Block 0010 [107]: d38f1c0d3643f057 +Block 0010 [108]: 8b8477a36603a379 +Block 0010 [109]: 0e8d6b8e97ee02fc +Block 0010 [110]: 4cf6d7daf0cd2036 +Block 0010 [111]: 13f6d2ff8b73a439 +Block 0010 [112]: e40b0130ebe6625c +Block 0010 [113]: b7128faf5839f977 +Block 0010 [114]: 7d6b4a598cfab926 +Block 0010 [115]: d111f97b32f40ac5 +Block 0010 [116]: c2c9cc6270932cd9 +Block 0010 [117]: 67c6151923ea573d +Block 0010 [118]: 9e30aba29249e704 +Block 0010 [119]: d409dd6ed1a5a5cf +Block 0010 [120]: 9be62c106675eba5 +Block 0010 [121]: d01fa6dfa39f78c2 +Block 0010 [122]: e040f5d7d9af83db +Block 0010 [123]: c2091487fc3e0f14 +Block 0010 [124]: ee226530a2f80bdd +Block 0010 [125]: 2109d0f9b7c7fcfd +Block 0010 [126]: 3d48628f535998f3 +Block 0010 [127]: a70033bcbcf46e83 +Block 0011 [ 0]: b66c2134a1f0cd79 +Block 0011 [ 1]: 202885bd2ca49a11 +Block 0011 [ 2]: 2445e4ee7bfecd31 +Block 0011 [ 3]: 5cc3f7f2be3df555 +Block 0011 [ 4]: 514daa6533b7b0c6 +Block 0011 [ 5]: b34debea62c9c8cb +Block 0011 [ 6]: 571514fc3e6fde7c +Block 0011 [ 7]: fca236241d126fe1 +Block 0011 [ 8]: f26bf4187119f8d1 +Block 0011 [ 9]: 0d8ed9d08606e3b6 +Block 0011 [ 10]: a899d6fcf0c58909 +Block 0011 [ 11]: ac5e087dd562c2a1 +Block 0011 [ 12]: 9df83e30ecc1dded +Block 0011 [ 13]: d2567b9e5da4b16e +Block 0011 [ 14]: c735486fb3a67b04 +Block 0011 [ 15]: 35c89d639f469f20 +Block 0011 [ 16]: 9abc02750af5f859 +Block 0011 [ 17]: 82576ed164b7e5dd +Block 0011 [ 18]: b2dc3d5197bc726f +Block 0011 [ 19]: 8a665fd2f6ed15f9 +Block 0011 [ 20]: ea0247aa64bf75b8 +Block 0011 [ 21]: 02c8eeecb3cbabbc +Block 0011 [ 22]: 8de76739bf0b6a2b +Block 0011 [ 23]: 129b74f249187f3e +Block 0011 [ 24]: d89529b9d70d730f +Block 0011 [ 25]: 1c60c20a05d2292d +Block 0011 [ 26]: 5bb763432466d75d +Block 0011 [ 27]: acfea8c8aa0f6859 +Block 0011 [ 28]: e64be8815b20811c +Block 0011 [ 29]: 0b755066138281a5 +Block 0011 [ 30]: 6fbd7306f2136c31 +Block 0011 [ 31]: 1c73a2fdee607efb +Block 0011 [ 32]: d658c0320021835e +Block 0011 [ 33]: 8e6e5c6e2867d5e2 +Block 0011 [ 34]: feab06d1861517a4 +Block 0011 [ 35]: 2f948ed83df46ee2 +Block 0011 [ 36]: af8bcbb827657fd5 +Block 0011 [ 37]: 82e89a681a4eb1e3 +Block 0011 [ 38]: 8544c46336fce186 +Block 0011 [ 39]: 604325005561f515 +Block 0011 [ 40]: cb65d782aa201563 +Block 0011 [ 41]: db31e8f4ba31346b +Block 0011 [ 42]: a882920f87d38613 +Block 0011 [ 43]: 31d7b9eb7e37efcb +Block 0011 [ 44]: 69c119cf8b14de0b +Block 0011 [ 45]: 9e6da3ff2e4fa029 +Block 0011 [ 46]: 009f44d1f5196a70 +Block 0011 [ 47]: 7399a403bbc3528c +Block 0011 [ 48]: c6c3f4e4a86c5e9d +Block 0011 [ 49]: ebdefa9151e4b6c4 +Block 0011 [ 50]: 01f9381e2eec2d7f +Block 0011 [ 51]: 0a4f62720056d84b +Block 0011 [ 52]: f1b5d3943f6a6a36 +Block 0011 [ 53]: cd1cd5c0e4eb1968 +Block 0011 [ 54]: 64edcc8e3d9f041e +Block 0011 [ 55]: 1461c578c39411e7 +Block 0011 [ 56]: 980fa6747c3617ed +Block 0011 [ 57]: 912b11adeeaf3f89 +Block 0011 [ 58]: 44bedf9a5a0b49a9 +Block 0011 [ 59]: 73e8f9a17326ceb4 +Block 0011 [ 60]: 3da6232cd6f4e3d1 +Block 0011 [ 61]: f6bd9062c0a9a0f7 +Block 0011 [ 62]: 742b4fcb7a91ab94 +Block 0011 [ 63]: ad9a328d007c5f99 +Block 0011 [ 64]: 84a388ca8674bc11 +Block 0011 [ 65]: e3f44e84b345d055 +Block 0011 [ 66]: 844c544bb0b9eb92 +Block 0011 [ 67]: e8dfc0e52a0761ae +Block 0011 [ 68]: 26731ccc5a836fd2 +Block 0011 [ 69]: 1e0b377e3315a662 +Block 0011 [ 70]: 391388067845b573 +Block 0011 [ 71]: 3dbc149f246cc13c +Block 0011 [ 72]: a25e2f5cd2ed7edb +Block 0011 [ 73]: df0b0b57a05a4d4e +Block 0011 [ 74]: 27132d8a640ba7b5 +Block 0011 [ 75]: e69181cea76e2cae +Block 0011 [ 76]: 4daaa663f4404681 +Block 0011 [ 77]: 49a8afc952ddcbd2 +Block 0011 [ 78]: 693c5c586cea9fce +Block 0011 [ 79]: f3dc02748c485cb7 +Block 0011 [ 80]: ffe3bc71b550dcd1 +Block 0011 [ 81]: c8f9d3cebc8de1e8 +Block 0011 [ 82]: ad1c3edf36a89697 +Block 0011 [ 83]: 5e89cc9aae4230a6 +Block 0011 [ 84]: eac0ae1626e15120 +Block 0011 [ 85]: 1690d63d60da6ecf +Block 0011 [ 86]: cd6a8d2091ad354b +Block 0011 [ 87]: 89d80dacaca9a6c5 +Block 0011 [ 88]: 218a6801d99baec8 +Block 0011 [ 89]: 9bba7e969afd1280 +Block 0011 [ 90]: 95554c042732942d +Block 0011 [ 91]: f1280331f91dcf91 +Block 0011 [ 92]: 15a800cf6915edcb +Block 0011 [ 93]: f9d41a977057e236 +Block 0011 [ 94]: 92988fb9b5045e1a +Block 0011 [ 95]: 2e76d5e4179de340 +Block 0011 [ 96]: 245aff980f5489f2 +Block 0011 [ 97]: 93a5ca99c887937f +Block 0011 [ 98]: 5abda23787990c23 +Block 0011 [ 99]: 2e30f40479f01957 +Block 0011 [100]: 5d9f127f80dcccb2 +Block 0011 [101]: 732679dbaed99681 +Block 0011 [102]: 41a91b8ffb33f013 +Block 0011 [103]: ca61b392f2d825ad +Block 0011 [104]: 2c2c33ec377b6095 +Block 0011 [105]: a1a188e86aa1e8a4 +Block 0011 [106]: 332b4a653b70442c +Block 0011 [107]: b93cb4970048caf3 +Block 0011 [108]: 2aa4e90db458be01 +Block 0011 [109]: 22f51f6dba083e78 +Block 0011 [110]: 0f65a4027cce4035 +Block 0011 [111]: e462aa5a3a7758af +Block 0011 [112]: b4b0c947df9f5840 +Block 0011 [113]: 1fcaa15e4ad8a448 +Block 0011 [114]: 6427ad1753ef4834 +Block 0011 [115]: 8880f19df4f32d7e +Block 0011 [116]: fe7b7c61fb009823 +Block 0011 [117]: be45b0a066d3b99d +Block 0011 [118]: 13edbd36864553ea +Block 0011 [119]: 56bd3ff3f46a4ad3 +Block 0011 [120]: a94c52ae99da87f2 +Block 0011 [121]: 9e56cea44848fdd4 +Block 0011 [122]: c9a9fa5471582833 +Block 0011 [123]: 5d6e10df4b4a15eb +Block 0011 [124]: 0a33444ac38b9f7d +Block 0011 [125]: 1f19a38690e0c6d0 +Block 0011 [126]: b5604cbe201ba644 +Block 0011 [127]: 044e9c26b9b8b616 +Block 0012 [ 0]: 1521a6fe2a3cbece +Block 0012 [ 1]: a7d81f737de3454e +Block 0012 [ 2]: 1fe9b28e4f948672 +Block 0012 [ 3]: 2a5fa3d7342b35bf +Block 0012 [ 4]: b115d311ab4cd25a +Block 0012 [ 5]: 2d38601cecc89013 +Block 0012 [ 6]: ff433fe8560a7164 +Block 0012 [ 7]: bf7185448ec49c76 +Block 0012 [ 8]: b6ff855b1bd63b0d +Block 0012 [ 9]: b4259325faad52c0 +Block 0012 [ 10]: 1001b5b3752d9b8b +Block 0012 [ 11]: a035e989d9fa78bd +Block 0012 [ 12]: da47171b2d168957 +Block 0012 [ 13]: 283081670260f019 +Block 0012 [ 14]: e0e05c5685c4d96a +Block 0012 [ 15]: 103e296afff49848 +Block 0012 [ 16]: 57dc23c3022b4da2 +Block 0012 [ 17]: 7d7cd99264c05881 +Block 0012 [ 18]: 16c82e8ffb88b24a +Block 0012 [ 19]: 02199a086680f0f7 +Block 0012 [ 20]: 2edd2f82ad7873ef +Block 0012 [ 21]: 14a147da23d0ae31 +Block 0012 [ 22]: 94e3899e23500ffe +Block 0012 [ 23]: 7960ac7264b703fb +Block 0012 [ 24]: c477d8358c227328 +Block 0012 [ 25]: 92d4856648af1644 +Block 0012 [ 26]: eb4d563cb3c888dd +Block 0012 [ 27]: 21828c52d31318ff +Block 0012 [ 28]: 6f0b647c003e5e61 +Block 0012 [ 29]: 93df61e1c563b8d9 +Block 0012 [ 30]: 3e3a6e9a1d36221b +Block 0012 [ 31]: d3bc1703065b4948 +Block 0012 [ 32]: 26e095f3098e2046 +Block 0012 [ 33]: 40ce4bb1796cc0ad +Block 0012 [ 34]: 399bf9686c5f4172 +Block 0012 [ 35]: efab37a5b75401dd +Block 0012 [ 36]: 41f176e4dace1866 +Block 0012 [ 37]: 30398f14205df259 +Block 0012 [ 38]: ea28ab83bcc97663 +Block 0012 [ 39]: 46419c78901bfae2 +Block 0012 [ 40]: 7bb5dc11f1fdf71e +Block 0012 [ 41]: e7a8d22a68619e2f +Block 0012 [ 42]: 3b8598c5e66799c0 +Block 0012 [ 43]: 35ef25baa6522dc4 +Block 0012 [ 44]: 0a8cd7304fbad8fd +Block 0012 [ 45]: b6b77e8381e2b1e3 +Block 0012 [ 46]: 94e8a9260e0318eb +Block 0012 [ 47]: 187fc38067c321bd +Block 0012 [ 48]: 792444f2f5192e33 +Block 0012 [ 49]: 1ae621d7081363c4 +Block 0012 [ 50]: adf8a1e712b76bec +Block 0012 [ 51]: a6c358e41cd69e3a +Block 0012 [ 52]: f9a268fb81ff1a3e +Block 0012 [ 53]: 19e6ad4f49dbe780 +Block 0012 [ 54]: 2870c4d3d70e8415 +Block 0012 [ 55]: d3766936b9513f74 +Block 0012 [ 56]: dceffb34b052d439 +Block 0012 [ 57]: eb3174432a9d0be7 +Block 0012 [ 58]: ccfa40d103153fe6 +Block 0012 [ 59]: 534ebb23424bcb89 +Block 0012 [ 60]: 244091afd20eb5b6 +Block 0012 [ 61]: 9a423392b7f3ed66 +Block 0012 [ 62]: 27738dffe52b48e0 +Block 0012 [ 63]: 44738bbe4dbaaea2 +Block 0012 [ 64]: 126229c01cc19fc6 +Block 0012 [ 65]: b7279c2c19910800 +Block 0012 [ 66]: 14726366b2401939 +Block 0012 [ 67]: 31970a53eb02e7f0 +Block 0012 [ 68]: 78fffed7e5970889 +Block 0012 [ 69]: 6983240bd4fd24bd +Block 0012 [ 70]: 8e6224c568706241 +Block 0012 [ 71]: 7cb66edcc2ba1663 +Block 0012 [ 72]: c2107dc218f05722 +Block 0012 [ 73]: 80afaf9eb0637341 +Block 0012 [ 74]: 409e5654971093e2 +Block 0012 [ 75]: 6f8b0f36a1ed94f9 +Block 0012 [ 76]: 27f581045be8a309 +Block 0012 [ 77]: 67710b4de2a9d74c +Block 0012 [ 78]: ee34520edc8e6c17 +Block 0012 [ 79]: 59d4c363e50fa509 +Block 0012 [ 80]: 8dcc5ab12801cdcb +Block 0012 [ 81]: d8ce48c767ff9f63 +Block 0012 [ 82]: 0ece3e843169e6dd +Block 0012 [ 83]: ca4ac3965825308d +Block 0012 [ 84]: a241fef0307cd5e5 +Block 0012 [ 85]: 35b7fbe5e89252a9 +Block 0012 [ 86]: d1b1a3c397c5a3f7 +Block 0012 [ 87]: c128e35949dc65ee +Block 0012 [ 88]: 3d3527f69e1b4629 +Block 0012 [ 89]: 8f9ea6f3b86a8849 +Block 0012 [ 90]: e91d3a831d1ac20a +Block 0012 [ 91]: 190b39a143752fed +Block 0012 [ 92]: c2a9162e88a085f1 +Block 0012 [ 93]: 83bda5257560eef9 +Block 0012 [ 94]: f424f969d8c05562 +Block 0012 [ 95]: cc28cd4499193be4 +Block 0012 [ 96]: 1bf847eedd7cee4e +Block 0012 [ 97]: d9f5044a5b463833 +Block 0012 [ 98]: 84ac651e312f0432 +Block 0012 [ 99]: 68f5261410bfa67d +Block 0012 [100]: 1a7754c5d4962c35 +Block 0012 [101]: 9bb7c786d4b17660 +Block 0012 [102]: 80b10d80bbc35af6 +Block 0012 [103]: dbc449b22af06364 +Block 0012 [104]: a208fe1fdc561708 +Block 0012 [105]: 58d743f0df17acd1 +Block 0012 [106]: 2ad9b89d389b2577 +Block 0012 [107]: fb0c666799206c63 +Block 0012 [108]: de656171ca8e75c8 +Block 0012 [109]: 0ffb8f41cc0596c7 +Block 0012 [110]: 238eaa9b108e8d10 +Block 0012 [111]: 39973bb952ddbcc0 +Block 0012 [112]: d7f4fbabdc63e190 +Block 0012 [113]: b3d832966453066b +Block 0012 [114]: 339a0be96c03ef8a +Block 0012 [115]: e79366e9be1d4fe2 +Block 0012 [116]: 9b4e4d6f05538c35 +Block 0012 [117]: cef433fc39a11471 +Block 0012 [118]: 595dd5d830434c4f +Block 0012 [119]: b7454a6e8b03848a +Block 0012 [120]: d63ea04a761806c0 +Block 0012 [121]: 173d2a2a5fc3178c +Block 0012 [122]: eaec6276b5a137a7 +Block 0012 [123]: 095b05a6303723b8 +Block 0012 [124]: 94c49de0d9c605e5 +Block 0012 [125]: 2873ee8bf2d4e699 +Block 0012 [126]: 1cde14681dd09f70 +Block 0012 [127]: 68a708e89034c7b3 +Block 0013 [ 0]: 8d167cc15d9b4e8a +Block 0013 [ 1]: 861a89ec67dd708a +Block 0013 [ 2]: b536a27e36288413 +Block 0013 [ 3]: 7b0ada901678953d +Block 0013 [ 4]: 07d12c9abc737f67 +Block 0013 [ 5]: c89adf2ede21b1ad +Block 0013 [ 6]: 594950d5b9d5346b +Block 0013 [ 7]: 2ed48f395600081f +Block 0013 [ 8]: 4f24214c834fe8b7 +Block 0013 [ 9]: 54aa160c0cd977bf +Block 0013 [ 10]: 07370ae67985e0df +Block 0013 [ 11]: a7771205e6facde8 +Block 0013 [ 12]: 7a439605aae13efd +Block 0013 [ 13]: 74c0a731668944a9 +Block 0013 [ 14]: f45cc05ff3acc878 +Block 0013 [ 15]: d238ddd1f8d956d1 +Block 0013 [ 16]: 9d9465e667febb00 +Block 0013 [ 17]: e326ebeea2c77cb1 +Block 0013 [ 18]: 8e00c650856da819 +Block 0013 [ 19]: 584380ef75efc1f1 +Block 0013 [ 20]: 81e10bb7e2a69853 +Block 0013 [ 21]: 41ecfa387c696224 +Block 0013 [ 22]: 68372408a7693477 +Block 0013 [ 23]: 62737f80e951a66e +Block 0013 [ 24]: 44a11e5e2535ea2e +Block 0013 [ 25]: 937b04e3a723122e +Block 0013 [ 26]: 85bcf09f61703332 +Block 0013 [ 27]: b27523bbcc80a5ae +Block 0013 [ 28]: bccde6994ef38d25 +Block 0013 [ 29]: 6e105429a2a107e3 +Block 0013 [ 30]: d84e9c1b2d47135e +Block 0013 [ 31]: 528cfb9a9ff1f423 +Block 0013 [ 32]: c931f1187fefc477 +Block 0013 [ 33]: 11322efa705a8857 +Block 0013 [ 34]: 2ff596d5ff43a189 +Block 0013 [ 35]: 951b4868c0d65755 +Block 0013 [ 36]: 6fa72219d7003b25 +Block 0013 [ 37]: eaaad06e85076fec +Block 0013 [ 38]: 7608dad58553f3a2 +Block 0013 [ 39]: 200e76b7f948c812 +Block 0013 [ 40]: 3d15f2c7d3fce6a2 +Block 0013 [ 41]: d184805422d69913 +Block 0013 [ 42]: 44d6c50290ef4592 +Block 0013 [ 43]: bc31bf15ea1dc2f8 +Block 0013 [ 44]: 29f08b8fca962939 +Block 0013 [ 45]: c62430d5104c6482 +Block 0013 [ 46]: 3c57292c4ce39649 +Block 0013 [ 47]: ffc10dcad32cc41b +Block 0013 [ 48]: dd41f5f46122a206 +Block 0013 [ 49]: 7abc60696111bfbe +Block 0013 [ 50]: aa9886bc1a563464 +Block 0013 [ 51]: 9c057de649695c35 +Block 0013 [ 52]: f712052195155a09 +Block 0013 [ 53]: 91980809bdb97825 +Block 0013 [ 54]: 07bcdeab983ab6ca +Block 0013 [ 55]: 277119a97dbb4a80 +Block 0013 [ 56]: 8ca65b723aeafec2 +Block 0013 [ 57]: ff49c19c4b00e57d +Block 0013 [ 58]: 7f7bc5d343003b9e +Block 0013 [ 59]: 62348f62c00612c6 +Block 0013 [ 60]: 2d762b01998ac125 +Block 0013 [ 61]: 0c240959e10da0cc +Block 0013 [ 62]: 9aba78f773642caf +Block 0013 [ 63]: 129a78baa32e409c +Block 0013 [ 64]: 1d1b48d6c8ba21f5 +Block 0013 [ 65]: f8b15521108a73a2 +Block 0013 [ 66]: 60be83175fcd4908 +Block 0013 [ 67]: bc3ce648b5c35454 +Block 0013 [ 68]: 215dc943e9f120ab +Block 0013 [ 69]: 5f2868bb13088cf5 +Block 0013 [ 70]: 3a73e7d41c02c847 +Block 0013 [ 71]: bcbb0d37b7c38980 +Block 0013 [ 72]: 5b5a5f184f699a50 +Block 0013 [ 73]: 5adc34c4275ed7c9 +Block 0013 [ 74]: a871c5cdd8a1ab2c +Block 0013 [ 75]: 88561e9f2c362be0 +Block 0013 [ 76]: 10244ff1b8d1d56a +Block 0013 [ 77]: a49c34c978e7d103 +Block 0013 [ 78]: 46e8015d871645c2 +Block 0013 [ 79]: f9a15b708c4a5405 +Block 0013 [ 80]: ceaf74f1fd233a55 +Block 0013 [ 81]: f43065e6cd47d568 +Block 0013 [ 82]: afa4bf36adb7eaf9 +Block 0013 [ 83]: 578a68b9edfd4dfd +Block 0013 [ 84]: 7386e803ae1db4e9 +Block 0013 [ 85]: 894c8dfb4cd9e99e +Block 0013 [ 86]: 577d2667cb82bbec +Block 0013 [ 87]: 2c4e1db5a2d177b5 +Block 0013 [ 88]: 0e88639a76844ba1 +Block 0013 [ 89]: 7805203eeff9051d +Block 0013 [ 90]: c5413f00f0b91101 +Block 0013 [ 91]: 5e46c72bbabf4d30 +Block 0013 [ 92]: 166521536d596e63 +Block 0013 [ 93]: ae4ebc3a25bc2ee3 +Block 0013 [ 94]: b6a6ad1a93c69390 +Block 0013 [ 95]: 50e799ffe04d392c +Block 0013 [ 96]: 3799e5290de54a4d +Block 0013 [ 97]: a8a1350877af05cc +Block 0013 [ 98]: 082a6bbe71cbd228 +Block 0013 [ 99]: a23f327a5924959d +Block 0013 [100]: 63305cc5f84f7ad7 +Block 0013 [101]: 60e488a0a896838e +Block 0013 [102]: c9230c3dd009e753 +Block 0013 [103]: 8f5d22bc1cf3bd22 +Block 0013 [104]: 8a3d52eb933b24c2 +Block 0013 [105]: 2ad1125ab1c2d795 +Block 0013 [106]: 922d4810438a44d5 +Block 0013 [107]: c40e43485037b3ad +Block 0013 [108]: 4e1faefdcfd8b6af +Block 0013 [109]: 94cce4010a943fa6 +Block 0013 [110]: 8d1cba48ce5b96bc +Block 0013 [111]: 15d6d33ad7328fd1 +Block 0013 [112]: d9d43c592bb4ea95 +Block 0013 [113]: 318cdfb666ab0cc8 +Block 0013 [114]: 29a76f09f474b27f +Block 0013 [115]: 20c2f46af8f3ab77 +Block 0013 [116]: 11e70eb455d06061 +Block 0013 [117]: b8228af2094f3ef0 +Block 0013 [118]: 6a5668e37110e003 +Block 0013 [119]: 7439532142a76261 +Block 0013 [120]: fde1e2387a515dae +Block 0013 [121]: f4a706d8c81fd2b7 +Block 0013 [122]: 31aaeab172a5b26a +Block 0013 [123]: def4e2002ba919df +Block 0013 [124]: 733a09a01284bb71 +Block 0013 [125]: 185e24ee64af2b43 +Block 0013 [126]: 9bb76ee7896dfdd8 +Block 0013 [127]: 10931278d80e9141 +Block 0014 [ 0]: 74ff9d5c77dec9d4 +Block 0014 [ 1]: 5c43cf4044006ba8 +Block 0014 [ 2]: 0f82682a392e457f +Block 0014 [ 3]: 68a068cdb5d93548 +Block 0014 [ 4]: 2c346f466ae5e7d1 +Block 0014 [ 5]: c6cfc46081912068 +Block 0014 [ 6]: 5e1937c9d4be2fde +Block 0014 [ 7]: 06202be4e8e07d2d +Block 0014 [ 8]: b519876ca35a277c +Block 0014 [ 9]: e90a83fe7aa91f68 +Block 0014 [ 10]: 5a40cbcba1fd98b2 +Block 0014 [ 11]: af80019f52b0fa1f +Block 0014 [ 12]: 884eb3548131a3ce +Block 0014 [ 13]: 7ad391d105237118 +Block 0014 [ 14]: 39e6610113fcfad0 +Block 0014 [ 15]: 07de5d06c76eb406 +Block 0014 [ 16]: 8688b7645a136c23 +Block 0014 [ 17]: 6dcc57f776a9d635 +Block 0014 [ 18]: cb181be1ae3bd3c9 +Block 0014 [ 19]: 6dd5f461a2bb5689 +Block 0014 [ 20]: c72926f7695b359d +Block 0014 [ 21]: 44de6b300a058825 +Block 0014 [ 22]: 974882d513ef95f3 +Block 0014 [ 23]: d15ab03ef6cda7b6 +Block 0014 [ 24]: f229a5561dfced9d +Block 0014 [ 25]: 315dfd5d23f77ab0 +Block 0014 [ 26]: 0f4c630cf7a1eca6 +Block 0014 [ 27]: 9ac5d4b7330b0dc3 +Block 0014 [ 28]: 4f8f5b7351624574 +Block 0014 [ 29]: de862b07a2cc18ba +Block 0014 [ 30]: 14591145d7f607ad +Block 0014 [ 31]: 87fd81764a47690f +Block 0014 [ 32]: 5e10a6935358171d +Block 0014 [ 33]: d9c8e6cd97276274 +Block 0014 [ 34]: 82d006a140133f2b +Block 0014 [ 35]: 340644ad9e6e7b28 +Block 0014 [ 36]: 2263be163aa68eee +Block 0014 [ 37]: e09c4a3f4e5d5bdd +Block 0014 [ 38]: c3345b0ce22aa154 +Block 0014 [ 39]: c8b4ab7e3c472850 +Block 0014 [ 40]: 30ce87661e7b26d4 +Block 0014 [ 41]: 654a95b6605e75d7 +Block 0014 [ 42]: 65e72a3539dd0d69 +Block 0014 [ 43]: 7c5ec1d1e68f4ab8 +Block 0014 [ 44]: c9251e2fd5ced854 +Block 0014 [ 45]: 52a85c5f5eb40c8e +Block 0014 [ 46]: 93bb9274d2da8a35 +Block 0014 [ 47]: 649d8c4a78fc904c +Block 0014 [ 48]: 8d79747667f51c89 +Block 0014 [ 49]: 23c7788205023d76 +Block 0014 [ 50]: 10224bc903e4a2b2 +Block 0014 [ 51]: af5793eca095fb61 +Block 0014 [ 52]: bb659fa94d39b1fa +Block 0014 [ 53]: 94520e9b6eefb936 +Block 0014 [ 54]: b035b95b939dcf3a +Block 0014 [ 55]: bfdeaa96331cce54 +Block 0014 [ 56]: 659dae83a17a437e +Block 0014 [ 57]: 598cbd962aebb606 +Block 0014 [ 58]: 8e43f705504059a1 +Block 0014 [ 59]: 811d0b66f4bf5789 +Block 0014 [ 60]: 3ea3eb13fd65c42d +Block 0014 [ 61]: f3289de2785a60c4 +Block 0014 [ 62]: b296d786e3f06f5d +Block 0014 [ 63]: cfe3c32da650f0d5 +Block 0014 [ 64]: dd0ed6f96a0c0322 +Block 0014 [ 65]: 70cceb6f30048949 +Block 0014 [ 66]: fa8cfe4efbc75cbf +Block 0014 [ 67]: cb7c5b09addd875a +Block 0014 [ 68]: 6483aca29f985f7e +Block 0014 [ 69]: 80b161cba70da102 +Block 0014 [ 70]: 52d76763bfb5065f +Block 0014 [ 71]: 4713c4241809bd0f +Block 0014 [ 72]: 176223d6501bb138 +Block 0014 [ 73]: a0d90adc0a733942 +Block 0014 [ 74]: c444f1cbfe698930 +Block 0014 [ 75]: c362e053f5370d7b +Block 0014 [ 76]: 04795823c3e290f3 +Block 0014 [ 77]: 21fa15483eb82289 +Block 0014 [ 78]: bdee31d1be32c895 +Block 0014 [ 79]: aa20de91077e0361 +Block 0014 [ 80]: 1292f113842e3b2d +Block 0014 [ 81]: 3da9e8e8f35b6370 +Block 0014 [ 82]: 1587c4af6af71ce8 +Block 0014 [ 83]: 027ed030408cc841 +Block 0014 [ 84]: d45f3eb0f7b7f052 +Block 0014 [ 85]: 083e586b7012eb4c +Block 0014 [ 86]: 81759483e9052d0f +Block 0014 [ 87]: 23e2772882e5546c +Block 0014 [ 88]: 1d74a83735a0db58 +Block 0014 [ 89]: 5d935ea8473c6398 +Block 0014 [ 90]: 0b0fd563c775880f +Block 0014 [ 91]: 1218a8d3ba6ae9a4 +Block 0014 [ 92]: d5c911bd9a8640cc +Block 0014 [ 93]: 376494e621d203cd +Block 0014 [ 94]: 8c2c4494b9df3951 +Block 0014 [ 95]: 130978d97331600b +Block 0014 [ 96]: 765194ab231b7bed +Block 0014 [ 97]: b53f722b638245e1 +Block 0014 [ 98]: c6856ff721c9c1ed +Block 0014 [ 99]: 523f867258c71f59 +Block 0014 [100]: d642325da3bd09cb +Block 0014 [101]: 8b366095a9e51ed0 +Block 0014 [102]: 6ece98e19c16ee25 +Block 0014 [103]: 957e4fbfc5b2a2d8 +Block 0014 [104]: a41385404b565c53 +Block 0014 [105]: 26fc269b14a47524 +Block 0014 [106]: 3a4683b556b2f6bd +Block 0014 [107]: 6ccea20da5f82531 +Block 0014 [108]: c3ffc17acf0393c6 +Block 0014 [109]: bf08ac75b90d98e0 +Block 0014 [110]: 5a122193aed55940 +Block 0014 [111]: 084d049330ecadec +Block 0014 [112]: 1706e0a7dcccabb7 +Block 0014 [113]: 000991105c6c8f3d +Block 0014 [114]: c1c69b4ac877565c +Block 0014 [115]: 595a2b07288ab253 +Block 0014 [116]: a8aa03a94753404c +Block 0014 [117]: f809a07b03509229 +Block 0014 [118]: cbc91fdf8b43211e +Block 0014 [119]: 98e2b8994604e2ec +Block 0014 [120]: c4b3d55bc831b4cd +Block 0014 [121]: 3e9c014657b846ae +Block 0014 [122]: e7274ed01235e01e +Block 0014 [123]: c841b3db0f707035 +Block 0014 [124]: fb05ca324bc6dcd2 +Block 0014 [125]: 43188f4c2a383a69 +Block 0014 [126]: 745be1744b87f4d0 +Block 0014 [127]: be5103b3da91537f +Block 0015 [ 0]: 0b1e73a777ee2ef4 +Block 0015 [ 1]: e27b761a060bee9d +Block 0015 [ 2]: d537468cff417c96 +Block 0015 [ 3]: 43ff10be2ed97ac1 +Block 0015 [ 4]: f17596d1bb685e01 +Block 0015 [ 5]: 577cb81c02ade2a1 +Block 0015 [ 6]: 8932ec48abcdd2c2 +Block 0015 [ 7]: cfd3b31d0422a34f +Block 0015 [ 8]: 6bd786099bc0232e +Block 0015 [ 9]: 637418cbc60b7be7 +Block 0015 [ 10]: d4f327b243b4a6b7 +Block 0015 [ 11]: f6d161e009a4fa7e +Block 0015 [ 12]: 00ed2aeb4d221e4b +Block 0015 [ 13]: 677611509c496f06 +Block 0015 [ 14]: a0ce344aeaa2755b +Block 0015 [ 15]: d5afc0b55da2dc8c +Block 0015 [ 16]: cacf20ccd42a49c6 +Block 0015 [ 17]: 44dcbf6eb1d6fa74 +Block 0015 [ 18]: acf25a1ccd4e91d1 +Block 0015 [ 19]: acb38fadd1728e39 +Block 0015 [ 20]: c8a3a11dfb0dd493 +Block 0015 [ 21]: a68cbe6742cd613c +Block 0015 [ 22]: 477497ecfaf2de1a +Block 0015 [ 23]: 836f2083f0746bd9 +Block 0015 [ 24]: 03ebbf00cbfa617e +Block 0015 [ 25]: 6d9e84e99c076053 +Block 0015 [ 26]: 4296c823a4da4a26 +Block 0015 [ 27]: e2dcd3f04aa2616a +Block 0015 [ 28]: 01dc0b71c8fb76be +Block 0015 [ 29]: 60ca19bf120a2f95 +Block 0015 [ 30]: bfeb35484f61d378 +Block 0015 [ 31]: 6bf92228db9a33e8 +Block 0015 [ 32]: 396144e9a551c26a +Block 0015 [ 33]: 2765913f3336e0b2 +Block 0015 [ 34]: 85b9cefe4821e0a2 +Block 0015 [ 35]: 35687f89b0820450 +Block 0015 [ 36]: c5ecb87365bdfcb2 +Block 0015 [ 37]: 6666f725b2ea9dd8 +Block 0015 [ 38]: a2cb973d7c42b0a5 +Block 0015 [ 39]: ebb5253e5c84a52e +Block 0015 [ 40]: 71eff3a4c6e669e6 +Block 0015 [ 41]: 6813a4ef356a43f7 +Block 0015 [ 42]: 7676968dbdd07d6e +Block 0015 [ 43]: d1e5e68bd9d4893f +Block 0015 [ 44]: faf8c89f950a8265 +Block 0015 [ 45]: b97a51d9f801af68 +Block 0015 [ 46]: 9033cfbabc39abe6 +Block 0015 [ 47]: 2b42295a82afd95c +Block 0015 [ 48]: 8756894b48b6a194 +Block 0015 [ 49]: 0b246f0a868a7be3 +Block 0015 [ 50]: 23198a6685fdeac2 +Block 0015 [ 51]: 45a73cc01fdfacdd +Block 0015 [ 52]: 0d7a0e2ebc480c33 +Block 0015 [ 53]: cf4b325e8bab511e +Block 0015 [ 54]: 3eff637988cf0774 +Block 0015 [ 55]: c76b19610482d56c +Block 0015 [ 56]: 8e73b0efde325f6e +Block 0015 [ 57]: 30baa18d52a190f9 +Block 0015 [ 58]: 04bc7cbec3e1296d +Block 0015 [ 59]: 27f1935bf5070068 +Block 0015 [ 60]: d6b815634d4ae1e3 +Block 0015 [ 61]: 83894d0b328a58d6 +Block 0015 [ 62]: a3de5c70b944f94a +Block 0015 [ 63]: 094ee1ace2b659ec +Block 0015 [ 64]: c10fc00408bf8c9c +Block 0015 [ 65]: 9d8ffe4ba77a69d1 +Block 0015 [ 66]: 32a011b4bc285e9e +Block 0015 [ 67]: 8a79607034c38a6b +Block 0015 [ 68]: bd5608f27c6b7742 +Block 0015 [ 69]: 40ea6a827e3722f2 +Block 0015 [ 70]: f5e3a539cd3d7503 +Block 0015 [ 71]: f5b21cff542fd4ce +Block 0015 [ 72]: fe85cad6c8b8ea59 +Block 0015 [ 73]: f2cd28dcea30e15b +Block 0015 [ 74]: f2316ae6f6cef0cf +Block 0015 [ 75]: 4d87f7d71c8dc4d6 +Block 0015 [ 76]: 7dd9488c06f66047 +Block 0015 [ 77]: 16dedd6ee0192839 +Block 0015 [ 78]: 9914849e597348d4 +Block 0015 [ 79]: d43eb9ac42da1e48 +Block 0015 [ 80]: c39efef1ab2785f9 +Block 0015 [ 81]: ad73868ea70052e5 +Block 0015 [ 82]: f3d8083fd9d07e1a +Block 0015 [ 83]: f87a8d342547820b +Block 0015 [ 84]: cb403cea0a57424a +Block 0015 [ 85]: 060dcd9833e6ec1c +Block 0015 [ 86]: b3d75fd35640b405 +Block 0015 [ 87]: 135c300438f94989 +Block 0015 [ 88]: 48d1266ae1d00a17 +Block 0015 [ 89]: c06da4eb674abfbd +Block 0015 [ 90]: ce4421fd18d801e4 +Block 0015 [ 91]: c7a9b0668bdf8c15 +Block 0015 [ 92]: f46bd3cae3612fc0 +Block 0015 [ 93]: a3cbe2c4df6f9392 +Block 0015 [ 94]: 515c3b7d9af607a7 +Block 0015 [ 95]: b01dd0fa390288bb +Block 0015 [ 96]: 9393af62fec2df24 +Block 0015 [ 97]: 422015611463c8ce +Block 0015 [ 98]: af3a8db165bcce2b +Block 0015 [ 99]: 81d31594a3ba8043 +Block 0015 [100]: 3858b6ff51b69612 +Block 0015 [101]: 4647cbf86795a5e0 +Block 0015 [102]: 61c0214fd46752b3 +Block 0015 [103]: dfe53ac91b2bc371 +Block 0015 [104]: 4f82c67ab717dbdd +Block 0015 [105]: c9e3bbe1facd12f3 +Block 0015 [106]: cd2ad18317a7cfd1 +Block 0015 [107]: 6e259d50f4c9e146 +Block 0015 [108]: 74c1f8e97c3c3414 +Block 0015 [109]: 7f61b05064b73433 +Block 0015 [110]: 896499834b24fa2c +Block 0015 [111]: fc607cee2c0c4911 +Block 0015 [112]: dd9e1d6f7c0dca82 +Block 0015 [113]: cfd61ea3a923cb9f +Block 0015 [114]: 27bdfb046533bbf7 +Block 0015 [115]: 68b8b91fc9d5e2bc +Block 0015 [116]: c41f9c3252585ef7 +Block 0015 [117]: 121fc0b83aca80d3 +Block 0015 [118]: 28c99e1fe846c40e +Block 0015 [119]: f5cb391772578157 +Block 0015 [120]: fc057e59876dadc8 +Block 0015 [121]: df615ef69f9d5003 +Block 0015 [122]: c318561811c5b2f8 +Block 0015 [123]: eaf943ad5437bf9c +Block 0015 [124]: 602cfc1d54fb6b87 +Block 0015 [125]: e83566f7d16e8b6e +Block 0015 [126]: c608bee43eda7ccc +Block 0015 [127]: 811a4bfb6e79bb5f +Block 0016 [ 0]: 5aa613f43289c678 +Block 0016 [ 1]: eb1cf650e24f64e4 +Block 0016 [ 2]: d7de8f818eea22a3 +Block 0016 [ 3]: 929f209f685d0a56 +Block 0016 [ 4]: 1d1190318e29cc38 +Block 0016 [ 5]: 643340be7d550134 +Block 0016 [ 6]: d60a19f28325f117 +Block 0016 [ 7]: c28ddf5ac5d01fbc +Block 0016 [ 8]: 4eaa66adb9c0f9f9 +Block 0016 [ 9]: c368ae8857416af0 +Block 0016 [ 10]: 26334597db375712 +Block 0016 [ 11]: 988de515dbe320d5 +Block 0016 [ 12]: 0cd7dd0ccbdb2e97 +Block 0016 [ 13]: 43cac731180562be +Block 0016 [ 14]: eebae2e8c065ccd1 +Block 0016 [ 15]: c4c5b81c55bac77c +Block 0016 [ 16]: 21a360ff74a67369 +Block 0016 [ 17]: c7c681a57877b6fa +Block 0016 [ 18]: 05e6a04af6e587c3 +Block 0016 [ 19]: b8d073cb845684bd +Block 0016 [ 20]: 49f10e47eb5ff574 +Block 0016 [ 21]: 5b4fa94638350588 +Block 0016 [ 22]: 2730010cdfcf27a3 +Block 0016 [ 23]: 7ecae19dffd91500 +Block 0016 [ 24]: 41131fc8f0614eac +Block 0016 [ 25]: 372476265e12ad62 +Block 0016 [ 26]: e3f6d0ffd33e4270 +Block 0016 [ 27]: 2a9748775d87bf7a +Block 0016 [ 28]: d9cb255da617b822 +Block 0016 [ 29]: 59aaeb79c983f697 +Block 0016 [ 30]: 4177b94dacf2d10f +Block 0016 [ 31]: 333b04a58feb4e3d +Block 0016 [ 32]: 14c8ca8825310e99 +Block 0016 [ 33]: c3a4ce660e9c5798 +Block 0016 [ 34]: 001881b7d15216ef +Block 0016 [ 35]: d6de939535180d21 +Block 0016 [ 36]: d265e410d5f506dd +Block 0016 [ 37]: d7e8f17f836ca622 +Block 0016 [ 38]: da4fe4e81cc609cd +Block 0016 [ 39]: 8c95ff4268b77b20 +Block 0016 [ 40]: b564b4648cd5acff +Block 0016 [ 41]: 47809e79e0e48077 +Block 0016 [ 42]: 9d1490dd04b1cc81 +Block 0016 [ 43]: 8efffc9fae826537 +Block 0016 [ 44]: 34aa25d1eb75e78f +Block 0016 [ 45]: 5777189b9ed6025d +Block 0016 [ 46]: 90fd722d4411962f +Block 0016 [ 47]: bc2372752ce8cf84 +Block 0016 [ 48]: 1381285845dd8d69 +Block 0016 [ 49]: 7ce920c4389441d2 +Block 0016 [ 50]: a93d565658f24c2e +Block 0016 [ 51]: 008ccb8a47b9442e +Block 0016 [ 52]: 10f37f8f6e6bc101 +Block 0016 [ 53]: bb972856b12de631 +Block 0016 [ 54]: 4209e28b0e6baf1f +Block 0016 [ 55]: 055ed32244ea5546 +Block 0016 [ 56]: 8c4ff16eb6e336f4 +Block 0016 [ 57]: e6c6bbbe43af4439 +Block 0016 [ 58]: ba0241f2ff155ac7 +Block 0016 [ 59]: c7610b8ede3442e8 +Block 0016 [ 60]: 65ecf5ecc7d7b66d +Block 0016 [ 61]: 1acb0b6fdf2ccc61 +Block 0016 [ 62]: 7bcd0d4f4abad1b5 +Block 0016 [ 63]: 628f518a0e821ecd +Block 0016 [ 64]: e68760a4e903c2b6 +Block 0016 [ 65]: 6afa82a957226547 +Block 0016 [ 66]: dde32db99e588dfd +Block 0016 [ 67]: 7a8fefe578b65cdf +Block 0016 [ 68]: 9b389330d717ed64 +Block 0016 [ 69]: 43bdf11a17170565 +Block 0016 [ 70]: 8202c7f51d57555a +Block 0016 [ 71]: 6774f52f4386d0f9 +Block 0016 [ 72]: 061c87e870cce6cd +Block 0016 [ 73]: 4fb3cbc0e190081c +Block 0016 [ 74]: aea43a9c584b3bd1 +Block 0016 [ 75]: 7814f7a36dbecc04 +Block 0016 [ 76]: 36942f8d18a60829 +Block 0016 [ 77]: 3af6fd6eb129deaf +Block 0016 [ 78]: f6d8cb57312b2f93 +Block 0016 [ 79]: 0d09e153aa59daef +Block 0016 [ 80]: 6694dd3785ad79a2 +Block 0016 [ 81]: f804675b1db096ca +Block 0016 [ 82]: af28c00169838f9a +Block 0016 [ 83]: 7e9f31e2ca03f44d +Block 0016 [ 84]: 0a40a5fea905e6da +Block 0016 [ 85]: ea6e6ad593c9a00a +Block 0016 [ 86]: 60ce67973717f0af +Block 0016 [ 87]: 5119b20ef9174210 +Block 0016 [ 88]: 4ad6e8d2ea685ad4 +Block 0016 [ 89]: f23bea2bb343d013 +Block 0016 [ 90]: 8c18a4ec72902c35 +Block 0016 [ 91]: a5bdc1cbada363a0 +Block 0016 [ 92]: 225d167810799ed8 +Block 0016 [ 93]: 028f905fc8f31809 +Block 0016 [ 94]: 929022764e02b432 +Block 0016 [ 95]: 39cabbd42dbca708 +Block 0016 [ 96]: c622b92e3a1f8a98 +Block 0016 [ 97]: f5411fb0c090febe +Block 0016 [ 98]: 1577aa81965ac648 +Block 0016 [ 99]: 7244612848c73c2f +Block 0016 [100]: 3e2ce65d4f47fa17 +Block 0016 [101]: 3fb2a4d1c9be489e +Block 0016 [102]: 0287f8413494b77d +Block 0016 [103]: 8c5a45a4cf7fd7a6 +Block 0016 [104]: f59eb76ce9ee5824 +Block 0016 [105]: eb2ef1cd6870c0cf +Block 0016 [106]: 8a634c740861120e +Block 0016 [107]: 50fd7f477fadbbba +Block 0016 [108]: 972e3be524189b9d +Block 0016 [109]: fdcc72540a485d9d +Block 0016 [110]: 431ff388b18c20b2 +Block 0016 [111]: 84b14a35e1651e87 +Block 0016 [112]: 049c81788d686bea +Block 0016 [113]: 841227e268589776 +Block 0016 [114]: 1984c047ffeb7202 +Block 0016 [115]: 2debb849661993bc +Block 0016 [116]: 64e24153b0795338 +Block 0016 [117]: 68a8fd2c8eaea8c4 +Block 0016 [118]: 4588aa2a8b4b7e64 +Block 0016 [119]: ffc79b51ee4aa24e +Block 0016 [120]: ee0108716b3720aa +Block 0016 [121]: 815b13553b12bf61 +Block 0016 [122]: ede614d36497d5a6 +Block 0016 [123]: 8ddd0e3f2fe5e85e +Block 0016 [124]: 530dca4f54d31258 +Block 0016 [125]: 61edbf72ee4111ce +Block 0016 [126]: 6f9d762b442949b7 +Block 0016 [127]: 824443969c263569 +Block 0017 [ 0]: c26b5fb7ee819975 +Block 0017 [ 1]: 222cc666ae909d6d +Block 0017 [ 2]: c47520b833dde283 +Block 0017 [ 3]: d8df98adf7c4e9de +Block 0017 [ 4]: e5de16b4d34325af +Block 0017 [ 5]: b00cea65fe6cfe19 +Block 0017 [ 6]: 46db08563e7ea0e1 +Block 0017 [ 7]: a5893dba47999f5f +Block 0017 [ 8]: c085e21bb0da3d0f +Block 0017 [ 9]: 1f172eef8cb80b7f +Block 0017 [ 10]: 6b6f645c2443cc04 +Block 0017 [ 11]: b5686dbe596aab80 +Block 0017 [ 12]: cc34ea0ef0d73359 +Block 0017 [ 13]: 97a568c24dc38146 +Block 0017 [ 14]: 778f6cdeb2dae4d9 +Block 0017 [ 15]: 31f8d50c4456bcf2 +Block 0017 [ 16]: c28a9374fe7ba670 +Block 0017 [ 17]: 7b3a8991f0c13cd0 +Block 0017 [ 18]: 6fa3b1c8458e7844 +Block 0017 [ 19]: ea444aa2832d39a3 +Block 0017 [ 20]: fbc811cc74910198 +Block 0017 [ 21]: 2ba1f1b6c73336d6 +Block 0017 [ 22]: b6ca4186998da588 +Block 0017 [ 23]: adf168017ff13adb +Block 0017 [ 24]: e5a80bad1ce6fd4c +Block 0017 [ 25]: 5a006185c3bf0e46 +Block 0017 [ 26]: c018264d3a3303a3 +Block 0017 [ 27]: 6d4f26be949b0710 +Block 0017 [ 28]: 570663118a4576b5 +Block 0017 [ 29]: cf8c5362ef21623d +Block 0017 [ 30]: 5a58b134066bb910 +Block 0017 [ 31]: dc8a5af3b6d8e51a +Block 0017 [ 32]: c91e14f271afe7c8 +Block 0017 [ 33]: 837d36649ff731f0 +Block 0017 [ 34]: 255f48975a9c1166 +Block 0017 [ 35]: 36b33685679ae942 +Block 0017 [ 36]: b78188f30b332a6e +Block 0017 [ 37]: fbd802b61918aaab +Block 0017 [ 38]: 95a224cf20cabbdf +Block 0017 [ 39]: e4fafe09ac44ceae +Block 0017 [ 40]: 8795c7eb6ce53357 +Block 0017 [ 41]: 9baf142cd14ebc74 +Block 0017 [ 42]: e056de9c637bce60 +Block 0017 [ 43]: 41cb37b4eef494eb +Block 0017 [ 44]: 82e788786c7c4b2d +Block 0017 [ 45]: ba3fade55b845c0a +Block 0017 [ 46]: 61ab9386f6de7b43 +Block 0017 [ 47]: b27f8f4f8801afe5 +Block 0017 [ 48]: e7545b6b407bb4e5 +Block 0017 [ 49]: 1b6b292aebb22e12 +Block 0017 [ 50]: 4ea78d3346c80c00 +Block 0017 [ 51]: e51c4614215b48e3 +Block 0017 [ 52]: 350a5fcfa8096d76 +Block 0017 [ 53]: beb0d442e51228f6 +Block 0017 [ 54]: 2dd148dbc8e4339e +Block 0017 [ 55]: b6f6e6939139ed26 +Block 0017 [ 56]: 55bae151f650b757 +Block 0017 [ 57]: 3ecc387a6897bb4b +Block 0017 [ 58]: 81f3ba27544462df +Block 0017 [ 59]: aa724cba27fb7ada +Block 0017 [ 60]: 49f4c6cd3d1001b7 +Block 0017 [ 61]: 5de8a69be3fc4b01 +Block 0017 [ 62]: e7660de671733a47 +Block 0017 [ 63]: 4c848327b9258030 +Block 0017 [ 64]: e1af30e156752a3e +Block 0017 [ 65]: f888b1b30c51e5c2 +Block 0017 [ 66]: cefd61d444cdb0aa +Block 0017 [ 67]: 1366818eee49b310 +Block 0017 [ 68]: 28ef872bff4aaa9d +Block 0017 [ 69]: 52b64397c2378327 +Block 0017 [ 70]: 72dba4affff12aa3 +Block 0017 [ 71]: 43bd82be33a14f30 +Block 0017 [ 72]: 373da4a41d079ee3 +Block 0017 [ 73]: 70610f826873a4be +Block 0017 [ 74]: efc8a7cefecfc06b +Block 0017 [ 75]: a65c4ddf436da72a +Block 0017 [ 76]: ff4128178e114153 +Block 0017 [ 77]: 933bb6ef1ba8b391 +Block 0017 [ 78]: 24da4f6be714eede +Block 0017 [ 79]: 8476945cdffce2bc +Block 0017 [ 80]: 1060159b32839b9a +Block 0017 [ 81]: 7f3b13732e126432 +Block 0017 [ 82]: 1a67a6f096398f36 +Block 0017 [ 83]: 0050c03fde4ebbf2 +Block 0017 [ 84]: 2e33bfd7b983f684 +Block 0017 [ 85]: 142db665d25ff4f5 +Block 0017 [ 86]: 7be937815c018b34 +Block 0017 [ 87]: 44a52fc1a3a14b11 +Block 0017 [ 88]: 122f8c4bf8af9792 +Block 0017 [ 89]: 7df91926add2170d +Block 0017 [ 90]: 14368020f2506eab +Block 0017 [ 91]: 8d32bfcb10d230bc +Block 0017 [ 92]: 3043ef1eb7d8fc1b +Block 0017 [ 93]: 3ac8946c053bb698 +Block 0017 [ 94]: 20881f9043aea007 +Block 0017 [ 95]: 96f9edafe87ebeef +Block 0017 [ 96]: b258dfed76ad1d36 +Block 0017 [ 97]: 6eff6e88a743b710 +Block 0017 [ 98]: 6fba5b916d6e9901 +Block 0017 [ 99]: aa78a708b02b1617 +Block 0017 [100]: 6acf76f47da59dc5 +Block 0017 [101]: d822d6b28b552d9d +Block 0017 [102]: 07e626d948208797 +Block 0017 [103]: e6155e0219831643 +Block 0017 [104]: 910e0e6785c65ce3 +Block 0017 [105]: a5baf4068d6ba4dc +Block 0017 [106]: 393b2a4e94962d2b +Block 0017 [107]: bf728ee972d385b6 +Block 0017 [108]: 38b80e3235f30a5a +Block 0017 [109]: 396bfe4a2864e7df +Block 0017 [110]: 34111fbf07f6a12e +Block 0017 [111]: 63e095883c1ee1cf +Block 0017 [112]: 59eabda66b1b80f8 +Block 0017 [113]: f014bd7d3796df5a +Block 0017 [114]: 4f1349f9a0845b27 +Block 0017 [115]: cf273ea085e693ee +Block 0017 [116]: 24c5445ef8c8ce4f +Block 0017 [117]: 3f5a67d8f3695ed0 +Block 0017 [118]: 3eecddc14dd84a98 +Block 0017 [119]: bcc6260622f109a7 +Block 0017 [120]: 73c11a320135cbba +Block 0017 [121]: 6ff7603869077601 +Block 0017 [122]: c05b3dc3b45d2d9d +Block 0017 [123]: 641bbf7fccc74c80 +Block 0017 [124]: b9727ef5a77e7fa1 +Block 0017 [125]: 47cdc8eb2d9d4edf +Block 0017 [126]: 29a16a1ecda84ccc +Block 0017 [127]: 63550fc73aec391a +Block 0018 [ 0]: 73a43a37ceeea256 +Block 0018 [ 1]: 0e2035fdf4ef4e88 +Block 0018 [ 2]: 55cf35b8b5a10862 +Block 0018 [ 3]: 64e77a47e8032bc4 +Block 0018 [ 4]: a9576618de3cb90e +Block 0018 [ 5]: b833f7216445c57c +Block 0018 [ 6]: 759f838d4ad4c434 +Block 0018 [ 7]: abb5f81f0725a89b +Block 0018 [ 8]: e3b1552cc9c71c21 +Block 0018 [ 9]: 3d9a2f3d93020b83 +Block 0018 [ 10]: 0e53a0bfb7f81d39 +Block 0018 [ 11]: ae796955deec0480 +Block 0018 [ 12]: 7693d55f8a2e92eb +Block 0018 [ 13]: 991c70ec78caa12a +Block 0018 [ 14]: 4d7eab83941af3d2 +Block 0018 [ 15]: 81326a33ee4182c2 +Block 0018 [ 16]: 06c1b888e42568f6 +Block 0018 [ 17]: d5c51a781034bc9b +Block 0018 [ 18]: 119a5b2752527a89 +Block 0018 [ 19]: 50b5d7b5c7eb7f9b +Block 0018 [ 20]: d8f6e49e832454eb +Block 0018 [ 21]: 9f7e79eb57294218 +Block 0018 [ 22]: 3b5c4a73081250de +Block 0018 [ 23]: d0733808f1314c8c +Block 0018 [ 24]: e63fe566af3cc19d +Block 0018 [ 25]: 2272a3a74553c0c8 +Block 0018 [ 26]: e90c71421873c571 +Block 0018 [ 27]: a9cb61075002ac10 +Block 0018 [ 28]: d8b97ef74f52228b +Block 0018 [ 29]: 9b4eac66fb0f74c1 +Block 0018 [ 30]: b022a4d505f08e11 +Block 0018 [ 31]: 85663ee1ac562468 +Block 0018 [ 32]: e241e44001a29b80 +Block 0018 [ 33]: 592e7308934d23d3 +Block 0018 [ 34]: e731a6b6b0c36f9e +Block 0018 [ 35]: 41493fb1cb8eaa8a +Block 0018 [ 36]: 9dbf21d7ce4bc63f +Block 0018 [ 37]: 5a9234f5bdd75f32 +Block 0018 [ 38]: 5b81afda5c8f5380 +Block 0018 [ 39]: d5a7986b11dff5f0 +Block 0018 [ 40]: 505b095dce538a6e +Block 0018 [ 41]: 8409cedfb662722a +Block 0018 [ 42]: a760af89ad1bd964 +Block 0018 [ 43]: 9ccf16a9261ec931 +Block 0018 [ 44]: dc673b0119a3477f +Block 0018 [ 45]: 1bb7fefe35bd686c +Block 0018 [ 46]: 83d8053357e55423 +Block 0018 [ 47]: 2f537a2d509a82d6 +Block 0018 [ 48]: 33212ec5cb2789c2 +Block 0018 [ 49]: d12d2b59b2261562 +Block 0018 [ 50]: b071f8845b921091 +Block 0018 [ 51]: 9c8ffe0baa746df0 +Block 0018 [ 52]: dbf600f18d293676 +Block 0018 [ 53]: 3ada85d4b8e36c52 +Block 0018 [ 54]: faba10ce3a1e786a +Block 0018 [ 55]: 980f6bc7809fd949 +Block 0018 [ 56]: 604a76d6b5170460 +Block 0018 [ 57]: d91b2079a9fdeaf1 +Block 0018 [ 58]: 2f1f4ec73b007466 +Block 0018 [ 59]: 730c109369577f61 +Block 0018 [ 60]: 66c9a5d237aabd90 +Block 0018 [ 61]: c3621cfd2e1b32d2 +Block 0018 [ 62]: be084ebc2ad00f94 +Block 0018 [ 63]: cf9043e50b81646c +Block 0018 [ 64]: 9275b31fbb6fa821 +Block 0018 [ 65]: 4ae62cefc32f71df +Block 0018 [ 66]: 66221bf21cb89a3f +Block 0018 [ 67]: 58ffbd72ed2a8af9 +Block 0018 [ 68]: b85a6fc928ff7cff +Block 0018 [ 69]: a53d773bd978acde +Block 0018 [ 70]: ed70197136db8b0e +Block 0018 [ 71]: b683e16a459a9666 +Block 0018 [ 72]: f6e9b4d1d0f7c0d2 +Block 0018 [ 73]: a3dd151d4bd18e9e +Block 0018 [ 74]: c88c2079b78e4f1b +Block 0018 [ 75]: d619e95f24b470a7 +Block 0018 [ 76]: 38d915f1c4df1bb3 +Block 0018 [ 77]: 9a52ef525657b9a4 +Block 0018 [ 78]: c3004355d9ea136f +Block 0018 [ 79]: 4f2231eb8ed9c0b5 +Block 0018 [ 80]: cce5f29cfb7e1899 +Block 0018 [ 81]: 6dccea4449b58d06 +Block 0018 [ 82]: 41a0939b714ac5bd +Block 0018 [ 83]: da4c028c51d8bba0 +Block 0018 [ 84]: 1235b86184cd97ce +Block 0018 [ 85]: e0bcb44cc34c9f8a +Block 0018 [ 86]: 2a8e24cc0dd2c27a +Block 0018 [ 87]: cde65c0fa2707b5b +Block 0018 [ 88]: a6d09ebe2b21cf33 +Block 0018 [ 89]: 8626d21d80c62123 +Block 0018 [ 90]: ac3923b1e61979a9 +Block 0018 [ 91]: dd237b455e10839a +Block 0018 [ 92]: d4036773fa739341 +Block 0018 [ 93]: 7a4fb3e21a5fac16 +Block 0018 [ 94]: affec1c8b426dc28 +Block 0018 [ 95]: 8cf50bb8fa9b855d +Block 0018 [ 96]: 0fdc69cd6c830993 +Block 0018 [ 97]: 097a687fdf92aaf9 +Block 0018 [ 98]: 188b0ddccfdd4db9 +Block 0018 [ 99]: 1313002013950cf0 +Block 0018 [100]: 5369119751e8098c +Block 0018 [101]: 03067881a7f54f35 +Block 0018 [102]: 3e75d27737b8145f +Block 0018 [103]: a7c719391c252bbd +Block 0018 [104]: d07640453388401f +Block 0018 [105]: b8647a6324a5229d +Block 0018 [106]: 803bc6e3d4e596d5 +Block 0018 [107]: 11a7ef37af4a42db +Block 0018 [108]: 2b1fe566afb105be +Block 0018 [109]: 37e0b8ae65f50773 +Block 0018 [110]: b2164d7e5c798eba +Block 0018 [111]: de438d75388cf065 +Block 0018 [112]: 13d152df2161c345 +Block 0018 [113]: f5fbef555db63c4e +Block 0018 [114]: 91ae316a4024ff0b +Block 0018 [115]: 067cb50b87d9c64d +Block 0018 [116]: 6d428f1e643cb8cd +Block 0018 [117]: 59974616208dae08 +Block 0018 [118]: 5301b3d1c726cf2e +Block 0018 [119]: 8ed2dd2fc14af4e1 +Block 0018 [120]: 8bfb8ebcfa3fbd57 +Block 0018 [121]: 9211c9360b96b845 +Block 0018 [122]: 51ef8411a5e32f44 +Block 0018 [123]: 1c15a0f64623bb38 +Block 0018 [124]: da59218d786afcd6 +Block 0018 [125]: 6ceed727611ae6d9 +Block 0018 [126]: 68ad4703452f6c84 +Block 0018 [127]: 1435aec09f183fb8 +Block 0019 [ 0]: db7857f2d02de914 +Block 0019 [ 1]: be1d2ca2f8f4075b +Block 0019 [ 2]: 3cacf2b9675c4610 +Block 0019 [ 3]: b87fbbaf79c1c56b +Block 0019 [ 4]: 2be598ef088c38a3 +Block 0019 [ 5]: 7b85cb8efe6326f6 +Block 0019 [ 6]: 07ee0d3a22efc0dd +Block 0019 [ 7]: 2bc9056257f239cf +Block 0019 [ 8]: 4cbcf454a2ab394b +Block 0019 [ 9]: 021316d70a2b01ea +Block 0019 [ 10]: 1c5a2e1c4ef3294c +Block 0019 [ 11]: a5510b60639664fe +Block 0019 [ 12]: a260b09b9f8c9822 +Block 0019 [ 13]: b1152f2ebb303876 +Block 0019 [ 14]: a6c677798fb6cb53 +Block 0019 [ 15]: 8c3e0ce6406f8da1 +Block 0019 [ 16]: cd7a1f62071c8b92 +Block 0019 [ 17]: 921e44594ca4e496 +Block 0019 [ 18]: d571d4ddfc513301 +Block 0019 [ 19]: 27d1849bdc7457ea +Block 0019 [ 20]: 5bbfb2ea78c0fd8d +Block 0019 [ 21]: 4dfe80df57f16197 +Block 0019 [ 22]: d7373d84a238e7c4 +Block 0019 [ 23]: b32dd784b7551e77 +Block 0019 [ 24]: 7755a8fafb9982c0 +Block 0019 [ 25]: 951adac79fec5f93 +Block 0019 [ 26]: 73d8aa9cd3a6c6b9 +Block 0019 [ 27]: 19b34676edb7b671 +Block 0019 [ 28]: 15f74ed11989580c +Block 0019 [ 29]: 3abaaf249c172ce8 +Block 0019 [ 30]: 92180c83d6ae4cac +Block 0019 [ 31]: c7d7991a9072de3f +Block 0019 [ 32]: 01d93f684dede00b +Block 0019 [ 33]: 13aeba95c44ad304 +Block 0019 [ 34]: 74080c28c6a71794 +Block 0019 [ 35]: 11576f82596677c5 +Block 0019 [ 36]: eeda905afd7677b3 +Block 0019 [ 37]: 9b31f5f2dafd2d5c +Block 0019 [ 38]: 1debb34c8287cfe8 +Block 0019 [ 39]: f59cc690e1b67d64 +Block 0019 [ 40]: bf2f8c54adb32bc0 +Block 0019 [ 41]: fb307c505280b40e +Block 0019 [ 42]: d10c03fbc2ece8dc +Block 0019 [ 43]: 47aa1323473fffae +Block 0019 [ 44]: 34a1e267c5bf8b28 +Block 0019 [ 45]: 330076c1b27ac30b +Block 0019 [ 46]: b355799c94a30d3b +Block 0019 [ 47]: 759bc21292cc7209 +Block 0019 [ 48]: 6b9408f24caf17ee +Block 0019 [ 49]: 9961d984925ba515 +Block 0019 [ 50]: 4cfbca8d8ba561af +Block 0019 [ 51]: 47060c3700a13560 +Block 0019 [ 52]: d5e2ca29a0b8c65f +Block 0019 [ 53]: 28c833e35cc6dec0 +Block 0019 [ 54]: 6a262ee512b37c9c +Block 0019 [ 55]: 612cc2c7bbf208a2 +Block 0019 [ 56]: 4ec329d8efe4ed3f +Block 0019 [ 57]: 1cddbd0577186377 +Block 0019 [ 58]: 517c387099bb54ba +Block 0019 [ 59]: 186fa06056a9d5e9 +Block 0019 [ 60]: e35aa42952e22c35 +Block 0019 [ 61]: a2c47f55554aadab +Block 0019 [ 62]: efd55e5dcbf3de9f +Block 0019 [ 63]: 368011c1f565c120 +Block 0019 [ 64]: 99f2d82e3ac72e75 +Block 0019 [ 65]: ca63fee28220696b +Block 0019 [ 66]: 79735e120b709d74 +Block 0019 [ 67]: 0e5a0bcf65320750 +Block 0019 [ 68]: 87d6697d5526af66 +Block 0019 [ 69]: e59c1874a397ed6c +Block 0019 [ 70]: f46542c5f5320deb +Block 0019 [ 71]: 6ab985988050992e +Block 0019 [ 72]: 46ddc8f51e8bdfaa +Block 0019 [ 73]: 0af96f044bb69b5d +Block 0019 [ 74]: bdf2a9eb1cbb60a2 +Block 0019 [ 75]: 427a9e01b056e536 +Block 0019 [ 76]: ba27781cc41cbe82 +Block 0019 [ 77]: acd6fe3b7560d239 +Block 0019 [ 78]: e6942df20c5330a5 +Block 0019 [ 79]: 801fd2c2a27fee79 +Block 0019 [ 80]: 78df49edf83e411a +Block 0019 [ 81]: d0b13589858cd937 +Block 0019 [ 82]: 07e475122d4e1ca9 +Block 0019 [ 83]: a6080a9af8853c8c +Block 0019 [ 84]: 5b0fd38d93c861f0 +Block 0019 [ 85]: 789fa96618507733 +Block 0019 [ 86]: c23044d37fc96600 +Block 0019 [ 87]: f9efa88ccb76e47d +Block 0019 [ 88]: 8c8c5d49a22aebeb +Block 0019 [ 89]: 33d452028ad70cd2 +Block 0019 [ 90]: d1ebb9dac3b1eb18 +Block 0019 [ 91]: 2cacfb9ed2b42519 +Block 0019 [ 92]: 583943507463e237 +Block 0019 [ 93]: e8d35b87bd10da44 +Block 0019 [ 94]: 57a83ae010eaa129 +Block 0019 [ 95]: abd24c860084ab8b +Block 0019 [ 96]: aad60968ff3e72a7 +Block 0019 [ 97]: db6b818b858e0f95 +Block 0019 [ 98]: a236a5f5e6ed5c34 +Block 0019 [ 99]: 9ee495a89806571d +Block 0019 [100]: d5309240aeaa129b +Block 0019 [101]: 0678c6008b7bdfa3 +Block 0019 [102]: 898c9b9a4ecc1135 +Block 0019 [103]: 04c9d151c3936024 +Block 0019 [104]: fe5419eeb8909a79 +Block 0019 [105]: db4cde09a43e55ef +Block 0019 [106]: 03e287f745584c27 +Block 0019 [107]: 4b3e7c901a287e12 +Block 0019 [108]: b0fe9f54ac5d1820 +Block 0019 [109]: 19e9481bfb234548 +Block 0019 [110]: e70140dc32fae16c +Block 0019 [111]: 4907fc614c8e02be +Block 0019 [112]: 432d7fd638580bb0 +Block 0019 [113]: 63214685454ffc72 +Block 0019 [114]: 8607ce6bf48c49a4 +Block 0019 [115]: 2b5fcb115af940dc +Block 0019 [116]: f962622b16c92e01 +Block 0019 [117]: b658504aff081cbd +Block 0019 [118]: 2f3c28ad121165d2 +Block 0019 [119]: e936d9ec4aa94cba +Block 0019 [120]: b293e61ee1d30dd3 +Block 0019 [121]: 002c110dd8033a59 +Block 0019 [122]: eeb3a96e2e3d21ca +Block 0019 [123]: d845813fc15e9aaa +Block 0019 [124]: 92bd97abd662fc28 +Block 0019 [125]: 750f33bbce352254 +Block 0019 [126]: 4ebd7cdf6cf9494c +Block 0019 [127]: 795e82c67139eded +Block 0020 [ 0]: 9294d03a99a22ea2 +Block 0020 [ 1]: bcbe0550584228d4 +Block 0020 [ 2]: 129427d353d8d19b +Block 0020 [ 3]: adf1508aa2cd80e4 +Block 0020 [ 4]: 9828e5b07118f247 +Block 0020 [ 5]: 647a7614912b1565 +Block 0020 [ 6]: d75cecc203293be3 +Block 0020 [ 7]: 3bfa93828245a58e +Block 0020 [ 8]: 3e42f663df86163d +Block 0020 [ 9]: db1e8f2db4fd5f56 +Block 0020 [ 10]: b125c16e117becf8 +Block 0020 [ 11]: 833b41751fa36e5b +Block 0020 [ 12]: 37268fc1e7f53398 +Block 0020 [ 13]: 07675cb6e4d9bb8f +Block 0020 [ 14]: 9600f42ea7df9ed2 +Block 0020 [ 15]: 07c775af5e73d44a +Block 0020 [ 16]: a3e3837421f150d4 +Block 0020 [ 17]: d723ae6724085247 +Block 0020 [ 18]: 4990be7e8e59bc2f +Block 0020 [ 19]: eab56ec270c5406b +Block 0020 [ 20]: 2a637389d65100a1 +Block 0020 [ 21]: 6ea26e1c777c46bf +Block 0020 [ 22]: 4d73b17ca5cbdcad +Block 0020 [ 23]: 6f8633a6620733e8 +Block 0020 [ 24]: 5898847821535a03 +Block 0020 [ 25]: 00240261b3893620 +Block 0020 [ 26]: e78807d720e2ebb6 +Block 0020 [ 27]: cada2395683f15f6 +Block 0020 [ 28]: e5532f20a6a36a89 +Block 0020 [ 29]: 631360de14c68435 +Block 0020 [ 30]: 89af90b96ce933f3 +Block 0020 [ 31]: 4ad6b40a8c905c15 +Block 0020 [ 32]: c70d0b81ef0c42f1 +Block 0020 [ 33]: 20d63097de1d4de7 +Block 0020 [ 34]: ac0400d142902ffe +Block 0020 [ 35]: a610f81e4f689fbb +Block 0020 [ 36]: 654a691945e85e07 +Block 0020 [ 37]: 969fe8ef61a96f68 +Block 0020 [ 38]: dd6fc34852f483fd +Block 0020 [ 39]: 8b71d5372e78ef9a +Block 0020 [ 40]: cfba508a76e196b8 +Block 0020 [ 41]: 6c59d9046bebffb4 +Block 0020 [ 42]: f13099cba8d740ce +Block 0020 [ 43]: eb37028ca5947e71 +Block 0020 [ 44]: d3dbd1e481e68acc +Block 0020 [ 45]: 3e849d5566fc85d8 +Block 0020 [ 46]: 52d830c107762635 +Block 0020 [ 47]: baf382c743e99512 +Block 0020 [ 48]: 6dde1e25fa33d385 +Block 0020 [ 49]: 9221fbbb14a0bf8d +Block 0020 [ 50]: d2cf64a8acd2cbfa +Block 0020 [ 51]: 963ac3fea12bb6ef +Block 0020 [ 52]: fcc8a4d451074c43 +Block 0020 [ 53]: 5f8ffd9acd32770a +Block 0020 [ 54]: 93ade0ae517c1f8b +Block 0020 [ 55]: fe4f24c61406fe19 +Block 0020 [ 56]: 5ac0e7d577b9c4e2 +Block 0020 [ 57]: 1f75439ea80cefc1 +Block 0020 [ 58]: 58cd99e49c0988de +Block 0020 [ 59]: 62a1a9b784d8b18a +Block 0020 [ 60]: 0c176450f8146fc9 +Block 0020 [ 61]: c029579dde36ea3c +Block 0020 [ 62]: a35011efa2d65949 +Block 0020 [ 63]: 2cc8d2701c8aebcc +Block 0020 [ 64]: 7845f2cd112dde51 +Block 0020 [ 65]: f1bae9587bbfa28b +Block 0020 [ 66]: 54496f8e331e1446 +Block 0020 [ 67]: 4d2e4c57635a03e1 +Block 0020 [ 68]: 72103a072560e9bc +Block 0020 [ 69]: c745a628447a5af9 +Block 0020 [ 70]: 91f670902f16dacb +Block 0020 [ 71]: 62d1ca75b9ad91e2 +Block 0020 [ 72]: afc5227e1e44618c +Block 0020 [ 73]: a4fd99486eec9a91 +Block 0020 [ 74]: 8586b7e15415c117 +Block 0020 [ 75]: 1dadb8849f653aa2 +Block 0020 [ 76]: 0339d57b42b089d1 +Block 0020 [ 77]: d78c92f8f9795a06 +Block 0020 [ 78]: 884cfcc0e359526c +Block 0020 [ 79]: 92fa9ce765e41900 +Block 0020 [ 80]: a2d47dc9e631b6d3 +Block 0020 [ 81]: 391b00d07320a9d4 +Block 0020 [ 82]: 3b8d6c8e47756f40 +Block 0020 [ 83]: 9595b80e703f79a5 +Block 0020 [ 84]: c174a3c3ace67621 +Block 0020 [ 85]: e26ea90d8b631563 +Block 0020 [ 86]: d840f747d6ecd7c6 +Block 0020 [ 87]: e6791933345cb262 +Block 0020 [ 88]: 2c8a9090108ce066 +Block 0020 [ 89]: 40144400f1a0c9c6 +Block 0020 [ 90]: c586c2db746bae6a +Block 0020 [ 91]: 3f44a45296c0082f +Block 0020 [ 92]: 4c9b5aedf10ebcbb +Block 0020 [ 93]: 07f801aae09a5075 +Block 0020 [ 94]: 6b0bcdf6993e4798 +Block 0020 [ 95]: 775ba96ebbc4eb20 +Block 0020 [ 96]: 8ba6fcbafbd2e642 +Block 0020 [ 97]: 448a0cf251a78843 +Block 0020 [ 98]: 6d1dd0ebb0de9a55 +Block 0020 [ 99]: b0b75a709ef51af2 +Block 0020 [100]: da09cb3af69ae050 +Block 0020 [101]: 59618274a5cb8a5d +Block 0020 [102]: 39595dbc3386c825 +Block 0020 [103]: 7a3a85e38a8751b7 +Block 0020 [104]: 212b32e2fa3f18ba +Block 0020 [105]: 70e7978eb642c740 +Block 0020 [106]: 145bf98bd9db7579 +Block 0020 [107]: e6cd3e7a38171268 +Block 0020 [108]: 28048150f17004e5 +Block 0020 [109]: 4a084ad678c3c285 +Block 0020 [110]: 14f2417d89dfa4dc +Block 0020 [111]: 31405f3f5922edfb +Block 0020 [112]: b3696b2d430a74d0 +Block 0020 [113]: 24a857990340927f +Block 0020 [114]: cec0c14446ee4bd5 +Block 0020 [115]: 3973f485c6208c36 +Block 0020 [116]: dfb726454a565cdf +Block 0020 [117]: e2afb5ccf8b2fff9 +Block 0020 [118]: 6d10ba676dba16b9 +Block 0020 [119]: 53d268907b9738fd +Block 0020 [120]: 38d4d0c62ea273a9 +Block 0020 [121]: 077fd8691c47430f +Block 0020 [122]: a8d0a3cf26b3e70f +Block 0020 [123]: ca812c92fbd348a9 +Block 0020 [124]: 44481748bc8a4958 +Block 0020 [125]: 433a65429d7fc46f +Block 0020 [126]: a5b3568bfcbaceef +Block 0020 [127]: ca3f2394209c5459 +Block 0021 [ 0]: c9cee1441d5f5eab +Block 0021 [ 1]: 52930f80be51d785 +Block 0021 [ 2]: d9ca1edef07331fa +Block 0021 [ 3]: 5b3585e29a75d026 +Block 0021 [ 4]: bb429c762a3842d4 +Block 0021 [ 5]: ba9162cb2e4a3841 +Block 0021 [ 6]: aaaf69053cad1b02 +Block 0021 [ 7]: 75009de437add431 +Block 0021 [ 8]: 127799b6080ff74e +Block 0021 [ 9]: 0f8b60aadc4f92cd +Block 0021 [ 10]: b42e05642dd12542 +Block 0021 [ 11]: 235523f7fb4904a2 +Block 0021 [ 12]: 1e74a64fd16a30dd +Block 0021 [ 13]: 53c398ac3ae69a51 +Block 0021 [ 14]: be6c14cd42d53a85 +Block 0021 [ 15]: eb766ffac3813cbd +Block 0021 [ 16]: 3ebe536b4fc09b06 +Block 0021 [ 17]: d8ecfbaee3f55493 +Block 0021 [ 18]: b3635f0a71d9c6e3 +Block 0021 [ 19]: 6bba95ce1e1bec06 +Block 0021 [ 20]: 25c3fdd4e94e91c2 +Block 0021 [ 21]: d8c4b4c3ffc73bc2 +Block 0021 [ 22]: 3affdbdc7d5986d4 +Block 0021 [ 23]: 0b550b10e081e257 +Block 0021 [ 24]: 8c19a8f9dcefcbbb +Block 0021 [ 25]: bdeb52643dcbae10 +Block 0021 [ 26]: 07aa196ad4b3a0cf +Block 0021 [ 27]: 342eae16c8c58e7f +Block 0021 [ 28]: 22160b2900a419ff +Block 0021 [ 29]: b385c2b64b3aaad9 +Block 0021 [ 30]: 46eca5a6d39f1dd5 +Block 0021 [ 31]: af5f93e38f53ad14 +Block 0021 [ 32]: ddf78e43a91bf838 +Block 0021 [ 33]: 31489cb54c9612f6 +Block 0021 [ 34]: b55b6627a2a238f0 +Block 0021 [ 35]: 3ba6a3fe33f75e0c +Block 0021 [ 36]: a65e93a773f427b4 +Block 0021 [ 37]: 619b72827915658e +Block 0021 [ 38]: da1b7dafcb6d5810 +Block 0021 [ 39]: 331d8479540385ff +Block 0021 [ 40]: ca7f376ba1cee5fd +Block 0021 [ 41]: da53bb16660e43aa +Block 0021 [ 42]: d132a1801b2a1e36 +Block 0021 [ 43]: 0d8b0985e1dfbae8 +Block 0021 [ 44]: 06a6a8c448731c99 +Block 0021 [ 45]: e883d74d86960172 +Block 0021 [ 46]: 7353308be911a737 +Block 0021 [ 47]: 61b9f5c7f1f2c0d7 +Block 0021 [ 48]: 2dec7ab9f7231caa +Block 0021 [ 49]: 2bce285600143fd9 +Block 0021 [ 50]: 39010c3aeca34306 +Block 0021 [ 51]: d115577f0d727858 +Block 0021 [ 52]: 2a14cf35dba86061 +Block 0021 [ 53]: d7874bb05167b114 +Block 0021 [ 54]: b9037cbd42674941 +Block 0021 [ 55]: c8ae7d2d8a9f1dfb +Block 0021 [ 56]: 40007b2a39fb2388 +Block 0021 [ 57]: 24dd8e28b9f2f95b +Block 0021 [ 58]: 69c38f54dc7d736c +Block 0021 [ 59]: 8e5b642cc1c69c96 +Block 0021 [ 60]: c3a36b2d0869a075 +Block 0021 [ 61]: af9801df2f72627e +Block 0021 [ 62]: 34e29558db1d4cc9 +Block 0021 [ 63]: 4bfad5cab74d4d79 +Block 0021 [ 64]: c6967c9a66a2b9de +Block 0021 [ 65]: ff7ca71448d89f34 +Block 0021 [ 66]: b707949980d581d8 +Block 0021 [ 67]: c23a42309200643b +Block 0021 [ 68]: 765664b4e14d5f21 +Block 0021 [ 69]: 70e9c6872e68a5d4 +Block 0021 [ 70]: 71f3602f8bb547e7 +Block 0021 [ 71]: d3d1c0da3feadf0e +Block 0021 [ 72]: b1a26e7ff9b1f302 +Block 0021 [ 73]: 2fedaa2c8b5162fb +Block 0021 [ 74]: d0424eeff22c0329 +Block 0021 [ 75]: 15ad3cc810e0f5ff +Block 0021 [ 76]: b0fbe0010dc2693c +Block 0021 [ 77]: 8461b38939d3db18 +Block 0021 [ 78]: 11fac6794cee84c9 +Block 0021 [ 79]: 16fc287e9a19e926 +Block 0021 [ 80]: 6ec8980df000fef0 +Block 0021 [ 81]: b75eee5a272a9564 +Block 0021 [ 82]: 3b28e5b52c6bb35b +Block 0021 [ 83]: 78699bb3b652c6eb +Block 0021 [ 84]: 6c41404ab2b098b2 +Block 0021 [ 85]: 3d28235a57851c08 +Block 0021 [ 86]: ea29322b64acd257 +Block 0021 [ 87]: c966e9bcb6a9c8eb +Block 0021 [ 88]: 35c6802a7cce1d18 +Block 0021 [ 89]: f42843fa222dccde +Block 0021 [ 90]: 2aebadee62fc8979 +Block 0021 [ 91]: c475f0875b0a7105 +Block 0021 [ 92]: 7ee5af7c946e09c2 +Block 0021 [ 93]: 37f9b4fea2e215d2 +Block 0021 [ 94]: 3a9de7e350019af4 +Block 0021 [ 95]: 33b7efe13b4b9454 +Block 0021 [ 96]: 39d2d89f04964241 +Block 0021 [ 97]: 14db73f346b5a0c0 +Block 0021 [ 98]: 5bfb2a9cc35360d9 +Block 0021 [ 99]: 729eb1694f7c60aa +Block 0021 [100]: 7117bbfaf1f19d62 +Block 0021 [101]: a3c58fc555bf2ca0 +Block 0021 [102]: 13c1b7c5f1378202 +Block 0021 [103]: 7399c842479a898a +Block 0021 [104]: 9e1f5697bede7ff0 +Block 0021 [105]: 0564149b9c476558 +Block 0021 [106]: 3bc1b90131692b4c +Block 0021 [107]: 1bfccfcf22e3a1cb +Block 0021 [108]: 3da368666200d8ed +Block 0021 [109]: 033e93f46e8d4743 +Block 0021 [110]: 11c36841131b1891 +Block 0021 [111]: d8f96a26a37dc7ab +Block 0021 [112]: f4a1ae508ac48041 +Block 0021 [113]: 6c495e2ef1d1103a +Block 0021 [114]: 58ae115d9d807cce +Block 0021 [115]: 4c82fdf95cbcbcc0 +Block 0021 [116]: 39f51ce1da9b6c3d +Block 0021 [117]: 4205730f6328d09b +Block 0021 [118]: ea4360a7b8c07f77 +Block 0021 [119]: d7d81fb0a057e3ce +Block 0021 [120]: ba8ca586118d56d6 +Block 0021 [121]: 120e233f49d0028d +Block 0021 [122]: cb40ca113e6da130 +Block 0021 [123]: 764c1e104bac5294 +Block 0021 [124]: d56f2844dc2583bb +Block 0021 [125]: 879a3936fc5755b9 +Block 0021 [126]: 70acbe6e098056cb +Block 0021 [127]: 7afca87ff2b79b00 +Block 0022 [ 0]: bc7d82733ef71b9c +Block 0022 [ 1]: 1394cb4e08693d8a +Block 0022 [ 2]: 18efd91732233110 +Block 0022 [ 3]: b20b21aef6a3926f +Block 0022 [ 4]: 3592daf273bc0c49 +Block 0022 [ 5]: 33d46dc9f07a46e4 +Block 0022 [ 6]: 73d1fb77948b06eb +Block 0022 [ 7]: 8a63f8dfbb800d0a +Block 0022 [ 8]: b86fdf7d3f73ff2c +Block 0022 [ 9]: 3bc6f91dde8086a3 +Block 0022 [ 10]: c8e447a640139dfa +Block 0022 [ 11]: 2297e787b750829d +Block 0022 [ 12]: f128b83545fa0a12 +Block 0022 [ 13]: cb1b9787fdb730d7 +Block 0022 [ 14]: 6627c9718a8bc950 +Block 0022 [ 15]: 8e9e75b67ebc26cf +Block 0022 [ 16]: 317809a1ecf9fd10 +Block 0022 [ 17]: 0b948f6d198e306c +Block 0022 [ 18]: 43830167f0277d31 +Block 0022 [ 19]: acefad5b0faba0ba +Block 0022 [ 20]: 883907843665ddd3 +Block 0022 [ 21]: 6c7ba74784193ecc +Block 0022 [ 22]: 221ab9d2f05a09ac +Block 0022 [ 23]: 706261e61b707c75 +Block 0022 [ 24]: 0a3ab628c11d07f4 +Block 0022 [ 25]: 71c1113dde1d533f +Block 0022 [ 26]: 4a35095412392314 +Block 0022 [ 27]: 6924221e002e1078 +Block 0022 [ 28]: fdd4f0e2b1570056 +Block 0022 [ 29]: 2b9d802e0bc07966 +Block 0022 [ 30]: f489dd59e2a6d0ea +Block 0022 [ 31]: a1388929da27122a +Block 0022 [ 32]: 46e85b9ad9e8cce8 +Block 0022 [ 33]: 749fb8d43225808b +Block 0022 [ 34]: e6153f61998e80d5 +Block 0022 [ 35]: f469291ceb31747b +Block 0022 [ 36]: d2919925b4c5071b +Block 0022 [ 37]: ae3fc5256ebda2a8 +Block 0022 [ 38]: 6f6679fc8264c35c +Block 0022 [ 39]: 3d7dad770a274f01 +Block 0022 [ 40]: 379bcf2fd1e137c2 +Block 0022 [ 41]: e32a82c804274e00 +Block 0022 [ 42]: e0de77e0762f4f07 +Block 0022 [ 43]: 4d57ae811094fa42 +Block 0022 [ 44]: 7552dcd84eed2528 +Block 0022 [ 45]: 22a0822ada306970 +Block 0022 [ 46]: e7296732d4e69866 +Block 0022 [ 47]: a20ec5bacb74fb8d +Block 0022 [ 48]: 6786cf2ad5572d0a +Block 0022 [ 49]: f2549f26dce94274 +Block 0022 [ 50]: ce524392221e9ce9 +Block 0022 [ 51]: fb222ef56a02c3f1 +Block 0022 [ 52]: ce29627b2c55b120 +Block 0022 [ 53]: b00fc98e487d33bc +Block 0022 [ 54]: ba9a1a9236ebcb8d +Block 0022 [ 55]: 96d87fce20966dfe +Block 0022 [ 56]: 5719501da01a5fb4 +Block 0022 [ 57]: 1bef1c286a9f357b +Block 0022 [ 58]: a472acbd08f7d091 +Block 0022 [ 59]: dfb4ab50795f5a56 +Block 0022 [ 60]: 175c667d2966d000 +Block 0022 [ 61]: d1535a2fa23c2dfc +Block 0022 [ 62]: 0276066c52933b9b +Block 0022 [ 63]: a789683dd9e8cc16 +Block 0022 [ 64]: 3ea422cc751cad5d +Block 0022 [ 65]: 357842eb4fd985e8 +Block 0022 [ 66]: cd55f90fc562d75c +Block 0022 [ 67]: 38109086d68f4095 +Block 0022 [ 68]: 70b6bd256c6daedc +Block 0022 [ 69]: 5a350e041de1919c +Block 0022 [ 70]: a536eaa4af68d2fe +Block 0022 [ 71]: 3077af0c5eed3c22 +Block 0022 [ 72]: 3123f4d9aad3b3ba +Block 0022 [ 73]: 9fb0ff34bfaa2270 +Block 0022 [ 74]: b658b0cd00d5802f +Block 0022 [ 75]: 97b2e143fd7c3c5c +Block 0022 [ 76]: 88dee4acf47e5419 +Block 0022 [ 77]: b826a726db361361 +Block 0022 [ 78]: 7b671285d2803d20 +Block 0022 [ 79]: b671334ae4049a01 +Block 0022 [ 80]: b5d4701309738c4d +Block 0022 [ 81]: eec51b2dd9ca1524 +Block 0022 [ 82]: 8ea2e7cbe7849f38 +Block 0022 [ 83]: 6b654a5540635dc2 +Block 0022 [ 84]: 3d4295e4d19615ac +Block 0022 [ 85]: eb5e5915a0642148 +Block 0022 [ 86]: f893ec41ab06137c +Block 0022 [ 87]: bad2cf30b8bb3273 +Block 0022 [ 88]: 6352142d0b470b26 +Block 0022 [ 89]: 5467740c7733e65a +Block 0022 [ 90]: a6bbbae22894b638 +Block 0022 [ 91]: 2a35ebb87114b880 +Block 0022 [ 92]: d989e7a00d5ec8e9 +Block 0022 [ 93]: af7b8a32afdb6885 +Block 0022 [ 94]: 4efcdde6bc2d75f5 +Block 0022 [ 95]: 7f8f41d919eced9a +Block 0022 [ 96]: 4787f909f8dc245d +Block 0022 [ 97]: d40d8d2b70c01d96 +Block 0022 [ 98]: c7adee6cc4517d3a +Block 0022 [ 99]: 92ed4ee8f5b01a49 +Block 0022 [100]: c01843707b5b5c7e +Block 0022 [101]: d32ae3a801bae8e4 +Block 0022 [102]: 7803de6e9eeea070 +Block 0022 [103]: f8529b389c8e28e6 +Block 0022 [104]: 040625e29005b5be +Block 0022 [105]: 624d205de5ae4dec +Block 0022 [106]: 78a524f7d7e34d89 +Block 0022 [107]: 9186f14434d72086 +Block 0022 [108]: e50b8c43f0ad97df +Block 0022 [109]: c7023c88b8797c5f +Block 0022 [110]: 280a5ce52b4dbdc0 +Block 0022 [111]: a1508547bfb3aa05 +Block 0022 [112]: 82e67edf8fd56984 +Block 0022 [113]: 0fe3f32b800eeb47 +Block 0022 [114]: 4951bd7622ad0d9a +Block 0022 [115]: 070fc7de56bb23af +Block 0022 [116]: 88d09d9a518a0377 +Block 0022 [117]: b7607d77aec85aa6 +Block 0022 [118]: 6ca70a4b33e651b9 +Block 0022 [119]: cecd51f1d0e710fb +Block 0022 [120]: ee38237e293e8f11 +Block 0022 [121]: 6c568b3fcf1d17a3 +Block 0022 [122]: b792e4c460d81205 +Block 0022 [123]: 7c2468923361bf6f +Block 0022 [124]: 09953de49fdbc9ac +Block 0022 [125]: b985b06398326895 +Block 0022 [126]: ac8e2c083ba0e907 +Block 0022 [127]: b289adef24fcb269 +Block 0023 [ 0]: f887a0362d97bbe5 +Block 0023 [ 1]: bc39eae32801eb35 +Block 0023 [ 2]: b5a675c89e71c050 +Block 0023 [ 3]: ac732ed0c2509276 +Block 0023 [ 4]: 5b53d3ce4dd394fe +Block 0023 [ 5]: 31b0557388dedb15 +Block 0023 [ 6]: 3cf538f405228614 +Block 0023 [ 7]: 940b0e9c63cb21da +Block 0023 [ 8]: 73e8facbd92099bd +Block 0023 [ 9]: 2432843309adcd8f +Block 0023 [ 10]: b31c4d7d1699ec2f +Block 0023 [ 11]: af05004ebd7f9d33 +Block 0023 [ 12]: 9db5a872e714329e +Block 0023 [ 13]: 91ea75883b762e4a +Block 0023 [ 14]: f38638108dabdd90 +Block 0023 [ 15]: 26861e1cd975cd97 +Block 0023 [ 16]: 05715021862d5b3a +Block 0023 [ 17]: 8882e5dc0d315aed +Block 0023 [ 18]: 4e420d6af5cba865 +Block 0023 [ 19]: 2dbbabb447434fe8 +Block 0023 [ 20]: 4fb80c868a970369 +Block 0023 [ 21]: 04d0a9abb8a0f861 +Block 0023 [ 22]: 6b2501fafcc000e9 +Block 0023 [ 23]: 201b740e3be2dac6 +Block 0023 [ 24]: 185afa423a4fb1b5 +Block 0023 [ 25]: 53afaec388322182 +Block 0023 [ 26]: 0c2814b50d6e577e +Block 0023 [ 27]: 26b4946dfa2d52d9 +Block 0023 [ 28]: 1f1b128b10855cb4 +Block 0023 [ 29]: 132c09b9061898f2 +Block 0023 [ 30]: 471c578b8492a910 +Block 0023 [ 31]: b258bbd42e271fd7 +Block 0023 [ 32]: 93f8cb887270d643 +Block 0023 [ 33]: e42960f495f58326 +Block 0023 [ 34]: c6d908e361617ce2 +Block 0023 [ 35]: b8cdb4bdda047621 +Block 0023 [ 36]: 3a8286ee5cef4d67 +Block 0023 [ 37]: 49f526689fcd933a +Block 0023 [ 38]: 55d05b37b4a6d448 +Block 0023 [ 39]: 22ca23986b8c5204 +Block 0023 [ 40]: 9f685412374be015 +Block 0023 [ 41]: 6f0ba8b6e35e70ab +Block 0023 [ 42]: fe318f443beb5657 +Block 0023 [ 43]: 6a705817f928cc9d +Block 0023 [ 44]: 00bd93bc3e34ff51 +Block 0023 [ 45]: c99dd7521242e14c +Block 0023 [ 46]: f9253088dea37570 +Block 0023 [ 47]: 1e2d13deb310f931 +Block 0023 [ 48]: 19c2c371e1f661a9 +Block 0023 [ 49]: 7a06fd0f6d70a89c +Block 0023 [ 50]: 4587e9d4990f201c +Block 0023 [ 51]: 2ca4ab657130bbe7 +Block 0023 [ 52]: dee5ca875175476d +Block 0023 [ 53]: 78420fa068dbccca +Block 0023 [ 54]: 826f3deed3c1b6a0 +Block 0023 [ 55]: e7e50e4cfe7647db +Block 0023 [ 56]: affaeaf92cb991a2 +Block 0023 [ 57]: 49625c0a8611bec8 +Block 0023 [ 58]: b58dcfd9919c942a +Block 0023 [ 59]: 6077cbec91448280 +Block 0023 [ 60]: fbb108e9bf221d99 +Block 0023 [ 61]: 5b51277c1bb05b10 +Block 0023 [ 62]: 636343b6a796fba4 +Block 0023 [ 63]: ef13787e68ae51b8 +Block 0023 [ 64]: ee5b8487cb5693c8 +Block 0023 [ 65]: 7c28f2ce84a277dc +Block 0023 [ 66]: 26d883051560b97f +Block 0023 [ 67]: a89a03bedc2cdcb6 +Block 0023 [ 68]: 301f3a02f1b052ea +Block 0023 [ 69]: 9184eebcb7de3579 +Block 0023 [ 70]: 19ce01730fc35b1e +Block 0023 [ 71]: 15802e8ab6283689 +Block 0023 [ 72]: 9aa02a56f7c5d4e2 +Block 0023 [ 73]: 68d84ecf84d7072e +Block 0023 [ 74]: fde125e9672c9d76 +Block 0023 [ 75]: 9bb65a3334c84bce +Block 0023 [ 76]: 166cf59fdeaf06e9 +Block 0023 [ 77]: 28ecda6662343772 +Block 0023 [ 78]: c8899d575e4b40ad +Block 0023 [ 79]: 8db3dd5266989dc4 +Block 0023 [ 80]: 2d5d7afab6ae495d +Block 0023 [ 81]: 3e57e86bf7615941 +Block 0023 [ 82]: 7abd5fafae678d60 +Block 0023 [ 83]: 8c7d5e8c79bc0b95 +Block 0023 [ 84]: 1bf47b24e046db46 +Block 0023 [ 85]: 0366b4dbb095fc65 +Block 0023 [ 86]: a9403c73e1b574ff +Block 0023 [ 87]: 77fab0f60a5df650 +Block 0023 [ 88]: cc7ba3e9add465cf +Block 0023 [ 89]: b1feaef54d44d684 +Block 0023 [ 90]: 70c59b46799527d1 +Block 0023 [ 91]: 532b0ebc0afad373 +Block 0023 [ 92]: d04a620645a05717 +Block 0023 [ 93]: d7eb5dd9e3cdfdc6 +Block 0023 [ 94]: 1fa15db4d90e9643 +Block 0023 [ 95]: 150689421f9c19e5 +Block 0023 [ 96]: e8776793ccc305ac +Block 0023 [ 97]: 4720c416da67d942 +Block 0023 [ 98]: e0295389706e7198 +Block 0023 [ 99]: 61ddae9836604da5 +Block 0023 [100]: 0efa90593f7d286d +Block 0023 [101]: 5f470d10224b43db +Block 0023 [102]: 8cdb8a1c385b1ab5 +Block 0023 [103]: f65982042e0a4a53 +Block 0023 [104]: 5b914b8a3a09cca3 +Block 0023 [105]: 87d96b0eb194aae3 +Block 0023 [106]: 4b01105d03b0431f +Block 0023 [107]: b05129a7d4de80e1 +Block 0023 [108]: fa485ef8d1ea275a +Block 0023 [109]: 619da5c52438dc97 +Block 0023 [110]: 3ddd40726265c8fb +Block 0023 [111]: 9145517022fa85e0 +Block 0023 [112]: cd491181f5af124b +Block 0023 [113]: cf6a59f7420de634 +Block 0023 [114]: cb3249abde961732 +Block 0023 [115]: db33911f535c7f10 +Block 0023 [116]: 0b1c13597b7662f4 +Block 0023 [117]: ec9cdcbb4a807d87 +Block 0023 [118]: df7248a43cb72d02 +Block 0023 [119]: f97318ca3b133c5c +Block 0023 [120]: ac640dc6b2c51f82 +Block 0023 [121]: 2dbfb7a7aefcaa9b +Block 0023 [122]: d96e33495832ee13 +Block 0023 [123]: eb2b11dca1b85b4d +Block 0023 [124]: 0f1fa072f4eb94f1 +Block 0023 [125]: 795f7ad648403ed8 +Block 0023 [126]: c39a5565f68468df +Block 0023 [127]: 9b5911137e833734 +Block 0024 [ 0]: 19544ae260a1fe89 +Block 0024 [ 1]: a90b484bf81248d3 +Block 0024 [ 2]: 3aa17c66521420be +Block 0024 [ 3]: 6c997d1851d26765 +Block 0024 [ 4]: c58a7ea82170ab8b +Block 0024 [ 5]: 9ea19a31d951f70f +Block 0024 [ 6]: 5c0d564309159517 +Block 0024 [ 7]: b58da24d46ace1d0 +Block 0024 [ 8]: d5c1217fa46ae430 +Block 0024 [ 9]: f304ab6d7e537669 +Block 0024 [ 10]: aeea1b75e3507989 +Block 0024 [ 11]: 5eec96bd59daae4c +Block 0024 [ 12]: 1faacc7160416a4f +Block 0024 [ 13]: 28298c25197a9fea +Block 0024 [ 14]: 86944857f501fde4 +Block 0024 [ 15]: dc99890d787159b1 +Block 0024 [ 16]: 00abf614fa34bee2 +Block 0024 [ 17]: 8e9a6dbc73768e97 +Block 0024 [ 18]: 67c946912bf3035f +Block 0024 [ 19]: ec802a2fbbbc4854 +Block 0024 [ 20]: 837f827386a46736 +Block 0024 [ 21]: 9e0043e3ca1aa1d2 +Block 0024 [ 22]: 589f0de39b42db52 +Block 0024 [ 23]: 71f125e96c2e1d7c +Block 0024 [ 24]: bb410c18015520a9 +Block 0024 [ 25]: 46f6d90e6a2c94ed +Block 0024 [ 26]: 425626f90495ed2a +Block 0024 [ 27]: 8560f25c13bf5d47 +Block 0024 [ 28]: 5cad47824a048dba +Block 0024 [ 29]: f76db517190747c5 +Block 0024 [ 30]: c2afcae5d789b38d +Block 0024 [ 31]: 3aa9073bbee11840 +Block 0024 [ 32]: 692f0d7b53aeb157 +Block 0024 [ 33]: e589327308612979 +Block 0024 [ 34]: e2e90881ef58cd84 +Block 0024 [ 35]: 710422fdfc67897b +Block 0024 [ 36]: d2ddcfd2206b8463 +Block 0024 [ 37]: 86ce852d6197f6e1 +Block 0024 [ 38]: e3562daafb454d13 +Block 0024 [ 39]: 3183eec11eb00f1a +Block 0024 [ 40]: 59e474969a554c65 +Block 0024 [ 41]: 0047f774fd077fc8 +Block 0024 [ 42]: 1652bbe0098b386a +Block 0024 [ 43]: a3bc06c2c6f6b033 +Block 0024 [ 44]: 626a0b0174685989 +Block 0024 [ 45]: 7a0713a7d2284f17 +Block 0024 [ 46]: db7e15fe42c8e495 +Block 0024 [ 47]: a8e7232dc2034778 +Block 0024 [ 48]: d9edd376cb77b4c8 +Block 0024 [ 49]: 46a60d186591f2a8 +Block 0024 [ 50]: befd4ae47857cf74 +Block 0024 [ 51]: 34ef4d23f15d6ad2 +Block 0024 [ 52]: cb1890237eb064cf +Block 0024 [ 53]: 647d271993d6799f +Block 0024 [ 54]: a166dc6b15384277 +Block 0024 [ 55]: 24b2c02c08b4493c +Block 0024 [ 56]: 48f180b05feb6757 +Block 0024 [ 57]: 750330054f5166b7 +Block 0024 [ 58]: e791c9cf836a894b +Block 0024 [ 59]: 350c62af591a89b1 +Block 0024 [ 60]: 8068c97e650a680b +Block 0024 [ 61]: 602e5d7ec3090f9f +Block 0024 [ 62]: 5d895adb104bbfdb +Block 0024 [ 63]: 4969f86f4ed6ee1f +Block 0024 [ 64]: 2ade07ec3ae6b981 +Block 0024 [ 65]: 219647c06ad79029 +Block 0024 [ 66]: dfd39cd6e3477b99 +Block 0024 [ 67]: ef7aa5a0098cf293 +Block 0024 [ 68]: c051e96271121718 +Block 0024 [ 69]: 8c9ce5b1dea5759d +Block 0024 [ 70]: fdea1017a321e726 +Block 0024 [ 71]: 7512c935f90ed960 +Block 0024 [ 72]: b8d8d75db8272af7 +Block 0024 [ 73]: 1f14c26126a3e03a +Block 0024 [ 74]: d12a32abf2203212 +Block 0024 [ 75]: bc8807f4672f7316 +Block 0024 [ 76]: 653f65788dbe664d +Block 0024 [ 77]: fdc38532e373de3a +Block 0024 [ 78]: 8604aa43d188008e +Block 0024 [ 79]: f769e2f202d04174 +Block 0024 [ 80]: 4f033ec36a5422ab +Block 0024 [ 81]: 6b4f439714a27419 +Block 0024 [ 82]: 0e63fd9261f6eac4 +Block 0024 [ 83]: 398a388cabf5af9a +Block 0024 [ 84]: 3075d5227839e900 +Block 0024 [ 85]: d87769ccc8b9b72a +Block 0024 [ 86]: cef1dd87cddcb9d7 +Block 0024 [ 87]: 602486b18d8b3b6f +Block 0024 [ 88]: 095bc7aa54e363a8 +Block 0024 [ 89]: 869b52eee9661873 +Block 0024 [ 90]: 41efeea963d375f1 +Block 0024 [ 91]: f39ddd993bc819f1 +Block 0024 [ 92]: 732cd74c9521f132 +Block 0024 [ 93]: 42bd27be85ff5f7d +Block 0024 [ 94]: b84b542491097234 +Block 0024 [ 95]: 6e728e49d0c13956 +Block 0024 [ 96]: a0560af5f85a9640 +Block 0024 [ 97]: cb9e4f7c029b4388 +Block 0024 [ 98]: b31c47b6c7db14fe +Block 0024 [ 99]: e22c5792d48ae63b +Block 0024 [100]: e21fd21ac5af8e63 +Block 0024 [101]: 5fd33dcb458b29dc +Block 0024 [102]: bd284c0e68f994d6 +Block 0024 [103]: d5bf807f4b9cecd9 +Block 0024 [104]: 8f42b5d58b200307 +Block 0024 [105]: 2280b5e6d94f43e2 +Block 0024 [106]: 19e9b92a0f0c54e2 +Block 0024 [107]: 55e67859224bea91 +Block 0024 [108]: 8f5d82f0d4e29050 +Block 0024 [109]: 4d500153a41c5faa +Block 0024 [110]: 3dc5aa1f24e10a18 +Block 0024 [111]: c64497a88ab19e13 +Block 0024 [112]: ee171eff18a2e8eb +Block 0024 [113]: 8a2bdd1af95429af +Block 0024 [114]: 5bed3c8488f49a43 +Block 0024 [115]: 9c11cba1d6d29d63 +Block 0024 [116]: fd2ef7237161c78b +Block 0024 [117]: fe83e69bdaea394c +Block 0024 [118]: f4eddd0618cb4d93 +Block 0024 [119]: 8deb5cb8b9536492 +Block 0024 [120]: b6de734754f92f1c +Block 0024 [121]: e3ae9642edd9edb8 +Block 0024 [122]: 71a85b6a1bb7e4e8 +Block 0024 [123]: 9464bb6dfd50f897 +Block 0024 [124]: db5e7e8b0d3d21dd +Block 0024 [125]: 4d2defa4a0d165f7 +Block 0024 [126]: 59664f6fa7f0d2ca +Block 0024 [127]: 8b6bb9688d145794 +Block 0025 [ 0]: c320877b761ba145 +Block 0025 [ 1]: b4a070fa931b59cc +Block 0025 [ 2]: 55f0dae9ab8959c6 +Block 0025 [ 3]: 48963ab3a5a3ab38 +Block 0025 [ 4]: 59c647c2fd70c35d +Block 0025 [ 5]: a24c7b50ceb02a78 +Block 0025 [ 6]: 6bbb53aeb0e275fb +Block 0025 [ 7]: 0bca6bfb5cf30d40 +Block 0025 [ 8]: fe50a6541bee00b9 +Block 0025 [ 9]: a200dbab13260ed0 +Block 0025 [ 10]: fb7e0640663aa3d5 +Block 0025 [ 11]: ad5b65eb577ab28a +Block 0025 [ 12]: c42e17a46768d25b +Block 0025 [ 13]: c0f25775be4bde1b +Block 0025 [ 14]: a03f4ab570eb0864 +Block 0025 [ 15]: b876833a9029276f +Block 0025 [ 16]: bf9341b678c791bb +Block 0025 [ 17]: cda314edc730979c +Block 0025 [ 18]: 37e2272bd5e77953 +Block 0025 [ 19]: 2d1737c17a79ac4a +Block 0025 [ 20]: 19588d0cd12717fb +Block 0025 [ 21]: 3fb22e5d6d00a14d +Block 0025 [ 22]: b8b180c8b64598a7 +Block 0025 [ 23]: c62a52b1873fa546 +Block 0025 [ 24]: d13f17fd366423aa +Block 0025 [ 25]: f7ca73a416f130d7 +Block 0025 [ 26]: 97c6de62108ea500 +Block 0025 [ 27]: 7c8a275dc4b0527c +Block 0025 [ 28]: 22e257327c9bd81a +Block 0025 [ 29]: 1005107b639db935 +Block 0025 [ 30]: 56ccf5386e0a797e +Block 0025 [ 31]: c434dbd212be0379 +Block 0025 [ 32]: c5e828156b2b1724 +Block 0025 [ 33]: d149d5eef4038aae +Block 0025 [ 34]: f20dc40228486a09 +Block 0025 [ 35]: c23b6038712599fb +Block 0025 [ 36]: c084fafb50e196be +Block 0025 [ 37]: 8401889d76da39c0 +Block 0025 [ 38]: 1bf4be3a8eb6580c +Block 0025 [ 39]: 50613c74ba8b2c36 +Block 0025 [ 40]: 0c5d8e3387b53b46 +Block 0025 [ 41]: b5496f10e08319bd +Block 0025 [ 42]: 4d0b58b1b36a5a04 +Block 0025 [ 43]: f26cfd5a23651288 +Block 0025 [ 44]: 511fae11df2b925c +Block 0025 [ 45]: 2a584bc4560e6b06 +Block 0025 [ 46]: 2f0d04783ef0ae17 +Block 0025 [ 47]: 61b2862af0e16017 +Block 0025 [ 48]: 393c0a2cb70ed4d4 +Block 0025 [ 49]: 70b771d466036515 +Block 0025 [ 50]: f702840aa7265d51 +Block 0025 [ 51]: e7be7ec6074b425a +Block 0025 [ 52]: 0fb8dff33cee9f39 +Block 0025 [ 53]: 4b4ce08a3d4a0165 +Block 0025 [ 54]: 802f78c379876de2 +Block 0025 [ 55]: 0e2793e42daeca5c +Block 0025 [ 56]: d4abf5fab9b4995e +Block 0025 [ 57]: 82ebf71518037bef +Block 0025 [ 58]: 3ce0728aa4758e65 +Block 0025 [ 59]: bb3b390fc4ba0cb2 +Block 0025 [ 60]: 42839bb443791583 +Block 0025 [ 61]: 2cfb87bc983e7870 +Block 0025 [ 62]: f42330724740380d +Block 0025 [ 63]: 98f4628dac1e99bc +Block 0025 [ 64]: c4c9c879c60adc22 +Block 0025 [ 65]: 3eead01a59e0b172 +Block 0025 [ 66]: 66b0b83a428296bb +Block 0025 [ 67]: 2dfc02e721a693a6 +Block 0025 [ 68]: ab9b6351ebc16419 +Block 0025 [ 69]: 6d0b84af8fc9cc0c +Block 0025 [ 70]: bd78dc4faf96665b +Block 0025 [ 71]: 366e84d6687882e7 +Block 0025 [ 72]: 6e4be22e1794d368 +Block 0025 [ 73]: ef83a9f950487282 +Block 0025 [ 74]: efd690a7c965908c +Block 0025 [ 75]: 81aa5bb0ba86005c +Block 0025 [ 76]: 7fb6b179052765ed +Block 0025 [ 77]: f7740714636229c5 +Block 0025 [ 78]: 594bab77f4fc97bb +Block 0025 [ 79]: 9c532bc00614dc28 +Block 0025 [ 80]: 74259d5f871c69e7 +Block 0025 [ 81]: ade983a76defaa4e +Block 0025 [ 82]: 3929c168c2ae7ec2 +Block 0025 [ 83]: 46da67711bb8a797 +Block 0025 [ 84]: 9e4d6605e5865868 +Block 0025 [ 85]: 03f54e2a451ae7d1 +Block 0025 [ 86]: bfa46927418df17e +Block 0025 [ 87]: d46bee7f24a285b2 +Block 0025 [ 88]: d8cb8e1968495eaa +Block 0025 [ 89]: 0cd0dc3525ba10c7 +Block 0025 [ 90]: baca910a7552ead2 +Block 0025 [ 91]: 0f8d9cc7b91e3a23 +Block 0025 [ 92]: fb724d1bfe345f18 +Block 0025 [ 93]: e8a17fc3a88a79c8 +Block 0025 [ 94]: de1c975f49d11ea4 +Block 0025 [ 95]: 83932ec2bb6f4ce7 +Block 0025 [ 96]: d36001488800d278 +Block 0025 [ 97]: 2acc2e4f98349965 +Block 0025 [ 98]: ade89929772b2233 +Block 0025 [ 99]: 71b0bf3568125f41 +Block 0025 [100]: fc9b1cce8dacff6a +Block 0025 [101]: 3dd2ded9dc844bda +Block 0025 [102]: d430deac04e9f487 +Block 0025 [103]: 27651351fec68a87 +Block 0025 [104]: 3e0284bc16405c08 +Block 0025 [105]: 49a51c86dce8dd94 +Block 0025 [106]: 37c724beed957310 +Block 0025 [107]: 2b434cbd05e98b33 +Block 0025 [108]: 3d8a05458c115608 +Block 0025 [109]: 40a3068e604b61db +Block 0025 [110]: b5c7a77e038abc55 +Block 0025 [111]: 253c5666950181ab +Block 0025 [112]: 96daf52bd1165717 +Block 0025 [113]: 2adc2ddae4b5ff82 +Block 0025 [114]: a3df6a379964cb33 +Block 0025 [115]: 07437f2749ead995 +Block 0025 [116]: 696d5df46fe37235 +Block 0025 [117]: 39ac9b4253bc8c74 +Block 0025 [118]: 1f4d4f88f980a8f5 +Block 0025 [119]: 4f8c0a082057e21d +Block 0025 [120]: e137d8667c968404 +Block 0025 [121]: f4a5e049476831a3 +Block 0025 [122]: 01c28ffd0c6afa51 +Block 0025 [123]: edb93ba57f459a65 +Block 0025 [124]: 91c72c2b3df105f5 +Block 0025 [125]: e5082ab282eb7758 +Block 0025 [126]: dc10549b836c0675 +Block 0025 [127]: 8a6fd560181ca34a +Block 0026 [ 0]: 7787e1b17f8b7213 +Block 0026 [ 1]: 38b0ed15bcfd0d2b +Block 0026 [ 2]: a2e51631d461450d +Block 0026 [ 3]: 0d43a20398da0d83 +Block 0026 [ 4]: 66bd336361cbe7ea +Block 0026 [ 5]: 9b1b590e17ed1971 +Block 0026 [ 6]: e0ed8e7f87628cba +Block 0026 [ 7]: 3709e578ed58d044 +Block 0026 [ 8]: 6f3c9df36aed3800 +Block 0026 [ 9]: 6f7a33ee11f88d24 +Block 0026 [ 10]: aed550ae646f153b +Block 0026 [ 11]: 36457ca90d54a60a +Block 0026 [ 12]: 7d06b80d22b9a481 +Block 0026 [ 13]: 6b4733c01744613d +Block 0026 [ 14]: 7c17d3703fd46741 +Block 0026 [ 15]: 04ae98470050c642 +Block 0026 [ 16]: a5a19388adf1e43e +Block 0026 [ 17]: fbc2a2dc038db68f +Block 0026 [ 18]: c4bdd4abd293f1b0 +Block 0026 [ 19]: 5d2331ad37f0bbe8 +Block 0026 [ 20]: effca955c329ca97 +Block 0026 [ 21]: 2a1a32ef4ca5397b +Block 0026 [ 22]: aa8f102b0737879e +Block 0026 [ 23]: 0a4af7962c2815b8 +Block 0026 [ 24]: e2902b18ce3342e7 +Block 0026 [ 25]: 44e98690c16d907d +Block 0026 [ 26]: 717ecd63fb9bc693 +Block 0026 [ 27]: 1a7c4a0985a0070e +Block 0026 [ 28]: dae416e8736f2537 +Block 0026 [ 29]: 6a608b0ea85cf02e +Block 0026 [ 30]: efc4102444c22c9d +Block 0026 [ 31]: e731ea0b9f46e701 +Block 0026 [ 32]: 60ae50f08358b083 +Block 0026 [ 33]: cac388635b6cfd3e +Block 0026 [ 34]: 95c96e422e666b00 +Block 0026 [ 35]: 27e360107749d81c +Block 0026 [ 36]: b5324834762b6f59 +Block 0026 [ 37]: 6063ebe9a361f5e6 +Block 0026 [ 38]: 7cd3ca1c59dc2cf5 +Block 0026 [ 39]: dcd32c6af49be138 +Block 0026 [ 40]: 1114a79b8559972e +Block 0026 [ 41]: d754b3285bfbe7c8 +Block 0026 [ 42]: 65a05b0cbbaba55a +Block 0026 [ 43]: 0a345bdf50bf9271 +Block 0026 [ 44]: 4f8fca8cf71ecc35 +Block 0026 [ 45]: 9af421d42dd3e2fd +Block 0026 [ 46]: 790a2c830694f95e +Block 0026 [ 47]: 13277aca6f47c0ca +Block 0026 [ 48]: faf7b46c0635c300 +Block 0026 [ 49]: 9bb87d21df5ce055 +Block 0026 [ 50]: 9ea3ccf7593f4223 +Block 0026 [ 51]: 972196d81877e016 +Block 0026 [ 52]: ee24e2390712cef0 +Block 0026 [ 53]: 0d5ba8f740c8635a +Block 0026 [ 54]: 9cbe5eed690355fa +Block 0026 [ 55]: 9ae45b8ba88a7ee8 +Block 0026 [ 56]: cbc74d17ca2e2120 +Block 0026 [ 57]: f1dbff2e0a0a963a +Block 0026 [ 58]: 898dceb936985d35 +Block 0026 [ 59]: 68399cc0fb5b4f5b +Block 0026 [ 60]: 6b339f4dd21ee52b +Block 0026 [ 61]: 1ccb60bbece0b314 +Block 0026 [ 62]: 67ef77abb1f679e3 +Block 0026 [ 63]: 725403dfdfea6766 +Block 0026 [ 64]: ceea6a9482466593 +Block 0026 [ 65]: 0f6fe2bf8ebd08aa +Block 0026 [ 66]: 4c93f88b4040ce00 +Block 0026 [ 67]: 461c420c864292d2 +Block 0026 [ 68]: 005fffeac6bf989d +Block 0026 [ 69]: 8e57dc0cd187b0a8 +Block 0026 [ 70]: 40e56f7495b3245d +Block 0026 [ 71]: fc30919451bff2dd +Block 0026 [ 72]: e6bc501d0d5f6627 +Block 0026 [ 73]: 06302090b6c9a247 +Block 0026 [ 74]: 8108bbb6f845954c +Block 0026 [ 75]: a46a02be4fd8109b +Block 0026 [ 76]: 18449b4910984976 +Block 0026 [ 77]: 627d1da56c93283f +Block 0026 [ 78]: 3ea2709034683c54 +Block 0026 [ 79]: aa66780464acc060 +Block 0026 [ 80]: 3799a4195532e48a +Block 0026 [ 81]: 2be57e5e6d2574dd +Block 0026 [ 82]: 6b175c17210e5f83 +Block 0026 [ 83]: 36d9322e01b4d188 +Block 0026 [ 84]: 8903c58d72114572 +Block 0026 [ 85]: eb12c42494273c25 +Block 0026 [ 86]: 2ff9cf1cba192da0 +Block 0026 [ 87]: ece184354ffaca0f +Block 0026 [ 88]: 8be22a1b176220f4 +Block 0026 [ 89]: f389e6c2a34d6f02 +Block 0026 [ 90]: 5eb639bbfcac89e3 +Block 0026 [ 91]: ee4954ff1088d75f +Block 0026 [ 92]: 40fc9ea79cb8ea53 +Block 0026 [ 93]: 37031bf3a0da4c68 +Block 0026 [ 94]: a3d7d6b500f23ea1 +Block 0026 [ 95]: 0e25050f11b8c6e2 +Block 0026 [ 96]: 1dcfef79189cd6ea +Block 0026 [ 97]: d55c64e2688a9387 +Block 0026 [ 98]: 854f67dff13be8dc +Block 0026 [ 99]: 73d776ccda670f31 +Block 0026 [100]: 733597e56ce06e48 +Block 0026 [101]: b1ba59f9fdd19824 +Block 0026 [102]: 505cb5283934f36f +Block 0026 [103]: 76a4a4e76280bd43 +Block 0026 [104]: 82762a9747778007 +Block 0026 [105]: 0b8e9ba737a69853 +Block 0026 [106]: 07eb4517abf8f59e +Block 0026 [107]: 6cfa132c67ddaf9f +Block 0026 [108]: dc82c73163acec84 +Block 0026 [109]: 8d2b9b17c3ec0528 +Block 0026 [110]: 39af2ae695f99141 +Block 0026 [111]: 19a879e403ee3f71 +Block 0026 [112]: b7b713bc8c58b905 +Block 0026 [113]: 8837db614637ff11 +Block 0026 [114]: 72420905a2ba9df5 +Block 0026 [115]: 8b4a379f3e156cd9 +Block 0026 [116]: 399fc6bbc18599a3 +Block 0026 [117]: cd9f7dacec38c90f +Block 0026 [118]: 1e50976d023819ca +Block 0026 [119]: 702eea7106b1ee55 +Block 0026 [120]: e822fcb19d6bddf8 +Block 0026 [121]: 9c1d0a694f21ef4b +Block 0026 [122]: 81edbcb110767596 +Block 0026 [123]: 68177967dab9ea1c +Block 0026 [124]: e63bb5189aaefafd +Block 0026 [125]: 07b85177bdec787e +Block 0026 [126]: 82e90e729283b121 +Block 0026 [127]: 5c38fc13b16fadd7 +Block 0027 [ 0]: 12930e6a057db3dc +Block 0027 [ 1]: d36a092bdc01e5e2 +Block 0027 [ 2]: 9f38ab342482fe49 +Block 0027 [ 3]: f974fc7ba1aa4fa8 +Block 0027 [ 4]: a92ee342c95f0c16 +Block 0027 [ 5]: 5fa4cd78ef7c546e +Block 0027 [ 6]: 7530efe11190c6cf +Block 0027 [ 7]: 7dc4e9115082c64a +Block 0027 [ 8]: 7e50a5c226d14b92 +Block 0027 [ 9]: c10c38aedbde3476 +Block 0027 [ 10]: 63a10362c500407c +Block 0027 [ 11]: 38d06cebed582370 +Block 0027 [ 12]: a6d17e59dd8d79e1 +Block 0027 [ 13]: 3f560be8c3116feb +Block 0027 [ 14]: f1a98624843f0e06 +Block 0027 [ 15]: 5b605da6ea36cb76 +Block 0027 [ 16]: 0a998d1b462b9636 +Block 0027 [ 17]: 20c9bc32a8fb2c68 +Block 0027 [ 18]: 6b033a31a9d38e4d +Block 0027 [ 19]: 71e616a3e9371928 +Block 0027 [ 20]: fb93b58238f371bc +Block 0027 [ 21]: 19c3c8b589136419 +Block 0027 [ 22]: b58736bab4e0456d +Block 0027 [ 23]: a26647abf0d6ecbd +Block 0027 [ 24]: ebbf19504cbf5844 +Block 0027 [ 25]: 4c5efff112625110 +Block 0027 [ 26]: 59dc758ebdb3f7db +Block 0027 [ 27]: b37f98da7ebec9f1 +Block 0027 [ 28]: cfd2e95dda6b5110 +Block 0027 [ 29]: f1f99e59b552c90b +Block 0027 [ 30]: e47fc3a80048984b +Block 0027 [ 31]: a91ae33cac719918 +Block 0027 [ 32]: 13183079f3445bb9 +Block 0027 [ 33]: b11458d8655b5d1e +Block 0027 [ 34]: 344e18738fc9a152 +Block 0027 [ 35]: 4b5e13937faa8d66 +Block 0027 [ 36]: bef80972ec679c98 +Block 0027 [ 37]: 03e5e4f7b3a6f1f1 +Block 0027 [ 38]: ea70f0fddee3e6d9 +Block 0027 [ 39]: 146fb2c49fdf235f +Block 0027 [ 40]: 6047ed94889fcd7a +Block 0027 [ 41]: 4ca5532aa52131f0 +Block 0027 [ 42]: cbb5b45a4c542dca +Block 0027 [ 43]: e653642f7a991cee +Block 0027 [ 44]: 02df1b6bcd671363 +Block 0027 [ 45]: bfccfd002b010fc1 +Block 0027 [ 46]: 932095f8fcb37e53 +Block 0027 [ 47]: 35e614f689c05f47 +Block 0027 [ 48]: 1b74807f55e0b06a +Block 0027 [ 49]: 4eb2f12dba075a46 +Block 0027 [ 50]: f0982642ef5559ac +Block 0027 [ 51]: 3422bc053329d35f +Block 0027 [ 52]: 8e431bb2418f2552 +Block 0027 [ 53]: bfac86b81ed9ae9a +Block 0027 [ 54]: cacc8aa08da0e75b +Block 0027 [ 55]: ee31b0c8eb4204b5 +Block 0027 [ 56]: cbdbcfd30e0cba0f +Block 0027 [ 57]: 671d0b0c3726efc9 +Block 0027 [ 58]: b0c4ab8d5906da13 +Block 0027 [ 59]: e5b95a70fa01a0eb +Block 0027 [ 60]: a1d1f26bfd9f3577 +Block 0027 [ 61]: 359023a672a6a5f0 +Block 0027 [ 62]: 370ddd312a434fb5 +Block 0027 [ 63]: 74da84c2881a3683 +Block 0027 [ 64]: d6828e4ba965222d +Block 0027 [ 65]: 595dc11dad7f9a30 +Block 0027 [ 66]: 73068b819a5e5aee +Block 0027 [ 67]: 15369ddd1a6d970c +Block 0027 [ 68]: 3f462c04b0b7a365 +Block 0027 [ 69]: 917e1403575f4ab6 +Block 0027 [ 70]: 2273d2ffdcbf1d12 +Block 0027 [ 71]: ddd0ba35d1168aa3 +Block 0027 [ 72]: 75cbb653840a4cbf +Block 0027 [ 73]: a6c8c0c60b0d8586 +Block 0027 [ 74]: eff7b12a4d557ec8 +Block 0027 [ 75]: 120404a563f5833a +Block 0027 [ 76]: 0126fd04246359fc +Block 0027 [ 77]: 7b062c25b5f01e0e +Block 0027 [ 78]: d77425a03db505f5 +Block 0027 [ 79]: 0f3cb0da8c62a3c1 +Block 0027 [ 80]: 36e521a3f8ee260e +Block 0027 [ 81]: 6daabf1b23d415e9 +Block 0027 [ 82]: 351544dc1bc2ade2 +Block 0027 [ 83]: 73a2f4cbf0c61a71 +Block 0027 [ 84]: 9b85fb6bf47e113b +Block 0027 [ 85]: 1069d94fb273a533 +Block 0027 [ 86]: ce9b89a370984d0a +Block 0027 [ 87]: 6450d2025404e384 +Block 0027 [ 88]: fb7a4386879734bc +Block 0027 [ 89]: e46fd6fd1275c166 +Block 0027 [ 90]: ee016a4cac3d0cee +Block 0027 [ 91]: fffc68927242f65b +Block 0027 [ 92]: 0a1887efbe2788b7 +Block 0027 [ 93]: 1b58841d77287271 +Block 0027 [ 94]: d152260d9308572b +Block 0027 [ 95]: ece6f963e3ebbbc5 +Block 0027 [ 96]: e7223810f5627ce1 +Block 0027 [ 97]: 1b3981f28853088f +Block 0027 [ 98]: 65c286c9e8dcfbd0 +Block 0027 [ 99]: 1ee47c556fbc9547 +Block 0027 [100]: 6143d92f2a00e43e +Block 0027 [101]: 0910c819d3fbd6c5 +Block 0027 [102]: 83a6c3c6178941aa +Block 0027 [103]: fdcae49032578ab3 +Block 0027 [104]: d401f44c9ce96675 +Block 0027 [105]: 38f7ee360016ae89 +Block 0027 [106]: dce9785998cd7e5a +Block 0027 [107]: 1d62c2e64198819b +Block 0027 [108]: de11552f926a3154 +Block 0027 [109]: 70c03577942da684 +Block 0027 [110]: bbd8b1f50967abcf +Block 0027 [111]: dbc8c3667580889f +Block 0027 [112]: 8149d1c48a57948e +Block 0027 [113]: 61f5496ee9cfbbd2 +Block 0027 [114]: 4ac6319d2de8dc93 +Block 0027 [115]: 27c3d16c6b798aba +Block 0027 [116]: c88e4c2f6f071746 +Block 0027 [117]: edcd89159e9013ce +Block 0027 [118]: 8e2e169861431d0d +Block 0027 [119]: 5edebc7fcf5da7bc +Block 0027 [120]: 382bbc7274d680db +Block 0027 [121]: 00b6ff6e1d75dc45 +Block 0027 [122]: a76a9eed4900a8d1 +Block 0027 [123]: 7f484b5d28c8a586 +Block 0027 [124]: 295b53fe63506698 +Block 0027 [125]: 558a174b4e127e0e +Block 0027 [126]: 684094fc58d7e254 +Block 0027 [127]: dbe06eb544f1906e +Block 0028 [ 0]: ddb78852644e4fb9 +Block 0028 [ 1]: 8157ed8a8df838d8 +Block 0028 [ 2]: 368f13a1b3a19b11 +Block 0028 [ 3]: d4f19f1eb6e95356 +Block 0028 [ 4]: 1e1b78d80bf53bd4 +Block 0028 [ 5]: 4fdb694933b6c774 +Block 0028 [ 6]: 6ddfca93b71e9a0f +Block 0028 [ 7]: a57c49965a92a2ab +Block 0028 [ 8]: 4fcc400c2b8db1d1 +Block 0028 [ 9]: 64cc43e293565b56 +Block 0028 [ 10]: 4b45a5f1b8517500 +Block 0028 [ 11]: 11e2bab5266c6f45 +Block 0028 [ 12]: 86beeced6cae59b9 +Block 0028 [ 13]: 45dffb5c4715fe45 +Block 0028 [ 14]: 2c9591fd02b19e55 +Block 0028 [ 15]: dab8017fe48f8420 +Block 0028 [ 16]: 25c31011171393eb +Block 0028 [ 17]: 5cbd5c588c21d872 +Block 0028 [ 18]: 316d50b90b137b97 +Block 0028 [ 19]: 5924c498b1765b2f +Block 0028 [ 20]: 2a0f743760ccc424 +Block 0028 [ 21]: 30f97a465a2b737b +Block 0028 [ 22]: 4646d157fecaceb8 +Block 0028 [ 23]: e5f9e8a4c6f1115c +Block 0028 [ 24]: 1766f2e20c969a26 +Block 0028 [ 25]: 6c2e97942c33c4e5 +Block 0028 [ 26]: 7424f24156e95a3f +Block 0028 [ 27]: 872bbb2e45e22ce5 +Block 0028 [ 28]: 5c11165dd1a85e90 +Block 0028 [ 29]: 34dceb5459d0114d +Block 0028 [ 30]: a1f187f262b4e88c +Block 0028 [ 31]: 9e1ca88530d2b53c +Block 0028 [ 32]: fc6a2ecbab308670 +Block 0028 [ 33]: 3fd7c88081e86c28 +Block 0028 [ 34]: f38d8bd2f6673049 +Block 0028 [ 35]: d5d9f983810b9631 +Block 0028 [ 36]: b22bb71dc25daa1a +Block 0028 [ 37]: fbe85a9b293b63c4 +Block 0028 [ 38]: 1b267938f53b24be +Block 0028 [ 39]: 646356bba6645a62 +Block 0028 [ 40]: 08c4f441c8b9e50c +Block 0028 [ 41]: ac2a12479f405658 +Block 0028 [ 42]: 2154f7818668aaba +Block 0028 [ 43]: 5020654424e00306 +Block 0028 [ 44]: f69468f9c6058b91 +Block 0028 [ 45]: edb043fd6c771c66 +Block 0028 [ 46]: 1287182ed24b66af +Block 0028 [ 47]: 5fa6715eb508cb2f +Block 0028 [ 48]: 7f2e3eebc7622dd2 +Block 0028 [ 49]: 4872d48ca3d3044a +Block 0028 [ 50]: 9afe8b801d70981e +Block 0028 [ 51]: 37dc872e96e1fa5e +Block 0028 [ 52]: 065674818a30fb71 +Block 0028 [ 53]: f15637fc6066ab39 +Block 0028 [ 54]: dd012664e2e963fc +Block 0028 [ 55]: 11f468e6f8ead720 +Block 0028 [ 56]: 0d4bf81380f5f7b7 +Block 0028 [ 57]: bf387f5347f51a2b +Block 0028 [ 58]: 80830d570d6be9fa +Block 0028 [ 59]: 0fbdf32510ef4109 +Block 0028 [ 60]: 865abaf1fad7c7c6 +Block 0028 [ 61]: 5f8a61d65fbcff4e +Block 0028 [ 62]: ca1e5596912d75b7 +Block 0028 [ 63]: 7b12b1246fbb312a +Block 0028 [ 64]: 216f63fbd7cee1ad +Block 0028 [ 65]: 3304bd0ad61aa327 +Block 0028 [ 66]: 7b406a15e6a554dd +Block 0028 [ 67]: 4b861fd7abc69337 +Block 0028 [ 68]: cd61bc81c3a5710a +Block 0028 [ 69]: bacf74038200ade1 +Block 0028 [ 70]: 2eb50854ecb1b89c +Block 0028 [ 71]: 6ce4f13fcd047978 +Block 0028 [ 72]: 1ffd893cf06817b1 +Block 0028 [ 73]: 019e6cdd343ba3b5 +Block 0028 [ 74]: 6ad77b96e6cb27f7 +Block 0028 [ 75]: fd0447e79123f630 +Block 0028 [ 76]: 60c59aa378c9d746 +Block 0028 [ 77]: b7047b78dcdda7f6 +Block 0028 [ 78]: 1675c7d66cb47094 +Block 0028 [ 79]: ca5eefb7cb436aee +Block 0028 [ 80]: a4207e30dd8f6abe +Block 0028 [ 81]: cd3d5e1bc0851543 +Block 0028 [ 82]: 59df14e5a994447b +Block 0028 [ 83]: 6212bdad1c5236ba +Block 0028 [ 84]: 50f2b2aa5d88720e +Block 0028 [ 85]: 7e957c908b1fe13f +Block 0028 [ 86]: 8faccec71ce74717 +Block 0028 [ 87]: 694c00d349687830 +Block 0028 [ 88]: 2c4704f4942761f9 +Block 0028 [ 89]: 2b7f14df7894d243 +Block 0028 [ 90]: e6690e21770bdbd8 +Block 0028 [ 91]: c5f1b5c597c611d4 +Block 0028 [ 92]: 695bfbb7c5b6d205 +Block 0028 [ 93]: 7f4dd31a22323b21 +Block 0028 [ 94]: 1c82e4fe143a3a87 +Block 0028 [ 95]: 3d67e3a318ec260f +Block 0028 [ 96]: 0e1d2cf60450d635 +Block 0028 [ 97]: 2616a3ea45b9fe98 +Block 0028 [ 98]: fc913a01b60d4ef4 +Block 0028 [ 99]: dce48585f1e70b80 +Block 0028 [100]: 86ca2b0246017f0e +Block 0028 [101]: 603a6902077571cd +Block 0028 [102]: 10dc341e0cfd16f1 +Block 0028 [103]: e541553b8d4335c9 +Block 0028 [104]: 66d981c8d54ab580 +Block 0028 [105]: bf4d8514c40adadc +Block 0028 [106]: 10d48b8199c6b610 +Block 0028 [107]: b5bc74240320de57 +Block 0028 [108]: af7668ece2e84c7e +Block 0028 [109]: e3130bb9f194f006 +Block 0028 [110]: ac94f63610240c95 +Block 0028 [111]: a57c35e5bc18208a +Block 0028 [112]: e1e559ad43561660 +Block 0028 [113]: 9e0396432e4fb2b0 +Block 0028 [114]: d9eecd132cf253e7 +Block 0028 [115]: 5c6c1e86338d3843 +Block 0028 [116]: 4a0f9767c564c7fd +Block 0028 [117]: 451ad2c0b4837694 +Block 0028 [118]: b919b729cdf423bc +Block 0028 [119]: 38166219dae5e549 +Block 0028 [120]: d80cee45d4cec8d6 +Block 0028 [121]: b29d77b88e5d7043 +Block 0028 [122]: d3a30d963e19f957 +Block 0028 [123]: 97dabe16dde3eb61 +Block 0028 [124]: baf0424359c13ff1 +Block 0028 [125]: fc25e968e22146eb +Block 0028 [126]: 8aba818396994000 +Block 0028 [127]: c48f6fdace29cf9d +Block 0029 [ 0]: 225b64c780f39256 +Block 0029 [ 1]: 5147dc905e69a0db +Block 0029 [ 2]: 4c7942255ca27d88 +Block 0029 [ 3]: 8229b91388cfb1ae +Block 0029 [ 4]: 77e41def90535d0b +Block 0029 [ 5]: 60e9faecef01a27c +Block 0029 [ 6]: 588f421dc2ceaeec +Block 0029 [ 7]: abdd9949472c2af1 +Block 0029 [ 8]: a2b25cd56b4a8e35 +Block 0029 [ 9]: c7a089f905ef9af7 +Block 0029 [ 10]: 984e0141b144c4ac +Block 0029 [ 11]: e7e81071cf5a3a28 +Block 0029 [ 12]: e1877aa5c8515358 +Block 0029 [ 13]: e2b44eec3f348c9d +Block 0029 [ 14]: 2c656eabc4c92995 +Block 0029 [ 15]: 7a4b4b7e40cd548d +Block 0029 [ 16]: a3256ff7e5eb7769 +Block 0029 [ 17]: dd83e20dbf429f74 +Block 0029 [ 18]: 70a48f575e6f5d04 +Block 0029 [ 19]: 4127e6148d99f6ca +Block 0029 [ 20]: 472d9760ec55f6c2 +Block 0029 [ 21]: 4a13aa3a38cbd14e +Block 0029 [ 22]: 45203b263388ba70 +Block 0029 [ 23]: 20cc48efc33f1c47 +Block 0029 [ 24]: d37ae14d8c380707 +Block 0029 [ 25]: 5d88011d318a9eb1 +Block 0029 [ 26]: 5a7bcd8ae96845a8 +Block 0029 [ 27]: 82fb579f8cae5f10 +Block 0029 [ 28]: e0b5c3cd5c716035 +Block 0029 [ 29]: b23baef06e65d007 +Block 0029 [ 30]: e74730eecf9fe525 +Block 0029 [ 31]: a58d022815708b41 +Block 0029 [ 32]: ad2f92a14bd509e1 +Block 0029 [ 33]: 4c263e4d0ba9f61f +Block 0029 [ 34]: ef945be10969cf1d +Block 0029 [ 35]: 26238bd507503c18 +Block 0029 [ 36]: 10edc88eae06b7f1 +Block 0029 [ 37]: aa77af94ae98a96a +Block 0029 [ 38]: f5b6f7f01849769f +Block 0029 [ 39]: 018464b91abc2a1c +Block 0029 [ 40]: 09bb750f89cf9c2c +Block 0029 [ 41]: bdf625a05c80e043 +Block 0029 [ 42]: 004149c8ac887102 +Block 0029 [ 43]: a32bff9a62c2a7e3 +Block 0029 [ 44]: b1db20ddbe124fad +Block 0029 [ 45]: 1e55616eb04c3f84 +Block 0029 [ 46]: 56f964e84266f7e8 +Block 0029 [ 47]: 372a6c740da9c762 +Block 0029 [ 48]: 2604cb4e6455c382 +Block 0029 [ 49]: 3959bcce8d32b584 +Block 0029 [ 50]: 20c4a1dce4e44856 +Block 0029 [ 51]: e872e71fdd213d98 +Block 0029 [ 52]: ff576355fbe1ce1f +Block 0029 [ 53]: 168d7d1478765f35 +Block 0029 [ 54]: ef0928a5c3c145a1 +Block 0029 [ 55]: d293b5b27b7e72ec +Block 0029 [ 56]: e5dc2424b6f8b604 +Block 0029 [ 57]: f2983bcacecf4aa1 +Block 0029 [ 58]: 456d60bc3fee9203 +Block 0029 [ 59]: 1fc3a7781da2242c +Block 0029 [ 60]: a2c160c30dba2e35 +Block 0029 [ 61]: 82ed201b0e1caa9b +Block 0029 [ 62]: 06cf39b3dfc2f9f8 +Block 0029 [ 63]: 094b0feafb722040 +Block 0029 [ 64]: 8d98b7132e79384a +Block 0029 [ 65]: bd1f6dcf9268e96c +Block 0029 [ 66]: 65794241aa1db26a +Block 0029 [ 67]: 6ba30654dd5508d7 +Block 0029 [ 68]: 38e2cecc5ef5b3c3 +Block 0029 [ 69]: c0caeedd012543b1 +Block 0029 [ 70]: 97d124d6b9231255 +Block 0029 [ 71]: 924a3eabe40ed3c2 +Block 0029 [ 72]: bef4ffe2aa528ad5 +Block 0029 [ 73]: 7459989ae48c7456 +Block 0029 [ 74]: 15af22c8d046ed3d +Block 0029 [ 75]: b9a7b35b20e04a44 +Block 0029 [ 76]: a9fa2b538f6fdc91 +Block 0029 [ 77]: 627e222380b163a6 +Block 0029 [ 78]: 750e4474b3fedbc4 +Block 0029 [ 79]: fd8f06d128d7122d +Block 0029 [ 80]: dcca40c3aad30d42 +Block 0029 [ 81]: c9e560e59aff9e68 +Block 0029 [ 82]: af44daa4c21961fd +Block 0029 [ 83]: 68d956313ca4ee2a +Block 0029 [ 84]: 559f4802f58cab76 +Block 0029 [ 85]: de4b232ebdb885e9 +Block 0029 [ 86]: da18676f9822e90e +Block 0029 [ 87]: c7faa08eac54f0e9 +Block 0029 [ 88]: 7bbee29f3ae924d6 +Block 0029 [ 89]: b31156de74c31bdd +Block 0029 [ 90]: dd612ef379062a16 +Block 0029 [ 91]: b9a6fa7267d37107 +Block 0029 [ 92]: 978f2e1b5d57ef40 +Block 0029 [ 93]: 1257fa63203fa38c +Block 0029 [ 94]: b45bff452b049baf +Block 0029 [ 95]: 2b052d00e1cfdbff +Block 0029 [ 96]: 10a504192a1ca782 +Block 0029 [ 97]: 422b6d5a607e0f53 +Block 0029 [ 98]: 994b4ab3f3455574 +Block 0029 [ 99]: f404410879ee0682 +Block 0029 [100]: d24490a97ed582df +Block 0029 [101]: bf58aa9a14b30fb6 +Block 0029 [102]: ab05a7e1e0869b08 +Block 0029 [103]: 7438c7a055aabd68 +Block 0029 [104]: e6b4f489e314de4a +Block 0029 [105]: e367879a4a2ab4e2 +Block 0029 [106]: 932b68f955ae8e57 +Block 0029 [107]: 9349bc1c55f6f161 +Block 0029 [108]: 9c06b3701e4698ba +Block 0029 [109]: 380d6750f198b3a8 +Block 0029 [110]: 5c9f51e2bb2a361e +Block 0029 [111]: f01e94b44e75a07f +Block 0029 [112]: 51c80affa2375a90 +Block 0029 [113]: 7b759d95208f711c +Block 0029 [114]: a77b52fcc15720c0 +Block 0029 [115]: d30091a259eb7f97 +Block 0029 [116]: 559a223d0ac376f1 +Block 0029 [117]: 7f6859520b5d60ff +Block 0029 [118]: 3134e71b8672b420 +Block 0029 [119]: f36a26683f6c70f1 +Block 0029 [120]: 8e884ac595a80e59 +Block 0029 [121]: f1bd754af2d86f17 +Block 0029 [122]: 2dbe0b4c1021e2c6 +Block 0029 [123]: bcf728a6ed7761e2 +Block 0029 [124]: f5848563661b7e5f +Block 0029 [125]: 92bb5c63faae7980 +Block 0029 [126]: 5085c2ab6ec27a8d +Block 0029 [127]: d149a43c8cf72c8e +Block 0030 [ 0]: f7b3915b5d795911 +Block 0030 [ 1]: 6d4650cabf59a5cd +Block 0030 [ 2]: 029120b97e43b2d5 +Block 0030 [ 3]: e786cadd86d3dd06 +Block 0030 [ 4]: f6950a4bcd2ab3de +Block 0030 [ 5]: a6dbc2bc0254abdc +Block 0030 [ 6]: b00616f4dd9e6f91 +Block 0030 [ 7]: ddbdcf163e532e9d +Block 0030 [ 8]: eef8ba582ed02591 +Block 0030 [ 9]: 9ae7f79060ab2642 +Block 0030 [ 10]: 7781023d613e84b0 +Block 0030 [ 11]: 9950b8da56ed918a +Block 0030 [ 12]: 14327600d58edc95 +Block 0030 [ 13]: 25eefe4b4e9dca67 +Block 0030 [ 14]: 7c1e048e6ad65e96 +Block 0030 [ 15]: 4355b2bf89b78bde +Block 0030 [ 16]: 902b3d09bbc68c14 +Block 0030 [ 17]: 3fbeea70676782db +Block 0030 [ 18]: bc9b363de9aab773 +Block 0030 [ 19]: 6f636ac7a5600379 +Block 0030 [ 20]: 07d1d0f408cbb928 +Block 0030 [ 21]: 2cf99690cd52a6c4 +Block 0030 [ 22]: ed547993fa52bf98 +Block 0030 [ 23]: f2a63153b4adf41d +Block 0030 [ 24]: 5185c3b0c39c3b2f +Block 0030 [ 25]: a0a83717bfed6aee +Block 0030 [ 26]: 8cb03a53f0475da6 +Block 0030 [ 27]: 80dae49c5af616ed +Block 0030 [ 28]: 4b3402af281e060b +Block 0030 [ 29]: a94d8af4e395da7a +Block 0030 [ 30]: 11deecee4671f9ad +Block 0030 [ 31]: 365a38641405b0ba +Block 0030 [ 32]: a5102f86395d3699 +Block 0030 [ 33]: 461c09efa6e93ef1 +Block 0030 [ 34]: e45d8eede2db61d3 +Block 0030 [ 35]: e2b1c9e863fb2219 +Block 0030 [ 36]: 742d101cca54f303 +Block 0030 [ 37]: 100668962e6d6721 +Block 0030 [ 38]: 7fdb9ee7c8e721bb +Block 0030 [ 39]: 4f628199abab6233 +Block 0030 [ 40]: e174091ad6b99767 +Block 0030 [ 41]: 7abd35fcbb0b48f7 +Block 0030 [ 42]: af92e9ef5cd4585c +Block 0030 [ 43]: 26d4a48f93f87bc3 +Block 0030 [ 44]: 1e66402195c79874 +Block 0030 [ 45]: 558b6146fe4ed7cf +Block 0030 [ 46]: 1ff7e9f8c9241ab0 +Block 0030 [ 47]: bd94bee9062f44b3 +Block 0030 [ 48]: 93468af3821a9124 +Block 0030 [ 49]: 77be11517873c6da +Block 0030 [ 50]: ebf6a732f56ee38d +Block 0030 [ 51]: 8ab2665e5f16ce08 +Block 0030 [ 52]: 9e0c5672a77d425a +Block 0030 [ 53]: ccac47c85570221b +Block 0030 [ 54]: ba072ec00b35f6e1 +Block 0030 [ 55]: e2a9b77a273ed38e +Block 0030 [ 56]: 01e6d7f004980390 +Block 0030 [ 57]: 94aeef81a472125b +Block 0030 [ 58]: e623ce55ea9d2032 +Block 0030 [ 59]: 511db694687283ca +Block 0030 [ 60]: 6042414f19f4e2d9 +Block 0030 [ 61]: 622142095d269bf8 +Block 0030 [ 62]: ea39bdbd152c17e2 +Block 0030 [ 63]: ee70e17e9b9cd618 +Block 0030 [ 64]: 819eacf187136971 +Block 0030 [ 65]: abdd3aea4a6fc239 +Block 0030 [ 66]: fdbc3148fbc4b4a2 +Block 0030 [ 67]: aa5fa1241d9bcd8b +Block 0030 [ 68]: 8c74b7bb21e39c8e +Block 0030 [ 69]: 9b41e6764ef9c3b5 +Block 0030 [ 70]: d6df0e067e697f53 +Block 0030 [ 71]: 21def006cbc46fd3 +Block 0030 [ 72]: 42001961e18394fc +Block 0030 [ 73]: 78f9eb324a136de0 +Block 0030 [ 74]: 07659bd985720b63 +Block 0030 [ 75]: 5b3090c256c8624e +Block 0030 [ 76]: f8e77a5f9188017a +Block 0030 [ 77]: dde950f5c8aebd6c +Block 0030 [ 78]: 9ec2bd7d0dd13bd4 +Block 0030 [ 79]: f055ecc5524dec99 +Block 0030 [ 80]: 454c290ecf753728 +Block 0030 [ 81]: f1077cae3c387789 +Block 0030 [ 82]: e58f4e8e70ea5d33 +Block 0030 [ 83]: a9cf7b5b92cdc5c5 +Block 0030 [ 84]: abbe97dc3a615361 +Block 0030 [ 85]: 101c5e27366532d6 +Block 0030 [ 86]: 2a5b85b9cc569c7f +Block 0030 [ 87]: d5415ec260957678 +Block 0030 [ 88]: 6f148b5e1ee726ab +Block 0030 [ 89]: 3e83ac5b68c27c1e +Block 0030 [ 90]: caf9feedae1d27fd +Block 0030 [ 91]: f386d285ebd0f0d7 +Block 0030 [ 92]: 931684e917211689 +Block 0030 [ 93]: 0dd6cfb9b9d794a9 +Block 0030 [ 94]: edf6589e6eaaffef +Block 0030 [ 95]: a6778256939a1e88 +Block 0030 [ 96]: 7b4e279e4456a902 +Block 0030 [ 97]: e86fb8cf00b9c11c +Block 0030 [ 98]: 3abe1cb80e77dbc7 +Block 0030 [ 99]: 804a5a863239744b +Block 0030 [100]: 0ff09f689b9155cf +Block 0030 [101]: 7e35cd3b02dce640 +Block 0030 [102]: 2bacf335b1976e89 +Block 0030 [103]: 8233ef17131bcce6 +Block 0030 [104]: aaa2ec0b9d1fa066 +Block 0030 [105]: ec9a0aa1be68200d +Block 0030 [106]: 90716606866689c6 +Block 0030 [107]: 4d76da6c80d13d62 +Block 0030 [108]: f8a464f45e6f2003 +Block 0030 [109]: f5b00f8b927fd15f +Block 0030 [110]: 3304bcbc42a900be +Block 0030 [111]: a097ee36d01a0e12 +Block 0030 [112]: 85759ff3b8dab8a2 +Block 0030 [113]: d0d2dd58bd000a59 +Block 0030 [114]: bdd16ffb771df25c +Block 0030 [115]: 3b7f17d65e21bcbc +Block 0030 [116]: a8db992d9372a410 +Block 0030 [117]: cc57b4adaa4c9451 +Block 0030 [118]: 45075ac086aa5d4a +Block 0030 [119]: 597367349e9a2e79 +Block 0030 [120]: 2696d9e2cddad3f6 +Block 0030 [121]: aa76a82770ea0cd7 +Block 0030 [122]: 22b00c94404e8392 +Block 0030 [123]: f1e2d0a68f50b3c5 +Block 0030 [124]: 47fc2760188717f2 +Block 0030 [125]: eea23f3a62cbc15e +Block 0030 [126]: 9777733407a94e0b +Block 0030 [127]: 10e2bcf209ac3c93 +Block 0031 [ 0]: ba2551a378c910e2 +Block 0031 [ 1]: a2a4b5ae9f029037 +Block 0031 [ 2]: fbcb00039788e99c +Block 0031 [ 3]: 3d51678e868d16f2 +Block 0031 [ 4]: eccd26287b0b4b8c +Block 0031 [ 5]: d125b4a30ae07da8 +Block 0031 [ 6]: bdc4f0f2711802cc +Block 0031 [ 7]: ec04266df056401e +Block 0031 [ 8]: b676b85760e7e3aa +Block 0031 [ 9]: 34d7afd67018978d +Block 0031 [ 10]: 72f33357e0a3d0d5 +Block 0031 [ 11]: 5953e85b40b1db60 +Block 0031 [ 12]: 9f60e209dcffd146 +Block 0031 [ 13]: ebf4ae0739a7190c +Block 0031 [ 14]: e786bde349ffa078 +Block 0031 [ 15]: 45f2e51c23815e96 +Block 0031 [ 16]: 6db7c74b5c15185d +Block 0031 [ 17]: 64c6cfba2c5c8db0 +Block 0031 [ 18]: b3825f9409265373 +Block 0031 [ 19]: dfe0cbda0725f952 +Block 0031 [ 20]: fd0c2b34aeb78b75 +Block 0031 [ 21]: ce8a795131a4905d +Block 0031 [ 22]: b05f59cbde1b730c +Block 0031 [ 23]: bc9f44070df95cad +Block 0031 [ 24]: 8b04c461747caca8 +Block 0031 [ 25]: 24ab937d9e282f53 +Block 0031 [ 26]: b73a19bef82cb8a3 +Block 0031 [ 27]: 9685f40b24ca7f3b +Block 0031 [ 28]: cdca3329cc0cd294 +Block 0031 [ 29]: d2bfcd5eba17fd63 +Block 0031 [ 30]: cb91a04e00308585 +Block 0031 [ 31]: b4d1cdfe27f9f1b9 +Block 0031 [ 32]: 3a179be974a2a00f +Block 0031 [ 33]: 9adf724e4a740c28 +Block 0031 [ 34]: 08ee5f4f7d8b7a4d +Block 0031 [ 35]: 5798d8357833307a +Block 0031 [ 36]: 1c10594518a0094e +Block 0031 [ 37]: d6bf9b976f3007b7 +Block 0031 [ 38]: c971f67f6f5f69d8 +Block 0031 [ 39]: f71ef932e83d37c6 +Block 0031 [ 40]: ed96d8d9ae4aa39a +Block 0031 [ 41]: e2b9b38b144f690b +Block 0031 [ 42]: cadf4da1e346adb8 +Block 0031 [ 43]: 9df212ccd4768f96 +Block 0031 [ 44]: e0beb6841adf50bb +Block 0031 [ 45]: f568bce2d32ac0ff +Block 0031 [ 46]: 094cba4a582410b1 +Block 0031 [ 47]: 0bc73e23027ae171 +Block 0031 [ 48]: df30cb7f6c304933 +Block 0031 [ 49]: e5c9de323c73aeaa +Block 0031 [ 50]: 7309a5a4d46d2400 +Block 0031 [ 51]: 87577abd3a5847f6 +Block 0031 [ 52]: f34e46c0adbc27cc +Block 0031 [ 53]: 8fbc9c9ecef4712c +Block 0031 [ 54]: bb236365dab5f0f9 +Block 0031 [ 55]: e883770727b59df2 +Block 0031 [ 56]: 24a2400329decffe +Block 0031 [ 57]: 72ed72838f62bd8b +Block 0031 [ 58]: 2ff20a50b9edaf02 +Block 0031 [ 59]: c49a571662434a4c +Block 0031 [ 60]: 7c9ad60d62c4b1bf +Block 0031 [ 61]: 51875a75e552ada6 +Block 0031 [ 62]: 3a32f8ab24e7c732 +Block 0031 [ 63]: c340f6a12b945d83 +Block 0031 [ 64]: f3504c15c9f162f3 +Block 0031 [ 65]: d9daa82ba3ba8977 +Block 0031 [ 66]: 54dba94ce2ec870d +Block 0031 [ 67]: 68331ed60a1d5037 +Block 0031 [ 68]: 3a0a89f98e28d0ed +Block 0031 [ 69]: d11a497c98dd7363 +Block 0031 [ 70]: 4fb9ba15f43a8737 +Block 0031 [ 71]: fab603bffcad233c +Block 0031 [ 72]: 24cdf04cc2b5eead +Block 0031 [ 73]: e8b572d365f625c5 +Block 0031 [ 74]: 257ec3762e4f6da8 +Block 0031 [ 75]: b81b255403c274fe +Block 0031 [ 76]: 926ff7a24d12bae5 +Block 0031 [ 77]: 2cd251efd351ffde +Block 0031 [ 78]: c31eef31e805f738 +Block 0031 [ 79]: dc62d5543b95daab +Block 0031 [ 80]: bd9e0bfe62400899 +Block 0031 [ 81]: a1cc9f496b9c829c +Block 0031 [ 82]: b2043c89cf626b77 +Block 0031 [ 83]: f64141cb97fee59a +Block 0031 [ 84]: dd1df4f4706c011f +Block 0031 [ 85]: 16df9a3054c8c96f +Block 0031 [ 86]: 3a63828fe124a3fe +Block 0031 [ 87]: c1452b04bdd1c318 +Block 0031 [ 88]: e20e6c50c7dd975a +Block 0031 [ 89]: 39c1a21562c5b7f3 +Block 0031 [ 90]: e6843aefccf4dfbc +Block 0031 [ 91]: 1aa4dfa03bc5a0e1 +Block 0031 [ 92]: 8922b48b6a4d7d7f +Block 0031 [ 93]: 9e574f8825317718 +Block 0031 [ 94]: dbcb8c6c40d31bda +Block 0031 [ 95]: 909c4929f0d98608 +Block 0031 [ 96]: f42329ae93383145 +Block 0031 [ 97]: 4677e44aa39abf60 +Block 0031 [ 98]: 9c9ffdbb0d6b608f +Block 0031 [ 99]: 108a41fe19860021 +Block 0031 [100]: 1a9bfb05d9e8ec88 +Block 0031 [101]: 1c4ad68f5d425047 +Block 0031 [102]: e7b1051a96ec60dd +Block 0031 [103]: fda74634f0acc4cf +Block 0031 [104]: fe56b2bcd5bdf3e7 +Block 0031 [105]: 5a1e699aecbc292d +Block 0031 [106]: bcceb2f10ab70062 +Block 0031 [107]: 2a800d4cbc728faa +Block 0031 [108]: c588289811f8e84a +Block 0031 [109]: ec40fab8651154f3 +Block 0031 [110]: 16b0936827dff2f4 +Block 0031 [111]: 26c7e63292ff15db +Block 0031 [112]: 93e056413e2e0b56 +Block 0031 [113]: 200d76516fd463c6 +Block 0031 [114]: 101af0e2b9f88293 +Block 0031 [115]: 48427c1c972109bd +Block 0031 [116]: 0c0c3a0ea1e847aa +Block 0031 [117]: d045ad28fceda383 +Block 0031 [118]: 54418ca0530783a4 +Block 0031 [119]: 11bcd435d2dcea04 +Block 0031 [120]: 0e7c42682b68b097 +Block 0031 [121]: 8a597b4d94ebef39 +Block 0031 [122]: e3cf70f8cc329f05 +Block 0031 [123]: a60a793d19a77883 +Block 0031 [124]: d723359b485f509b +Block 0031 [125]: cb78824f42375111 +Block 0031 [126]: 35bc8cc6e83b1875 +Block 0031 [127]: 0b012846a40f346a +Tag: 0d 64 0d f5 8d 78 76 6c 08 c0 37 a3 4a 8b 53 c9 d0 1e f0 45 2d 75 b6 5e b5 25 20 e9 6b 01 e6 59 diff --git a/deps/phc-winner-argon2-20190702/kats/argon2id.shasum b/deps/phc-winner-argon2-20190702/kats/argon2id.shasum new file mode 100644 index 000000000..54755af41 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2id.shasum @@ -0,0 +1 @@ +ba05643e504fc5778dda99e2d9f42ebe7d22ebb3923cc719fd591b1b14a8d28d argon2id diff --git a/deps/phc-winner-argon2-20190702/kats/argon2id_v16 b/deps/phc-winner-argon2-20190702/kats/argon2id_v16 new file mode 100644 index 000000000..05ea2b315 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2id_v16 @@ -0,0 +1,12304 @@ +======================================= +Argon2id version number 16 +======================================= +Memory: 32 KiB, Iterations: 3, Parallelism: 4 lanes, Tag length: 32 bytes +Password[32]: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 +Salt[16]: 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 +Secret[8]: 03 03 03 03 03 03 03 03 +Associated data[12]: 04 04 04 04 04 04 04 04 04 04 04 04 +Pre-hashing digest: 70 65 ab 9c 82 b5 f0 e8 71 28 c7 84 7a 02 1d 1e 59 aa 16 66 6f c8 b4 ef ac a3 86 3f bf d6 5e 0e 8b a6 f6 09 eb bc 9b 60 e2 78 22 c8 24 b7 50 6f b9 f9 5b e9 0e e5 84 2a ac 6e d6 b7 da 67 30 44 + + After pass 0: +Block 0000 [ 0]: b7bb842644fb909e +Block 0000 [ 1]: 92e351e160803c45 +Block 0000 [ 2]: a9c24b300afd7b10 +Block 0000 [ 3]: 182cf4233ee44cab +Block 0000 [ 4]: 7a683cbc2906379b +Block 0000 [ 5]: 137aafb620c6c117 +Block 0000 [ 6]: dd9b43b0486b7c7d +Block 0000 [ 7]: 92e2f6c74a74a3e1 +Block 0000 [ 8]: aff35a4302c3fa3b +Block 0000 [ 9]: d76b047857f6f390 +Block 0000 [ 10]: 564f0363488ee83d +Block 0000 [ 11]: ec358c2dfd0bd18a +Block 0000 [ 12]: 42257160ad69eb83 +Block 0000 [ 13]: 147a568114a9c596 +Block 0000 [ 14]: d5db25b5740efc84 +Block 0000 [ 15]: ab0eb206883645d3 +Block 0000 [ 16]: 6e64467db82d4fb5 +Block 0000 [ 17]: 651ed1e53f297dc8 +Block 0000 [ 18]: 9ccbad51593abaf5 +Block 0000 [ 19]: 01b5546e1177ee58 +Block 0000 [ 20]: 3d26eaa9524ea4cd +Block 0000 [ 21]: a722e88f9651424c +Block 0000 [ 22]: be078be7e13a8978 +Block 0000 [ 23]: 23be5ef0c66109a4 +Block 0000 [ 24]: eec08b3431a67aac +Block 0000 [ 25]: 20b7e59878714c02 +Block 0000 [ 26]: 7b508a53c69a8118 +Block 0000 [ 27]: f2dd15049b78f666 +Block 0000 [ 28]: 5ab1d2113edc5ccb +Block 0000 [ 29]: 6e7aeeabf3241f19 +Block 0000 [ 30]: 64d84116592594e5 +Block 0000 [ 31]: 44cd928f35735d7b +Block 0000 [ 32]: 80c1c80000870823 +Block 0000 [ 33]: 86971eb2fd4f3ea1 +Block 0000 [ 34]: ebe240672e818b64 +Block 0000 [ 35]: cc50a5172a798ec1 +Block 0000 [ 36]: e214795d6bdfae01 +Block 0000 [ 37]: 34dbbd4f0ce743bf +Block 0000 [ 38]: 5f6d7fc0d14a42ee +Block 0000 [ 39]: 6c27bde0a4ad06fe +Block 0000 [ 40]: a225c3d053439aaf +Block 0000 [ 41]: 0611f32af47fd4ce +Block 0000 [ 42]: d36dd06bd1c0e42a +Block 0000 [ 43]: 53e31d06d89c4a89 +Block 0000 [ 44]: 4277658b3a5f2d44 +Block 0000 [ 45]: 5fa68495fa98f654 +Block 0000 [ 46]: 8cd4c77eb8f00cbd +Block 0000 [ 47]: 4e27f32130c34f99 +Block 0000 [ 48]: 4ffe69553622b576 +Block 0000 [ 49]: 0d3d7cfe462e2320 +Block 0000 [ 50]: b49324bce6b5ad1d +Block 0000 [ 51]: 260756703f023635 +Block 0000 [ 52]: 075d11855cd036ee +Block 0000 [ 53]: 091d19705c2756c7 +Block 0000 [ 54]: a19671b274bba372 +Block 0000 [ 55]: fc31225731e966d1 +Block 0000 [ 56]: 0a815245c504bc91 +Block 0000 [ 57]: 28f97817e690971c +Block 0000 [ 58]: 1f0ec3c0944cbfb8 +Block 0000 [ 59]: c962eee584d3c73b +Block 0000 [ 60]: 67f9d5c835378007 +Block 0000 [ 61]: 009b9cb5bea18286 +Block 0000 [ 62]: 32030ee639fbc966 +Block 0000 [ 63]: 97e2f25a2a1f20d2 +Block 0000 [ 64]: 6f1d7029455bcd55 +Block 0000 [ 65]: fd9a2926cf439cc5 +Block 0000 [ 66]: d1dbc75a7185af29 +Block 0000 [ 67]: 7fa8a98ec6a29827 +Block 0000 [ 68]: a3866a840b3965a4 +Block 0000 [ 69]: 29fca433e0e6ef44 +Block 0000 [ 70]: a593ade0db8f7ec9 +Block 0000 [ 71]: 2adaac3102271ace +Block 0000 [ 72]: fce7ff27e5e58473 +Block 0000 [ 73]: bf8142dd4ecbcb09 +Block 0000 [ 74]: fedc7c9f228859f6 +Block 0000 [ 75]: 0aabb19220a4f3ad +Block 0000 [ 76]: 22fc0ef92d52ce3c +Block 0000 [ 77]: 2f6f3cbca11dd133 +Block 0000 [ 78]: dbeab62bcbdcdadd +Block 0000 [ 79]: 3a3b61f68b3ce981 +Block 0000 [ 80]: 8d282775d4af2f1d +Block 0000 [ 81]: e059e025f4bb11b6 +Block 0000 [ 82]: b459e07a4d1332cf +Block 0000 [ 83]: ff670c951d4088ef +Block 0000 [ 84]: 5f02a137760cd098 +Block 0000 [ 85]: 028d44dfbfcbf8d5 +Block 0000 [ 86]: 87c733e1437000d9 +Block 0000 [ 87]: bd10e034a941e140 +Block 0000 [ 88]: d6720d6b9fc190f5 +Block 0000 [ 89]: acc2a8fba56df010 +Block 0000 [ 90]: a4d4ed3a2e2c9756 +Block 0000 [ 91]: 61c59c4afe1108e8 +Block 0000 [ 92]: 835bded44ae46619 +Block 0000 [ 93]: 7604a9417fbcb100 +Block 0000 [ 94]: 7b6b82b2b4d5bd03 +Block 0000 [ 95]: d5d332c71a0796a4 +Block 0000 [ 96]: 6ea1beba2fc89505 +Block 0000 [ 97]: bc9a6d44b6fb35d5 +Block 0000 [ 98]: ef5f34e62a190c89 +Block 0000 [ 99]: 9225f838b53a9ff5 +Block 0000 [100]: 32cf867e4da92862 +Block 0000 [101]: 2d44b91e42b6f427 +Block 0000 [102]: b440105f96b5aa28 +Block 0000 [103]: 6dc7ad77ea4436d8 +Block 0000 [104]: 66b875b7fe6a9311 +Block 0000 [105]: 9e2fab0c24b0d64f +Block 0000 [106]: 0b1dd725737b7f3b +Block 0000 [107]: 94ef03eb08cc55ef +Block 0000 [108]: 1ed223c9a1336e80 +Block 0000 [109]: 2cf999095e0d6221 +Block 0000 [110]: 39013cd6edf14711 +Block 0000 [111]: 904707a0a83add60 +Block 0000 [112]: e7033770da7cc6b9 +Block 0000 [113]: fb8b1159e1f3f8a1 +Block 0000 [114]: 92193aa808ad5cce +Block 0000 [115]: 867817b80eecfae7 +Block 0000 [116]: c5e66800c996653e +Block 0000 [117]: 58af09ad292272a7 +Block 0000 [118]: 04a55bd2fbc01564 +Block 0000 [119]: a311c88b41d523a9 +Block 0000 [120]: 2b9a9aff6bf7709d +Block 0000 [121]: 31e30127149627d8 +Block 0000 [122]: 5740a54a7b639f73 +Block 0000 [123]: 9703586c49fb0606 +Block 0000 [124]: 70390e67afe1b8dc +Block 0000 [125]: 0f325c6d3360d2f2 +Block 0000 [126]: e6a8d366efa0e311 +Block 0000 [127]: 991d1c2356575c44 +Block 0001 [ 0]: 4989449a68e198d1 +Block 0001 [ 1]: aac7c71d1ea9fb8a +Block 0001 [ 2]: bffe61b60a3415e7 +Block 0001 [ 3]: 22ace2760745f322 +Block 0001 [ 4]: 98e9bdf579ce947d +Block 0001 [ 5]: 579ac1aa9816b6b7 +Block 0001 [ 6]: facaffddebb6af72 +Block 0001 [ 7]: 32e2f6d192fb854c +Block 0001 [ 8]: af32a447f0be2e29 +Block 0001 [ 9]: a1814c09ff4f0884 +Block 0001 [ 10]: f8e4fe08bf29e1cb +Block 0001 [ 11]: 031661363b5d1c11 +Block 0001 [ 12]: 30ffeecd88ae1eba +Block 0001 [ 13]: bdf0af5a211ac806 +Block 0001 [ 14]: 768dc6f50b127a9f +Block 0001 [ 15]: 542257ab5e538f55 +Block 0001 [ 16]: 6732a2223c18f7fa +Block 0001 [ 17]: 55a9d185f27f23dc +Block 0001 [ 18]: 7183c9cd634bba75 +Block 0001 [ 19]: 8a19eea90e714ab9 +Block 0001 [ 20]: ae1bb8c05dd6f11a +Block 0001 [ 21]: 5fa3d9764c1ddaec +Block 0001 [ 22]: 6e6e2e5aab3ccf55 +Block 0001 [ 23]: cb837d78aa562983 +Block 0001 [ 24]: a04bb4ec37dc3d98 +Block 0001 [ 25]: cc1aee40aaeca6f3 +Block 0001 [ 26]: 894e1a07105ae34d +Block 0001 [ 27]: 095f5f736684f22e +Block 0001 [ 28]: b61b098dec5b1bcb +Block 0001 [ 29]: 2f6f0a7aac3e7d7d +Block 0001 [ 30]: 7cca77be88fb9ac8 +Block 0001 [ 31]: 4ed7ac1f943ba626 +Block 0001 [ 32]: 99b65c01eff31eae +Block 0001 [ 33]: b6318dcbde5ff590 +Block 0001 [ 34]: 8b796acde72309e5 +Block 0001 [ 35]: 499cf47baeadf720 +Block 0001 [ 36]: a32218dbd7d5adcc +Block 0001 [ 37]: 7949d40904da59ce +Block 0001 [ 38]: 09661301016e59ab +Block 0001 [ 39]: 70f26a07ffdb712e +Block 0001 [ 40]: e6c82c6406165b80 +Block 0001 [ 41]: 814e816ac9f9a2b4 +Block 0001 [ 42]: 496d86e303148ed4 +Block 0001 [ 43]: d1e4bbdbfa7d3a5e +Block 0001 [ 44]: 47b20d59c80de303 +Block 0001 [ 45]: cedbb73656945872 +Block 0001 [ 46]: 51008402396799b4 +Block 0001 [ 47]: c6b40630f55c127d +Block 0001 [ 48]: f5c33a25f18f5414 +Block 0001 [ 49]: 9c5e5cbcea9ea36e +Block 0001 [ 50]: 91b8dde2229043c6 +Block 0001 [ 51]: 09a3758ac8c98c10 +Block 0001 [ 52]: cb01be64d49c0ae9 +Block 0001 [ 53]: 35d0314dcd303998 +Block 0001 [ 54]: ebe659e766b0e53c +Block 0001 [ 55]: 7072ca398c13bc0f +Block 0001 [ 56]: 9bcafff66942d0b0 +Block 0001 [ 57]: 08817355cd91cbed +Block 0001 [ 58]: 899593aaf6da849c +Block 0001 [ 59]: 4030562b4eed8597 +Block 0001 [ 60]: 1484266e897f6914 +Block 0001 [ 61]: 16fd5ec0071832cf +Block 0001 [ 62]: 4ed582a91d56f940 +Block 0001 [ 63]: 36abb39293cf4bf0 +Block 0001 [ 64]: 5d7484473e5d8a04 +Block 0001 [ 65]: bbcf74106083eba3 +Block 0001 [ 66]: 560b914df76246d9 +Block 0001 [ 67]: af464c1fea2ca5ca +Block 0001 [ 68]: 216867dc0b9b7c90 +Block 0001 [ 69]: 96d67e8f0f693365 +Block 0001 [ 70]: 2739b94e414cdafc +Block 0001 [ 71]: c6b8dc19ead4928c +Block 0001 [ 72]: 7a9fe9cbc3f72e77 +Block 0001 [ 73]: c827d1f0528a71bd +Block 0001 [ 74]: fdc8d9d91b2e451e +Block 0001 [ 75]: 4766a4895d720dad +Block 0001 [ 76]: 906df9428d4b5a64 +Block 0001 [ 77]: 8f66bb2ff99ab56c +Block 0001 [ 78]: b24995e98def0601 +Block 0001 [ 79]: 23f1c3730a825da3 +Block 0001 [ 80]: 0e10371ce089e1a0 +Block 0001 [ 81]: 02819025568c858f +Block 0001 [ 82]: 83b7d7de6bc785f9 +Block 0001 [ 83]: 53dfc6036dc2e85f +Block 0001 [ 84]: 376a29d0e3df59fd +Block 0001 [ 85]: d2e0a4b79b2f8da0 +Block 0001 [ 86]: f628d7114cc3c0a2 +Block 0001 [ 87]: 488c816bb711e8c8 +Block 0001 [ 88]: ab068042a90b22e1 +Block 0001 [ 89]: cceebdeec3145b3d +Block 0001 [ 90]: e21c35cefde7c532 +Block 0001 [ 91]: e14779df3245336c +Block 0001 [ 92]: c03a6a5512faec48 +Block 0001 [ 93]: ba1076e5b5741fe7 +Block 0001 [ 94]: 0f9f26e7faba7e68 +Block 0001 [ 95]: 0e3aa048e46652ee +Block 0001 [ 96]: 2c2bfe5250cd7d69 +Block 0001 [ 97]: da2d90c03212c196 +Block 0001 [ 98]: ef221053390bf8f5 +Block 0001 [ 99]: bbee8da4bd00eb83 +Block 0001 [100]: 72988cedc04a7404 +Block 0001 [101]: bf9247326f867410 +Block 0001 [102]: 69bc52fe67110ad1 +Block 0001 [103]: 0a0139a6c2871ef2 +Block 0001 [104]: bf19681a29325ec9 +Block 0001 [105]: d2ed912dd05cf74d +Block 0001 [106]: 971c8d36dc2cb154 +Block 0001 [107]: 4b3b44a4b160b82c +Block 0001 [108]: 511a2c743551fb28 +Block 0001 [109]: 4b653e1a1439f5f6 +Block 0001 [110]: ce08f68913b83d02 +Block 0001 [111]: eb214b52ece94ac3 +Block 0001 [112]: 8e11f305344a105f +Block 0001 [113]: 39246a558de64f47 +Block 0001 [114]: 950849228224ea14 +Block 0001 [115]: 07bc212b67e22525 +Block 0001 [116]: b1e0e7c9963f2a2f +Block 0001 [117]: 116bc563c9208ff8 +Block 0001 [118]: 6565ad2b648c3a7c +Block 0001 [119]: 6f09b6666053c99b +Block 0001 [120]: 62f49638f17f3b56 +Block 0001 [121]: ec838fec0902fff1 +Block 0001 [122]: 46ed99217ecbaa8d +Block 0001 [123]: 9edebaa010e017da +Block 0001 [124]: 139a0bef21d0f3aa +Block 0001 [125]: 1ef7b4576ff34afe +Block 0001 [126]: 3a4464ac6e7f071a +Block 0001 [127]: 30171c4c18317182 +Block 0002 [ 0]: 24c21ae335819e56 +Block 0002 [ 1]: 601d30c94d2e382a +Block 0002 [ 2]: e5412235e4a6c8ec +Block 0002 [ 3]: dd62751df8e64482 +Block 0002 [ 4]: 10b820d4a82f6a30 +Block 0002 [ 5]: 7114921b2c7b4f68 +Block 0002 [ 6]: fd6d583479fe9e50 +Block 0002 [ 7]: 08dd2365f0ea39e5 +Block 0002 [ 8]: 0b47040470279f87 +Block 0002 [ 9]: 60c2e2004d640023 +Block 0002 [ 10]: a3f666b591d2d5cc +Block 0002 [ 11]: f599e8dae9cf4c17 +Block 0002 [ 12]: bb231e2ac9813744 +Block 0002 [ 13]: efa35e61e2d89b82 +Block 0002 [ 14]: 9f8b8c91cee90678 +Block 0002 [ 15]: 28830b6c98df40f4 +Block 0002 [ 16]: 77612a6d00de8081 +Block 0002 [ 17]: efe02ae6acb10b34 +Block 0002 [ 18]: 6b4f29bebacd7be1 +Block 0002 [ 19]: 158325aff1916099 +Block 0002 [ 20]: 56f939cf16094218 +Block 0002 [ 21]: 7a4f363b4a6b2b34 +Block 0002 [ 22]: f3549b12cf9766d7 +Block 0002 [ 23]: 47ff03692dd05813 +Block 0002 [ 24]: 67ed1e764a840d37 +Block 0002 [ 25]: c0246ce5119f7ddc +Block 0002 [ 26]: 368ce2d96d5aec4b +Block 0002 [ 27]: 1c54267ac4f601ba +Block 0002 [ 28]: a3f06cfd58dbb222 +Block 0002 [ 29]: 577e96a10fe791c7 +Block 0002 [ 30]: d2dcf043c789b0c6 +Block 0002 [ 31]: ccb46504b140cf69 +Block 0002 [ 32]: 299bbf17b285382f +Block 0002 [ 33]: bb0227b4333e65f6 +Block 0002 [ 34]: 0a70c61fdc8038bc +Block 0002 [ 35]: 76c1158a301e3f46 +Block 0002 [ 36]: 89dfb9dad24976c8 +Block 0002 [ 37]: b44434f360e7d14a +Block 0002 [ 38]: d770b3764a8feaa8 +Block 0002 [ 39]: 76f949e55d5a89cd +Block 0002 [ 40]: 1c36e36f410b1630 +Block 0002 [ 41]: f28727a81f389b82 +Block 0002 [ 42]: 910014a75422a2c8 +Block 0002 [ 43]: 707a170ed1cca0b8 +Block 0002 [ 44]: dc2a3f8429661e83 +Block 0002 [ 45]: 115acbc62e271ece +Block 0002 [ 46]: 8cf57a93bb3461df +Block 0002 [ 47]: ee2c1130ccdb726b +Block 0002 [ 48]: cb7ddc22591e441b +Block 0002 [ 49]: 474d91327a32a5cc +Block 0002 [ 50]: 7daed6758b6a410a +Block 0002 [ 51]: c53600dea10f0106 +Block 0002 [ 52]: c2c3f543492143f2 +Block 0002 [ 53]: 50dbd7c5f7c49d67 +Block 0002 [ 54]: 19e198b23b48f41a +Block 0002 [ 55]: 721a24a2f1a040af +Block 0002 [ 56]: 87a1f26f63415ae7 +Block 0002 [ 57]: 1fe92d42e285a0d0 +Block 0002 [ 58]: bdff0f31c7ac33ae +Block 0002 [ 59]: 34818607ca6bf098 +Block 0002 [ 60]: 246e9c6d966abab4 +Block 0002 [ 61]: 00df3f61d9d1c40e +Block 0002 [ 62]: dcdbf723ef8f59bb +Block 0002 [ 63]: 4ba7740f25cb55cf +Block 0002 [ 64]: 36979f0554bed212 +Block 0002 [ 65]: 68f80c30266ec1bf +Block 0002 [ 66]: 267c7fde426025be +Block 0002 [ 67]: ba8045963d719af1 +Block 0002 [ 68]: 38bbbccf8baaeb66 +Block 0002 [ 69]: 3065e858181b0fb8 +Block 0002 [ 70]: 6baa55f49cb0568d +Block 0002 [ 71]: 9ebcbac2f77f5358 +Block 0002 [ 72]: 077fcaab8f11c30b +Block 0002 [ 73]: c704229ec6fec90b +Block 0002 [ 74]: 55f41bb14942a8a0 +Block 0002 [ 75]: 897d3baedb5ed2b5 +Block 0002 [ 76]: 49f246b7168f9dc8 +Block 0002 [ 77]: 8c96ba1b9b4c41a2 +Block 0002 [ 78]: 41bdc5587984225c +Block 0002 [ 79]: 61e336c165a40f81 +Block 0002 [ 80]: bdea7a574e497f98 +Block 0002 [ 81]: 19f5f36af4648b25 +Block 0002 [ 82]: 8f6875a054a82387 +Block 0002 [ 83]: ed5168ce782b0640 +Block 0002 [ 84]: 45b8c6e6e2e76f7d +Block 0002 [ 85]: c1f52f9df2eca9c8 +Block 0002 [ 86]: 02267b3230f0aaab +Block 0002 [ 87]: c69417603e967088 +Block 0002 [ 88]: 99a511f031fa15d3 +Block 0002 [ 89]: 6db8d498977fc845 +Block 0002 [ 90]: ee30da815f04b60f +Block 0002 [ 91]: 1e084eb4933d7b77 +Block 0002 [ 92]: 293593e3c2716d5e +Block 0002 [ 93]: f8c1a970668fddfd +Block 0002 [ 94]: 3521b3d01777ed06 +Block 0002 [ 95]: f052856c2f8802b2 +Block 0002 [ 96]: 4f8f389ab16c382d +Block 0002 [ 97]: 562718613169889c +Block 0002 [ 98]: ffde08ea100c3153 +Block 0002 [ 99]: 611599a690a3277b +Block 0002 [100]: 552079197b4336f5 +Block 0002 [101]: da82d17e1de8c79c +Block 0002 [102]: 4115b237c53c1f83 +Block 0002 [103]: d708eb0e30b42883 +Block 0002 [104]: b0b18a3eea85d88e +Block 0002 [105]: 43ec3c16b2adc1c2 +Block 0002 [106]: 6de6378febe403ec +Block 0002 [107]: 555c763388342eb2 +Block 0002 [108]: 7a41c6af4cb6b129 +Block 0002 [109]: 8927fff2d7af49c3 +Block 0002 [110]: 047412244022377f +Block 0002 [111]: c009518d28032a28 +Block 0002 [112]: df79a603af8c3c94 +Block 0002 [113]: 1347dab66dadd37a +Block 0002 [114]: 5db0afec1448b60e +Block 0002 [115]: bf5528101823da52 +Block 0002 [116]: e12eae4521d48cdc +Block 0002 [117]: 34375ad9b2971a0c +Block 0002 [118]: f48f86a00ace3b40 +Block 0002 [119]: 370b5bfab63d4f28 +Block 0002 [120]: efce287ee0351954 +Block 0002 [121]: 044a9c406b2bb32b +Block 0002 [122]: ed4e010c9b545cd5 +Block 0002 [123]: 9b396320258b99c7 +Block 0002 [124]: e21cdcb067b0d15a +Block 0002 [125]: 30377005aba2b601 +Block 0002 [126]: fa5dc1b9e10ff4d8 +Block 0002 [127]: de315986d0882d3a +Block 0003 [ 0]: 3a621db3273f359a +Block 0003 [ 1]: 4047196c41f1524b +Block 0003 [ 2]: fa2688b40792a1f9 +Block 0003 [ 3]: 3154d37f7c22c796 +Block 0003 [ 4]: 45ca5d1e973b4a0a +Block 0003 [ 5]: 3d2ee4ccd078c494 +Block 0003 [ 6]: 582c73563edbc927 +Block 0003 [ 7]: 3cc861617fad4a2e +Block 0003 [ 8]: 3cdfd91759faf401 +Block 0003 [ 9]: e78963e4abc16439 +Block 0003 [ 10]: 62bd98693f37e328 +Block 0003 [ 11]: cb080db0922c5f84 +Block 0003 [ 12]: 53af8fec0501215a +Block 0003 [ 13]: 9c3880f8091d0f71 +Block 0003 [ 14]: c91b6905e177bb6d +Block 0003 [ 15]: c360a6d7a963824e +Block 0003 [ 16]: 3e0d3af059637a63 +Block 0003 [ 17]: 249895f95d98a0d4 +Block 0003 [ 18]: 348907f710637f06 +Block 0003 [ 19]: ed70cec52cb8c4c4 +Block 0003 [ 20]: 6b26125834bf9762 +Block 0003 [ 21]: c510d89c728f8e15 +Block 0003 [ 22]: 4fee6316b7220507 +Block 0003 [ 23]: 873169071c7554b2 +Block 0003 [ 24]: f0c6b431aea72a4e +Block 0003 [ 25]: 2d43d09e4bffa899 +Block 0003 [ 26]: 7e57d491232aa95b +Block 0003 [ 27]: 8ad078fecf493153 +Block 0003 [ 28]: 6044c0465cf0f980 +Block 0003 [ 29]: 8b593cf1a747c5a4 +Block 0003 [ 30]: ee73b6e055d1ef6e +Block 0003 [ 31]: 8e33bbd1d69b8fa2 +Block 0003 [ 32]: 8fc4730708924366 +Block 0003 [ 33]: 36ee3e79986b1ef9 +Block 0003 [ 34]: 4c230230865b00f0 +Block 0003 [ 35]: fb9cf11da328be01 +Block 0003 [ 36]: 61d1df1a2c5cc787 +Block 0003 [ 37]: 82a0892fe171649e +Block 0003 [ 38]: 2436e9c8cc05b23e +Block 0003 [ 39]: f5f386f91bd7ee43 +Block 0003 [ 40]: b9bb843e5edc7f18 +Block 0003 [ 41]: 746c6f332e610545 +Block 0003 [ 42]: 1417f4efb16df4dc +Block 0003 [ 43]: 3388a6155da804e4 +Block 0003 [ 44]: d15ea1b0c45a05e3 +Block 0003 [ 45]: 761b17ebf05a866d +Block 0003 [ 46]: 9eb91984c3894226 +Block 0003 [ 47]: d23e58b95ff8c101 +Block 0003 [ 48]: 0011ab7a454d971f +Block 0003 [ 49]: a8887ef7321ee7fd +Block 0003 [ 50]: 6840484cfa171c0e +Block 0003 [ 51]: 24a6a3a8e9bc9e74 +Block 0003 [ 52]: b4589a254e2ac698 +Block 0003 [ 53]: 60284a0ed564491b +Block 0003 [ 54]: 6bf793dac7365ff0 +Block 0003 [ 55]: 55a84bfa60e541e5 +Block 0003 [ 56]: fc4931e0181bb6bd +Block 0003 [ 57]: 80989348d3e35790 +Block 0003 [ 58]: 2360aff3fe62e608 +Block 0003 [ 59]: bef9c4109d0b6bd7 +Block 0003 [ 60]: 7cbfc6aaef0fe537 +Block 0003 [ 61]: 74d89e72401f06ba +Block 0003 [ 62]: 82724458b4f710ea +Block 0003 [ 63]: e6153debefc9115d +Block 0003 [ 64]: bb00e792996e8e34 +Block 0003 [ 65]: 000f4177bff067dd +Block 0003 [ 66]: 715a9c5f425b7e42 +Block 0003 [ 67]: cb03ec5a383cf32e +Block 0003 [ 68]: f95a8953f7c868df +Block 0003 [ 69]: 63380b9e43cc443b +Block 0003 [ 70]: 6221768cf16abbce +Block 0003 [ 71]: d5dd916210f3923c +Block 0003 [ 72]: 8656553bbae2f7ce +Block 0003 [ 73]: b8604a325957eca7 +Block 0003 [ 74]: 9a33dbdce26ac7b1 +Block 0003 [ 75]: b41660e1a955da10 +Block 0003 [ 76]: 6f0ade62f0f845f2 +Block 0003 [ 77]: 2386c997551e5c5d +Block 0003 [ 78]: c6438a3931843bb5 +Block 0003 [ 79]: 0085de6ae7761d5e +Block 0003 [ 80]: a78c57d5fb2e7a91 +Block 0003 [ 81]: 7b4978bb4bb67319 +Block 0003 [ 82]: 3e8ca77fae7674dd +Block 0003 [ 83]: b26cfd2ffc983aaf +Block 0003 [ 84]: 6484e38c994fbd3b +Block 0003 [ 85]: 605770b4251f184b +Block 0003 [ 86]: e57180c11d5c30be +Block 0003 [ 87]: 011f2cc3f5bbbd2e +Block 0003 [ 88]: a640d723650e4980 +Block 0003 [ 89]: 288cf3cc99b8dccb +Block 0003 [ 90]: 31cef0a30021cc02 +Block 0003 [ 91]: 798234c5e2b7b865 +Block 0003 [ 92]: ac978dae820ea3d2 +Block 0003 [ 93]: 3af8966c1a02e6e6 +Block 0003 [ 94]: 9ccacba3bb710f28 +Block 0003 [ 95]: 62cb957608e3675a +Block 0003 [ 96]: a6446ccd9f64cfaf +Block 0003 [ 97]: 678d6a43ec4a5dab +Block 0003 [ 98]: 11bbf8c5b3fec1a6 +Block 0003 [ 99]: d51b0480b7c23f63 +Block 0003 [100]: 248f7cf55bf3871b +Block 0003 [101]: d2b6d85f3ae823cd +Block 0003 [102]: c64d167b352c09d4 +Block 0003 [103]: 0d55701832cb81f9 +Block 0003 [104]: 7227e11818addfd4 +Block 0003 [105]: 3078f8d1789c36dd +Block 0003 [106]: ad6f540f4e7db26f +Block 0003 [107]: baae6f778b35844d +Block 0003 [108]: b3b72e41abb9bd23 +Block 0003 [109]: b71d94a62dff1edb +Block 0003 [110]: 7a7ff9eaa271ddd0 +Block 0003 [111]: f826f99201bef179 +Block 0003 [112]: f9b09d1af4b07f1d +Block 0003 [113]: caeb03e5651d778c +Block 0003 [114]: 61d2f77e5ae93537 +Block 0003 [115]: 50786f03f2ecb739 +Block 0003 [116]: d975d339277d68c4 +Block 0003 [117]: 20e243be79a74394 +Block 0003 [118]: 514b73cdf5af9ccb +Block 0003 [119]: 72afe6bf8cbcfe05 +Block 0003 [120]: 06cbfcd153da2144 +Block 0003 [121]: 2d8c338bca6ab827 +Block 0003 [122]: ded3d3e9e3570eff +Block 0003 [123]: 95c1b00841b97c6c +Block 0003 [124]: bba5191e9b0d02d1 +Block 0003 [125]: ba4cc2f9551a2a3b +Block 0003 [126]: 635acd7e64497561 +Block 0003 [127]: aa10e683c112f660 +Block 0004 [ 0]: ee25b842dd1028d0 +Block 0004 [ 1]: 2ed715595f506b40 +Block 0004 [ 2]: 947fac8e22ca7f24 +Block 0004 [ 3]: 09ab93ff09e5e62e +Block 0004 [ 4]: a14d8c61a2f55832 +Block 0004 [ 5]: ce88af1e27d4ca5f +Block 0004 [ 6]: 8e3f281228c34fcc +Block 0004 [ 7]: 4f2f6319e15de25a +Block 0004 [ 8]: 86d2f5b3ce0497e3 +Block 0004 [ 9]: 4721f61cb78a1095 +Block 0004 [ 10]: c30f671aaa85b620 +Block 0004 [ 11]: 95f215c9b0aae3ab +Block 0004 [ 12]: 432f59b01fc61738 +Block 0004 [ 13]: e823ad7b415f84e6 +Block 0004 [ 14]: 7d6a9539afd8ef81 +Block 0004 [ 15]: 1057b188ac56165e +Block 0004 [ 16]: 60ccf5b1bc26c7be +Block 0004 [ 17]: 4d5167cbea8b8396 +Block 0004 [ 18]: 22973aa3683a0f6d +Block 0004 [ 19]: a8174c08193c8958 +Block 0004 [ 20]: 86cf239cf1874206 +Block 0004 [ 21]: c3caa54bd46d745f +Block 0004 [ 22]: b4d09a1cce238f94 +Block 0004 [ 23]: 071d45abf0a9a213 +Block 0004 [ 24]: 30223c62e113cde1 +Block 0004 [ 25]: e189297945a1827b +Block 0004 [ 26]: 0f7aa0e721ac38ef +Block 0004 [ 27]: 988d5d24022c4815 +Block 0004 [ 28]: 37c3795c3f8b89ef +Block 0004 [ 29]: 5a04aeda9f3bb282 +Block 0004 [ 30]: 3fe3a1c2dc39757c +Block 0004 [ 31]: f6bc623989c520e7 +Block 0004 [ 32]: 75c7ecc00cdf5fa6 +Block 0004 [ 33]: 3eea4e42b17c6ca9 +Block 0004 [ 34]: e8f5859c23a09def +Block 0004 [ 35]: 3aa61eb3e0026c4c +Block 0004 [ 36]: bd28de51a7d8f724 +Block 0004 [ 37]: b033d2aa2f841ef5 +Block 0004 [ 38]: 3200146d502d3e9d +Block 0004 [ 39]: de45254e8a677f08 +Block 0004 [ 40]: 5166cbf9383d36ad +Block 0004 [ 41]: fc6d0d8ad27c2730 +Block 0004 [ 42]: f777750b38d200c7 +Block 0004 [ 43]: e36447ba9506c06a +Block 0004 [ 44]: c59c6174109c5d14 +Block 0004 [ 45]: 029d17478e2ac687 +Block 0004 [ 46]: 47e20f6875c23553 +Block 0004 [ 47]: 7d21abcc6ef487a7 +Block 0004 [ 48]: 1cc21cead2b0900d +Block 0004 [ 49]: 521067f187e0f84f +Block 0004 [ 50]: 12f4f40b0988bce9 +Block 0004 [ 51]: 93ada3888ff5d5be +Block 0004 [ 52]: 6b06ff16afa7880b +Block 0004 [ 53]: 7e25b21e917fe499 +Block 0004 [ 54]: 4723a49985b8bfd2 +Block 0004 [ 55]: b5af89f623fb6ef4 +Block 0004 [ 56]: 4c3cb4cc19ab2299 +Block 0004 [ 57]: 8c3343eb7237df51 +Block 0004 [ 58]: c73074b58962f9a1 +Block 0004 [ 59]: 2391b6786e026957 +Block 0004 [ 60]: b65e63b2a65058ad +Block 0004 [ 61]: 9ceb8f638fad4c04 +Block 0004 [ 62]: 440c10dc66a7d19b +Block 0004 [ 63]: 8869ce3907567f9d +Block 0004 [ 64]: ef88a87436c5471b +Block 0004 [ 65]: 17c0a7d91fe78c12 +Block 0004 [ 66]: 417925054fa70397 +Block 0004 [ 67]: 8227d9460cafec86 +Block 0004 [ 68]: e459824688b10895 +Block 0004 [ 69]: e1e7b4f26aedffd1 +Block 0004 [ 70]: 6a26857c2a751c4c +Block 0004 [ 71]: fa532c478e7109fb +Block 0004 [ 72]: eaa69731f00e3797 +Block 0004 [ 73]: ede32dada031de42 +Block 0004 [ 74]: 7e078ac0aa12e932 +Block 0004 [ 75]: 5ebd149479dd59d6 +Block 0004 [ 76]: b4abda1136d84a77 +Block 0004 [ 77]: 19309276689f520a +Block 0004 [ 78]: 1151e9ff304bd0c2 +Block 0004 [ 79]: 09013f55742b99e9 +Block 0004 [ 80]: 70ccb323acdc21f8 +Block 0004 [ 81]: 47e6e19c7f159c79 +Block 0004 [ 82]: 856125cbb7f1560a +Block 0004 [ 83]: 94d9e08696ce69bd +Block 0004 [ 84]: 3df82baf27432f08 +Block 0004 [ 85]: 040765d9c32066c7 +Block 0004 [ 86]: 6638d7601a10ad98 +Block 0004 [ 87]: 94806fe5c853291d +Block 0004 [ 88]: 29249caa73578203 +Block 0004 [ 89]: 33ded5cabacf4386 +Block 0004 [ 90]: a4541fbd8b572b8c +Block 0004 [ 91]: c0c35b42df4b4753 +Block 0004 [ 92]: bad2b200390209c0 +Block 0004 [ 93]: 02a30010cce3c7e6 +Block 0004 [ 94]: 6597c0199fab753b +Block 0004 [ 95]: e5a658e801d90560 +Block 0004 [ 96]: b6cf3d60fe336766 +Block 0004 [ 97]: 4c9d67ce99148e41 +Block 0004 [ 98]: 13c3de54535784be +Block 0004 [ 99]: b85504983a5b7eeb +Block 0004 [100]: 6fafec81d9c04432 +Block 0004 [101]: a98fecab58f016e9 +Block 0004 [102]: 5c02119bf6068de1 +Block 0004 [103]: 0a41f857c077ddf5 +Block 0004 [104]: 3d4616ba64b92389 +Block 0004 [105]: ecb0d2bbdf882091 +Block 0004 [106]: ba1839c9c25219b1 +Block 0004 [107]: 27f560c257eee4ac +Block 0004 [108]: 93419274e76aed92 +Block 0004 [109]: 22ebb8365e049b12 +Block 0004 [110]: 3cb9c4e2d09ce774 +Block 0004 [111]: 45d6d6270525382f +Block 0004 [112]: 45c94644cc18e44e +Block 0004 [113]: 4c0fa7900f09b1fb +Block 0004 [114]: 9625c4a32bad4cc6 +Block 0004 [115]: badc03a1437ac0b0 +Block 0004 [116]: ed0c7eff9275830b +Block 0004 [117]: 69df81fb157d1bcb +Block 0004 [118]: b8bf266ddade37ee +Block 0004 [119]: 7db1d92a4ad082c0 +Block 0004 [120]: cc023380f5dc9df6 +Block 0004 [121]: b882628f9e80fb8e +Block 0004 [122]: da2acdf9a6fceb5e +Block 0004 [123]: d94f7f3fd42195d8 +Block 0004 [124]: 220a0b123697729f +Block 0004 [125]: 341dfea1ad6775b6 +Block 0004 [126]: 8aa9b49d00a41903 +Block 0004 [127]: bf3069c13296c94d +Block 0005 [ 0]: 8391a22525ac3129 +Block 0005 [ 1]: 2182bd7744cc7dcd +Block 0005 [ 2]: f4ca6a851736d626 +Block 0005 [ 3]: 84dd65d9ab943166 +Block 0005 [ 4]: e8e94d6cad517204 +Block 0005 [ 5]: 47c6f8e3d4d65b1c +Block 0005 [ 6]: bcf41f0cd8b65235 +Block 0005 [ 7]: de9625fb97faf26e +Block 0005 [ 8]: 9fd27f84ef4d3f76 +Block 0005 [ 9]: 9b4a643a6ff1b646 +Block 0005 [ 10]: 16addf741451ddbc +Block 0005 [ 11]: f8d7025745a12b1d +Block 0005 [ 12]: 8f6d75b3b17b278d +Block 0005 [ 13]: a469173ba8a5a3a9 +Block 0005 [ 14]: 85cb66a59564b901 +Block 0005 [ 15]: db2396a9310fc6eb +Block 0005 [ 16]: 53f9ae5d6180de0c +Block 0005 [ 17]: 17cfe30a3b903a1b +Block 0005 [ 18]: bb7ee3aa20b8ecb1 +Block 0005 [ 19]: 9b195332c7aadcfb +Block 0005 [ 20]: 16ff8c53dd2b5a29 +Block 0005 [ 21]: 3960274b38939f87 +Block 0005 [ 22]: 0c8c0bdd86aec0f0 +Block 0005 [ 23]: 091dbf94b5caa021 +Block 0005 [ 24]: ea0513282b1c6255 +Block 0005 [ 25]: 09ac386212407947 +Block 0005 [ 26]: 49f2cae638f284bb +Block 0005 [ 27]: 952b85e4556639f9 +Block 0005 [ 28]: ead8b8898ad0008a +Block 0005 [ 29]: a417d718d505d3ef +Block 0005 [ 30]: c9c71e3b1bef1728 +Block 0005 [ 31]: 63ba210eaedb878f +Block 0005 [ 32]: dbb902a61a4a0d6f +Block 0005 [ 33]: 6b93ab239e25d3ad +Block 0005 [ 34]: b9129537cb026700 +Block 0005 [ 35]: bd91b9a32e77e588 +Block 0005 [ 36]: 02bc137c047026d8 +Block 0005 [ 37]: 5e45723770933ec3 +Block 0005 [ 38]: 62f2b3d63d5ee519 +Block 0005 [ 39]: 35ee95ac9c58ebb8 +Block 0005 [ 40]: ad5734706fca0a0e +Block 0005 [ 41]: b86bbbfc96117bec +Block 0005 [ 42]: 3bc87262733b7282 +Block 0005 [ 43]: 68ebc4cbeb9cec24 +Block 0005 [ 44]: 92ed87b13532d74f +Block 0005 [ 45]: 9a46327d7172032c +Block 0005 [ 46]: c7c96af35b519031 +Block 0005 [ 47]: af4f0c07f9b2189d +Block 0005 [ 48]: 62a0c50c5a81915c +Block 0005 [ 49]: c76619e60b2d6f57 +Block 0005 [ 50]: 8a408ebb2d8e6aa2 +Block 0005 [ 51]: 463dedfed695fb54 +Block 0005 [ 52]: 88ba683a691878c6 +Block 0005 [ 53]: fede06e5c3bba35d +Block 0005 [ 54]: 233bf8dd96537fcd +Block 0005 [ 55]: 206f746116d7f2fe +Block 0005 [ 56]: 5271fbcfcaaae79e +Block 0005 [ 57]: acd38e85d5866021 +Block 0005 [ 58]: f9288fc3bfac49e6 +Block 0005 [ 59]: 79152b6b2eba8650 +Block 0005 [ 60]: 59a68943df8275e3 +Block 0005 [ 61]: 353694a518fdc5f8 +Block 0005 [ 62]: f8f0c9633cdc7981 +Block 0005 [ 63]: fb863297e68449db +Block 0005 [ 64]: ed977fcc8d1753ee +Block 0005 [ 65]: 812a3620c5954450 +Block 0005 [ 66]: e0387dabb56ef298 +Block 0005 [ 67]: 8009724bfa5dc0a7 +Block 0005 [ 68]: eee72aba6a6981bd +Block 0005 [ 69]: d6c66556c7982a51 +Block 0005 [ 70]: 1dbeb7ef05b9af0a +Block 0005 [ 71]: 3ac6cb726b5c73a8 +Block 0005 [ 72]: 2fab5ab0cc5997cf +Block 0005 [ 73]: 01006d1c447bb1e4 +Block 0005 [ 74]: 9479fcd0179a3dda +Block 0005 [ 75]: e43035ac067168c9 +Block 0005 [ 76]: 0e85b3d737226573 +Block 0005 [ 77]: b837e5a0e5a53abd +Block 0005 [ 78]: fe771479539c1c89 +Block 0005 [ 79]: 4eddd82075211cf6 +Block 0005 [ 80]: 3c6bb423e7ae496e +Block 0005 [ 81]: 531fb5cf7a66ab9a +Block 0005 [ 82]: 7f0c1e54ce41f6a9 +Block 0005 [ 83]: e44c93d2903de35e +Block 0005 [ 84]: e283572bb36042c3 +Block 0005 [ 85]: 48e05314b53e3a1d +Block 0005 [ 86]: c70ae3facad90bd8 +Block 0005 [ 87]: f7eb9795516c8aea +Block 0005 [ 88]: a9d51ea53fb7924f +Block 0005 [ 89]: a57400f858ed1a7b +Block 0005 [ 90]: ae17e7e53c36bdfb +Block 0005 [ 91]: 2be1ebc515e4c8ac +Block 0005 [ 92]: c6a75341f60ffa74 +Block 0005 [ 93]: 7fc9ae81f5cc2d1e +Block 0005 [ 94]: a9649bda41f37a2e +Block 0005 [ 95]: 3064212b87faf4a0 +Block 0005 [ 96]: 36ed3a9ed060e28f +Block 0005 [ 97]: cc3270a31fe515ca +Block 0005 [ 98]: 007183ca10e9e347 +Block 0005 [ 99]: ebab95c5a38ca512 +Block 0005 [100]: 616f7791bf38526a +Block 0005 [101]: 09cd415bc99fe122 +Block 0005 [102]: 0d91db2b5019ab35 +Block 0005 [103]: 0af30e6c4d5df4fe +Block 0005 [104]: d70f046467e13eb1 +Block 0005 [105]: 400d8ffbaedafe7e +Block 0005 [106]: 1f1f784f3160475f +Block 0005 [107]: 06ab9a4525d06e64 +Block 0005 [108]: 94742662a6e3cf77 +Block 0005 [109]: fc8c036aae7ccdbc +Block 0005 [110]: b56943232f6f229f +Block 0005 [111]: 3097ca2857f1c581 +Block 0005 [112]: da13102ef8466c04 +Block 0005 [113]: 191606c8d1d9841b +Block 0005 [114]: da7eb6f5863dd3ec +Block 0005 [115]: 1c5b95b054389563 +Block 0005 [116]: 26e0c33221d98a92 +Block 0005 [117]: 89a4f59ce9c97e71 +Block 0005 [118]: b809de06baa73578 +Block 0005 [119]: 6928a344f6bdcb28 +Block 0005 [120]: f998ade4988f120a +Block 0005 [121]: 0a6a9628d3dc7d99 +Block 0005 [122]: db07326bfcb54303 +Block 0005 [123]: 90c6cc27b5a77e17 +Block 0005 [124]: a7681add7323eca3 +Block 0005 [125]: a51c7ba17966d7e5 +Block 0005 [126]: 14a6283d83fabc6d +Block 0005 [127]: 584b27da48ba5899 +Block 0006 [ 0]: 2a64800c5487eab2 +Block 0006 [ 1]: 0bbe7d78e8791b55 +Block 0006 [ 2]: e6a143d1ab8b7b33 +Block 0006 [ 3]: ce93fb3c45c7443e +Block 0006 [ 4]: 10bfc25e34411ee8 +Block 0006 [ 5]: 2d5786d8bf589d5d +Block 0006 [ 6]: 1f8aeedd5b310f90 +Block 0006 [ 7]: 9ddbae1650fd61cd +Block 0006 [ 8]: 2fcf25ecaa72b648 +Block 0006 [ 9]: 4605e3f83638bc92 +Block 0006 [ 10]: 63fc5a831158a3c8 +Block 0006 [ 11]: 9431f1ed7556ece6 +Block 0006 [ 12]: a90f7eaafbac597f +Block 0006 [ 13]: f419db68c98b63af +Block 0006 [ 14]: 16a63bda59843e82 +Block 0006 [ 15]: 4a81a3dc88c84a66 +Block 0006 [ 16]: 90218025c0709f55 +Block 0006 [ 17]: a3f055b0a64e7826 +Block 0006 [ 18]: 8a814617fed0de21 +Block 0006 [ 19]: b32bdca9f00f7ae9 +Block 0006 [ 20]: 95aa9d629f4ed584 +Block 0006 [ 21]: 975350c26848cc2a +Block 0006 [ 22]: 3466b4991d492d30 +Block 0006 [ 23]: b5a3be561cde3612 +Block 0006 [ 24]: 7756124275a76154 +Block 0006 [ 25]: 49fa854f823ba873 +Block 0006 [ 26]: 4a2e0caa9712712e +Block 0006 [ 27]: 4cc6115574357b8f +Block 0006 [ 28]: 726dd8a92ff4733c +Block 0006 [ 29]: 687da442592f16a0 +Block 0006 [ 30]: 465daa3b6227c2f0 +Block 0006 [ 31]: 70345f239134961f +Block 0006 [ 32]: 93e4d66cf4241219 +Block 0006 [ 33]: f5aa4517e4562711 +Block 0006 [ 34]: 4444b64467a42d3b +Block 0006 [ 35]: 60b1f0ee9c363d65 +Block 0006 [ 36]: 7fa2479e123a67bf +Block 0006 [ 37]: bdeccba4bd322330 +Block 0006 [ 38]: 9cddff99f7042194 +Block 0006 [ 39]: 1255bfb92429d58e +Block 0006 [ 40]: 973a6877ecba92e1 +Block 0006 [ 41]: d22760276a21f9e6 +Block 0006 [ 42]: e3cbb4fb39655c00 +Block 0006 [ 43]: 6e1d33fbaca85766 +Block 0006 [ 44]: 9a800276744f8d6a +Block 0006 [ 45]: 8d0438d86a3f81db +Block 0006 [ 46]: ccdf247b55ccbd75 +Block 0006 [ 47]: aad33246518c0867 +Block 0006 [ 48]: d973e214a5dc1cf0 +Block 0006 [ 49]: 2c91065b5ab54743 +Block 0006 [ 50]: 091087b3e2a08216 +Block 0006 [ 51]: 30791badfa9890a5 +Block 0006 [ 52]: 62313b92c720912d +Block 0006 [ 53]: 7088235adf696700 +Block 0006 [ 54]: 52f03c4478e57e2e +Block 0006 [ 55]: 674263a7cc168cd3 +Block 0006 [ 56]: 450cab3338ebcafe +Block 0006 [ 57]: 1c86fcc8b6e9d2e7 +Block 0006 [ 58]: 9a3a7830220d6438 +Block 0006 [ 59]: 549e8d6e9749ece1 +Block 0006 [ 60]: 88ea236eed27143e +Block 0006 [ 61]: 3c0655d2f401e316 +Block 0006 [ 62]: cbc8a061330b6c63 +Block 0006 [ 63]: ce24d3dfe441fbce +Block 0006 [ 64]: 3506770825bb2ff8 +Block 0006 [ 65]: e6b01a6305481a92 +Block 0006 [ 66]: 20588369cbb512ad +Block 0006 [ 67]: 2213a5633d8e0647 +Block 0006 [ 68]: 9bb32b48673b5798 +Block 0006 [ 69]: ea2fb93e9b591ecb +Block 0006 [ 70]: 00b19e24edf72a78 +Block 0006 [ 71]: 6a3d3d8108e22084 +Block 0006 [ 72]: b725028aed7ae3c3 +Block 0006 [ 73]: bc3369b7f2b43268 +Block 0006 [ 74]: 59c97d54baba82c4 +Block 0006 [ 75]: 0fe70407db1d2ba8 +Block 0006 [ 76]: cedfed90946c12ea +Block 0006 [ 77]: e8b302ab9870454b +Block 0006 [ 78]: 9425e2a143c7796b +Block 0006 [ 79]: d3c73764a8ba8779 +Block 0006 [ 80]: 1abb5199656d79c2 +Block 0006 [ 81]: abe611198bf39091 +Block 0006 [ 82]: ea770a7acf0f8dff +Block 0006 [ 83]: 31939c4a98849740 +Block 0006 [ 84]: 336d0dfecd7680e4 +Block 0006 [ 85]: 89fc6ca46752584d +Block 0006 [ 86]: 9fcee800a2106f67 +Block 0006 [ 87]: 7cf89434037d523f +Block 0006 [ 88]: 1f3e0d1299972f00 +Block 0006 [ 89]: 06e93a81e91c6e20 +Block 0006 [ 90]: d2c72df7d0b4ab95 +Block 0006 [ 91]: b110bdcf9a586775 +Block 0006 [ 92]: 813dadde4b30fa89 +Block 0006 [ 93]: db80f76e630d57cb +Block 0006 [ 94]: 602148fcb776b5ee +Block 0006 [ 95]: f1de2acbe6ff5cc5 +Block 0006 [ 96]: 5cf779b56f544cbe +Block 0006 [ 97]: 517edbe4f764fa33 +Block 0006 [ 98]: 3b5962d26315a1c1 +Block 0006 [ 99]: 15132f4f65ed2b57 +Block 0006 [100]: 2cafb09101715abb +Block 0006 [101]: 24dc4c76915eb435 +Block 0006 [102]: 1cde78f968f5010b +Block 0006 [103]: 4a75e687c0e5addb +Block 0006 [104]: 2f4a7597b54a2108 +Block 0006 [105]: 92e11114a0a5b310 +Block 0006 [106]: 4081de32dda7c0c4 +Block 0006 [107]: 9a7eaefebd1be3a1 +Block 0006 [108]: e13f144ac34f24f8 +Block 0006 [109]: dfb987c2a58a6a77 +Block 0006 [110]: ac923f395dad20e9 +Block 0006 [111]: 5fe73860f784ff60 +Block 0006 [112]: 073a06f8b4645382 +Block 0006 [113]: d21dd239689f7774 +Block 0006 [114]: adbed6f36c5dc450 +Block 0006 [115]: 09fe2f54e53f957c +Block 0006 [116]: 03f20be6777b28c8 +Block 0006 [117]: 2ac305f861ae2328 +Block 0006 [118]: 010adf7244a13818 +Block 0006 [119]: f05617a0eddcdef9 +Block 0006 [120]: 176ec1e4b3ae2bc9 +Block 0006 [121]: 49711ed542b61a0c +Block 0006 [122]: 6ff51b60fbe95318 +Block 0006 [123]: ffbe244c9716d1f4 +Block 0006 [124]: ca3bc1d5d9a3fbde +Block 0006 [125]: 9e2baedc2994282d +Block 0006 [126]: f6904d88ad361783 +Block 0006 [127]: 4d18f37dff245cc9 +Block 0007 [ 0]: 08608d905459ab8f +Block 0007 [ 1]: 1511828c58cb7034 +Block 0007 [ 2]: f86b4d6c64eca18e +Block 0007 [ 3]: 910dfd16115bfb3d +Block 0007 [ 4]: ca995462cd7af35e +Block 0007 [ 5]: b534a28406293927 +Block 0007 [ 6]: 1f68b528fa0c341f +Block 0007 [ 7]: b71403d04beb1023 +Block 0007 [ 8]: 21d143863c913455 +Block 0007 [ 9]: 397b158ee9f2145a +Block 0007 [ 10]: 47c50637ac89043d +Block 0007 [ 11]: 24aafe85e6a98baa +Block 0007 [ 12]: f1c5bfb9f0edeba9 +Block 0007 [ 13]: 1c39dfe2091acdb7 +Block 0007 [ 14]: 1f98012686c7998b +Block 0007 [ 15]: e573b35664f125a2 +Block 0007 [ 16]: 41ce6387c3e14737 +Block 0007 [ 17]: ce201b6c25da8642 +Block 0007 [ 18]: 9c9485712de6749e +Block 0007 [ 19]: 4d3a0bf96ca9ca6f +Block 0007 [ 20]: cd4fa04baa256fa7 +Block 0007 [ 21]: 6cd2937c55e5014e +Block 0007 [ 22]: cb8094a12bc4c1f1 +Block 0007 [ 23]: 7fc7ab4a85360e65 +Block 0007 [ 24]: 15abc9339bd24b42 +Block 0007 [ 25]: db40bb117871eeb9 +Block 0007 [ 26]: 018b1e3d8797c114 +Block 0007 [ 27]: 443d81d72040af1f +Block 0007 [ 28]: 72839cad763233e5 +Block 0007 [ 29]: 36d144ac4578ff44 +Block 0007 [ 30]: 63550c21a7bb87ce +Block 0007 [ 31]: 11a2bf477a1047d7 +Block 0007 [ 32]: 62b98316a7cab0ed +Block 0007 [ 33]: ef19b4e1fa47ba2a +Block 0007 [ 34]: 8e4f5c797d9f4a5e +Block 0007 [ 35]: fb00bb2ba50c8e4a +Block 0007 [ 36]: 01d2a7386d887c79 +Block 0007 [ 37]: 038dc5d5b2c8f5bc +Block 0007 [ 38]: 7a209db9e4f51364 +Block 0007 [ 39]: ba2a35dba5398ca7 +Block 0007 [ 40]: 6cba5fff356d9204 +Block 0007 [ 41]: c436134c5ebd356c +Block 0007 [ 42]: 1f6d8f881c02f0c8 +Block 0007 [ 43]: 79f9578b66208cba +Block 0007 [ 44]: 883185e36262f210 +Block 0007 [ 45]: 38176e84f5759211 +Block 0007 [ 46]: 8b43fd09a06fd161 +Block 0007 [ 47]: 6b9f93a341204534 +Block 0007 [ 48]: 4864822e6186c325 +Block 0007 [ 49]: bbd10df9fbc66070 +Block 0007 [ 50]: f0a23fc17d85b8f3 +Block 0007 [ 51]: be609b77f183932b +Block 0007 [ 52]: 6299e15b8a2b4009 +Block 0007 [ 53]: d1df320b1814ecce +Block 0007 [ 54]: f88f9bc47a139371 +Block 0007 [ 55]: c6a533a5162809c7 +Block 0007 [ 56]: 22681af809918410 +Block 0007 [ 57]: 9f3fd2b6df45c0f6 +Block 0007 [ 58]: 3788af79005ce204 +Block 0007 [ 59]: 2551096b7e3e19c6 +Block 0007 [ 60]: e235c16d902a1fd6 +Block 0007 [ 61]: 0ba2daf3304459cd +Block 0007 [ 62]: 9e89013d8084f438 +Block 0007 [ 63]: 0ebd56ba7c464c74 +Block 0007 [ 64]: d941bf430957620a +Block 0007 [ 65]: d199fa7b0fc1fd73 +Block 0007 [ 66]: eb12abb0b8c3b518 +Block 0007 [ 67]: 79d00813cd6fa842 +Block 0007 [ 68]: a3b5710cae3cdb38 +Block 0007 [ 69]: 97e08b6907ef3aed +Block 0007 [ 70]: 10aa67cb010f8b7e +Block 0007 [ 71]: 006c99f1d172a5b8 +Block 0007 [ 72]: e8eedd0b54d5912a +Block 0007 [ 73]: d3ad4a66fc9bc685 +Block 0007 [ 74]: 04250ff0ff18d510 +Block 0007 [ 75]: 28aa693c71ea9463 +Block 0007 [ 76]: 01cad69143959494 +Block 0007 [ 77]: 0fe7efd57c37f1e5 +Block 0007 [ 78]: 220ee298dd71cc97 +Block 0007 [ 79]: f1ad80c0364ebea2 +Block 0007 [ 80]: b28b619e39a54e73 +Block 0007 [ 81]: f352f9ec4e3cf0c9 +Block 0007 [ 82]: 8be9b61e4ef0ae13 +Block 0007 [ 83]: 17958922c5e6a5ec +Block 0007 [ 84]: 3e950262449ea946 +Block 0007 [ 85]: a589af9c99c64ee1 +Block 0007 [ 86]: cfd47d0f5355f4bd +Block 0007 [ 87]: ea12164e719b9492 +Block 0007 [ 88]: 8ee249d8f1768e78 +Block 0007 [ 89]: 466bb597b18b234e +Block 0007 [ 90]: 42755351f0e5e364 +Block 0007 [ 91]: 77ca28c93d5e2d74 +Block 0007 [ 92]: 15518e8fdb4168fb +Block 0007 [ 93]: 7553eb89b7f7532c +Block 0007 [ 94]: 1aa86b8147238d58 +Block 0007 [ 95]: 1840fe7056c6aacc +Block 0007 [ 96]: 7f66b3a3d933cf77 +Block 0007 [ 97]: 91af6df904b8463d +Block 0007 [ 98]: 425c11f6d2454abc +Block 0007 [ 99]: 7de0228d7120af37 +Block 0007 [100]: a550e3769a171d93 +Block 0007 [101]: cb3c95affdf18fbd +Block 0007 [102]: 16771c9dcce5c43c +Block 0007 [103]: 137a85b35f26d6ee +Block 0007 [104]: 29f6df8f1d328a22 +Block 0007 [105]: 16356bd0f965c768 +Block 0007 [106]: c4c7d7f62b45b3f2 +Block 0007 [107]: 4145056ff2a545a6 +Block 0007 [108]: ff890a907437fdbf +Block 0007 [109]: 963f6c2a400ffa0a +Block 0007 [110]: 7ba3c82d26272ae7 +Block 0007 [111]: c670f2ad133b47b6 +Block 0007 [112]: 72b9358c18abf37f +Block 0007 [113]: 163ab2fffb5913ce +Block 0007 [114]: f19f2924afcf23c9 +Block 0007 [115]: 3a538ddf827a8f98 +Block 0007 [116]: 5e3d8b7b6b6c2dfe +Block 0007 [117]: ced14853d3425a5c +Block 0007 [118]: 644d427a8a85255c +Block 0007 [119]: 82b35f11e9d4e812 +Block 0007 [120]: 1a48a1724f09fbcc +Block 0007 [121]: 97bed0697f72c04a +Block 0007 [122]: b186b43c326a39a5 +Block 0007 [123]: ddf61b0a584c18e5 +Block 0007 [124]: dfee01b0cf4b1d1c +Block 0007 [125]: 657a9eb97cc78f0f +Block 0007 [126]: 73578c46ea1e8957 +Block 0007 [127]: 49f86e12151ef106 +Block 0008 [ 0]: 946f4172e48f45bc +Block 0008 [ 1]: 4fd6a390d54f945a +Block 0008 [ 2]: 8865c95f19e75cee +Block 0008 [ 3]: 12b699dae0b3ddd3 +Block 0008 [ 4]: ddd01143c698c3f2 +Block 0008 [ 5]: f35fc1ca1e31aca2 +Block 0008 [ 6]: 754e1f2cd4478969 +Block 0008 [ 7]: 685b4614b0e6c929 +Block 0008 [ 8]: e9bb122d275abae4 +Block 0008 [ 9]: 722dcbe15fe893e1 +Block 0008 [ 10]: 023d47887e8f9080 +Block 0008 [ 11]: 580112892d2b59d2 +Block 0008 [ 12]: 453e419fb2ae1043 +Block 0008 [ 13]: e5df64f679b21648 +Block 0008 [ 14]: 19af9f0e31b485dc +Block 0008 [ 15]: 056c9b976642c3b3 +Block 0008 [ 16]: df670b491825f243 +Block 0008 [ 17]: a5b9b53a9d497b95 +Block 0008 [ 18]: 93b566c5fed67bbc +Block 0008 [ 19]: 06163c7c0221eb12 +Block 0008 [ 20]: f7814aecb5ca06ed +Block 0008 [ 21]: 7dbf805ff7f9b301 +Block 0008 [ 22]: ebee1eb85c3c7e40 +Block 0008 [ 23]: a8c47e069b866088 +Block 0008 [ 24]: cc2880bf6f2f0e96 +Block 0008 [ 25]: f2cf558ee4c8dcaf +Block 0008 [ 26]: 8ce788341bbd111a +Block 0008 [ 27]: 7f2f058fb26c87bf +Block 0008 [ 28]: 12a14abafb6f4f38 +Block 0008 [ 29]: 48c255f582c25422 +Block 0008 [ 30]: 94dc2052aeac3a6f +Block 0008 [ 31]: dc2055d354763c6e +Block 0008 [ 32]: 4baa321da5cf5e9a +Block 0008 [ 33]: a661864923404713 +Block 0008 [ 34]: 1ebe736b08681b33 +Block 0008 [ 35]: d83e4d40de6eb189 +Block 0008 [ 36]: a266bf404b5d5c24 +Block 0008 [ 37]: 2fa6f24d6e092634 +Block 0008 [ 38]: acba046ce6646f82 +Block 0008 [ 39]: 1199b380d3e3f4e7 +Block 0008 [ 40]: 3154f06582957cbb +Block 0008 [ 41]: 3a0377b1ab9b4fc4 +Block 0008 [ 42]: 8dc110da76e9a284 +Block 0008 [ 43]: dd5e35a105c5946f +Block 0008 [ 44]: 9cb0ca79e28f3eaf +Block 0008 [ 45]: 283c6a6c3eb90ebd +Block 0008 [ 46]: 31f66b0292bcc039 +Block 0008 [ 47]: d41696b4fd10cfa8 +Block 0008 [ 48]: 00fe0d0c621b8f20 +Block 0008 [ 49]: 4becb6cc90553656 +Block 0008 [ 50]: d1b39d40b8f41f66 +Block 0008 [ 51]: f53bd48378d17266 +Block 0008 [ 52]: f6aa1c7e25b26c41 +Block 0008 [ 53]: 919e55fbae1380c8 +Block 0008 [ 54]: 5c3b125145acb6a6 +Block 0008 [ 55]: 7ab641db973f7140 +Block 0008 [ 56]: 8915b982cab617cd +Block 0008 [ 57]: d5a724abf6557eed +Block 0008 [ 58]: 42a99fa8123c786c +Block 0008 [ 59]: be5eaa49caf3160e +Block 0008 [ 60]: b374f4875813075f +Block 0008 [ 61]: 6a36ea7dfd371bb9 +Block 0008 [ 62]: 30eb208b42bd275e +Block 0008 [ 63]: 0443c2562a8b5f4e +Block 0008 [ 64]: 4a92f155246fc7e4 +Block 0008 [ 65]: 51333423de414931 +Block 0008 [ 66]: 93690a0e6bc3f988 +Block 0008 [ 67]: bbded4c9c730092a +Block 0008 [ 68]: 6a77514e8f4c6880 +Block 0008 [ 69]: ba63ec70fd3c2990 +Block 0008 [ 70]: 30107af2e79e0701 +Block 0008 [ 71]: 9e950d669014bfd3 +Block 0008 [ 72]: a7e7a792cd861334 +Block 0008 [ 73]: fd06832f385545af +Block 0008 [ 74]: 157fe306e5bef4e5 +Block 0008 [ 75]: 85b14138dc2c7322 +Block 0008 [ 76]: 194556fde93950d1 +Block 0008 [ 77]: ce5fc7d07a7bd136 +Block 0008 [ 78]: 8ee3180753b18551 +Block 0008 [ 79]: 948111f20c9e8750 +Block 0008 [ 80]: 850b46a1dba94e1a +Block 0008 [ 81]: d09e265fbf143a5e +Block 0008 [ 82]: e656195021c81e6c +Block 0008 [ 83]: b086545044b0fa3c +Block 0008 [ 84]: c8ebf0e1123a77e4 +Block 0008 [ 85]: bec9fc82189da93a +Block 0008 [ 86]: 4c8e0ef40119f4b8 +Block 0008 [ 87]: 04b99d99695a5a90 +Block 0008 [ 88]: dbdc22a5e4670bb0 +Block 0008 [ 89]: 55998f7982da27d7 +Block 0008 [ 90]: 39d7e7207e08e692 +Block 0008 [ 91]: 23897adcf2de8b18 +Block 0008 [ 92]: 8cc4c0cb5139bf2d +Block 0008 [ 93]: 2fda1e43e2fd09f3 +Block 0008 [ 94]: 9b079a6c80332e62 +Block 0008 [ 95]: a5e3689bb46ada0c +Block 0008 [ 96]: ab0283b1669ed18f +Block 0008 [ 97]: c41a2cfc00bb7e7b +Block 0008 [ 98]: 67513e080d26eaae +Block 0008 [ 99]: 722eb41b16a72fc0 +Block 0008 [100]: cb7323c1e23ddf5e +Block 0008 [101]: 1cd886fb9ec9ae72 +Block 0008 [102]: 91ba26c41e5524e8 +Block 0008 [103]: 7962eea4c76742bb +Block 0008 [104]: c99d15b6866d9227 +Block 0008 [105]: 4d653a74e6460512 +Block 0008 [106]: 4bc6875015fb2e86 +Block 0008 [107]: 9a002b9f8363c254 +Block 0008 [108]: 63fc83030f07c2b3 +Block 0008 [109]: cbccdb9b7a520112 +Block 0008 [110]: 9a309ce71918c835 +Block 0008 [111]: 1ad52732f060dd9b +Block 0008 [112]: f8a23f1db24f6873 +Block 0008 [113]: 589d7da3d7a98965 +Block 0008 [114]: 688ac7a334d9b1f8 +Block 0008 [115]: 32273c7cb982809f +Block 0008 [116]: 1092db0c6e60e72d +Block 0008 [117]: fdfcce143a3a4316 +Block 0008 [118]: 7f57fde95e5fe647 +Block 0008 [119]: c32cc72f104f110e +Block 0008 [120]: b586a6c4bef3aeda +Block 0008 [121]: 51fd5b6b873c9d93 +Block 0008 [122]: 98bdb34ea394faff +Block 0008 [123]: f203ac855a3cf9b0 +Block 0008 [124]: 1ed469c0614791eb +Block 0008 [125]: 9c66a82bdb1086a8 +Block 0008 [126]: d5fce0f666b9fbf4 +Block 0008 [127]: b5240fccb0474593 +Block 0009 [ 0]: f71d7ac1b31d0c03 +Block 0009 [ 1]: 36fa1fc6951a7721 +Block 0009 [ 2]: b07b4cbe51b81815 +Block 0009 [ 3]: aa592611faa7919f +Block 0009 [ 4]: e9ffefb063d7fb93 +Block 0009 [ 5]: 64d095d28ffd4ce5 +Block 0009 [ 6]: 426b82d6b296bdd4 +Block 0009 [ 7]: 36f597f7872bbcad +Block 0009 [ 8]: 8c67a5d17176ca0a +Block 0009 [ 9]: 009c72d087e528a1 +Block 0009 [ 10]: 45c5258429ffa95c +Block 0009 [ 11]: 041138902f445757 +Block 0009 [ 12]: e5df17e7b58ad6f5 +Block 0009 [ 13]: f77248f48fdf93f7 +Block 0009 [ 14]: 2ccd21f49fdbf5f3 +Block 0009 [ 15]: 868eb9581ad8bf6a +Block 0009 [ 16]: 7d9886dd8b20f0a5 +Block 0009 [ 17]: f1ba13572e7ce9ce +Block 0009 [ 18]: f948533dd4c66c0a +Block 0009 [ 19]: 57beec10df13ae28 +Block 0009 [ 20]: 6814a2ab7a2333bd +Block 0009 [ 21]: c8a582737a34001f +Block 0009 [ 22]: baf3cd295d2b578a +Block 0009 [ 23]: ff97f37cb11c3bb6 +Block 0009 [ 24]: ff7086083e75499f +Block 0009 [ 25]: 98a45ac01d889f68 +Block 0009 [ 26]: 00c4213dcebd6abb +Block 0009 [ 27]: 224554dbd2866552 +Block 0009 [ 28]: 84172c50092aecc2 +Block 0009 [ 29]: 0e7cc7829edd193d +Block 0009 [ 30]: ffbd59d32a3e1ccd +Block 0009 [ 31]: 3fea118182ed825d +Block 0009 [ 32]: b177558628cb6ff0 +Block 0009 [ 33]: ce032e12a93a2858 +Block 0009 [ 34]: 9a80ee26047468c1 +Block 0009 [ 35]: 9558d50a7013d04b +Block 0009 [ 36]: 7d03afab6ba77a9f +Block 0009 [ 37]: 0571cb3f95cb4f8e +Block 0009 [ 38]: 3efadf43d1515bbd +Block 0009 [ 39]: d295f20ebaea1299 +Block 0009 [ 40]: d952805bfc5f5522 +Block 0009 [ 41]: 8456b9125f950b3b +Block 0009 [ 42]: caeba582f5b9cfad +Block 0009 [ 43]: 8cf13134eff66040 +Block 0009 [ 44]: d3a4f52954197a2c +Block 0009 [ 45]: a812afdce439ff9e +Block 0009 [ 46]: 2aa4e9f9b348c5c3 +Block 0009 [ 47]: 1705ece947e35bab +Block 0009 [ 48]: 7f7397aa223f771b +Block 0009 [ 49]: fce2f4b15034ab54 +Block 0009 [ 50]: b1d69da4139bdbd8 +Block 0009 [ 51]: f67e6b188989fbe8 +Block 0009 [ 52]: d125a99b2095a29d +Block 0009 [ 53]: 9d6e470ec6c25b36 +Block 0009 [ 54]: 593b160d49e18c79 +Block 0009 [ 55]: ed6025de9776525e +Block 0009 [ 56]: 5ac3eee54aae2a66 +Block 0009 [ 57]: 5a1638b2cbdada77 +Block 0009 [ 58]: 156cd95ddfad2d28 +Block 0009 [ 59]: d204813e7b31cb39 +Block 0009 [ 60]: d4103b3f53448bed +Block 0009 [ 61]: 0c9995ac4f2738a2 +Block 0009 [ 62]: d2594d28f9c96d9c +Block 0009 [ 63]: 5bc9e9ea7845875f +Block 0009 [ 64]: 09c43be218bf86cc +Block 0009 [ 65]: c27f3f6dc8e0c8cc +Block 0009 [ 66]: c66918b7a291eb26 +Block 0009 [ 67]: b2a8f2f585ec2dae +Block 0009 [ 68]: 823f44a98b3a53df +Block 0009 [ 69]: 4d341334a6a465af +Block 0009 [ 70]: 75bee2f35122ae8e +Block 0009 [ 71]: 06f62f8c153e04ba +Block 0009 [ 72]: 802b3ff14a2babcd +Block 0009 [ 73]: 3323648a36eae7aa +Block 0009 [ 74]: 94b9cd482286815b +Block 0009 [ 75]: 67a61292a4e88710 +Block 0009 [ 76]: 8b9931e1b76cc41e +Block 0009 [ 77]: cf8d25db33f394aa +Block 0009 [ 78]: aafd87d7ef762aa9 +Block 0009 [ 79]: 3185333e28669e62 +Block 0009 [ 80]: b4ea67c36b38149c +Block 0009 [ 81]: e0a1000041058445 +Block 0009 [ 82]: 1362ecd144a7e52c +Block 0009 [ 83]: 049dfe5437183e02 +Block 0009 [ 84]: eb6e27e92a174754 +Block 0009 [ 85]: 595fbc74a2ef367f +Block 0009 [ 86]: 9a72a7c3f1ee3e84 +Block 0009 [ 87]: e9a6bcecc3f22d81 +Block 0009 [ 88]: 9347bcd9fdf576c5 +Block 0009 [ 89]: 1f7c38ff13ef70a7 +Block 0009 [ 90]: 2d274d7abcafd26c +Block 0009 [ 91]: 447ca88566a2e3f8 +Block 0009 [ 92]: 4e5711ab025a6c83 +Block 0009 [ 93]: 9aaf73a660580ec6 +Block 0009 [ 94]: d1ebf9c02c730018 +Block 0009 [ 95]: 29c443177aa901ec +Block 0009 [ 96]: 16c3dfdb779b9b0d +Block 0009 [ 97]: ee249c54b6696abb +Block 0009 [ 98]: 69547342e8b883c8 +Block 0009 [ 99]: bd8bd8373c27cbac +Block 0009 [100]: 04fc66d6d9746631 +Block 0009 [101]: fb13da4119808ae9 +Block 0009 [102]: 8bc9611f01757e03 +Block 0009 [103]: ec43bd9892f5a8f1 +Block 0009 [104]: b613e812c583a1e5 +Block 0009 [105]: 286cf5d1233abbdf +Block 0009 [106]: 18fcc7aea4a0bd0c +Block 0009 [107]: 373ce49dd8d1f90d +Block 0009 [108]: d55e507149c98c70 +Block 0009 [109]: 742ee9093356cbe0 +Block 0009 [110]: c4e5b39c1d5bad53 +Block 0009 [111]: 8c9982400af91fcf +Block 0009 [112]: e09dcaace809588a +Block 0009 [113]: aeff10b1b2894146 +Block 0009 [114]: 726fceb7fbc3f85e +Block 0009 [115]: 31d37b1028d0ae76 +Block 0009 [116]: 1275fc397d70d627 +Block 0009 [117]: c67f66396627ace7 +Block 0009 [118]: 7f90a6cdf3bdfdce +Block 0009 [119]: 0b76c955b3916250 +Block 0009 [120]: 29204a35ad80e350 +Block 0009 [121]: 11c718719db93a70 +Block 0009 [122]: 26538a9df69b4dfc +Block 0009 [123]: 476356b8a4742fc4 +Block 0009 [124]: 17c1abfa8181bb99 +Block 0009 [125]: 3a4c58a598605a4a +Block 0009 [126]: d04b9c190601d94c +Block 0009 [127]: 4955d571b6b302b8 +Block 0010 [ 0]: b993c1bd5f7029d0 +Block 0010 [ 1]: b335e227fdf8ef5f +Block 0010 [ 2]: 9237fba47420f671 +Block 0010 [ 3]: a126898dbeec57ed +Block 0010 [ 4]: 4bca4ce84aa86b25 +Block 0010 [ 5]: c038226b443c4b80 +Block 0010 [ 6]: 6f53e9bec75433a4 +Block 0010 [ 7]: c501a2f82d230b2e +Block 0010 [ 8]: e20cbbc1cdbb3fde +Block 0010 [ 9]: 7e74310ac3390e93 +Block 0010 [ 10]: 607d4856e41e6770 +Block 0010 [ 11]: 0d873576fe594cb9 +Block 0010 [ 12]: 466a5cc0b9dcb10b +Block 0010 [ 13]: 5ac4ae018e1244b6 +Block 0010 [ 14]: 6f5ea0c731cb993f +Block 0010 [ 15]: 8ae0464499a1a18b +Block 0010 [ 16]: 5786d33860ddc6aa +Block 0010 [ 17]: fbc2a7fee48c5262 +Block 0010 [ 18]: df7df9334ecc008b +Block 0010 [ 19]: 3c12389cf675c070 +Block 0010 [ 20]: 63b680dd695239e1 +Block 0010 [ 21]: 82b6b20c15633ecd +Block 0010 [ 22]: 72a8465d6fec39ae +Block 0010 [ 23]: a2e32e750d9d73d5 +Block 0010 [ 24]: bd50d62e43faed3c +Block 0010 [ 25]: d24d65fa3b7b739e +Block 0010 [ 26]: 7a13fff894085e72 +Block 0010 [ 27]: e78d115cfbe3e775 +Block 0010 [ 28]: 4ddccccaccf56fd4 +Block 0010 [ 29]: 5d4630d9d429597d +Block 0010 [ 30]: aff631f79f7cd167 +Block 0010 [ 31]: 61123ce2e2e19e76 +Block 0010 [ 32]: c493743bc954fc27 +Block 0010 [ 33]: 0cda5a79ca021b0b +Block 0010 [ 34]: f471cf3d3f0732da +Block 0010 [ 35]: aa21229ac8b02a9f +Block 0010 [ 36]: c5d1681941b6c405 +Block 0010 [ 37]: 7c4cde8e970cf13d +Block 0010 [ 38]: d9b7771cee19b845 +Block 0010 [ 39]: 2e4fc10fff00cd49 +Block 0010 [ 40]: 33ed5782df2e21ea +Block 0010 [ 41]: 93dcf1fd021b2823 +Block 0010 [ 42]: c40e0f1eedd64802 +Block 0010 [ 43]: 864794e39416a59d +Block 0010 [ 44]: e3b59bbb7918d16b +Block 0010 [ 45]: 0835a0d6bd7c4736 +Block 0010 [ 46]: cb3a4d7a2c7258d6 +Block 0010 [ 47]: d1d7a03d5b4a3e40 +Block 0010 [ 48]: 0085b98ff324f040 +Block 0010 [ 49]: 8d90ef0683b47f76 +Block 0010 [ 50]: babed82c6e950da3 +Block 0010 [ 51]: a521d85c113afa18 +Block 0010 [ 52]: e894e2a0970c9369 +Block 0010 [ 53]: cce9bdabfeb53b33 +Block 0010 [ 54]: 082a4efdfe16a2d1 +Block 0010 [ 55]: f8051ce466344f8d +Block 0010 [ 56]: ea14a2998800d044 +Block 0010 [ 57]: dda2b7fac4d942fd +Block 0010 [ 58]: 30eb10a454538f7c +Block 0010 [ 59]: c774e4c9906a7024 +Block 0010 [ 60]: 54f054ebfc467c29 +Block 0010 [ 61]: 8bf568d3a3c5fd99 +Block 0010 [ 62]: 7b399a300a0b9cc5 +Block 0010 [ 63]: 3ab29955ed1ac168 +Block 0010 [ 64]: 442c5ac818b0487f +Block 0010 [ 65]: 1b0763e5c951a8c7 +Block 0010 [ 66]: 1d9be376de427fc1 +Block 0010 [ 67]: de496feb7dc80268 +Block 0010 [ 68]: e62a4cdfa2bafa48 +Block 0010 [ 69]: da8322a3ed887c0b +Block 0010 [ 70]: 85a1645342749fbf +Block 0010 [ 71]: 7ce2a7496bc24cf6 +Block 0010 [ 72]: 6e8921ed63828c7f +Block 0010 [ 73]: 8237828d04979c41 +Block 0010 [ 74]: a80bc40b91f7d49a +Block 0010 [ 75]: 6e6a295d6e35b945 +Block 0010 [ 76]: 89e7346006fa765a +Block 0010 [ 77]: 669c918f21489879 +Block 0010 [ 78]: 8920540f8131241f +Block 0010 [ 79]: 4945d49ed827838b +Block 0010 [ 80]: 332e127fabb53df8 +Block 0010 [ 81]: 7d21956c64b39744 +Block 0010 [ 82]: 5773e3c42b68bfa4 +Block 0010 [ 83]: 18e24882ca88acb9 +Block 0010 [ 84]: 9daf7d7818505288 +Block 0010 [ 85]: a082a00e4cafa716 +Block 0010 [ 86]: 26d4a2d3df30febb +Block 0010 [ 87]: 9580317f69598ad6 +Block 0010 [ 88]: 7484c89ffe4b2eef +Block 0010 [ 89]: b8617bf6a8e210ad +Block 0010 [ 90]: 730e1d6b1b3526d5 +Block 0010 [ 91]: 07288bde84d4c8e3 +Block 0010 [ 92]: 9f5268a294e2adfc +Block 0010 [ 93]: 661bcbe84714c7c2 +Block 0010 [ 94]: 374431dc30ad551a +Block 0010 [ 95]: 77b23b931fe980e6 +Block 0010 [ 96]: 7c88f25c1256f646 +Block 0010 [ 97]: 59e2afc7421061dc +Block 0010 [ 98]: 05134ad1fd1939ce +Block 0010 [ 99]: d699e236278af73c +Block 0010 [100]: e3bce3ca0ad1bd89 +Block 0010 [101]: cab0b5500d334a45 +Block 0010 [102]: 39d1b45c25ccb8df +Block 0010 [103]: a3821ced65f2f532 +Block 0010 [104]: 41cf244e80d20bb3 +Block 0010 [105]: 9593af67ca6b8665 +Block 0010 [106]: c1f9e1e46f96689f +Block 0010 [107]: b6bdef4c8c84e74f +Block 0010 [108]: 94d40f31eaaa2e44 +Block 0010 [109]: bbec161350126a1a +Block 0010 [110]: 60b54428ddd5b5fe +Block 0010 [111]: 1d2a926c9ede4276 +Block 0010 [112]: d095c896f08970e5 +Block 0010 [113]: 0b8903eed5e169c7 +Block 0010 [114]: 28c8e70eae29763a +Block 0010 [115]: f1b2260d6d41e7ee +Block 0010 [116]: 126762a86c807865 +Block 0010 [117]: eaf3b1bd561d8a6c +Block 0010 [118]: cf6ac32eded6a9c1 +Block 0010 [119]: f039b2bcefc45b52 +Block 0010 [120]: c93b02aa4366b822 +Block 0010 [121]: f68b6515d2589d6c +Block 0010 [122]: 230c8155563a5498 +Block 0010 [123]: 229abab769c2c232 +Block 0010 [124]: b7bab4bf507dd51c +Block 0010 [125]: 865b9289dbb02d72 +Block 0010 [126]: 8a3ffe783605f32b +Block 0010 [127]: 1edb7add047109a5 +Block 0011 [ 0]: 5fe2c3629fa3ee83 +Block 0011 [ 1]: b3d2beefbabce8ac +Block 0011 [ 2]: 72942fa98eec830c +Block 0011 [ 3]: 227ad56dfb1dfcbb +Block 0011 [ 4]: 64c0845d046c046b +Block 0011 [ 5]: 3f2c34f5b626488b +Block 0011 [ 6]: 4ebce1ad53d2f691 +Block 0011 [ 7]: aa5e798ff6600903 +Block 0011 [ 8]: c882e71490d159ee +Block 0011 [ 9]: 139b21b383b533b6 +Block 0011 [ 10]: 413204981bd82a87 +Block 0011 [ 11]: 36f87f9bddf156b0 +Block 0011 [ 12]: 22ea88710821972c +Block 0011 [ 13]: e8be47cfb4f1bde8 +Block 0011 [ 14]: b8b556041f484f9c +Block 0011 [ 15]: 66e82cc41de0d401 +Block 0011 [ 16]: bca8191ac28313bc +Block 0011 [ 17]: abb7463754f598bc +Block 0011 [ 18]: 5d7a40b1f8394347 +Block 0011 [ 19]: 927a3616b1c69ade +Block 0011 [ 20]: 476045d4c050649e +Block 0011 [ 21]: f8e3b38bd6919cd5 +Block 0011 [ 22]: 54e3eda0ad5ef065 +Block 0011 [ 23]: cf1f60f880e92a70 +Block 0011 [ 24]: 77ce0b66240f6bb3 +Block 0011 [ 25]: 5fccfa14a0aac40f +Block 0011 [ 26]: e92b36364de83bc2 +Block 0011 [ 27]: 2fac24203b29d455 +Block 0011 [ 28]: 1f59b91c3e8ce701 +Block 0011 [ 29]: f6325db0e6cf5db7 +Block 0011 [ 30]: cde857254c0d8753 +Block 0011 [ 31]: 270efe3a4d4383cf +Block 0011 [ 32]: 6fa171ad462e1d5f +Block 0011 [ 33]: 7f898ecf3127d9de +Block 0011 [ 34]: 395ff0b219c6fd34 +Block 0011 [ 35]: 8ce0d1368c66870e +Block 0011 [ 36]: 04e5aa8dd7049358 +Block 0011 [ 37]: 1c93fd6ce65f1517 +Block 0011 [ 38]: 7a4c941e71b3e0a7 +Block 0011 [ 39]: c6cf012a56968ade +Block 0011 [ 40]: e2f74e80ee223964 +Block 0011 [ 41]: d29e097677b886b3 +Block 0011 [ 42]: af5dd662ba49095b +Block 0011 [ 43]: 6978e6c06707d66c +Block 0011 [ 44]: b465f5b5226979d4 +Block 0011 [ 45]: 94fdf590ea8fff6e +Block 0011 [ 46]: fc00f5336bb3a35d +Block 0011 [ 47]: f1a63dd0547ac7d0 +Block 0011 [ 48]: 0b63794ae2fd4f9a +Block 0011 [ 49]: b5686907a46a9428 +Block 0011 [ 50]: e59fe5615f29bf23 +Block 0011 [ 51]: 33fafa9d750c4cc9 +Block 0011 [ 52]: 4fa3df448e6effbc +Block 0011 [ 53]: d8fd1d31e7daf2ef +Block 0011 [ 54]: 22eebb769680e792 +Block 0011 [ 55]: e812f157611f5675 +Block 0011 [ 56]: 93fedfe6bd369c49 +Block 0011 [ 57]: 59dc7eeb904773dd +Block 0011 [ 58]: a4b40ad32d554888 +Block 0011 [ 59]: 744d37f36abb0092 +Block 0011 [ 60]: 059214737176c6ba +Block 0011 [ 61]: 1a700fa9557eef5f +Block 0011 [ 62]: eca56e2d91882ba4 +Block 0011 [ 63]: 14f42776e4cf5381 +Block 0011 [ 64]: 44756fc06ec6c65c +Block 0011 [ 65]: 2fe700f9173ba95c +Block 0011 [ 66]: 1e0107f5209a8329 +Block 0011 [ 67]: b4c0f8a00d972eee +Block 0011 [ 68]: f180516da3569255 +Block 0011 [ 69]: ff000c7df6506db2 +Block 0011 [ 70]: c6771d7e25863436 +Block 0011 [ 71]: aae7b9969ec5b78d +Block 0011 [ 72]: bec55327abb230ce +Block 0011 [ 73]: b8a95311da085eef +Block 0011 [ 74]: 80a76344e94d37a6 +Block 0011 [ 75]: e7322b491ae64268 +Block 0011 [ 76]: 60b731f8b9bce8f5 +Block 0011 [ 77]: dcb8a5456a58e1b4 +Block 0011 [ 78]: f3c5081fd8222c9a +Block 0011 [ 79]: c821603c76a0a1a1 +Block 0011 [ 80]: 4246de6a30129f61 +Block 0011 [ 81]: a86b679c621e62bd +Block 0011 [ 82]: 2e726675015a9f66 +Block 0011 [ 83]: 6397c3c8d8b1a8ef +Block 0011 [ 84]: 8f7e51fdd1484e23 +Block 0011 [ 85]: 6fa5dce93186cdcd +Block 0011 [ 86]: ddca57f16e3ceea5 +Block 0011 [ 87]: 6c7c6df39e7f1011 +Block 0011 [ 88]: a4e2f226b52098e8 +Block 0011 [ 89]: 9559cebee47939c3 +Block 0011 [ 90]: b0c9f32b08a3ab5a +Block 0011 [ 91]: eea0d795a627fd1a +Block 0011 [ 92]: 448fc1ead715ad85 +Block 0011 [ 93]: d19610358c85ac0c +Block 0011 [ 94]: 62ee1eed08cb519c +Block 0011 [ 95]: 787ed35781df088b +Block 0011 [ 96]: 4f79006cc037761e +Block 0011 [ 97]: 4bc68ec57b36a9f7 +Block 0011 [ 98]: 9e74541e84cfa14e +Block 0011 [ 99]: 06d86aafd803d99b +Block 0011 [100]: 6e3eca30777d4653 +Block 0011 [101]: 69d1b2810057a1de +Block 0011 [102]: 2231841468d29508 +Block 0011 [103]: 6b30141f71aac157 +Block 0011 [104]: dbbf724568091549 +Block 0011 [105]: d8a9c58e4d894d80 +Block 0011 [106]: 43ff74eb372afdc5 +Block 0011 [107]: f42c4e3a8ac0c408 +Block 0011 [108]: b7c05437c026add9 +Block 0011 [109]: b31f94ec29d359f2 +Block 0011 [110]: 5e288d4c73af4bdb +Block 0011 [111]: 756a80665001aed3 +Block 0011 [112]: 736d66df99a2be76 +Block 0011 [113]: a606c036d92fcffe +Block 0011 [114]: cb37bd31ede4471a +Block 0011 [115]: ba27d12d88a27fe0 +Block 0011 [116]: 2f5873817e1c35de +Block 0011 [117]: 84e8bcb44320ef4f +Block 0011 [118]: b855efc385514b4b +Block 0011 [119]: 1c2fb55a05c6d53f +Block 0011 [120]: 64969aa359025900 +Block 0011 [121]: 1fae4a4302afbc5d +Block 0011 [122]: 82681cfa3cf9ceb7 +Block 0011 [123]: 60d5c0017e77004b +Block 0011 [124]: 5d6b52231aa6c2fc +Block 0011 [125]: 590d6387fc05be07 +Block 0011 [126]: 5ab275846b663589 +Block 0011 [127]: 6d63a6652c9780d1 +Block 0012 [ 0]: 5eb35b81bd053cc0 +Block 0012 [ 1]: 7641c90975633b66 +Block 0012 [ 2]: f8a2d4bd05fea682 +Block 0012 [ 3]: dbf53b206e11489c +Block 0012 [ 4]: c243472fca0f1d05 +Block 0012 [ 5]: f246293a97b52cd9 +Block 0012 [ 6]: 222860d28a78faee +Block 0012 [ 7]: aff4e84133704f8d +Block 0012 [ 8]: 0085dd170896441d +Block 0012 [ 9]: 6dd0efebc63d9a57 +Block 0012 [ 10]: 42fc1383e469732c +Block 0012 [ 11]: 20ec25037814bdbb +Block 0012 [ 12]: b8c240862f80a62d +Block 0012 [ 13]: af389ee2c0de45e3 +Block 0012 [ 14]: 9ede39da388711c5 +Block 0012 [ 15]: c988c927980074c4 +Block 0012 [ 16]: 42742d6879986b1a +Block 0012 [ 17]: 1cd69a0069e8b6d6 +Block 0012 [ 18]: c089f385e42a7554 +Block 0012 [ 19]: 93cd82acbefbe235 +Block 0012 [ 20]: 5d4d15930067eb4d +Block 0012 [ 21]: a0f32413740ccd14 +Block 0012 [ 22]: e8d285495c219573 +Block 0012 [ 23]: 6767ce984f856d11 +Block 0012 [ 24]: 6157243bb3276f9e +Block 0012 [ 25]: fe40efcb6d208003 +Block 0012 [ 26]: b089203e8d0bbe9e +Block 0012 [ 27]: 352ed22a2abeed77 +Block 0012 [ 28]: 9a283ee0cb62412f +Block 0012 [ 29]: af670ea81a83f914 +Block 0012 [ 30]: 8110d525c2cbf453 +Block 0012 [ 31]: 1fef517c56f77b24 +Block 0012 [ 32]: d4446f905d7f1e5c +Block 0012 [ 33]: 977e658395321308 +Block 0012 [ 34]: 3001f86c9432b412 +Block 0012 [ 35]: 062b559150d175b8 +Block 0012 [ 36]: 8d24f46cbd21f974 +Block 0012 [ 37]: 911a79204b56fd9b +Block 0012 [ 38]: 36d534094c932cd2 +Block 0012 [ 39]: c52abffaf521c660 +Block 0012 [ 40]: 01e338e319177a5a +Block 0012 [ 41]: bbfe5ed4bf00aca5 +Block 0012 [ 42]: c782e6aeb0a43c30 +Block 0012 [ 43]: b027e3d82037f5cc +Block 0012 [ 44]: 64a4103b744e4e94 +Block 0012 [ 45]: 9670a86aeb267168 +Block 0012 [ 46]: 6d82ef7ebc12d747 +Block 0012 [ 47]: c0ce445100e0814b +Block 0012 [ 48]: 3ebd68e5b7f8c349 +Block 0012 [ 49]: 62a4cd03600e4f0f +Block 0012 [ 50]: ed30bd78b1885ff0 +Block 0012 [ 51]: 0fd66bdd36d98a98 +Block 0012 [ 52]: 03abfc600e92f6c3 +Block 0012 [ 53]: c9696dbd2e2eba13 +Block 0012 [ 54]: cc14dc0fe7d114cc +Block 0012 [ 55]: e8ea18a97e82d90c +Block 0012 [ 56]: 0424e0fe0044c042 +Block 0012 [ 57]: ffae154a49dd9d01 +Block 0012 [ 58]: 6658a1ed74f08a8b +Block 0012 [ 59]: 248914e8d4de3743 +Block 0012 [ 60]: 23b1a8a054fc2dc9 +Block 0012 [ 61]: 54bb6b0f239a1202 +Block 0012 [ 62]: b26d8545b0b8d431 +Block 0012 [ 63]: 41029e4ba502397a +Block 0012 [ 64]: 421e06ec5441bcb2 +Block 0012 [ 65]: 1ba5b0ee439d2d63 +Block 0012 [ 66]: 2da3a807f3ff4323 +Block 0012 [ 67]: 2742b4c66c62189d +Block 0012 [ 68]: bd9d25027fc2314a +Block 0012 [ 69]: 66d3b6f9cbb56538 +Block 0012 [ 70]: d33c241653c83fe5 +Block 0012 [ 71]: 7ae3528f6e512592 +Block 0012 [ 72]: ef5a0296a28a43fd +Block 0012 [ 73]: a0edb71f2487989b +Block 0012 [ 74]: a4cb2cec23ed537c +Block 0012 [ 75]: b5f488772baa93eb +Block 0012 [ 76]: 49ca7fa7da5fdf94 +Block 0012 [ 77]: 888430579906b669 +Block 0012 [ 78]: c19fcbbe58ec7891 +Block 0012 [ 79]: aa6d5dfa8e7cb53e +Block 0012 [ 80]: 0615bb3755e4ddbb +Block 0012 [ 81]: 6a7f71b5130eab08 +Block 0012 [ 82]: 0ea866119ff0f0ea +Block 0012 [ 83]: 97830e7c4f50687b +Block 0012 [ 84]: 4bcb4a4a73359185 +Block 0012 [ 85]: 0f1ca64127e1448c +Block 0012 [ 86]: 2d16448bcc734e2f +Block 0012 [ 87]: 9ff24758d2990ee0 +Block 0012 [ 88]: 7cc84dfc8b738b71 +Block 0012 [ 89]: 9aa3f9947fb1f62d +Block 0012 [ 90]: 09354a98af66a3fe +Block 0012 [ 91]: 612103bfbda63484 +Block 0012 [ 92]: ab307f9b9f62e01b +Block 0012 [ 93]: ed837a895bb8b2d6 +Block 0012 [ 94]: 141d971b389f1d29 +Block 0012 [ 95]: bbba4eea3e13b193 +Block 0012 [ 96]: e3532479251d0b57 +Block 0012 [ 97]: 2c32b548cb6bf2ed +Block 0012 [ 98]: ed5ee29a68174778 +Block 0012 [ 99]: aa55d7b0274f0e31 +Block 0012 [100]: e4b5d717ba725392 +Block 0012 [101]: de42cbaad6431d7e +Block 0012 [102]: 860180f00221947b +Block 0012 [103]: 78472da3db1201a5 +Block 0012 [104]: b52ac1918c4c2ed7 +Block 0012 [105]: 17391fc4569e555c +Block 0012 [106]: 499819cf76e30f9b +Block 0012 [107]: a675cac605905f75 +Block 0012 [108]: 6a665ec6d7126dce +Block 0012 [109]: 4f94b37966787280 +Block 0012 [110]: de10b2867e5dbe38 +Block 0012 [111]: 832cbd205f28a0ea +Block 0012 [112]: 44e056fd2e9b0082 +Block 0012 [113]: 81855caf3d872ca9 +Block 0012 [114]: 54fe1974935fd3b9 +Block 0012 [115]: 68c029edb1ee47be +Block 0012 [116]: 0c79bbc7e8ac560f +Block 0012 [117]: 2656c97869498c44 +Block 0012 [118]: 58ca9f1682a82cff +Block 0012 [119]: 35232b69467d0037 +Block 0012 [120]: 7d4e47ee2c0cca0b +Block 0012 [121]: 808132432378c13c +Block 0012 [122]: 6fe35ab35928b42c +Block 0012 [123]: e5b761f541a98818 +Block 0012 [124]: debb7cca4239ab7d +Block 0012 [125]: d2c77542f359d6f4 +Block 0012 [126]: 6dee7cf3e7094763 +Block 0012 [127]: 412d341f4db85305 +Block 0013 [ 0]: c70920a92cb26ed9 +Block 0013 [ 1]: d9d1a305c3c4ab20 +Block 0013 [ 2]: 5e105d030521a722 +Block 0013 [ 3]: b699dcfc017a8eed +Block 0013 [ 4]: f186fb821a424d24 +Block 0013 [ 5]: 3cbdc486daf92b0b +Block 0013 [ 6]: 73ead930b6005763 +Block 0013 [ 7]: 369651d278a36f82 +Block 0013 [ 8]: 6b321d4426764d6d +Block 0013 [ 9]: 65359c09f4aa9130 +Block 0013 [ 10]: bac29a7788b63d81 +Block 0013 [ 11]: 6141dc0be16d635d +Block 0013 [ 12]: d71fe34cdb32c062 +Block 0013 [ 13]: 783373adad773100 +Block 0013 [ 14]: 623a786f866c4040 +Block 0013 [ 15]: f36347067043d854 +Block 0013 [ 16]: 30caf9b9782c9dfb +Block 0013 [ 17]: 61ca4437a6c3fde3 +Block 0013 [ 18]: f7187ef60eab8508 +Block 0013 [ 19]: 65246f0526f71516 +Block 0013 [ 20]: 7d487059b075eb12 +Block 0013 [ 21]: 5188536efc815a54 +Block 0013 [ 22]: 2d5101c366b1f784 +Block 0013 [ 23]: dcdb485cb186f0cd +Block 0013 [ 24]: 3252c1a7fd162804 +Block 0013 [ 25]: 433de6dac35f9057 +Block 0013 [ 26]: f95f0f0b42c73d69 +Block 0013 [ 27]: 67f3b675462b1dda +Block 0013 [ 28]: d39c71d2476e87ea +Block 0013 [ 29]: f652d879ced55160 +Block 0013 [ 30]: dde336e862764fdf +Block 0013 [ 31]: 6088281a6f50fbda +Block 0013 [ 32]: b852cf8a0737bd37 +Block 0013 [ 33]: 6263a7ac759c6f6f +Block 0013 [ 34]: 07eacff726a0e0c2 +Block 0013 [ 35]: c88b010fea77e722 +Block 0013 [ 36]: 957d644af7a1d16e +Block 0013 [ 37]: e14ff78741afe828 +Block 0013 [ 38]: a327f71f969be502 +Block 0013 [ 39]: 7de49f4e170813f4 +Block 0013 [ 40]: e2d814b3994b3fca +Block 0013 [ 41]: 1908fb9c157569bb +Block 0013 [ 42]: 976111c502a0f245 +Block 0013 [ 43]: 89cf1accc7dbfd36 +Block 0013 [ 44]: fc3de0f3e74f5c88 +Block 0013 [ 45]: 8a2959b9ecaaf303 +Block 0013 [ 46]: b933b20c6cc38c3b +Block 0013 [ 47]: 821d84298c43a930 +Block 0013 [ 48]: 3fff1ee1832c4e0a +Block 0013 [ 49]: d0f56311037d5f41 +Block 0013 [ 50]: 371028f135ed5c9e +Block 0013 [ 51]: 05d816f92a122587 +Block 0013 [ 52]: 95f0eb6798d608e7 +Block 0013 [ 53]: 80c91b584f0b03fc +Block 0013 [ 54]: 44d1a6ae6e195f06 +Block 0013 [ 55]: ce1a69c88ccfde9e +Block 0013 [ 56]: 55e6aa8a5921a608 +Block 0013 [ 57]: a9d857bfc24a2e17 +Block 0013 [ 58]: a4ab20a453ef665c +Block 0013 [ 59]: b9ea6bada03f6b71 +Block 0013 [ 60]: 093918f0708179c8 +Block 0013 [ 61]: 57224c2518e38f9d +Block 0013 [ 62]: 546a6137c5c52378 +Block 0013 [ 63]: cdab2811db1a5e0c +Block 0013 [ 64]: f69c38c0b38d90d3 +Block 0013 [ 65]: b6917c99e10d6f0a +Block 0013 [ 66]: f692ef24bd348ce5 +Block 0013 [ 67]: c0e6070792830b70 +Block 0013 [ 68]: 60cae1d8de0a398d +Block 0013 [ 69]: 3bcc56d30a556965 +Block 0013 [ 70]: c0f29dfeb7b5e34a +Block 0013 [ 71]: 2704f9c770be92bc +Block 0013 [ 72]: 00b3a71eacbebfab +Block 0013 [ 73]: 5b92d32543716583 +Block 0013 [ 74]: 7e24bb60453c2970 +Block 0013 [ 75]: 2df67c4143260c92 +Block 0013 [ 76]: c5fde8273c0137f7 +Block 0013 [ 77]: b0a7848eac665513 +Block 0013 [ 78]: 4ccb4516a016c07d +Block 0013 [ 79]: 60c02bf8de4f1bc3 +Block 0013 [ 80]: e8e6b622b3d9bfbb +Block 0013 [ 81]: 379e0403b68c16ca +Block 0013 [ 82]: f0971a9a29bc1c8b +Block 0013 [ 83]: b86253946474734d +Block 0013 [ 84]: f1abbc26aca6f49a +Block 0013 [ 85]: c1b54462f1ac893e +Block 0013 [ 86]: 5d524385f72433bb +Block 0013 [ 87]: 44453f44df1d2608 +Block 0013 [ 88]: a17c13e65c78dc86 +Block 0013 [ 89]: d920daf0f8abf0fa +Block 0013 [ 90]: 24d05fcfb4261ea7 +Block 0013 [ 91]: fe57e1c7dbd46e45 +Block 0013 [ 92]: e0cf1d36c1482a53 +Block 0013 [ 93]: 0099360275359288 +Block 0013 [ 94]: 875df94b517090c8 +Block 0013 [ 95]: 771125540ad7b6e0 +Block 0013 [ 96]: 658769481c9f2d91 +Block 0013 [ 97]: 8e96e8797fc2b335 +Block 0013 [ 98]: c117f6b6519475c6 +Block 0013 [ 99]: 30b95e0e37f7f933 +Block 0013 [100]: 55e73cb5fa5b4735 +Block 0013 [101]: 7ea0b7d4a9b76057 +Block 0013 [102]: 878a1c10e2d6523e +Block 0013 [103]: d675de48042f30fe +Block 0013 [104]: 17f3d868f1c5e8a3 +Block 0013 [105]: 3d341616c62ce828 +Block 0013 [106]: 268acb2a936b4cc3 +Block 0013 [107]: d1bf24d7d14d8894 +Block 0013 [108]: 75e5104aa5274d8f +Block 0013 [109]: fa23bc856604f803 +Block 0013 [110]: 79c3a14ed5cec597 +Block 0013 [111]: eaf01ffc019b86bd +Block 0013 [112]: 4b2f2e5888831da1 +Block 0013 [113]: 8097cfa74319e9a6 +Block 0013 [114]: d9d2a50cdda6e52c +Block 0013 [115]: 39f7e9e70a8fc338 +Block 0013 [116]: 00a53fba2c35f3d6 +Block 0013 [117]: 8c93edd0ff109ca1 +Block 0013 [118]: f6075da5089f6509 +Block 0013 [119]: bf06e904ef71e7b2 +Block 0013 [120]: c7052c3a08ac9384 +Block 0013 [121]: a283f90913024a36 +Block 0013 [122]: d1097e4b32547ab2 +Block 0013 [123]: 14f15ce9846360cf +Block 0013 [124]: e896c41d236001a5 +Block 0013 [125]: 28834b042100ffff +Block 0013 [126]: cd4684cbb6e07746 +Block 0013 [127]: 9e9e5138ae2447c6 +Block 0014 [ 0]: 464fe499fd4bc54a +Block 0014 [ 1]: 01ca27117a522b27 +Block 0014 [ 2]: cefb91b50a87ec01 +Block 0014 [ 3]: 0bd05a9a7af64404 +Block 0014 [ 4]: 41514da378231234 +Block 0014 [ 5]: cc3c841b4962d7e6 +Block 0014 [ 6]: 59d32fdfa0f1799c +Block 0014 [ 7]: 27cad6e8edad4f2c +Block 0014 [ 8]: 594398209f4b2930 +Block 0014 [ 9]: f6c5854c48e52087 +Block 0014 [ 10]: 29d68e913c165052 +Block 0014 [ 11]: ce2fb5ab0f259e1f +Block 0014 [ 12]: 3ba0c01b6b7786d1 +Block 0014 [ 13]: 3c00b361c52adae1 +Block 0014 [ 14]: 3a86e3364e49fa6e +Block 0014 [ 15]: db551315c92412f7 +Block 0014 [ 16]: 528d22685ecbe099 +Block 0014 [ 17]: 0771dc1de2c966bf +Block 0014 [ 18]: b144f684b0e297cb +Block 0014 [ 19]: a23b7edda45b4e67 +Block 0014 [ 20]: 67fb1a46a13ad6ea +Block 0014 [ 21]: 9f1dd5edf2d9eb38 +Block 0014 [ 22]: bb2cafbb4897b681 +Block 0014 [ 23]: 0cb4c83cd099415e +Block 0014 [ 24]: da038126b8389fca +Block 0014 [ 25]: ce8f9af6da253e4f +Block 0014 [ 26]: 92f710c97b9f1a93 +Block 0014 [ 27]: 4d8a396ead1f1b3f +Block 0014 [ 28]: 926c1378e72539b1 +Block 0014 [ 29]: 46534e08a849cc26 +Block 0014 [ 30]: c990cb8c547e8a1e +Block 0014 [ 31]: 88b8edf87ece7489 +Block 0014 [ 32]: 4e69a49536b34b2e +Block 0014 [ 33]: f565f19fed18634a +Block 0014 [ 34]: 267d9281fcfafcd7 +Block 0014 [ 35]: 150c54e6e1e509f1 +Block 0014 [ 36]: 04b62fc3c290d9cf +Block 0014 [ 37]: 03e5edb36f774565 +Block 0014 [ 38]: 6fdca22c7481ed92 +Block 0014 [ 39]: 2d2be57e0ae66e0b +Block 0014 [ 40]: 42865d66ac66c1b3 +Block 0014 [ 41]: f843b00c30d7c44f +Block 0014 [ 42]: 5e412a9e2d78a1cc +Block 0014 [ 43]: cf217c5b54fdabec +Block 0014 [ 44]: d6d5c47336e51500 +Block 0014 [ 45]: 2e99184e7e141c40 +Block 0014 [ 46]: 8aa25d6a64b77d55 +Block 0014 [ 47]: d61047ee538eb859 +Block 0014 [ 48]: 37e959cef2486752 +Block 0014 [ 49]: 9d9b9432b971d5c8 +Block 0014 [ 50]: de1dfe11560c27c2 +Block 0014 [ 51]: 7463c62e208d9a50 +Block 0014 [ 52]: 1a271dcd0843ecdd +Block 0014 [ 53]: a4b6a899d90b4216 +Block 0014 [ 54]: 5aa12825aba07285 +Block 0014 [ 55]: e4c55247c2be17ac +Block 0014 [ 56]: d2f98ffbef59c5d1 +Block 0014 [ 57]: b06dec47496fe53b +Block 0014 [ 58]: 97c77c0aebd0fe77 +Block 0014 [ 59]: d428ee00d7ffb69a +Block 0014 [ 60]: 994609d7fdf59129 +Block 0014 [ 61]: 44ddec16911fa14e +Block 0014 [ 62]: 6bac7e6b73a99555 +Block 0014 [ 63]: b9cd8040e25ab661 +Block 0014 [ 64]: a910eb8e41cf223f +Block 0014 [ 65]: 722fd0baa5b77c73 +Block 0014 [ 66]: 0b44f42d90da09fa +Block 0014 [ 67]: deb45959e84b5f57 +Block 0014 [ 68]: 80b9388d473ff3f3 +Block 0014 [ 69]: 2e30383755ef7114 +Block 0014 [ 70]: 7b2169c31fe6f39a +Block 0014 [ 71]: 9e7583bfcde8e7b6 +Block 0014 [ 72]: dcf529aff86152bb +Block 0014 [ 73]: 31451434cedfaeac +Block 0014 [ 74]: 88d86ffc5ba97e6f +Block 0014 [ 75]: 78335f8de49f182b +Block 0014 [ 76]: 9048a85e52e84c34 +Block 0014 [ 77]: cdfa26b74260f3f2 +Block 0014 [ 78]: 68328318c0cd0702 +Block 0014 [ 79]: cedbff36e47cae15 +Block 0014 [ 80]: 21ff51c6aed6d794 +Block 0014 [ 81]: dd8e212e2e46c0f6 +Block 0014 [ 82]: 9485c1a009bd5e98 +Block 0014 [ 83]: 9479bd87f489267d +Block 0014 [ 84]: 36d19db1b3894049 +Block 0014 [ 85]: 17625eaad7eb635f +Block 0014 [ 86]: 08afd5df602241e2 +Block 0014 [ 87]: d12f716d01def27a +Block 0014 [ 88]: e10451a6441ecd00 +Block 0014 [ 89]: 81b2ccdc64736c07 +Block 0014 [ 90]: 07bb4d968b09b954 +Block 0014 [ 91]: 442e179652c03202 +Block 0014 [ 92]: 2663dfd4ed026986 +Block 0014 [ 93]: 21dcbad0d595f34c +Block 0014 [ 94]: f290c650c607c61e +Block 0014 [ 95]: 0558c655f8baacb2 +Block 0014 [ 96]: 76880b01adcce90f +Block 0014 [ 97]: 4f9060d2c6065d59 +Block 0014 [ 98]: c11f4eb991497926 +Block 0014 [ 99]: df91c784b49cfa8a +Block 0014 [100]: b28e4591441e80d5 +Block 0014 [101]: 6210f99cc16bf292 +Block 0014 [102]: 3773ca1ff7918a52 +Block 0014 [103]: bdaad928b768f9e9 +Block 0014 [104]: 8ca72c318c9e4eaa +Block 0014 [105]: 93d6a168756cc4df +Block 0014 [106]: 531c0f8459e00218 +Block 0014 [107]: 24cd1b413c399ac8 +Block 0014 [108]: 85d74155ca0afbc3 +Block 0014 [109]: e31c316e7a391faa +Block 0014 [110]: 53e9550145a43efa +Block 0014 [111]: 0efaf72fee17caf8 +Block 0014 [112]: 6e53a1b3b4451058 +Block 0014 [113]: 326429769306e1cd +Block 0014 [114]: 5f28af8f91b9094b +Block 0014 [115]: 86ec80f642192573 +Block 0014 [116]: 743c986ada4f4279 +Block 0014 [117]: 4672258b7ac2db20 +Block 0014 [118]: cd4c5ef34f20f7bd +Block 0014 [119]: c633106a5ff76cca +Block 0014 [120]: e15b5f635bba35ed +Block 0014 [121]: ed2563411ee74df7 +Block 0014 [122]: 33641bd5355327d8 +Block 0014 [123]: 2417d1d6977cbbdf +Block 0014 [124]: 4a84eca8fbd6b23a +Block 0014 [125]: aa8c5732a97e917e +Block 0014 [126]: 70e8d8c96fbcaf79 +Block 0014 [127]: 018888d29ee05f5a +Block 0015 [ 0]: 603ea679f1f7f248 +Block 0015 [ 1]: 51a571c385f5ae35 +Block 0015 [ 2]: 7c3362cd969131c5 +Block 0015 [ 3]: dfb8c198f2780d3e +Block 0015 [ 4]: c1e8e34f1518a415 +Block 0015 [ 5]: 828f73908e5ff6bc +Block 0015 [ 6]: 168506eaeae05625 +Block 0015 [ 7]: 9443dbd5a6a34152 +Block 0015 [ 8]: b1fc6687b6c1f551 +Block 0015 [ 9]: a943dfaeb6b48116 +Block 0015 [ 10]: ebf2b2633b70f35e +Block 0015 [ 11]: 33da4887c873fff2 +Block 0015 [ 12]: 07ea6837a6474d37 +Block 0015 [ 13]: 3160ebf9f74f9ddf +Block 0015 [ 14]: 9d84df5f33ca9058 +Block 0015 [ 15]: 2fb11cddd7f966f6 +Block 0015 [ 16]: 3368e81e0b610af2 +Block 0015 [ 17]: 58a7f918c416cc7e +Block 0015 [ 18]: 8edb15b8658b1678 +Block 0015 [ 19]: 923c66271573e83c +Block 0015 [ 20]: 71368b07cb9ec2bb +Block 0015 [ 21]: abae2356cd9054ca +Block 0015 [ 22]: ec213efd5a710eed +Block 0015 [ 23]: 029899dfc5d97961 +Block 0015 [ 24]: 83c20d46709f4846 +Block 0015 [ 25]: bcf0c30d35ed67f1 +Block 0015 [ 26]: 476549a704059ff9 +Block 0015 [ 27]: a36d09d17ca38288 +Block 0015 [ 28]: 2bbdd13b236e6f77 +Block 0015 [ 29]: 3cf08ae267be5c1c +Block 0015 [ 30]: 7ad9e9f695a7d8f6 +Block 0015 [ 31]: a5218e662af06188 +Block 0015 [ 32]: fef135b2545f0c23 +Block 0015 [ 33]: fdc6c6552ae5abd6 +Block 0015 [ 34]: e214be48ab403d6e +Block 0015 [ 35]: 0aea253269b32b8a +Block 0015 [ 36]: d0fcdf7a175c3065 +Block 0015 [ 37]: 16c08c1a401ac22c +Block 0015 [ 38]: b6ebf9a47b78ae82 +Block 0015 [ 39]: 40c0d3a431d427cb +Block 0015 [ 40]: 1d2df60774b7516c +Block 0015 [ 41]: 970c0594bf1713ce +Block 0015 [ 42]: caacc697b1a924fb +Block 0015 [ 43]: b0fb0798fc30f008 +Block 0015 [ 44]: 5d479f4719cda2bf +Block 0015 [ 45]: 8817e1456a05ea6f +Block 0015 [ 46]: ef0efd291b92072a +Block 0015 [ 47]: 3a780a8cebe24df0 +Block 0015 [ 48]: 0a0f36708d009961 +Block 0015 [ 49]: e84fd081785e063e +Block 0015 [ 50]: 3aebd3af46afc993 +Block 0015 [ 51]: 9790053e206326e7 +Block 0015 [ 52]: a6698e15adffe4d7 +Block 0015 [ 53]: 17fc42f0ab69daf6 +Block 0015 [ 54]: 13e801bb0cb130ac +Block 0015 [ 55]: 74c7936ec777b871 +Block 0015 [ 56]: a0790fdfd41c239c +Block 0015 [ 57]: d74c250b3121d152 +Block 0015 [ 58]: 281f4425d101ad0b +Block 0015 [ 59]: 0be22b3281ad2682 +Block 0015 [ 60]: 7e58fdb0fe4341c5 +Block 0015 [ 61]: 7f0583da9709897f +Block 0015 [ 62]: 681fe8e0ca6b1695 +Block 0015 [ 63]: 4c82c9b2df29eb43 +Block 0015 [ 64]: 39bfdc09e2a0cd2c +Block 0015 [ 65]: 26a802e658b08bef +Block 0015 [ 66]: ae718a50c8b36a6a +Block 0015 [ 67]: 91dfcdc079f34a1a +Block 0015 [ 68]: 022fdcd482307022 +Block 0015 [ 69]: a01e00a7edbac6fb +Block 0015 [ 70]: f733e881c118aa60 +Block 0015 [ 71]: c3e9f578ceb4e304 +Block 0015 [ 72]: c2f9ab41fc414115 +Block 0015 [ 73]: 0be7e099471776f7 +Block 0015 [ 74]: a9cf9956c86573e6 +Block 0015 [ 75]: 3f578a80a849cff9 +Block 0015 [ 76]: c7e3fc9e98f31471 +Block 0015 [ 77]: 42aecfc7b1de9948 +Block 0015 [ 78]: 1d57c7a1272b411d +Block 0015 [ 79]: 35fa53c2bd8b60ae +Block 0015 [ 80]: 36946b2539dda39c +Block 0015 [ 81]: fe67152e6cbe4982 +Block 0015 [ 82]: aad7c71ee4ccb815 +Block 0015 [ 83]: a6bf82bbd66eb497 +Block 0015 [ 84]: e98a7e8ea4f112cb +Block 0015 [ 85]: 3b9739ac57c554bf +Block 0015 [ 86]: 7d42c2c864dfc6d7 +Block 0015 [ 87]: eec7b548af5dd60d +Block 0015 [ 88]: 3cf9455dabe479ed +Block 0015 [ 89]: eb13c9385b4acca1 +Block 0015 [ 90]: 6a117a05a0e1bb28 +Block 0015 [ 91]: 37ed6e0757e5f90f +Block 0015 [ 92]: c65e56b9dab724ab +Block 0015 [ 93]: feb99f41fe526cb1 +Block 0015 [ 94]: f786c4f5cf059e0c +Block 0015 [ 95]: 71db252a2f4b9ed2 +Block 0015 [ 96]: 229d49ab07869a0a +Block 0015 [ 97]: c32662ec9787492d +Block 0015 [ 98]: 5357479f687d9fc1 +Block 0015 [ 99]: a1a909546c0e6b00 +Block 0015 [100]: 8ea67c98294f92ed +Block 0015 [101]: d22dfd0daa54e93f +Block 0015 [102]: da3491c6459dec56 +Block 0015 [103]: ec8c7390216ea15a +Block 0015 [104]: fc9e949d441d1a4e +Block 0015 [105]: 02e380d6957e504b +Block 0015 [106]: 0bd1228a3012bb24 +Block 0015 [107]: 2f50cf0174c5d7d0 +Block 0015 [108]: adb8c69342185bee +Block 0015 [109]: a77cda66bf9982b9 +Block 0015 [110]: 50157252fe6fc4ef +Block 0015 [111]: 89ce6579014b9c4c +Block 0015 [112]: 937b1f6a3e284633 +Block 0015 [113]: d2b1a673d7435110 +Block 0015 [114]: 062c9baf56a8b934 +Block 0015 [115]: ac7dddf61f0ffdd9 +Block 0015 [116]: c6a368e433f4f7c9 +Block 0015 [117]: 5cc234b0de9285ba +Block 0015 [118]: 5d4b8ac62c3ca1a2 +Block 0015 [119]: 5c401334236bd30e +Block 0015 [120]: a8970643f53adef3 +Block 0015 [121]: 7e4d52a2c6d13a4d +Block 0015 [122]: d96227253b2326ea +Block 0015 [123]: e53d4d32bc256c93 +Block 0015 [124]: c9f1dd4e0ec95dd6 +Block 0015 [125]: bb16f7f16252f690 +Block 0015 [126]: ed270d162b295110 +Block 0015 [127]: 902f2b9becfc2a4b +Block 0016 [ 0]: f836c8867716a95d +Block 0016 [ 1]: 5a4bbaa6cf32467f +Block 0016 [ 2]: 647e9aa3fc560638 +Block 0016 [ 3]: ba25f0998ebcfa33 +Block 0016 [ 4]: 900f4408aabd1bb7 +Block 0016 [ 5]: 8bd32329f62d4b10 +Block 0016 [ 6]: ac707aabf76ce122 +Block 0016 [ 7]: d4db0063a2957e5d +Block 0016 [ 8]: a94142b9a40be515 +Block 0016 [ 9]: 263b51c8382d8587 +Block 0016 [ 10]: bf9465acb39eb20c +Block 0016 [ 11]: 20d8fdd516335d90 +Block 0016 [ 12]: bc8151d59a7bae83 +Block 0016 [ 13]: 7b95f1c93208ea74 +Block 0016 [ 14]: 30bb2707ae422542 +Block 0016 [ 15]: cbddfc342ebe96b4 +Block 0016 [ 16]: 246f4b3b6937b59e +Block 0016 [ 17]: 4ba7cc438bb1386f +Block 0016 [ 18]: bc1fd9fb6fe3f6f8 +Block 0016 [ 19]: dae17cb442f9b24c +Block 0016 [ 20]: 3b3fc8c27189c245 +Block 0016 [ 21]: d4d7d0899e9ea324 +Block 0016 [ 22]: 3ce0fb5494ba0170 +Block 0016 [ 23]: 82e5dc4f44e8b47e +Block 0016 [ 24]: a9aee19dce0afb3d +Block 0016 [ 25]: 4b9285c7ff0e0ce8 +Block 0016 [ 26]: 28238fd7e0c3ec24 +Block 0016 [ 27]: 5caeaca234324edc +Block 0016 [ 28]: f584af325ebfffa6 +Block 0016 [ 29]: 045bc01a53084a77 +Block 0016 [ 30]: e109164036727cdf +Block 0016 [ 31]: 1d70d0b4c938b25d +Block 0016 [ 32]: c0743c96c42f74ad +Block 0016 [ 33]: 5a8a03c8f46b9403 +Block 0016 [ 34]: 2238c6a81150dd4d +Block 0016 [ 35]: 1839e472eeeb8e5d +Block 0016 [ 36]: 32d4283b30cbe865 +Block 0016 [ 37]: a542972b4e3753fe +Block 0016 [ 38]: 3f3aad5eea35871f +Block 0016 [ 39]: 29ba28eacaa5c78e +Block 0016 [ 40]: ae006eae0c91ad2c +Block 0016 [ 41]: 8f914e0a5325134e +Block 0016 [ 42]: 545d1e53d212ff70 +Block 0016 [ 43]: e1bb1b4a69250da0 +Block 0016 [ 44]: 9598c702643d6912 +Block 0016 [ 45]: 3120a69431919925 +Block 0016 [ 46]: 267c164eb862ef68 +Block 0016 [ 47]: 58ec801c08b2a209 +Block 0016 [ 48]: 8434d9c58bb0c83c +Block 0016 [ 49]: c355b1a66654f11f +Block 0016 [ 50]: ecaf01bf6b020fb2 +Block 0016 [ 51]: 2f80a7d1262946fb +Block 0016 [ 52]: f2bbfcc21cf454ca +Block 0016 [ 53]: 166391329b9a3d9f +Block 0016 [ 54]: 89b5d0f35ee79a41 +Block 0016 [ 55]: d82ae0163df57fed +Block 0016 [ 56]: 87e2107fe01defcd +Block 0016 [ 57]: 308626494e60a17f +Block 0016 [ 58]: 938403add94b7b0b +Block 0016 [ 59]: 552911a95afc65bd +Block 0016 [ 60]: cfe25f13b0e9ac9a +Block 0016 [ 61]: fc4b24701453d163 +Block 0016 [ 62]: 8227318e53a02d82 +Block 0016 [ 63]: 21e3868e59d26094 +Block 0016 [ 64]: 406a7c293dd09893 +Block 0016 [ 65]: 8fab59fa2babd787 +Block 0016 [ 66]: 5c9da0afeeb011dc +Block 0016 [ 67]: d7fead76e8beefed +Block 0016 [ 68]: 91a3c3d0314379df +Block 0016 [ 69]: d4996fd2cb307612 +Block 0016 [ 70]: 479c9afc5fd7df83 +Block 0016 [ 71]: 91f712370a2b2e50 +Block 0016 [ 72]: ce62c61596018526 +Block 0016 [ 73]: 337f114ee290c307 +Block 0016 [ 74]: 8ae21a80e12d0b54 +Block 0016 [ 75]: 378f97ecf04ec20b +Block 0016 [ 76]: 32b60ae20ad4e0dd +Block 0016 [ 77]: 770a606fcf9e97a3 +Block 0016 [ 78]: b60142050eb6279f +Block 0016 [ 79]: 575da5e303a30734 +Block 0016 [ 80]: 20582e58e2aa8014 +Block 0016 [ 81]: 3e4ad6ba61641b82 +Block 0016 [ 82]: d180814d2fd1e616 +Block 0016 [ 83]: 2500b543e8d9348f +Block 0016 [ 84]: 7c26490c272be0fa +Block 0016 [ 85]: ef7bbb8de2331053 +Block 0016 [ 86]: a9577d5498ccd0f4 +Block 0016 [ 87]: 59969085678603a8 +Block 0016 [ 88]: 9eae26d422a33fc8 +Block 0016 [ 89]: 9c64d10a63f57074 +Block 0016 [ 90]: f347be4d488db2ed +Block 0016 [ 91]: 8d5b6cb28b5a19b0 +Block 0016 [ 92]: d86e4e6383dd2e6d +Block 0016 [ 93]: f2d2668b62b1a509 +Block 0016 [ 94]: 9d07c6329537bbf3 +Block 0016 [ 95]: 5143198e6c6043dd +Block 0016 [ 96]: f10ae67a04a6a65d +Block 0016 [ 97]: bbd5b7bdd2d537c2 +Block 0016 [ 98]: 013697d11cc0a779 +Block 0016 [ 99]: 3a55d5f35217ee01 +Block 0016 [100]: ebee5db9b8b39ba4 +Block 0016 [101]: efd5091112d5b476 +Block 0016 [102]: 0fd56e730bb61cc7 +Block 0016 [103]: cca6e754652c9753 +Block 0016 [104]: fdc7de8f402e9c30 +Block 0016 [105]: 215147cf5757c82f +Block 0016 [106]: 22b0d7672b12e4a7 +Block 0016 [107]: 6e32440373ff7d8f +Block 0016 [108]: 46ff737e2ecc4655 +Block 0016 [109]: 31dcd39c1348711d +Block 0016 [110]: 19fd948d367828d5 +Block 0016 [111]: 81211b6835204ac8 +Block 0016 [112]: 654a8be36e225e7f +Block 0016 [113]: b544dbdc7cfe4f25 +Block 0016 [114]: 48cfaad52a6df0dc +Block 0016 [115]: 350f7225a0f0a998 +Block 0016 [116]: f24baaeedfc1a089 +Block 0016 [117]: c360f609af476cba +Block 0016 [118]: c63c26deff4fc434 +Block 0016 [119]: 1be928444f947c27 +Block 0016 [120]: 18f278838397f4f3 +Block 0016 [121]: 9db306ee0e37be90 +Block 0016 [122]: e952905cfad5f42b +Block 0016 [123]: e6fd94188892b180 +Block 0016 [124]: caaa7624da0c7804 +Block 0016 [125]: ba7f688ce75ab500 +Block 0016 [126]: 3f3617b538632d14 +Block 0016 [127]: 55d601b6e6b0a93e +Block 0017 [ 0]: d3809e57fd122a36 +Block 0017 [ 1]: 27018400b40b6bd4 +Block 0017 [ 2]: 2eb5b349cda48fdb +Block 0017 [ 3]: 8c521093b5689d2d +Block 0017 [ 4]: 757bdf1deedda6d3 +Block 0017 [ 5]: dc07883fdadd0cd2 +Block 0017 [ 6]: fe371ca4088efdc6 +Block 0017 [ 7]: 7c87450f671ae946 +Block 0017 [ 8]: 183f7c12e15e0f1d +Block 0017 [ 9]: 679c5df134ee1f53 +Block 0017 [ 10]: 58e3679afa64e3ba +Block 0017 [ 11]: f3e42838526fee18 +Block 0017 [ 12]: 908f66c2693ffab4 +Block 0017 [ 13]: b1ef6cf1bd798b84 +Block 0017 [ 14]: 3ec433347fefcbe5 +Block 0017 [ 15]: 6e77dbbe5e3e2b98 +Block 0017 [ 16]: 5825a9a768529f5e +Block 0017 [ 17]: 0e78d85f0e84b2d8 +Block 0017 [ 18]: b25e77fe4055bc58 +Block 0017 [ 19]: 5fa90a623f667c03 +Block 0017 [ 20]: 2d328a4e5bb76f56 +Block 0017 [ 21]: d9363cc3f91a4305 +Block 0017 [ 22]: 1f4b73633fd449a1 +Block 0017 [ 23]: 6e9e53a5ef87c14a +Block 0017 [ 24]: c5c0e550d61c051f +Block 0017 [ 25]: 5a26d972eaf76bfb +Block 0017 [ 26]: fbcbc4188c8c046e +Block 0017 [ 27]: bc90cd94be174eb5 +Block 0017 [ 28]: b80cc0e6f43bf47f +Block 0017 [ 29]: f197c2cb917ea7f8 +Block 0017 [ 30]: 6c71dfd84ef19721 +Block 0017 [ 31]: 4d6fdb854dd626bc +Block 0017 [ 32]: b8da64ba92e8a4af +Block 0017 [ 33]: d0514211c433cc99 +Block 0017 [ 34]: aa3f38f68bf6d132 +Block 0017 [ 35]: 9f1b318a2966cd09 +Block 0017 [ 36]: 498ecaf3121f536c +Block 0017 [ 37]: cc993fe794ecb670 +Block 0017 [ 38]: 07a9140fe68437ee +Block 0017 [ 39]: 159cbe19720fbd1a +Block 0017 [ 40]: 4d295994454b9205 +Block 0017 [ 41]: 4a6e4ae9c6294094 +Block 0017 [ 42]: e0f8cd2e5c659727 +Block 0017 [ 43]: e6c3f289a5793bfd +Block 0017 [ 44]: 15c797a37a8a8ea1 +Block 0017 [ 45]: dc808110ff558d6a +Block 0017 [ 46]: 1a5b59df6789e4cd +Block 0017 [ 47]: 4f634c7faa765d12 +Block 0017 [ 48]: 0d401f0b8d3fa3a2 +Block 0017 [ 49]: 1ba8bccb5137d6b2 +Block 0017 [ 50]: 6e925344599411bd +Block 0017 [ 51]: 7cb832ff5effa69c +Block 0017 [ 52]: d7631ef9410c81ac +Block 0017 [ 53]: adb5e7c5a9e5ee14 +Block 0017 [ 54]: d2263024d7dca964 +Block 0017 [ 55]: 4b4771c86ab28b85 +Block 0017 [ 56]: 79a09d79ca354333 +Block 0017 [ 57]: 6f3f5d45545ad500 +Block 0017 [ 58]: c8396ed371075a63 +Block 0017 [ 59]: e33a3b847439afff +Block 0017 [ 60]: 067a10405ad20ab2 +Block 0017 [ 61]: 518f07d02ad01a53 +Block 0017 [ 62]: 6d7efef33c97a6f0 +Block 0017 [ 63]: 20a0c2de6dd3c691 +Block 0017 [ 64]: 111bf03e43199f49 +Block 0017 [ 65]: 2ccc61157376219e +Block 0017 [ 66]: 3e941c50ec51a496 +Block 0017 [ 67]: 1dc0c5b8298d1bba +Block 0017 [ 68]: 8926cf9eee3716a0 +Block 0017 [ 69]: 589269c4ec6a13d7 +Block 0017 [ 70]: e3fad0bae9c71b1b +Block 0017 [ 71]: 6788c55d89db279a +Block 0017 [ 72]: 8f9a6cb1ae837299 +Block 0017 [ 73]: 9b417ea21f94c675 +Block 0017 [ 74]: 60516ddded254e8f +Block 0017 [ 75]: 708da0a62da471bc +Block 0017 [ 76]: 23be51f1da5fa6c2 +Block 0017 [ 77]: 3d654b78d4365097 +Block 0017 [ 78]: e0c50ebdd1ee10b5 +Block 0017 [ 79]: 4b1e8568fd44fbc2 +Block 0017 [ 80]: fdeaf05a29c509e3 +Block 0017 [ 81]: e9b00163c325096c +Block 0017 [ 82]: a00e565603383ded +Block 0017 [ 83]: 162eba41653cdfcb +Block 0017 [ 84]: 885280cb80784958 +Block 0017 [ 85]: 7523c5fb2d9f4739 +Block 0017 [ 86]: da3b098695b8aed7 +Block 0017 [ 87]: ee65585c4ce64e55 +Block 0017 [ 88]: 21c5babe35daba71 +Block 0017 [ 89]: a790750bee4b4361 +Block 0017 [ 90]: 5abbcf4a40653f30 +Block 0017 [ 91]: bcbe524de12b23db +Block 0017 [ 92]: b65696da967ba08d +Block 0017 [ 93]: e243e42d5f8dce1e +Block 0017 [ 94]: 5b8c7410ae02faaa +Block 0017 [ 95]: 3e03cb2c5c85496e +Block 0017 [ 96]: ea598cb74e12061b +Block 0017 [ 97]: adcfe1fce7ae1c3e +Block 0017 [ 98]: 728aaffcdc65b0e3 +Block 0017 [ 99]: 4d8d42d7f2b5465d +Block 0017 [100]: c70bf4211b94781f +Block 0017 [101]: 0bd066da9fa67568 +Block 0017 [102]: 27106a16e99c3820 +Block 0017 [103]: ae0758d6242923cb +Block 0017 [104]: b407bdd5f28c05a1 +Block 0017 [105]: f6d90560bcb6318e +Block 0017 [106]: 4c5210db01183f45 +Block 0017 [107]: cd9ee9c94df96e76 +Block 0017 [108]: e67355c9eef04f59 +Block 0017 [109]: 9ccf945294bcc3e4 +Block 0017 [110]: 922bc6af265ca962 +Block 0017 [111]: 2079e039460ec203 +Block 0017 [112]: a0e5bc615fc9ec33 +Block 0017 [113]: ffc3b98b6ed99d2f +Block 0017 [114]: 1072f708aea08b8e +Block 0017 [115]: a403be88ef0551e8 +Block 0017 [116]: 4f15c6100dcff2e6 +Block 0017 [117]: 4c03d3981f3b97bd +Block 0017 [118]: a46b77a99582507a +Block 0017 [119]: e221b79479ff67a8 +Block 0017 [120]: e4608ec676d5c1f7 +Block 0017 [121]: 8b6aebe9d18e5ead +Block 0017 [122]: 68ce6934678c18e1 +Block 0017 [123]: 6a6c0394eb8364f3 +Block 0017 [124]: 698108ae1f0af293 +Block 0017 [125]: 6fa0f6019a3a26cb +Block 0017 [126]: b868100fd8592784 +Block 0017 [127]: 6e58d5bbcc595213 +Block 0018 [ 0]: 57cebef82247f856 +Block 0018 [ 1]: 5e1f658f847d7865 +Block 0018 [ 2]: a7c6fe3ce6328555 +Block 0018 [ 3]: 631a4d11151e3705 +Block 0018 [ 4]: 6d284d4539081116 +Block 0018 [ 5]: 20d3a3ddd286d249 +Block 0018 [ 6]: fec04211ce617a63 +Block 0018 [ 7]: 7ee644759f4ebabc +Block 0018 [ 8]: 77562a61df6192e6 +Block 0018 [ 9]: f265d9297cf6614e +Block 0018 [ 10]: b2e83323b0fc0b58 +Block 0018 [ 11]: eccdb2ba777b86e1 +Block 0018 [ 12]: 5beae34fb3a6464c +Block 0018 [ 13]: b84166f5573d083c +Block 0018 [ 14]: 1fcda2af39c04119 +Block 0018 [ 15]: b8f70b179be17b47 +Block 0018 [ 16]: f3d8e53e6acc4177 +Block 0018 [ 17]: 19b95a946fed4e76 +Block 0018 [ 18]: ba2a8da965fc652f +Block 0018 [ 19]: b6701b63b3c4fc96 +Block 0018 [ 20]: 8c0b9123f5c11b4c +Block 0018 [ 21]: a0eb8910a8bd6d94 +Block 0018 [ 22]: 93aa541f6111cc04 +Block 0018 [ 23]: b3bec4a835858bf4 +Block 0018 [ 24]: 6e9ffdead30aa373 +Block 0018 [ 25]: dddd7ebaf76ea68f +Block 0018 [ 26]: 700692576d8960c3 +Block 0018 [ 27]: 45dcd0e76ce97c06 +Block 0018 [ 28]: 21b4ecad0175b5e4 +Block 0018 [ 29]: af4ed71c398c3ee2 +Block 0018 [ 30]: 80150398b797ce1e +Block 0018 [ 31]: 2daad86a706f4a4f +Block 0018 [ 32]: 420910e6608e98b7 +Block 0018 [ 33]: 4b29efc147979616 +Block 0018 [ 34]: 4f07907f12fa57dd +Block 0018 [ 35]: 2a81c8fc27ce4f90 +Block 0018 [ 36]: 529b811ba96962c4 +Block 0018 [ 37]: f2fc49e09b7af4b2 +Block 0018 [ 38]: a3bb2de56f665a4b +Block 0018 [ 39]: 3e514d87d7a29f21 +Block 0018 [ 40]: ec6b790cb0e59612 +Block 0018 [ 41]: 3bb1e91e151a466f +Block 0018 [ 42]: b73d5669c1d8216e +Block 0018 [ 43]: 7921ef01b7a4a93c +Block 0018 [ 44]: c8f6a995b360a712 +Block 0018 [ 45]: c34c6643843bd1a8 +Block 0018 [ 46]: 2b38febb4cd8f83f +Block 0018 [ 47]: dc4aa5ba31eff726 +Block 0018 [ 48]: df14215ffed3c376 +Block 0018 [ 49]: 9b5dbf6414a9f1d2 +Block 0018 [ 50]: c29eff069950104d +Block 0018 [ 51]: 2d6338ef7fba9bdb +Block 0018 [ 52]: 9cc4a960bb018ab8 +Block 0018 [ 53]: c0a5e0d3abbf0f8a +Block 0018 [ 54]: 09286cd24df88a53 +Block 0018 [ 55]: 134e6e53b4a1bf27 +Block 0018 [ 56]: 3d13daee8f39f022 +Block 0018 [ 57]: 6f1948c976a77be1 +Block 0018 [ 58]: d87832289e19e4ba +Block 0018 [ 59]: 7911cc3b53031ecd +Block 0018 [ 60]: b039845d8fdabb03 +Block 0018 [ 61]: 653addad2bacb75b +Block 0018 [ 62]: f65b51e7d8cad424 +Block 0018 [ 63]: 1f1d8139580c42cb +Block 0018 [ 64]: 5df05979b549dc5a +Block 0018 [ 65]: b20119fa66364ed9 +Block 0018 [ 66]: c97d32c279b9e2a1 +Block 0018 [ 67]: a918cf46e6737eae +Block 0018 [ 68]: ff21a9765032ef71 +Block 0018 [ 69]: 770f9f55a1e0200e +Block 0018 [ 70]: 480640feb18878ee +Block 0018 [ 71]: 0b77e9233263a358 +Block 0018 [ 72]: 0ccd9e0ebb663e1e +Block 0018 [ 73]: ced6ad184df7f058 +Block 0018 [ 74]: a925f1a938c57899 +Block 0018 [ 75]: 488da2f7160d6b2a +Block 0018 [ 76]: 65ff5349e555c646 +Block 0018 [ 77]: 956a1540757fe764 +Block 0018 [ 78]: 3377c61981a12707 +Block 0018 [ 79]: 6eda3ab6e5e5eef8 +Block 0018 [ 80]: ff28308032454454 +Block 0018 [ 81]: 894ebc48430bf23a +Block 0018 [ 82]: f972de40f6a522ca +Block 0018 [ 83]: 7f49a08de82f7586 +Block 0018 [ 84]: 0a9019c61f419e5f +Block 0018 [ 85]: bb6373eef70f6d9b +Block 0018 [ 86]: f998096fc62599be +Block 0018 [ 87]: 881633292e2bb822 +Block 0018 [ 88]: a8930b1906414588 +Block 0018 [ 89]: 05adc6acd9fa9c3b +Block 0018 [ 90]: 2037174e25917500 +Block 0018 [ 91]: fafe025db1dce058 +Block 0018 [ 92]: f29f8690945d2c1b +Block 0018 [ 93]: b574e9a567c92aab +Block 0018 [ 94]: f41f39ce02847751 +Block 0018 [ 95]: d330c19a9157fdbe +Block 0018 [ 96]: f188b654ff3cd095 +Block 0018 [ 97]: ecf62aaa970134db +Block 0018 [ 98]: df0e5a2106bf3d9d +Block 0018 [ 99]: f270149014f17360 +Block 0018 [100]: be18751373df5e3f +Block 0018 [101]: e170117374a725b7 +Block 0018 [102]: c6bc16281586428d +Block 0018 [103]: c8807c5440d9bbd3 +Block 0018 [104]: 6bb82e0b5d4c2e0d +Block 0018 [105]: 970ede93e5e27ac5 +Block 0018 [106]: b5ea53ff534622ac +Block 0018 [107]: 9e31a90a85f46a62 +Block 0018 [108]: 5f4ef09dcbb5efab +Block 0018 [109]: 23395b9e4a40f367 +Block 0018 [110]: 72d21b94738593e4 +Block 0018 [111]: a670eedbeefa24a9 +Block 0018 [112]: 17b433b9fff934b3 +Block 0018 [113]: 9e32a1bcfedc24f5 +Block 0018 [114]: 8c7f89b2615962f2 +Block 0018 [115]: ff57e2e77b2b0b9e +Block 0018 [116]: 4600f965f407f74c +Block 0018 [117]: 08d3a4358c03a513 +Block 0018 [118]: cfae58aad32697f8 +Block 0018 [119]: 885eff2ac7f41837 +Block 0018 [120]: 8102758546e1a4e4 +Block 0018 [121]: 08b04d9a0ea9a613 +Block 0018 [122]: c256b07aa6468a27 +Block 0018 [123]: e4b64c775459a54c +Block 0018 [124]: 473bb3721002e35b +Block 0018 [125]: 473153000fa4c19b +Block 0018 [126]: 89f0318e36108337 +Block 0018 [127]: 922f0bccba570e30 +Block 0019 [ 0]: c5ad90619dfd5e40 +Block 0019 [ 1]: c7a17173d9d7fb02 +Block 0019 [ 2]: f53d0f0a42ee0a9a +Block 0019 [ 3]: 0b7c95192969e642 +Block 0019 [ 4]: 4ec957e5121f3f42 +Block 0019 [ 5]: cfcd0f545351d53b +Block 0019 [ 6]: 6c34a64d935b4658 +Block 0019 [ 7]: b1c1c307e575bddb +Block 0019 [ 8]: 6c4416051314ab4e +Block 0019 [ 9]: eaccc46dd8f286ac +Block 0019 [ 10]: 62a0006c7175dfc9 +Block 0019 [ 11]: 4adca8b27b853e25 +Block 0019 [ 12]: 86a7d4cb588b926f +Block 0019 [ 13]: a6e880192be9c7be +Block 0019 [ 14]: f0c0fb7163e2b077 +Block 0019 [ 15]: 9fbbd47dbd1ba544 +Block 0019 [ 16]: 6c7004e5e7299324 +Block 0019 [ 17]: 25fd6d2fe2c989ef +Block 0019 [ 18]: 66d6f0c88cb197be +Block 0019 [ 19]: c68bd38566a7889a +Block 0019 [ 20]: 6b59f19ea29b979a +Block 0019 [ 21]: 556774aadc3ca297 +Block 0019 [ 22]: 9ca1c21e961ce72a +Block 0019 [ 23]: f9f2543958ee6de0 +Block 0019 [ 24]: 00374860910b1734 +Block 0019 [ 25]: 9ff6c7f7fdc33655 +Block 0019 [ 26]: ae7d2f154985cc00 +Block 0019 [ 27]: 92a2c2482f099495 +Block 0019 [ 28]: 7738918b896f3d10 +Block 0019 [ 29]: 08e8c151ef9737ec +Block 0019 [ 30]: b8afe6375af2c425 +Block 0019 [ 31]: d7e6532c1ced5359 +Block 0019 [ 32]: 7be417b2d69cc776 +Block 0019 [ 33]: 2f6fbad042b2f4db +Block 0019 [ 34]: 5140dbe6e03c861f +Block 0019 [ 35]: f22d890534c7d2ec +Block 0019 [ 36]: 258963384931adcf +Block 0019 [ 37]: 436cf5639400c61d +Block 0019 [ 38]: e5a63ecdd892893c +Block 0019 [ 39]: 142303f752328d3c +Block 0019 [ 40]: b84d6cce42f3d817 +Block 0019 [ 41]: 652494812170e1d6 +Block 0019 [ 42]: 0b2b77f9cee1fdf6 +Block 0019 [ 43]: c0ecd695297e1d8a +Block 0019 [ 44]: 0fb2e95fd2501d97 +Block 0019 [ 45]: 17c31477c069de81 +Block 0019 [ 46]: e6a0304b074a6eb3 +Block 0019 [ 47]: 26b214308f38795c +Block 0019 [ 48]: 833065117a06860b +Block 0019 [ 49]: d232939089b96074 +Block 0019 [ 50]: 0ee7847f85b38318 +Block 0019 [ 51]: 5fb81785945027f5 +Block 0019 [ 52]: 66ee79d0649c1686 +Block 0019 [ 53]: 3168d562f60ce6eb +Block 0019 [ 54]: bc250a9b52bf4b79 +Block 0019 [ 55]: 1146b33494baaf3e +Block 0019 [ 56]: 5af799d7e5e5dc5d +Block 0019 [ 57]: 89fa4d5028946c9f +Block 0019 [ 58]: 4fd1a798e66663dd +Block 0019 [ 59]: 664c5598e474d6af +Block 0019 [ 60]: 4a1e655f90de3a52 +Block 0019 [ 61]: 65583cea2fe72c1b +Block 0019 [ 62]: 31e99d437b588dea +Block 0019 [ 63]: 810131ed2e8b9e65 +Block 0019 [ 64]: 57140b352a98809c +Block 0019 [ 65]: 3481662f102896d2 +Block 0019 [ 66]: d9c307711dd70af6 +Block 0019 [ 67]: 0fc4ac1b83b21810 +Block 0019 [ 68]: 2dae24938d937d66 +Block 0019 [ 69]: 2db9258eaa41d588 +Block 0019 [ 70]: adfd9117017aea52 +Block 0019 [ 71]: 0aebc8a663734e63 +Block 0019 [ 72]: 3396cb042fa4b880 +Block 0019 [ 73]: d4cb797e806a037d +Block 0019 [ 74]: a0f73b8e65666fc3 +Block 0019 [ 75]: 5f7bce07ca7a1a9c +Block 0019 [ 76]: 2e4629b685833c46 +Block 0019 [ 77]: 0a3ee3fee444ba36 +Block 0019 [ 78]: 3969024563655ce5 +Block 0019 [ 79]: c0a5abd78ef0340c +Block 0019 [ 80]: 0b5519a847a09112 +Block 0019 [ 81]: 96b6762e8665b8a0 +Block 0019 [ 82]: 843e8b1b4dd4a82b +Block 0019 [ 83]: c1232100906be7e6 +Block 0019 [ 84]: b58edd29906a9027 +Block 0019 [ 85]: 8b68b6b6d36b9834 +Block 0019 [ 86]: a7233e790cc6d3f8 +Block 0019 [ 87]: aa5355f0929c4e25 +Block 0019 [ 88]: a7bf6e2e15ab5153 +Block 0019 [ 89]: 8e67f62642cf57f4 +Block 0019 [ 90]: 27a5776e9a7b75a1 +Block 0019 [ 91]: 2b224c1e181b69ff +Block 0019 [ 92]: 0b8b8c0abcd1d13e +Block 0019 [ 93]: fab9b35bb3eab270 +Block 0019 [ 94]: ce9dbe7e3a0a52dc +Block 0019 [ 95]: e1e8f7f3190b8e1e +Block 0019 [ 96]: 886847dd5ed1f8e7 +Block 0019 [ 97]: fa6d5fe42cfb394a +Block 0019 [ 98]: e2eb739c588d8234 +Block 0019 [ 99]: ac2065febf36ce11 +Block 0019 [100]: b3cb7ccab2ffd914 +Block 0019 [101]: dd8092f3fff7970d +Block 0019 [102]: c8dae2e160cab03a +Block 0019 [103]: 37f22b36dfebf4db +Block 0019 [104]: 065bbc14bb0bacf0 +Block 0019 [105]: 83a1d51c798c6087 +Block 0019 [106]: a03604d715375f8a +Block 0019 [107]: e923aa07e8ab2f05 +Block 0019 [108]: 6c0ad55a7926bc90 +Block 0019 [109]: b9b36ec828ffdfb8 +Block 0019 [110]: de0ef5c4811b2689 +Block 0019 [111]: 5c4552c66dfb0c17 +Block 0019 [112]: 8a73ff2d0e32ed9e +Block 0019 [113]: 6c23835f0b616d34 +Block 0019 [114]: 449cb97303cf1125 +Block 0019 [115]: 7e2b8fcd2ddd9aeb +Block 0019 [116]: 247dece373dc3697 +Block 0019 [117]: bb2f3c2b502ceba2 +Block 0019 [118]: 0c0d8f96dde7434d +Block 0019 [119]: 774ef5d4a277649d +Block 0019 [120]: 7504d6f1d03c0af2 +Block 0019 [121]: 05c154722007b939 +Block 0019 [122]: 355b5642800985f3 +Block 0019 [123]: c96e5fd5893fa7d4 +Block 0019 [124]: 6972429b8fcf426a +Block 0019 [125]: 0ff43afbf9106cf4 +Block 0019 [126]: d76130589a9529b8 +Block 0019 [127]: ff105728dbed9657 +Block 0020 [ 0]: e97e984c9a0a4680 +Block 0020 [ 1]: 42695651c0c21502 +Block 0020 [ 2]: 688550ecf3b8a149 +Block 0020 [ 3]: 54d395b8b07ec587 +Block 0020 [ 4]: ddf6a33155b38ed7 +Block 0020 [ 5]: 3b1f998dda326511 +Block 0020 [ 6]: 7f97ac3d9a2bbf9b +Block 0020 [ 7]: a27b1b7ac6676309 +Block 0020 [ 8]: 485aece5fc3cd6a3 +Block 0020 [ 9]: 49bf335ba618a23a +Block 0020 [ 10]: 8a88e9e925d5183b +Block 0020 [ 11]: 2f7d04ac18ea96ab +Block 0020 [ 12]: 6a9f50381a60ab92 +Block 0020 [ 13]: ba7df623a93121ae +Block 0020 [ 14]: f3f273bc52a41207 +Block 0020 [ 15]: 36b4e08e05652348 +Block 0020 [ 16]: f88c278ea3981491 +Block 0020 [ 17]: 22a34c75759f0912 +Block 0020 [ 18]: 1e6462a023e62bbb +Block 0020 [ 19]: 0577a4f764f2a20b +Block 0020 [ 20]: a1efd6253ade82bb +Block 0020 [ 21]: 81dbf5c8455a8524 +Block 0020 [ 22]: 1bae23a8beada114 +Block 0020 [ 23]: 188c9816116da639 +Block 0020 [ 24]: 05bd99543f3907fb +Block 0020 [ 25]: b1b890cd005ccfa8 +Block 0020 [ 26]: 1f83e83507988f54 +Block 0020 [ 27]: 0b9692c75b1a65d2 +Block 0020 [ 28]: 9b7d295ace6adcfd +Block 0020 [ 29]: af01c0de42d753a0 +Block 0020 [ 30]: 3fe167f7dc207394 +Block 0020 [ 31]: 0a4e33a76c72e144 +Block 0020 [ 32]: 79a74d89cd804e34 +Block 0020 [ 33]: 9237f7a0ae9a4d0e +Block 0020 [ 34]: 0d160320f7c748f2 +Block 0020 [ 35]: 209870f6869b388a +Block 0020 [ 36]: 786b9215ade0ed30 +Block 0020 [ 37]: 418d4c6b3f042ebe +Block 0020 [ 38]: 831a0ba554ad8bf7 +Block 0020 [ 39]: 28e14dc0cc08c931 +Block 0020 [ 40]: a6a161729c772dff +Block 0020 [ 41]: f3324db122373805 +Block 0020 [ 42]: af4e084231220ba4 +Block 0020 [ 43]: 96e990b23fb09510 +Block 0020 [ 44]: bc6a4abca65e47f4 +Block 0020 [ 45]: f12789b5a6b25fbd +Block 0020 [ 46]: f800e966b67d385b +Block 0020 [ 47]: 173ed5f3e710b749 +Block 0020 [ 48]: 03d4dd0e15fc509a +Block 0020 [ 49]: f6cc9939e80900e6 +Block 0020 [ 50]: 93c884512d37d9a2 +Block 0020 [ 51]: ad4dafb167dfe39c +Block 0020 [ 52]: 08881f5c9431990b +Block 0020 [ 53]: d7ee8ce6cb74ebb6 +Block 0020 [ 54]: e264efef38081687 +Block 0020 [ 55]: cf420221c00d899c +Block 0020 [ 56]: 3df9cb9efa6deb77 +Block 0020 [ 57]: 65536cc67d0ad05a +Block 0020 [ 58]: 3fba9e1952e19b67 +Block 0020 [ 59]: f1a1f331ef40d048 +Block 0020 [ 60]: 04fa0694742fee2c +Block 0020 [ 61]: 32bd2eb3c55e5ae0 +Block 0020 [ 62]: a9c7205ffb68b28f +Block 0020 [ 63]: 658112db2feabc85 +Block 0020 [ 64]: 2cf847284d0921b3 +Block 0020 [ 65]: 2e539b5f05a65789 +Block 0020 [ 66]: 9f74bfde4246094a +Block 0020 [ 67]: 21f71cec771a994f +Block 0020 [ 68]: 502671b3198d83ad +Block 0020 [ 69]: 38f91177744c228c +Block 0020 [ 70]: 63b43e2ef56b5e7b +Block 0020 [ 71]: 7765db54b31c5521 +Block 0020 [ 72]: 981336e740ce20f6 +Block 0020 [ 73]: 7c3b4ce651e9fb5b +Block 0020 [ 74]: 0401d7d8cc9a42a3 +Block 0020 [ 75]: 714b58a1a936c453 +Block 0020 [ 76]: 49bc384451c5bf0a +Block 0020 [ 77]: 028894e2178d6e0c +Block 0020 [ 78]: 5496f8c54b09dc58 +Block 0020 [ 79]: e6eb176a966a4632 +Block 0020 [ 80]: 5fd3242e6c512e2e +Block 0020 [ 81]: be012a4516b19ecd +Block 0020 [ 82]: 5a029ae5b0ba77fc +Block 0020 [ 83]: 6bdf22f7170b33cd +Block 0020 [ 84]: 72d7181008703761 +Block 0020 [ 85]: 71a0a89e374da324 +Block 0020 [ 86]: a3029e6857c84d5d +Block 0020 [ 87]: be4e2d573ab4a5af +Block 0020 [ 88]: c7d6f811e2e1a452 +Block 0020 [ 89]: 544ff9d9df359257 +Block 0020 [ 90]: 88a253dee5cffe09 +Block 0020 [ 91]: fd218a89570ea21b +Block 0020 [ 92]: 3562bca5d5463c5c +Block 0020 [ 93]: a8e3e455e840e5d3 +Block 0020 [ 94]: 8b5b33b3f605dea4 +Block 0020 [ 95]: 54927c551ce7109a +Block 0020 [ 96]: d9edbc7e8ed262ea +Block 0020 [ 97]: 13ba2da8af1586e0 +Block 0020 [ 98]: 7e7b4839ec9c9d15 +Block 0020 [ 99]: c7a7f365046242e5 +Block 0020 [100]: c0a02a96e116e7a9 +Block 0020 [101]: c4294c90c5b60aab +Block 0020 [102]: de88e0255c80e8bd +Block 0020 [103]: dda0a1b50a84f594 +Block 0020 [104]: 32abd57a4a3d8fa1 +Block 0020 [105]: 6a3b6003128b7e4b +Block 0020 [106]: 2e75d71ec1f459ea +Block 0020 [107]: d8b3d56bb6370ce8 +Block 0020 [108]: a6e50c3c3fdeedcf +Block 0020 [109]: 615fe054b22c3f57 +Block 0020 [110]: d187b0d5e9a82f07 +Block 0020 [111]: 0b661aecd8b6acfd +Block 0020 [112]: ae5739a352aefc0b +Block 0020 [113]: a19b37d3f4358fab +Block 0020 [114]: ec3f64064528e5ca +Block 0020 [115]: 871eee2897672b5d +Block 0020 [116]: 13723605168a4370 +Block 0020 [117]: 09f3b1ce20ee4693 +Block 0020 [118]: cf07035c40670104 +Block 0020 [119]: f940f27353d6bce9 +Block 0020 [120]: 7bca9f2599febfce +Block 0020 [121]: 46a694fb7c23db99 +Block 0020 [122]: d7d065950f1fbd4b +Block 0020 [123]: cbe415b30043b7c9 +Block 0020 [124]: 1ec55ec99495a768 +Block 0020 [125]: 296f6c6f5078b47d +Block 0020 [126]: cdc04d1f06b9f4cb +Block 0020 [127]: abc7a9f4595d035c +Block 0021 [ 0]: f91e15dddb3b51ec +Block 0021 [ 1]: ee5c3d4169c6340e +Block 0021 [ 2]: ffbb26bf19a1114e +Block 0021 [ 3]: 07051d000ee6fdc8 +Block 0021 [ 4]: 1abe4b454438ac8e +Block 0021 [ 5]: 7248966a2670c010 +Block 0021 [ 6]: b7b5def30b008c50 +Block 0021 [ 7]: f9b852777fcdf0cb +Block 0021 [ 8]: 33883d34b6746279 +Block 0021 [ 9]: 8ed5aed9f146bbbc +Block 0021 [ 10]: b185ef5eeb6b7c93 +Block 0021 [ 11]: deab3ab480df25e2 +Block 0021 [ 12]: 54c50a10ef514a95 +Block 0021 [ 13]: b22a360cd6e84781 +Block 0021 [ 14]: ccd176f2fd328583 +Block 0021 [ 15]: 0c6197874a4c1899 +Block 0021 [ 16]: d7baf5b0d78951d9 +Block 0021 [ 17]: 4f0bcf25c024e4c9 +Block 0021 [ 18]: 37ce212b48d1dc8c +Block 0021 [ 19]: 1406aa351a3956ec +Block 0021 [ 20]: af53d87e3d339f12 +Block 0021 [ 21]: 4099481b37dd2332 +Block 0021 [ 22]: 99705cd0ace2b2e5 +Block 0021 [ 23]: a7b4ccf587f655a4 +Block 0021 [ 24]: 4fc2ea4c8dacd3f0 +Block 0021 [ 25]: 5f3edbe69906aea8 +Block 0021 [ 26]: e3ce2749b7e3501a +Block 0021 [ 27]: 6df82def0953f475 +Block 0021 [ 28]: 29a3b1a8d54cd7eb +Block 0021 [ 29]: 238fd775eb58ce16 +Block 0021 [ 30]: f4428dd2aa26f05d +Block 0021 [ 31]: 5f5f090f6985661e +Block 0021 [ 32]: 3c11b73b96af5348 +Block 0021 [ 33]: 4803704f02a187d7 +Block 0021 [ 34]: 5fee6cd368efb42a +Block 0021 [ 35]: c11e6dc965fa6f04 +Block 0021 [ 36]: b4ea2de0b9c26784 +Block 0021 [ 37]: 89353cfb63665713 +Block 0021 [ 38]: ef0888efce116445 +Block 0021 [ 39]: fb04167ad5f72e1f +Block 0021 [ 40]: 3c5ed288e8f05a1d +Block 0021 [ 41]: 624547a17957b850 +Block 0021 [ 42]: 04732141a8ccba36 +Block 0021 [ 43]: 2685fb50ec390be3 +Block 0021 [ 44]: b02549b55b50976f +Block 0021 [ 45]: fa4fdce5517c2a24 +Block 0021 [ 46]: f11439e0775486f2 +Block 0021 [ 47]: 56c79606aba98cd0 +Block 0021 [ 48]: ed0641ad608278c0 +Block 0021 [ 49]: 514624364ea4b59f +Block 0021 [ 50]: 7fd4817bc3eeba5b +Block 0021 [ 51]: a8ee1d20b2d7d0b5 +Block 0021 [ 52]: ae596aa5f3dc543c +Block 0021 [ 53]: b799fbc080499d82 +Block 0021 [ 54]: ed54f1d15d90f8eb +Block 0021 [ 55]: 1a31da56664a72cc +Block 0021 [ 56]: 12da9d1c9cf10ddb +Block 0021 [ 57]: 2f4913b380d74a10 +Block 0021 [ 58]: 8ba9185c45a65ba3 +Block 0021 [ 59]: da683bf7f2029425 +Block 0021 [ 60]: 559fbf449c0da608 +Block 0021 [ 61]: 7dcd27cf098ba795 +Block 0021 [ 62]: 3ddd05c0df1cab14 +Block 0021 [ 63]: 83fd62730a702ce3 +Block 0021 [ 64]: 15a6c578f742d175 +Block 0021 [ 65]: 016f807d1ab2e6c3 +Block 0021 [ 66]: 61dbe68679f42a35 +Block 0021 [ 67]: 34098d8930ef469b +Block 0021 [ 68]: 6e4f258a5c1c061c +Block 0021 [ 69]: 94b80e2098f6de46 +Block 0021 [ 70]: f75eb09315ac2b17 +Block 0021 [ 71]: dcd61677a8230fb3 +Block 0021 [ 72]: aba074f342936c30 +Block 0021 [ 73]: ef82cb98e5b62732 +Block 0021 [ 74]: 92e2a728a9cf67a9 +Block 0021 [ 75]: a63711b57bf4c895 +Block 0021 [ 76]: ca84f36a5aed6490 +Block 0021 [ 77]: fac131451564800d +Block 0021 [ 78]: db9274384c879da5 +Block 0021 [ 79]: b8103c7a0b1e2280 +Block 0021 [ 80]: 475816e960b808f9 +Block 0021 [ 81]: 022248d13db87cb1 +Block 0021 [ 82]: a93f6128a0e9ec01 +Block 0021 [ 83]: e968dd4874743f07 +Block 0021 [ 84]: 31da295f50067bb4 +Block 0021 [ 85]: fac3e0d7554a109e +Block 0021 [ 86]: e9e77599410d4626 +Block 0021 [ 87]: 018184166eab6fba +Block 0021 [ 88]: 230e3e6976d1929f +Block 0021 [ 89]: 8038f6ce937203dc +Block 0021 [ 90]: feae676d6efd362b +Block 0021 [ 91]: eb9e5d2e229876af +Block 0021 [ 92]: ffb1be82fa0129d3 +Block 0021 [ 93]: a9861a02c73e3766 +Block 0021 [ 94]: 4705e2143470ea47 +Block 0021 [ 95]: d35816871f69c4ff +Block 0021 [ 96]: 74f13edfb6f9f2fd +Block 0021 [ 97]: 5856910ab5e781c9 +Block 0021 [ 98]: 3ceb888953da86b9 +Block 0021 [ 99]: 0ab510d037c87b43 +Block 0021 [100]: 138c27555c6626b4 +Block 0021 [101]: 3c131e8b21e1d1a7 +Block 0021 [102]: dcf5a6b3fb5e6966 +Block 0021 [103]: 0559f144bd001f36 +Block 0021 [104]: 3018a36d9ad1ecd4 +Block 0021 [105]: 31e3c99700980d11 +Block 0021 [106]: 1d189ab56c882f89 +Block 0021 [107]: ac93920aa320911e +Block 0021 [108]: 680b39dadc4c977f +Block 0021 [109]: 7072e9abbc6eec02 +Block 0021 [110]: 1136fc6624a8283d +Block 0021 [111]: d1cafe5cb563a9f2 +Block 0021 [112]: cb42169a90e18f42 +Block 0021 [113]: ef07f6cc1da57b09 +Block 0021 [114]: 186c57d289ca3d25 +Block 0021 [115]: 168f8783db16497f +Block 0021 [116]: eb5d26010ccc0661 +Block 0021 [117]: 7dfc4b2061132276 +Block 0021 [118]: 318fa486a5e55435 +Block 0021 [119]: 4f081059273cff64 +Block 0021 [120]: 8e2f8e9f645fe5c5 +Block 0021 [121]: b0f117bf26cac7a6 +Block 0021 [122]: a7cc624a25420744 +Block 0021 [123]: 5996f6f569411c8d +Block 0021 [124]: d1fe256f06785230 +Block 0021 [125]: 6a5c4fd0332f388a +Block 0021 [126]: 671310faa364b89a +Block 0021 [127]: ae23fc2ee74b6a2e +Block 0022 [ 0]: fd0d5fe6e4463eb9 +Block 0022 [ 1]: 45c83ce9563fa053 +Block 0022 [ 2]: d727b2657ba26cdc +Block 0022 [ 3]: 8c6aa3c945e80ead +Block 0022 [ 4]: e97f7f5e8c5999b1 +Block 0022 [ 5]: 4aa3da0ced32965b +Block 0022 [ 6]: 060ddad87e312da8 +Block 0022 [ 7]: 240061d56cfae2ae +Block 0022 [ 8]: 762ab59bcd9861af +Block 0022 [ 9]: 83c44976e648170e +Block 0022 [ 10]: 7c72093e5af38945 +Block 0022 [ 11]: 502321f2bc7210d8 +Block 0022 [ 12]: 5c48ba68baea259d +Block 0022 [ 13]: bf10399b4ceb7350 +Block 0022 [ 14]: c01e2a7ea191f992 +Block 0022 [ 15]: 65d8e06801e875fd +Block 0022 [ 16]: dd58879fa6c6beca +Block 0022 [ 17]: e759e40819e1c2ee +Block 0022 [ 18]: 0cb2744881da40ad +Block 0022 [ 19]: ec193df705eb9ce1 +Block 0022 [ 20]: 64f0b30e24639350 +Block 0022 [ 21]: 383d137d52aa756d +Block 0022 [ 22]: c7508534f947fe85 +Block 0022 [ 23]: 8d1c55b6a2c65b4b +Block 0022 [ 24]: 817d5358205f8c7f +Block 0022 [ 25]: 3e7dcc1e2d0ad5d2 +Block 0022 [ 26]: 3806b0590ebc33d0 +Block 0022 [ 27]: 4b7410df24c582fc +Block 0022 [ 28]: ef8eb90023866f1b +Block 0022 [ 29]: 16d5e2706b950dbf +Block 0022 [ 30]: 6eab6cfa739f915c +Block 0022 [ 31]: b739804c9bc88231 +Block 0022 [ 32]: 92306a3666206f77 +Block 0022 [ 33]: 18551d1e9274bc10 +Block 0022 [ 34]: 62d127a51fa91e89 +Block 0022 [ 35]: f64fce4c0035ee41 +Block 0022 [ 36]: 008856cec7508d20 +Block 0022 [ 37]: 742b2b65beb517f5 +Block 0022 [ 38]: 71b98ea6f9a17f89 +Block 0022 [ 39]: 7ca177831758d428 +Block 0022 [ 40]: b4063a44e0c5c0f4 +Block 0022 [ 41]: bfff91cfe779f7a0 +Block 0022 [ 42]: 561c77eb787158ad +Block 0022 [ 43]: c6511c6cdc7d5c92 +Block 0022 [ 44]: 1a4ef74ddd5319f5 +Block 0022 [ 45]: 4e3a92e3669e405c +Block 0022 [ 46]: 99699ce6bada48e9 +Block 0022 [ 47]: 673ab31ec7a3cef4 +Block 0022 [ 48]: 321c4e8a6b736843 +Block 0022 [ 49]: 6937b8bf90276a67 +Block 0022 [ 50]: 9e5e5c323a841df2 +Block 0022 [ 51]: 7543434ac4a6f31d +Block 0022 [ 52]: 8a4fadf7ad9b08b0 +Block 0022 [ 53]: e6e169443491062c +Block 0022 [ 54]: 1dc490d3fd26094c +Block 0022 [ 55]: f2548a4d64cee2e9 +Block 0022 [ 56]: 80de1a7ca870fd3e +Block 0022 [ 57]: 59d42a990f21e43c +Block 0022 [ 58]: 1c71ffde3c1c610e +Block 0022 [ 59]: eaacdba19e48f030 +Block 0022 [ 60]: 2b3529474cf24ffb +Block 0022 [ 61]: e6a4d2aaf27c0f19 +Block 0022 [ 62]: 18e558a5a4fd3e88 +Block 0022 [ 63]: dd61e9dc8af7b78e +Block 0022 [ 64]: 1cceaeba3e18faa6 +Block 0022 [ 65]: c8403af754002891 +Block 0022 [ 66]: 9877ab739868aeaf +Block 0022 [ 67]: 337f8dc58d7c3769 +Block 0022 [ 68]: cc7a204b0b743765 +Block 0022 [ 69]: 72c89f06c66f5f5f +Block 0022 [ 70]: 4e40dff46b027e59 +Block 0022 [ 71]: 9719284ab7e5a198 +Block 0022 [ 72]: c6fd4d54a74793d7 +Block 0022 [ 73]: 13cfcefd75aacc2b +Block 0022 [ 74]: f4def331cc0c787d +Block 0022 [ 75]: 440d0ad4ad9d17b0 +Block 0022 [ 76]: fbded143712b01c0 +Block 0022 [ 77]: 0a4b41e4e7e441a2 +Block 0022 [ 78]: 344938acef21e9c8 +Block 0022 [ 79]: 8eb1bf62f25c514e +Block 0022 [ 80]: c4522c100a390623 +Block 0022 [ 81]: 2f9c189f55588477 +Block 0022 [ 82]: 2d09452db6b0a890 +Block 0022 [ 83]: 06e3609424bda06d +Block 0022 [ 84]: f1d375b04a8be629 +Block 0022 [ 85]: c156f32f41541ab4 +Block 0022 [ 86]: 0258f1c58671feda +Block 0022 [ 87]: 4b97162ad3411aeb +Block 0022 [ 88]: 62b252050436a943 +Block 0022 [ 89]: ca82902a3725daa3 +Block 0022 [ 90]: 259a316a3ddf2da2 +Block 0022 [ 91]: 959a008ad357c995 +Block 0022 [ 92]: 9b738b6b170453a3 +Block 0022 [ 93]: 1cc4c1f4a499b0e9 +Block 0022 [ 94]: 6675ddd817df816d +Block 0022 [ 95]: 6b6454ef7dc27dd0 +Block 0022 [ 96]: e41db01be78437f1 +Block 0022 [ 97]: 45978d6fee9df995 +Block 0022 [ 98]: 50291ef2c016d553 +Block 0022 [ 99]: 3bcacbec1fead10f +Block 0022 [100]: 58007e967ebe5d2a +Block 0022 [101]: 4a38aeef5991445c +Block 0022 [102]: d11bb156aad884b9 +Block 0022 [103]: cdf7aa50f549b11c +Block 0022 [104]: e00f671baa7d6614 +Block 0022 [105]: 3d63468b5f660350 +Block 0022 [106]: 8ca6a1aafda8586c +Block 0022 [107]: eb5fe9a0beec3ba6 +Block 0022 [108]: 8a8dfa227db49a88 +Block 0022 [109]: 123379b9e95f344a +Block 0022 [110]: fc90400b40cae726 +Block 0022 [111]: a8372e72fae29434 +Block 0022 [112]: 30e7ed83a43bc676 +Block 0022 [113]: 24b0b45b9e9295d1 +Block 0022 [114]: 1064b0ba66872a1a +Block 0022 [115]: 016f81848aac5da0 +Block 0022 [116]: 70010ce2cc015342 +Block 0022 [117]: 0cb94916bdd2c824 +Block 0022 [118]: 84f7f072795efdaa +Block 0022 [119]: ae02558711928c7e +Block 0022 [120]: ce1412eaa5f5e0aa +Block 0022 [121]: a48e1cc58caae3d3 +Block 0022 [122]: fa202b0d1f05dc84 +Block 0022 [123]: 8d47e4b2d0870c63 +Block 0022 [124]: 47f21005485aa20e +Block 0022 [125]: 97af7fca33748f3d +Block 0022 [126]: 465983ece771eef3 +Block 0022 [127]: 14ec860030ff375e +Block 0023 [ 0]: 6f210fe216a3512c +Block 0023 [ 1]: 386cee177ac993a4 +Block 0023 [ 2]: 49bd76ebf083db21 +Block 0023 [ 3]: 1215eb06184503da +Block 0023 [ 4]: 49f3e037ad08fb69 +Block 0023 [ 5]: 564544fefa7fe65c +Block 0023 [ 6]: b21298e5160968ec +Block 0023 [ 7]: a786e653fdc46e4a +Block 0023 [ 8]: f209b1eaf8ea1a45 +Block 0023 [ 9]: 19b76bc48434ff35 +Block 0023 [ 10]: 2c12edbd7079ce66 +Block 0023 [ 11]: 664e44229e14ed62 +Block 0023 [ 12]: bb50a711aecd4206 +Block 0023 [ 13]: 4f9a0c9f37757465 +Block 0023 [ 14]: f5059360bcec58ae +Block 0023 [ 15]: 6033b3f8943691c3 +Block 0023 [ 16]: 317bee308f9535fd +Block 0023 [ 17]: c8d8ef6cc0e20a42 +Block 0023 [ 18]: 45ad5b2bab1aff18 +Block 0023 [ 19]: 36accf772101e38c +Block 0023 [ 20]: 3e0f5b1c20b1bb60 +Block 0023 [ 21]: 5ed93c2d23e2cdd5 +Block 0023 [ 22]: 090c5583d65eb905 +Block 0023 [ 23]: ed85a9a130d4bc94 +Block 0023 [ 24]: 7cb9a06ca5fcca44 +Block 0023 [ 25]: f20a018628cec16d +Block 0023 [ 26]: b33762850d0020d0 +Block 0023 [ 27]: 89c6f1adabcad35a +Block 0023 [ 28]: c9b2fa8540aea613 +Block 0023 [ 29]: b0cad3cccc014204 +Block 0023 [ 30]: fefd95b1dc5bd64f +Block 0023 [ 31]: 9ea654d3e93f1d5c +Block 0023 [ 32]: 3be47c28bba7bf4d +Block 0023 [ 33]: 914bf4bc99537ff9 +Block 0023 [ 34]: e72d69aa549754a8 +Block 0023 [ 35]: 159b7e1c6a4947f6 +Block 0023 [ 36]: 7b6467463a0d70fb +Block 0023 [ 37]: d21aabe90be5a3af +Block 0023 [ 38]: 0d0f5cdcb0e3c7bc +Block 0023 [ 39]: d768d5aa9aeefdb3 +Block 0023 [ 40]: b32ee41f0365e839 +Block 0023 [ 41]: 73a927ae2ea373cd +Block 0023 [ 42]: ba1522fe3f400fe5 +Block 0023 [ 43]: 79488e5d595ff114 +Block 0023 [ 44]: a0dda12acb33e1f5 +Block 0023 [ 45]: d72e4dcef04d8449 +Block 0023 [ 46]: 3b3597920b77fadd +Block 0023 [ 47]: 9a537d5d1e0f93a9 +Block 0023 [ 48]: d64b12633f104e41 +Block 0023 [ 49]: 15b77de207900141 +Block 0023 [ 50]: 67d09cbd6ff6244c +Block 0023 [ 51]: 9f57287b704d96f2 +Block 0023 [ 52]: 7cac8a39c31aaeb0 +Block 0023 [ 53]: c19e4ada63e422c1 +Block 0023 [ 54]: d967b2aca7b30b24 +Block 0023 [ 55]: 4ce1e7848cfada9c +Block 0023 [ 56]: fffee85be7b18870 +Block 0023 [ 57]: 53a89fc1aa515131 +Block 0023 [ 58]: 144547ad34b63494 +Block 0023 [ 59]: 9da4e4628b19b6af +Block 0023 [ 60]: 647a68eaa3008b91 +Block 0023 [ 61]: 011b88ec013bef9d +Block 0023 [ 62]: 3132eafeabbdbae3 +Block 0023 [ 63]: 5b9dc02adda74b1b +Block 0023 [ 64]: 0bfc5e6055737ffd +Block 0023 [ 65]: 79dfe16a4a331f60 +Block 0023 [ 66]: e62d717d47fa1f54 +Block 0023 [ 67]: 5f68e4b38ba5ac85 +Block 0023 [ 68]: 2739094dc8306afa +Block 0023 [ 69]: f438221f45366a87 +Block 0023 [ 70]: aa2c60c6b544d641 +Block 0023 [ 71]: f5210c6369a0ea40 +Block 0023 [ 72]: 63450f97178b6fea +Block 0023 [ 73]: 1e84ddb1d5d39662 +Block 0023 [ 74]: 1d562cdfeb699bde +Block 0023 [ 75]: 1f1640bc5f7f3b7c +Block 0023 [ 76]: fb9c4fd39e52de2b +Block 0023 [ 77]: 982dfc06061900ef +Block 0023 [ 78]: e3683cd9ad6c3506 +Block 0023 [ 79]: f58197aa96b567e8 +Block 0023 [ 80]: 166f8f63b0b5544b +Block 0023 [ 81]: 15acc79dcfd350b5 +Block 0023 [ 82]: 04d81c7adfc06c8b +Block 0023 [ 83]: cc1aa55ae4714aa5 +Block 0023 [ 84]: 1adf79595b037147 +Block 0023 [ 85]: 80182d8e6626ec1a +Block 0023 [ 86]: dcca7cd67b36f1d4 +Block 0023 [ 87]: 956c021ecf0004c2 +Block 0023 [ 88]: be4644c7b2abf40e +Block 0023 [ 89]: 5052284ea5c9cbfd +Block 0023 [ 90]: 2b98113bb7cfa963 +Block 0023 [ 91]: 95ccc61b0c97d568 +Block 0023 [ 92]: def94c38764899e4 +Block 0023 [ 93]: 661f98ae30046991 +Block 0023 [ 94]: d5f7cb256077ee95 +Block 0023 [ 95]: f18d4c7e877b2ed6 +Block 0023 [ 96]: e9f45ead3383c0fe +Block 0023 [ 97]: f9ad0574a3390523 +Block 0023 [ 98]: 23ff3b411095754b +Block 0023 [ 99]: 5272d0a3733568f5 +Block 0023 [100]: 57514c47b994f41a +Block 0023 [101]: f887dc7638fe516d +Block 0023 [102]: 63eac3154753f392 +Block 0023 [103]: 870c5cd60a22e090 +Block 0023 [104]: 3e03fba18c9cf510 +Block 0023 [105]: 82b3e1766e2b4fd4 +Block 0023 [106]: 2f328027ee47edbc +Block 0023 [107]: b848509d94957f5a +Block 0023 [108]: 1ce36525b23e18c8 +Block 0023 [109]: 8dc9806873cfcdc6 +Block 0023 [110]: f8104fce855b73a7 +Block 0023 [111]: 2ab1006d7d216b5b +Block 0023 [112]: 759d5c0fbad338e7 +Block 0023 [113]: d701785324bde3cc +Block 0023 [114]: e8a9f5a0f3ee07ef +Block 0023 [115]: 508b2a5f7bccb887 +Block 0023 [116]: 10c1764cf106251e +Block 0023 [117]: 0aaaef13d29c993f +Block 0023 [118]: 3bba7fa3b579643f +Block 0023 [119]: 80ab232f73189d56 +Block 0023 [120]: 397cb8a63dea3e0c +Block 0023 [121]: 3f42d5bc48fb92d6 +Block 0023 [122]: 811a23b4e2622e92 +Block 0023 [123]: 940f776c7ce48d13 +Block 0023 [124]: e6fc34563a84c17b +Block 0023 [125]: c1bbe67ee7f4e9b7 +Block 0023 [126]: 2f82722c13d7231d +Block 0023 [127]: 3432cd292161ed18 +Block 0024 [ 0]: eddf447b2d99795d +Block 0024 [ 1]: f61c77799f2cdf40 +Block 0024 [ 2]: e28436e1ceaa784a +Block 0024 [ 3]: fcf4e94439a4d452 +Block 0024 [ 4]: 59bd07ad0230777c +Block 0024 [ 5]: 2fa46f9955e19408 +Block 0024 [ 6]: 1dd1577be731eb19 +Block 0024 [ 7]: f6de459101fd739a +Block 0024 [ 8]: 1e804a7ed486f185 +Block 0024 [ 9]: cbbdf6514607376f +Block 0024 [ 10]: 01d56e7417f13081 +Block 0024 [ 11]: 897b5f91b941f660 +Block 0024 [ 12]: 8af0d7ea758c00fd +Block 0024 [ 13]: f0cf6e790ddf7761 +Block 0024 [ 14]: 3e2c532714e5038f +Block 0024 [ 15]: e6f882c03d7cf6dc +Block 0024 [ 16]: cf547b6801a01f9d +Block 0024 [ 17]: 12ae95bbda085530 +Block 0024 [ 18]: df01d1be5bbbaf21 +Block 0024 [ 19]: 968c5616afa5b119 +Block 0024 [ 20]: b7d192ebfe911df9 +Block 0024 [ 21]: ebe5a10764df10d0 +Block 0024 [ 22]: ff723e49b4afe96f +Block 0024 [ 23]: 13176fcffc8a0847 +Block 0024 [ 24]: be8ba44311abe23d +Block 0024 [ 25]: a629337958920760 +Block 0024 [ 26]: bffde970d04070ad +Block 0024 [ 27]: d5a0a926331eca17 +Block 0024 [ 28]: 846c9178100ed813 +Block 0024 [ 29]: 853d3d58c58b6e7a +Block 0024 [ 30]: 25ada3b57eacb250 +Block 0024 [ 31]: 8af5791678f8c074 +Block 0024 [ 32]: 300720a2acff0dc2 +Block 0024 [ 33]: 7e314768bfab2fc5 +Block 0024 [ 34]: e74d5a2c5e533222 +Block 0024 [ 35]: b252ddeddceab59c +Block 0024 [ 36]: 4ab8e05633797c9d +Block 0024 [ 37]: 6a29e9db5618a8a6 +Block 0024 [ 38]: adbeafb95c1275a9 +Block 0024 [ 39]: b56750cb22ea0567 +Block 0024 [ 40]: 6993e457678b21cc +Block 0024 [ 41]: f7856e2c511dc311 +Block 0024 [ 42]: fe5deac34863c661 +Block 0024 [ 43]: 88fff230d20d378a +Block 0024 [ 44]: 5b6ea59f9fd09360 +Block 0024 [ 45]: 6c4d35d69bdf7074 +Block 0024 [ 46]: 33580293fccd086b +Block 0024 [ 47]: f2e9ac8d2dee6bc6 +Block 0024 [ 48]: 6f6cf4ad82fee9b5 +Block 0024 [ 49]: 23ee0fdc617b3371 +Block 0024 [ 50]: 72977b49dd5fca77 +Block 0024 [ 51]: 078a29609707ed86 +Block 0024 [ 52]: 1e845ec6fcf9c4de +Block 0024 [ 53]: d4a1726c95c2aaa7 +Block 0024 [ 54]: ae506ede75e7f045 +Block 0024 [ 55]: 9190f1966395a9c6 +Block 0024 [ 56]: dbe7fcbbc526a184 +Block 0024 [ 57]: 586d5c3aeacd5226 +Block 0024 [ 58]: 8dd269404c21d3ff +Block 0024 [ 59]: 751301d17ef82189 +Block 0024 [ 60]: 2402993470e97de7 +Block 0024 [ 61]: cd51ad3dbb4c82c8 +Block 0024 [ 62]: 1daaaa3c21724b8c +Block 0024 [ 63]: b5db8cf3570d6ef0 +Block 0024 [ 64]: 0805b730d8f5d05c +Block 0024 [ 65]: d5a3ea8f5af2c8a6 +Block 0024 [ 66]: d9cc8848e10d4454 +Block 0024 [ 67]: ddf5e1979b9f92e2 +Block 0024 [ 68]: e4803ed4852c4d01 +Block 0024 [ 69]: ba880da04eef76a3 +Block 0024 [ 70]: 5d09daab04b87464 +Block 0024 [ 71]: c7d4f0c9549daa28 +Block 0024 [ 72]: ddbf43d719d53d4f +Block 0024 [ 73]: 6183763c5124b98b +Block 0024 [ 74]: d7ab532519584b50 +Block 0024 [ 75]: b0118b2eb9ef7eeb +Block 0024 [ 76]: 95c105df44141ee0 +Block 0024 [ 77]: 49b86cc9e5725918 +Block 0024 [ 78]: 79b784b0e19e0b33 +Block 0024 [ 79]: ed2979473ac724b6 +Block 0024 [ 80]: ad9f1b4a8c7e911c +Block 0024 [ 81]: 090389b737090273 +Block 0024 [ 82]: 511aae0be50fbf75 +Block 0024 [ 83]: 17716e9bd857569a +Block 0024 [ 84]: 31ac183381af8091 +Block 0024 [ 85]: e9e2884a1dce54cb +Block 0024 [ 86]: f382872d696cbc17 +Block 0024 [ 87]: b189af8cf1ab4cda +Block 0024 [ 88]: 8004a6a570d4442c +Block 0024 [ 89]: 5ba22dff2b0fa063 +Block 0024 [ 90]: 3f7eb430c756173b +Block 0024 [ 91]: 3a5fde8ae23af414 +Block 0024 [ 92]: 65198d9cc3245bd9 +Block 0024 [ 93]: 6b98f194dd3f6cb1 +Block 0024 [ 94]: 870bab4461fee657 +Block 0024 [ 95]: ae5c9422a34d026b +Block 0024 [ 96]: 91fc1fa9414a8b35 +Block 0024 [ 97]: 621f9c8eb0c7576a +Block 0024 [ 98]: 3d0a760827b710a7 +Block 0024 [ 99]: 8049a9ea4814f2a7 +Block 0024 [100]: cb242cd27cfb7aaf +Block 0024 [101]: 9900ad26b5ef0f3f +Block 0024 [102]: 4e6bec2d38ea9a6e +Block 0024 [103]: e887522bb791be19 +Block 0024 [104]: d54f9af1c2b5bc9b +Block 0024 [105]: 794fb8d07ba2c552 +Block 0024 [106]: b04274ed8f5dd494 +Block 0024 [107]: d71bf4bf9a0c5c17 +Block 0024 [108]: 63ace587142a3f25 +Block 0024 [109]: c18c02ae52a2c624 +Block 0024 [110]: 1671b09e592f3356 +Block 0024 [111]: 667d5a337850c037 +Block 0024 [112]: 63ed9adb5ff40317 +Block 0024 [113]: 09761522bdd824cd +Block 0024 [114]: c9f5ceeeb0acce0d +Block 0024 [115]: f372bebae8903146 +Block 0024 [116]: 6c9eda686ff955b6 +Block 0024 [117]: c908b03d9a7ef4dd +Block 0024 [118]: 27a1fb4ad5462cfe +Block 0024 [119]: 65adea8ae2a3691c +Block 0024 [120]: d2f8455998158ff1 +Block 0024 [121]: 4e8d8cff4287451d +Block 0024 [122]: 373a40bd398b3b56 +Block 0024 [123]: 00d65a5e941cf620 +Block 0024 [124]: 1d372b94a5e9724e +Block 0024 [125]: fd18b7bdefd3cc85 +Block 0024 [126]: b73020928acc6ec7 +Block 0024 [127]: 5866a79c2f9b9ec2 +Block 0025 [ 0]: 2c8561d11345bbcb +Block 0025 [ 1]: ce6b125eaa1ab9cd +Block 0025 [ 2]: ef91bc08ad2244e5 +Block 0025 [ 3]: ec81f10048ac717e +Block 0025 [ 4]: a9affd940d74bf39 +Block 0025 [ 5]: cd98cc9c5393538f +Block 0025 [ 6]: 1b7c025eeb86399c +Block 0025 [ 7]: 4440b32b87d747c0 +Block 0025 [ 8]: c0054024c9250c55 +Block 0025 [ 9]: f03d35557436b20c +Block 0025 [ 10]: 764f39d7dd1f043e +Block 0025 [ 11]: 17ac1f78e9f775b1 +Block 0025 [ 12]: 62d840c226d25a5a +Block 0025 [ 13]: d5ef4813fe759d16 +Block 0025 [ 14]: f3baaaedccdeb3f9 +Block 0025 [ 15]: c0feebdc9ba007b3 +Block 0025 [ 16]: 2df4f2102dc70b1f +Block 0025 [ 17]: e14ea24eb589dcbf +Block 0025 [ 18]: 14be7f23ca6820fd +Block 0025 [ 19]: 4c9de98e69afbcd2 +Block 0025 [ 20]: f20fedd341647ed0 +Block 0025 [ 21]: e70fcbb02c9f4f79 +Block 0025 [ 22]: 7f59100d250af8cd +Block 0025 [ 23]: c76e62d635d909c0 +Block 0025 [ 24]: eab76215f68d0071 +Block 0025 [ 25]: 9fa18ffe8b564ddc +Block 0025 [ 26]: 40df692eaa9bee66 +Block 0025 [ 27]: b3a82daf41021a13 +Block 0025 [ 28]: 4199c651a6bd5120 +Block 0025 [ 29]: 89a07dd41b1161fd +Block 0025 [ 30]: 0f47fe85a659fa91 +Block 0025 [ 31]: 040a9d9ee85cfd1e +Block 0025 [ 32]: 92234c7a2bf25570 +Block 0025 [ 33]: b9675da57984dcb4 +Block 0025 [ 34]: d8bf2ee4b5bb9c8d +Block 0025 [ 35]: 32fcffbf779a3384 +Block 0025 [ 36]: 81f8caec0275cb10 +Block 0025 [ 37]: e756b8355cc18d9f +Block 0025 [ 38]: 210c41a46917854e +Block 0025 [ 39]: bbe7ae313f50b74d +Block 0025 [ 40]: 5a0e6077c90b80f3 +Block 0025 [ 41]: 20cbcf55a59f0ae9 +Block 0025 [ 42]: 1a9bf5275e23f6ae +Block 0025 [ 43]: b60aba0334ebd328 +Block 0025 [ 44]: 6232098b300f34c2 +Block 0025 [ 45]: 8b1262163e3ecbe9 +Block 0025 [ 46]: 9450850dc44e0827 +Block 0025 [ 47]: 800f5c08eb0de9be +Block 0025 [ 48]: e02529340ab3491e +Block 0025 [ 49]: 14448f2f13e3eac8 +Block 0025 [ 50]: ca3a090b7fa5fd5c +Block 0025 [ 51]: 2e2855e54d1e7d4d +Block 0025 [ 52]: d80732c77d3b75db +Block 0025 [ 53]: af59db9a16d1295a +Block 0025 [ 54]: db8a6b5029f7e1d0 +Block 0025 [ 55]: cb24634059acee01 +Block 0025 [ 56]: 80d3b1a96dccb73a +Block 0025 [ 57]: d674a0056f0f898b +Block 0025 [ 58]: 7d4e4dc314a7973f +Block 0025 [ 59]: d330792bac28cf76 +Block 0025 [ 60]: adddec91b6a078fe +Block 0025 [ 61]: 9f897bcb1daa95b8 +Block 0025 [ 62]: c5d47c497ba05724 +Block 0025 [ 63]: 36bd497fe0ee75e5 +Block 0025 [ 64]: e41394607adf5f0b +Block 0025 [ 65]: ee10a8850916afa0 +Block 0025 [ 66]: 440a2c96a32b150f +Block 0025 [ 67]: 11a62fe43c209a7d +Block 0025 [ 68]: 2483e11426e0bfbd +Block 0025 [ 69]: 24bbbcbbb3d29f48 +Block 0025 [ 70]: d4922b4a42b77a9b +Block 0025 [ 71]: bd8f38e3a1cbca43 +Block 0025 [ 72]: 5a944ab4975ffc86 +Block 0025 [ 73]: 0a94006a12ca9108 +Block 0025 [ 74]: 2d049664d5293f21 +Block 0025 [ 75]: de2d183b83723606 +Block 0025 [ 76]: 908ce9b248b632fe +Block 0025 [ 77]: 4d2399cbea6d11eb +Block 0025 [ 78]: d3a61307f6d2e71b +Block 0025 [ 79]: d78ff693a340c1b9 +Block 0025 [ 80]: e2b7dedc3bfe183e +Block 0025 [ 81]: f7f9130cf2bc302f +Block 0025 [ 82]: 7ec60ab2f056dddf +Block 0025 [ 83]: 9eb37b7bf5425ae8 +Block 0025 [ 84]: 4c9d4276d205539c +Block 0025 [ 85]: 8b0c8fbabf1d8e4c +Block 0025 [ 86]: 52c844a54b3c0d74 +Block 0025 [ 87]: 85082ba1b87e8697 +Block 0025 [ 88]: fde7046900f73003 +Block 0025 [ 89]: 2885d7326f19e580 +Block 0025 [ 90]: 629e3906763fa72e +Block 0025 [ 91]: 8155ef418fa73ed0 +Block 0025 [ 92]: 9702b7e6c0917c24 +Block 0025 [ 93]: ccbb8af78a30c364 +Block 0025 [ 94]: 3c06039ccc5c1250 +Block 0025 [ 95]: b21fb045ad23a550 +Block 0025 [ 96]: efc77389136204d2 +Block 0025 [ 97]: 4c8fc177b55d223f +Block 0025 [ 98]: 6d303bee7329d236 +Block 0025 [ 99]: 347855b3983e06cf +Block 0025 [100]: 96475c0602f7ab59 +Block 0025 [101]: 0eff8ef338e4c7b4 +Block 0025 [102]: a8358c0ef351209f +Block 0025 [103]: 6400fc24e1bf0846 +Block 0025 [104]: e5893beeb36900c7 +Block 0025 [105]: 8a5c06564967d92a +Block 0025 [106]: f4481f247efaff02 +Block 0025 [107]: 69f0148dbc2507e4 +Block 0025 [108]: 7b19b02cfbd82ab0 +Block 0025 [109]: 4469137a30358b3b +Block 0025 [110]: b1a01da0f55b563f +Block 0025 [111]: b899bcd1494fe3e4 +Block 0025 [112]: e995344bcb8a69cb +Block 0025 [113]: 4862fb4389d31d3a +Block 0025 [114]: cdd82bd88a77097b +Block 0025 [115]: d906fcd88852d153 +Block 0025 [116]: e73aee160b2f9f77 +Block 0025 [117]: 2cf4ab8864284ead +Block 0025 [118]: 94983532f5b9e9d0 +Block 0025 [119]: 8902bb6ab139c3b4 +Block 0025 [120]: d965e225233846ca +Block 0025 [121]: 0febb5dde12e73e6 +Block 0025 [122]: 5dcf41f7ac767e41 +Block 0025 [123]: abe3a933299c8864 +Block 0025 [124]: d52527ce42a74ef7 +Block 0025 [125]: 81a8bf9a14401ee2 +Block 0025 [126]: 5780722f3c56e71a +Block 0025 [127]: 1b5b439ac8fce429 +Block 0026 [ 0]: ae548c9772346e38 +Block 0026 [ 1]: 4fa526f2904c3366 +Block 0026 [ 2]: 9a8e9ea747daadca +Block 0026 [ 3]: 46973c0cd183d6ad +Block 0026 [ 4]: ce6a0e48d6f080dd +Block 0026 [ 5]: 5327d1f0c37edf5a +Block 0026 [ 6]: 5fe636ad749684f6 +Block 0026 [ 7]: 3b569db4a5edbfcf +Block 0026 [ 8]: 90a8b454e4cf3ed7 +Block 0026 [ 9]: 7cdc08367e3e2b71 +Block 0026 [ 10]: dda1e07bca57c639 +Block 0026 [ 11]: 72135942b792af04 +Block 0026 [ 12]: f5d3dbcfb527f94c +Block 0026 [ 13]: 5d53092f61d8b459 +Block 0026 [ 14]: 047f8cf54161ed96 +Block 0026 [ 15]: 28de041eca46827e +Block 0026 [ 16]: 9e852eb5ea2e9fc9 +Block 0026 [ 17]: b7bc6bfbdf8d9473 +Block 0026 [ 18]: 2327a4982d9b8658 +Block 0026 [ 19]: de0448dedc439638 +Block 0026 [ 20]: 934fe5cc76d058dc +Block 0026 [ 21]: 7dd47c7d0611bd3c +Block 0026 [ 22]: ff6491f77d6c374f +Block 0026 [ 23]: 6f2ee705e23e1a62 +Block 0026 [ 24]: d95c95a7c376023f +Block 0026 [ 25]: ebb90bcb0d9a2e1a +Block 0026 [ 26]: 3598ae7c8025d27e +Block 0026 [ 27]: 3acf5e34e2a22c29 +Block 0026 [ 28]: eaa7b06e760fdf0d +Block 0026 [ 29]: c48e161cc6f08026 +Block 0026 [ 30]: dc2f743f8d9ef409 +Block 0026 [ 31]: 66c36a950778d2ef +Block 0026 [ 32]: d9d698a90de3fcc9 +Block 0026 [ 33]: dfaaa9c45957f231 +Block 0026 [ 34]: fa96f793b50fb045 +Block 0026 [ 35]: d12152c0bb31e67e +Block 0026 [ 36]: a9cbe26a967a23e8 +Block 0026 [ 37]: a483b2137eba42a7 +Block 0026 [ 38]: 678e8942ca66a847 +Block 0026 [ 39]: b6c8df9f4f648309 +Block 0026 [ 40]: 85be6df849950f62 +Block 0026 [ 41]: 4a9b1e4f16d00056 +Block 0026 [ 42]: fbf726756de4f7cd +Block 0026 [ 43]: f5f74eee063e34b7 +Block 0026 [ 44]: 52c1dcab8bcb3aa6 +Block 0026 [ 45]: 11fa37fea38d4b35 +Block 0026 [ 46]: a22979225556a561 +Block 0026 [ 47]: 7b6cdcaf026a134f +Block 0026 [ 48]: 02215c77ffb8ba6f +Block 0026 [ 49]: 24c28f63fb82bbcc +Block 0026 [ 50]: 6641a2d247b276ca +Block 0026 [ 51]: 463e403d21ed000f +Block 0026 [ 52]: e1d1c18d038ac211 +Block 0026 [ 53]: b74b95388ef69417 +Block 0026 [ 54]: 5de1e73a34c312c0 +Block 0026 [ 55]: 919719bbabaa83dd +Block 0026 [ 56]: 65b50e27ffe6a184 +Block 0026 [ 57]: 51dac09fb50c02d1 +Block 0026 [ 58]: 2a9815328a8815c2 +Block 0026 [ 59]: ffc7ea217c6861d0 +Block 0026 [ 60]: e020534e9bcd9d60 +Block 0026 [ 61]: fc3b710fa977051a +Block 0026 [ 62]: c8d68adcf4dc7857 +Block 0026 [ 63]: 55d86434ab763b69 +Block 0026 [ 64]: 6fa6c5d1d43e9faa +Block 0026 [ 65]: 2ec426b514999842 +Block 0026 [ 66]: 5884ee9d8bf1835a +Block 0026 [ 67]: 05ef086605a8ef52 +Block 0026 [ 68]: 6a9d4ee140146fca +Block 0026 [ 69]: d6a60aedc3bc7081 +Block 0026 [ 70]: 04b0a19c5451e4f7 +Block 0026 [ 71]: 0ea33ec34ba6b2de +Block 0026 [ 72]: ae420c0fee6ac2b4 +Block 0026 [ 73]: 3fee59ec7d4b26f0 +Block 0026 [ 74]: cfe1ebb530f09ee3 +Block 0026 [ 75]: 45c85970af8da75e +Block 0026 [ 76]: feb044354d937fc6 +Block 0026 [ 77]: 75fa91e6d156063c +Block 0026 [ 78]: f0479b4d513cf9e7 +Block 0026 [ 79]: f8cdc62687425767 +Block 0026 [ 80]: f73dfe8ab5567ae2 +Block 0026 [ 81]: 85c68e4020055359 +Block 0026 [ 82]: 91ed030700606540 +Block 0026 [ 83]: 7f59b1cc08cdd6de +Block 0026 [ 84]: 6503c24c1f5b5c90 +Block 0026 [ 85]: cee0c563eb591403 +Block 0026 [ 86]: a303bfa7eb1b3032 +Block 0026 [ 87]: 99ad670a2df52aae +Block 0026 [ 88]: 5ec0d7924bc8bcfa +Block 0026 [ 89]: f15dc0086097353e +Block 0026 [ 90]: 2aebc4f955613c0b +Block 0026 [ 91]: 5ca9833074c616e9 +Block 0026 [ 92]: 0c833254e30c2f41 +Block 0026 [ 93]: 9b1036a798694f12 +Block 0026 [ 94]: 0baf65d1f2a96312 +Block 0026 [ 95]: d67aad555f4881a6 +Block 0026 [ 96]: 99363147a71a98a9 +Block 0026 [ 97]: b18ba165a3222f8e +Block 0026 [ 98]: 4d6a118499101f4b +Block 0026 [ 99]: 77adecd01727a763 +Block 0026 [100]: 9d9155117157c8b5 +Block 0026 [101]: 9334b2f46d38d90e +Block 0026 [102]: 033648fbf89c6a27 +Block 0026 [103]: 6c96ba978dd3f8c0 +Block 0026 [104]: 91127e21031763c7 +Block 0026 [105]: 7f45dd941d58c054 +Block 0026 [106]: 0c1f22840b808997 +Block 0026 [107]: 9a9c45cb2f25b945 +Block 0026 [108]: 95f018d01ddb615f +Block 0026 [109]: b4a4286739862bdd +Block 0026 [110]: 12b248b330903c22 +Block 0026 [111]: 97867ec381bfee1d +Block 0026 [112]: a3370bd49b04d2ca +Block 0026 [113]: 8ab03ff18952afc9 +Block 0026 [114]: 81c74f0e0e9f3e18 +Block 0026 [115]: 9baa92ecb9564b1d +Block 0026 [116]: 707f7364a07d053e +Block 0026 [117]: b781cb02fb407b4d +Block 0026 [118]: cbef3f8e31dd48f4 +Block 0026 [119]: d3c7cdf145f5d28b +Block 0026 [120]: 24c9538782719f61 +Block 0026 [121]: 6e01e7f44c899af6 +Block 0026 [122]: ba51a4e8a6f5c5c1 +Block 0026 [123]: 42b49d032c5116f7 +Block 0026 [124]: 22c17a60e3321c7f +Block 0026 [125]: 6891d19c5ea28025 +Block 0026 [126]: 2a2c4cf8b6b67af8 +Block 0026 [127]: 89fdbf5492ff1c7f +Block 0027 [ 0]: ac48f5e7f46f4fc7 +Block 0027 [ 1]: 111bfa2387fe89c8 +Block 0027 [ 2]: a6c13eb1f00dcd99 +Block 0027 [ 3]: fb5add8b9675f2ad +Block 0027 [ 4]: 947336bbc2c39d5f +Block 0027 [ 5]: 79170081b46d1552 +Block 0027 [ 6]: faeebc5d66735e64 +Block 0027 [ 7]: d157ef9d8d14e44d +Block 0027 [ 8]: e1108af73d0163a7 +Block 0027 [ 9]: 4dbbd37910f1d938 +Block 0027 [ 10]: 80e8c0cfe5358976 +Block 0027 [ 11]: a3764edca50cfea2 +Block 0027 [ 12]: 3ad83939c168f63d +Block 0027 [ 13]: e3d3799c94fc7059 +Block 0027 [ 14]: 10206472c79f89e5 +Block 0027 [ 15]: a9d5ef9a59a886c6 +Block 0027 [ 16]: 88133d2608d75bfe +Block 0027 [ 17]: d08bc087021ec134 +Block 0027 [ 18]: 7a4a97baf35864f6 +Block 0027 [ 19]: b9e73155448e7298 +Block 0027 [ 20]: a275b2e3bb59940c +Block 0027 [ 21]: d26622791d1b2e81 +Block 0027 [ 22]: da05dba481c66703 +Block 0027 [ 23]: 8633f6b013f0583d +Block 0027 [ 24]: ce34bddc5869a81b +Block 0027 [ 25]: 0da213a70c07c86a +Block 0027 [ 26]: 388e524b02744481 +Block 0027 [ 27]: 08a5c9ca9689ff59 +Block 0027 [ 28]: 9821e14ebc900143 +Block 0027 [ 29]: cfa50a6b406ff2e2 +Block 0027 [ 30]: 1a53259a976999ae +Block 0027 [ 31]: 897f319a5c192ce7 +Block 0027 [ 32]: 74f531c163c3f191 +Block 0027 [ 33]: 0c5f7df2dde9b276 +Block 0027 [ 34]: 3ab217cf1fc819db +Block 0027 [ 35]: bc2c75715c05513d +Block 0027 [ 36]: 45a36d781eba43bd +Block 0027 [ 37]: bee1fe714b21e563 +Block 0027 [ 38]: e6479e8fab9dc871 +Block 0027 [ 39]: 0e1ae1d2ac24ae18 +Block 0027 [ 40]: 32baba742e8b9c07 +Block 0027 [ 41]: 9c5d49921197e424 +Block 0027 [ 42]: 94df5e61cac42a41 +Block 0027 [ 43]: db7a15804336237c +Block 0027 [ 44]: cbebc89ec1ae1ea3 +Block 0027 [ 45]: 2df7c9e2fcd66a2b +Block 0027 [ 46]: addfa745e2f0b541 +Block 0027 [ 47]: 60d4ee32d06bff3c +Block 0027 [ 48]: c0a1d3ff568071a7 +Block 0027 [ 49]: 68ced550e0fe7d47 +Block 0027 [ 50]: 3e06864703d2343a +Block 0027 [ 51]: d4e22f553815e7e5 +Block 0027 [ 52]: 257066f1cd8a6b09 +Block 0027 [ 53]: 8f1b8af2f45309ee +Block 0027 [ 54]: 5b0b4b45373d7762 +Block 0027 [ 55]: b55556164e87c922 +Block 0027 [ 56]: b4855a07acff4d93 +Block 0027 [ 57]: f14c1f32e16d6632 +Block 0027 [ 58]: 5cc4fc4c46151abc +Block 0027 [ 59]: bee51a57eb866845 +Block 0027 [ 60]: f8882d4179c8ba00 +Block 0027 [ 61]: f4668d69538eb68a +Block 0027 [ 62]: 83e8c1cc3aa26049 +Block 0027 [ 63]: 88fb20ca9c98fb62 +Block 0027 [ 64]: f2c3e5d04b183fe9 +Block 0027 [ 65]: 81bd1bc05a4f33a5 +Block 0027 [ 66]: 87f468bfc53c09b3 +Block 0027 [ 67]: d086962547462880 +Block 0027 [ 68]: 5f8c35242d9984c9 +Block 0027 [ 69]: e98e3bdff1298505 +Block 0027 [ 70]: 8eb0beddde71346f +Block 0027 [ 71]: 51338a7e4f3d297b +Block 0027 [ 72]: 472b3c3d565087b9 +Block 0027 [ 73]: 46eb999bac7333a6 +Block 0027 [ 74]: 62443cbed1cadc8a +Block 0027 [ 75]: 26b71b069331c7dc +Block 0027 [ 76]: ad2a45d57cbc6a55 +Block 0027 [ 77]: fd55b1459e4123ca +Block 0027 [ 78]: 823c12d897da595e +Block 0027 [ 79]: 84d4986bafc471e6 +Block 0027 [ 80]: 66a05a4298ca3345 +Block 0027 [ 81]: 7a37fcdfea6adb51 +Block 0027 [ 82]: 56bc9ff1d5f7b168 +Block 0027 [ 83]: db14aae988498545 +Block 0027 [ 84]: 66d40028cd079b41 +Block 0027 [ 85]: 05c66fa63c2fc32d +Block 0027 [ 86]: b49425bd113a373c +Block 0027 [ 87]: ee8be4598a806743 +Block 0027 [ 88]: b83f1835026b9428 +Block 0027 [ 89]: 0b73aec123c56947 +Block 0027 [ 90]: 9a8b473b45918be7 +Block 0027 [ 91]: 93658a783b0883d1 +Block 0027 [ 92]: 1410b26a183a87f1 +Block 0027 [ 93]: 927f2f28732ea0b9 +Block 0027 [ 94]: e921bc3435bf0ac7 +Block 0027 [ 95]: ae24686894148506 +Block 0027 [ 96]: 13bd6039622f0fd5 +Block 0027 [ 97]: c91481340d2e127a +Block 0027 [ 98]: eea71ccc0b4a481a +Block 0027 [ 99]: 0bca32d3fdc77f24 +Block 0027 [100]: 1039e2ff86cb7d80 +Block 0027 [101]: b8eb26ad8ac50063 +Block 0027 [102]: ba25c859c968fcdd +Block 0027 [103]: b1602a88979ec508 +Block 0027 [104]: 99d39c292843e6e9 +Block 0027 [105]: 69c41a0141112cb2 +Block 0027 [106]: 17ff8363cca7f3a2 +Block 0027 [107]: d18ede26963ab3fe +Block 0027 [108]: 14b7b1e93d8b5a3f +Block 0027 [109]: 11191c6bac847bbe +Block 0027 [110]: 6ae81e2647196e86 +Block 0027 [111]: c21472f1a15dbd0f +Block 0027 [112]: 72eef955654aaca2 +Block 0027 [113]: b270a62ad0597a99 +Block 0027 [114]: 984cbc12b08ef54f +Block 0027 [115]: a5315c5bfdfe25c3 +Block 0027 [116]: 5f76937e43898671 +Block 0027 [117]: 7364633ab3970ce5 +Block 0027 [118]: 4f374b7d7f8a1b0a +Block 0027 [119]: 190506b0bb55d642 +Block 0027 [120]: eae14ea2387914da +Block 0027 [121]: 0dc68aced754b64c +Block 0027 [122]: 075bd13c980f8d5d +Block 0027 [123]: c409e3f292bd7f17 +Block 0027 [124]: 693248d680ad014b +Block 0027 [125]: 0e3b9002bf420a1e +Block 0027 [126]: 7ce6516b1b1fbf1f +Block 0027 [127]: 4c4e29ee31589c05 +Block 0028 [ 0]: b8e62f53d2ce1494 +Block 0028 [ 1]: 4716437de3cb4939 +Block 0028 [ 2]: e743de1560497632 +Block 0028 [ 3]: 4aef44990a0ce04e +Block 0028 [ 4]: 789495cb8eb2e15c +Block 0028 [ 5]: 2f4c1a5e7daeab2f +Block 0028 [ 6]: 6d5dec3557836315 +Block 0028 [ 7]: 7d4122e1a18253a5 +Block 0028 [ 8]: 2fd87fc3fad80e4f +Block 0028 [ 9]: 560b67a39b7c6946 +Block 0028 [ 10]: fb71469993b02a5d +Block 0028 [ 11]: b843138e008b7e8b +Block 0028 [ 12]: 752d820480fa2a86 +Block 0028 [ 13]: 436b4bbfb932c72b +Block 0028 [ 14]: fb01a61c5836da08 +Block 0028 [ 15]: db034cda046b6127 +Block 0028 [ 16]: 94e8d49a336311cd +Block 0028 [ 17]: 85525bd6d9b150ac +Block 0028 [ 18]: e281ba6b1984ffae +Block 0028 [ 19]: 341cd2cf27ed0fbe +Block 0028 [ 20]: 255fb900f9ee2a57 +Block 0028 [ 21]: 3d2ca7c55efd98b6 +Block 0028 [ 22]: e1bc705a1a4e5936 +Block 0028 [ 23]: 743d8a0984645c1e +Block 0028 [ 24]: d2a25ac5b7a0ae02 +Block 0028 [ 25]: 8464596d961c2fec +Block 0028 [ 26]: 56ccfff6f3f24d1e +Block 0028 [ 27]: 22e2f8934e984ff3 +Block 0028 [ 28]: 81d80069716afabf +Block 0028 [ 29]: 00bda8f056cac233 +Block 0028 [ 30]: facaf2ef615a11b3 +Block 0028 [ 31]: 16220aea7c2361cb +Block 0028 [ 32]: 7a98c8ac8b212c86 +Block 0028 [ 33]: be2046ffd6d4f005 +Block 0028 [ 34]: 4d3a8bfadb8130a6 +Block 0028 [ 35]: e69d29b66fa2840e +Block 0028 [ 36]: 82e6a4458387ec9c +Block 0028 [ 37]: e2fd832d31bc7e24 +Block 0028 [ 38]: 734a2b7a8215dc6f +Block 0028 [ 39]: 3318314708cd9804 +Block 0028 [ 40]: e3ef4eebaa2b3437 +Block 0028 [ 41]: 264b0dbfd42251dc +Block 0028 [ 42]: 666aa0a1091a9f29 +Block 0028 [ 43]: c0dc13ba6d3e4215 +Block 0028 [ 44]: f2d6adf01f5535c2 +Block 0028 [ 45]: 79889c421015c458 +Block 0028 [ 46]: 9f037ee45505e117 +Block 0028 [ 47]: 6e710fbc8eb69ec8 +Block 0028 [ 48]: 2a2c67c6b94577fa +Block 0028 [ 49]: 7076c829b540fcaa +Block 0028 [ 50]: d6a0e63df1de5e75 +Block 0028 [ 51]: 6b915128089dfa26 +Block 0028 [ 52]: 24a738c1369229d6 +Block 0028 [ 53]: 38b6a31386518342 +Block 0028 [ 54]: 2504a90ba6da1fb8 +Block 0028 [ 55]: 3aaca316b13bd802 +Block 0028 [ 56]: d4ded71c362c675a +Block 0028 [ 57]: d279da15ea3260a8 +Block 0028 [ 58]: 622877b73a43e0bc +Block 0028 [ 59]: ed8fdde4c02d0c1f +Block 0028 [ 60]: 9f65a667b53b1f5b +Block 0028 [ 61]: 054434ff440c6b0f +Block 0028 [ 62]: 521510fe15be4238 +Block 0028 [ 63]: 09d1cb3dbbfab3d2 +Block 0028 [ 64]: 60c405bae52b27bb +Block 0028 [ 65]: 4b8430f61f53bffb +Block 0028 [ 66]: ddea9aa360566f0b +Block 0028 [ 67]: 9e4b0cdf140e2d2d +Block 0028 [ 68]: eeb7e866539ca7b8 +Block 0028 [ 69]: 2305d2ec0c38569e +Block 0028 [ 70]: ba3c174f1af83f49 +Block 0028 [ 71]: cf1716cd5dbff726 +Block 0028 [ 72]: c69d9b4bb6156859 +Block 0028 [ 73]: e3fcef7fc8facb83 +Block 0028 [ 74]: b9c49c1058079ee0 +Block 0028 [ 75]: be2238660af66738 +Block 0028 [ 76]: 29e7854ac183dc60 +Block 0028 [ 77]: b093d02735b183c7 +Block 0028 [ 78]: 0d97fe09adb193b0 +Block 0028 [ 79]: 8d4d0e8859e01b2a +Block 0028 [ 80]: 1c09ca06b9d70f7a +Block 0028 [ 81]: 03efd2a5e5867887 +Block 0028 [ 82]: a33148a972381c6d +Block 0028 [ 83]: c5028b2c7cf9d4cd +Block 0028 [ 84]: 8b891e1df0374009 +Block 0028 [ 85]: fdaedfb6277b0c64 +Block 0028 [ 86]: 01f362abbe4b7d66 +Block 0028 [ 87]: 1593ceb38675eb7a +Block 0028 [ 88]: 4851adf7198e4466 +Block 0028 [ 89]: 9723e4ff1426733f +Block 0028 [ 90]: 2d6f41236ebaeb0d +Block 0028 [ 91]: acbf9afa3d54103c +Block 0028 [ 92]: 089f3f91047ae09c +Block 0028 [ 93]: e20fd7da3b7332c5 +Block 0028 [ 94]: 8c3d70105a8261fc +Block 0028 [ 95]: 5234c9bc7fb63220 +Block 0028 [ 96]: 9c483af4900f0f6f +Block 0028 [ 97]: 9cd23f8cdbc29189 +Block 0028 [ 98]: 0d20be4fe1b12641 +Block 0028 [ 99]: 247545f7ebc6b9c5 +Block 0028 [100]: 59d21e2223d7b032 +Block 0028 [101]: 5fddedd3de444155 +Block 0028 [102]: 57c23649004c94a0 +Block 0028 [103]: 47f8c185c7daa78e +Block 0028 [104]: 7a436d32bb4ea254 +Block 0028 [105]: 1ea2b132562f308f +Block 0028 [106]: 1df0c44ae53da0c1 +Block 0028 [107]: 5d94631c278430df +Block 0028 [108]: 223f090e4799308e +Block 0028 [109]: c34b01200a5f0902 +Block 0028 [110]: 28988167ff0bcfd9 +Block 0028 [111]: ca3efac91e41e25f +Block 0028 [112]: d24655cf3dd291cd +Block 0028 [113]: a89f8a7709cf0cc7 +Block 0028 [114]: 77207aee3ce2d692 +Block 0028 [115]: 15447a4d13aee4f0 +Block 0028 [116]: 4eeb873ecdee4dee +Block 0028 [117]: 22fe4e3a6e49ac5d +Block 0028 [118]: b3589967e475ff68 +Block 0028 [119]: 82b89afabfa951b1 +Block 0028 [120]: 507f14e7277ca935 +Block 0028 [121]: 8fc0cdbca8b10d5a +Block 0028 [122]: 468f7431d1d35d51 +Block 0028 [123]: 0d1db698bf4056f7 +Block 0028 [124]: d48ceb4a52d6c49e +Block 0028 [125]: 4bb84640eada6d78 +Block 0028 [126]: e8436d8fac0e9480 +Block 0028 [127]: 26861997b678a434 +Block 0029 [ 0]: dc0dc7d0a82c999a +Block 0029 [ 1]: 0e7cd16d2f440e38 +Block 0029 [ 2]: 9f26fad50ff36536 +Block 0029 [ 3]: cea8f4c5df334ab7 +Block 0029 [ 4]: f300d6980ad722ff +Block 0029 [ 5]: 8eb946655f1d9632 +Block 0029 [ 6]: 0b922b678d8cadbf +Block 0029 [ 7]: ed47f3a695e54f8a +Block 0029 [ 8]: a04f84304cf89f71 +Block 0029 [ 9]: 8ce09bb046ec0a8c +Block 0029 [ 10]: 9d6490006c2a5257 +Block 0029 [ 11]: b3199e810bcfbb88 +Block 0029 [ 12]: 0e207156c4f218a0 +Block 0029 [ 13]: a6398c4e9dbcea21 +Block 0029 [ 14]: c1b9e1a00b8a739f +Block 0029 [ 15]: c526710d98b6bf9b +Block 0029 [ 16]: 456b74b8105ae58b +Block 0029 [ 17]: 1627450bd0fba708 +Block 0029 [ 18]: 41857be6b6848579 +Block 0029 [ 19]: 5233421198274bae +Block 0029 [ 20]: 4b2bd848cd0384c0 +Block 0029 [ 21]: 06e3d552d3f4bb55 +Block 0029 [ 22]: 775fb045ea301961 +Block 0029 [ 23]: b8a46779d7f319f2 +Block 0029 [ 24]: a1727300e2873c49 +Block 0029 [ 25]: 2b547509b7138ebb +Block 0029 [ 26]: dbdcef5e8a67474f +Block 0029 [ 27]: a441df44126436be +Block 0029 [ 28]: 16402d492197daed +Block 0029 [ 29]: 77279d37d3daef7b +Block 0029 [ 30]: 4c6f50e750e0efea +Block 0029 [ 31]: 69a69d2e077902b0 +Block 0029 [ 32]: bee3b81216877446 +Block 0029 [ 33]: 9255f02e02972175 +Block 0029 [ 34]: 7d47b932a7bdc11e +Block 0029 [ 35]: 9b6d5923af072c99 +Block 0029 [ 36]: 0a3819ce8e9f49ed +Block 0029 [ 37]: 98ed9e938b421644 +Block 0029 [ 38]: d1cffdb408dc5063 +Block 0029 [ 39]: 2e615c6fbd0b9642 +Block 0029 [ 40]: ba63184fc76368e8 +Block 0029 [ 41]: 903af699e71bfe3a +Block 0029 [ 42]: 73218c8b59c6af76 +Block 0029 [ 43]: 0fa0e272f3735d96 +Block 0029 [ 44]: 2a287ece60d08fa8 +Block 0029 [ 45]: 4d5475661899e55f +Block 0029 [ 46]: 69d8074c9d0f42ad +Block 0029 [ 47]: 30eebd523eb0754e +Block 0029 [ 48]: b53f283d7752fc7d +Block 0029 [ 49]: 5dea1409e6111e21 +Block 0029 [ 50]: dcd6aba8a5dfe8c6 +Block 0029 [ 51]: ea3657c1e57689fe +Block 0029 [ 52]: d46407d5713004ee +Block 0029 [ 53]: 7cdd19952ee13591 +Block 0029 [ 54]: 38f3d88b0ae422c5 +Block 0029 [ 55]: e7da12227354c586 +Block 0029 [ 56]: 113440ada1f5e39e +Block 0029 [ 57]: 8ccb809fafc63799 +Block 0029 [ 58]: bfd3985569626cf8 +Block 0029 [ 59]: 7ad94e3e7b06e8e8 +Block 0029 [ 60]: 6b444ae566e62a4f +Block 0029 [ 61]: ed7960eada1d2774 +Block 0029 [ 62]: b0bdc355d05782ef +Block 0029 [ 63]: 6e25edee7de6f5e8 +Block 0029 [ 64]: 9d0e81797df63c41 +Block 0029 [ 65]: 693a3bc26573c32a +Block 0029 [ 66]: e7229482ee70c324 +Block 0029 [ 67]: edf62e67ad4eaa5a +Block 0029 [ 68]: bbb26d77c48c9954 +Block 0029 [ 69]: 870f2d918efb8fdc +Block 0029 [ 70]: 422a46134ec8d22c +Block 0029 [ 71]: 35644114b3f8fc04 +Block 0029 [ 72]: 3532571a5c119a3a +Block 0029 [ 73]: aa8b114087670213 +Block 0029 [ 74]: 6006a9a76ab59c06 +Block 0029 [ 75]: 255230fdb77abea5 +Block 0029 [ 76]: bb50b303992eb4bd +Block 0029 [ 77]: 502b81a9140cc5e8 +Block 0029 [ 78]: d1f6edb3918526e5 +Block 0029 [ 79]: 3d729e074a33c655 +Block 0029 [ 80]: 297a725b9b3dafe2 +Block 0029 [ 81]: 8a436bdf75e0799f +Block 0029 [ 82]: f32829e3052dd6e7 +Block 0029 [ 83]: e8020c256d086133 +Block 0029 [ 84]: 3e868bd1c14c4a35 +Block 0029 [ 85]: 510fa73c666a05cf +Block 0029 [ 86]: 2de06be3807cfa46 +Block 0029 [ 87]: 1131a6fc025f90f0 +Block 0029 [ 88]: d948da793fcf0195 +Block 0029 [ 89]: f59ea5fff22c69f3 +Block 0029 [ 90]: 8a8b281df8a1573b +Block 0029 [ 91]: aa614b1304208961 +Block 0029 [ 92]: 4b791a952fc31b04 +Block 0029 [ 93]: 9653dc5b85510b5a +Block 0029 [ 94]: 8391634e659159dc +Block 0029 [ 95]: 6b090f8a6b59c4cd +Block 0029 [ 96]: 04c73c62fb1a121a +Block 0029 [ 97]: 186e3e22f6df5d01 +Block 0029 [ 98]: 775987313eba92bd +Block 0029 [ 99]: b150a5063cd54416 +Block 0029 [100]: a898b872c4290dc0 +Block 0029 [101]: 2dec9c175eaa421e +Block 0029 [102]: f2349cc83080779d +Block 0029 [103]: 7b8a3330d6cc6828 +Block 0029 [104]: 57a82d270e0d0a83 +Block 0029 [105]: f7c09940f35b45e2 +Block 0029 [106]: 395dca91740b4d8f +Block 0029 [107]: dc452d4bb0ff7b49 +Block 0029 [108]: c928d4f1f5feae04 +Block 0029 [109]: 29a21f9c67cb6c67 +Block 0029 [110]: c7192e442ca9c08c +Block 0029 [111]: 86846d3ffae5176f +Block 0029 [112]: 466454ea82069d53 +Block 0029 [113]: 7cbb9ec68b6f3b37 +Block 0029 [114]: 1a3483f87e349bce +Block 0029 [115]: 72735395b8866f07 +Block 0029 [116]: b7845e72f6a6c391 +Block 0029 [117]: d3cd149c07e70ed4 +Block 0029 [118]: 70152f3ba32dadef +Block 0029 [119]: 9b2fc8cf00a302e9 +Block 0029 [120]: a6f923e577c940bd +Block 0029 [121]: 958c7b390683bf99 +Block 0029 [122]: 6835bc14651b0d68 +Block 0029 [123]: 4af56df7bc755c90 +Block 0029 [124]: 1d299f11bef26d4a +Block 0029 [125]: 3c33f78a4e2c7041 +Block 0029 [126]: 1e7aa5bfab2de5f6 +Block 0029 [127]: a1cfbf5cc9690a29 +Block 0030 [ 0]: 56403ff10624a725 +Block 0030 [ 1]: cb21b53aeebf1911 +Block 0030 [ 2]: 6a4b03dec8d7576a +Block 0030 [ 3]: 0a959378af94d9a2 +Block 0030 [ 4]: 76740a8361f993da +Block 0030 [ 5]: f7ec77e7d0a9c2e3 +Block 0030 [ 6]: 930548e31bf90bb6 +Block 0030 [ 7]: 33e8969a8fefb02a +Block 0030 [ 8]: b80b5bdea558ae41 +Block 0030 [ 9]: 7afcf57879a14ff7 +Block 0030 [ 10]: e9a58a4d57c0b159 +Block 0030 [ 11]: b46f819f25300f6d +Block 0030 [ 12]: 73a8dd3fec3d706b +Block 0030 [ 13]: 8df47cfad884b6b8 +Block 0030 [ 14]: db32b4826baff56d +Block 0030 [ 15]: 93fca71b86463568 +Block 0030 [ 16]: 958fb17a99858dc9 +Block 0030 [ 17]: bf8b9deaae690142 +Block 0030 [ 18]: 5d69921ae34a496c +Block 0030 [ 19]: cd9430b2765c1a00 +Block 0030 [ 20]: 3cc3eac00ab30b27 +Block 0030 [ 21]: 784c9d59ff888702 +Block 0030 [ 22]: 5ebfde2ffc5e8612 +Block 0030 [ 23]: fa94037530fc9117 +Block 0030 [ 24]: f1aad571330e6f2d +Block 0030 [ 25]: 12242a0143d83d9a +Block 0030 [ 26]: 067f6bae76476b1f +Block 0030 [ 27]: ab1e017f3b96cf7b +Block 0030 [ 28]: b07114c3fc1b52c3 +Block 0030 [ 29]: d395f25bf240f4cd +Block 0030 [ 30]: 2c4f65c1a5891610 +Block 0030 [ 31]: fd8971a418f37a17 +Block 0030 [ 32]: 59b41782840c6382 +Block 0030 [ 33]: a4609b7937256a85 +Block 0030 [ 34]: 4060a0ad26047191 +Block 0030 [ 35]: d6bb43e24964ce71 +Block 0030 [ 36]: 070744845b3e8c27 +Block 0030 [ 37]: 8a3aced5135b61d5 +Block 0030 [ 38]: 2d361d2aa3d973f6 +Block 0030 [ 39]: f8b7b6450c897249 +Block 0030 [ 40]: c21c5d01c2061db5 +Block 0030 [ 41]: 708ee32963504c80 +Block 0030 [ 42]: e0526f18fa7286fa +Block 0030 [ 43]: 452c1cc6bd2a3df8 +Block 0030 [ 44]: e7ee8913d0dcbe12 +Block 0030 [ 45]: 0d20f9888247400c +Block 0030 [ 46]: c57bb303384000c1 +Block 0030 [ 47]: 8bdbdfd39f23cafd +Block 0030 [ 48]: d3d2db36d3f0bfe9 +Block 0030 [ 49]: 57842c57448b4d21 +Block 0030 [ 50]: 67cccfdc58e9425e +Block 0030 [ 51]: 0a77bcda03f8e7ab +Block 0030 [ 52]: 08162d72f21cd178 +Block 0030 [ 53]: d862f85ef1aad708 +Block 0030 [ 54]: 33a2c7c7302cf000 +Block 0030 [ 55]: 733964f2f7d11f3a +Block 0030 [ 56]: f500fc23d8b85449 +Block 0030 [ 57]: 61de1eb634e3fd8d +Block 0030 [ 58]: fcb8381a3c9cd9b6 +Block 0030 [ 59]: 7017a157f66d15f1 +Block 0030 [ 60]: c64e8b189a954811 +Block 0030 [ 61]: 9ba76d687b94adaf +Block 0030 [ 62]: a6b272e5d92188b8 +Block 0030 [ 63]: 6841fdc815be462f +Block 0030 [ 64]: 1b53ca5fe4da04f9 +Block 0030 [ 65]: d140a9681de7f793 +Block 0030 [ 66]: 2864833625fb709b +Block 0030 [ 67]: 466e842a1e25b9d1 +Block 0030 [ 68]: 6b18539a0e8f361b +Block 0030 [ 69]: bfb3f75745f472ce +Block 0030 [ 70]: 57c2b7c84c8ec029 +Block 0030 [ 71]: 07e8170512cda2eb +Block 0030 [ 72]: 5eb697918e0df23d +Block 0030 [ 73]: a452ae051564b908 +Block 0030 [ 74]: 6de6f313b67d0582 +Block 0030 [ 75]: 134f87167e7c40b2 +Block 0030 [ 76]: eccecc2fe1055b86 +Block 0030 [ 77]: a4ca7026209e9bb1 +Block 0030 [ 78]: 7552964676a78b35 +Block 0030 [ 79]: 7a61cf6633e2fbeb +Block 0030 [ 80]: 784b00f1cbb29afe +Block 0030 [ 81]: 9fcdddd078b1e257 +Block 0030 [ 82]: 00e101054f707c03 +Block 0030 [ 83]: db5adaf60bf2e437 +Block 0030 [ 84]: ef81ffd1dfef4efe +Block 0030 [ 85]: 67485ac05e54166b +Block 0030 [ 86]: f9f051d395efb2ef +Block 0030 [ 87]: 4771eeb1bca6abc0 +Block 0030 [ 88]: 25ed681a049a8932 +Block 0030 [ 89]: 85aa643b1e215974 +Block 0030 [ 90]: b95ce7df5509a035 +Block 0030 [ 91]: dd7ee5ec984e80f7 +Block 0030 [ 92]: b5082241623dec7e +Block 0030 [ 93]: 360e2f0aa5094574 +Block 0030 [ 94]: ecb1e918ba947537 +Block 0030 [ 95]: 4b39a59cf5a4724c +Block 0030 [ 96]: 2c2e27bc2a4aa6cb +Block 0030 [ 97]: daba908b41132d44 +Block 0030 [ 98]: c67199b898cf8033 +Block 0030 [ 99]: 9ea02120498927e8 +Block 0030 [100]: 6f05fdbc9fa3d5b2 +Block 0030 [101]: bb4b7047cfb8b9b5 +Block 0030 [102]: dc3841c0c91928f8 +Block 0030 [103]: 5ecc900dfacc478a +Block 0030 [104]: eb131107b102b5ed +Block 0030 [105]: ef986a212c71b150 +Block 0030 [106]: 8c0346f529d89ff8 +Block 0030 [107]: 15a3dbebdffac0ef +Block 0030 [108]: 23b8ff1afadba569 +Block 0030 [109]: cec9a5bcfeb89a9d +Block 0030 [110]: dfa3a9eab4e56646 +Block 0030 [111]: 6f249dbe4936c946 +Block 0030 [112]: 7cd49a60875ff3b8 +Block 0030 [113]: 456f7d13c3c46c7d +Block 0030 [114]: 06f3cd65d03cb442 +Block 0030 [115]: 2304f587a79164fb +Block 0030 [116]: fa9507f37257dd34 +Block 0030 [117]: e436215a2968e923 +Block 0030 [118]: fadb5d64c644c1f0 +Block 0030 [119]: 6586ddb3ac4ec704 +Block 0030 [120]: c259fb75e774f567 +Block 0030 [121]: 9c6f25ac91097ef7 +Block 0030 [122]: 53a3aa7b117fd8d2 +Block 0030 [123]: a222c5dbfcea5b17 +Block 0030 [124]: f5c7264e4298f7dd +Block 0030 [125]: e42b8aab71526f4c +Block 0030 [126]: 36a06cedca259e6e +Block 0030 [127]: 7d4c74d40f6cf9b1 +Block 0031 [ 0]: 23096d324bc688ac +Block 0031 [ 1]: aaaf0d73fe233abf +Block 0031 [ 2]: 45deb0feb5cfe89f +Block 0031 [ 3]: e75e8591c13fa1c1 +Block 0031 [ 4]: 58fc4134fad92e02 +Block 0031 [ 5]: 5db26a376b615c02 +Block 0031 [ 6]: da053b431ef56ee5 +Block 0031 [ 7]: 6441eaa8d6f4b63b +Block 0031 [ 8]: e505203c43439709 +Block 0031 [ 9]: 6cc836cf5a1d4dd4 +Block 0031 [ 10]: 035f77a001795210 +Block 0031 [ 11]: f7d84a712a0be8c6 +Block 0031 [ 12]: 6374683fe43aafb2 +Block 0031 [ 13]: 79b63ad8b92922bc +Block 0031 [ 14]: c406f248eabf2717 +Block 0031 [ 15]: 575a5c692ab42804 +Block 0031 [ 16]: c6d10060a1cd2621 +Block 0031 [ 17]: 92da1e6618e11b43 +Block 0031 [ 18]: b523f610826573ec +Block 0031 [ 19]: 91647f861a1b738d +Block 0031 [ 20]: 53b2d479aecaeac9 +Block 0031 [ 21]: d718fdfb5f58610d +Block 0031 [ 22]: 093838aa5ff089da +Block 0031 [ 23]: 38372e3db58bffd4 +Block 0031 [ 24]: 8d378223cde74bd9 +Block 0031 [ 25]: b88babf6be9b7885 +Block 0031 [ 26]: 37798d42f3b741e5 +Block 0031 [ 27]: 617dd90119c8ed1e +Block 0031 [ 28]: f16f7f20516e2a35 +Block 0031 [ 29]: c93603426642baa6 +Block 0031 [ 30]: 146abacd69d959f5 +Block 0031 [ 31]: c4247f51d67c6cbd +Block 0031 [ 32]: c0510ff3c43f68a4 +Block 0031 [ 33]: d52b68f374ae3d9a +Block 0031 [ 34]: e5939a3a19bd722d +Block 0031 [ 35]: d5290857364573f0 +Block 0031 [ 36]: 17aa070d61e5c302 +Block 0031 [ 37]: 1f37f8771382a8b5 +Block 0031 [ 38]: 9732439f2585d52c +Block 0031 [ 39]: cb0ff8ecf1a64368 +Block 0031 [ 40]: 6b3aa8cb0652f1d3 +Block 0031 [ 41]: bc79601df3ef67fd +Block 0031 [ 42]: 21a77f1daa776047 +Block 0031 [ 43]: 60f67b8268745ff7 +Block 0031 [ 44]: 6461989778c5c365 +Block 0031 [ 45]: f66c239e51ace489 +Block 0031 [ 46]: 1f4215447e8b95c5 +Block 0031 [ 47]: fda49d068c4cca64 +Block 0031 [ 48]: b82ecf8e54b7be06 +Block 0031 [ 49]: ca622a0f405ecce9 +Block 0031 [ 50]: 486f841dff09d069 +Block 0031 [ 51]: 630e220de62c44b8 +Block 0031 [ 52]: dcd5e3d43775f5c0 +Block 0031 [ 53]: f51e1db1beb85f5d +Block 0031 [ 54]: 9bebcb6211ea1418 +Block 0031 [ 55]: 27c12b98ab0cde15 +Block 0031 [ 56]: 577c8483cefbe03a +Block 0031 [ 57]: f18162e7dfe1fa28 +Block 0031 [ 58]: 4550ae5a14910ef5 +Block 0031 [ 59]: 68c17796c3e18462 +Block 0031 [ 60]: ce3f1bc4d8ca6ea0 +Block 0031 [ 61]: 0a7f6c8713171bf4 +Block 0031 [ 62]: 49db8e353dbc6c63 +Block 0031 [ 63]: 3c1b03bcbf973b61 +Block 0031 [ 64]: 50b73b5a2be2d01a +Block 0031 [ 65]: cad103e62cd424b7 +Block 0031 [ 66]: b63bb94a03e96b94 +Block 0031 [ 67]: 3dce33f43571b63b +Block 0031 [ 68]: 8991efdcd68b1881 +Block 0031 [ 69]: 7991bec920dc2513 +Block 0031 [ 70]: 543bd896a0aec32a +Block 0031 [ 71]: 31975407e35ffbda +Block 0031 [ 72]: 91bf1882d9f04f82 +Block 0031 [ 73]: 915b49ba75abd738 +Block 0031 [ 74]: c14e94a2903fb3dd +Block 0031 [ 75]: 8dd6532f78147d7f +Block 0031 [ 76]: 0451fc2ab0afb3fb +Block 0031 [ 77]: cca805260a94a9f1 +Block 0031 [ 78]: 9d2e561caf0bfae7 +Block 0031 [ 79]: cb48e4c034cb2f70 +Block 0031 [ 80]: e6296174922c963e +Block 0031 [ 81]: bc32fcbb313624c7 +Block 0031 [ 82]: 75c4a636f8acf6cb +Block 0031 [ 83]: 4ad9dd3db09f06c8 +Block 0031 [ 84]: 50edd6878814ca57 +Block 0031 [ 85]: 5bfe1ff263a3ae46 +Block 0031 [ 86]: 68ee772f72f6c8b2 +Block 0031 [ 87]: 9735d4d4522038cb +Block 0031 [ 88]: 6c8b146a8e5bd46e +Block 0031 [ 89]: 786f50b346deed51 +Block 0031 [ 90]: 01b34a7881702460 +Block 0031 [ 91]: 062f20d6acb3e8df +Block 0031 [ 92]: 906c1d926d2fd7ca +Block 0031 [ 93]: e1101e03b5f2f535 +Block 0031 [ 94]: 489144da468edbe4 +Block 0031 [ 95]: 7c69834cb26f3591 +Block 0031 [ 96]: fe71ee9f1eda2fa8 +Block 0031 [ 97]: f686a8a9f320c81d +Block 0031 [ 98]: 0f36ac84e3b1ab3a +Block 0031 [ 99]: 62c84899bff9c8ea +Block 0031 [100]: ab6c693fd5812652 +Block 0031 [101]: 2490c249e4bdc896 +Block 0031 [102]: 90165b9d7707d15d +Block 0031 [103]: 602089074e333b10 +Block 0031 [104]: cfeeb42b75b826f2 +Block 0031 [105]: 25df5eb36f0fcbe6 +Block 0031 [106]: 6c610a78e7e2c121 +Block 0031 [107]: ba9ef75c8b1ab051 +Block 0031 [108]: 751580ae24ffafff +Block 0031 [109]: 796d75c2626f151e +Block 0031 [110]: 51a674f9cd60f453 +Block 0031 [111]: 4092b7a9db825e4b +Block 0031 [112]: 03b892952b3a6783 +Block 0031 [113]: 984f1224c15e46d3 +Block 0031 [114]: 577f3987e96bc50a +Block 0031 [115]: 48c651195cc2f54a +Block 0031 [116]: a188e49cafffb66b +Block 0031 [117]: de2fe79179d0d038 +Block 0031 [118]: 752817094fda94c8 +Block 0031 [119]: ee7fc1aebfdf6676 +Block 0031 [120]: 9ef3229e4a43bc12 +Block 0031 [121]: 4ed60db4a70c9ebc +Block 0031 [122]: ca210a90d1e7b1d5 +Block 0031 [123]: e4ac7e478e4c5742 +Block 0031 [124]: e6495ff396d8363d +Block 0031 [125]: 6ff03b334458fbbe +Block 0031 [126]: 9837e423a5dfa741 +Block 0031 [127]: 047d44015a325363 + + After pass 1: +Block 0000 [ 0]: e3fb2e268f900f66 +Block 0000 [ 1]: 7439378a0a6639f2 +Block 0000 [ 2]: c20177f77b9e57f7 +Block 0000 [ 3]: 62d1c2f3b177e775 +Block 0000 [ 4]: 010b430eca211c55 +Block 0000 [ 5]: 581f6b73beb358a2 +Block 0000 [ 6]: de4531f2d3e9e765 +Block 0000 [ 7]: 354d361204880bc4 +Block 0000 [ 8]: 60f45d3ec3e81426 +Block 0000 [ 9]: 59d1b09beef4315c +Block 0000 [ 10]: 4c32367f94014002 +Block 0000 [ 11]: c62f23749953a777 +Block 0000 [ 12]: 96ba213b1c87add4 +Block 0000 [ 13]: 9d4a8c5f9f9979bf +Block 0000 [ 14]: ceba387fd3bf3ce8 +Block 0000 [ 15]: dcb091e26fdcb1fe +Block 0000 [ 16]: 40c140ea86068435 +Block 0000 [ 17]: 6da8a0c2a2c9f431 +Block 0000 [ 18]: 354901ef32128b87 +Block 0000 [ 19]: d46f9eb89dad9f84 +Block 0000 [ 20]: 1fcc3f60149dc112 +Block 0000 [ 21]: 2a341f1c1dc3af46 +Block 0000 [ 22]: 22659f2bfd353eeb +Block 0000 [ 23]: 4d6d28963f38a164 +Block 0000 [ 24]: df5d69f9d0b40c13 +Block 0000 [ 25]: 89abf69974dd6c09 +Block 0000 [ 26]: a46625c20113d827 +Block 0000 [ 27]: 6f65f7f4457eea4b +Block 0000 [ 28]: 4a2166aeb2c13701 +Block 0000 [ 29]: cc33af554ce1f9d5 +Block 0000 [ 30]: 2af8f0a4ab422f82 +Block 0000 [ 31]: 1471f3986be1318e +Block 0000 [ 32]: c189f6ad217e1902 +Block 0000 [ 33]: a4025f02c6f24e1b +Block 0000 [ 34]: 000270894020bf40 +Block 0000 [ 35]: ac654c608f7f6b1a +Block 0000 [ 36]: e890c2c953eb6cff +Block 0000 [ 37]: f70fd27b375d00c9 +Block 0000 [ 38]: f818fd8309282f55 +Block 0000 [ 39]: 0f82560ec9db8484 +Block 0000 [ 40]: 2fadca952c97e08d +Block 0000 [ 41]: 560503e18158235b +Block 0000 [ 42]: 8f75cedfa48eae2c +Block 0000 [ 43]: b0c0ba0f37f28d8c +Block 0000 [ 44]: 0ab11a787093b7c8 +Block 0000 [ 45]: 4ae894919c99adfd +Block 0000 [ 46]: b9438539887c129e +Block 0000 [ 47]: 652052807b9b929e +Block 0000 [ 48]: 1030a36998d8fc43 +Block 0000 [ 49]: 0d78648b147fc3fb +Block 0000 [ 50]: a3935a0d4d807f6b +Block 0000 [ 51]: 18322a1a3359986f +Block 0000 [ 52]: 39a4740b865a74d9 +Block 0000 [ 53]: efa0e864a84dbda3 +Block 0000 [ 54]: e2f7ea75d1373e2f +Block 0000 [ 55]: 52f49da5261114b3 +Block 0000 [ 56]: 6a9f76e97f268ed1 +Block 0000 [ 57]: 43b853a2d338a8a0 +Block 0000 [ 58]: e1ae6a0bd807180b +Block 0000 [ 59]: 01040029cc767661 +Block 0000 [ 60]: 5e58e78ee50a1767 +Block 0000 [ 61]: 57ec24216fc63ed8 +Block 0000 [ 62]: 80a49c3f22fdd85d +Block 0000 [ 63]: d5d0e4eead2e4ef1 +Block 0000 [ 64]: d90cd2dea871320e +Block 0000 [ 65]: 4898d8ab95cc1eac +Block 0000 [ 66]: b2526ee0ecd1b7c3 +Block 0000 [ 67]: 3f1304f97e40d1fd +Block 0000 [ 68]: 4fe7f903ccd50fc7 +Block 0000 [ 69]: b09f1e4534a2b086 +Block 0000 [ 70]: 15b2d783fef56d65 +Block 0000 [ 71]: 623b233f45b78357 +Block 0000 [ 72]: 222b8328857cbbf3 +Block 0000 [ 73]: 9e8b591e3ddc674b +Block 0000 [ 74]: 9d5f9c1175d3cfac +Block 0000 [ 75]: cdfed2479475ff0f +Block 0000 [ 76]: 578303162fa2fd68 +Block 0000 [ 77]: abdff1e5a90040df +Block 0000 [ 78]: 8bdf145f562c9439 +Block 0000 [ 79]: 6fdd6ee3687d0755 +Block 0000 [ 80]: e79896384171ce2c +Block 0000 [ 81]: 5fe7b604f2342731 +Block 0000 [ 82]: ce9aaeb79e334ae3 +Block 0000 [ 83]: ff7393ad8d8452ab +Block 0000 [ 84]: 1340d485daddd017 +Block 0000 [ 85]: 9f5e61eb20c73f56 +Block 0000 [ 86]: 12708fe8ee89f971 +Block 0000 [ 87]: 83e57ca3b90fd30d +Block 0000 [ 88]: 57bd5a009e893c1a +Block 0000 [ 89]: e8a2427f400a6b68 +Block 0000 [ 90]: 1864104374f0922c +Block 0000 [ 91]: 3a07637c208d2efe +Block 0000 [ 92]: 621a846dcbfb1ced +Block 0000 [ 93]: 533f537dd33899fb +Block 0000 [ 94]: 56054d47bd2bf2bc +Block 0000 [ 95]: bd5da1e233daecba +Block 0000 [ 96]: c828f6e61986518c +Block 0000 [ 97]: f776e421d7691707 +Block 0000 [ 98]: dd4d1701c47721a0 +Block 0000 [ 99]: ef2a67d69b2090a4 +Block 0000 [100]: 0e48ac99d7796b67 +Block 0000 [101]: 6f35548fd9821251 +Block 0000 [102]: e360107576a231e4 +Block 0000 [103]: 85b6afa7a07e8f2e +Block 0000 [104]: 80df552826894974 +Block 0000 [105]: 85fb118f9f9acbca +Block 0000 [106]: f9e6526764ae5abc +Block 0000 [107]: 3166d902c90b73ab +Block 0000 [108]: 2db764f075d97191 +Block 0000 [109]: 91bb8e6002bcdd69 +Block 0000 [110]: 3b4bd48482fc18a0 +Block 0000 [111]: 1964e27d7b517411 +Block 0000 [112]: 04bce2ee1a2ae0fb +Block 0000 [113]: c8b55cdb33615758 +Block 0000 [114]: 5571d3cf275d9e9a +Block 0000 [115]: eb7dc587cf0ba5c3 +Block 0000 [116]: f42371866a0ba059 +Block 0000 [117]: a0096158492b1118 +Block 0000 [118]: d5fbd8925fbca58a +Block 0000 [119]: bc448b96f2f5d0f8 +Block 0000 [120]: 017a72102e722138 +Block 0000 [121]: 8eef302392d4e786 +Block 0000 [122]: 8ecde5ec0f48c234 +Block 0000 [123]: 8484b051cf5d7390 +Block 0000 [124]: 341edf1f8ce7f000 +Block 0000 [125]: 20997c56a8c10e85 +Block 0000 [126]: 23b51c14aa856b3e +Block 0000 [127]: 46e559dac5ea41be +Block 0001 [ 0]: 1d46a5b2e77de72b +Block 0001 [ 1]: ee043289f4d0831d +Block 0001 [ 2]: 1a413147f5e3b9f7 +Block 0001 [ 3]: 137f3aef8602d2f1 +Block 0001 [ 4]: d454d1ffa74dc5fb +Block 0001 [ 5]: 828cda6b79135058 +Block 0001 [ 6]: 278f3ea96a5cd853 +Block 0001 [ 7]: afdb583dd84a8191 +Block 0001 [ 8]: 1642eb90bbf75ac2 +Block 0001 [ 9]: 3b841aa72f245bda +Block 0001 [ 10]: f3b6ce618684abd1 +Block 0001 [ 11]: d9111cea61e82f2c +Block 0001 [ 12]: b00bc3cfc9f3e0ec +Block 0001 [ 13]: 13e0841f678146d0 +Block 0001 [ 14]: 87344022a6314341 +Block 0001 [ 15]: 16ebe5bbda788f2c +Block 0001 [ 16]: f31897fc7711373d +Block 0001 [ 17]: 95646b8a01c39e6d +Block 0001 [ 18]: 9978b1566a604df2 +Block 0001 [ 19]: 28e3b9275aa1cb95 +Block 0001 [ 20]: fbe7b8cd882db34e +Block 0001 [ 21]: 68db9956b0687fd5 +Block 0001 [ 22]: e3a130ad0550deb5 +Block 0001 [ 23]: 48816eecc8abd94a +Block 0001 [ 24]: 7d6fc00b6ba0c2bf +Block 0001 [ 25]: 2f4472d95cf686fe +Block 0001 [ 26]: 327f0b645db59ab9 +Block 0001 [ 27]: 829296ca1a22fc08 +Block 0001 [ 28]: 0f0a79cdf903f2e8 +Block 0001 [ 29]: 6c332ecad39a87bd +Block 0001 [ 30]: 1e260f565f5989b7 +Block 0001 [ 31]: d5a1473dbe2d0aa2 +Block 0001 [ 32]: 096a921679ba2dd1 +Block 0001 [ 33]: 7619e7d77c9d01bb +Block 0001 [ 34]: 3b56411b799de6e2 +Block 0001 [ 35]: c949efaa5d0a4df2 +Block 0001 [ 36]: e53adb20842f3ca6 +Block 0001 [ 37]: 136521fd46a4acb8 +Block 0001 [ 38]: 8197cfc0a1fcf52f +Block 0001 [ 39]: 311a717a05a453f1 +Block 0001 [ 40]: f1fefcc0c061303e +Block 0001 [ 41]: f847097f596a3f8e +Block 0001 [ 42]: f194b08886ac3cad +Block 0001 [ 43]: a9246165ca378831 +Block 0001 [ 44]: 8ac25ee4ae34f610 +Block 0001 [ 45]: 33df3ba56469a9ea +Block 0001 [ 46]: 9eee7810a9d70864 +Block 0001 [ 47]: 6c75b1e152236a92 +Block 0001 [ 48]: 752235f00bb5c903 +Block 0001 [ 49]: f164925c2a7be36c +Block 0001 [ 50]: 2da1e30108fc8fb4 +Block 0001 [ 51]: 6c3771e335d6017a +Block 0001 [ 52]: cf4b88a58975d2be +Block 0001 [ 53]: a88c5459281f39b1 +Block 0001 [ 54]: 60905f0a77168ee8 +Block 0001 [ 55]: f94282bf2a421210 +Block 0001 [ 56]: fc76fc1fc2f01720 +Block 0001 [ 57]: 6da2751d9852faed +Block 0001 [ 58]: 986d26816864de3d +Block 0001 [ 59]: c553f05019d4a321 +Block 0001 [ 60]: 68c6e60d0a99ebf5 +Block 0001 [ 61]: 57b8d0f980f32975 +Block 0001 [ 62]: dcf1a931b0a4d91a +Block 0001 [ 63]: b524327c5a6cba95 +Block 0001 [ 64]: 0177bc3461dae88d +Block 0001 [ 65]: 06334cd19b2360ff +Block 0001 [ 66]: b4c95ce9ae0a4f33 +Block 0001 [ 67]: d7db629a31078d2d +Block 0001 [ 68]: 7d5508fc240cfafa +Block 0001 [ 69]: f1ac892f9fca325b +Block 0001 [ 70]: 4ac67ba91de337bb +Block 0001 [ 71]: b585e1542b744ef2 +Block 0001 [ 72]: a5ec9f043faa061b +Block 0001 [ 73]: 9f14c405dcc67e3d +Block 0001 [ 74]: fc1a0455604f4d26 +Block 0001 [ 75]: 6e47c36365efe9dc +Block 0001 [ 76]: 72c7224932bb6a4c +Block 0001 [ 77]: 88cccd6e1051059c +Block 0001 [ 78]: a2af3bfda6893035 +Block 0001 [ 79]: e2661142356aa6df +Block 0001 [ 80]: 7fc859e8fb9fc4c5 +Block 0001 [ 81]: e01830977c1c69cd +Block 0001 [ 82]: bdc1fbb0acfc8c68 +Block 0001 [ 83]: c4de467177585060 +Block 0001 [ 84]: fb0eb9f25baeaa8d +Block 0001 [ 85]: 5543c3b2d23a6aaf +Block 0001 [ 86]: fc5364f361affef3 +Block 0001 [ 87]: 2661b6ec9e3e81df +Block 0001 [ 88]: 159eb8a3dbaa5544 +Block 0001 [ 89]: 832e5850eff81dc6 +Block 0001 [ 90]: dfb275dfc14906d6 +Block 0001 [ 91]: 5750dd06ccfc208d +Block 0001 [ 92]: 9d11f0f4f89bdf02 +Block 0001 [ 93]: 01e7694ed5472b3f +Block 0001 [ 94]: 4324d37e2bfbf8e5 +Block 0001 [ 95]: 8521c6316b93ac44 +Block 0001 [ 96]: 98dc479af8e8a9f2 +Block 0001 [ 97]: d2f8f5aad51138b3 +Block 0001 [ 98]: 58726306640d6589 +Block 0001 [ 99]: 5c4ecb3b0d6b62ec +Block 0001 [100]: 8945f8442b28eb03 +Block 0001 [101]: 524b58de58beaaa5 +Block 0001 [102]: 9c56af0137be0cbf +Block 0001 [103]: ef5fbe2d37f124fe +Block 0001 [104]: d6e3bc8059623ca4 +Block 0001 [105]: b0de22803b1601f5 +Block 0001 [106]: 5c315b2b993bb075 +Block 0001 [107]: b384762e9a33032d +Block 0001 [108]: 0ef7659cc86a507c +Block 0001 [109]: 3955126c3bd9622f +Block 0001 [110]: 135f29240906f1f4 +Block 0001 [111]: 5075234a142090cd +Block 0001 [112]: 8a8be6391efa19fc +Block 0001 [113]: a7a10c3e7ff74a32 +Block 0001 [114]: 5c2627796eff60c7 +Block 0001 [115]: 821550147aa89280 +Block 0001 [116]: be80b9eb6aabadea +Block 0001 [117]: 798d50a096ea77ab +Block 0001 [118]: dcce0f3961cfb9a3 +Block 0001 [119]: 0acc89da98f8679a +Block 0001 [120]: 57f813a9c5319e77 +Block 0001 [121]: f59343cd09f18438 +Block 0001 [122]: 027826810b9e9474 +Block 0001 [123]: b0b30ee45fc4a37c +Block 0001 [124]: 67634e6f8a5f6fc5 +Block 0001 [125]: 78d288209655dfea +Block 0001 [126]: 5def1a47dc8ca912 +Block 0001 [127]: cb8baddc01104603 +Block 0002 [ 0]: b4f32766fc2fb715 +Block 0002 [ 1]: b4be7123402136f7 +Block 0002 [ 2]: 76c140b72f75b567 +Block 0002 [ 3]: 3ddae7ab29a3f6b0 +Block 0002 [ 4]: da2ef6fd1cb4794a +Block 0002 [ 5]: 07df94d5ee2a521d +Block 0002 [ 6]: f25b5953f3000e6a +Block 0002 [ 7]: dbbee6dfb89a14b2 +Block 0002 [ 8]: 0b8316e5ed48a90b +Block 0002 [ 9]: 1581355e70cc9236 +Block 0002 [ 10]: afbd73fed4169592 +Block 0002 [ 11]: 9ff78789ddd91d69 +Block 0002 [ 12]: 96c564bc213dfe7d +Block 0002 [ 13]: 112d0463dc156aee +Block 0002 [ 14]: 6527a1ad0c92b02e +Block 0002 [ 15]: ad9c72af7b646823 +Block 0002 [ 16]: 5ea4b9e339b1d704 +Block 0002 [ 17]: 3979e9bea09cd602 +Block 0002 [ 18]: 4723715624125911 +Block 0002 [ 19]: b5df880742867f2e +Block 0002 [ 20]: c108f080d30b96ae +Block 0002 [ 21]: a8561bf92ae22acb +Block 0002 [ 22]: 6f308a25cb4f44d0 +Block 0002 [ 23]: 49210f1bf5f858c5 +Block 0002 [ 24]: 103369041f7680e8 +Block 0002 [ 25]: 25d0b08974d86a6b +Block 0002 [ 26]: 7bbf1e22d47e3d65 +Block 0002 [ 27]: 05fe020bbba43726 +Block 0002 [ 28]: 93e03d5983cef0e7 +Block 0002 [ 29]: 114d01ffcecdeb5b +Block 0002 [ 30]: f919d06131c10a1e +Block 0002 [ 31]: a22840ab2762cbc3 +Block 0002 [ 32]: 097d11bec1f7cbc6 +Block 0002 [ 33]: d52cecc28a335714 +Block 0002 [ 34]: 63122b395c488511 +Block 0002 [ 35]: 64472a45b661ef38 +Block 0002 [ 36]: ea07ed5de91005d4 +Block 0002 [ 37]: 33c0d9c1cc815745 +Block 0002 [ 38]: 0b2e7b3981120872 +Block 0002 [ 39]: 732b2581fd570e0f +Block 0002 [ 40]: c8695bf549790cb4 +Block 0002 [ 41]: 8df10d022cd4fd88 +Block 0002 [ 42]: 995ff789a7cb6b50 +Block 0002 [ 43]: 70cf63fd75857b7a +Block 0002 [ 44]: 4f555cef13ca0d28 +Block 0002 [ 45]: 17d3047d6d033515 +Block 0002 [ 46]: 6c5ae23de1db47ac +Block 0002 [ 47]: 625eb5cc235887a0 +Block 0002 [ 48]: 73af705d95f9cf8d +Block 0002 [ 49]: 1ac7e7701ba27dca +Block 0002 [ 50]: c4843a320e7b9fc6 +Block 0002 [ 51]: 3f25a42a594fa429 +Block 0002 [ 52]: 55f42396f1bf059c +Block 0002 [ 53]: 0e8cd0250b6d8625 +Block 0002 [ 54]: 0f2258ea9f4861cf +Block 0002 [ 55]: 681355aa8627bdb8 +Block 0002 [ 56]: ad29e95503aa1771 +Block 0002 [ 57]: 94a9f6879c452369 +Block 0002 [ 58]: 149cb980146efa30 +Block 0002 [ 59]: 602a44afe93a9f5f +Block 0002 [ 60]: fd14465f4f512e10 +Block 0002 [ 61]: 3413ec3ca9fdb30b +Block 0002 [ 62]: 8427afaf7ab98367 +Block 0002 [ 63]: 434e9e4d896635f2 +Block 0002 [ 64]: e4eb02c319e2ead2 +Block 0002 [ 65]: 448e0fafa49c93ff +Block 0002 [ 66]: 8726e904d7e8f0f6 +Block 0002 [ 67]: 73ae51697f0ab4f8 +Block 0002 [ 68]: 5142c819e36f773e +Block 0002 [ 69]: 7f5a2d32df8d53a1 +Block 0002 [ 70]: cc2846c871a2889c +Block 0002 [ 71]: 6e2b8567fea69da2 +Block 0002 [ 72]: 91100438361d9622 +Block 0002 [ 73]: 4cb71cf58ceaf767 +Block 0002 [ 74]: fe8a9955a43595eb +Block 0002 [ 75]: b97e39ed024a43c8 +Block 0002 [ 76]: 4d6414f34e9caffa +Block 0002 [ 77]: 5b5bed31c60830e3 +Block 0002 [ 78]: cf165fb09f73fb04 +Block 0002 [ 79]: 17abd5f9f889a471 +Block 0002 [ 80]: c6f73bf10ba51c54 +Block 0002 [ 81]: 65da4391f68a8e02 +Block 0002 [ 82]: 67bf0346f3d53a10 +Block 0002 [ 83]: 77f940e9eb97d2d4 +Block 0002 [ 84]: 605974ad27989635 +Block 0002 [ 85]: 21b0ec7eaedf7a33 +Block 0002 [ 86]: 88eb7335366fb318 +Block 0002 [ 87]: b73c625a6339d2b3 +Block 0002 [ 88]: 5c8dc992d77e8e90 +Block 0002 [ 89]: d50c7a303def9f09 +Block 0002 [ 90]: 1b199eb77a37ac69 +Block 0002 [ 91]: 31b378bdafeeb51a +Block 0002 [ 92]: 2023a7c7e4f019d6 +Block 0002 [ 93]: cd3b1c43efd5849b +Block 0002 [ 94]: f021ebf3bfa3b6c6 +Block 0002 [ 95]: 83626e46f7f59e0d +Block 0002 [ 96]: f883913b9ae4b67a +Block 0002 [ 97]: 10327dd93721f1cd +Block 0002 [ 98]: 16921c8fa5cefadc +Block 0002 [ 99]: 6e26e0a2bbdcbc3e +Block 0002 [100]: 725dfa6d9c0bc5b5 +Block 0002 [101]: 1b650e997b82bcd8 +Block 0002 [102]: 968189d7fb58b109 +Block 0002 [103]: e2f3a2b6dddf70f4 +Block 0002 [104]: 05417319b93fbce2 +Block 0002 [105]: 715b3caa09ba64a4 +Block 0002 [106]: 5ad3b9ea8304a1ff +Block 0002 [107]: da2ab3d41e9ad55c +Block 0002 [108]: 14a0134d456f6a5e +Block 0002 [109]: aa1a634770dd5c11 +Block 0002 [110]: 49affc08d9c2903b +Block 0002 [111]: 48b0f1a6ae6b2d1d +Block 0002 [112]: 768313caff151bef +Block 0002 [113]: ecbc63fec84ea4ca +Block 0002 [114]: b4577151fb984765 +Block 0002 [115]: d2d1985874cb658d +Block 0002 [116]: bc43a0591a20cd5f +Block 0002 [117]: 592a7265947f118d +Block 0002 [118]: 0993d95f533614b8 +Block 0002 [119]: d8fb1f2db0ba6cf1 +Block 0002 [120]: 1e272a1ceb9723d2 +Block 0002 [121]: 7e8d79d8729e9b85 +Block 0002 [122]: 11a54d8443ef30ef +Block 0002 [123]: 13ebd278cf6408d0 +Block 0002 [124]: 0cb0c6f9c1c0e050 +Block 0002 [125]: 79a3979f69f9b011 +Block 0002 [126]: d9766dc5dc6a6d28 +Block 0002 [127]: 5dff30db21f8d34b +Block 0003 [ 0]: 5c0e8eb2ac341116 +Block 0003 [ 1]: d6cbfe9db820a7e5 +Block 0003 [ 2]: 88492690bb5b492f +Block 0003 [ 3]: 575b925dbc5bdd67 +Block 0003 [ 4]: ae23b16af730b3fb +Block 0003 [ 5]: 4061245bdf3d1d82 +Block 0003 [ 6]: bfe1c0711a35e1fb +Block 0003 [ 7]: 7c9e1bef0badaa6f +Block 0003 [ 8]: 88577520aff0bb2f +Block 0003 [ 9]: 7acf6df13b05aac3 +Block 0003 [ 10]: 623a024f7e05b7fe +Block 0003 [ 11]: 34df9986d84cba1a +Block 0003 [ 12]: 5891c7d8f9ad674a +Block 0003 [ 13]: 32bb68644f3f58c7 +Block 0003 [ 14]: 193a98d182752695 +Block 0003 [ 15]: 7348c6bb53017adb +Block 0003 [ 16]: a88c1149dda47535 +Block 0003 [ 17]: 809e8ecfc2c5cd1c +Block 0003 [ 18]: 7d1aeb5921a12730 +Block 0003 [ 19]: 088ff3b306bc7c7f +Block 0003 [ 20]: 61528227a0238c93 +Block 0003 [ 21]: 70cfaec7557e33b7 +Block 0003 [ 22]: f6b2d0f57f22ad1e +Block 0003 [ 23]: 788ad5922ecef9eb +Block 0003 [ 24]: 33cbd46c228be5d4 +Block 0003 [ 25]: a93f311e2b4b75c9 +Block 0003 [ 26]: 484459669692d78c +Block 0003 [ 27]: 541c85a4417d9430 +Block 0003 [ 28]: 72d61a7a6b6d38bd +Block 0003 [ 29]: e0361f44eda3b596 +Block 0003 [ 30]: 692540b77b35ebef +Block 0003 [ 31]: 76b1bf917b94fa09 +Block 0003 [ 32]: eb5172026b59e31c +Block 0003 [ 33]: b76d44dd4831053e +Block 0003 [ 34]: d7c26331cb64f3ba +Block 0003 [ 35]: d95df2282cb8145c +Block 0003 [ 36]: 2c762e95be0804b2 +Block 0003 [ 37]: 3b88edbe0e2d4479 +Block 0003 [ 38]: ed5d75dc5a5c0c96 +Block 0003 [ 39]: 8ddcccf638269fa1 +Block 0003 [ 40]: ef30ba9ec1903bcd +Block 0003 [ 41]: 7889f9abfdc37681 +Block 0003 [ 42]: 2b5df0abfa9b20f0 +Block 0003 [ 43]: a4e7f0b03ca55b8f +Block 0003 [ 44]: 68ee4e5ed9fe7b3f +Block 0003 [ 45]: ff112f684abee477 +Block 0003 [ 46]: 92b431d39e2a5763 +Block 0003 [ 47]: e8e36d6f8ee809c1 +Block 0003 [ 48]: d0237005b70919ef +Block 0003 [ 49]: 9957f98730d4b330 +Block 0003 [ 50]: 8d18db3c306a60ef +Block 0003 [ 51]: 6d2162fb5f2a8aac +Block 0003 [ 52]: 78993074cf0cb196 +Block 0003 [ 53]: 6d78ef0d260570da +Block 0003 [ 54]: c90be290f0c0db9a +Block 0003 [ 55]: e48d40d1222f1f75 +Block 0003 [ 56]: f1b0f25d7bae9f64 +Block 0003 [ 57]: b1d85163880e9e9c +Block 0003 [ 58]: 248f2f66c9bd3bf4 +Block 0003 [ 59]: 2db350fc6b31ff01 +Block 0003 [ 60]: 72c42963f8f7b1a3 +Block 0003 [ 61]: ce4692fb8577a860 +Block 0003 [ 62]: e8acb2712ccc1ac1 +Block 0003 [ 63]: e9e0055b9eb7d5b0 +Block 0003 [ 64]: c542863e636709ff +Block 0003 [ 65]: 208b57f939fa9149 +Block 0003 [ 66]: eeaecbacd2d723f3 +Block 0003 [ 67]: 2dd1762f5f3a4599 +Block 0003 [ 68]: a0b5bd72118eff35 +Block 0003 [ 69]: 87872e604d5acaf7 +Block 0003 [ 70]: 9d8df3f9ac5fac10 +Block 0003 [ 71]: 38ab8f0728f28d9f +Block 0003 [ 72]: bb869f5c8685f822 +Block 0003 [ 73]: 3cc84bfa15771927 +Block 0003 [ 74]: b33d955eb5058f87 +Block 0003 [ 75]: 50c5a14edb21eda3 +Block 0003 [ 76]: d0f8e0798baa0b9e +Block 0003 [ 77]: ffc370f5bce3ae00 +Block 0003 [ 78]: c7c8d7aeff8c896a +Block 0003 [ 79]: afc9c0f4d2bf5a7e +Block 0003 [ 80]: 180a72ef88468cb6 +Block 0003 [ 81]: 325d27bcb46aad62 +Block 0003 [ 82]: 6eae39a4e3d0412c +Block 0003 [ 83]: 7563b8c1117a5e34 +Block 0003 [ 84]: 3256ecedd245c3b6 +Block 0003 [ 85]: b9dad1a682af2e64 +Block 0003 [ 86]: 3be5053f516bd861 +Block 0003 [ 87]: 8f5580350b1f1212 +Block 0003 [ 88]: 3a5ccfa24b2ebe57 +Block 0003 [ 89]: 8fb6a522f6840c70 +Block 0003 [ 90]: 5f489838feb925d6 +Block 0003 [ 91]: ebf8889f46a7b1c3 +Block 0003 [ 92]: 7af558e63b7fdad4 +Block 0003 [ 93]: cb28e374292c5329 +Block 0003 [ 94]: 3e4d57c7c3c5138b +Block 0003 [ 95]: 3fb472e35ef05d18 +Block 0003 [ 96]: 4cc10388414f7b2e +Block 0003 [ 97]: 8d8911921bd3a077 +Block 0003 [ 98]: 8d8e0f8cabe24271 +Block 0003 [ 99]: 321a7ed80bacd083 +Block 0003 [100]: 08b6e452b7cb9101 +Block 0003 [101]: bf7529ac1a982911 +Block 0003 [102]: 189ec2106b3b9e2f +Block 0003 [103]: 4548441cb8bb8c67 +Block 0003 [104]: b64d0428974aefac +Block 0003 [105]: 4cac530a3a32b006 +Block 0003 [106]: 5d423e10b4b3083c +Block 0003 [107]: 2e1761749687ae73 +Block 0003 [108]: 340f9d62fb353269 +Block 0003 [109]: d3e4357d05a5b5b7 +Block 0003 [110]: 3ee8e727877f459a +Block 0003 [111]: 86ee8a747f8c4c60 +Block 0003 [112]: c47587b82dc2ce57 +Block 0003 [113]: 59a52a6228b02fe8 +Block 0003 [114]: 6cdd8f8ef8169bd6 +Block 0003 [115]: 532e68c714326200 +Block 0003 [116]: 622f1cf40a3a2cb9 +Block 0003 [117]: 2bae9b42f187e06f +Block 0003 [118]: 8cd5bfae2e4c553a +Block 0003 [119]: c50e498ca51b5a5b +Block 0003 [120]: 1a41b794933f4cc5 +Block 0003 [121]: 5689b19baedfdedb +Block 0003 [122]: cef70989efd8920e +Block 0003 [123]: ceca1ea83d0b60ba +Block 0003 [124]: a86ddf3979f92931 +Block 0003 [125]: a130cfdb97e45d2e +Block 0003 [126]: 214bcbaec54c3ac9 +Block 0003 [127]: 2ae65944689850ef +Block 0004 [ 0]: 68763d8f4dc6b797 +Block 0004 [ 1]: c35b04acb749b220 +Block 0004 [ 2]: 9e008e900fa39b5a +Block 0004 [ 3]: ffdbb9dfa13daf2c +Block 0004 [ 4]: 0f832d5d8848af84 +Block 0004 [ 5]: 3aa712fbe5be6260 +Block 0004 [ 6]: 910492358708f68a +Block 0004 [ 7]: e70d0f634aab150b +Block 0004 [ 8]: e54b338756626586 +Block 0004 [ 9]: cb975f4aa84cd76c +Block 0004 [ 10]: 4c5b052fc9500259 +Block 0004 [ 11]: 9ee8907736c84f2a +Block 0004 [ 12]: 5467359eceb669f0 +Block 0004 [ 13]: dddc583bd4fcc220 +Block 0004 [ 14]: 57c8fa73553d00fd +Block 0004 [ 15]: 7fb1e689663cd50d +Block 0004 [ 16]: 3338faf00a97252b +Block 0004 [ 17]: d5cfae162045a520 +Block 0004 [ 18]: 4b4b806e2a0fe0cd +Block 0004 [ 19]: fd3174851ec2d025 +Block 0004 [ 20]: 7a178853679f3cbc +Block 0004 [ 21]: 6ddad1a999b5fd67 +Block 0004 [ 22]: 99954bf164561cd6 +Block 0004 [ 23]: af17c5929f3ca759 +Block 0004 [ 24]: f181b23304e08f50 +Block 0004 [ 25]: 7f8f7622fd244742 +Block 0004 [ 26]: f14caa940328b8ef +Block 0004 [ 27]: ad856d81e450d0ba +Block 0004 [ 28]: fb922822ca811607 +Block 0004 [ 29]: c358b3e22f333870 +Block 0004 [ 30]: 6e24412ddd113d83 +Block 0004 [ 31]: cca88416017d9909 +Block 0004 [ 32]: 187412167e28c809 +Block 0004 [ 33]: 682ffb02ef727f6b +Block 0004 [ 34]: 47611191fa734e0a +Block 0004 [ 35]: fd3bd5309b064b17 +Block 0004 [ 36]: 4195c7523172d21c +Block 0004 [ 37]: 423a276c971cc93d +Block 0004 [ 38]: bc792a0f02a63fe0 +Block 0004 [ 39]: 527c3b8788e27a62 +Block 0004 [ 40]: 239da2b419083b40 +Block 0004 [ 41]: 072907b2d91069cc +Block 0004 [ 42]: 724ade176929ac75 +Block 0004 [ 43]: 5edc7e2fed571ec0 +Block 0004 [ 44]: fe0a60d8ea3ad1d9 +Block 0004 [ 45]: 57320b55e6fe925a +Block 0004 [ 46]: 8caf29ab89416bb8 +Block 0004 [ 47]: 764bead9160af40e +Block 0004 [ 48]: 3ea1e124b3b51bbd +Block 0004 [ 49]: a609833ebfbeb514 +Block 0004 [ 50]: 620da2d8d4f48d94 +Block 0004 [ 51]: 384a58568455b659 +Block 0004 [ 52]: b8080a5acf01e30b +Block 0004 [ 53]: c86519dab9e33c81 +Block 0004 [ 54]: 4d7235e7cb324477 +Block 0004 [ 55]: afff27bf710bc021 +Block 0004 [ 56]: a3efa9413cbe4f06 +Block 0004 [ 57]: 51e5da49f2d11d10 +Block 0004 [ 58]: 8192b313dff9a6d6 +Block 0004 [ 59]: cc85033019cfb146 +Block 0004 [ 60]: 9a80cf8c4b64c6af +Block 0004 [ 61]: 87a3b9ab1bbe8222 +Block 0004 [ 62]: 6f9f7f808cb3a616 +Block 0004 [ 63]: 5397b40781320e51 +Block 0004 [ 64]: a274c7a9d7565533 +Block 0004 [ 65]: 366db58498da3ad9 +Block 0004 [ 66]: d6984fc1d3dd4abf +Block 0004 [ 67]: 07b70e89b0368f17 +Block 0004 [ 68]: e4dbd66550f2f540 +Block 0004 [ 69]: 5c26abe1ca1e6d6b +Block 0004 [ 70]: 3194d9d33fef1fcf +Block 0004 [ 71]: 1df384259125c83d +Block 0004 [ 72]: d4b8d2eab54bb74e +Block 0004 [ 73]: 6f177beaa794fd94 +Block 0004 [ 74]: 858bfefff34c9703 +Block 0004 [ 75]: a610fe0abb020ddf +Block 0004 [ 76]: 0d605f849ce756eb +Block 0004 [ 77]: e9e3eb0aab42f6a8 +Block 0004 [ 78]: d8cd6f9dd7d1e9c1 +Block 0004 [ 79]: 33570318a05f6a3a +Block 0004 [ 80]: c62f3a7c4675f109 +Block 0004 [ 81]: c0e5c409e7ed3601 +Block 0004 [ 82]: 67d5d3f564f4dcb3 +Block 0004 [ 83]: 8bc802ac83110e66 +Block 0004 [ 84]: b11a610332acecfd +Block 0004 [ 85]: b898c9697bbab146 +Block 0004 [ 86]: b2ebcc2537b600d2 +Block 0004 [ 87]: 4a1860d084ad41ef +Block 0004 [ 88]: 4dbee3a9b3a59057 +Block 0004 [ 89]: b5eec319f63e48e5 +Block 0004 [ 90]: 1ba03fedd1e5988e +Block 0004 [ 91]: b876ab6ed1290b26 +Block 0004 [ 92]: 41910fdd76e03a6e +Block 0004 [ 93]: 9dd560edb3b7fc36 +Block 0004 [ 94]: 40a4b579c8c2757a +Block 0004 [ 95]: e32220051bb6714b +Block 0004 [ 96]: f9e4dbf9770bf1de +Block 0004 [ 97]: a054ed0072a59a4e +Block 0004 [ 98]: 52073e12ecb338da +Block 0004 [ 99]: 410d9b0385df6bf5 +Block 0004 [100]: 4f25338e8af6d101 +Block 0004 [101]: 3027043a4b4d617f +Block 0004 [102]: 022269273a4cc7cc +Block 0004 [103]: 5f86ce2a1aa00a74 +Block 0004 [104]: e14370945c586ef8 +Block 0004 [105]: bcb1fbf3fa607acd +Block 0004 [106]: 170b991401a249a7 +Block 0004 [107]: 834ab77e65d7e23a +Block 0004 [108]: 3f4d81e34b8d43c8 +Block 0004 [109]: df4afb352b1f524f +Block 0004 [110]: a34a706b25eb7856 +Block 0004 [111]: 3e05113600a02864 +Block 0004 [112]: 365e6d8f7f1f4a31 +Block 0004 [113]: 9606eee8204e5272 +Block 0004 [114]: 68d8d969b28fb0c2 +Block 0004 [115]: 1a9eb8715cd6e9b7 +Block 0004 [116]: 185eff4ddb1caae7 +Block 0004 [117]: 3117894ffc3ae59b +Block 0004 [118]: fe3026e14f87ecfe +Block 0004 [119]: 10c7a423fe7a65d5 +Block 0004 [120]: 755e21fe87353390 +Block 0004 [121]: 9aaddb3f131f925b +Block 0004 [122]: 9e7c0ccff3b00927 +Block 0004 [123]: 0ec0b338915b28f7 +Block 0004 [124]: ef3c96c7857be687 +Block 0004 [125]: 1da7a673eb189fc4 +Block 0004 [126]: ca663b09033a76b2 +Block 0004 [127]: af7a04a40a5669b0 +Block 0005 [ 0]: c79f4392922276a5 +Block 0005 [ 1]: a7253a2ca884d327 +Block 0005 [ 2]: 7769226ce18835a5 +Block 0005 [ 3]: ef64f75207d7a252 +Block 0005 [ 4]: 1f0991dd322affcf +Block 0005 [ 5]: 898493c297e98333 +Block 0005 [ 6]: d0e9e2f2b5868767 +Block 0005 [ 7]: 85892737b8197939 +Block 0005 [ 8]: 895c9e23adf70a30 +Block 0005 [ 9]: 22884227ac287b79 +Block 0005 [ 10]: 25a5984034fb6bd4 +Block 0005 [ 11]: b4b07194a249522b +Block 0005 [ 12]: 89da853c03c31e14 +Block 0005 [ 13]: 15a7a78cf6416ebd +Block 0005 [ 14]: 3a8c41f24d324c76 +Block 0005 [ 15]: 09b9a07581e53c67 +Block 0005 [ 16]: 55727b44460f1587 +Block 0005 [ 17]: be8ab83014f30c2b +Block 0005 [ 18]: d9cd66f01251b7ab +Block 0005 [ 19]: 0461e20365959dbf +Block 0005 [ 20]: 241084d60bf65bcc +Block 0005 [ 21]: e75c5a65ee3d4eff +Block 0005 [ 22]: e9f6084efb8ecff1 +Block 0005 [ 23]: 085c72bdd1bcd079 +Block 0005 [ 24]: c549f8fc232e2c28 +Block 0005 [ 25]: 9063e1d7ee8cfcb5 +Block 0005 [ 26]: aadf049b59766f22 +Block 0005 [ 27]: cfaf89321f6518ae +Block 0005 [ 28]: cce38daaa1867f33 +Block 0005 [ 29]: 03d7036bef580c0d +Block 0005 [ 30]: 508c0c9ea2a798fb +Block 0005 [ 31]: b01529d286e93d65 +Block 0005 [ 32]: 4cfe9506c06bc256 +Block 0005 [ 33]: 498ee5c7db7d3807 +Block 0005 [ 34]: cee012266c0edead +Block 0005 [ 35]: 2d3191fb61c9a30a +Block 0005 [ 36]: 483dd47bae7d85af +Block 0005 [ 37]: fb1b86b513e3f3ef +Block 0005 [ 38]: f643356d32817575 +Block 0005 [ 39]: 8c8f5065f019d85b +Block 0005 [ 40]: f85db49390c3d299 +Block 0005 [ 41]: 44907a02d33986ca +Block 0005 [ 42]: 28181cfdf6531de1 +Block 0005 [ 43]: a5663011f4aa85e4 +Block 0005 [ 44]: 08b43bcf0a4969b1 +Block 0005 [ 45]: af80cab64d8993a6 +Block 0005 [ 46]: c213202a03c9bd91 +Block 0005 [ 47]: 2a250caf5ac630b1 +Block 0005 [ 48]: c44cba4ba3cb48f7 +Block 0005 [ 49]: 433ad275fccbbdea +Block 0005 [ 50]: 0a663ebe1d740d6a +Block 0005 [ 51]: 9ec6d6bb7b72c222 +Block 0005 [ 52]: cc9ffe088f352287 +Block 0005 [ 53]: c98e5332fcfb0673 +Block 0005 [ 54]: b4236c49582216c7 +Block 0005 [ 55]: c4ed9ee4a7981541 +Block 0005 [ 56]: b2c45cfe65ab2eaf +Block 0005 [ 57]: 59c96abdfd1407b9 +Block 0005 [ 58]: 7ff11a8f764220d5 +Block 0005 [ 59]: 157c7ff6478bde5d +Block 0005 [ 60]: 98c24690d8f30515 +Block 0005 [ 61]: d6d37a82b506a60e +Block 0005 [ 62]: c522a84da212bc98 +Block 0005 [ 63]: 997f388966e7baa4 +Block 0005 [ 64]: c1c9995da3c387aa +Block 0005 [ 65]: 34fe68e44dc522d0 +Block 0005 [ 66]: 1ab418a3576ee0bc +Block 0005 [ 67]: 7061a489d80cf327 +Block 0005 [ 68]: 1305e4fa6caf1ed2 +Block 0005 [ 69]: b2b45190832ec6f4 +Block 0005 [ 70]: 779b0dcf42ee74ff +Block 0005 [ 71]: c2476ddfa33ada3a +Block 0005 [ 72]: c761829994837032 +Block 0005 [ 73]: d9a5ca71039fd50f +Block 0005 [ 74]: fea0745a0379c2ce +Block 0005 [ 75]: 51af17867d02c11d +Block 0005 [ 76]: 9294a53dfd591bd7 +Block 0005 [ 77]: d667cdaab8f5e3bb +Block 0005 [ 78]: f5ea5fe6aefb5f53 +Block 0005 [ 79]: 5d459d2c30fcc6d1 +Block 0005 [ 80]: 33e69f05e4d8d74f +Block 0005 [ 81]: 70c1b4348dee2873 +Block 0005 [ 82]: 95ba9ff1042c12d4 +Block 0005 [ 83]: 432b08a428b58915 +Block 0005 [ 84]: cccba8edde21f947 +Block 0005 [ 85]: 55d8ad6ab53fa0b4 +Block 0005 [ 86]: bb5120a1a45b5a62 +Block 0005 [ 87]: f0e50743f06c14d2 +Block 0005 [ 88]: b53a15f7cad3bd0e +Block 0005 [ 89]: e6832b49d6199846 +Block 0005 [ 90]: a857a8dec81b60be +Block 0005 [ 91]: 7581c0148642dd49 +Block 0005 [ 92]: 2389a4431ef7b450 +Block 0005 [ 93]: 59ce3937b5323f22 +Block 0005 [ 94]: f865028678e00b6b +Block 0005 [ 95]: 3da9f4dc5683e6c2 +Block 0005 [ 96]: ffaf9831c6329c1f +Block 0005 [ 97]: abc13a6ab1f09987 +Block 0005 [ 98]: 4f0fc5bcfc2a695e +Block 0005 [ 99]: 02e416ddee499f04 +Block 0005 [100]: cce92bc13079d077 +Block 0005 [101]: 10eb05f19080143e +Block 0005 [102]: 8b5a265b5fb50b0a +Block 0005 [103]: bc0632a8d5b9f9bf +Block 0005 [104]: a06a19d109966629 +Block 0005 [105]: ca993df44d412034 +Block 0005 [106]: 53cdd2e1e2ec5765 +Block 0005 [107]: 39e4f9f131761ca3 +Block 0005 [108]: 989b04fb1a9f90ab +Block 0005 [109]: 48831eff4e20554e +Block 0005 [110]: 4a2f93cae239783d +Block 0005 [111]: bc27a7e3199c806c +Block 0005 [112]: 8e195628a423d227 +Block 0005 [113]: 96de54e58d7f5c3e +Block 0005 [114]: 4ceede7688f7cc59 +Block 0005 [115]: 55c85913b9c14ec4 +Block 0005 [116]: f2ec832ba525d2d6 +Block 0005 [117]: 8f1edd91a8c7d1a8 +Block 0005 [118]: d7b17c40419c28ff +Block 0005 [119]: b17bc3c7508c5c1d +Block 0005 [120]: 64f123c8c38b2123 +Block 0005 [121]: efcec0aa0694a403 +Block 0005 [122]: 4257a1f86f7525c5 +Block 0005 [123]: 5c0b23bd01538eff +Block 0005 [124]: c548b0ee675348a5 +Block 0005 [125]: acd324367e84b36d +Block 0005 [126]: 4594b480fe27d287 +Block 0005 [127]: 19723de0e11f6a79 +Block 0006 [ 0]: a579aa0c6f3d472b +Block 0006 [ 1]: c086d8015e821720 +Block 0006 [ 2]: b0aff8baf2c7a915 +Block 0006 [ 3]: b1a52a27f2a6f5bb +Block 0006 [ 4]: f7a8ba507512affd +Block 0006 [ 5]: 189943ac17f52f74 +Block 0006 [ 6]: 09b050a91a7865f9 +Block 0006 [ 7]: fad3bba5cdc75e8f +Block 0006 [ 8]: a27db619efa13e78 +Block 0006 [ 9]: d7721c064ba824f2 +Block 0006 [ 10]: 9fdd5929958052be +Block 0006 [ 11]: cf2e2fe2c371b18b +Block 0006 [ 12]: 2131a496ffe7297d +Block 0006 [ 13]: 200b9a107faaa7c6 +Block 0006 [ 14]: 4dd6326851f612cd +Block 0006 [ 15]: e6f69fb0fa79e2d1 +Block 0006 [ 16]: 5666dbc6001c374e +Block 0006 [ 17]: fb1170afe5bba42e +Block 0006 [ 18]: e54d768d5140ed79 +Block 0006 [ 19]: bd4cb0de13f5c9e6 +Block 0006 [ 20]: f03b2b449f970a60 +Block 0006 [ 21]: 0da341fe0e6d9a69 +Block 0006 [ 22]: d43cbecae54f2c9c +Block 0006 [ 23]: 18e027f5b1014028 +Block 0006 [ 24]: ed27e494d9ca89d4 +Block 0006 [ 25]: 641298a39d1729e5 +Block 0006 [ 26]: 378a0e8c21129585 +Block 0006 [ 27]: c289147b34edc8f6 +Block 0006 [ 28]: 101ffb96b6ecbf60 +Block 0006 [ 29]: b3672dd20ce9fedf +Block 0006 [ 30]: 966dd9d9747a53f5 +Block 0006 [ 31]: f788ba6aa3e750fc +Block 0006 [ 32]: 87481cafc604ab49 +Block 0006 [ 33]: 4c64a15cd56861dc +Block 0006 [ 34]: 571e41e24bbcf5a6 +Block 0006 [ 35]: 5cdaf199d6c2d284 +Block 0006 [ 36]: 5d324f03722535e3 +Block 0006 [ 37]: 8456661dc13f04c4 +Block 0006 [ 38]: f5f533a3a90f6591 +Block 0006 [ 39]: 2eeb195c30fd5223 +Block 0006 [ 40]: 2761630d222c4be3 +Block 0006 [ 41]: 4b25e08ea39d2694 +Block 0006 [ 42]: 94c885e05b6311ec +Block 0006 [ 43]: 0fbd250920340527 +Block 0006 [ 44]: 6d4ed073c6c82daf +Block 0006 [ 45]: a814caf69863bff7 +Block 0006 [ 46]: 357950ed6e3db084 +Block 0006 [ 47]: 7f5b7f5f9713ab4b +Block 0006 [ 48]: f687be5cd8c6a2c3 +Block 0006 [ 49]: de98a4e2947adde6 +Block 0006 [ 50]: eae6cc68785d7a42 +Block 0006 [ 51]: 90f99300beaaea42 +Block 0006 [ 52]: 85aaed99d15ae2ef +Block 0006 [ 53]: 14ea09b591ddc64f +Block 0006 [ 54]: 82caced71a210d49 +Block 0006 [ 55]: 4a5544de2a5c2ae4 +Block 0006 [ 56]: 2b923417fd0e61a0 +Block 0006 [ 57]: 634358024288709d +Block 0006 [ 58]: 5051199e0c43bc67 +Block 0006 [ 59]: 4797c2f7d6181283 +Block 0006 [ 60]: 3cd2cab46f2be6b5 +Block 0006 [ 61]: 3a286986ea78b194 +Block 0006 [ 62]: 368e222bc11aae07 +Block 0006 [ 63]: 53d09dcde580dea8 +Block 0006 [ 64]: e789b54396eae809 +Block 0006 [ 65]: 5e58f4d02f90e164 +Block 0006 [ 66]: 3db837b465c72d91 +Block 0006 [ 67]: 3c93731de2b96f9f +Block 0006 [ 68]: 461bceda725dc09c +Block 0006 [ 69]: 605ae454b60ff23c +Block 0006 [ 70]: 9f6a7a55a20ce329 +Block 0006 [ 71]: afb30dfbb337a2e0 +Block 0006 [ 72]: 9a998168eb24849d +Block 0006 [ 73]: ae602889800db9c2 +Block 0006 [ 74]: a454c61c98327969 +Block 0006 [ 75]: 43b2763fda7e3d88 +Block 0006 [ 76]: 930a27bde3230189 +Block 0006 [ 77]: d146c0ee73488a3e +Block 0006 [ 78]: 160ca96d9bfbed68 +Block 0006 [ 79]: 73293ed851a68617 +Block 0006 [ 80]: a36a4af5095d53a7 +Block 0006 [ 81]: 4a884b706ee970fc +Block 0006 [ 82]: d3109874f0af31b3 +Block 0006 [ 83]: f62579e6a2dc3ce6 +Block 0006 [ 84]: 8d8796ad737a807a +Block 0006 [ 85]: 16077474eac18b07 +Block 0006 [ 86]: cfb80495e3fc3968 +Block 0006 [ 87]: dd93a9afb9c29429 +Block 0006 [ 88]: 29d61ca2814efa90 +Block 0006 [ 89]: 1261d10c14bf5fce +Block 0006 [ 90]: 9c86148ae36de74e +Block 0006 [ 91]: 0a2cc430be322e03 +Block 0006 [ 92]: fc9e07eedd148823 +Block 0006 [ 93]: 4bf350d0a4134d0e +Block 0006 [ 94]: 04e0631b64ecb7a2 +Block 0006 [ 95]: 43613e7ed6f1abff +Block 0006 [ 96]: 0f40979016e9c14b +Block 0006 [ 97]: 5815db6affdde07d +Block 0006 [ 98]: 3a304f5e227a8db5 +Block 0006 [ 99]: 9cf57fa62861ff03 +Block 0006 [100]: 5cb225c33209c40f +Block 0006 [101]: 2e391fe6ac391667 +Block 0006 [102]: 4518d90f949029ca +Block 0006 [103]: 6812eeafd26ea2aa +Block 0006 [104]: 1740c3c6ac78a991 +Block 0006 [105]: 207fbbab00cfa9ea +Block 0006 [106]: 23b41c5538b54596 +Block 0006 [107]: 5c1a9846f3319d0a +Block 0006 [108]: ed0078df05ce5e78 +Block 0006 [109]: 1324436b2d341a1d +Block 0006 [110]: 9f2b021f23a9d7cb +Block 0006 [111]: 6062d1f1d78311ca +Block 0006 [112]: 46509742c9200b71 +Block 0006 [113]: ece3943c9e12eef0 +Block 0006 [114]: c73efbf60644e765 +Block 0006 [115]: 014a3dc6d06c6401 +Block 0006 [116]: 4b829e9135631a97 +Block 0006 [117]: ac9f2ff9fbaa7f91 +Block 0006 [118]: 6c6511c442badeac +Block 0006 [119]: 29c3cb582054dd11 +Block 0006 [120]: 11b0047447e6156a +Block 0006 [121]: 05a9c4e4a5c6c429 +Block 0006 [122]: 018f420c32088be5 +Block 0006 [123]: f9cab0a6bff629ba +Block 0006 [124]: c3fbfc7ef9137714 +Block 0006 [125]: bc21a904c77e3ee3 +Block 0006 [126]: 809708782db7e0df +Block 0006 [127]: 718ca5bb3325a712 +Block 0007 [ 0]: 679e5aa8bdb71148 +Block 0007 [ 1]: e52a4af98006d3af +Block 0007 [ 2]: 9bde8ffbf95a10e8 +Block 0007 [ 3]: 59ee657ba4c106ad +Block 0007 [ 4]: 7276d2be25b70db9 +Block 0007 [ 5]: 8cc316c6089731d3 +Block 0007 [ 6]: 0f8657ba3ed3ae33 +Block 0007 [ 7]: 2f46e993af8d552b +Block 0007 [ 8]: a6a692d0a552f72d +Block 0007 [ 9]: 6e44096c463f5d2e +Block 0007 [ 10]: c344ea724ec74d4c +Block 0007 [ 11]: 690720809067447f +Block 0007 [ 12]: ae98d2977e34d409 +Block 0007 [ 13]: aab2ad8df1555bd4 +Block 0007 [ 14]: 8eb9ca41b2b45cff +Block 0007 [ 15]: 050599bf6f9ccf7b +Block 0007 [ 16]: b6b088c1acdd99e0 +Block 0007 [ 17]: 2f90e028fe32dcb2 +Block 0007 [ 18]: b8306c79f804adef +Block 0007 [ 19]: a3e24a843b7ca29a +Block 0007 [ 20]: 0b8e77e3832ef3c8 +Block 0007 [ 21]: d637788f5e8dd05c +Block 0007 [ 22]: 2ebb94462d5113c5 +Block 0007 [ 23]: c66e4a37b8ad1814 +Block 0007 [ 24]: 65e4545e584a515e +Block 0007 [ 25]: 8ca0b4eccf78c6d3 +Block 0007 [ 26]: febdbf5fc5eac3d4 +Block 0007 [ 27]: 8562b8d8f97d89a8 +Block 0007 [ 28]: 0005ba229d50fba0 +Block 0007 [ 29]: 6cdfedeca2fd1dc2 +Block 0007 [ 30]: 2e4d347e29c5126f +Block 0007 [ 31]: 92886832b01eed2a +Block 0007 [ 32]: b7f9dc7507a4e172 +Block 0007 [ 33]: 59728e465793e7a3 +Block 0007 [ 34]: eb3dbcf6094b9240 +Block 0007 [ 35]: 97b821b7f00e8629 +Block 0007 [ 36]: 54923f9a30b4e08c +Block 0007 [ 37]: 86a192f6a1e2112e +Block 0007 [ 38]: dc45560679db5c56 +Block 0007 [ 39]: 45413880bccb1603 +Block 0007 [ 40]: 7e1f09b1bc5d1ae8 +Block 0007 [ 41]: 6096cc8b8fe59162 +Block 0007 [ 42]: 9ffae29e2299b8b6 +Block 0007 [ 43]: b5bc95f2788c9e85 +Block 0007 [ 44]: 3e190ccc066ef8df +Block 0007 [ 45]: d93486140d5ee3f1 +Block 0007 [ 46]: 2ac3e607c8b1d7c9 +Block 0007 [ 47]: 24bad7515f760446 +Block 0007 [ 48]: 04e2792a896c3f85 +Block 0007 [ 49]: b47d1828a1f93e00 +Block 0007 [ 50]: 386850552302bcc2 +Block 0007 [ 51]: 3fd81ce12de631cd +Block 0007 [ 52]: 3b22930854f81ab5 +Block 0007 [ 53]: f501fbe750c61790 +Block 0007 [ 54]: 4d9005cae80c1b24 +Block 0007 [ 55]: efc1ae5de289ac33 +Block 0007 [ 56]: cfd69c8680e56308 +Block 0007 [ 57]: b2d5960ef58f360d +Block 0007 [ 58]: b147affb8c0bbbeb +Block 0007 [ 59]: 8a735b6080032cf6 +Block 0007 [ 60]: 194422f951c47d81 +Block 0007 [ 61]: 80751ac2883c7a4a +Block 0007 [ 62]: b002aeda5c86b283 +Block 0007 [ 63]: 96638bab02ddb989 +Block 0007 [ 64]: 0ef4e1e6322f788c +Block 0007 [ 65]: a29ada7d72130b46 +Block 0007 [ 66]: 77808fc4013a706f +Block 0007 [ 67]: 3acdb0967aecedd2 +Block 0007 [ 68]: 266a5df400a52d45 +Block 0007 [ 69]: 8aae40a11f5e48dd +Block 0007 [ 70]: d18744d894a4fd1d +Block 0007 [ 71]: e33f5cf0e01fc6de +Block 0007 [ 72]: 20748919e3d7e65e +Block 0007 [ 73]: 4041301accc810ce +Block 0007 [ 74]: 030e795d4b993886 +Block 0007 [ 75]: b1d47145d7c960ec +Block 0007 [ 76]: 853e8a6cd32c30a7 +Block 0007 [ 77]: d292da728306fab9 +Block 0007 [ 78]: ed372918abebcb2e +Block 0007 [ 79]: 1b88c15b2df4c942 +Block 0007 [ 80]: 081124b00d8ae4b4 +Block 0007 [ 81]: 43ba0fa1c38abc22 +Block 0007 [ 82]: 1561283a9709be85 +Block 0007 [ 83]: dc611021b8c8a9a7 +Block 0007 [ 84]: a81f1a2099efa89d +Block 0007 [ 85]: 4f85a4a88026f842 +Block 0007 [ 86]: d623064c9fa5e490 +Block 0007 [ 87]: a2c7668d9858c9c4 +Block 0007 [ 88]: 29e292811318c3d6 +Block 0007 [ 89]: 2b3b2a810a5df6a7 +Block 0007 [ 90]: 1b64f6c64c8a59bc +Block 0007 [ 91]: 977cbe40ed8cec43 +Block 0007 [ 92]: e31fcc085f38d53d +Block 0007 [ 93]: 8dacbd1659aa5d75 +Block 0007 [ 94]: db7be4515fae98c8 +Block 0007 [ 95]: 0e09711fddfd8a93 +Block 0007 [ 96]: 1c5e2497f8f99c08 +Block 0007 [ 97]: 14939a9fe8eeab78 +Block 0007 [ 98]: 16c9e45e8d4980b4 +Block 0007 [ 99]: 8ca0e091985666a7 +Block 0007 [100]: 40fc23e58c19d0f3 +Block 0007 [101]: 629724e6f7b62068 +Block 0007 [102]: 4408d2e716e924a5 +Block 0007 [103]: 92783fff1ffb2acc +Block 0007 [104]: a4b31f42c0b49ce3 +Block 0007 [105]: 2e79a2eb24310368 +Block 0007 [106]: 18944b2c88b72f51 +Block 0007 [107]: 64edf93e2f552fe5 +Block 0007 [108]: 71adf42caa82f448 +Block 0007 [109]: 9eca8ad4193ffb57 +Block 0007 [110]: 24b96774da15ca98 +Block 0007 [111]: 24e33d65fafaa4c7 +Block 0007 [112]: a7778267896812a4 +Block 0007 [113]: 818644acf15c0f9b +Block 0007 [114]: 6a23c1b96974dbf9 +Block 0007 [115]: 1a0b06a6608dccd8 +Block 0007 [116]: 74c08a50ef521a62 +Block 0007 [117]: 69c228cd79693adc +Block 0007 [118]: cfed8d7c69622e4b +Block 0007 [119]: e3dea674e760140f +Block 0007 [120]: 65dae947d1ea893d +Block 0007 [121]: 9851ca478cbe9e9f +Block 0007 [122]: f249edf6a015a470 +Block 0007 [123]: 45130f054a2a4e29 +Block 0007 [124]: 78c9c8039a51b9d1 +Block 0007 [125]: abb83061e831180a +Block 0007 [126]: 1e7449084d6645f0 +Block 0007 [127]: 9515bc4201360828 +Block 0008 [ 0]: d612868adf2be803 +Block 0008 [ 1]: cfadcc4be9960938 +Block 0008 [ 2]: 8a6e53600b22fe5d +Block 0008 [ 3]: 940f606aa08d0978 +Block 0008 [ 4]: a75de52bf3ae5864 +Block 0008 [ 5]: df442c83c925988a +Block 0008 [ 6]: 011e6fe8140509cb +Block 0008 [ 7]: 29440fa1ce9bfb2c +Block 0008 [ 8]: 0bf70af269753b37 +Block 0008 [ 9]: aec81a2b9dd57a05 +Block 0008 [ 10]: e923ae5f3cccfa82 +Block 0008 [ 11]: 089509caeb6454df +Block 0008 [ 12]: b2816034783a877b +Block 0008 [ 13]: 067e43081088354b +Block 0008 [ 14]: de1fcdc9ae795382 +Block 0008 [ 15]: a89e60140948d636 +Block 0008 [ 16]: 37d60ed78adc0155 +Block 0008 [ 17]: 00052b4747a78d14 +Block 0008 [ 18]: 847a306b7847724f +Block 0008 [ 19]: 3b9618df7794b366 +Block 0008 [ 20]: 75146dcfcbe1ef44 +Block 0008 [ 21]: ebdf91041a31624a +Block 0008 [ 22]: b7aaa244076549af +Block 0008 [ 23]: 95d3c561896e5c28 +Block 0008 [ 24]: 25b0a3359ad1d016 +Block 0008 [ 25]: 402e9816f5390dfc +Block 0008 [ 26]: b2c169f382b15d8e +Block 0008 [ 27]: 5e0fdc4d5d1612f1 +Block 0008 [ 28]: d8d5df2ca9ebf712 +Block 0008 [ 29]: cc215dfcbcf9b770 +Block 0008 [ 30]: 8514fc780bdfcde7 +Block 0008 [ 31]: 0c50b022e82144b9 +Block 0008 [ 32]: 5ef663b5e0fbbb26 +Block 0008 [ 33]: 5e49adb486b18df1 +Block 0008 [ 34]: 2b1c1c29dc240f7b +Block 0008 [ 35]: e214e55d4e685822 +Block 0008 [ 36]: 3083cc17110d4f82 +Block 0008 [ 37]: 753666ba11662ec3 +Block 0008 [ 38]: 1e3910d2e6ce1865 +Block 0008 [ 39]: 97264a9ffca56797 +Block 0008 [ 40]: 37dc35846509817b +Block 0008 [ 41]: 2fe851c388035963 +Block 0008 [ 42]: fbec63882e44a721 +Block 0008 [ 43]: caa997de14a10a02 +Block 0008 [ 44]: 91654566db990d85 +Block 0008 [ 45]: e66261d038c7cfd5 +Block 0008 [ 46]: 9d9528279755927e +Block 0008 [ 47]: f0656ba33f251801 +Block 0008 [ 48]: e678422625446138 +Block 0008 [ 49]: 96836ea927d354fb +Block 0008 [ 50]: d20bb54a0a4d2aff +Block 0008 [ 51]: 6f97b5db80f2ea76 +Block 0008 [ 52]: 0ce72591ed30245e +Block 0008 [ 53]: baeb8eae606fa8db +Block 0008 [ 54]: 904731f491268647 +Block 0008 [ 55]: 31dab2253f1536f2 +Block 0008 [ 56]: e2b55e214e264441 +Block 0008 [ 57]: ee95fc0ecab6d1c3 +Block 0008 [ 58]: f774d2422e8b994d +Block 0008 [ 59]: fc88a999c4c8a0e3 +Block 0008 [ 60]: ffec6c149c7b427d +Block 0008 [ 61]: f6e51ed622a2a404 +Block 0008 [ 62]: aa819f8fdf3a958a +Block 0008 [ 63]: d0bb4e5ed627ea69 +Block 0008 [ 64]: b4caf41d477be373 +Block 0008 [ 65]: c038ef1d14571811 +Block 0008 [ 66]: 5704f751069ef5c4 +Block 0008 [ 67]: 4e7d469a2b2906f0 +Block 0008 [ 68]: 6aebc5c3c6bb95ce +Block 0008 [ 69]: 07f82299037a65aa +Block 0008 [ 70]: d1a145cc12979796 +Block 0008 [ 71]: 7f005b1a0f789208 +Block 0008 [ 72]: d9fcf1ff4ddb4ee6 +Block 0008 [ 73]: b2af7d93b0bad697 +Block 0008 [ 74]: dd83b72b38f9fe4c +Block 0008 [ 75]: e3ef160315685757 +Block 0008 [ 76]: 11bb09b41d219cc1 +Block 0008 [ 77]: 6ab0fe2b24116968 +Block 0008 [ 78]: 0269d9d391b55937 +Block 0008 [ 79]: a47bf48a84c1a1af +Block 0008 [ 80]: c151934dd17851da +Block 0008 [ 81]: 28bfa5b23c63aacf +Block 0008 [ 82]: d3b26f606f9a13f3 +Block 0008 [ 83]: 4220b1ba4f653965 +Block 0008 [ 84]: af0ea18acf4b14a2 +Block 0008 [ 85]: 0a90b45dbcaf578c +Block 0008 [ 86]: 801cd8073692870c +Block 0008 [ 87]: 9ad5d654b02497a2 +Block 0008 [ 88]: 07e72f75fce4df71 +Block 0008 [ 89]: 00e4d4a54752e61d +Block 0008 [ 90]: 9c8895477b9162b2 +Block 0008 [ 91]: 1944bf577facafe6 +Block 0008 [ 92]: 2d02b70de5b04770 +Block 0008 [ 93]: 3c412182dbb85c17 +Block 0008 [ 94]: dc7f7011983e1dc4 +Block 0008 [ 95]: 2302a2015b57e359 +Block 0008 [ 96]: 83d9dd6fdad21b11 +Block 0008 [ 97]: 77b45f920c4bb8e2 +Block 0008 [ 98]: 80080b2c8d7780c0 +Block 0008 [ 99]: a9912a4771a82866 +Block 0008 [100]: ac1ada4b6da0456d +Block 0008 [101]: 0658745593b304e6 +Block 0008 [102]: 92b03ac114e5fe68 +Block 0008 [103]: a82b5eb91e9ccfd1 +Block 0008 [104]: f2374d1a660d4063 +Block 0008 [105]: 057c5713519cd9c7 +Block 0008 [106]: 5c4e596261ed929d +Block 0008 [107]: 2177c5a8322cccea +Block 0008 [108]: 1e78ddef6bfa16b5 +Block 0008 [109]: d6d0c5e8ad21dba7 +Block 0008 [110]: 3c6bf2bf4b6bb17d +Block 0008 [111]: 1a403df00f872d84 +Block 0008 [112]: e335758e00e7b5f9 +Block 0008 [113]: 0451e19983c182fe +Block 0008 [114]: d4f463b36d4b82df +Block 0008 [115]: ade54bf28baf7fcc +Block 0008 [116]: 19187ba45ba81b07 +Block 0008 [117]: 3ae1a97b3547e1aa +Block 0008 [118]: 279eb8108c2c7c64 +Block 0008 [119]: 06fa325c5342f8ed +Block 0008 [120]: 9966212e31b37911 +Block 0008 [121]: 1d9ed6b6f63f37e5 +Block 0008 [122]: 9978feff7fc82305 +Block 0008 [123]: 365c4624ef40dcab +Block 0008 [124]: 4bfaa74a2040ec68 +Block 0008 [125]: 6f833682c02a1557 +Block 0008 [126]: 60bf6db28614e2a4 +Block 0008 [127]: a0197e1101aaf452 +Block 0009 [ 0]: 125e7be23f9e2ae1 +Block 0009 [ 1]: 2dcf9e588ed34492 +Block 0009 [ 2]: dfdf0d708569f1a6 +Block 0009 [ 3]: d77f32b42b708d36 +Block 0009 [ 4]: 39312541fea455d5 +Block 0009 [ 5]: c89d0097d6fd04df +Block 0009 [ 6]: c6472c07ea14897c +Block 0009 [ 7]: 8327ca84204733a4 +Block 0009 [ 8]: f641bd8b6287310f +Block 0009 [ 9]: 1dcb8588aceb1b07 +Block 0009 [ 10]: 9651afb7ccffb052 +Block 0009 [ 11]: 3d3b291ea2ea6980 +Block 0009 [ 12]: 30a22195a702c490 +Block 0009 [ 13]: a6c7624a0c702031 +Block 0009 [ 14]: 315b0b5a03664357 +Block 0009 [ 15]: 39195128217b4b65 +Block 0009 [ 16]: 0f1bdb60cee30e1d +Block 0009 [ 17]: 4770e0438fabf04b +Block 0009 [ 18]: 07157794fcedc106 +Block 0009 [ 19]: 2822a230fedd1687 +Block 0009 [ 20]: d496741d207ab651 +Block 0009 [ 21]: 5fc8ebcc49e1454f +Block 0009 [ 22]: bb37c289793ff950 +Block 0009 [ 23]: a76dad3a5aa92cc9 +Block 0009 [ 24]: eed1c1f29d84c0ce +Block 0009 [ 25]: 635eb6e9dccb1a80 +Block 0009 [ 26]: c98604090fce7bff +Block 0009 [ 27]: 510fb045776b5356 +Block 0009 [ 28]: 8365b2db92ae9754 +Block 0009 [ 29]: f4586c23569b182e +Block 0009 [ 30]: 21315b52057b3ce7 +Block 0009 [ 31]: 90fe05d38503aea6 +Block 0009 [ 32]: 464d22ee86afa981 +Block 0009 [ 33]: d47dafe23a351752 +Block 0009 [ 34]: 71fec7c68e0a5dcf +Block 0009 [ 35]: 0bb36472e5739015 +Block 0009 [ 36]: 131f692e1c0acc56 +Block 0009 [ 37]: 73fd04a2086c8019 +Block 0009 [ 38]: 0e4908b3c94e8804 +Block 0009 [ 39]: 8048d6398b615965 +Block 0009 [ 40]: 2b89ac9aa1266744 +Block 0009 [ 41]: 1518d4a0ecd512dc +Block 0009 [ 42]: 604926c415520f1e +Block 0009 [ 43]: cb40f5c76d04dc9c +Block 0009 [ 44]: d6949d19afbab75e +Block 0009 [ 45]: a747e5b0858042f8 +Block 0009 [ 46]: 954282663fa679c9 +Block 0009 [ 47]: 1d04afb228acb029 +Block 0009 [ 48]: 2f4a1b0fc1bc470f +Block 0009 [ 49]: 267680f7f260a7ff +Block 0009 [ 50]: 411fbc5bb703f140 +Block 0009 [ 51]: bbecaa9a4b82896a +Block 0009 [ 52]: a6e3704961a41f31 +Block 0009 [ 53]: bd98c5c49517a749 +Block 0009 [ 54]: e6cb85d82369a3b9 +Block 0009 [ 55]: 69ba7c14225446b2 +Block 0009 [ 56]: fbf4a6a5eddcff1d +Block 0009 [ 57]: 41838c9bceb91e05 +Block 0009 [ 58]: b6474fb523ddbc62 +Block 0009 [ 59]: b715ba6ba33f0865 +Block 0009 [ 60]: aa4a68df42f44cdc +Block 0009 [ 61]: 2335e406b1c939b2 +Block 0009 [ 62]: 87883da03f5c0db8 +Block 0009 [ 63]: 5ec1b07fbc6aa2cc +Block 0009 [ 64]: c1854b3649373eef +Block 0009 [ 65]: 2c2de0c02c401a2f +Block 0009 [ 66]: 5131d3ba29a37386 +Block 0009 [ 67]: 362306b98176e59d +Block 0009 [ 68]: 3e0e950c86020ddd +Block 0009 [ 69]: 5f04586af32cfd6d +Block 0009 [ 70]: d667c126d71adacb +Block 0009 [ 71]: dee8b5c518f125b0 +Block 0009 [ 72]: 5a46d25441f985f1 +Block 0009 [ 73]: 5211e3c653809142 +Block 0009 [ 74]: 856ad42591bf52e4 +Block 0009 [ 75]: 41bea57d8612affe +Block 0009 [ 76]: b1b5f95510720687 +Block 0009 [ 77]: 346ceb0bbb618336 +Block 0009 [ 78]: e85af44a94adf434 +Block 0009 [ 79]: 3ea25ef8070fc019 +Block 0009 [ 80]: bdcee6ac0eb4fb02 +Block 0009 [ 81]: 73874f00a8de263b +Block 0009 [ 82]: c93632643699d45d +Block 0009 [ 83]: fde27892dc08d5dd +Block 0009 [ 84]: 289f26ea163aa0c1 +Block 0009 [ 85]: 3584be4e9437b93f +Block 0009 [ 86]: 834990ca8bd21dd5 +Block 0009 [ 87]: 369f2fed26bd92bd +Block 0009 [ 88]: dcc1434bfb54747d +Block 0009 [ 89]: 381849ce1dad2ccf +Block 0009 [ 90]: daa863935ed2c6d5 +Block 0009 [ 91]: bd40cf4c84e93cd4 +Block 0009 [ 92]: 05f9a3dc63c2556b +Block 0009 [ 93]: 240d5ee74a78afa3 +Block 0009 [ 94]: 62410111fa5baa41 +Block 0009 [ 95]: 17478960fcad0d45 +Block 0009 [ 96]: 3ca87435e9d056c3 +Block 0009 [ 97]: e44fdd8c185102b2 +Block 0009 [ 98]: ffe99cb0769d8875 +Block 0009 [ 99]: 86030c14d82dcf62 +Block 0009 [100]: 8cafeeb18e2a8c0a +Block 0009 [101]: d6c34798b443f4c3 +Block 0009 [102]: 2c744cd44d7d9699 +Block 0009 [103]: 9496d6df24516281 +Block 0009 [104]: 8d2389d16d1a2219 +Block 0009 [105]: 37ccfa20bb9b4d03 +Block 0009 [106]: 349448539bace7cf +Block 0009 [107]: 11c5dce1acc8f8d6 +Block 0009 [108]: 393f9cb72aa6fcca +Block 0009 [109]: f6fab4f88677c049 +Block 0009 [110]: 8ea980189bbd81c1 +Block 0009 [111]: 5933bbc1c4935c8f +Block 0009 [112]: bf544ba618f1e3aa +Block 0009 [113]: 6ecf8ab649253235 +Block 0009 [114]: f3d9299efd50d9f2 +Block 0009 [115]: acf6c3053c7f71fe +Block 0009 [116]: 985bdc30cc7b3a1e +Block 0009 [117]: 2c6fa017544c2f8a +Block 0009 [118]: 3873d757ebdf92ef +Block 0009 [119]: f50c701f870493b5 +Block 0009 [120]: 154a8ade495cd5f9 +Block 0009 [121]: a44c8210a1194465 +Block 0009 [122]: 372c54dca2cd833b +Block 0009 [123]: 4e21a61415e2e767 +Block 0009 [124]: 081706a771aed571 +Block 0009 [125]: 44f4da88dc2a3ccc +Block 0009 [126]: caa2180bab53cbd2 +Block 0009 [127]: d19f36217137e69d +Block 0010 [ 0]: 50f129c8314b1dd2 +Block 0010 [ 1]: f1faf24252b5ce03 +Block 0010 [ 2]: fd846116d2778287 +Block 0010 [ 3]: e172de82b6a5dd78 +Block 0010 [ 4]: 8511807345a45e26 +Block 0010 [ 5]: e2765515697dfe71 +Block 0010 [ 6]: 0011ec204248c60e +Block 0010 [ 7]: d2da550b83c17296 +Block 0010 [ 8]: a3cde273a1015bd8 +Block 0010 [ 9]: f16021f0e048fc2b +Block 0010 [ 10]: 2bfd6df1b3474b63 +Block 0010 [ 11]: e44905e2946d56e2 +Block 0010 [ 12]: f0c73e131fb1ca92 +Block 0010 [ 13]: c475c70e8fee063f +Block 0010 [ 14]: 1656f9ca27728999 +Block 0010 [ 15]: c1e395aa563f0bf4 +Block 0010 [ 16]: 18710644253867db +Block 0010 [ 17]: 7281e128ff73c012 +Block 0010 [ 18]: 17ce526cf0f21f1d +Block 0010 [ 19]: d273ebb95002216e +Block 0010 [ 20]: 440c93c6690146c6 +Block 0010 [ 21]: 7e72aab8480f9c9a +Block 0010 [ 22]: 76e632e3b3a3a1a3 +Block 0010 [ 23]: 03afa7847fbfb8af +Block 0010 [ 24]: f676d56ad1793b27 +Block 0010 [ 25]: a09d705d9e2da6a1 +Block 0010 [ 26]: 1d5d9f3397c5583d +Block 0010 [ 27]: 38d36e89deb44a7f +Block 0010 [ 28]: 87532c117619729d +Block 0010 [ 29]: b4fe29f51a9981bd +Block 0010 [ 30]: d534cbcf713073f8 +Block 0010 [ 31]: fec16e1d25805876 +Block 0010 [ 32]: 60dce345c4ecc2fc +Block 0010 [ 33]: 5dc5e0be360e32ca +Block 0010 [ 34]: 5ed0afb1d650acdc +Block 0010 [ 35]: 33c1a3ba91199c17 +Block 0010 [ 36]: 7b85af6946855eea +Block 0010 [ 37]: 4bf8f4ef629acb53 +Block 0010 [ 38]: 641454e004536e75 +Block 0010 [ 39]: e9598a67bb9e010d +Block 0010 [ 40]: 1ae66b61ba9f5fef +Block 0010 [ 41]: 8b5689f5690af5ad +Block 0010 [ 42]: c1ebe39324b7ad10 +Block 0010 [ 43]: 8d8f1a6801c2fcee +Block 0010 [ 44]: d0353ed7e27aa209 +Block 0010 [ 45]: 408cb141d33c282a +Block 0010 [ 46]: 3cec0ba738981253 +Block 0010 [ 47]: 12836a28882cec64 +Block 0010 [ 48]: 55ab2da84afa1e73 +Block 0010 [ 49]: e012d8cbba55e196 +Block 0010 [ 50]: 225e87dd4ba15450 +Block 0010 [ 51]: 97f5b2554a53497a +Block 0010 [ 52]: 858392bd86337c0c +Block 0010 [ 53]: 1e9d8ec565431484 +Block 0010 [ 54]: be25bb549fc5ad96 +Block 0010 [ 55]: 8cae37b6260f400f +Block 0010 [ 56]: 2fa1da62403ff22b +Block 0010 [ 57]: 73ef3777277c6deb +Block 0010 [ 58]: 47ffd701d6a542c1 +Block 0010 [ 59]: d21c8613fc4ad450 +Block 0010 [ 60]: 741808629149aa29 +Block 0010 [ 61]: 0dee7475344afc27 +Block 0010 [ 62]: 69f162864b0d0ba8 +Block 0010 [ 63]: e723d4414dc01d9a +Block 0010 [ 64]: 1348ee9b939a06aa +Block 0010 [ 65]: 0cd2fa596564c17b +Block 0010 [ 66]: 1e529efd0d986c9d +Block 0010 [ 67]: b2b66e0e074ceade +Block 0010 [ 68]: 2d92a419c4c8b2f6 +Block 0010 [ 69]: eb7f325a95c509b4 +Block 0010 [ 70]: 3e20722bdf51270f +Block 0010 [ 71]: cfb337b8069800dd +Block 0010 [ 72]: c2e783ed1deac4f7 +Block 0010 [ 73]: 820ca55e6f468a61 +Block 0010 [ 74]: e51d88ed7abbd53f +Block 0010 [ 75]: 0110137ae06a717c +Block 0010 [ 76]: e416efaaf88fa43f +Block 0010 [ 77]: d76b9191eb39cf1e +Block 0010 [ 78]: ff49071437550b9c +Block 0010 [ 79]: 10dd148cc497ef63 +Block 0010 [ 80]: a70022eda2cf3692 +Block 0010 [ 81]: cdbdaea580ee59ff +Block 0010 [ 82]: 0f393ef6ea262c86 +Block 0010 [ 83]: f7d2feedf24469e1 +Block 0010 [ 84]: ac673c848c7c11f0 +Block 0010 [ 85]: e2c6354b76edff69 +Block 0010 [ 86]: 9f3dab5a88e0cb1b +Block 0010 [ 87]: 4609b3ae383b07d1 +Block 0010 [ 88]: 452daef051d9f3d6 +Block 0010 [ 89]: 7a5f2288dd741e6c +Block 0010 [ 90]: d455d1c591fa4c41 +Block 0010 [ 91]: 5a6f3fc8998258ef +Block 0010 [ 92]: 9bf8f2287a507cb0 +Block 0010 [ 93]: fb689cdc1a0e2ec6 +Block 0010 [ 94]: 272c0ea1d13bed54 +Block 0010 [ 95]: 05efb5ef98d49b9c +Block 0010 [ 96]: 264f51dd7bc348d1 +Block 0010 [ 97]: eb7b7b016051f0c3 +Block 0010 [ 98]: d3b72adf5543f07b +Block 0010 [ 99]: 73ee82f261419fb2 +Block 0010 [100]: 00c085c84a773a67 +Block 0010 [101]: bf55023775668108 +Block 0010 [102]: 3f30efe65be484b0 +Block 0010 [103]: 0aaa470843840516 +Block 0010 [104]: aea27105281c4c68 +Block 0010 [105]: d42cbbc0b5c316dd +Block 0010 [106]: 5df8a9f6551e5787 +Block 0010 [107]: 5cd2d2ede1052bd1 +Block 0010 [108]: 8223be1c3f2a91f4 +Block 0010 [109]: d54cc5cb370bd398 +Block 0010 [110]: 86ec22bbbba3940b +Block 0010 [111]: 0db251349f6a3137 +Block 0010 [112]: 3c7977d6b2c09e56 +Block 0010 [113]: 18ac0e2c26a7153b +Block 0010 [114]: ffc869a4015c94e6 +Block 0010 [115]: cae6a67f644893ab +Block 0010 [116]: 3ce008df44afc6e8 +Block 0010 [117]: 470862fa2a90614b +Block 0010 [118]: 07aeeb964afbdd88 +Block 0010 [119]: efc86a0ca279152c +Block 0010 [120]: 92a22900f73b72d4 +Block 0010 [121]: ee34e6f5e7f5e239 +Block 0010 [122]: b6f97e0f206095cd +Block 0010 [123]: 05e6087e10ee7492 +Block 0010 [124]: 44a92d7be34a8939 +Block 0010 [125]: 142bf79b42ded951 +Block 0010 [126]: 28c3115e72f22ac2 +Block 0010 [127]: 3ea771b69e0e20c8 +Block 0011 [ 0]: 67512d1435cecef5 +Block 0011 [ 1]: 7b3853dbd933132a +Block 0011 [ 2]: 04edbbc01b9db0c7 +Block 0011 [ 3]: 530b98198518d7f8 +Block 0011 [ 4]: be9dc30940a7f1c1 +Block 0011 [ 5]: 51a3c35cc4e653ed +Block 0011 [ 6]: 48b8b2a91f5ab89b +Block 0011 [ 7]: 34aa887df6ebc1d6 +Block 0011 [ 8]: 92808ce9522cd897 +Block 0011 [ 9]: 624554ca78ddf7c6 +Block 0011 [ 10]: d8d17dd8cf835d2e +Block 0011 [ 11]: d0f2fe94951e9b56 +Block 0011 [ 12]: 143aa6711edf3fc5 +Block 0011 [ 13]: 07f2c6da0bd5af83 +Block 0011 [ 14]: 4e2e8b6acaea8714 +Block 0011 [ 15]: 7b0af574d5bd3bc2 +Block 0011 [ 16]: 9c8143772912448d +Block 0011 [ 17]: 613bfb2f7aefae51 +Block 0011 [ 18]: e80c8ce117a18814 +Block 0011 [ 19]: 575113a5a2211a01 +Block 0011 [ 20]: 6f3b49506671f35c +Block 0011 [ 21]: ec1c2d06d6697205 +Block 0011 [ 22]: bae45b9236962eed +Block 0011 [ 23]: 3627b2e939003bab +Block 0011 [ 24]: 21774e1f96ad4838 +Block 0011 [ 25]: 2f800b944b7f6e57 +Block 0011 [ 26]: f0f2ff9fa1e034ca +Block 0011 [ 27]: 568079414c1f5a64 +Block 0011 [ 28]: e0baa5b7614e4eb5 +Block 0011 [ 29]: efa7e51a03dd0222 +Block 0011 [ 30]: 5c50c5b5b5c5d9a1 +Block 0011 [ 31]: e954ba4be27d866d +Block 0011 [ 32]: e57766953b5f9969 +Block 0011 [ 33]: ecb7768b12667cbf +Block 0011 [ 34]: 4301f0b613246862 +Block 0011 [ 35]: d93ffef1cb456260 +Block 0011 [ 36]: 0766ad3114adbb26 +Block 0011 [ 37]: 74eb304b074faa52 +Block 0011 [ 38]: d27a3c9fbafd5b4b +Block 0011 [ 39]: e0ef96f6ed891ad1 +Block 0011 [ 40]: 48f176fa99f985bb +Block 0011 [ 41]: 1974187aeee6d69f +Block 0011 [ 42]: 1ebd104a6633296d +Block 0011 [ 43]: 7ee2a80d355fd18c +Block 0011 [ 44]: 54a44e3c90c36dc6 +Block 0011 [ 45]: 9b0e66f2251bbb4c +Block 0011 [ 46]: 40f28eb7dda899b2 +Block 0011 [ 47]: 2ae0fa589b6250e1 +Block 0011 [ 48]: cd597aa36c476ce6 +Block 0011 [ 49]: 2eeb9ab504f496e0 +Block 0011 [ 50]: feec00a7be156598 +Block 0011 [ 51]: 30f53c1d18968187 +Block 0011 [ 52]: 6f9bafc19dcc2d61 +Block 0011 [ 53]: 73dc2454808cae11 +Block 0011 [ 54]: dcfd7e7fbedaacef +Block 0011 [ 55]: 4202bfb9dad21ea0 +Block 0011 [ 56]: 79c44999c00cba6f +Block 0011 [ 57]: 602afb4925164920 +Block 0011 [ 58]: 0d08bb98820069e0 +Block 0011 [ 59]: 38181becacb9e937 +Block 0011 [ 60]: db1e2b378e2d2a64 +Block 0011 [ 61]: 6adf3645089751a7 +Block 0011 [ 62]: c63fd2836c831717 +Block 0011 [ 63]: 65e2f35fbe50b14d +Block 0011 [ 64]: 891eaf8bdf76f675 +Block 0011 [ 65]: d941b71fe6f89a8e +Block 0011 [ 66]: 9d58bc95cd06559d +Block 0011 [ 67]: 6dc168dd4383a7d8 +Block 0011 [ 68]: f4b6cad30a873798 +Block 0011 [ 69]: 9a0e5c1331340531 +Block 0011 [ 70]: 083a83268a0330d0 +Block 0011 [ 71]: 8bd4149399bc73c8 +Block 0011 [ 72]: 8864a769ea615522 +Block 0011 [ 73]: 5784251b23d40f2c +Block 0011 [ 74]: b130e47a99eb64bc +Block 0011 [ 75]: da0ef3e1b92c46d5 +Block 0011 [ 76]: 531761fde0a4d6f2 +Block 0011 [ 77]: 2856066cd9d39c8e +Block 0011 [ 78]: 26d416107a1ef8ea +Block 0011 [ 79]: eba3079322eb430b +Block 0011 [ 80]: 9f6777c77a534d6b +Block 0011 [ 81]: bb626be70b4118c2 +Block 0011 [ 82]: b61ba058ea11eb53 +Block 0011 [ 83]: 382829f1d82aeae2 +Block 0011 [ 84]: 59cdae0ac56c6a78 +Block 0011 [ 85]: c7f42b8d265831bb +Block 0011 [ 86]: e013aaa66cf03cfb +Block 0011 [ 87]: f278b94057371dac +Block 0011 [ 88]: b26876fc500fa63e +Block 0011 [ 89]: 86527c99624a20ef +Block 0011 [ 90]: 73d7f4bd8683351e +Block 0011 [ 91]: 8354b399f12c0892 +Block 0011 [ 92]: 303d51dc0f77aef1 +Block 0011 [ 93]: eb114cf73af14329 +Block 0011 [ 94]: 74267d913db759de +Block 0011 [ 95]: 4fec949ebb3a3a64 +Block 0011 [ 96]: 15c00518ee4adf4e +Block 0011 [ 97]: 1d8cf07d6edde475 +Block 0011 [ 98]: e954c8785b16eb02 +Block 0011 [ 99]: 18074db3522c065d +Block 0011 [100]: 9b1b13cad5b57149 +Block 0011 [101]: 67ac13cad09e6cf7 +Block 0011 [102]: 61c268324fc61790 +Block 0011 [103]: f917ea42c1d4aae8 +Block 0011 [104]: 4afd468a75a15d75 +Block 0011 [105]: d45f3f38a34cb34c +Block 0011 [106]: 042cd7de25fd793e +Block 0011 [107]: 72fd02ada9fd644c +Block 0011 [108]: 46bbf9e498748729 +Block 0011 [109]: c45d10a65df0705d +Block 0011 [110]: 7d1f38b2568fd31e +Block 0011 [111]: 4e5eeab86f171c9c +Block 0011 [112]: e4191d1be8010499 +Block 0011 [113]: b7e7d91669716bfd +Block 0011 [114]: a84d284ad0514913 +Block 0011 [115]: de2454e3bb127b5c +Block 0011 [116]: 5593b362d34e3236 +Block 0011 [117]: 3a97eddc885470b8 +Block 0011 [118]: d49f0989505a3e20 +Block 0011 [119]: a49c29255d2ff768 +Block 0011 [120]: 36229ee8d46ded5d +Block 0011 [121]: befd8c33cbd6a7cf +Block 0011 [122]: 54d6daeb3ae7f016 +Block 0011 [123]: 2dd97a531e383ad2 +Block 0011 [124]: 7c86ce3b32d61ef6 +Block 0011 [125]: c6febd2bdbc678b9 +Block 0011 [126]: 7e4d8df7e7698f3c +Block 0011 [127]: 876051736f645364 +Block 0012 [ 0]: 0c9c55c8c1620b64 +Block 0012 [ 1]: 60b4c465dea9fd66 +Block 0012 [ 2]: 80c4d91289e2cea1 +Block 0012 [ 3]: b3c19eb8f6a03464 +Block 0012 [ 4]: 3b5b05dc4d420ced +Block 0012 [ 5]: 89e95d39facd3e56 +Block 0012 [ 6]: d0fe580b20f54961 +Block 0012 [ 7]: 9dfd776ddc178519 +Block 0012 [ 8]: 43601291ac36ceb8 +Block 0012 [ 9]: fc448a430a414e43 +Block 0012 [ 10]: 6cfc44fc6bafb7d7 +Block 0012 [ 11]: cd74be8ef63bb036 +Block 0012 [ 12]: a92d857c51adb1cd +Block 0012 [ 13]: d784ad0dfe421f93 +Block 0012 [ 14]: d0d6f388f86e6275 +Block 0012 [ 15]: 2fccfe5542011b8f +Block 0012 [ 16]: 830f41df00cb8562 +Block 0012 [ 17]: 976279793f5baea7 +Block 0012 [ 18]: 67a85e07df4f61fb +Block 0012 [ 19]: eea4a6c342ab9d54 +Block 0012 [ 20]: 148054c90a308c58 +Block 0012 [ 21]: 922b40f7d90153b2 +Block 0012 [ 22]: 7c562e744deeae9e +Block 0012 [ 23]: a5d4d940c2efb1ca +Block 0012 [ 24]: 00bbe2405465d5f2 +Block 0012 [ 25]: 3768c36968e26558 +Block 0012 [ 26]: bb52349064085d3e +Block 0012 [ 27]: 90e8687c09aa2434 +Block 0012 [ 28]: f21c0ec2f9965d13 +Block 0012 [ 29]: f8e377812defeda9 +Block 0012 [ 30]: 3f90e96ef79c7b2d +Block 0012 [ 31]: 452f07cd905ed4b6 +Block 0012 [ 32]: 807f5b0ef43b1da5 +Block 0012 [ 33]: afc8923951d0d506 +Block 0012 [ 34]: 7a1f5bc2c3ef6c85 +Block 0012 [ 35]: 767992930b29dccb +Block 0012 [ 36]: ecf316593a3da03e +Block 0012 [ 37]: 49c984f3f324e369 +Block 0012 [ 38]: e8216f5411b321af +Block 0012 [ 39]: 55789c3b8e15c9b2 +Block 0012 [ 40]: 4aea9d0280102cac +Block 0012 [ 41]: f4b3419d7c1f3f32 +Block 0012 [ 42]: 390aee0ac1556c0f +Block 0012 [ 43]: 8cdf8035335a8cd3 +Block 0012 [ 44]: d7997f4c4defb85a +Block 0012 [ 45]: 3f6131d71978435b +Block 0012 [ 46]: 30e1589f1892c546 +Block 0012 [ 47]: 7ccc22fc004e262b +Block 0012 [ 48]: 3b9215cdd270937f +Block 0012 [ 49]: 738a9ba2b1780540 +Block 0012 [ 50]: 35661290e6c6e77a +Block 0012 [ 51]: c03a8402fa536118 +Block 0012 [ 52]: 06c68549dad7e79c +Block 0012 [ 53]: 4ea85ff21f91688a +Block 0012 [ 54]: 59b6c557566d8806 +Block 0012 [ 55]: 40e5d7c4370d7591 +Block 0012 [ 56]: ae1fffaab705275e +Block 0012 [ 57]: 311a8f16b107444d +Block 0012 [ 58]: e5218d5c0bcbd99a +Block 0012 [ 59]: d186ea05ba56676f +Block 0012 [ 60]: 834789ab82021d40 +Block 0012 [ 61]: 7df30c5e52929b05 +Block 0012 [ 62]: e8207858eb71f698 +Block 0012 [ 63]: 1d58bde3a5edc66b +Block 0012 [ 64]: ceb2be18efa776bb +Block 0012 [ 65]: e835d65827147cbe +Block 0012 [ 66]: 6a2f35bdd998fd14 +Block 0012 [ 67]: 9d40dd80a0faeae7 +Block 0012 [ 68]: e538055c4776c3ac +Block 0012 [ 69]: 5d1742a4d04bc17f +Block 0012 [ 70]: 163deb8613e852b3 +Block 0012 [ 71]: 15d2f3f0737d3bc7 +Block 0012 [ 72]: 2f5a3cdc39a7b986 +Block 0012 [ 73]: 2326e3dab7239771 +Block 0012 [ 74]: e72036e822906a5c +Block 0012 [ 75]: c5a549423bee0d90 +Block 0012 [ 76]: 902eb12ae0f8d17f +Block 0012 [ 77]: 25bb071a5a78682c +Block 0012 [ 78]: 454ada6ff7c65c8d +Block 0012 [ 79]: 8492e6db1f105910 +Block 0012 [ 80]: 0277193e9f99c46f +Block 0012 [ 81]: fa22603432d42324 +Block 0012 [ 82]: 8a83b69bc46f979c +Block 0012 [ 83]: a520140a955e36e4 +Block 0012 [ 84]: b1433fe02f4a349e +Block 0012 [ 85]: aa1113f8aae73b93 +Block 0012 [ 86]: d488ad30309c8498 +Block 0012 [ 87]: 0aec428b70ef549a +Block 0012 [ 88]: 93170079c6ab05e5 +Block 0012 [ 89]: e8f49d763907ca5a +Block 0012 [ 90]: 457e13af2923e613 +Block 0012 [ 91]: 6fa78b78b42065ef +Block 0012 [ 92]: 9338260a24b8d082 +Block 0012 [ 93]: a0b96f8e1511c315 +Block 0012 [ 94]: a513b98c6efdf8fa +Block 0012 [ 95]: 1b85f765892bcbc3 +Block 0012 [ 96]: ad139621f5e39c91 +Block 0012 [ 97]: 2d402ba231db9ef5 +Block 0012 [ 98]: b4deb002cc235b5e +Block 0012 [ 99]: 9f0d0a1a3ed3483a +Block 0012 [100]: 21d90ab3bd5a3701 +Block 0012 [101]: 586ab5d2732fb68b +Block 0012 [102]: 01af6c32fb19d96d +Block 0012 [103]: fbd622c0016b31db +Block 0012 [104]: 3d4b5bc64a1d3339 +Block 0012 [105]: f1e8dfb0e0e91615 +Block 0012 [106]: 0f8843aadd79799d +Block 0012 [107]: a79a41fa433b098e +Block 0012 [108]: c5fedee1f6b6efcb +Block 0012 [109]: ccf42653de5fded8 +Block 0012 [110]: bdeda18634357c04 +Block 0012 [111]: 9528f3f925aa6429 +Block 0012 [112]: 82d67bfd27bd3925 +Block 0012 [113]: 3a3abffe6da6bfd1 +Block 0012 [114]: c07698673bd83a29 +Block 0012 [115]: bb0b238da2a7505c +Block 0012 [116]: 7e0526fc80fb6f31 +Block 0012 [117]: f495215c56b1848f +Block 0012 [118]: 3bcf9ea980c04c60 +Block 0012 [119]: 4450f7ac179026f5 +Block 0012 [120]: 0fa713d584b0a2fe +Block 0012 [121]: a89d1b4ce7960428 +Block 0012 [122]: dd7afc7858234e35 +Block 0012 [123]: 8ff4307248170757 +Block 0012 [124]: 4eb19cae24707b6f +Block 0012 [125]: 44c60d71ffa74cb8 +Block 0012 [126]: 0c9c8a53e0cd54da +Block 0012 [127]: a734adb6b6a5601f +Block 0013 [ 0]: 8275ecaccc771ae4 +Block 0013 [ 1]: 712b01e69497cdf0 +Block 0013 [ 2]: 9301d483ae27c7fb +Block 0013 [ 3]: fab6f5ae8d80d6e2 +Block 0013 [ 4]: 1235754d7932aa8b +Block 0013 [ 5]: a65db531a30872df +Block 0013 [ 6]: 19241353a5c8f96b +Block 0013 [ 7]: 1c7b9a24517300ed +Block 0013 [ 8]: 6abeebaa06ff012c +Block 0013 [ 9]: f7cbcf3ee950e0f2 +Block 0013 [ 10]: 3192592d817f7b66 +Block 0013 [ 11]: 1753f87f59ea11c4 +Block 0013 [ 12]: 1fee77a9b4337ed8 +Block 0013 [ 13]: c57c6ca745154184 +Block 0013 [ 14]: f820b945f1e9848a +Block 0013 [ 15]: 2ce9b26044524919 +Block 0013 [ 16]: a40929146cea1a84 +Block 0013 [ 17]: e2687b7dea13e4dd +Block 0013 [ 18]: e7e5f533dc5348aa +Block 0013 [ 19]: b58852ce4757e67c +Block 0013 [ 20]: fc907be6692563c0 +Block 0013 [ 21]: 3900c482ae9f91a5 +Block 0013 [ 22]: 5e295867887dcb10 +Block 0013 [ 23]: 654906b021548d4c +Block 0013 [ 24]: 9f4d7100ad4a0312 +Block 0013 [ 25]: b429941b74aca665 +Block 0013 [ 26]: 24302c7eef140f1b +Block 0013 [ 27]: b2bb1998988469b9 +Block 0013 [ 28]: aef2456f2a23f536 +Block 0013 [ 29]: 9fe997b9e5f076df +Block 0013 [ 30]: 964e88a1b7455124 +Block 0013 [ 31]: 48cbd6d14f3570cd +Block 0013 [ 32]: 01393d0b6b8dfed3 +Block 0013 [ 33]: 1ede0fc24adb8a29 +Block 0013 [ 34]: b8698c7cbd4fef3b +Block 0013 [ 35]: d0cd560c48061859 +Block 0013 [ 36]: 38eabed90236c69c +Block 0013 [ 37]: 867fb49f0e401a6b +Block 0013 [ 38]: ac87846cb0a5255e +Block 0013 [ 39]: 38c89d68e6b27e7f +Block 0013 [ 40]: 15ddcc3b0d8f4e59 +Block 0013 [ 41]: 7e5cd39650a9b8fd +Block 0013 [ 42]: 037597aed87bc45f +Block 0013 [ 43]: 8d7729fcbfeeb3a8 +Block 0013 [ 44]: caa354f01d65dc58 +Block 0013 [ 45]: c8957f052aa6a2e8 +Block 0013 [ 46]: 41c0210c578d283f +Block 0013 [ 47]: 83241ee0a1d76e67 +Block 0013 [ 48]: dbd133c3b5071d9b +Block 0013 [ 49]: 3a82af1f045c7285 +Block 0013 [ 50]: cfb78c8781164562 +Block 0013 [ 51]: a2f06254dc93d0c1 +Block 0013 [ 52]: e9cc73236c17b29f +Block 0013 [ 53]: 068bf08bba7082b0 +Block 0013 [ 54]: 5602462888861686 +Block 0013 [ 55]: 9be6367d1bc248e8 +Block 0013 [ 56]: 224ec458cc53339f +Block 0013 [ 57]: cdd7f95f932daeb7 +Block 0013 [ 58]: 5b128a412967f6ae +Block 0013 [ 59]: f9b3ed0a3cf99ce3 +Block 0013 [ 60]: bbd741a9ecbebf82 +Block 0013 [ 61]: 79c4e0435f9b7bb1 +Block 0013 [ 62]: 2b692de61c9e122a +Block 0013 [ 63]: cf7bdf8929ff7d59 +Block 0013 [ 64]: 422af9f6beedd316 +Block 0013 [ 65]: 83fdd9968655f57e +Block 0013 [ 66]: 2984ca92c54934e6 +Block 0013 [ 67]: aa0a628463151601 +Block 0013 [ 68]: c9adc7e102d4e926 +Block 0013 [ 69]: f01036ed1cb180e2 +Block 0013 [ 70]: 49e6b538ffd429b0 +Block 0013 [ 71]: b034ead8223c890f +Block 0013 [ 72]: 7ff44edfd6d170e9 +Block 0013 [ 73]: 7a41e3fcb64f759a +Block 0013 [ 74]: 27c8457a4e19fc28 +Block 0013 [ 75]: 1ae95273cda41b9b +Block 0013 [ 76]: fd793d32c7886449 +Block 0013 [ 77]: 0dbd25cc3a9ba9bf +Block 0013 [ 78]: 7bc222a6d2cc88c2 +Block 0013 [ 79]: fcb5b217e43bf8a2 +Block 0013 [ 80]: 22185604488f3d51 +Block 0013 [ 81]: ffd19371c12ee9df +Block 0013 [ 82]: adb9635e61703b6a +Block 0013 [ 83]: aad4fc87c38c44dc +Block 0013 [ 84]: 8a5de034bf8bcb91 +Block 0013 [ 85]: 4873cf7a56632be6 +Block 0013 [ 86]: 640ad84374233383 +Block 0013 [ 87]: 4a78c06e4d724966 +Block 0013 [ 88]: f9af0f5f824ce1ac +Block 0013 [ 89]: 5cd8b424e7987fb2 +Block 0013 [ 90]: 63a749f3340a966f +Block 0013 [ 91]: 3be590e829a06c9d +Block 0013 [ 92]: 673669b53e42dfe0 +Block 0013 [ 93]: 4e13df1d4e996c1d +Block 0013 [ 94]: a75e97ca20914ac7 +Block 0013 [ 95]: 06a3ce6a1baa5937 +Block 0013 [ 96]: 8aef6dcf730b9d73 +Block 0013 [ 97]: 24c7e0759a8d4c95 +Block 0013 [ 98]: 9caf4fd316f89fc1 +Block 0013 [ 99]: 0a3319bc486637f3 +Block 0013 [100]: a0fea48059b4450e +Block 0013 [101]: c77f3111142a13c2 +Block 0013 [102]: f0e6031c0805f946 +Block 0013 [103]: 132dc730e7f7a4ac +Block 0013 [104]: a629264d94905d3a +Block 0013 [105]: fadc414873129baa +Block 0013 [106]: 86517cdce724b24d +Block 0013 [107]: 16a1b02cd6e750be +Block 0013 [108]: 04289a27673f1549 +Block 0013 [109]: b8701a1caf37ac45 +Block 0013 [110]: efc66529c438bcce +Block 0013 [111]: a3c68f26e26dde3e +Block 0013 [112]: 56f23362b31847df +Block 0013 [113]: 9d7e4e342eaf8a46 +Block 0013 [114]: a13cff8866f5ef49 +Block 0013 [115]: bf9964d57fe229ee +Block 0013 [116]: 3740b695ae269e6e +Block 0013 [117]: ba792fe8b9716c43 +Block 0013 [118]: 30f784e82dd0ab70 +Block 0013 [119]: e4f57cc08fa17da7 +Block 0013 [120]: 3d71b796968fa33f +Block 0013 [121]: 2dca46842308f3ec +Block 0013 [122]: 47db0499dfa0d745 +Block 0013 [123]: 195e3c1253ad056e +Block 0013 [124]: fbb2fe6b8b8d6721 +Block 0013 [125]: 971cb37328f7faec +Block 0013 [126]: c8bd887da9b96df4 +Block 0013 [127]: bc7f954a8dd53168 +Block 0014 [ 0]: 6b65de3737ca07f1 +Block 0014 [ 1]: a38cfa10cc2fc974 +Block 0014 [ 2]: e5198f5c31a8e3bf +Block 0014 [ 3]: 698e33db1e1ae03f +Block 0014 [ 4]: 14aea1e3f7b1bd88 +Block 0014 [ 5]: 23c7733a20c49535 +Block 0014 [ 6]: 708851504763e011 +Block 0014 [ 7]: 76d0191e1a308c7d +Block 0014 [ 8]: f221c44adbd9b02b +Block 0014 [ 9]: 45aa8795ece63642 +Block 0014 [ 10]: fd36d6c27b71b0bd +Block 0014 [ 11]: 0466e55299276cb5 +Block 0014 [ 12]: 725c41544c13d899 +Block 0014 [ 13]: f39ff57f5cd5f7f6 +Block 0014 [ 14]: f75b827542bb8030 +Block 0014 [ 15]: 8da5061bcb6a1352 +Block 0014 [ 16]: a108e3b625bdbbcf +Block 0014 [ 17]: eac50e88be6d72a8 +Block 0014 [ 18]: 52d7194dd03336c7 +Block 0014 [ 19]: 56025dc3f3ad86d9 +Block 0014 [ 20]: d7eb51a996fbcba4 +Block 0014 [ 21]: 3d590b82bab819bb +Block 0014 [ 22]: 1b6c96df6bf886f7 +Block 0014 [ 23]: ac25d4e6becf60d8 +Block 0014 [ 24]: 4af59e5a68c7a59e +Block 0014 [ 25]: fb1b4dfa899c0105 +Block 0014 [ 26]: 633e645801856648 +Block 0014 [ 27]: fa8ddeec6a823001 +Block 0014 [ 28]: a93a5e82198f77dd +Block 0014 [ 29]: 7ae453b0348fc6b2 +Block 0014 [ 30]: b6ebc8deda885562 +Block 0014 [ 31]: 72b3e8c629996c84 +Block 0014 [ 32]: 1317aeba03e2ad29 +Block 0014 [ 33]: 5234e64535c737c1 +Block 0014 [ 34]: 3b1fd79ba314ab07 +Block 0014 [ 35]: 9590c7b6fb1ea91b +Block 0014 [ 36]: 213f6ce02e02ad0d +Block 0014 [ 37]: 335b424cc634d4df +Block 0014 [ 38]: 34c1735174d44758 +Block 0014 [ 39]: ce9dfe46f52eebea +Block 0014 [ 40]: 6d6258ac61b821ab +Block 0014 [ 41]: 622d8e13ca29ed5c +Block 0014 [ 42]: b14226e2f8fad082 +Block 0014 [ 43]: a93cb7beed7dde9e +Block 0014 [ 44]: a65734f842749fc1 +Block 0014 [ 45]: ab77788d3cf8f1ce +Block 0014 [ 46]: f52b8d0ebafeda0f +Block 0014 [ 47]: 1127e07be84bfd23 +Block 0014 [ 48]: 18686c88d0eb20ee +Block 0014 [ 49]: 40dc4902a0305d3d +Block 0014 [ 50]: 632b9eec4405efec +Block 0014 [ 51]: 4702de3a2aae239c +Block 0014 [ 52]: e48306bb379a9526 +Block 0014 [ 53]: a6ffe75f5fb984fb +Block 0014 [ 54]: 729613e8c57feda1 +Block 0014 [ 55]: 12db6c406f5109a1 +Block 0014 [ 56]: 82802a8a7d811b58 +Block 0014 [ 57]: 3d4608d23971ec28 +Block 0014 [ 58]: ddebf41cb589e3d0 +Block 0014 [ 59]: a42eeb040b316ab4 +Block 0014 [ 60]: 3d4c8ddcdc91e2aa +Block 0014 [ 61]: 5dfc6656546c3b7b +Block 0014 [ 62]: 9d3044336e86a500 +Block 0014 [ 63]: 28b157087b452bd4 +Block 0014 [ 64]: d1070174c8a7a390 +Block 0014 [ 65]: 2cdffe736e143896 +Block 0014 [ 66]: e6ce15c80ba25385 +Block 0014 [ 67]: 417c84a7716d6e88 +Block 0014 [ 68]: f23a783da3ee4d2d +Block 0014 [ 69]: f537e7ce5c1c0c39 +Block 0014 [ 70]: f46211b54393895e +Block 0014 [ 71]: 8c1ff4607c78b5ff +Block 0014 [ 72]: 7a21a28042361b41 +Block 0014 [ 73]: d9d58f1b9ecc30de +Block 0014 [ 74]: 9a14fdb7b925ca4e +Block 0014 [ 75]: d6f7e86f1f500aa7 +Block 0014 [ 76]: c67fcb17f8ea4dd5 +Block 0014 [ 77]: 5f8d1c92691b14f1 +Block 0014 [ 78]: 104380e8c6d970cc +Block 0014 [ 79]: 7e353764f8c4619e +Block 0014 [ 80]: 030a672223596dcf +Block 0014 [ 81]: 6a78a93e7ebb6a14 +Block 0014 [ 82]: ca4c3cd24c3241d4 +Block 0014 [ 83]: ffb2874333097bf1 +Block 0014 [ 84]: 05316d934e1b5aab +Block 0014 [ 85]: 6ea2923030b2957b +Block 0014 [ 86]: 58be8db0cfb34d06 +Block 0014 [ 87]: 817cd34fcb68b398 +Block 0014 [ 88]: 6d25bb5ce9050af7 +Block 0014 [ 89]: 4f9fafe3d7836fc6 +Block 0014 [ 90]: 6b7a93aa1cbda794 +Block 0014 [ 91]: 12ae5bba84ff7fd9 +Block 0014 [ 92]: 1218cc6230a5eb3b +Block 0014 [ 93]: 4bbe6b14f7016cef +Block 0014 [ 94]: 712c225c222af1ed +Block 0014 [ 95]: eb274453bb34e6b7 +Block 0014 [ 96]: 5281165a73e35393 +Block 0014 [ 97]: a94e6d7fa4fa9d4b +Block 0014 [ 98]: cdac43d087fbf972 +Block 0014 [ 99]: c355f65033fff80c +Block 0014 [100]: 468d2835f99af1df +Block 0014 [101]: 97e10c620d78e48e +Block 0014 [102]: 4f7b455aa232f45a +Block 0014 [103]: 5642a41b8ba9ee5b +Block 0014 [104]: faab295a130f9450 +Block 0014 [105]: 354f050566475e75 +Block 0014 [106]: 1c147cc5765a61a5 +Block 0014 [107]: 546efd3bc03ae530 +Block 0014 [108]: 60d4770b9f8a3f15 +Block 0014 [109]: 4255516387bcc8cf +Block 0014 [110]: a2790cee31f12d9e +Block 0014 [111]: a61eb9ad582e94f2 +Block 0014 [112]: 2eef0642ebdb8b8e +Block 0014 [113]: 0dc8d04ae9e3a9c6 +Block 0014 [114]: b7d4a52e7df1cb7a +Block 0014 [115]: cb0cd12cbd577028 +Block 0014 [116]: fe77a376f1b80f27 +Block 0014 [117]: 55278752a92407f0 +Block 0014 [118]: 9d0c1acd148e5559 +Block 0014 [119]: 340d1b249a9f55e5 +Block 0014 [120]: e6b7fe56fb8beb34 +Block 0014 [121]: bfd595920d4c4730 +Block 0014 [122]: 53b698d6f41e0cdd +Block 0014 [123]: 25fd2b8c6fe7f60a +Block 0014 [124]: fcea31c1417d4d81 +Block 0014 [125]: 24d019132ba89b33 +Block 0014 [126]: 2c948d81f3196e46 +Block 0014 [127]: 5c9666b2e5bc5342 +Block 0015 [ 0]: b7a4c2b9a0491aa5 +Block 0015 [ 1]: d574fd14cfdceaa2 +Block 0015 [ 2]: 161e82ce52847ee9 +Block 0015 [ 3]: 87235a1ff06b32e3 +Block 0015 [ 4]: 25a15747451e13fb +Block 0015 [ 5]: 6fa0f15caf9a7b92 +Block 0015 [ 6]: bca7275912ca1bbe +Block 0015 [ 7]: 007874cae255dc7a +Block 0015 [ 8]: 1c2fc30cbbe3d6b0 +Block 0015 [ 9]: 037bf8fc3ccc60cf +Block 0015 [ 10]: c632e67a7898f97f +Block 0015 [ 11]: 1dbb324de0847142 +Block 0015 [ 12]: a22b1b5771e2fbc8 +Block 0015 [ 13]: 951e518ea73e1b70 +Block 0015 [ 14]: f65e911962b66a90 +Block 0015 [ 15]: 50ea5c8c71cc78c9 +Block 0015 [ 16]: 070b252030059571 +Block 0015 [ 17]: da2472f16b32c9d1 +Block 0015 [ 18]: ac991222ab1c212a +Block 0015 [ 19]: d201f392decf93bf +Block 0015 [ 20]: e4110edc7738c123 +Block 0015 [ 21]: 36c2faaffb2119a0 +Block 0015 [ 22]: d1243bf8984c942a +Block 0015 [ 23]: 380d70ebee5c486b +Block 0015 [ 24]: 4095da46a98e2e18 +Block 0015 [ 25]: f2d74db9726fcf0a +Block 0015 [ 26]: 48a1e0775c37687c +Block 0015 [ 27]: cb8f3d9e25f552f1 +Block 0015 [ 28]: 0595754dcb15d8c2 +Block 0015 [ 29]: c2bfae8c0074c656 +Block 0015 [ 30]: ce3a27a49064fd5e +Block 0015 [ 31]: bd9badeb87e71305 +Block 0015 [ 32]: 1332e5808a07898f +Block 0015 [ 33]: 447fc211923c7aae +Block 0015 [ 34]: 1b59d811f5a4174a +Block 0015 [ 35]: 9d77b466014e9c29 +Block 0015 [ 36]: abeeb15d32d4f5b0 +Block 0015 [ 37]: ed14c5bef6f13c5c +Block 0015 [ 38]: aebe3967f70094b2 +Block 0015 [ 39]: 5f9ed7861a69e3bd +Block 0015 [ 40]: b322fb95fae25c6b +Block 0015 [ 41]: 0590b396ab8b5077 +Block 0015 [ 42]: b9321d42b1b1a985 +Block 0015 [ 43]: f35f227bd94dd2f4 +Block 0015 [ 44]: caec578bdf1f9b9d +Block 0015 [ 45]: 25e0ba5c01a2c4bc +Block 0015 [ 46]: fc07695214589266 +Block 0015 [ 47]: 54503ba957c594ea +Block 0015 [ 48]: eaabac32c678ccad +Block 0015 [ 49]: 21175b4197624e82 +Block 0015 [ 50]: 0cebeb3aa5f3bbcb +Block 0015 [ 51]: c008177cfbfb0d60 +Block 0015 [ 52]: 2f801d1502ff2f12 +Block 0015 [ 53]: 7fcd684c565db3f6 +Block 0015 [ 54]: 62ff2ec38af1cafd +Block 0015 [ 55]: 914667196dd9d450 +Block 0015 [ 56]: 972932ff5be835e9 +Block 0015 [ 57]: 23a8368787a7335c +Block 0015 [ 58]: b2cae148e1b122c0 +Block 0015 [ 59]: 199b383227c05f08 +Block 0015 [ 60]: 1cb16ee897019269 +Block 0015 [ 61]: 510e0d439341c00d +Block 0015 [ 62]: 35cf3ac76d96edb3 +Block 0015 [ 63]: d940abb75cfa43cd +Block 0015 [ 64]: 3c4b3944ab11c757 +Block 0015 [ 65]: 4d9ccb418c25ad94 +Block 0015 [ 66]: 91c86a252e663075 +Block 0015 [ 67]: cb49238e4e128b91 +Block 0015 [ 68]: 6f11423978bed4e7 +Block 0015 [ 69]: 753573f75865542c +Block 0015 [ 70]: 650c04ea734b4449 +Block 0015 [ 71]: 880ebf2c16710b74 +Block 0015 [ 72]: 05fc3180f4138190 +Block 0015 [ 73]: ed721684f7dceb37 +Block 0015 [ 74]: e31f19710f7b0fe4 +Block 0015 [ 75]: 0463bb78656fae47 +Block 0015 [ 76]: 074f9a2583ca00e9 +Block 0015 [ 77]: 2f13e8db7be5969a +Block 0015 [ 78]: 9b5b5730a2f128b3 +Block 0015 [ 79]: f7cd36dc5c92e817 +Block 0015 [ 80]: f820cd395a7a86ae +Block 0015 [ 81]: 123f8d7cf1618e07 +Block 0015 [ 82]: 152f4e50e44750c7 +Block 0015 [ 83]: ad4c70516d41bab9 +Block 0015 [ 84]: 8bcb61e869a0807e +Block 0015 [ 85]: 9755cf2f6719e65f +Block 0015 [ 86]: c2c6ba4f970cb4ef +Block 0015 [ 87]: 457911ad86c1abc6 +Block 0015 [ 88]: 578a53b51ce1efcd +Block 0015 [ 89]: f6320caff8a0504b +Block 0015 [ 90]: 83ca5981239afa37 +Block 0015 [ 91]: 70c661c67ab92780 +Block 0015 [ 92]: 10bcfbdac8f01e97 +Block 0015 [ 93]: 94bdbd2609891909 +Block 0015 [ 94]: 1bb65f7b193d8c2f +Block 0015 [ 95]: f31366a301363c4f +Block 0015 [ 96]: 99fec0db195ee485 +Block 0015 [ 97]: ed4bc8f8d3ba4536 +Block 0015 [ 98]: 0a70086003a26263 +Block 0015 [ 99]: 345032952fe4effc +Block 0015 [100]: 2bb2e1a44c1f1326 +Block 0015 [101]: 21a33eddbefcbc66 +Block 0015 [102]: bb19b421edb329fa +Block 0015 [103]: 543c1de6fe03d61f +Block 0015 [104]: 8aed84a2fecd94d6 +Block 0015 [105]: b35b89557851b663 +Block 0015 [106]: f6a7be0e250ef42f +Block 0015 [107]: 3a290088a027faf7 +Block 0015 [108]: bce61f09e1310a04 +Block 0015 [109]: 0333886001acdb36 +Block 0015 [110]: 9d74d89762647905 +Block 0015 [111]: f49619828e0119bf +Block 0015 [112]: b7e584f437a3b086 +Block 0015 [113]: 252e2d8ecd0bd16d +Block 0015 [114]: 53ee0c9765660436 +Block 0015 [115]: 91f68f6a9a1b0bdb +Block 0015 [116]: c632c4e10c36b1b6 +Block 0015 [117]: 33145dd6a602a6b0 +Block 0015 [118]: 2d587480bdb222a3 +Block 0015 [119]: f0fd639a4880f0c3 +Block 0015 [120]: 211d17b5b475ef02 +Block 0015 [121]: f1fcfd14a52db0f6 +Block 0015 [122]: 064389ed71e2ef25 +Block 0015 [123]: c2acdfbb258af29a +Block 0015 [124]: dc814aa34930fc48 +Block 0015 [125]: 30ba919b66d5ddf3 +Block 0015 [126]: 1b3834a139ab499a +Block 0015 [127]: d5e674d6693bcd45 +Block 0016 [ 0]: 8f53985b3a68410e +Block 0016 [ 1]: f55650961898842f +Block 0016 [ 2]: 037efaa1cd23a098 +Block 0016 [ 3]: 3a31cf1b76c2758c +Block 0016 [ 4]: f4199b180eac0136 +Block 0016 [ 5]: 300b003da6fcbaf8 +Block 0016 [ 6]: f609345ed3053222 +Block 0016 [ 7]: 62b9a7bf80c4dd81 +Block 0016 [ 8]: 04f7fb1c97f94a19 +Block 0016 [ 9]: 20b4c7dcec025e7c +Block 0016 [ 10]: 86823ef3e716e64a +Block 0016 [ 11]: cc7b74f62ba0184b +Block 0016 [ 12]: b9346d50cf2e7038 +Block 0016 [ 13]: 49d8cc875f611ddf +Block 0016 [ 14]: 47e3d6bca96310b2 +Block 0016 [ 15]: 2b648844a3fc609a +Block 0016 [ 16]: d4324fd7f2bc2e0b +Block 0016 [ 17]: 9362f80e1d3fdc2b +Block 0016 [ 18]: 49225d97af47012d +Block 0016 [ 19]: 8035ab307fb284dd +Block 0016 [ 20]: 177fe4ed6ed816b5 +Block 0016 [ 21]: 91c26e2152032480 +Block 0016 [ 22]: 30604656e18cc814 +Block 0016 [ 23]: 70437cfb1f32fb43 +Block 0016 [ 24]: d1036df63cc6eee4 +Block 0016 [ 25]: 5dee0b34fa2c7707 +Block 0016 [ 26]: da74b65827b46a81 +Block 0016 [ 27]: 84e911553294f034 +Block 0016 [ 28]: d279a6a1e4904a83 +Block 0016 [ 29]: 8688e6979c347b06 +Block 0016 [ 30]: 740f20573f3de341 +Block 0016 [ 31]: d81c19459351f118 +Block 0016 [ 32]: 8f3262e1b89a27fd +Block 0016 [ 33]: efbef386858e969a +Block 0016 [ 34]: 48d49036dd2a63cc +Block 0016 [ 35]: 51a53f1cd99c239d +Block 0016 [ 36]: 69f02d56b69b080c +Block 0016 [ 37]: b58cdc35836d7e6a +Block 0016 [ 38]: b64765b6745af0db +Block 0016 [ 39]: d0cffdc5cd0ddd71 +Block 0016 [ 40]: d026cf29b9eadaec +Block 0016 [ 41]: 190259edbc0e09fb +Block 0016 [ 42]: fea21cb0734e621f +Block 0016 [ 43]: 3b8c48529162eca2 +Block 0016 [ 44]: 53ec43dd984b9ad2 +Block 0016 [ 45]: 7274f4839297fcc2 +Block 0016 [ 46]: 14d7275914f4a84c +Block 0016 [ 47]: cdff249b4bae7c12 +Block 0016 [ 48]: b32a9a4b48d6f22f +Block 0016 [ 49]: 0320bd7e7f48b4f4 +Block 0016 [ 50]: 42be9ca3da80c6fa +Block 0016 [ 51]: 358bd7e3eb8fada9 +Block 0016 [ 52]: dfe1dbbfca140598 +Block 0016 [ 53]: 1b4db106a75053c1 +Block 0016 [ 54]: 0b91f05e6625f711 +Block 0016 [ 55]: 1001ad2ee30a9d82 +Block 0016 [ 56]: 740b036b5748bea0 +Block 0016 [ 57]: 3168f06e761fb765 +Block 0016 [ 58]: 71d10306a2fe7973 +Block 0016 [ 59]: 1faa34f320f87936 +Block 0016 [ 60]: d91db435304a17a5 +Block 0016 [ 61]: 30430ec5d6f3ad2a +Block 0016 [ 62]: cb197690414e41b6 +Block 0016 [ 63]: f6779e44ae25c2d7 +Block 0016 [ 64]: 6b94597b50f594af +Block 0016 [ 65]: 075a280984aed80a +Block 0016 [ 66]: d54a50a999345ae3 +Block 0016 [ 67]: 2caab9d8cfd6d3e2 +Block 0016 [ 68]: 7851c907c69feb69 +Block 0016 [ 69]: 5ca2e8965cd0c96c +Block 0016 [ 70]: 28ab1227b13da504 +Block 0016 [ 71]: 686f14d57531b14b +Block 0016 [ 72]: 3b5a11c818a1ec14 +Block 0016 [ 73]: 5a4f6b4be61809aa +Block 0016 [ 74]: ce900ccf21eededc +Block 0016 [ 75]: d0d2187be91e67a5 +Block 0016 [ 76]: a92d1b14da7b0101 +Block 0016 [ 77]: 71d2ac9a9bfc3eab +Block 0016 [ 78]: 3c7857f37e5fbd14 +Block 0016 [ 79]: 1c64281a444f792f +Block 0016 [ 80]: b999c6b9f7738096 +Block 0016 [ 81]: db1e1182630f00f6 +Block 0016 [ 82]: 0807b0bd2f37fa78 +Block 0016 [ 83]: e9f307ad3c4e8b74 +Block 0016 [ 84]: 79c841933e70c1da +Block 0016 [ 85]: cb663333c394a92a +Block 0016 [ 86]: 13c6ab3371e87b02 +Block 0016 [ 87]: 047fa349cd71f72e +Block 0016 [ 88]: 6fd668ad1c07ee9d +Block 0016 [ 89]: 890e7546afcd50f3 +Block 0016 [ 90]: 8fd5e4eb7d62ece7 +Block 0016 [ 91]: fe3efd3fba7302ed +Block 0016 [ 92]: d0dd2f8d2a385e85 +Block 0016 [ 93]: 5b6271669fae3e0a +Block 0016 [ 94]: d83477ae521cb0cd +Block 0016 [ 95]: 032ea7a424669708 +Block 0016 [ 96]: a74455ce63af6f96 +Block 0016 [ 97]: f622454de29f608b +Block 0016 [ 98]: 237f28a1d7382575 +Block 0016 [ 99]: f38e224b5ab4c811 +Block 0016 [100]: 2e28cbd870f74ad5 +Block 0016 [101]: 9b02a754a53eea78 +Block 0016 [102]: 64ef1fa6609e77de +Block 0016 [103]: a9a49c283d2b79eb +Block 0016 [104]: 628ff70e0dcb9620 +Block 0016 [105]: e5eab5e455302769 +Block 0016 [106]: be2ead710a9b85f7 +Block 0016 [107]: 4139690693c5d1de +Block 0016 [108]: cb79d6351ff25123 +Block 0016 [109]: 766767dd95ef924a +Block 0016 [110]: 7a57e4a083f964f3 +Block 0016 [111]: f5a7eff23abff0e6 +Block 0016 [112]: fa62e8e8b38623f9 +Block 0016 [113]: aa3edb47ecdc0377 +Block 0016 [114]: cfcf56fd674a3d2d +Block 0016 [115]: 3cdd8c5d983a1bb4 +Block 0016 [116]: fb6f6bceb5db5b26 +Block 0016 [117]: 89fd727b53ec9e75 +Block 0016 [118]: 97600bafacfb83ef +Block 0016 [119]: 8b094ea63455850c +Block 0016 [120]: 4ba706a569460f60 +Block 0016 [121]: f3f4781fabbc676f +Block 0016 [122]: 5c5e73cc56d1ce93 +Block 0016 [123]: 2ea6a7856cc27120 +Block 0016 [124]: 9cb33d05ffd27f28 +Block 0016 [125]: 79796b487462562e +Block 0016 [126]: 30c5bd9655219145 +Block 0016 [127]: b994aa85d73dd810 +Block 0017 [ 0]: 25af99c7dd2c4372 +Block 0017 [ 1]: 9737394118f299bb +Block 0017 [ 2]: d2de9ee44efcd374 +Block 0017 [ 3]: fc03033c2fdc08f0 +Block 0017 [ 4]: 3f880894b78aed28 +Block 0017 [ 5]: 6c8a9e4ef84e12eb +Block 0017 [ 6]: bbfda7a204c749ae +Block 0017 [ 7]: 5bd6718dc48c323b +Block 0017 [ 8]: b90c762a037aeae9 +Block 0017 [ 9]: 649d8a54f608176c +Block 0017 [ 10]: 786afe00b006a485 +Block 0017 [ 11]: e37a432bc2cc9822 +Block 0017 [ 12]: de19379656716c29 +Block 0017 [ 13]: fcf6fbc0df6c2616 +Block 0017 [ 14]: a5707ebe5c43ce27 +Block 0017 [ 15]: 0022eb27e8a28351 +Block 0017 [ 16]: 8eba1f29bb9649e9 +Block 0017 [ 17]: a14ede529e77c948 +Block 0017 [ 18]: 679d0fd464f5a7c1 +Block 0017 [ 19]: 1d5e242fe07d4499 +Block 0017 [ 20]: e5d9ecb94d96426f +Block 0017 [ 21]: b55c342da4c92a45 +Block 0017 [ 22]: 46f6ffbe914fa536 +Block 0017 [ 23]: 8831b50a46c6b9fa +Block 0017 [ 24]: 98d34ad0e739e4d9 +Block 0017 [ 25]: 34c995923bd2c3c1 +Block 0017 [ 26]: 42cf969aab5942c1 +Block 0017 [ 27]: c9b437a842d875b3 +Block 0017 [ 28]: 5925675213537e33 +Block 0017 [ 29]: d46c58bc487a34f6 +Block 0017 [ 30]: 806a4619dbfc03dd +Block 0017 [ 31]: b45295959812bcec +Block 0017 [ 32]: aebc1f1371e2fc47 +Block 0017 [ 33]: f09f1a1c3121e7cd +Block 0017 [ 34]: 4d1d9a11dcae8b67 +Block 0017 [ 35]: f38a9759bc5d17c6 +Block 0017 [ 36]: 2e20740f5524dae3 +Block 0017 [ 37]: 40f1d3e4f71041db +Block 0017 [ 38]: 844a27fd35e7da66 +Block 0017 [ 39]: b4b854cae05e9e9a +Block 0017 [ 40]: 5e6964c38ac50871 +Block 0017 [ 41]: 3c18498deb7d982e +Block 0017 [ 42]: 647c7a8c145356a1 +Block 0017 [ 43]: d737b5773a76b636 +Block 0017 [ 44]: 48037c19a592c44d +Block 0017 [ 45]: acc24bb4b271d775 +Block 0017 [ 46]: 393897168ab1a9e2 +Block 0017 [ 47]: 06f964d7bea429f1 +Block 0017 [ 48]: bf04c3f8df53259d +Block 0017 [ 49]: 3149fc5f1f43994e +Block 0017 [ 50]: 063319bf41479907 +Block 0017 [ 51]: 1854281df4864ba9 +Block 0017 [ 52]: 92edcdb4c263a03d +Block 0017 [ 53]: d780b3bd4caae765 +Block 0017 [ 54]: 02b5d0ebf0cda39d +Block 0017 [ 55]: a0f5a5211ca3bd07 +Block 0017 [ 56]: 5636022ed78cfd97 +Block 0017 [ 57]: 1cce86221184e63a +Block 0017 [ 58]: 6a012fa4ac7d9313 +Block 0017 [ 59]: 93f395e140a8fbe4 +Block 0017 [ 60]: 985ecc071322bcf3 +Block 0017 [ 61]: 1ea42f6dec2fc89e +Block 0017 [ 62]: 3ec7da55e6f3650b +Block 0017 [ 63]: 1617261e0b1e885f +Block 0017 [ 64]: 27ce65eca8e2c7ec +Block 0017 [ 65]: 5e989683b826cca5 +Block 0017 [ 66]: 1095accf790c67e6 +Block 0017 [ 67]: 092884b7e068124e +Block 0017 [ 68]: 3a9e2a925ea19187 +Block 0017 [ 69]: c6962ab8187140c5 +Block 0017 [ 70]: 9edd8afc314c0744 +Block 0017 [ 71]: cd9cea440f39fa0b +Block 0017 [ 72]: adc2e65d1d5f4612 +Block 0017 [ 73]: 8d271b9d779bd3c1 +Block 0017 [ 74]: 8d98f39f07ed40d5 +Block 0017 [ 75]: 9a350daa5e1185bc +Block 0017 [ 76]: a50155990d517040 +Block 0017 [ 77]: 9737cb03db154e43 +Block 0017 [ 78]: 5b62dbdb43a7ae36 +Block 0017 [ 79]: 718dcab45caefd1d +Block 0017 [ 80]: 198ce38e06e84855 +Block 0017 [ 81]: a334190d64a3c358 +Block 0017 [ 82]: 9324456d4c2eebc5 +Block 0017 [ 83]: ac6677767b0e8589 +Block 0017 [ 84]: 99fcdac332ca73cb +Block 0017 [ 85]: ccc87d5cbd040dd9 +Block 0017 [ 86]: 7ba741ad5e014fdc +Block 0017 [ 87]: 04b98a5dbb9858d3 +Block 0017 [ 88]: 48f83e1d55782a3e +Block 0017 [ 89]: 7fdc976538a9605d +Block 0017 [ 90]: 34696b986f3276a1 +Block 0017 [ 91]: d2e5952e0e8c1513 +Block 0017 [ 92]: d3d6f03d384bff58 +Block 0017 [ 93]: ea50faff9497e736 +Block 0017 [ 94]: 923567f0b71393cb +Block 0017 [ 95]: 999b7be894d806fa +Block 0017 [ 96]: bff84f0b93f93adb +Block 0017 [ 97]: 36550f9621d9e1d2 +Block 0017 [ 98]: 98b3bd27313db1ee +Block 0017 [ 99]: a0fd0d843f1d9c2a +Block 0017 [100]: c2af36b6ac1bff35 +Block 0017 [101]: cf1f5dd60b32741c +Block 0017 [102]: a73467edf0046e40 +Block 0017 [103]: bc88e01dc0b3ead3 +Block 0017 [104]: 76c60f22353f13da +Block 0017 [105]: b4426004fec916fc +Block 0017 [106]: 515940091ded755a +Block 0017 [107]: e2e1105fc6ce1c1f +Block 0017 [108]: b97b4018796ee38b +Block 0017 [109]: a24f467b8b444546 +Block 0017 [110]: 82ae89263b2f72b9 +Block 0017 [111]: c88e67246622bf95 +Block 0017 [112]: df50ff12b0d1b15b +Block 0017 [113]: 51bbb2e9a6005550 +Block 0017 [114]: 91cb844ea94a3792 +Block 0017 [115]: bbc07e5ad7e82009 +Block 0017 [116]: 60c62d377e5be69a +Block 0017 [117]: 4c56a5431c2b3e76 +Block 0017 [118]: 193324e72943dc20 +Block 0017 [119]: 25441dced351b789 +Block 0017 [120]: 040d53f6f1512c9d +Block 0017 [121]: 130e48953283e7d1 +Block 0017 [122]: 2d326e978ff8130a +Block 0017 [123]: 2000c765fc63f72f +Block 0017 [124]: ccd4bc7dbd218e40 +Block 0017 [125]: 163c65d57d0ec8d8 +Block 0017 [126]: 4ec3e83cf091cb11 +Block 0017 [127]: d0c37c0476196abf +Block 0018 [ 0]: cc16b40ad5747e4e +Block 0018 [ 1]: fc9cea26229979aa +Block 0018 [ 2]: 71c2ce72e2969701 +Block 0018 [ 3]: 791cbfcbc3dcbeac +Block 0018 [ 4]: 9f87de4eb6bd1c78 +Block 0018 [ 5]: b2299523780f6e83 +Block 0018 [ 6]: 3cab22b2571bb002 +Block 0018 [ 7]: e84bc808526ba1c4 +Block 0018 [ 8]: 1e6da5a620d1763a +Block 0018 [ 9]: d43041a9052354e7 +Block 0018 [ 10]: 2adfd5010c727d11 +Block 0018 [ 11]: 07d408bc985c47fc +Block 0018 [ 12]: cb0735fa154efb20 +Block 0018 [ 13]: 5d9cd38a29c6c593 +Block 0018 [ 14]: e6acfe5ea8e9d8de +Block 0018 [ 15]: 93fbaf947ed59bc3 +Block 0018 [ 16]: 8bcd692f1b47b6a6 +Block 0018 [ 17]: 9f1234cb7653eb74 +Block 0018 [ 18]: cb83ea20a50f3f7e +Block 0018 [ 19]: 00f9c746d11f2227 +Block 0018 [ 20]: f7402e994a250230 +Block 0018 [ 21]: 982c78f9d63107c2 +Block 0018 [ 22]: a34d035c8788a81e +Block 0018 [ 23]: fe5e3d1993d4e860 +Block 0018 [ 24]: 1ebf3aef0c6b10bf +Block 0018 [ 25]: f28b8fff6ccc27a4 +Block 0018 [ 26]: d2b59050aff341c5 +Block 0018 [ 27]: 5a820ee8a39572fe +Block 0018 [ 28]: 6f963e89e1c54e52 +Block 0018 [ 29]: fc1b178e6b97e4ac +Block 0018 [ 30]: 7e9a9c313e4efb8a +Block 0018 [ 31]: 9d471890801a8ab3 +Block 0018 [ 32]: 5f7e0de0ae64c1db +Block 0018 [ 33]: 1ec697d242aa51f5 +Block 0018 [ 34]: 7b8e0b9d219a2029 +Block 0018 [ 35]: 8d08d76f52bdaa6e +Block 0018 [ 36]: 66b0c4a5cc40d799 +Block 0018 [ 37]: 942c84e05d97fffa +Block 0018 [ 38]: bbb862ba00327b6d +Block 0018 [ 39]: bef2092925db17f5 +Block 0018 [ 40]: 4e31cd9dfdbae400 +Block 0018 [ 41]: 46e528452ba8856e +Block 0018 [ 42]: 35d3f0910e752f79 +Block 0018 [ 43]: 8e47a91e5c44463f +Block 0018 [ 44]: 96a6455e5072b431 +Block 0018 [ 45]: 8b64f956cd48dc1b +Block 0018 [ 46]: 12e0ddef27aafdfe +Block 0018 [ 47]: 82da7ffbc3218c92 +Block 0018 [ 48]: 23390a781bd0644c +Block 0018 [ 49]: 52e2ed3f08f461c6 +Block 0018 [ 50]: 97d91cd63f28c587 +Block 0018 [ 51]: bc6a807a9e196641 +Block 0018 [ 52]: c357ff64c15aa403 +Block 0018 [ 53]: e6f47d41087b1758 +Block 0018 [ 54]: 7fd24e9a098fe9ea +Block 0018 [ 55]: eb58ad3c5f2ddb88 +Block 0018 [ 56]: d886a29c6469e51e +Block 0018 [ 57]: ae13ef46d94ca5dd +Block 0018 [ 58]: f0227a75ed41f619 +Block 0018 [ 59]: f726ec8a5fb32899 +Block 0018 [ 60]: c2cb9cb1c7d6b1dc +Block 0018 [ 61]: 94e5e8d5c146ccd1 +Block 0018 [ 62]: a0914d9445df8d98 +Block 0018 [ 63]: baf4a01d25ce6f40 +Block 0018 [ 64]: 972694d1ba5d3873 +Block 0018 [ 65]: 28f525a4ae211560 +Block 0018 [ 66]: a60d9477eae5e7b6 +Block 0018 [ 67]: cedfb2bd66a74fea +Block 0018 [ 68]: cf2a8795c497b516 +Block 0018 [ 69]: e311460034b81676 +Block 0018 [ 70]: 6101999febaa6a08 +Block 0018 [ 71]: 0f414973e6b7ddd4 +Block 0018 [ 72]: 26eddd7b3b23e908 +Block 0018 [ 73]: 814c7d4f61874c5d +Block 0018 [ 74]: 066f27c905b2af02 +Block 0018 [ 75]: 6af0b152e8bf5b4a +Block 0018 [ 76]: 2b83b61d77577710 +Block 0018 [ 77]: 772757c567f0994e +Block 0018 [ 78]: 889bac540251180e +Block 0018 [ 79]: 5390db775c6a30a1 +Block 0018 [ 80]: f0601f43f63551b8 +Block 0018 [ 81]: 0fe587bca1b1370e +Block 0018 [ 82]: be51925e9397cb1f +Block 0018 [ 83]: 684159088b026646 +Block 0018 [ 84]: 83947593200cc262 +Block 0018 [ 85]: 6cff3fef11aaf653 +Block 0018 [ 86]: a0a529421d6a0530 +Block 0018 [ 87]: fc223917e2488077 +Block 0018 [ 88]: e920da644e7d73cd +Block 0018 [ 89]: 8d7df56be3c7fcd0 +Block 0018 [ 90]: 572aaa5457003a1f +Block 0018 [ 91]: a7f3c24f4ccbf913 +Block 0018 [ 92]: 62eb3807aa42d76d +Block 0018 [ 93]: 74d20a064449b36c +Block 0018 [ 94]: 7f3d004af82674eb +Block 0018 [ 95]: e7aa407b9f2eaffe +Block 0018 [ 96]: 05bde0b72833ede7 +Block 0018 [ 97]: 9a529018d06b1a9c +Block 0018 [ 98]: f0556a4f08155dab +Block 0018 [ 99]: 0317465138ab2d53 +Block 0018 [100]: f7fc8b6426c8adbd +Block 0018 [101]: 08769ef8a31b39a0 +Block 0018 [102]: 80b95e7ed0f363e5 +Block 0018 [103]: 1d2325b8911f1fd3 +Block 0018 [104]: fedeb4b73b6da294 +Block 0018 [105]: 7c9d104827324f47 +Block 0018 [106]: 9d9c711b4934c8c8 +Block 0018 [107]: 9092d112bd03fb13 +Block 0018 [108]: 01d8fe13c4484a3a +Block 0018 [109]: dd422ca0ce650b57 +Block 0018 [110]: 144c0dfb1afcc139 +Block 0018 [111]: 1c7b4586ca53a390 +Block 0018 [112]: 6c29fc6c25d93b1e +Block 0018 [113]: 1922cf3c0eb0eae1 +Block 0018 [114]: 692a594c53cbfe12 +Block 0018 [115]: a17a0f7581201eea +Block 0018 [116]: 8e3a0fab7f26a4a7 +Block 0018 [117]: 6e81606212a24250 +Block 0018 [118]: 46f94f333f1b0c80 +Block 0018 [119]: 8fb29cf58b02f7dc +Block 0018 [120]: 751c4d607d662b1f +Block 0018 [121]: 011b138878fd82f2 +Block 0018 [122]: ca6cda756a32627e +Block 0018 [123]: 18c16dd1426c836e +Block 0018 [124]: 1553aab1ec673729 +Block 0018 [125]: 05277de65fa287a5 +Block 0018 [126]: 7c4752344b98dbfa +Block 0018 [127]: ca946d048696b8d2 +Block 0019 [ 0]: f1e7830fd25fae5c +Block 0019 [ 1]: e722f627ee827cc2 +Block 0019 [ 2]: dbdda4176637645f +Block 0019 [ 3]: fed075b832e6d60d +Block 0019 [ 4]: 31b4a8232cf0f6d1 +Block 0019 [ 5]: 995419324435bafe +Block 0019 [ 6]: 7f034194b003a341 +Block 0019 [ 7]: e32c00e524f3b869 +Block 0019 [ 8]: 9221dd1d02dd673c +Block 0019 [ 9]: 1fe96cc1a3e8b14a +Block 0019 [ 10]: e13fd9248af85745 +Block 0019 [ 11]: 6f6abd3d84d25afd +Block 0019 [ 12]: 6b53d7b291973d82 +Block 0019 [ 13]: dfd270032800df30 +Block 0019 [ 14]: 51b8b57c7af83dc3 +Block 0019 [ 15]: f1a2060eff3d4026 +Block 0019 [ 16]: f04338a9d4813cb5 +Block 0019 [ 17]: 8dab994cf44555a1 +Block 0019 [ 18]: 0016c2f1d822e72b +Block 0019 [ 19]: 03611fcb09c2844a +Block 0019 [ 20]: 47931e1325d7bfa2 +Block 0019 [ 21]: 6e2435a2f5877a18 +Block 0019 [ 22]: 17a14f7a04c53a6c +Block 0019 [ 23]: e2b9ac28f13fdb09 +Block 0019 [ 24]: b02fbc04a68ef177 +Block 0019 [ 25]: b68dbee4c144f618 +Block 0019 [ 26]: 0b1bb54e3a825b1f +Block 0019 [ 27]: 5e8cb76f0a913e10 +Block 0019 [ 28]: 520a35dbde052eec +Block 0019 [ 29]: 7e5f3cdec8f738f0 +Block 0019 [ 30]: f0f3b74b494d30da +Block 0019 [ 31]: 6da6d4492f5d5fd6 +Block 0019 [ 32]: 4569a5b7c1000bc4 +Block 0019 [ 33]: 6a98b609ae531d7f +Block 0019 [ 34]: 5f3a721f2348256e +Block 0019 [ 35]: 174e5479fb6e0de4 +Block 0019 [ 36]: 3f6b47e56470492d +Block 0019 [ 37]: 5e1f6f163f69b6be +Block 0019 [ 38]: f6e998276b3b2e4c +Block 0019 [ 39]: bcfa0808cd732980 +Block 0019 [ 40]: 41664d9e8bd9ab30 +Block 0019 [ 41]: a88910d2af9784fe +Block 0019 [ 42]: 0e58fd96c2b966dd +Block 0019 [ 43]: 0975037f9bebef17 +Block 0019 [ 44]: fe17294a640aaf22 +Block 0019 [ 45]: d82e4987ba7c5899 +Block 0019 [ 46]: 4f5875e05025ed65 +Block 0019 [ 47]: f47b5bc7d131c365 +Block 0019 [ 48]: 88949148f6381880 +Block 0019 [ 49]: 49790168c570dbc6 +Block 0019 [ 50]: 91179f41bc61d381 +Block 0019 [ 51]: 964e6647b2240b9d +Block 0019 [ 52]: 469a2ca044a46f99 +Block 0019 [ 53]: 775719640dd3ea02 +Block 0019 [ 54]: c326dd47988e09e8 +Block 0019 [ 55]: 4b89a1a069646be5 +Block 0019 [ 56]: dbdc5efe88ee654f +Block 0019 [ 57]: a591fe65df404742 +Block 0019 [ 58]: e9e4ed0c20f77666 +Block 0019 [ 59]: 914d772c94508d51 +Block 0019 [ 60]: 73799663310c1cf8 +Block 0019 [ 61]: 004529e670391934 +Block 0019 [ 62]: 96298c287e11af1f +Block 0019 [ 63]: 4764493038171a0c +Block 0019 [ 64]: 99ae7d71ebaf7e2d +Block 0019 [ 65]: d64eb6712f31477c +Block 0019 [ 66]: 33006d2453c52a29 +Block 0019 [ 67]: f456ea4e8dffa076 +Block 0019 [ 68]: f02b73dab38ddb48 +Block 0019 [ 69]: 89a4f3e96b085ec1 +Block 0019 [ 70]: 09fb004b8f42a6f7 +Block 0019 [ 71]: d021ef6317f882d8 +Block 0019 [ 72]: 290f3c3c926f7b1c +Block 0019 [ 73]: dabdfda18f650705 +Block 0019 [ 74]: 08a5e3a99446a79f +Block 0019 [ 75]: 53f8f9da1dddbd37 +Block 0019 [ 76]: d74f4c4c9a5f1e24 +Block 0019 [ 77]: 873af7345e779b6e +Block 0019 [ 78]: e5700386448f5d64 +Block 0019 [ 79]: 8c8bf0c2e92f6e8c +Block 0019 [ 80]: a61cc56c8cb40a09 +Block 0019 [ 81]: 8ab9deff5491f6cc +Block 0019 [ 82]: 8d90f91fdb55411f +Block 0019 [ 83]: 42f1723a12eacd4a +Block 0019 [ 84]: 62ea21253514ef3e +Block 0019 [ 85]: 8be3a6b87b767626 +Block 0019 [ 86]: e53f23ab3302fab7 +Block 0019 [ 87]: 8d7406f24d644e37 +Block 0019 [ 88]: 11eb7eeae417a83c +Block 0019 [ 89]: 9378ff2094390edd +Block 0019 [ 90]: 0cab6e06dea4e6d7 +Block 0019 [ 91]: e1a91d302fcb830b +Block 0019 [ 92]: 05a8b103c49b749e +Block 0019 [ 93]: b835a812caa13495 +Block 0019 [ 94]: 9e4a7d6008dc0d07 +Block 0019 [ 95]: 18d0fa5ba8e5d485 +Block 0019 [ 96]: 9e9398529ce75aca +Block 0019 [ 97]: 17057081a418bacf +Block 0019 [ 98]: 4e0f27d1838154bd +Block 0019 [ 99]: 8d44877ca2051aa8 +Block 0019 [100]: 0a4cd6358d00bf87 +Block 0019 [101]: 7c0bff02bb67c59c +Block 0019 [102]: aa3fa4ef9b5dd781 +Block 0019 [103]: 97a50d863ffc53d9 +Block 0019 [104]: 7eb0b749989ef4eb +Block 0019 [105]: 42f2c7f29e17413c +Block 0019 [106]: 645d879ee4b51f59 +Block 0019 [107]: c762cc190f4efb3f +Block 0019 [108]: 770003ec55c205d9 +Block 0019 [109]: 42846df1c4848f87 +Block 0019 [110]: 624ea1aba2a7b90e +Block 0019 [111]: 381df621938f285d +Block 0019 [112]: a46b93b0ffca4de9 +Block 0019 [113]: dceffbeebcd085c6 +Block 0019 [114]: a64c1f001498c383 +Block 0019 [115]: 6a5b51a09044452e +Block 0019 [116]: 198bcaa970ec0793 +Block 0019 [117]: 4927e17271e075e9 +Block 0019 [118]: 655157bfc11bc960 +Block 0019 [119]: 5820ba92b019f490 +Block 0019 [120]: a6404d587984349d +Block 0019 [121]: a3b6baa1ee83ff71 +Block 0019 [122]: 01bd468653db5771 +Block 0019 [123]: 41bb6a30fd950b20 +Block 0019 [124]: cbebc0f2d3027bbe +Block 0019 [125]: b1ba5e6e7fa4566e +Block 0019 [126]: c18c520e0cd81007 +Block 0019 [127]: 59769107732ed252 +Block 0020 [ 0]: f7a02540719722b2 +Block 0020 [ 1]: 793647276c046ccd +Block 0020 [ 2]: a14522df2ec9b017 +Block 0020 [ 3]: 40410f02a5eec424 +Block 0020 [ 4]: 20d579f606b8ed32 +Block 0020 [ 5]: 48f51282fca74fa4 +Block 0020 [ 6]: a39c1f758e17b6c9 +Block 0020 [ 7]: 23439532dad82587 +Block 0020 [ 8]: 56140cf3ddec83cc +Block 0020 [ 9]: 8103508d26c631c0 +Block 0020 [ 10]: da9965e5fcfb1f83 +Block 0020 [ 11]: e25790b322b33fad +Block 0020 [ 12]: b1abd7a58bb1d66e +Block 0020 [ 13]: b7758cdd576e14ac +Block 0020 [ 14]: 5bc5572e7650aac5 +Block 0020 [ 15]: bc6293a4d42190da +Block 0020 [ 16]: bbd6b2a25f3eb6f1 +Block 0020 [ 17]: 6eb99b410f0e9b09 +Block 0020 [ 18]: e6801c5d1e4c07a5 +Block 0020 [ 19]: 6e4e0a6c98f91237 +Block 0020 [ 20]: acdc7d2e237f9c58 +Block 0020 [ 21]: d0b6bd85fe772acb +Block 0020 [ 22]: 3af46184aab0899b +Block 0020 [ 23]: d64a30d79a2a8656 +Block 0020 [ 24]: 6bb8c7cc6580c8a8 +Block 0020 [ 25]: 9dba817881a14fc5 +Block 0020 [ 26]: 11b2964245a99f2f +Block 0020 [ 27]: b05f003f2c62dbb9 +Block 0020 [ 28]: 8efc3f9e00d0742c +Block 0020 [ 29]: eef2abfa36296b80 +Block 0020 [ 30]: 33f504553ee7aefb +Block 0020 [ 31]: e515f172cbc15f96 +Block 0020 [ 32]: f1b5332ce18d2068 +Block 0020 [ 33]: 629f71da3729dd4c +Block 0020 [ 34]: ca8740743450e9e4 +Block 0020 [ 35]: cd2a84fe1e4beadc +Block 0020 [ 36]: 337e086b0da43f8d +Block 0020 [ 37]: af09ba250c1835d1 +Block 0020 [ 38]: c726a7ae8cd2b9cc +Block 0020 [ 39]: a6d6197a3b32d1a5 +Block 0020 [ 40]: 7c59469d97032861 +Block 0020 [ 41]: 18870f3f29d0ff6c +Block 0020 [ 42]: e223d42a40f6fc86 +Block 0020 [ 43]: 2b097cab1e3e202b +Block 0020 [ 44]: 1067b29eac4bf9ef +Block 0020 [ 45]: a17d4321bd1ffc44 +Block 0020 [ 46]: 28bd1bc360800b69 +Block 0020 [ 47]: efbd0b5a815fab67 +Block 0020 [ 48]: dfb2c5c83c089ade +Block 0020 [ 49]: 1d72cee46ff73a07 +Block 0020 [ 50]: e65150c76a3b93ad +Block 0020 [ 51]: 01463480b6e07432 +Block 0020 [ 52]: dbb11d4d1ab842a5 +Block 0020 [ 53]: 1aa01282303809a1 +Block 0020 [ 54]: 0407d2b151f26a2e +Block 0020 [ 55]: bda5259c36ffe4e2 +Block 0020 [ 56]: 5ba64524226b17b0 +Block 0020 [ 57]: 14ebbabdc5c1081b +Block 0020 [ 58]: 8e28b79933734dcc +Block 0020 [ 59]: b1912c7bb67162da +Block 0020 [ 60]: 2246ca2915c0b57c +Block 0020 [ 61]: 44ca8e8b31882e92 +Block 0020 [ 62]: 153b19cca0f2e70f +Block 0020 [ 63]: 36c1a2b1fdbafed1 +Block 0020 [ 64]: 80b5d29d62621bd0 +Block 0020 [ 65]: 2f6b6a4977d304b0 +Block 0020 [ 66]: 8b4745ab709f83b6 +Block 0020 [ 67]: 79b5a11fba60e3ac +Block 0020 [ 68]: 5f5a066b534ccdb4 +Block 0020 [ 69]: b0a5387823264e55 +Block 0020 [ 70]: 4a8dc8d0b937aef0 +Block 0020 [ 71]: 64fe1e285c9a489b +Block 0020 [ 72]: 7e9ebfdfd7b3b128 +Block 0020 [ 73]: 3830d2dcfa33d585 +Block 0020 [ 74]: 95ddc376097e5fed +Block 0020 [ 75]: da61f020a5bd1ec0 +Block 0020 [ 76]: 58261f1a2ec1ec2a +Block 0020 [ 77]: d9d5d2badbc4b092 +Block 0020 [ 78]: 21fad4988a0d3b1a +Block 0020 [ 79]: 2515690a13cdf56a +Block 0020 [ 80]: fe9dae3553a4b5f8 +Block 0020 [ 81]: 01017f26017236f0 +Block 0020 [ 82]: e53fee225d251aa4 +Block 0020 [ 83]: 97a9dc2f4b919e45 +Block 0020 [ 84]: aba7bb7807dac22e +Block 0020 [ 85]: 8396a7f53ed6fe73 +Block 0020 [ 86]: d59d2a7855619f38 +Block 0020 [ 87]: 19e81207e1990d14 +Block 0020 [ 88]: 6af6cb67ba215ab1 +Block 0020 [ 89]: a0bd23fd1394eb2c +Block 0020 [ 90]: b8fd28ac5847a3a3 +Block 0020 [ 91]: d06e21a15fd9a785 +Block 0020 [ 92]: cbb84febca6dbed1 +Block 0020 [ 93]: ac1a9ca2f04ecc67 +Block 0020 [ 94]: c3265cfa6411f43a +Block 0020 [ 95]: 1f967f21c14b7864 +Block 0020 [ 96]: 463514566c30d67f +Block 0020 [ 97]: 9ab54cf19f8332b9 +Block 0020 [ 98]: 752ef52670d62f4f +Block 0020 [ 99]: 94c30bbb67d74756 +Block 0020 [100]: 9da7e0413f23ef7a +Block 0020 [101]: 5b14c9078edcea1c +Block 0020 [102]: f1fc1cf31932181a +Block 0020 [103]: a58aedabd43ed327 +Block 0020 [104]: 0df7f94de81d72f1 +Block 0020 [105]: 7605dd82b1ba6494 +Block 0020 [106]: b4990feceae9fdd4 +Block 0020 [107]: b111dccb67f5c7bb +Block 0020 [108]: b8fea154255b39ca +Block 0020 [109]: f89e4f433d96c7ee +Block 0020 [110]: 5b29c9419b89452f +Block 0020 [111]: d847da18c88976f3 +Block 0020 [112]: 39256fb09713f686 +Block 0020 [113]: dac4ef8fba50a8e2 +Block 0020 [114]: 661120873a7a18fd +Block 0020 [115]: 093892e68c1baf73 +Block 0020 [116]: 480b98fe82c235af +Block 0020 [117]: 59a4a56b2f12be74 +Block 0020 [118]: ed31ee49a5ada172 +Block 0020 [119]: 56785be3b6f96319 +Block 0020 [120]: f18290424c5a7936 +Block 0020 [121]: fa7ac39ca22d0d14 +Block 0020 [122]: 65c55663ec05b2dc +Block 0020 [123]: 2aea00dee01a3d80 +Block 0020 [124]: 655e16c05e192f42 +Block 0020 [125]: eff65a062d00ffe3 +Block 0020 [126]: f54f1777a25e8532 +Block 0020 [127]: 27cbbe27f5e27d94 +Block 0021 [ 0]: bfd6eab6c93af588 +Block 0021 [ 1]: ad7bf667d74382bf +Block 0021 [ 2]: 195c9027fa5471a6 +Block 0021 [ 3]: e46b052225d48ff4 +Block 0021 [ 4]: bdecfecafa6a38bc +Block 0021 [ 5]: e83caa5b213c1e8b +Block 0021 [ 6]: f7702d25f2b78730 +Block 0021 [ 7]: cc3925d4a5576071 +Block 0021 [ 8]: 45bc491d19dee84f +Block 0021 [ 9]: f9e0f6aa40ea1e2a +Block 0021 [ 10]: dfddefe2f3dffedb +Block 0021 [ 11]: 51a67880957d41b5 +Block 0021 [ 12]: b5e4c52bb847719f +Block 0021 [ 13]: c3d3d442d7d04b01 +Block 0021 [ 14]: 41b24a8baab2743c +Block 0021 [ 15]: 9b24d52938f52dff +Block 0021 [ 16]: 905f1e4aa19f311f +Block 0021 [ 17]: c218f0877c51e7ec +Block 0021 [ 18]: 349e76744f0adfe1 +Block 0021 [ 19]: ddb86c3804bf7e1a +Block 0021 [ 20]: 13ec9499abbe7937 +Block 0021 [ 21]: d1d469ae5ad012d7 +Block 0021 [ 22]: d7dd5edd9095df07 +Block 0021 [ 23]: 0216b1a8773bdfaf +Block 0021 [ 24]: 9f00d6e95b2d9ec8 +Block 0021 [ 25]: 177ff8139aaf8ddc +Block 0021 [ 26]: 91ab06e0ea538b7f +Block 0021 [ 27]: c8ee413463c95948 +Block 0021 [ 28]: b380238800f34bb7 +Block 0021 [ 29]: c348baeacae00aee +Block 0021 [ 30]: a29035c81c82cc3c +Block 0021 [ 31]: 5aa027cec856d613 +Block 0021 [ 32]: 7f1c40b8ca270064 +Block 0021 [ 33]: c1da08eb9998bc13 +Block 0021 [ 34]: d96369fba84991a5 +Block 0021 [ 35]: fd429c5bc5a47b9f +Block 0021 [ 36]: 2cb3b03b63293434 +Block 0021 [ 37]: fc16874d8a7048fd +Block 0021 [ 38]: 315165d7372d919b +Block 0021 [ 39]: e61b47c3fbb0f3e9 +Block 0021 [ 40]: c06be41275be05df +Block 0021 [ 41]: b6b0bcc0385226a8 +Block 0021 [ 42]: a0901451e99dd6c6 +Block 0021 [ 43]: 461b409bcf5e456b +Block 0021 [ 44]: f71d25ab1f2a9be4 +Block 0021 [ 45]: 305ee7a1da0bb5bd +Block 0021 [ 46]: 86de5e6c7154859d +Block 0021 [ 47]: 13153d375530110d +Block 0021 [ 48]: 36caf631256e646a +Block 0021 [ 49]: f3ee304459b4c7d8 +Block 0021 [ 50]: da5d4e8f60c5caf6 +Block 0021 [ 51]: f12e4872f6a309a5 +Block 0021 [ 52]: 5071f661e0c41de0 +Block 0021 [ 53]: 0e722f9d6c262798 +Block 0021 [ 54]: 0843991f14584c74 +Block 0021 [ 55]: f9396f94941f43a8 +Block 0021 [ 56]: 20b21b680df90975 +Block 0021 [ 57]: 5218eaa41848907c +Block 0021 [ 58]: 948a98480c904dbb +Block 0021 [ 59]: 8bbdc9bea2f2bb35 +Block 0021 [ 60]: de07b3bf633a6f7f +Block 0021 [ 61]: d3441a0e8a43ba32 +Block 0021 [ 62]: 0930cd161608ed60 +Block 0021 [ 63]: 82eac0f3f0cb4d93 +Block 0021 [ 64]: 5d2554e80c592f61 +Block 0021 [ 65]: 0b4d795191a1a0cc +Block 0021 [ 66]: 47781616e393a9f6 +Block 0021 [ 67]: 0141f3281f27b0b5 +Block 0021 [ 68]: 85f3409041a14ae0 +Block 0021 [ 69]: 5cef02eed4234029 +Block 0021 [ 70]: 20dd9d63eb26cd01 +Block 0021 [ 71]: 9d7d0a521a7af92a +Block 0021 [ 72]: d8d3e1c076a87892 +Block 0021 [ 73]: b90f777ec24e7ac0 +Block 0021 [ 74]: 9ea20e84c909e4fb +Block 0021 [ 75]: ebfd11b636e7c0c3 +Block 0021 [ 76]: 5869c138199cd51c +Block 0021 [ 77]: 82636d9abb871ac6 +Block 0021 [ 78]: f29d20bd5bdb4e69 +Block 0021 [ 79]: 23d4511db11567a9 +Block 0021 [ 80]: 3d835bc54cef8608 +Block 0021 [ 81]: 04969d7cab622099 +Block 0021 [ 82]: 3618a47cdc52b86f +Block 0021 [ 83]: 8bb7e5f00f82a717 +Block 0021 [ 84]: 78b6b0fbadb81833 +Block 0021 [ 85]: 8cea7501cda689cb +Block 0021 [ 86]: 4bdae18a70a17cc9 +Block 0021 [ 87]: 6c43ff3639b50017 +Block 0021 [ 88]: 120c5e735bdb9cac +Block 0021 [ 89]: d3c5af830d2f8a22 +Block 0021 [ 90]: 416d45e8451b7ec9 +Block 0021 [ 91]: 08e5a871de90d1a5 +Block 0021 [ 92]: e5bd017839cd86cb +Block 0021 [ 93]: 60cbd3a0f5574267 +Block 0021 [ 94]: b2311da13916fbf0 +Block 0021 [ 95]: f649c4268b3b1004 +Block 0021 [ 96]: da07e07655c4ea3e +Block 0021 [ 97]: 9b81ceea2d8cc09b +Block 0021 [ 98]: 76c82448b661e9a5 +Block 0021 [ 99]: e1600857cac5f82e +Block 0021 [100]: c276019df0aff223 +Block 0021 [101]: c4159c82ce1759c9 +Block 0021 [102]: a8819419a1ca07b5 +Block 0021 [103]: d936c69fca5ebcff +Block 0021 [104]: 5a321197a10f2110 +Block 0021 [105]: 43ecd6f6263d6a9e +Block 0021 [106]: 171147256f82baf2 +Block 0021 [107]: 408889d9a2e0ce35 +Block 0021 [108]: 4db62bb985872235 +Block 0021 [109]: 639fe3ec59c94969 +Block 0021 [110]: df52168a89a2c597 +Block 0021 [111]: cb2feded0a29878d +Block 0021 [112]: 459d214c60703bcb +Block 0021 [113]: 552d28886db5aea0 +Block 0021 [114]: 04b39edf3c3928ba +Block 0021 [115]: 8d1e04bd3620fbfd +Block 0021 [116]: 214cc46309c47dd3 +Block 0021 [117]: bb5da5d2925b3f41 +Block 0021 [118]: 3d71d050b5ae430b +Block 0021 [119]: 147073d48eaebf82 +Block 0021 [120]: 1f14584e6ab6c89f +Block 0021 [121]: 96133f813ee480ae +Block 0021 [122]: 1f360d067304e68b +Block 0021 [123]: eca5c02b7cc59bae +Block 0021 [124]: 3f6d2990b6b2f4c6 +Block 0021 [125]: b17f55e33484f2a0 +Block 0021 [126]: 8326c91f7d817407 +Block 0021 [127]: e2887aca53b66b78 +Block 0022 [ 0]: e6aebae353209478 +Block 0022 [ 1]: 73f7093c56dc1ace +Block 0022 [ 2]: cbb17f35cc2d94f0 +Block 0022 [ 3]: 207b71cc74eb4a3a +Block 0022 [ 4]: a835377b1188a381 +Block 0022 [ 5]: dea6f51eeef750e6 +Block 0022 [ 6]: 96e3f6731120ffcb +Block 0022 [ 7]: efb291d841331342 +Block 0022 [ 8]: 661fcf2917e4c7df +Block 0022 [ 9]: a2ea63a6d1bc87d5 +Block 0022 [ 10]: dce3646661bc277e +Block 0022 [ 11]: 08b4db396e39172e +Block 0022 [ 12]: 3fd3b7ed0c8f9372 +Block 0022 [ 13]: 64f933a9aa9e2c45 +Block 0022 [ 14]: f57c3b1213b0e55b +Block 0022 [ 15]: bda13485c5e6a7aa +Block 0022 [ 16]: 895a50a3e2cd9749 +Block 0022 [ 17]: 0d28357ed7a4e5b7 +Block 0022 [ 18]: fa0a4eb2ac0f950d +Block 0022 [ 19]: 020e6223653e46fd +Block 0022 [ 20]: 41ee467849f3fc13 +Block 0022 [ 21]: 2ddd403329149463 +Block 0022 [ 22]: a295bed7816b6d78 +Block 0022 [ 23]: 1af232ba23cacd51 +Block 0022 [ 24]: a32afd0f1aa57733 +Block 0022 [ 25]: c1a0195cf8bfddec +Block 0022 [ 26]: b690f9cad66ed79b +Block 0022 [ 27]: ff0dc5cb227a5d18 +Block 0022 [ 28]: f977e52d62c8c680 +Block 0022 [ 29]: a9d48b790e4e3317 +Block 0022 [ 30]: a95cb5c1da25321d +Block 0022 [ 31]: c87cf4f39475eb74 +Block 0022 [ 32]: 4cc4b06a7072c566 +Block 0022 [ 33]: 7d418a41060b64ab +Block 0022 [ 34]: a35688c3121bc461 +Block 0022 [ 35]: eda3ac1ec9757af2 +Block 0022 [ 36]: fcc499f57f65c6f0 +Block 0022 [ 37]: 7063f182bf81de29 +Block 0022 [ 38]: b052c0a286dfa31d +Block 0022 [ 39]: 6de768033d343d50 +Block 0022 [ 40]: f7126aeccef9949b +Block 0022 [ 41]: 54ac140aeb7edc36 +Block 0022 [ 42]: 681e9a2cd77288a0 +Block 0022 [ 43]: 152105f3f58885fa +Block 0022 [ 44]: 0bad8acdee14f1dd +Block 0022 [ 45]: 17ddc6ff0cdc9027 +Block 0022 [ 46]: 3960712a29f04ddf +Block 0022 [ 47]: 31a59c5ea6f5ef04 +Block 0022 [ 48]: dbdf5706690f3369 +Block 0022 [ 49]: 605e544a914b48b0 +Block 0022 [ 50]: f8b5076b859268d9 +Block 0022 [ 51]: eaa1cb07b39eb746 +Block 0022 [ 52]: 6ea36d5c167e6090 +Block 0022 [ 53]: 1e9177d5d1227f5a +Block 0022 [ 54]: 13288139d616d58e +Block 0022 [ 55]: 44d89de91c0094f2 +Block 0022 [ 56]: e1d4e392f90bed20 +Block 0022 [ 57]: cb4ca95eb02c10cb +Block 0022 [ 58]: cea536c5ef0e83e9 +Block 0022 [ 59]: 411e652988782c19 +Block 0022 [ 60]: c901bec92b3aae2f +Block 0022 [ 61]: b99853310b82da18 +Block 0022 [ 62]: b49ca7bd55c047e3 +Block 0022 [ 63]: 67a86fc6b6316c66 +Block 0022 [ 64]: b0c36eedbe865583 +Block 0022 [ 65]: 6e6f2a1e8c25bf4a +Block 0022 [ 66]: 6b12221dcfec802b +Block 0022 [ 67]: c8f78e123c452cd3 +Block 0022 [ 68]: 67ba9bd6eeb72d98 +Block 0022 [ 69]: 78dada521d580f88 +Block 0022 [ 70]: 6e75b4b8cb56e190 +Block 0022 [ 71]: 52e12f9b94421ae2 +Block 0022 [ 72]: 26d286f2cc846f83 +Block 0022 [ 73]: 2357111ee979aa38 +Block 0022 [ 74]: 2b432dd9af72cd33 +Block 0022 [ 75]: 9c6ece8d30cf1391 +Block 0022 [ 76]: 4d9a922090731d77 +Block 0022 [ 77]: 34aa94b5f4b1e909 +Block 0022 [ 78]: 029ede7220b86663 +Block 0022 [ 79]: 032e7cf13bd08994 +Block 0022 [ 80]: c957dfd60e828645 +Block 0022 [ 81]: 82f0c77773249e7d +Block 0022 [ 82]: e8a4e1ef01948e77 +Block 0022 [ 83]: 3af1103eb60fcfba +Block 0022 [ 84]: d1e5148298f8ff80 +Block 0022 [ 85]: d04723f7ddde5770 +Block 0022 [ 86]: 9cfd844a33052a27 +Block 0022 [ 87]: 3c7901823cce023c +Block 0022 [ 88]: 5325fd52717f59f1 +Block 0022 [ 89]: df61355f6a9a0aef +Block 0022 [ 90]: 3ea37bffd497f8b5 +Block 0022 [ 91]: 3bbad908578892a3 +Block 0022 [ 92]: 049747b87164eeff +Block 0022 [ 93]: 1828cb6db435ec53 +Block 0022 [ 94]: 4c96ec4e154bb840 +Block 0022 [ 95]: 7303f1a3e5392122 +Block 0022 [ 96]: 5264e0842f256c9f +Block 0022 [ 97]: 9bd3752d4828dc4f +Block 0022 [ 98]: 69b307e7e956af8f +Block 0022 [ 99]: 7d5d5d6813bcee75 +Block 0022 [100]: a3a17f8d2aad5d30 +Block 0022 [101]: ea39fb0a88e7cd07 +Block 0022 [102]: cc4430d5ed7000cc +Block 0022 [103]: c664d64c236bcc4f +Block 0022 [104]: c475595c8ab3ec47 +Block 0022 [105]: 6c9cc890702453db +Block 0022 [106]: 323e596761bc223e +Block 0022 [107]: f11210530c7260f6 +Block 0022 [108]: 2442847da422d9bb +Block 0022 [109]: f42ba4d9043843f2 +Block 0022 [110]: 934892245c31ba35 +Block 0022 [111]: 4ed499734276ef4c +Block 0022 [112]: 5e5e5543390e5683 +Block 0022 [113]: ffab89c5036c4b53 +Block 0022 [114]: ad1021520de84f65 +Block 0022 [115]: b4ccf7022b5d8288 +Block 0022 [116]: 5c586acc6ea27398 +Block 0022 [117]: d5446287a9a13644 +Block 0022 [118]: 6a06a8f31064a550 +Block 0022 [119]: f6a1c23a9314ba58 +Block 0022 [120]: 7b48abb370998f31 +Block 0022 [121]: 03a1b00f23c8a0d1 +Block 0022 [122]: 1743a200b4b64a2b +Block 0022 [123]: 3abcfaa93432c7b8 +Block 0022 [124]: d120c946b3c79489 +Block 0022 [125]: e29e9017dba0f398 +Block 0022 [126]: 4e1d6694af3c32f4 +Block 0022 [127]: 8e810ad3516f24b2 +Block 0023 [ 0]: 56c432170f2350e5 +Block 0023 [ 1]: 09db8b18388cb582 +Block 0023 [ 2]: 2eafa8786064ffe0 +Block 0023 [ 3]: 1141a78f575e12b4 +Block 0023 [ 4]: 26f04196b7234286 +Block 0023 [ 5]: 5dd6537d4851feb5 +Block 0023 [ 6]: c583ed23a795fe4c +Block 0023 [ 7]: 6368c86ccb8d83d5 +Block 0023 [ 8]: fb7b278ee8366750 +Block 0023 [ 9]: cac13b3bd11c9f83 +Block 0023 [ 10]: dd2c59c38a8c2011 +Block 0023 [ 11]: 26145ddd34cf879b +Block 0023 [ 12]: e62a5c5aadb86abb +Block 0023 [ 13]: 38d268fa1e7df6b3 +Block 0023 [ 14]: 8126b9192e3557c6 +Block 0023 [ 15]: 027ea8e6cce918f3 +Block 0023 [ 16]: e2b722e572bac272 +Block 0023 [ 17]: 5f8d26dad7112659 +Block 0023 [ 18]: edc60e812ddcd7ae +Block 0023 [ 19]: c072593563543ddf +Block 0023 [ 20]: 340063081ae79b39 +Block 0023 [ 21]: 6232714e9e32cf6c +Block 0023 [ 22]: 05066590c3c27c81 +Block 0023 [ 23]: d76f4d930392174a +Block 0023 [ 24]: 0068bf676811bb4b +Block 0023 [ 25]: 1f69480b3055af3f +Block 0023 [ 26]: 1643fc248280c10e +Block 0023 [ 27]: 589a6e562b4f32b2 +Block 0023 [ 28]: 7463dc6fc808f4a2 +Block 0023 [ 29]: 8fdcf4ef08a01295 +Block 0023 [ 30]: 1dc6d09c09e5778e +Block 0023 [ 31]: bfb449c78123c47f +Block 0023 [ 32]: 5a5513c27bc4dfa5 +Block 0023 [ 33]: b12582f5860a7211 +Block 0023 [ 34]: 4b6eb353c9d6db6d +Block 0023 [ 35]: e073bb08023d543d +Block 0023 [ 36]: 302cf4a9a92dabc0 +Block 0023 [ 37]: 5eed7cd8055d637a +Block 0023 [ 38]: 2c2d45738b604d2b +Block 0023 [ 39]: 21c4a193ffd0bded +Block 0023 [ 40]: 526f7e03af98d7cc +Block 0023 [ 41]: bc42211893504613 +Block 0023 [ 42]: 629c9782a6c51994 +Block 0023 [ 43]: c807b62f77a64154 +Block 0023 [ 44]: 7db0caa237f90623 +Block 0023 [ 45]: e4e31f5a1f573bdf +Block 0023 [ 46]: 22145e4b3d1bdf3f +Block 0023 [ 47]: c92877319bb7f189 +Block 0023 [ 48]: d6d0953f49d547f5 +Block 0023 [ 49]: eb948a13d7bc979a +Block 0023 [ 50]: fdd2ab73cc437323 +Block 0023 [ 51]: 221e8102a15e5083 +Block 0023 [ 52]: 6a5f1d9c0ccc6187 +Block 0023 [ 53]: e05665f2bc8ac301 +Block 0023 [ 54]: c88e6f5a59ebe911 +Block 0023 [ 55]: 3bb8dc1b633e72c2 +Block 0023 [ 56]: bde7b8b01205c612 +Block 0023 [ 57]: dd524b90844f7ba1 +Block 0023 [ 58]: af22ac3d14da5c59 +Block 0023 [ 59]: 788c8edcab69224e +Block 0023 [ 60]: 22842e87b2c24640 +Block 0023 [ 61]: a7b74dbad49f1372 +Block 0023 [ 62]: 25cc466c7add69f0 +Block 0023 [ 63]: c43262f642817169 +Block 0023 [ 64]: 0261f94d0723ef00 +Block 0023 [ 65]: 45284f8434b96e32 +Block 0023 [ 66]: f2768808b5945e24 +Block 0023 [ 67]: 41bae50aad6b6004 +Block 0023 [ 68]: 699000306ac34f2c +Block 0023 [ 69]: 1a9ba2af157bec9b +Block 0023 [ 70]: a15f1015af21ae84 +Block 0023 [ 71]: a2170eae6ca7bcb2 +Block 0023 [ 72]: a300fb755441f126 +Block 0023 [ 73]: 605825ac585f01eb +Block 0023 [ 74]: 932fe9bcad3e6079 +Block 0023 [ 75]: 7333f0b0da8ebdb8 +Block 0023 [ 76]: 8b0609b3c74b0edd +Block 0023 [ 77]: 69c76359d05b6145 +Block 0023 [ 78]: 7673d116e0ea1fb5 +Block 0023 [ 79]: 9014432d5e138eed +Block 0023 [ 80]: 250a2478d5e3f8fb +Block 0023 [ 81]: 42cba2e0fcbee17c +Block 0023 [ 82]: c8458235c5da47a2 +Block 0023 [ 83]: dfff25a5ba1fc6c9 +Block 0023 [ 84]: 92703172255bb700 +Block 0023 [ 85]: e88c4cd1910b5970 +Block 0023 [ 86]: bf49d0c32b5817c0 +Block 0023 [ 87]: a34efec5c482d20e +Block 0023 [ 88]: 08da80ad9449951f +Block 0023 [ 89]: ea848364740c829b +Block 0023 [ 90]: 851bf1c0f5ef6823 +Block 0023 [ 91]: 1100dae7f77fbb50 +Block 0023 [ 92]: 84b5dea318af2953 +Block 0023 [ 93]: d1642d506dbe74f9 +Block 0023 [ 94]: 853cee1e33c1c7ea +Block 0023 [ 95]: a9cf960261092974 +Block 0023 [ 96]: ba9e6115e04834f5 +Block 0023 [ 97]: 4e50532738f12659 +Block 0023 [ 98]: 052f606345e1ff96 +Block 0023 [ 99]: 29e56a5493554852 +Block 0023 [100]: 0a19df56263743bd +Block 0023 [101]: c424aa2d2486bde2 +Block 0023 [102]: 716e469f3592cb31 +Block 0023 [103]: c185624c1b8100e3 +Block 0023 [104]: 3fa3d101c5d5d337 +Block 0023 [105]: c3ed572269f1a21a +Block 0023 [106]: 5dcbbb1c55a6c46e +Block 0023 [107]: fafdd0b079d1e17e +Block 0023 [108]: 59ae6c87e343ebc8 +Block 0023 [109]: f56b124af7fdaae3 +Block 0023 [110]: a6142fc6bc7ded24 +Block 0023 [111]: 5281bfd0a97ee90e +Block 0023 [112]: fa4c9312ae8fea59 +Block 0023 [113]: 7220d85ddf5189d5 +Block 0023 [114]: fd43bac28e5fc21d +Block 0023 [115]: 14f7b1cc68901e54 +Block 0023 [116]: edbb0d51fa8eaec6 +Block 0023 [117]: b0ddf87a9ab31b2f +Block 0023 [118]: b224e3f04051574b +Block 0023 [119]: 635ea2f0116832c0 +Block 0023 [120]: 2f401e4abc05157c +Block 0023 [121]: 97b35ceeab754f7d +Block 0023 [122]: 1516a371e7bce932 +Block 0023 [123]: 8bb0ae9a2479fb3a +Block 0023 [124]: a4bc96317fcdb39a +Block 0023 [125]: 99990935644f7cab +Block 0023 [126]: 803015feda571015 +Block 0023 [127]: bf6f10ca00fa56a9 +Block 0024 [ 0]: bf4583539793038a +Block 0024 [ 1]: a17c89373c8ce1e5 +Block 0024 [ 2]: ce3c740ff9fc039f +Block 0024 [ 3]: 0fcd6129f8693784 +Block 0024 [ 4]: 2b91dea6ff4f7d7d +Block 0024 [ 5]: de737e6b686d3e94 +Block 0024 [ 6]: 18f8502cf6bf3292 +Block 0024 [ 7]: c509b7c2f0c6b80f +Block 0024 [ 8]: 3798e4457863c1c7 +Block 0024 [ 9]: 83a45a83121a14db +Block 0024 [ 10]: 27ad4af2107c034a +Block 0024 [ 11]: 5e270c568a5b643d +Block 0024 [ 12]: ab71bd7d07387c74 +Block 0024 [ 13]: 397c6c11039e74e6 +Block 0024 [ 14]: 9ec8188c1c345aad +Block 0024 [ 15]: eb475b8ef473c9a5 +Block 0024 [ 16]: 063b4373964fcac8 +Block 0024 [ 17]: 56a19139acc3e00a +Block 0024 [ 18]: 5c6c0962cce29939 +Block 0024 [ 19]: c30c330fcf7f2ce9 +Block 0024 [ 20]: c34d6b95046e5d85 +Block 0024 [ 21]: 2be11b238ee6440f +Block 0024 [ 22]: 1a5c6d4f08682679 +Block 0024 [ 23]: a932cb224913a6a0 +Block 0024 [ 24]: c3017b46720b70d5 +Block 0024 [ 25]: 321ba2d126fa85b4 +Block 0024 [ 26]: 8b8a46577b354b9b +Block 0024 [ 27]: 960d623c0fcf928b +Block 0024 [ 28]: 425dc11904ef5d13 +Block 0024 [ 29]: 0bdf7c53e9d6bee5 +Block 0024 [ 30]: c516bc641e4b1f1d +Block 0024 [ 31]: 25f662caf0d04b3d +Block 0024 [ 32]: 5b5591788337116d +Block 0024 [ 33]: 1bb6a3bb7d5d719f +Block 0024 [ 34]: 4f4eac6f99213a41 +Block 0024 [ 35]: 6110dccb11538dab +Block 0024 [ 36]: fe3a9bcf6bae2aeb +Block 0024 [ 37]: 0e4eeb46d2241e19 +Block 0024 [ 38]: 5430d892c2402540 +Block 0024 [ 39]: 7300cf1e7395132c +Block 0024 [ 40]: 9eef4a35f6a3434b +Block 0024 [ 41]: 5de169249ac21ed4 +Block 0024 [ 42]: dd5bcbfb73fbac29 +Block 0024 [ 43]: 9a519a7819957bb5 +Block 0024 [ 44]: 43a764312cc8eb3c +Block 0024 [ 45]: 90415d896ca55079 +Block 0024 [ 46]: 9c164d7287a565a2 +Block 0024 [ 47]: 772a76696f95564c +Block 0024 [ 48]: 8b7ce044b06ecd47 +Block 0024 [ 49]: f06ef02dad18d78e +Block 0024 [ 50]: 0bc55e7139bb155a +Block 0024 [ 51]: 10b453718a9a703b +Block 0024 [ 52]: 86142a57693f45d2 +Block 0024 [ 53]: 6aef05ae9239a7cc +Block 0024 [ 54]: 64a39acbeb568504 +Block 0024 [ 55]: 7ff67b699718e578 +Block 0024 [ 56]: cd937dff7a44924b +Block 0024 [ 57]: 898fb355fdfeb447 +Block 0024 [ 58]: b8e6d5c6c740496a +Block 0024 [ 59]: e94a587019efa9e7 +Block 0024 [ 60]: b4ab7648fbeaa80a +Block 0024 [ 61]: 06ffb6590f1a5d03 +Block 0024 [ 62]: 3c5471d0243bf38c +Block 0024 [ 63]: a69751062e586e77 +Block 0024 [ 64]: 15fd3817247a48d4 +Block 0024 [ 65]: cf28aba007081d83 +Block 0024 [ 66]: f945831954967149 +Block 0024 [ 67]: 69fbe1a2a75f20d5 +Block 0024 [ 68]: 4e99a17284e7b791 +Block 0024 [ 69]: cf192f2db04ea91c +Block 0024 [ 70]: 052810ee50fe71b7 +Block 0024 [ 71]: 8a2545a5e11b3b73 +Block 0024 [ 72]: c95cf992b14eeb3f +Block 0024 [ 73]: b9c6c0d5db9b389a +Block 0024 [ 74]: d6a69487f68b0a3f +Block 0024 [ 75]: 6627c4401d399868 +Block 0024 [ 76]: dbecbe752ef44c3f +Block 0024 [ 77]: 56107ba6bba3b5e6 +Block 0024 [ 78]: 1efa55d9357e3c36 +Block 0024 [ 79]: 75c196453b59d5d8 +Block 0024 [ 80]: 075c84f5c4220859 +Block 0024 [ 81]: 1ee5ed8b313d643c +Block 0024 [ 82]: a317ba82d759163f +Block 0024 [ 83]: 35cd189af03482ec +Block 0024 [ 84]: ac634c2f4243c07e +Block 0024 [ 85]: 79d3939c35b5089c +Block 0024 [ 86]: b710ad495a2cbb68 +Block 0024 [ 87]: 369aaf0dff97c5ba +Block 0024 [ 88]: cc006a1073be4438 +Block 0024 [ 89]: 572432551b3263c3 +Block 0024 [ 90]: f4f77e3d2bcd718e +Block 0024 [ 91]: ef501a909b51cded +Block 0024 [ 92]: 3976ade1b6c3aba2 +Block 0024 [ 93]: 2edb1dbaa3bf1291 +Block 0024 [ 94]: 4049b2246d256e2c +Block 0024 [ 95]: 61ecd1c32040d453 +Block 0024 [ 96]: 95b0d49df09785e3 +Block 0024 [ 97]: 11a5fc067b184817 +Block 0024 [ 98]: e61a1c43133192b5 +Block 0024 [ 99]: 98d2b7f72d011248 +Block 0024 [100]: b7cb87305e2c2d6c +Block 0024 [101]: 3ecd32c1442f0ba0 +Block 0024 [102]: 4b2b29d933d1a0ba +Block 0024 [103]: 082d6c40ec561561 +Block 0024 [104]: d0367dcd61953e5d +Block 0024 [105]: 5f5fdc6102d5f068 +Block 0024 [106]: 03f9d3ad8a170315 +Block 0024 [107]: 1190264775912229 +Block 0024 [108]: c05460add736d870 +Block 0024 [109]: 25549b26ee5ff9f9 +Block 0024 [110]: 813ace59e299a68d +Block 0024 [111]: 6e37401ff41cf522 +Block 0024 [112]: 147bc89d451108eb +Block 0024 [113]: 0d7cda879c204b37 +Block 0024 [114]: 123e210727972bd8 +Block 0024 [115]: 6d883176b8208687 +Block 0024 [116]: 8e357a934b760e90 +Block 0024 [117]: db5d53313dca142a +Block 0024 [118]: 75e330f8c2124699 +Block 0024 [119]: 4a19313f121fca58 +Block 0024 [120]: 7ff60a770158fa90 +Block 0024 [121]: 3c0a19b1a1f5d2b5 +Block 0024 [122]: 652f82db23b0a84d +Block 0024 [123]: 97c8cc772d1a046a +Block 0024 [124]: 3d344d83dd1222f2 +Block 0024 [125]: 36b1311e5f306e76 +Block 0024 [126]: 4d0e2efe680dac8a +Block 0024 [127]: 04f7d812aa2eaeaa +Block 0025 [ 0]: c02432f28c2417d3 +Block 0025 [ 1]: df87602337c3a6f9 +Block 0025 [ 2]: 5110847f56262cec +Block 0025 [ 3]: 667874afa6398847 +Block 0025 [ 4]: fce31cfadf459e4d +Block 0025 [ 5]: 66f6b0e60c20429f +Block 0025 [ 6]: 46e276fafd0f6fa8 +Block 0025 [ 7]: f18d5cea31632fd7 +Block 0025 [ 8]: 2c35e2d80febaebe +Block 0025 [ 9]: b715f95b99a138dd +Block 0025 [ 10]: e3ce6ad753f97bb7 +Block 0025 [ 11]: 0b1c03d9e3055dd5 +Block 0025 [ 12]: c81cfc50ea63ed16 +Block 0025 [ 13]: 0f0efa659cc7a0d5 +Block 0025 [ 14]: 1f22de1b208d8902 +Block 0025 [ 15]: 7a54fe2921bb3c5b +Block 0025 [ 16]: 459491d187d5d127 +Block 0025 [ 17]: 57835c920fa586de +Block 0025 [ 18]: a0e9bdbdbc618028 +Block 0025 [ 19]: 8690ca28ab9eb4dc +Block 0025 [ 20]: d2b3717338e9dab5 +Block 0025 [ 21]: 5517d82ff815a3d4 +Block 0025 [ 22]: 61d2473ffb17c7d8 +Block 0025 [ 23]: e17a2341eb0c6cd6 +Block 0025 [ 24]: 739a0048cc303c17 +Block 0025 [ 25]: a4851011974f86eb +Block 0025 [ 26]: 8ae3ad2f3ffa111c +Block 0025 [ 27]: e8af30509554ec6d +Block 0025 [ 28]: c57fbf894b4fd6c0 +Block 0025 [ 29]: b95b55c2cb11472a +Block 0025 [ 30]: 6f008cc63addd4ff +Block 0025 [ 31]: 1dc3088cea2a1b22 +Block 0025 [ 32]: 84633af6989cf352 +Block 0025 [ 33]: 17a125e0c3b5c2c1 +Block 0025 [ 34]: 4def7ed3f310945a +Block 0025 [ 35]: 2d4ce7d225767a3b +Block 0025 [ 36]: b0d6d5d58b2a27bc +Block 0025 [ 37]: 417f22c60aa21e5e +Block 0025 [ 38]: fc956d2285a9df13 +Block 0025 [ 39]: b8b540b099f63f9c +Block 0025 [ 40]: 16b8b55c4bc899c9 +Block 0025 [ 41]: 55d749c549a67d03 +Block 0025 [ 42]: 06de19aade179b34 +Block 0025 [ 43]: f61325120460b6d1 +Block 0025 [ 44]: 2a435584cc068deb +Block 0025 [ 45]: 4cda20238b6d5ad3 +Block 0025 [ 46]: b9737adb88b005db +Block 0025 [ 47]: 4508c56a58d8ae5e +Block 0025 [ 48]: 0482d6af7fbea373 +Block 0025 [ 49]: 6585dfa97dd12063 +Block 0025 [ 50]: f93072a78e60443c +Block 0025 [ 51]: 9f3b8e80ceb2be48 +Block 0025 [ 52]: ac3dca4c9351e194 +Block 0025 [ 53]: e7f631ef15301c18 +Block 0025 [ 54]: 68728ff86e8a4194 +Block 0025 [ 55]: f03ff7621a6d5870 +Block 0025 [ 56]: 3accf9ea2059eecc +Block 0025 [ 57]: 7a40cf8588638006 +Block 0025 [ 58]: 350f2d401ea54bb1 +Block 0025 [ 59]: ca51085f93522a79 +Block 0025 [ 60]: 5f399b01bac94b46 +Block 0025 [ 61]: 9e368d5a39e1fb12 +Block 0025 [ 62]: bb2416c37abcc1b3 +Block 0025 [ 63]: 19dc1cd6f4a76c4b +Block 0025 [ 64]: fbd4a85f08b0b9e1 +Block 0025 [ 65]: 19e05bf1c8e5908d +Block 0025 [ 66]: a3580dba7331f036 +Block 0025 [ 67]: e5e1f78a4ba3c135 +Block 0025 [ 68]: df3942721112d8fc +Block 0025 [ 69]: 9f6d750b6aad4e32 +Block 0025 [ 70]: ef21ed902d825a07 +Block 0025 [ 71]: 02229fc7704f4ce6 +Block 0025 [ 72]: cc9f877c1a7fbb28 +Block 0025 [ 73]: 585758a87439684a +Block 0025 [ 74]: d683487687b26588 +Block 0025 [ 75]: 557a58c22b055c6b +Block 0025 [ 76]: a2fc0615b68bd40d +Block 0025 [ 77]: 87359f418f519671 +Block 0025 [ 78]: 0fc028f7e8906d85 +Block 0025 [ 79]: bb95f948e6dfcdcf +Block 0025 [ 80]: 6965ad87b5767d38 +Block 0025 [ 81]: 2d8901cf61c109a4 +Block 0025 [ 82]: c70396ce64fca092 +Block 0025 [ 83]: d8fe94a458caa96a +Block 0025 [ 84]: 2eb3aa977607b5da +Block 0025 [ 85]: 46a0d02635179182 +Block 0025 [ 86]: 4e4a181bb6863f9c +Block 0025 [ 87]: 83e9577ebf6541b7 +Block 0025 [ 88]: 6ad5847b07e2d7e4 +Block 0025 [ 89]: e72aba6841351302 +Block 0025 [ 90]: 71430efde4cc5e33 +Block 0025 [ 91]: 7929e91d90beb2d3 +Block 0025 [ 92]: bd32d8a056d5015a +Block 0025 [ 93]: 151c1a43811166be +Block 0025 [ 94]: 375388f1993cc412 +Block 0025 [ 95]: 7d2bf3945ffa18a3 +Block 0025 [ 96]: b14ba53feffbd4aa +Block 0025 [ 97]: 1247e167acbfcb9a +Block 0025 [ 98]: 0681b2a261a84b3e +Block 0025 [ 99]: e442452a213a150f +Block 0025 [100]: a6b905c8a0123984 +Block 0025 [101]: c100981f0d06b5c4 +Block 0025 [102]: 8bfd02fe184df9fb +Block 0025 [103]: ddde8aeba5183593 +Block 0025 [104]: 32db716a84582a8a +Block 0025 [105]: ac355eedc7f49408 +Block 0025 [106]: 3da2b0d8519c1b15 +Block 0025 [107]: dac49f353fddaa69 +Block 0025 [108]: bd7f699cff3533a3 +Block 0025 [109]: 00b566b84c3484ee +Block 0025 [110]: c17836603b52c2bd +Block 0025 [111]: 0ccb3ebedcc8521d +Block 0025 [112]: 5d6354d205c2f95b +Block 0025 [113]: a0739f76d327a0ae +Block 0025 [114]: 87f95a702c784a57 +Block 0025 [115]: 3cbb3370f55e43ea +Block 0025 [116]: 73c8a4fab081f398 +Block 0025 [117]: e396f8aa17ac238a +Block 0025 [118]: b1d821c495c15e82 +Block 0025 [119]: 14a010fec47a0821 +Block 0025 [120]: 7bac85187b17ee2f +Block 0025 [121]: 747e057340c77098 +Block 0025 [122]: 063a1073e710e631 +Block 0025 [123]: 50486c906b695b0e +Block 0025 [124]: 0c21d4640f2ebf12 +Block 0025 [125]: 56c75fbca558ff8f +Block 0025 [126]: ed1f21c46ca001a2 +Block 0025 [127]: 0655ca00aa6cf206 +Block 0026 [ 0]: f494004f57652dfb +Block 0026 [ 1]: bc7e125318991a1b +Block 0026 [ 2]: e0bca0c2987576a7 +Block 0026 [ 3]: b50d0ad8d594113a +Block 0026 [ 4]: 008b0507da0f62da +Block 0026 [ 5]: 1e2005c9d8a76b37 +Block 0026 [ 6]: d87490552095e57a +Block 0026 [ 7]: 1d0c4a322d90cf92 +Block 0026 [ 8]: 7f7e3e3b8f23b544 +Block 0026 [ 9]: a53ea6aee892f339 +Block 0026 [ 10]: c0db804430533d72 +Block 0026 [ 11]: ef53afbe282d23bf +Block 0026 [ 12]: a14a274b4211571c +Block 0026 [ 13]: e92d574a0220dc63 +Block 0026 [ 14]: d8e73b91c7451253 +Block 0026 [ 15]: cf66dab9ed5f2d0d +Block 0026 [ 16]: fcf7f593af1ed8b5 +Block 0026 [ 17]: fe08b6e491f27c07 +Block 0026 [ 18]: 3735fb0c10e76f9d +Block 0026 [ 19]: 1e1cd603e9e24d57 +Block 0026 [ 20]: f213036e8ae6d3d1 +Block 0026 [ 21]: 203d48f8758f733b +Block 0026 [ 22]: c60391b6f63feb61 +Block 0026 [ 23]: dfb7479caaa34a7a +Block 0026 [ 24]: 4905e186a30eb530 +Block 0026 [ 25]: c381ad611910a956 +Block 0026 [ 26]: 9cd4cdf8fcbf4f55 +Block 0026 [ 27]: 7c5391a58a474b18 +Block 0026 [ 28]: 10f8ddbc2b08af01 +Block 0026 [ 29]: 5c58a04b90dd99c4 +Block 0026 [ 30]: b54eb06dd4f3b121 +Block 0026 [ 31]: 52c10afe187e6003 +Block 0026 [ 32]: 0a456b9ce2a1aa7f +Block 0026 [ 33]: fca647d9bbfd8a6a +Block 0026 [ 34]: ed1828078039d0c5 +Block 0026 [ 35]: d8acca3425d069d2 +Block 0026 [ 36]: 8d63e69d7caaa236 +Block 0026 [ 37]: 3f435d73b7c96834 +Block 0026 [ 38]: b8e18b5f7a57c987 +Block 0026 [ 39]: ae572beb041f8112 +Block 0026 [ 40]: 62f2f9c8e8eb29ba +Block 0026 [ 41]: 4884560ebf91effe +Block 0026 [ 42]: 06fc59f34d083054 +Block 0026 [ 43]: bea4929f625e12ef +Block 0026 [ 44]: d7f563446d7a99f3 +Block 0026 [ 45]: 991b0cb2578290fb +Block 0026 [ 46]: 37ffd37e3981ceb6 +Block 0026 [ 47]: 409c1563471126d4 +Block 0026 [ 48]: da9781a2c63abf64 +Block 0026 [ 49]: 0137c07fdbbcc294 +Block 0026 [ 50]: a8820a87393425ad +Block 0026 [ 51]: c81a5d873fe20ba4 +Block 0026 [ 52]: 94ced49aed91e7a7 +Block 0026 [ 53]: 017404af79573a0b +Block 0026 [ 54]: cc9e2a7c25237895 +Block 0026 [ 55]: 12b48ebd3118e19b +Block 0026 [ 56]: 9fc306d0849cd11d +Block 0026 [ 57]: 3d336e0e4429ca67 +Block 0026 [ 58]: aff7b98ac4959a06 +Block 0026 [ 59]: fd6785fd204e650d +Block 0026 [ 60]: d493f601d16a4f5f +Block 0026 [ 61]: 610f4837f2db6f9b +Block 0026 [ 62]: b82085a6fd0ece16 +Block 0026 [ 63]: e8ea02d44b708977 +Block 0026 [ 64]: 428531978f14951a +Block 0026 [ 65]: 9507b6cca5306aa4 +Block 0026 [ 66]: f857f06106ad3bee +Block 0026 [ 67]: 55944ea007f7863b +Block 0026 [ 68]: 67f2e7babb7a331f +Block 0026 [ 69]: 0252b8482b88acce +Block 0026 [ 70]: db6a01e15738a091 +Block 0026 [ 71]: 1b04caba54505b61 +Block 0026 [ 72]: b0e0f8fb29a8479c +Block 0026 [ 73]: aa670af602c88243 +Block 0026 [ 74]: bace61d13223063d +Block 0026 [ 75]: fa19f9fa8261fc1d +Block 0026 [ 76]: f6761126d8b2e7b9 +Block 0026 [ 77]: 0f210f240f996092 +Block 0026 [ 78]: e6fad1e1ece1bf4e +Block 0026 [ 79]: 16dcef2a0c6338ea +Block 0026 [ 80]: 30ecd57a88f7a7a0 +Block 0026 [ 81]: 0e4c0c7cd4f24d0c +Block 0026 [ 82]: aaa080d230cff24a +Block 0026 [ 83]: 6dea8082160fbbe6 +Block 0026 [ 84]: 9ff45a0bcb4e0713 +Block 0026 [ 85]: 0b1e282a7d2b3a90 +Block 0026 [ 86]: f27f08967fb050fc +Block 0026 [ 87]: 0151762582ff58d0 +Block 0026 [ 88]: 974e23cb4f05ba88 +Block 0026 [ 89]: 0a4a783b22dcf61d +Block 0026 [ 90]: 45e31764f17f08f9 +Block 0026 [ 91]: 86f9f88e402bff39 +Block 0026 [ 92]: 2ea75c01660b1fab +Block 0026 [ 93]: f1bf9d413751c414 +Block 0026 [ 94]: f2e7e9c1b77090d2 +Block 0026 [ 95]: 71130e18edf585b1 +Block 0026 [ 96]: 6bc7fa4a4f49b58d +Block 0026 [ 97]: 1a04dbebef1d435e +Block 0026 [ 98]: be6c4fb73bbae267 +Block 0026 [ 99]: 32d9b418f26ca8c9 +Block 0026 [100]: f370c6ec416fea29 +Block 0026 [101]: c87d56d2cfd5c25e +Block 0026 [102]: b556a8dff75b4350 +Block 0026 [103]: 6cf4866f115bc1ba +Block 0026 [104]: a5ea80b67d3eb546 +Block 0026 [105]: 32408068477f9617 +Block 0026 [106]: 53ed9037f0ab6c6e +Block 0026 [107]: 551c462f6733f83e +Block 0026 [108]: 13d45815ff2fd652 +Block 0026 [109]: ec1a210c404d6357 +Block 0026 [110]: 4b5b3c04beb5bd39 +Block 0026 [111]: 43b1945dd83a0494 +Block 0026 [112]: 850af53380605933 +Block 0026 [113]: 8b6bd0fec9d3b815 +Block 0026 [114]: 66c9634a5e8c9fb5 +Block 0026 [115]: 446198f1911917a3 +Block 0026 [116]: 0611350c10b0d1f7 +Block 0026 [117]: 3a7bcd48a10a0605 +Block 0026 [118]: ef1451b6313c81dc +Block 0026 [119]: a7aedb9836bce03c +Block 0026 [120]: 59649ed78381cfd3 +Block 0026 [121]: f9e660ad51495ee1 +Block 0026 [122]: 3d614c33fb37cfe8 +Block 0026 [123]: e28e1e9046aa5e92 +Block 0026 [124]: 9e3cc15ddcaf388f +Block 0026 [125]: 298db70bfacfcecc +Block 0026 [126]: 561e51e85006f3e2 +Block 0026 [127]: 002328b2a64d32de +Block 0027 [ 0]: 6a36e474ffc79b28 +Block 0027 [ 1]: 23d140862dbcc4b2 +Block 0027 [ 2]: 93463b5d7c02a877 +Block 0027 [ 3]: b7e8766c02109d51 +Block 0027 [ 4]: 7415cf4fddc0f993 +Block 0027 [ 5]: 7b769c8a60707898 +Block 0027 [ 6]: 06506a25457a2e6b +Block 0027 [ 7]: a65e8cdc5e651394 +Block 0027 [ 8]: 7da1e70686b4a92b +Block 0027 [ 9]: b17edc4e65c4c678 +Block 0027 [ 10]: bec581f37d2834fb +Block 0027 [ 11]: 082185c8ae0b588f +Block 0027 [ 12]: 23916c8338f8e07e +Block 0027 [ 13]: a99a11467da9428c +Block 0027 [ 14]: a111edfe969ec9bc +Block 0027 [ 15]: d0a76e461410f68a +Block 0027 [ 16]: e37f0624904ef553 +Block 0027 [ 17]: 1088077172f1161a +Block 0027 [ 18]: b376e4c161878402 +Block 0027 [ 19]: d4121c48e0c06c13 +Block 0027 [ 20]: 96fc4febca9c3457 +Block 0027 [ 21]: 25686c76fd01241b +Block 0027 [ 22]: e4f8119ac946d1be +Block 0027 [ 23]: d751327cd43388c3 +Block 0027 [ 24]: a91b144c324f497d +Block 0027 [ 25]: bd2ea57c9df15ca4 +Block 0027 [ 26]: 4e737444370dd320 +Block 0027 [ 27]: faafe5c1916300d9 +Block 0027 [ 28]: 2ab42667cbfc6b89 +Block 0027 [ 29]: afb23472890580d3 +Block 0027 [ 30]: 9713478003ef4a7c +Block 0027 [ 31]: ff9423eabb33c603 +Block 0027 [ 32]: 3d821a656ae4161e +Block 0027 [ 33]: 6db448e9dc48798a +Block 0027 [ 34]: 9669bc7908d86520 +Block 0027 [ 35]: 59828038647baa96 +Block 0027 [ 36]: c403678a1b89ac4b +Block 0027 [ 37]: d3b58972a9491d6f +Block 0027 [ 38]: 99169151602ed624 +Block 0027 [ 39]: c1d2702f140f997d +Block 0027 [ 40]: caf644fd739cd0ab +Block 0027 [ 41]: be2632b181d35323 +Block 0027 [ 42]: 8230428a04d6b83f +Block 0027 [ 43]: dbda70b473488888 +Block 0027 [ 44]: 2686f0b232aba4b3 +Block 0027 [ 45]: 9f7c2482dba52baf +Block 0027 [ 46]: e1ccb89ae28e33bc +Block 0027 [ 47]: d0ea305527865a20 +Block 0027 [ 48]: 4273f862776fb381 +Block 0027 [ 49]: 5138176b7f8b1a41 +Block 0027 [ 50]: 741205d181d13544 +Block 0027 [ 51]: ecfcb8ee67b67e55 +Block 0027 [ 52]: 1533882648e638bc +Block 0027 [ 53]: 03518b85a85d0338 +Block 0027 [ 54]: 431d11df78672d82 +Block 0027 [ 55]: 75b2b7116f34ecd9 +Block 0027 [ 56]: 9b51ce7a4981f2a0 +Block 0027 [ 57]: 7a5ada2b2f45fe13 +Block 0027 [ 58]: 10cd88ba6d9f0f20 +Block 0027 [ 59]: 49fb947141ac117b +Block 0027 [ 60]: 2094194379412634 +Block 0027 [ 61]: 1e9a4382d1ca8191 +Block 0027 [ 62]: 457cabdfeb42ccd6 +Block 0027 [ 63]: ad924df310f759a7 +Block 0027 [ 64]: 3e7d1fdc291df527 +Block 0027 [ 65]: b8cacac133a45f3d +Block 0027 [ 66]: 037581754bfd253c +Block 0027 [ 67]: ca53c63794ee1736 +Block 0027 [ 68]: 714981936dd5487c +Block 0027 [ 69]: bf620ebbc920a960 +Block 0027 [ 70]: 835eebf18d80d70b +Block 0027 [ 71]: 174364bafd7c500f +Block 0027 [ 72]: 52e32e79e987e339 +Block 0027 [ 73]: ea2ee4ae5c85f9b7 +Block 0027 [ 74]: 9082578fc32e5522 +Block 0027 [ 75]: 49e1f8e5fec29c66 +Block 0027 [ 76]: bc22280c92dc8017 +Block 0027 [ 77]: 4651bc598c0d68a2 +Block 0027 [ 78]: 9f7f11d764f462b0 +Block 0027 [ 79]: bbf0fdc8d0ed58cb +Block 0027 [ 80]: d21fde1da96d257f +Block 0027 [ 81]: b92685188bd54f18 +Block 0027 [ 82]: 24795ac1884dff14 +Block 0027 [ 83]: e4cf58770c7a3eb7 +Block 0027 [ 84]: 32524079585dc4be +Block 0027 [ 85]: 8d312885fca8e395 +Block 0027 [ 86]: 235d50fc5fb93f7c +Block 0027 [ 87]: 9f7ebfa431d9c8f1 +Block 0027 [ 88]: b36af9bb14781ae2 +Block 0027 [ 89]: 86026a8db22332b0 +Block 0027 [ 90]: 08585886343fc383 +Block 0027 [ 91]: 9c6e402057a0aaf2 +Block 0027 [ 92]: 5defa125fd09ed1b +Block 0027 [ 93]: 5ce30d50933c40f8 +Block 0027 [ 94]: 6b1e678501b2c9d4 +Block 0027 [ 95]: 8725a68615e4d34f +Block 0027 [ 96]: 8c5cdfb8d3795da0 +Block 0027 [ 97]: 5a75edcd8c6d26ab +Block 0027 [ 98]: 88bbf5bd5f9321a0 +Block 0027 [ 99]: d01b8e4553dacfcc +Block 0027 [100]: 6d44604ed05684e3 +Block 0027 [101]: c1d9efbf51f08c0f +Block 0027 [102]: d32861a79d3d3591 +Block 0027 [103]: 0f5e0fdfe060ad48 +Block 0027 [104]: 1aa10c6249e9c203 +Block 0027 [105]: 034b3cd30d6f47db +Block 0027 [106]: 7bbbfa8311733087 +Block 0027 [107]: 218f81120456f524 +Block 0027 [108]: d7068a533876beca +Block 0027 [109]: 903b66e838ceb3a8 +Block 0027 [110]: 30b1296695f436b2 +Block 0027 [111]: c96450f5b09229e7 +Block 0027 [112]: 279d31b6dd521c73 +Block 0027 [113]: c49dd63f87db05e5 +Block 0027 [114]: 4f4183be215209e7 +Block 0027 [115]: 0618248e89512325 +Block 0027 [116]: 1630e2f1fb6f8c9d +Block 0027 [117]: cffa863752fdff8b +Block 0027 [118]: 277bb464fe923265 +Block 0027 [119]: b69f98e413055782 +Block 0027 [120]: be757ac9e2b1afe9 +Block 0027 [121]: 1d505a0e9d9d71f8 +Block 0027 [122]: 851fecc06495f5d8 +Block 0027 [123]: f7130c2a62201dec +Block 0027 [124]: f3a890c658c9a653 +Block 0027 [125]: 913ae2dd0b1b4348 +Block 0027 [126]: dcf627b503666a13 +Block 0027 [127]: 03c2439ffb970ee6 +Block 0028 [ 0]: ca58222c0335fad4 +Block 0028 [ 1]: 9c72e23adf9c0d86 +Block 0028 [ 2]: 1b6707cf48c561d1 +Block 0028 [ 3]: 2b6cda976b746358 +Block 0028 [ 4]: d7a615afa3f55997 +Block 0028 [ 5]: 013fa2f590c128bc +Block 0028 [ 6]: 4cd3353543de39e0 +Block 0028 [ 7]: 61abbc1a37e87eed +Block 0028 [ 8]: 5cb0f9c53b2cfc8e +Block 0028 [ 9]: 86a2c36cadd9f0dd +Block 0028 [ 10]: 238f6eec4bce7605 +Block 0028 [ 11]: cf1d0ef7179792bc +Block 0028 [ 12]: 1df1c207447534c9 +Block 0028 [ 13]: 4201704843e7c5c9 +Block 0028 [ 14]: 9626a9eb6fe0ebc9 +Block 0028 [ 15]: 86e48febc40a64ed +Block 0028 [ 16]: a20402933b241b8a +Block 0028 [ 17]: 6f9031d281bac12b +Block 0028 [ 18]: f45a47b2853694ba +Block 0028 [ 19]: 917a448aef9f4195 +Block 0028 [ 20]: e046f6a5473fb03f +Block 0028 [ 21]: 479b43fc599c24ec +Block 0028 [ 22]: 0abbaa3b84d91c79 +Block 0028 [ 23]: df37b61116fe98d5 +Block 0028 [ 24]: 519ebd6232590101 +Block 0028 [ 25]: 783c4a632e6a81a8 +Block 0028 [ 26]: df754093dd079428 +Block 0028 [ 27]: faa49281ccc74f7f +Block 0028 [ 28]: afe16685c78a1dd6 +Block 0028 [ 29]: 051c80fb6fa24c14 +Block 0028 [ 30]: 08072ecbb0e8f1e0 +Block 0028 [ 31]: 499ac14bf47b5a27 +Block 0028 [ 32]: 5d421f66de4c0e98 +Block 0028 [ 33]: 077ce2dc6718cb84 +Block 0028 [ 34]: f48ab05c57970f5c +Block 0028 [ 35]: 6075db6f8cdd475d +Block 0028 [ 36]: 7c6a41c738738787 +Block 0028 [ 37]: c5f5a1740f2fb839 +Block 0028 [ 38]: 08bc03d5f44201ec +Block 0028 [ 39]: 199605d142f2b604 +Block 0028 [ 40]: 01c3c9f476c868ba +Block 0028 [ 41]: faf406aee9364a54 +Block 0028 [ 42]: 619f3f52adacd452 +Block 0028 [ 43]: 0ecebc2f592ab9c7 +Block 0028 [ 44]: 1d96a7c554184a37 +Block 0028 [ 45]: fda76281db32047b +Block 0028 [ 46]: 269961a043864803 +Block 0028 [ 47]: e40a3252cb410e50 +Block 0028 [ 48]: d5c5b3ac3d004a7a +Block 0028 [ 49]: f47f6d2f7aefe242 +Block 0028 [ 50]: acf22ef8b04c3b2c +Block 0028 [ 51]: 5075c6cab2c6f889 +Block 0028 [ 52]: 0f660a376a8d2aa0 +Block 0028 [ 53]: 34a32efc55b524a6 +Block 0028 [ 54]: 7ff61a76b03cb19e +Block 0028 [ 55]: f74c34ccf42e4b1f +Block 0028 [ 56]: 16f872636b8352b5 +Block 0028 [ 57]: 3201a2c20a72ca41 +Block 0028 [ 58]: c28509cb9041444e +Block 0028 [ 59]: f36347f3390a1e11 +Block 0028 [ 60]: ab7c16ee3e5803a5 +Block 0028 [ 61]: 0de99e30139c5009 +Block 0028 [ 62]: 6d17d8c75edb2365 +Block 0028 [ 63]: cfb612cdaf8f4af7 +Block 0028 [ 64]: f4df991c468e2438 +Block 0028 [ 65]: 2899f895e46033fc +Block 0028 [ 66]: 75ad9f046f559763 +Block 0028 [ 67]: cbec52939ec63cda +Block 0028 [ 68]: c7a89aea82d11cfd +Block 0028 [ 69]: b01c19568317176c +Block 0028 [ 70]: 0d6c0a5b0484270d +Block 0028 [ 71]: 9bb0780452840077 +Block 0028 [ 72]: 3f2c4a2039120ffc +Block 0028 [ 73]: 987360f6050272c0 +Block 0028 [ 74]: 801dfe8bb2f2679e +Block 0028 [ 75]: 220a91558f9fb887 +Block 0028 [ 76]: f9412b28325f93fe +Block 0028 [ 77]: bd02fcadc4e5ba2b +Block 0028 [ 78]: 0db3de28db8c9ac9 +Block 0028 [ 79]: 368f26c4652a64dd +Block 0028 [ 80]: d6c337bf5f03ac89 +Block 0028 [ 81]: 4c714a4305e3aab9 +Block 0028 [ 82]: e6af815ca778f926 +Block 0028 [ 83]: e1859b016348fdbc +Block 0028 [ 84]: b8f5b3c3c49c4cf3 +Block 0028 [ 85]: 670773281ca0da2a +Block 0028 [ 86]: 920d99d5e17eeb64 +Block 0028 [ 87]: 3a864dcfa57eb353 +Block 0028 [ 88]: 0d1b7223e949754f +Block 0028 [ 89]: 0bfc2f27302028c6 +Block 0028 [ 90]: ebca4178f60078f8 +Block 0028 [ 91]: 4ccc4d65bbdc0bed +Block 0028 [ 92]: 8e5363eb76fb3293 +Block 0028 [ 93]: 093c5e82b6095b67 +Block 0028 [ 94]: d0068768e1bdec5b +Block 0028 [ 95]: 0a00c488260db6d5 +Block 0028 [ 96]: 7f7d0d7ac47a81ee +Block 0028 [ 97]: 3ae04e17dd01c279 +Block 0028 [ 98]: f8e6ac29f780be7f +Block 0028 [ 99]: 19c50b7052ac4f44 +Block 0028 [100]: 5303f461feccb497 +Block 0028 [101]: 1854a6ec35aee128 +Block 0028 [102]: db1b041a1ee7a79d +Block 0028 [103]: 7e81f884f7a0a6fc +Block 0028 [104]: bf9bb929bcb9e874 +Block 0028 [105]: 336e80069f3dedd2 +Block 0028 [106]: 035b55ca20c76598 +Block 0028 [107]: b293f79a77cda448 +Block 0028 [108]: 9a763760c91b6714 +Block 0028 [109]: 13302f9a51a34c5a +Block 0028 [110]: 6b2eb8d6aa3b5277 +Block 0028 [111]: bf17d582179db4ce +Block 0028 [112]: 6357d1d0595e0b06 +Block 0028 [113]: 0ea204e3887f1b12 +Block 0028 [114]: ab106f68ffe98952 +Block 0028 [115]: edccf1f4a537c038 +Block 0028 [116]: 4dd30ae007433edb +Block 0028 [117]: 70bf808ff6ed6e4e +Block 0028 [118]: 1bc10a2d27b5e5fc +Block 0028 [119]: cc9bafd348bf29df +Block 0028 [120]: 4958087b121642b4 +Block 0028 [121]: 8ffec5b4c6f60cc5 +Block 0028 [122]: 6d94d7276ac67cee +Block 0028 [123]: 4a878a121591ea5c +Block 0028 [124]: e5ae3c3689f8ab9f +Block 0028 [125]: 779480dd69065bb8 +Block 0028 [126]: be6df4df52c18560 +Block 0028 [127]: 6f1fb1a9cf64874f +Block 0029 [ 0]: 0207741c8146dfa3 +Block 0029 [ 1]: 406a47b4c1e4b7cf +Block 0029 [ 2]: ab350bd11dae3ab1 +Block 0029 [ 3]: b5fcdce3f5af5c51 +Block 0029 [ 4]: 03b1acacafc20140 +Block 0029 [ 5]: 2a425cee09634812 +Block 0029 [ 6]: e552ee3615a33f43 +Block 0029 [ 7]: 5befe9ff059e7bfb +Block 0029 [ 8]: 6794a847fab871cc +Block 0029 [ 9]: 8ff9bbbcffb980a5 +Block 0029 [ 10]: 7cb0bc045830ef7b +Block 0029 [ 11]: 859d5d5109ac4f06 +Block 0029 [ 12]: e8250fd2cc3dcdef +Block 0029 [ 13]: c3a134684c9dd60e +Block 0029 [ 14]: 227e5b09f927b571 +Block 0029 [ 15]: 68c856cec2a47082 +Block 0029 [ 16]: fce4acd1eb9c2fd6 +Block 0029 [ 17]: 1874384733f72647 +Block 0029 [ 18]: 0bb44bf1fef26640 +Block 0029 [ 19]: b6b304e2fa351043 +Block 0029 [ 20]: 751d92d62903ef35 +Block 0029 [ 21]: e78b53c855c5c602 +Block 0029 [ 22]: 0812dcb3268b6d78 +Block 0029 [ 23]: bc792d9a692eafd5 +Block 0029 [ 24]: 33b96da127e9ce75 +Block 0029 [ 25]: 70e99f06a02da8be +Block 0029 [ 26]: a53adf7c364dc22c +Block 0029 [ 27]: e141512a24b1f401 +Block 0029 [ 28]: cd3ca1c7a59cd510 +Block 0029 [ 29]: 0bd3b7d6078e4eed +Block 0029 [ 30]: ab7c6554f4c11436 +Block 0029 [ 31]: 89914cb1067af8ee +Block 0029 [ 32]: c75b936a76746c31 +Block 0029 [ 33]: 024785728db3a789 +Block 0029 [ 34]: 9e58b0afbfdfeb19 +Block 0029 [ 35]: 373f25548779c51f +Block 0029 [ 36]: 543724293d0d8c2d +Block 0029 [ 37]: 62aeaa9b19808110 +Block 0029 [ 38]: 93f21989d783801c +Block 0029 [ 39]: 775dffbce376deb4 +Block 0029 [ 40]: 6f426ae9af1c783e +Block 0029 [ 41]: 48bf94b9dbd7ee4b +Block 0029 [ 42]: f094f91d25ee627d +Block 0029 [ 43]: 9a827b7dc6e0896d +Block 0029 [ 44]: 7910f54893fa8fc3 +Block 0029 [ 45]: 37b30dc28c6049bc +Block 0029 [ 46]: 29ef9da058cb5b84 +Block 0029 [ 47]: 5c403d77779566e1 +Block 0029 [ 48]: 4f409c72a1e0fdec +Block 0029 [ 49]: ae587790d92a03af +Block 0029 [ 50]: 69e0a91db119465e +Block 0029 [ 51]: 0ee30615e5df5ecc +Block 0029 [ 52]: 3dca48a0c98120d6 +Block 0029 [ 53]: 77e254ca3afb9f84 +Block 0029 [ 54]: 7bc434ae14f6f06c +Block 0029 [ 55]: 9775face0be26982 +Block 0029 [ 56]: 6d2f36d11088d913 +Block 0029 [ 57]: 4aa3cc0bff9a1e5c +Block 0029 [ 58]: 005d8f72e50124cf +Block 0029 [ 59]: d76cbf27873f19e3 +Block 0029 [ 60]: 0d4f957d7949663e +Block 0029 [ 61]: 14f198a3447b7039 +Block 0029 [ 62]: 0622617d5f71b2d4 +Block 0029 [ 63]: 8abb43cfcbca2586 +Block 0029 [ 64]: 478b55022fdb873e +Block 0029 [ 65]: 24cd75b9b9e06db9 +Block 0029 [ 66]: 49acbda91ffaa950 +Block 0029 [ 67]: 15c03d8770ed999d +Block 0029 [ 68]: 17a0e368a53308b3 +Block 0029 [ 69]: 4f61904cdaf364f3 +Block 0029 [ 70]: 92db2822da9abc66 +Block 0029 [ 71]: b89ef67c8cd09463 +Block 0029 [ 72]: fdf5ce73da75a752 +Block 0029 [ 73]: 715da75d29a11d0c +Block 0029 [ 74]: 1c4a97738457a7c0 +Block 0029 [ 75]: 01cda83c3413395e +Block 0029 [ 76]: 4a621ae732bad57a +Block 0029 [ 77]: 41f23ad22e523495 +Block 0029 [ 78]: dc7098ac146ea569 +Block 0029 [ 79]: a2cf720400e39c0c +Block 0029 [ 80]: 09aa559ce750a2c7 +Block 0029 [ 81]: 5a44bd0df4be581e +Block 0029 [ 82]: 8a77c840fcaabe6b +Block 0029 [ 83]: bbe29d575a3978ef +Block 0029 [ 84]: 790f91e76c826d67 +Block 0029 [ 85]: c2bceae4dd73f8ba +Block 0029 [ 86]: 683088167d2926ba +Block 0029 [ 87]: 49957770e745d01d +Block 0029 [ 88]: 17b96ee43d3a76c5 +Block 0029 [ 89]: 43328a4e158c81cf +Block 0029 [ 90]: e76baf7b9aef84a3 +Block 0029 [ 91]: d4c264c8a6994714 +Block 0029 [ 92]: 8ee8e576bebec7bf +Block 0029 [ 93]: 6411980b914b9662 +Block 0029 [ 94]: 745acc8565779744 +Block 0029 [ 95]: 30ce9cf530824795 +Block 0029 [ 96]: b78a1629bb41a6d6 +Block 0029 [ 97]: 67ad7c8dc3e08d91 +Block 0029 [ 98]: c0146364b77acb3c +Block 0029 [ 99]: 75bbe8fafef1de11 +Block 0029 [100]: 795f2830cecab6eb +Block 0029 [101]: 3ac583d316cf3a15 +Block 0029 [102]: 9d0b885e2fbcf626 +Block 0029 [103]: c91bea4d5cdd103d +Block 0029 [104]: d9d5df2d889b62cb +Block 0029 [105]: aa660e50a1c8ca3b +Block 0029 [106]: 83ad208abfb4a5db +Block 0029 [107]: 0c41929e4aac98a6 +Block 0029 [108]: 732c3d845a3dd9ad +Block 0029 [109]: 5d90d1e6b10da9ba +Block 0029 [110]: 7f5899546758538e +Block 0029 [111]: 81035b8ef4ccb393 +Block 0029 [112]: 3bce5002a0e42a9e +Block 0029 [113]: 49728c1521571871 +Block 0029 [114]: 2dde86b7d59ec9f6 +Block 0029 [115]: 982676db6df43385 +Block 0029 [116]: 5cba52ad4c42077a +Block 0029 [117]: 0172b3408cbe8d23 +Block 0029 [118]: 3f410a84fb1722f6 +Block 0029 [119]: 85bdb25c8eceda0e +Block 0029 [120]: 4ff1c2d46a2b487b +Block 0029 [121]: 9fe47fbe9734d275 +Block 0029 [122]: 4b396e3adbd6abcc +Block 0029 [123]: 4f2dd219ae0a599d +Block 0029 [124]: bf73abc3293e108c +Block 0029 [125]: 158517dd7f973123 +Block 0029 [126]: 9d70f00766295708 +Block 0029 [127]: 67ad678c811a378e +Block 0030 [ 0]: 1f9e38f15c0b4acf +Block 0030 [ 1]: f0e0a264cd839857 +Block 0030 [ 2]: 50bc35d79237b54e +Block 0030 [ 3]: 3857d320bcefd875 +Block 0030 [ 4]: 2d1318855b016e6c +Block 0030 [ 5]: 967241dbadfdb565 +Block 0030 [ 6]: 800753ca23565b99 +Block 0030 [ 7]: fee608d250770302 +Block 0030 [ 8]: 7dddd4f29e607658 +Block 0030 [ 9]: 819a24edf268fcb2 +Block 0030 [ 10]: 6880a1d3d9812700 +Block 0030 [ 11]: 57d3fc07966300b6 +Block 0030 [ 12]: 8f946b77f29001d7 +Block 0030 [ 13]: bb0abfac9eb9dda3 +Block 0030 [ 14]: 34839f915d84aa17 +Block 0030 [ 15]: 30688be9d1e7e726 +Block 0030 [ 16]: 6b1f946cf0e14b98 +Block 0030 [ 17]: 0b5de2f45696efef +Block 0030 [ 18]: 6fb9961aa06875b7 +Block 0030 [ 19]: 7bc7176c8c9874e2 +Block 0030 [ 20]: 840507101c0c10ec +Block 0030 [ 21]: 8f9fcb5775408171 +Block 0030 [ 22]: b7f561bf6420bf4b +Block 0030 [ 23]: 408d65ea6ace1994 +Block 0030 [ 24]: 72b7b6ad2a8710e1 +Block 0030 [ 25]: b959adeff619c82d +Block 0030 [ 26]: 7b8858d87a632c81 +Block 0030 [ 27]: c8b936af201270e6 +Block 0030 [ 28]: cfe54bccb6a654a6 +Block 0030 [ 29]: 907e9744d4483668 +Block 0030 [ 30]: 8d3199d677ba43d4 +Block 0030 [ 31]: 257ce84b68bad3f2 +Block 0030 [ 32]: c824aa1982671945 +Block 0030 [ 33]: e2e9dd16e403e398 +Block 0030 [ 34]: 1daa88aeb3675d8d +Block 0030 [ 35]: 9c8265c6f92c91e9 +Block 0030 [ 36]: 95e78fae8367fd87 +Block 0030 [ 37]: 68dd4415761ad758 +Block 0030 [ 38]: 1eb7f341ac811efb +Block 0030 [ 39]: a777790a8ef0ba3e +Block 0030 [ 40]: 237e7e319e1876da +Block 0030 [ 41]: 10d59f907a261f1a +Block 0030 [ 42]: 5f6993574dacb849 +Block 0030 [ 43]: 4aafd981472ab898 +Block 0030 [ 44]: 7a39e6aa861f86e4 +Block 0030 [ 45]: de79f33874b17af6 +Block 0030 [ 46]: 5ae77d3ff4d97e32 +Block 0030 [ 47]: bfb9a79eac24988b +Block 0030 [ 48]: cd4b0f3306bc2285 +Block 0030 [ 49]: 79587c4db17ce2d5 +Block 0030 [ 50]: df3c2a26a81def00 +Block 0030 [ 51]: f91aa04a4584fb96 +Block 0030 [ 52]: 319293679662fb6e +Block 0030 [ 53]: 2cf5cb1c39d7e349 +Block 0030 [ 54]: d8c7d314fde62100 +Block 0030 [ 55]: d49acb9f84ddeee0 +Block 0030 [ 56]: b308ba9300dac74d +Block 0030 [ 57]: 56ec31602722bdd4 +Block 0030 [ 58]: 5d31ea5dfd133be3 +Block 0030 [ 59]: 61dfe7872e811d02 +Block 0030 [ 60]: 1a82dbdb52cd4ea4 +Block 0030 [ 61]: 599ddbd51c7386bf +Block 0030 [ 62]: 4186c201a09ea371 +Block 0030 [ 63]: cf5c3bfef67e4229 +Block 0030 [ 64]: d8dcbf137d92f555 +Block 0030 [ 65]: 83e7b079d384deba +Block 0030 [ 66]: 5c92cecdadee4f1f +Block 0030 [ 67]: 02bb23eda398826e +Block 0030 [ 68]: 9f1eaaf0ab692fdd +Block 0030 [ 69]: 3e762c6854d3d4b4 +Block 0030 [ 70]: 3d9920cae2bc168e +Block 0030 [ 71]: 03730d8cf69a8947 +Block 0030 [ 72]: 57e3e8be34628ccf +Block 0030 [ 73]: dc8cc84b253302fa +Block 0030 [ 74]: f34b5dd75cf375ab +Block 0030 [ 75]: eb39e41a160e9bd5 +Block 0030 [ 76]: 19cb451eeae042ac +Block 0030 [ 77]: 31ba85ddb8a465bd +Block 0030 [ 78]: 86493a0e610f4c97 +Block 0030 [ 79]: 2f3a02b6f7c68509 +Block 0030 [ 80]: 5accf78953cbe2f6 +Block 0030 [ 81]: 1a5b00f4a378d40c +Block 0030 [ 82]: d21871f9f4a302dc +Block 0030 [ 83]: 366e91b6368ce852 +Block 0030 [ 84]: 871f4b10870f96b3 +Block 0030 [ 85]: ca76bcbeb17e4388 +Block 0030 [ 86]: 4a9a238334ed233d +Block 0030 [ 87]: d548e679c135e3ec +Block 0030 [ 88]: 14caee6503e8b5c7 +Block 0030 [ 89]: c313e7bdbf043aae +Block 0030 [ 90]: 2ea1a9cb349a2e18 +Block 0030 [ 91]: a66ff32802eee268 +Block 0030 [ 92]: 4f74c552992434ad +Block 0030 [ 93]: 1fb689ea6ebf5016 +Block 0030 [ 94]: c61a5622a5650bdb +Block 0030 [ 95]: bf3f5fa2876962ad +Block 0030 [ 96]: 4a35ba57808f1408 +Block 0030 [ 97]: b9cc98fb701693e8 +Block 0030 [ 98]: 4f0191eeaa9c9104 +Block 0030 [ 99]: fd94c892d297bc01 +Block 0030 [100]: ee5b3c3aec2fc3e6 +Block 0030 [101]: 944c5da066f03024 +Block 0030 [102]: 49bc29ef54fa14c6 +Block 0030 [103]: 103dab1249b26ed0 +Block 0030 [104]: fa3f5194e6aa4932 +Block 0030 [105]: bd5a531ed38fe96e +Block 0030 [106]: 32eb829d00e9e523 +Block 0030 [107]: cd00296881ca0348 +Block 0030 [108]: fa39b8a99f7ab372 +Block 0030 [109]: 614cc3127e419850 +Block 0030 [110]: edeb6ab484faf67f +Block 0030 [111]: 02c355973c574d1d +Block 0030 [112]: 198b58c82f416d64 +Block 0030 [113]: d332fa14092a550a +Block 0030 [114]: bc2317ef3bdb5e88 +Block 0030 [115]: 31bc87b1ed42e2a9 +Block 0030 [116]: a8dd6cdbbb306d5f +Block 0030 [117]: b5c2153c6e5cc25e +Block 0030 [118]: 8aa4063415e7c7ef +Block 0030 [119]: d11033bd5e3cb501 +Block 0030 [120]: d9910a22a988ffee +Block 0030 [121]: c54b0e343365f143 +Block 0030 [122]: b6bac0a513cb7c38 +Block 0030 [123]: 8a797f119a8fa477 +Block 0030 [124]: 8a9fdb5f6f892ef3 +Block 0030 [125]: d4abea5cf9bb068a +Block 0030 [126]: 81388ea4ad703fd7 +Block 0030 [127]: 00ad23051eb6accc +Block 0031 [ 0]: c214853efbb75de4 +Block 0031 [ 1]: aad6885569088f52 +Block 0031 [ 2]: d86f98b36790f5b8 +Block 0031 [ 3]: e77655a17cbb7f4c +Block 0031 [ 4]: 0ecb507ed5dc329a +Block 0031 [ 5]: 5ed932eb7a74d4fa +Block 0031 [ 6]: 4585ba06399f2072 +Block 0031 [ 7]: 1ed9ff754566cca5 +Block 0031 [ 8]: 32a32d4a331b0087 +Block 0031 [ 9]: a3ca9ccdb628ef78 +Block 0031 [ 10]: 7306560670f1d0c2 +Block 0031 [ 11]: d4a872959695ec2c +Block 0031 [ 12]: 80eb229e4932edff +Block 0031 [ 13]: d101308963991194 +Block 0031 [ 14]: 73085ee7d8211718 +Block 0031 [ 15]: 161e14bd7afc6265 +Block 0031 [ 16]: 66bfe3b7b09efea6 +Block 0031 [ 17]: 7c9e052377cc0d52 +Block 0031 [ 18]: 14265c7dc1f5df42 +Block 0031 [ 19]: d4b6f6fb6358f6f6 +Block 0031 [ 20]: 881eb8e86ab22017 +Block 0031 [ 21]: 118f820d2363c8c9 +Block 0031 [ 22]: aff520d67dd66e3b +Block 0031 [ 23]: 29aec74c592a814a +Block 0031 [ 24]: 0ed40fccb5f07c87 +Block 0031 [ 25]: 51941c3d5c31379c +Block 0031 [ 26]: f7cbf86cac7c6434 +Block 0031 [ 27]: f61fa7f0e2b3cbc8 +Block 0031 [ 28]: 9f5e9f66cf4114ad +Block 0031 [ 29]: 0652344032753e1b +Block 0031 [ 30]: fef2a3ea3dfcf379 +Block 0031 [ 31]: a6fea6258e518ebc +Block 0031 [ 32]: 856a99f86c7e762d +Block 0031 [ 33]: 42e85fcd24e8b41e +Block 0031 [ 34]: 148d9e623e851dea +Block 0031 [ 35]: e76f445a76772983 +Block 0031 [ 36]: 361241968174001f +Block 0031 [ 37]: 83b64baebf5a4908 +Block 0031 [ 38]: d3373289c148463a +Block 0031 [ 39]: 639a1909b1574a93 +Block 0031 [ 40]: 1756d9dec3da6a64 +Block 0031 [ 41]: 7a2bf952a65a0da7 +Block 0031 [ 42]: 25e97e5cc04b243b +Block 0031 [ 43]: bb33ad4b697daeed +Block 0031 [ 44]: cd751a3f5385f8e1 +Block 0031 [ 45]: 9ce29b4e243aa4c9 +Block 0031 [ 46]: 98f94b6f1479af37 +Block 0031 [ 47]: 8bcfa0eb52e00b18 +Block 0031 [ 48]: afbf5c00f6b6342a +Block 0031 [ 49]: d754c66aed0d0132 +Block 0031 [ 50]: d5e4093177c9e92d +Block 0031 [ 51]: 61bab57ba23847d3 +Block 0031 [ 52]: 1fc3b0cfce64bb77 +Block 0031 [ 53]: 0f98a6bc191d3213 +Block 0031 [ 54]: 7e609553847c0e6f +Block 0031 [ 55]: 361304bb6138aac0 +Block 0031 [ 56]: 878872e076fc08aa +Block 0031 [ 57]: 6c153b5fd7d11503 +Block 0031 [ 58]: 06b4f4ad17802f4d +Block 0031 [ 59]: 6d77ff7b0f34ee7c +Block 0031 [ 60]: 670dd85ba6194fca +Block 0031 [ 61]: 5671b23c77e3d057 +Block 0031 [ 62]: 35119e2f853fbc9d +Block 0031 [ 63]: def753f2a7ef264a +Block 0031 [ 64]: e85bdbe442ed3f43 +Block 0031 [ 65]: f4fc248a745d8f9c +Block 0031 [ 66]: 9ba20fdd79e80b8c +Block 0031 [ 67]: b6d9f5945f9a664d +Block 0031 [ 68]: 20fbd28b785e0329 +Block 0031 [ 69]: f85e52ac3767b3f5 +Block 0031 [ 70]: 2b1eb317ddab4fa8 +Block 0031 [ 71]: 93cfe1a3f0d85bf0 +Block 0031 [ 72]: d58de87c9917fb35 +Block 0031 [ 73]: b6d7bcd756819f50 +Block 0031 [ 74]: 8de20a6619d151d8 +Block 0031 [ 75]: 87bd14b028d9216c +Block 0031 [ 76]: 15a2eba464d56e8f +Block 0031 [ 77]: 2465311173907873 +Block 0031 [ 78]: eb9c61925e7c58b3 +Block 0031 [ 79]: 0ed7cbeb1492c923 +Block 0031 [ 80]: 77a798a571f4450a +Block 0031 [ 81]: 482b893c546ff4a6 +Block 0031 [ 82]: 39ac176fb2b483db +Block 0031 [ 83]: 32437a31965a733c +Block 0031 [ 84]: be933e433f586338 +Block 0031 [ 85]: 40f25a7ed2c5120c +Block 0031 [ 86]: 49d2f77c6aff30fc +Block 0031 [ 87]: a1ad34b9bf94bf07 +Block 0031 [ 88]: a77f1a70cdb0dd06 +Block 0031 [ 89]: 106afffa50facc31 +Block 0031 [ 90]: ba8826e4219dc476 +Block 0031 [ 91]: e02982181e0870ee +Block 0031 [ 92]: 8480c3aae6e896aa +Block 0031 [ 93]: 297f2c7a272a8b2f +Block 0031 [ 94]: c5036bb595909a84 +Block 0031 [ 95]: a08327fabb4d3fb8 +Block 0031 [ 96]: 53f22cc5481afc88 +Block 0031 [ 97]: f067dcc8b804378f +Block 0031 [ 98]: 17894a8680e925b3 +Block 0031 [ 99]: 6078d7556d2fcdfc +Block 0031 [100]: 2a83f75567f6b751 +Block 0031 [101]: 80fb55cfa65a6155 +Block 0031 [102]: db56da1e25853d68 +Block 0031 [103]: f211137a22a34c75 +Block 0031 [104]: ceeea03f75fa41c6 +Block 0031 [105]: a56305173372f075 +Block 0031 [106]: 13bcf10f6f52c543 +Block 0031 [107]: 8cce231f5c882992 +Block 0031 [108]: 2dd59abd3326b1d0 +Block 0031 [109]: bf2adce673d93e75 +Block 0031 [110]: aff796ec3520ea12 +Block 0031 [111]: ed4a55e41b122765 +Block 0031 [112]: 51e63bc4199c4fc4 +Block 0031 [113]: 64631c52d2bbe92a +Block 0031 [114]: e30d2cbd6fc1fb0e +Block 0031 [115]: 6b67d0c31a71f6d8 +Block 0031 [116]: 53093eabfb3a0e16 +Block 0031 [117]: 4cdd35a55bd56663 +Block 0031 [118]: bb4297a99e734daf +Block 0031 [119]: 0d5dd07557b2d5c7 +Block 0031 [120]: fb351e6ce72b7a37 +Block 0031 [121]: 06f324ad64676de7 +Block 0031 [122]: c18903237861cf21 +Block 0031 [123]: 1672989332c783ea +Block 0031 [124]: 4a14c84a31058542 +Block 0031 [125]: 25c544df9faab7be +Block 0031 [126]: 4627ff2abce83845 +Block 0031 [127]: 6316fd56c69344f1 + + After pass 2: +Block 0000 [ 0]: d2bfbbc5538d0691 +Block 0000 [ 1]: fdd30b9eda25954b +Block 0000 [ 2]: 3acab43f4e2d35bd +Block 0000 [ 3]: 6a7098a3676964bd +Block 0000 [ 4]: bea6794f73dc88ec +Block 0000 [ 5]: 837d3ad2b07a12c9 +Block 0000 [ 6]: 3e2421fcf8eda94e +Block 0000 [ 7]: 3ca9a53c07522ccd +Block 0000 [ 8]: 863e66bbd66c6273 +Block 0000 [ 9]: 17ae74a98b994202 +Block 0000 [ 10]: 4ff8af313326b54b +Block 0000 [ 11]: a12468f5a7ae468d +Block 0000 [ 12]: fa69e7a7bac72caa +Block 0000 [ 13]: 5cdc71c04b8b8306 +Block 0000 [ 14]: 85b8eafdbb7f9d3d +Block 0000 [ 15]: c3a68f3de40b258a +Block 0000 [ 16]: f10227d4f1d7f387 +Block 0000 [ 17]: 68983d628ad03716 +Block 0000 [ 18]: 59041153fb987a38 +Block 0000 [ 19]: a2e96838b1930c0c +Block 0000 [ 20]: f775642275053088 +Block 0000 [ 21]: 3dd0a9996c16b353 +Block 0000 [ 22]: 30de7ea84550d566 +Block 0000 [ 23]: 52ff98bec2f102e3 +Block 0000 [ 24]: d7bf180f18129d8c +Block 0000 [ 25]: 0b20025f9425bdd8 +Block 0000 [ 26]: 34c4cf7f7094b7f4 +Block 0000 [ 27]: 04d626f3b9f4296b +Block 0000 [ 28]: 3c327a1aeab45c96 +Block 0000 [ 29]: faf97a90c9cee32f +Block 0000 [ 30]: c79d3bc514100ac0 +Block 0000 [ 31]: 478d91a10654e435 +Block 0000 [ 32]: 3a251ea52e5265b0 +Block 0000 [ 33]: c2d308d9c012c0b7 +Block 0000 [ 34]: 6f12cd0ba5e43e8e +Block 0000 [ 35]: c60725db674efc2f +Block 0000 [ 36]: 84b934ebec83b87a +Block 0000 [ 37]: d1f2a34706cac386 +Block 0000 [ 38]: 85cf00381149b292 +Block 0000 [ 39]: f2d45baf330d70fa +Block 0000 [ 40]: 949ac580ffdee39f +Block 0000 [ 41]: 939d7c5244ce5026 +Block 0000 [ 42]: 62604d407db2dc10 +Block 0000 [ 43]: c561714c5baca244 +Block 0000 [ 44]: d793e68d21b8d785 +Block 0000 [ 45]: 9218155894eb4668 +Block 0000 [ 46]: a6d83e86dd08b536 +Block 0000 [ 47]: b12166b5fbf2622b +Block 0000 [ 48]: 087fc2807f6b0240 +Block 0000 [ 49]: a953331bf25793c6 +Block 0000 [ 50]: 395e56f54f367d58 +Block 0000 [ 51]: 71844b0ad60a4348 +Block 0000 [ 52]: bff48acffc4f1d86 +Block 0000 [ 53]: 08207d54623b8eff +Block 0000 [ 54]: d7976065b56b168b +Block 0000 [ 55]: 7a0a7f11ededbe27 +Block 0000 [ 56]: 5feed8c252d86bb0 +Block 0000 [ 57]: 9890890cfa9ac4dd +Block 0000 [ 58]: 4bccf79dae011a67 +Block 0000 [ 59]: 2cdc7e852e3325aa +Block 0000 [ 60]: 4b3f2056e3d09a17 +Block 0000 [ 61]: 3e3c49a5be718d8f +Block 0000 [ 62]: f3eeeabf2e588a37 +Block 0000 [ 63]: 1d163fbaea85c51e +Block 0000 [ 64]: 4e870740a63bfebe +Block 0000 [ 65]: fdea2486efd299f9 +Block 0000 [ 66]: 63c4c7642195538d +Block 0000 [ 67]: 6aa09c2a021a7e39 +Block 0000 [ 68]: 383de7f9fd0477e9 +Block 0000 [ 69]: a96d36027d5d40fa +Block 0000 [ 70]: 0c3389062b014fce +Block 0000 [ 71]: c114edae155883af +Block 0000 [ 72]: d34997d5da0d7faf +Block 0000 [ 73]: bb1a90429091d672 +Block 0000 [ 74]: f10646dc7472f874 +Block 0000 [ 75]: 799bad35f1b4b596 +Block 0000 [ 76]: 59b72d2dc1ec8265 +Block 0000 [ 77]: f862830aa16be38e +Block 0000 [ 78]: 87d27855b30d2e10 +Block 0000 [ 79]: 1b83b64e975578fb +Block 0000 [ 80]: 10b85998fc9683cb +Block 0000 [ 81]: 9e77d6fd752f56e4 +Block 0000 [ 82]: 0abae223a92a3866 +Block 0000 [ 83]: 50115aa654949866 +Block 0000 [ 84]: c7fce8bf28b52b61 +Block 0000 [ 85]: 7eab21dc322adcc7 +Block 0000 [ 86]: 385bf7b817b855a6 +Block 0000 [ 87]: 89a96d45fab99e0b +Block 0000 [ 88]: a4d612ec2b949d99 +Block 0000 [ 89]: 485ab81e2aa987c1 +Block 0000 [ 90]: fb668789e6a7cdb4 +Block 0000 [ 91]: 382820855bb0f925 +Block 0000 [ 92]: 4aefec40e2182c2e +Block 0000 [ 93]: d0bbfd373964563b +Block 0000 [ 94]: 522f590a62b06af5 +Block 0000 [ 95]: 4673911857dee9d0 +Block 0000 [ 96]: 60b473dcc47e9f98 +Block 0000 [ 97]: 58e120f49b52a745 +Block 0000 [ 98]: 1ef5e595d1f45259 +Block 0000 [ 99]: b864a94f27e6dced +Block 0000 [100]: 74a270f2b6b8048d +Block 0000 [101]: 79d8ba2427c45f6f +Block 0000 [102]: 43d10923485a498c +Block 0000 [103]: ae95c732560cf5a7 +Block 0000 [104]: eee43f84fb4f00c8 +Block 0000 [105]: 4f2c7238bed818d3 +Block 0000 [106]: 3021c423f992eea9 +Block 0000 [107]: 40e6a0f228776314 +Block 0000 [108]: f57ddf4d9227d927 +Block 0000 [109]: 67c9b4dd17f940f8 +Block 0000 [110]: 9e79fc2dfd0c3458 +Block 0000 [111]: 17f629e2d71e0631 +Block 0000 [112]: bf50ffc05622f1a1 +Block 0000 [113]: f722cd6173d05451 +Block 0000 [114]: aa7dd6a9bdb8fde7 +Block 0000 [115]: 96e948a8fffdad2b +Block 0000 [116]: 39fdd84328ad4a48 +Block 0000 [117]: 9ac11eda284697b2 +Block 0000 [118]: cd6a816bc4ef9279 +Block 0000 [119]: 7a9b9ff5570151d7 +Block 0000 [120]: 989fb3eccde11a2c +Block 0000 [121]: 42d0105e6df28303 +Block 0000 [122]: 385308a61f36a6b7 +Block 0000 [123]: d5d3b82a09e03e4e +Block 0000 [124]: 4eb69b6b8bdb50dc +Block 0000 [125]: b0bc8a268c477342 +Block 0000 [126]: d227cc6b292c97f3 +Block 0000 [127]: 5c14f1f815132a2d +Block 0001 [ 0]: 75c183401903f625 +Block 0001 [ 1]: 8c20fa12abcbce89 +Block 0001 [ 2]: a5ead7a57718ec5e +Block 0001 [ 3]: 18c5a981135c282c +Block 0001 [ 4]: 0590129aad6e72cf +Block 0001 [ 5]: e3dd77e6a4aac515 +Block 0001 [ 6]: 31521cb6071f820f +Block 0001 [ 7]: 172736e02c9cf05e +Block 0001 [ 8]: 7634b8f8e1fc0ce9 +Block 0001 [ 9]: e6812a3bc4ebf23d +Block 0001 [ 10]: 98e977becd8b7a7c +Block 0001 [ 11]: e65ec3b60b1db8e4 +Block 0001 [ 12]: 4f6113dafc47d70a +Block 0001 [ 13]: c85682ce4422cad9 +Block 0001 [ 14]: b32004f710920375 +Block 0001 [ 15]: 694cc7f9f95731e3 +Block 0001 [ 16]: 605bb861fc60749f +Block 0001 [ 17]: 72cec74a23d1eff0 +Block 0001 [ 18]: 6eac4f1a2540da41 +Block 0001 [ 19]: 5430aa5aa99cb80d +Block 0001 [ 20]: 8544c56488bb9e2d +Block 0001 [ 21]: 06a7423f86b8d125 +Block 0001 [ 22]: c7b7d5dd29a07e96 +Block 0001 [ 23]: ff83461fd40e9e74 +Block 0001 [ 24]: 9b4d52a073fb9d5c +Block 0001 [ 25]: 7415a3510a0a6a00 +Block 0001 [ 26]: 317d09aaf7cb9ba8 +Block 0001 [ 27]: cc2cfaf8b506d014 +Block 0001 [ 28]: b337c6e47c9d799e +Block 0001 [ 29]: ab67888b9e46f720 +Block 0001 [ 30]: 2affc2a33c986c0c +Block 0001 [ 31]: b2842aebb3e5d1e4 +Block 0001 [ 32]: b275965d992ff5fc +Block 0001 [ 33]: c39ddc5e9c6e04eb +Block 0001 [ 34]: 191f7cc2b3b8d5cb +Block 0001 [ 35]: 72937670bd7fb9d7 +Block 0001 [ 36]: 0645f6e8e81e617f +Block 0001 [ 37]: ef0c4ca70bf25f7a +Block 0001 [ 38]: a23a4bae4d1ef4ab +Block 0001 [ 39]: e4fead0ff40a9c42 +Block 0001 [ 40]: e3635b74da13fe52 +Block 0001 [ 41]: 149997696a79efdf +Block 0001 [ 42]: b4894283887470d6 +Block 0001 [ 43]: 5e8d46c852abb1fa +Block 0001 [ 44]: a820e4585c0fe1d5 +Block 0001 [ 45]: c3a70d7cd439a327 +Block 0001 [ 46]: 30744765900a5610 +Block 0001 [ 47]: 28ddbf796851f228 +Block 0001 [ 48]: f2581f003f82cfb1 +Block 0001 [ 49]: 0439eb009462786f +Block 0001 [ 50]: 15a35e8df68cff6b +Block 0001 [ 51]: ec8be6cf6684a129 +Block 0001 [ 52]: ad3f4e12a3154e8e +Block 0001 [ 53]: 5916f409d829443e +Block 0001 [ 54]: 8800db5cbfcb15a5 +Block 0001 [ 55]: 8d9e9349289e03dd +Block 0001 [ 56]: 19c47c8106c8577b +Block 0001 [ 57]: f88a37de8eeefed1 +Block 0001 [ 58]: 5eeed049b2ecec0e +Block 0001 [ 59]: b112cd4c54df3ac3 +Block 0001 [ 60]: 4ad2ec8a421490c4 +Block 0001 [ 61]: 9bc263ce61103790 +Block 0001 [ 62]: 4a730d5c30feecd0 +Block 0001 [ 63]: ffa189cc98d79651 +Block 0001 [ 64]: a40b5c0eae44d459 +Block 0001 [ 65]: 7045a68bdce9cb5d +Block 0001 [ 66]: 8f97e54a007d71e2 +Block 0001 [ 67]: ef560075b9d613a0 +Block 0001 [ 68]: a7fc257eb171bfd3 +Block 0001 [ 69]: 4c7082a1a4a5e593 +Block 0001 [ 70]: 500cfcccd795a009 +Block 0001 [ 71]: 80c8f60d8c9f8e30 +Block 0001 [ 72]: 08632801eff5e6ce +Block 0001 [ 73]: 67fbc4d781a5be67 +Block 0001 [ 74]: 7b7d12f4c1a69cfb +Block 0001 [ 75]: 0499393e9a0537b1 +Block 0001 [ 76]: 2646f7e44f09270e +Block 0001 [ 77]: 60ac80d07ac36ca2 +Block 0001 [ 78]: dcc8a040ab3e73f8 +Block 0001 [ 79]: fc12d44434965551 +Block 0001 [ 80]: 8b440689c5dedb15 +Block 0001 [ 81]: a7eae4713960017b +Block 0001 [ 82]: 35c85d575a40d8c5 +Block 0001 [ 83]: 25af4b3b414fea51 +Block 0001 [ 84]: 1cb81be8f18c4966 +Block 0001 [ 85]: 7e03a303fcedc7ce +Block 0001 [ 86]: cf6b0505c1cfd2ec +Block 0001 [ 87]: deaede9a78815a4f +Block 0001 [ 88]: 474545fe9136db82 +Block 0001 [ 89]: ae09452c35b774f6 +Block 0001 [ 90]: 9bbae009dde20ac9 +Block 0001 [ 91]: 935f97a69a6c68a3 +Block 0001 [ 92]: f92ba79f50fc101b +Block 0001 [ 93]: 12ec6069ff1d8542 +Block 0001 [ 94]: 27aa206ebdc64128 +Block 0001 [ 95]: 7e52fad9fc5791d2 +Block 0001 [ 96]: 10d211741d67c7a3 +Block 0001 [ 97]: c79233c1a34adef8 +Block 0001 [ 98]: 19059f2fb6098d55 +Block 0001 [ 99]: e51de33609f86618 +Block 0001 [100]: 2bc0bb88fef64262 +Block 0001 [101]: fa91ada28a84aebe +Block 0001 [102]: 6e02b86736cbf953 +Block 0001 [103]: cd3728d7d6bf9e98 +Block 0001 [104]: 7760845d9d81c2c3 +Block 0001 [105]: 8417879b22777f17 +Block 0001 [106]: cf881e44da6f7662 +Block 0001 [107]: 33e24c6ff1d99839 +Block 0001 [108]: 185cef30e7a37acf +Block 0001 [109]: 161026f1104186da +Block 0001 [110]: 73b72796317bed2d +Block 0001 [111]: 3562d0ff6ee7d268 +Block 0001 [112]: 872a7c67cc9a61bf +Block 0001 [113]: 79c4f22bebdf7b73 +Block 0001 [114]: f7a70fe4b9aeda09 +Block 0001 [115]: df9bceaeb3963845 +Block 0001 [116]: a5a655151f09c222 +Block 0001 [117]: febca01a48f68e1d +Block 0001 [118]: 2c3c859e18149bf3 +Block 0001 [119]: 8839f7dde56b0943 +Block 0001 [120]: a22a95c95645fd5e +Block 0001 [121]: 04d0cd5246f75ac2 +Block 0001 [122]: 965d0c6431059fe9 +Block 0001 [123]: 14e4627253a6c318 +Block 0001 [124]: 39f51177a99f2c70 +Block 0001 [125]: 78df225cea3e8413 +Block 0001 [126]: b486dbb11b49885a +Block 0001 [127]: e4b1362f7ec62876 +Block 0002 [ 0]: be82e39fb23497af +Block 0002 [ 1]: 97f7fc0dc8fa8561 +Block 0002 [ 2]: d305b88dd051b91a +Block 0002 [ 3]: bd8f0dfd151eae83 +Block 0002 [ 4]: 910b545ff2334fcd +Block 0002 [ 5]: 1ef0ece59fef86cd +Block 0002 [ 6]: fe5c03cd20349ba7 +Block 0002 [ 7]: d9782292d3ef95bf +Block 0002 [ 8]: 9d746018ea870fcd +Block 0002 [ 9]: 34db528ff7ce54bf +Block 0002 [ 10]: f301b4da637a91e2 +Block 0002 [ 11]: a1a2d26757179a10 +Block 0002 [ 12]: 02351e156a86d35d +Block 0002 [ 13]: 63143aa712192240 +Block 0002 [ 14]: 7a3ceffdd1a79ee8 +Block 0002 [ 15]: c40088234a6042d6 +Block 0002 [ 16]: eed93e9a2e88a2c7 +Block 0002 [ 17]: b0e0f7875f672d69 +Block 0002 [ 18]: 521f9a10146a7e31 +Block 0002 [ 19]: 39619c7eb1066700 +Block 0002 [ 20]: 5f6312b67651ecb5 +Block 0002 [ 21]: c0ed573071f12360 +Block 0002 [ 22]: eda1d8347de4efbc +Block 0002 [ 23]: 7e0819f293535c13 +Block 0002 [ 24]: ed47b829b1fc489b +Block 0002 [ 25]: 6c95dfd9a580c85b +Block 0002 [ 26]: 6ceb4e97a15ed8a0 +Block 0002 [ 27]: ef840f725146143c +Block 0002 [ 28]: b15bbf822cce3e84 +Block 0002 [ 29]: 72796b2867a1622f +Block 0002 [ 30]: 11d049b8c0e82587 +Block 0002 [ 31]: a4880ed5d4e8824a +Block 0002 [ 32]: 0cdc193f278373f9 +Block 0002 [ 33]: 9b1478114f594a80 +Block 0002 [ 34]: d0e03f2b6994e2b4 +Block 0002 [ 35]: 98b62f2de4e831e1 +Block 0002 [ 36]: 0416c2fdef1a17d6 +Block 0002 [ 37]: 10ad0d51eddd36df +Block 0002 [ 38]: be9b727601c88728 +Block 0002 [ 39]: 3a496f65a2a23980 +Block 0002 [ 40]: cb85f05f72d57364 +Block 0002 [ 41]: bf32c58ac37e31f3 +Block 0002 [ 42]: 7555f66129a05a3c +Block 0002 [ 43]: b09de73b8833d762 +Block 0002 [ 44]: 3aaddc025bc9c5f5 +Block 0002 [ 45]: d51d9b50e7ac1e10 +Block 0002 [ 46]: 72de8083b651b259 +Block 0002 [ 47]: 135411c956b1e691 +Block 0002 [ 48]: ca0aff548d7682d7 +Block 0002 [ 49]: f44b3e4210ba5898 +Block 0002 [ 50]: c691066bf3747eed +Block 0002 [ 51]: c1f9682454c740c5 +Block 0002 [ 52]: ad58f9792291cee0 +Block 0002 [ 53]: d592f5dbe2102500 +Block 0002 [ 54]: 635c299efb84bf42 +Block 0002 [ 55]: 8b80fa8e61d49dd9 +Block 0002 [ 56]: 87235af2e76b8301 +Block 0002 [ 57]: 8b1eb45875d5856a +Block 0002 [ 58]: 0f9b910c3a4fbdb0 +Block 0002 [ 59]: 4993f4819ce98005 +Block 0002 [ 60]: 1105c2cb4c3b7598 +Block 0002 [ 61]: f3b9a1cd3a053dde +Block 0002 [ 62]: e8af8b90c4a83b69 +Block 0002 [ 63]: 286800e9dd5ac648 +Block 0002 [ 64]: 425e495348603270 +Block 0002 [ 65]: 6b733fe715d77c47 +Block 0002 [ 66]: 53904c6dd1292c20 +Block 0002 [ 67]: a9f9a28c965ab818 +Block 0002 [ 68]: c59a31de2f00853a +Block 0002 [ 69]: afe438e57a6e0844 +Block 0002 [ 70]: bba45d22fb183db2 +Block 0002 [ 71]: b70d940e09e1b81d +Block 0002 [ 72]: 045016066a260fd1 +Block 0002 [ 73]: c77660f79caf487a +Block 0002 [ 74]: 19c598233c14b842 +Block 0002 [ 75]: c3058798c27f4e3f +Block 0002 [ 76]: 934c5db22edcef4a +Block 0002 [ 77]: 19d43250721ba51c +Block 0002 [ 78]: e517cfdcc01e129b +Block 0002 [ 79]: 168875877be5927f +Block 0002 [ 80]: d843abd7e0fdc1b3 +Block 0002 [ 81]: d55ac5e832bb21b3 +Block 0002 [ 82]: ac5c89e63cbe234b +Block 0002 [ 83]: 8a85ec876d0bf705 +Block 0002 [ 84]: 9ee8e11fe4759a5b +Block 0002 [ 85]: 968e7afa1b7420c2 +Block 0002 [ 86]: 6cdf8ac8a603bd9b +Block 0002 [ 87]: 023675d7ec048d55 +Block 0002 [ 88]: 06d17b5a31b1c518 +Block 0002 [ 89]: 2c47c4b74b5f2cf5 +Block 0002 [ 90]: 7191cd7ca21b8ab1 +Block 0002 [ 91]: 25dc32663c7b2174 +Block 0002 [ 92]: 28ec825eb4e3ea38 +Block 0002 [ 93]: 60740a51a33ef788 +Block 0002 [ 94]: c7cceed83266a33b +Block 0002 [ 95]: d84585bcd9baa1bb +Block 0002 [ 96]: 9b6f18b525e9b0d4 +Block 0002 [ 97]: eb54d4b34f780348 +Block 0002 [ 98]: 662009e73ec50ab8 +Block 0002 [ 99]: d1c22cb358cd3261 +Block 0002 [100]: 483f9163b91902b3 +Block 0002 [101]: a419d6e4fc164133 +Block 0002 [102]: 18a5cfa5516933a1 +Block 0002 [103]: 9429b99ee10a2064 +Block 0002 [104]: fb78da9d8ceeec6f +Block 0002 [105]: 9c9e8aef683443b3 +Block 0002 [106]: 4534b4fcba3f2646 +Block 0002 [107]: 0a1cf98c003e2e8f +Block 0002 [108]: 9f6f4800073ad33a +Block 0002 [109]: 22b728fc57a6609d +Block 0002 [110]: e298905fb4d0b68e +Block 0002 [111]: 2bcbdd9a1ce46c9d +Block 0002 [112]: 5c75108e7d6a55b9 +Block 0002 [113]: b605bd1023de8977 +Block 0002 [114]: 1c193d35b61e7d0c +Block 0002 [115]: f48c8741a50be2b2 +Block 0002 [116]: dde78777f41702fe +Block 0002 [117]: aa9668ae6a9b8ee6 +Block 0002 [118]: a4b91d2d5900c5e2 +Block 0002 [119]: b23f93527a5f6abf +Block 0002 [120]: 251cc8db145b7f60 +Block 0002 [121]: 42ffa58f6cae0c6b +Block 0002 [122]: e864e1c5256dd80d +Block 0002 [123]: 2253ebfd92490935 +Block 0002 [124]: 6409cf57bdbd6c68 +Block 0002 [125]: dfec737ab6849a31 +Block 0002 [126]: 894da96427deb540 +Block 0002 [127]: 4acc8d0d859fc71c +Block 0003 [ 0]: 7393659e41c0ffe8 +Block 0003 [ 1]: 2d1775dbb249bb5b +Block 0003 [ 2]: fae4f88f3e535a8b +Block 0003 [ 3]: de1631dcfbbb9157 +Block 0003 [ 4]: 7164b6d1e33a61dc +Block 0003 [ 5]: eb95a004610f2626 +Block 0003 [ 6]: 3ad93611b1c94541 +Block 0003 [ 7]: e7a453ce861ab3ba +Block 0003 [ 8]: 78adac795c376400 +Block 0003 [ 9]: 1afb8e1de9db5a87 +Block 0003 [ 10]: ce384f6674dd212a +Block 0003 [ 11]: 25c4c7c3d3efcb1d +Block 0003 [ 12]: aca174b4ef51cafc +Block 0003 [ 13]: eb1a3eee15c3169c +Block 0003 [ 14]: f85ce6304143c718 +Block 0003 [ 15]: 25cc4e07845bc0d3 +Block 0003 [ 16]: faf52d0c41d56a98 +Block 0003 [ 17]: da5600f13157ef01 +Block 0003 [ 18]: 96acfebd55f2437c +Block 0003 [ 19]: c214c0eb8a6bf5a7 +Block 0003 [ 20]: a8129fd25e9c4a6e +Block 0003 [ 21]: 9f9f490ee4c80129 +Block 0003 [ 22]: dd48fcad213f4121 +Block 0003 [ 23]: a48ea8e66dd84ac8 +Block 0003 [ 24]: 613cde171f240f13 +Block 0003 [ 25]: eace1402be0ad779 +Block 0003 [ 26]: b9d7bdbb30fcf1c8 +Block 0003 [ 27]: 4f135f12be01b425 +Block 0003 [ 28]: 4930fec1d4366e0b +Block 0003 [ 29]: fca833d55bf82ed9 +Block 0003 [ 30]: f2dcd795c9e1e354 +Block 0003 [ 31]: dab4e97ae334a48a +Block 0003 [ 32]: 05facd2a746f4fd7 +Block 0003 [ 33]: b7f5e73d82ede13e +Block 0003 [ 34]: 185a66e8575ac003 +Block 0003 [ 35]: 07c8314d75afa258 +Block 0003 [ 36]: 4b6de5582fbbba66 +Block 0003 [ 37]: 5e6e62eb4ecf1374 +Block 0003 [ 38]: ed59e2b8a754522b +Block 0003 [ 39]: 0cd50f2d238c80a3 +Block 0003 [ 40]: df8eb0346cb94c20 +Block 0003 [ 41]: ff3946e557683c77 +Block 0003 [ 42]: b08b188c5f361337 +Block 0003 [ 43]: 7c2e03108321abf4 +Block 0003 [ 44]: 78c17e33bccec828 +Block 0003 [ 45]: 9882c1219c8d702e +Block 0003 [ 46]: 791761d3870e074f +Block 0003 [ 47]: f2138d034225e07c +Block 0003 [ 48]: 522611a94c109b36 +Block 0003 [ 49]: a20e833c25511dfb +Block 0003 [ 50]: 20e9d9679ea1f760 +Block 0003 [ 51]: b4e3243f0559be69 +Block 0003 [ 52]: 8ec633381fa03a91 +Block 0003 [ 53]: d0cb963269d9698c +Block 0003 [ 54]: fedda033ed8a18a8 +Block 0003 [ 55]: a819c67dcaadb66f +Block 0003 [ 56]: 44319f03fb5dd547 +Block 0003 [ 57]: 754c3e6431751894 +Block 0003 [ 58]: 315467ad4cf190ef +Block 0003 [ 59]: f52ee658a9283a3f +Block 0003 [ 60]: 1ededd0b2ccf557a +Block 0003 [ 61]: 1ecc17875870bf83 +Block 0003 [ 62]: 3f14d3fa1b096cf7 +Block 0003 [ 63]: 4cd38f22d0117ce3 +Block 0003 [ 64]: 47ea92a6ee45f08a +Block 0003 [ 65]: cb1940e42c6993d1 +Block 0003 [ 66]: e6e77ade51a89648 +Block 0003 [ 67]: f577683fa0969dbe +Block 0003 [ 68]: 965466637e9bc32d +Block 0003 [ 69]: 94cb31ff56d5b9c2 +Block 0003 [ 70]: f766a40cdc318679 +Block 0003 [ 71]: 6ad738e65fb2615f +Block 0003 [ 72]: 27a15f49b513b95a +Block 0003 [ 73]: b7c75e1f6085abe1 +Block 0003 [ 74]: 12fb477a2785ab14 +Block 0003 [ 75]: 9592b64a56f72842 +Block 0003 [ 76]: 4400ce28a39a9a75 +Block 0003 [ 77]: 1058b921154e6887 +Block 0003 [ 78]: 901341cb4ef8df1d +Block 0003 [ 79]: 36c23f497125a204 +Block 0003 [ 80]: 9aa0d67ece136823 +Block 0003 [ 81]: 0bed05e22536d381 +Block 0003 [ 82]: de549c999d8e0c63 +Block 0003 [ 83]: 3f17aa1b293c9cf0 +Block 0003 [ 84]: d919d0de04950d58 +Block 0003 [ 85]: 75348400ea415bb8 +Block 0003 [ 86]: 4ccf124c6cfe712b +Block 0003 [ 87]: 39a8740c2720429c +Block 0003 [ 88]: f7698dfaa19b150b +Block 0003 [ 89]: 2b42bd8bc337db2f +Block 0003 [ 90]: 2aaf1982d64484d3 +Block 0003 [ 91]: 3aabe630047c593e +Block 0003 [ 92]: 2fe47f5bb56c5cf2 +Block 0003 [ 93]: cb2d883048b2c4d1 +Block 0003 [ 94]: 41c02dd86a8df448 +Block 0003 [ 95]: d28a5aed127310dc +Block 0003 [ 96]: 16b60a8c47c04a66 +Block 0003 [ 97]: 4665b179132f2186 +Block 0003 [ 98]: 0efe17af99cb9ae1 +Block 0003 [ 99]: df33778d909f84cc +Block 0003 [100]: 5f19ba2c8fa06a0e +Block 0003 [101]: 48fbe0f6122c7253 +Block 0003 [102]: 679cf02d3c42d7c7 +Block 0003 [103]: e4024bf993b5a1d5 +Block 0003 [104]: eaf6463430c49079 +Block 0003 [105]: 86b0f0afa95d3c5e +Block 0003 [106]: e955a61581d56a29 +Block 0003 [107]: 182f40b411056af3 +Block 0003 [108]: 965323563f02b1fe +Block 0003 [109]: 993f4c4f6f92df68 +Block 0003 [110]: 8cfe329259529560 +Block 0003 [111]: 253df070391de9fd +Block 0003 [112]: db2af946400e36dc +Block 0003 [113]: ae825c6ff52dd23b +Block 0003 [114]: c3108ee25e43b626 +Block 0003 [115]: bf02a0a2695652ce +Block 0003 [116]: 2f4d2e01345f8f8c +Block 0003 [117]: 4beb38ab3ad7a2cf +Block 0003 [118]: a927049b5e4d0367 +Block 0003 [119]: 684ff1b489531348 +Block 0003 [120]: 91deb2abe6282716 +Block 0003 [121]: 06a5d16d172ec748 +Block 0003 [122]: 74c6aec814cf0609 +Block 0003 [123]: 1245c8dd2e3be804 +Block 0003 [124]: bc1743e961ba8a2f +Block 0003 [125]: 1b43aa6d4214f09b +Block 0003 [126]: 67b87e4761320e77 +Block 0003 [127]: 15e55998edb32dcd +Block 0004 [ 0]: dc8e74b7fc590eaa +Block 0004 [ 1]: 9d6314b244b500ff +Block 0004 [ 2]: 3350958e5e7f2b09 +Block 0004 [ 3]: ec09ff4db1a6b148 +Block 0004 [ 4]: 9c3f7e2c451e9233 +Block 0004 [ 5]: e59dfa53f9aa9188 +Block 0004 [ 6]: 285cbdae58d70fdc +Block 0004 [ 7]: 9d9b7785a055f7c2 +Block 0004 [ 8]: e3f8faf32897907d +Block 0004 [ 9]: b5ca165b816256ad +Block 0004 [ 10]: c05851fad1b32958 +Block 0004 [ 11]: 52f6fe7a373b24e9 +Block 0004 [ 12]: b24bc961f3fe4019 +Block 0004 [ 13]: 02ffc3b077c07b95 +Block 0004 [ 14]: 3aaeb8c90ffff3a1 +Block 0004 [ 15]: 85fea4be84a3de96 +Block 0004 [ 16]: bd4b0eb6ae514a34 +Block 0004 [ 17]: cf1c358c1d01ce4d +Block 0004 [ 18]: 8c3bdde108df5c56 +Block 0004 [ 19]: 72aece74925a81ad +Block 0004 [ 20]: 5a08715b69113bef +Block 0004 [ 21]: 5c9474489416b531 +Block 0004 [ 22]: 2f0cb5a734c055c3 +Block 0004 [ 23]: b1087159c2f1e1c5 +Block 0004 [ 24]: b80d724159604e3b +Block 0004 [ 25]: 1b5d0f02f6fbddf7 +Block 0004 [ 26]: 8c5eeb140196e051 +Block 0004 [ 27]: 32b225f300b2b693 +Block 0004 [ 28]: 8cd5de71ce325031 +Block 0004 [ 29]: 9a7c5ffccf16b550 +Block 0004 [ 30]: c2b81918ce952de3 +Block 0004 [ 31]: a4e55a59535fa36f +Block 0004 [ 32]: 7f59e3befceb12f4 +Block 0004 [ 33]: 55e8178cedb51f45 +Block 0004 [ 34]: f0b04ee9e6643981 +Block 0004 [ 35]: e256ef0b24da2c69 +Block 0004 [ 36]: 4d1a151fcb27b6a5 +Block 0004 [ 37]: 699a3c78f1675517 +Block 0004 [ 38]: ced57d99187b60e6 +Block 0004 [ 39]: c108cdade276da75 +Block 0004 [ 40]: 99e0eaa3da5c44c2 +Block 0004 [ 41]: dfea1825e0d9a17b +Block 0004 [ 42]: 2cc613916948ea30 +Block 0004 [ 43]: cd819de0ca0212c2 +Block 0004 [ 44]: fac7dccc3e730827 +Block 0004 [ 45]: 105a03d54648fdd8 +Block 0004 [ 46]: 34312385ca673f6a +Block 0004 [ 47]: d0f822d27923ac11 +Block 0004 [ 48]: 100a29a4b1408466 +Block 0004 [ 49]: d6becda85ba0f5fe +Block 0004 [ 50]: 8ad493d4dfffb17d +Block 0004 [ 51]: 8cd3d3573d0bb163 +Block 0004 [ 52]: 43f071e93ad72fb9 +Block 0004 [ 53]: c87652edd33c7917 +Block 0004 [ 54]: 4e29ba26e813d81e +Block 0004 [ 55]: 3bcb08574e586c9a +Block 0004 [ 56]: c297461ec3887f17 +Block 0004 [ 57]: be25299cbbff60eb +Block 0004 [ 58]: 66a8d2171828e4ce +Block 0004 [ 59]: 4118a5209f57988f +Block 0004 [ 60]: b0babff16e382e50 +Block 0004 [ 61]: a0066510d52ada48 +Block 0004 [ 62]: 296ba2db305371b6 +Block 0004 [ 63]: 9f13dac104319d84 +Block 0004 [ 64]: 969cf4839e19a635 +Block 0004 [ 65]: c159007a9e201a66 +Block 0004 [ 66]: e1afcbef7896ecf3 +Block 0004 [ 67]: dce56985c9e55b74 +Block 0004 [ 68]: 06d217e23765ecd6 +Block 0004 [ 69]: 2e107a4e6b1b4855 +Block 0004 [ 70]: 4c56777504e10d30 +Block 0004 [ 71]: 835d33900ba6804b +Block 0004 [ 72]: 16f1261f30e2d4d7 +Block 0004 [ 73]: a0db1f831faa49c7 +Block 0004 [ 74]: 687f791433d3cfd4 +Block 0004 [ 75]: 2b8c8b5a1136b296 +Block 0004 [ 76]: 8b9f1fb39ff29266 +Block 0004 [ 77]: ead12a5b8be281cd +Block 0004 [ 78]: 542a14b6c7b4ca64 +Block 0004 [ 79]: 2ed2d673ff068df7 +Block 0004 [ 80]: 0834c45ece6ad1bd +Block 0004 [ 81]: 728d7efe5d32bad9 +Block 0004 [ 82]: 2b12522c55cffe6e +Block 0004 [ 83]: 3e485f8c32faec76 +Block 0004 [ 84]: 4495227ae0c7151e +Block 0004 [ 85]: 18ac2111c500173c +Block 0004 [ 86]: c305c7e0121db98a +Block 0004 [ 87]: dcedeacc5289d43f +Block 0004 [ 88]: ad0f3edf645cca7d +Block 0004 [ 89]: 7caf7e1cf8a716e5 +Block 0004 [ 90]: e7d28d7d683c41ef +Block 0004 [ 91]: a56b8c0c1a11a92a +Block 0004 [ 92]: b03d46bf8064efe4 +Block 0004 [ 93]: a707cf2d4b81db6f +Block 0004 [ 94]: 5780f483897f5950 +Block 0004 [ 95]: 0ecc14064af2288c +Block 0004 [ 96]: 01097e9ccdd30b9a +Block 0004 [ 97]: 0eda1ee216c84a6d +Block 0004 [ 98]: 537dfc124945de42 +Block 0004 [ 99]: 50517fc114230cac +Block 0004 [100]: 3c6ebe9d7aad9989 +Block 0004 [101]: 0c2f35ef9416183b +Block 0004 [102]: 1f6c86dd8a94640e +Block 0004 [103]: c70c2ce465657a97 +Block 0004 [104]: 047034fbcbcb9b29 +Block 0004 [105]: a1699cfb300ed9db +Block 0004 [106]: 3a6210af581ed116 +Block 0004 [107]: cd1bda027a3d3045 +Block 0004 [108]: 57a5caa0bc28e603 +Block 0004 [109]: 32d5e2ea8b30f6bb +Block 0004 [110]: 9ad895e8ab659736 +Block 0004 [111]: bdd2d25a6ddd70b5 +Block 0004 [112]: b24a12932881d44a +Block 0004 [113]: c02b01e7e74d263d +Block 0004 [114]: aaacd49e4471777c +Block 0004 [115]: 3d52fbae820ec99f +Block 0004 [116]: 916c93831f33935d +Block 0004 [117]: 9c8d5cec1a46aa63 +Block 0004 [118]: ddd4ac54f2291697 +Block 0004 [119]: 6f4468d2424dac96 +Block 0004 [120]: 15b42e0be06acd4e +Block 0004 [121]: 211f17f267cfb716 +Block 0004 [122]: 5094ed716457b202 +Block 0004 [123]: f633d3cf02f40fde +Block 0004 [124]: d4db8368201c498f +Block 0004 [125]: 2db510d98cfaff60 +Block 0004 [126]: b1e33c1b76f95a64 +Block 0004 [127]: df8c2031f482ac8f +Block 0005 [ 0]: 428f586174d3c70b +Block 0005 [ 1]: 8db491dcdebe8485 +Block 0005 [ 2]: 118abae9acec1292 +Block 0005 [ 3]: 0e078f30b1e631f4 +Block 0005 [ 4]: bdfac1c0ea61bb7a +Block 0005 [ 5]: 697bd8973c293700 +Block 0005 [ 6]: 3126ab7646837303 +Block 0005 [ 7]: f92297c907a1996d +Block 0005 [ 8]: 47d61a1d7f4d3325 +Block 0005 [ 9]: 34233a1540aecf67 +Block 0005 [ 10]: 0a46392ba9adc825 +Block 0005 [ 11]: 3d9bd182387ecbf1 +Block 0005 [ 12]: e156dd80f34c7a8c +Block 0005 [ 13]: be9123cc6bc7fe0d +Block 0005 [ 14]: 0672be8310b5b19f +Block 0005 [ 15]: 70e659fa9801eeee +Block 0005 [ 16]: 232dccf29d64f5bd +Block 0005 [ 17]: 92f3d4d13c5f3b43 +Block 0005 [ 18]: e992d055e8cac1f3 +Block 0005 [ 19]: 0525a4986101fba6 +Block 0005 [ 20]: c52ce6dfaaea5448 +Block 0005 [ 21]: ea9bbba9f06706c4 +Block 0005 [ 22]: 3f1b980a74b5d42a +Block 0005 [ 23]: 0a4c3eb9029ef23e +Block 0005 [ 24]: a1854f7401a80884 +Block 0005 [ 25]: 4dad34808194c21e +Block 0005 [ 26]: 1e02a809c838b8c7 +Block 0005 [ 27]: 8eef8cc8b2777486 +Block 0005 [ 28]: 9d1e414a0e247885 +Block 0005 [ 29]: b173e9f80513765a +Block 0005 [ 30]: 76d7e21bb9103ace +Block 0005 [ 31]: fc7db715558ae917 +Block 0005 [ 32]: fb2e166463f57ee9 +Block 0005 [ 33]: 9221afc54f4005ef +Block 0005 [ 34]: 45b88b3514280e3d +Block 0005 [ 35]: b7397620e64fa244 +Block 0005 [ 36]: 6a0fa21bce415918 +Block 0005 [ 37]: d7372a31d4f8d3d5 +Block 0005 [ 38]: b62a1edd3096653b +Block 0005 [ 39]: 3f6cad5032a7538f +Block 0005 [ 40]: 40862cb2bb527ab2 +Block 0005 [ 41]: d8fcabf1cf4a8c22 +Block 0005 [ 42]: 28cb352287c31ba9 +Block 0005 [ 43]: aa329a2b67718671 +Block 0005 [ 44]: fed28d465bb389d3 +Block 0005 [ 45]: 93155bf5106507fa +Block 0005 [ 46]: cdec2bffbabf3f51 +Block 0005 [ 47]: 194b17b5ccf2a0bd +Block 0005 [ 48]: 86ea4fc726fe1946 +Block 0005 [ 49]: 8eede1e171f208ea +Block 0005 [ 50]: dd0ef14e7ddbc0a9 +Block 0005 [ 51]: 22defa92554be18b +Block 0005 [ 52]: 71b1af77aca1137f +Block 0005 [ 53]: b901b61fbd2ee55a +Block 0005 [ 54]: 6eac949e49159e58 +Block 0005 [ 55]: cbe686bfe37766bb +Block 0005 [ 56]: 96f7755a97b83d81 +Block 0005 [ 57]: b3b3373331f8c909 +Block 0005 [ 58]: a8fd4a446f764b7b +Block 0005 [ 59]: 30ecc25bc5774ac5 +Block 0005 [ 60]: 3de797f5cddfbc8c +Block 0005 [ 61]: a467fa0dad2e8e9d +Block 0005 [ 62]: e6dedb97fec747f0 +Block 0005 [ 63]: 6d864b261ffbe29e +Block 0005 [ 64]: 5a20a290b71a73d2 +Block 0005 [ 65]: 4145c2e9c234a5d8 +Block 0005 [ 66]: da79eb6adc2cc4cd +Block 0005 [ 67]: 8d1209074f3917ac +Block 0005 [ 68]: 163d2ce278187e4c +Block 0005 [ 69]: 1cf8c5edfa5ee4da +Block 0005 [ 70]: 620b0a9e1056fcf2 +Block 0005 [ 71]: c2f976ead38341b2 +Block 0005 [ 72]: 2bff264920fce04e +Block 0005 [ 73]: d06343c6d8401fc2 +Block 0005 [ 74]: bfb9fcefa4bb830b +Block 0005 [ 75]: 2d6d546963be975c +Block 0005 [ 76]: 25866cb74e5e4fde +Block 0005 [ 77]: bb3b80728adbb3b8 +Block 0005 [ 78]: 59ffb3a2616f42d9 +Block 0005 [ 79]: 143f6b0612d48202 +Block 0005 [ 80]: dc7fe0f81b2728e7 +Block 0005 [ 81]: 1af6257676192ce4 +Block 0005 [ 82]: 362bc9ab7b4301d2 +Block 0005 [ 83]: b3b27a39ff1b93e2 +Block 0005 [ 84]: 6853a6bf9df6d437 +Block 0005 [ 85]: 27bfa4abf07b49b8 +Block 0005 [ 86]: bf1ecbb4aee2b6fd +Block 0005 [ 87]: 86aca973a86481c4 +Block 0005 [ 88]: 69b6116ecde430f5 +Block 0005 [ 89]: 39e413ab45810fb8 +Block 0005 [ 90]: dd6eea0068811533 +Block 0005 [ 91]: 77645481ca5b3fe1 +Block 0005 [ 92]: 0cd1fd5313e15278 +Block 0005 [ 93]: e6bfdc226276693a +Block 0005 [ 94]: 55421022e9411209 +Block 0005 [ 95]: 55e67f4cdf743c0c +Block 0005 [ 96]: e50ed02e64d454b4 +Block 0005 [ 97]: 0126f30b4983d907 +Block 0005 [ 98]: 53bcd1d00e93215a +Block 0005 [ 99]: 85b504f6ad323e91 +Block 0005 [100]: 6814f10585b91d90 +Block 0005 [101]: 45081065e5591a36 +Block 0005 [102]: 77f70317db7f7de1 +Block 0005 [103]: 57e18ad0cd094219 +Block 0005 [104]: 9b7a484a8a308720 +Block 0005 [105]: 46e1e3b2b52790db +Block 0005 [106]: 305905b73c2cb62e +Block 0005 [107]: cbcc69dc0a0c42f6 +Block 0005 [108]: d7eb3e010ce9bee9 +Block 0005 [109]: f1a6cf342bcdfea8 +Block 0005 [110]: b1618f5b9a9a98f8 +Block 0005 [111]: 8d8d779b3ce5835d +Block 0005 [112]: 9ca21c957973116d +Block 0005 [113]: 64083f3d9d18e4f8 +Block 0005 [114]: 6195ee7bb3ba04e3 +Block 0005 [115]: 97185e5d48380d48 +Block 0005 [116]: 82dbd9fc9e4c0e03 +Block 0005 [117]: e3913fe95965d557 +Block 0005 [118]: e2fa70aef1efe193 +Block 0005 [119]: d336389f1cbb77c0 +Block 0005 [120]: 559a7ab0def81cc1 +Block 0005 [121]: 870601ae9f31df12 +Block 0005 [122]: b045c7c5a43625c2 +Block 0005 [123]: cbdaaeb4c2565c6b +Block 0005 [124]: f83296cfab58be99 +Block 0005 [125]: d637b31caae3b66f +Block 0005 [126]: 9a3a611bb0de8640 +Block 0005 [127]: 958fe6c02727c98a +Block 0006 [ 0]: 13a5f2096ff5ca1f +Block 0006 [ 1]: 1b2f72026e4eb528 +Block 0006 [ 2]: eaa2ba7ac954db30 +Block 0006 [ 3]: b54ba8519e44db4a +Block 0006 [ 4]: c061311fd57a2eab +Block 0006 [ 5]: 83c9d06aa3983ca8 +Block 0006 [ 6]: b0c1008b6073ec65 +Block 0006 [ 7]: eba730c138748909 +Block 0006 [ 8]: b5d15ad429bfbd5a +Block 0006 [ 9]: da277ab755811426 +Block 0006 [ 10]: 65f8da290ecb3661 +Block 0006 [ 11]: fc9a09aeae2cec69 +Block 0006 [ 12]: 002f075123624389 +Block 0006 [ 13]: 5bd0d62a670fb3c8 +Block 0006 [ 14]: a5b1b4c10248f86d +Block 0006 [ 15]: 46dc458c8af1bc5b +Block 0006 [ 16]: b0109567fc2bb44d +Block 0006 [ 17]: 062cc29395ed989b +Block 0006 [ 18]: 908c3833f51a7a8c +Block 0006 [ 19]: 7c8baba41c73d5c8 +Block 0006 [ 20]: a884c98ecfa827f7 +Block 0006 [ 21]: 864b233581cebf3b +Block 0006 [ 22]: a69dc39ed76df5b1 +Block 0006 [ 23]: d287fd37bd184b4b +Block 0006 [ 24]: adcb508656f50a1d +Block 0006 [ 25]: 8345f93a185de052 +Block 0006 [ 26]: 32ee921a5af33f77 +Block 0006 [ 27]: d10349bb3f1a2e60 +Block 0006 [ 28]: 326d8e10ed711927 +Block 0006 [ 29]: f1ea40baf2e29205 +Block 0006 [ 30]: 5ddee886519f975b +Block 0006 [ 31]: 3e00b776de23dbf9 +Block 0006 [ 32]: 09b0fc2bcbc5ca5e +Block 0006 [ 33]: 6c9f8382caaf682b +Block 0006 [ 34]: bbce5e8d97ca0f8a +Block 0006 [ 35]: 94c9eea4942822ac +Block 0006 [ 36]: 09ed551735403790 +Block 0006 [ 37]: f7f7836b8a450424 +Block 0006 [ 38]: e7cc18315c9d0cc3 +Block 0006 [ 39]: e6ad27351c122000 +Block 0006 [ 40]: 60400244ed421285 +Block 0006 [ 41]: c803b2797ce9ead5 +Block 0006 [ 42]: 4fb1724c2afde396 +Block 0006 [ 43]: 62e51ea923c226b8 +Block 0006 [ 44]: c10866f10d269f8e +Block 0006 [ 45]: a291622995a7e4b9 +Block 0006 [ 46]: d457804368b2b68a +Block 0006 [ 47]: fd6bab4757e691bc +Block 0006 [ 48]: bb79b0ae54383df4 +Block 0006 [ 49]: 8775ea6bde327a09 +Block 0006 [ 50]: 0054bbfcce82e402 +Block 0006 [ 51]: 7ec75affa73a4918 +Block 0006 [ 52]: 7a01e09e750bea45 +Block 0006 [ 53]: 1da549e65e8991e6 +Block 0006 [ 54]: 65fff25852256be3 +Block 0006 [ 55]: 6054391646456bac +Block 0006 [ 56]: 75f3b5c0f96b5e33 +Block 0006 [ 57]: 89eebe6001f1afb0 +Block 0006 [ 58]: 98806a81763232bd +Block 0006 [ 59]: 77e23908d1632741 +Block 0006 [ 60]: 0898a711d56a4778 +Block 0006 [ 61]: 154939153173d960 +Block 0006 [ 62]: 279cf70d61ba82e0 +Block 0006 [ 63]: b90121d04bec0415 +Block 0006 [ 64]: 264b25de48cb8bfa +Block 0006 [ 65]: f82c5a6b2a60cde6 +Block 0006 [ 66]: 19d22e2cc1202e8e +Block 0006 [ 67]: fd2af76930971bfb +Block 0006 [ 68]: 1216b5c315238061 +Block 0006 [ 69]: c2e74ba6d227f392 +Block 0006 [ 70]: a9ec024ab42ed537 +Block 0006 [ 71]: aa8a6bcb77dd838a +Block 0006 [ 72]: dcc302dbc34f005d +Block 0006 [ 73]: 0f8b425a61ffee95 +Block 0006 [ 74]: 119c8ec42b470039 +Block 0006 [ 75]: 1e9df7d4fcd392c7 +Block 0006 [ 76]: 58efd0e8e7894f85 +Block 0006 [ 77]: 28bf582abcef94fd +Block 0006 [ 78]: f73f1167a97ff861 +Block 0006 [ 79]: 346d766e03a2ed71 +Block 0006 [ 80]: fc398b655ef68204 +Block 0006 [ 81]: 70e49a4e1c35da2a +Block 0006 [ 82]: 7c88d9a7e02dd08d +Block 0006 [ 83]: 1a242872c6c6501f +Block 0006 [ 84]: 45a6d35f0a769228 +Block 0006 [ 85]: 6ac75dc596984efe +Block 0006 [ 86]: 08a8c6acf1dbd35a +Block 0006 [ 87]: a7c96972f71393b7 +Block 0006 [ 88]: fcde534c13fb4f3a +Block 0006 [ 89]: 6e7791d3dca43b7b +Block 0006 [ 90]: b7e7e7149e54e311 +Block 0006 [ 91]: ae36663b75583d74 +Block 0006 [ 92]: ca29be960080870e +Block 0006 [ 93]: e9ae573efeba7733 +Block 0006 [ 94]: 7666da38d0256d63 +Block 0006 [ 95]: fc8fecc855b22f83 +Block 0006 [ 96]: 17aeb02e5bfd3870 +Block 0006 [ 97]: 523a873983a5fef4 +Block 0006 [ 98]: c517c29248c433ca +Block 0006 [ 99]: 9291190aa889242c +Block 0006 [100]: 5c165c8747de1f4d +Block 0006 [101]: 97e6a8ecc76b2408 +Block 0006 [102]: 0d661557f80eff9d +Block 0006 [103]: 11ff8003a5af2667 +Block 0006 [104]: adbd07f681b3df22 +Block 0006 [105]: 4696fd460dd67114 +Block 0006 [106]: a00ad52b70e15631 +Block 0006 [107]: 1c14750d3d9b138c +Block 0006 [108]: e89f1af55e6919ae +Block 0006 [109]: f3a07ba7492c8b43 +Block 0006 [110]: 6c6a30cf18f5b9a0 +Block 0006 [111]: 112f356d18dce24b +Block 0006 [112]: 90c160c1efaca7ff +Block 0006 [113]: 38a100656072b8ca +Block 0006 [114]: b6d618191ddbe1a1 +Block 0006 [115]: 953791eb67e3e8a4 +Block 0006 [116]: 064ed438e27e27ce +Block 0006 [117]: 513b1cec646ad039 +Block 0006 [118]: 4cbc5de8ec45b103 +Block 0006 [119]: 46905804d90bda25 +Block 0006 [120]: 9949ec8277cf3959 +Block 0006 [121]: 7581ae0071b4de6e +Block 0006 [122]: 4f266c522e844d11 +Block 0006 [123]: cd96ce921dd487e3 +Block 0006 [124]: 3abc3c9a1d0cbee1 +Block 0006 [125]: 666c8582319d34ea +Block 0006 [126]: 0e72bbb45584bf7d +Block 0006 [127]: 2e1c1e750188d265 +Block 0007 [ 0]: 3d6a0d353a582cc3 +Block 0007 [ 1]: 725b5cb52fdcc804 +Block 0007 [ 2]: 0d637aabd89a5f42 +Block 0007 [ 3]: cdd0faf2f954793d +Block 0007 [ 4]: a8a226bdfe9b303b +Block 0007 [ 5]: 5bb2904a4ffd77b0 +Block 0007 [ 6]: a6ff9e1e69e08a3b +Block 0007 [ 7]: 4d765e9f5a455668 +Block 0007 [ 8]: d8f5b730f9e01cb7 +Block 0007 [ 9]: ffc5170716649d8e +Block 0007 [ 10]: cbca0d385f668bb3 +Block 0007 [ 11]: 23124a2f75853cc6 +Block 0007 [ 12]: c266ba9d28147cc0 +Block 0007 [ 13]: 3433fdda5ee50401 +Block 0007 [ 14]: 83b14f2bb79849cc +Block 0007 [ 15]: 4e47b754dd755a6a +Block 0007 [ 16]: 0711503b0e364de1 +Block 0007 [ 17]: 96b399210d06c4bd +Block 0007 [ 18]: e7a0c87f6ce24190 +Block 0007 [ 19]: 952db034322194f7 +Block 0007 [ 20]: bf826ab367d69924 +Block 0007 [ 21]: ca7a0e451f0baedf +Block 0007 [ 22]: bc199a271346d96d +Block 0007 [ 23]: a89504ec33d58563 +Block 0007 [ 24]: 650fe1dd47c229ac +Block 0007 [ 25]: c8b248c48aab400f +Block 0007 [ 26]: 9c79799cb6d7b11e +Block 0007 [ 27]: ca00306b9e70a62f +Block 0007 [ 28]: 7a9afb832313f70d +Block 0007 [ 29]: 7699ea3c8b6d93f3 +Block 0007 [ 30]: 2081b3b9830ada40 +Block 0007 [ 31]: 84dfbb20400b7794 +Block 0007 [ 32]: 09711874dcde8f25 +Block 0007 [ 33]: 2146eefadd811802 +Block 0007 [ 34]: 38ed72bcae48eb1e +Block 0007 [ 35]: 1c780fddf3718799 +Block 0007 [ 36]: ec20a679b1ba8e16 +Block 0007 [ 37]: e2e3779e19f633a5 +Block 0007 [ 38]: 85b74c1f84fceede +Block 0007 [ 39]: 9982bbd5ae9822b6 +Block 0007 [ 40]: 4724c09a0f3a9eb3 +Block 0007 [ 41]: cc4b6ee011d10bf9 +Block 0007 [ 42]: 9c1d3294f23d0f61 +Block 0007 [ 43]: 2c7fbde5e6d9f1ef +Block 0007 [ 44]: 4cb326c5aeb97687 +Block 0007 [ 45]: 5ee9a98967f03584 +Block 0007 [ 46]: 54e070d3f4868d43 +Block 0007 [ 47]: fbed90f1e791fe2b +Block 0007 [ 48]: 5372b297fc080bb2 +Block 0007 [ 49]: f1eea4e6e651fa54 +Block 0007 [ 50]: 18e19f83b3845e8b +Block 0007 [ 51]: 982061488bf2c91e +Block 0007 [ 52]: 000f915b600b1bbf +Block 0007 [ 53]: 551754f75f24f4e2 +Block 0007 [ 54]: 9cb0d725abb977f2 +Block 0007 [ 55]: e41c7bc36ac799d2 +Block 0007 [ 56]: 83d055c7db8eb6a9 +Block 0007 [ 57]: 990206c62219daa6 +Block 0007 [ 58]: 6de34850e119e11f +Block 0007 [ 59]: 5e463ed17b7fec81 +Block 0007 [ 60]: 112ea7aefee3a408 +Block 0007 [ 61]: e0aa67218af846e5 +Block 0007 [ 62]: b85f6a690c0ddb39 +Block 0007 [ 63]: c1934b1adb438156 +Block 0007 [ 64]: c7d07d9d5667e378 +Block 0007 [ 65]: 210e4d69ecfb89e5 +Block 0007 [ 66]: ea7d450766f1afdc +Block 0007 [ 67]: 2f18fda4327f7130 +Block 0007 [ 68]: f3d7c1cc7034f9de +Block 0007 [ 69]: d83b6b3e29f818db +Block 0007 [ 70]: de251265d93d6b4e +Block 0007 [ 71]: bfe371f18fdaf889 +Block 0007 [ 72]: dfe78a1ad4ecd33d +Block 0007 [ 73]: 70bfbe20c89fe34b +Block 0007 [ 74]: dd52d0f45682a779 +Block 0007 [ 75]: fcbbb05bfcb94a23 +Block 0007 [ 76]: b872ebe1c252cf63 +Block 0007 [ 77]: 314c2bdb319a7747 +Block 0007 [ 78]: a966ac152070955b +Block 0007 [ 79]: bf909e5d43b0772b +Block 0007 [ 80]: d3d47c8e0514d23d +Block 0007 [ 81]: 94118497f2ab005e +Block 0007 [ 82]: 1911d0a7cf5af514 +Block 0007 [ 83]: b4a8a52ace59fe3d +Block 0007 [ 84]: 36c35f2fae28046a +Block 0007 [ 85]: 9efc57f45f906003 +Block 0007 [ 86]: 440f5c79192c80b4 +Block 0007 [ 87]: 647e0eb35cdd560f +Block 0007 [ 88]: 34fe5ab26c3ea8b3 +Block 0007 [ 89]: 945b70c653f76a84 +Block 0007 [ 90]: 67cd6bc8159d6ff9 +Block 0007 [ 91]: 2dc4f192345b95ec +Block 0007 [ 92]: f124ffb3359123ab +Block 0007 [ 93]: c4f88c028b3cd129 +Block 0007 [ 94]: a345e2bb55778fe4 +Block 0007 [ 95]: 691f7549a345d348 +Block 0007 [ 96]: 04486d82573ae921 +Block 0007 [ 97]: 98d3114ddc02a162 +Block 0007 [ 98]: 519bdca611bbeaa9 +Block 0007 [ 99]: 8791fba88b020099 +Block 0007 [100]: d514acbe5dfec5bb +Block 0007 [101]: e45d4389e86c7450 +Block 0007 [102]: 3a71f5aa2eb5cd8d +Block 0007 [103]: 80fdc6c491fea6c6 +Block 0007 [104]: b92d709cda9c22e5 +Block 0007 [105]: 59f0a6d67ae30bc3 +Block 0007 [106]: 563e24db351fec9c +Block 0007 [107]: 89319bc5b615c8e2 +Block 0007 [108]: cd24702c8f2b2a4b +Block 0007 [109]: f847342241040fc2 +Block 0007 [110]: fd5471a0f656059c +Block 0007 [111]: 2540eda8a41f5dc7 +Block 0007 [112]: 0938197b41f26a6e +Block 0007 [113]: 74bf1b4f4185530e +Block 0007 [114]: 0e9b724c2ead5c00 +Block 0007 [115]: 5dde068018d59b63 +Block 0007 [116]: 7d2300969b112ade +Block 0007 [117]: d143931a829a962e +Block 0007 [118]: 1130f16e830f47c1 +Block 0007 [119]: 4ca052b7c85637b6 +Block 0007 [120]: 9994f892e4ff0b39 +Block 0007 [121]: 5364a7ef273f73b1 +Block 0007 [122]: 4f17e1310ef3231a +Block 0007 [123]: 7f8a901ea990cf27 +Block 0007 [124]: 45c55fb656b02173 +Block 0007 [125]: 3a1ea5407b7fea45 +Block 0007 [126]: 002bf87dee768e57 +Block 0007 [127]: 2dc7651b0c5583f8 +Block 0008 [ 0]: 742f8fb520ae6daa +Block 0008 [ 1]: fce446d5bc718358 +Block 0008 [ 2]: a93b373872a69d36 +Block 0008 [ 3]: 13e5c9bc2e6affd2 +Block 0008 [ 4]: cc282d9f8703553b +Block 0008 [ 5]: 820575275919b5d9 +Block 0008 [ 6]: 817ea5478b0effd6 +Block 0008 [ 7]: f9881c280744754d +Block 0008 [ 8]: 7fb7b8fc7a1eb8ef +Block 0008 [ 9]: ffd4b707f3d45de2 +Block 0008 [ 10]: dd84ae76abbf5764 +Block 0008 [ 11]: a1021bea15349ebc +Block 0008 [ 12]: dc085965b90ef943 +Block 0008 [ 13]: 31e5c560a7d7b77b +Block 0008 [ 14]: be032148a0c07c8f +Block 0008 [ 15]: a753419700cfc665 +Block 0008 [ 16]: 6ebe31a9f4254abf +Block 0008 [ 17]: 55b9f7db14c8244e +Block 0008 [ 18]: 1a8b2e3ccf030e92 +Block 0008 [ 19]: 82636fca802840dd +Block 0008 [ 20]: f732a1969e172b06 +Block 0008 [ 21]: edd93cf252c26f25 +Block 0008 [ 22]: ac3ad0bbcdd482eb +Block 0008 [ 23]: d75ff2eaa53fd962 +Block 0008 [ 24]: 9c07e2e7b31a5b8e +Block 0008 [ 25]: addda03cda46d7cc +Block 0008 [ 26]: a5bf703a5fb91a4c +Block 0008 [ 27]: 741f1336aec16ba8 +Block 0008 [ 28]: 10182d82ff473a9c +Block 0008 [ 29]: 347fb75292f43be2 +Block 0008 [ 30]: 847b9eb98c312b36 +Block 0008 [ 31]: 33bc3ec0ad10331b +Block 0008 [ 32]: 15b2caf7cb5410db +Block 0008 [ 33]: 0c3550be731282e4 +Block 0008 [ 34]: 5a397cc26fff99fa +Block 0008 [ 35]: b17c5d6e4fd1ede4 +Block 0008 [ 36]: db2fa43068790f57 +Block 0008 [ 37]: 3269f58b18995887 +Block 0008 [ 38]: f47603af7a10d897 +Block 0008 [ 39]: f6d4a7472cf56197 +Block 0008 [ 40]: ef0d98db05c2bbcd +Block 0008 [ 41]: ce3f14c41600ff4b +Block 0008 [ 42]: 32f4c504313caf7d +Block 0008 [ 43]: f3b880db5af93e8f +Block 0008 [ 44]: 0fe500aa73c7088f +Block 0008 [ 45]: aee6e34e64b6cb6e +Block 0008 [ 46]: 3a05bef736d336dc +Block 0008 [ 47]: 6e853605e75f7183 +Block 0008 [ 48]: 206236c8094ebac1 +Block 0008 [ 49]: b35b4b3d8c5fb4ea +Block 0008 [ 50]: 28ecc628dc848c7d +Block 0008 [ 51]: 735c7631822806f4 +Block 0008 [ 52]: 31bb983646cd47f0 +Block 0008 [ 53]: 4bd96277dc02af9e +Block 0008 [ 54]: 70c3b35fda965c73 +Block 0008 [ 55]: 413eefd5bcafb495 +Block 0008 [ 56]: a1f06d3c4204d355 +Block 0008 [ 57]: f2b35ed34d3659ce +Block 0008 [ 58]: 5dbdb39ab57a8787 +Block 0008 [ 59]: d03c3ec335d9a228 +Block 0008 [ 60]: 5e440fcc902494ef +Block 0008 [ 61]: eeae54479b9f6253 +Block 0008 [ 62]: 12b636e97e88b26c +Block 0008 [ 63]: e392640ef6fbfccb +Block 0008 [ 64]: 439779f19e28aed4 +Block 0008 [ 65]: 8586ae7521b5f693 +Block 0008 [ 66]: 4c9c7e32a95bf1a6 +Block 0008 [ 67]: 7bd2f4eb39dd3020 +Block 0008 [ 68]: 486c6934408bedca +Block 0008 [ 69]: 99c8621fd54e9641 +Block 0008 [ 70]: ab95e5111f8a859a +Block 0008 [ 71]: 16c72004f220c79d +Block 0008 [ 72]: deef568d8f11d1ae +Block 0008 [ 73]: 3866577767167f84 +Block 0008 [ 74]: 448c4025a5b6b8c2 +Block 0008 [ 75]: 2601576f5e73029f +Block 0008 [ 76]: 48979d9e18c40aaa +Block 0008 [ 77]: f63696d7e72f4ab2 +Block 0008 [ 78]: e1be44739c6330cb +Block 0008 [ 79]: fcefc4f07881bedc +Block 0008 [ 80]: cb7bcf5fe34c782a +Block 0008 [ 81]: e536242d66e2b5e4 +Block 0008 [ 82]: d52c6c430151e02a +Block 0008 [ 83]: d67a851128f1af4b +Block 0008 [ 84]: 5c40071ed9fbe92d +Block 0008 [ 85]: ffea71996bb4f5c5 +Block 0008 [ 86]: daf4bdc1e45dcfdd +Block 0008 [ 87]: 91d04cfa46997480 +Block 0008 [ 88]: 3055156993a62fe4 +Block 0008 [ 89]: bbc1e67dfdb0f4cd +Block 0008 [ 90]: 39309ec35c7b4b49 +Block 0008 [ 91]: 303f31e117d00073 +Block 0008 [ 92]: 21a92f25e01fb7a0 +Block 0008 [ 93]: 0e0bc2d80d2f294e +Block 0008 [ 94]: 5ddf007474aec619 +Block 0008 [ 95]: 2cb4833140dbb020 +Block 0008 [ 96]: f7cc731050f4146b +Block 0008 [ 97]: d9c3005ec7fc26ac +Block 0008 [ 98]: 608d03d6c052d7e9 +Block 0008 [ 99]: 9dbe4bdff7dd483b +Block 0008 [100]: a735b1afee8074a6 +Block 0008 [101]: d85adbf0d4c585fe +Block 0008 [102]: 3d83720b804a263a +Block 0008 [103]: a9ad69e57cedb183 +Block 0008 [104]: a7d39c61c07eeb38 +Block 0008 [105]: c99c6f286d7b9431 +Block 0008 [106]: b8285a86d03c906b +Block 0008 [107]: df798910bc041924 +Block 0008 [108]: 8c49386589f299a7 +Block 0008 [109]: 45fe92757bf6d8d6 +Block 0008 [110]: 7dba0018b478baee +Block 0008 [111]: 56cf5f3f45a78ace +Block 0008 [112]: 1916dd1b710c89b8 +Block 0008 [113]: b02351109870d936 +Block 0008 [114]: e8ff79a2bd9e3d5d +Block 0008 [115]: d710953fc470a700 +Block 0008 [116]: 9cb71e374ecf8e65 +Block 0008 [117]: 6e95efbaafa1d7ca +Block 0008 [118]: 1d594725c8808490 +Block 0008 [119]: 792ca14862c298f8 +Block 0008 [120]: afa12fb82ecc5ec2 +Block 0008 [121]: ff7287be94d8ab12 +Block 0008 [122]: e36b81492fc2888e +Block 0008 [123]: c30a09066d63a87d +Block 0008 [124]: 6adde8f5e302d407 +Block 0008 [125]: a3d37dcc63d0ce1a +Block 0008 [126]: 5e5a76b9feac9179 +Block 0008 [127]: 38a72e7f58178079 +Block 0009 [ 0]: b0a3780fd2bdce93 +Block 0009 [ 1]: 27e7d325927ac969 +Block 0009 [ 2]: 2f2083aae423aaf9 +Block 0009 [ 3]: b4a06fe202ad3cac +Block 0009 [ 4]: 445f1088b3dc4aa1 +Block 0009 [ 5]: 13857c469c62aedb +Block 0009 [ 6]: afc29cfad94924af +Block 0009 [ 7]: face093366f984d4 +Block 0009 [ 8]: af941754039f0f69 +Block 0009 [ 9]: be3cf961d04b269b +Block 0009 [ 10]: 3570b906c3d08907 +Block 0009 [ 11]: bd2e3cd3bc2820a6 +Block 0009 [ 12]: a4211b9697d1882e +Block 0009 [ 13]: 304cbd04ac5ea0f1 +Block 0009 [ 14]: bc8a44351a93bf06 +Block 0009 [ 15]: dc35dce20205f20e +Block 0009 [ 16]: 27f87fc01a720476 +Block 0009 [ 17]: a7bf7924b4c9514d +Block 0009 [ 18]: 5711917da46d37d5 +Block 0009 [ 19]: 2b7871339e862ec0 +Block 0009 [ 20]: 37d5663947745563 +Block 0009 [ 21]: df99f88b5ad39469 +Block 0009 [ 22]: b8e2f35e53a7cec0 +Block 0009 [ 23]: 564180fd607bb368 +Block 0009 [ 24]: 8cad6f3858da8350 +Block 0009 [ 25]: fb611a961ad95aa5 +Block 0009 [ 26]: 98ef6ba355876428 +Block 0009 [ 27]: 1b32903fac102ee3 +Block 0009 [ 28]: 427ccb260b1e7f48 +Block 0009 [ 29]: 735c3b2404a42461 +Block 0009 [ 30]: 5bed75723136a22b +Block 0009 [ 31]: e962f930dc954571 +Block 0009 [ 32]: d4a907ed721dbd79 +Block 0009 [ 33]: 955bbdda37b3f34a +Block 0009 [ 34]: 8f1fdd908a91bda4 +Block 0009 [ 35]: 7b79831f7e8b8113 +Block 0009 [ 36]: 26a8e6613b3b2b49 +Block 0009 [ 37]: 180e1ee55b199460 +Block 0009 [ 38]: 1ca571295ae0ed7e +Block 0009 [ 39]: 3f5b7ca096599301 +Block 0009 [ 40]: e61f938973523bb8 +Block 0009 [ 41]: 87c36e5e521488f4 +Block 0009 [ 42]: d8d539b4d237e833 +Block 0009 [ 43]: 1ab7390b90a1a274 +Block 0009 [ 44]: bc917b2175e58dcb +Block 0009 [ 45]: a7d934862209853f +Block 0009 [ 46]: 637ca59d567b62e5 +Block 0009 [ 47]: fff021798cdf5193 +Block 0009 [ 48]: 9b19eb391a8ee238 +Block 0009 [ 49]: c11508809ecefdab +Block 0009 [ 50]: 4c86f3d3e42c58f9 +Block 0009 [ 51]: 40310029f5ea5939 +Block 0009 [ 52]: 17b721213f596d4e +Block 0009 [ 53]: 98c4d80ebebd4bd7 +Block 0009 [ 54]: c0a31eddf6a9d7d6 +Block 0009 [ 55]: a1fb4f66485fc6e2 +Block 0009 [ 56]: f11382f56acc85c5 +Block 0009 [ 57]: fa0b75b0a88d10e9 +Block 0009 [ 58]: 12ce42a670ce1fd0 +Block 0009 [ 59]: 76b4da0cef87cc68 +Block 0009 [ 60]: a8d6a4c9e8be9f7a +Block 0009 [ 61]: b907271a2a031157 +Block 0009 [ 62]: 199befa19191d2e4 +Block 0009 [ 63]: b0e40c9c1d56081b +Block 0009 [ 64]: 01e145b266f8de0b +Block 0009 [ 65]: e34b15fa79fa49d7 +Block 0009 [ 66]: 97fd6b6f65bb237e +Block 0009 [ 67]: d406737c4ba4e39e +Block 0009 [ 68]: ca55f8a35aba2d71 +Block 0009 [ 69]: be75c5e31dae69dd +Block 0009 [ 70]: e2f19bb804e76643 +Block 0009 [ 71]: 84c93f1a2d5406de +Block 0009 [ 72]: 71de7e8ea38acc40 +Block 0009 [ 73]: 6045de83dcd55a75 +Block 0009 [ 74]: 5fbb843a3027bc35 +Block 0009 [ 75]: 6a048e3c908d32d2 +Block 0009 [ 76]: e1786cec571f1b02 +Block 0009 [ 77]: b8017677e14f52ad +Block 0009 [ 78]: a9c1c3f396beb68a +Block 0009 [ 79]: 2dee5c5474e27a16 +Block 0009 [ 80]: a33ddec78c2791a2 +Block 0009 [ 81]: c3993ab011a8c326 +Block 0009 [ 82]: 0156139d60d9ef8f +Block 0009 [ 83]: b043451f90b79435 +Block 0009 [ 84]: fe0a7ab213f5c1ba +Block 0009 [ 85]: c938c6c891be1a10 +Block 0009 [ 86]: a622051332acc0d8 +Block 0009 [ 87]: 296927a8758884f9 +Block 0009 [ 88]: 56fd6a2eed0d9492 +Block 0009 [ 89]: 6a015aa7cfef1131 +Block 0009 [ 90]: a6b617e5eec737a2 +Block 0009 [ 91]: 513fc9c9cffdb081 +Block 0009 [ 92]: 735c5b12ec075d55 +Block 0009 [ 93]: 154db0572a26a799 +Block 0009 [ 94]: b52849ae516cbaa0 +Block 0009 [ 95]: 499bf311c6d637c2 +Block 0009 [ 96]: 7cc8a466ca999627 +Block 0009 [ 97]: c0c51ac7a40c09a8 +Block 0009 [ 98]: cc4a21f7d98856df +Block 0009 [ 99]: 2708b57c1aa732d9 +Block 0009 [100]: 288c8a7fa02d1c03 +Block 0009 [101]: bc0a22b5efb71cf7 +Block 0009 [102]: 3deb5b3417c4b18d +Block 0009 [103]: d51bc37c379fa6f5 +Block 0009 [104]: f514be36ce5779a1 +Block 0009 [105]: ea0e5b5b10e84798 +Block 0009 [106]: 79a473516c9e06bc +Block 0009 [107]: d40ede4f6f342260 +Block 0009 [108]: 7377637414121f62 +Block 0009 [109]: 9c494885f3873660 +Block 0009 [110]: 838cb9b3336aa24b +Block 0009 [111]: fa47362cdc574e05 +Block 0009 [112]: a5839dcd7114bd83 +Block 0009 [113]: 78a13f2beb6f9156 +Block 0009 [114]: 288375a664188f4f +Block 0009 [115]: 753c63ed46a2e9fe +Block 0009 [116]: 370dff8650c5b045 +Block 0009 [117]: 7aae6f1745618d97 +Block 0009 [118]: f43c9b5dcfee3f5a +Block 0009 [119]: b0680fd9491ad64c +Block 0009 [120]: 1141e3c369745435 +Block 0009 [121]: 85ca43583cf136a8 +Block 0009 [122]: bc81e26caa3450b8 +Block 0009 [123]: 45ab7b12ba8fa62d +Block 0009 [124]: 1ab06a8decb95464 +Block 0009 [125]: 02ea3e5285e64651 +Block 0009 [126]: 5bf0abfdda4580fd +Block 0009 [127]: 725f7b6cff77c6e0 +Block 0010 [ 0]: 03ddd0d5570954ca +Block 0010 [ 1]: ef3531bd3c791152 +Block 0010 [ 2]: 151dece8403c0d9d +Block 0010 [ 3]: da83b8a08211a3a1 +Block 0010 [ 4]: 74ce6090bbcddce1 +Block 0010 [ 5]: ca859424072c4c37 +Block 0010 [ 6]: 2a28b30cff906536 +Block 0010 [ 7]: eb19f039a6e709c2 +Block 0010 [ 8]: a8d51731be7af8e7 +Block 0010 [ 9]: f7b20930fb8c9e2f +Block 0010 [ 10]: 5817466b12638a27 +Block 0010 [ 11]: 9a148456eddfcfc6 +Block 0010 [ 12]: 809e57c067c64830 +Block 0010 [ 13]: f52a48b3b0a49652 +Block 0010 [ 14]: 46486dbab9e4f52e +Block 0010 [ 15]: d19cfd34073da96c +Block 0010 [ 16]: ae6c8f849700c5fa +Block 0010 [ 17]: bb26de83dc309ddd +Block 0010 [ 18]: 3621501f29e43d7e +Block 0010 [ 19]: 6d49650cb2caf71f +Block 0010 [ 20]: ff570032488b153e +Block 0010 [ 21]: 5f357afb9e6e2a54 +Block 0010 [ 22]: 645e38d8d1b39400 +Block 0010 [ 23]: 0741788f71b54260 +Block 0010 [ 24]: 0cee6a102d995f2d +Block 0010 [ 25]: 2a85c57a64e631e3 +Block 0010 [ 26]: 59f7db1d77c01f84 +Block 0010 [ 27]: 0c8e05b7b0b36d8f +Block 0010 [ 28]: a2e84e8433aef9d8 +Block 0010 [ 29]: 6ffcb0a98564a770 +Block 0010 [ 30]: 304677fa27561674 +Block 0010 [ 31]: cc9189fa4d49edc2 +Block 0010 [ 32]: e8f54aafcc8f43a3 +Block 0010 [ 33]: 46586c9b98c09a8c +Block 0010 [ 34]: 4d35918e1e54a1e3 +Block 0010 [ 35]: 21e45b306f3096b3 +Block 0010 [ 36]: 1efe6f135e4ded82 +Block 0010 [ 37]: ff0fe64bb2ce07d4 +Block 0010 [ 38]: 6ed2ce4f40dfdc7d +Block 0010 [ 39]: 77afc5bf75181a5b +Block 0010 [ 40]: ccd042f31c5ee238 +Block 0010 [ 41]: 52340d666cb68e95 +Block 0010 [ 42]: 97ab16d262602b70 +Block 0010 [ 43]: 1f39fd2aa184e1ed +Block 0010 [ 44]: c7702a1d4d12e238 +Block 0010 [ 45]: 84ceb8d458e0e33d +Block 0010 [ 46]: 9272dae6375d93c3 +Block 0010 [ 47]: d30477baec2da838 +Block 0010 [ 48]: 31bcea37afdc96bc +Block 0010 [ 49]: b6d44bf5e49542e8 +Block 0010 [ 50]: 11f9e05081bc0e28 +Block 0010 [ 51]: c6bb99b0a771061d +Block 0010 [ 52]: e1786981536369f7 +Block 0010 [ 53]: 28e61922e0e07d08 +Block 0010 [ 54]: ff3334fbd1246f0e +Block 0010 [ 55]: 902b19655419b125 +Block 0010 [ 56]: fa397b7ac7afe542 +Block 0010 [ 57]: 1d20f5e5297b3f68 +Block 0010 [ 58]: 7ad196c294115559 +Block 0010 [ 59]: e2df32ba888e23be +Block 0010 [ 60]: d61a690ecabc6747 +Block 0010 [ 61]: f70414d921fec4d8 +Block 0010 [ 62]: 87232a2ce7e819d2 +Block 0010 [ 63]: 48986188e833df7f +Block 0010 [ 64]: 6b691c31cc8cd991 +Block 0010 [ 65]: 3f6ecf0445fc11b4 +Block 0010 [ 66]: e3cf3c583bc686a2 +Block 0010 [ 67]: 4ba77f30caaeddd6 +Block 0010 [ 68]: 120abdd4f3be4414 +Block 0010 [ 69]: 135f1c23fb5fb6f0 +Block 0010 [ 70]: 523ec1b7a2c0dbbc +Block 0010 [ 71]: 68f0591525973d04 +Block 0010 [ 72]: 8dfbef7be78d85a8 +Block 0010 [ 73]: b6914a36a85c30d0 +Block 0010 [ 74]: e543aaa0bf3022fa +Block 0010 [ 75]: cd6a0586a48cbcbd +Block 0010 [ 76]: ecd093c52b48bb8f +Block 0010 [ 77]: 1fb1b6154d0885e9 +Block 0010 [ 78]: 9373b1fddfcd7095 +Block 0010 [ 79]: 839d266721445ca9 +Block 0010 [ 80]: 9eb08685427956ac +Block 0010 [ 81]: 0e67e850943c8234 +Block 0010 [ 82]: 48b1bfefc669f248 +Block 0010 [ 83]: 9ac301131fd1c8c9 +Block 0010 [ 84]: a24208585c03e11e +Block 0010 [ 85]: 3690d7a5278eeb32 +Block 0010 [ 86]: 6b0e1a590041722b +Block 0010 [ 87]: d716ae87093492fe +Block 0010 [ 88]: ed72bf36d55e6044 +Block 0010 [ 89]: eb728fd156a92044 +Block 0010 [ 90]: 73b4ba90f53fed19 +Block 0010 [ 91]: 12775011afcf408c +Block 0010 [ 92]: 4fdf59cac70fe25c +Block 0010 [ 93]: 686695291bcf42a5 +Block 0010 [ 94]: b6830f00eec798ae +Block 0010 [ 95]: 360858c0dcc89f12 +Block 0010 [ 96]: f8e4d23cd8dfe213 +Block 0010 [ 97]: 9c0e60bc54133096 +Block 0010 [ 98]: 4527904c9616d116 +Block 0010 [ 99]: 9c6c29121236d5f8 +Block 0010 [100]: 895f1da7f88403c5 +Block 0010 [101]: 66a84eb06f5d9f70 +Block 0010 [102]: d8c40c8c0fa58c6b +Block 0010 [103]: 1e3334879f0a2c95 +Block 0010 [104]: f5c5e477fce27587 +Block 0010 [105]: 8bf3ccd456124f33 +Block 0010 [106]: 35062f97ca508398 +Block 0010 [107]: 99f2ef47178939f3 +Block 0010 [108]: 25bec767a4353792 +Block 0010 [109]: 65cb0390af523f96 +Block 0010 [110]: f304b1bc4a25b07d +Block 0010 [111]: 38f3a810a5a125b7 +Block 0010 [112]: 550cfb4edbbd1860 +Block 0010 [113]: 1ae72d2f286bb73e +Block 0010 [114]: bdaf0575414d4b9f +Block 0010 [115]: c6c7935c63c31fe8 +Block 0010 [116]: e95b74dd288e34b2 +Block 0010 [117]: b1903cce17b3d187 +Block 0010 [118]: 0146aa1f3ad8af94 +Block 0010 [119]: e5dd909b6501de5f +Block 0010 [120]: 29b549c6418ca13e +Block 0010 [121]: 783588f7cb9812d2 +Block 0010 [122]: 12ebda418bc5d4a6 +Block 0010 [123]: 1c45f811c53c0cfa +Block 0010 [124]: e839adeabc081579 +Block 0010 [125]: c675e569e3e8c008 +Block 0010 [126]: f2fe4a325fbb0afb +Block 0010 [127]: 968e549856139bcf +Block 0011 [ 0]: 4c49fef7ac59b00f +Block 0011 [ 1]: 0b77e546680ba26c +Block 0011 [ 2]: 50f92c0489854697 +Block 0011 [ 3]: 9017915d63b7939f +Block 0011 [ 4]: fa05ffa87d836044 +Block 0011 [ 5]: e3f79adbb7a7a520 +Block 0011 [ 6]: 72daaff6c8d382f8 +Block 0011 [ 7]: e82c1da0c1930016 +Block 0011 [ 8]: 7cd9c05a7d016194 +Block 0011 [ 9]: 4cb21d45b7ccd0e9 +Block 0011 [ 10]: 15ca0a31b3e48180 +Block 0011 [ 11]: 8044760aaec86f6d +Block 0011 [ 12]: b6f642412cf27a8f +Block 0011 [ 13]: 9b60769987b2563c +Block 0011 [ 14]: e0ce63cb590a4ea2 +Block 0011 [ 15]: 94678a3461c13a0c +Block 0011 [ 16]: 84f191a8225d0e4c +Block 0011 [ 17]: 217d697f39654936 +Block 0011 [ 18]: f46ace239ca24436 +Block 0011 [ 19]: 04bdb1e1c224687a +Block 0011 [ 20]: c8246b5f41051cd0 +Block 0011 [ 21]: 816447ddbb3ac9c7 +Block 0011 [ 22]: d758792a4a7137e0 +Block 0011 [ 23]: e682f6f30d1d433b +Block 0011 [ 24]: 0858a63103128803 +Block 0011 [ 25]: 025739918a0a3f53 +Block 0011 [ 26]: a510d28ff33d16ee +Block 0011 [ 27]: 948f5fab13544be2 +Block 0011 [ 28]: 1a4309dbf409b687 +Block 0011 [ 29]: 8038e07e5565f2cd +Block 0011 [ 30]: c5b37d07e8ae12fc +Block 0011 [ 31]: 598afd83af3da73c +Block 0011 [ 32]: 7474f32deaab1535 +Block 0011 [ 33]: e48f764af2a6abcf +Block 0011 [ 34]: f5d7003e1d44ed2f +Block 0011 [ 35]: d724ef97ce8f28ef +Block 0011 [ 36]: 99c664b60d84b037 +Block 0011 [ 37]: e9fde5a58781af6e +Block 0011 [ 38]: b99837a91be9cb19 +Block 0011 [ 39]: 59f96c210e2fa6ac +Block 0011 [ 40]: ccc66eb3fa30a338 +Block 0011 [ 41]: b5c869fd62a7280e +Block 0011 [ 42]: 6e8aa1928d7dc215 +Block 0011 [ 43]: beee10b5278d8d87 +Block 0011 [ 44]: 6b5ed4ed79ed72c5 +Block 0011 [ 45]: 47f7b8798b2f68de +Block 0011 [ 46]: 543a7a6285c3dcc4 +Block 0011 [ 47]: e9d0f798b6d71392 +Block 0011 [ 48]: 46cfa43dbc22d22e +Block 0011 [ 49]: 1819aa20872a5242 +Block 0011 [ 50]: 14722a59b4bb23ff +Block 0011 [ 51]: cfd15dbf15de67cd +Block 0011 [ 52]: 5bff70426ec0d586 +Block 0011 [ 53]: 17cd19e555bac43a +Block 0011 [ 54]: 97d488c659d779da +Block 0011 [ 55]: 27b7a222c598758a +Block 0011 [ 56]: ccd1f8510e13d811 +Block 0011 [ 57]: 08a1336acf0b984a +Block 0011 [ 58]: 7068b21fb1f0d2c7 +Block 0011 [ 59]: 607953cb347f3495 +Block 0011 [ 60]: 1c8d465a07eaa402 +Block 0011 [ 61]: c66d8322c4b00513 +Block 0011 [ 62]: 277e0b3f25be599e +Block 0011 [ 63]: 181e765d17794631 +Block 0011 [ 64]: 915ed3d2877de1f3 +Block 0011 [ 65]: 692a313bbce47822 +Block 0011 [ 66]: b9023d0e3880e18c +Block 0011 [ 67]: 509fd562b469d027 +Block 0011 [ 68]: 2ee478a22da3b588 +Block 0011 [ 69]: fbb7f63122cf790b +Block 0011 [ 70]: ec7efcaba6205527 +Block 0011 [ 71]: b845a0646f3556de +Block 0011 [ 72]: 8bb8eacb976ff0ac +Block 0011 [ 73]: 8c4770b357cae7bb +Block 0011 [ 74]: e7ff1eb9e162b3c4 +Block 0011 [ 75]: 36bcc0ae6999e027 +Block 0011 [ 76]: d11efd1e6572021c +Block 0011 [ 77]: 86ff42cd01884655 +Block 0011 [ 78]: 4223544c88424dfe +Block 0011 [ 79]: 4b365a978fee311e +Block 0011 [ 80]: b12364feb3504070 +Block 0011 [ 81]: df25ceac79a9d96f +Block 0011 [ 82]: 17f4bca97d018e65 +Block 0011 [ 83]: 7246f6585ffb01e3 +Block 0011 [ 84]: a8b42a787c6b6022 +Block 0011 [ 85]: f2a78097b0b0680c +Block 0011 [ 86]: 752878d2782c7fe6 +Block 0011 [ 87]: 9c207d3c31347e90 +Block 0011 [ 88]: 80414cc28ab2a4ea +Block 0011 [ 89]: 939a5979926400f5 +Block 0011 [ 90]: 33ced62c0cf8eadd +Block 0011 [ 91]: e2641df66b2f2e14 +Block 0011 [ 92]: 343c1775a9713f11 +Block 0011 [ 93]: 15cc16374ac1ba54 +Block 0011 [ 94]: fd70d352bf97784f +Block 0011 [ 95]: 0b37018eeed56443 +Block 0011 [ 96]: 27628b3623c0d7d8 +Block 0011 [ 97]: 9313a39ec83b1ef8 +Block 0011 [ 98]: eba1b0a86789a078 +Block 0011 [ 99]: 549000caea6c2a19 +Block 0011 [100]: 246b8e1f709b1997 +Block 0011 [101]: b2499fdf4eff52d3 +Block 0011 [102]: 5b75d183d56dea28 +Block 0011 [103]: 853e211fa80b47f5 +Block 0011 [104]: 1e394452303cc7e8 +Block 0011 [105]: 8dbc8f821b10491b +Block 0011 [106]: e079ff1750b59d87 +Block 0011 [107]: a2d95011a7cf7c4a +Block 0011 [108]: 2f6d3ec06872984e +Block 0011 [109]: 3dc900a76fddb83b +Block 0011 [110]: fc3b3e3ea263f6bd +Block 0011 [111]: bf125c404f604562 +Block 0011 [112]: f79194f3adfd9393 +Block 0011 [113]: 2411362a7fe1ea6b +Block 0011 [114]: 22ba895c0df4f85d +Block 0011 [115]: c323d609ebc0c49c +Block 0011 [116]: 6f463a3c99faa919 +Block 0011 [117]: 84a00b8d7d5c20f5 +Block 0011 [118]: de2a24e2fb01945e +Block 0011 [119]: c14cc040ea714c20 +Block 0011 [120]: 84d876ac2e6173dd +Block 0011 [121]: 1cbe9815d0686423 +Block 0011 [122]: 0ab7fd6174e1bd51 +Block 0011 [123]: 76723d2beaaaf60f +Block 0011 [124]: e325ac3fb53fd90e +Block 0011 [125]: d773e4e19cc5b1ba +Block 0011 [126]: 2606fe90ceae82c1 +Block 0011 [127]: 228177ea8ed3ae89 +Block 0012 [ 0]: 1aa1f692b06591fe +Block 0012 [ 1]: 4ff66d69e7f3dd1c +Block 0012 [ 2]: 22c65efa4de36bf5 +Block 0012 [ 3]: a23b7f7edc05f69b +Block 0012 [ 4]: 02b0d70fa75a03c1 +Block 0012 [ 5]: 91a77e9c3938b41b +Block 0012 [ 6]: 01cd41809dded109 +Block 0012 [ 7]: f53382e6636f33de +Block 0012 [ 8]: 6d7f6a41e3560432 +Block 0012 [ 9]: d3beb64a595da5ab +Block 0012 [ 10]: 99dbe85c7dbf4eb3 +Block 0012 [ 11]: ac35273dd506ae67 +Block 0012 [ 12]: 76cc23ae6fe61472 +Block 0012 [ 13]: ac8f7d015d195a2c +Block 0012 [ 14]: c16e060450d1c5eb +Block 0012 [ 15]: 35a65ce2284ad0bb +Block 0012 [ 16]: 75389162f3327070 +Block 0012 [ 17]: e4a3379341461be6 +Block 0012 [ 18]: 734e3e9b0686dd0f +Block 0012 [ 19]: a2a2e80d0cf4dfaa +Block 0012 [ 20]: c6b14a60cfe360eb +Block 0012 [ 21]: 5f8d57f1d33c0144 +Block 0012 [ 22]: 5a7e396a6af6843d +Block 0012 [ 23]: 6d7a624d09556dfc +Block 0012 [ 24]: 4c175bf98ecd2b49 +Block 0012 [ 25]: d5297a8f57909d9d +Block 0012 [ 26]: a28975f58c2c59c9 +Block 0012 [ 27]: 3d8ee5d5caf9a91f +Block 0012 [ 28]: 430284948e2f06a8 +Block 0012 [ 29]: bc43c1cc56889cc5 +Block 0012 [ 30]: 97e712988e3a8b65 +Block 0012 [ 31]: a765e883df64b236 +Block 0012 [ 32]: 80dd97974d89bb83 +Block 0012 [ 33]: edcd7d4ab1718307 +Block 0012 [ 34]: 4c4cb5a8b9572ba2 +Block 0012 [ 35]: d7cc67bfc5484140 +Block 0012 [ 36]: 412863409d76bc0f +Block 0012 [ 37]: 8578c23a7d2742d3 +Block 0012 [ 38]: d6ba907e11fdaf70 +Block 0012 [ 39]: e41fdecb460897e3 +Block 0012 [ 40]: 550ebdb79d17f607 +Block 0012 [ 41]: 97a58453deb8a8ef +Block 0012 [ 42]: 237fc5519b9df07e +Block 0012 [ 43]: 357f19eedd0671f3 +Block 0012 [ 44]: b4b36cff5d679fda +Block 0012 [ 45]: bbc57b82f19ec6b0 +Block 0012 [ 46]: 9bb37ab02ce546be +Block 0012 [ 47]: 5f287acb1eaf68fc +Block 0012 [ 48]: 91107640cc7d0324 +Block 0012 [ 49]: a581af8774b2d68c +Block 0012 [ 50]: a73ce0d9e372c914 +Block 0012 [ 51]: 1fad2663947a6aa4 +Block 0012 [ 52]: 76bf7c2bef22fd78 +Block 0012 [ 53]: 2509b1a0ea1dd03f +Block 0012 [ 54]: 8a821d14ef35edbd +Block 0012 [ 55]: de48bc86661813ad +Block 0012 [ 56]: 2d12a49f8604079c +Block 0012 [ 57]: 6a841f234644afe3 +Block 0012 [ 58]: d2483a08b415b399 +Block 0012 [ 59]: 27fc874f14e55938 +Block 0012 [ 60]: 5d065817f04bf0fb +Block 0012 [ 61]: c21d5ee69cb65292 +Block 0012 [ 62]: 220b745cd78a8810 +Block 0012 [ 63]: c195af564cee2365 +Block 0012 [ 64]: 44f41833b93c1409 +Block 0012 [ 65]: ee9bf5e3123d0ab1 +Block 0012 [ 66]: 1194671b1341d19c +Block 0012 [ 67]: 9f26c3e94e234394 +Block 0012 [ 68]: d4eef2a61a8b6d4e +Block 0012 [ 69]: 0ac0b767072c4bf0 +Block 0012 [ 70]: 49ba7457a25f77f9 +Block 0012 [ 71]: 061dcba9406ff132 +Block 0012 [ 72]: f606b0e4b069928b +Block 0012 [ 73]: 3969b0cb47226af0 +Block 0012 [ 74]: 0aecdd23eab0f972 +Block 0012 [ 75]: e6a58eac70e044e8 +Block 0012 [ 76]: 270102338cb46cf6 +Block 0012 [ 77]: 22aeeac757cf607f +Block 0012 [ 78]: 1f228e34a8200d4d +Block 0012 [ 79]: 5e17277e4c10da0c +Block 0012 [ 80]: 5c88ae3dd3ea5417 +Block 0012 [ 81]: aad3d6b90c9a5620 +Block 0012 [ 82]: 1a5b3da07620b085 +Block 0012 [ 83]: c2b0ef4813ca090f +Block 0012 [ 84]: e7da9456205e044e +Block 0012 [ 85]: 96603c1683fb8124 +Block 0012 [ 86]: 25964d0131ece98e +Block 0012 [ 87]: 6692fa3c89ba0117 +Block 0012 [ 88]: bbcd1c40386e9fe1 +Block 0012 [ 89]: 8f96217bf8888393 +Block 0012 [ 90]: caf344b6650d2a8a +Block 0012 [ 91]: f3a842ccd3049b9d +Block 0012 [ 92]: 91e8af127f1ac37c +Block 0012 [ 93]: 60545d67f008014f +Block 0012 [ 94]: 610241b298102ec2 +Block 0012 [ 95]: 2fee36def2bcff5b +Block 0012 [ 96]: 96fd68d0e794897e +Block 0012 [ 97]: d208840dabc9d601 +Block 0012 [ 98]: e779e8f69cea5961 +Block 0012 [ 99]: a269dc901338443f +Block 0012 [100]: 0e87928cf416e99d +Block 0012 [101]: 8703d89cf0d3c7dc +Block 0012 [102]: 04def1cf5bef1ed9 +Block 0012 [103]: 13a87535ed94991c +Block 0012 [104]: b18452f74892b6aa +Block 0012 [105]: 4566d6996833aae0 +Block 0012 [106]: 9d2abd6fbcaceaae +Block 0012 [107]: 87517fc9e8b71e10 +Block 0012 [108]: 7846bada74ea3e86 +Block 0012 [109]: 832ce5b17274725a +Block 0012 [110]: 02d2923df96b12ce +Block 0012 [111]: fdfe0934a666c96d +Block 0012 [112]: 298bd9e467374d73 +Block 0012 [113]: 8db6e9c331b259b7 +Block 0012 [114]: b078a0eed2399812 +Block 0012 [115]: f7bba7f1bc418e5a +Block 0012 [116]: a95ac6d79c0221e4 +Block 0012 [117]: 73a71076b1880da2 +Block 0012 [118]: 5adf0a09f1bb7192 +Block 0012 [119]: 2fb1f63708d9b8ae +Block 0012 [120]: 0133e7c0e200a44b +Block 0012 [121]: f0c57cf2307571bb +Block 0012 [122]: fe8091f400d827e8 +Block 0012 [123]: a59343d47427e4ee +Block 0012 [124]: 31a936eed5ba7aa1 +Block 0012 [125]: e02ae76007527fc7 +Block 0012 [126]: 920785762df5bb3b +Block 0012 [127]: 578d1590559f9bdf +Block 0013 [ 0]: f9c15bd16c03239a +Block 0013 [ 1]: 85c0830339123a93 +Block 0013 [ 2]: afdec9a3430ee91a +Block 0013 [ 3]: 3aacac9cc4d9ed29 +Block 0013 [ 4]: 73278ef5208157fa +Block 0013 [ 5]: 1bc7ef529b5106c7 +Block 0013 [ 6]: 3309f9a85af31610 +Block 0013 [ 7]: 22bd82aad0437be0 +Block 0013 [ 8]: 332b11e289b2c3ca +Block 0013 [ 9]: 3b7efd6c480aab26 +Block 0013 [ 10]: 417f05eb1907725d +Block 0013 [ 11]: 24aed9811501da12 +Block 0013 [ 12]: fa537149a94750ba +Block 0013 [ 13]: 204a652aefa4e11d +Block 0013 [ 14]: 0bc3743c3b55dd7c +Block 0013 [ 15]: 49d71f9813bff428 +Block 0013 [ 16]: 27ef1ffa06e74a46 +Block 0013 [ 17]: 6abc24120f0c5b51 +Block 0013 [ 18]: 6cb123ac54b47ba4 +Block 0013 [ 19]: ae6a1e638e9ff6c0 +Block 0013 [ 20]: c12e5f4396f2b198 +Block 0013 [ 21]: 44549a8d343ab2bf +Block 0013 [ 22]: 49d5c59cc5ad6279 +Block 0013 [ 23]: b150f0724fc9b595 +Block 0013 [ 24]: f6e668a1af287f10 +Block 0013 [ 25]: 978c9313f02db8ff +Block 0013 [ 26]: 44789c797bed7560 +Block 0013 [ 27]: 1a96a5cf8d93929a +Block 0013 [ 28]: 9e8be9f3e5d17933 +Block 0013 [ 29]: 2eaf1e47ac0301c0 +Block 0013 [ 30]: a0e9fd0333d0fdf8 +Block 0013 [ 31]: 6a1f57508f7cf676 +Block 0013 [ 32]: 5f8d891ef567e252 +Block 0013 [ 33]: 1c24d2d0405e9bea +Block 0013 [ 34]: f1cf892b940462b4 +Block 0013 [ 35]: c43a6a871f5bdf30 +Block 0013 [ 36]: 7ca36bd207fda755 +Block 0013 [ 37]: 637d10dc44ee9657 +Block 0013 [ 38]: 6c3ba081af2c0c7a +Block 0013 [ 39]: a06156952886a451 +Block 0013 [ 40]: af5b9ae79550be4f +Block 0013 [ 41]: cfe7e3f7553433fc +Block 0013 [ 42]: 663cf8c55395264d +Block 0013 [ 43]: df7d30f272a46648 +Block 0013 [ 44]: 52565c59a983e2fd +Block 0013 [ 45]: 498707d1fb7a34e6 +Block 0013 [ 46]: 07a0757f9c76308a +Block 0013 [ 47]: 94e5798cef5748ca +Block 0013 [ 48]: 29c7689628e47c77 +Block 0013 [ 49]: 666547f5e5fbeaa0 +Block 0013 [ 50]: 49fe73222e065ab8 +Block 0013 [ 51]: 90d3cb7aece83cd9 +Block 0013 [ 52]: 234c16b21152d734 +Block 0013 [ 53]: 4e0f90f6a27d7d22 +Block 0013 [ 54]: 1a05d1a632b40370 +Block 0013 [ 55]: 985c7083435a8efb +Block 0013 [ 56]: 3962e05f618794cd +Block 0013 [ 57]: 734869661b5fad03 +Block 0013 [ 58]: 2f1d7666c26ef446 +Block 0013 [ 59]: bfb1ae896e4e66d6 +Block 0013 [ 60]: 5a3de7e5a0109719 +Block 0013 [ 61]: 626e36b1d0227c80 +Block 0013 [ 62]: 56c6109f4ffcd0fb +Block 0013 [ 63]: b90afc0a10791c1b +Block 0013 [ 64]: cdf40c151d47cbcf +Block 0013 [ 65]: 5212985d06f9803b +Block 0013 [ 66]: 86cce1587e82760c +Block 0013 [ 67]: 0f59e40dd4a7ec7e +Block 0013 [ 68]: eafc94430abe1f46 +Block 0013 [ 69]: d36c0e649d807ce2 +Block 0013 [ 70]: 57359cb98984b375 +Block 0013 [ 71]: 9f88333017ca8db6 +Block 0013 [ 72]: 1ef21abda65283b1 +Block 0013 [ 73]: 5b0b594338cb86ad +Block 0013 [ 74]: fc731c46858c4ad1 +Block 0013 [ 75]: f64b50653b123e97 +Block 0013 [ 76]: 4149e7bd3a8470dc +Block 0013 [ 77]: 810e51e831465239 +Block 0013 [ 78]: f223087791f47a5d +Block 0013 [ 79]: 6c375e1931df8730 +Block 0013 [ 80]: 0100dbd0e057cc2e +Block 0013 [ 81]: f70f8d61903f1969 +Block 0013 [ 82]: 08fc0da85e396251 +Block 0013 [ 83]: 2a538b02ae7d725c +Block 0013 [ 84]: b931a0cd7ad0af88 +Block 0013 [ 85]: e1bd9d0b2f53a9d7 +Block 0013 [ 86]: 76a341bc4aa349d0 +Block 0013 [ 87]: a529fce1c81e5153 +Block 0013 [ 88]: 63ef9d0b98124056 +Block 0013 [ 89]: c373059cdc3572c7 +Block 0013 [ 90]: 01fb3a4f4ce7b133 +Block 0013 [ 91]: 9c66c972692b09ad +Block 0013 [ 92]: c53255d410600bc6 +Block 0013 [ 93]: 14b9732a02daf5b6 +Block 0013 [ 94]: 396145830be7495f +Block 0013 [ 95]: 3187b2c21159f8d5 +Block 0013 [ 96]: a4e6df14aab4e467 +Block 0013 [ 97]: bc6c30500b613487 +Block 0013 [ 98]: e425c128f3fc06ad +Block 0013 [ 99]: 00545969fecdecc5 +Block 0013 [100]: 16a6082af5d25051 +Block 0013 [101]: 7b85adbd0a0b6781 +Block 0013 [102]: dc26cbeaaef7e3dd +Block 0013 [103]: 336a70650266e766 +Block 0013 [104]: 32ed681b360c3949 +Block 0013 [105]: dc6e83279d1061ab +Block 0013 [106]: f91da0a8b878c95d +Block 0013 [107]: 0beded6e5fcf6e23 +Block 0013 [108]: 0a262ed8436feb78 +Block 0013 [109]: a5b40f4468eed7a7 +Block 0013 [110]: b847a08fdd793947 +Block 0013 [111]: aedc1a4f95a80dbe +Block 0013 [112]: 321990b100f7c3e1 +Block 0013 [113]: c4d432cfbfb9ab49 +Block 0013 [114]: 7c1170d1453c684f +Block 0013 [115]: a77231522e4e7dce +Block 0013 [116]: e550d48f25611525 +Block 0013 [117]: e15fa2d871cb0666 +Block 0013 [118]: 625f0384c0dc09b9 +Block 0013 [119]: b5250d90664a29a1 +Block 0013 [120]: 3aa32adb69a6345f +Block 0013 [121]: 02fdae236288d0c7 +Block 0013 [122]: 7a760f94c41fb1f0 +Block 0013 [123]: 271282628e3fa3cd +Block 0013 [124]: c8131439d46a63e2 +Block 0013 [125]: 7afecdfd7821b924 +Block 0013 [126]: ee89bbe949c8804a +Block 0013 [127]: 7d15b9bc5a9241cb +Block 0014 [ 0]: a5fdb0379a2f67d1 +Block 0014 [ 1]: 4beccebadf13863c +Block 0014 [ 2]: 320d12b68b90e6be +Block 0014 [ 3]: 13b641fd6d1efddf +Block 0014 [ 4]: 5b64455f318e2dda +Block 0014 [ 5]: eb13edb9301764b7 +Block 0014 [ 6]: 7fb8e26f439e07cf +Block 0014 [ 7]: aad045eb983f729d +Block 0014 [ 8]: 7591d32caace7a43 +Block 0014 [ 9]: 8cb56fd7d3a1dcaa +Block 0014 [ 10]: 2cee1c68916a5758 +Block 0014 [ 11]: f72675fd1db957ca +Block 0014 [ 12]: 8f50f81824c9d070 +Block 0014 [ 13]: 5c4a051906547aaa +Block 0014 [ 14]: abde12eff8d4accd +Block 0014 [ 15]: 4a3cd15a48309dd6 +Block 0014 [ 16]: b69f970728e49140 +Block 0014 [ 17]: 1e1d9f854d8f75e5 +Block 0014 [ 18]: 8f13af133409471f +Block 0014 [ 19]: b7bbe727c90d9940 +Block 0014 [ 20]: 084a0defba13b012 +Block 0014 [ 21]: 078a024f9a13985c +Block 0014 [ 22]: 4c4c857f1f41f895 +Block 0014 [ 23]: 65bf4adab2fef170 +Block 0014 [ 24]: 61043bcf823addea +Block 0014 [ 25]: 01624a2a8889b77c +Block 0014 [ 26]: 5d513fe269c69198 +Block 0014 [ 27]: 16ce6daefe16dff8 +Block 0014 [ 28]: ae432bdac36c8a33 +Block 0014 [ 29]: c1de50c14bff375b +Block 0014 [ 30]: 57ee0d43ca409b6d +Block 0014 [ 31]: 001b5c41bc8a142e +Block 0014 [ 32]: 05cb8870e0b6086a +Block 0014 [ 33]: 5e7fa65b44b5a0c1 +Block 0014 [ 34]: 9c0c022e7c44739b +Block 0014 [ 35]: 8afde623afa779b4 +Block 0014 [ 36]: aa62668c188c901f +Block 0014 [ 37]: 4a0ad8711f40d437 +Block 0014 [ 38]: 227f69c54bf24cc2 +Block 0014 [ 39]: 9f8adbbe51dba14e +Block 0014 [ 40]: db44d83fa3b1d22e +Block 0014 [ 41]: c0f52cfbf369e5e0 +Block 0014 [ 42]: 8afd0b618bbf57b6 +Block 0014 [ 43]: 7ce708b422a4d051 +Block 0014 [ 44]: 9d47e802dc2a20a6 +Block 0014 [ 45]: c1f9652d8aee4eb0 +Block 0014 [ 46]: e862b0f9b6ab04c5 +Block 0014 [ 47]: 7cbdcb786d9c09de +Block 0014 [ 48]: 9a6cb37bddf2994d +Block 0014 [ 49]: 066ba841fa982410 +Block 0014 [ 50]: b4834a5707446e93 +Block 0014 [ 51]: cbfd37b56b781d90 +Block 0014 [ 52]: 296422ed06aaf2fe +Block 0014 [ 53]: b7977369fb47dd7f +Block 0014 [ 54]: 4503cd512f4f4028 +Block 0014 [ 55]: b44be03eac8f1fe1 +Block 0014 [ 56]: de3e3843100887d5 +Block 0014 [ 57]: 841cde4ce1d478c1 +Block 0014 [ 58]: ef725829892bcf5b +Block 0014 [ 59]: 8c4711ae368a72f5 +Block 0014 [ 60]: 53f0c71e38996687 +Block 0014 [ 61]: 41343b02dd8918e0 +Block 0014 [ 62]: 163283289fc722c9 +Block 0014 [ 63]: 01f2edede3c311e2 +Block 0014 [ 64]: 3fee9f2a8e2a8b0f +Block 0014 [ 65]: eaddca9f92035fa7 +Block 0014 [ 66]: c2a5277a46b3d9a8 +Block 0014 [ 67]: 634d95c58a63f283 +Block 0014 [ 68]: c47f081c88252fa2 +Block 0014 [ 69]: 904598e94495e0f5 +Block 0014 [ 70]: de689c2cfdc93c35 +Block 0014 [ 71]: bc058f656bef83a3 +Block 0014 [ 72]: 277c81509b3a6492 +Block 0014 [ 73]: bfecc6ad2847e452 +Block 0014 [ 74]: ee9cd7661778e71d +Block 0014 [ 75]: 7269eeab79003bf8 +Block 0014 [ 76]: ed88284a12b40d91 +Block 0014 [ 77]: 38a44ea62830a48c +Block 0014 [ 78]: 50d4aeb04809ea4e +Block 0014 [ 79]: b6d1b62b6b61937c +Block 0014 [ 80]: e8fbd7a0a6a9cea2 +Block 0014 [ 81]: 6958ff333ec80f17 +Block 0014 [ 82]: e894f15fb0abbab4 +Block 0014 [ 83]: cfbc02b2b06f8570 +Block 0014 [ 84]: 16cbaf773bf6e396 +Block 0014 [ 85]: 433bf2178262bf74 +Block 0014 [ 86]: 4df3a7ddabcebe8d +Block 0014 [ 87]: e92be4c401ccfa93 +Block 0014 [ 88]: d240cb8553fddff1 +Block 0014 [ 89]: 6396abb129c242a8 +Block 0014 [ 90]: 6e5a0ebf21156ff2 +Block 0014 [ 91]: 18b1d13bc9a30466 +Block 0014 [ 92]: 6368abbcdf6200b7 +Block 0014 [ 93]: 06e4d85eeae027dd +Block 0014 [ 94]: 74f3b09e191a8044 +Block 0014 [ 95]: a268ac0b727fe78b +Block 0014 [ 96]: 99f122b534e05fff +Block 0014 [ 97]: a860f26176823324 +Block 0014 [ 98]: ba7001ec057bdb68 +Block 0014 [ 99]: 63939774ca16cfc2 +Block 0014 [100]: bde7382f581de0de +Block 0014 [101]: 5225abbd7ca6bca8 +Block 0014 [102]: 88bfeda187528739 +Block 0014 [103]: ce9cb2a4d37873b7 +Block 0014 [104]: c85e0d170a16c786 +Block 0014 [105]: 705da215f97650da +Block 0014 [106]: 2538d74c16c8b6f6 +Block 0014 [107]: 3874bbcf85fe90ee +Block 0014 [108]: b91302b8f95e7800 +Block 0014 [109]: 85e59179b9bf2022 +Block 0014 [110]: e9773eafb420456f +Block 0014 [111]: a47f001781f19c2b +Block 0014 [112]: 46454b1b9811a851 +Block 0014 [113]: b622271e1e2346d1 +Block 0014 [114]: 215a5b75946f1355 +Block 0014 [115]: 0587f9fc3a3c2852 +Block 0014 [116]: 822ac16b0b07c3f2 +Block 0014 [117]: 363d4a260faa6131 +Block 0014 [118]: da569af084477b41 +Block 0014 [119]: fc7f20711ba4bf93 +Block 0014 [120]: 03255c99b59bd605 +Block 0014 [121]: 7dad82e9edae62bb +Block 0014 [122]: 71c0d73ea0908b90 +Block 0014 [123]: a34100e60a9ffbcb +Block 0014 [124]: edf05e0466f0e9cc +Block 0014 [125]: 6074b7aadb934a82 +Block 0014 [126]: 0a43a6e248912fd5 +Block 0014 [127]: 721d743314b6c59e +Block 0015 [ 0]: 6d40e87b8bbde68f +Block 0015 [ 1]: 5b90b02701c6ac80 +Block 0015 [ 2]: ce69aea584dac7a8 +Block 0015 [ 3]: 36cdd095ff0ff8d1 +Block 0015 [ 4]: de2ebcab7a438efc +Block 0015 [ 5]: 63e8709d10ecc3ac +Block 0015 [ 6]: 55cb9a18dab1d954 +Block 0015 [ 7]: 1507cff847848c71 +Block 0015 [ 8]: 1ccb861fbfc73c93 +Block 0015 [ 9]: 8c602a61b71e21dc +Block 0015 [ 10]: cfa87e439e758061 +Block 0015 [ 11]: bec7416cd772e599 +Block 0015 [ 12]: d7c68f196290b1cf +Block 0015 [ 13]: b3096ac4559e59d0 +Block 0015 [ 14]: 0ad10c64be9f9fbb +Block 0015 [ 15]: 8d59cc7c21f19fcf +Block 0015 [ 16]: e91efaa013a95b96 +Block 0015 [ 17]: 9a03aa23ee3ba180 +Block 0015 [ 18]: eb32afc653478bff +Block 0015 [ 19]: a993fc583751e9cb +Block 0015 [ 20]: e3b0246060a99012 +Block 0015 [ 21]: f96ac45a92c850ba +Block 0015 [ 22]: 548f1ff503119696 +Block 0015 [ 23]: 4479e6768506cdf5 +Block 0015 [ 24]: adcb44b753d48a61 +Block 0015 [ 25]: 97502483be77491b +Block 0015 [ 26]: 71fdbdd6b3769957 +Block 0015 [ 27]: f29fc96be6293883 +Block 0015 [ 28]: e7174c1b6cc33adf +Block 0015 [ 29]: c184b1c64ff3b2db +Block 0015 [ 30]: a08aa1da589ab43d +Block 0015 [ 31]: 97e85b9d3047be3e +Block 0015 [ 32]: 96929ff762408129 +Block 0015 [ 33]: aa8fa4af6720c65e +Block 0015 [ 34]: 5173b01272e389e1 +Block 0015 [ 35]: 97f40c7a887f7c65 +Block 0015 [ 36]: 07a2c0b90d5fbb9f +Block 0015 [ 37]: 0b4a888385bf6feb +Block 0015 [ 38]: 55c595b5297af0c0 +Block 0015 [ 39]: 534de9d4148ff660 +Block 0015 [ 40]: e1b2bd3e60767725 +Block 0015 [ 41]: e18662d315858833 +Block 0015 [ 42]: 4f39b642a465e587 +Block 0015 [ 43]: 9e7becfafea3a026 +Block 0015 [ 44]: 16bf66c4ce23a1d1 +Block 0015 [ 45]: 20d5eaa56dd0741b +Block 0015 [ 46]: f8389306df16ba8d +Block 0015 [ 47]: ca21d3ab3d5d9710 +Block 0015 [ 48]: d05e1b82cde9a7ee +Block 0015 [ 49]: 1b331a7ba4cbc44f +Block 0015 [ 50]: 3ab05714733e107b +Block 0015 [ 51]: 1ba0f22a6cacdccf +Block 0015 [ 52]: bef4345f3257cbab +Block 0015 [ 53]: dba354b6d105240e +Block 0015 [ 54]: 14860ea4ea9fa764 +Block 0015 [ 55]: c786947cbd54ba7e +Block 0015 [ 56]: c10a16322b02197f +Block 0015 [ 57]: a75e04a69f57a273 +Block 0015 [ 58]: 6a3d360f5d12a0e0 +Block 0015 [ 59]: 2d900aa01b4f1bc6 +Block 0015 [ 60]: 8e0b3af575027d01 +Block 0015 [ 61]: bebb2efa06d1b9b1 +Block 0015 [ 62]: 5041ec43eb8490ad +Block 0015 [ 63]: 02a0af26ec1cc245 +Block 0015 [ 64]: 315bd384780fb7dc +Block 0015 [ 65]: a6b78138e78ebca5 +Block 0015 [ 66]: e1e841cc673c6f59 +Block 0015 [ 67]: 92a63873ca308d4b +Block 0015 [ 68]: c475e47bc9375047 +Block 0015 [ 69]: 55a415c1b2a64d2d +Block 0015 [ 70]: bd814528ff874150 +Block 0015 [ 71]: a22ce025019fe9b9 +Block 0015 [ 72]: c07a7d13cc18bc6d +Block 0015 [ 73]: a42d2eedd8795c17 +Block 0015 [ 74]: 5944b7401cb892bb +Block 0015 [ 75]: 06b693ce393f7a31 +Block 0015 [ 76]: 30a523f276e03f66 +Block 0015 [ 77]: cc4cc7da45cb0629 +Block 0015 [ 78]: eb8a9cfac1608630 +Block 0015 [ 79]: c6827ec6db8fc29e +Block 0015 [ 80]: 72db1dde804b4e38 +Block 0015 [ 81]: 1d571faed8775322 +Block 0015 [ 82]: db5d406859784a76 +Block 0015 [ 83]: a5cc6c320631d459 +Block 0015 [ 84]: bc1b71dc3dc99f3d +Block 0015 [ 85]: 2316181ceed14d5c +Block 0015 [ 86]: 163d4f8beef254bc +Block 0015 [ 87]: d995b178a01e876c +Block 0015 [ 88]: b1f98f1d674c1514 +Block 0015 [ 89]: 7720ff1b73b9351e +Block 0015 [ 90]: ebedc7cd44c49577 +Block 0015 [ 91]: 8ed0d18c9c651634 +Block 0015 [ 92]: 7607fbdd198df036 +Block 0015 [ 93]: bbd9fd5b855b09f2 +Block 0015 [ 94]: 2b22bd2c4b0b39a7 +Block 0015 [ 95]: ba01fa0a17a1c7d7 +Block 0015 [ 96]: a26884728102cc54 +Block 0015 [ 97]: 984b67908d3a81ff +Block 0015 [ 98]: c7f618616a70b82a +Block 0015 [ 99]: 12084588cfa8b58b +Block 0015 [100]: e092eb391447359d +Block 0015 [101]: 3fc930be1935e61e +Block 0015 [102]: b26307005d1da4bc +Block 0015 [103]: 3c8b67e192736c4f +Block 0015 [104]: d630223907f9e1e7 +Block 0015 [105]: 5374c6efe2b8eb09 +Block 0015 [106]: 97acf57cd17738ce +Block 0015 [107]: 8170ce0222a7d000 +Block 0015 [108]: f70f5759aa53c360 +Block 0015 [109]: 60d7f3dec8f2ed62 +Block 0015 [110]: 789ae05a72878fac +Block 0015 [111]: 8d0afe37a8a13c61 +Block 0015 [112]: 1be773bd9b02f826 +Block 0015 [113]: d8858dceedd7e08d +Block 0015 [114]: 091aefbac72d8dad +Block 0015 [115]: 715b0c3d6bf488d9 +Block 0015 [116]: 11a401aeea39c245 +Block 0015 [117]: c71592475b7e2423 +Block 0015 [118]: e31b245bd5db158e +Block 0015 [119]: 1cdc0a528374eb3d +Block 0015 [120]: 75430ad2bebc3613 +Block 0015 [121]: 4df59d2626d82756 +Block 0015 [122]: 9b1226ce1e040731 +Block 0015 [123]: 33c1eb07bb17933b +Block 0015 [124]: c1c1837f4169196e +Block 0015 [125]: 474ff21ff2f94dbc +Block 0015 [126]: 851a9566610580c4 +Block 0015 [127]: 51ec2fcccdf48948 +Block 0016 [ 0]: 40173703c87730b2 +Block 0016 [ 1]: 467d38684f4c1c2a +Block 0016 [ 2]: 544062a527017b3e +Block 0016 [ 3]: 6f0706930c3c8ab0 +Block 0016 [ 4]: dc88053cfb45150b +Block 0016 [ 5]: 03884a54d2a29367 +Block 0016 [ 6]: 7a469b12d499697b +Block 0016 [ 7]: d54e0c405db9c12d +Block 0016 [ 8]: d6596bb2c7fbcb83 +Block 0016 [ 9]: e8ee63ceed57b956 +Block 0016 [ 10]: 3e510ed4a0c6aa29 +Block 0016 [ 11]: 782c2218330cbe22 +Block 0016 [ 12]: 95cb34607c5c6b15 +Block 0016 [ 13]: c3c9fb56dc22953b +Block 0016 [ 14]: 31f210a4cbcb2e4e +Block 0016 [ 15]: fb774215bd05f2fc +Block 0016 [ 16]: 1dce685944aa421c +Block 0016 [ 17]: 4455d28ad719716b +Block 0016 [ 18]: a8457a7fa7886bb8 +Block 0016 [ 19]: 798797d430101d64 +Block 0016 [ 20]: 7e5fee56cb31897c +Block 0016 [ 21]: 78580647125afa2a +Block 0016 [ 22]: f1bb1314ec84446b +Block 0016 [ 23]: b3fe6f51468c2893 +Block 0016 [ 24]: d1d4bdbe33707ead +Block 0016 [ 25]: bc6c03983cd4c708 +Block 0016 [ 26]: 57d747066891bb95 +Block 0016 [ 27]: bb4e9045fc3cb5ea +Block 0016 [ 28]: 614d2cf35a1f5655 +Block 0016 [ 29]: 04ae5d12ec440130 +Block 0016 [ 30]: 7d4f84adf2e6cb85 +Block 0016 [ 31]: 3a17a1a6cea939b1 +Block 0016 [ 32]: d2d6c3d261ac8e68 +Block 0016 [ 33]: cabd3dee2829e407 +Block 0016 [ 34]: 266220332527521c +Block 0016 [ 35]: 9551806567a27ff0 +Block 0016 [ 36]: d225b25411c7e2b6 +Block 0016 [ 37]: b259687bc0bd2f67 +Block 0016 [ 38]: 04845596cd58d81c +Block 0016 [ 39]: 4b0ad9bd79c5d18f +Block 0016 [ 40]: d902866ba26a936a +Block 0016 [ 41]: 404b11de86b46f03 +Block 0016 [ 42]: bd61fb21e5e12b7b +Block 0016 [ 43]: 6b1d2f923b434ab1 +Block 0016 [ 44]: 52c2dea3f21f8a13 +Block 0016 [ 45]: 140eebf3b69ee5bb +Block 0016 [ 46]: dd70de78b3c18b81 +Block 0016 [ 47]: ae7a74172565ac79 +Block 0016 [ 48]: 0dbad089af3e5104 +Block 0016 [ 49]: 8216ff935f515ebd +Block 0016 [ 50]: 1daa44a8acbd2140 +Block 0016 [ 51]: 9e5d3a46a80d13c9 +Block 0016 [ 52]: 8bb8019be2408232 +Block 0016 [ 53]: ffd311c5ea02f66f +Block 0016 [ 54]: 155ce4e0b5ed7634 +Block 0016 [ 55]: b5eaee0502427f59 +Block 0016 [ 56]: 7f426fa00393b3a1 +Block 0016 [ 57]: e13553aba4647bf1 +Block 0016 [ 58]: 93d7bf7dbbbf3ae9 +Block 0016 [ 59]: e69d740f7b2dad2d +Block 0016 [ 60]: 344d4eda5a81b335 +Block 0016 [ 61]: df65fb114c75b1be +Block 0016 [ 62]: 1990683f992d7c47 +Block 0016 [ 63]: 21073b4cbd089892 +Block 0016 [ 64]: 2dcb4d5b039d877d +Block 0016 [ 65]: c29429c9541f38a7 +Block 0016 [ 66]: 7f80e51bc2fe8e28 +Block 0016 [ 67]: f54f4cd646199cac +Block 0016 [ 68]: 85b2a1246ab1163b +Block 0016 [ 69]: daf60fc6375d3ad0 +Block 0016 [ 70]: 57e42e8d98f42fa0 +Block 0016 [ 71]: 0fb9391186b290ee +Block 0016 [ 72]: 959b7e51136817d1 +Block 0016 [ 73]: 5217b619c2d274c8 +Block 0016 [ 74]: b7c6978fc62db8c1 +Block 0016 [ 75]: 4554cc5aedf4af57 +Block 0016 [ 76]: 904db36c16602741 +Block 0016 [ 77]: 0abe05da8a2cb8e6 +Block 0016 [ 78]: 045614eb1b418847 +Block 0016 [ 79]: 32ae1dd042f49d68 +Block 0016 [ 80]: 99972d932984c765 +Block 0016 [ 81]: 4f469863eed3aa0a +Block 0016 [ 82]: ebc14e989ec8a561 +Block 0016 [ 83]: d8e7b72f71320e9f +Block 0016 [ 84]: 1c608b5af0726e22 +Block 0016 [ 85]: bbb551c4d1a9c4aa +Block 0016 [ 86]: acaef7a072fbfa03 +Block 0016 [ 87]: 20c4a900f3892aea +Block 0016 [ 88]: 4b161fcd5b15c8e6 +Block 0016 [ 89]: 426665ce2c0eeffe +Block 0016 [ 90]: 761fc26cafc86c26 +Block 0016 [ 91]: 8797c94e662ea9cc +Block 0016 [ 92]: 7bebc3c35e97780a +Block 0016 [ 93]: a579cfea019fe5d8 +Block 0016 [ 94]: 263bc7f813fa3bb9 +Block 0016 [ 95]: 45ef8c26eec2f7bb +Block 0016 [ 96]: 8a1e6d34c4cc77e8 +Block 0016 [ 97]: 27867f3613e4151d +Block 0016 [ 98]: c7db41cc0f06e783 +Block 0016 [ 99]: b4d76f059af6a433 +Block 0016 [100]: 40ee3aae849418c4 +Block 0016 [101]: 4bd4fc211c3a5c11 +Block 0016 [102]: 7da2668816494939 +Block 0016 [103]: 9e181a446642e6b7 +Block 0016 [104]: 8bda7cc03635fed7 +Block 0016 [105]: f816837b21b1806a +Block 0016 [106]: b30434f84336b715 +Block 0016 [107]: aaf97b333edca150 +Block 0016 [108]: 389485ffaad002cf +Block 0016 [109]: 8cbbfcd6ee186d33 +Block 0016 [110]: 3157b6dc9703b052 +Block 0016 [111]: 8b61c9bb15a97ad1 +Block 0016 [112]: 541844a6ef92801b +Block 0016 [113]: cd602e55c4497811 +Block 0016 [114]: 9ffd4436922d562c +Block 0016 [115]: f6a1f699a4599a18 +Block 0016 [116]: 01f4899e74a1d96c +Block 0016 [117]: 2ec1db479e5068a8 +Block 0016 [118]: bb0aa1fd26e19701 +Block 0016 [119]: 9b0786b32e156f06 +Block 0016 [120]: 5c30b07b934b48b7 +Block 0016 [121]: 3fd71c69e216b478 +Block 0016 [122]: 2e3d1d9b8b50f1f5 +Block 0016 [123]: 3f08a23d0830d1fd +Block 0016 [124]: b0499ad41f985e8d +Block 0016 [125]: ff70aeb3c2042aa6 +Block 0016 [126]: 4f79c964d3b38194 +Block 0016 [127]: 5f6535da90f53fb0 +Block 0017 [ 0]: 86dbf93ac3f80ebb +Block 0017 [ 1]: 2e0f2348ef2a155f +Block 0017 [ 2]: 0c4bb02597d00e8f +Block 0017 [ 3]: c6c302f463f13815 +Block 0017 [ 4]: e3ded630c721ae3b +Block 0017 [ 5]: 7c6410264643d2bf +Block 0017 [ 6]: c8e6e7102a26eb72 +Block 0017 [ 7]: 1915981300f3e25a +Block 0017 [ 8]: 8124aee938f2e8e7 +Block 0017 [ 9]: e971f39f0f644121 +Block 0017 [ 10]: 59b43310ff96f407 +Block 0017 [ 11]: 286319e85551fca5 +Block 0017 [ 12]: 74f4b2e706b20793 +Block 0017 [ 13]: 4ef0995dbff8d698 +Block 0017 [ 14]: 672a0541cf6e284b +Block 0017 [ 15]: dc96b4f476e7dee4 +Block 0017 [ 16]: 04a3cab22b85ff42 +Block 0017 [ 17]: ff0686a07cdca700 +Block 0017 [ 18]: 270bcda7065b6f36 +Block 0017 [ 19]: 8c5aed656f5257f8 +Block 0017 [ 20]: 2c694af32afaa420 +Block 0017 [ 21]: b7efae2361fd9dca +Block 0017 [ 22]: a527d0442a27a2ca +Block 0017 [ 23]: 159bf5aec6801f9c +Block 0017 [ 24]: 2fe99d0a7a7a6295 +Block 0017 [ 25]: ee6b6bbc10147795 +Block 0017 [ 26]: e8084f19550df76e +Block 0017 [ 27]: 63f3006ee592f0f3 +Block 0017 [ 28]: 6e7e7dd76106ea8c +Block 0017 [ 29]: 1488f210ed13602c +Block 0017 [ 30]: 5e9ff9270b0f5998 +Block 0017 [ 31]: ecbe1b3dbc8fc452 +Block 0017 [ 32]: cfd00abc7288fe28 +Block 0017 [ 33]: c460d10f01afe872 +Block 0017 [ 34]: 310843ff07177aed +Block 0017 [ 35]: ad4250b39e5a3502 +Block 0017 [ 36]: 656b54c454d2799b +Block 0017 [ 37]: 283ad8ce0753a41a +Block 0017 [ 38]: 8e69119059c57e58 +Block 0017 [ 39]: e8f339918afcf668 +Block 0017 [ 40]: 7172af6f36048460 +Block 0017 [ 41]: b1c6dcbb9bddc1e5 +Block 0017 [ 42]: ca25138560e0fd17 +Block 0017 [ 43]: c9187f543edfda65 +Block 0017 [ 44]: a20f9c88217536ab +Block 0017 [ 45]: e79d7d866f58d1b2 +Block 0017 [ 46]: 60039cdb76c295bc +Block 0017 [ 47]: 7fc953ce20b4af5f +Block 0017 [ 48]: 9eddbaa0058e131e +Block 0017 [ 49]: 5358296bd7a8f481 +Block 0017 [ 50]: a294668fd156d187 +Block 0017 [ 51]: 4e1423f5dc8827b6 +Block 0017 [ 52]: 0fed19a28e94d868 +Block 0017 [ 53]: 0c146f0ea97c2112 +Block 0017 [ 54]: 2923e8273ea54165 +Block 0017 [ 55]: c3e4cc115c57262d +Block 0017 [ 56]: b56a6e6f678fee68 +Block 0017 [ 57]: f3fae0ae2f09963d +Block 0017 [ 58]: eee2522b29737f05 +Block 0017 [ 59]: a207b298ef42b43d +Block 0017 [ 60]: 11a8f66bd4e22116 +Block 0017 [ 61]: 1c779bd8fa6bc463 +Block 0017 [ 62]: 6ed3d931275742d8 +Block 0017 [ 63]: 1acccf1c25c8574c +Block 0017 [ 64]: ea218800c030bd5c +Block 0017 [ 65]: b281e866406d231f +Block 0017 [ 66]: 0a94d7e48cd315b2 +Block 0017 [ 67]: afad93e2c88678bf +Block 0017 [ 68]: a4162b1541509f99 +Block 0017 [ 69]: d175f3bfe10cd670 +Block 0017 [ 70]: cba9fc2d548a01ae +Block 0017 [ 71]: e75e284c1c1a6083 +Block 0017 [ 72]: 2e4de0030e96358b +Block 0017 [ 73]: 714abf82a6e46c19 +Block 0017 [ 74]: 85ad2cfc6a8c7494 +Block 0017 [ 75]: d0ec0ff6a6e67854 +Block 0017 [ 76]: 257716a22e9cd988 +Block 0017 [ 77]: d72bb2bbc1694cdc +Block 0017 [ 78]: 7d2f54f06ed5f7bf +Block 0017 [ 79]: 7b02bb7cff05c815 +Block 0017 [ 80]: 493ca9570cdc1295 +Block 0017 [ 81]: 5fe4695940b889f5 +Block 0017 [ 82]: e42a80ea4be3cf58 +Block 0017 [ 83]: acba6f12179237a0 +Block 0017 [ 84]: 54046ed072a24683 +Block 0017 [ 85]: 1cf396162f7fe889 +Block 0017 [ 86]: 5c38a95c20a92398 +Block 0017 [ 87]: 0e26d36d6da00deb +Block 0017 [ 88]: 23f81145834c1082 +Block 0017 [ 89]: 5acae8767d95deca +Block 0017 [ 90]: a9d31c468300ddfe +Block 0017 [ 91]: d9b88af5c50cce46 +Block 0017 [ 92]: 37fa64e447e04020 +Block 0017 [ 93]: 2f7e076fc6dfd078 +Block 0017 [ 94]: b3cec9629d0deb36 +Block 0017 [ 95]: cc32bd7f4e7e9863 +Block 0017 [ 96]: b9aa3faa53bb0446 +Block 0017 [ 97]: 164ec64fcf81b584 +Block 0017 [ 98]: 34db7b26f3adca23 +Block 0017 [ 99]: 60196d64d2557550 +Block 0017 [100]: 5961b2f87d8ca589 +Block 0017 [101]: 1dfde0a6c0ccfbac +Block 0017 [102]: 2021c1740985d1a2 +Block 0017 [103]: 68b03224a5176ed4 +Block 0017 [104]: 36f11e2333501345 +Block 0017 [105]: 8e3f0518cf21c19c +Block 0017 [106]: 099a9f02563790b4 +Block 0017 [107]: f362f11b2efa6862 +Block 0017 [108]: 8ca6c4c97cc05f21 +Block 0017 [109]: 7c4a03dac87e4a9a +Block 0017 [110]: 3d401182bfae8e61 +Block 0017 [111]: 7ea885226fbbca06 +Block 0017 [112]: c3ed29c1b310b105 +Block 0017 [113]: 226e574ad2807ca2 +Block 0017 [114]: 56a513a2e353b82b +Block 0017 [115]: 9892fb94743ef93d +Block 0017 [116]: 24d14208ba945517 +Block 0017 [117]: 4fa0137b08a9a442 +Block 0017 [118]: 7dd70ce2ff2d0d57 +Block 0017 [119]: 6c19e2a32da81b67 +Block 0017 [120]: 0bcbb994195db761 +Block 0017 [121]: e34a4009f6bf3310 +Block 0017 [122]: b6575c391e05249a +Block 0017 [123]: ae0e26a5eeb66912 +Block 0017 [124]: 0bb87ddc0deb2b72 +Block 0017 [125]: 3be928c16a8d0b6b +Block 0017 [126]: 652748f115f4e754 +Block 0017 [127]: d0e359ef4d4f00af +Block 0018 [ 0]: 2aa5674fd1d8b40d +Block 0018 [ 1]: dbb9a569c03adf3c +Block 0018 [ 2]: 602a4a56802fb8ac +Block 0018 [ 3]: a9cefa9a07a02258 +Block 0018 [ 4]: 0983afffb71d58c1 +Block 0018 [ 5]: 4b64d1fb17618ef1 +Block 0018 [ 6]: 749a26d465aa0dd7 +Block 0018 [ 7]: 4a49a8308965e8c5 +Block 0018 [ 8]: 138fa766f93ea8c2 +Block 0018 [ 9]: 425c687587361644 +Block 0018 [ 10]: 7a1f4d575267c8f2 +Block 0018 [ 11]: 08c1c26e0511b1fb +Block 0018 [ 12]: 058b385ba386aebf +Block 0018 [ 13]: 2c65bfef8e4ee46a +Block 0018 [ 14]: d1f832ad7b80f7fa +Block 0018 [ 15]: 336ff88cc3d6951a +Block 0018 [ 16]: 7816362d30a559d4 +Block 0018 [ 17]: beabe02fbc7ae8a7 +Block 0018 [ 18]: c81e862255ea507e +Block 0018 [ 19]: c691eb61b2454b13 +Block 0018 [ 20]: bbda0810c15390f5 +Block 0018 [ 21]: d5f89bdfe8dcbea3 +Block 0018 [ 22]: 8ba98c6aca3f7890 +Block 0018 [ 23]: 4f8195b2abf68b50 +Block 0018 [ 24]: f244d7e00977c5b8 +Block 0018 [ 25]: 52d3e3893693be21 +Block 0018 [ 26]: d6ac75864a0a4b09 +Block 0018 [ 27]: 31737d76eeec0dac +Block 0018 [ 28]: 4343172dd2a3ed5f +Block 0018 [ 29]: a441605208364aa5 +Block 0018 [ 30]: 3f8e47e2b7bce73d +Block 0018 [ 31]: d6359b6b2f9e2a3c +Block 0018 [ 32]: 3b2561edb34f5eed +Block 0018 [ 33]: ccdd079b16d4c46e +Block 0018 [ 34]: fe2c16a3fbdeea17 +Block 0018 [ 35]: c8daa941845adf98 +Block 0018 [ 36]: ef7869ec52a59512 +Block 0018 [ 37]: e26ff84a493d7c7e +Block 0018 [ 38]: 9c0caa9fcc3df665 +Block 0018 [ 39]: 6c5281eaa7710399 +Block 0018 [ 40]: d0cda1785aa88e4e +Block 0018 [ 41]: a31d1beb969b45dc +Block 0018 [ 42]: 12afc4a7accbd8a2 +Block 0018 [ 43]: 56469fb7998e6378 +Block 0018 [ 44]: 01386c5908479b8b +Block 0018 [ 45]: 687415ab506cbc68 +Block 0018 [ 46]: 9d563191292a4dce +Block 0018 [ 47]: 7e1c8c7260b9c1e4 +Block 0018 [ 48]: 20a3a6d3018ab012 +Block 0018 [ 49]: 3bced6b3c5b1ed84 +Block 0018 [ 50]: aa8dcefad634e58b +Block 0018 [ 51]: 161ddb6e3d7d69f4 +Block 0018 [ 52]: 7039fa10ea0bbff0 +Block 0018 [ 53]: 32723d06737af10a +Block 0018 [ 54]: e84317749f1191e4 +Block 0018 [ 55]: 18c17d76251cd254 +Block 0018 [ 56]: e7bbacff780165c9 +Block 0018 [ 57]: a63258d3e9173063 +Block 0018 [ 58]: 9d845b2cdad3ae6c +Block 0018 [ 59]: 80863609a8080239 +Block 0018 [ 60]: aeb0108c57b35b0c +Block 0018 [ 61]: c3a6d8bfefbb126b +Block 0018 [ 62]: f9f3331294e28d63 +Block 0018 [ 63]: fff56675d44f84f4 +Block 0018 [ 64]: 2736d955ba5d90ba +Block 0018 [ 65]: 644358fe1ab9760e +Block 0018 [ 66]: 9ff9e6feaa53f66c +Block 0018 [ 67]: 9696bc3da3b68444 +Block 0018 [ 68]: 1367438ef5ff3c7e +Block 0018 [ 69]: 4845f05a87410ac9 +Block 0018 [ 70]: bec2379c4ee5d144 +Block 0018 [ 71]: 03de245819472430 +Block 0018 [ 72]: 1db9b5a009b81841 +Block 0018 [ 73]: c25196560bf2d51b +Block 0018 [ 74]: 0425d7bc03de37d5 +Block 0018 [ 75]: ed46c9003fe5cb7a +Block 0018 [ 76]: e1b1f09579ebf515 +Block 0018 [ 77]: 2e7c57b4160cf29b +Block 0018 [ 78]: f0304fe252d819e4 +Block 0018 [ 79]: 371a020d72b7d98f +Block 0018 [ 80]: 36e9b0cf530d0498 +Block 0018 [ 81]: 317ef0425f37e93a +Block 0018 [ 82]: 45c467bcd49da881 +Block 0018 [ 83]: 0e21ff32aec0927b +Block 0018 [ 84]: 8883c2b4291f6b51 +Block 0018 [ 85]: 708b49a444fe2ece +Block 0018 [ 86]: 8a8c752afa03aee1 +Block 0018 [ 87]: 9dafb4fcc13de535 +Block 0018 [ 88]: 8d7a457d16d7f49f +Block 0018 [ 89]: d3513c7f9cad018b +Block 0018 [ 90]: 03144dd828027e10 +Block 0018 [ 91]: c07fad863376caa3 +Block 0018 [ 92]: 8500f36e4cee0ceb +Block 0018 [ 93]: c597ca6cb805cbd2 +Block 0018 [ 94]: c05fb437b61b48da +Block 0018 [ 95]: 35145b4938a63b8c +Block 0018 [ 96]: 8bf9ebddcd0b7fb5 +Block 0018 [ 97]: d6668784244b88c5 +Block 0018 [ 98]: 45731fd06dfa60d4 +Block 0018 [ 99]: 7bf4cd52329f58f1 +Block 0018 [100]: 94afb89c3a052416 +Block 0018 [101]: e49c7c68d4c95176 +Block 0018 [102]: 0d046d2ae897f269 +Block 0018 [103]: 734d9e676f1d0600 +Block 0018 [104]: edb5c8933b81f706 +Block 0018 [105]: 9cdeadfc91f1ff95 +Block 0018 [106]: 33020a25481ff5f7 +Block 0018 [107]: 7afa457afdac3306 +Block 0018 [108]: 9122d216bc3de7c8 +Block 0018 [109]: e14dba25e7e091d8 +Block 0018 [110]: 62be3b4921bae56d +Block 0018 [111]: 45d8c7083076ca76 +Block 0018 [112]: 1b689948b01eeda1 +Block 0018 [113]: 4cefb70309c448fa +Block 0018 [114]: 6cdf7eb1412871a4 +Block 0018 [115]: 42cf57fdbd83ac27 +Block 0018 [116]: a566c79afba194e8 +Block 0018 [117]: c9918575e10df83a +Block 0018 [118]: a078bd2b5a6a3c9f +Block 0018 [119]: dc319fc197b36ae7 +Block 0018 [120]: 23d759be6893d7a4 +Block 0018 [121]: f8a1237465ab3c9b +Block 0018 [122]: cd47410ab3c90d76 +Block 0018 [123]: c3bfee20feb23cfb +Block 0018 [124]: b2f1f976ea8568d5 +Block 0018 [125]: e65206d65f01a1ae +Block 0018 [126]: 1b8f1facf8bb69eb +Block 0018 [127]: 44e81cb05a43dab5 +Block 0019 [ 0]: aa3e76015aa2c41a +Block 0019 [ 1]: cb622c70b808c1d5 +Block 0019 [ 2]: a0146068353cd441 +Block 0019 [ 3]: 7ccebe1e3e2e35d1 +Block 0019 [ 4]: b5fea95156ff6d79 +Block 0019 [ 5]: 77ef49a16920b5eb +Block 0019 [ 6]: c4774d26e217a901 +Block 0019 [ 7]: 1edca7593da10df0 +Block 0019 [ 8]: cb9d48e8bae900c9 +Block 0019 [ 9]: efaa7c38141f0935 +Block 0019 [ 10]: 2c24a8490894b89d +Block 0019 [ 11]: ef59dde9dc3f69e1 +Block 0019 [ 12]: 3e479bcc6807b6a2 +Block 0019 [ 13]: 1db94891d8de2438 +Block 0019 [ 14]: a9db4d224f6ab5ad +Block 0019 [ 15]: 616c6a1d422efe6c +Block 0019 [ 16]: adf176d6d1263636 +Block 0019 [ 17]: d82b220f874f7265 +Block 0019 [ 18]: c59dd97d04e43007 +Block 0019 [ 19]: 9a3b357237af7443 +Block 0019 [ 20]: 4a2c70a326668106 +Block 0019 [ 21]: 755df7a100e7f66c +Block 0019 [ 22]: d48f9b0e6440cfc9 +Block 0019 [ 23]: ca32b8caf8c8944b +Block 0019 [ 24]: fdb2e9c116686001 +Block 0019 [ 25]: 0b5bb6b191036570 +Block 0019 [ 26]: f5f2990e2ef67cc0 +Block 0019 [ 27]: c98661687f4685be +Block 0019 [ 28]: 65f6a375c3c611f8 +Block 0019 [ 29]: ef2e760822c6a47f +Block 0019 [ 30]: 225d6aa089d5268e +Block 0019 [ 31]: 62da55277aee1563 +Block 0019 [ 32]: 712dd1bec61a04a7 +Block 0019 [ 33]: 244be57459f4c76a +Block 0019 [ 34]: d32a36bff368c5d5 +Block 0019 [ 35]: 08047c20c35ee571 +Block 0019 [ 36]: 26e8068fc6b13eb5 +Block 0019 [ 37]: 56e005fd57f4b712 +Block 0019 [ 38]: 36f4d5514b4ad0cf +Block 0019 [ 39]: 577c56d82ce0f024 +Block 0019 [ 40]: a171c394367b6da2 +Block 0019 [ 41]: 32f8fa87524fe061 +Block 0019 [ 42]: 6612dd6bb411827d +Block 0019 [ 43]: e9c9229a1250942f +Block 0019 [ 44]: bdc28bc191e037e8 +Block 0019 [ 45]: 0c6451a576636faf +Block 0019 [ 46]: 9f168206eadcff9c +Block 0019 [ 47]: 83f94a286e1c1435 +Block 0019 [ 48]: 0c41dfcd624a9c7a +Block 0019 [ 49]: 7022a05fa7a76790 +Block 0019 [ 50]: ccc35774262e5cda +Block 0019 [ 51]: 375aae3a3cf6f07e +Block 0019 [ 52]: b73940411e1738cf +Block 0019 [ 53]: 2a5409d288e38616 +Block 0019 [ 54]: 07073fa0e861eb3c +Block 0019 [ 55]: 79469b12451cca2a +Block 0019 [ 56]: 723ebd6cb8093e12 +Block 0019 [ 57]: 363987806bd00b0f +Block 0019 [ 58]: 3cb6f8ba09c2ea95 +Block 0019 [ 59]: 520d977ef770e9db +Block 0019 [ 60]: 7778cc317565971b +Block 0019 [ 61]: bec212c43afb3adf +Block 0019 [ 62]: b666996aafbe2dbc +Block 0019 [ 63]: c9cb8e75500c38f2 +Block 0019 [ 64]: 8b5d717f1e733849 +Block 0019 [ 65]: cb94b06d182747c5 +Block 0019 [ 66]: a2fae8841d54f52f +Block 0019 [ 67]: db0e02a7c115504d +Block 0019 [ 68]: adfbdfac5438167d +Block 0019 [ 69]: f67d10aeb9d0b51b +Block 0019 [ 70]: 7b8cab32096b0baf +Block 0019 [ 71]: de09aecb032a0c31 +Block 0019 [ 72]: 509b16c99b879ae6 +Block 0019 [ 73]: f7641ecd12a66179 +Block 0019 [ 74]: 007ad1724fc84331 +Block 0019 [ 75]: efa6210dbe8c0764 +Block 0019 [ 76]: 37dc83be6aac171b +Block 0019 [ 77]: c96e4eea37d1e6eb +Block 0019 [ 78]: ddb040a43cf90b33 +Block 0019 [ 79]: 39b0cc39afba6089 +Block 0019 [ 80]: 9aa9caa334b61342 +Block 0019 [ 81]: 44b19b55c2903530 +Block 0019 [ 82]: 9217a7b8f7abbe7d +Block 0019 [ 83]: da0435f0e5f65479 +Block 0019 [ 84]: b4ea8b8f6fe9d01e +Block 0019 [ 85]: 6c6742cb6ae2d8fe +Block 0019 [ 86]: a8a1d0d317252abc +Block 0019 [ 87]: dbeb783190ce2842 +Block 0019 [ 88]: 6ab03dde0b190483 +Block 0019 [ 89]: 0ae262c79049e94c +Block 0019 [ 90]: 25e7abd3f3dc40d4 +Block 0019 [ 91]: 74ae75be5862d6ae +Block 0019 [ 92]: afba143705d3d17a +Block 0019 [ 93]: c0cb1d6a6cb6c7a5 +Block 0019 [ 94]: a7b59fb95d48c653 +Block 0019 [ 95]: 98bc8c61739f4de6 +Block 0019 [ 96]: 2d6848e5e862916c +Block 0019 [ 97]: d2e937fe621b933a +Block 0019 [ 98]: 52c035cade29df96 +Block 0019 [ 99]: 1a4598813b293978 +Block 0019 [100]: 1944c56096b3446a +Block 0019 [101]: 31d1d01ad95e0d41 +Block 0019 [102]: 929ed4acca116441 +Block 0019 [103]: d0f85d36d6357c63 +Block 0019 [104]: aa51d03fc905cf82 +Block 0019 [105]: 025aa197fe483a3d +Block 0019 [106]: 197c68bea90d901b +Block 0019 [107]: b9d621593657d1f7 +Block 0019 [108]: 57bef2332db7c6ef +Block 0019 [109]: a4b4fcb041fd73dc +Block 0019 [110]: ec3ba04676096512 +Block 0019 [111]: f0c29a9d37c08914 +Block 0019 [112]: 4d9d261e314064db +Block 0019 [113]: dc2314df89a11580 +Block 0019 [114]: a201d18ed2904ccc +Block 0019 [115]: 6d1eee9f8733e9ac +Block 0019 [116]: 52e03b595ab01453 +Block 0019 [117]: 2e185ddcae94e78e +Block 0019 [118]: a122c80cb676b5b2 +Block 0019 [119]: 7b094927f1ab7fd5 +Block 0019 [120]: e24f8e8700242727 +Block 0019 [121]: e547f9fbe6f25da0 +Block 0019 [122]: 1c032a1b7d889bd8 +Block 0019 [123]: f0065170035b78e0 +Block 0019 [124]: 9970454dd33cf256 +Block 0019 [125]: 857946d277b97210 +Block 0019 [126]: fc16e28cd750816e +Block 0019 [127]: 06f8ff690d41929d +Block 0020 [ 0]: 8a4f9db0ee84b35e +Block 0020 [ 1]: 05d43e724283fb22 +Block 0020 [ 2]: 1752db12ef2183eb +Block 0020 [ 3]: 178453f8a1f0e320 +Block 0020 [ 4]: ca2301d94bc879ae +Block 0020 [ 5]: bde50c8b0c995430 +Block 0020 [ 6]: 67161b155639636f +Block 0020 [ 7]: 85af2571c91c953c +Block 0020 [ 8]: d6233a7eae67bbb8 +Block 0020 [ 9]: ff9f6a7dd83865eb +Block 0020 [ 10]: cf3f19501b2b1097 +Block 0020 [ 11]: 36db51d1b9e6f85a +Block 0020 [ 12]: 5c5942dc39207d28 +Block 0020 [ 13]: 2b5a9939d050b99d +Block 0020 [ 14]: 8890b2c4de332010 +Block 0020 [ 15]: 2bffc5b880155776 +Block 0020 [ 16]: 9d689be3ee578244 +Block 0020 [ 17]: af66f1e4f8b45f62 +Block 0020 [ 18]: d1d0b72827268a6d +Block 0020 [ 19]: 7b4f96b5b5bb2ee7 +Block 0020 [ 20]: 34164e19532e3ff3 +Block 0020 [ 21]: 3b293d5ba9a9aa36 +Block 0020 [ 22]: 9a1d322d31de3ede +Block 0020 [ 23]: 209a2e31f28fbf4a +Block 0020 [ 24]: e96333b0e0307d67 +Block 0020 [ 25]: 74db7c84dbfb42b2 +Block 0020 [ 26]: 6a832659109cbeb6 +Block 0020 [ 27]: 40a88c9e7583cc27 +Block 0020 [ 28]: 2fb7884dc5dd65ec +Block 0020 [ 29]: 8622638205cd2f99 +Block 0020 [ 30]: 6f064114ced1864a +Block 0020 [ 31]: bc3837c3a04e9a7b +Block 0020 [ 32]: 3e8d79081e8567fb +Block 0020 [ 33]: f56eabf9f0595e78 +Block 0020 [ 34]: 8eed403a3c788b53 +Block 0020 [ 35]: 1378bf4dc47dfe48 +Block 0020 [ 36]: 084c595b8c3c4284 +Block 0020 [ 37]: 3b5361f50ffb9eaa +Block 0020 [ 38]: 8bce8704343749f9 +Block 0020 [ 39]: f1211e16a9112f82 +Block 0020 [ 40]: bd238d55c13f2400 +Block 0020 [ 41]: 34220ff220961874 +Block 0020 [ 42]: 8897e83d67d144c6 +Block 0020 [ 43]: 2db5b922527b964e +Block 0020 [ 44]: b52197589d437094 +Block 0020 [ 45]: 6a48ba9a9fa154de +Block 0020 [ 46]: e98bb88fd0e4dab7 +Block 0020 [ 47]: 2f84a701d1a03033 +Block 0020 [ 48]: fc772aae41afde53 +Block 0020 [ 49]: 636bb52ba1d4d9f4 +Block 0020 [ 50]: faec1cea1cc46a10 +Block 0020 [ 51]: 94d08005cfc3c287 +Block 0020 [ 52]: 9830390c9a830a8c +Block 0020 [ 53]: 1c8f499329eaf4d1 +Block 0020 [ 54]: 6853cf0db3311b76 +Block 0020 [ 55]: 83e79a680245e207 +Block 0020 [ 56]: 7cec49064e8bf50b +Block 0020 [ 57]: 4fd24b05836c01c4 +Block 0020 [ 58]: 905e99c68a4c100e +Block 0020 [ 59]: 4f9a89f3d7ac4e0b +Block 0020 [ 60]: c9c39471299e1ddb +Block 0020 [ 61]: e39efaf3b38813a4 +Block 0020 [ 62]: 286b4375813a437d +Block 0020 [ 63]: 98e5b9910e3934df +Block 0020 [ 64]: d521ed1fe8a87969 +Block 0020 [ 65]: db08009d9e929343 +Block 0020 [ 66]: a0c34ebe01219a67 +Block 0020 [ 67]: e0ce735c0009e0c1 +Block 0020 [ 68]: 4fb4716c4dbb61f8 +Block 0020 [ 69]: e59f27e642628964 +Block 0020 [ 70]: fff59eb4c7b5702c +Block 0020 [ 71]: 2a775ff254d62e30 +Block 0020 [ 72]: 0a081787e9771e82 +Block 0020 [ 73]: ec7dea5310431b84 +Block 0020 [ 74]: 2c490281ca5de0f6 +Block 0020 [ 75]: eead3e14ea1923fd +Block 0020 [ 76]: 3b833ad12c010798 +Block 0020 [ 77]: 363edc3e25c47661 +Block 0020 [ 78]: af78f9f2aec5fe6a +Block 0020 [ 79]: 31d902a64cbcb466 +Block 0020 [ 80]: f5c4812963178782 +Block 0020 [ 81]: 2922c5fc0ea4c6b8 +Block 0020 [ 82]: 31b289a43161a3e8 +Block 0020 [ 83]: ed8f261a426e4652 +Block 0020 [ 84]: e813c7f4b1ea1bd1 +Block 0020 [ 85]: 0760441a91fd6595 +Block 0020 [ 86]: 6584645ae348b4f0 +Block 0020 [ 87]: 087309d7d5028f81 +Block 0020 [ 88]: 68d7600f7a6987a9 +Block 0020 [ 89]: 2b3846321beb118c +Block 0020 [ 90]: 4f1633a0d3637086 +Block 0020 [ 91]: d3b8197641b70961 +Block 0020 [ 92]: 79e34df4822e23e3 +Block 0020 [ 93]: 1561ec3cb8df22a0 +Block 0020 [ 94]: 2caa46601b15c5a8 +Block 0020 [ 95]: efd91677fe9784df +Block 0020 [ 96]: 985faa6923818318 +Block 0020 [ 97]: 49c18986b6c3be49 +Block 0020 [ 98]: 7f60e94fb8ca654a +Block 0020 [ 99]: 9aa81a1c69b89835 +Block 0020 [100]: 804a4a140e6de1b3 +Block 0020 [101]: ad5e3b1de8e2fa89 +Block 0020 [102]: 9317892f7ff6495f +Block 0020 [103]: aedbce513941eb7e +Block 0020 [104]: bae93efd21fe2a00 +Block 0020 [105]: e8fd2f13cd90ddf5 +Block 0020 [106]: ca82b1623bfd32e2 +Block 0020 [107]: 45a3aa2da3795165 +Block 0020 [108]: 842eb4e38880bf30 +Block 0020 [109]: 94da58ed78612959 +Block 0020 [110]: 2b68ef59ef8d144c +Block 0020 [111]: 3a815560012d789a +Block 0020 [112]: cbf6b1e9b5757616 +Block 0020 [113]: 856022efc7259d65 +Block 0020 [114]: 1d546cfb010ccea0 +Block 0020 [115]: ead677ea82cde8c4 +Block 0020 [116]: c68f1c9ce7d502c8 +Block 0020 [117]: 01430c313a4da7de +Block 0020 [118]: d9bd21f426a60b45 +Block 0020 [119]: 367f365d76791fb5 +Block 0020 [120]: 450c3a5d659df17c +Block 0020 [121]: e4936ada9bf3874c +Block 0020 [122]: c022ef04e11cc79d +Block 0020 [123]: b8b492f9bd65b623 +Block 0020 [124]: bff3f85f55177ad6 +Block 0020 [125]: b5b12c22a577cc39 +Block 0020 [126]: f474903b19473bea +Block 0020 [127]: d79a7d13279e3b09 +Block 0021 [ 0]: 6a690d82f7468dd3 +Block 0021 [ 1]: 12441ba391c9594e +Block 0021 [ 2]: 8c5f0f5a0d1addfc +Block 0021 [ 3]: c889abe6f4d8422a +Block 0021 [ 4]: 5d763273270fbef6 +Block 0021 [ 5]: 4348880c55930785 +Block 0021 [ 6]: e620148dd4f6f217 +Block 0021 [ 7]: 3e029951e0b571b4 +Block 0021 [ 8]: 357a0d9da17a4feb +Block 0021 [ 9]: 0e50f4a16dfeff0c +Block 0021 [ 10]: 95d4a46a7f81baac +Block 0021 [ 11]: 539843f5fcfd02cd +Block 0021 [ 12]: 9d178b8212b0ff45 +Block 0021 [ 13]: 2a2f470cb36c100b +Block 0021 [ 14]: bf41303e9261b48e +Block 0021 [ 15]: 9b0862b229b83b6d +Block 0021 [ 16]: cc89cb6361314e2e +Block 0021 [ 17]: 268c35415ce6dc52 +Block 0021 [ 18]: a3a3f427c540d392 +Block 0021 [ 19]: 6bf8e2ed1915f860 +Block 0021 [ 20]: d71b137449672e9b +Block 0021 [ 21]: 629232b8316eb560 +Block 0021 [ 22]: 015105d3bd65ee42 +Block 0021 [ 23]: 7899ec0fb94c6aec +Block 0021 [ 24]: 87452e4e58a4db50 +Block 0021 [ 25]: 9eab92117f5864cc +Block 0021 [ 26]: c9b4aae2326ae591 +Block 0021 [ 27]: beb6cb972da0771c +Block 0021 [ 28]: ef51efd15eb76fdb +Block 0021 [ 29]: be1a9ed66325f1c8 +Block 0021 [ 30]: f9eb1c4a361d6a0b +Block 0021 [ 31]: f33919c3dbbd7564 +Block 0021 [ 32]: 09f88bba37d76cc5 +Block 0021 [ 33]: 626fab6de3cfcec7 +Block 0021 [ 34]: 1a641fe5d8c5f7dd +Block 0021 [ 35]: 16aafd5de0731c78 +Block 0021 [ 36]: e3c0c662199c1ca2 +Block 0021 [ 37]: 54d0766c3a0a5f59 +Block 0021 [ 38]: c13b58b4f9e87258 +Block 0021 [ 39]: ab4de1d30836c3c0 +Block 0021 [ 40]: 5d4af2bffc26448c +Block 0021 [ 41]: 6cbf772c8406ff83 +Block 0021 [ 42]: 2494f8048435f921 +Block 0021 [ 43]: b844fc339f0496b0 +Block 0021 [ 44]: 957800ddd4aa408e +Block 0021 [ 45]: 998fc5084c314ceb +Block 0021 [ 46]: 2eb014c15ff6239d +Block 0021 [ 47]: 6a779f0437c473bb +Block 0021 [ 48]: 1d68b14e7bf75d98 +Block 0021 [ 49]: c96192d0a155afa7 +Block 0021 [ 50]: ed980b6f7430035d +Block 0021 [ 51]: a282ae6ceae976e1 +Block 0021 [ 52]: 627d105e74b5809a +Block 0021 [ 53]: ef2583d01983d3e9 +Block 0021 [ 54]: 19702f856f10b49c +Block 0021 [ 55]: 878565afd439cff8 +Block 0021 [ 56]: 41e300a0e2ea091f +Block 0021 [ 57]: 813d4ae9df7ff99b +Block 0021 [ 58]: 876ed9836644b255 +Block 0021 [ 59]: e6f3cf1e523c47a2 +Block 0021 [ 60]: 5b3b6a50ddbe365a +Block 0021 [ 61]: a78355f9b796b48e +Block 0021 [ 62]: cee13fa63c34d91d +Block 0021 [ 63]: 3ad04395adaaa626 +Block 0021 [ 64]: 25f04f6fea52fad8 +Block 0021 [ 65]: b949d6ad6bd07455 +Block 0021 [ 66]: eace6d725bdd90e7 +Block 0021 [ 67]: 28ec322421ed16da +Block 0021 [ 68]: 53ef5acdcde08591 +Block 0021 [ 69]: 1731904e94e47535 +Block 0021 [ 70]: f905f30eaee0f5a4 +Block 0021 [ 71]: bf030f5796084fdb +Block 0021 [ 72]: 2727e18c596bcc5d +Block 0021 [ 73]: b41e211383e74c1c +Block 0021 [ 74]: ca7ac3560b209561 +Block 0021 [ 75]: c72caf41204b2f30 +Block 0021 [ 76]: 01c8ea4f3814837e +Block 0021 [ 77]: 6a6c6b41f86cd210 +Block 0021 [ 78]: 04666cea6797c53e +Block 0021 [ 79]: 31493ece7f7f369b +Block 0021 [ 80]: b54719467f58b743 +Block 0021 [ 81]: c994b462ca9e76fb +Block 0021 [ 82]: bca2b0d3356d6258 +Block 0021 [ 83]: 8ca7953de9bbcdff +Block 0021 [ 84]: 535469dd17595f7d +Block 0021 [ 85]: 923db89190ec8649 +Block 0021 [ 86]: 6a47a104d6085a31 +Block 0021 [ 87]: 99521adc90e0fb2e +Block 0021 [ 88]: 4f41ef6bb830f393 +Block 0021 [ 89]: 2eccdea43764c42c +Block 0021 [ 90]: 987fe3497b80df32 +Block 0021 [ 91]: b0efcf6157cbcf0b +Block 0021 [ 92]: 26e0b03471338ae5 +Block 0021 [ 93]: cf4ad2adf62522c4 +Block 0021 [ 94]: 4cb838ff8a040a42 +Block 0021 [ 95]: 437c3d04c884bb15 +Block 0021 [ 96]: 5b14b20bc5801714 +Block 0021 [ 97]: 56dba0d047b9059b +Block 0021 [ 98]: d69d5fa49a586a3a +Block 0021 [ 99]: 2d920c3b7cdbe2ee +Block 0021 [100]: a25b45eac0504268 +Block 0021 [101]: fefa93f49a07f52b +Block 0021 [102]: 6b800421cddbaceb +Block 0021 [103]: 8f4aa7cc052749cc +Block 0021 [104]: 91b8112dc322d756 +Block 0021 [105]: a693ecaab66dbce0 +Block 0021 [106]: 876ccc4f6a1e06ef +Block 0021 [107]: f1dceba8e8d281c8 +Block 0021 [108]: 9db34590d552f669 +Block 0021 [109]: c652413cce887046 +Block 0021 [110]: 3591284cc5019dd5 +Block 0021 [111]: 557c5ca2a73593f6 +Block 0021 [112]: 1ad1bbd2cdedd482 +Block 0021 [113]: 4a4411ef6795ebc6 +Block 0021 [114]: b3572af2889f1c36 +Block 0021 [115]: f68259a9ba57696d +Block 0021 [116]: c9343fffa8f8a568 +Block 0021 [117]: 2f7041694cec2149 +Block 0021 [118]: 7a0447037cc831ab +Block 0021 [119]: 51e939824bd21330 +Block 0021 [120]: fc74c47626ca3908 +Block 0021 [121]: bab7851bd8ed2716 +Block 0021 [122]: a159f8ec28517b61 +Block 0021 [123]: 7536651c332d5abe +Block 0021 [124]: 68913e0a98eed0fc +Block 0021 [125]: 0edcf5e40acaf20c +Block 0021 [126]: 3b248d434ed7bb55 +Block 0021 [127]: 39ab89f9d8b926b3 +Block 0022 [ 0]: 3f70cc0f9d47707f +Block 0022 [ 1]: f5eb80c359ef2a51 +Block 0022 [ 2]: d453f69f134da7de +Block 0022 [ 3]: 138b7cc85bb57594 +Block 0022 [ 4]: 74f9c1207bb6b4dd +Block 0022 [ 5]: 219a6ab1c89b4f55 +Block 0022 [ 6]: 8a494ac72680d673 +Block 0022 [ 7]: 267fc49b20bebc87 +Block 0022 [ 8]: e487c1458e1d57bb +Block 0022 [ 9]: ce2365f353681c6e +Block 0022 [ 10]: ead7a9af5856b905 +Block 0022 [ 11]: 686e9296790d47c4 +Block 0022 [ 12]: 262aa1e0a3aee9b8 +Block 0022 [ 13]: cf02b3e2b36c552f +Block 0022 [ 14]: cc89498295a3a56e +Block 0022 [ 15]: 59c0818ddb29c3b7 +Block 0022 [ 16]: 290e0e36ae0adb71 +Block 0022 [ 17]: 2b26f87ae8afd6d1 +Block 0022 [ 18]: 7eaf767983ed9a23 +Block 0022 [ 19]: 7d20d84ac0016375 +Block 0022 [ 20]: 8571c62882e1e05f +Block 0022 [ 21]: b02d4e3a32d7eb0f +Block 0022 [ 22]: 508db8ec23e8b660 +Block 0022 [ 23]: eb378e5c40b3c8f1 +Block 0022 [ 24]: 83cbba05d754b665 +Block 0022 [ 25]: d9d4c05f4f0318fa +Block 0022 [ 26]: f9c09b3d86d7f325 +Block 0022 [ 27]: fda56c3e88644d3d +Block 0022 [ 28]: 2c2aa62da14575bf +Block 0022 [ 29]: 6c64f927b3ab75ab +Block 0022 [ 30]: 935b4ee8b0eb2f84 +Block 0022 [ 31]: 8755b9ac7888c891 +Block 0022 [ 32]: 328982a5c3491d4b +Block 0022 [ 33]: 0f46472e28c9f157 +Block 0022 [ 34]: d4141d926cea8a31 +Block 0022 [ 35]: b83228a2302af08a +Block 0022 [ 36]: 85c24d6f72bca71a +Block 0022 [ 37]: b4abb81f797317be +Block 0022 [ 38]: d56c5d7910890829 +Block 0022 [ 39]: 80ec5e7003e1dcbe +Block 0022 [ 40]: 86f0590758cd27da +Block 0022 [ 41]: 4ef24b838af6cdf7 +Block 0022 [ 42]: 67e357a7beef393b +Block 0022 [ 43]: 63d780ac9193bd51 +Block 0022 [ 44]: 64bb5e3aa4e4e0a9 +Block 0022 [ 45]: a94f3197abecf10d +Block 0022 [ 46]: 63f34c088c47b6d6 +Block 0022 [ 47]: 9ddbf939d19d4778 +Block 0022 [ 48]: 5d08f10b95522795 +Block 0022 [ 49]: 78bba3c480deabdd +Block 0022 [ 50]: 8d59286c50ed63bc +Block 0022 [ 51]: 11e2e05af4e98a96 +Block 0022 [ 52]: 6c47d628f6bf8ae5 +Block 0022 [ 53]: 2a06375e05b36cc1 +Block 0022 [ 54]: 9dbca78d1d334ba4 +Block 0022 [ 55]: a1216d5e2ae50cf6 +Block 0022 [ 56]: a150c2b93d4afb34 +Block 0022 [ 57]: a2b13a50cd072fa1 +Block 0022 [ 58]: 7c03a9ea46b3e1be +Block 0022 [ 59]: 9a682f9b2c8a0ba5 +Block 0022 [ 60]: 836dd7bd4d152995 +Block 0022 [ 61]: f0176675ec8230f1 +Block 0022 [ 62]: 0481fd3ccc6daa78 +Block 0022 [ 63]: e3325ec7d894b781 +Block 0022 [ 64]: ea394932d67081f5 +Block 0022 [ 65]: 8e7c52d335e12e3b +Block 0022 [ 66]: fce337de40f0d41e +Block 0022 [ 67]: 58cffb116a73341c +Block 0022 [ 68]: c0296ad8d2c01ccc +Block 0022 [ 69]: 76d5795c8820068d +Block 0022 [ 70]: 1a29ad20fa1ab458 +Block 0022 [ 71]: 8619693bda7f0872 +Block 0022 [ 72]: 6b8b27f92588f5f9 +Block 0022 [ 73]: 5e76c336d09dc18b +Block 0022 [ 74]: c699fdcb6eecfc23 +Block 0022 [ 75]: b31ed01e22cb487f +Block 0022 [ 76]: 1496f91f13ec269a +Block 0022 [ 77]: d4090509dd4158e6 +Block 0022 [ 78]: 4a947a520f8810f6 +Block 0022 [ 79]: 065468219f73ab5a +Block 0022 [ 80]: 8a4b1ed17cae3bbb +Block 0022 [ 81]: c30a06c4a34d2887 +Block 0022 [ 82]: 5cddc373dbfc1593 +Block 0022 [ 83]: 04335ba1b963f666 +Block 0022 [ 84]: 85a31f5f5fa3e7eb +Block 0022 [ 85]: 232179a977e19047 +Block 0022 [ 86]: 26563ede801a4d94 +Block 0022 [ 87]: 4a7e1940462900f0 +Block 0022 [ 88]: b1e2be20bbf016c3 +Block 0022 [ 89]: 7db114728eee3040 +Block 0022 [ 90]: 4f182d12273166ae +Block 0022 [ 91]: 9c4aa74c698762ba +Block 0022 [ 92]: 03a3e790226c9265 +Block 0022 [ 93]: a31d876f8c84340a +Block 0022 [ 94]: ef732cbaa920286f +Block 0022 [ 95]: 3326b587e57c8933 +Block 0022 [ 96]: c1dcf40199a259d5 +Block 0022 [ 97]: 22b54da552e17174 +Block 0022 [ 98]: 54287619d13f4838 +Block 0022 [ 99]: ea44ee02ed3e4aec +Block 0022 [100]: e60d7f85f5abb1ee +Block 0022 [101]: 8b1a51a4211a7969 +Block 0022 [102]: 49c9292a1953bf9c +Block 0022 [103]: 202dc80570086a4b +Block 0022 [104]: 2dd572ef067f560a +Block 0022 [105]: 2ddebe7bd2a703ca +Block 0022 [106]: 289c61cdfd6966fb +Block 0022 [107]: 7156699a693063c1 +Block 0022 [108]: 244c502031ccd19f +Block 0022 [109]: a9436c05d1a5e0ba +Block 0022 [110]: 2ed5fbeafdd3128a +Block 0022 [111]: 27c4f3005c6ffa0c +Block 0022 [112]: b399e9c1b48ee737 +Block 0022 [113]: 26cf4190bd859535 +Block 0022 [114]: a97fa3395a24ead9 +Block 0022 [115]: 73032b5c7a73a24b +Block 0022 [116]: 3c6c63e68aa5e799 +Block 0022 [117]: 56d6fea9e6aee17e +Block 0022 [118]: 46487a212a0f03fd +Block 0022 [119]: 4108a5270f3d45e5 +Block 0022 [120]: 78808b44d4deb7b0 +Block 0022 [121]: a49cd7a2e771bec7 +Block 0022 [122]: c899d135f9a20151 +Block 0022 [123]: 397d1afb157e933d +Block 0022 [124]: b3e792595d5c92ab +Block 0022 [125]: 154fb67a3c72b825 +Block 0022 [126]: 7ef6c5601737fa2e +Block 0022 [127]: e876f8e91ea54fa3 +Block 0023 [ 0]: 341a79fe5b82da3b +Block 0023 [ 1]: 737f57840604464b +Block 0023 [ 2]: 1a7b402397450013 +Block 0023 [ 3]: 17424bc7740881d5 +Block 0023 [ 4]: 99730f5b1c4f162a +Block 0023 [ 5]: 1849c57fadf5c376 +Block 0023 [ 6]: bef6a16b254402fe +Block 0023 [ 7]: e446a0a7fe1b37d1 +Block 0023 [ 8]: e1c2dbb6e612b1c9 +Block 0023 [ 9]: 8d87fc8c05d17a91 +Block 0023 [ 10]: 0069fc8e5ec68712 +Block 0023 [ 11]: 03fe37e380527614 +Block 0023 [ 12]: d36a5d4153e36e01 +Block 0023 [ 13]: bcb47d6da610431e +Block 0023 [ 14]: 270f257c2355afd3 +Block 0023 [ 15]: 5ed5f32159550325 +Block 0023 [ 16]: f3d03d86e0697368 +Block 0023 [ 17]: 0e783d159193f647 +Block 0023 [ 18]: 10f1d60920b8df4b +Block 0023 [ 19]: aaaf13f7120fd26f +Block 0023 [ 20]: 4679458b37b0215b +Block 0023 [ 21]: 496624fd48549689 +Block 0023 [ 22]: b243733c6fae67a7 +Block 0023 [ 23]: bb53c16aca1dfdfb +Block 0023 [ 24]: 379a6e5c7b368ef2 +Block 0023 [ 25]: ab9a4ec2322b323e +Block 0023 [ 26]: ee320748a309795f +Block 0023 [ 27]: 08569d46951e5bcc +Block 0023 [ 28]: ec8ceeb84b74514d +Block 0023 [ 29]: 1f85bb224087633e +Block 0023 [ 30]: f28be6d460e221d0 +Block 0023 [ 31]: f661e32cb2e0cd48 +Block 0023 [ 32]: a89f51d1a649a311 +Block 0023 [ 33]: 91c15b946457231a +Block 0023 [ 34]: b3390d3c66d4fc3b +Block 0023 [ 35]: 6e3fe811c4117e98 +Block 0023 [ 36]: 647ae653447f7977 +Block 0023 [ 37]: 3e8451f63f8865fd +Block 0023 [ 38]: f8a6651886f512a4 +Block 0023 [ 39]: 7cf42922459c66c7 +Block 0023 [ 40]: 2577e967f9fda293 +Block 0023 [ 41]: 1389c8f92c268e06 +Block 0023 [ 42]: 5a35ff4199747016 +Block 0023 [ 43]: fc650deae93a7c1b +Block 0023 [ 44]: fcb7794763bf77db +Block 0023 [ 45]: e362533b122524f5 +Block 0023 [ 46]: 1ba9b1e64359b4f5 +Block 0023 [ 47]: 08b09e872e6e1dd9 +Block 0023 [ 48]: 4ee537f0830845cd +Block 0023 [ 49]: 5ce572b3f8832e90 +Block 0023 [ 50]: 1b725b41ecf6d0ad +Block 0023 [ 51]: aa647b27f5cc9c5b +Block 0023 [ 52]: 00a6b24dd3f367b6 +Block 0023 [ 53]: 7f68dbe2f046d0f9 +Block 0023 [ 54]: ce097da84f7194b7 +Block 0023 [ 55]: 58fea62c150d7901 +Block 0023 [ 56]: ef9a9a7cf0c9191a +Block 0023 [ 57]: 6fe8d189a04a105c +Block 0023 [ 58]: 420faab0945c162c +Block 0023 [ 59]: dfd6be3b647140af +Block 0023 [ 60]: dfb409380364365d +Block 0023 [ 61]: 36eeda04b5cfdee0 +Block 0023 [ 62]: 6326723b899f1ef1 +Block 0023 [ 63]: 6531688ea7ab1170 +Block 0023 [ 64]: 299fa844bd5b04de +Block 0023 [ 65]: 4a87c4d2dce5e89e +Block 0023 [ 66]: 8d85a67f07ba1ede +Block 0023 [ 67]: 30b6847d1025c641 +Block 0023 [ 68]: 4726562dd7a8d04e +Block 0023 [ 69]: 9c8829a7b56bf050 +Block 0023 [ 70]: 3f33335a10a6daa8 +Block 0023 [ 71]: ccb3b31d4131d58f +Block 0023 [ 72]: b715752217405e47 +Block 0023 [ 73]: 564adbc6c513bc0f +Block 0023 [ 74]: 5c755447a6582099 +Block 0023 [ 75]: 50987d33c2e8f403 +Block 0023 [ 76]: d370b629305d847f +Block 0023 [ 77]: 46c6ec2f63d39994 +Block 0023 [ 78]: e9e849a1a94b1417 +Block 0023 [ 79]: d5f7a7f69abc45d4 +Block 0023 [ 80]: 720953293ba3a6dc +Block 0023 [ 81]: 2e5a953a29ddae35 +Block 0023 [ 82]: 9389fb9b09621872 +Block 0023 [ 83]: 73fade635fe140b6 +Block 0023 [ 84]: 38bf4c3bce807b6a +Block 0023 [ 85]: 1ace5da62d54f17a +Block 0023 [ 86]: 1c80837442bb0b1f +Block 0023 [ 87]: 881ae1746297229b +Block 0023 [ 88]: f51d9dda7b6c623f +Block 0023 [ 89]: dec061d609ecb1da +Block 0023 [ 90]: 8bf9510cca4c204d +Block 0023 [ 91]: de8a16e97b4584f1 +Block 0023 [ 92]: d206442c8ac16e38 +Block 0023 [ 93]: c3c90cd9562e7732 +Block 0023 [ 94]: 01730c66e6a1026a +Block 0023 [ 95]: 929fffc02cfdbc95 +Block 0023 [ 96]: 1cc815084b846e70 +Block 0023 [ 97]: 4c93d56a06565b60 +Block 0023 [ 98]: 2224244f540ba2fb +Block 0023 [ 99]: 83560821e355eeaa +Block 0023 [100]: db0be31347b60ecc +Block 0023 [101]: cd1f9f68387bd646 +Block 0023 [102]: 86d24034913edc25 +Block 0023 [103]: f905de2d30889d35 +Block 0023 [104]: 87535a21323953b9 +Block 0023 [105]: 2366a1cb51f43ee7 +Block 0023 [106]: 704cc3e5fd36f427 +Block 0023 [107]: 7d59c38fdef90ccb +Block 0023 [108]: d68a4a721796fa30 +Block 0023 [109]: d333366213fa9686 +Block 0023 [110]: 5bdc922f53fc6ef9 +Block 0023 [111]: 07b301b7fece3102 +Block 0023 [112]: 90cc5ec9d6cae00f +Block 0023 [113]: 3c33243c58de4a81 +Block 0023 [114]: 69914a6327b42592 +Block 0023 [115]: aedb75ec336b0c83 +Block 0023 [116]: 0377d738f40b3b8a +Block 0023 [117]: a3b9cbf2d4c2d6bd +Block 0023 [118]: 8509d769b336d9a3 +Block 0023 [119]: f2ea16490855230e +Block 0023 [120]: 8a15faf44b0b37ed +Block 0023 [121]: d617ff1c420f1c63 +Block 0023 [122]: 543394d6ea952471 +Block 0023 [123]: 35409c8245a7c8dd +Block 0023 [124]: dd130b326c99b2f8 +Block 0023 [125]: 7b7d105a04932402 +Block 0023 [126]: ca6d2056cb49b043 +Block 0023 [127]: d1f6d11b9290e397 +Block 0024 [ 0]: e3b8be3b800bcac1 +Block 0024 [ 1]: 93592dd02f819503 +Block 0024 [ 2]: ec4973a83723ef80 +Block 0024 [ 3]: 477e80d3b8f24a0a +Block 0024 [ 4]: 34e1f886f9c40f36 +Block 0024 [ 5]: 6e4119b94c6aa498 +Block 0024 [ 6]: fd2c62ab5381b13b +Block 0024 [ 7]: ee123c46d80957ee +Block 0024 [ 8]: ed542b69841c3346 +Block 0024 [ 9]: cdebc6e16a3882c1 +Block 0024 [ 10]: a7306cb070193039 +Block 0024 [ 11]: ae674fdc1d730617 +Block 0024 [ 12]: 9ee6543905547df4 +Block 0024 [ 13]: cc0536cbba16bb9c +Block 0024 [ 14]: ac44f47060312756 +Block 0024 [ 15]: e48e593dce67bce0 +Block 0024 [ 16]: f5aff4db2366797c +Block 0024 [ 17]: eca2b65e0cd03f09 +Block 0024 [ 18]: a3fd2e7240d51d98 +Block 0024 [ 19]: bfbf1d554e80c436 +Block 0024 [ 20]: 2890165f5f8cbedc +Block 0024 [ 21]: b0637c303f1d1ac1 +Block 0024 [ 22]: dc15a716f869bee5 +Block 0024 [ 23]: c34be8e074b39c6f +Block 0024 [ 24]: 967f16eda9ee64fd +Block 0024 [ 25]: 14107a44211f4d4d +Block 0024 [ 26]: 18b413ce6910aac4 +Block 0024 [ 27]: 5604192a5b6eeecc +Block 0024 [ 28]: 6db3a8bf11a19c45 +Block 0024 [ 29]: 9be52589cd36b4f5 +Block 0024 [ 30]: 4ef35179c27e46f8 +Block 0024 [ 31]: 382e57343eb30442 +Block 0024 [ 32]: 7f9e80c90761e3c0 +Block 0024 [ 33]: f749d138d96e88e4 +Block 0024 [ 34]: d9f68571c4dd5c13 +Block 0024 [ 35]: 43939a9e9e5f7c88 +Block 0024 [ 36]: 1c29e903415c8bf9 +Block 0024 [ 37]: d89a7c5852bc1e1c +Block 0024 [ 38]: ae6caf5be4a605bf +Block 0024 [ 39]: 2d782b9acaf95fb3 +Block 0024 [ 40]: 797f01c34397e617 +Block 0024 [ 41]: 5fd2da21bf24713a +Block 0024 [ 42]: 5526c76a245b34c4 +Block 0024 [ 43]: bfc80ada0d455aa0 +Block 0024 [ 44]: 1793f4cd9103f76a +Block 0024 [ 45]: e8de97a775e1d0cd +Block 0024 [ 46]: df8a6cfa31192f7a +Block 0024 [ 47]: 640f146840f26415 +Block 0024 [ 48]: 4cbd3dd98219dcfe +Block 0024 [ 49]: 6ce1c9f112bec860 +Block 0024 [ 50]: ffbbc563a583b1d3 +Block 0024 [ 51]: 76c086ebfefb2b79 +Block 0024 [ 52]: 6758f6e588490093 +Block 0024 [ 53]: c5f82f0a9dd56b63 +Block 0024 [ 54]: 7530873426b32f4c +Block 0024 [ 55]: 22557a08fccfd756 +Block 0024 [ 56]: 585b5b8b59796d0a +Block 0024 [ 57]: b5ec994837d36005 +Block 0024 [ 58]: bed35897ce06d10a +Block 0024 [ 59]: 82e686ebd526b229 +Block 0024 [ 60]: d83388e341f49a52 +Block 0024 [ 61]: f44ff88f95a27c3d +Block 0024 [ 62]: 988230b216a9823e +Block 0024 [ 63]: 656518e36a1ece8a +Block 0024 [ 64]: 7942fe98ed267352 +Block 0024 [ 65]: 648ede8d1e5e7bda +Block 0024 [ 66]: 76ea13fb53c8b584 +Block 0024 [ 67]: 56387f677a110819 +Block 0024 [ 68]: 16ed666f4094cb45 +Block 0024 [ 69]: fe5a06c15b8aeec4 +Block 0024 [ 70]: 78773a1540aaa4e3 +Block 0024 [ 71]: f908d3a514f12aea +Block 0024 [ 72]: 7947a0a5e3de5695 +Block 0024 [ 73]: 6bf577dffd32e561 +Block 0024 [ 74]: ace24c27c6a31b3d +Block 0024 [ 75]: a98b813be7cc842d +Block 0024 [ 76]: ca9114e79885df7f +Block 0024 [ 77]: 05fa517bd6dd57a6 +Block 0024 [ 78]: b0ea1c66a2e97b8e +Block 0024 [ 79]: 17c7fc5ce92bcb6d +Block 0024 [ 80]: 7e9b1dc6ccbfc17e +Block 0024 [ 81]: 25c3624824af53ed +Block 0024 [ 82]: c1c82c49130c3477 +Block 0024 [ 83]: e1ecceb5ababf159 +Block 0024 [ 84]: 976f387136d4f7ce +Block 0024 [ 85]: 8b9999d864a74c63 +Block 0024 [ 86]: 215d99ed05fff16e +Block 0024 [ 87]: f4a5452133dd542f +Block 0024 [ 88]: 0da71140658ff706 +Block 0024 [ 89]: 47da481f4574299d +Block 0024 [ 90]: 63299064bb401eb2 +Block 0024 [ 91]: af13d9a8d97b37bb +Block 0024 [ 92]: 08359e9b80b0118c +Block 0024 [ 93]: 049e21cfaef9cbe7 +Block 0024 [ 94]: c12cb6dcf3e8de01 +Block 0024 [ 95]: 8bf57b075242998f +Block 0024 [ 96]: 88323e969cdaa1f2 +Block 0024 [ 97]: cdecc8f395cfadec +Block 0024 [ 98]: 03b15b330a376778 +Block 0024 [ 99]: 0099436d96a2cdef +Block 0024 [100]: b3a65c86f37ac4dd +Block 0024 [101]: 4949c9b0289557c8 +Block 0024 [102]: 8929e420dc60f1f0 +Block 0024 [103]: 7a8237af7d558536 +Block 0024 [104]: b2a234a509915dbf +Block 0024 [105]: 964803f63860414f +Block 0024 [106]: af7b6f0ab6aea78f +Block 0024 [107]: 87b040d11ef2b48e +Block 0024 [108]: 9a8d4e6c6209fee7 +Block 0024 [109]: 31363e0694cbe147 +Block 0024 [110]: a01753b413c3432b +Block 0024 [111]: e5ad598e657a3527 +Block 0024 [112]: 2bfbe1bccad1592b +Block 0024 [113]: eab4792c6dfcdb98 +Block 0024 [114]: 5bf3e2632baf57a0 +Block 0024 [115]: 24c47826d1b60b11 +Block 0024 [116]: 0fa3922337708149 +Block 0024 [117]: 23878fd8b3ee440a +Block 0024 [118]: e0da3fbaeb9b754f +Block 0024 [119]: 4c5845d295c8e130 +Block 0024 [120]: f9842cfb0519a77a +Block 0024 [121]: e78c8fc24df07468 +Block 0024 [122]: 22001bb20a856f72 +Block 0024 [123]: 21531c03ff79630c +Block 0024 [124]: e7c926c13079eb3d +Block 0024 [125]: 6ad556444199ea80 +Block 0024 [126]: 64da7b572b36f7ba +Block 0024 [127]: 799b25b56cf24c84 +Block 0025 [ 0]: a8ef4430ce39f78a +Block 0025 [ 1]: 6fa7bb074ca2d4c7 +Block 0025 [ 2]: c4328dc4903e2627 +Block 0025 [ 3]: 847f8a36c562ff2e +Block 0025 [ 4]: 8913562d5c4b41e0 +Block 0025 [ 5]: 1b8e8af880881f23 +Block 0025 [ 6]: e91da3d1a6f519eb +Block 0025 [ 7]: 8fae99cad26c52ed +Block 0025 [ 8]: afda62e3aabf1e6c +Block 0025 [ 9]: e7cfd7eb417b3c8b +Block 0025 [ 10]: ecc1f7be89deb6d3 +Block 0025 [ 11]: b9052fd2dee04394 +Block 0025 [ 12]: 097fc19d990754ba +Block 0025 [ 13]: 536dd6266bf8815d +Block 0025 [ 14]: 747d495d55abc42f +Block 0025 [ 15]: a2e5f741c0b61771 +Block 0025 [ 16]: b80db43d2e40ae7c +Block 0025 [ 17]: 17305d07336bd733 +Block 0025 [ 18]: 6b529470ae8322fa +Block 0025 [ 19]: 0499d8272f0b85df +Block 0025 [ 20]: 19d9e45c2cb59cb9 +Block 0025 [ 21]: 4bf3107858c7e5b4 +Block 0025 [ 22]: ae33fde859a9b807 +Block 0025 [ 23]: 1c2dc7ecfb7ac28e +Block 0025 [ 24]: f21b5a8f3d7a3939 +Block 0025 [ 25]: 4a4bf57af3ce07cc +Block 0025 [ 26]: 95095f2c45d29962 +Block 0025 [ 27]: eee227d0f71de589 +Block 0025 [ 28]: 4ed1dc11850b66f1 +Block 0025 [ 29]: 3b8e9ddf6115245e +Block 0025 [ 30]: 1cbce81b5582ce8b +Block 0025 [ 31]: c30c4b8efdac0046 +Block 0025 [ 32]: 340982707f9dff0d +Block 0025 [ 33]: d15a167fe9ce9b08 +Block 0025 [ 34]: bd66426cae072cff +Block 0025 [ 35]: 11045f18ef7e373e +Block 0025 [ 36]: a1c1d0dcb20dfb02 +Block 0025 [ 37]: bb2af69b82d672b0 +Block 0025 [ 38]: e9d38c0d0bb65923 +Block 0025 [ 39]: 74d87059aaeb21f5 +Block 0025 [ 40]: 46089bb77c69d9e0 +Block 0025 [ 41]: af2dc5813fc7be50 +Block 0025 [ 42]: b505c464526df042 +Block 0025 [ 43]: 5ebc52a55f0715b3 +Block 0025 [ 44]: e63b00f5cc681706 +Block 0025 [ 45]: 41200c17d4c5265b +Block 0025 [ 46]: 0571bb4eca0aa328 +Block 0025 [ 47]: d2c5967dee2efc65 +Block 0025 [ 48]: 386bf2ba93237452 +Block 0025 [ 49]: d9b495ea3d71c7ed +Block 0025 [ 50]: 6e9bcaac915ff914 +Block 0025 [ 51]: 61dcf57024b361e2 +Block 0025 [ 52]: dd1e6418cdfc55a1 +Block 0025 [ 53]: 89d6563948e8028a +Block 0025 [ 54]: 673410cb2802bb3c +Block 0025 [ 55]: fd72e7854b71fd95 +Block 0025 [ 56]: 9a62e33b6f8a2a6a +Block 0025 [ 57]: ea483d20be77a4d8 +Block 0025 [ 58]: beda36420dfed7d0 +Block 0025 [ 59]: ef739e227fdf5046 +Block 0025 [ 60]: 5f2ebac6da228070 +Block 0025 [ 61]: 1bd1dffbf8beeb5c +Block 0025 [ 62]: 2f82cba84b8c0705 +Block 0025 [ 63]: f0957223c4607115 +Block 0025 [ 64]: 9f205d55d2aa9dd4 +Block 0025 [ 65]: b35017d46c64b5ec +Block 0025 [ 66]: d1ebf1a5e25de936 +Block 0025 [ 67]: d9c3c72742de426f +Block 0025 [ 68]: 9a77f8612a8a9f7a +Block 0025 [ 69]: 22bbf7b831db85c3 +Block 0025 [ 70]: 915062521a86f132 +Block 0025 [ 71]: 66c1475a3005072a +Block 0025 [ 72]: 00876915bef9f5e8 +Block 0025 [ 73]: 49ec0d879061e52d +Block 0025 [ 74]: f1a9210a92a1ccf9 +Block 0025 [ 75]: a7a3aabec9a4c3fa +Block 0025 [ 76]: e5e1c5b6d2c89a59 +Block 0025 [ 77]: ecc3fffe9377b75c +Block 0025 [ 78]: e15d4dd0f77cae1a +Block 0025 [ 79]: 3ef1b0c90ea4140b +Block 0025 [ 80]: e7a1376406821cee +Block 0025 [ 81]: 3b9144b3a581e276 +Block 0025 [ 82]: cd78379531214835 +Block 0025 [ 83]: 18d8e611f3f4ca46 +Block 0025 [ 84]: efd481c945c81d76 +Block 0025 [ 85]: a0bec8b6bb02a64d +Block 0025 [ 86]: 8ed05673c1118581 +Block 0025 [ 87]: 24f2beac33e9b6f8 +Block 0025 [ 88]: 5b2869a7bbdea0b8 +Block 0025 [ 89]: 5691e816f20c7ff0 +Block 0025 [ 90]: 09b8f7c1c58bf06c +Block 0025 [ 91]: c22a0bebc36d1fe9 +Block 0025 [ 92]: 4a0f9fc41555f088 +Block 0025 [ 93]: e3a799377e1b4777 +Block 0025 [ 94]: 6c3968386d5bce8c +Block 0025 [ 95]: 5ff3108fab500908 +Block 0025 [ 96]: da7854699b50de6c +Block 0025 [ 97]: 0295929d4ff59ac2 +Block 0025 [ 98]: d7b85abf5f2f4db9 +Block 0025 [ 99]: f2f75a4a63347bc5 +Block 0025 [100]: 6644ecc4740d59e5 +Block 0025 [101]: 0700c3f8b34de41f +Block 0025 [102]: af122995d2173d4d +Block 0025 [103]: cabc6eea684c9dbf +Block 0025 [104]: 20fd25dcd332dac2 +Block 0025 [105]: a9a2c7f99cf8cab9 +Block 0025 [106]: 864c959115f406cf +Block 0025 [107]: bf96bf5323e7e5b0 +Block 0025 [108]: 01cd62dc9bb2b117 +Block 0025 [109]: ec0ddf4f05b7fe6f +Block 0025 [110]: 680b3f5dcd452651 +Block 0025 [111]: 1faa09f3557444f3 +Block 0025 [112]: 98ec5e21f49b8e57 +Block 0025 [113]: daf8ee24b8828f71 +Block 0025 [114]: 91d33ed62cd107f8 +Block 0025 [115]: 89413d1bca853d5f +Block 0025 [116]: 7fe807f969f415da +Block 0025 [117]: 67ff5407c0860624 +Block 0025 [118]: 603854576ed4f781 +Block 0025 [119]: 084738ed1f18ed62 +Block 0025 [120]: 4cdb0fae06091770 +Block 0025 [121]: b13f8bc9797ddfeb +Block 0025 [122]: 648ad341f0dca94e +Block 0025 [123]: 025348dce7ae008f +Block 0025 [124]: 048e0a463a7b8a32 +Block 0025 [125]: e1b2eeac660e780d +Block 0025 [126]: 29bac16444505a88 +Block 0025 [127]: 9cad798306f54409 +Block 0026 [ 0]: a67f2049ad6c8451 +Block 0026 [ 1]: 6e6ca1cdc41485a8 +Block 0026 [ 2]: f2ffabecd30ed9d4 +Block 0026 [ 3]: 2263bf9f96df54e5 +Block 0026 [ 4]: 5386c833d7affc6a +Block 0026 [ 5]: 9f2819f0b7f5da6b +Block 0026 [ 6]: 65221d900ac47a45 +Block 0026 [ 7]: c7a3388a192158c1 +Block 0026 [ 8]: ce3be92338e06123 +Block 0026 [ 9]: 9bc7d6a02266ff38 +Block 0026 [ 10]: a824f917c04f5b96 +Block 0026 [ 11]: ec600cae3f2419f8 +Block 0026 [ 12]: 5785857a85f7e6be +Block 0026 [ 13]: 2e6cf6e1adede0fb +Block 0026 [ 14]: 16947d46c61d02ec +Block 0026 [ 15]: ffb48b54c6461849 +Block 0026 [ 16]: 4e659132540c5954 +Block 0026 [ 17]: 39cd765cee548ebe +Block 0026 [ 18]: 65e2e928a5cbd062 +Block 0026 [ 19]: 61873257661cf542 +Block 0026 [ 20]: d3aff3680f7d74b4 +Block 0026 [ 21]: dd25b1e683c70efb +Block 0026 [ 22]: 918025d8585aaee4 +Block 0026 [ 23]: 5040001fcf34ed39 +Block 0026 [ 24]: 74156aeebd1d3057 +Block 0026 [ 25]: c4eb8075341fb9d7 +Block 0026 [ 26]: d4ae888603d85575 +Block 0026 [ 27]: 824c2294af9b2e43 +Block 0026 [ 28]: d40db17dee052e79 +Block 0026 [ 29]: c353b38b05fd93aa +Block 0026 [ 30]: fedc31fea04b7b57 +Block 0026 [ 31]: 7c62e359b5b346d5 +Block 0026 [ 32]: 529de169b8a883c2 +Block 0026 [ 33]: 3baa40cee0aafec8 +Block 0026 [ 34]: 39ea5c0da6ba803d +Block 0026 [ 35]: bb3600ed674e82db +Block 0026 [ 36]: e2cf7d3add431cd5 +Block 0026 [ 37]: 9919ac737f8e7bc1 +Block 0026 [ 38]: b1d621265207cd1b +Block 0026 [ 39]: 4124e55329618316 +Block 0026 [ 40]: 61ac39e893aa0b4a +Block 0026 [ 41]: b8828b7b916fcfd7 +Block 0026 [ 42]: 7717ca4b91f592d2 +Block 0026 [ 43]: b2d649a81b6b7715 +Block 0026 [ 44]: 94032e1f27dae77f +Block 0026 [ 45]: 91fc6ccebf3f3727 +Block 0026 [ 46]: 17cc1d27fd35298d +Block 0026 [ 47]: 484c55fc986929c6 +Block 0026 [ 48]: 262a103a08656541 +Block 0026 [ 49]: 9e528fb6c569622f +Block 0026 [ 50]: 85113abbb2977739 +Block 0026 [ 51]: c45cce441cad58db +Block 0026 [ 52]: e66de3dec4f1f53a +Block 0026 [ 53]: 6fe886047cac3746 +Block 0026 [ 54]: 37b647878b1d9d70 +Block 0026 [ 55]: 840d12b0ff087ec5 +Block 0026 [ 56]: 680aa2b9b0de658b +Block 0026 [ 57]: 35bdc3fe5b7c8413 +Block 0026 [ 58]: bba849ea8dd68a2b +Block 0026 [ 59]: e50508fec44716dc +Block 0026 [ 60]: e8218181df949251 +Block 0026 [ 61]: 76e583bfa8271ce1 +Block 0026 [ 62]: 093db4a24e8cf97f +Block 0026 [ 63]: a3198d72deba4ab1 +Block 0026 [ 64]: 8e70151c79a58a09 +Block 0026 [ 65]: 30b18f4b2a4ecc94 +Block 0026 [ 66]: efa939e486237d53 +Block 0026 [ 67]: 5a99de81200bd461 +Block 0026 [ 68]: 97c93faec22773f4 +Block 0026 [ 69]: 50cd83b3d81daef6 +Block 0026 [ 70]: a57f1cbc408a1472 +Block 0026 [ 71]: 601a83fbac217aa0 +Block 0026 [ 72]: ba61684f998db8ed +Block 0026 [ 73]: abf945da6e04b78a +Block 0026 [ 74]: 3f7f6a30a912e6fc +Block 0026 [ 75]: b5806b3204395493 +Block 0026 [ 76]: 4fbc9dc04d820d79 +Block 0026 [ 77]: ac843e3617426127 +Block 0026 [ 78]: c4a23662780b450f +Block 0026 [ 79]: b3add9936ecd3efa +Block 0026 [ 80]: 0e7adbdb1e97716f +Block 0026 [ 81]: 4855a05753a3d609 +Block 0026 [ 82]: 4a79a50f60147383 +Block 0026 [ 83]: 1a7bb1d968713322 +Block 0026 [ 84]: 560185cf7cea9af8 +Block 0026 [ 85]: 8090ae23b839fa7a +Block 0026 [ 86]: f0ef32dd60b80f4a +Block 0026 [ 87]: 75666acf1191bfac +Block 0026 [ 88]: 89122f4a6be676ed +Block 0026 [ 89]: 51c9082f91e7c815 +Block 0026 [ 90]: f57321fbf06bb01b +Block 0026 [ 91]: bf6b35695e671824 +Block 0026 [ 92]: 810270fa31267c02 +Block 0026 [ 93]: bb6d14fa78db2fd6 +Block 0026 [ 94]: 8d77c423bf297093 +Block 0026 [ 95]: f47f40b94b651b87 +Block 0026 [ 96]: ffdc7270f5ea0a0a +Block 0026 [ 97]: 110c0bed7cf02935 +Block 0026 [ 98]: 6e72a6f7e64ec1ff +Block 0026 [ 99]: 510f409d179fc3eb +Block 0026 [100]: b131bf1bf65cce12 +Block 0026 [101]: bb21fb13b27c3bd5 +Block 0026 [102]: 41148e2468bc2ea4 +Block 0026 [103]: bec352301ce4ce35 +Block 0026 [104]: d1d6655ab3dc54d1 +Block 0026 [105]: 03ebde5d7509564a +Block 0026 [106]: 8736b53e50d9254e +Block 0026 [107]: eef07ba85662fac2 +Block 0026 [108]: 866367405df3c14e +Block 0026 [109]: f4c6921e10ae40d1 +Block 0026 [110]: f84d745575f4a722 +Block 0026 [111]: 6139c48c50a9dc75 +Block 0026 [112]: 0034350a8573a8a8 +Block 0026 [113]: bd742a2290d519ad +Block 0026 [114]: 8fbf243347c92440 +Block 0026 [115]: cb51c42b54feeb1d +Block 0026 [116]: 360d009cf96e8411 +Block 0026 [117]: 4f4c61ebd49df995 +Block 0026 [118]: 0df6e047c17cb02d +Block 0026 [119]: 1875132489e84ff8 +Block 0026 [120]: 9db14fbd90640f6c +Block 0026 [121]: 4205a87bd2e27264 +Block 0026 [122]: 97da6c37e0d0f086 +Block 0026 [123]: a40bb2955b338f38 +Block 0026 [124]: ac3b50aa28c42530 +Block 0026 [125]: fc3b33ed20b81ce7 +Block 0026 [126]: 0915c6d398e25625 +Block 0026 [127]: 2e2c95a63d272437 +Block 0027 [ 0]: a94b04457a7eea5b +Block 0027 [ 1]: 3b934d4b2c4b05c1 +Block 0027 [ 2]: d36de4f08ea8241f +Block 0027 [ 3]: d8c5da183e55c800 +Block 0027 [ 4]: 798d0be96ebe4eb0 +Block 0027 [ 5]: 95b7010a3bc7d10f +Block 0027 [ 6]: 429979b7a221f329 +Block 0027 [ 7]: 2acf807b7fe97dad +Block 0027 [ 8]: a7b7429c53e9c732 +Block 0027 [ 9]: 207b679886cf1607 +Block 0027 [ 10]: 35d80c2f1ecbc709 +Block 0027 [ 11]: 7a6743313b489e3e +Block 0027 [ 12]: 450bca7213e37f0d +Block 0027 [ 13]: d204c3e3ca441327 +Block 0027 [ 14]: f0adec4a62fa0918 +Block 0027 [ 15]: 918063531c8dbfa3 +Block 0027 [ 16]: 6e3a5609838a4ba7 +Block 0027 [ 17]: 84b10132be6f1f21 +Block 0027 [ 18]: 1d7a65cf768de949 +Block 0027 [ 19]: 555bc5f7c86496e3 +Block 0027 [ 20]: b49806057b337c6a +Block 0027 [ 21]: 7568eeaada8f8866 +Block 0027 [ 22]: 2717ed3bc8dde632 +Block 0027 [ 23]: 0b277febfd999965 +Block 0027 [ 24]: 12c2942997f2b48b +Block 0027 [ 25]: bcc4355219c0f24d +Block 0027 [ 26]: e7be1d8cb552523b +Block 0027 [ 27]: 9175509980ac3f08 +Block 0027 [ 28]: 6e1453b6da39bbbb +Block 0027 [ 29]: a37b17231c4f1320 +Block 0027 [ 30]: a0a27e1f5bbb568b +Block 0027 [ 31]: da16ebc183e301a8 +Block 0027 [ 32]: b3c5c67da682c941 +Block 0027 [ 33]: 37dcdbd103c514d6 +Block 0027 [ 34]: 16ff2d29bfc64bfa +Block 0027 [ 35]: 4096c799e802154c +Block 0027 [ 36]: 59904ba66cc60d64 +Block 0027 [ 37]: 15a424885273edb0 +Block 0027 [ 38]: 1c3234b12ca31ca9 +Block 0027 [ 39]: bd6504e7e8cb0543 +Block 0027 [ 40]: 97d013f5f12883d6 +Block 0027 [ 41]: 206948310527b357 +Block 0027 [ 42]: aa674b50be674618 +Block 0027 [ 43]: f0a5f596fc0e3232 +Block 0027 [ 44]: 920409279bc2fc9c +Block 0027 [ 45]: 2ccf474d09d9aa0e +Block 0027 [ 46]: 6a8c7bdb7eb64efb +Block 0027 [ 47]: a756b71f41c37f8b +Block 0027 [ 48]: a5117f53be324b6b +Block 0027 [ 49]: 4171a67afcd26d32 +Block 0027 [ 50]: 21a3a9aaad777353 +Block 0027 [ 51]: 3755a858ffa57c1d +Block 0027 [ 52]: afc42a6207e4b2dd +Block 0027 [ 53]: aff8522b5f5d74a5 +Block 0027 [ 54]: ba69a2ef4f409d0d +Block 0027 [ 55]: b2b0b92ab9f12a08 +Block 0027 [ 56]: 21eb93c595416b78 +Block 0027 [ 57]: a3432a64639e980e +Block 0027 [ 58]: 8aa4d52c1d5aab1c +Block 0027 [ 59]: aab10fb875b1e745 +Block 0027 [ 60]: 187b116769a3ec3f +Block 0027 [ 61]: bdc6ce91397361cb +Block 0027 [ 62]: 2af6bcc7c50e4dd6 +Block 0027 [ 63]: baa220accd7571f4 +Block 0027 [ 64]: 67bf2a70cfa75599 +Block 0027 [ 65]: 12c82e4f98bf4d0b +Block 0027 [ 66]: af71e967c1cc8df4 +Block 0027 [ 67]: f4206f65d9b7c473 +Block 0027 [ 68]: 8bc2092c48b31cde +Block 0027 [ 69]: e65ddd646bb2c19d +Block 0027 [ 70]: 50103a958fb49166 +Block 0027 [ 71]: 83b31b086cae24e6 +Block 0027 [ 72]: 5473c5ef931bfc84 +Block 0027 [ 73]: 1792f55944917f79 +Block 0027 [ 74]: b29afd1445e3f3da +Block 0027 [ 75]: 71e5ed744d9305d0 +Block 0027 [ 76]: 531d8b48dac7c1b5 +Block 0027 [ 77]: 6182e94a6d8e8c99 +Block 0027 [ 78]: 8ec7ccbcf3425332 +Block 0027 [ 79]: 8a8b0b42cdb32c0b +Block 0027 [ 80]: c954b01ae022a01b +Block 0027 [ 81]: ebb1bcd82007bb85 +Block 0027 [ 82]: 73258bca7db6c40b +Block 0027 [ 83]: 0e9b383bc02dc5fb +Block 0027 [ 84]: 9e59c6692cfec4c1 +Block 0027 [ 85]: e290fea01fd49775 +Block 0027 [ 86]: 923e9787df7984d7 +Block 0027 [ 87]: d1ea99210d949bc6 +Block 0027 [ 88]: 2c50effbf9b56f5e +Block 0027 [ 89]: 6e587a90ffdd68e1 +Block 0027 [ 90]: 87343959fce072eb +Block 0027 [ 91]: 11f3166951d1ca97 +Block 0027 [ 92]: 77c0e15bce984be2 +Block 0027 [ 93]: 1bc4e230071347d9 +Block 0027 [ 94]: 02c821b44f0e8ff5 +Block 0027 [ 95]: 332b6548f6127d3b +Block 0027 [ 96]: f4385541e6afbce1 +Block 0027 [ 97]: f72f5977b5c5c6ed +Block 0027 [ 98]: 2932386da331a141 +Block 0027 [ 99]: 8bef50405d899e47 +Block 0027 [100]: 497f6baa584fa6f9 +Block 0027 [101]: 540629cf431edb97 +Block 0027 [102]: 86c980507916f687 +Block 0027 [103]: 74449f7ba5e33318 +Block 0027 [104]: 8f97362cd57e0c7e +Block 0027 [105]: a960d461bb2d1840 +Block 0027 [106]: 9f4b252316d9eb51 +Block 0027 [107]: 7c3623df2d051b80 +Block 0027 [108]: 195db846daca6692 +Block 0027 [109]: 54d546f2b2f6d64f +Block 0027 [110]: 5a59d33f102ea788 +Block 0027 [111]: 8464766e62720d0f +Block 0027 [112]: 13ca8b80ec64e90a +Block 0027 [113]: 6d0463cb48d4c035 +Block 0027 [114]: 7341120a83334b45 +Block 0027 [115]: 3124dd6543338087 +Block 0027 [116]: e5b444665d7e7853 +Block 0027 [117]: 7ff3f1e5c61bc6f7 +Block 0027 [118]: 139e7af02f838f97 +Block 0027 [119]: 11c5d0670f45901f +Block 0027 [120]: 0438e6b6dcc28c34 +Block 0027 [121]: 3d55b635792ea59a +Block 0027 [122]: 9c2161a0ae2eaa67 +Block 0027 [123]: 27b1456aa822bfdd +Block 0027 [124]: 235c3e9fc5839c4d +Block 0027 [125]: 4994a10b355fc603 +Block 0027 [126]: 9dab69bbda9885dc +Block 0027 [127]: 85868e2f304840ac +Block 0028 [ 0]: ff442bbaec0ee8f2 +Block 0028 [ 1]: 397f0ac19369cbb3 +Block 0028 [ 2]: 5dd4e0f3c854a4c2 +Block 0028 [ 3]: c0e9fb62003e329a +Block 0028 [ 4]: 3966e8fa89276742 +Block 0028 [ 5]: 1dfaa18a331d0a14 +Block 0028 [ 6]: e60263a328c6b785 +Block 0028 [ 7]: 0ccde2de16d1e234 +Block 0028 [ 8]: fa1212c9101ac939 +Block 0028 [ 9]: d312a0ca719acb8f +Block 0028 [ 10]: d505268bcce72092 +Block 0028 [ 11]: bef86b8938654712 +Block 0028 [ 12]: f9390b6b536a6e28 +Block 0028 [ 13]: 73203397a11a9ddd +Block 0028 [ 14]: 10714c45564394d8 +Block 0028 [ 15]: c48a3f6f54b5c280 +Block 0028 [ 16]: 9bf38e51f6bb8d8b +Block 0028 [ 17]: 40b6c835892e9da5 +Block 0028 [ 18]: 40a35a05db774cf5 +Block 0028 [ 19]: f583ac8c5f9a8da0 +Block 0028 [ 20]: 210fbd1e5f784271 +Block 0028 [ 21]: 281c7be77ab1715a +Block 0028 [ 22]: 4ecdc7b648a5f4a5 +Block 0028 [ 23]: 3ac0587b9fa149f2 +Block 0028 [ 24]: a83fd6762492a590 +Block 0028 [ 25]: 46276e3adefa023e +Block 0028 [ 26]: 3062f71a0b5b4db5 +Block 0028 [ 27]: 84677cc6dbdd3349 +Block 0028 [ 28]: 6a0193f318f262c2 +Block 0028 [ 29]: 85d971f7bd2ec8cd +Block 0028 [ 30]: 5e68bdf696e1caa5 +Block 0028 [ 31]: ab98223d0341c285 +Block 0028 [ 32]: cc1f28d587841e1d +Block 0028 [ 33]: 4ae6c7d78d556bbb +Block 0028 [ 34]: 1545d67077aaa97d +Block 0028 [ 35]: 6d57554ad0404144 +Block 0028 [ 36]: 3ffd7708b53f09ca +Block 0028 [ 37]: 752ac75ed9699a94 +Block 0028 [ 38]: 2b6f9e2bddd506a5 +Block 0028 [ 39]: 2e321132e9ee175e +Block 0028 [ 40]: 47e2496c8a2d1acb +Block 0028 [ 41]: 131f351bbb209db8 +Block 0028 [ 42]: bf2711d86386f027 +Block 0028 [ 43]: d9ab2f3fc427bd6c +Block 0028 [ 44]: 7395c8a0ec3bb0bf +Block 0028 [ 45]: 9b19f55f5a1d9d0b +Block 0028 [ 46]: 4c4e28b31fe9efb7 +Block 0028 [ 47]: 766aaaf6d8e58ccf +Block 0028 [ 48]: 93d602cc6df95547 +Block 0028 [ 49]: 7e7e2d6242c92532 +Block 0028 [ 50]: 2c7aa2e34ee337aa +Block 0028 [ 51]: 191e910507ff58b6 +Block 0028 [ 52]: acca633ff55014da +Block 0028 [ 53]: 616a8c612b51f84e +Block 0028 [ 54]: d99ac9561c46bb1e +Block 0028 [ 55]: afa50925b3566378 +Block 0028 [ 56]: ff89aecada6379ef +Block 0028 [ 57]: 391c1fb4b920d1c7 +Block 0028 [ 58]: 8747bfa2ff324d12 +Block 0028 [ 59]: 5d94c03b2f8cdec8 +Block 0028 [ 60]: 770a3a05a35e362a +Block 0028 [ 61]: 6cb772bc4ec41ab1 +Block 0028 [ 62]: 0f2fdc055326e8ff +Block 0028 [ 63]: 3a3b11af14ab1e63 +Block 0028 [ 64]: 129d79776bd33219 +Block 0028 [ 65]: b0506f0d0c919e36 +Block 0028 [ 66]: e7bd117a660adeb6 +Block 0028 [ 67]: d52239a183fb01aa +Block 0028 [ 68]: 95ac54ca7f4f6bc8 +Block 0028 [ 69]: 5939379f77d8b3ac +Block 0028 [ 70]: 9bb720708cf0f6d7 +Block 0028 [ 71]: 7f1d34ae76d402b3 +Block 0028 [ 72]: 6131f850ff18bade +Block 0028 [ 73]: 913ca32a0b48d34c +Block 0028 [ 74]: f34c46ff0482e064 +Block 0028 [ 75]: f155996fe258d6e3 +Block 0028 [ 76]: a49b7f75efc8d9e2 +Block 0028 [ 77]: 7e9214452d5ee55a +Block 0028 [ 78]: 4d85e8f92b2a44d5 +Block 0028 [ 79]: c67caf477cc36edd +Block 0028 [ 80]: 1a6567ad2f3daf1a +Block 0028 [ 81]: d77d2ca3f37ceebb +Block 0028 [ 82]: 6288ae549a89055b +Block 0028 [ 83]: 4a312a353b646a62 +Block 0028 [ 84]: cd5a4b9c1d058e51 +Block 0028 [ 85]: fba7578feeb5a716 +Block 0028 [ 86]: b088c6cf681457e5 +Block 0028 [ 87]: 0077380f016bda71 +Block 0028 [ 88]: 8020ddaf0bcebea8 +Block 0028 [ 89]: 9a2b154741d54daa +Block 0028 [ 90]: 1afaa7054fbe8d96 +Block 0028 [ 91]: 369d42bdf4fa66a3 +Block 0028 [ 92]: 65015d7c318f5744 +Block 0028 [ 93]: f05df78b62c00b95 +Block 0028 [ 94]: dc35b5addb87f3df +Block 0028 [ 95]: 71200e2738215b49 +Block 0028 [ 96]: 516f9ee82c4bffe0 +Block 0028 [ 97]: 786d6486ac6b32de +Block 0028 [ 98]: 3fb790dcf1083d03 +Block 0028 [ 99]: bc1d23cf4407874a +Block 0028 [100]: 5c571426ac41afe6 +Block 0028 [101]: fc65a8a0efe11ef7 +Block 0028 [102]: 3fbe1cd81cb6a3ff +Block 0028 [103]: 8ced051324b69348 +Block 0028 [104]: c30adc965eb97c7f +Block 0028 [105]: 95833707bd2b9d35 +Block 0028 [106]: ec607ffa194d628d +Block 0028 [107]: 82d8039297f79a59 +Block 0028 [108]: 9be590f65f2bfe7e +Block 0028 [109]: 6ea8bc541ef1a809 +Block 0028 [110]: 468e8a5028e309ea +Block 0028 [111]: 066d539b5cb3fc45 +Block 0028 [112]: b122605c2994f6a4 +Block 0028 [113]: e0b0a4293d357abe +Block 0028 [114]: c298743cb1546c15 +Block 0028 [115]: d12112a3bbba462e +Block 0028 [116]: 25f23407d14bf00b +Block 0028 [117]: fffa4e098bd9fca5 +Block 0028 [118]: 536c67c6b18b611a +Block 0028 [119]: dd4446f13b0cdefe +Block 0028 [120]: c35483e17e62402c +Block 0028 [121]: 2b376940537bd1f1 +Block 0028 [122]: 79f526535649257d +Block 0028 [123]: 07fab5dcdf990636 +Block 0028 [124]: d7cd70af1e091a6f +Block 0028 [125]: 1ce601ca8e8f6ff3 +Block 0028 [126]: 38660d0a553e5df2 +Block 0028 [127]: b785a3accdab6680 +Block 0029 [ 0]: 8faf4b0ab37bb4cd +Block 0029 [ 1]: 3d1c1f7d3ae8182f +Block 0029 [ 2]: df466b571761c0c9 +Block 0029 [ 3]: 2d07bc62e41c89d7 +Block 0029 [ 4]: a09dd4ea9e230e19 +Block 0029 [ 5]: 809522a586d0c419 +Block 0029 [ 6]: e680b196e8046fc5 +Block 0029 [ 7]: eaa13b4649e0c0cb +Block 0029 [ 8]: 2d3d06aa5b8edb28 +Block 0029 [ 9]: 7865ed89e33159be +Block 0029 [ 10]: 485224fbeea22d0f +Block 0029 [ 11]: a65a5f6540b240ca +Block 0029 [ 12]: 348125cd96e1f785 +Block 0029 [ 13]: aeeb91f724f6ec50 +Block 0029 [ 14]: 3f90ece311348fb9 +Block 0029 [ 15]: 0e46859f10cd1b23 +Block 0029 [ 16]: 3d8b6edd19045b53 +Block 0029 [ 17]: b6031066c4cba9da +Block 0029 [ 18]: 0dc8d49a7a957e8a +Block 0029 [ 19]: 6d1d8f8bbd92de25 +Block 0029 [ 20]: 853872816754a44d +Block 0029 [ 21]: d53c1cd854971f4d +Block 0029 [ 22]: d966f16ded474f1b +Block 0029 [ 23]: 45ce0b544d3e9b88 +Block 0029 [ 24]: 4c3a7aa58d405831 +Block 0029 [ 25]: 7e63d3e7065f17ae +Block 0029 [ 26]: 93372f660d53d0a7 +Block 0029 [ 27]: 4800a50d86bbe06d +Block 0029 [ 28]: 966a7de30936c0cc +Block 0029 [ 29]: 089a6729adb5db54 +Block 0029 [ 30]: 21f00018ba694b98 +Block 0029 [ 31]: c5c5612e86e9b676 +Block 0029 [ 32]: 30fda4daea44cdf0 +Block 0029 [ 33]: 884216b9e14f830f +Block 0029 [ 34]: f24d8260cb07fd49 +Block 0029 [ 35]: 0cc3a891ed3fd8ea +Block 0029 [ 36]: e02856a4a91db08f +Block 0029 [ 37]: ae2c54f2ccf5dc1b +Block 0029 [ 38]: 9e7ef199c3e37221 +Block 0029 [ 39]: e1cb74d4be169e03 +Block 0029 [ 40]: 51110481733e33eb +Block 0029 [ 41]: 64b33cc98342c30a +Block 0029 [ 42]: 50f64610177d09f6 +Block 0029 [ 43]: 49012867e90a48a3 +Block 0029 [ 44]: 55ea2c40bb9c7f20 +Block 0029 [ 45]: fa784ee9cbfb8d9f +Block 0029 [ 46]: bb1e86d607452f97 +Block 0029 [ 47]: da191adeae7a36c9 +Block 0029 [ 48]: c1f8675f0c312429 +Block 0029 [ 49]: 3b7517f906d8f8f3 +Block 0029 [ 50]: 71f698893dd93e57 +Block 0029 [ 51]: 239bab7f2539d70f +Block 0029 [ 52]: 3dbe941ce0653527 +Block 0029 [ 53]: 29938a8b81850f5c +Block 0029 [ 54]: bfb1c6cf4fce7c51 +Block 0029 [ 55]: b706d0ee9f81ad1e +Block 0029 [ 56]: 7d017ae67cc847d1 +Block 0029 [ 57]: 552b93624984511c +Block 0029 [ 58]: 867243a9d6d82053 +Block 0029 [ 59]: 456c49a67ef9036f +Block 0029 [ 60]: 0f6f4ca58cb23d3f +Block 0029 [ 61]: bd24cf3c5418ca87 +Block 0029 [ 62]: 7be8c1d1dc24f928 +Block 0029 [ 63]: 0ca043330b7e539e +Block 0029 [ 64]: b3ba1f6453f7bcd5 +Block 0029 [ 65]: ca549545a3d2ec8e +Block 0029 [ 66]: fcadea90e41cc1b8 +Block 0029 [ 67]: 602c84cfa6b20f66 +Block 0029 [ 68]: 5cdfbc4ae7c2c6b1 +Block 0029 [ 69]: 31f589f75d3749ef +Block 0029 [ 70]: 3e6e3d004ad60714 +Block 0029 [ 71]: 2dae53f27b8158ef +Block 0029 [ 72]: fd1e3b5a70d52eae +Block 0029 [ 73]: 6371016489f99170 +Block 0029 [ 74]: a6b8c488806d37c6 +Block 0029 [ 75]: 8831329cde00a7a7 +Block 0029 [ 76]: b36df29447c12794 +Block 0029 [ 77]: 852a80858f9d101f +Block 0029 [ 78]: 3c84dcfdecd46fff +Block 0029 [ 79]: 5b7dac0a8ffdd58a +Block 0029 [ 80]: d9dbe926eeb4fa23 +Block 0029 [ 81]: 7e6830e42b1ecaf0 +Block 0029 [ 82]: b40dbaa69df1e15b +Block 0029 [ 83]: 7f7d8f4fb9120fda +Block 0029 [ 84]: 26ed970120722676 +Block 0029 [ 85]: b4ec448d3b153327 +Block 0029 [ 86]: 75a0b7d6ceffa3d4 +Block 0029 [ 87]: efe467bc3841c69e +Block 0029 [ 88]: c0d4ffcf904aaa7e +Block 0029 [ 89]: e6bcb7717fc24d72 +Block 0029 [ 90]: ca0ebcf7b8f9fa08 +Block 0029 [ 91]: b082f39ade7a1219 +Block 0029 [ 92]: e23169e8f33a0b67 +Block 0029 [ 93]: b17ac3ff204b5cce +Block 0029 [ 94]: f4d05e9fa168d522 +Block 0029 [ 95]: b88db25f2938a3ab +Block 0029 [ 96]: 9c8ad5c2a2fecb89 +Block 0029 [ 97]: b642e3e932b49b6e +Block 0029 [ 98]: d52639e55f40db15 +Block 0029 [ 99]: ca80042bf923e26a +Block 0029 [100]: a451014b26a16f1e +Block 0029 [101]: 43dcc2aacc9c99da +Block 0029 [102]: d5496dfeb81f585b +Block 0029 [103]: d402ccce0025ff31 +Block 0029 [104]: b5dbb5516ddad03e +Block 0029 [105]: 27e1f84c7fd2e9a0 +Block 0029 [106]: 628bd072e84442c5 +Block 0029 [107]: b1b9154a8224f4be +Block 0029 [108]: 6bfdae5812e1c6f8 +Block 0029 [109]: 2fcae504e8132505 +Block 0029 [110]: 756911bf961d510e +Block 0029 [111]: 13e9e2d50966b88a +Block 0029 [112]: e6f6e771ba4662a5 +Block 0029 [113]: 869c3193f5686117 +Block 0029 [114]: 71e2fe403f536bf0 +Block 0029 [115]: 2c24c13eeafd203b +Block 0029 [116]: bc359aa26301f725 +Block 0029 [117]: 9a24bbad0f96c694 +Block 0029 [118]: ae363466f27f1397 +Block 0029 [119]: c835914f46bb961c +Block 0029 [120]: a32ebda4688b2687 +Block 0029 [121]: 6def7ad00976a80d +Block 0029 [122]: ec5057a1e29664ed +Block 0029 [123]: cb565f55f678f418 +Block 0029 [124]: 5908463419437b6d +Block 0029 [125]: 3f809409ee15556e +Block 0029 [126]: 6d2dbca4380dc585 +Block 0029 [127]: d08c46fc3a6806db +Block 0030 [ 0]: 2673e74f55281e8d +Block 0030 [ 1]: 6fe90eb7457da8ae +Block 0030 [ 2]: 540e4b56d72a5f0b +Block 0030 [ 3]: b7a76d0edc47aeea +Block 0030 [ 4]: 024292cf39046e35 +Block 0030 [ 5]: 30f439895732b133 +Block 0030 [ 6]: e61425415048bb34 +Block 0030 [ 7]: 609d4114a8c13fb7 +Block 0030 [ 8]: acafdbf6dfc05f2e +Block 0030 [ 9]: 1a2ae59a9c37f819 +Block 0030 [ 10]: c15aca088d429d16 +Block 0030 [ 11]: be74600a4a873ed0 +Block 0030 [ 12]: efd585ebe4080021 +Block 0030 [ 13]: b97042c53760080e +Block 0030 [ 14]: 74752a5c6626fbdf +Block 0030 [ 15]: 8dd34e1e8ac34303 +Block 0030 [ 16]: 6028d90d9c077f4b +Block 0030 [ 17]: 9fb5e7dda12ca4c4 +Block 0030 [ 18]: 2deecea6e979e693 +Block 0030 [ 19]: 54137a747abb3e6e +Block 0030 [ 20]: 8525896cc37fefc9 +Block 0030 [ 21]: 22819e91948ebe28 +Block 0030 [ 22]: 0c84b4ca88859926 +Block 0030 [ 23]: 7b1873fb531b24ae +Block 0030 [ 24]: a31ebd1169530f49 +Block 0030 [ 25]: 7cfe17083df06b3f +Block 0030 [ 26]: fb57eaec825a6b16 +Block 0030 [ 27]: 790885f4e350d418 +Block 0030 [ 28]: 7c9f69ffc0968483 +Block 0030 [ 29]: c27370a8319f0158 +Block 0030 [ 30]: 5a3f9b209a6e9c3c +Block 0030 [ 31]: 0de0b424b3927314 +Block 0030 [ 32]: 54398b47ec9fe8d3 +Block 0030 [ 33]: 103736f4a647d8fb +Block 0030 [ 34]: 2404fa93a1700ff0 +Block 0030 [ 35]: c57374a224da2b3c +Block 0030 [ 36]: e5cf61193ed5de57 +Block 0030 [ 37]: 5ab77e854c810cb9 +Block 0030 [ 38]: d8311483179c4a3c +Block 0030 [ 39]: 1a20963c1b6c2597 +Block 0030 [ 40]: faa542e8b73255b7 +Block 0030 [ 41]: 848f2ca099a33368 +Block 0030 [ 42]: 5510cd734cb3bc9f +Block 0030 [ 43]: 4a929bf87c2820c4 +Block 0030 [ 44]: 681ae77edf7bf1de +Block 0030 [ 45]: 6fae639ea38d29a2 +Block 0030 [ 46]: 616bacb8339d0cf7 +Block 0030 [ 47]: dbcb34373a210bed +Block 0030 [ 48]: 8032a3c8da22217f +Block 0030 [ 49]: 30701adaded4ce5b +Block 0030 [ 50]: a30850d70ad550db +Block 0030 [ 51]: cf3b45972d568ef6 +Block 0030 [ 52]: 78c85c49a224b205 +Block 0030 [ 53]: 5bc633598ccfbde3 +Block 0030 [ 54]: de6b2f772f1a0234 +Block 0030 [ 55]: 201b55b767e9b86b +Block 0030 [ 56]: 823a989a1765c637 +Block 0030 [ 57]: 2579a1ed7cd1e2ad +Block 0030 [ 58]: 03bfc58ff6722fb1 +Block 0030 [ 59]: a503f8fa679b0ad4 +Block 0030 [ 60]: 1b57b1af8e2f45a4 +Block 0030 [ 61]: 57fc7f7bcac0cacf +Block 0030 [ 62]: 7d1affd4927b5b9f +Block 0030 [ 63]: 901f27aaaf0b1abe +Block 0030 [ 64]: 5d8dcf10f365ec31 +Block 0030 [ 65]: 882189aefb46d03a +Block 0030 [ 66]: 2fe1601dbac7830f +Block 0030 [ 67]: 98b84984fd00714c +Block 0030 [ 68]: ae6d2f6efec14c11 +Block 0030 [ 69]: c9152a3abe0d1be6 +Block 0030 [ 70]: 77b7885fefb60ee8 +Block 0030 [ 71]: d3c839e65271a2fd +Block 0030 [ 72]: 295928eb632c919a +Block 0030 [ 73]: 28b2e3a4380ff380 +Block 0030 [ 74]: 979270a7e813d4ba +Block 0030 [ 75]: d9c31f525b9c8fe9 +Block 0030 [ 76]: c0d9d5975ad775b7 +Block 0030 [ 77]: 4bd3e7e7e29840b7 +Block 0030 [ 78]: e3bc3d0cfb465fd0 +Block 0030 [ 79]: 357557042ae99c1e +Block 0030 [ 80]: fbf15a3094fd1f91 +Block 0030 [ 81]: d1309d082bff6e72 +Block 0030 [ 82]: 88bac06cb9b4c7d3 +Block 0030 [ 83]: 7ddaeea4af589570 +Block 0030 [ 84]: 97558e43d7835daf +Block 0030 [ 85]: 0f317701853adbff +Block 0030 [ 86]: 9a7c0f2797b184b7 +Block 0030 [ 87]: 7e3bfe618a2ba655 +Block 0030 [ 88]: ace633529d25fab6 +Block 0030 [ 89]: e99211ba3fa2be8c +Block 0030 [ 90]: 867f7095ef7954b2 +Block 0030 [ 91]: 0fe750442983240e +Block 0030 [ 92]: 0f5253b35adc5e65 +Block 0030 [ 93]: f30a0002010b999c +Block 0030 [ 94]: c6154cda1a9af668 +Block 0030 [ 95]: c80c8afb80ed36dc +Block 0030 [ 96]: 273c700a3c4c50ec +Block 0030 [ 97]: 05f63b79716502f5 +Block 0030 [ 98]: a73664fb04fa538e +Block 0030 [ 99]: 341d1c9dc62af038 +Block 0030 [100]: 797a07a3c99fbf9d +Block 0030 [101]: 2775348e9153e991 +Block 0030 [102]: ec3239e82e480c18 +Block 0030 [103]: 3f14bf2f3a5f1137 +Block 0030 [104]: 3f797d11b5b2fa57 +Block 0030 [105]: e619c6d404875fc1 +Block 0030 [106]: 7fd919b61ce76c11 +Block 0030 [107]: 4fb5d42ca0d8d9b4 +Block 0030 [108]: 0839522fcda3518d +Block 0030 [109]: 48bebcc9957a352a +Block 0030 [110]: d856936973f9cd43 +Block 0030 [111]: ef65350eb285905e +Block 0030 [112]: 5ca32ecda2095ead +Block 0030 [113]: 395ebd8fd16af2b0 +Block 0030 [114]: 65257cb1dce18e85 +Block 0030 [115]: ae3b5c17f308d983 +Block 0030 [116]: f6b14bfd5d90c66b +Block 0030 [117]: 828b08f8a6ee1cd6 +Block 0030 [118]: af1a44ade6f2027b +Block 0030 [119]: 4918b320ae98582b +Block 0030 [120]: 15fc93c969d70364 +Block 0030 [121]: 1cc032eb533bf386 +Block 0030 [122]: 2c58b2dc22266e02 +Block 0030 [123]: e422db8d513b6687 +Block 0030 [124]: f437358d28f6d6f3 +Block 0030 [125]: 409139bd1af4c65a +Block 0030 [126]: 4e52aaa331e8b9a5 +Block 0030 [127]: 8c88340b9e5efd30 +Block 0031 [ 0]: 56b541595dcc6fb1 +Block 0031 [ 1]: 607ad882fb51aefb +Block 0031 [ 2]: 14debd64740fb455 +Block 0031 [ 3]: 26a1486601ba4014 +Block 0031 [ 4]: 6e226704fadf9b3a +Block 0031 [ 5]: 7071e97c033eecf0 +Block 0031 [ 6]: a48434d1a82936d2 +Block 0031 [ 7]: 447c72527f72e3e3 +Block 0031 [ 8]: 1348b0bc1c9707ba +Block 0031 [ 9]: eace622a944fabbe +Block 0031 [ 10]: 353ed00f73ca5d9e +Block 0031 [ 11]: a144765ce7ed48fa +Block 0031 [ 12]: 646405d2ec92b8d7 +Block 0031 [ 13]: c1373d2221f79859 +Block 0031 [ 14]: e934197d55225eaa +Block 0031 [ 15]: 80ba317a25065d33 +Block 0031 [ 16]: 33697268b6033e42 +Block 0031 [ 17]: e92077cb22a36918 +Block 0031 [ 18]: 1809cf4caffa039d +Block 0031 [ 19]: f83303c5920dfcc5 +Block 0031 [ 20]: f736cbeefc9ce798 +Block 0031 [ 21]: 3b54d82b41b098e0 +Block 0031 [ 22]: 335107c0a6b0c3d1 +Block 0031 [ 23]: 7a4df775b24a3cd6 +Block 0031 [ 24]: 25f851e8f3bd76d3 +Block 0031 [ 25]: b9d70e49f5750a56 +Block 0031 [ 26]: ae86aeb12f2305d7 +Block 0031 [ 27]: 12d00c57605652d8 +Block 0031 [ 28]: 44b7e9c35a83480a +Block 0031 [ 29]: 35cf1a769379beea +Block 0031 [ 30]: 0e3a103e7f95bb7e +Block 0031 [ 31]: 17023e6b0b5d90b8 +Block 0031 [ 32]: 2460dfb3f3d65760 +Block 0031 [ 33]: 1835e0a086678329 +Block 0031 [ 34]: 15e390201680a99f +Block 0031 [ 35]: e754ce9be5f9cd0c +Block 0031 [ 36]: b5cb81de27f762b5 +Block 0031 [ 37]: 738a4e685c3e6133 +Block 0031 [ 38]: bae8a4bbffd88861 +Block 0031 [ 39]: 38adfc6c4f01cace +Block 0031 [ 40]: ff79ca79d67eb124 +Block 0031 [ 41]: a4865b7a5ec5e9cb +Block 0031 [ 42]: fc64a20ca7eaa3f1 +Block 0031 [ 43]: 8eb112bdcab799a4 +Block 0031 [ 44]: 96764171a7ac544b +Block 0031 [ 45]: f0a6e23ac5949f6c +Block 0031 [ 46]: 79eae6371346533b +Block 0031 [ 47]: e4d4efb218c6aa83 +Block 0031 [ 48]: 2104d0468931261a +Block 0031 [ 49]: 4247e67e1ace7390 +Block 0031 [ 50]: 45d7d7a54dabbd76 +Block 0031 [ 51]: 4fd1267dffc9b30e +Block 0031 [ 52]: 69d51e78aa8db238 +Block 0031 [ 53]: 4329981502b3079a +Block 0031 [ 54]: a730594950e72400 +Block 0031 [ 55]: 3092c8aebb21060d +Block 0031 [ 56]: d5b8b21a483df5f7 +Block 0031 [ 57]: 6d38f87b8f847e91 +Block 0031 [ 58]: 7a258124daedb431 +Block 0031 [ 59]: 93a907049ee66c94 +Block 0031 [ 60]: 494b9730d1836f3c +Block 0031 [ 61]: 9114899e4a54157c +Block 0031 [ 62]: 44f5b117a277c5d1 +Block 0031 [ 63]: ddbb3504c7504716 +Block 0031 [ 64]: 44a033f4e223796c +Block 0031 [ 65]: 15cb2a4b270cef17 +Block 0031 [ 66]: 04b33e557ed91752 +Block 0031 [ 67]: e19d95ce702d48ca +Block 0031 [ 68]: 562375617142ee07 +Block 0031 [ 69]: 5a3bd82c7c20573f +Block 0031 [ 70]: 226cc32237617958 +Block 0031 [ 71]: f9e57d96d95d4758 +Block 0031 [ 72]: f2a9a8735160284d +Block 0031 [ 73]: ab7f9feb2455068f +Block 0031 [ 74]: c8a8382e34dc0830 +Block 0031 [ 75]: 8408be4da2bfdb2f +Block 0031 [ 76]: 6b917886a8e3169a +Block 0031 [ 77]: 739213ba742858f5 +Block 0031 [ 78]: ea55bddc54068058 +Block 0031 [ 79]: b5cb8166dd28d3a4 +Block 0031 [ 80]: a3aa143acf025806 +Block 0031 [ 81]: 3b2ee2b11caeea07 +Block 0031 [ 82]: 30d6c892ab7437e7 +Block 0031 [ 83]: 3ff9e26a35996936 +Block 0031 [ 84]: be4e56b1184d4dce +Block 0031 [ 85]: b6b0e4754d83366c +Block 0031 [ 86]: 2588d4680fcffa21 +Block 0031 [ 87]: 328dba1abda66139 +Block 0031 [ 88]: d4af6ec06461e8b2 +Block 0031 [ 89]: d123dea841375fe7 +Block 0031 [ 90]: e6492ccb67b26dd4 +Block 0031 [ 91]: 0906e849a240d13b +Block 0031 [ 92]: 0572c95c7c1d8032 +Block 0031 [ 93]: 4292844af9422a9e +Block 0031 [ 94]: aa719cd495649d5a +Block 0031 [ 95]: 718dd218c44e6a0b +Block 0031 [ 96]: fd114114a3789893 +Block 0031 [ 97]: 8c809ab7f96a4627 +Block 0031 [ 98]: 32c05157969648d3 +Block 0031 [ 99]: 76157a8d56ae11c6 +Block 0031 [100]: ca3d325fbf391e9a +Block 0031 [101]: 3af3fd2c41d20c1c +Block 0031 [102]: f903178e5dc9820b +Block 0031 [103]: 4f4d44b8f166f14b +Block 0031 [104]: 4a95f1cea33d5d91 +Block 0031 [105]: 23070893e589cbf9 +Block 0031 [106]: 4d25eed14ef764d4 +Block 0031 [107]: 0f3c464dbdf7cd1d +Block 0031 [108]: 8e3fef7b872504a5 +Block 0031 [109]: 113fe6e452255e08 +Block 0031 [110]: e9ec8f20a1e13b2a +Block 0031 [111]: 5b6ae06cea1b26d8 +Block 0031 [112]: b644922c1917bc5c +Block 0031 [113]: 1c760a6042dae15e +Block 0031 [114]: d5faba8f84e17a16 +Block 0031 [115]: 5401a69a243aa03e +Block 0031 [116]: 11ec3f83197a79e4 +Block 0031 [117]: 10cd56b78d507a76 +Block 0031 [118]: 4635cae680355717 +Block 0031 [119]: 2686da0dc5e13c02 +Block 0031 [120]: c9587e5ee5d0ed17 +Block 0031 [121]: cdb806b4f535e84a +Block 0031 [122]: 1e58ef0ea43a972f +Block 0031 [123]: 7af03e7afd1ff2e4 +Block 0031 [124]: 7f9f6d7b2f0da6f5 +Block 0031 [125]: 9f01140fa64778e6 +Block 0031 [126]: 3e66dc822c734438 +Block 0031 [127]: b3e7ac8ca5ed6ed9 +Tag: b6 46 15 f0 77 89 b6 6b 64 5b 67 ee 9e d3 b3 77 ae 35 0b 6b fc bb 0f c9 51 41 ea 8f 32 26 13 c0 diff --git a/deps/phc-winner-argon2-20190702/kats/argon2id_v16.shasum b/deps/phc-winner-argon2-20190702/kats/argon2id_v16.shasum new file mode 100644 index 000000000..33f1f4010 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/argon2id_v16.shasum @@ -0,0 +1 @@ +680774be1d3ad2e74bbc56ee715dd6eb97a58279bf22edc57d00e840ca1ae469 argon2id_v16 diff --git a/deps/phc-winner-argon2-20190702/kats/check-sums.ps1 b/deps/phc-winner-argon2-20190702/kats/check-sums.ps1 new file mode 100644 index 000000000..36307bd7f --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/check-sums.ps1 @@ -0,0 +1,42 @@ +Set-Variable tempfile -option Constant -value "tempfile" + +function hash($path) { + $fullPath = Resolve-Path $path + $hash = new-object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider + + $contents = [IO.File]::ReadAllText($fullPath) -replace "`r`n?", "`n" + # create UTF-8 encoding without signature + $utf8 = New-Object System.Text.UTF8Encoding $false + # write the text back + [IO.File]::WriteAllText($tempfile, $contents, $utf8) + + $file = [System.IO.File]::Open($tempfile,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read) + $result = [System.BitConverter]::ToString($hash.ComputeHash($file)) + $file.Dispose() + + if (Test-Path $tempfile) { + Remove-Item $tempfile + } + + return $result +} + +function main() { + $files = $(Get-ChildItem * | Where-Object { $_.Name -match '^[a-z2]*(_v)?[0-9]*$' } | select -ExpandProperty name) + + foreach ($file in $files) { + $new = $(hash $file).replace("-","") + $new = $new.ToLower() + + $old=$(Get-Content $file".shasum") + $old = $old.Substring(0, $old.IndexOf(" ")) + + if ($new -eq $old) { + Write-Host $file "`tOK" + } else { + Write-Host $file "`tERROR" + } + } +} + +main diff --git a/deps/phc-winner-argon2-20190702/kats/check-sums.sh b/deps/phc-winner-argon2-20190702/kats/check-sums.sh new file mode 100644 index 000000000..b297a162e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/check-sums.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +for file in `ls | grep '^[a-z2]*\(_v\)\?[0-9]*$' | xargs` +do + new=`shasum -a 256 $file` + old=`cat $file.shasum` + if [ "$new" = "$old" ] + then + echo $file "\t" OK + else + echo $file "\t" ERROR + fi +done diff --git a/deps/phc-winner-argon2-20190702/kats/test.ps1 b/deps/phc-winner-argon2-20190702/kats/test.ps1 new file mode 100644 index 000000000..d5db5b6ba --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/test.ps1 @@ -0,0 +1,50 @@ +$ErrorActionPreference = "Stop" + +Set-Variable tempfile -option Constant -value "tempfile" + +function CompareFiles($f1, $f2, $i) { + $f1_content = $(Get-Content $f1) + $f2_content = $(Get-Content $f2) + + if (Compare-Object $f1_content $f2_content) { + Write-Host -NoNewline "ERROR" + exit $i + } else { + Write-Host -NoNewline "OK" + } +} + +function main() { + $i = 0 + foreach ($opt in @("Ref", "Opt")) { + Write-Output "$opt" + + foreach ($version in @(16, 19)) { + foreach ($type in @("i", "d", "id")) { + $i++ + + if ("Ref" -eq $opt) { + vs2015\build\Argon2RefGenKAT.exe $type $version > $tempfile + } else { + vs2015\build\Argon2OptGenKAT.exe $type $version > $tempfile + } + + if (19 -eq $version) { + $kats = "kats\argon2" + $type + } else { + $kats = "kats\argon2" + $type + "_v" + $version + } + + Write-Host -NoNewline "Argon2$type v=$version : " + CompareFiles $tempfile $kats $i + Write-Output "" + } + } + } + + if (Test-Path $tempfile) { + Remove-Item $tempfile + } +} + +main diff --git a/deps/phc-winner-argon2-20190702/kats/test.sh b/deps/phc-winner-argon2-20190702/kats/test.sh new file mode 100644 index 000000000..b32097546 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/kats/test.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +for opttest in "" "OPTTEST=1" +do + if [ "" = "$opttest" ] + then + printf "Default build\n" + else + printf "Force OPTTEST=1\n" + fi + + make genkat $opttest > /dev/null + if [ $? -ne 0 ] + then + exit $? + fi + + i=0 + for version in 16 19 + do + for type in i d id + do + i=$(($i+1)) + + printf "argon2$type v=$version: " + + if [ 19 -eq $version ] + then + kats="kats/argon2"$type + else + kats="kats/argon2"$type"_v"$version + fi + + ./genkat $type $version > tmp + if diff tmp $kats + then + printf "OK" + else + printf "ERROR" + exit $i + fi + printf "\n" + done + done +done + +rm -f tmp + +exit 0 diff --git a/deps/phc-winner-argon2-20190702/libargon2.pc.in b/deps/phc-winner-argon2-20190702/libargon2.pc.in new file mode 100644 index 000000000..718532497 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/libargon2.pc.in @@ -0,0 +1,18 @@ +# libargon2 info for pkg-config +## Template for downstream installers: +## - replace @UPSTREAM_VER@ with current version, e.g. '20160406' +## - replace @HOST_MULTIARCH@ with target arch lib, e.g. 'lib', 'lib/x86_64-linux-gnu' or 'lib64' +## - replace @PREFIX@ with install path, e.g. '/usr', '/usr/local', '/usr/pkg' +## - replace @INCLUDE@ with incluse path, e.g. 'include' or 'include/argon2' + +prefix=@PREFIX@ +exec_prefix=${prefix} +libdir=${prefix}/@HOST_MULTIARCH@ +includedir=${prefix}/@INCLUDE@ + +Name: libargon2 +Description: Development libraries for libargon2 +Version: @UPSTREAM_VER@ +Libs: -L${libdir} -largon2 @EXTRA_LIBS@ +Cflags: -I${includedir} +URL: https://github.com/P-H-C/phc-winner-argon2 diff --git a/deps/phc-winner-argon2-20190702/man/argon2.1 b/deps/phc-winner-argon2-20190702/man/argon2.1 new file mode 100644 index 000000000..77c0f0777 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/man/argon2.1 @@ -0,0 +1,57 @@ +.TH ARGON2 "1" "April 2016" "argon2 " "User Commands" + +.SH NAME +argon2 \- generate argon2 hashes + +.SH SYNOPSIS +.B argon2 salt +.RB [ OPTIONS ] + +.SH DESCRIPTION +Generate Argon2 hashes from the command line. + +The supplied salt (the first argument to the command) must be at least +8 octets in length, and the password is supplied on standard input. + +By default, this uses Argon2i variant (where memory access is +independent of secret data) which is the preferred one for password +hashing and password-based key derivation. + +.SH OPTIONS +.TP +.B \-h +Display tool usage +.TP +.B \-d +Use Argon2d instead of Argon2i (Argon2i is the default) +.TP +.B \-id +Use Argon2id instead of Argon2i (Argon2i is the default) +.TP +.BI \-t " N" +Sets the number of iterations to N (default = 3) +.TP +.BI \-m " N" +Sets the memory usage of 2^N KiB (default = 12) +.TP +.BI \-p " N" +Sets parallelism to N threads (default = 1) +.TP +.BI \-l " N" +Sets hash output length to N bytes (default = 32) +.TP +.B \-e +Output only encoded hash +.TP +.B \-r +Output only the raw bytes of the hash +.TP +.B \-v (10|13) +Argon2 version (defaults to the most recent version, currently 13) + +.SH COPYRIGHT +This manpage was written by \fBDaniel Kahn Gillmor\fR for the Debian +distribution (but may be used by others). It is released, like the +rest of this Argon2 implementation, under a dual license. You may use this work +under the terms of a Creative Commons CC0 1.0 License/Waiver or the Apache +Public License 2.0, at your option. diff --git a/deps/phc-winner-argon2-20190702/src/argon2.c b/deps/phc-winner-argon2-20190702/src/argon2.c new file mode 100644 index 000000000..795b429e7 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/argon2.c @@ -0,0 +1,452 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "argon2.h" +#include "encoding.h" +#include "core.h" + +const char *argon2_type2string(argon2_type type, int uppercase) { + switch (type) { + case Argon2_d: + return uppercase ? "Argon2d" : "argon2d"; + case Argon2_i: + return uppercase ? "Argon2i" : "argon2i"; + case Argon2_id: + return uppercase ? "Argon2id" : "argon2id"; + } + + return NULL; +} + +int argon2_ctx(argon2_context *context, argon2_type type) { + /* 1. Validate all inputs */ + int result = validate_inputs(context); + uint32_t memory_blocks, segment_length; + argon2_instance_t instance; + + if (ARGON2_OK != result) { + return result; + } + + if (Argon2_d != type && Argon2_i != type && Argon2_id != type) { + return ARGON2_INCORRECT_TYPE; + } + + /* 2. Align memory size */ + /* Minimum memory_blocks = 8L blocks, where L is the number of lanes */ + memory_blocks = context->m_cost; + + if (memory_blocks < 2 * ARGON2_SYNC_POINTS * context->lanes) { + memory_blocks = 2 * ARGON2_SYNC_POINTS * context->lanes; + } + + segment_length = memory_blocks / (context->lanes * ARGON2_SYNC_POINTS); + /* Ensure that all segments have equal length */ + memory_blocks = segment_length * (context->lanes * ARGON2_SYNC_POINTS); + + instance.version = context->version; + instance.memory = NULL; + instance.passes = context->t_cost; + instance.memory_blocks = memory_blocks; + instance.segment_length = segment_length; + instance.lane_length = segment_length * ARGON2_SYNC_POINTS; + instance.lanes = context->lanes; + instance.threads = context->threads; + instance.type = type; + + if (instance.threads > instance.lanes) { + instance.threads = instance.lanes; + } + + /* 3. Initialization: Hashing inputs, allocating memory, filling first + * blocks + */ + result = initialize(&instance, context); + + if (ARGON2_OK != result) { + return result; + } + + /* 4. Filling memory */ + result = fill_memory_blocks(&instance); + + if (ARGON2_OK != result) { + return result; + } + /* 5. Finalization */ + finalize(context, &instance); + + return ARGON2_OK; +} + +int argon2_hash(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, const size_t saltlen, + void *hash, const size_t hashlen, char *encoded, + const size_t encodedlen, argon2_type type, + const uint32_t version){ + + argon2_context context; + int result; + uint8_t *out; + + if (pwdlen > ARGON2_MAX_PWD_LENGTH) { + return ARGON2_PWD_TOO_LONG; + } + + if (saltlen > ARGON2_MAX_SALT_LENGTH) { + return ARGON2_SALT_TOO_LONG; + } + + if (hashlen > ARGON2_MAX_OUTLEN) { + return ARGON2_OUTPUT_TOO_LONG; + } + + if (hashlen < ARGON2_MIN_OUTLEN) { + return ARGON2_OUTPUT_TOO_SHORT; + } + + out = malloc(hashlen); + if (!out) { + return ARGON2_MEMORY_ALLOCATION_ERROR; + } + + context.out = (uint8_t *)out; + context.outlen = (uint32_t)hashlen; + context.pwd = CONST_CAST(uint8_t *)pwd; + context.pwdlen = (uint32_t)pwdlen; + context.salt = CONST_CAST(uint8_t *)salt; + context.saltlen = (uint32_t)saltlen; + context.secret = NULL; + context.secretlen = 0; + context.ad = NULL; + context.adlen = 0; + context.t_cost = t_cost; + context.m_cost = m_cost; + context.lanes = parallelism; + context.threads = parallelism; + context.allocate_cbk = NULL; + context.free_cbk = NULL; + context.flags = ARGON2_DEFAULT_FLAGS; + context.version = version; + + result = argon2_ctx(&context, type); + + if (result != ARGON2_OK) { + clear_internal_memory(out, hashlen); + free(out); + return result; + } + + /* if raw hash requested, write it */ + if (hash) { + memcpy(hash, out, hashlen); + } + + /* if encoding requested, write it */ + if (encoded && encodedlen) { + if (encode_string(encoded, encodedlen, &context, type) != ARGON2_OK) { + clear_internal_memory(out, hashlen); /* wipe buffers if error */ + clear_internal_memory(encoded, encodedlen); + free(out); + return ARGON2_ENCODING_FAIL; + } + } + clear_internal_memory(out, hashlen); + free(out); + + return ARGON2_OK; +} + +int argon2i_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, const size_t hashlen, + char *encoded, const size_t encodedlen) { + + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + NULL, hashlen, encoded, encodedlen, Argon2_i, + ARGON2_VERSION_NUMBER); +} + +int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, const size_t hashlen) { + + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + hash, hashlen, NULL, 0, Argon2_i, ARGON2_VERSION_NUMBER); +} + +int argon2d_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, const size_t hashlen, + char *encoded, const size_t encodedlen) { + + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + NULL, hashlen, encoded, encodedlen, Argon2_d, + ARGON2_VERSION_NUMBER); +} + +int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, const size_t hashlen) { + + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + hash, hashlen, NULL, 0, Argon2_d, ARGON2_VERSION_NUMBER); +} + +int argon2id_hash_encoded(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, const size_t hashlen, + char *encoded, const size_t encodedlen) { + + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + NULL, hashlen, encoded, encodedlen, Argon2_id, + ARGON2_VERSION_NUMBER); +} + +int argon2id_hash_raw(const uint32_t t_cost, const uint32_t m_cost, + const uint32_t parallelism, const void *pwd, + const size_t pwdlen, const void *salt, + const size_t saltlen, void *hash, const size_t hashlen) { + return argon2_hash(t_cost, m_cost, parallelism, pwd, pwdlen, salt, saltlen, + hash, hashlen, NULL, 0, Argon2_id, + ARGON2_VERSION_NUMBER); +} + +static int argon2_compare(const uint8_t *b1, const uint8_t *b2, size_t len) { + size_t i; + uint8_t d = 0U; + + for (i = 0U; i < len; i++) { + d |= b1[i] ^ b2[i]; + } + return (int)((1 & ((d - 1) >> 8)) - 1); +} + +int argon2_verify(const char *encoded, const void *pwd, const size_t pwdlen, + argon2_type type) { + + argon2_context ctx; + uint8_t *desired_result = NULL; + + int ret = ARGON2_OK; + + size_t encoded_len; + uint32_t max_field_len; + + if (pwdlen > ARGON2_MAX_PWD_LENGTH) { + return ARGON2_PWD_TOO_LONG; + } + + if (encoded == NULL) { + return ARGON2_DECODING_FAIL; + } + + encoded_len = strlen(encoded); + if (encoded_len > UINT32_MAX) { + return ARGON2_DECODING_FAIL; + } + + /* No field can be longer than the encoded length */ + max_field_len = (uint32_t)encoded_len; + + ctx.saltlen = max_field_len; + ctx.outlen = max_field_len; + + ctx.salt = malloc(ctx.saltlen); + ctx.out = malloc(ctx.outlen); + if (!ctx.salt || !ctx.out) { + ret = ARGON2_MEMORY_ALLOCATION_ERROR; + goto fail; + } + + ctx.pwd = (uint8_t *)pwd; + ctx.pwdlen = (uint32_t)pwdlen; + + ret = decode_string(&ctx, encoded, type); + if (ret != ARGON2_OK) { + goto fail; + } + + /* Set aside the desired result, and get a new buffer. */ + desired_result = ctx.out; + ctx.out = malloc(ctx.outlen); + if (!ctx.out) { + ret = ARGON2_MEMORY_ALLOCATION_ERROR; + goto fail; + } + + ret = argon2_verify_ctx(&ctx, (char *)desired_result, type); + if (ret != ARGON2_OK) { + goto fail; + } + +fail: + free(ctx.salt); + free(ctx.out); + free(desired_result); + + return ret; +} + +int argon2i_verify(const char *encoded, const void *pwd, const size_t pwdlen) { + + return argon2_verify(encoded, pwd, pwdlen, Argon2_i); +} + +int argon2d_verify(const char *encoded, const void *pwd, const size_t pwdlen) { + + return argon2_verify(encoded, pwd, pwdlen, Argon2_d); +} + +int argon2id_verify(const char *encoded, const void *pwd, const size_t pwdlen) { + + return argon2_verify(encoded, pwd, pwdlen, Argon2_id); +} + +int argon2d_ctx(argon2_context *context) { + return argon2_ctx(context, Argon2_d); +} + +int argon2i_ctx(argon2_context *context) { + return argon2_ctx(context, Argon2_i); +} + +int argon2id_ctx(argon2_context *context) { + return argon2_ctx(context, Argon2_id); +} + +int argon2_verify_ctx(argon2_context *context, const char *hash, + argon2_type type) { + int ret = argon2_ctx(context, type); + if (ret != ARGON2_OK) { + return ret; + } + + if (argon2_compare((uint8_t *)hash, context->out, context->outlen)) { + return ARGON2_VERIFY_MISMATCH; + } + + return ARGON2_OK; +} + +int argon2d_verify_ctx(argon2_context *context, const char *hash) { + return argon2_verify_ctx(context, hash, Argon2_d); +} + +int argon2i_verify_ctx(argon2_context *context, const char *hash) { + return argon2_verify_ctx(context, hash, Argon2_i); +} + +int argon2id_verify_ctx(argon2_context *context, const char *hash) { + return argon2_verify_ctx(context, hash, Argon2_id); +} + +const char *argon2_error_message(int error_code) { + switch (error_code) { + case ARGON2_OK: + return "OK"; + case ARGON2_OUTPUT_PTR_NULL: + return "Output pointer is NULL"; + case ARGON2_OUTPUT_TOO_SHORT: + return "Output is too short"; + case ARGON2_OUTPUT_TOO_LONG: + return "Output is too long"; + case ARGON2_PWD_TOO_SHORT: + return "Password is too short"; + case ARGON2_PWD_TOO_LONG: + return "Password is too long"; + case ARGON2_SALT_TOO_SHORT: + return "Salt is too short"; + case ARGON2_SALT_TOO_LONG: + return "Salt is too long"; + case ARGON2_AD_TOO_SHORT: + return "Associated data is too short"; + case ARGON2_AD_TOO_LONG: + return "Associated data is too long"; + case ARGON2_SECRET_TOO_SHORT: + return "Secret is too short"; + case ARGON2_SECRET_TOO_LONG: + return "Secret is too long"; + case ARGON2_TIME_TOO_SMALL: + return "Time cost is too small"; + case ARGON2_TIME_TOO_LARGE: + return "Time cost is too large"; + case ARGON2_MEMORY_TOO_LITTLE: + return "Memory cost is too small"; + case ARGON2_MEMORY_TOO_MUCH: + return "Memory cost is too large"; + case ARGON2_LANES_TOO_FEW: + return "Too few lanes"; + case ARGON2_LANES_TOO_MANY: + return "Too many lanes"; + case ARGON2_PWD_PTR_MISMATCH: + return "Password pointer is NULL, but password length is not 0"; + case ARGON2_SALT_PTR_MISMATCH: + return "Salt pointer is NULL, but salt length is not 0"; + case ARGON2_SECRET_PTR_MISMATCH: + return "Secret pointer is NULL, but secret length is not 0"; + case ARGON2_AD_PTR_MISMATCH: + return "Associated data pointer is NULL, but ad length is not 0"; + case ARGON2_MEMORY_ALLOCATION_ERROR: + return "Memory allocation error"; + case ARGON2_FREE_MEMORY_CBK_NULL: + return "The free memory callback is NULL"; + case ARGON2_ALLOCATE_MEMORY_CBK_NULL: + return "The allocate memory callback is NULL"; + case ARGON2_INCORRECT_PARAMETER: + return "Argon2_Context context is NULL"; + case ARGON2_INCORRECT_TYPE: + return "There is no such version of Argon2"; + case ARGON2_OUT_PTR_MISMATCH: + return "Output pointer mismatch"; + case ARGON2_THREADS_TOO_FEW: + return "Not enough threads"; + case ARGON2_THREADS_TOO_MANY: + return "Too many threads"; + case ARGON2_MISSING_ARGS: + return "Missing arguments"; + case ARGON2_ENCODING_FAIL: + return "Encoding failed"; + case ARGON2_DECODING_FAIL: + return "Decoding failed"; + case ARGON2_THREAD_FAIL: + return "Threading failure"; + case ARGON2_DECODING_LENGTH_FAIL: + return "Some of encoded parameters are too long or too short"; + case ARGON2_VERIFY_MISMATCH: + return "The password does not match the supplied hash"; + default: + return "Unknown error code"; + } +} + +size_t argon2_encodedlen(uint32_t t_cost, uint32_t m_cost, uint32_t parallelism, + uint32_t saltlen, uint32_t hashlen, argon2_type type) { + return strlen("$$v=$m=,t=,p=$$") + strlen(argon2_type2string(type, 0)) + + numlen(t_cost) + numlen(m_cost) + numlen(parallelism) + + b64len(saltlen) + b64len(hashlen) + numlen(ARGON2_VERSION_NUMBER) + 1; +} diff --git a/deps/phc-winner-argon2-20190702/src/bench.c b/deps/phc-winner-argon2-20190702/src/bench.c new file mode 100644 index 000000000..20a22869d --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/bench.c @@ -0,0 +1,111 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif + +#include "argon2.h" + +static uint64_t rdtsc(void) { +#ifdef _MSC_VER + return __rdtsc(); +#else +#if defined(__amd64__) || defined(__x86_64__) + uint64_t rax, rdx; + __asm__ __volatile__("rdtsc" : "=a"(rax), "=d"(rdx) : :); + return (rdx << 32) | rax; +#elif defined(__i386__) || defined(__i386) || defined(__X86__) + uint64_t rax; + __asm__ __volatile__("rdtsc" : "=A"(rax) : :); + return rax; +#else +#error "Not implemented!" +#endif +#endif +} + +/* + * Benchmarks Argon2 with salt length 16, password length 16, t_cost 3, + and different m_cost and threads + */ +static void benchmark() { +#define BENCH_OUTLEN 16 +#define BENCH_INLEN 16 + const uint32_t inlen = BENCH_INLEN; + const unsigned outlen = BENCH_OUTLEN; + unsigned char out[BENCH_OUTLEN]; + unsigned char pwd_array[BENCH_INLEN]; + unsigned char salt_array[BENCH_INLEN]; +#undef BENCH_INLEN +#undef BENCH_OUTLEN + + uint32_t t_cost = 3; + uint32_t m_cost; + uint32_t thread_test[4] = {1, 2, 4, 8}; + argon2_type types[3] = {Argon2_i, Argon2_d, Argon2_id}; + + memset(pwd_array, 0, inlen); + memset(salt_array, 1, inlen); + + for (m_cost = (uint32_t)1 << 10; m_cost <= (uint32_t)1 << 22; m_cost *= 2) { + unsigned i; + for (i = 0; i < 4; ++i) { + double run_time = 0; + uint32_t thread_n = thread_test[i]; + + unsigned j; + for (j = 0; j < 3; ++j) { + clock_t start_time, stop_time; + uint64_t start_cycles, stop_cycles; + uint64_t delta; + double mcycles; + + argon2_type type = types[j]; + start_time = clock(); + start_cycles = rdtsc(); + + argon2_hash(t_cost, m_cost, thread_n, pwd_array, inlen, + salt_array, inlen, out, outlen, NULL, 0, type, + ARGON2_VERSION_NUMBER); + + stop_cycles = rdtsc(); + stop_time = clock(); + + delta = (stop_cycles - start_cycles) / (m_cost); + mcycles = (double)(stop_cycles - start_cycles) / (1UL << 20); + run_time += ((double)stop_time - start_time) / (CLOCKS_PER_SEC); + + printf("%s %d iterations %d MiB %d threads: %2.2f cpb %2.2f " + "Mcycles \n", argon2_type2string(type, 1), t_cost, + m_cost >> 10, thread_n, (float)delta / 1024, mcycles); + } + + printf("%2.4f seconds\n\n", run_time); + } + } +} + +int main() { + benchmark(); + return ARGON2_OK; +} diff --git a/deps/phc-winner-argon2-20190702/src/blake2/blake2-impl.h b/deps/phc-winner-argon2-20190702/src/blake2/blake2-impl.h new file mode 100644 index 000000000..241f0beb3 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/blake2/blake2-impl.h @@ -0,0 +1,156 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef PORTABLE_BLAKE2_IMPL_H +#define PORTABLE_BLAKE2_IMPL_H + +#include +#include + +#if defined(_MSC_VER) +#define BLAKE2_INLINE __inline +#elif defined(__GNUC__) || defined(__clang__) +#define BLAKE2_INLINE __inline__ +#else +#define BLAKE2_INLINE +#endif + +/* Argon2 Team - Begin Code */ +/* + Not an exhaustive list, but should cover the majority of modern platforms + Additionally, the code will always be correct---this is only a performance + tweak. +*/ +#if (defined(__BYTE_ORDER__) && \ + (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) || \ + defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__MIPSEL__) || \ + defined(__AARCH64EL__) || defined(__amd64__) || defined(__i386__) || \ + defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64) || \ + defined(_M_ARM) +#define NATIVE_LITTLE_ENDIAN +#endif +/* Argon2 Team - End Code */ + +static BLAKE2_INLINE uint32_t load32(const void *src) { +#if defined(NATIVE_LITTLE_ENDIAN) + uint32_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = (const uint8_t *)src; + uint32_t w = *p++; + w |= (uint32_t)(*p++) << 8; + w |= (uint32_t)(*p++) << 16; + w |= (uint32_t)(*p++) << 24; + return w; +#endif +} + +static BLAKE2_INLINE uint64_t load64(const void *src) { +#if defined(NATIVE_LITTLE_ENDIAN) + uint64_t w; + memcpy(&w, src, sizeof w); + return w; +#else + const uint8_t *p = (const uint8_t *)src; + uint64_t w = *p++; + w |= (uint64_t)(*p++) << 8; + w |= (uint64_t)(*p++) << 16; + w |= (uint64_t)(*p++) << 24; + w |= (uint64_t)(*p++) << 32; + w |= (uint64_t)(*p++) << 40; + w |= (uint64_t)(*p++) << 48; + w |= (uint64_t)(*p++) << 56; + return w; +#endif +} + +static BLAKE2_INLINE void store32(void *dst, uint32_t w) { +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +#endif +} + +static BLAKE2_INLINE void store64(void *dst, uint64_t w) { +#if defined(NATIVE_LITTLE_ENDIAN) + memcpy(dst, &w, sizeof w); +#else + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +#endif +} + +static BLAKE2_INLINE uint64_t load48(const void *src) { + const uint8_t *p = (const uint8_t *)src; + uint64_t w = *p++; + w |= (uint64_t)(*p++) << 8; + w |= (uint64_t)(*p++) << 16; + w |= (uint64_t)(*p++) << 24; + w |= (uint64_t)(*p++) << 32; + w |= (uint64_t)(*p++) << 40; + return w; +} + +static BLAKE2_INLINE void store48(void *dst, uint64_t w) { + uint8_t *p = (uint8_t *)dst; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; + w >>= 8; + *p++ = (uint8_t)w; +} + +static BLAKE2_INLINE uint32_t rotr32(const uint32_t w, const unsigned c) { + return (w >> c) | (w << (32 - c)); +} + +static BLAKE2_INLINE uint64_t rotr64(const uint64_t w, const unsigned c) { + return (w >> c) | (w << (64 - c)); +} + +void clear_internal_memory(void *v, size_t n); + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/blake2/blake2.h b/deps/phc-winner-argon2-20190702/src/blake2/blake2.h new file mode 100644 index 000000000..57276a776 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/blake2/blake2.h @@ -0,0 +1,89 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef PORTABLE_BLAKE2_H +#define PORTABLE_BLAKE2_H + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +enum blake2b_constant { + BLAKE2B_BLOCKBYTES = 128, + BLAKE2B_OUTBYTES = 64, + BLAKE2B_KEYBYTES = 64, + BLAKE2B_SALTBYTES = 16, + BLAKE2B_PERSONALBYTES = 16 +}; + +#pragma pack(push, 1) +typedef struct __blake2b_param { + uint8_t digest_length; /* 1 */ + uint8_t key_length; /* 2 */ + uint8_t fanout; /* 3 */ + uint8_t depth; /* 4 */ + uint32_t leaf_length; /* 8 */ + uint64_t node_offset; /* 16 */ + uint8_t node_depth; /* 17 */ + uint8_t inner_length; /* 18 */ + uint8_t reserved[14]; /* 32 */ + uint8_t salt[BLAKE2B_SALTBYTES]; /* 48 */ + uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */ +} blake2b_param; +#pragma pack(pop) + +typedef struct __blake2b_state { + uint64_t h[8]; + uint64_t t[2]; + uint64_t f[2]; + uint8_t buf[BLAKE2B_BLOCKBYTES]; + unsigned buflen; + unsigned outlen; + uint8_t last_node; +} blake2b_state; + +/* Ensure param structs have not been wrongly padded */ +/* Poor man's static_assert */ +enum { + blake2_size_check_0 = 1 / !!(CHAR_BIT == 8), + blake2_size_check_2 = + 1 / !!(sizeof(blake2b_param) == sizeof(uint64_t) * CHAR_BIT) +}; + +/* Streaming API */ +ARGON2_LOCAL int blake2b_init(blake2b_state *S, size_t outlen); +ARGON2_LOCAL int blake2b_init_key(blake2b_state *S, size_t outlen, const void *key, + size_t keylen); +ARGON2_LOCAL int blake2b_init_param(blake2b_state *S, const blake2b_param *P); +ARGON2_LOCAL int blake2b_update(blake2b_state *S, const void *in, size_t inlen); +ARGON2_LOCAL int blake2b_final(blake2b_state *S, void *out, size_t outlen); + +/* Simple API */ +ARGON2_LOCAL int blake2b(void *out, size_t outlen, const void *in, size_t inlen, + const void *key, size_t keylen); + +/* Argon2 Team - Begin Code */ +ARGON2_LOCAL int blake2b_long(void *out, size_t outlen, const void *in, size_t inlen); +/* Argon2 Team - End Code */ + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/blake2/blake2b.c b/deps/phc-winner-argon2-20190702/src/blake2/blake2b.c new file mode 100644 index 000000000..ca05df598 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/blake2/blake2b.c @@ -0,0 +1,390 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "blake2.h" +#include "blake2-impl.h" + +static const uint64_t blake2b_IV[8] = { + UINT64_C(0x6a09e667f3bcc908), UINT64_C(0xbb67ae8584caa73b), + UINT64_C(0x3c6ef372fe94f82b), UINT64_C(0xa54ff53a5f1d36f1), + UINT64_C(0x510e527fade682d1), UINT64_C(0x9b05688c2b3e6c1f), + UINT64_C(0x1f83d9abfb41bd6b), UINT64_C(0x5be0cd19137e2179)}; + +static const unsigned int blake2b_sigma[12][16] = { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, + {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4}, + {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8}, + {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13}, + {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9}, + {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11}, + {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10}, + {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5}, + {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0}, + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, + {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3}, +}; + +static BLAKE2_INLINE void blake2b_set_lastnode(blake2b_state *S) { + S->f[1] = (uint64_t)-1; +} + +static BLAKE2_INLINE void blake2b_set_lastblock(blake2b_state *S) { + if (S->last_node) { + blake2b_set_lastnode(S); + } + S->f[0] = (uint64_t)-1; +} + +static BLAKE2_INLINE void blake2b_increment_counter(blake2b_state *S, + uint64_t inc) { + S->t[0] += inc; + S->t[1] += (S->t[0] < inc); +} + +static BLAKE2_INLINE void blake2b_invalidate_state(blake2b_state *S) { + clear_internal_memory(S, sizeof(*S)); /* wipe */ + blake2b_set_lastblock(S); /* invalidate for further use */ +} + +static BLAKE2_INLINE void blake2b_init0(blake2b_state *S) { + memset(S, 0, sizeof(*S)); + memcpy(S->h, blake2b_IV, sizeof(S->h)); +} + +int blake2b_init_param(blake2b_state *S, const blake2b_param *P) { + const unsigned char *p = (const unsigned char *)P; + unsigned int i; + + if (NULL == P || NULL == S) { + return -1; + } + + blake2b_init0(S); + /* IV XOR Parameter Block */ + for (i = 0; i < 8; ++i) { + S->h[i] ^= load64(&p[i * sizeof(S->h[i])]); + } + S->outlen = P->digest_length; + return 0; +} + +/* Sequential blake2b initialization */ +int blake2b_init(blake2b_state *S, size_t outlen) { + blake2b_param P; + + if (S == NULL) { + return -1; + } + + if ((outlen == 0) || (outlen > BLAKE2B_OUTBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + /* Setup Parameter Block for unkeyed BLAKE2 */ + P.digest_length = (uint8_t)outlen; + P.key_length = 0; + P.fanout = 1; + P.depth = 1; + P.leaf_length = 0; + P.node_offset = 0; + P.node_depth = 0; + P.inner_length = 0; + memset(P.reserved, 0, sizeof(P.reserved)); + memset(P.salt, 0, sizeof(P.salt)); + memset(P.personal, 0, sizeof(P.personal)); + + return blake2b_init_param(S, &P); +} + +int blake2b_init_key(blake2b_state *S, size_t outlen, const void *key, + size_t keylen) { + blake2b_param P; + + if (S == NULL) { + return -1; + } + + if ((outlen == 0) || (outlen > BLAKE2B_OUTBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + if ((key == 0) || (keylen == 0) || (keylen > BLAKE2B_KEYBYTES)) { + blake2b_invalidate_state(S); + return -1; + } + + /* Setup Parameter Block for keyed BLAKE2 */ + P.digest_length = (uint8_t)outlen; + P.key_length = (uint8_t)keylen; + P.fanout = 1; + P.depth = 1; + P.leaf_length = 0; + P.node_offset = 0; + P.node_depth = 0; + P.inner_length = 0; + memset(P.reserved, 0, sizeof(P.reserved)); + memset(P.salt, 0, sizeof(P.salt)); + memset(P.personal, 0, sizeof(P.personal)); + + if (blake2b_init_param(S, &P) < 0) { + blake2b_invalidate_state(S); + return -1; + } + + { + uint8_t block[BLAKE2B_BLOCKBYTES]; + memset(block, 0, BLAKE2B_BLOCKBYTES); + memcpy(block, key, keylen); + blake2b_update(S, block, BLAKE2B_BLOCKBYTES); + /* Burn the key from stack */ + clear_internal_memory(block, BLAKE2B_BLOCKBYTES); + } + return 0; +} + +static void blake2b_compress(blake2b_state *S, const uint8_t *block) { + uint64_t m[16]; + uint64_t v[16]; + unsigned int i, r; + + for (i = 0; i < 16; ++i) { + m[i] = load64(block + i * sizeof(m[i])); + } + + for (i = 0; i < 8; ++i) { + v[i] = S->h[i]; + } + + v[8] = blake2b_IV[0]; + v[9] = blake2b_IV[1]; + v[10] = blake2b_IV[2]; + v[11] = blake2b_IV[3]; + v[12] = blake2b_IV[4] ^ S->t[0]; + v[13] = blake2b_IV[5] ^ S->t[1]; + v[14] = blake2b_IV[6] ^ S->f[0]; + v[15] = blake2b_IV[7] ^ S->f[1]; + +#define G(r, i, a, b, c, d) \ + do { \ + a = a + b + m[blake2b_sigma[r][2 * i + 0]]; \ + d = rotr64(d ^ a, 32); \ + c = c + d; \ + b = rotr64(b ^ c, 24); \ + a = a + b + m[blake2b_sigma[r][2 * i + 1]]; \ + d = rotr64(d ^ a, 16); \ + c = c + d; \ + b = rotr64(b ^ c, 63); \ + } while ((void)0, 0) + +#define ROUND(r) \ + do { \ + G(r, 0, v[0], v[4], v[8], v[12]); \ + G(r, 1, v[1], v[5], v[9], v[13]); \ + G(r, 2, v[2], v[6], v[10], v[14]); \ + G(r, 3, v[3], v[7], v[11], v[15]); \ + G(r, 4, v[0], v[5], v[10], v[15]); \ + G(r, 5, v[1], v[6], v[11], v[12]); \ + G(r, 6, v[2], v[7], v[8], v[13]); \ + G(r, 7, v[3], v[4], v[9], v[14]); \ + } while ((void)0, 0) + + for (r = 0; r < 12; ++r) { + ROUND(r); + } + + for (i = 0; i < 8; ++i) { + S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; + } + +#undef G +#undef ROUND +} + +int blake2b_update(blake2b_state *S, const void *in, size_t inlen) { + const uint8_t *pin = (const uint8_t *)in; + + if (inlen == 0) { + return 0; + } + + /* Sanity check */ + if (S == NULL || in == NULL) { + return -1; + } + + /* Is this a reused state? */ + if (S->f[0] != 0) { + return -1; + } + + if (S->buflen + inlen > BLAKE2B_BLOCKBYTES) { + /* Complete current block */ + size_t left = S->buflen; + size_t fill = BLAKE2B_BLOCKBYTES - left; + memcpy(&S->buf[left], pin, fill); + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress(S, S->buf); + S->buflen = 0; + inlen -= fill; + pin += fill; + /* Avoid buffer copies when possible */ + while (inlen > BLAKE2B_BLOCKBYTES) { + blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); + blake2b_compress(S, pin); + inlen -= BLAKE2B_BLOCKBYTES; + pin += BLAKE2B_BLOCKBYTES; + } + } + memcpy(&S->buf[S->buflen], pin, inlen); + S->buflen += (unsigned int)inlen; + return 0; +} + +int blake2b_final(blake2b_state *S, void *out, size_t outlen) { + uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; + unsigned int i; + + /* Sanity checks */ + if (S == NULL || out == NULL || outlen < S->outlen) { + return -1; + } + + /* Is this a reused state? */ + if (S->f[0] != 0) { + return -1; + } + + blake2b_increment_counter(S, S->buflen); + blake2b_set_lastblock(S); + memset(&S->buf[S->buflen], 0, BLAKE2B_BLOCKBYTES - S->buflen); /* Padding */ + blake2b_compress(S, S->buf); + + for (i = 0; i < 8; ++i) { /* Output full hash to temp buffer */ + store64(buffer + sizeof(S->h[i]) * i, S->h[i]); + } + + memcpy(out, buffer, S->outlen); + clear_internal_memory(buffer, sizeof(buffer)); + clear_internal_memory(S->buf, sizeof(S->buf)); + clear_internal_memory(S->h, sizeof(S->h)); + return 0; +} + +int blake2b(void *out, size_t outlen, const void *in, size_t inlen, + const void *key, size_t keylen) { + blake2b_state S; + int ret = -1; + + /* Verify parameters */ + if (NULL == in && inlen > 0) { + goto fail; + } + + if (NULL == out || outlen == 0 || outlen > BLAKE2B_OUTBYTES) { + goto fail; + } + + if ((NULL == key && keylen > 0) || keylen > BLAKE2B_KEYBYTES) { + goto fail; + } + + if (keylen > 0) { + if (blake2b_init_key(&S, outlen, key, keylen) < 0) { + goto fail; + } + } else { + if (blake2b_init(&S, outlen) < 0) { + goto fail; + } + } + + if (blake2b_update(&S, in, inlen) < 0) { + goto fail; + } + ret = blake2b_final(&S, out, outlen); + +fail: + clear_internal_memory(&S, sizeof(S)); + return ret; +} + +/* Argon2 Team - Begin Code */ +int blake2b_long(void *pout, size_t outlen, const void *in, size_t inlen) { + uint8_t *out = (uint8_t *)pout; + blake2b_state blake_state; + uint8_t outlen_bytes[sizeof(uint32_t)] = {0}; + int ret = -1; + + if (outlen > UINT32_MAX) { + goto fail; + } + + /* Ensure little-endian byte order! */ + store32(outlen_bytes, (uint32_t)outlen); + +#define TRY(statement) \ + do { \ + ret = statement; \ + if (ret < 0) { \ + goto fail; \ + } \ + } while ((void)0, 0) + + if (outlen <= BLAKE2B_OUTBYTES) { + TRY(blake2b_init(&blake_state, outlen)); + TRY(blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes))); + TRY(blake2b_update(&blake_state, in, inlen)); + TRY(blake2b_final(&blake_state, out, outlen)); + } else { + uint32_t toproduce; + uint8_t out_buffer[BLAKE2B_OUTBYTES]; + uint8_t in_buffer[BLAKE2B_OUTBYTES]; + TRY(blake2b_init(&blake_state, BLAKE2B_OUTBYTES)); + TRY(blake2b_update(&blake_state, outlen_bytes, sizeof(outlen_bytes))); + TRY(blake2b_update(&blake_state, in, inlen)); + TRY(blake2b_final(&blake_state, out_buffer, BLAKE2B_OUTBYTES)); + memcpy(out, out_buffer, BLAKE2B_OUTBYTES / 2); + out += BLAKE2B_OUTBYTES / 2; + toproduce = (uint32_t)outlen - BLAKE2B_OUTBYTES / 2; + + while (toproduce > BLAKE2B_OUTBYTES) { + memcpy(in_buffer, out_buffer, BLAKE2B_OUTBYTES); + TRY(blake2b(out_buffer, BLAKE2B_OUTBYTES, in_buffer, + BLAKE2B_OUTBYTES, NULL, 0)); + memcpy(out, out_buffer, BLAKE2B_OUTBYTES / 2); + out += BLAKE2B_OUTBYTES / 2; + toproduce -= BLAKE2B_OUTBYTES / 2; + } + + memcpy(in_buffer, out_buffer, BLAKE2B_OUTBYTES); + TRY(blake2b(out_buffer, toproduce, in_buffer, BLAKE2B_OUTBYTES, NULL, + 0)); + memcpy(out, out_buffer, toproduce); + } +fail: + clear_internal_memory(&blake_state, sizeof(blake_state)); + return ret; +#undef TRY +} +/* Argon2 Team - End Code */ diff --git a/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-opt.h b/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-opt.h new file mode 100644 index 000000000..2c8942e31 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-opt.h @@ -0,0 +1,471 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef BLAKE_ROUND_MKA_OPT_H +#define BLAKE_ROUND_MKA_OPT_H + +#include "blake2-impl.h" + +#include +#if defined(__SSSE3__) +#include /* for _mm_shuffle_epi8 and _mm_alignr_epi8 */ +#endif + +#if defined(__XOP__) && (defined(__GNUC__) || defined(__clang__)) +#include +#endif + +#if !defined(__AVX512F__) +#if !defined(__AVX2__) +#if !defined(__XOP__) +#if defined(__SSSE3__) +#define r16 \ + (_mm_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) +#define r24 \ + (_mm_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) +#define _mm_roti_epi64(x, c) \ + (-(c) == 32) \ + ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2, 3, 0, 1)) \ + : (-(c) == 24) \ + ? _mm_shuffle_epi8((x), r24) \ + : (-(c) == 16) \ + ? _mm_shuffle_epi8((x), r16) \ + : (-(c) == 63) \ + ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ + _mm_add_epi64((x), (x))) \ + : _mm_xor_si128(_mm_srli_epi64((x), -(c)), \ + _mm_slli_epi64((x), 64 - (-(c)))) +#else /* defined(__SSE2__) */ +#define _mm_roti_epi64(r, c) \ + _mm_xor_si128(_mm_srli_epi64((r), -(c)), _mm_slli_epi64((r), 64 - (-(c)))) +#endif +#else +#endif + +static BLAKE2_INLINE __m128i fBlaMka(__m128i x, __m128i y) { + const __m128i z = _mm_mul_epu32(x, y); + return _mm_add_epi64(_mm_add_epi64(x, y), _mm_add_epi64(z, z)); +} + +#define G1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = fBlaMka(A0, B0); \ + A1 = fBlaMka(A1, B1); \ + \ + D0 = _mm_xor_si128(D0, A0); \ + D1 = _mm_xor_si128(D1, A1); \ + \ + D0 = _mm_roti_epi64(D0, -32); \ + D1 = _mm_roti_epi64(D1, -32); \ + \ + C0 = fBlaMka(C0, D0); \ + C1 = fBlaMka(C1, D1); \ + \ + B0 = _mm_xor_si128(B0, C0); \ + B1 = _mm_xor_si128(B1, C1); \ + \ + B0 = _mm_roti_epi64(B0, -24); \ + B1 = _mm_roti_epi64(B1, -24); \ + } while ((void)0, 0) + +#define G2(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = fBlaMka(A0, B0); \ + A1 = fBlaMka(A1, B1); \ + \ + D0 = _mm_xor_si128(D0, A0); \ + D1 = _mm_xor_si128(D1, A1); \ + \ + D0 = _mm_roti_epi64(D0, -16); \ + D1 = _mm_roti_epi64(D1, -16); \ + \ + C0 = fBlaMka(C0, D0); \ + C1 = fBlaMka(C1, D1); \ + \ + B0 = _mm_xor_si128(B0, C0); \ + B1 = _mm_xor_si128(B1, C1); \ + \ + B0 = _mm_roti_epi64(B0, -63); \ + B1 = _mm_roti_epi64(B1, -63); \ + } while ((void)0, 0) + +#if defined(__SSSE3__) +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = _mm_alignr_epi8(B1, B0, 8); \ + __m128i t1 = _mm_alignr_epi8(B0, B1, 8); \ + B0 = t0; \ + B1 = t1; \ + \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + \ + t0 = _mm_alignr_epi8(D1, D0, 8); \ + t1 = _mm_alignr_epi8(D0, D1, 8); \ + D0 = t1; \ + D1 = t0; \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = _mm_alignr_epi8(B0, B1, 8); \ + __m128i t1 = _mm_alignr_epi8(B1, B0, 8); \ + B0 = t0; \ + B1 = t1; \ + \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + \ + t0 = _mm_alignr_epi8(D0, D1, 8); \ + t1 = _mm_alignr_epi8(D1, D0, 8); \ + D0 = t1; \ + D1 = t0; \ + } while ((void)0, 0) +#else /* SSE2 */ +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0 = D0; \ + __m128i t1 = B0; \ + D0 = C0; \ + C0 = C1; \ + C1 = D0; \ + D0 = _mm_unpackhi_epi64(D1, _mm_unpacklo_epi64(t0, t0)); \ + D1 = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(D1, D1)); \ + B0 = _mm_unpackhi_epi64(B0, _mm_unpacklo_epi64(B1, B1)); \ + B1 = _mm_unpackhi_epi64(B1, _mm_unpacklo_epi64(t1, t1)); \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + __m128i t0, t1; \ + t0 = C0; \ + C0 = C1; \ + C1 = t0; \ + t0 = B0; \ + t1 = D0; \ + B0 = _mm_unpackhi_epi64(B1, _mm_unpacklo_epi64(B0, B0)); \ + B1 = _mm_unpackhi_epi64(t0, _mm_unpacklo_epi64(B1, B1)); \ + D0 = _mm_unpackhi_epi64(D0, _mm_unpacklo_epi64(D1, D1)); \ + D1 = _mm_unpackhi_epi64(D1, _mm_unpacklo_epi64(t1, t1)); \ + } while ((void)0, 0) +#endif + +#define BLAKE2_ROUND(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ + \ + UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + } while ((void)0, 0) +#else /* __AVX2__ */ + +#include + +#define rotr32(x) _mm256_shuffle_epi32(x, _MM_SHUFFLE(2, 3, 0, 1)) +#define rotr24(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10, 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10)) +#define rotr16(x) _mm256_shuffle_epi8(x, _mm256_setr_epi8(2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9, 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9)) +#define rotr63(x) _mm256_xor_si256(_mm256_srli_epi64((x), 63), _mm256_add_epi64((x), (x))) + +#define G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i ml = _mm256_mul_epu32(A0, B0); \ + ml = _mm256_add_epi64(ml, ml); \ + A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ + D0 = _mm256_xor_si256(D0, A0); \ + D0 = rotr32(D0); \ + \ + ml = _mm256_mul_epu32(C0, D0); \ + ml = _mm256_add_epi64(ml, ml); \ + C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ + \ + B0 = _mm256_xor_si256(B0, C0); \ + B0 = rotr24(B0); \ + \ + ml = _mm256_mul_epu32(A1, B1); \ + ml = _mm256_add_epi64(ml, ml); \ + A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ + D1 = _mm256_xor_si256(D1, A1); \ + D1 = rotr32(D1); \ + \ + ml = _mm256_mul_epu32(C1, D1); \ + ml = _mm256_add_epi64(ml, ml); \ + C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ + \ + B1 = _mm256_xor_si256(B1, C1); \ + B1 = rotr24(B1); \ + } while((void)0, 0); + +#define G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i ml = _mm256_mul_epu32(A0, B0); \ + ml = _mm256_add_epi64(ml, ml); \ + A0 = _mm256_add_epi64(A0, _mm256_add_epi64(B0, ml)); \ + D0 = _mm256_xor_si256(D0, A0); \ + D0 = rotr16(D0); \ + \ + ml = _mm256_mul_epu32(C0, D0); \ + ml = _mm256_add_epi64(ml, ml); \ + C0 = _mm256_add_epi64(C0, _mm256_add_epi64(D0, ml)); \ + B0 = _mm256_xor_si256(B0, C0); \ + B0 = rotr63(B0); \ + \ + ml = _mm256_mul_epu32(A1, B1); \ + ml = _mm256_add_epi64(ml, ml); \ + A1 = _mm256_add_epi64(A1, _mm256_add_epi64(B1, ml)); \ + D1 = _mm256_xor_si256(D1, A1); \ + D1 = rotr16(D1); \ + \ + ml = _mm256_mul_epu32(C1, D1); \ + ml = _mm256_add_epi64(ml, ml); \ + C1 = _mm256_add_epi64(C1, _mm256_add_epi64(D1, ml)); \ + B1 = _mm256_xor_si256(B1, C1); \ + B1 = rotr63(B1); \ + } while((void)0, 0); + +#define DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ + C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ + \ + B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ + C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ + D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ + } while((void)0, 0); + +#define DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ + __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ + B1 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + B0 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + \ + tmp1 = C0; \ + C0 = C1; \ + C1 = tmp1; \ + \ + tmp1 = _mm256_blend_epi32(D0, D1, 0xCC); \ + tmp2 = _mm256_blend_epi32(D0, D1, 0x33); \ + D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + } while(0); + +#define UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm256_permute4x64_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ + C0 = _mm256_permute4x64_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + D0 = _mm256_permute4x64_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ + \ + B1 = _mm256_permute4x64_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ + C1 = _mm256_permute4x64_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ + D1 = _mm256_permute4x64_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ + } while((void)0, 0); + +#define UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + __m256i tmp1 = _mm256_blend_epi32(B0, B1, 0xCC); \ + __m256i tmp2 = _mm256_blend_epi32(B0, B1, 0x33); \ + B0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + B1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + \ + tmp1 = C0; \ + C0 = C1; \ + C1 = tmp1; \ + \ + tmp1 = _mm256_blend_epi32(D0, D1, 0x33); \ + tmp2 = _mm256_blend_epi32(D0, D1, 0xCC); \ + D0 = _mm256_permute4x64_epi64(tmp1, _MM_SHUFFLE(2,3,0,1)); \ + D1 = _mm256_permute4x64_epi64(tmp2, _MM_SHUFFLE(2,3,0,1)); \ + } while((void)0, 0); + +#define BLAKE2_ROUND_1(A0, A1, B0, B1, C0, C1, D0, D1) \ + do{ \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + DIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + UNDIAGONALIZE_1(A0, B0, C0, D0, A1, B1, C1, D1) \ + } while((void)0, 0); + +#define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do{ \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + DIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + G1_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + G2_AVX2(A0, A1, B0, B1, C0, C1, D0, D1) \ + \ + UNDIAGONALIZE_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + } while((void)0, 0); + +#endif /* __AVX2__ */ + +#else /* __AVX512F__ */ + +#include + +#define ror64(x, n) _mm512_ror_epi64((x), (n)) + +static __m512i muladd(__m512i x, __m512i y) +{ + __m512i z = _mm512_mul_epu32(x, y); + return _mm512_add_epi64(_mm512_add_epi64(x, y), _mm512_add_epi64(z, z)); +} + +#define G1(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = muladd(A0, B0); \ + A1 = muladd(A1, B1); \ +\ + D0 = _mm512_xor_si512(D0, A0); \ + D1 = _mm512_xor_si512(D1, A1); \ +\ + D0 = ror64(D0, 32); \ + D1 = ror64(D1, 32); \ +\ + C0 = muladd(C0, D0); \ + C1 = muladd(C1, D1); \ +\ + B0 = _mm512_xor_si512(B0, C0); \ + B1 = _mm512_xor_si512(B1, C1); \ +\ + B0 = ror64(B0, 24); \ + B1 = ror64(B1, 24); \ + } while ((void)0, 0) + +#define G2(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + A0 = muladd(A0, B0); \ + A1 = muladd(A1, B1); \ +\ + D0 = _mm512_xor_si512(D0, A0); \ + D1 = _mm512_xor_si512(D1, A1); \ +\ + D0 = ror64(D0, 16); \ + D1 = ror64(D1, 16); \ +\ + C0 = muladd(C0, D0); \ + C1 = muladd(C1, D1); \ +\ + B0 = _mm512_xor_si512(B0, C0); \ + B1 = _mm512_xor_si512(B1, C1); \ +\ + B0 = ror64(B0, 63); \ + B1 = ror64(B1, 63); \ + } while ((void)0, 0) + +#define DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(0, 3, 2, 1)); \ + B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(0, 3, 2, 1)); \ +\ + C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ +\ + D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(2, 1, 0, 3)); \ + D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(2, 1, 0, 3)); \ + } while ((void)0, 0) + +#define UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + B0 = _mm512_permutex_epi64(B0, _MM_SHUFFLE(2, 1, 0, 3)); \ + B1 = _mm512_permutex_epi64(B1, _MM_SHUFFLE(2, 1, 0, 3)); \ +\ + C0 = _mm512_permutex_epi64(C0, _MM_SHUFFLE(1, 0, 3, 2)); \ + C1 = _mm512_permutex_epi64(C1, _MM_SHUFFLE(1, 0, 3, 2)); \ +\ + D0 = _mm512_permutex_epi64(D0, _MM_SHUFFLE(0, 3, 2, 1)); \ + D1 = _mm512_permutex_epi64(D1, _MM_SHUFFLE(0, 3, 2, 1)); \ + } while ((void)0, 0) + +#define BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1) \ + do { \ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + DIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + G1(A0, B0, C0, D0, A1, B1, C1, D1); \ + G2(A0, B0, C0, D0, A1, B1, C1, D1); \ +\ + UNDIAGONALIZE(A0, B0, C0, D0, A1, B1, C1, D1); \ + } while ((void)0, 0) + +#define SWAP_HALVES(A0, A1) \ + do { \ + __m512i t0, t1; \ + t0 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(1, 0, 1, 0)); \ + t1 = _mm512_shuffle_i64x2(A0, A1, _MM_SHUFFLE(3, 2, 3, 2)); \ + A0 = t0; \ + A1 = t1; \ + } while((void)0, 0) + +#define SWAP_QUARTERS(A0, A1) \ + do { \ + SWAP_HALVES(A0, A1); \ + A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ + A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ + } while((void)0, 0) + +#define UNSWAP_QUARTERS(A0, A1) \ + do { \ + A0 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A0); \ + A1 = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), A1); \ + SWAP_HALVES(A0, A1); \ + } while((void)0, 0) + +#define BLAKE2_ROUND_1(A0, C0, B0, D0, A1, C1, B1, D1) \ + do { \ + SWAP_HALVES(A0, B0); \ + SWAP_HALVES(C0, D0); \ + SWAP_HALVES(A1, B1); \ + SWAP_HALVES(C1, D1); \ + BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ + SWAP_HALVES(A0, B0); \ + SWAP_HALVES(C0, D0); \ + SWAP_HALVES(A1, B1); \ + SWAP_HALVES(C1, D1); \ + } while ((void)0, 0) + +#define BLAKE2_ROUND_2(A0, A1, B0, B1, C0, C1, D0, D1) \ + do { \ + SWAP_QUARTERS(A0, A1); \ + SWAP_QUARTERS(B0, B1); \ + SWAP_QUARTERS(C0, C1); \ + SWAP_QUARTERS(D0, D1); \ + BLAKE2_ROUND(A0, B0, C0, D0, A1, B1, C1, D1); \ + UNSWAP_QUARTERS(A0, A1); \ + UNSWAP_QUARTERS(B0, B1); \ + UNSWAP_QUARTERS(C0, C1); \ + UNSWAP_QUARTERS(D0, D1); \ + } while ((void)0, 0) + +#endif /* __AVX512F__ */ +#endif /* BLAKE_ROUND_MKA_OPT_H */ diff --git a/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-ref.h b/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-ref.h new file mode 100644 index 000000000..b8f2cf471 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/blake2/blamka-round-ref.h @@ -0,0 +1,56 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef BLAKE_ROUND_MKA_H +#define BLAKE_ROUND_MKA_H + +#include "blake2.h" +#include "blake2-impl.h" + +/* designed by the Lyra PHC team */ +static BLAKE2_INLINE uint64_t fBlaMka(uint64_t x, uint64_t y) { + const uint64_t m = UINT64_C(0xFFFFFFFF); + const uint64_t xy = (x & m) * (y & m); + return x + y + 2 * xy; +} + +#define G(a, b, c, d) \ + do { \ + a = fBlaMka(a, b); \ + d = rotr64(d ^ a, 32); \ + c = fBlaMka(c, d); \ + b = rotr64(b ^ c, 24); \ + a = fBlaMka(a, b); \ + d = rotr64(d ^ a, 16); \ + c = fBlaMka(c, d); \ + b = rotr64(b ^ c, 63); \ + } while ((void)0, 0) + +#define BLAKE2_ROUND_NOMSG(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, \ + v12, v13, v14, v15) \ + do { \ + G(v0, v4, v8, v12); \ + G(v1, v5, v9, v13); \ + G(v2, v6, v10, v14); \ + G(v3, v7, v11, v15); \ + G(v0, v5, v10, v15); \ + G(v1, v6, v11, v12); \ + G(v2, v7, v8, v13); \ + G(v3, v4, v9, v14); \ + } while ((void)0, 0) + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/core.c b/deps/phc-winner-argon2-20190702/src/core.c new file mode 100644 index 000000000..65f053769 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/core.c @@ -0,0 +1,648 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +/*For memory wiping*/ +#ifdef _MSC_VER +#include +#include /* For SecureZeroMemory */ +#endif +#if defined __STDC_LIB_EXT1__ +#define __STDC_WANT_LIB_EXT1__ 1 +#endif +#define VC_GE_2005(version) (version >= 1400) + +/* for explicit_bzero() on glibc */ +#define _DEFAULT_SOURCE + +#include +#include +#include + +#include "core.h" +#include "thread.h" +#include "blake2/blake2.h" +#include "blake2/blake2-impl.h" + +#ifdef GENKAT +#include "genkat.h" +#endif + +#if defined(__clang__) +#if __has_attribute(optnone) +#define NOT_OPTIMIZED __attribute__((optnone)) +#endif +#elif defined(__GNUC__) +#define GCC_VERSION \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#if GCC_VERSION >= 40400 +#define NOT_OPTIMIZED __attribute__((optimize("O0"))) +#endif +#endif +#ifndef NOT_OPTIMIZED +#define NOT_OPTIMIZED +#endif + +/***************Instance and Position constructors**********/ +void init_block_value(block *b, uint8_t in) { memset(b->v, in, sizeof(b->v)); } + +void copy_block(block *dst, const block *src) { + memcpy(dst->v, src->v, sizeof(uint64_t) * ARGON2_QWORDS_IN_BLOCK); +} + +void xor_block(block *dst, const block *src) { + int i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + dst->v[i] ^= src->v[i]; + } +} + +static void load_block(block *dst, const void *input) { + unsigned i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + dst->v[i] = load64((const uint8_t *)input + i * sizeof(dst->v[i])); + } +} + +static void store_block(void *output, const block *src) { + unsigned i; + for (i = 0; i < ARGON2_QWORDS_IN_BLOCK; ++i) { + store64((uint8_t *)output + i * sizeof(src->v[i]), src->v[i]); + } +} + +/***************Memory functions*****************/ + +int allocate_memory(const argon2_context *context, uint8_t **memory, + size_t num, size_t size) { + size_t memory_size = num*size; + if (memory == NULL) { + return ARGON2_MEMORY_ALLOCATION_ERROR; + } + + /* 1. Check for multiplication overflow */ + if (size != 0 && memory_size / size != num) { + return ARGON2_MEMORY_ALLOCATION_ERROR; + } + + /* 2. Try to allocate with appropriate allocator */ + if (context->allocate_cbk) { + (context->allocate_cbk)(memory, memory_size); + } else { + *memory = malloc(memory_size); + } + + if (*memory == NULL) { + return ARGON2_MEMORY_ALLOCATION_ERROR; + } + + return ARGON2_OK; +} + +void free_memory(const argon2_context *context, uint8_t *memory, + size_t num, size_t size) { + size_t memory_size = num*size; + clear_internal_memory(memory, memory_size); + if (context->free_cbk) { + (context->free_cbk)(memory, memory_size); + } else { + free(memory); + } +} + +#if defined(__OpenBSD__) +#define HAVE_EXPLICIT_BZERO 1 +#elif defined(__GLIBC__) && defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2,25) +#define HAVE_EXPLICIT_BZERO 1 +#endif +#endif + +void NOT_OPTIMIZED secure_wipe_memory(void *v, size_t n) { +#if defined(_MSC_VER) && VC_GE_2005(_MSC_VER) + SecureZeroMemory(v, n); +#elif defined memset_s + memset_s(v, n, 0, n); +#elif defined(HAVE_EXPLICIT_BZERO) + explicit_bzero(v, n); +#else + static void *(*const volatile memset_sec)(void *, int, size_t) = &memset; + memset_sec(v, 0, n); +#endif +} + +/* Memory clear flag defaults to true. */ +int FLAG_clear_internal_memory = 1; +void clear_internal_memory(void *v, size_t n) { + if (FLAG_clear_internal_memory && v) { + secure_wipe_memory(v, n); + } +} + +void finalize(const argon2_context *context, argon2_instance_t *instance) { + if (context != NULL && instance != NULL) { + block blockhash; + uint32_t l; + + copy_block(&blockhash, instance->memory + instance->lane_length - 1); + + /* XOR the last blocks */ + for (l = 1; l < instance->lanes; ++l) { + uint32_t last_block_in_lane = + l * instance->lane_length + (instance->lane_length - 1); + xor_block(&blockhash, instance->memory + last_block_in_lane); + } + + /* Hash the result */ + { + uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; + store_block(blockhash_bytes, &blockhash); + blake2b_long(context->out, context->outlen, blockhash_bytes, + ARGON2_BLOCK_SIZE); + /* clear blockhash and blockhash_bytes */ + clear_internal_memory(blockhash.v, ARGON2_BLOCK_SIZE); + clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE); + } + +#ifdef GENKAT + print_tag(context->out, context->outlen); +#endif + + free_memory(context, (uint8_t *)instance->memory, + instance->memory_blocks, sizeof(block)); + } +} + +uint32_t index_alpha(const argon2_instance_t *instance, + const argon2_position_t *position, uint32_t pseudo_rand, + int same_lane) { + /* + * Pass 0: + * This lane : all already finished segments plus already constructed + * blocks in this segment + * Other lanes : all already finished segments + * Pass 1+: + * This lane : (SYNC_POINTS - 1) last segments plus already constructed + * blocks in this segment + * Other lanes : (SYNC_POINTS - 1) last segments + */ + uint32_t reference_area_size; + uint64_t relative_position; + uint32_t start_position, absolute_position; + + if (0 == position->pass) { + /* First pass */ + if (0 == position->slice) { + /* First slice */ + reference_area_size = + position->index - 1; /* all but the previous */ + } else { + if (same_lane) { + /* The same lane => add current segment */ + reference_area_size = + position->slice * instance->segment_length + + position->index - 1; + } else { + reference_area_size = + position->slice * instance->segment_length + + ((position->index == 0) ? (-1) : 0); + } + } + } else { + /* Second pass */ + if (same_lane) { + reference_area_size = instance->lane_length - + instance->segment_length + position->index - + 1; + } else { + reference_area_size = instance->lane_length - + instance->segment_length + + ((position->index == 0) ? (-1) : 0); + } + } + + /* 1.2.4. Mapping pseudo_rand to 0.. and produce + * relative position */ + relative_position = pseudo_rand; + relative_position = relative_position * relative_position >> 32; + relative_position = reference_area_size - 1 - + (reference_area_size * relative_position >> 32); + + /* 1.2.5 Computing starting position */ + start_position = 0; + + if (0 != position->pass) { + start_position = (position->slice == ARGON2_SYNC_POINTS - 1) + ? 0 + : (position->slice + 1) * instance->segment_length; + } + + /* 1.2.6. Computing absolute position */ + absolute_position = (start_position + relative_position) % + instance->lane_length; /* absolute position */ + return absolute_position; +} + +/* Single-threaded version for p=1 case */ +static int fill_memory_blocks_st(argon2_instance_t *instance) { + uint32_t r, s, l; + + for (r = 0; r < instance->passes; ++r) { + for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { + for (l = 0; l < instance->lanes; ++l) { + argon2_position_t position = {r, l, (uint8_t)s, 0}; + fill_segment(instance, position); + } + } +#ifdef GENKAT + internal_kat(instance, r); /* Print all memory blocks */ +#endif + } + return ARGON2_OK; +} + +#if !defined(ARGON2_NO_THREADS) + +#ifdef _WIN32 +static unsigned __stdcall fill_segment_thr(void *thread_data) +#else +static void *fill_segment_thr(void *thread_data) +#endif +{ + argon2_thread_data *my_data = thread_data; + fill_segment(my_data->instance_ptr, my_data->pos); + argon2_thread_exit(); + return 0; +} + +/* Multi-threaded version for p > 1 case */ +static int fill_memory_blocks_mt(argon2_instance_t *instance) { + uint32_t r, s; + argon2_thread_handle_t *thread = NULL; + argon2_thread_data *thr_data = NULL; + int rc = ARGON2_OK; + + /* 1. Allocating space for threads */ + thread = calloc(instance->lanes, sizeof(argon2_thread_handle_t)); + if (thread == NULL) { + rc = ARGON2_MEMORY_ALLOCATION_ERROR; + goto fail; + } + + thr_data = calloc(instance->lanes, sizeof(argon2_thread_data)); + if (thr_data == NULL) { + rc = ARGON2_MEMORY_ALLOCATION_ERROR; + goto fail; + } + + for (r = 0; r < instance->passes; ++r) { + for (s = 0; s < ARGON2_SYNC_POINTS; ++s) { + uint32_t l, ll; + + /* 2. Calling threads */ + for (l = 0; l < instance->lanes; ++l) { + argon2_position_t position; + + /* 2.1 Join a thread if limit is exceeded */ + if (l >= instance->threads) { + if (argon2_thread_join(thread[l - instance->threads])) { + rc = ARGON2_THREAD_FAIL; + goto fail; + } + } + + /* 2.2 Create thread */ + position.pass = r; + position.lane = l; + position.slice = (uint8_t)s; + position.index = 0; + thr_data[l].instance_ptr = + instance; /* preparing the thread input */ + memcpy(&(thr_data[l].pos), &position, + sizeof(argon2_position_t)); + if (argon2_thread_create(&thread[l], &fill_segment_thr, + (void *)&thr_data[l])) { + /* Wait for already running threads */ + for (ll = 0; ll < l; ++ll) + argon2_thread_join(thread[ll]); + rc = ARGON2_THREAD_FAIL; + goto fail; + } + + /* fill_segment(instance, position); */ + /*Non-thread equivalent of the lines above */ + } + + /* 3. Joining remaining threads */ + for (l = instance->lanes - instance->threads; l < instance->lanes; + ++l) { + if (argon2_thread_join(thread[l])) { + rc = ARGON2_THREAD_FAIL; + goto fail; + } + } + } + +#ifdef GENKAT + internal_kat(instance, r); /* Print all memory blocks */ +#endif + } + +fail: + if (thread != NULL) { + free(thread); + } + if (thr_data != NULL) { + free(thr_data); + } + return rc; +} + +#endif /* ARGON2_NO_THREADS */ + +int fill_memory_blocks(argon2_instance_t *instance) { + if (instance == NULL || instance->lanes == 0) { + return ARGON2_INCORRECT_PARAMETER; + } +#if defined(ARGON2_NO_THREADS) + return fill_memory_blocks_st(instance); +#else + return instance->threads == 1 ? + fill_memory_blocks_st(instance) : fill_memory_blocks_mt(instance); +#endif +} + +int validate_inputs(const argon2_context *context) { + if (NULL == context) { + return ARGON2_INCORRECT_PARAMETER; + } + + if (NULL == context->out) { + return ARGON2_OUTPUT_PTR_NULL; + } + + /* Validate output length */ + if (ARGON2_MIN_OUTLEN > context->outlen) { + return ARGON2_OUTPUT_TOO_SHORT; + } + + if (ARGON2_MAX_OUTLEN < context->outlen) { + return ARGON2_OUTPUT_TOO_LONG; + } + + /* Validate password (required param) */ + if (NULL == context->pwd) { + if (0 != context->pwdlen) { + return ARGON2_PWD_PTR_MISMATCH; + } + } + + if (ARGON2_MIN_PWD_LENGTH > context->pwdlen) { + return ARGON2_PWD_TOO_SHORT; + } + + if (ARGON2_MAX_PWD_LENGTH < context->pwdlen) { + return ARGON2_PWD_TOO_LONG; + } + + /* Validate salt (required param) */ + if (NULL == context->salt) { + if (0 != context->saltlen) { + return ARGON2_SALT_PTR_MISMATCH; + } + } + + if (ARGON2_MIN_SALT_LENGTH > context->saltlen) { + return ARGON2_SALT_TOO_SHORT; + } + + if (ARGON2_MAX_SALT_LENGTH < context->saltlen) { + return ARGON2_SALT_TOO_LONG; + } + + /* Validate secret (optional param) */ + if (NULL == context->secret) { + if (0 != context->secretlen) { + return ARGON2_SECRET_PTR_MISMATCH; + } + } else { + if (ARGON2_MIN_SECRET > context->secretlen) { + return ARGON2_SECRET_TOO_SHORT; + } + if (ARGON2_MAX_SECRET < context->secretlen) { + return ARGON2_SECRET_TOO_LONG; + } + } + + /* Validate associated data (optional param) */ + if (NULL == context->ad) { + if (0 != context->adlen) { + return ARGON2_AD_PTR_MISMATCH; + } + } else { + if (ARGON2_MIN_AD_LENGTH > context->adlen) { + return ARGON2_AD_TOO_SHORT; + } + if (ARGON2_MAX_AD_LENGTH < context->adlen) { + return ARGON2_AD_TOO_LONG; + } + } + + /* Validate memory cost */ + if (ARGON2_MIN_MEMORY > context->m_cost) { + return ARGON2_MEMORY_TOO_LITTLE; + } + + if (ARGON2_MAX_MEMORY < context->m_cost) { + return ARGON2_MEMORY_TOO_MUCH; + } + + if (context->m_cost < 8 * context->lanes) { + return ARGON2_MEMORY_TOO_LITTLE; + } + + /* Validate time cost */ + if (ARGON2_MIN_TIME > context->t_cost) { + return ARGON2_TIME_TOO_SMALL; + } + + if (ARGON2_MAX_TIME < context->t_cost) { + return ARGON2_TIME_TOO_LARGE; + } + + /* Validate lanes */ + if (ARGON2_MIN_LANES > context->lanes) { + return ARGON2_LANES_TOO_FEW; + } + + if (ARGON2_MAX_LANES < context->lanes) { + return ARGON2_LANES_TOO_MANY; + } + + /* Validate threads */ + if (ARGON2_MIN_THREADS > context->threads) { + return ARGON2_THREADS_TOO_FEW; + } + + if (ARGON2_MAX_THREADS < context->threads) { + return ARGON2_THREADS_TOO_MANY; + } + + if (NULL != context->allocate_cbk && NULL == context->free_cbk) { + return ARGON2_FREE_MEMORY_CBK_NULL; + } + + if (NULL == context->allocate_cbk && NULL != context->free_cbk) { + return ARGON2_ALLOCATE_MEMORY_CBK_NULL; + } + + return ARGON2_OK; +} + +void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance) { + uint32_t l; + /* Make the first and second block in each lane as G(H0||0||i) or + G(H0||1||i) */ + uint8_t blockhash_bytes[ARGON2_BLOCK_SIZE]; + for (l = 0; l < instance->lanes; ++l) { + + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 0); + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH + 4, l); + blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, + ARGON2_PREHASH_SEED_LENGTH); + load_block(&instance->memory[l * instance->lane_length + 0], + blockhash_bytes); + + store32(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, 1); + blake2b_long(blockhash_bytes, ARGON2_BLOCK_SIZE, blockhash, + ARGON2_PREHASH_SEED_LENGTH); + load_block(&instance->memory[l * instance->lane_length + 1], + blockhash_bytes); + } + clear_internal_memory(blockhash_bytes, ARGON2_BLOCK_SIZE); +} + +void initial_hash(uint8_t *blockhash, argon2_context *context, + argon2_type type) { + blake2b_state BlakeHash; + uint8_t value[sizeof(uint32_t)]; + + if (NULL == context || NULL == blockhash) { + return; + } + + blake2b_init(&BlakeHash, ARGON2_PREHASH_DIGEST_LENGTH); + + store32(&value, context->lanes); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->outlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->m_cost); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->t_cost); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->version); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, (uint32_t)type); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + store32(&value, context->pwdlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->pwd != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->pwd, + context->pwdlen); + + if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) { + secure_wipe_memory(context->pwd, context->pwdlen); + context->pwdlen = 0; + } + } + + store32(&value, context->saltlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->salt != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->salt, + context->saltlen); + } + + store32(&value, context->secretlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->secret != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->secret, + context->secretlen); + + if (context->flags & ARGON2_FLAG_CLEAR_SECRET) { + secure_wipe_memory(context->secret, context->secretlen); + context->secretlen = 0; + } + } + + store32(&value, context->adlen); + blake2b_update(&BlakeHash, (const uint8_t *)&value, sizeof(value)); + + if (context->ad != NULL) { + blake2b_update(&BlakeHash, (const uint8_t *)context->ad, + context->adlen); + } + + blake2b_final(&BlakeHash, blockhash, ARGON2_PREHASH_DIGEST_LENGTH); +} + +int initialize(argon2_instance_t *instance, argon2_context *context) { + uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; + int result = ARGON2_OK; + + if (instance == NULL || context == NULL) + return ARGON2_INCORRECT_PARAMETER; + instance->context_ptr = context; + + /* 1. Memory allocation */ + result = allocate_memory(context, (uint8_t **)&(instance->memory), + instance->memory_blocks, sizeof(block)); + if (result != ARGON2_OK) { + return result; + } + + /* 2. Initial hashing */ + /* H_0 + 8 extra bytes to produce the first blocks */ + /* uint8_t blockhash[ARGON2_PREHASH_SEED_LENGTH]; */ + /* Hashing all inputs */ + initial_hash(blockhash, context, instance->type); + /* Zeroing 8 extra bytes */ + clear_internal_memory(blockhash + ARGON2_PREHASH_DIGEST_LENGTH, + ARGON2_PREHASH_SEED_LENGTH - + ARGON2_PREHASH_DIGEST_LENGTH); + +#ifdef GENKAT + initial_kat(blockhash, context, instance->type); +#endif + + /* 3. Creating first blocks, we always have at least two blocks in a slice + */ + fill_first_blocks(blockhash, instance); + /* Clearing the hash */ + clear_internal_memory(blockhash, ARGON2_PREHASH_SEED_LENGTH); + + return ARGON2_OK; +} diff --git a/deps/phc-winner-argon2-20190702/src/core.h b/deps/phc-winner-argon2-20190702/src/core.h new file mode 100644 index 000000000..78000ba9e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/core.h @@ -0,0 +1,228 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_CORE_H +#define ARGON2_CORE_H + +#include "argon2.h" + +#define CONST_CAST(x) (x)(uintptr_t) + +/**********************Argon2 internal constants*******************************/ + +enum argon2_core_constants { + /* Memory block size in bytes */ + ARGON2_BLOCK_SIZE = 1024, + ARGON2_QWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 8, + ARGON2_OWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 16, + ARGON2_HWORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 32, + ARGON2_512BIT_WORDS_IN_BLOCK = ARGON2_BLOCK_SIZE / 64, + + /* Number of pseudo-random values generated by one call to Blake in Argon2i + to + generate reference block positions */ + ARGON2_ADDRESSES_IN_BLOCK = 128, + + /* Pre-hashing digest length and its extension*/ + ARGON2_PREHASH_DIGEST_LENGTH = 64, + ARGON2_PREHASH_SEED_LENGTH = 72 +}; + +/*************************Argon2 internal data types***********************/ + +/* + * Structure for the (1KB) memory block implemented as 128 64-bit words. + * Memory blocks can be copied, XORed. Internal words can be accessed by [] (no + * bounds checking). + */ +typedef struct block_ { uint64_t v[ARGON2_QWORDS_IN_BLOCK]; } block; + +/*****************Functions that work with the block******************/ + +/* Initialize each byte of the block with @in */ +void init_block_value(block *b, uint8_t in); + +/* Copy block @src to block @dst */ +void copy_block(block *dst, const block *src); + +/* XOR @src onto @dst bytewise */ +void xor_block(block *dst, const block *src); + +/* + * Argon2 instance: memory pointer, number of passes, amount of memory, type, + * and derived values. + * Used to evaluate the number and location of blocks to construct in each + * thread + */ +typedef struct Argon2_instance_t { + block *memory; /* Memory pointer */ + uint32_t version; + uint32_t passes; /* Number of passes */ + uint32_t memory_blocks; /* Number of blocks in memory */ + uint32_t segment_length; + uint32_t lane_length; + uint32_t lanes; + uint32_t threads; + argon2_type type; + int print_internals; /* whether to print the memory blocks */ + argon2_context *context_ptr; /* points back to original context */ +} argon2_instance_t; + +/* + * Argon2 position: where we construct the block right now. Used to distribute + * work between threads. + */ +typedef struct Argon2_position_t { + uint32_t pass; + uint32_t lane; + uint8_t slice; + uint32_t index; +} argon2_position_t; + +/*Struct that holds the inputs for thread handling FillSegment*/ +typedef struct Argon2_thread_data { + argon2_instance_t *instance_ptr; + argon2_position_t pos; +} argon2_thread_data; + +/*************************Argon2 core functions********************************/ + +/* Allocates memory to the given pointer, uses the appropriate allocator as + * specified in the context. Total allocated memory is num*size. + * @param context argon2_context which specifies the allocator + * @param memory pointer to the pointer to the memory + * @param size the size in bytes for each element to be allocated + * @param num the number of elements to be allocated + * @return ARGON2_OK if @memory is a valid pointer and memory is allocated + */ +int allocate_memory(const argon2_context *context, uint8_t **memory, + size_t num, size_t size); + +/* + * Frees memory at the given pointer, uses the appropriate deallocator as + * specified in the context. Also cleans the memory using clear_internal_memory. + * @param context argon2_context which specifies the deallocator + * @param memory pointer to buffer to be freed + * @param size the size in bytes for each element to be deallocated + * @param num the number of elements to be deallocated + */ +void free_memory(const argon2_context *context, uint8_t *memory, + size_t num, size_t size); + +/* Function that securely cleans the memory. This ignores any flags set + * regarding clearing memory. Usually one just calls clear_internal_memory. + * @param mem Pointer to the memory + * @param s Memory size in bytes + */ +void secure_wipe_memory(void *v, size_t n); + +/* Function that securely clears the memory if FLAG_clear_internal_memory is + * set. If the flag isn't set, this function does nothing. + * @param mem Pointer to the memory + * @param s Memory size in bytes + */ +void clear_internal_memory(void *v, size_t n); + +/* + * Computes absolute position of reference block in the lane following a skewed + * distribution and using a pseudo-random value as input + * @param instance Pointer to the current instance + * @param position Pointer to the current position + * @param pseudo_rand 32-bit pseudo-random value used to determine the position + * @param same_lane Indicates if the block will be taken from the current lane. + * If so we can reference the current segment + * @pre All pointers must be valid + */ +uint32_t index_alpha(const argon2_instance_t *instance, + const argon2_position_t *position, uint32_t pseudo_rand, + int same_lane); + +/* + * Function that validates all inputs against predefined restrictions and return + * an error code + * @param context Pointer to current Argon2 context + * @return ARGON2_OK if everything is all right, otherwise one of error codes + * (all defined in + */ +int validate_inputs(const argon2_context *context); + +/* + * Hashes all the inputs into @a blockhash[PREHASH_DIGEST_LENGTH], clears + * password and secret if needed + * @param context Pointer to the Argon2 internal structure containing memory + * pointer, and parameters for time and space requirements. + * @param blockhash Buffer for pre-hashing digest + * @param type Argon2 type + * @pre @a blockhash must have at least @a PREHASH_DIGEST_LENGTH bytes + * allocated + */ +void initial_hash(uint8_t *blockhash, argon2_context *context, + argon2_type type); + +/* + * Function creates first 2 blocks per lane + * @param instance Pointer to the current instance + * @param blockhash Pointer to the pre-hashing digest + * @pre blockhash must point to @a PREHASH_SEED_LENGTH allocated values + */ +void fill_first_blocks(uint8_t *blockhash, const argon2_instance_t *instance); + +/* + * Function allocates memory, hashes the inputs with Blake, and creates first + * two blocks. Returns the pointer to the main memory with 2 blocks per lane + * initialized + * @param context Pointer to the Argon2 internal structure containing memory + * pointer, and parameters for time and space requirements. + * @param instance Current Argon2 instance + * @return Zero if successful, -1 if memory failed to allocate. @context->state + * will be modified if successful. + */ +int initialize(argon2_instance_t *instance, argon2_context *context); + +/* + * XORing the last block of each lane, hashing it, making the tag. Deallocates + * the memory. + * @param context Pointer to current Argon2 context (use only the out parameters + * from it) + * @param instance Pointer to current instance of Argon2 + * @pre instance->state must point to necessary amount of memory + * @pre context->out must point to outlen bytes of memory + * @pre if context->free_cbk is not NULL, it should point to a function that + * deallocates memory + */ +void finalize(const argon2_context *context, argon2_instance_t *instance); + +/* + * Function that fills the segment using previous segments also from other + * threads + * @param context current context + * @param instance Pointer to the current instance + * @param position Current position + * @pre all block pointers must be valid + */ +void fill_segment(const argon2_instance_t *instance, + argon2_position_t position); + +/* + * Function that fills the entire memory t_cost times based on the first two + * blocks in each lane + * @param instance Pointer to the current instance + * @return ARGON2_OK if successful, @context->state + */ +int fill_memory_blocks(argon2_instance_t *instance); + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/encoding.c b/deps/phc-winner-argon2-20190702/src/encoding.c new file mode 100644 index 000000000..12cfda4d0 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/encoding.c @@ -0,0 +1,463 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include +#include +#include "encoding.h" +#include "core.h" + +/* + * Example code for a decoder and encoder of "hash strings", with Argon2 + * parameters. + * + * This code comprises three sections: + * + * -- The first section contains generic Base64 encoding and decoding + * functions. It is conceptually applicable to any hash function + * implementation that uses Base64 to encode and decode parameters, + * salts and outputs. It could be made into a library, provided that + * the relevant functions are made public (non-static) and be given + * reasonable names to avoid collisions with other functions. + * + * -- The second section is specific to Argon2. It encodes and decodes + * the parameters, salts and outputs. It does not compute the hash + * itself. + * + * The code was originally written by Thomas Pornin , + * to whom comments and remarks may be sent. It is released under what + * should amount to Public Domain or its closest equivalent; the + * following mantra is supposed to incarnate that fact with all the + * proper legal rituals: + * + * --------------------------------------------------------------------- + * This file is provided under the terms of Creative Commons CC0 1.0 + * Public Domain Dedication. To the extent possible under law, the + * author (Thomas Pornin) has waived all copyright and related or + * neighboring rights to this file. This work is published from: Canada. + * --------------------------------------------------------------------- + * + * Copyright (c) 2015 Thomas Pornin + */ + +/* ==================================================================== */ +/* + * Common code; could be shared between different hash functions. + * + * Note: the Base64 functions below assume that uppercase letters (resp. + * lowercase letters) have consecutive numerical codes, that fit on 8 + * bits. All modern systems use ASCII-compatible charsets, where these + * properties are true. If you are stuck with a dinosaur of a system + * that still defaults to EBCDIC then you already have much bigger + * interoperability issues to deal with. + */ + +/* + * Some macros for constant-time comparisons. These work over values in + * the 0..255 range. Returned value is 0x00 on "false", 0xFF on "true". + */ +#define EQ(x, y) ((((0U - ((unsigned)(x) ^ (unsigned)(y))) >> 8) & 0xFF) ^ 0xFF) +#define GT(x, y) ((((unsigned)(y) - (unsigned)(x)) >> 8) & 0xFF) +#define GE(x, y) (GT(y, x) ^ 0xFF) +#define LT(x, y) GT(y, x) +#define LE(x, y) GE(y, x) + +/* + * Convert value x (0..63) to corresponding Base64 character. + */ +static int b64_byte_to_char(unsigned x) { + return (LT(x, 26) & (x + 'A')) | + (GE(x, 26) & LT(x, 52) & (x + ('a' - 26))) | + (GE(x, 52) & LT(x, 62) & (x + ('0' - 52))) | (EQ(x, 62) & '+') | + (EQ(x, 63) & '/'); +} + +/* + * Convert character c to the corresponding 6-bit value. If character c + * is not a Base64 character, then 0xFF (255) is returned. + */ +static unsigned b64_char_to_byte(int c) { + unsigned x; + + x = (GE(c, 'A') & LE(c, 'Z') & (c - 'A')) | + (GE(c, 'a') & LE(c, 'z') & (c - ('a' - 26))) | + (GE(c, '0') & LE(c, '9') & (c - ('0' - 52))) | (EQ(c, '+') & 62) | + (EQ(c, '/') & 63); + return x | (EQ(x, 0) & (EQ(c, 'A') ^ 0xFF)); +} + +/* + * Convert some bytes to Base64. 'dst_len' is the length (in characters) + * of the output buffer 'dst'; if that buffer is not large enough to + * receive the result (including the terminating 0), then (size_t)-1 + * is returned. Otherwise, the zero-terminated Base64 string is written + * in the buffer, and the output length (counted WITHOUT the terminating + * zero) is returned. + */ +static size_t to_base64(char *dst, size_t dst_len, const void *src, + size_t src_len) { + size_t olen; + const unsigned char *buf; + unsigned acc, acc_len; + + olen = (src_len / 3) << 2; + switch (src_len % 3) { + case 2: + olen++; + /* fall through */ + case 1: + olen += 2; + break; + } + if (dst_len <= olen) { + return (size_t)-1; + } + acc = 0; + acc_len = 0; + buf = (const unsigned char *)src; + while (src_len-- > 0) { + acc = (acc << 8) + (*buf++); + acc_len += 8; + while (acc_len >= 6) { + acc_len -= 6; + *dst++ = (char)b64_byte_to_char((acc >> acc_len) & 0x3F); + } + } + if (acc_len > 0) { + *dst++ = (char)b64_byte_to_char((acc << (6 - acc_len)) & 0x3F); + } + *dst++ = 0; + return olen; +} + +/* + * Decode Base64 chars into bytes. The '*dst_len' value must initially + * contain the length of the output buffer '*dst'; when the decoding + * ends, the actual number of decoded bytes is written back in + * '*dst_len'. + * + * Decoding stops when a non-Base64 character is encountered, or when + * the output buffer capacity is exceeded. If an error occurred (output + * buffer is too small, invalid last characters leading to unprocessed + * buffered bits), then NULL is returned; otherwise, the returned value + * points to the first non-Base64 character in the source stream, which + * may be the terminating zero. + */ +static const char *from_base64(void *dst, size_t *dst_len, const char *src) { + size_t len; + unsigned char *buf; + unsigned acc, acc_len; + + buf = (unsigned char *)dst; + len = 0; + acc = 0; + acc_len = 0; + for (;;) { + unsigned d; + + d = b64_char_to_byte(*src); + if (d == 0xFF) { + break; + } + src++; + acc = (acc << 6) + d; + acc_len += 6; + if (acc_len >= 8) { + acc_len -= 8; + if ((len++) >= *dst_len) { + return NULL; + } + *buf++ = (acc >> acc_len) & 0xFF; + } + } + + /* + * If the input length is equal to 1 modulo 4 (which is + * invalid), then there will remain 6 unprocessed bits; + * otherwise, only 0, 2 or 4 bits are buffered. The buffered + * bits must also all be zero. + */ + if (acc_len > 4 || (acc & (((unsigned)1 << acc_len) - 1)) != 0) { + return NULL; + } + *dst_len = len; + return src; +} + +/* + * Decode decimal integer from 'str'; the value is written in '*v'. + * Returned value is a pointer to the next non-decimal character in the + * string. If there is no digit at all, or the value encoding is not + * minimal (extra leading zeros), or the value does not fit in an + * 'unsigned long', then NULL is returned. + */ +static const char *decode_decimal(const char *str, unsigned long *v) { + const char *orig; + unsigned long acc; + + acc = 0; + for (orig = str;; str++) { + int c; + + c = *str; + if (c < '0' || c > '9') { + break; + } + c -= '0'; + if (acc > (ULONG_MAX / 10)) { + return NULL; + } + acc *= 10; + if ((unsigned long)c > (ULONG_MAX - acc)) { + return NULL; + } + acc += (unsigned long)c; + } + if (str == orig || (*orig == '0' && str != (orig + 1))) { + return NULL; + } + *v = acc; + return str; +} + +/* ==================================================================== */ +/* + * Code specific to Argon2. + * + * The code below applies the following format: + * + * $argon2[$v=]$m=,t=,p=$$ + * + * where is either 'd', 'id', or 'i', is a decimal integer (positive, + * fits in an 'unsigned long'), and is Base64-encoded data (no '=' padding + * characters, no newline or whitespace). + * + * The last two binary chunks (encoded in Base64) are, in that order, + * the salt and the output. Both are required. The binary salt length and the + * output length must be in the allowed ranges defined in argon2.h. + * + * The ctx struct must contain buffers large enough to hold the salt and pwd + * when it is fed into decode_string. + */ + +int decode_string(argon2_context *ctx, const char *str, argon2_type type) { + +/* check for prefix */ +#define CC(prefix) \ + do { \ + size_t cc_len = strlen(prefix); \ + if (strncmp(str, prefix, cc_len) != 0) { \ + return ARGON2_DECODING_FAIL; \ + } \ + str += cc_len; \ + } while ((void)0, 0) + +/* optional prefix checking with supplied code */ +#define CC_opt(prefix, code) \ + do { \ + size_t cc_len = strlen(prefix); \ + if (strncmp(str, prefix, cc_len) == 0) { \ + str += cc_len; \ + { code; } \ + } \ + } while ((void)0, 0) + +/* Decoding prefix into decimal */ +#define DECIMAL(x) \ + do { \ + unsigned long dec_x; \ + str = decode_decimal(str, &dec_x); \ + if (str == NULL) { \ + return ARGON2_DECODING_FAIL; \ + } \ + (x) = dec_x; \ + } while ((void)0, 0) + + +/* Decoding prefix into uint32_t decimal */ +#define DECIMAL_U32(x) \ + do { \ + unsigned long dec_x; \ + str = decode_decimal(str, &dec_x); \ + if (str == NULL || dec_x > UINT32_MAX) { \ + return ARGON2_DECODING_FAIL; \ + } \ + (x) = (uint32_t)dec_x; \ + } while ((void)0, 0) + + +/* Decoding base64 into a binary buffer */ +#define BIN(buf, max_len, len) \ + do { \ + size_t bin_len = (max_len); \ + str = from_base64(buf, &bin_len, str); \ + if (str == NULL || bin_len > UINT32_MAX) { \ + return ARGON2_DECODING_FAIL; \ + } \ + (len) = (uint32_t)bin_len; \ + } while ((void)0, 0) + + size_t maxsaltlen = ctx->saltlen; + size_t maxoutlen = ctx->outlen; + int validation_result; + const char* type_string; + + /* We should start with the argon2_type we are using */ + type_string = argon2_type2string(type, 0); + if (!type_string) { + return ARGON2_INCORRECT_TYPE; + } + + CC("$"); + CC(type_string); + + /* Reading the version number if the default is suppressed */ + ctx->version = ARGON2_VERSION_10; + CC_opt("$v=", DECIMAL_U32(ctx->version)); + + CC("$m="); + DECIMAL_U32(ctx->m_cost); + CC(",t="); + DECIMAL_U32(ctx->t_cost); + CC(",p="); + DECIMAL_U32(ctx->lanes); + ctx->threads = ctx->lanes; + + CC("$"); + BIN(ctx->salt, maxsaltlen, ctx->saltlen); + CC("$"); + BIN(ctx->out, maxoutlen, ctx->outlen); + + /* The rest of the fields get the default values */ + ctx->secret = NULL; + ctx->secretlen = 0; + ctx->ad = NULL; + ctx->adlen = 0; + ctx->allocate_cbk = NULL; + ctx->free_cbk = NULL; + ctx->flags = ARGON2_DEFAULT_FLAGS; + + /* On return, must have valid context */ + validation_result = validate_inputs(ctx); + if (validation_result != ARGON2_OK) { + return validation_result; + } + + /* Can't have any additional characters */ + if (*str == 0) { + return ARGON2_OK; + } else { + return ARGON2_DECODING_FAIL; + } +#undef CC +#undef CC_opt +#undef DECIMAL +#undef BIN +} + +int encode_string(char *dst, size_t dst_len, argon2_context *ctx, + argon2_type type) { +#define SS(str) \ + do { \ + size_t pp_len = strlen(str); \ + if (pp_len >= dst_len) { \ + return ARGON2_ENCODING_FAIL; \ + } \ + memcpy(dst, str, pp_len + 1); \ + dst += pp_len; \ + dst_len -= pp_len; \ + } while ((void)0, 0) + +#define SX(x) \ + do { \ + char tmp[30]; \ + sprintf(tmp, "%lu", (unsigned long)(x)); \ + SS(tmp); \ + } while ((void)0, 0) + +#define SB(buf, len) \ + do { \ + size_t sb_len = to_base64(dst, dst_len, buf, len); \ + if (sb_len == (size_t)-1) { \ + return ARGON2_ENCODING_FAIL; \ + } \ + dst += sb_len; \ + dst_len -= sb_len; \ + } while ((void)0, 0) + + const char* type_string = argon2_type2string(type, 0); + int validation_result = validate_inputs(ctx); + + if (!type_string) { + return ARGON2_ENCODING_FAIL; + } + + if (validation_result != ARGON2_OK) { + return validation_result; + } + + + SS("$"); + SS(type_string); + + SS("$v="); + SX(ctx->version); + + SS("$m="); + SX(ctx->m_cost); + SS(",t="); + SX(ctx->t_cost); + SS(",p="); + SX(ctx->lanes); + + SS("$"); + SB(ctx->salt, ctx->saltlen); + + SS("$"); + SB(ctx->out, ctx->outlen); + return ARGON2_OK; + +#undef SS +#undef SX +#undef SB +} + +size_t b64len(uint32_t len) { + size_t olen = ((size_t)len / 3) << 2; + + switch (len % 3) { + case 2: + olen++; + /* fall through */ + case 1: + olen += 2; + break; + } + + return olen; +} + +size_t numlen(uint32_t num) { + size_t len = 1; + while (num >= 10) { + ++len; + num = num / 10; + } + return len; +} + diff --git a/deps/phc-winner-argon2-20190702/src/encoding.h b/deps/phc-winner-argon2-20190702/src/encoding.h new file mode 100644 index 000000000..7e83ec928 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/encoding.h @@ -0,0 +1,57 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ENCODING_H +#define ENCODING_H +#include "argon2.h" + +#define ARGON2_MAX_DECODED_LANES UINT32_C(255) +#define ARGON2_MIN_DECODED_SALT_LEN UINT32_C(8) +#define ARGON2_MIN_DECODED_OUT_LEN UINT32_C(12) + +/* +* encode an Argon2 hash string into the provided buffer. 'dst_len' +* contains the size, in characters, of the 'dst' buffer; if 'dst_len' +* is less than the number of required characters (including the +* terminating 0), then this function returns ARGON2_ENCODING_ERROR. +* +* on success, ARGON2_OK is returned. +*/ +int encode_string(char *dst, size_t dst_len, argon2_context *ctx, + argon2_type type); + +/* +* Decodes an Argon2 hash string into the provided structure 'ctx'. +* The only fields that must be set prior to this call are ctx.saltlen and +* ctx.outlen (which must be the maximal salt and out length values that are +* allowed), ctx.salt and ctx.out (which must be buffers of the specified +* length), and ctx.pwd and ctx.pwdlen which must hold a valid password. +* +* Invalid input string causes an error. On success, the ctx is valid and all +* fields have been initialized. +* +* Returned value is ARGON2_OK on success, other ARGON2_ codes on error. +*/ +int decode_string(argon2_context *ctx, const char *str, argon2_type type); + +/* Returns the length of the encoded byte stream with length len */ +size_t b64len(uint32_t len); + +/* Returns the length of the encoded number num */ +size_t numlen(uint32_t num); + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/genkat.c b/deps/phc-winner-argon2-20190702/src/genkat.c new file mode 100644 index 000000000..8db9036f7 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/genkat.c @@ -0,0 +1,207 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include +#include "argon2.h" +#include "core.h" + +void initial_kat(const uint8_t *blockhash, const argon2_context *context, + argon2_type type) { + unsigned i; + + if (blockhash != NULL && context != NULL) { + printf("=======================================\n"); + + printf("%s version number %d\n", argon2_type2string(type, 1), + context->version); + + printf("=======================================\n"); + + + printf("Memory: %u KiB, Iterations: %u, Parallelism: %u lanes, Tag " + "length: %u bytes\n", + context->m_cost, context->t_cost, context->lanes, + context->outlen); + + printf("Password[%u]: ", context->pwdlen); + + if (context->flags & ARGON2_FLAG_CLEAR_PASSWORD) { + printf("CLEARED\n"); + } else { + for (i = 0; i < context->pwdlen; ++i) { + printf("%2.2x ", ((unsigned char *)context->pwd)[i]); + } + + printf("\n"); + } + + printf("Salt[%u]: ", context->saltlen); + + for (i = 0; i < context->saltlen; ++i) { + printf("%2.2x ", ((unsigned char *)context->salt)[i]); + } + + printf("\n"); + + printf("Secret[%u]: ", context->secretlen); + + if (context->flags & ARGON2_FLAG_CLEAR_SECRET) { + printf("CLEARED\n"); + } else { + for (i = 0; i < context->secretlen; ++i) { + printf("%2.2x ", ((unsigned char *)context->secret)[i]); + } + + printf("\n"); + } + + printf("Associated data[%u]: ", context->adlen); + + for (i = 0; i < context->adlen; ++i) { + printf("%2.2x ", ((unsigned char *)context->ad)[i]); + } + + printf("\n"); + + printf("Pre-hashing digest: "); + + for (i = 0; i < ARGON2_PREHASH_DIGEST_LENGTH; ++i) { + printf("%2.2x ", ((unsigned char *)blockhash)[i]); + } + + printf("\n"); + } +} + +void print_tag(const void *out, uint32_t outlen) { + unsigned i; + if (out != NULL) { + printf("Tag: "); + + for (i = 0; i < outlen; ++i) { + printf("%2.2x ", ((uint8_t *)out)[i]); + } + + printf("\n"); + } +} + +void internal_kat(const argon2_instance_t *instance, uint32_t pass) { + + if (instance != NULL) { + uint32_t i, j; + printf("\n After pass %u:\n", pass); + + for (i = 0; i < instance->memory_blocks; ++i) { + uint32_t how_many_words = + (instance->memory_blocks > ARGON2_QWORDS_IN_BLOCK) + ? 1 + : ARGON2_QWORDS_IN_BLOCK; + + for (j = 0; j < how_many_words; ++j) + printf("Block %.4u [%3u]: %016llx\n", i, j, + (unsigned long long)instance->memory[i].v[j]); + } + } +} + +static void fatal(const char *error) { + fprintf(stderr, "Error: %s\n", error); + exit(1); +} + +static void generate_testvectors(argon2_type type, const uint32_t version) { +#define TEST_OUTLEN 32 +#define TEST_PWDLEN 32 +#define TEST_SALTLEN 16 +#define TEST_SECRETLEN 8 +#define TEST_ADLEN 12 + argon2_context context; + + unsigned char out[TEST_OUTLEN]; + unsigned char pwd[TEST_PWDLEN]; + unsigned char salt[TEST_SALTLEN]; + unsigned char secret[TEST_SECRETLEN]; + unsigned char ad[TEST_ADLEN]; + const allocate_fptr myown_allocator = NULL; + const deallocate_fptr myown_deallocator = NULL; + + unsigned t_cost = 3; + unsigned m_cost = 32; + unsigned lanes = 4; + + memset(pwd, 1, TEST_OUTLEN); + memset(salt, 2, TEST_SALTLEN); + memset(secret, 3, TEST_SECRETLEN); + memset(ad, 4, TEST_ADLEN); + + context.out = out; + context.outlen = TEST_OUTLEN; + context.version = version; + context.pwd = pwd; + context.pwdlen = TEST_PWDLEN; + context.salt = salt; + context.saltlen = TEST_SALTLEN; + context.secret = secret; + context.secretlen = TEST_SECRETLEN; + context.ad = ad; + context.adlen = TEST_ADLEN; + context.t_cost = t_cost; + context.m_cost = m_cost; + context.lanes = lanes; + context.threads = lanes; + context.allocate_cbk = myown_allocator; + context.free_cbk = myown_deallocator; + context.flags = ARGON2_DEFAULT_FLAGS; + +#undef TEST_OUTLEN +#undef TEST_PWDLEN +#undef TEST_SALTLEN +#undef TEST_SECRETLEN +#undef TEST_ADLEN + + argon2_ctx(&context, type); +} + +int main(int argc, char *argv[]) { + /* Get and check Argon2 type */ + const char *type_str = (argc > 1) ? argv[1] : "i"; + argon2_type type = Argon2_i; + uint32_t version = ARGON2_VERSION_NUMBER; + if (!strcmp(type_str, "d")) { + type = Argon2_d; + } else if (!strcmp(type_str, "i")) { + type = Argon2_i; + } else if (!strcmp(type_str, "id")) { + type = Argon2_id; + } else { + fatal("wrong Argon2 type"); + } + + /* Get and check Argon2 version number */ + if (argc > 2) { + version = strtoul(argv[2], NULL, 10); + } + if (ARGON2_VERSION_10 != version && ARGON2_VERSION_NUMBER != version) { + fatal("wrong Argon2 version number"); + } + + generate_testvectors(type, version); + return ARGON2_OK; +} diff --git a/deps/phc-winner-argon2-20190702/src/genkat.h b/deps/phc-winner-argon2-20190702/src/genkat.h new file mode 100644 index 000000000..057263015 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/genkat.h @@ -0,0 +1,51 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_KAT_H +#define ARGON2_KAT_H + +#include "core.h" + +/* + * Initial KAT function that prints the inputs to the file + * @param blockhash Array that contains pre-hashing digest + * @param context Holds inputs + * @param type Argon2 type + * @pre blockhash must point to INPUT_INITIAL_HASH_LENGTH bytes + * @pre context member pointers must point to allocated memory of size according + * to the length values + */ +void initial_kat(const uint8_t *blockhash, const argon2_context *context, + argon2_type type); + +/* + * Function that prints the output tag + * @param out output array pointer + * @param outlen digest length + * @pre out must point to @a outlen bytes + **/ +void print_tag(const void *out, uint32_t outlen); + +/* + * Function that prints the internal state at given moment + * @param instance pointer to the current instance + * @param pass current pass number + * @pre instance must have necessary memory allocated + **/ +void internal_kat(const argon2_instance_t *instance, uint32_t pass); + +#endif diff --git a/deps/phc-winner-argon2-20190702/src/opt.c b/deps/phc-winner-argon2-20190702/src/opt.c new file mode 100644 index 000000000..f6c20528e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/opt.c @@ -0,0 +1,283 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "argon2.h" +#include "core.h" + +#include "blake2/blake2.h" +#include "blake2/blamka-round-opt.h" + +/* + * Function fills a new memory block and optionally XORs the old block over the new one. + * Memory must be initialized. + * @param state Pointer to the just produced block. Content will be updated(!) + * @param ref_block Pointer to the reference block + * @param next_block Pointer to the block to be XORed over. May coincide with @ref_block + * @param with_xor Whether to XOR into the new block (1) or just overwrite (0) + * @pre all block pointers must be valid + */ +#if defined(__AVX512F__) +static void fill_block(__m512i *state, const block *ref_block, + block *next_block, int with_xor) { + __m512i block_XY[ARGON2_512BIT_WORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + state[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)ref_block->v + i)); + block_XY[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm512_xor_si512( + state[i], _mm512_loadu_si512((const __m512i *)ref_block->v + i)); + } + } + + for (i = 0; i < 2; ++i) { + BLAKE2_ROUND_1( + state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], state[8 * i + 3], + state[8 * i + 4], state[8 * i + 5], state[8 * i + 6], state[8 * i + 7]); + } + + for (i = 0; i < 2; ++i) { + BLAKE2_ROUND_2( + state[2 * 0 + i], state[2 * 1 + i], state[2 * 2 + i], state[2 * 3 + i], + state[2 * 4 + i], state[2 * 5 + i], state[2 * 6 + i], state[2 * 7 + i]); + } + + for (i = 0; i < ARGON2_512BIT_WORDS_IN_BLOCK; i++) { + state[i] = _mm512_xor_si512(state[i], block_XY[i]); + _mm512_storeu_si512((__m512i *)next_block->v + i, state[i]); + } +} +#elif defined(__AVX2__) +static void fill_block(__m256i *state, const block *ref_block, + block *next_block, int with_xor) { + __m256i block_XY[ARGON2_HWORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + state[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)ref_block->v + i)); + block_XY[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm256_xor_si256( + state[i], _mm256_loadu_si256((const __m256i *)ref_block->v + i)); + } + } + + for (i = 0; i < 4; ++i) { + BLAKE2_ROUND_1(state[8 * i + 0], state[8 * i + 4], state[8 * i + 1], state[8 * i + 5], + state[8 * i + 2], state[8 * i + 6], state[8 * i + 3], state[8 * i + 7]); + } + + for (i = 0; i < 4; ++i) { + BLAKE2_ROUND_2(state[ 0 + i], state[ 4 + i], state[ 8 + i], state[12 + i], + state[16 + i], state[20 + i], state[24 + i], state[28 + i]); + } + + for (i = 0; i < ARGON2_HWORDS_IN_BLOCK; i++) { + state[i] = _mm256_xor_si256(state[i], block_XY[i]); + _mm256_storeu_si256((__m256i *)next_block->v + i, state[i]); + } +} +#else +static void fill_block(__m128i *state, const block *ref_block, + block *next_block, int with_xor) { + __m128i block_XY[ARGON2_OWORDS_IN_BLOCK]; + unsigned int i; + + if (with_xor) { + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + state[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)ref_block->v + i)); + block_XY[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)next_block->v + i)); + } + } else { + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + block_XY[i] = state[i] = _mm_xor_si128( + state[i], _mm_loadu_si128((const __m128i *)ref_block->v + i)); + } + } + + for (i = 0; i < 8; ++i) { + BLAKE2_ROUND(state[8 * i + 0], state[8 * i + 1], state[8 * i + 2], + state[8 * i + 3], state[8 * i + 4], state[8 * i + 5], + state[8 * i + 6], state[8 * i + 7]); + } + + for (i = 0; i < 8; ++i) { + BLAKE2_ROUND(state[8 * 0 + i], state[8 * 1 + i], state[8 * 2 + i], + state[8 * 3 + i], state[8 * 4 + i], state[8 * 5 + i], + state[8 * 6 + i], state[8 * 7 + i]); + } + + for (i = 0; i < ARGON2_OWORDS_IN_BLOCK; i++) { + state[i] = _mm_xor_si128(state[i], block_XY[i]); + _mm_storeu_si128((__m128i *)next_block->v + i, state[i]); + } +} +#endif + +static void next_addresses(block *address_block, block *input_block) { + /*Temporary zero-initialized blocks*/ +#if defined(__AVX512F__) + __m512i zero_block[ARGON2_512BIT_WORDS_IN_BLOCK]; + __m512i zero2_block[ARGON2_512BIT_WORDS_IN_BLOCK]; +#elif defined(__AVX2__) + __m256i zero_block[ARGON2_HWORDS_IN_BLOCK]; + __m256i zero2_block[ARGON2_HWORDS_IN_BLOCK]; +#else + __m128i zero_block[ARGON2_OWORDS_IN_BLOCK]; + __m128i zero2_block[ARGON2_OWORDS_IN_BLOCK]; +#endif + + memset(zero_block, 0, sizeof(zero_block)); + memset(zero2_block, 0, sizeof(zero2_block)); + + /*Increasing index counter*/ + input_block->v[6]++; + + /*First iteration of G*/ + fill_block(zero_block, input_block, address_block, 0); + + /*Second iteration of G*/ + fill_block(zero2_block, address_block, address_block, 0); +} + +void fill_segment(const argon2_instance_t *instance, + argon2_position_t position) { + block *ref_block = NULL, *curr_block = NULL; + block address_block, input_block; + uint64_t pseudo_rand, ref_index, ref_lane; + uint32_t prev_offset, curr_offset; + uint32_t starting_index, i; +#if defined(__AVX512F__) + __m512i state[ARGON2_512BIT_WORDS_IN_BLOCK]; +#elif defined(__AVX2__) + __m256i state[ARGON2_HWORDS_IN_BLOCK]; +#else + __m128i state[ARGON2_OWORDS_IN_BLOCK]; +#endif + int data_independent_addressing; + + if (instance == NULL) { + return; + } + + data_independent_addressing = + (instance->type == Argon2_i) || + (instance->type == Argon2_id && (position.pass == 0) && + (position.slice < ARGON2_SYNC_POINTS / 2)); + + if (data_independent_addressing) { + init_block_value(&input_block, 0); + + input_block.v[0] = position.pass; + input_block.v[1] = position.lane; + input_block.v[2] = position.slice; + input_block.v[3] = instance->memory_blocks; + input_block.v[4] = instance->passes; + input_block.v[5] = instance->type; + } + + starting_index = 0; + + if ((0 == position.pass) && (0 == position.slice)) { + starting_index = 2; /* we have already generated the first two blocks */ + + /* Don't forget to generate the first block of addresses: */ + if (data_independent_addressing) { + next_addresses(&address_block, &input_block); + } + } + + /* Offset of the current block */ + curr_offset = position.lane * instance->lane_length + + position.slice * instance->segment_length + starting_index; + + if (0 == curr_offset % instance->lane_length) { + /* Last block in this lane */ + prev_offset = curr_offset + instance->lane_length - 1; + } else { + /* Previous block */ + prev_offset = curr_offset - 1; + } + + memcpy(state, ((instance->memory + prev_offset)->v), ARGON2_BLOCK_SIZE); + + for (i = starting_index; i < instance->segment_length; + ++i, ++curr_offset, ++prev_offset) { + /*1.1 Rotating prev_offset if needed */ + if (curr_offset % instance->lane_length == 1) { + prev_offset = curr_offset - 1; + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + if (data_independent_addressing) { + if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { + next_addresses(&address_block, &input_block); + } + pseudo_rand = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; + } else { + pseudo_rand = instance->memory[prev_offset].v[0]; + } + + /* 1.2.2 Computing the lane of the reference block */ + ref_lane = ((pseudo_rand >> 32)) % instance->lanes; + + if ((position.pass == 0) && (position.slice == 0)) { + /* Can not reference other lanes yet */ + ref_lane = position.lane; + } + + /* 1.2.3 Computing the number of possible reference block within the + * lane. + */ + position.index = i; + ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, + ref_lane == position.lane); + + /* 2 Creating a new block */ + ref_block = + instance->memory + instance->lane_length * ref_lane + ref_index; + curr_block = instance->memory + curr_offset; + if (ARGON2_VERSION_10 == instance->version) { + /* version 1.2.1 and earlier: overwrite, not XOR */ + fill_block(state, ref_block, curr_block, 0); + } else { + if(0 == position.pass) { + fill_block(state, ref_block, curr_block, 0); + } else { + fill_block(state, ref_block, curr_block, 1); + } + } + } +} diff --git a/deps/phc-winner-argon2-20190702/src/ref.c b/deps/phc-winner-argon2-20190702/src/ref.c new file mode 100644 index 000000000..ad1cf461f --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/ref.c @@ -0,0 +1,194 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include + +#include "argon2.h" +#include "core.h" + +#include "blake2/blamka-round-ref.h" +#include "blake2/blake2-impl.h" +#include "blake2/blake2.h" + + +/* + * Function fills a new memory block and optionally XORs the old block over the new one. + * @next_block must be initialized. + * @param prev_block Pointer to the previous block + * @param ref_block Pointer to the reference block + * @param next_block Pointer to the block to be constructed + * @param with_xor Whether to XOR into the new block (1) or just overwrite (0) + * @pre all block pointers must be valid + */ +static void fill_block(const block *prev_block, const block *ref_block, + block *next_block, int with_xor) { + block blockR, block_tmp; + unsigned i; + + copy_block(&blockR, ref_block); + xor_block(&blockR, prev_block); + copy_block(&block_tmp, &blockR); + /* Now blockR = ref_block + prev_block and block_tmp = ref_block + prev_block */ + if (with_xor) { + /* Saving the next block contents for XOR over: */ + xor_block(&block_tmp, next_block); + /* Now blockR = ref_block + prev_block and + block_tmp = ref_block + prev_block + next_block */ + } + + /* Apply Blake2 on columns of 64-bit words: (0,1,...,15) , then + (16,17,..31)... finally (112,113,...127) */ + for (i = 0; i < 8; ++i) { + BLAKE2_ROUND_NOMSG( + blockR.v[16 * i], blockR.v[16 * i + 1], blockR.v[16 * i + 2], + blockR.v[16 * i + 3], blockR.v[16 * i + 4], blockR.v[16 * i + 5], + blockR.v[16 * i + 6], blockR.v[16 * i + 7], blockR.v[16 * i + 8], + blockR.v[16 * i + 9], blockR.v[16 * i + 10], blockR.v[16 * i + 11], + blockR.v[16 * i + 12], blockR.v[16 * i + 13], blockR.v[16 * i + 14], + blockR.v[16 * i + 15]); + } + + /* Apply Blake2 on rows of 64-bit words: (0,1,16,17,...112,113), then + (2,3,18,19,...,114,115).. finally (14,15,30,31,...,126,127) */ + for (i = 0; i < 8; i++) { + BLAKE2_ROUND_NOMSG( + blockR.v[2 * i], blockR.v[2 * i + 1], blockR.v[2 * i + 16], + blockR.v[2 * i + 17], blockR.v[2 * i + 32], blockR.v[2 * i + 33], + blockR.v[2 * i + 48], blockR.v[2 * i + 49], blockR.v[2 * i + 64], + blockR.v[2 * i + 65], blockR.v[2 * i + 80], blockR.v[2 * i + 81], + blockR.v[2 * i + 96], blockR.v[2 * i + 97], blockR.v[2 * i + 112], + blockR.v[2 * i + 113]); + } + + copy_block(next_block, &block_tmp); + xor_block(next_block, &blockR); +} + +static void next_addresses(block *address_block, block *input_block, + const block *zero_block) { + input_block->v[6]++; + fill_block(zero_block, input_block, address_block, 0); + fill_block(zero_block, address_block, address_block, 0); +} + +void fill_segment(const argon2_instance_t *instance, + argon2_position_t position) { + block *ref_block = NULL, *curr_block = NULL; + block address_block, input_block, zero_block; + uint64_t pseudo_rand, ref_index, ref_lane; + uint32_t prev_offset, curr_offset; + uint32_t starting_index; + uint32_t i; + int data_independent_addressing; + + if (instance == NULL) { + return; + } + + data_independent_addressing = + (instance->type == Argon2_i) || + (instance->type == Argon2_id && (position.pass == 0) && + (position.slice < ARGON2_SYNC_POINTS / 2)); + + if (data_independent_addressing) { + init_block_value(&zero_block, 0); + init_block_value(&input_block, 0); + + input_block.v[0] = position.pass; + input_block.v[1] = position.lane; + input_block.v[2] = position.slice; + input_block.v[3] = instance->memory_blocks; + input_block.v[4] = instance->passes; + input_block.v[5] = instance->type; + } + + starting_index = 0; + + if ((0 == position.pass) && (0 == position.slice)) { + starting_index = 2; /* we have already generated the first two blocks */ + + /* Don't forget to generate the first block of addresses: */ + if (data_independent_addressing) { + next_addresses(&address_block, &input_block, &zero_block); + } + } + + /* Offset of the current block */ + curr_offset = position.lane * instance->lane_length + + position.slice * instance->segment_length + starting_index; + + if (0 == curr_offset % instance->lane_length) { + /* Last block in this lane */ + prev_offset = curr_offset + instance->lane_length - 1; + } else { + /* Previous block */ + prev_offset = curr_offset - 1; + } + + for (i = starting_index; i < instance->segment_length; + ++i, ++curr_offset, ++prev_offset) { + /*1.1 Rotating prev_offset if needed */ + if (curr_offset % instance->lane_length == 1) { + prev_offset = curr_offset - 1; + } + + /* 1.2 Computing the index of the reference block */ + /* 1.2.1 Taking pseudo-random value from the previous block */ + if (data_independent_addressing) { + if (i % ARGON2_ADDRESSES_IN_BLOCK == 0) { + next_addresses(&address_block, &input_block, &zero_block); + } + pseudo_rand = address_block.v[i % ARGON2_ADDRESSES_IN_BLOCK]; + } else { + pseudo_rand = instance->memory[prev_offset].v[0]; + } + + /* 1.2.2 Computing the lane of the reference block */ + ref_lane = ((pseudo_rand >> 32)) % instance->lanes; + + if ((position.pass == 0) && (position.slice == 0)) { + /* Can not reference other lanes yet */ + ref_lane = position.lane; + } + + /* 1.2.3 Computing the number of possible reference block within the + * lane. + */ + position.index = i; + ref_index = index_alpha(instance, &position, pseudo_rand & 0xFFFFFFFF, + ref_lane == position.lane); + + /* 2 Creating a new block */ + ref_block = + instance->memory + instance->lane_length * ref_lane + ref_index; + curr_block = instance->memory + curr_offset; + if (ARGON2_VERSION_10 == instance->version) { + /* version 1.2.1 and earlier: overwrite, not XOR */ + fill_block(instance->memory + prev_offset, ref_block, curr_block, 0); + } else { + if(0 == position.pass) { + fill_block(instance->memory + prev_offset, ref_block, + curr_block, 0); + } else { + fill_block(instance->memory + prev_offset, ref_block, + curr_block, 1); + } + } + } +} diff --git a/deps/phc-winner-argon2-20190702/src/run.c b/deps/phc-winner-argon2-20190702/src/run.c new file mode 100644 index 000000000..b21b9d7fa --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/run.c @@ -0,0 +1,337 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include + +#include "argon2.h" +#include "core.h" + +#define T_COST_DEF 3 +#define LOG_M_COST_DEF 12 /* 2^12 = 4 MiB */ +#define LANES_DEF 1 +#define THREADS_DEF 1 +#define OUTLEN_DEF 32 +#define MAX_PASS_LEN 128 + +#define UNUSED_PARAMETER(x) (void)(x) + +static void usage(const char *cmd) { + printf("Usage: %s [-h] salt [-i|-d|-id] [-t iterations] " + "[-m log2(memory in KiB) | -k memory in KiB] [-p parallelism] " + "[-l hash length] [-e|-r] [-v (10|13)]\n", + cmd); + printf("\tPassword is read from stdin\n"); + printf("Parameters:\n"); + printf("\tsalt\t\tThe salt to use, at least 8 characters\n"); + printf("\t-i\t\tUse Argon2i (this is the default)\n"); + printf("\t-d\t\tUse Argon2d instead of Argon2i\n"); + printf("\t-id\t\tUse Argon2id instead of Argon2i\n"); + printf("\t-t N\t\tSets the number of iterations to N (default = %d)\n", + T_COST_DEF); + printf("\t-m N\t\tSets the memory usage of 2^N KiB (default %d)\n", + LOG_M_COST_DEF); + printf("\t-k N\t\tSets the memory usage of N KiB (default %d)\n", + 1 << LOG_M_COST_DEF); + printf("\t-p N\t\tSets parallelism to N threads (default %d)\n", + THREADS_DEF); + printf("\t-l N\t\tSets hash output length to N bytes (default %d)\n", + OUTLEN_DEF); + printf("\t-e\t\tOutput only encoded hash\n"); + printf("\t-r\t\tOutput only the raw bytes of the hash\n"); + printf("\t-v (10|13)\tArgon2 version (defaults to the most recent version, currently %x)\n", + ARGON2_VERSION_NUMBER); + printf("\t-h\t\tPrint %s usage\n", cmd); +} + +static void fatal(const char *error) { + fprintf(stderr, "Error: %s\n", error); + exit(1); +} + +static void print_hex(uint8_t *bytes, size_t bytes_len) { + size_t i; + for (i = 0; i < bytes_len; ++i) { + printf("%02x", bytes[i]); + } + printf("\n"); +} + +/* +Runs Argon2 with certain inputs and parameters, inputs not cleared. Prints the +Base64-encoded hash string +@out output array with at least 32 bytes allocated +@pwd NULL-terminated string, presumably from argv[] +@salt salt array +@t_cost number of iterations +@m_cost amount of requested memory in KB +@lanes amount of requested parallelism +@threads actual parallelism +@type Argon2 type we want to run +@encoded_only display only the encoded hash +@raw_only display only the hexadecimal of the hash +@version Argon2 version +*/ +static void run(uint32_t outlen, char *pwd, size_t pwdlen, char *salt, uint32_t t_cost, + uint32_t m_cost, uint32_t lanes, uint32_t threads, + argon2_type type, int encoded_only, int raw_only, uint32_t version) { + clock_t start_time, stop_time; + size_t saltlen, encodedlen; + int result; + unsigned char * out = NULL; + char * encoded = NULL; + + start_time = clock(); + + if (!pwd) { + fatal("password missing"); + } + + if (!salt) { + clear_internal_memory(pwd, pwdlen); + fatal("salt missing"); + } + + saltlen = strlen(salt); + if(UINT32_MAX < saltlen) { + fatal("salt is too long"); + } + + UNUSED_PARAMETER(lanes); + + out = malloc(outlen + 1); + if (!out) { + clear_internal_memory(pwd, pwdlen); + fatal("could not allocate memory for output"); + } + + encodedlen = argon2_encodedlen(t_cost, m_cost, lanes, (uint32_t)saltlen, outlen, type); + encoded = malloc(encodedlen + 1); + if (!encoded) { + clear_internal_memory(pwd, pwdlen); + fatal("could not allocate memory for hash"); + } + + result = argon2_hash(t_cost, m_cost, threads, pwd, pwdlen, salt, saltlen, + out, outlen, encoded, encodedlen, type, + version); + if (result != ARGON2_OK) + fatal(argon2_error_message(result)); + + stop_time = clock(); + + if (encoded_only) + puts(encoded); + + if (raw_only) + print_hex(out, outlen); + + if (encoded_only || raw_only) { + free(out); + free(encoded); + return; + } + + printf("Hash:\t\t"); + print_hex(out, outlen); + free(out); + + printf("Encoded:\t%s\n", encoded); + + printf("%2.3f seconds\n", + ((double)stop_time - start_time) / (CLOCKS_PER_SEC)); + + result = argon2_verify(encoded, pwd, pwdlen, type); + if (result != ARGON2_OK) + fatal(argon2_error_message(result)); + printf("Verification ok\n"); + free(encoded); +} + +int main(int argc, char *argv[]) { + uint32_t outlen = OUTLEN_DEF; + uint32_t m_cost = 1 << LOG_M_COST_DEF; + uint32_t t_cost = T_COST_DEF; + uint32_t lanes = LANES_DEF; + uint32_t threads = THREADS_DEF; + argon2_type type = Argon2_i; /* Argon2i is the default type */ + int types_specified = 0; + int m_cost_specified = 0; + int encoded_only = 0; + int raw_only = 0; + uint32_t version = ARGON2_VERSION_NUMBER; + int i; + size_t pwdlen; + char pwd[MAX_PASS_LEN], *salt; + + if (argc < 2) { + usage(argv[0]); + return ARGON2_MISSING_ARGS; + } else if (argc >= 2 && strcmp(argv[1], "-h") == 0) { + usage(argv[0]); + return 1; + } + + /* get password from stdin */ + pwdlen = fread(pwd, 1, sizeof pwd, stdin); + if(pwdlen < 1) { + fatal("no password read"); + } + if(pwdlen == MAX_PASS_LEN) { + fatal("Provided password longer than supported in command line utility"); + } + + salt = argv[1]; + + /* parse options */ + for (i = 2; i < argc; i++) { + const char *a = argv[i]; + unsigned long input = 0; + if (!strcmp(a, "-h")) { + usage(argv[0]); + return 1; + } else if (!strcmp(a, "-m")) { + if (m_cost_specified) { + fatal("-m or -k can only be used once"); + } + m_cost_specified = 1; + if (i < argc - 1) { + i++; + input = strtoul(argv[i], NULL, 10); + if (input == 0 || input == ULONG_MAX || + input > ARGON2_MAX_MEMORY_BITS) { + fatal("bad numeric input for -m"); + } + m_cost = ARGON2_MIN(UINT64_C(1) << input, UINT32_C(0xFFFFFFFF)); + if (m_cost > ARGON2_MAX_MEMORY) { + fatal("m_cost overflow"); + } + continue; + } else { + fatal("missing -m argument"); + } + } else if (!strcmp(a, "-k")) { + if (m_cost_specified) { + fatal("-m or -k can only be used once"); + } + m_cost_specified = 1; + if (i < argc - 1) { + i++; + input = strtoul(argv[i], NULL, 10); + if (input == 0 || input == ULONG_MAX) { + fatal("bad numeric input for -k"); + } + m_cost = ARGON2_MIN(input, UINT32_C(0xFFFFFFFF)); + if (m_cost > ARGON2_MAX_MEMORY) { + fatal("m_cost overflow"); + } + continue; + } else { + fatal("missing -k argument"); + } + } else if (!strcmp(a, "-t")) { + if (i < argc - 1) { + i++; + input = strtoul(argv[i], NULL, 10); + if (input == 0 || input == ULONG_MAX || + input > ARGON2_MAX_TIME) { + fatal("bad numeric input for -t"); + } + t_cost = input; + continue; + } else { + fatal("missing -t argument"); + } + } else if (!strcmp(a, "-p")) { + if (i < argc - 1) { + i++; + input = strtoul(argv[i], NULL, 10); + if (input == 0 || input == ULONG_MAX || + input > ARGON2_MAX_THREADS || input > ARGON2_MAX_LANES) { + fatal("bad numeric input for -p"); + } + threads = input; + lanes = threads; + continue; + } else { + fatal("missing -p argument"); + } + } else if (!strcmp(a, "-l")) { + if (i < argc - 1) { + i++; + input = strtoul(argv[i], NULL, 10); + outlen = input; + continue; + } else { + fatal("missing -l argument"); + } + } else if (!strcmp(a, "-i")) { + type = Argon2_i; + ++types_specified; + } else if (!strcmp(a, "-d")) { + type = Argon2_d; + ++types_specified; + } else if (!strcmp(a, "-id")) { + type = Argon2_id; + ++types_specified; + } else if (!strcmp(a, "-e")) { + encoded_only = 1; + } else if (!strcmp(a, "-r")) { + raw_only = 1; + } else if (!strcmp(a, "-v")) { + if (i < argc - 1) { + i++; + if (!strcmp(argv[i], "10")) { + version = ARGON2_VERSION_10; + } else if (!strcmp(argv[i], "13")) { + version = ARGON2_VERSION_13; + } else { + fatal("invalid Argon2 version"); + } + } else { + fatal("missing -v argument"); + } + } else { + fatal("unknown argument"); + } + } + + if (types_specified > 1) { + fatal("cannot specify multiple Argon2 types"); + } + + if(encoded_only && raw_only) + fatal("cannot provide both -e and -r"); + + if(!encoded_only && !raw_only) { + printf("Type:\t\t%s\n", argon2_type2string(type, 1)); + printf("Iterations:\t%u\n", t_cost); + printf("Memory:\t\t%u KiB\n", m_cost); + printf("Parallelism:\t%u\n", lanes); + } + + run(outlen, pwd, pwdlen, salt, t_cost, m_cost, lanes, threads, type, + encoded_only, raw_only, version); + + return ARGON2_OK; +} + diff --git a/deps/phc-winner-argon2-20190702/src/test.c b/deps/phc-winner-argon2-20190702/src/test.c new file mode 100644 index 000000000..3180cbd13 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/test.c @@ -0,0 +1,289 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#include +#include +#include +#include +#include +#include + +#include "argon2.h" + +#define OUT_LEN 32 +#define ENCODED_LEN 108 + +/* Test harness will assert: + * argon2_hash() returns ARGON2_OK + * HEX output matches expected + * encoded output matches expected + * argon2_verify() correctly verifies value + */ + +void hashtest(uint32_t version, uint32_t t, uint32_t m, uint32_t p, char *pwd, + char *salt, char *hexref, char *mcfref, argon2_type type) { + unsigned char out[OUT_LEN]; + unsigned char hex_out[OUT_LEN * 2 + 4]; + char encoded[ENCODED_LEN]; + int ret, i; + + printf("Hash test: $v=%d t=%d, m=%d, p=%d, pass=%s, salt=%s: ", version, + t, m, p, pwd, salt); + + ret = argon2_hash(t, 1 << m, p, pwd, strlen(pwd), salt, strlen(salt), out, + OUT_LEN, encoded, ENCODED_LEN, type, version); + assert(ret == ARGON2_OK); + + for (i = 0; i < OUT_LEN; ++i) + sprintf((char *)(hex_out + i * 2), "%02x", out[i]); + assert(memcmp(hex_out, hexref, OUT_LEN * 2) == 0); + + if (ARGON2_VERSION_NUMBER == version) { + assert(memcmp(encoded, mcfref, strlen(mcfref)) == 0); + } + + ret = argon2_verify(encoded, pwd, strlen(pwd), type); + assert(ret == ARGON2_OK); + ret = argon2_verify(mcfref, pwd, strlen(pwd), type); + assert(ret == ARGON2_OK); + + printf("PASS\n"); +} + +int main() { + int ret; + unsigned char out[OUT_LEN]; + char const *msg; + int version; + + version = ARGON2_VERSION_10; + printf("Test Argon2i version number: %02x\n", version); + + /* Multiple test cases for various input values */ + hashtest(version, 2, 16, 1, "password", "somesalt", + "f6c4db4a54e2a370627aff3db6176b94a2a209a62c8e36152711802f7b30c694", + "$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ" + "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", Argon2_i); +#ifdef TEST_LARGE_RAM + hashtest(version, 2, 20, 1, "password", "somesalt", + "9690ec55d28d3ed32562f2e73ea62b02b018757643a2ae6e79528459de8106e9", + "$argon2i$m=1048576,t=2,p=1$c29tZXNhbHQ" + "$lpDsVdKNPtMlYvLnPqYrArAYdXZDoq5ueVKEWd6BBuk", Argon2_i); +#endif + hashtest(version, 2, 18, 1, "password", "somesalt", + "3e689aaa3d28a77cf2bc72a51ac53166761751182f1ee292e3f677a7da4c2467", + "$argon2i$m=262144,t=2,p=1$c29tZXNhbHQ" + "$Pmiaqj0op3zyvHKlGsUxZnYXURgvHuKS4/Z3p9pMJGc", Argon2_i); + hashtest(version, 2, 8, 1, "password", "somesalt", + "fd4dd83d762c49bdeaf57c47bdcd0c2f1babf863fdeb490df63ede9975fccf06", + "$argon2i$m=256,t=2,p=1$c29tZXNhbHQ" + "$/U3YPXYsSb3q9XxHvc0MLxur+GP960kN9j7emXX8zwY", Argon2_i); + hashtest(version, 2, 8, 2, "password", "somesalt", + "b6c11560a6a9d61eac706b79a2f97d68b4463aa3ad87e00c07e2b01e90c564fb", + "$argon2i$m=256,t=2,p=2$c29tZXNhbHQ" + "$tsEVYKap1h6scGt5ovl9aLRGOqOth+AMB+KwHpDFZPs", Argon2_i); + hashtest(version, 1, 16, 1, "password", "somesalt", + "81630552b8f3b1f48cdb1992c4c678643d490b2b5eb4ff6c4b3438b5621724b2", + "$argon2i$m=65536,t=1,p=1$c29tZXNhbHQ" + "$gWMFUrjzsfSM2xmSxMZ4ZD1JCytetP9sSzQ4tWIXJLI", Argon2_i); + hashtest(version, 4, 16, 1, "password", "somesalt", + "f212f01615e6eb5d74734dc3ef40ade2d51d052468d8c69440a3a1f2c1c2847b", + "$argon2i$m=65536,t=4,p=1$c29tZXNhbHQ" + "$8hLwFhXm6110c03D70Ct4tUdBSRo2MaUQKOh8sHChHs", Argon2_i); + hashtest(version, 2, 16, 1, "differentpassword", "somesalt", + "e9c902074b6754531a3a0be519e5baf404b30ce69b3f01ac3bf21229960109a3", + "$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ" + "$6ckCB0tnVFMaOgvlGeW69ASzDOabPwGsO/ISKZYBCaM", Argon2_i); + hashtest(version, 2, 16, 1, "password", "diffsalt", + "79a103b90fe8aef8570cb31fc8b22259778916f8336b7bdac3892569d4f1c497", + "$argon2i$m=65536,t=2,p=1$ZGlmZnNhbHQ" + "$eaEDuQ/orvhXDLMfyLIiWXeJFvgza3vaw4kladTxxJc", Argon2_i); + + /* Error state tests */ + + /* Handle an invalid encoding correctly (it is missing a $) */ + ret = argon2_verify("$argon2i$m=65536,t=2,p=1c29tZXNhbHQ" + "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_DECODING_FAIL); + printf("Recognise an invalid encoding: PASS\n"); + + /* Handle an invalid encoding correctly (it is missing a $) */ + ret = argon2_verify("$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ" + "9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_DECODING_FAIL); + printf("Recognise an invalid encoding: PASS\n"); + + /* Handle an invalid encoding correctly (salt is too short) */ + ret = argon2_verify("$argon2i$m=65536,t=2,p=1$" + "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_SALT_TOO_SHORT); + printf("Recognise an invalid salt in encoding: PASS\n"); + + /* Handle an mismatching hash (the encoded password is "passwore") */ + ret = argon2_verify("$argon2i$m=65536,t=2,p=1$c29tZXNhbHQ" + "$b2G3seW+uPzerwQQC+/E1K50CLLO7YXy0JRcaTuswRo", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_VERIFY_MISMATCH); + printf("Verify with mismatched password: PASS\n"); + + msg = argon2_error_message(ARGON2_DECODING_FAIL); + assert(strcmp(msg, "Decoding failed") == 0); + printf("Decode an error message: PASS\n"); + + printf("\n"); + + version = ARGON2_VERSION_NUMBER; + printf("Test Argon2i version number: %02x\n", version); + + /* Multiple test cases for various input values */ + hashtest(version, 2, 16, 1, "password", "somesalt", + "c1628832147d9720c5bd1cfd61367078729f6dfb6f8fea9ff98158e0d7816ed0", + "$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "$wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA", Argon2_i); +#ifdef TEST_LARGE_RAM + hashtest(version, 2, 20, 1, "password", "somesalt", + "d1587aca0922c3b5d6a83edab31bee3c4ebaef342ed6127a55d19b2351ad1f41", + "$argon2i$v=19$m=1048576,t=2,p=1$c29tZXNhbHQ" + "$0Vh6ygkiw7XWqD7asxvuPE667zQu1hJ6VdGbI1GtH0E", Argon2_i); +#endif + hashtest(version, 2, 18, 1, "password", "somesalt", + "296dbae80b807cdceaad44ae741b506f14db0959267b183b118f9b24229bc7cb", + "$argon2i$v=19$m=262144,t=2,p=1$c29tZXNhbHQ" + "$KW266AuAfNzqrUSudBtQbxTbCVkmexg7EY+bJCKbx8s", Argon2_i); + hashtest(version, 2, 8, 1, "password", "somesalt", + "89e9029f4637b295beb027056a7336c414fadd43f6b208645281cb214a56452f", + "$argon2i$v=19$m=256,t=2,p=1$c29tZXNhbHQ" + "$iekCn0Y3spW+sCcFanM2xBT63UP2sghkUoHLIUpWRS8", Argon2_i); + hashtest(version, 2, 8, 2, "password", "somesalt", + "4ff5ce2769a1d7f4c8a491df09d41a9fbe90e5eb02155a13e4c01e20cd4eab61", + "$argon2i$v=19$m=256,t=2,p=2$c29tZXNhbHQ" + "$T/XOJ2mh1/TIpJHfCdQan76Q5esCFVoT5MAeIM1Oq2E", Argon2_i); + hashtest(version, 1, 16, 1, "password", "somesalt", + "d168075c4d985e13ebeae560cf8b94c3b5d8a16c51916b6f4ac2da3ac11bbecf", + "$argon2i$v=19$m=65536,t=1,p=1$c29tZXNhbHQ" + "$0WgHXE2YXhPr6uVgz4uUw7XYoWxRkWtvSsLaOsEbvs8", Argon2_i); + hashtest(version, 4, 16, 1, "password", "somesalt", + "aaa953d58af3706ce3df1aefd4a64a84e31d7f54175231f1285259f88174ce5b", + "$argon2i$v=19$m=65536,t=4,p=1$c29tZXNhbHQ" + "$qqlT1YrzcGzj3xrv1KZKhOMdf1QXUjHxKFJZ+IF0zls", Argon2_i); + hashtest(version, 2, 16, 1, "differentpassword", "somesalt", + "14ae8da01afea8700c2358dcef7c5358d9021282bd88663a4562f59fb74d22ee", + "$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "$FK6NoBr+qHAMI1jc73xTWNkCEoK9iGY6RWL1n7dNIu4", Argon2_i); + hashtest(version, 2, 16, 1, "password", "diffsalt", + "b0357cccfbef91f3860b0dba447b2348cbefecadaf990abfe9cc40726c521271", + "$argon2i$v=19$m=65536,t=2,p=1$ZGlmZnNhbHQ" + "$sDV8zPvvkfOGCw26RHsjSMvv7K2vmQq/6cxAcmxSEnE", Argon2_i); + + + /* Error state tests */ + + /* Handle an invalid encoding correctly (it is missing a $) */ + ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1c29tZXNhbHQ" + "$wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_DECODING_FAIL); + printf("Recognise an invalid encoding: PASS\n"); + + /* Handle an invalid encoding correctly (it is missing a $) */ + ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "wWKIMhR9lyDFvRz9YTZweHKfbftvj+qf+YFY4NeBbtA", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_DECODING_FAIL); + printf("Recognise an invalid encoding: PASS\n"); + + /* Handle an invalid encoding correctly (salt is too short) */ + ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$" + "$9sTbSlTio3Biev89thdrlKKiCaYsjjYVJxGAL3swxpQ", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_SALT_TOO_SHORT); + printf("Recognise an invalid salt in encoding: PASS\n"); + + /* Handle an mismatching hash (the encoded password is "passwore") */ + ret = argon2_verify("$argon2i$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "$8iIuixkI73Js3G1uMbezQXD0b8LG4SXGsOwoQkdAQIM", + "password", strlen("password"), Argon2_i); + assert(ret == ARGON2_VERIFY_MISMATCH); + printf("Verify with mismatched password: PASS\n"); + + msg = argon2_error_message(ARGON2_DECODING_FAIL); + assert(strcmp(msg, "Decoding failed") == 0); + printf("Decode an error message: PASS\n\n"); + + printf("Test Argon2id version number: %02x\n", version); + + /* Multiple test cases for various input values */ + hashtest(version, 2, 16, 1, "password", "somesalt", + "09316115d5cf24ed5a15a31a3ba326e5cf32edc24702987c02b6566f61913cf7", + "$argon2id$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "$CTFhFdXPJO1aFaMaO6Mm5c8y7cJHAph8ArZWb2GRPPc", Argon2_id); + hashtest(version, 2, 18, 1, "password", "somesalt", + "78fe1ec91fb3aa5657d72e710854e4c3d9b9198c742f9616c2f085bed95b2e8c", + "$argon2id$v=19$m=262144,t=2,p=1$c29tZXNhbHQ" + "$eP4eyR+zqlZX1y5xCFTkw9m5GYx0L5YWwvCFvtlbLow", Argon2_id); + hashtest(version, 2, 8, 1, "password", "somesalt", + "9dfeb910e80bad0311fee20f9c0e2b12c17987b4cac90c2ef54d5b3021c68bfe", + "$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" + "$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4", Argon2_id); + hashtest(version, 2, 8, 2, "password", "somesalt", + "6d093c501fd5999645e0ea3bf620d7b8be7fd2db59c20d9fff9539da2bf57037", + "$argon2id$v=19$m=256,t=2,p=2$c29tZXNhbHQ" + "$bQk8UB/VmZZF4Oo79iDXuL5/0ttZwg2f/5U52iv1cDc", Argon2_id); + hashtest(version, 1, 16, 1, "password", "somesalt", + "f6a5adc1ba723dddef9b5ac1d464e180fcd9dffc9d1cbf76cca2fed795d9ca98", + "$argon2id$v=19$m=65536,t=1,p=1$c29tZXNhbHQ" + "$9qWtwbpyPd3vm1rB1GThgPzZ3/ydHL92zKL+15XZypg", Argon2_id); + hashtest(version, 4, 16, 1, "password", "somesalt", + "9025d48e68ef7395cca9079da4c4ec3affb3c8911fe4f86d1a2520856f63172c", + "$argon2id$v=19$m=65536,t=4,p=1$c29tZXNhbHQ" + "$kCXUjmjvc5XMqQedpMTsOv+zyJEf5PhtGiUghW9jFyw", Argon2_id); + hashtest(version, 2, 16, 1, "differentpassword", "somesalt", + "0b84d652cf6b0c4beaef0dfe278ba6a80df6696281d7e0d2891b817d8c458fde", + "$argon2id$v=19$m=65536,t=2,p=1$c29tZXNhbHQ" + "$C4TWUs9rDEvq7w3+J4umqA32aWKB1+DSiRuBfYxFj94", Argon2_id); + hashtest(version, 2, 16, 1, "password", "diffsalt", + "bdf32b05ccc42eb15d58fd19b1f856b113da1e9a5874fdcc544308565aa8141c", + "$argon2id$v=19$m=65536,t=2,p=1$ZGlmZnNhbHQ" + "$vfMrBczELrFdWP0ZsfhWsRPaHppYdP3MVEMIVlqoFBw", Argon2_id); + + /* Common error state tests */ + + printf("\n"); + printf("Common error state tests\n"); + + ret = argon2_hash(2, 1, 1, "password", strlen("password"), + "diffsalt", strlen("diffsalt"), + out, OUT_LEN, NULL, 0, Argon2_id, version); + assert(ret == ARGON2_MEMORY_TOO_LITTLE); + printf("Fail on invalid memory: PASS\n"); + + ret = argon2_hash(2, 1 << 12, 1, NULL, strlen("password"), + "diffsalt", strlen("diffsalt"), + out, OUT_LEN, NULL, 0, Argon2_id, version); + assert(ret == ARGON2_PWD_PTR_MISMATCH); + printf("Fail on invalid null pointer: PASS\n"); + + ret = argon2_hash(2, 1 << 12, 1, "password", strlen("password"), "s", 1, + out, OUT_LEN, NULL, 0, Argon2_id, version); + assert(ret == ARGON2_SALT_TOO_SHORT); + printf("Fail on salt too short: PASS\n"); + + return 0; +} diff --git a/deps/phc-winner-argon2-20190702/src/thread.c b/deps/phc-winner-argon2-20190702/src/thread.c new file mode 100644 index 000000000..e099a00d2 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/thread.c @@ -0,0 +1,57 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#if !defined(ARGON2_NO_THREADS) + +#include "thread.h" +#if defined(_WIN32) +#include +#endif + +int argon2_thread_create(argon2_thread_handle_t *handle, + argon2_thread_func_t func, void *args) { + if (NULL == handle || func == NULL) { + return -1; + } +#if defined(_WIN32) + *handle = _beginthreadex(NULL, 0, func, args, 0, NULL); + return *handle != 0 ? 0 : -1; +#else + return pthread_create(handle, NULL, func, args); +#endif +} + +int argon2_thread_join(argon2_thread_handle_t handle) { +#if defined(_WIN32) + if (WaitForSingleObject((HANDLE)handle, INFINITE) == WAIT_OBJECT_0) { + return CloseHandle((HANDLE)handle) != 0 ? 0 : -1; + } + return -1; +#else + return pthread_join(handle, NULL); +#endif +} + +void argon2_thread_exit(void) { +#if defined(_WIN32) + _endthreadex(0); +#else + pthread_exit(NULL); +#endif +} + +#endif /* ARGON2_NO_THREADS */ diff --git a/deps/phc-winner-argon2-20190702/src/thread.h b/deps/phc-winner-argon2-20190702/src/thread.h new file mode 100644 index 000000000..49d88367b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/src/thread.h @@ -0,0 +1,67 @@ +/* + * Argon2 reference source code package - reference C implementations + * + * Copyright 2015 + * Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves + * + * You may use this work under the terms of a Creative Commons CC0 1.0 + * License/Waiver or the Apache Public License 2.0, at your option. The terms of + * these licenses can be found at: + * + * - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 + * - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 + * + * You should have received a copy of both of these licenses along with this + * software. If not, they may be obtained at the above URLs. + */ + +#ifndef ARGON2_THREAD_H +#define ARGON2_THREAD_H + +#if !defined(ARGON2_NO_THREADS) + +/* + Here we implement an abstraction layer for the simpĺe requirements + of the Argon2 code. We only require 3 primitives---thread creation, + joining, and termination---so full emulation of the pthreads API + is unwarranted. Currently we wrap pthreads and Win32 threads. + + The API defines 2 types: the function pointer type, + argon2_thread_func_t, + and the type of the thread handle---argon2_thread_handle_t. +*/ +#if defined(_WIN32) +#include +typedef unsigned(__stdcall *argon2_thread_func_t)(void *); +typedef uintptr_t argon2_thread_handle_t; +#else +#include +typedef void *(*argon2_thread_func_t)(void *); +typedef pthread_t argon2_thread_handle_t; +#endif + +/* Creates a thread + * @param handle pointer to a thread handle, which is the output of this + * function. Must not be NULL. + * @param func A function pointer for the thread's entry point. Must not be + * NULL. + * @param args Pointer that is passed as an argument to @func. May be NULL. + * @return 0 if @handle and @func are valid pointers and a thread is successfully + * created. + */ +int argon2_thread_create(argon2_thread_handle_t *handle, + argon2_thread_func_t func, void *args); + +/* Waits for a thread to terminate + * @param handle Handle to a thread created with argon2_thread_create. + * @return 0 if @handle is a valid handle, and joining completed successfully. +*/ +int argon2_thread_join(argon2_thread_handle_t handle); + +/* Terminate the current thread. Must be run inside a thread created by + * argon2_thread_create. +*/ +void argon2_thread_exit(void); + +#endif /* ARGON2_NO_THREADS */ +#endif diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj new file mode 100644 index 000000000..357b4bd2b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj @@ -0,0 +1,231 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {CAA75C57-998C-494E-B8A5-5894EF0FC528} + Argon2Opt + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters new file mode 100644 index 000000000..536602bde --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj new file mode 100644 index 000000000..e5ba5b3a8 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj @@ -0,0 +1,231 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {B3A0FB44-0C1C-4EC3-B155-8B39371F8EE4} + Argon2OptBench + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters new file mode 100644 index 000000000..0cc0d957b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj new file mode 100644 index 000000000..71eb33d06 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj @@ -0,0 +1,230 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {3A898DD8-ACAE-4269-ADFE-EB7260D71583} + Argon2OptDll + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters new file mode 100644 index 000000000..c7a778817 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj new file mode 100644 index 000000000..44c97d157 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj @@ -0,0 +1,244 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {DBBAAAE6-4560-4D11-8280-30A6650A82EF} + Argon2OptGenKAT + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters new file mode 100644 index 000000000..ff8595575 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters @@ -0,0 +1,72 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj new file mode 100644 index 000000000..43cab0a1e --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj @@ -0,0 +1,235 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {12956597-5E42-433A-93F3-D4EFF50AA207} + Argon2 + 8.1 + Argon2OptTestCI + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters new file mode 100644 index 000000000..bcd4dabc4 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj new file mode 100644 index 000000000..a25cd2322 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj @@ -0,0 +1,243 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {B9CAC9CE-9F0D-4F52-8D67-FDBBAFCD0DE2} + Argon2Ref + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ProgramDatabase + + + true + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ProgramDatabase + + + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ProgramDatabase + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + ProgramDatabase + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ProgramDatabase + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + ProgramDatabase + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters new file mode 100644 index 000000000..379cf2e49 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj new file mode 100644 index 000000000..0106eb71d --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj @@ -0,0 +1,231 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {99203F6A-6E8C-42FC-8C7C-C07E8913D539} + Argon2RefBench + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters new file mode 100644 index 000000000..222279aa5 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj new file mode 100644 index 000000000..623aaaccc --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj @@ -0,0 +1,230 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {19D911A1-533C-4475-B313-F372481A35D4} + Argon2RefDll + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + DynamicLibrary + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters new file mode 100644 index 000000000..ad43f914b --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj new file mode 100644 index 000000000..f59143958 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj @@ -0,0 +1,232 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {71921B4C-A795-4A37-95A3-99D600E01211} + Argon2RefGenKAT + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + $(SolutionDir)include;$(IncludePath) + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;GENKAT;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters new file mode 100644 index 000000000..8490c8a9a --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters @@ -0,0 +1,72 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj new file mode 100644 index 000000000..9e9fa0809 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj @@ -0,0 +1,231 @@ + + + + + Debug + Win32 + + + ReleaseStatic + Win32 + + + ReleaseStatic + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {8A1F7F84-34AF-4DB2-9D58-D4823DFE79E9} + Argon2RefTestCI + 8.1 + + + + + v100 + + + $(DefaultPlatformToolset) + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + $(SolutionDir)include;$(IncludePath) + $(SolutionDir)vs2015\build\ + $(SolutionDir)vs2015\build\$(ProjectName)\ + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters new file mode 100644 index 000000000..32bca82c5 --- /dev/null +++ b/deps/phc-winner-argon2-20190702/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;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 + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/deps/scrypt-jane-master/README.md b/deps/scrypt-jane-master/README.md new file mode 100644 index 000000000..9585a0ca3 --- /dev/null +++ b/deps/scrypt-jane-master/README.md @@ -0,0 +1,163 @@ +This project provides a performant, flexible implementations of Colin Percival's [scrypt](http://www.tarsnap.com/scrypt.html). + +# Features + +## Modular Design + +The code uses a modular (compile, not runtime) layout to allow new mixing & hash functions to be added easily. The base components (HMAC, PBKDF2, and scrypt) are static and will immediately work with any conforming mix or hash function. + +## Supported Mix Functions + +* [Salsa20/8](http://cr.yp.to/salsa20.html) +* [ChaCha20/8](http://cr.yp.to/chacha.html) +* [Salsa6420/8]() + +I am not actually aware of any other candidates for a decent mix function. Salsa20/8 was nearly perfect, but its successor, ChaCha20/8, has better diffusion and is thus stronger, is potentially faster given advanced SIMD support (byte level shuffles, or a 32bit rotate), and is slightly cleaner to implement given that it requires no pre/post processing of data for SIMD implementations. + +64-byte blocks are no longer assumed! Salsa6420/8 is a 'proof of concept' 64-bit version of Salsa20/8 with a 128 byte block, and rotation constants chosen to allow 32-bit word shuffles instead of rotations for two of the rotations which put it on par with ChaCha in terms of SSE implementation shortcuts. + +## Supported Hash Functions + +* SHA256/512 +* [BLAKE256/512](https://www.131002.net/blake/) +* [Skein512](http://www.skein-hash.info/) +* [Keccak256/512](http://keccak.noekeon.org/) (SHA-3) + +Hash function implementations, unlike mix functions, are not optimized. The PBKDF2 computations are relatively minor in the scrypt algorithm, so including CPU specific versions, or vastly unrolling loops, would serve little purpose while bloating the code, both source and binary, and making it more confusing to implement correctly. + +Most (now only two!) of the SHA-3 candidates fall in to the "annoying to read/implement" category and have not been included yet. This will of course be moot once ~~BLAKE is chosen as SHA-3~~ Keccak is chosen as SHA-3. Well shit. + +## CPU Adaptation + +The mixing function specialization is selected at runtime based on what the CPU supports (well, x86/x86-64 for now, but theoretically any). On platforms where this is not needed, e.g. where packages are usually compiled from source, it can also select the most suitable implementation at compile time, cutting down on binary size. + +For those who are familiar with the scrypt spec, the code specializes at the ROMix level, allowing all copy, and xor calls to be inlined efficiently. ***Update***: This is actually not as important as I switched from specializing at the mix() level and letting the compiler somewhat inefficiently inline block_copy and block_xor to specializing at ChunkMix(), where they can be inlined properly. I thought about specializing at ROMix(), but it would increase the complexity per mix function even more and would not present many more opportunities than what is generated by the compiler presently. + +MSVC uses SSE intrinsics as opposed to inline assembly for the mix functions to allow the compiler to fully inline properly. Also, Visual Studio is not smart enough to allow inline assembly in 64-bit code. + +## Self Testing + +On first use, scrypt() runs a small series of tests to make sure the hash function, mix functions, and scrypt() itself, are generating correct results. It will exit() (or call a user defined fatal error function) should any of these tests fail. + +Test vectors for individual mix and hash functions are generated from reference implementations. The only "official" test vectors for the full scrypt() are for SHA256 + Salsa20/8 of course; other combinations are generated from this code (once it works with all reference test vectors) and subject to change if any implementation errors are discovered. + +# Performance (on an E5200 2.5GHZ) + +Benchmarks are run _without_ allocating memory, i.e. allocating enough memory before the trials are run. Different allocators can have different costs and non-deterministic effects, which is not the point of comparing implementations. The only hash function compared will be SHA-256 to be comparable to Colin's reference implementation, and the hash function will generally be a fraction of a percent of noise in the overall result. + +Three different scrypt settings are tested (the last two are from the scrypt paper): + +* 'High Volume': N=4096, r=8, p=1, 4mb memory +* 'Interactive': N=16384, r=8, p=1, 16mb memory +* 'Non-Interactive': N=1048576, r=8, p=1, 1gb memory + +__Note__: Benchmark settings are adjusted based on the underlying block size to keep memory usage consistent with default scrypt. This means Salsa64 has r=4 due to having a 128 byte block size. A 256 byte block size would have r=2, 512 byte block would have r=1, etc. Additionally, this means Salsa6420/8 is doing half the rounds/byte of default scrypt, but has 64 bit word mixing vs 32 bit, and thus does somewhat less overall mixing. Salsa6420/~10-12 would be needed to maintain equivalent overall mixing. + +Cycle counts are in millions of cycles. All versions compiled with gcc 4.6.3, -O3. Sorted from fastest to slowest. + +Scaling refers to how much more expensive 'Non-Interactive' is to compute than 'High Volume', normalized to "ideal" scaling (256x difficulty). Under 100% means it becomes easier to process as N grows, over 100% means it becomes more difficult to process as N grows. + + + + + + + + + + + + + + + + + +
ImplemenationAlgoHigh VolumeInteractiveNon-InteractiveScaling
scrypt-jane SSSE3 64bitSalsa6420/8 18.2m 75.6m5120.0m110.0%
scrypt-jane SSSE3 64bitChaCha20/8 19.6m 79.6m5296.7m105.6%
scrypt-jane SSSE3 32bitChaCha20/8 19.8m 80.3m5346.1m105.5%
scrypt-jane SSE2 64bit Salsa6420/8 19.8m 82.1m5529.2m109.1%
scrypt-jane SSE2 64bit Salsa20/8 22.1m 89.7m5938.8m105.0%
scrypt-jane SSE2 32bit Salsa20/8 22.3m 90.6m6011.0m105.3%
scrypt-jane SSE2 64bit ChaCha20/8 23.9m 96.8m6399.7m104.6%
scrypt-jane SSE2 32bit ChaCha20/8 24.2m 98.3m6500.7m104.9%
*Reference SSE2 64bit* Salsa20/8 32.9m135.2m8881.6m105.5%
*Reference SSE2 32bit* Salsa20/8 33.0m134.4m8885.2m105.2%
+ +* scrypt-jane Salsa6420/8-SSSE3 is ~1.80x faster than reference Salsa20/8-SSE2 for High Volume, but drops to 1.73x faster for 'Non-Interactive' instead of remaining constant +* scrypt-jane ChaCha20/8-SSSE3 is ~1.67x faster than reference Salsa20/8-SSE2 +* scrypt-jane Salsa20/8-SSE2 is ~1.48x faster than reference Salsa20/8-SSE2 + +# Performance (on a slightly noisy E3-1270 3.4GHZ) + +All versions compiled with gcc 4.4.7, -O3. Sorted from fastest to slowest. + + + + + + + + + + + + + + + + + + + + + + +
ImplemenationAlgoHigh VolumeInteractiveNon-InteractiveScaling
scrypt-jane AVX 64bit Salsa6420/8 11.8m 52.5m3848.6m127.4%
scrypt-jane SSSE3 64bit Salsa6420/8 13.3m 57.9m4176.6m122.7%
scrypt-jane SSE2 64bit Salsa6420/8 14.2m 61.1m4382.4m120.6%
scrypt-jane AVX 64bit ChaCha20/8 18.0m 77.4m5396.8m117.1%
scrypt-jane AVX 32bit ChaCha20/8 18.3m 82.1m5421.8m115.7%
scrypt-jane SSSE3 64bit ChaCha20/8 19.0m 81.3m5600.7m115.1%
scrypt-jane AVX 64bit Salsa20/8 19.0m 81.2m5610.6m115.3%
scrypt-jane AVX 32bit Salsa20/8 19.0m 81.3m5621.6m115.6%
scrypt-jane SSSE3 32bit ChaCha20/8 19.1m 81.8m5621.6m115.0%
scrypt-jane SSE2 64bit Salsa20/8 19.5m 83.8m5772.9m115.6%
scrypt-jane SSE2 32bit Salsa20/8 19.6m 84.0m5793.9m115.5%
*Reference SSE2/AVX 64bit* Salsa20/8 21.5m 90.4m6147.1m111.7%
*Reference SSE2/AVX 32bit* Salsa20/8 22.3m 94.0m6267.7m110.0%
scrypt-jane SSE2 64bit ChaCha20/8 23.1m 97.7m6670.0m112.8%
scrypt-jane SSE2 32bit ChaCha20/8 23.3m 98.4m6728.7m112.8%
*Reference SSE2 64bit* Salsa20/8 30.4m125.6m8139.4m104.6%
*Reference SSE2 32bit* Salsa20/8 30.0m124.5m8469.3m110.3%
+ +* scrypt-jane Salsa6420/8-AVX is 1.60x - 1.82x faster than reference Salsa20/8-SSE2/AVX +* scrypt-jane ChaCha20/8-AVX is 1.13x - 1.19x faster than reference Salsa20/8-SSE2/AVX +* scrypt-jane Salsa20/8-AVX is 1.09x - 1.13x faster than reference Salsa20/8-SSE2/AVX + + +# Building + + [gcc,icc,clang] scrypt-jane.c -O3 -[m32,m64] -DSCRYPT_MIX -DSCRYPT_HASH -c + +where SCRYPT_MIX is one of + +* SCRYPT_SALSA +* SCRYPT_SALSA64 (no optimized 32-bit implementation) +* SCRYPT_CHACHA + +and SCRYPT_HASH is one of + +* SCRYPT_SHA256 +* SCRYPT_SHA512 +* SCRYPT_BLAKE256 +* SCRYPT_BLAKE512 +* SCRYPT_SKEIN512 +* SCRYPT_KECCAK256 +* SCRYPT_KECCAK512 + +e.g. + + gcc scrypt-jane.c -O3 -DSCRYPT_CHACHA -DSCRYPT_BLAKE512 -c + gcc example.c scrypt-jane.o -o example + +clang *may* need "-no-integrated-as" as some? versions don't support ".intel_syntax" + +# Using + + #include "scrypt-jane.h" + + scrypt(password, password_len, salt, salt_len, Nfactor, pfactor, rfactor, out, want_bytes); + +## scrypt parameters + +* Nfactor: Increases CPU & Memory Hardness +* rfactor: Increases Memory Hardness +* pfactor: Increases CPU Hardness + +In scrypt terms + +* N = (1 << (Nfactor + 1)), which controls how many times to mix each chunk, and how many temporary chunks are used. Increasing N increases both CPU time and memory used. +* r = (1 << rfactor), which controls how many blocks are in a chunk (i.e., 2 * r blocks are in a chunk). Increasing r increases how much memory is used. +* p = (1 << pfactor), which controls how many passes to perform over the set of N chunks. Increasing p increases CPU time used. + +I chose to use the log2 of each parameter as it is the common way to communicate settings (e.g. 2^20, not 1048576). + +# License + +Public Domain, or MIT \ No newline at end of file diff --git a/deps/scrypt-jane-master/_hashcat/macos.patch b/deps/scrypt-jane-master/_hashcat/macos.patch new file mode 100644 index 000000000..6966a7b5f --- /dev/null +++ b/deps/scrypt-jane-master/_hashcat/macos.patch @@ -0,0 +1,87 @@ +diff --git a/code/scrypt-jane-portable-x86.h b/code/scrypt-jane-portable-x86.h +index 396a7bd..e7858cd 100644 +--- a/code/scrypt-jane-portable-x86.h ++++ b/code/scrypt-jane-portable-x86.h +@@ -459,4 +459,11 @@ get_top_cpuflag_desc(size_t flag) { + #endif + #endif + +-#endif /* defined(CPU_X86) || defined(CPU_X86_64) */ +\ No newline at end of file ++#else ++ ++static size_t ++detect_cpu(void) { ++ return 0; ++} ++ ++#endif /* defined(CPU_X86) || defined(CPU_X86_64) */ +diff --git a/code/scrypt-jane-portable.h b/code/scrypt-jane-portable.h +index e83e314..26690ed 100644 +--- a/code/scrypt-jane-portable.h ++++ b/code/scrypt-jane-portable.h +@@ -92,7 +92,7 @@ + #define STDCALL __stdcall + #undef NAKED + #define NAKED __declspec(naked) +- #define ALIGN(n) __declspec(align(n)) ++ #define JANE_ALIGN(n) __declspec(align(n)) + #endif + #if defined(__ICC) + #define COMPILER_INTEL +@@ -136,7 +136,7 @@ + #define CDECL __attribute__((cdecl)) + #undef STDCALL + #define STDCALL __attribute__((stdcall)) +- #define ALIGN(n) __attribute__((aligned(n))) ++ #define JANE_ALIGN(n) __attribute__((aligned(n))) + #include + #endif + #if defined(__MINGW32__) || defined(__MINGW64__) +diff --git a/code/scrypt-jane-romix-basic.h b/code/scrypt-jane-romix-basic.h +index 57ba649..ddae500 100644 +--- a/code/scrypt-jane-romix-basic.h ++++ b/code/scrypt-jane-romix-basic.h +@@ -35,9 +35,9 @@ scrypt_test_mix_instance(chunkmixfn mixfn, blockfixfn prefn, blockfixfn postfn, + /* r = 2, (2 * r) = 4 blocks in a chunk, 4 * SCRYPT_BLOCK_WORDS total */ + const uint32_t r = 2, blocks = 2 * r, words = blocks * SCRYPT_BLOCK_WORDS; + #if (defined(X86ASM_AVX2) || defined(X86_64ASM_AVX2) || defined(X86_INTRINSIC_AVX2)) +- scrypt_mix_word_t ALIGN(32) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; ++ scrypt_mix_word_t JANE_ALIGN(32) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; + #else +- scrypt_mix_word_t ALIGN(16) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; ++ scrypt_mix_word_t JANE_ALIGN(16) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; + #endif + uint8_t final[16]; + size_t i; +diff --git a/code/scrypt-jane-romix-template.h b/code/scrypt-jane-romix-template.h +index 6bbda62..77c0114 100644 +--- a/code/scrypt-jane-romix-template.h ++++ b/code/scrypt-jane-romix-template.h +@@ -20,9 +20,9 @@ + static void asm_calling_convention + SCRYPT_CHUNKMIX_FN(scrypt_mix_word_t *Bout/*[chunkWords]*/, scrypt_mix_word_t *Bin/*[chunkWords]*/, scrypt_mix_word_t *Bxor/*[chunkWords]*/, uint32_t r) { + #if (defined(X86ASM_AVX2) || defined(X86_64ASM_AVX2) || defined(X86_INTRINSIC_AVX2)) +- scrypt_mix_word_t ALIGN(32) X[SCRYPT_BLOCK_WORDS], *block; ++ scrypt_mix_word_t JANE_ALIGN(32) X[SCRYPT_BLOCK_WORDS], *block; + #else +- scrypt_mix_word_t ALIGN(16) X[SCRYPT_BLOCK_WORDS], *block; ++ scrypt_mix_word_t JANE_ALIGN(16) X[SCRYPT_BLOCK_WORDS], *block; + #endif + uint32_t i, j, blocksPerChunk = r * 2, half = 0; + +diff --git a/test.sh b/test.sh +old mode 100644 +new mode 100755 +index dc3d032..13be9eb +--- a/test.sh ++++ b/test.sh +@@ -2,7 +2,7 @@ + + test() { + sleep 0.25 # mingw is stupid and will occasionally not have permission to overwrite scrypt_test +- gcc scrypt-jane-test.c -O3 -DSCRYPT_$1 -DSCRYPT_$2 $3 -o scrypt_test 2>/dev/null ++ gcc scrypt-jane-test.c -O3 -DSCRYPT_$1 -DSCRYPT_$2 $3 -o scrypt_test #2>/dev/null + local RC=$? + if [ $RC -ne 0 ]; then + echo "$1/$2: failed to compile " diff --git a/deps/scrypt-jane-master/code/scrypt-conf.h b/deps/scrypt-jane-master/code/scrypt-conf.h new file mode 100644 index 000000000..46685a518 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-conf.h @@ -0,0 +1,28 @@ +/* + pick the best algo at runtime or compile time? + ---------------------------------------------- + SCRYPT_CHOOSE_COMPILETIME (gcc only!) + SCRYPT_CHOOSE_RUNTIME +*/ +#define SCRYPT_CHOOSE_RUNTIME + + +/* + hash function to use + ------------------------------- + SCRYPT_BLAKE256 + SCRYPT_BLAKE512 + SCRYPT_SHA256 + SCRYPT_SHA512 + SCRYPT_SKEIN512 +*/ +//#define SCRYPT_SHA256 + + +/* + block mixer to use + ----------------------------- + SCRYPT_CHACHA + SCRYPT_SALSA +*/ +//#define SCRYPT_SALSA diff --git a/deps/scrypt-jane-master/code/scrypt-jane-chacha.h b/deps/scrypt-jane-master/code/scrypt-jane-chacha.h new file mode 100644 index 000000000..54234576e --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-chacha.h @@ -0,0 +1,162 @@ +#define SCRYPT_MIX_BASE "ChaCha20/8" + +typedef uint32_t scrypt_mix_word_t; + +#define SCRYPT_WORDTO8_LE U32TO8_LE +#define SCRYPT_WORD_ENDIAN_SWAP U32_SWAP + +#define SCRYPT_BLOCK_BYTES 64 +#define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t)) + +/* must have these here in case block bytes is ever != 64 */ +#include "scrypt-jane-romix-basic.h" + +#include "scrypt-jane-mix_chacha-xop.h" +#include "scrypt-jane-mix_chacha-avx.h" +#include "scrypt-jane-mix_chacha-ssse3.h" +#include "scrypt-jane-mix_chacha-sse2.h" +#include "scrypt-jane-mix_chacha.h" + +#if defined(SCRYPT_CHACHA_XOP) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_xop + #define SCRYPT_ROMIX_FN scrypt_ROMix_xop + #define SCRYPT_MIX_FN chacha_core_xop + #define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop + #define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_CHACHA_AVX) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx + #define SCRYPT_ROMIX_FN scrypt_ROMix_avx + #define SCRYPT_MIX_FN chacha_core_avx + #define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop + #define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_CHACHA_SSSE3) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_ssse3 + #define SCRYPT_ROMIX_FN scrypt_ROMix_ssse3 + #define SCRYPT_MIX_FN chacha_core_ssse3 + #define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop + #define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_CHACHA_SSE2) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_sse2 + #define SCRYPT_ROMIX_FN scrypt_ROMix_sse2 + #define SCRYPT_MIX_FN chacha_core_sse2 + #define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_nop + #define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_nop + #include "scrypt-jane-romix-template.h" +#endif + +/* cpu agnostic */ +#define SCRYPT_ROMIX_FN scrypt_ROMix_basic +#define SCRYPT_MIX_FN chacha_core_basic +#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_convert_endian +#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_convert_endian +#include "scrypt-jane-romix-template.h" + +#if !defined(SCRYPT_CHOOSE_COMPILETIME) +static scrypt_ROMixfn +scrypt_getROMix(void) { + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_CHACHA_XOP) + if (cpuflags & cpu_xop) + return scrypt_ROMix_xop; + else +#endif + +#if defined(SCRYPT_CHACHA_AVX) + if (cpuflags & cpu_avx) + return scrypt_ROMix_avx; + else +#endif + +#if defined(SCRYPT_CHACHA_SSSE3) + if (cpuflags & cpu_ssse3) + return scrypt_ROMix_ssse3; + else +#endif + +#if defined(SCRYPT_CHACHA_SSE2) + if (cpuflags & cpu_sse2) + return scrypt_ROMix_sse2; + else +#endif + + return scrypt_ROMix_basic; +} +#endif + + +#if defined(SCRYPT_TEST_SPEED) +static size_t +available_implementations(void) { + size_t cpuflags = detect_cpu(); + size_t flags = 0; + +#if defined(SCRYPT_CHACHA_XOP) + if (cpuflags & cpu_xop) + flags |= cpu_xop; +#endif + +#if defined(SCRYPT_CHACHA_AVX) + if (cpuflags & cpu_avx) + flags |= cpu_avx; +#endif + +#if defined(SCRYPT_CHACHA_SSSE3) + if (cpuflags & cpu_ssse3) + flags |= cpu_ssse3; +#endif + +#if defined(SCRYPT_CHACHA_SSE2) + if (cpuflags & cpu_sse2) + flags |= cpu_sse2; +#endif + + return flags; +} +#endif + +static int +scrypt_test_mix(void) { + static const uint8_t expected[16] = { + 0x48,0x2b,0x2d,0xb8,0xa1,0x33,0x22,0x73,0xcd,0x16,0xc4,0xb4,0xb0,0x7f,0xb1,0x8a, + }; + + int ret = 1; + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_CHACHA_XOP) + if (cpuflags & cpu_xop) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_xop, scrypt_romix_nop, scrypt_romix_nop, expected); +#endif + +#if defined(SCRYPT_CHACHA_AVX) + if (cpuflags & cpu_avx) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx, scrypt_romix_nop, scrypt_romix_nop, expected); +#endif + +#if defined(SCRYPT_CHACHA_SSSE3) + if (cpuflags & cpu_ssse3) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_ssse3, scrypt_romix_nop, scrypt_romix_nop, expected); +#endif + +#if defined(SCRYPT_CHACHA_SSE2) + if (cpuflags & cpu_sse2) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_sse2, scrypt_romix_nop, scrypt_romix_nop, expected); +#endif + +#if defined(SCRYPT_CHACHA_BASIC) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_basic, scrypt_romix_convert_endian, scrypt_romix_convert_endian, expected); +#endif + + return ret; +} + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash.h b/deps/scrypt-jane-master/code/scrypt-jane-hash.h new file mode 100644 index 000000000..e72781485 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash.h @@ -0,0 +1,48 @@ +#if defined(SCRYPT_BLAKE512) +#include "scrypt-jane-hash_blake512.h" +#elif defined(SCRYPT_BLAKE256) +#include "scrypt-jane-hash_blake256.h" +#elif defined(SCRYPT_SHA512) +#include "scrypt-jane-hash_sha512.h" +#elif defined(SCRYPT_SHA256) +#include "scrypt-jane-hash_sha256.h" +#elif defined(SCRYPT_SKEIN512) +#include "scrypt-jane-hash_skein512.h" +#elif defined(SCRYPT_KECCAK512) || defined(SCRYPT_KECCAK256) +#include "scrypt-jane-hash_keccak.h" +#else + #define SCRYPT_HASH "ERROR" + #define SCRYPT_HASH_BLOCK_SIZE 64 + #define SCRYPT_HASH_DIGEST_SIZE 64 + typedef struct scrypt_hash_state_t { size_t dummy; } scrypt_hash_state; + typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + static void scrypt_hash_init(scrypt_hash_state *S) {} + static void scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) {} + static void scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) {} + static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = {0}; + #error must define a hash function! +#endif + +#include "scrypt-jane-pbkdf2.h" + +#define SCRYPT_TEST_HASH_LEN 257 /* (2 * largest block size) + 1 */ + +static int +scrypt_test_hash(void) { + scrypt_hash_state st; + scrypt_hash_digest hash, final; + uint8_t msg[SCRYPT_TEST_HASH_LEN]; + size_t i; + + for (i = 0; i < SCRYPT_TEST_HASH_LEN; i++) + msg[i] = (uint8_t)i; + + scrypt_hash_init(&st); + for (i = 0; i < SCRYPT_TEST_HASH_LEN + 1; i++) { + scrypt_hash(hash, msg, i); + scrypt_hash_update(&st, hash, sizeof(hash)); + } + scrypt_hash_finish(&st, final); + return scrypt_verify(final, scrypt_test_hash_expected, SCRYPT_HASH_DIGEST_SIZE); +} + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_blake256.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_blake256.h new file mode 100644 index 000000000..4690b1144 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_blake256.h @@ -0,0 +1,177 @@ +#define SCRYPT_HASH "BLAKE-256" +#define SCRYPT_HASH_BLOCK_SIZE 64 +#define SCRYPT_HASH_DIGEST_SIZE 32 + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +const uint8_t blake256_sigma[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, + 14,10, 4, 8, 9,15,13, 6, 1,12, 0, 2,11, 7, 5, 3, + 11, 8,12, 0, 5, 2,15,13,10,14, 3, 6, 7, 1, 9, 4, + 7, 9, 3, 1,13,12,11,14, 2, 6, 5,10, 4, 0,15, 8, + 9, 0, 5, 7, 2, 4,10,15,14, 1,11,12, 6, 8, 3,13, + 2,12, 6,10, 0,11, 8, 3, 4,13, 7, 5,15,14, 1, 9, + 12, 5, 1,15,14,13, 4,10, 0, 7, 6, 3, 9, 2, 8,11, + 13,11, 7,14,12, 1, 3, 9, 5, 0,15, 4, 8, 6, 2,10, + 6,15,14, 9,11, 3, 0, 8,12, 2,13, 7, 1, 4,10, 5, + 10, 2, 8, 4, 7, 6, 1, 5,15,11, 9,14, 3,12,13 ,0, +}; + +const uint32_t blake256_constants[16] = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917 +}; + +typedef struct scrypt_hash_state_t { + uint32_t H[8], T[2]; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +static void +blake256_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) { + const uint8_t *sigma, *sigma_end = blake256_sigma + (10 * 16); + uint32_t m[16], v[16], h[8], t[2]; + uint32_t i; + + for (i = 0; i < 8; i++) h[i] = S->H[i]; + for (i = 0; i < 2; i++) t[i] = S->T[i]; + + while (blocks--) { + t[0] += 512; + t[1] += (t[0] < 512) ? 1 : 0; + + for (i = 0; i < 8; i++) v[i ] = h[i]; + for (i = 0; i < 4; i++) v[i + 8] = blake256_constants[i]; + for (i = 0; i < 2; i++) v[i + 12] = blake256_constants[i+4] ^ t[0]; + for (i = 0; i < 2; i++) v[i + 14] = blake256_constants[i+6] ^ t[1]; + + for (i = 0; i < 16; i++) m[i] = U8TO32_BE(&in[i * 4]); + in += 64; + + #define G(a,b,c,d,e) \ + v[a] += (m[sigma[e+0]] ^ blake256_constants[sigma[e+1]]) + v[b]; \ + v[d] = ROTR32(v[d] ^ v[a],16); \ + v[c] += v[d]; \ + v[b] = ROTR32(v[b] ^ v[c],12); \ + v[a] += (m[sigma[e+1]] ^ blake256_constants[sigma[e+0]]) + v[b]; \ + v[d] = ROTR32(v[d] ^ v[a], 8); \ + v[c] += v[d]; \ + v[b] = ROTR32(v[b] ^ v[c], 7); + + for (i = 0, sigma = blake256_sigma; i < 14; i++) { + G(0, 4, 8,12, 0); + G(1, 5, 9,13, 2); + G(2, 6,10,14, 4); + G(3, 7,11,15, 6); + + G(0, 5,10,15, 8); + G(1, 6,11,12,10); + G(2, 7, 8,13,12); + G(3, 4, 9,14,14); + + sigma += 16; + if (sigma == sigma_end) + sigma = blake256_sigma; + } + + #undef G + + for (i = 0; i < 8; i++) h[i] ^= (v[i] ^ v[i + 8]); + } + + for (i = 0; i < 8; i++) S->H[i] = h[i]; + for (i = 0; i < 2; i++) S->T[i] = t[i]; +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + S->H[0] = 0x6a09e667ULL; + S->H[1] = 0xbb67ae85ULL; + S->H[2] = 0x3c6ef372ULL; + S->H[3] = 0xa54ff53aULL; + S->H[4] = 0x510e527fULL; + S->H[5] = 0x9b05688cULL; + S->H[6] = 0x1f83d9abULL; + S->H[7] = 0x5be0cd19ULL; + S->T[0] = 0; + S->T[1] = 0; + S->leftover = 0; +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < SCRYPT_HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + blake256_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + blake256_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + uint32_t th, tl, bits; + + bits = (S->leftover << 3); + tl = S->T[0] + bits; + th = S->T[1]; + if (S->leftover == 0) { + S->T[0] = (uint32_t)0 - (uint32_t)512; + S->T[1] = (uint32_t)0 - (uint32_t)1; + } else if (S->T[0] == 0) { + S->T[0] = ((uint32_t)0 - (uint32_t)512) + bits; + S->T[1] = S->T[1] - 1; + } else { + S->T[0] -= (512 - bits); + } + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 55) { + memset(S->buffer + S->leftover + 1, 0, 55 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 63 - S->leftover); + blake256_blocks(S, S->buffer, 1); + S->T[0] = (uint32_t)0 - (uint32_t)512; + S->T[1] = (uint32_t)0 - (uint32_t)1; + memset(S->buffer, 0, 56); + } + S->buffer[55] |= 1; + U32TO8_BE(S->buffer + 56, th); + U32TO8_BE(S->buffer + 60, tl); + blake256_blocks(S, S->buffer, 1); + + U32TO8_BE(&hash[ 0], S->H[0]); + U32TO8_BE(&hash[ 4], S->H[1]); + U32TO8_BE(&hash[ 8], S->H[2]); + U32TO8_BE(&hash[12], S->H[3]); + U32TO8_BE(&hash[16], S->H[4]); + U32TO8_BE(&hash[20], S->H[5]); + U32TO8_BE(&hash[24], S->H[6]); + U32TO8_BE(&hash[28], S->H[7]); +} + +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0xcc,0xa9,0x1e,0xa9,0x20,0x97,0x37,0x40,0x17,0xc0,0xa0,0x52,0x87,0xfc,0x08,0x20, + 0x40,0xf5,0x81,0x86,0x62,0x75,0x78,0xb2,0x79,0xce,0xde,0x27,0x3c,0x7f,0x85,0xd8, +}; diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_blake512.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_blake512.h new file mode 100644 index 000000000..ea2a583de --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_blake512.h @@ -0,0 +1,181 @@ +#define SCRYPT_HASH "BLAKE-512" +#define SCRYPT_HASH_BLOCK_SIZE 128 +#define SCRYPT_HASH_DIGEST_SIZE 64 + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +const uint8_t blake512_sigma[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, + 14,10, 4, 8, 9,15,13, 6, 1,12, 0, 2,11, 7, 5, 3, + 11, 8,12, 0, 5, 2,15,13,10,14, 3, 6, 7, 1, 9, 4, + 7, 9, 3, 1,13,12,11,14, 2, 6, 5,10, 4, 0,15, 8, + 9, 0, 5, 7, 2, 4,10,15,14, 1,11,12, 6, 8, 3,13, + 2,12, 6,10, 0,11, 8, 3, 4,13, 7, 5,15,14, 1, 9, + 12, 5, 1,15,14,13, 4,10, 0, 7, 6, 3, 9, 2, 8,11, + 13,11, 7,14,12, 1, 3, 9, 5, 0,15, 4, 8, 6, 2,10, + 6,15,14, 9,11, 3, 0, 8,12, 2,13, 7, 1, 4,10, 5, + 10, 2, 8, 4, 7, 6, 1, 5,15,11, 9,14, 3,12,13 ,0, +}; + +const uint64_t blake512_constants[16] = { + 0x243f6a8885a308d3ULL, 0x13198a2e03707344ULL, 0xa4093822299f31d0ULL, 0x082efa98ec4e6c89ULL, + 0x452821e638d01377ULL, 0xbe5466cf34e90c6cULL, 0xc0ac29b7c97c50ddULL, 0x3f84d5b5b5470917ULL, + 0x9216d5d98979fb1bULL, 0xd1310ba698dfb5acULL, 0x2ffd72dbd01adfb7ULL, 0xb8e1afed6a267e96ULL, + 0xba7c9045f12c7f99ULL, 0x24a19947b3916cf7ULL, 0x0801f2e2858efc16ULL, 0x636920d871574e69ULL +}; + +typedef struct scrypt_hash_state_t { + uint64_t H[8], T[2]; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +static void +blake512_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) { + const uint8_t *sigma, *sigma_end = blake512_sigma + (10 * 16); + uint64_t m[16], v[16], h[8], t[2]; + uint32_t i; + + for (i = 0; i < 8; i++) h[i] = S->H[i]; + for (i = 0; i < 2; i++) t[i] = S->T[i]; + + while (blocks--) { + t[0] += 1024; + t[1] += (t[0] < 1024) ? 1 : 0; + + for (i = 0; i < 8; i++) v[i ] = h[i]; + for (i = 0; i < 4; i++) v[i + 8] = blake512_constants[i]; + for (i = 0; i < 2; i++) v[i + 12] = blake512_constants[i+4] ^ t[0]; + for (i = 0; i < 2; i++) v[i + 14] = blake512_constants[i+6] ^ t[1]; + + for (i = 0; i < 16; i++) m[i] = U8TO64_BE(&in[i * 8]); + in += 128; + + #define G(a,b,c,d,e) \ + v[a] += (m[sigma[e+0]] ^ blake512_constants[sigma[e+1]]) + v[b]; \ + v[d] = ROTR64(v[d] ^ v[a],32); \ + v[c] += v[d]; \ + v[b] = ROTR64(v[b] ^ v[c],25); \ + v[a] += (m[sigma[e+1]] ^ blake512_constants[sigma[e+0]]) + v[b]; \ + v[d] = ROTR64(v[d] ^ v[a],16); \ + v[c] += v[d]; \ + v[b] = ROTR64(v[b] ^ v[c],11); + + for (i = 0, sigma = blake512_sigma; i < 16; i++) { + G(0, 4, 8,12, 0); + G(1, 5, 9,13, 2); + G(2, 6,10,14, 4); + G(3, 7,11,15, 6); + G(0, 5,10,15, 8); + G(1, 6,11,12,10); + G(2, 7, 8,13,12); + G(3, 4, 9,14,14); + + sigma += 16; + if (sigma == sigma_end) + sigma = blake512_sigma; + } + + #undef G + + for (i = 0; i < 8; i++) h[i] ^= (v[i] ^ v[i + 8]); + } + + for (i = 0; i < 8; i++) S->H[i] = h[i]; + for (i = 0; i < 2; i++) S->T[i] = t[i]; +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + S->H[0] = 0x6a09e667f3bcc908ULL; + S->H[1] = 0xbb67ae8584caa73bULL; + S->H[2] = 0x3c6ef372fe94f82bULL; + S->H[3] = 0xa54ff53a5f1d36f1ULL; + S->H[4] = 0x510e527fade682d1ULL; + S->H[5] = 0x9b05688c2b3e6c1fULL; + S->H[6] = 0x1f83d9abfb41bd6bULL; + S->H[7] = 0x5be0cd19137e2179ULL; + S->T[0] = 0; + S->T[1] = 0; + S->leftover = 0; +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < SCRYPT_HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + blake512_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + blake512_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + uint64_t th, tl; + size_t bits; + + bits = (S->leftover << 3); + tl = S->T[0] + bits; + th = S->T[1]; + if (S->leftover == 0) { + S->T[0] = (uint64_t)0 - (uint64_t)1024; + S->T[1] = (uint64_t)0 - (uint64_t)1; + } else if (S->T[0] == 0) { + S->T[0] = ((uint64_t)0 - (uint64_t)1024) + bits; + S->T[1] = S->T[1] - 1; + } else { + S->T[0] -= (1024 - bits); + } + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 111) { + memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); + blake512_blocks(S, S->buffer, 1); + S->T[0] = (uint64_t)0 - (uint64_t)1024; + S->T[1] = (uint64_t)0 - (uint64_t)1; + memset(S->buffer, 0, 112); + } + S->buffer[111] |= 1; + U64TO8_BE(S->buffer + 112, th); + U64TO8_BE(S->buffer + 120, tl); + blake512_blocks(S, S->buffer, 1); + + U64TO8_BE(&hash[ 0], S->H[0]); + U64TO8_BE(&hash[ 8], S->H[1]); + U64TO8_BE(&hash[16], S->H[2]); + U64TO8_BE(&hash[24], S->H[3]); + U64TO8_BE(&hash[32], S->H[4]); + U64TO8_BE(&hash[40], S->H[5]); + U64TO8_BE(&hash[48], S->H[6]); + U64TO8_BE(&hash[56], S->H[7]); +} + +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0x2f,0x9d,0x5b,0xbe,0x24,0x0d,0x63,0xd3,0xa0,0xac,0x4f,0xd3,0x01,0xc0,0x23,0x6f, + 0x6d,0xdf,0x6e,0xfb,0x60,0x6f,0xa0,0x74,0xdf,0x9f,0x25,0x65,0xb6,0x11,0x0a,0x83, + 0x23,0x96,0xba,0x91,0x68,0x4b,0x85,0x15,0x13,0x54,0xba,0x19,0xf3,0x2c,0x5a,0x4a, + 0x1f,0x78,0x31,0x02,0xc9,0x1e,0x56,0xc4,0x54,0xca,0xf9,0x8f,0x2c,0x7f,0x85,0xac +}; diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_keccak.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_keccak.h new file mode 100644 index 000000000..7ed55747a --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_keccak.h @@ -0,0 +1,168 @@ +#if defined(SCRYPT_KECCAK256) + #define SCRYPT_HASH "Keccak-256" + #define SCRYPT_HASH_DIGEST_SIZE 32 +#else + #define SCRYPT_HASH "Keccak-512" + #define SCRYPT_HASH_DIGEST_SIZE 64 +#endif +#define SCRYPT_KECCAK_F 1600 +#define SCRYPT_KECCAK_C (SCRYPT_HASH_DIGEST_SIZE * 8 * 2) /* 256=512, 512=1024 */ +#define SCRYPT_KECCAK_R (SCRYPT_KECCAK_F - SCRYPT_KECCAK_C) /* 256=1088, 512=576 */ +#define SCRYPT_HASH_BLOCK_SIZE (SCRYPT_KECCAK_R / 8) + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +typedef struct scrypt_hash_state_t { + uint64_t state[SCRYPT_KECCAK_F / 64]; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +static const uint64_t keccak_round_constants[24] = { + 0x0000000000000001ull, 0x0000000000008082ull, + 0x800000000000808aull, 0x8000000080008000ull, + 0x000000000000808bull, 0x0000000080000001ull, + 0x8000000080008081ull, 0x8000000000008009ull, + 0x000000000000008aull, 0x0000000000000088ull, + 0x0000000080008009ull, 0x000000008000000aull, + 0x000000008000808bull, 0x800000000000008bull, + 0x8000000000008089ull, 0x8000000000008003ull, + 0x8000000000008002ull, 0x8000000000000080ull, + 0x000000000000800aull, 0x800000008000000aull, + 0x8000000080008081ull, 0x8000000000008080ull, + 0x0000000080000001ull, 0x8000000080008008ull +}; + +static void +keccak_block(scrypt_hash_state *S, const uint8_t *in) { + size_t i; + uint64_t *s = S->state, t[5], u[5], v, w; + + /* absorb input */ + for (i = 0; i < SCRYPT_HASH_BLOCK_SIZE / 8; i++, in += 8) + s[i] ^= U8TO64_LE(in); + + for (i = 0; i < 24; i++) { + /* theta: c = a[0,i] ^ a[1,i] ^ .. a[4,i] */ + t[0] = s[0] ^ s[5] ^ s[10] ^ s[15] ^ s[20]; + t[1] = s[1] ^ s[6] ^ s[11] ^ s[16] ^ s[21]; + t[2] = s[2] ^ s[7] ^ s[12] ^ s[17] ^ s[22]; + t[3] = s[3] ^ s[8] ^ s[13] ^ s[18] ^ s[23]; + t[4] = s[4] ^ s[9] ^ s[14] ^ s[19] ^ s[24]; + + /* theta: d[i] = c[i+4] ^ rotl(c[i+1],1) */ + u[0] = t[4] ^ ROTL64(t[1], 1); + u[1] = t[0] ^ ROTL64(t[2], 1); + u[2] = t[1] ^ ROTL64(t[3], 1); + u[3] = t[2] ^ ROTL64(t[4], 1); + u[4] = t[3] ^ ROTL64(t[0], 1); + + /* theta: a[0,i], a[1,i], .. a[4,i] ^= d[i] */ + s[0] ^= u[0]; s[5] ^= u[0]; s[10] ^= u[0]; s[15] ^= u[0]; s[20] ^= u[0]; + s[1] ^= u[1]; s[6] ^= u[1]; s[11] ^= u[1]; s[16] ^= u[1]; s[21] ^= u[1]; + s[2] ^= u[2]; s[7] ^= u[2]; s[12] ^= u[2]; s[17] ^= u[2]; s[22] ^= u[2]; + s[3] ^= u[3]; s[8] ^= u[3]; s[13] ^= u[3]; s[18] ^= u[3]; s[23] ^= u[3]; + s[4] ^= u[4]; s[9] ^= u[4]; s[14] ^= u[4]; s[19] ^= u[4]; s[24] ^= u[4]; + + /* rho pi: b[..] = rotl(a[..], ..) */ + v = s[ 1]; + s[ 1] = ROTL64(s[ 6], 44); + s[ 6] = ROTL64(s[ 9], 20); + s[ 9] = ROTL64(s[22], 61); + s[22] = ROTL64(s[14], 39); + s[14] = ROTL64(s[20], 18); + s[20] = ROTL64(s[ 2], 62); + s[ 2] = ROTL64(s[12], 43); + s[12] = ROTL64(s[13], 25); + s[13] = ROTL64(s[19], 8); + s[19] = ROTL64(s[23], 56); + s[23] = ROTL64(s[15], 41); + s[15] = ROTL64(s[ 4], 27); + s[ 4] = ROTL64(s[24], 14); + s[24] = ROTL64(s[21], 2); + s[21] = ROTL64(s[ 8], 55); + s[ 8] = ROTL64(s[16], 45); + s[16] = ROTL64(s[ 5], 36); + s[ 5] = ROTL64(s[ 3], 28); + s[ 3] = ROTL64(s[18], 21); + s[18] = ROTL64(s[17], 15); + s[17] = ROTL64(s[11], 10); + s[11] = ROTL64(s[ 7], 6); + s[ 7] = ROTL64(s[10], 3); + s[10] = ROTL64( v, 1); + + /* chi: a[i,j] ^= ~b[i,j+1] & b[i,j+2] */ + v = s[ 0]; w = s[ 1]; s[ 0] ^= (~w) & s[ 2]; s[ 1] ^= (~s[ 2]) & s[ 3]; s[ 2] ^= (~s[ 3]) & s[ 4]; s[ 3] ^= (~s[ 4]) & v; s[ 4] ^= (~v) & w; + v = s[ 5]; w = s[ 6]; s[ 5] ^= (~w) & s[ 7]; s[ 6] ^= (~s[ 7]) & s[ 8]; s[ 7] ^= (~s[ 8]) & s[ 9]; s[ 8] ^= (~s[ 9]) & v; s[ 9] ^= (~v) & w; + v = s[10]; w = s[11]; s[10] ^= (~w) & s[12]; s[11] ^= (~s[12]) & s[13]; s[12] ^= (~s[13]) & s[14]; s[13] ^= (~s[14]) & v; s[14] ^= (~v) & w; + v = s[15]; w = s[16]; s[15] ^= (~w) & s[17]; s[16] ^= (~s[17]) & s[18]; s[17] ^= (~s[18]) & s[19]; s[18] ^= (~s[19]) & v; s[19] ^= (~v) & w; + v = s[20]; w = s[21]; s[20] ^= (~w) & s[22]; s[21] ^= (~s[22]) & s[23]; s[22] ^= (~s[23]) & s[24]; s[23] ^= (~s[24]) & v; s[24] ^= (~v) & w; + + /* iota: a[0,0] ^= round constant */ + s[0] ^= keccak_round_constants[i]; + } +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + memset(S, 0, sizeof(*S)); +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t want; + + /* handle the previous data */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < SCRYPT_HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + keccak_block(S, S->buffer); + } + + /* handle the current data */ + while (inlen >= SCRYPT_HASH_BLOCK_SIZE) { + keccak_block(S, in); + in += SCRYPT_HASH_BLOCK_SIZE; + inlen -= SCRYPT_HASH_BLOCK_SIZE; + } + + /* handle leftover data */ + S->leftover = (uint32_t)inlen; + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + size_t i; + + S->buffer[S->leftover] = 0x01; + memset(S->buffer + (S->leftover + 1), 0, SCRYPT_HASH_BLOCK_SIZE - (S->leftover + 1)); + S->buffer[SCRYPT_HASH_BLOCK_SIZE - 1] |= 0x80; + keccak_block(S, S->buffer); + + for (i = 0; i < SCRYPT_HASH_DIGEST_SIZE; i += 8) { + U64TO8_LE(&hash[i], S->state[i / 8]); + } +} + +#if defined(SCRYPT_KECCAK256) +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0x26,0xb7,0x10,0xb3,0x66,0xb1,0xd1,0xb1,0x25,0xfc,0x3e,0xe3,0x1e,0x33,0x1d,0x19, + 0x94,0xaa,0x63,0x7a,0xd5,0x77,0x29,0xb4,0x27,0xe9,0xe0,0xf4,0x19,0xba,0x68,0xea, +}; +#else +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0x17,0xc7,0x8c,0xa0,0xd9,0x08,0x1d,0xba,0x8a,0xc8,0x3e,0x07,0x90,0xda,0x91,0x88, + 0x25,0xbd,0xd3,0xf8,0x78,0x4a,0x8d,0x5e,0xe4,0x96,0x9c,0x01,0xf3,0xeb,0xdc,0x12, + 0xea,0x35,0x57,0xba,0x94,0xb8,0xe9,0xb9,0x27,0x45,0x0a,0x48,0x5c,0x3d,0x69,0xf0, + 0xdb,0x22,0x38,0xb5,0x52,0x22,0x29,0xea,0x7a,0xb2,0xe6,0x07,0xaa,0x37,0x4d,0xe6, +}; +#endif + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_sha256.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_sha256.h new file mode 100644 index 000000000..d06d3e1bb --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_sha256.h @@ -0,0 +1,135 @@ +#define SCRYPT_HASH "SHA-2-256" +#define SCRYPT_HASH_BLOCK_SIZE 64 +#define SCRYPT_HASH_DIGEST_SIZE 32 + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +typedef struct scrypt_hash_state_t { + uint32_t H[8]; + uint64_t T; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +static const uint32_t sha256_constants[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S0(x) (ROTR32(x, 2) ^ ROTR32(x, 13) ^ ROTR32(x, 22)) +#define S1(x) (ROTR32(x, 6) ^ ROTR32(x, 11) ^ ROTR32(x, 25)) +#define G0(x) (ROTR32(x, 7) ^ ROTR32(x, 18) ^ (x >> 3)) +#define G1(x) (ROTR32(x, 17) ^ ROTR32(x, 19) ^ (x >> 10)) +#define W0(in,i) (U8TO32_BE(&in[i * 4])) +#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) +#define STEP(i) \ + t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ + t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha256_constants[i] + w[i]; \ + r[7] = r[6]; \ + r[6] = r[5]; \ + r[5] = r[4]; \ + r[4] = r[3] + t0; \ + r[3] = r[2]; \ + r[2] = r[1]; \ + r[1] = r[0]; \ + r[0] = t0 + t1; + +static void +sha256_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) { + uint32_t r[8], w[64], t0, t1; + size_t i; + + for (i = 0; i < 8; i++) r[i] = S->H[i]; + + while (blocks--) { + for (i = 0; i < 16; i++) { w[i] = W0(in, i); } + for (i = 16; i < 64; i++) { w[i] = W1(i); } + for (i = 0; i < 64; i++) { STEP(i); } + for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } + S->T += SCRYPT_HASH_BLOCK_SIZE * 8; + in += SCRYPT_HASH_BLOCK_SIZE; + } +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + S->H[0] = 0x6a09e667; + S->H[1] = 0xbb67ae85; + S->H[2] = 0x3c6ef372; + S->H[3] = 0xa54ff53a; + S->H[4] = 0x510e527f; + S->H[5] = 0x9b05688c; + S->H[6] = 0x1f83d9ab; + S->H[7] = 0x5be0cd19; + S->T = 0; + S->leftover = 0; +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < SCRYPT_HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + sha256_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + sha256_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + uint64_t t = S->T + (S->leftover * 8); + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 55) { + memset(S->buffer + S->leftover + 1, 0, 55 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 63 - S->leftover); + sha256_blocks(S, S->buffer, 1); + memset(S->buffer, 0, 56); + } + + U64TO8_BE(S->buffer + 56, t); + sha256_blocks(S, S->buffer, 1); + + U32TO8_BE(&hash[ 0], S->H[0]); + U32TO8_BE(&hash[ 4], S->H[1]); + U32TO8_BE(&hash[ 8], S->H[2]); + U32TO8_BE(&hash[12], S->H[3]); + U32TO8_BE(&hash[16], S->H[4]); + U32TO8_BE(&hash[20], S->H[5]); + U32TO8_BE(&hash[24], S->H[6]); + U32TO8_BE(&hash[28], S->H[7]); +} + +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0xee,0x36,0xae,0xa6,0x65,0xf0,0x28,0x7d,0xc9,0xde,0xd8,0xad,0x48,0x33,0x7d,0xbf, + 0xcb,0xc0,0x48,0xfa,0x5f,0x92,0xfd,0x0a,0x95,0x6f,0x34,0x8e,0x8c,0x1e,0x73,0xad, +}; diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_sha512.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_sha512.h new file mode 100644 index 000000000..3e3997d00 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_sha512.h @@ -0,0 +1,152 @@ +#define SCRYPT_HASH "SHA-2-512" +#define SCRYPT_HASH_BLOCK_SIZE 128 +#define SCRYPT_HASH_DIGEST_SIZE 64 + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +typedef struct scrypt_hash_state_t { + uint64_t H[8]; + uint64_t T[2]; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +static const uint64_t sha512_constants[80] = { + 0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, + 0x3956c25bf348b538ull, 0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, + 0xd807aa98a3030242ull, 0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, + 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull, 0xc19bf174cf692694ull, + 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, + 0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, + 0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, + 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull, 0x06ca6351e003826full, 0x142929670a0e6e70ull, + 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull, + 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull, + 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, + 0xd192e819d6ef5218ull, 0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, + 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, + 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, + 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull, + 0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, + 0xca273eceea26619cull, 0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, + 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull, + 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull, 0x431d67c49c100d4cull, + 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull +}; + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S0(x) (ROTR64(x, 28) ^ ROTR64(x, 34) ^ ROTR64(x, 39)) +#define S1(x) (ROTR64(x, 14) ^ ROTR64(x, 18) ^ ROTR64(x, 41)) +#define G0(x) (ROTR64(x, 1) ^ ROTR64(x, 8) ^ (x >> 7)) +#define G1(x) (ROTR64(x, 19) ^ ROTR64(x, 61) ^ (x >> 6)) +#define W0(in,i) (U8TO64_BE(&in[i * 8])) +#define W1(i) (G1(w[i - 2]) + w[i - 7] + G0(w[i - 15]) + w[i - 16]) +#define STEP(i) \ + t1 = S0(r[0]) + Maj(r[0], r[1], r[2]); \ + t0 = r[7] + S1(r[4]) + Ch(r[4], r[5], r[6]) + sha512_constants[i] + w[i]; \ + r[7] = r[6]; \ + r[6] = r[5]; \ + r[5] = r[4]; \ + r[4] = r[3] + t0; \ + r[3] = r[2]; \ + r[2] = r[1]; \ + r[1] = r[0]; \ + r[0] = t0 + t1; + +static void +sha512_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks) { + uint64_t r[8], w[80], t0, t1; + size_t i; + + for (i = 0; i < 8; i++) r[i] = S->H[i]; + + while (blocks--) { + for (i = 0; i < 16; i++) { w[i] = W0(in, i); } + for (i = 16; i < 80; i++) { w[i] = W1(i); } + for (i = 0; i < 80; i++) { STEP(i); } + for (i = 0; i < 8; i++) { r[i] += S->H[i]; S->H[i] = r[i]; } + S->T[0] += SCRYPT_HASH_BLOCK_SIZE * 8; + S->T[1] += (!S->T[0]) ? 1 : 0; + in += SCRYPT_HASH_BLOCK_SIZE; + } +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + S->H[0] = 0x6a09e667f3bcc908ull; + S->H[1] = 0xbb67ae8584caa73bull; + S->H[2] = 0x3c6ef372fe94f82bull; + S->H[3] = 0xa54ff53a5f1d36f1ull; + S->H[4] = 0x510e527fade682d1ull; + S->H[5] = 0x9b05688c2b3e6c1full; + S->H[6] = 0x1f83d9abfb41bd6bull; + S->H[7] = 0x5be0cd19137e2179ull; + S->T[0] = 0; + S->T[1] = 0; + S->leftover = 0; +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* handle the previous data */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + want = (want < inlen) ? want : inlen; + memcpy(S->buffer + S->leftover, in, want); + S->leftover += (uint32_t)want; + if (S->leftover < SCRYPT_HASH_BLOCK_SIZE) + return; + in += want; + inlen -= want; + sha512_blocks(S, S->buffer, 1); + } + + /* handle the current data */ + blocks = (inlen & ~(SCRYPT_HASH_BLOCK_SIZE - 1)); + S->leftover = (uint32_t)(inlen - blocks); + if (blocks) { + sha512_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE); + in += blocks; + } + + /* handle leftover data */ + if (S->leftover) + memcpy(S->buffer, in, S->leftover); +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + uint64_t t0 = S->T[0] + (S->leftover * 8), t1 = S->T[1]; + + S->buffer[S->leftover] = 0x80; + if (S->leftover <= 111) { + memset(S->buffer + S->leftover + 1, 0, 111 - S->leftover); + } else { + memset(S->buffer + S->leftover + 1, 0, 127 - S->leftover); + sha512_blocks(S, S->buffer, 1); + memset(S->buffer, 0, 112); + } + + U64TO8_BE(S->buffer + 112, t1); + U64TO8_BE(S->buffer + 120, t0); + sha512_blocks(S, S->buffer, 1); + + U64TO8_BE(&hash[ 0], S->H[0]); + U64TO8_BE(&hash[ 8], S->H[1]); + U64TO8_BE(&hash[16], S->H[2]); + U64TO8_BE(&hash[24], S->H[3]); + U64TO8_BE(&hash[32], S->H[4]); + U64TO8_BE(&hash[40], S->H[5]); + U64TO8_BE(&hash[48], S->H[6]); + U64TO8_BE(&hash[56], S->H[7]); +} + +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0xba,0xc3,0x80,0x2b,0x24,0x56,0x95,0x1f,0x19,0x7c,0xa2,0xd3,0x72,0x7c,0x9a,0x4d, + 0x1d,0x50,0x3a,0xa9,0x12,0x27,0xd8,0xe1,0xbe,0x76,0x53,0x87,0x5a,0x1e,0x82,0xec, + 0xc8,0xe1,0x6b,0x87,0xd0,0xb5,0x25,0x7e,0xe8,0x1e,0xd7,0x58,0xc6,0x2d,0xc2,0x9c, + 0x06,0x31,0x8f,0x5b,0x57,0x8e,0x76,0xba,0xd5,0xf6,0xec,0xfe,0x85,0x1f,0x34,0x0c, +}; diff --git a/deps/scrypt-jane-master/code/scrypt-jane-hash_skein512.h b/deps/scrypt-jane-master/code/scrypt-jane-hash_skein512.h new file mode 100644 index 000000000..736d893de --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-hash_skein512.h @@ -0,0 +1,188 @@ +#define SCRYPT_HASH "Skein-512" +#define SCRYPT_HASH_BLOCK_SIZE 64 +#define SCRYPT_HASH_DIGEST_SIZE 64 + +typedef uint8_t scrypt_hash_digest[SCRYPT_HASH_DIGEST_SIZE]; + +typedef struct scrypt_hash_state_t { + uint64_t X[8], T[2]; + uint32_t leftover; + uint8_t buffer[SCRYPT_HASH_BLOCK_SIZE]; +} scrypt_hash_state; + +#include + +static void +skein512_blocks(scrypt_hash_state *S, const uint8_t *in, size_t blocks, size_t add) { + uint64_t X[8], key[8], Xt[9+18], T[3+1]; + size_t r; + + while (blocks--) { + T[0] = S->T[0] + add; + T[1] = S->T[1]; + T[2] = T[0] ^ T[1]; + key[0] = U8TO64_LE(in + 0); Xt[0] = S->X[0]; X[0] = key[0] + Xt[0]; + key[1] = U8TO64_LE(in + 8); Xt[1] = S->X[1]; X[1] = key[1] + Xt[1]; + key[2] = U8TO64_LE(in + 16); Xt[2] = S->X[2]; X[2] = key[2] + Xt[2]; + key[3] = U8TO64_LE(in + 24); Xt[3] = S->X[3]; X[3] = key[3] + Xt[3]; + key[4] = U8TO64_LE(in + 32); Xt[4] = S->X[4]; X[4] = key[4] + Xt[4]; + key[5] = U8TO64_LE(in + 40); Xt[5] = S->X[5]; X[5] = key[5] + Xt[5] + T[0]; + key[6] = U8TO64_LE(in + 48); Xt[6] = S->X[6]; X[6] = key[6] + Xt[6] + T[1]; + key[7] = U8TO64_LE(in + 56); Xt[7] = S->X[7]; X[7] = key[7] + Xt[7]; + Xt[8] = 0x1BD11BDAA9FC1A22ull ^ Xt[0] ^ Xt[1] ^ Xt[2] ^ Xt[3] ^ Xt[4] ^ Xt[5] ^ Xt[6] ^ Xt[7]; + in += SCRYPT_HASH_BLOCK_SIZE; + + for (r = 0; r < 18; r++) + Xt[r + 9] = Xt[r + 0]; + + for (r = 0; r < 18; r += 2) { + X[0] += X[1]; X[1] = ROTL64(X[1], 46) ^ X[0]; + X[2] += X[3]; X[3] = ROTL64(X[3], 36) ^ X[2]; + X[4] += X[5]; X[5] = ROTL64(X[5], 19) ^ X[4]; + X[6] += X[7]; X[7] = ROTL64(X[7], 37) ^ X[6]; + X[2] += X[1]; X[1] = ROTL64(X[1], 33) ^ X[2]; + X[0] += X[3]; X[3] = ROTL64(X[3], 42) ^ X[0]; + X[6] += X[5]; X[5] = ROTL64(X[5], 14) ^ X[6]; + X[4] += X[7]; X[7] = ROTL64(X[7], 27) ^ X[4]; + X[4] += X[1]; X[1] = ROTL64(X[1], 17) ^ X[4]; + X[6] += X[3]; X[3] = ROTL64(X[3], 49) ^ X[6]; + X[0] += X[5]; X[5] = ROTL64(X[5], 36) ^ X[0]; + X[2] += X[7]; X[7] = ROTL64(X[7], 39) ^ X[2]; + X[6] += X[1]; X[1] = ROTL64(X[1], 44) ^ X[6]; + X[4] += X[3]; X[3] = ROTL64(X[3], 56) ^ X[4]; + X[2] += X[5]; X[5] = ROTL64(X[5], 54) ^ X[2]; + X[0] += X[7]; X[7] = ROTL64(X[7], 9) ^ X[0]; + + X[0] += Xt[r + 1]; + X[1] += Xt[r + 2]; + X[2] += Xt[r + 3]; + X[3] += Xt[r + 4]; + X[4] += Xt[r + 5]; + X[5] += Xt[r + 6] + T[1]; + X[6] += Xt[r + 7] + T[2]; + X[7] += Xt[r + 8] + r + 1; + + T[3] = T[0]; + T[0] = T[1]; + T[1] = T[2]; + T[2] = T[3]; + + X[0] += X[1]; X[1] = ROTL64(X[1], 39) ^ X[0]; + X[2] += X[3]; X[3] = ROTL64(X[3], 30) ^ X[2]; + X[4] += X[5]; X[5] = ROTL64(X[5], 34) ^ X[4]; + X[6] += X[7]; X[7] = ROTL64(X[7], 24) ^ X[6]; + X[2] += X[1]; X[1] = ROTL64(X[1], 13) ^ X[2]; + X[0] += X[3]; X[3] = ROTL64(X[3], 17) ^ X[0]; + X[6] += X[5]; X[5] = ROTL64(X[5], 10) ^ X[6]; + X[4] += X[7]; X[7] = ROTL64(X[7], 50) ^ X[4]; + X[4] += X[1]; X[1] = ROTL64(X[1], 25) ^ X[4]; + X[6] += X[3]; X[3] = ROTL64(X[3], 29) ^ X[6]; + X[0] += X[5]; X[5] = ROTL64(X[5], 39) ^ X[0]; + X[2] += X[7]; X[7] = ROTL64(X[7], 43) ^ X[2]; + X[6] += X[1]; X[1] = ROTL64(X[1], 8) ^ X[6]; + X[4] += X[3]; X[3] = ROTL64(X[3], 22) ^ X[4]; + X[2] += X[5]; X[5] = ROTL64(X[5], 56) ^ X[2]; + X[0] += X[7]; X[7] = ROTL64(X[7], 35) ^ X[0]; + + X[0] += Xt[r + 2]; + X[1] += Xt[r + 3]; + X[2] += Xt[r + 4]; + X[3] += Xt[r + 5]; + X[4] += Xt[r + 6]; + X[5] += Xt[r + 7] + T[1]; + X[6] += Xt[r + 8] + T[2]; + X[7] += Xt[r + 9] + r + 2; + + T[3] = T[0]; + T[0] = T[1]; + T[1] = T[2]; + T[2] = T[3]; + } + + S->X[0] = key[0] ^ X[0]; + S->X[1] = key[1] ^ X[1]; + S->X[2] = key[2] ^ X[2]; + S->X[3] = key[3] ^ X[3]; + S->X[4] = key[4] ^ X[4]; + S->X[5] = key[5] ^ X[5]; + S->X[6] = key[6] ^ X[6]; + S->X[7] = key[7] ^ X[7]; + + S->T[0] = T[0]; + S->T[1] = T[1] & ~0x4000000000000000ull; + } +} + +static void +scrypt_hash_init(scrypt_hash_state *S) { + S->X[0] = 0x4903ADFF749C51CEull; + S->X[1] = 0x0D95DE399746DF03ull; + S->X[2] = 0x8FD1934127C79BCEull; + S->X[3] = 0x9A255629FF352CB1ull; + S->X[4] = 0x5DB62599DF6CA7B0ull; + S->X[5] = 0xEABE394CA9D5C3F4ull; + S->X[6] = 0x991112C71A75B523ull; + S->X[7] = 0xAE18A40B660FCC33ull; + S->T[0] = 0x0000000000000000ull; + S->T[1] = 0x7000000000000000ull; + S->leftover = 0; +} + +static void +scrypt_hash_update(scrypt_hash_state *S, const uint8_t *in, size_t inlen) { + size_t blocks, want; + + /* skein processes the final <=64 bytes raw, so we can only update if there are at least 64+1 bytes available */ + if ((S->leftover + inlen) > SCRYPT_HASH_BLOCK_SIZE) { + /* handle the previous data, we know there is enough for at least one block */ + if (S->leftover) { + want = (SCRYPT_HASH_BLOCK_SIZE - S->leftover); + memcpy(S->buffer + S->leftover, in, want); + in += want; + inlen -= want; + S->leftover = 0; + skein512_blocks(S, S->buffer, 1, SCRYPT_HASH_BLOCK_SIZE); + } + + /* handle the current data if there's more than one block */ + if (inlen > SCRYPT_HASH_BLOCK_SIZE) { + blocks = ((inlen - 1) & ~(SCRYPT_HASH_BLOCK_SIZE - 1)); + skein512_blocks(S, in, blocks / SCRYPT_HASH_BLOCK_SIZE, SCRYPT_HASH_BLOCK_SIZE); + inlen -= blocks; + in += blocks; + } + } + + /* handle leftover data */ + memcpy(S->buffer + S->leftover, in, inlen); + S->leftover += inlen; +} + +static void +scrypt_hash_finish(scrypt_hash_state *S, uint8_t *hash) { + memset(S->buffer + S->leftover, 0, SCRYPT_HASH_BLOCK_SIZE - S->leftover); + S->T[1] |= 0x8000000000000000ull; + skein512_blocks(S, S->buffer, 1, S->leftover); + + memset(S->buffer, 0, SCRYPT_HASH_BLOCK_SIZE); + S->T[0] = 0; + S->T[1] = 0xff00000000000000ull; + skein512_blocks(S, S->buffer, 1, 8); + + U64TO8_LE(&hash[ 0], S->X[0]); + U64TO8_LE(&hash[ 8], S->X[1]); + U64TO8_LE(&hash[16], S->X[2]); + U64TO8_LE(&hash[24], S->X[3]); + U64TO8_LE(&hash[32], S->X[4]); + U64TO8_LE(&hash[40], S->X[5]); + U64TO8_LE(&hash[48], S->X[6]); + U64TO8_LE(&hash[56], S->X[7]); +} + + +static const uint8_t scrypt_test_hash_expected[SCRYPT_HASH_DIGEST_SIZE] = { + 0x4d,0x52,0x29,0xff,0x10,0xbc,0xd2,0x62,0xd1,0x61,0x83,0xc8,0xe6,0xf0,0x83,0xc4, + 0x9f,0xf5,0x6a,0x42,0x75,0x2a,0x26,0x4e,0xf0,0x28,0x72,0x28,0x47,0xe8,0x23,0xdf, + 0x1e,0x64,0xf1,0x51,0x38,0x35,0x9d,0xc2,0x83,0xfc,0x35,0x4e,0xc0,0x52,0x5f,0x41, + 0x6a,0x0b,0x7d,0xf5,0xce,0x98,0xde,0x6f,0x36,0xd8,0x51,0x15,0x78,0x78,0x93,0x67, +}; diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-avx.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-avx.h new file mode 100644 index 000000000..ddd3ee119 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-avx.h @@ -0,0 +1,368 @@ +/* x86 */ +#if defined(X86ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_AVX + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,64) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(mov ebx, 0x01000302) + a2(vmovd xmm4, ebx) + a2(mov ebx, 0x05040706) + a2(vmovd xmm0, ebx) + a2(mov ebx, 0x09080b0a) + a2(vmovd xmm1, ebx) + a2(mov ebx, 0x0d0c0f0e) + a2(vmovd xmm2, ebx) + a2(mov ebx, 0x02010003) + a2(vmovd xmm5, ebx) + a2(mov ebx, 0x06050407) + a2(vmovd xmm3, ebx) + a2(mov ebx, 0x0a09080b) + a2(vmovd xmm6, ebx) + a2(mov ebx, 0x0e0d0c0f) + a2(vmovd xmm7, ebx) + a3(vpunpckldq xmm4, xmm4, xmm0) + a3(vpunpckldq xmm5, xmm5, xmm3) + a3(vpunpckldq xmm1, xmm1, xmm2) + a3(vpunpckldq xmm6, xmm6, xmm7) + a3(vpunpcklqdq xmm4, xmm4, xmm1) + a3(vpunpcklqdq xmm5, xmm5, xmm6) + a2(vmovdqa xmm0,[ecx+esi+0]) + a2(vmovdqa xmm1,[ecx+esi+16]) + a2(vmovdqa xmm2,[ecx+esi+32]) + a2(vmovdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_avx_no_xor1) + a3(vpxor xmm0,xmm0,[ecx+eax+0]) + a3(vpxor xmm1,xmm1,[ecx+eax+16]) + a3(vpxor xmm2,xmm2,[ecx+eax+32]) + a3(vpxor xmm3,xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_avx_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_avx_loop:) + a2(and eax, eax) + a3(vpxor xmm0,xmm0,[esi+ecx+0]) + a3(vpxor xmm1,xmm1,[esi+ecx+16]) + a3(vpxor xmm2,xmm2,[esi+ecx+32]) + a3(vpxor xmm3,xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_avx_no_xor2) + a3(vpxor xmm0,xmm0,[eax+ecx+0]) + a3(vpxor xmm1,xmm1,[eax+ecx+16]) + a3(vpxor xmm2,xmm2,[eax+ecx+32]) + a3(vpxor xmm3,xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_avx_no_xor2:) + a2(vmovdqa [esp+0],xmm0) + a2(vmovdqa [esp+16],xmm1) + a2(vmovdqa [esp+32],xmm2) + a2(vmovdqa [esp+48],xmm3) + a2(mov eax,8) + a1(scrypt_chacha_avx_loop: ) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm4) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpsrld xmm6,xmm1,20) + a3(vpslld xmm1,xmm1,12) + a3(vpxor xmm1,xmm1,xmm6) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm5) + a3(vpshufd xmm0,xmm0,0x93) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm2,xmm2,0x39) + a3(vpsrld xmm6,xmm1,25) + a3(vpslld xmm1,xmm1,7) + a3(vpxor xmm1,xmm1,xmm6) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm4) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpsrld xmm6,xmm1,20) + a3(vpslld xmm1,xmm1,12) + a3(vpxor xmm1,xmm1,xmm6) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm5) + a3(vpshufd xmm0,xmm0,0x39) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm2,xmm2,0x93) + a3(vpsrld xmm6,xmm1,25) + a3(vpslld xmm1,xmm1,7) + a3(vpxor xmm1,xmm1,xmm6) + a2(sub eax,2) + aj(ja scrypt_chacha_avx_loop) + a3(vpaddd xmm0,xmm0,[esp+0]) + a3(vpaddd xmm1,xmm1,[esp+16]) + a3(vpaddd xmm2,xmm2,[esp+32]) + a3(vpaddd xmm3,xmm3,[esp+48]) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(vmovdqa [eax+0],xmm0) + a2(vmovdqa [eax+16],xmm1) + a2(vmovdqa [eax+32],xmm2) + a2(vmovdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_avx_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_avx) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_AVX + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + a2(mov r8, 0x0504070601000302) + a2(mov rax, 0x0d0c0f0e09080b0a) + a2(movd xmm4, r8) + a2(movd xmm6, rax) + a2(mov r8, 0x0605040702010003) + a2(mov rax, 0x0e0d0c0f0a09080b) + a2(movd xmm5, r8) + a2(movd xmm7, rax) + a3(vpunpcklqdq xmm4, xmm4, xmm6) + a3(vpunpcklqdq xmm5, xmm5, xmm7) + aj(jz scrypt_ChunkMix_avx_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a1(scrypt_ChunkMix_avx_no_xor1:) + a2(xor r8,r8) + a2(xor r9,r9) + a1(scrypt_ChunkMix_avx_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_avx_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_avx_no_xor2:) + a2(vmovdqa xmm8,xmm0) + a2(vmovdqa xmm9,xmm1) + a2(vmovdqa xmm10,xmm2) + a2(vmovdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_chacha_avx_loop: ) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm4) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpsrld xmm12,xmm1,20) + a3(vpslld xmm1,xmm1,12) + a3(vpxor xmm1,xmm1,xmm12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm5) + a3(vpshufd xmm0,xmm0,0x93) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm2,xmm2,0x39) + a3(vpsrld xmm12,xmm1,25) + a3(vpslld xmm1,xmm1,7) + a3(vpxor xmm1,xmm1,xmm12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm4) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpsrld xmm12,xmm1,20) + a3(vpslld xmm1,xmm1,12) + a3(vpxor xmm1,xmm1,xmm12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vpshufb xmm3,xmm3,xmm5) + a3(vpshufd xmm0,xmm0,0x39) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm2,xmm2,0x93) + a3(vpsrld xmm12,xmm1,25) + a3(vpslld xmm1,xmm1,7) + a3(vpxor xmm1,xmm1,xmm12) + a2(sub rax,2) + aj(ja scrypt_chacha_avx_loop) + a3(vpaddd xmm0,xmm0,xmm8) + a3(vpaddd xmm1,xmm1,xmm9) + a3(vpaddd xmm2,xmm2,xmm10) + a3(vpaddd xmm3,xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_avx_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_avx) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) + +#define SCRYPT_CHACHA_AVX + +static void asm_calling_convention NOINLINE +scrypt_ChunkMix_avx(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x6,t0,t1,t2,t3; + const xmmi x4 = *(xmmi *)&ssse3_rotl16_32bit, x5 = *(xmmi *)&ssse3_rotl8_32bit; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x4); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x5); + x0 = _mm_shuffle_epi32(x0, 0x93); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x39); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x4); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x5); + x0 = _mm_shuffle_epi32(x0, 0x39); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x93); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25)); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_CHACHA_AVX) + #undef SCRYPT_MIX + #define SCRYPT_MIX "ChaCha/8-AVX" + #undef SCRYPT_CHACHA_INCLUDED + #define SCRYPT_CHACHA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-sse2.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-sse2.h new file mode 100644 index 000000000..a8c2197ac --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-sse2.h @@ -0,0 +1,363 @@ +/* x86 */ +#if defined(X86ASM_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_SSE2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_sse2)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_sse2) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,16) + a2(and esp,~15) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(movdqa xmm0,[ecx+esi+0]) + a2(movdqa xmm1,[ecx+esi+16]) + a2(movdqa xmm2,[ecx+esi+32]) + a2(movdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor1) + a2(pxor xmm0,[ecx+eax+0]) + a2(pxor xmm1,[ecx+eax+16]) + a2(pxor xmm2,[ecx+eax+32]) + a2(pxor xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_sse2_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_sse2_loop:) + a2(and eax, eax) + a2(pxor xmm0,[esi+ecx+0]) + a2(pxor xmm1,[esi+ecx+16]) + a2(pxor xmm2,[esi+ecx+32]) + a2(pxor xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor2) + a2(pxor xmm0,[eax+ecx+0]) + a2(pxor xmm1,[eax+ecx+16]) + a2(pxor xmm2,[eax+ecx+32]) + a2(pxor xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_sse2_no_xor2:) + a2(movdqa [esp+0],xmm0) + a2(movdqa xmm4,xmm1) + a2(movdqa xmm5,xmm2) + a2(movdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_chacha_sse2_loop: ) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a3(pshuflw xmm3,xmm3,0xb1) + a3(pshufhw xmm3,xmm3,0xb1) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(movdqa xmm6,xmm3) + a2(pslld xmm3,8) + a2(psrld xmm6,24) + a2(pxor xmm3,xmm6) + a3(pshufd xmm0,xmm0,0x93) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x39) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + a2(sub eax,2) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a3(pshuflw xmm3,xmm3,0xb1) + a3(pshufhw xmm3,xmm3,0xb1) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(movdqa xmm6,xmm3) + a2(pslld xmm3,8) + a2(psrld xmm6,24) + a2(pxor xmm3,xmm6) + a3(pshufd xmm0,xmm0,0x39) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x93) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + aj(ja scrypt_chacha_sse2_loop) + a2(paddd xmm0,[esp+0]) + a2(paddd xmm1,xmm4) + a2(paddd xmm2,xmm5) + a2(paddd xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(movdqa [eax+0],xmm0) + a2(movdqa [eax+16],xmm1) + a2(movdqa [eax+32],xmm2) + a2(movdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_sse2_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_sse2) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_SSE2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_sse2)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_sse2) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(movdqa xmm0,[rax+0]) + a2(movdqa xmm1,[rax+16]) + a2(movdqa xmm2,[rax+32]) + a2(movdqa xmm3,[rax+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor1) + a2(pxor xmm0,[r9+0]) + a2(pxor xmm1,[r9+16]) + a2(pxor xmm2,[r9+32]) + a2(pxor xmm3,[r9+48]) + a1(scrypt_ChunkMix_sse2_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_sse2_loop:) + a2(and rdx, rdx) + a2(pxor xmm0,[rsi+r9+0]) + a2(pxor xmm1,[rsi+r9+16]) + a2(pxor xmm2,[rsi+r9+32]) + a2(pxor xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor2) + a2(pxor xmm0,[rdx+r9+0]) + a2(pxor xmm1,[rdx+r9+16]) + a2(pxor xmm2,[rdx+r9+32]) + a2(pxor xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_sse2_no_xor2:) + a2(movdqa xmm8,xmm0) + a2(movdqa xmm9,xmm1) + a2(movdqa xmm10,xmm2) + a2(movdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_chacha_sse2_loop: ) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a3(pshuflw xmm3,xmm3,0xb1) + a3(pshufhw xmm3,xmm3,0xb1) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(movdqa xmm6,xmm3) + a2(pslld xmm3,8) + a2(psrld xmm6,24) + a2(pxor xmm3,xmm6) + a3(pshufd xmm0,xmm0,0x93) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x39) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + a2(sub rax,2) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a3(pshuflw xmm3,xmm3,0xb1) + a3(pshufhw xmm3,xmm3,0xb1) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(movdqa xmm6,xmm3) + a2(pslld xmm3,8) + a2(psrld xmm6,24) + a2(pxor xmm3,xmm6) + a3(pshufd xmm0,xmm0,0x39) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x93) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + aj(ja scrypt_chacha_sse2_loop) + a2(paddd xmm0,xmm8) + a2(paddd xmm1,xmm9) + a2(paddd xmm2,xmm10) + a2(paddd xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(movdqa [rax+0],xmm0) + a2(movdqa [rax+16],xmm1) + a2(movdqa [rax+32],xmm2) + a2(movdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_sse2_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_sse2) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) + +#define SCRYPT_CHACHA_SSE2 + +static void NOINLINE asm_calling_convention +scrypt_ChunkMix_sse2(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,t0,t1,t2,t3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x4 = x3; + x3 = _mm_shufflehi_epi16(_mm_shufflelo_epi16(x3, 0xb1), 0xb1); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x4 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x4, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x4 = x3; + x3 = _mm_or_si128(_mm_slli_epi32(x3, 8), _mm_srli_epi32(x4, 24)); + x0 = _mm_shuffle_epi32(x0, 0x93); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x39); + x4 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x4, 25)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x4 = x3; + x3 = _mm_shufflehi_epi16(_mm_shufflelo_epi16(x3, 0xb1), 0xb1); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x4 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x4, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x4 = x3; + x3 = _mm_or_si128(_mm_slli_epi32(x3, 8), _mm_srli_epi32(x4, 24)); + x0 = _mm_shuffle_epi32(x0, 0x39); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x93); + x4 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x4, 25)); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_CHACHA_SSE2) + #undef SCRYPT_MIX + #define SCRYPT_MIX "ChaCha/8-SSE2" + #undef SCRYPT_CHACHA_INCLUDED + #define SCRYPT_CHACHA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-ssse3.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-ssse3.h new file mode 100644 index 000000000..894312e60 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-ssse3.h @@ -0,0 +1,376 @@ +/* x86 */ +#if defined(X86ASM_SSSE3) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_SSSE3 + +asm_naked_fn_proto(void, scrypt_ChunkMix_ssse3)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_ssse3) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,64) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(mov ebx, 0x01000302) + a2(movd xmm4, ebx) + a2(mov ebx, 0x05040706) + a2(movd xmm0, ebx) + a2(mov ebx, 0x09080b0a) + a2(movd xmm1, ebx) + a2(mov ebx, 0x0d0c0f0e) + a2(movd xmm2, ebx) + a2(mov ebx, 0x02010003) + a2(movd xmm5, ebx) + a2(mov ebx, 0x06050407) + a2(movd xmm3, ebx) + a2(mov ebx, 0x0a09080b) + a2(movd xmm6, ebx) + a2(mov ebx, 0x0e0d0c0f) + a2(movd xmm7, ebx) + a2(punpckldq xmm4, xmm0) + a2(punpckldq xmm5, xmm3) + a2(punpckldq xmm1, xmm2) + a2(punpckldq xmm6, xmm7) + a2(punpcklqdq xmm4, xmm1) + a2(punpcklqdq xmm5, xmm6) + a2(movdqa xmm0,[ecx+esi+0]) + a2(movdqa xmm1,[ecx+esi+16]) + a2(movdqa xmm2,[ecx+esi+32]) + a2(movdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_ssse3_no_xor1) + a2(pxor xmm0,[ecx+eax+0]) + a2(pxor xmm1,[ecx+eax+16]) + a2(pxor xmm2,[ecx+eax+32]) + a2(pxor xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_ssse3_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_ssse3_loop:) + a2(and eax, eax) + a2(pxor xmm0,[esi+ecx+0]) + a2(pxor xmm1,[esi+ecx+16]) + a2(pxor xmm2,[esi+ecx+32]) + a2(pxor xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_ssse3_no_xor2) + a2(pxor xmm0,[eax+ecx+0]) + a2(pxor xmm1,[eax+ecx+16]) + a2(pxor xmm2,[eax+ecx+32]) + a2(pxor xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_ssse3_no_xor2:) + a2(movdqa [esp+0],xmm0) + a2(movdqa [esp+16],xmm1) + a2(movdqa [esp+32],xmm2) + a2(movdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_chacha_ssse3_loop: ) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm4) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm5) + a3(pshufd xmm0,xmm0,0x93) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x39) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + a2(sub eax,2) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm4) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm6,20) + a2(pxor xmm1,xmm6) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm5) + a3(pshufd xmm0,xmm0,0x39) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x93) + a2(movdqa xmm6,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm6,25) + a2(pxor xmm1,xmm6) + aj(ja scrypt_chacha_ssse3_loop) + a2(paddd xmm0,[esp+0]) + a2(paddd xmm1,[esp+16]) + a2(paddd xmm2,[esp+32]) + a2(paddd xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(movdqa [eax+0],xmm0) + a2(movdqa [eax+16],xmm1) + a2(movdqa [eax+32],xmm2) + a2(movdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_ssse3_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_ssse3) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_SSSE3) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_SSSE3 + +asm_naked_fn_proto(void, scrypt_ChunkMix_ssse3)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_ssse3) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(movdqa xmm0,[rax+0]) + a2(movdqa xmm1,[rax+16]) + a2(movdqa xmm2,[rax+32]) + a2(movdqa xmm3,[rax+48]) + a2(mov r8, 0x0504070601000302) + a2(mov rax, 0x0d0c0f0e09080b0a) + a2(movd xmm4, r8) + a2(movd xmm6, rax) + a2(mov r8, 0x0605040702010003) + a2(mov rax, 0x0e0d0c0f0a09080b) + a2(movd xmm5, r8) + a2(movd xmm7, rax) + a2(punpcklqdq xmm4, xmm6) + a2(punpcklqdq xmm5, xmm7) + aj(jz scrypt_ChunkMix_ssse3_no_xor1) + a2(pxor xmm0,[r9+0]) + a2(pxor xmm1,[r9+16]) + a2(pxor xmm2,[r9+32]) + a2(pxor xmm3,[r9+48]) + a1(scrypt_ChunkMix_ssse3_no_xor1:) + a2(xor r8,r8) + a2(xor r9,r9) + a1(scrypt_ChunkMix_ssse3_loop:) + a2(and rdx, rdx) + a2(pxor xmm0,[rsi+r9+0]) + a2(pxor xmm1,[rsi+r9+16]) + a2(pxor xmm2,[rsi+r9+32]) + a2(pxor xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_ssse3_no_xor2) + a2(pxor xmm0,[rdx+r9+0]) + a2(pxor xmm1,[rdx+r9+16]) + a2(pxor xmm2,[rdx+r9+32]) + a2(pxor xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_ssse3_no_xor2:) + a2(movdqa xmm8,xmm0) + a2(movdqa xmm9,xmm1) + a2(movdqa xmm10,xmm2) + a2(movdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_chacha_ssse3_loop: ) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm4) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm12,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm12,20) + a2(pxor xmm1,xmm12) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm5) + a3(pshufd xmm0,xmm0,0x93) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x39) + a2(movdqa xmm12,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm12,25) + a2(pxor xmm1,xmm12) + a2(sub rax,2) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm4) + a2(paddd xmm2,xmm3) + a2(pxor xmm1,xmm2) + a2(movdqa xmm12,xmm1) + a2(pslld xmm1,12) + a2(psrld xmm12,20) + a2(pxor xmm1,xmm12) + a2(paddd xmm0,xmm1) + a2(pxor xmm3,xmm0) + a2(pshufb xmm3,xmm5) + a3(pshufd xmm0,xmm0,0x39) + a2(paddd xmm2,xmm3) + a3(pshufd xmm3,xmm3,0x4e) + a2(pxor xmm1,xmm2) + a3(pshufd xmm2,xmm2,0x93) + a2(movdqa xmm12,xmm1) + a2(pslld xmm1,7) + a2(psrld xmm12,25) + a2(pxor xmm1,xmm12) + aj(ja scrypt_chacha_ssse3_loop) + a2(paddd xmm0,xmm8) + a2(paddd xmm1,xmm9) + a2(paddd xmm2,xmm10) + a2(paddd xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(movdqa [rax+0],xmm0) + a2(movdqa [rax+16],xmm1) + a2(movdqa [rax+32],xmm2) + a2(movdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_ssse3_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_ssse3) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_SSSE3) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) + +#define SCRYPT_CHACHA_SSSE3 + +static void NOINLINE asm_calling_convention +scrypt_ChunkMix_ssse3(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x6,t0,t1,t2,t3; + const xmmi x4 = *(xmmi *)&ssse3_rotl16_32bit, x5 = *(xmmi *)&ssse3_rotl8_32bit; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x4); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x5); + x0 = _mm_shuffle_epi32(x0, 0x93); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x39); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x4); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 12), _mm_srli_epi32(x6, 20)); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_shuffle_epi8(x3, x5); + x0 = _mm_shuffle_epi32(x0, 0x39); + x2 = _mm_add_epi32(x2, x3); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x1 = _mm_xor_si128(x1, x2); + x2 = _mm_shuffle_epi32(x2, 0x93); + x6 = x1; + x1 = _mm_or_si128(_mm_slli_epi32(x1, 7), _mm_srli_epi32(x6, 25)); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_CHACHA_SSSE3) + #undef SCRYPT_MIX + #define SCRYPT_MIX "ChaCha/8-SSSE3" + #undef SCRYPT_CHACHA_INCLUDED + #define SCRYPT_CHACHA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-xop.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-xop.h new file mode 100644 index 000000000..4c25d887e --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha-xop.h @@ -0,0 +1,315 @@ +/* x86 */ +#if defined(X86ASM_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_XOP + +asm_naked_fn_proto(void, scrypt_ChunkMix_xop)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_xop) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,64) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(vmovdqa xmm0,[ecx+esi+0]) + a2(vmovdqa xmm1,[ecx+esi+16]) + a2(vmovdqa xmm2,[ecx+esi+32]) + a2(vmovdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_xop_no_xor1) + a3(vpxor xmm0,xmm0,[ecx+eax+0]) + a3(vpxor xmm1,xmm1,[ecx+eax+16]) + a3(vpxor xmm2,xmm2,[ecx+eax+32]) + a3(vpxor xmm3,xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_xop_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_xop_loop:) + a2(and eax, eax) + a3(vpxor xmm0,xmm0,[esi+ecx+0]) + a3(vpxor xmm1,xmm1,[esi+ecx+16]) + a3(vpxor xmm2,xmm2,[esi+ecx+32]) + a3(vpxor xmm3,xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_xop_no_xor2) + a3(vpxor xmm0,xmm0,[eax+ecx+0]) + a3(vpxor xmm1,xmm1,[eax+ecx+16]) + a3(vpxor xmm2,xmm2,[eax+ecx+32]) + a3(vpxor xmm3,xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_xop_no_xor2:) + a2(vmovdqa xmm4,xmm0) + a2(vmovdqa xmm5,xmm1) + a2(vmovdqa xmm6,xmm2) + a2(vmovdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_chacha_xop_loop: ) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,16) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,8) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm0,xmm0,0x93) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,7) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpshufd xmm2,xmm2,0x39) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,16) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,8) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm0,xmm0,0x39) + a3(vprotd xmm1,xmm1,7) + a3(pshufd xmm3,xmm3,0x4e) + a3(pshufd xmm2,xmm2,0x93) + a2(sub eax,2) + aj(ja scrypt_chacha_xop_loop) + a3(vpaddd xmm0,xmm0,xmm4) + a3(vpaddd xmm1,xmm1,xmm5) + a3(vpaddd xmm2,xmm2,xmm6) + a3(vpaddd xmm3,xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(vmovdqa [eax+0],xmm0) + a2(vmovdqa [eax+16],xmm1) + a2(vmovdqa [eax+32],xmm2) + a2(vmovdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_xop_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_xop) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_CHACHA_XOP + +asm_naked_fn_proto(void, scrypt_ChunkMix_xop)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_xop) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + aj(jz scrypt_ChunkMix_xop_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a1(scrypt_ChunkMix_xop_no_xor1:) + a2(xor r8,r8) + a2(xor r9,r9) + a1(scrypt_ChunkMix_xop_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_xop_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_xop_no_xor2:) + a2(vmovdqa xmm4,xmm0) + a2(vmovdqa xmm5,xmm1) + a2(vmovdqa xmm6,xmm2) + a2(vmovdqa xmm7,xmm3) + a2(mov rax,8) + a1(scrypt_chacha_xop_loop: ) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,16) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,8) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpshufd xmm0,xmm0,0x93) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,7) + a3(vpshufd xmm3,xmm3,0x4e) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpshufd xmm2,xmm2,0x39) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,16) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vprotd xmm1,xmm1,12) + a3(vpaddd xmm0,xmm0,xmm1) + a3(vpxor xmm3,xmm3,xmm0) + a3(vprotd xmm3,xmm3,8) + a3(vpaddd xmm2,xmm2,xmm3) + a3(vpxor xmm1,xmm1,xmm2) + a3(vpshufd xmm0,xmm0,0x39) + a3(vprotd xmm1,xmm1,7) + a3(pshufd xmm3,xmm3,0x4e) + a3(pshufd xmm2,xmm2,0x93) + a2(sub rax,2) + aj(ja scrypt_chacha_xop_loop) + a3(vpaddd xmm0,xmm0,xmm4) + a3(vpaddd xmm1,xmm1,xmm5) + a3(vpaddd xmm2,xmm2,xmm6) + a3(vpaddd xmm3,xmm3,xmm7) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_xop_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_xop) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED)) + +#define SCRYPT_CHACHA_XOP + +static void asm_calling_convention NOINLINE +scrypt_ChunkMix_xop(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x6,t0,t1,t2,t3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_roti_epi32(x3, 16); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x1 = _mm_roti_epi32(x1, 12); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_roti_epi32(x3, 8); + x2 = _mm_add_epi32(x2, x3); + x0 = _mm_shuffle_epi32(x0, 0x93); + x1 = _mm_xor_si128(x1, x2); + x1 = _mm_roti_epi32(x1, 7); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x0 = _mm_add_epi32(x0, x1); + x2 = _mm_shuffle_epi32(x2, 0x39); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_roti_epi32(x3, 16); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x1 = _mm_roti_epi32(x1, 12); + x0 = _mm_add_epi32(x0, x1); + x3 = _mm_xor_si128(x3, x0); + x3 = _mm_roti_epi32(x3, 8); + x2 = _mm_add_epi32(x2, x3); + x1 = _mm_xor_si128(x1, x2); + x0 = _mm_shuffle_epi32(x0, 0x39); + x1 = _mm_roti_epi32(x1, 7); + x3 = _mm_shuffle_epi32(x3, 0x4e); + x2 = _mm_shuffle_epi32(x2, 0x93); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_CHACHA_XOP) + #undef SCRYPT_MIX + #define SCRYPT_MIX "ChaCha/8-XOP" + #undef SCRYPT_CHACHA_INCLUDED + #define SCRYPT_CHACHA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha.h new file mode 100644 index 000000000..85ee9c1ce --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_chacha.h @@ -0,0 +1,69 @@ +#if !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_CHACHA_INCLUDED) + +#undef SCRYPT_MIX +#define SCRYPT_MIX "ChaCha20/8 Ref" + +#undef SCRYPT_CHACHA_INCLUDED +#define SCRYPT_CHACHA_INCLUDED +#define SCRYPT_CHACHA_BASIC + +static void +chacha_core_basic(uint32_t state[16]) { + size_t rounds = 8; + uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,t; + + x0 = state[0]; + x1 = state[1]; + x2 = state[2]; + x3 = state[3]; + x4 = state[4]; + x5 = state[5]; + x6 = state[6]; + x7 = state[7]; + x8 = state[8]; + x9 = state[9]; + x10 = state[10]; + x11 = state[11]; + x12 = state[12]; + x13 = state[13]; + x14 = state[14]; + x15 = state[15]; + + #define quarter(a,b,c,d) \ + a += b; t = d^a; d = ROTL32(t,16); \ + c += d; t = b^c; b = ROTL32(t,12); \ + a += b; t = d^a; d = ROTL32(t, 8); \ + c += d; t = b^c; b = ROTL32(t, 7); + + for (; rounds; rounds -= 2) { + quarter( x0, x4, x8,x12) + quarter( x1, x5, x9,x13) + quarter( x2, x6,x10,x14) + quarter( x3, x7,x11,x15) + quarter( x0, x5,x10,x15) + quarter( x1, x6,x11,x12) + quarter( x2, x7, x8,x13) + quarter( x3, x4, x9,x14) + } + + state[0] += x0; + state[1] += x1; + state[2] += x2; + state[3] += x3; + state[4] += x4; + state[5] += x5; + state[6] += x6; + state[7] += x7; + state[8] += x8; + state[9] += x9; + state[10] += x10; + state[11] += x11; + state[12] += x12; + state[13] += x13; + state[14] += x14; + state[15] += x15; + + #undef quarter +} + +#endif \ No newline at end of file diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-avx.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-avx.h new file mode 100644 index 000000000..259fae468 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-avx.h @@ -0,0 +1,381 @@ +/* x86 */ +#if defined(X86ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_AVX + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,32) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(movdqa xmm0,[ecx+esi+0]) + a2(movdqa xmm1,[ecx+esi+16]) + a2(movdqa xmm2,[ecx+esi+32]) + a2(movdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_avx_no_xor1) + a3(vpxor xmm0,xmm0,[ecx+eax+0]) + a3(vpxor xmm1,xmm1,[ecx+eax+16]) + a3(vpxor xmm2,xmm2,[ecx+eax+32]) + a3(vpxor xmm3,xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_avx_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_avx_loop:) + a2(and eax, eax) + a3(vpxor xmm0,xmm0,[esi+ecx+0]) + a3(vpxor xmm1,xmm1,[esi+ecx+16]) + a3(vpxor xmm2,xmm2,[esi+ecx+32]) + a3(vpxor xmm3,xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_avx_no_xor2) + a3(vpxor xmm0,xmm0,[eax+ecx+0]) + a3(vpxor xmm1,xmm1,[eax+ecx+16]) + a3(vpxor xmm2,xmm2,[eax+ecx+32]) + a3(vpxor xmm3,xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_avx_no_xor2:) + a2(vmovdqa [esp+0],xmm0) + a2(vmovdqa [esp+16],xmm1) + a2(vmovdqa xmm6,xmm2) + a2(vmovdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_salsa_avx_loop: ) + a3(vpaddd xmm4, xmm1, xmm0) + a3(vpsrld xmm5, xmm4, 25) + a3(vpslld xmm4, xmm4, 7) + a3(vpxor xmm3, xmm3, xmm5) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm0, xmm3) + a3(vpsrld xmm5, xmm4, 23) + a3(vpslld xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm5) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm3, xmm2) + a3(vpsrld xmm5, xmm4, 19) + a3(vpslld xmm4, xmm4, 13) + a3(vpxor xmm1, xmm1, xmm5) + a3(vpshufd xmm3, xmm3, 0x93) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm2, xmm1) + a3(vpsrld xmm5, xmm4, 14) + a3(vpslld xmm4, xmm4, 18) + a3(vpxor xmm0, xmm0, xmm5) + a3(vpshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(vpaddd xmm4, xmm3, xmm0) + a3(vpshufd xmm1, xmm1, 0x39) + a3(vpsrld xmm5, xmm4, 25) + a3(vpslld xmm4, xmm4, 7) + a3(vpxor xmm1, xmm1, xmm5) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm0, xmm1) + a3(vpsrld xmm5, xmm4, 23) + a3(vpslld xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm5) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm1, xmm2) + a3(vpsrld xmm5, xmm4, 19) + a3(vpslld xmm4, xmm4, 13) + a3(vpxor xmm3, xmm3, xmm5) + a3(vpshufd xmm1, xmm1, 0x93) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm2, xmm3) + a3(vpsrld xmm5, xmm4, 14) + a3(vpslld xmm4, xmm4, 18) + a3(vpxor xmm0, xmm0, xmm5) + a3(vpshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(vpshufd xmm3, xmm3, 0x39) + a2(sub eax, 2) + aj(ja scrypt_salsa_avx_loop) + a3(vpaddd xmm0,xmm0,[esp+0]) + a3(vpaddd xmm1,xmm1,[esp+16]) + a3(vpaddd xmm2,xmm2,xmm6) + a3(vpaddd xmm3,xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(vmovdqa [eax+0],xmm0) + a2(vmovdqa [eax+16],xmm1) + a2(vmovdqa [eax+32],xmm2) + a2(vmovdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_avx_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_avx) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_AVX + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + aj(jz scrypt_ChunkMix_avx_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a1(scrypt_ChunkMix_avx_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_avx_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_avx_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_avx_no_xor2:) + a2(vmovdqa xmm8,xmm0) + a2(vmovdqa xmm9,xmm1) + a2(vmovdqa xmm10,xmm2) + a2(vmovdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_salsa_avx_loop: ) + a3(vpaddd xmm4, xmm1, xmm0) + a3(vpsrld xmm5, xmm4, 25) + a3(vpslld xmm4, xmm4, 7) + a3(vpxor xmm3, xmm3, xmm5) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm0, xmm3) + a3(vpsrld xmm5, xmm4, 23) + a3(vpslld xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm5) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm3, xmm2) + a3(vpsrld xmm5, xmm4, 19) + a3(vpslld xmm4, xmm4, 13) + a3(vpxor xmm1, xmm1, xmm5) + a3(vpshufd xmm3, xmm3, 0x93) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm2, xmm1) + a3(vpsrld xmm5, xmm4, 14) + a3(vpslld xmm4, xmm4, 18) + a3(vpxor xmm0, xmm0, xmm5) + a3(vpshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(vpaddd xmm4, xmm3, xmm0) + a3(vpshufd xmm1, xmm1, 0x39) + a3(vpsrld xmm5, xmm4, 25) + a3(vpslld xmm4, xmm4, 7) + a3(vpxor xmm1, xmm1, xmm5) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm0, xmm1) + a3(vpsrld xmm5, xmm4, 23) + a3(vpslld xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm5) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm1, xmm2) + a3(vpsrld xmm5, xmm4, 19) + a3(vpslld xmm4, xmm4, 13) + a3(vpxor xmm3, xmm3, xmm5) + a3(vpshufd xmm1, xmm1, 0x93) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm2, xmm3) + a3(vpsrld xmm5, xmm4, 14) + a3(vpslld xmm4, xmm4, 18) + a3(vpxor xmm0, xmm0, xmm5) + a3(vpshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(vpshufd xmm3, xmm3, 0x39) + a2(sub rax, 2) + aj(ja scrypt_salsa_avx_loop) + a3(vpaddd xmm0,xmm0,xmm8) + a3(vpaddd xmm1,xmm1,xmm9) + a3(vpaddd xmm2,xmm2,xmm10) + a3(vpaddd xmm3,xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_avx_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_avx) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) + +#define SCRYPT_SALSA_AVX + +static void asm_calling_convention NOINLINE +scrypt_ChunkMix_avx(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,t0,t1,t2,t3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x4 = x1; + x4 = _mm_add_epi32(x4, x0); + x5 = x4; + x4 = _mm_slli_epi32(x4, 7); + x5 = _mm_srli_epi32(x5, 25); + x3 = _mm_xor_si128(x3, x4); + x4 = x0; + x3 = _mm_xor_si128(x3, x5); + x4 = _mm_add_epi32(x4, x3); + x5 = x4; + x4 = _mm_slli_epi32(x4, 9); + x5 = _mm_srli_epi32(x5, 23); + x2 = _mm_xor_si128(x2, x4); + x4 = x3; + x2 = _mm_xor_si128(x2, x5); + x3 = _mm_shuffle_epi32(x3, 0x93); + x4 = _mm_add_epi32(x4, x2); + x5 = x4; + x4 = _mm_slli_epi32(x4, 13); + x5 = _mm_srli_epi32(x5, 19); + x1 = _mm_xor_si128(x1, x4); + x4 = x2; + x1 = _mm_xor_si128(x1, x5); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x4 = _mm_add_epi32(x4, x1); + x5 = x4; + x4 = _mm_slli_epi32(x4, 18); + x5 = _mm_srli_epi32(x5, 14); + x0 = _mm_xor_si128(x0, x4); + x4 = x3; + x0 = _mm_xor_si128(x0, x5); + x1 = _mm_shuffle_epi32(x1, 0x39); + x4 = _mm_add_epi32(x4, x0); + x5 = x4; + x4 = _mm_slli_epi32(x4, 7); + x5 = _mm_srli_epi32(x5, 25); + x1 = _mm_xor_si128(x1, x4); + x4 = x0; + x1 = _mm_xor_si128(x1, x5); + x4 = _mm_add_epi32(x4, x1); + x5 = x4; + x4 = _mm_slli_epi32(x4, 9); + x5 = _mm_srli_epi32(x5, 23); + x2 = _mm_xor_si128(x2, x4); + x4 = x1; + x2 = _mm_xor_si128(x2, x5); + x1 = _mm_shuffle_epi32(x1, 0x93); + x4 = _mm_add_epi32(x4, x2); + x5 = x4; + x4 = _mm_slli_epi32(x4, 13); + x5 = _mm_srli_epi32(x5, 19); + x3 = _mm_xor_si128(x3, x4); + x4 = x2; + x3 = _mm_xor_si128(x3, x5); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x4 = _mm_add_epi32(x4, x3); + x5 = x4; + x4 = _mm_slli_epi32(x4, 18); + x5 = _mm_srli_epi32(x5, 14); + x0 = _mm_xor_si128(x0, x4); + x3 = _mm_shuffle_epi32(x3, 0x39); + x0 = _mm_xor_si128(x0, x5); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_SALSA_AVX) + /* uses salsa_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa/8-AVX" + #undef SCRYPT_SALSA_INCLUDED + #define SCRYPT_SALSA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-sse2.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-sse2.h new file mode 100644 index 000000000..d7ef969ca --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-sse2.h @@ -0,0 +1,443 @@ +/* x86 */ +#if defined(X86ASM_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_SSE2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_sse2)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_sse2) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,32) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(movdqa xmm0,[ecx+esi+0]) + a2(movdqa xmm1,[ecx+esi+16]) + a2(movdqa xmm2,[ecx+esi+32]) + a2(movdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor1) + a2(pxor xmm0,[ecx+eax+0]) + a2(pxor xmm1,[ecx+eax+16]) + a2(pxor xmm2,[ecx+eax+32]) + a2(pxor xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_sse2_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_sse2_loop:) + a2(and eax, eax) + a2(pxor xmm0,[esi+ecx+0]) + a2(pxor xmm1,[esi+ecx+16]) + a2(pxor xmm2,[esi+ecx+32]) + a2(pxor xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor2) + a2(pxor xmm0,[eax+ecx+0]) + a2(pxor xmm1,[eax+ecx+16]) + a2(pxor xmm2,[eax+ecx+32]) + a2(pxor xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_sse2_no_xor2:) + a2(movdqa [esp+0],xmm0) + a2(movdqa [esp+16],xmm1) + a2(movdqa xmm6,xmm2) + a2(movdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_salsa_sse2_loop: ) + a2(movdqa xmm4, xmm1) + a2(paddd xmm4, xmm0) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 7) + a2(psrld xmm5, 25) + a2(pxor xmm3, xmm4) + a2(movdqa xmm4, xmm0) + a2(pxor xmm3, xmm5) + a2(paddd xmm4, xmm3) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 9) + a2(psrld xmm5, 23) + a2(pxor xmm2, xmm4) + a2(movdqa xmm4, xmm3) + a2(pxor xmm2, xmm5) + a3(pshufd xmm3, xmm3, 0x93) + a2(paddd xmm4, xmm2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 13) + a2(psrld xmm5, 19) + a2(pxor xmm1, xmm4) + a2(movdqa xmm4, xmm2) + a2(pxor xmm1, xmm5) + a3(pshufd xmm2, xmm2, 0x4e) + a2(paddd xmm4, xmm1) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 18) + a2(psrld xmm5, 14) + a2(pxor xmm0, xmm4) + a2(movdqa xmm4, xmm3) + a2(pxor xmm0, xmm5) + a3(pshufd xmm1, xmm1, 0x39) + a2(paddd xmm4, xmm0) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 7) + a2(psrld xmm5, 25) + a2(pxor xmm1, xmm4) + a2(movdqa xmm4, xmm0) + a2(pxor xmm1, xmm5) + a2(paddd xmm4, xmm1) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 9) + a2(psrld xmm5, 23) + a2(pxor xmm2, xmm4) + a2(movdqa xmm4, xmm1) + a2(pxor xmm2, xmm5) + a3(pshufd xmm1, xmm1, 0x93) + a2(paddd xmm4, xmm2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 13) + a2(psrld xmm5, 19) + a2(pxor xmm3, xmm4) + a2(movdqa xmm4, xmm2) + a2(pxor xmm3, xmm5) + a3(pshufd xmm2, xmm2, 0x4e) + a2(paddd xmm4, xmm3) + a2(sub eax, 2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 18) + a2(psrld xmm5, 14) + a2(pxor xmm0, xmm4) + a3(pshufd xmm3, xmm3, 0x39) + a2(pxor xmm0, xmm5) + aj(ja scrypt_salsa_sse2_loop) + a2(paddd xmm0,[esp+0]) + a2(paddd xmm1,[esp+16]) + a2(paddd xmm2,xmm6) + a2(paddd xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(movdqa [eax+0],xmm0) + a2(movdqa [eax+16],xmm1) + a2(movdqa [eax+32],xmm2) + a2(movdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_sse2_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_sse2) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_SSE2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_sse2)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_sse2) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(movdqa xmm0,[rax+0]) + a2(movdqa xmm1,[rax+16]) + a2(movdqa xmm2,[rax+32]) + a2(movdqa xmm3,[rax+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor1) + a2(pxor xmm0,[r9+0]) + a2(pxor xmm1,[r9+16]) + a2(pxor xmm2,[r9+32]) + a2(pxor xmm3,[r9+48]) + a1(scrypt_ChunkMix_sse2_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_sse2_loop:) + a2(and rdx, rdx) + a2(pxor xmm0,[rsi+r9+0]) + a2(pxor xmm1,[rsi+r9+16]) + a2(pxor xmm2,[rsi+r9+32]) + a2(pxor xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_sse2_no_xor2) + a2(pxor xmm0,[rdx+r9+0]) + a2(pxor xmm1,[rdx+r9+16]) + a2(pxor xmm2,[rdx+r9+32]) + a2(pxor xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_sse2_no_xor2:) + a2(movdqa xmm8,xmm0) + a2(movdqa xmm9,xmm1) + a2(movdqa xmm10,xmm2) + a2(movdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_salsa_sse2_loop: ) + a2(movdqa xmm4, xmm1) + a2(paddd xmm4, xmm0) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 7) + a2(psrld xmm5, 25) + a2(pxor xmm3, xmm4) + a2(movdqa xmm4, xmm0) + a2(pxor xmm3, xmm5) + a2(paddd xmm4, xmm3) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 9) + a2(psrld xmm5, 23) + a2(pxor xmm2, xmm4) + a2(movdqa xmm4, xmm3) + a2(pxor xmm2, xmm5) + a3(pshufd xmm3, xmm3, 0x93) + a2(paddd xmm4, xmm2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 13) + a2(psrld xmm5, 19) + a2(pxor xmm1, xmm4) + a2(movdqa xmm4, xmm2) + a2(pxor xmm1, xmm5) + a3(pshufd xmm2, xmm2, 0x4e) + a2(paddd xmm4, xmm1) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 18) + a2(psrld xmm5, 14) + a2(pxor xmm0, xmm4) + a2(movdqa xmm4, xmm3) + a2(pxor xmm0, xmm5) + a3(pshufd xmm1, xmm1, 0x39) + a2(paddd xmm4, xmm0) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 7) + a2(psrld xmm5, 25) + a2(pxor xmm1, xmm4) + a2(movdqa xmm4, xmm0) + a2(pxor xmm1, xmm5) + a2(paddd xmm4, xmm1) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 9) + a2(psrld xmm5, 23) + a2(pxor xmm2, xmm4) + a2(movdqa xmm4, xmm1) + a2(pxor xmm2, xmm5) + a3(pshufd xmm1, xmm1, 0x93) + a2(paddd xmm4, xmm2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 13) + a2(psrld xmm5, 19) + a2(pxor xmm3, xmm4) + a2(movdqa xmm4, xmm2) + a2(pxor xmm3, xmm5) + a3(pshufd xmm2, xmm2, 0x4e) + a2(paddd xmm4, xmm3) + a2(sub rax, 2) + a2(movdqa xmm5, xmm4) + a2(pslld xmm4, 18) + a2(psrld xmm5, 14) + a2(pxor xmm0, xmm4) + a3(pshufd xmm3, xmm3, 0x39) + a2(pxor xmm0, xmm5) + aj(ja scrypt_salsa_sse2_loop) + a2(paddd xmm0,xmm8) + a2(paddd xmm1,xmm9) + a2(paddd xmm2,xmm10) + a2(paddd xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(movdqa [rax+0],xmm0) + a2(movdqa [rax+16],xmm1) + a2(movdqa [rax+32],xmm2) + a2(movdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_sse2_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_sse2) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) + +#define SCRYPT_SALSA_SSE2 + +static void NOINLINE asm_calling_convention +scrypt_ChunkMix_sse2(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,t0,t1,t2,t3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x4 = x1; + x4 = _mm_add_epi32(x4, x0); + x5 = x4; + x4 = _mm_slli_epi32(x4, 7); + x5 = _mm_srli_epi32(x5, 25); + x3 = _mm_xor_si128(x3, x4); + x4 = x0; + x3 = _mm_xor_si128(x3, x5); + x4 = _mm_add_epi32(x4, x3); + x5 = x4; + x4 = _mm_slli_epi32(x4, 9); + x5 = _mm_srli_epi32(x5, 23); + x2 = _mm_xor_si128(x2, x4); + x4 = x3; + x2 = _mm_xor_si128(x2, x5); + x3 = _mm_shuffle_epi32(x3, 0x93); + x4 = _mm_add_epi32(x4, x2); + x5 = x4; + x4 = _mm_slli_epi32(x4, 13); + x5 = _mm_srli_epi32(x5, 19); + x1 = _mm_xor_si128(x1, x4); + x4 = x2; + x1 = _mm_xor_si128(x1, x5); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x4 = _mm_add_epi32(x4, x1); + x5 = x4; + x4 = _mm_slli_epi32(x4, 18); + x5 = _mm_srli_epi32(x5, 14); + x0 = _mm_xor_si128(x0, x4); + x4 = x3; + x0 = _mm_xor_si128(x0, x5); + x1 = _mm_shuffle_epi32(x1, 0x39); + x4 = _mm_add_epi32(x4, x0); + x5 = x4; + x4 = _mm_slli_epi32(x4, 7); + x5 = _mm_srli_epi32(x5, 25); + x1 = _mm_xor_si128(x1, x4); + x4 = x0; + x1 = _mm_xor_si128(x1, x5); + x4 = _mm_add_epi32(x4, x1); + x5 = x4; + x4 = _mm_slli_epi32(x4, 9); + x5 = _mm_srli_epi32(x5, 23); + x2 = _mm_xor_si128(x2, x4); + x4 = x1; + x2 = _mm_xor_si128(x2, x5); + x1 = _mm_shuffle_epi32(x1, 0x93); + x4 = _mm_add_epi32(x4, x2); + x5 = x4; + x4 = _mm_slli_epi32(x4, 13); + x5 = _mm_srli_epi32(x5, 19); + x3 = _mm_xor_si128(x3, x4); + x4 = x2; + x3 = _mm_xor_si128(x3, x5); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x4 = _mm_add_epi32(x4, x3); + x5 = x4; + x4 = _mm_slli_epi32(x4, 18); + x5 = _mm_srli_epi32(x5, 14); + x0 = _mm_xor_si128(x0, x4); + x3 = _mm_shuffle_epi32(x3, 0x39); + x0 = _mm_xor_si128(x0, x5); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_SALSA_SSE2) + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa/8-SSE2" + #undef SCRYPT_SALSA_INCLUDED + #define SCRYPT_SALSA_INCLUDED +#endif + +/* used by avx,etc as well */ +#if defined(SCRYPT_SALSA_INCLUDED) + /* + Default layout: + 0 1 2 3 + 4 5 6 7 + 8 9 10 11 + 12 13 14 15 + + SSE2 layout: + 0 5 10 15 + 12 1 6 11 + 8 13 2 7 + 4 9 14 3 + */ + + static void asm_calling_convention + salsa_core_tangle_sse2(uint32_t *blocks, size_t count) { + uint32_t t; + while (count--) { + t = blocks[1]; blocks[1] = blocks[5]; blocks[5] = t; + t = blocks[2]; blocks[2] = blocks[10]; blocks[10] = t; + t = blocks[3]; blocks[3] = blocks[15]; blocks[15] = t; + t = blocks[4]; blocks[4] = blocks[12]; blocks[12] = t; + t = blocks[7]; blocks[7] = blocks[11]; blocks[11] = t; + t = blocks[9]; blocks[9] = blocks[13]; blocks[13] = t; + blocks += 16; + } + } +#endif + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-xop.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-xop.h new file mode 100644 index 000000000..1d014d2ac --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa-xop.h @@ -0,0 +1,317 @@ +/* x86 */ +#if defined(X86ASM_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_XOP + +asm_naked_fn_proto(void, scrypt_ChunkMix_xop)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_xop) + a1(push ebx) + a1(push edi) + a1(push esi) + a1(push ebp) + a2(mov ebp,esp) + a2(mov edi,[ebp+20]) + a2(mov esi,[ebp+24]) + a2(mov eax,[ebp+28]) + a2(mov ebx,[ebp+32]) + a2(sub esp,32) + a2(and esp,~63) + a2(lea edx,[ebx*2]) + a2(shl edx,6) + a2(lea ecx,[edx-64]) + a2(and eax, eax) + a2(movdqa xmm0,[ecx+esi+0]) + a2(movdqa xmm1,[ecx+esi+16]) + a2(movdqa xmm2,[ecx+esi+32]) + a2(movdqa xmm3,[ecx+esi+48]) + aj(jz scrypt_ChunkMix_xop_no_xor1) + a3(vpxor xmm0,xmm0,[ecx+eax+0]) + a3(vpxor xmm1,xmm1,[ecx+eax+16]) + a3(vpxor xmm2,xmm2,[ecx+eax+32]) + a3(vpxor xmm3,xmm3,[ecx+eax+48]) + a1(scrypt_ChunkMix_xop_no_xor1:) + a2(xor ecx,ecx) + a2(xor ebx,ebx) + a1(scrypt_ChunkMix_xop_loop:) + a2(and eax, eax) + a3(vpxor xmm0,xmm0,[esi+ecx+0]) + a3(vpxor xmm1,xmm1,[esi+ecx+16]) + a3(vpxor xmm2,xmm2,[esi+ecx+32]) + a3(vpxor xmm3,xmm3,[esi+ecx+48]) + aj(jz scrypt_ChunkMix_xop_no_xor2) + a3(vpxor xmm0,xmm0,[eax+ecx+0]) + a3(vpxor xmm1,xmm1,[eax+ecx+16]) + a3(vpxor xmm2,xmm2,[eax+ecx+32]) + a3(vpxor xmm3,xmm3,[eax+ecx+48]) + a1(scrypt_ChunkMix_xop_no_xor2:) + a2(vmovdqa [esp+0],xmm0) + a2(vmovdqa [esp+16],xmm1) + a2(vmovdqa xmm6,xmm2) + a2(vmovdqa xmm7,xmm3) + a2(mov eax,8) + a1(scrypt_salsa_xop_loop: ) + a3(vpaddd xmm4, xmm1, xmm0) + a3(vprotd xmm4, xmm4, 7) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm0, xmm3) + a3(vprotd xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm3, xmm2) + a3(vprotd xmm4, xmm4, 13) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm2, xmm1) + a3(pshufd xmm3, xmm3, 0x93) + a3(vprotd xmm4, xmm4, 18) + a3(pshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(pshufd xmm1, xmm1, 0x39) + a3(vpaddd xmm4, xmm3, xmm0) + a3(vprotd xmm4, xmm4, 7) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm0, xmm1) + a3(vprotd xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm1, xmm2) + a3(vprotd xmm4, xmm4, 13) + a3(vpxor xmm3, xmm3, xmm4) + a3(pshufd xmm1, xmm1, 0x93) + a3(vpaddd xmm4, xmm2, xmm3) + a3(pshufd xmm2, xmm2, 0x4e) + a3(vprotd xmm4, xmm4, 18) + a3(pshufd xmm3, xmm3, 0x39) + a3(vpxor xmm0, xmm0, xmm4) + a2(sub eax, 2) + aj(ja scrypt_salsa_xop_loop) + a3(vpaddd xmm0,xmm0,[esp+0]) + a3(vpaddd xmm1,xmm1,[esp+16]) + a3(vpaddd xmm2,xmm2,xmm6) + a3(vpaddd xmm3,xmm3,xmm7) + a2(lea eax,[ebx+ecx]) + a2(xor ebx,edx) + a2(and eax,~0x7f) + a2(add ecx,64) + a2(shr eax,1) + a2(add eax, edi) + a2(cmp ecx,edx) + a2(vmovdqa [eax+0],xmm0) + a2(vmovdqa [eax+16],xmm1) + a2(vmovdqa [eax+32],xmm2) + a2(vmovdqa [eax+48],xmm3) + a2(mov eax,[ebp+28]) + aj(jne scrypt_ChunkMix_xop_loop) + a2(mov esp,ebp) + a1(pop ebp) + a1(pop esi) + a1(pop edi) + a1(pop ebx) + aret(16) +asm_naked_fn_end(scrypt_ChunkMix_xop) + +#endif + + + +/* x64 */ +#if defined(X86_64ASM_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA_XOP + +asm_naked_fn_proto(void, scrypt_ChunkMix_xop)(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_xop) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,6) + a2(lea r9,[rcx-64]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + aj(jz scrypt_ChunkMix_xop_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a1(scrypt_ChunkMix_xop_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_xop_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + aj(jz scrypt_ChunkMix_xop_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a1(scrypt_ChunkMix_xop_no_xor2:) + a2(vmovdqa xmm8,xmm0) + a2(vmovdqa xmm9,xmm1) + a2(vmovdqa xmm10,xmm2) + a2(vmovdqa xmm11,xmm3) + a2(mov rax,8) + a1(scrypt_salsa_xop_loop: ) + a3(vpaddd xmm4, xmm1, xmm0) + a3(vprotd xmm4, xmm4, 7) + a3(vpxor xmm3, xmm3, xmm4) + a3(vpaddd xmm4, xmm0, xmm3) + a3(vprotd xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm3, xmm2) + a3(vprotd xmm4, xmm4, 13) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm2, xmm1) + a3(pshufd xmm3, xmm3, 0x93) + a3(vprotd xmm4, xmm4, 18) + a3(pshufd xmm2, xmm2, 0x4e) + a3(vpxor xmm0, xmm0, xmm4) + a3(pshufd xmm1, xmm1, 0x39) + a3(vpaddd xmm4, xmm3, xmm0) + a3(vprotd xmm4, xmm4, 7) + a3(vpxor xmm1, xmm1, xmm4) + a3(vpaddd xmm4, xmm0, xmm1) + a3(vprotd xmm4, xmm4, 9) + a3(vpxor xmm2, xmm2, xmm4) + a3(vpaddd xmm4, xmm1, xmm2) + a3(vprotd xmm4, xmm4, 13) + a3(vpxor xmm3, xmm3, xmm4) + a3(pshufd xmm1, xmm1, 0x93) + a3(vpaddd xmm4, xmm2, xmm3) + a3(pshufd xmm2, xmm2, 0x4e) + a3(vprotd xmm4, xmm4, 18) + a3(pshufd xmm3, xmm3, 0x39) + a3(vpxor xmm0, xmm0, xmm4) + a2(sub rax, 2) + aj(ja scrypt_salsa_xop_loop) + a3(vpaddd xmm0,xmm0,xmm8) + a3(vpaddd xmm1,xmm1,xmm9) + a3(vpaddd xmm2,xmm2,xmm10) + a3(vpaddd xmm3,xmm3,xmm11) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0x7f) + a2(add r9,64) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + aj(jne scrypt_ChunkMix_xop_loop) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_xop) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED)) + +#define SCRYPT_SALSA_XOP + +static void asm_calling_convention NOINLINE +scrypt_ChunkMix_xop(uint32_t *Bout/*[chunkBytes]*/, uint32_t *Bin/*[chunkBytes]*/, uint32_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,t0,t1,t2,t3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + + for (rounds = 8; rounds; rounds -= 2) { + x4 = _mm_add_epi32(x1, x0); + x4 = _mm_roti_epi32(x4, 7); + x3 = _mm_xor_si128(x3, x4); + x4 = _mm_add_epi32(x0, x3); + x4 = _mm_roti_epi32(x4, 9); + x2 = _mm_xor_si128(x2, x4); + x4 = _mm_add_epi32(x3, x2); + x4 = _mm_roti_epi32(x4, 13); + x1 = _mm_xor_si128(x1, x4); + x4 = _mm_add_epi32(x2, x1); + x4 = _mm_roti_epi32(x4, 18); + x0 = _mm_xor_si128(x0, x4); + x3 = _mm_shuffle_epi32(x3, 0x93); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x1 = _mm_shuffle_epi32(x1, 0x39); + x4 = _mm_add_epi32(x3, x0); + x4 = _mm_roti_epi32(x4, 7); + x1 = _mm_xor_si128(x1, x4); + x4 = _mm_add_epi32(x0, x1); + x4 = _mm_roti_epi32(x4, 9); + x2 = _mm_xor_si128(x2, x4); + x4 = _mm_add_epi32(x1, x2); + x4 = _mm_roti_epi32(x4, 13); + x3 = _mm_xor_si128(x3, x4); + x4 = _mm_add_epi32(x2, x3); + x4 = _mm_roti_epi32(x4, 18); + x0 = _mm_xor_si128(x0, x4); + x1 = _mm_shuffle_epi32(x1, 0x93); + x2 = _mm_shuffle_epi32(x2, 0x4e); + x3 = _mm_shuffle_epi32(x3, 0x39); + } + + x0 = _mm_add_epi32(x0, t0); + x1 = _mm_add_epi32(x1, t1); + x2 = _mm_add_epi32(x2, t2); + x3 = _mm_add_epi32(x3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + } +} + +#endif + +#if defined(SCRYPT_SALSA_XOP) + /* uses salsa_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa/8-XOP" + #undef SCRYPT_SALSA_INCLUDED + #define SCRYPT_SALSA_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa.h new file mode 100644 index 000000000..33f334094 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa.h @@ -0,0 +1,70 @@ +#if !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA_INCLUDED) + +#undef SCRYPT_MIX +#define SCRYPT_MIX "Salsa20/8 Ref" + +#undef SCRYPT_SALSA_INCLUDED +#define SCRYPT_SALSA_INCLUDED +#define SCRYPT_SALSA_BASIC + +static void +salsa_core_basic(uint32_t state[16]) { + size_t rounds = 8; + uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,t; + + x0 = state[0]; + x1 = state[1]; + x2 = state[2]; + x3 = state[3]; + x4 = state[4]; + x5 = state[5]; + x6 = state[6]; + x7 = state[7]; + x8 = state[8]; + x9 = state[9]; + x10 = state[10]; + x11 = state[11]; + x12 = state[12]; + x13 = state[13]; + x14 = state[14]; + x15 = state[15]; + + #define quarter(a,b,c,d) \ + t = a+d; t = ROTL32(t, 7); b ^= t; \ + t = b+a; t = ROTL32(t, 9); c ^= t; \ + t = c+b; t = ROTL32(t, 13); d ^= t; \ + t = d+c; t = ROTL32(t, 18); a ^= t; \ + + for (; rounds; rounds -= 2) { + quarter( x0, x4, x8,x12) + quarter( x5, x9,x13, x1) + quarter(x10,x14, x2, x6) + quarter(x15, x3, x7,x11) + quarter( x0, x1, x2, x3) + quarter( x5, x6, x7, x4) + quarter(x10,x11, x8, x9) + quarter(x15,x12,x13,x14) + } + + state[0] += x0; + state[1] += x1; + state[2] += x2; + state[3] += x3; + state[4] += x4; + state[5] += x5; + state[6] += x6; + state[7] += x7; + state[8] += x8; + state[9] += x9; + state[10] += x10; + state[11] += x11; + state[12] += x12; + state[13] += x13; + state[14] += x14; + state[15] += x15; + + #undef quarter +} + +#endif + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx.h new file mode 100644 index 000000000..c6e41dc37 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx.h @@ -0,0 +1,367 @@ +/* x64 */ +#if defined(X86_64ASM_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA64_AVX + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx)(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx) + a1(push rbp) + a2(mov rbp, rsp) + a2(and rsp, ~63) + a2(sub rsp, 128) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,7) + a2(lea r9,[rcx-128]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + a2(vmovdqa xmm4,[rax+64]) + a2(vmovdqa xmm5,[rax+80]) + a2(vmovdqa xmm6,[rax+96]) + a2(vmovdqa xmm7,[rax+112]) + aj(jz scrypt_ChunkMix_avx_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a3(vpxor xmm4,xmm4,[r9+64]) + a3(vpxor xmm5,xmm5,[r9+80]) + a3(vpxor xmm6,xmm6,[r9+96]) + a3(vpxor xmm7,xmm7,[r9+112]) + a1(scrypt_ChunkMix_avx_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_avx_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + a3(vpxor xmm4,xmm4,[rsi+r9+64]) + a3(vpxor xmm5,xmm5,[rsi+r9+80]) + a3(vpxor xmm6,xmm6,[rsi+r9+96]) + a3(vpxor xmm7,xmm7,[rsi+r9+112]) + aj(jz scrypt_ChunkMix_avx_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a3(vpxor xmm4,xmm4,[rdx+r9+64]) + a3(vpxor xmm5,xmm5,[rdx+r9+80]) + a3(vpxor xmm6,xmm6,[rdx+r9+96]) + a3(vpxor xmm7,xmm7,[rdx+r9+112]) + a1(scrypt_ChunkMix_avx_no_xor2:) + a2(vmovdqa [rsp+0],xmm0) + a2(vmovdqa [rsp+16],xmm1) + a2(vmovdqa [rsp+32],xmm2) + a2(vmovdqa [rsp+48],xmm3) + a2(vmovdqa [rsp+64],xmm4) + a2(vmovdqa [rsp+80],xmm5) + a2(vmovdqa [rsp+96],xmm6) + a2(vmovdqa [rsp+112],xmm7) + a2(mov rax,8) + a1(scrypt_salsa64_avx_loop: ) + a3(vpaddq xmm8, xmm0, xmm2) + a3(vpaddq xmm9, xmm1, xmm3) + a3(vpshufd xmm8, xmm8, 0xb1) + a3(vpshufd xmm9, xmm9, 0xb1) + a3(vpxor xmm6, xmm6, xmm8) + a3(vpxor xmm7, xmm7, xmm9) + a3(vpaddq xmm10, xmm0, xmm6) + a3(vpaddq xmm11, xmm1, xmm7) + a3(vpsrlq xmm8, xmm10, 51) + a3(vpsrlq xmm9, xmm11, 51) + a3(vpsllq xmm10, xmm10, 13) + a3(vpsllq xmm11, xmm11, 13) + a3(vpxor xmm4, xmm4, xmm8) + a3(vpxor xmm5, xmm5, xmm9) + a3(vpxor xmm4, xmm4, xmm10) + a3(vpxor xmm5, xmm5, xmm11) + a3(vpaddq xmm8, xmm6, xmm4) + a3(vpaddq xmm9, xmm7, xmm5) + a3(vpsrlq xmm10, xmm8, 25) + a3(vpsrlq xmm11, xmm9, 25) + a3(vpsllq xmm8, xmm8, 39) + a3(vpsllq xmm9, xmm9, 39) + a3(vpxor xmm2, xmm2, xmm10) + a3(vpxor xmm3, xmm3, xmm11) + a3(vpxor xmm2, xmm2, xmm8) + a3(vpxor xmm3, xmm3, xmm9) + a3(vpaddq xmm10, xmm4, xmm2) + a3(vpaddq xmm11, xmm5, xmm3) + a3(vpshufd xmm10, xmm10, 0xb1) + a3(vpshufd xmm11, xmm11, 0xb1) + a3(vpxor xmm0, xmm0, xmm10) + a3(vpxor xmm1, xmm1, xmm11) + a2(vmovdqa xmm8, xmm2) + a2(vmovdqa xmm9, xmm3) + a4(vpalignr xmm2, xmm6, xmm7, 8) + a4(vpalignr xmm3, xmm7, xmm6, 8) + a4(vpalignr xmm6, xmm9, xmm8, 8) + a4(vpalignr xmm7, xmm8, xmm9, 8) + a3(vpaddq xmm10, xmm0, xmm2) + a3(vpaddq xmm11, xmm1, xmm3) + a3(vpshufd xmm10, xmm10, 0xb1) + a3(vpshufd xmm11, xmm11, 0xb1) + a3(vpxor xmm6, xmm6, xmm10) + a3(vpxor xmm7, xmm7, xmm11) + a3(vpaddq xmm8, xmm0, xmm6) + a3(vpaddq xmm9, xmm1, xmm7) + a3(vpsrlq xmm10, xmm8, 51) + a3(vpsrlq xmm11, xmm9, 51) + a3(vpsllq xmm8, xmm8, 13) + a3(vpsllq xmm9, xmm9, 13) + a3(vpxor xmm5, xmm5, xmm10) + a3(vpxor xmm4, xmm4, xmm11) + a3(vpxor xmm5, xmm5, xmm8) + a3(vpxor xmm4, xmm4, xmm9) + a3(vpaddq xmm10, xmm6, xmm5) + a3(vpaddq xmm11, xmm7, xmm4) + a3(vpsrlq xmm8, xmm10, 25) + a3(vpsrlq xmm9, xmm11, 25) + a3(vpsllq xmm10, xmm10, 39) + a3(vpsllq xmm11, xmm11, 39) + a3(vpxor xmm2, xmm2, xmm8) + a3(vpxor xmm3, xmm3, xmm9) + a3(vpxor xmm2, xmm2, xmm10) + a3(vpxor xmm3, xmm3, xmm11) + a3(vpaddq xmm8, xmm5, xmm2) + a3(vpaddq xmm9, xmm4, xmm3) + a3(vpshufd xmm8, xmm8, 0xb1) + a3(vpshufd xmm9, xmm9, 0xb1) + a3(vpxor xmm0, xmm0, xmm8) + a3(vpxor xmm1, xmm1, xmm9) + a2(vmovdqa xmm10, xmm2) + a2(vmovdqa xmm11, xmm3) + a4(vpalignr xmm2, xmm6, xmm7, 8) + a4(vpalignr xmm3, xmm7, xmm6, 8) + a4(vpalignr xmm6, xmm11, xmm10, 8) + a4(vpalignr xmm7, xmm10, xmm11, 8) + a2(sub rax, 2) + aj(ja scrypt_salsa64_avx_loop) + a3(vpaddq xmm0,xmm0,[rsp+0]) + a3(vpaddq xmm1,xmm1,[rsp+16]) + a3(vpaddq xmm2,xmm2,[rsp+32]) + a3(vpaddq xmm3,xmm3,[rsp+48]) + a3(vpaddq xmm4,xmm4,[rsp+64]) + a3(vpaddq xmm5,xmm5,[rsp+80]) + a3(vpaddq xmm6,xmm6,[rsp+96]) + a3(vpaddq xmm7,xmm7,[rsp+112]) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0xff) + a2(add r9,128) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + a2(vmovdqa [rax+64],xmm4) + a2(vmovdqa [rax+80],xmm5) + a2(vmovdqa [rax+96],xmm6) + a2(vmovdqa [rax+112],xmm7) + aj(jne scrypt_ChunkMix_avx_loop) + a2(mov rsp, rbp) + a1(pop rbp) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_avx) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_AVX) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) + +#define SCRYPT_SALSA64_AVX + +static void asm_calling_convention +scrypt_ChunkMix_avx(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,x6,x7,t0,t1,t2,t3,t4,t5,t6,t7,z0,z1,z2,z3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + x4 = xmmp[4]; + x5 = xmmp[5]; + x6 = xmmp[6]; + x7 = xmmp[7]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + t4 = x4; + t5 = x5; + t6 = x6; + t7 = x7; + + for (rounds = 8; rounds; rounds -= 2) { + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x4 = _mm_xor_si128(x4, z2); + x5 = _mm_xor_si128(x5, z3); + x4 = _mm_xor_si128(x4, z0); + x5 = _mm_xor_si128(x5, z1); + + z0 = _mm_add_epi64(x4, x6); + z1 = _mm_add_epi64(x5, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x4); + z1 = _mm_add_epi64(x3, x5); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x5 = _mm_xor_si128(x5, z2); + x4 = _mm_xor_si128(x4, z3); + x5 = _mm_xor_si128(x5, z0); + x4 = _mm_xor_si128(x4, z1); + + z0 = _mm_add_epi64(x5, x6); + z1 = _mm_add_epi64(x4, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x5); + z1 = _mm_add_epi64(x3, x4); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + } + + x0 = _mm_add_epi64(x0, t0); + x1 = _mm_add_epi64(x1, t1); + x2 = _mm_add_epi64(x2, t2); + x3 = _mm_add_epi64(x3, t3); + x4 = _mm_add_epi64(x4, t4); + x5 = _mm_add_epi64(x5, t5); + x6 = _mm_add_epi64(x6, t6); + x7 = _mm_add_epi64(x7, t7); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + xmmp[4] = x4; + xmmp[5] = x5; + xmmp[6] = x6; + xmmp[7] = x7; + } +} + +#endif + +#if defined(SCRYPT_SALSA64_AVX) + /* uses salsa64_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa64/8-AVX" + #undef SCRYPT_SALSA64_INCLUDED + #define SCRYPT_SALSA64_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx2.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx2.h new file mode 100644 index 000000000..a42e808b2 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-avx2.h @@ -0,0 +1,221 @@ +/* x64 */ +#if defined(X86_64ASM_AVX2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA64_AVX2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_avx2)(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_avx2) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,7) + a2(lea r9,[rcx-128]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa ymm0,[rax+0]) + a2(vmovdqa ymm1,[rax+32]) + a2(vmovdqa ymm2,[rax+64]) + a2(vmovdqa ymm3,[rax+96]) + aj(jz scrypt_ChunkMix_avx2_no_xor1) + a3(vpxor ymm0,ymm0,[r9+0]) + a3(vpxor ymm1,ymm1,[r9+32]) + a3(vpxor ymm2,ymm2,[r9+64]) + a3(vpxor ymm3,ymm3,[r9+96]) + a1(scrypt_ChunkMix_avx2_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_avx2_loop:) + a2(and rdx, rdx) + a3(vpxor ymm0,ymm0,[rsi+r9+0]) + a3(vpxor ymm1,ymm1,[rsi+r9+32]) + a3(vpxor ymm2,ymm2,[rsi+r9+64]) + a3(vpxor ymm3,ymm3,[rsi+r9+96]) + aj(jz scrypt_ChunkMix_avx2_no_xor2) + a3(vpxor ymm0,ymm0,[rdx+r9+0]) + a3(vpxor ymm1,ymm1,[rdx+r9+32]) + a3(vpxor ymm2,ymm2,[rdx+r9+64]) + a3(vpxor ymm3,ymm3,[rdx+r9+96]) + a1(scrypt_ChunkMix_avx2_no_xor2:) + a2(vmovdqa ymm6,ymm0) + a2(vmovdqa ymm7,ymm1) + a2(vmovdqa ymm8,ymm2) + a2(vmovdqa ymm9,ymm3) + a2(mov rax,4) + a1(scrypt_salsa64_avx2_loop: ) + a3(vpaddq ymm4, ymm1, ymm0) + a3(vpshufd ymm4, ymm4, 0xb1) + a3(vpxor ymm3, ymm3, ymm4) + a3(vpaddq ymm4, ymm0, ymm3) + a3(vpsrlq ymm5, ymm4, 51) + a3(vpxor ymm2, ymm2, ymm5) + a3(vpsllq ymm4, ymm4, 13) + a3(vpxor ymm2, ymm2, ymm4) + a3(vpaddq ymm4, ymm3, ymm2) + a3(vpsrlq ymm5, ymm4, 25) + a3(vpxor ymm1, ymm1, ymm5) + a3(vpsllq ymm4, ymm4, 39) + a3(vpxor ymm1, ymm1, ymm4) + a3(vpaddq ymm4, ymm2, ymm1) + a3(vpshufd ymm4, ymm4, 0xb1) + a3(vpermq ymm1, ymm1, 0x39) + a3(vpermq ymm10, ymm2, 0x4e) + a3(vpxor ymm0, ymm0, ymm4) + a3(vpermq ymm3, ymm3, 0x93) + a3(vpaddq ymm4, ymm3, ymm0) + a3(vpshufd ymm4, ymm4, 0xb1) + a3(vpxor ymm1, ymm1, ymm4) + a3(vpaddq ymm4, ymm0, ymm1) + a3(vpsrlq ymm5, ymm4, 51) + a3(vpxor ymm10, ymm10, ymm5) + a3(vpsllq ymm4, ymm4, 13) + a3(vpxor ymm10, ymm10, ymm4) + a3(vpaddq ymm4, ymm1, ymm10) + a3(vpsrlq ymm5, ymm4, 25) + a3(vpxor ymm3, ymm3, ymm5) + a3(vpsllq ymm4, ymm4, 39) + a3(vpermq ymm1, ymm1, 0x93) + a3(vpxor ymm3, ymm3, ymm4) + a3(vpermq ymm2, ymm10, 0x4e) + a3(vpaddq ymm4, ymm10, ymm3) + a3(vpshufd ymm4, ymm4, 0xb1) + a3(vpermq ymm3, ymm3, 0x39) + a3(vpxor ymm0, ymm0, ymm4) + a1(dec rax) + aj(jnz scrypt_salsa64_avx2_loop) + a3(vpaddq ymm0,ymm0,ymm6) + a3(vpaddq ymm1,ymm1,ymm7) + a3(vpaddq ymm2,ymm2,ymm8) + a3(vpaddq ymm3,ymm3,ymm9) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0xff) + a2(add r9,128) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],ymm0) + a2(vmovdqa [rax+32],ymm1) + a2(vmovdqa [rax+64],ymm2) + a2(vmovdqa [rax+96],ymm3) + aj(jne scrypt_ChunkMix_avx2_loop) + a1(vzeroupper) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_avx2) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_AVX2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) + +#define SCRYPT_SALSA64_AVX2 + +static void asm_calling_convention +scrypt_ChunkMix_avx2(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + ymmi *ymmp,y0,y1,y2,y3,t0,t1,t2,t3,z0,z1; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + ymmp = (ymmi *)scrypt_block(Bin, blocksPerChunk - 1); + y0 = ymmp[0]; + y1 = ymmp[1]; + y2 = ymmp[2]; + y3 = ymmp[3]; + + if (Bxor) { + ymmp = (ymmi *)scrypt_block(Bxor, blocksPerChunk - 1); + y0 = _mm256_xor_si256(y0, ymmp[0]); + y1 = _mm256_xor_si256(y1, ymmp[1]); + y2 = _mm256_xor_si256(y2, ymmp[2]); + y3 = _mm256_xor_si256(y3, ymmp[3]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + ymmp = (ymmi *)scrypt_block(Bin, i); + y0 = _mm256_xor_si256(y0, ymmp[0]); + y1 = _mm256_xor_si256(y1, ymmp[1]); + y2 = _mm256_xor_si256(y2, ymmp[2]); + y3 = _mm256_xor_si256(y3, ymmp[3]); + + if (Bxor) { + ymmp = (ymmi *)scrypt_block(Bxor, i); + y0 = _mm256_xor_si256(y0, ymmp[0]); + y1 = _mm256_xor_si256(y1, ymmp[1]); + y2 = _mm256_xor_si256(y2, ymmp[2]); + y3 = _mm256_xor_si256(y3, ymmp[3]); + } + + t0 = y0; + t1 = y1; + t2 = y2; + t3 = y3; + + for (rounds = 8; rounds; rounds -= 2) { + z0 = _mm256_add_epi64(y0, y1); + z0 = _mm256_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + y3 = _mm256_xor_si256(y3, z0); + z0 = _mm256_add_epi64(y3, y0); + z1 = _mm256_srli_epi64(z0, 64-13); + y2 = _mm256_xor_si256(y2, z1); + z0 = _mm256_slli_epi64(z0, 13); + y2 = _mm256_xor_si256(y2, z0); + z0 = _mm256_add_epi64(y2, y3); + z1 = _mm256_srli_epi64(z0, 64-39); + y1 = _mm256_xor_si256(y1, z1); + z0 = _mm256_slli_epi64(z0, 39); + y1 = _mm256_xor_si256(y1, z0); + y1 = _mm256_permute4x64_epi64(y1, _MM_SHUFFLE(0,3,2,1)); + y2 = _mm256_permute4x64_epi64(y2, _MM_SHUFFLE(1,0,3,2)); + y3 = _mm256_permute4x64_epi64(y3, _MM_SHUFFLE(2,1,0,3)); + z0 = _mm256_add_epi64(y1, y2); + z0 = _mm256_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + y0 = _mm256_xor_si256(y0, z0); + z0 = _mm256_add_epi64(y0, y3); + z0 = _mm256_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + y1 = _mm256_xor_si256(y1, z0); + z0 = _mm256_add_epi64(y1, y0); + z1 = _mm256_srli_epi64(z0, 64-13); + y2 = _mm256_xor_si256(y2, z1); + z0 = _mm256_slli_epi64(z0, 13); + y2 = _mm256_xor_si256(y2, z0); + z0 = _mm256_add_epi64(y2, y1); + z1 = _mm256_srli_epi64(z0, 64-39); + y3 = _mm256_xor_si256(y3, z1); + z0 = _mm256_slli_epi64(z0, 39); + y3 = _mm256_xor_si256(y3, z0); + z0 = _mm256_add_epi64(y3, y2); + z0 = _mm256_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + y0 = _mm256_xor_si256(y0, z0); + y1 = _mm256_permute4x64_epi64(y1, _MM_SHUFFLE(2,1,0,3)); + y2 = _mm256_permute4x64_epi64(y2, _MM_SHUFFLE(1,0,3,2)); + y3 = _mm256_permute4x64_epi64(y3, _MM_SHUFFLE(0,3,2,1)); + } + + y0 = _mm256_add_epi64(y0, t0); + y1 = _mm256_add_epi64(y1, t1); + y2 = _mm256_add_epi64(y2, t2); + y3 = _mm256_add_epi64(y3, t3); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + ymmp = (ymmi *)scrypt_block(Bout, (i / 2) + half); + ymmp[0] = y0; + ymmp[1] = y1; + ymmp[2] = y2; + ymmp[3] = y3; + } +} + +#endif + +#if defined(SCRYPT_SALSA64_AVX2) + /* uses salsa64_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa64/8-AVX2" + #undef SCRYPT_SALSA64_INCLUDED + #define SCRYPT_SALSA64_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-sse2.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-sse2.h new file mode 100644 index 000000000..971d98a35 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-sse2.h @@ -0,0 +1,449 @@ +/* x64 */ +#if defined(X86_64ASM_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA64_SSE2 + +asm_naked_fn_proto(void, scrypt_ChunkMix_sse2)(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_sse2) + a1(push rbp) + a2(mov rbp, rsp) + a2(and rsp, ~63) + a2(sub rsp, 128) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,7) + a2(lea r9,[rcx-128]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(movdqa xmm0,[rax+0]) + a2(movdqa xmm1,[rax+16]) + a2(movdqa xmm2,[rax+32]) + a2(movdqa xmm3,[rax+48]) + a2(movdqa xmm4,[rax+64]) + a2(movdqa xmm5,[rax+80]) + a2(movdqa xmm6,[rax+96]) + a2(movdqa xmm7,[rax+112]) + aj(jz scrypt_ChunkMix_sse2_no_xor1) + a2(pxor xmm0,[r9+0]) + a2(pxor xmm1,[r9+16]) + a2(pxor xmm2,[r9+32]) + a2(pxor xmm3,[r9+48]) + a2(pxor xmm4,[r9+64]) + a2(pxor xmm5,[r9+80]) + a2(pxor xmm6,[r9+96]) + a2(pxor xmm7,[r9+112]) + a1(scrypt_ChunkMix_sse2_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_sse2_loop:) + a2(and rdx, rdx) + a2(pxor xmm0,[rsi+r9+0]) + a2(pxor xmm1,[rsi+r9+16]) + a2(pxor xmm2,[rsi+r9+32]) + a2(pxor xmm3,[rsi+r9+48]) + a2(pxor xmm4,[rsi+r9+64]) + a2(pxor xmm5,[rsi+r9+80]) + a2(pxor xmm6,[rsi+r9+96]) + a2(pxor xmm7,[rsi+r9+112]) + aj(jz scrypt_ChunkMix_sse2_no_xor2) + a2(pxor xmm0,[rdx+r9+0]) + a2(pxor xmm1,[rdx+r9+16]) + a2(pxor xmm2,[rdx+r9+32]) + a2(pxor xmm3,[rdx+r9+48]) + a2(pxor xmm4,[rdx+r9+64]) + a2(pxor xmm5,[rdx+r9+80]) + a2(pxor xmm6,[rdx+r9+96]) + a2(pxor xmm7,[rdx+r9+112]) + a1(scrypt_ChunkMix_sse2_no_xor2:) + a2(movdqa [rsp+0],xmm0) + a2(movdqa [rsp+16],xmm1) + a2(movdqa [rsp+32],xmm2) + a2(movdqa [rsp+48],xmm3) + a2(movdqa [rsp+64],xmm4) + a2(movdqa [rsp+80],xmm5) + a2(movdqa [rsp+96],xmm6) + a2(movdqa [rsp+112],xmm7) + a2(mov rax,8) + a1(scrypt_salsa64_sse2_loop: ) + a2(movdqa xmm8, xmm0) + a2(movdqa xmm9, xmm1) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm6, xmm8) + a2(pxor xmm7, xmm9) + a2(movdqa xmm10, xmm0) + a2(movdqa xmm11, xmm1) + a2(paddq xmm10, xmm6) + a2(paddq xmm11, xmm7) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 51) + a2(psrlq xmm11, 51) + a2(psllq xmm8, 13) + a2(psllq xmm9, 13) + a2(pxor xmm4, xmm10) + a2(pxor xmm5, xmm11) + a2(pxor xmm4, xmm8) + a2(pxor xmm5, xmm9) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(paddq xmm10, xmm4) + a2(paddq xmm11, xmm5) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 25) + a2(psrlq xmm11, 25) + a2(psllq xmm8, 39) + a2(psllq xmm9, 39) + a2(pxor xmm2, xmm10) + a2(pxor xmm3, xmm11) + a2(pxor xmm2, xmm8) + a2(pxor xmm3, xmm9) + a2(movdqa xmm8, xmm4) + a2(movdqa xmm9, xmm5) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm0, xmm8) + a2(pxor xmm1, xmm9) + a2(movdqa xmm8, xmm2) + a2(movdqa xmm9, xmm3) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(movdqa xmm2, xmm7) + a2(movdqa xmm3, xmm6) + a2(punpcklqdq xmm10, xmm6) + a2(punpcklqdq xmm11, xmm7) + a2(movdqa xmm6, xmm8) + a2(movdqa xmm7, xmm9) + a2(punpcklqdq xmm9, xmm9) + a2(punpcklqdq xmm8, xmm8) + a2(punpckhqdq xmm2, xmm10) + a2(punpckhqdq xmm3, xmm11) + a2(punpckhqdq xmm6, xmm9) + a2(punpckhqdq xmm7, xmm8) + a2(sub rax, 2) + a2(movdqa xmm8, xmm0) + a2(movdqa xmm9, xmm1) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm6, xmm8) + a2(pxor xmm7, xmm9) + a2(movdqa xmm10, xmm0) + a2(movdqa xmm11, xmm1) + a2(paddq xmm10, xmm6) + a2(paddq xmm11, xmm7) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 51) + a2(psrlq xmm11, 51) + a2(psllq xmm8, 13) + a2(psllq xmm9, 13) + a2(pxor xmm5, xmm10) + a2(pxor xmm4, xmm11) + a2(pxor xmm5, xmm8) + a2(pxor xmm4, xmm9) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(paddq xmm10, xmm5) + a2(paddq xmm11, xmm4) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 25) + a2(psrlq xmm11, 25) + a2(psllq xmm8, 39) + a2(psllq xmm9, 39) + a2(pxor xmm2, xmm10) + a2(pxor xmm3, xmm11) + a2(pxor xmm2, xmm8) + a2(pxor xmm3, xmm9) + a2(movdqa xmm8, xmm5) + a2(movdqa xmm9, xmm4) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm0, xmm8) + a2(pxor xmm1, xmm9) + a2(movdqa xmm8, xmm2) + a2(movdqa xmm9, xmm3) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(movdqa xmm2, xmm7) + a2(movdqa xmm3, xmm6) + a2(punpcklqdq xmm10, xmm6) + a2(punpcklqdq xmm11, xmm7) + a2(movdqa xmm6, xmm8) + a2(movdqa xmm7, xmm9) + a2(punpcklqdq xmm9, xmm9) + a2(punpcklqdq xmm8, xmm8) + a2(punpckhqdq xmm2, xmm10) + a2(punpckhqdq xmm3, xmm11) + a2(punpckhqdq xmm6, xmm9) + a2(punpckhqdq xmm7, xmm8) + aj(ja scrypt_salsa64_sse2_loop) + a2(paddq xmm0,[rsp+0]) + a2(paddq xmm1,[rsp+16]) + a2(paddq xmm2,[rsp+32]) + a2(paddq xmm3,[rsp+48]) + a2(paddq xmm4,[rsp+64]) + a2(paddq xmm5,[rsp+80]) + a2(paddq xmm6,[rsp+96]) + a2(paddq xmm7,[rsp+112]) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0xff) + a2(add r9,128) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(movdqa [rax+0],xmm0) + a2(movdqa [rax+16],xmm1) + a2(movdqa [rax+32],xmm2) + a2(movdqa [rax+48],xmm3) + a2(movdqa [rax+64],xmm4) + a2(movdqa [rax+80],xmm5) + a2(movdqa [rax+96],xmm6) + a2(movdqa [rax+112],xmm7) + aj(jne scrypt_ChunkMix_sse2_loop) + a2(mov rsp, rbp) + a1(pop rbp) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_sse2) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_SSE2) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) + +#define SCRYPT_SALSA64_SSE2 + +static void asm_calling_convention +scrypt_ChunkMix_sse2(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,x6,x7,t0,t1,t2,t3,t4,t5,t6,t7,z0,z1,z2,z3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + x4 = xmmp[4]; + x5 = xmmp[5]; + x6 = xmmp[6]; + x7 = xmmp[7]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + t4 = x4; + t5 = x5; + t6 = x6; + t7 = x7; + + for (rounds = 8; rounds; rounds -= 2) { + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x4 = _mm_xor_si128(x4, z2); + x5 = _mm_xor_si128(x5, z3); + x4 = _mm_xor_si128(x4, z0); + x5 = _mm_xor_si128(x5, z1); + + z0 = _mm_add_epi64(x4, x6); + z1 = _mm_add_epi64(x5, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x4); + z1 = _mm_add_epi64(x3, x5); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x4; + z1 = x5; + z2 = x2; + z3 = x3; + x4 = z1; + x5 = z0; + x2 = _mm_unpackhi_epi64(x7, _mm_unpacklo_epi64(x6, x6)); + x3 = _mm_unpackhi_epi64(x6, _mm_unpacklo_epi64(x7, x7)); + x6 = _mm_unpackhi_epi64(z2, _mm_unpacklo_epi64(z3, z3)); + x7 = _mm_unpackhi_epi64(z3, _mm_unpacklo_epi64(z2, z2)); + + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x4 = _mm_xor_si128(x4, z2); + x5 = _mm_xor_si128(x5, z3); + x4 = _mm_xor_si128(x4, z0); + x5 = _mm_xor_si128(x5, z1); + + z0 = _mm_add_epi64(x4, x6); + z1 = _mm_add_epi64(x5, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x4); + z1 = _mm_add_epi64(x3, x5); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x4; + z1 = x5; + z2 = x2; + z3 = x3; + x4 = z1; + x5 = z0; + x2 = _mm_unpackhi_epi64(x7, _mm_unpacklo_epi64(x6, x6)); + x3 = _mm_unpackhi_epi64(x6, _mm_unpacklo_epi64(x7, x7)); + x6 = _mm_unpackhi_epi64(z2, _mm_unpacklo_epi64(z3, z3)); + x7 = _mm_unpackhi_epi64(z3, _mm_unpacklo_epi64(z2, z2)); + } + + x0 = _mm_add_epi64(x0, t0); + x1 = _mm_add_epi64(x1, t1); + x2 = _mm_add_epi64(x2, t2); + x3 = _mm_add_epi64(x3, t3); + x4 = _mm_add_epi64(x4, t4); + x5 = _mm_add_epi64(x5, t5); + x6 = _mm_add_epi64(x6, t6); + x7 = _mm_add_epi64(x7, t7); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + xmmp[4] = x4; + xmmp[5] = x5; + xmmp[6] = x6; + xmmp[7] = x7; + } +} + +#endif + +#if defined(SCRYPT_SALSA64_SSE2) + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa64/8-SSE2" + #undef SCRYPT_SALSA64_INCLUDED + #define SCRYPT_SALSA64_INCLUDED +#endif + +/* sse3/avx use this as well */ +#if defined(SCRYPT_SALSA64_INCLUDED) + /* + Default layout: + 0 1 2 3 + 4 5 6 7 + 8 9 10 11 + 12 13 14 15 + + SSE2 layout: + 0 5 10 15 + 12 1 6 11 + 8 13 2 7 + 4 9 14 3 + */ + + + static void asm_calling_convention + salsa64_core_tangle_sse2(uint64_t *blocks, size_t count) { + uint64_t t; + while (count--) { + t = blocks[1]; blocks[1] = blocks[5]; blocks[5] = t; + t = blocks[2]; blocks[2] = blocks[10]; blocks[10] = t; + t = blocks[3]; blocks[3] = blocks[15]; blocks[15] = t; + t = blocks[4]; blocks[4] = blocks[12]; blocks[12] = t; + t = blocks[7]; blocks[7] = blocks[11]; blocks[11] = t; + t = blocks[9]; blocks[9] = blocks[13]; blocks[13] = t; + blocks += 16; + } + } +#endif \ No newline at end of file diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-ssse3.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-ssse3.h new file mode 100644 index 000000000..d18412835 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-ssse3.h @@ -0,0 +1,399 @@ +/* x64 */ +#if defined(X86_64ASM_SSSE3) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA64_SSSE3 + +asm_naked_fn_proto(void, scrypt_ChunkMix_ssse3)(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_ssse3) + a1(push rbp) + a2(mov rbp, rsp) + a2(and rsp, ~63) + a2(sub rsp, 128) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,7) + a2(lea r9,[rcx-128]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(movdqa xmm0,[rax+0]) + a2(movdqa xmm1,[rax+16]) + a2(movdqa xmm2,[rax+32]) + a2(movdqa xmm3,[rax+48]) + a2(movdqa xmm4,[rax+64]) + a2(movdqa xmm5,[rax+80]) + a2(movdqa xmm6,[rax+96]) + a2(movdqa xmm7,[rax+112]) + aj(jz scrypt_ChunkMix_ssse3_no_xor1) + a2(pxor xmm0,[r9+0]) + a2(pxor xmm1,[r9+16]) + a2(pxor xmm2,[r9+32]) + a2(pxor xmm3,[r9+48]) + a2(pxor xmm4,[r9+64]) + a2(pxor xmm5,[r9+80]) + a2(pxor xmm6,[r9+96]) + a2(pxor xmm7,[r9+112]) + a1(scrypt_ChunkMix_ssse3_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_ssse3_loop:) + a2(and rdx, rdx) + a2(pxor xmm0,[rsi+r9+0]) + a2(pxor xmm1,[rsi+r9+16]) + a2(pxor xmm2,[rsi+r9+32]) + a2(pxor xmm3,[rsi+r9+48]) + a2(pxor xmm4,[rsi+r9+64]) + a2(pxor xmm5,[rsi+r9+80]) + a2(pxor xmm6,[rsi+r9+96]) + a2(pxor xmm7,[rsi+r9+112]) + aj(jz scrypt_ChunkMix_ssse3_no_xor2) + a2(pxor xmm0,[rdx+r9+0]) + a2(pxor xmm1,[rdx+r9+16]) + a2(pxor xmm2,[rdx+r9+32]) + a2(pxor xmm3,[rdx+r9+48]) + a2(pxor xmm4,[rdx+r9+64]) + a2(pxor xmm5,[rdx+r9+80]) + a2(pxor xmm6,[rdx+r9+96]) + a2(pxor xmm7,[rdx+r9+112]) + a1(scrypt_ChunkMix_ssse3_no_xor2:) + a2(movdqa [rsp+0],xmm0) + a2(movdqa [rsp+16],xmm1) + a2(movdqa [rsp+32],xmm2) + a2(movdqa [rsp+48],xmm3) + a2(movdqa [rsp+64],xmm4) + a2(movdqa [rsp+80],xmm5) + a2(movdqa [rsp+96],xmm6) + a2(movdqa [rsp+112],xmm7) + a2(mov rax,8) + a1(scrypt_salsa64_ssse3_loop: ) + a2(movdqa xmm8, xmm0) + a2(movdqa xmm9, xmm1) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm6, xmm8) + a2(pxor xmm7, xmm9) + a2(movdqa xmm10, xmm0) + a2(movdqa xmm11, xmm1) + a2(paddq xmm10, xmm6) + a2(paddq xmm11, xmm7) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 51) + a2(psrlq xmm11, 51) + a2(psllq xmm8, 13) + a2(psllq xmm9, 13) + a2(pxor xmm4, xmm10) + a2(pxor xmm5, xmm11) + a2(pxor xmm4, xmm8) + a2(pxor xmm5, xmm9) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(paddq xmm10, xmm4) + a2(paddq xmm11, xmm5) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 25) + a2(psrlq xmm11, 25) + a2(psllq xmm8, 39) + a2(psllq xmm9, 39) + a2(pxor xmm2, xmm10) + a2(pxor xmm3, xmm11) + a2(pxor xmm2, xmm8) + a2(pxor xmm3, xmm9) + a2(movdqa xmm8, xmm4) + a2(movdqa xmm9, xmm5) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm0, xmm8) + a2(pxor xmm1, xmm9) + a2(movdqa xmm10, xmm2) + a2(movdqa xmm11, xmm3) + a2(movdqa xmm2, xmm6) + a2(movdqa xmm3, xmm7) + a3(palignr xmm2, xmm7, 8) + a3(palignr xmm3, xmm6, 8) + a2(movdqa xmm6, xmm11) + a2(movdqa xmm7, xmm10) + a3(palignr xmm6, xmm10, 8) + a3(palignr xmm7, xmm11, 8) + a2(sub rax, 2) + a2(movdqa xmm8, xmm0) + a2(movdqa xmm9, xmm1) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm6, xmm8) + a2(pxor xmm7, xmm9) + a2(movdqa xmm10, xmm0) + a2(movdqa xmm11, xmm1) + a2(paddq xmm10, xmm6) + a2(paddq xmm11, xmm7) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 51) + a2(psrlq xmm11, 51) + a2(psllq xmm8, 13) + a2(psllq xmm9, 13) + a2(pxor xmm5, xmm10) + a2(pxor xmm4, xmm11) + a2(pxor xmm5, xmm8) + a2(pxor xmm4, xmm9) + a2(movdqa xmm10, xmm6) + a2(movdqa xmm11, xmm7) + a2(paddq xmm10, xmm5) + a2(paddq xmm11, xmm4) + a2(movdqa xmm8, xmm10) + a2(movdqa xmm9, xmm11) + a2(psrlq xmm10, 25) + a2(psrlq xmm11, 25) + a2(psllq xmm8, 39) + a2(psllq xmm9, 39) + a2(pxor xmm2, xmm10) + a2(pxor xmm3, xmm11) + a2(pxor xmm2, xmm8) + a2(pxor xmm3, xmm9) + a2(movdqa xmm8, xmm5) + a2(movdqa xmm9, xmm4) + a2(paddq xmm8, xmm2) + a2(paddq xmm9, xmm3) + a3(pshufd xmm8, xmm8, 0xb1) + a3(pshufd xmm9, xmm9, 0xb1) + a2(pxor xmm0, xmm8) + a2(pxor xmm1, xmm9) + a2(movdqa xmm10, xmm2) + a2(movdqa xmm11, xmm3) + a2(movdqa xmm2, xmm6) + a2(movdqa xmm3, xmm7) + a3(palignr xmm2, xmm7, 8) + a3(palignr xmm3, xmm6, 8) + a2(movdqa xmm6, xmm11) + a2(movdqa xmm7, xmm10) + a3(palignr xmm6, xmm10, 8) + a3(palignr xmm7, xmm11, 8) + aj(ja scrypt_salsa64_ssse3_loop) + a2(paddq xmm0,[rsp+0]) + a2(paddq xmm1,[rsp+16]) + a2(paddq xmm2,[rsp+32]) + a2(paddq xmm3,[rsp+48]) + a2(paddq xmm4,[rsp+64]) + a2(paddq xmm5,[rsp+80]) + a2(paddq xmm6,[rsp+96]) + a2(paddq xmm7,[rsp+112]) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0xff) + a2(add r9,128) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(movdqa [rax+0],xmm0) + a2(movdqa [rax+16],xmm1) + a2(movdqa [rax+32],xmm2) + a2(movdqa [rax+48],xmm3) + a2(movdqa [rax+64],xmm4) + a2(movdqa [rax+80],xmm5) + a2(movdqa [rax+96],xmm6) + a2(movdqa [rax+112],xmm7) + aj(jne scrypt_ChunkMix_ssse3_loop) + a2(mov rsp, rbp) + a1(pop rbp) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_ssse3) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_SSSE3) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) + +#define SCRYPT_SALSA64_SSSE3 + +static void asm_calling_convention +scrypt_ChunkMix_ssse3(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,x6,x7,t0,t1,t2,t3,t4,t5,t6,t7,z0,z1,z2,z3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + x4 = xmmp[4]; + x5 = xmmp[5]; + x6 = xmmp[6]; + x7 = xmmp[7]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + t4 = x4; + t5 = x5; + t6 = x6; + t7 = x7; + + for (rounds = 8; rounds; rounds -= 2) { + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x4 = _mm_xor_si128(x4, z2); + x5 = _mm_xor_si128(x5, z3); + x4 = _mm_xor_si128(x4, z0); + x5 = _mm_xor_si128(x5, z1); + + z0 = _mm_add_epi64(x4, x6); + z1 = _mm_add_epi64(x5, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x4); + z1 = _mm_add_epi64(x3, x5); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z2 = _mm_srli_epi64(z0, 64-13); + z3 = _mm_srli_epi64(z1, 64-13); + z0 = _mm_slli_epi64(z0, 13); + z1 = _mm_slli_epi64(z1, 13); + x5 = _mm_xor_si128(x5, z2); + x4 = _mm_xor_si128(x4, z3); + x5 = _mm_xor_si128(x5, z0); + x4 = _mm_xor_si128(x4, z1); + + z0 = _mm_add_epi64(x5, x6); + z1 = _mm_add_epi64(x4, x7); + z2 = _mm_srli_epi64(z0, 64-39); + z3 = _mm_srli_epi64(z1, 64-39); + z0 = _mm_slli_epi64(z0, 39); + z1 = _mm_slli_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z2); + x3 = _mm_xor_si128(x3, z3); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x5); + z1 = _mm_add_epi64(x3, x4); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + } + + x0 = _mm_add_epi64(x0, t0); + x1 = _mm_add_epi64(x1, t1); + x2 = _mm_add_epi64(x2, t2); + x3 = _mm_add_epi64(x3, t3); + x4 = _mm_add_epi64(x4, t4); + x5 = _mm_add_epi64(x5, t5); + x6 = _mm_add_epi64(x6, t6); + x7 = _mm_add_epi64(x7, t7); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + xmmp[4] = x4; + xmmp[5] = x5; + xmmp[6] = x6; + xmmp[7] = x7; + } +} + +#endif + +#if defined(SCRYPT_SALSA64_SSSE3) + /* uses salsa64_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa64/8-SSSE3" + #undef SCRYPT_SALSA64_INCLUDED + #define SCRYPT_SALSA64_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-xop.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-xop.h new file mode 100644 index 000000000..d51d1121d --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64-xop.h @@ -0,0 +1,335 @@ +/* x64 */ +#if defined(X86_64ASM_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) && !defined(CPU_X86_FORCE_INTRINSICS) + +#define SCRYPT_SALSA64_XOP + +asm_naked_fn_proto(void, scrypt_ChunkMix_xop)(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) +asm_naked_fn(scrypt_ChunkMix_xop) + a1(push rbp) + a2(mov rbp, rsp) + a2(and rsp, ~63) + a2(sub rsp, 128) + a2(lea rcx,[ecx*2]) /* zero extend uint32_t by using ecx, win64 can leave garbage in the top half */ + a2(shl rcx,7) + a2(lea r9,[rcx-128]) + a2(lea rax,[rsi+r9]) + a2(lea r9,[rdx+r9]) + a2(and rdx, rdx) + a2(vmovdqa xmm0,[rax+0]) + a2(vmovdqa xmm1,[rax+16]) + a2(vmovdqa xmm2,[rax+32]) + a2(vmovdqa xmm3,[rax+48]) + a2(vmovdqa xmm4,[rax+64]) + a2(vmovdqa xmm5,[rax+80]) + a2(vmovdqa xmm6,[rax+96]) + a2(vmovdqa xmm7,[rax+112]) + aj(jz scrypt_ChunkMix_xop_no_xor1) + a3(vpxor xmm0,xmm0,[r9+0]) + a3(vpxor xmm1,xmm1,[r9+16]) + a3(vpxor xmm2,xmm2,[r9+32]) + a3(vpxor xmm3,xmm3,[r9+48]) + a3(vpxor xmm4,xmm4,[r9+64]) + a3(vpxor xmm5,xmm5,[r9+80]) + a3(vpxor xmm6,xmm6,[r9+96]) + a3(vpxor xmm7,xmm7,[r9+112]) + a1(scrypt_ChunkMix_xop_no_xor1:) + a2(xor r9,r9) + a2(xor r8,r8) + a1(scrypt_ChunkMix_xop_loop:) + a2(and rdx, rdx) + a3(vpxor xmm0,xmm0,[rsi+r9+0]) + a3(vpxor xmm1,xmm1,[rsi+r9+16]) + a3(vpxor xmm2,xmm2,[rsi+r9+32]) + a3(vpxor xmm3,xmm3,[rsi+r9+48]) + a3(vpxor xmm4,xmm4,[rsi+r9+64]) + a3(vpxor xmm5,xmm5,[rsi+r9+80]) + a3(vpxor xmm6,xmm6,[rsi+r9+96]) + a3(vpxor xmm7,xmm7,[rsi+r9+112]) + aj(jz scrypt_ChunkMix_xop_no_xor2) + a3(vpxor xmm0,xmm0,[rdx+r9+0]) + a3(vpxor xmm1,xmm1,[rdx+r9+16]) + a3(vpxor xmm2,xmm2,[rdx+r9+32]) + a3(vpxor xmm3,xmm3,[rdx+r9+48]) + a3(vpxor xmm4,xmm4,[rdx+r9+64]) + a3(vpxor xmm5,xmm5,[rdx+r9+80]) + a3(vpxor xmm6,xmm6,[rdx+r9+96]) + a3(vpxor xmm7,xmm7,[rdx+r9+112]) + a1(scrypt_ChunkMix_xop_no_xor2:) + a2(vmovdqa [rsp+0],xmm0) + a2(vmovdqa [rsp+16],xmm1) + a2(vmovdqa [rsp+32],xmm2) + a2(vmovdqa [rsp+48],xmm3) + a2(vmovdqa [rsp+64],xmm4) + a2(vmovdqa [rsp+80],xmm5) + a2(vmovdqa [rsp+96],xmm6) + a2(vmovdqa [rsp+112],xmm7) + a2(mov rax,8) + a1(scrypt_salsa64_xop_loop: ) + a3(vpaddq xmm8, xmm0, xmm2) + a3(vpaddq xmm9, xmm1, xmm3) + a3(vpshufd xmm8, xmm8, 0xb1) + a3(vpshufd xmm9, xmm9, 0xb1) + a3(vpxor xmm6, xmm6, xmm8) + a3(vpxor xmm7, xmm7, xmm9) + a3(vpaddq xmm10, xmm0, xmm6) + a3(vpaddq xmm11, xmm1, xmm7) + a3(vprotq xmm10, xmm10, 13) + a3(vprotq xmm11, xmm11, 13) + a3(vpxor xmm4, xmm4, xmm10) + a3(vpxor xmm5, xmm5, xmm11) + a3(vpaddq xmm8, xmm6, xmm4) + a3(vpaddq xmm9, xmm7, xmm5) + a3(vprotq xmm8, xmm8, 39) + a3(vprotq xmm9, xmm9, 39) + a3(vpxor xmm2, xmm2, xmm8) + a3(vpxor xmm3, xmm3, xmm9) + a3(vpaddq xmm10, xmm4, xmm2) + a3(vpaddq xmm11, xmm5, xmm3) + a3(vpshufd xmm10, xmm10, 0xb1) + a3(vpshufd xmm11, xmm11, 0xb1) + a3(vpxor xmm0, xmm0, xmm10) + a3(vpxor xmm1, xmm1, xmm11) + a2(vmovdqa xmm8, xmm2) + a2(vmovdqa xmm9, xmm3) + a4(vpalignr xmm2, xmm6, xmm7, 8) + a4(vpalignr xmm3, xmm7, xmm6, 8) + a4(vpalignr xmm6, xmm9, xmm8, 8) + a4(vpalignr xmm7, xmm8, xmm9, 8) + a3(vpaddq xmm10, xmm0, xmm2) + a3(vpaddq xmm11, xmm1, xmm3) + a3(vpshufd xmm10, xmm10, 0xb1) + a3(vpshufd xmm11, xmm11, 0xb1) + a3(vpxor xmm6, xmm6, xmm10) + a3(vpxor xmm7, xmm7, xmm11) + a3(vpaddq xmm8, xmm0, xmm6) + a3(vpaddq xmm9, xmm1, xmm7) + a3(vprotq xmm8, xmm8, 13) + a3(vprotq xmm9, xmm9, 13) + a3(vpxor xmm5, xmm5, xmm8) + a3(vpxor xmm4, xmm4, xmm9) + a3(vpaddq xmm10, xmm6, xmm5) + a3(vpaddq xmm11, xmm7, xmm4) + a3(vprotq xmm10, xmm10, 39) + a3(vprotq xmm11, xmm11, 39) + a3(vpxor xmm2, xmm2, xmm10) + a3(vpxor xmm3, xmm3, xmm11) + a3(vpaddq xmm8, xmm5, xmm2) + a3(vpaddq xmm9, xmm4, xmm3) + a3(vpshufd xmm8, xmm8, 0xb1) + a3(vpshufd xmm9, xmm9, 0xb1) + a3(vpxor xmm0, xmm0, xmm8) + a3(vpxor xmm1, xmm1, xmm9) + a2(vmovdqa xmm10, xmm2) + a2(vmovdqa xmm11, xmm3) + a4(vpalignr xmm2, xmm6, xmm7, 8) + a4(vpalignr xmm3, xmm7, xmm6, 8) + a4(vpalignr xmm6, xmm11, xmm10, 8) + a4(vpalignr xmm7, xmm10, xmm11, 8) + a2(sub rax, 2) + aj(ja scrypt_salsa64_xop_loop) + a3(vpaddq xmm0,xmm0,[rsp+0]) + a3(vpaddq xmm1,xmm1,[rsp+16]) + a3(vpaddq xmm2,xmm2,[rsp+32]) + a3(vpaddq xmm3,xmm3,[rsp+48]) + a3(vpaddq xmm4,xmm4,[rsp+64]) + a3(vpaddq xmm5,xmm5,[rsp+80]) + a3(vpaddq xmm6,xmm6,[rsp+96]) + a3(vpaddq xmm7,xmm7,[rsp+112]) + a2(lea rax,[r8+r9]) + a2(xor r8,rcx) + a2(and rax,~0xff) + a2(add r9,128) + a2(shr rax,1) + a2(add rax, rdi) + a2(cmp r9,rcx) + a2(vmovdqa [rax+0],xmm0) + a2(vmovdqa [rax+16],xmm1) + a2(vmovdqa [rax+32],xmm2) + a2(vmovdqa [rax+48],xmm3) + a2(vmovdqa [rax+64],xmm4) + a2(vmovdqa [rax+80],xmm5) + a2(vmovdqa [rax+96],xmm6) + a2(vmovdqa [rax+112],xmm7) + aj(jne scrypt_ChunkMix_xop_loop) + a2(mov rsp, rbp) + a1(pop rbp) + a1(ret) +asm_naked_fn_end(scrypt_ChunkMix_xop) + +#endif + + +/* intrinsic */ +#if defined(X86_INTRINSIC_XOP) && (!defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED)) + +#define SCRYPT_SALSA64_XOP + +static void asm_calling_convention +scrypt_ChunkMix_xop(uint64_t *Bout/*[chunkBytes]*/, uint64_t *Bin/*[chunkBytes]*/, uint64_t *Bxor/*[chunkBytes]*/, uint32_t r) { + uint32_t i, blocksPerChunk = r * 2, half = 0; + xmmi *xmmp,x0,x1,x2,x3,x4,x5,x6,x7,t0,t1,t2,t3,t4,t5,t6,t7,z0,z1,z2,z3; + size_t rounds; + + /* 1: X = B_{2r - 1} */ + xmmp = (xmmi *)scrypt_block(Bin, blocksPerChunk - 1); + x0 = xmmp[0]; + x1 = xmmp[1]; + x2 = xmmp[2]; + x3 = xmmp[3]; + x4 = xmmp[4]; + x5 = xmmp[5]; + x6 = xmmp[6]; + x7 = xmmp[7]; + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, blocksPerChunk - 1); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + xmmp = (xmmi *)scrypt_block(Bin, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + + if (Bxor) { + xmmp = (xmmi *)scrypt_block(Bxor, i); + x0 = _mm_xor_si128(x0, xmmp[0]); + x1 = _mm_xor_si128(x1, xmmp[1]); + x2 = _mm_xor_si128(x2, xmmp[2]); + x3 = _mm_xor_si128(x3, xmmp[3]); + x4 = _mm_xor_si128(x4, xmmp[4]); + x5 = _mm_xor_si128(x5, xmmp[5]); + x6 = _mm_xor_si128(x6, xmmp[6]); + x7 = _mm_xor_si128(x7, xmmp[7]); + } + + t0 = x0; + t1 = x1; + t2 = x2; + t3 = x3; + t4 = x4; + t5 = x5; + t6 = x6; + t7 = x7; + + for (rounds = 8; rounds; rounds -= 2) { + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z0 = _mm_roti_epi64(z0, 13); + z1 = _mm_roti_epi64(z1, 13); + x4 = _mm_xor_si128(x4, z0); + x5 = _mm_xor_si128(x5, z1); + + z0 = _mm_add_epi64(x4, x6); + z1 = _mm_add_epi64(x5, x7); + z0 = _mm_roti_epi64(z0, 39); + z1 = _mm_roti_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x4); + z1 = _mm_add_epi64(x3, x5); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + + z0 = _mm_add_epi64(x0, x2); + z1 = _mm_add_epi64(x1, x3); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x6 = _mm_xor_si128(x6, z0); + x7 = _mm_xor_si128(x7, z1); + + z0 = _mm_add_epi64(x6, x0); + z1 = _mm_add_epi64(x7, x1); + z0 = _mm_roti_epi64(z0, 13); + z1 = _mm_roti_epi64(z1, 13); + x5 = _mm_xor_si128(x5, z0); + x4 = _mm_xor_si128(x4, z1); + + z0 = _mm_add_epi64(x5, x6); + z1 = _mm_add_epi64(x4, x7); + z0 = _mm_roti_epi64(z0, 39); + z1 = _mm_roti_epi64(z1, 39); + x2 = _mm_xor_si128(x2, z0); + x3 = _mm_xor_si128(x3, z1); + + z0 = _mm_add_epi64(x2, x5); + z1 = _mm_add_epi64(x3, x4); + z0 = _mm_shuffle_epi32(z0, _MM_SHUFFLE(2,3,0,1)); + z1 = _mm_shuffle_epi32(z1, _MM_SHUFFLE(2,3,0,1)); + x0 = _mm_xor_si128(x0, z0); + x1 = _mm_xor_si128(x1, z1); + + z0 = x2; + z1 = x3; + x2 = _mm_alignr_epi8(x6, x7, 8); + x3 = _mm_alignr_epi8(x7, x6, 8); + x6 = _mm_alignr_epi8(z1, z0, 8); + x7 = _mm_alignr_epi8(z0, z1, 8); + } + + x0 = _mm_add_epi64(x0, t0); + x1 = _mm_add_epi64(x1, t1); + x2 = _mm_add_epi64(x2, t2); + x3 = _mm_add_epi64(x3, t3); + x4 = _mm_add_epi64(x4, t4); + x5 = _mm_add_epi64(x5, t5); + x6 = _mm_add_epi64(x6, t6); + x7 = _mm_add_epi64(x7, t7); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + xmmp = (xmmi *)scrypt_block(Bout, (i / 2) + half); + xmmp[0] = x0; + xmmp[1] = x1; + xmmp[2] = x2; + xmmp[3] = x3; + xmmp[4] = x4; + xmmp[5] = x5; + xmmp[6] = x6; + xmmp[7] = x7; + } +} + +#endif + +#if defined(SCRYPT_SALSA64_XOP) + /* uses salsa64_core_tangle_sse2 */ + + #undef SCRYPT_MIX + #define SCRYPT_MIX "Salsa64/8-XOP" + #undef SCRYPT_SALSA64_INCLUDED + #define SCRYPT_SALSA64_INCLUDED +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64.h b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64.h new file mode 100644 index 000000000..2aec04f33 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-mix_salsa64.h @@ -0,0 +1,41 @@ +#if !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_SALSA64_INCLUDED) + +#undef SCRYPT_MIX +#define SCRYPT_MIX "Salsa64/8 Ref" + +#undef SCRYPT_SALSA64_INCLUDED +#define SCRYPT_SALSA64_INCLUDED +#define SCRYPT_SALSA64_BASIC + +static void +salsa64_core_basic(uint64_t state[16]) { + const size_t rounds = 8; + uint64_t v[16], t; + size_t i; + + for (i = 0; i < 16; i++) v[i] = state[i]; + + #define G(a,b,c,d) \ + t = v[a]+v[d]; t = ROTL64(t, 32); v[b] ^= t; \ + t = v[b]+v[a]; t = ROTL64(t, 13); v[c] ^= t; \ + t = v[c]+v[b]; t = ROTL64(t, 39); v[d] ^= t; \ + t = v[d]+v[c]; t = ROTL64(t, 32); v[a] ^= t; \ + + for (i = 0; i < rounds; i += 2) { + G( 0, 4, 8,12); + G( 5, 9,13, 1); + G(10,14, 2, 6); + G(15, 3, 7,11); + G( 0, 1, 2, 3); + G( 5, 6, 7, 4); + G(10,11, 8, 9); + G(15,12,13,14); + } + + for (i = 0; i < 16; i++) state[i] += v[i]; + + #undef G +} + +#endif + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-pbkdf2.h b/deps/scrypt-jane-master/code/scrypt-jane-pbkdf2.h new file mode 100644 index 000000000..711e3d633 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-pbkdf2.h @@ -0,0 +1,112 @@ +typedef struct scrypt_hmac_state_t { + scrypt_hash_state inner, outer; +} scrypt_hmac_state; + + +static void +scrypt_hash(scrypt_hash_digest hash, const uint8_t *m, size_t mlen) { + scrypt_hash_state st; + scrypt_hash_init(&st); + scrypt_hash_update(&st, m, mlen); + scrypt_hash_finish(&st, hash); +} + +/* hmac */ +static void +scrypt_hmac_init(scrypt_hmac_state *st, const uint8_t *key, size_t keylen) { + uint8_t pad[SCRYPT_HASH_BLOCK_SIZE] = {0}; + size_t i; + + scrypt_hash_init(&st->inner); + scrypt_hash_init(&st->outer); + + if (keylen <= SCRYPT_HASH_BLOCK_SIZE) { + /* use the key directly if it's <= blocksize bytes */ + memcpy(pad, key, keylen); + } else { + /* if it's > blocksize bytes, hash it */ + scrypt_hash(pad, key, keylen); + } + + /* inner = (key ^ 0x36) */ + /* h(inner || ...) */ + for (i = 0; i < SCRYPT_HASH_BLOCK_SIZE; i++) + pad[i] ^= 0x36; + scrypt_hash_update(&st->inner, pad, SCRYPT_HASH_BLOCK_SIZE); + + /* outer = (key ^ 0x5c) */ + /* h(outer || ...) */ + for (i = 0; i < SCRYPT_HASH_BLOCK_SIZE; i++) + pad[i] ^= (0x5c ^ 0x36); + scrypt_hash_update(&st->outer, pad, SCRYPT_HASH_BLOCK_SIZE); + + scrypt_ensure_zero(pad, sizeof(pad)); +} + +static void +scrypt_hmac_update(scrypt_hmac_state *st, const uint8_t *m, size_t mlen) { + /* h(inner || m...) */ + scrypt_hash_update(&st->inner, m, mlen); +} + +static void +scrypt_hmac_finish(scrypt_hmac_state *st, scrypt_hash_digest mac) { + /* h(inner || m) */ + scrypt_hash_digest innerhash; + scrypt_hash_finish(&st->inner, innerhash); + + /* h(outer || h(inner || m)) */ + scrypt_hash_update(&st->outer, innerhash, sizeof(innerhash)); + scrypt_hash_finish(&st->outer, mac); + + scrypt_ensure_zero(st, sizeof(*st)); +} + +static void +scrypt_pbkdf2(const uint8_t *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint64_t N, uint8_t *out, size_t bytes) { + scrypt_hmac_state hmac_pw, hmac_pw_salt, work; + scrypt_hash_digest ti, u; + uint8_t be[4]; + uint32_t i, j, blocks; + uint64_t c; + + /* bytes must be <= (0xffffffff - (SCRYPT_HASH_DIGEST_SIZE - 1)), which they will always be under scrypt */ + + /* hmac(password, ...) */ + scrypt_hmac_init(&hmac_pw, password, password_len); + + /* hmac(password, salt...) */ + hmac_pw_salt = hmac_pw; + scrypt_hmac_update(&hmac_pw_salt, salt, salt_len); + + blocks = ((uint32_t)bytes + (SCRYPT_HASH_DIGEST_SIZE - 1)) / SCRYPT_HASH_DIGEST_SIZE; + for (i = 1; i <= blocks; i++) { + /* U1 = hmac(password, salt || be(i)) */ + U32TO8_BE(be, i); + work = hmac_pw_salt; + scrypt_hmac_update(&work, be, 4); + scrypt_hmac_finish(&work, ti); + memcpy(u, ti, sizeof(u)); + + /* T[i] = U1 ^ U2 ^ U3... */ + for (c = 0; c < N - 1; c++) { + /* UX = hmac(password, U{X-1}) */ + work = hmac_pw; + scrypt_hmac_update(&work, u, SCRYPT_HASH_DIGEST_SIZE); + scrypt_hmac_finish(&work, u); + + /* T[i] ^= UX */ + for (j = 0; j < sizeof(u); j++) + ti[j] ^= u[j]; + } + + memcpy(out, ti, (bytes > SCRYPT_HASH_DIGEST_SIZE) ? SCRYPT_HASH_DIGEST_SIZE : bytes); + out += SCRYPT_HASH_DIGEST_SIZE; + bytes -= SCRYPT_HASH_DIGEST_SIZE; + } + + scrypt_ensure_zero(ti, sizeof(ti)); + scrypt_ensure_zero(u, sizeof(u)); + scrypt_ensure_zero(&hmac_pw, sizeof(hmac_pw)); + scrypt_ensure_zero(&hmac_pw_salt, sizeof(hmac_pw_salt)); +} diff --git a/deps/scrypt-jane-master/code/scrypt-jane-portable-x86.h b/deps/scrypt-jane-master/code/scrypt-jane-portable-x86.h new file mode 100644 index 000000000..7c1209087 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-portable-x86.h @@ -0,0 +1,469 @@ +#if defined(CPU_X86) && (defined(COMPILER_MSVC) || defined(COMPILER_GCC)) + #define X86ASM + + /* gcc 2.95 royally screws up stack alignments on variables */ + #if ((defined(COMPILER_MSVC) && (COMPILER_MSVC >= COMPILER_MSVC_VS6PP)) || (defined(COMPILER_GCC) && (COMPILER_GCC >= 30000))) + #define X86ASM_SSE + #define X86ASM_SSE2 + #endif + #if ((defined(COMPILER_MSVC) && (COMPILER_MSVC >= COMPILER_MSVC_VS2005)) || (defined(COMPILER_GCC) && (COMPILER_GCC >= 40102))) + #define X86ASM_SSSE3 + #endif + #if ((defined(COMPILER_MSVC) && (COMPILER_MSVC >= COMPILER_MSVC_VS2010SP1)) || (defined(COMPILER_GCC) && (COMPILER_GCC >= 40400))) + #define X86ASM_AVX + #define X86ASM_XOP + #endif + #if ((defined(COMPILER_MSVC) && (COMPILER_MSVC >= COMPILER_MSVC_VS2012)) || (defined(COMPILER_GCC) && (COMPILER_GCC >= 40700))) + #define X86ASM_AVX2 + #endif +#endif + +#if defined(CPU_X86_64) && defined(COMPILER_GCC) + #define X86_64ASM + #define X86_64ASM_SSE2 + #if (COMPILER_GCC >= 40102) + #define X86_64ASM_SSSE3 + #endif + #if (COMPILER_GCC >= 40400) + #define X86_64ASM_AVX + #define X86_64ASM_XOP + #endif + #if (COMPILER_GCC >= 40700) + #define X86_64ASM_AVX2 + #endif +#endif + +#if defined(COMPILER_MSVC) && (defined(CPU_X86_FORCE_INTRINSICS) || defined(CPU_X86_64)) + #define X86_INTRINSIC + #if defined(CPU_X86_64) || defined(X86ASM_SSE) + #define X86_INTRINSIC_SSE + #endif + #if defined(CPU_X86_64) || defined(X86ASM_SSE2) + #define X86_INTRINSIC_SSE2 + #endif + #if (COMPILER_MSVC >= COMPILER_MSVC_VS2005) + #define X86_INTRINSIC_SSSE3 + #endif + #if (COMPILER_MSVC >= COMPILER_MSVC_VS2010SP1) + #define X86_INTRINSIC_AVX + #define X86_INTRINSIC_XOP + #endif + #if (COMPILER_MSVC >= COMPILER_MSVC_VS2012) + #define X86_INTRINSIC_AVX2 + #endif +#endif + +#if defined(COMPILER_GCC) && defined(CPU_X86_FORCE_INTRINSICS) + #define X86_INTRINSIC + #if defined(__SSE__) + #define X86_INTRINSIC_SSE + #endif + #if defined(__SSE2__) + #define X86_INTRINSIC_SSE2 + #endif + #if defined(__SSSE3__) + #define X86_INTRINSIC_SSSE3 + #endif + #if defined(__AVX__) + #define X86_INTRINSIC_AVX + #endif + #if defined(__XOP__) + #define X86_INTRINSIC_XOP + #endif + #if defined(__AVX2__) + #define X86_INTRINSIC_AVX2 + #endif +#endif + +/* only use simd on windows (or SSE2 on gcc)! */ +#if defined(CPU_X86_FORCE_INTRINSICS) || defined(X86_INTRINSIC) + #if defined(X86_INTRINSIC_SSE) + #include + #include + typedef __m64 qmm; + typedef __m128 xmm; + typedef __m128d xmmd; + #endif + #if defined(X86_INTRINSIC_SSE2) + #include + typedef __m128i xmmi; + #endif + #if defined(X86_INTRINSIC_SSSE3) + #include + #endif + #if defined(X86_INTRINSIC_AVX) + #include + #endif + #if defined(X86_INTRINSIC_XOP) + #if defined(COMPILER_MSVC) + #include + #else + #include + #endif + #endif + #if defined(X86_INTRINSIC_AVX2) + typedef __m256i ymmi; + #endif +#endif + +#if defined(X86_INTRINSIC_SSE2) + typedef union packedelem8_t { + uint8_t u[16]; + xmmi v; + } packedelem8; + + typedef union packedelem32_t { + uint32_t u[4]; + xmmi v; + } packedelem32; + + typedef union packedelem64_t { + uint64_t u[2]; + xmmi v; + } packedelem64; +#else + typedef union packedelem8_t { + uint8_t u[16]; + uint32_t dw[4]; + } packedelem8; + + typedef union packedelem32_t { + uint32_t u[4]; + uint8_t b[16]; + } packedelem32; + + typedef union packedelem64_t { + uint64_t u[2]; + uint8_t b[16]; + } packedelem64; +#endif + +#if defined(X86_INTRINSIC_SSSE3) + static const packedelem8 ALIGN(16) ssse3_rotl16_32bit = {{2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13}}; + static const packedelem8 ALIGN(16) ssse3_rotl8_32bit = {{3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14}}; +#endif + +/* + x86 inline asm for gcc/msvc. usage: + + asm_naked_fn_proto(return_type, name) (type parm1, type parm2..) + asm_naked_fn(name) + a1(..) + a2(.., ..) + a3(.., .., ..) + 64bit OR 0 paramters: a1(ret) + 32bit AND n parameters: aret(4n), eg aret(16) for 4 parameters + asm_naked_fn_end(name) +*/ + +#if defined(X86ASM) || defined(X86_64ASM) + +#if defined(COMPILER_MSVC) + #pragma warning(disable : 4731) /* frame pointer modified by inline assembly */ + #define a1(x) __asm {x} + #define a2(x, y) __asm {x, y} + #define a3(x, y, z) __asm {x, y, z} + #define a4(x, y, z, w) __asm {x, y, z, w} + #define aj(x) __asm {x} + #define asm_align8 a1(ALIGN 8) + #define asm_align16 a1(ALIGN 16) + + #define asm_calling_convention STDCALL + #define aret(n) a1(ret n) + #define asm_naked_fn_proto(type, fn) static NAKED type asm_calling_convention fn + #define asm_naked_fn(fn) { + #define asm_naked_fn_end(fn) } +#elif defined(COMPILER_GCC) + #define GNU_AS1(x) #x ";\n" + #define GNU_AS2(x, y) #x ", " #y ";\n" + #define GNU_AS3(x, y, z) #x ", " #y ", " #z ";\n" + #define GNU_AS4(x, y, z, w) #x ", " #y ", " #z ", " #w ";\n" + #define GNU_ASFN(x) "\n_" #x ":\n" #x ":\n" + #define GNU_ASJ(x) ".att_syntax prefix\n" #x "\n.intel_syntax noprefix\n" + + #define a1(x) GNU_AS1(x) + #define a2(x, y) GNU_AS2(x, y) + #define a3(x, y, z) GNU_AS3(x, y, z) + #define a4(x, y, z, w) GNU_AS4(x, y, z, w) + #define aj(x) GNU_ASJ(x) + #define asm_align8 ".p2align 3,,7" + #define asm_align16 ".p2align 4,,15" + + #if defined(OS_WINDOWS) + #define asm_calling_convention CDECL + #define aret(n) a1(ret) + + #if defined(X86_64ASM) + #define asm_naked_fn(fn) ; __asm__ ( \ + ".text\n" \ + asm_align16 GNU_ASFN(fn) \ + "subq $136, %rsp;" \ + "movdqa %xmm6, 0(%rsp);" \ + "movdqa %xmm7, 16(%rsp);" \ + "movdqa %xmm8, 32(%rsp);" \ + "movdqa %xmm9, 48(%rsp);" \ + "movdqa %xmm10, 64(%rsp);" \ + "movdqa %xmm11, 80(%rsp);" \ + "movdqa %xmm12, 96(%rsp);" \ + "movq %rdi, 112(%rsp);" \ + "movq %rsi, 120(%rsp);" \ + "movq %rcx, %rdi;" \ + "movq %rdx, %rsi;" \ + "movq %r8, %rdx;" \ + "movq %r9, %rcx;" \ + "call 1f;" \ + "movdqa 0(%rsp), %xmm6;" \ + "movdqa 16(%rsp), %xmm7;" \ + "movdqa 32(%rsp), %xmm8;" \ + "movdqa 48(%rsp), %xmm9;" \ + "movdqa 64(%rsp), %xmm10;" \ + "movdqa 80(%rsp), %xmm11;" \ + "movdqa 96(%rsp), %xmm12;" \ + "movq 112(%rsp), %rdi;" \ + "movq 120(%rsp), %rsi;" \ + "addq $136, %rsp;" \ + "ret;" \ + ".intel_syntax noprefix;" \ + ".p2align 4,,15;" \ + "1:;" + #else + #define asm_naked_fn(fn) ; __asm__ (".intel_syntax noprefix;\n.text\n" asm_align16 GNU_ASFN(fn) + #endif + #else + #define asm_calling_convention STDCALL + #define aret(n) a1(ret n) + #define asm_naked_fn(fn) ; __asm__ (".intel_syntax noprefix;\n.text\n" asm_align16 GNU_ASFN(fn) + #endif + + #define asm_naked_fn_proto(type, fn) extern type asm_calling_convention fn + #define asm_naked_fn_end(fn) ".att_syntax prefix;\n" ); + + #define asm_gcc() __asm__ __volatile__(".intel_syntax noprefix;\n" + #define asm_gcc_parms() ".att_syntax prefix;" + #define asm_gcc_trashed() __asm__ __volatile__("" ::: + #define asm_gcc_end() ); +#else + need x86 asm +#endif + +#endif /* X86ASM || X86_64ASM */ + + +#if defined(CPU_X86) || defined(CPU_X86_64) + +typedef enum cpu_flags_x86_t { + cpu_mmx = 1 << 0, + cpu_sse = 1 << 1, + cpu_sse2 = 1 << 2, + cpu_sse3 = 1 << 3, + cpu_ssse3 = 1 << 4, + cpu_sse4_1 = 1 << 5, + cpu_sse4_2 = 1 << 6, + cpu_avx = 1 << 7, + cpu_xop = 1 << 8, + cpu_avx2 = 1 << 9 +} cpu_flags_x86; + +typedef enum cpu_vendors_x86_t { + cpu_nobody, + cpu_intel, + cpu_amd +} cpu_vendors_x86; + +typedef struct x86_regs_t { + uint32_t eax, ebx, ecx, edx; +} x86_regs; + +#if defined(X86ASM) +asm_naked_fn_proto(int, has_cpuid)(void) +asm_naked_fn(has_cpuid) + a1(pushfd) + a1(pop eax) + a2(mov ecx, eax) + a2(xor eax, 0x200000) + a1(push eax) + a1(popfd) + a1(pushfd) + a1(pop eax) + a2(xor eax, ecx) + a2(shr eax, 21) + a2(and eax, 1) + a1(push ecx) + a1(popfd) + a1(ret) +asm_naked_fn_end(has_cpuid) +#endif /* X86ASM */ + + +static void NOINLINE +get_cpuid(x86_regs *regs, uint32_t flags) { +#if defined(COMPILER_MSVC) + __cpuid((int *)regs, (int)flags); +#else + #if defined(CPU_X86_64) + #define cpuid_bx rbx + #else + #define cpuid_bx ebx + #endif + + asm_gcc() + a1(push cpuid_bx) + a2(xor ecx, ecx) + a1(cpuid) + a2(mov [%1 + 0], eax) + a2(mov [%1 + 4], ebx) + a2(mov [%1 + 8], ecx) + a2(mov [%1 + 12], edx) + a1(pop cpuid_bx) + asm_gcc_parms() : "+a"(flags) : "S"(regs) : "%ecx", "%edx", "cc" + asm_gcc_end() +#endif +} + +#if defined(X86ASM_AVX) || defined(X86_64ASM_AVX) +static uint64_t NOINLINE +get_xgetbv(uint32_t flags) { +#if defined(COMPILER_MSVC) + return _xgetbv(flags); +#else + uint32_t lo, hi; + asm_gcc() + a1(xgetbv) + asm_gcc_parms() : "+c"(flags), "=a" (lo), "=d" (hi) + asm_gcc_end() + return ((uint64_t)lo | ((uint64_t)hi << 32)); +#endif +} +#endif // AVX support + +#if defined(SCRYPT_TEST_SPEED) +size_t cpu_detect_mask = (size_t)-1; +#endif + +static size_t +detect_cpu(void) { + union { uint8_t s[12]; uint32_t i[3]; } vendor_string; + cpu_vendors_x86 vendor = cpu_nobody; + x86_regs regs; + uint32_t max_level, max_ext_level; + size_t cpu_flags = 0; +#if defined(X86ASM_AVX) || defined(X86_64ASM_AVX) + uint64_t xgetbv_flags; +#endif + +#if defined(CPU_X86) + if (!has_cpuid()) + return cpu_flags; +#endif + + get_cpuid(®s, 0); + max_level = regs.eax; + vendor_string.i[0] = regs.ebx; + vendor_string.i[1] = regs.edx; + vendor_string.i[2] = regs.ecx; + + if (scrypt_verify(vendor_string.s, (const uint8_t *)"GenuineIntel", 12)) + vendor = cpu_intel; + else if (scrypt_verify(vendor_string.s, (const uint8_t *)"AuthenticAMD", 12)) + vendor = cpu_amd; + + if (max_level & 0x00000500) { + /* "Intel P5 pre-B0" */ + cpu_flags |= cpu_mmx; + return cpu_flags; + } + + if (max_level < 1) + return cpu_flags; + + get_cpuid(®s, 1); +#if defined(X86ASM_AVX) || defined(X86_64ASM_AVX) + /* xsave/xrestore */ + if (regs.ecx & (1 << 27)) { + xgetbv_flags = get_xgetbv(0); + if ((regs.ecx & (1 << 28)) && (xgetbv_flags & 0x6)) cpu_flags |= cpu_avx; + } +#endif + if (regs.ecx & (1 << 20)) cpu_flags |= cpu_sse4_2; + if (regs.ecx & (1 << 19)) cpu_flags |= cpu_sse4_2; + if (regs.ecx & (1 << 9)) cpu_flags |= cpu_ssse3; + if (regs.ecx & (1 )) cpu_flags |= cpu_sse3; + if (regs.edx & (1 << 26)) cpu_flags |= cpu_sse2; + if (regs.edx & (1 << 25)) cpu_flags |= cpu_sse; + if (regs.edx & (1 << 23)) cpu_flags |= cpu_mmx; + + if (cpu_flags & cpu_avx) { + if (max_level >= 7) { + get_cpuid(®s, 7); + if (regs.ebx & (1 << 5)) cpu_flags |= cpu_avx2; + } + + get_cpuid(®s, 0x80000000); + max_ext_level = regs.eax; + if (max_ext_level >= 0x80000001) { + get_cpuid(®s, 0x80000001); + if (regs.ecx & (1 << 11)) cpu_flags |= cpu_xop; + } + } + + +#if defined(SCRYPT_TEST_SPEED) + cpu_flags &= cpu_detect_mask; +#endif + + return cpu_flags; +} + +#if defined(SCRYPT_TEST_SPEED) +static const char * +get_top_cpuflag_desc(size_t flag) { + if (flag & cpu_avx2) return "AVX2"; + else if (flag & cpu_xop) return "XOP"; + else if (flag & cpu_avx) return "AVX"; + else if (flag & cpu_sse4_2) return "SSE4.2"; + else if (flag & cpu_sse4_1) return "SSE4.1"; + else if (flag & cpu_ssse3) return "SSSE3"; + else if (flag & cpu_sse2) return "SSE2"; + else if (flag & cpu_sse) return "SSE"; + else if (flag & cpu_mmx) return "MMX"; + else return "Basic"; +} +#endif + +/* enable the highest system-wide option */ +#if defined(SCRYPT_CHOOSE_COMPILETIME) + #if !defined(__AVX2__) + #undef X86_64ASM_AVX2 + #undef X86ASM_AVX2 + #undef X86_INTRINSIC_AVX2 + #endif + #if !defined(__XOP__) + #undef X86_64ASM_XOP + #undef X86ASM_XOP + #undef X86_INTRINSIC_XOP + #endif + #if !defined(__AVX__) + #undef X86_64ASM_AVX + #undef X86ASM_AVX + #undef X86_INTRINSIC_AVX + #endif + #if !defined(__SSSE3__) + #undef X86_64ASM_SSSE3 + #undef X86ASM_SSSE3 + #undef X86_INTRINSIC_SSSE3 + #endif + #if !defined(__SSE2__) + #undef X86_64ASM_SSE2 + #undef X86ASM_SSE2 + #undef X86_INTRINSIC_SSE2 + #endif +#endif + +#else + +static size_t +detect_cpu(void) { + return 0; +} + +#endif /* defined(CPU_X86) || defined(CPU_X86_64) */ \ No newline at end of file diff --git a/deps/scrypt-jane-master/code/scrypt-jane-portable.h b/deps/scrypt-jane-master/code/scrypt-jane-portable.h new file mode 100644 index 000000000..29095a10f --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-portable.h @@ -0,0 +1,307 @@ +/* determine os */ +#if defined(_WIN32) || defined(_WIN64) || defined(__TOS_WIN__) || defined(__WINDOWS__) + #include + #include + #define OS_WINDOWS +#elif defined(sun) || defined(__sun) || defined(__SVR4) || defined(__svr4__) + #include + #include + #include + + #define OS_SOLARIS +#else + #include + #include + #include /* need this to define BSD */ + #include + #include + + #define OS_NIX + #if defined(__linux__) + #include + #define OS_LINUX + #elif defined(BSD) + #define OS_BSD + + #if defined(MACOS_X) || (defined(__APPLE__) & defined(__MACH__)) + #define OS_OSX + #elif defined(macintosh) || defined(Macintosh) + #define OS_MAC + #elif defined(__OpenBSD__) + #define OS_OPENBSD + #endif + #endif +#endif + + +/* determine compiler */ +#if defined(_MSC_VER) + #define COMPILER_MSVC_VS6 120000000 + #define COMPILER_MSVC_VS6PP 121000000 + #define COMPILER_MSVC_VS2002 130000000 + #define COMPILER_MSVC_VS2003 131000000 + #define COMPILER_MSVC_VS2005 140050727 + #define COMPILER_MSVC_VS2008 150000000 + #define COMPILER_MSVC_VS2008SP1 150030729 + #define COMPILER_MSVC_VS2010 160000000 + #define COMPILER_MSVC_VS2010SP1 160040219 + #define COMPILER_MSVC_VS2012RC 170000000 + #define COMPILER_MSVC_VS2012 170050727 + + #if _MSC_FULL_VER > 100000000 + #define COMPILER_MSVC (_MSC_FULL_VER) + #else + #define COMPILER_MSVC (_MSC_FULL_VER * 10) + #endif + + #if ((_MSC_VER == 1200) && defined(_mm_free)) + #undef COMPILER_MSVC + #define COMPILER_MSVC COMPILER_MSVC_VS6PP + #endif + + #pragma warning(disable : 4127) /* conditional expression is constant */ + #pragma warning(disable : 4100) /* unreferenced formal parameter */ + + #define _CRT_SECURE_NO_WARNINGS + #include + #include /* _rotl */ + #include + + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + typedef signed int int32_t; + typedef unsigned __int64 uint64_t; + typedef signed __int64 int64_t; + + #define ROTL32(a,b) _rotl(a,b) + #define ROTR32(a,b) _rotr(a,b) + #define ROTL64(a,b) _rotl64(a,b) + #define ROTR64(a,b) _rotr64(a,b) + #undef NOINLINE + #define NOINLINE __declspec(noinline) + #undef NORETURN + #define NORETURN + #undef INLINE + #define INLINE __forceinline + #undef FASTCALL + #define FASTCALL __fastcall + #undef CDECL + #define CDECL __cdecl + #undef STDCALL + #define STDCALL __stdcall + #undef NAKED + #define NAKED __declspec(naked) + #define JANE_ALIGN(n) __declspec(align(n)) +#endif +#if defined(__ICC) + #define COMPILER_INTEL +#endif +#if defined(__GNUC__) + #if (__GNUC__ >= 3) + #define COMPILER_GCC_PATCHLEVEL __GNUC_PATCHLEVEL__ + #else + #define COMPILER_GCC_PATCHLEVEL 0 + #endif + #define COMPILER_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + COMPILER_GCC_PATCHLEVEL) + #define ROTL32(a,b) (((a) << (b)) | ((a) >> (32 - b))) + #define ROTR32(a,b) (((a) >> (b)) | ((a) << (32 - b))) + #define ROTL64(a,b) (((a) << (b)) | ((a) >> (64 - b))) + #define ROTR64(a,b) (((a) >> (b)) | ((a) << (64 - b))) + #undef NOINLINE + #if (COMPILER_GCC >= 30000) + #define NOINLINE __attribute__((noinline)) + #else + #define NOINLINE + #endif + #undef NORETURN + #if (COMPILER_GCC >= 30000) + #define NORETURN __attribute__((noreturn)) + #else + #define NORETURN + #endif + #undef INLINE + #if (COMPILER_GCC >= 30000) + #define INLINE __attribute__((always_inline)) + #else + #define INLINE inline + #endif + #undef FASTCALL + #if (COMPILER_GCC >= 30400) + #define FASTCALL __attribute__((fastcall)) + #else + #define FASTCALL + #endif + #undef CDECL + #define CDECL __attribute__((cdecl)) + #undef STDCALL + #define STDCALL __attribute__((stdcall)) + #define JANE_ALIGN(n) __attribute__((aligned(n))) + #include +#endif +#if defined(__MINGW32__) || defined(__MINGW64__) + #define COMPILER_MINGW +#endif +#if defined(__PATHCC__) + #define COMPILER_PATHCC +#endif + +#define OPTIONAL_INLINE +#if defined(OPTIONAL_INLINE) + #undef OPTIONAL_INLINE + #define OPTIONAL_INLINE INLINE +#else + #define OPTIONAL_INLINE +#endif + +#define CRYPTO_FN NOINLINE STDCALL + +/* determine cpu */ +#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__ ) || defined(_M_X64) + #define CPU_X86_64 +#elif defined(__i586__) || defined(__i686__) || (defined(_M_IX86) && (_M_IX86 >= 500)) + #define CPU_X86 500 +#elif defined(__i486__) || (defined(_M_IX86) && (_M_IX86 >= 400)) + #define CPU_X86 400 +#elif defined(__i386__) || (defined(_M_IX86) && (_M_IX86 >= 300)) || defined(__X86__) || defined(_X86_) || defined(__I86__) + #define CPU_X86 300 +#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) || defined(__ia64) + #define CPU_IA64 +#endif + +#if defined(__sparc__) || defined(__sparc) || defined(__sparcv9) + #define CPU_SPARC + #if defined(__sparcv9) + #define CPU_SPARC64 + #endif +#endif + +#if defined(CPU_X86_64) || defined(CPU_IA64) || defined(CPU_SPARC64) || defined(__64BIT__) || defined(__LP64__) || defined(_LP64) || (defined(_MIPS_SZLONG) && (_MIPS_SZLONG == 64)) + #define CPU_64BITS + #undef FASTCALL + #define FASTCALL + #undef CDECL + #define CDECL + #undef STDCALL + #define STDCALL +#endif + +#if defined(powerpc) || defined(__PPC__) || defined(__ppc__) || defined(_ARCH_PPC) || defined(__powerpc__) || defined(__powerpc) || defined(POWERPC) || defined(_M_PPC) + #define CPU_PPC + #if defined(_ARCH_PWR7) + #define CPU_POWER7 + #elif defined(__64BIT__) + #define CPU_PPC64 + #else + #define CPU_PPC32 + #endif +#endif + +#if defined(__hppa__) || defined(__hppa) + #define CPU_HPPA +#endif + +#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) + #define CPU_ALPHA +#endif + +/* endian */ + +#if ((defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || \ + (defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && (BYTE_ORDER == LITTLE_ENDIAN)) || \ + (defined(CPU_X86) || defined(CPU_X86_64)) || \ + (defined(vax) || defined(MIPSEL) || defined(_MIPSEL))) +#define CPU_LE +#elif ((defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN)) || \ + (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)) || \ + (defined(CPU_SPARC) || defined(CPU_PPC) || defined(mc68000) || defined(sel)) || defined(_MIPSEB)) +#define CPU_BE +#else + /* unknown endian! */ +#endif + + +#define U8TO32_BE(p) \ + (((uint32_t)((p)[0]) << 24) | ((uint32_t)((p)[1]) << 16) | \ + ((uint32_t)((p)[2]) << 8) | ((uint32_t)((p)[3]) )) + +#define U8TO32_LE(p) \ + (((uint32_t)((p)[0]) ) | ((uint32_t)((p)[1]) << 8) | \ + ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24)) + +#define U32TO8_BE(p, v) \ + (p)[0] = (uint8_t)((v) >> 24); (p)[1] = (uint8_t)((v) >> 16); \ + (p)[2] = (uint8_t)((v) >> 8); (p)[3] = (uint8_t)((v) ); + +#define U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v) ); (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); (p)[3] = (uint8_t)((v) >> 24); + +#define U8TO64_BE(p) \ + (((uint64_t)U8TO32_BE(p) << 32) | (uint64_t)U8TO32_BE((p) + 4)) + +#define U8TO64_LE(p) \ + (((uint64_t)U8TO32_LE(p)) | ((uint64_t)U8TO32_LE((p) + 4) << 32)) + +#define U64TO8_BE(p, v) \ + U32TO8_BE((p), (uint32_t)((v) >> 32)); \ + U32TO8_BE((p) + 4, (uint32_t)((v) )); + +#define U64TO8_LE(p, v) \ + U32TO8_LE((p), (uint32_t)((v) )); \ + U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); + +#define U32_SWAP(v) { \ + (v) = (((v) << 8) & 0xFF00FF00 ) | (((v) >> 8) & 0xFF00FF ); \ + (v) = ((v) << 16) | ((v) >> 16); \ +} + +#define U64_SWAP(v) { \ + (v) = (((v) << 8) & 0xFF00FF00FF00FF00ull ) | (((v) >> 8) & 0x00FF00FF00FF00FFull ); \ + (v) = (((v) << 16) & 0xFFFF0000FFFF0000ull ) | (((v) >> 16) & 0x0000FFFF0000FFFFull ); \ + (v) = ((v) << 32) | ((v) >> 32); \ +} + +static int +scrypt_verify(const uint8_t *x, const uint8_t *y, size_t len) { + uint32_t differentbits = 0; + while (len--) + differentbits |= (*x++ ^ *y++); + return (1 & ((differentbits - 1) >> 8)); +} + +static void +scrypt_ensure_zero(void *p, size_t len) { +#if ((defined(CPU_X86) || defined(CPU_X86_64)) && defined(COMPILER_MSVC)) + __stosb((unsigned char *)p, 0, len); +#elif (defined(CPU_X86) && defined(COMPILER_GCC)) + __asm__ __volatile__( + "pushl %%edi;\n" + "pushl %%ecx;\n" + "rep stosb;\n" + "popl %%ecx;\n" + "popl %%edi;\n" + :: "a"(0), "D"(p), "c"(len) : "cc", "memory" + ); +#elif (defined(CPU_X86_64) && defined(COMPILER_GCC)) + __asm__ __volatile__( + "pushq %%rdi;\n" + "pushq %%rcx;\n" + "rep stosb;\n" + "popq %%rcx;\n" + "popq %%rdi;\n" + :: "a"(0), "D"(p), "c"(len) : "cc", "memory" + ); +#else + volatile uint8_t *b = (volatile uint8_t *)p; + size_t i; + for (i = 0; i < len; i++) + b[i] = 0; +#endif +} + +#include "scrypt-jane-portable-x86.h" + +#if !defined(asm_calling_convention) +#define asm_calling_convention +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-romix-basic.h b/deps/scrypt-jane-master/code/scrypt-jane-romix-basic.h new file mode 100644 index 000000000..16b59095d --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-romix-basic.h @@ -0,0 +1,74 @@ +#if !defined(SCRYPT_CHOOSE_COMPILETIME) +/* function type returned by scrypt_getROMix, used with cpu detection */ +typedef void (FASTCALL *scrypt_ROMixfn)(scrypt_mix_word_t *X/*[chunkWords]*/, scrypt_mix_word_t *Y/*[chunkWords]*/, scrypt_mix_word_t *V/*[chunkWords * N]*/, uint32_t N, uint32_t r); +#endif + +/* romix pre/post nop function */ +static void asm_calling_convention +scrypt_romix_nop(scrypt_mix_word_t *blocks, size_t nblocks) { + (void)blocks; (void)nblocks; +} + +/* romix pre/post endian conversion function */ +static void asm_calling_convention +scrypt_romix_convert_endian(scrypt_mix_word_t *blocks, size_t nblocks) { +#if !defined(CPU_LE) + static const union { uint8_t b[2]; uint16_t w; } endian_test = {{1,0}}; + size_t i; + if (endian_test.w == 0x100) { + nblocks *= SCRYPT_BLOCK_WORDS; + for (i = 0; i < nblocks; i++) { + SCRYPT_WORD_ENDIAN_SWAP(blocks[i]); + } + } +#else + (void)blocks; (void)nblocks; +#endif +} + +/* chunkmix test function */ +typedef void (asm_calling_convention *chunkmixfn)(scrypt_mix_word_t *Bout/*[chunkWords]*/, scrypt_mix_word_t *Bin/*[chunkWords]*/, scrypt_mix_word_t *Bxor/*[chunkWords]*/, uint32_t r); +typedef void (asm_calling_convention *blockfixfn)(scrypt_mix_word_t *blocks, size_t nblocks); + +static int +scrypt_test_mix_instance(chunkmixfn mixfn, blockfixfn prefn, blockfixfn postfn, const uint8_t expected[16]) { + /* r = 2, (2 * r) = 4 blocks in a chunk, 4 * SCRYPT_BLOCK_WORDS total */ + const uint32_t r = 2, blocks = 2 * r, words = blocks * SCRYPT_BLOCK_WORDS; +#if (defined(X86ASM_AVX2) || defined(X86_64ASM_AVX2) || defined(X86_INTRINSIC_AVX2)) + scrypt_mix_word_t JANE_ALIGN(32) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; +#else + scrypt_mix_word_t JANE_ALIGN(16) chunk[2][4 * SCRYPT_BLOCK_WORDS], v; +#endif + uint8_t final[16]; + size_t i; + + for (i = 0; i < words; i++) { + v = (scrypt_mix_word_t)i; + v = (v << 8) | v; + v = (v << 16) | v; + chunk[0][i] = v; + } + + prefn(chunk[0], blocks); + mixfn(chunk[1], chunk[0], NULL, r); + postfn(chunk[1], blocks); + + /* grab the last 16 bytes of the final block */ + for (i = 0; i < 16; i += sizeof(scrypt_mix_word_t)) { + SCRYPT_WORDTO8_LE(final + i, chunk[1][words - (16 / sizeof(scrypt_mix_word_t)) + (i / sizeof(scrypt_mix_word_t))]); + } + + return scrypt_verify(expected, final, 16); +} + +/* returns a pointer to item i, where item is len scrypt_mix_word_t's long */ +static scrypt_mix_word_t * +scrypt_item(scrypt_mix_word_t *base, scrypt_mix_word_t i, scrypt_mix_word_t len) { + return base + (i * len); +} + +/* returns a pointer to block i */ +static scrypt_mix_word_t * +scrypt_block(scrypt_mix_word_t *base, scrypt_mix_word_t i) { + return base + (i * SCRYPT_BLOCK_WORDS); +} diff --git a/deps/scrypt-jane-master/code/scrypt-jane-romix-template.h b/deps/scrypt-jane-master/code/scrypt-jane-romix-template.h new file mode 100644 index 000000000..77c0114f4 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-romix-template.h @@ -0,0 +1,122 @@ +#if !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_HAVE_ROMIX) + +#if defined(SCRYPT_CHOOSE_COMPILETIME) +#undef SCRYPT_ROMIX_FN +#define SCRYPT_ROMIX_FN scrypt_ROMix +#endif + +#undef SCRYPT_HAVE_ROMIX +#define SCRYPT_HAVE_ROMIX + +#if !defined(SCRYPT_CHUNKMIX_FN) + +#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_basic + +/* + Bout = ChunkMix(Bin) + + 2*r: number of blocks in the chunk +*/ +static void asm_calling_convention +SCRYPT_CHUNKMIX_FN(scrypt_mix_word_t *Bout/*[chunkWords]*/, scrypt_mix_word_t *Bin/*[chunkWords]*/, scrypt_mix_word_t *Bxor/*[chunkWords]*/, uint32_t r) { +#if (defined(X86ASM_AVX2) || defined(X86_64ASM_AVX2) || defined(X86_INTRINSIC_AVX2)) + scrypt_mix_word_t JANE_ALIGN(32) X[SCRYPT_BLOCK_WORDS], *block; +#else + scrypt_mix_word_t JANE_ALIGN(16) X[SCRYPT_BLOCK_WORDS], *block; +#endif + uint32_t i, j, blocksPerChunk = r * 2, half = 0; + + /* 1: X = B_{2r - 1} */ + block = scrypt_block(Bin, blocksPerChunk - 1); + for (i = 0; i < SCRYPT_BLOCK_WORDS; i++) + X[i] = block[i]; + + if (Bxor) { + block = scrypt_block(Bxor, blocksPerChunk - 1); + for (i = 0; i < SCRYPT_BLOCK_WORDS; i++) + X[i] ^= block[i]; + } + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < blocksPerChunk; i++, half ^= r) { + /* 3: X = H(X ^ B_i) */ + block = scrypt_block(Bin, i); + for (j = 0; j < SCRYPT_BLOCK_WORDS; j++) + X[j] ^= block[j]; + + if (Bxor) { + block = scrypt_block(Bxor, i); + for (j = 0; j < SCRYPT_BLOCK_WORDS; j++) + X[j] ^= block[j]; + } + SCRYPT_MIX_FN(X); + + /* 4: Y_i = X */ + /* 6: B'[0..r-1] = Y_even */ + /* 6: B'[r..2r-1] = Y_odd */ + block = scrypt_block(Bout, (i / 2) + half); + for (j = 0; j < SCRYPT_BLOCK_WORDS; j++) + block[j] = X[j]; + } +} +#endif + +/* + X = ROMix(X) + + X: chunk to mix + Y: scratch chunk + N: number of rounds + V[N]: array of chunks to randomly index in to + 2*r: number of blocks in a chunk +*/ + +static void NOINLINE FASTCALL +SCRYPT_ROMIX_FN(scrypt_mix_word_t *X/*[chunkWords]*/, scrypt_mix_word_t *Y/*[chunkWords]*/, scrypt_mix_word_t *V/*[N * chunkWords]*/, uint32_t N, uint32_t r) { + uint32_t i, j, chunkWords = (uint32_t)(SCRYPT_BLOCK_WORDS * r * 2); + scrypt_mix_word_t *block = V; + + SCRYPT_ROMIX_TANGLE_FN(X, r * 2); + + /* 1: X = B */ + /* implicit */ + + /* 2: for i = 0 to N - 1 do */ + memcpy(block, X, chunkWords * sizeof(scrypt_mix_word_t)); + for (i = 0; i < N - 1; i++, block += chunkWords) { + /* 3: V_i = X */ + /* 4: X = H(X) */ + SCRYPT_CHUNKMIX_FN(block + chunkWords, block, NULL, r); + } + SCRYPT_CHUNKMIX_FN(X, block, NULL, r); + + /* 6: for i = 0 to N - 1 do */ + for (i = 0; i < N; i += 2) { + /* 7: j = Integerify(X) % N */ + j = X[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1); + + /* 8: X = H(Y ^ V_j) */ + SCRYPT_CHUNKMIX_FN(Y, X, scrypt_item(V, j, chunkWords), r); + + /* 7: j = Integerify(Y) % N */ + j = Y[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1); + + /* 8: X = H(Y ^ V_j) */ + SCRYPT_CHUNKMIX_FN(X, Y, scrypt_item(V, j, chunkWords), r); + } + + /* 10: B' = X */ + /* implicit */ + + SCRYPT_ROMIX_UNTANGLE_FN(X, r * 2); +} + +#endif /* !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_HAVE_ROMIX) */ + + +#undef SCRYPT_CHUNKMIX_FN +#undef SCRYPT_ROMIX_FN +#undef SCRYPT_MIX_FN +#undef SCRYPT_ROMIX_TANGLE_FN +#undef SCRYPT_ROMIX_UNTANGLE_FN + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-romix.h b/deps/scrypt-jane-master/code/scrypt-jane-romix.h new file mode 100644 index 000000000..84cf61201 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-romix.h @@ -0,0 +1,27 @@ +#if defined(SCRYPT_CHACHA) +#include "scrypt-jane-chacha.h" +#elif defined(SCRYPT_SALSA) +#include "scrypt-jane-salsa.h" +#elif defined(SCRYPT_SALSA64) +#include "scrypt-jane-salsa64.h" +#else + #define SCRYPT_MIX_BASE "ERROR" + typedef uint32_t scrypt_mix_word_t; + #define SCRYPT_WORDTO8_LE U32TO8_LE + #define SCRYPT_WORD_ENDIAN_SWAP U32_SWAP + #define SCRYPT_BLOCK_BYTES 64 + #define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t)) + #if !defined(SCRYPT_CHOOSE_COMPILETIME) + static void FASTCALL scrypt_ROMix_error(scrypt_mix_word_t *X/*[chunkWords]*/, scrypt_mix_word_t *Y/*[chunkWords]*/, scrypt_mix_word_t *V/*[chunkWords * N]*/, uint32_t N, uint32_t r) {} + static scrypt_ROMixfn scrypt_getROMix(void) { return scrypt_ROMix_error; } + #else + static void FASTCALL scrypt_ROMix(scrypt_mix_word_t *X, scrypt_mix_word_t *Y, scrypt_mix_word_t *V, uint32_t N, uint32_t r) {} + #endif + static int scrypt_test_mix(void) { return 0; } + #error must define a mix function! +#endif + +#if !defined(SCRYPT_CHOOSE_COMPILETIME) +#undef SCRYPT_MIX +#define SCRYPT_MIX SCRYPT_MIX_BASE +#endif diff --git a/deps/scrypt-jane-master/code/scrypt-jane-salsa.h b/deps/scrypt-jane-master/code/scrypt-jane-salsa.h new file mode 100644 index 000000000..df0a3e0c0 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-salsa.h @@ -0,0 +1,134 @@ +#define SCRYPT_MIX_BASE "Salsa20/8" + +typedef uint32_t scrypt_mix_word_t; + +#define SCRYPT_WORDTO8_LE U32TO8_LE +#define SCRYPT_WORD_ENDIAN_SWAP U32_SWAP + +#define SCRYPT_BLOCK_BYTES 64 +#define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t)) + +/* must have these here in case block bytes is ever != 64 */ +#include "scrypt-jane-romix-basic.h" + +#include "scrypt-jane-mix_salsa-xop.h" +#include "scrypt-jane-mix_salsa-avx.h" +#include "scrypt-jane-mix_salsa-sse2.h" +#include "scrypt-jane-mix_salsa.h" + +#if defined(SCRYPT_SALSA_XOP) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_xop + #define SCRYPT_ROMIX_FN scrypt_ROMix_xop + #define SCRYPT_ROMIX_TANGLE_FN salsa_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA_AVX) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx + #define SCRYPT_ROMIX_FN scrypt_ROMix_avx + #define SCRYPT_ROMIX_TANGLE_FN salsa_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA_SSE2) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_sse2 + #define SCRYPT_ROMIX_FN scrypt_ROMix_sse2 + #define SCRYPT_MIX_FN salsa_core_sse2 + #define SCRYPT_ROMIX_TANGLE_FN salsa_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +/* cpu agnostic */ +#define SCRYPT_ROMIX_FN scrypt_ROMix_basic +#define SCRYPT_MIX_FN salsa_core_basic +#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_convert_endian +#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_convert_endian +#include "scrypt-jane-romix-template.h" + +#if !defined(SCRYPT_CHOOSE_COMPILETIME) +static scrypt_ROMixfn +scrypt_getROMix(void) { + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_SALSA_XOP) + if (cpuflags & cpu_xop) + return scrypt_ROMix_xop; + else +#endif + +#if defined(SCRYPT_SALSA_AVX) + if (cpuflags & cpu_avx) + return scrypt_ROMix_avx; + else +#endif + +#if defined(SCRYPT_SALSA_SSE2) + if (cpuflags & cpu_sse2) + return scrypt_ROMix_sse2; + else +#endif + + return scrypt_ROMix_basic; +} +#endif + + +#if defined(SCRYPT_TEST_SPEED) +static size_t +available_implementations(void) { + size_t cpuflags = detect_cpu(); + size_t flags = 0; + +#if defined(SCRYPT_SALSA_XOP) + if (cpuflags & cpu_xop) + flags |= cpu_xop; +#endif + +#if defined(SCRYPT_SALSA_AVX) + if (cpuflags & cpu_avx) + flags |= cpu_avx; +#endif + +#if defined(SCRYPT_SALSA_SSE2) + if (cpuflags & cpu_sse2) + flags |= cpu_sse2; +#endif + + return flags; +} +#endif + + +static int +scrypt_test_mix(void) { + static const uint8_t expected[16] = { + 0x41,0x1f,0x2e,0xa3,0xab,0xa3,0x1a,0x34,0x87,0x1d,0x8a,0x1c,0x76,0xa0,0x27,0x66, + }; + + int ret = 1; + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_SALSA_XOP) + if (cpuflags & cpu_xop) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_xop, salsa_core_tangle_sse2, salsa_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA_AVX) + if (cpuflags & cpu_avx) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx, salsa_core_tangle_sse2, salsa_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA_SSE2) + if (cpuflags & cpu_sse2) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_sse2, salsa_core_tangle_sse2, salsa_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA_BASIC) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_basic, scrypt_romix_convert_endian, scrypt_romix_convert_endian, expected); +#endif + + return ret; +} diff --git a/deps/scrypt-jane-master/code/scrypt-jane-salsa64.h b/deps/scrypt-jane-master/code/scrypt-jane-salsa64.h new file mode 100644 index 000000000..96b781360 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-salsa64.h @@ -0,0 +1,183 @@ +#define SCRYPT_MIX_BASE "Salsa64/8" + +typedef uint64_t scrypt_mix_word_t; + +#define SCRYPT_WORDTO8_LE U64TO8_LE +#define SCRYPT_WORD_ENDIAN_SWAP U64_SWAP + +#define SCRYPT_BLOCK_BYTES 128 +#define SCRYPT_BLOCK_WORDS (SCRYPT_BLOCK_BYTES / sizeof(scrypt_mix_word_t)) + +/* must have these here in case block bytes is ever != 64 */ +#include "scrypt-jane-romix-basic.h" + +#include "scrypt-jane-mix_salsa64-avx2.h" +#include "scrypt-jane-mix_salsa64-xop.h" +#include "scrypt-jane-mix_salsa64-avx.h" +#include "scrypt-jane-mix_salsa64-ssse3.h" +#include "scrypt-jane-mix_salsa64-sse2.h" +#include "scrypt-jane-mix_salsa64.h" + +#if defined(SCRYPT_SALSA64_AVX2) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx2 + #define SCRYPT_ROMIX_FN scrypt_ROMix_avx2 + #define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA64_XOP) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_xop + #define SCRYPT_ROMIX_FN scrypt_ROMix_xop + #define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA64_AVX) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_avx + #define SCRYPT_ROMIX_FN scrypt_ROMix_avx + #define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA64_SSSE3) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_ssse3 + #define SCRYPT_ROMIX_FN scrypt_ROMix_ssse3 + #define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +#if defined(SCRYPT_SALSA64_SSE2) + #define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_sse2 + #define SCRYPT_ROMIX_FN scrypt_ROMix_sse2 + #define SCRYPT_ROMIX_TANGLE_FN salsa64_core_tangle_sse2 + #define SCRYPT_ROMIX_UNTANGLE_FN salsa64_core_tangle_sse2 + #include "scrypt-jane-romix-template.h" +#endif + +/* cpu agnostic */ +#define SCRYPT_ROMIX_FN scrypt_ROMix_basic +#define SCRYPT_MIX_FN salsa64_core_basic +#define SCRYPT_ROMIX_TANGLE_FN scrypt_romix_convert_endian +#define SCRYPT_ROMIX_UNTANGLE_FN scrypt_romix_convert_endian +#include "scrypt-jane-romix-template.h" + +#if !defined(SCRYPT_CHOOSE_COMPILETIME) +static scrypt_ROMixfn +scrypt_getROMix(void) { + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_SALSA64_AVX2) + if (cpuflags & cpu_avx2) + return scrypt_ROMix_avx2; + else +#endif + +#if defined(SCRYPT_SALSA64_XOP) + if (cpuflags & cpu_xop) + return scrypt_ROMix_xop; + else +#endif + +#if defined(SCRYPT_SALSA64_AVX) + if (cpuflags & cpu_avx) + return scrypt_ROMix_avx; + else +#endif + +#if defined(SCRYPT_SALSA64_SSSE3) + if (cpuflags & cpu_ssse3) + return scrypt_ROMix_ssse3; + else +#endif + +#if defined(SCRYPT_SALSA64_SSE2) + if (cpuflags & cpu_sse2) + return scrypt_ROMix_sse2; + else +#endif + + return scrypt_ROMix_basic; +} +#endif + + +#if defined(SCRYPT_TEST_SPEED) +static size_t +available_implementations(void) { + size_t cpuflags = detect_cpu(); + size_t flags = 0; + +#if defined(SCRYPT_SALSA64_AVX2) + if (cpuflags & cpu_avx2) + flags |= cpu_avx2; +#endif + +#if defined(SCRYPT_SALSA64_XOP) + if (cpuflags & cpu_xop) + flags |= cpu_xop; +#endif + +#if defined(SCRYPT_SALSA64_AVX) + if (cpuflags & cpu_avx) + flags |= cpu_avx; +#endif + +#if defined(SCRYPT_SALSA64_SSSE3) + if (cpuflags & cpu_ssse3) + flags |= cpu_ssse3; +#endif + +#if defined(SCRYPT_SALSA64_SSE2) + if (cpuflags & cpu_sse2) + flags |= cpu_sse2; +#endif + + return flags; +} +#endif + +static int +scrypt_test_mix(void) { + static const uint8_t expected[16] = { + 0xf8,0x92,0x9b,0xf8,0xcc,0x1d,0xce,0x2e,0x13,0x82,0xac,0x96,0xb2,0x6c,0xee,0x2c, + }; + + int ret = 1; + size_t cpuflags = detect_cpu(); + +#if defined(SCRYPT_SALSA64_AVX2) + if (cpuflags & cpu_avx2) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx2, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA64_XOP) + if (cpuflags & cpu_xop) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_xop, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA64_AVX) + if (cpuflags & cpu_avx) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_avx, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA64_SSSE3) + if (cpuflags & cpu_ssse3) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_ssse3, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA64_SSE2) + if (cpuflags & cpu_sse2) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_sse2, salsa64_core_tangle_sse2, salsa64_core_tangle_sse2, expected); +#endif + +#if defined(SCRYPT_SALSA64_BASIC) + ret &= scrypt_test_mix_instance(scrypt_ChunkMix_basic, scrypt_romix_convert_endian, scrypt_romix_convert_endian, expected); +#endif + + return ret; +} + diff --git a/deps/scrypt-jane-master/code/scrypt-jane-test-vectors.h b/deps/scrypt-jane-master/code/scrypt-jane-test-vectors.h new file mode 100644 index 000000000..72a727634 --- /dev/null +++ b/deps/scrypt-jane-master/code/scrypt-jane-test-vectors.h @@ -0,0 +1,261 @@ +typedef struct scrypt_test_setting_t { + const char *pw, *salt; + uint8_t Nfactor, rfactor, pfactor; +} scrypt_test_setting; + +static const scrypt_test_setting post_settings[] = { + {"", "", 3, 0, 0}, + {"password", "NaCl", 9, 3, 4}, + {0, 0, 0, 0, 0} +}; + +#if defined(SCRYPT_SHA256) + #if defined(SCRYPT_SALSA) + /* sha256 + salsa20/8, the only 'official' test vectors! */ + static const uint8_t post_vectors[][64] = { + {0x77,0xd6,0x57,0x62,0x38,0x65,0x7b,0x20,0x3b,0x19,0xca,0x42,0xc1,0x8a,0x04,0x97, + 0xf1,0x6b,0x48,0x44,0xe3,0x07,0x4a,0xe8,0xdf,0xdf,0xfa,0x3f,0xed,0xe2,0x14,0x42, + 0xfc,0xd0,0x06,0x9d,0xed,0x09,0x48,0xf8,0x32,0x6a,0x75,0x3a,0x0f,0xc8,0x1f,0x17, + 0xe8,0xd3,0xe0,0xfb,0x2e,0x0d,0x36,0x28,0xcf,0x35,0xe2,0x0c,0x38,0xd1,0x89,0x06}, + {0xfd,0xba,0xbe,0x1c,0x9d,0x34,0x72,0x00,0x78,0x56,0xe7,0x19,0x0d,0x01,0xe9,0xfe, + 0x7c,0x6a,0xd7,0xcb,0xc8,0x23,0x78,0x30,0xe7,0x73,0x76,0x63,0x4b,0x37,0x31,0x62, + 0x2e,0xaf,0x30,0xd9,0x2e,0x22,0xa3,0x88,0x6f,0xf1,0x09,0x27,0x9d,0x98,0x30,0xda, + 0xc7,0x27,0xaf,0xb9,0x4a,0x83,0xee,0x6d,0x83,0x60,0xcb,0xdf,0xa2,0xcc,0x06,0x40} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0xef,0x8f,0x44,0x8f,0xc3,0xef,0x78,0x13,0xb2,0x26,0xa7,0x2a,0x40,0xa1,0x98,0x7f, + 0xc8,0x7f,0x0d,0x5f,0x40,0x66,0xa2,0x05,0x07,0x4f,0xc7,0xac,0x3b,0x47,0x07,0x0c, + 0xf5,0x20,0x46,0x76,0x20,0x7b,0xee,0x51,0x6d,0x5f,0xfa,0x9c,0x27,0xac,0xa9,0x36, + 0x62,0xbd,0xde,0x0b,0xa3,0xc0,0x66,0x84,0xde,0x82,0xd0,0x1a,0xb4,0xd1,0xb5,0xfe}, + {0xf1,0x94,0xf7,0x5f,0x15,0x12,0x10,0x4d,0x6e,0xfb,0x04,0x8c,0x35,0xc4,0x51,0xb6, + 0x11,0x04,0xa7,0x9b,0xb0,0x46,0xaf,0x7b,0x47,0x39,0xf0,0xac,0xb2,0x8a,0xfa,0x45, + 0x09,0x86,0x8f,0x10,0x4b,0xc6,0xee,0x00,0x11,0x38,0x73,0x7a,0x6a,0xd8,0x25,0x67, + 0x85,0xa4,0x10,0x4e,0xa9,0x2f,0x15,0xfe,0xcf,0x63,0xe1,0xe8,0xcf,0xab,0xe8,0xbd} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xf4,0x87,0x29,0xf4,0xc3,0x31,0x8c,0xe8,0xdf,0xe5,0xd8,0x73,0xff,0xca,0x32,0xcf, + 0xd8,0xac,0xe7,0xf7,0x15,0xda,0x84,0x41,0x60,0x23,0x26,0x4a,0xc8,0x3e,0xee,0xa6, + 0xa5,0x6e,0x52,0xd6,0x64,0x55,0x16,0x31,0x3e,0x66,0x7b,0x65,0xd5,0xe2,0xc9,0x95, + 0x1b,0xf0,0x81,0x40,0xb7,0x2f,0xff,0xa6,0xe6,0x02,0xcc,0x63,0x08,0x4a,0x74,0x31}, + {0x7a,0xd8,0xad,0x02,0x9c,0xa5,0xf4,0x42,0x6a,0x29,0xd2,0xb5,0x53,0xf1,0x6d,0x1d, + 0x25,0xc8,0x70,0x48,0x80,0xb9,0xa3,0xf6,0x94,0xf8,0xfa,0xb8,0x52,0x42,0xcd,0x14, + 0x26,0x46,0x28,0x06,0xc7,0xf6,0x1f,0xa7,0x89,0x6d,0xc5,0xa0,0x36,0xcc,0xde,0xcb, + 0x73,0x0b,0xa4,0xe2,0xd3,0xd1,0x44,0x06,0x35,0x08,0xe0,0x35,0x5b,0xf8,0xd7,0xe7} + }; + #endif +#elif defined(SCRYPT_SHA512) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0xae,0x54,0xe7,0x74,0xe4,0x51,0x6b,0x0f,0xe1,0xe7,0x28,0x03,0x17,0xe4,0x8c,0xfa, + 0x2f,0x66,0x55,0x7f,0xdc,0x3b,0x40,0xab,0x47,0x84,0xc9,0x63,0x36,0x07,0x9d,0xe5, + 0x86,0x43,0x95,0x89,0xb6,0xc0,0x6c,0x72,0x64,0x00,0xc1,0x2a,0xd7,0x69,0x21,0x92, + 0x8e,0xba,0xa4,0x59,0x9f,0x00,0x14,0x3a,0x7c,0x12,0x58,0x91,0x09,0xa0,0x32,0xfe}, + {0xc5,0xb3,0xd6,0xea,0x0a,0x4b,0x1e,0xcc,0x40,0x00,0xe5,0x98,0x5c,0xdc,0x06,0x06, + 0x78,0x34,0x92,0x16,0xcf,0xe4,0x9f,0x03,0x96,0x2d,0x41,0x35,0x00,0x9b,0xff,0x74, + 0x60,0x19,0x6e,0xe6,0xa6,0x46,0xf7,0x37,0xcb,0xfa,0xd0,0x9f,0x80,0x72,0x2e,0x85, + 0x13,0x3e,0x1a,0x91,0x90,0x53,0xa1,0x33,0x85,0x51,0xdc,0x62,0x1c,0x0e,0x4d,0x30} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0xe2,0x05,0x7c,0x44,0xf9,0x55,0x9f,0x64,0xbe,0xd5,0x7f,0x85,0x69,0xc7,0x8c,0x7f, + 0x2b,0x91,0xd6,0x9a,0x6c,0xf8,0x57,0x55,0x61,0x25,0x3d,0xee,0xb8,0xd5,0x8c,0xdc, + 0x2d,0xd5,0x53,0x84,0x8c,0x06,0xaa,0x37,0x77,0xa6,0xf0,0xf1,0x35,0xfe,0xb5,0xcb, + 0x61,0xd7,0x2c,0x67,0xf3,0x7e,0x8a,0x1b,0x04,0xa3,0xa3,0x43,0xa2,0xb2,0x29,0xf2}, + {0x82,0xda,0x29,0xb2,0x08,0x27,0xfc,0x78,0x22,0xc4,0xb8,0x7e,0xbc,0x36,0xcf,0xcd, + 0x17,0x4b,0xa1,0x30,0x16,0x4a,0x25,0x70,0xc7,0xcb,0xe0,0x2b,0x56,0xd3,0x16,0x4e, + 0x85,0xb6,0x84,0xe7,0x9b,0x7f,0x8b,0xb5,0x94,0x33,0xcf,0x33,0x44,0x65,0xc8,0xa1, + 0x46,0xf9,0xf5,0xfc,0x74,0x29,0x7e,0xd5,0x46,0xec,0xbd,0x95,0xc1,0x80,0x24,0xe4} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xa6,0xcb,0x77,0x9a,0x64,0x1f,0x95,0x02,0x53,0xe7,0x5c,0x78,0xdb,0xa3,0x43,0xff, + 0xbe,0x10,0x4c,0x7b,0xe4,0xe1,0x91,0xcf,0x67,0x69,0x5a,0x2c,0x12,0xd6,0x99,0x49, + 0x92,0xfd,0x5a,0xaa,0x12,0x4c,0x2e,0xf6,0x95,0x46,0x8f,0x5e,0x77,0x62,0x16,0x29, + 0xdb,0xe7,0xab,0x02,0x2b,0x9c,0x35,0x03,0xf8,0xd4,0x04,0x7d,0x2d,0x73,0x85,0xf1}, + {0x54,0xb7,0xca,0xbb,0xaf,0x0f,0xb0,0x5f,0xb7,0x10,0x63,0x48,0xb3,0x15,0xd8,0xb5, + 0x62,0x64,0x89,0x6a,0x59,0xc6,0x0f,0x86,0x96,0x38,0xf0,0xcf,0xd4,0x62,0x90,0x61, + 0x7d,0xce,0xd6,0x13,0x85,0x67,0x4a,0xf5,0x32,0x03,0x74,0x30,0x0b,0x5a,0x2f,0x86, + 0x82,0x6e,0x0c,0x3e,0x40,0x7a,0xde,0xbe,0x42,0x6e,0x80,0x2b,0xaf,0xdb,0xcc,0x94} + }; + #endif +#elif defined(SCRYPT_BLAKE512) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0x4a,0x48,0xb3,0xfa,0xdc,0xb0,0xb8,0xdb,0x54,0xee,0xf3,0x5c,0x27,0x65,0x6c,0x20, + 0xab,0x61,0x9a,0x5b,0xd5,0x1d,0xd9,0x95,0xab,0x88,0x0e,0x4d,0x1e,0x71,0x2f,0x11, + 0x43,0x2e,0xef,0x23,0xca,0x8a,0x49,0x3b,0x11,0x38,0xa5,0x28,0x61,0x2f,0xb7,0x89, + 0x5d,0xef,0x42,0x4c,0xc1,0x74,0xea,0x8a,0x56,0xbe,0x4a,0x82,0x76,0x15,0x1a,0x87}, + {0x96,0x24,0xbf,0x40,0xeb,0x03,0x8e,0xfe,0xc0,0xd5,0xa4,0x81,0x85,0x7b,0x09,0x88, + 0x52,0xb5,0xcb,0xc4,0x48,0xe1,0xb9,0x1d,0x3f,0x8b,0x3a,0xc6,0x38,0x32,0xc7,0x55, + 0x30,0x28,0x7a,0x42,0xa9,0x5d,0x54,0x33,0x62,0xf3,0xd9,0x3c,0x96,0x40,0xd1,0x80, + 0xe4,0x0e,0x7e,0xf0,0x64,0x53,0xfe,0x7b,0xd7,0x15,0xba,0xad,0x16,0x80,0x01,0xb5} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0x45,0x42,0x22,0x31,0x26,0x13,0x5f,0x94,0xa4,0x00,0x04,0x47,0xe8,0x50,0x6d,0xd6, + 0xdd,0xd5,0x08,0xd4,0x90,0x64,0xe0,0x59,0x70,0x46,0xff,0xfc,0x29,0xb3,0x6a,0xc9, + 0x4d,0x45,0x97,0x95,0xa8,0xf0,0x53,0xe7,0xee,0x4b,0x6b,0x5d,0x1e,0xa5,0xb2,0x58, + 0x4b,0x93,0xc9,0x89,0x4c,0xa8,0xab,0x03,0x74,0x38,0xbd,0x54,0x97,0x6b,0xab,0x4a}, + {0x4b,0x4a,0x63,0x96,0x73,0x34,0x9f,0x39,0x64,0x51,0x0e,0x2e,0x3b,0x07,0xd5,0x1c, + 0xd2,0xf7,0xce,0x60,0xab,0xac,0x89,0xa4,0x16,0x0c,0x58,0x82,0xb3,0xd3,0x25,0x5b, + 0xd5,0x62,0x32,0xf4,0x86,0x5d,0xb2,0x4b,0xbf,0x8e,0xc6,0xc0,0xac,0x40,0x48,0xb4, + 0x69,0x08,0xba,0x40,0x4b,0x07,0x2a,0x13,0x9c,0x98,0x3b,0x8b,0x20,0x0c,0xac,0x9e} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xcb,0x4b,0xc2,0xd1,0xf4,0x77,0x32,0x3c,0x42,0x9d,0xf7,0x7d,0x1f,0x22,0x64,0xa4, + 0xe2,0x88,0x30,0x2d,0x54,0x9d,0xb6,0x26,0x89,0x25,0x30,0xc3,0x3d,0xdb,0xba,0x99, + 0xe9,0x8e,0x1e,0x5e,0x57,0x66,0x75,0x7c,0x24,0xda,0x00,0x6f,0x79,0xf7,0x47,0xf5, + 0xea,0x40,0x70,0x37,0xd2,0x91,0xc7,0x4d,0xdf,0x46,0xb6,0x3e,0x95,0x7d,0xcb,0xc1}, + {0x25,0xc2,0xcb,0x7f,0xc8,0x50,0xb7,0x0b,0x11,0x9e,0x1d,0x10,0xb2,0xa8,0x35,0x23, + 0x91,0x39,0xfb,0x45,0xf2,0xbf,0xe4,0xd0,0x84,0xec,0x72,0x33,0x6d,0x09,0xed,0x41, + 0x9a,0x7e,0x4f,0x10,0x73,0x97,0x22,0x76,0x58,0x93,0x39,0x24,0xdf,0xd2,0xaa,0x2f, + 0x6b,0x2b,0x64,0x48,0xa5,0xb7,0xf5,0x56,0x77,0x02,0xa7,0x71,0x46,0xe5,0x0e,0x8d}, + }; + #endif +#elif defined(SCRYPT_BLAKE256) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0xf1,0xf1,0x91,0x1a,0x81,0xe6,0x9f,0xc1,0xce,0x43,0xab,0xb1,0x1a,0x02,0x1e,0x16, + 0x08,0xc6,0xf9,0x00,0x50,0x1b,0x6d,0xf1,0x31,0x06,0x95,0x48,0x5d,0xf7,0x6c,0x00, + 0xa2,0x4c,0xb1,0x0e,0x52,0x66,0x94,0x7e,0x84,0xfc,0xa5,0x34,0xfd,0xf0,0xe9,0x57, + 0x85,0x2d,0x8c,0x05,0x5c,0x0f,0x04,0xd4,0x8d,0x3e,0x13,0x52,0x3d,0x90,0x2d,0x2c}, + {0xd5,0x42,0xd2,0x7b,0x06,0xae,0x63,0x90,0x9e,0x30,0x00,0x0e,0xd8,0xa4,0x3a,0x0b, + 0xee,0x4a,0xef,0xb2,0xc4,0x95,0x0d,0x72,0x07,0x70,0xcc,0xa3,0xf9,0x1e,0xc2,0x75, + 0xcf,0xaf,0xe1,0x44,0x1c,0x8c,0xe2,0x3e,0x0c,0x81,0xf3,0x92,0xe1,0x13,0xe6,0x4f, + 0x2d,0x27,0xc3,0x87,0xe5,0xb6,0xf9,0xd7,0x02,0x04,0x37,0x64,0x78,0x36,0x6e,0xb3} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0xad,0x1b,0x4b,0xca,0xe3,0x26,0x1a,0xfd,0xb7,0x77,0x8c,0xde,0x8d,0x26,0x14,0xe1, + 0x54,0x38,0x42,0xf3,0xb3,0x66,0x29,0xf9,0x90,0x04,0xf1,0x82,0x7c,0x5a,0x6f,0xa8, + 0x7d,0xd6,0x08,0x0d,0x8b,0x78,0x04,0xad,0x31,0xea,0xd4,0x87,0x2d,0xf7,0x74,0x9a, + 0xe5,0xce,0x97,0xef,0xa3,0xbb,0x90,0x46,0x7c,0xf4,0x51,0x38,0xc7,0x60,0x53,0x21}, + {0x39,0xbb,0x56,0x3d,0x0d,0x7b,0x74,0x82,0xfe,0x5a,0x78,0x3d,0x66,0xe8,0x3a,0xdf, + 0x51,0x6f,0x3e,0xf4,0x86,0x20,0x8d,0xe1,0x81,0x22,0x02,0xf7,0x0d,0xb5,0x1a,0x0f, + 0xfc,0x59,0xb6,0x60,0xc9,0xdb,0x38,0x0b,0x5b,0x95,0xa5,0x94,0xda,0x42,0x2d,0x90, + 0x47,0xeb,0x73,0x31,0x9f,0x20,0xf6,0x81,0xc2,0xef,0x33,0x77,0x51,0xd8,0x2c,0xe4} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0x9e,0xf2,0x60,0x7c,0xbd,0x7c,0x19,0x5c,0x79,0xc6,0x1b,0x7e,0xb0,0x65,0x1b,0xc3, + 0x70,0x0d,0x89,0xfc,0x72,0xb2,0x03,0x72,0x15,0xcb,0x8e,0x8c,0x49,0x50,0x4c,0x27, + 0x99,0xda,0x47,0x32,0x5e,0xb4,0xa2,0x07,0x83,0x51,0x6b,0x06,0x37,0x60,0x42,0xc4, + 0x59,0x49,0x99,0xdd,0xc0,0xd2,0x08,0x94,0x7f,0xe3,0x9e,0x4e,0x43,0x8e,0x5b,0xba}, + {0x86,0x6f,0x3b,0x11,0xb8,0xca,0x4b,0x6e,0xa7,0x6f,0xc2,0xc9,0x33,0xb7,0x8b,0x9f, + 0xa3,0xb9,0xf5,0xb5,0x62,0xa6,0x17,0x66,0xe4,0xc3,0x9d,0x9b,0xca,0x51,0xb0,0x2f, + 0xda,0x09,0xc1,0x77,0xed,0x8b,0x89,0xc2,0x69,0x5a,0x34,0x05,0x4a,0x1f,0x4d,0x76, + 0xcb,0xd5,0xa4,0x78,0xfa,0x1b,0xb9,0x5b,0xbc,0x3d,0xce,0x04,0x63,0x99,0xad,0x54} + }; + #endif +#elif defined(SCRYPT_SKEIN512) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0xe4,0x36,0xa0,0x9a,0xdb,0xf0,0xd1,0x45,0x56,0xda,0x25,0x53,0x00,0xf9,0x2c,0x69, + 0xa4,0xc2,0xa5,0x8e,0x1a,0x85,0xfa,0x53,0xbd,0x55,0x3d,0x11,0x2a,0x44,0x13,0x87, + 0x8f,0x81,0x88,0x13,0x1e,0x49,0xa8,0xc4,0xc5,0xcd,0x1f,0xe1,0x5f,0xf5,0xcb,0x2f, + 0x8b,0xab,0x57,0x38,0x59,0xeb,0x6b,0xac,0x3b,0x73,0x10,0xa6,0xe1,0xfe,0x17,0x3e}, + {0x6d,0x61,0xde,0x43,0xa9,0x38,0x53,0x5f,0xd8,0xf2,0x6d,0xf3,0xe4,0xd6,0xd8,0x5e, + 0x81,0x89,0xd0,0x0b,0x86,0x16,0xb1,0x91,0x65,0x76,0xd8,0xc1,0xf7,0x3b,0xca,0x8b, + 0x35,0x07,0x58,0xba,0x77,0xdf,0x11,0x6c,0xbc,0x58,0xee,0x11,0x59,0xf2,0xfe,0xcb, + 0x51,0xdc,0xcd,0x35,0x2e,0x46,0x22,0xa0,0xaa,0x55,0x60,0x7c,0x91,0x15,0xb8,0x00} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0xd1,0x12,0x6d,0x64,0x10,0x0e,0x98,0x6c,0xbe,0x70,0x21,0xd9,0xc6,0x04,0x62,0xa4, + 0x29,0x13,0x9a,0x3c,0xf8,0xe9,0x1e,0x87,0x9f,0x88,0xf4,0x98,0x01,0x41,0x8e,0xce, + 0x60,0xf7,0xbe,0x17,0x0a,0xec,0xd6,0x30,0x80,0xcf,0x6b,0x1e,0xcf,0x95,0xa0,0x4d, + 0x37,0xed,0x3a,0x09,0xd1,0xeb,0x0c,0x80,0x82,0x22,0x8e,0xd3,0xb1,0x7f,0xd6,0xa8}, + {0x5c,0x5c,0x05,0xe2,0x75,0xa5,0xa4,0xec,0x81,0x97,0x9c,0x5b,0xd7,0x26,0xb3,0x16, + 0xb4,0x02,0x8c,0x56,0xe6,0x32,0x57,0x33,0x47,0x19,0x06,0x6c,0xde,0x68,0x41,0x37, + 0x5b,0x7d,0xa7,0xb3,0x73,0xeb,0x82,0xca,0x0f,0x86,0x2e,0x6b,0x47,0xa2,0x70,0x39, + 0x35,0xfd,0x2d,0x2e,0x7b,0xc3,0x68,0xbb,0x52,0x42,0x19,0x3b,0x78,0x96,0xe7,0xc8} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xd2,0xad,0x32,0x05,0xee,0x80,0xe3,0x44,0x70,0xc6,0x34,0xde,0x05,0xb6,0xcf,0x60, + 0x89,0x98,0x70,0xc0,0xb8,0xf5,0x54,0xf1,0xa6,0xb2,0xc8,0x76,0x34,0xec,0xc4,0x59, + 0x8e,0x64,0x42,0xd0,0xa9,0xed,0xe7,0x19,0xb2,0x8a,0x11,0xc6,0xa6,0xbf,0xa7,0xa9, + 0x4e,0x44,0x32,0x7e,0x12,0x91,0x9d,0xfe,0x52,0x48,0xa8,0x27,0xb3,0xfc,0xb1,0x89}, + {0xd6,0x67,0xd2,0x3e,0x30,0x1e,0x9d,0xe2,0x55,0x68,0x17,0x3d,0x2b,0x75,0x5a,0xe5, + 0x04,0xfb,0x3d,0x0e,0x86,0xe0,0xaa,0x1d,0xd4,0x72,0xda,0xb0,0x79,0x41,0xb7,0x99, + 0x68,0xe5,0xd9,0x55,0x79,0x7d,0xc3,0xd1,0xa6,0x56,0xc1,0xbe,0x0b,0x6c,0x62,0x23, + 0x66,0x67,0x91,0x47,0x99,0x13,0x6b,0xe3,0xda,0x59,0x55,0x18,0x67,0x8f,0x2e,0x3b} + }; + #endif +#elif defined(SCRYPT_KECCAK512) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0xc2,0x7b,0xbe,0x1d,0xf1,0x99,0xd8,0xe7,0x1b,0xac,0xe0,0x9d,0xeb,0x5a,0xfe,0x21, + 0x71,0xff,0x41,0x51,0x4f,0xbe,0x41,0x01,0x15,0xe2,0xb7,0xb9,0x55,0x15,0x25,0xa1, + 0x40,0x4c,0x66,0x29,0x32,0xb7,0xc9,0x62,0x60,0x88,0xe0,0x99,0x39,0xae,0xce,0x25, + 0x3c,0x11,0x89,0xdd,0xc6,0x14,0xd7,0x3e,0xa3,0x6d,0x07,0x2e,0x56,0xa0,0xff,0x97}, + {0x3c,0x91,0x12,0x4a,0x37,0x7d,0xd6,0x96,0xd2,0x9b,0x5d,0xea,0xb8,0xb9,0x82,0x4e, + 0x4f,0x6b,0x60,0x4c,0x59,0x01,0xe5,0x73,0xfd,0xf6,0xb8,0x9a,0x5a,0xd3,0x7c,0x7a, + 0xd2,0x4f,0x8e,0x74,0xc1,0x90,0x88,0xa0,0x3f,0x55,0x75,0x79,0x10,0xd0,0x09,0x79, + 0x0f,0x6c,0x74,0x0c,0x05,0x08,0x3c,0x8c,0x94,0x7b,0x30,0x56,0xca,0xdf,0xdf,0x34} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0x77,0xcb,0x70,0xbf,0xae,0xd4,0x4c,0x5b,0xbc,0xd3,0xec,0x8a,0x82,0x43,0x8d,0xb3, + 0x7f,0x1f,0xfb,0x70,0x36,0x32,0x4d,0xa6,0xb7,0x13,0x37,0x77,0x30,0x0c,0x3c,0xfb, + 0x2c,0x20,0x8f,0x2a,0xf4,0x47,0x4d,0x69,0x8e,0xae,0x2d,0xad,0xba,0x35,0xe9,0x2f, + 0xe6,0x99,0x7a,0xf8,0xcf,0x70,0x78,0xbb,0x0c,0x72,0x64,0x95,0x8b,0x36,0x77,0x3d}, + {0xc6,0x43,0x17,0x16,0x87,0x09,0x5f,0x12,0xed,0x21,0xe2,0xb4,0xad,0x55,0xa1,0xa1, + 0x49,0x50,0x90,0x70,0xab,0x81,0x83,0x7a,0xcd,0xdf,0x23,0x52,0x19,0xc0,0xa2,0xd8, + 0x8e,0x98,0xeb,0xf0,0x37,0xab,0xad,0xfd,0x1c,0x04,0x97,0x18,0x42,0x85,0xf7,0x4b, + 0x18,0x2c,0x55,0xd3,0xa9,0xe6,0x89,0xfb,0x58,0x0a,0xb2,0x37,0xb9,0xf8,0xfb,0xc5} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xc7,0x34,0x95,0x02,0x5e,0x31,0x0d,0x1f,0x10,0x38,0x9c,0x3f,0x04,0x53,0xed,0x05, + 0x27,0x38,0xc1,0x3f,0x6a,0x0f,0xc5,0xa3,0x9b,0x73,0x8a,0x28,0x7e,0x5d,0x3c,0xdc, + 0x9d,0x5a,0x09,0xbf,0x8c,0x0a,0xad,0xe4,0x73,0x52,0xe3,0x6d,0xaa,0xd1,0x8b,0xbf, + 0xa3,0xb7,0xf0,0x58,0xad,0x22,0x24,0xc9,0xaa,0x96,0xb7,0x5d,0xfc,0x5f,0xb0,0xcf}, + {0x76,0x22,0xfd,0xe8,0xa2,0x79,0x8e,0x9d,0x43,0x8c,0x7a,0xba,0x78,0xb7,0x84,0xf1, + 0xc8,0xee,0x3b,0xae,0x31,0x89,0xbf,0x7e,0xd0,0x4b,0xc1,0x2d,0x58,0x5d,0x84,0x6b, + 0xec,0x86,0x56,0xe0,0x87,0x94,0x7f,0xbc,0xf9,0x48,0x92,0xef,0x54,0x7f,0x23,0x8d, + 0x4f,0x8b,0x0a,0x75,0xa7,0x39,0x0e,0x46,0x6e,0xee,0x58,0xc8,0xfa,0xea,0x90,0x53} + }; + #endif +#elif defined(SCRYPT_KECCAK256) + #if defined(SCRYPT_SALSA) + static const uint8_t post_vectors[][64] = { + {0x2e,0x96,0xd8,0x87,0x45,0xcd,0xd6,0xc8,0xf6,0xd2,0x87,0x33,0x50,0xc7,0x04,0xe5, + 0x3c,0x4b,0x48,0x44,0x57,0xc1,0x74,0x09,0x76,0x02,0xaa,0xd3,0x7b,0xf3,0xbf,0xed, + 0x4b,0x72,0xd7,0x1b,0x49,0x6b,0xe0,0x44,0x83,0xee,0x8f,0xaf,0xa1,0xb5,0x33,0xa9, + 0x9e,0x86,0xab,0xe2,0x9f,0xcf,0x68,0x6e,0x7e,0xbd,0xf5,0x7a,0x83,0x4b,0x1c,0x10}, + {0x42,0x7e,0xf9,0x4b,0x72,0x61,0xda,0x2d,0xb3,0x27,0x0e,0xe1,0xd9,0xde,0x5f,0x3e, + 0x64,0x2f,0xd6,0xda,0x90,0x59,0xce,0xbf,0x02,0x5b,0x32,0xf7,0x6d,0x94,0x51,0x7b, + 0xb6,0xa6,0x0d,0x99,0x3e,0x7f,0x39,0xbe,0x1b,0x1d,0x6c,0x97,0x12,0xd8,0xb7,0xfd, + 0x5b,0xb5,0xf3,0x73,0x5a,0x89,0xb2,0xdd,0xcc,0x3d,0x74,0x2e,0x3d,0x9e,0x3c,0x22} + }; + #elif defined(SCRYPT_CHACHA) + static const uint8_t post_vectors[][64] = { + {0x76,0x1d,0x5b,0x8f,0xa9,0xe1,0xa6,0x01,0xcb,0xc5,0x7a,0x5f,0x02,0x23,0xb6,0x82, + 0x57,0x79,0x60,0x2f,0x05,0x7f,0xb8,0x0a,0xcb,0x5e,0x54,0x11,0x49,0x2e,0xdd,0x85, + 0x83,0x30,0x67,0xb3,0x24,0x5c,0xce,0xfc,0x32,0xcf,0x12,0xc3,0xff,0xe0,0x79,0x36, + 0x74,0x17,0xa6,0x3e,0xcd,0xa0,0x7e,0xcb,0x37,0xeb,0xcb,0xb6,0xe1,0xb9,0xf5,0x15}, + {0xf5,0x66,0xa7,0x4c,0xe4,0xdc,0x18,0x56,0x2f,0x3e,0x86,0x4d,0x92,0xa5,0x5c,0x5a, + 0x8f,0xc3,0x6b,0x32,0xdb,0xe5,0x72,0x50,0x84,0xfc,0x6e,0x5d,0x15,0x77,0x3d,0xca, + 0xc5,0x2b,0x20,0x3c,0x78,0x37,0x80,0x78,0x23,0x56,0x91,0xa0,0xce,0xa4,0x06,0x5a, + 0x7f,0xe3,0xbf,0xab,0x51,0x57,0x32,0x2c,0x0a,0xf0,0xc5,0x6f,0xf4,0xcb,0xff,0x42} + }; + #elif defined(SCRYPT_SALSA64) + static const uint8_t post_vectors[][64] = { + {0xb0,0xb7,0x10,0xb5,0x1f,0x2b,0x7f,0xaf,0x9d,0x95,0x5f,0x4c,0x2d,0x98,0x7c,0xc1, + 0xbc,0x37,0x2f,0x50,0x8d,0xb2,0x9f,0xfd,0x48,0x0d,0xe0,0x44,0x19,0xdf,0x28,0x6c, + 0xab,0xbf,0x1e,0x17,0x26,0xcc,0x57,0x95,0x18,0x17,0x83,0x4c,0x12,0x48,0xd9,0xee, + 0x4b,0x00,0x29,0x06,0x31,0x01,0x6b,0x8c,0x26,0x39,0xbf,0xe4,0xe4,0xd4,0x6a,0x26}, + {0xa0,0x40,0xb2,0xf2,0x11,0xb6,0x5f,0x3d,0x4c,0x1e,0xef,0x59,0xd4,0x98,0xdb,0x14, + 0x01,0xff,0xe3,0x34,0xd7,0x19,0xcd,0xeb,0xde,0x52,0x1c,0xf4,0x86,0x43,0xc9,0xe2, + 0xfb,0xf9,0x4f,0x0a,0xbb,0x1f,0x5c,0x6a,0xdf,0xb9,0x28,0xfa,0xac,0xc4,0x48,0xed, + 0xcc,0xd2,0x2e,0x25,0x5f,0xf3,0x56,0x1d,0x2d,0x23,0x22,0xc1,0xbc,0xff,0x78,0x80} + }; + #endif +#else + static const uint8_t post_vectors[][64] = {{0}}; +#endif + diff --git a/deps/scrypt-jane-master/example.c b/deps/scrypt-jane-master/example.c new file mode 100644 index 000000000..6f290a13c --- /dev/null +++ b/deps/scrypt-jane-master/example.c @@ -0,0 +1,13 @@ +#include +#include "scrypt-jane.h" + + +int main(void) { + unsigned char digest[16]; + int i; + scrypt("pw", 2, "salt", 4, 0, 0, 0, digest, 16); + for (i = 0; i < sizeof(digest); i++) + printf("%02x, ", digest[i]); + printf("\n"); + return 0; +} \ No newline at end of file diff --git a/deps/scrypt-jane-master/scrypt-jane-speed.c b/deps/scrypt-jane-master/scrypt-jane-speed.c new file mode 100644 index 000000000..e8d61b3c0 --- /dev/null +++ b/deps/scrypt-jane-master/scrypt-jane-speed.c @@ -0,0 +1,121 @@ +#define SCRYPT_TEST_SPEED +#include "scrypt-jane.c" + +/* ticks - not tested on anything other than x86 */ +static uint64_t +get_ticks(void) { +#if defined(CPU_X86) || defined(CPU_X86_64) + #if defined(COMPILER_INTEL) + return _rdtsc(); + #elif defined(COMPILER_MSVC) + return __rdtsc(); + #elif defined(COMPILER_GCC) + uint32_t lo, hi; + __asm__ __volatile__("rdtsc" : "=a" (lo), "=d" (hi)); + return ((uint64_t)lo | ((uint64_t)hi << 32)); + #else + need rdtsc for this compiler + #endif +#elif defined(OS_SOLARIS) + return (uint64_t)gethrtime(); +#elif defined(CPU_SPARC) && !defined(OS_OPENBSD) + uint64_t t; + __asm__ __volatile__("rd %%tick, %0" : "=r" (t)); + return t; +#elif defined(CPU_PPC) + uint32_t lo = 0, hi = 0; + __asm__ __volatile__("mftbu %0; mftb %1" : "=r" (hi), "=r" (lo)); + return ((uint64_t)lo | ((uint64_t)hi << 32)); +#elif defined(CPU_IA64) + uint64_t t; + __asm__ __volatile__("mov %0=ar.itc" : "=r" (t)); + return t; +#elif defined(OS_NIX) + timeval t2; + gettimeofday(&t2, NULL); + t = ((uint64_t)t2.tv_usec << 32) | (uint64_t)t2.tv_sec; + return t; +#else + need ticks for this platform +#endif +} + +#define timeit(x,minvar) { \ + ticks = get_ticks(); \ + x; \ + ticks = get_ticks() - ticks; \ + if (ticks < minvar) \ + minvar = ticks; \ + } + +#define maxticks 0xffffffffffffffffull + +typedef struct scrypt_speed_settings_t { + const char *desc; + uint8_t Nfactor, rfactor, pfactor; +} scrypt_speed_settings; + +/* scrypt_r_32kb is set to a 32kb chunk, so (1 << (scrypt_r_32kb - 5)) = 1kb chunk */ +static const scrypt_speed_settings settings[] = { + {"scrypt high volume ( ~4mb)", 11, scrypt_r_32kb - 5, 0}, + {"scrypt interactive (~16mb)", 13, scrypt_r_32kb - 5, 0}, + {"scrypt non-interactive (~ 1gb)", 19, scrypt_r_32kb - 5, 0}, + {0} +}; + +int main(void) { + const scrypt_speed_settings *s; + uint8_t password[64], salt[24], digest[64]; + uint64_t minticks, ticks; + size_t i, passes; + size_t cpuflags, topbit; + + for (i = 0; i < sizeof(password); i++) + password[i] = (uint8_t)i; + for (i = 0; i < sizeof(salt); i++) + salt[i] = 255 - (uint8_t)i; + + /* warm up a little */ + scrypt(password, sizeof(password), salt, sizeof(salt), 15, 3, 4, digest, sizeof(digest)); + + cpuflags = available_implementations(); + topbit = 0; + for (i = cpuflags; i != 0; i >>= 1) + topbit++; + topbit = ((size_t)1 << topbit); + + while (1) { + #if defined(SCRYPT_CHOOSE_COMPILETIME) + printf("speed test for scrypt[%s,%s]\n", SCRYPT_HASH, SCRYPT_MIX); + #else + printf("speed test for scrypt[%s,%s,%s]\n", SCRYPT_HASH, SCRYPT_MIX, get_top_cpuflag_desc(cpuflags)); + #endif + + cpu_detect_mask = cpuflags; + for (i = 0; settings[i].desc; i++) { + s = &settings[i]; + minticks = maxticks; + for (passes = 0; passes < 16; passes++) + timeit(scrypt(password, sizeof(password), salt, sizeof(salt), s->Nfactor, s->rfactor, s->pfactor, digest, sizeof(digest)), minticks) + + printf("%s, %.0f ticks\n", s->desc, (double)minticks); + } + + #if defined(SCRYPT_CHOOSE_COMPILETIME) + break; + #else + while (topbit && ((cpuflags & topbit) == 0)) + topbit >>= 1; + cpuflags &= ~topbit; + + /* (cpuflags == 0) is the basic/portable version, don't bother timing it */ + if (!cpuflags) + break; + #endif + } + + printf("\n\n"); + + return 0; +} + diff --git a/deps/scrypt-jane-master/scrypt-jane-test.c b/deps/scrypt-jane-master/scrypt-jane-test.c new file mode 100644 index 000000000..808f84311 --- /dev/null +++ b/deps/scrypt-jane-master/scrypt-jane-test.c @@ -0,0 +1,12 @@ +#define SCRYPT_TEST +#include "scrypt-jane.c" + +int main(void) { + int res = scrypt_power_on_self_test(); + + printf("%s: test %s\n", SCRYPT_MIX, (res & 1) ? "ok" : "FAILED"); + printf("%s: test %s\n", SCRYPT_HASH, (res & 2) ? "ok" : "FAILED"); + printf("scrypt: test vectors %s\n", (res & 4) ? "ok" : "FAILED"); + + return ((res & 7) == 7) ? 0 : 1; +} diff --git a/deps/scrypt-jane-master/scrypt-jane.c b/deps/scrypt-jane-master/scrypt-jane.c new file mode 100644 index 000000000..e057c6d9a --- /dev/null +++ b/deps/scrypt-jane-master/scrypt-jane.c @@ -0,0 +1,182 @@ +/* + scrypt-jane by Andrew M, https://github.com/floodyberry/scrypt-jane + + Public Domain or MIT License, whichever is easier +*/ + +#include + +#include "scrypt-jane.h" +#include "code/scrypt-jane-portable.h" +#include "code/scrypt-jane-hash.h" +#include "code/scrypt-jane-romix.h" +#include "code/scrypt-jane-test-vectors.h" + + +#define scrypt_maxNfactor 30 /* (1 << (30 + 1)) = ~2 billion */ +#if (SCRYPT_BLOCK_BYTES == 64) +#define scrypt_r_32kb 8 /* (1 << 8) = 256 * 2 blocks in a chunk * 64 bytes = Max of 32kb in a chunk */ +#elif (SCRYPT_BLOCK_BYTES == 128) +#define scrypt_r_32kb 7 /* (1 << 7) = 128 * 2 blocks in a chunk * 128 bytes = Max of 32kb in a chunk */ +#elif (SCRYPT_BLOCK_BYTES == 256) +#define scrypt_r_32kb 6 /* (1 << 6) = 64 * 2 blocks in a chunk * 256 bytes = Max of 32kb in a chunk */ +#elif (SCRYPT_BLOCK_BYTES == 512) +#define scrypt_r_32kb 5 /* (1 << 5) = 32 * 2 blocks in a chunk * 512 bytes = Max of 32kb in a chunk */ +#endif +#define scrypt_maxrfactor scrypt_r_32kb /* 32kb */ +#define scrypt_maxpfactor 25 /* (1 << 25) = ~33 million */ + +#include +//#include + +static void NORETURN +scrypt_fatal_error_default(const char *msg) { + fprintf(stderr, "%s\n", msg); + exit(1); +} + +static scrypt_fatal_errorfn scrypt_fatal_error = scrypt_fatal_error_default; + +void +scrypt_set_fatal_error(scrypt_fatal_errorfn fn) { + scrypt_fatal_error = fn; +} + +static int +scrypt_power_on_self_test(void) { + const scrypt_test_setting *t; + uint8_t test_digest[64]; + uint32_t i; + int res = 7, scrypt_valid; + + if (!scrypt_test_mix()) { +#if !defined(SCRYPT_TEST) + scrypt_fatal_error("scrypt: mix function power-on-self-test failed"); +#endif + res &= ~1; + } + + if (!scrypt_test_hash()) { +#if !defined(SCRYPT_TEST) + scrypt_fatal_error("scrypt: hash function power-on-self-test failed"); +#endif + res &= ~2; + } + + for (i = 0, scrypt_valid = 1; post_settings[i].pw; i++) { + t = post_settings + i; + scrypt((uint8_t *)t->pw, strlen(t->pw), (uint8_t *)t->salt, strlen(t->salt), t->Nfactor, t->rfactor, t->pfactor, test_digest, sizeof(test_digest)); + scrypt_valid &= scrypt_verify(post_vectors[i], test_digest, sizeof(test_digest)); + } + + if (!scrypt_valid) { +#if !defined(SCRYPT_TEST) + scrypt_fatal_error("scrypt: scrypt power-on-self-test failed"); +#endif + res &= ~4; + } + + return res; +} + +typedef struct scrypt_aligned_alloc_t { + uint8_t *mem, *ptr; +} scrypt_aligned_alloc; + +#if defined(SCRYPT_TEST_SPEED) +static uint8_t *mem_base = (uint8_t *)0; +static size_t mem_bump = 0; + +/* allocations are assumed to be multiples of 64 bytes and total allocations not to exceed ~1.01gb */ +static scrypt_aligned_alloc +scrypt_alloc(uint64_t size) { + scrypt_aligned_alloc aa; + if (!mem_base) { + mem_base = (uint8_t *)malloc((1024 * 1024 * 1024) + (1024 * 1024) + (SCRYPT_BLOCK_BYTES - 1)); + if (!mem_base) + scrypt_fatal_error("scrypt: out of memory"); + mem_base = (uint8_t *)(((size_t)mem_base + (SCRYPT_BLOCK_BYTES - 1)) & ~(SCRYPT_BLOCK_BYTES - 1)); + } + aa.mem = mem_base + mem_bump; + aa.ptr = aa.mem; + mem_bump += (size_t)size; + return aa; +} + +static void +scrypt_free(scrypt_aligned_alloc *aa) { + mem_bump = 0; +} +#else +static scrypt_aligned_alloc +scrypt_alloc(uint64_t size) { + static const size_t max_alloc = (size_t)-1; + scrypt_aligned_alloc aa; + size += (SCRYPT_BLOCK_BYTES - 1); + if (size > max_alloc) + scrypt_fatal_error("scrypt: not enough address space on this CPU to allocate required memory"); + aa.mem = (uint8_t *)malloc((size_t)size); + aa.ptr = (uint8_t *)(((size_t)aa.mem + (SCRYPT_BLOCK_BYTES - 1)) & ~(SCRYPT_BLOCK_BYTES - 1)); + if (!aa.mem) + scrypt_fatal_error("scrypt: out of memory"); + return aa; +} + +static void +scrypt_free(scrypt_aligned_alloc *aa) { + free(aa->mem); +} +#endif + + +void +scrypt(const uint8_t *password, size_t password_len, const uint8_t *salt, size_t salt_len, uint8_t Nfactor, uint8_t rfactor, uint8_t pfactor, uint8_t *out, size_t bytes) { + scrypt_aligned_alloc YX, V; + uint8_t *X, *Y; + uint32_t N, r, p, chunk_bytes, i; + +#if !defined(SCRYPT_CHOOSE_COMPILETIME) + scrypt_ROMixfn scrypt_ROMix = scrypt_getROMix(); +#endif + +#if !defined(SCRYPT_TEST) + static int power_on_self_test = 0; + if (!power_on_self_test) { + power_on_self_test = 1; + if (!scrypt_power_on_self_test()) + scrypt_fatal_error("scrypt: power on self test failed"); + } +#endif + + if (Nfactor > scrypt_maxNfactor) + scrypt_fatal_error("scrypt: N out of range"); + if (rfactor > scrypt_maxrfactor) + scrypt_fatal_error("scrypt: r out of range"); + if (pfactor > scrypt_maxpfactor) + scrypt_fatal_error("scrypt: p out of range"); + + N = (1 << (Nfactor + 1)); + r = (1 << rfactor); + p = (1 << pfactor); + + chunk_bytes = SCRYPT_BLOCK_BYTES * r * 2; + V = scrypt_alloc((uint64_t)N * chunk_bytes); + YX = scrypt_alloc((p + 1) * chunk_bytes); + + /* 1: X = PBKDF2(password, salt) */ + Y = YX.ptr; + X = Y + chunk_bytes; + scrypt_pbkdf2(password, password_len, salt, salt_len, 1, X, chunk_bytes * p); + + /* 2: X = ROMix(X) */ + for (i = 0; i < p; i++) + scrypt_ROMix((scrypt_mix_word_t *)(X + (chunk_bytes * i)), (scrypt_mix_word_t *)Y, (scrypt_mix_word_t *)V.ptr, N, r); + + /* 3: Out = PBKDF2(password, X) */ + scrypt_pbkdf2(password, password_len, X, chunk_bytes * p, 1, out, bytes); + + scrypt_ensure_zero(YX.ptr, (p + 1) * chunk_bytes); + + scrypt_free(&V); + scrypt_free(&YX); +} diff --git a/deps/scrypt-jane-master/scrypt-jane.h b/deps/scrypt-jane-master/scrypt-jane.h new file mode 100644 index 000000000..1c0df6242 --- /dev/null +++ b/deps/scrypt-jane-master/scrypt-jane.h @@ -0,0 +1,27 @@ +#ifndef SCRYPT_JANE_H +#define SCRYPT_JANE_H + +/* + Nfactor: Increases CPU & Memory Hardness + N = (1 << (Nfactor + 1)): How many times to mix a chunk and how many temporary chunks are used + + rfactor: Increases Memory Hardness + r = (1 << rfactor): How large a chunk is + + pfactor: Increases CPU Hardness + p = (1 << pfactor): Number of times to mix the main chunk + + A block is the basic mixing unit (salsa/chacha block = 64 bytes) + A chunk is (2 * r) blocks + + ~Memory used = (N + 2) * ((2 * r) * block size) +*/ + +#include + +typedef void (*scrypt_fatal_errorfn)(const char *msg); +void scrypt_set_fatal_error(scrypt_fatal_errorfn fn); + +void scrypt(const unsigned char *password, size_t password_len, const unsigned char *salt, size_t salt_len, unsigned char Nfactor, unsigned char rfactor, unsigned char pfactor, unsigned char *out, size_t bytes); + +#endif /* SCRYPT_JANE_H */ diff --git a/deps/scrypt-jane-master/test-speed.sh b/deps/scrypt-jane-master/test-speed.sh new file mode 100644 index 000000000..f223dae49 --- /dev/null +++ b/deps/scrypt-jane-master/test-speed.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +test() { + sleep 0.25 # mingw is stupid and will occasionally not have permission to overwrite scrypt_speed + gcc scrypt-jane-speed.c -O3 -DSCRYPT_$1 -DSCRYPT_$2 $3 -o scrypt_speed 2>/dev/null + local RC=$? + if [ $RC -ne 0 ]; then + echo "$1/$2: failed to compile " + return + fi + ./scrypt_speed +} + +testhash() { + test $1 SALSA $2 + test $1 CHACHA $2 + test $1 SALSA64 $2 +} + +testhashes() { + testhash SHA256 $1 + testhash SHA512 $1 + testhash BLAKE256 $1 + testhash BLAKE512 $1 + testhash SKEIN512 $1 + testhash KECCAK256 $1 + testhash KECCAK512 $1 +} + +if [ -z $1 ]; then + testhashes +elif [ $1 -eq 32 ]; then + testhashes -m32 +elif [ $1 -eq 64 ]; then + testhashes -m64 +fi + +rm -f scrypt_speed \ No newline at end of file diff --git a/deps/scrypt-jane-master/test.sh b/deps/scrypt-jane-master/test.sh new file mode 100644 index 000000000..f1a1f62ce --- /dev/null +++ b/deps/scrypt-jane-master/test.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +test() { + sleep 0.25 # mingw is stupid and will occasionally not have permission to overwrite scrypt_test + gcc scrypt-jane-test.c -O3 -DSCRYPT_$1 -DSCRYPT_$2 $3 -o scrypt_test #2>/dev/null + local RC=$? + if [ $RC -ne 0 ]; then + echo "$1/$2: failed to compile " + return + fi + ./scrypt_test >/dev/null + local RC=$? + if [ $RC -ne 0 ]; then + echo "$1/$2: validation failed" + return + fi + echo "$1/$2: OK" +} + +testhash() { + test $1 SALSA $2 + test $1 CHACHA $2 + test $1 SALSA64 $2 +} + +testhashes() { + testhash SHA256 $1 + testhash SHA512 $1 + testhash BLAKE256 $1 + testhash BLAKE512 $1 + testhash SKEIN512 $1 + testhash KECCAK256 $1 + testhash KECCAK512 $1 +} + +if [ -z $1 ]; then + testhashes +elif [ $1 -eq 32 ]; then + testhashes -m32 +elif [ $1 -eq 64 ]; then + testhashes -m64 +fi + +rm -f scrypt_test diff --git a/deps/sse2neon/.ci/check-format.sh b/deps/sse2neon/.ci/check-format.sh new file mode 100755 index 000000000..de8aa178a --- /dev/null +++ b/deps/sse2neon/.ci/check-format.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +. .ci/common.sh + +set -x + +for file in ${SOURCES}; +do + clang-format-18 ${file} > expected-format + diff -u -p --label="${file}" --label="expected coding style" ${file} expected-format +done +exit $(clang-format-18 --output-replacements-xml ${SOURCES} | egrep -c "") diff --git a/deps/sse2neon/.ci/common.sh b/deps/sse2neon/.ci/common.sh new file mode 100644 index 000000000..e71682583 --- /dev/null +++ b/deps/sse2neon/.ci/common.sh @@ -0,0 +1,18 @@ +GCC_REL=14.2.rel1 +ARM_MIRROR=https://github.com/DLTcollab/toolchain-arm/raw/main + +SOURCES=$(find $(git rev-parse --show-toplevel) | egrep "\.(cpp|h)\$" | egrep -v "arm-gnu-toolchain-${GCC_REL}-x86_64-aarch64-none-linux-gnu|arm-gnu-toolchain-${GCC_REL}-x86_64-arm-none-linux-gnueabihf") + +# Expect host is Linux/x86_64 +check_platform() +{ + MACHINE_TYPE=`uname -m` + if [ ${MACHINE_TYPE} != 'x86_64' ]; then + exit + fi + + OS_TYPE=`uname -s` + if [ ${OS_TYPE} != 'Linux' ]; then + exit + fi +} diff --git a/deps/sse2neon/.ci/cross-check.sh b/deps/sse2neon/.ci/cross-check.sh new file mode 100755 index 000000000..c0f9fb849 --- /dev/null +++ b/deps/sse2neon/.ci/cross-check.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +. .ci/common.sh + +check_platform + +# Clang/LLVM is natively a cross-compiler. +# TODO: Do cross-compilation using Clang +# https://clang.llvm.org/docs/CrossCompilation.html +if [ $(printenv CXX | grep clang) ]; then + exit +fi + +set -x + +make clean +export PATH=arm-gnu-toolchain-${GCC_REL}-x86_64-aarch64-none-linux-gnu/bin:$PATH +make CROSS_COMPILE=aarch64-none-linux-gnu- check || exit 1 # ARMv8-A + +make clean +export PATH=arm-gnu-toolchain-${GCC_REL}-x86_64-arm-none-linux-gnueabihf/bin:$PATH +make CROSS_COMPILE=arm-none-linux-gnueabihf- check || exit 1 # ARMv7-A diff --git a/deps/sse2neon/.ci/cross-tool.sh b/deps/sse2neon/.ci/cross-tool.sh new file mode 100755 index 000000000..c2013cb4d --- /dev/null +++ b/deps/sse2neon/.ci/cross-tool.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +. .ci/common.sh + +check_platform + +sudo apt-get update -q -y +sudo apt-get install -q -y qemu-user + +# Clang/LLVM is natively a cross-compiler, meaning that one set of programs +# can compile to all targets by setting the -target option. +if [ $(printenv CXX | grep clang) ]; then + exit +fi + +set -x + +sudo apt-get install -y curl xz-utils + +curl -L \ + ${ARM_MIRROR}/arm-gnu-toolchain-${GCC_REL}-x86_64-arm-none-linux-gnueabihf.tar.xz \ + | tar -Jx || exit 1 + +curl -L \ + ${ARM_MIRROR}/arm-gnu-toolchain-${GCC_REL}-x86_64-aarch64-none-linux-gnu.tar.xz \ + | tar -Jx || exit 1 diff --git a/deps/sse2neon/.clang-format b/deps/sse2neon/.clang-format new file mode 100644 index 000000000..828c2be41 --- /dev/null +++ b/deps/sse2neon/.clang-format @@ -0,0 +1,22 @@ +BasedOnStyle: Chromium +Language: Cpp +MaxEmptyLinesToKeep: 3 +IndentCaseLabels: false +AllowShortIfStatementsOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +DerivePointerAlignment: false +PointerAlignment: Right +SpaceAfterCStyleCast: true +TabWidth: 4 +UseTab: Never +IndentWidth: 4 +BreakBeforeBraces: Linux +AccessModifierOffset: -4 +ForEachMacros: + - SET_FOREACH + - RB_FOREACH +AlignEscapedNewlines: Left +AttributeMacros: + - FORCE_INLINE + - ALIGN_STRUCT diff --git a/deps/sse2neon/.gitattributes b/deps/sse2neon/.gitattributes new file mode 100644 index 000000000..90767749d --- /dev/null +++ b/deps/sse2neon/.gitattributes @@ -0,0 +1,4 @@ +*.md text=auto +LICENSE text=auto + +sse2neon.h -text linguist-language=c diff --git a/deps/sse2neon/.github/CODEOWNERS b/deps/sse2neon/.github/CODEOWNERS new file mode 100644 index 000000000..e836a849c --- /dev/null +++ b/deps/sse2neon/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# Lines starting with '#' are comments. +# More details are here: https://help.github.com/articles/about-codeowners/ + +# Global codeowners: +* @jserv @howjmay diff --git a/deps/sse2neon/.github/workflows/main.yml b/deps/sse2neon/.github/workflows/main.yml new file mode 100644 index 000000000..4ee284b26 --- /dev/null +++ b/deps/sse2neon/.github/workflows/main.yml @@ -0,0 +1,127 @@ +name: GitHub Actions + +on: [push, pull_request] + +jobs: + host-x86: + runs-on: ubuntu-24.04 + strategy: + matrix: + arch: [x86_64] + cxx_compiler: [g++, clang++] + steps: + - name: checkout code + uses: actions/checkout@v4 + - name: build artifact + env: + CXX: ${{ matrix.cxx_compiler }} + run: | + sh .ci/cross-tool.sh + make check + sh .ci/cross-check.sh + + host-win: + runs-on: windows-2022 + strategy: + matrix: + arch: + - x86_64 + - armv7 + - aarch64 + env: + LLVM_MINGW_URL: https://github.com/mstorsjo/llvm-mingw/releases/download/20241217/llvm-mingw-20241217-msvcrt-x86_64.zip + defaults: + run: + shell: bash + steps: + - name: unpack llvm-mingw + run: | + curl -L -O $LLVM_MINGW_URL + unzip -q llvm-mingw-*.zip + rm llvm-mingw-*.zip + mv llvm-mingw-* "$HOME/llvm-mingw" + echo "$HOME/llvm-mingw/bin" >> $GITHUB_PATH + - name: checkout code + uses: actions/checkout@v4 + - name: build artifact + env: + CXX: ${{ matrix.arch }}-w64-mingw32-clang++ + run: mingw32-make processor=${{ matrix.arch }} + - name: run tests + if: matrix.arch == 'x86_64' + run: mingw32-make check + + host-arm: + runs-on: ubuntu-24.04 + strategy: + matrix: + arch_with_features: [ + {arch: armv7, feature: none, arch_cflags: none}, + {arch: aarch64, feature: none, arch_cflags: none}, + {arch: aarch64, feature: crypto+crc, arch_cflags: none}, + {arch: armv7, feature: none, arch_cflags: '-mcpu=cortex-a32 -mfpu=neon-fp-armv8'} + ] + cxx_compiler: [g++, clang++-15] + steps: + - name: checkout code + uses: actions/checkout@v4 + - name: build artifact + # The Github Action for non-x86 CPU + # https://github.com/uraimo/run-on-arch-action + uses: uraimo/run-on-arch-action@v2 + with: + arch: ${{ matrix.arch_with_features.arch }} + distro: ubuntu22.04 + # Speed up builds by storing container images in a GitHub package registry. + githubToken: ${{ github.token }} + env: | + CXX: ${{ matrix.cxx_compiler }} + ARCH_CFLAGS: ${{ matrix.arch_with_features.arch_cflags }} + install: | + apt-get update -q -y + apt-get install -q -y gcc "${{ matrix.cxx_compiler }}" make + run: | + make FEATURE=${{ matrix.arch_with_features.feature }} check + + host-win-msvc: + runs-on: windows-2022 + steps: + - name: checkout code + uses: actions/checkout@v4 + + - name: add msbuild to PATH + uses: microsoft/setup-msbuild@v2 + + - name: build artifact + run: msbuild sse2neon.vcxproj -t:rebuild -property:Configuration=Release -property:Platform=ARM64 + + - name: upload artifact + uses: actions/upload-artifact@master + with: + name: msvc-arm64-artifact + path: ARM64 + + test-win-msvc: + runs-on: ubuntu-24.04 + container: linaro/wine-arm64 + needs: host-win-msvc + steps: + - name: download artifact + uses: actions/download-artifact@master + with: + name: msvc-arm64-artifact + + - name: Run tests + run: wine-arm64 cmd.exe /c 'Release\sse2neon.exe' + + + coding-style: + runs-on: ubuntu-24.04 + steps: + - name: checkout code + uses: actions/checkout@v4 + - name: style check + run: | + sudo apt-get install -q -y clang-format-18 + sh .ci/check-format.sh + shell: bash diff --git a/deps/sse2neon/.gitignore b/deps/sse2neon/.gitignore new file mode 100644 index 000000000..e8b0dfb31 --- /dev/null +++ b/deps/sse2neon/.gitignore @@ -0,0 +1,10 @@ +*.exe +*.o +*.gch +tests/*.d +tests/main +gcc-arm-* +.vs/ +Debug/ +Release/ +*.vcxproj.user diff --git a/deps/sse2neon/CONTRIBUTING.md b/deps/sse2neon/CONTRIBUTING.md new file mode 100644 index 000000000..60afe860c --- /dev/null +++ b/deps/sse2neon/CONTRIBUTING.md @@ -0,0 +1,462 @@ +# Contributing to SSE2NEON + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +The following is a set of guidelines for contributing to [SSE2NEON](https://github.com/DLTcollab/sse2neon), +hosted on GitHub. These are mostly guidelines, not rules. Use your best +judgment, and feel free to propose changes to this document in a pull request. + +## Issues + +This project uses GitHub Issues to track ongoing development, discuss project plans, and keep track of bugs. Be sure to search for existing issues before you create another one. + +Visit our [Issues page on GitHub](https://github.com/DLTcollab/sse2neon/issues) to search and submit. + +## Add New Intrinsic + +The new intrinsic conversion should be added in the `sse2neon.h` file, +and it should be placed in the correct classification with the alphabetical order. +The classification can be referenced from [Intel Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html). + +Classification: `SSE`, `SSE2`, `SSE3`, `SSSE3`, `SSE4.1`, `SSE4.2` + +## Coding Convention + +We welcome all contributions from corporate, acaddemic and individual developers. However, there are a number of fundamental ground rules that you must adhere to in order to participate. These rules are outlined as follows: +* All code must adhere to the existing C coding style (see below). While we are somewhat flexible in basic style, you will adhere to what is currently in place. Uncommented, complicated algorithmic constructs will be rejected. +* All external pull requests must contain sufficient documentation in the pull request comments in order to be accepted. + +Software requirement: [clang-format](https://clang.llvm.org/docs/ClangFormat.html) version 18 or later. + +Use the command `$ clang-format -i *.[ch]` to enforce a consistent coding style. + +## Naming Conventions + +There are some general rules. +* Names with leading and trailing underscores are reserved for system purposes, and most systems use them for names that the user should not have to know. +* Function, typedef, and variable names, as well as struct, union, and enum tag names should be in lower case. +* Many function-like macros are in all CAPS. +* Avoid names that differ only in case, like `foo` and `Foo`. Similarly, avoid `foobar` and `foo_bar`. The potential for confusion is considerable. +* Similarly, avoid names that look like each other. On many terminals and printers, `l`, `1` and `I` look quite similar. A variable named `l` is particularly bad because it looks so much like the constant `1`. + +In general, global names (including enums) should have a common prefix (`SSE2NEON_` for macros and enum constants; `_sse2neon_` for functions) identifying the module that they belong with. Globals may alternatively be grouped in a global structure. Typedeffed names often have `_t` appended to their name. + +Avoid using names that might conflict with other names used in standard libraries. There may be more library code included in some systems than you need. Your program could also be extended in the future. + +## Coding Style for Modern C + +This coding style is a variation of the K&R style. Some general principles: honor tradition, but accept progress; be consistent; +embrace the latest C standards; embrace modern compilers, their static analysis +capabilities and sanitizers. + +### Indentation + +Use 4 spaces rather than tabs. + +### Line length + +All lines should generally be within 80 characters. Wrap long lines. +There are some good reasons behind this: +* It forces the developer to write more succinct code; +* Humans are better at processing information in smaller quantity portions; +* It helps users of vi/vim (and potentially other editors) who use vertical splits. + +### Comments + +Multi-line comments shall have the opening and closing characters +in a separate line, with the lines containing the content prefixed by a space +and the `*` characters for alignment, e.g., +```c +/* + * This is a multi-line comment. + */ + +/* One line comment. */ +``` + +Use multi-line comments for more elaborative descriptions or before more +significant logical block of code. + +Single-line comments shall be written in C89 style: +```c + return (uintptr_t) val; /* return a bitfield */ +``` + +Leave two spaces between the statement and the inline comment. + +### Spacing and brackets + +Use one space after the conditional or loop keyword, no spaces around +their brackets, and one space before the opening curly bracket. + +Functions (their declarations or calls), `sizeof` operator or similar +macros shall not have a space after their name/keyword or around the +brackets, e.g., +```c +unsigned total_len = offsetof(obj_t, items[n]); +unsigned obj_len = sizeof(obj_t); +``` + +Use brackets to avoid ambiguity and with operators such as `sizeof`, +but otherwise avoid redundant or excessive brackets. + +### Variable names and declarations + +- Use descriptive names for global variables and short names for locals. +Find the right balance between descriptive and succinct. + +- Use [snakecase](https://en.wikipedia.org/wiki/Snake_case). +Do not use "camelcase". + +- Do not use Hungarian notation or other unnecessary prefixing or suffixing. + +- Use the following spacing for pointers: +```c +const char *name; /* const pointer; '*' with the name and space before it */ +conf_t * const cfg; /* pointer to a const data; spaces around 'const' */ +const uint8_t * const charmap; /* const pointer and const data */ +const void * restrict key; /* const pointer which does not alias */ +``` + +### Type definitions + +Declarations shall be on the same line, e.g., +```c +typedef void (*dir_iter_t)(void *, const char *, struct dirent *); +``` + +_Typedef_ structures rather than pointers. Note that structures can be kept +opaque if they are not dereferenced outside the translation unit where they +are defined. Pointers can be _typedefed_ only if there is a very compelling +reason. + +New types may be suffixed with `_t`. Structure name, when used within the +translation unit, may be omitted, e.g.: + +```c +typedef struct { + unsigned if_index; + unsigned addr_len; + addr_t next_hop; +} route_info_t; +``` + +### Initialization + +Embrace C99 structure initialization where reasonable, e.g., +```c +static const crypto_ops_t openssl_ops = { + .create = openssl_crypto_create, + .destroy = openssl_crypto_destroy, + .encrypt = openssl_crypto_encrypt, + .decrypt = openssl_crypto_decrypt, + .hmac = openssl_crypto_hmac, +}; +``` + +Embrace C99 array initialization, especially for the state machines, e.g., +```c +static const uint8_t tcp_fsm[TCP_NSTATES][2][TCPFC_COUNT] = { + [TCPS_CLOSED] = { + [FLOW_FORW] = { + /* Handshake (1): initial SYN. */ + [TCPFC_SYN] = TCPS_SYN_SENT, + }, + }, + ... +} +``` + +### Control structures + +Try to make the control flow easy to follow. Avoid long convoluted logic +expressions; try to split them where possible (into inline functions, +separate if-statements, etc). + +The control structure keyword and the expression in the brackets should be +separated by a single space. The opening curly bracket shall be in the +same line, also separated by a single space. Example: + +```c + for (;;) { + obj = get_first(); + while ((obj = get_next(obj))) { + ... + } + if (done) + break; + } +``` + +Do not add inner spaces around the brackets. There should be one space after +the semicolon when `for` has expressions: +```c + for (unsigned i = 0; i < __arraycount(items); i++) { + ... + } +``` + +#### Avoid unnecessary nesting levels + +Avoid: +```c +int inspect(obj_t *obj) +{ + if (cond) { + ... + /* long code block */ + ... + return 0; + } + return -1; +} +``` + +Consider: +```c +int inspect(obj_t *obj) +{ + if (!cond) + return -1; + + ... + return 0; +} +``` + +However, do not make logic more convoluted. + +### `if` statements + +Curly brackets and spacing follow the K&R style: +```c + if (a == b) { + .. + } else if (a < b) { + ... + } else { + ... + } +``` + +Simple and succinct one-line if-statements may omit curly brackets: +```c + if (!valid) + return -1; +``` + +However, do prefer curly brackets with multi-line or more complex statements. +If one branch uses curly brackets, then all other branches shall use the +curly brackets too. + +Wrap long conditions to the if-statement indentation adding extra 4 spaces: +```c + if (some_long_expression && + another_expression) { + ... + } +``` + +#### Avoid redundant `else` + +Avoid: +```c + if (flag & F_FEATURE_X) { + ... + return 0; + } else { + return -1; + } +``` + +Consider: +```c + if (flag & F_FEATURE_X) { + ... + return 0; + } + return -1; +``` + +### `switch` statements + +Switch statements should have the `case` blocks at the same indentation +level, e.g.: +```c + switch (expr) { + case A: + ... + break; + case B: + /* fallthrough */ + case C: + ... + break; + } +``` + +If the case block does not break, then it is strongly recommended to add a +comment containing "fallthrough" to indicate it. Modern compilers can also +be configured to require such comment (see gcc `-Wimplicit-fallthrough`). + +### Function definitions + +The opening and closing curly brackets shall also be in the separate lines (K&R style). + +```c +ssize_t hex_write(FILE *stream, const void *buf, size_t len) +{ + ... +} +``` + +Do not use old style K&R style C definitions. + +### Object abstraction + +Objects are often "simulated" by the C programmers with a `struct` and +its "public API". To enforce the information hiding principle, it is a +good idea to define the structure in the source file (translation unit) +and provide only the _declaration_ in the header. For example, `obj.c`: + +```c +#include "obj.h" + +struct obj { + int value; +} + +obj_t *obj_create(void) +{ + return calloc(1, sizeof(obj_t)); +} + +void obj_destroy(obj_t *obj) +{ + free(obj); +} +``` + +With an example `obj.h`: +```c +#ifndef _OBJ_H_ +#define _OBJ_H_ + +typedef struct obj; + +obj_t *obj_create(void); +void obj_destroy(obj_t *); + +#endif +``` + +Such structuring will prevent direct access of the `obj_t` members outside +the `obj.c` source file. The implementation (of such "class" or "module") +may be large and abstracted within separate source files. In such case, +consider separating structures and "methods" into separate headers (think of +different visibility), for example `obj_impl.h` (private) and `obj.h` (public). + +Consider `crypto_impl.h`: +```c +#ifndef _CRYPTO_IMPL_H_ +#define _CRYPTO_IMPL_H_ + +#if !defined(__CRYPTO_PRIVATE) +#error "only to be used by the crypto modules" +#endif + +#include "crypto.h" + +typedef struct crypto { + crypto_cipher_t cipher; + void *key; + size_t key_len; + ... +} +... + +#endif +``` + +And `crypto.h` (public API): + +```c +#ifndef _CRYPTO_H_ +#define _CRYPTO_H_ + +typedef struct crypto crypto_t; + +crypto_t *crypto_create(crypto_cipher_t); +void crypto_destroy(crypto_t *); +... + +#endif +``` + +### Use reasonable types + +Use `unsigned` for general iterators; use `size_t` for general sizes; use +`ssize_t` to return a size which may include an error. Of course, consider +possible overflows. + +Avoid using `uint8_t` or `uint16_t` or other sub-word types for general +iterators and similar cases, unless programming for micro-controllers or +other constrained environments. + +C has rather peculiar _type promotion rules_ and unnecessary use of sub-word +types might contribute to a bug once in a while. + +### Embrace portability + +#### Byte-order + +Do not assume x86 or little-endian architecture. Use endian conversion +functions for operating the on-disk and on-the-wire structures or other +cases where it is appropriate. + +#### Types + +- Do not assume a particular 32-bit vs 64-bit architecture, e.g., do not +assume the size of `long` or `unsigned long`. Use `int64_t` or `uint64_t` +for the 8-byte integers. + +- Do not assume `char` is signed; for example, on Arm it is unsigned. + +- Use C99 macros for constant prefixes or formatting of the fixed-width +types. + +Use: +```c +#define SOME_CONSTANT (UINT64_C(1) << 48) +printf("val %" PRIu64 "\n", SOME_CONSTANT); +``` + +Do not use: +```c +#define SOME_CONSTANT (1ULL << 48) +printf("val %lld\n", SOME_CONSTANT); +``` + +#### Avoid unaligned access + +Do not assume unaligned access is safe. It is not safe on Arm, POWER, +and various other architectures. Moreover, even on x86 unaligned access +is slower. + +#### Avoid extreme portability + +Unless programming for micro-controllers or exotic CPU architectures, +focus on the common denominator of the modern CPU architectures, avoiding +the very maximum portability which can make the code unnecessarily cumbersome. + +Some examples: +- It is fair to assume `sizeof(int) == 4` since it is the case on all modern +mainstream architectures. PDP-11 era is long gone. +- Using `1U` instead of `UINT32_C(1)` or `(uint32_t) 1` is also fine. +- It is fair to assume that `NULL` is matching `(uintptr_t) 0` and it is fair +to `memset()` structures with zero. Non-zero `NULL` is for retro computing. + +## References +- [Linux kernel coding style](https://www.kernel.org/doc/html/latest/process/coding-style.html) +- 1999, Brian W. Kernighan and Rob Pike, The Practice of Programming, Addison–Wesley. +- 1993, Bill Shannon, [C Style and Coding Standards for SunOS](https://devnull-cz.github.io/unix-linux-prog-in-c/cstyle.ms.pdf) diff --git a/deps/sse2neon/LICENSE b/deps/sse2neon/LICENSE new file mode 100644 index 000000000..edc36de51 --- /dev/null +++ b/deps/sse2neon/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2015-2025 SSE2NEON Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/deps/sse2neon/Makefile b/deps/sse2neon/Makefile new file mode 100644 index 000000000..0a80e68d2 --- /dev/null +++ b/deps/sse2neon/Makefile @@ -0,0 +1,93 @@ +ifndef CC +override CC = gcc +endif + +ifndef CXX +override CXX = g++ +endif + +ifndef CROSS_COMPILE + processor := $(shell uname -m) +else # CROSS_COMPILE was set + CC = $(CROSS_COMPILE)gcc + CXX = $(CROSS_COMPILE)g++ + CXXFLAGS += -static + LDFLAGS += -static + check_arm := $(shell echo | $(CROSS_COMPILE)cpp -dM - | grep " __ARM_ARCH " | cut -c20-) + ifeq ($(check_arm),8) + processor = aarch64 + else ifeq ($(check_arm),7) # detect ARMv7-A only + processor = arm + else + $(error Unsupported cross-compiler) + endif +endif + +EXEC_WRAPPER = +ifdef CROSS_COMPILE +EXEC_WRAPPER = qemu-$(processor) +endif + +# Follow platform-specific configurations +ARCH_CFLAGS ?= +ARCH_CFLAGS_IS_SET = +ifeq ($(ARCH_CFLAGS),) + ARCH_CFLAGS_IS_SET = true +endif +ifeq ($(ARCH_CFLAGS),none) + ARCH_CFLAGS_IS_SET = true +endif +ifdef ARCH_CFLAGS_IS_SET + ifeq ($(processor),$(filter $(processor),aarch64 arm64)) + override ARCH_CFLAGS := -march=armv8-a+fp+simd + else ifeq ($(processor),$(filter $(processor),i386 x86_64)) + override ARCH_CFLAGS := -maes -mpclmul -mssse3 -msse4.2 + else ifeq ($(processor),$(filter $(processor),arm armv7 armv7l)) + override ARCH_CFLAGS := -mfpu=neon + else + $(error Unsupported architecture) + endif +endif + +FEATURE ?= +ifneq ($(FEATURE),) +ifneq ($(FEATURE),none) +COMMA:= , +ARCH_CFLAGS := $(ARCH_CFLAGS)+$(subst $(COMMA),+,$(FEATURE)) +endif +endif + +CXXFLAGS += -Wall -Wcast-qual -Wconversion -I. $(ARCH_CFLAGS) -std=gnu++14 +LDFLAGS += -lm +OBJS = \ + tests/binding.o \ + tests/common.o \ + tests/impl.o \ + tests/main.o +deps := $(OBJS:%.o=%.o.d) + +.SUFFIXES: .o .cpp +.cpp.o: + $(CXX) -o $@ $(CXXFLAGS) -c -MMD -MF $@.d $< + +EXEC = tests/main + +$(EXEC): $(OBJS) + $(CXX) $(LDFLAGS) -o $@ $^ + +check: tests/main +ifeq ($(processor),$(filter $(processor),aarch64 arm64 arm armv7l)) + $(CC) $(ARCH_CFLAGS) -c sse2neon.h +endif + $(EXEC_WRAPPER) $^ + +indent: + @echo "Formatting files with clang-format.." + @if ! hash clang-format-18; then echo "clang-format-18 is required to indent"; fi + clang-format-18 -i sse2neon.h tests/*.cpp tests/*.h + +.PHONY: clean check format +clean: + $(RM) $(OBJS) $(EXEC) $(deps) sse2neon.h.gch + +-include $(deps) diff --git a/deps/sse2neon/README.md b/deps/sse2neon/README.md new file mode 100644 index 000000000..cf6a38275 --- /dev/null +++ b/deps/sse2neon/README.md @@ -0,0 +1,300 @@ +# sse2neon +![GitHub Actions](https://github.com/DLTcollab/sse2neon/workflows/GitHub%20Actions/badge.svg) + +A C/C++ header file that converts Intel SSE intrinsics to Arm/Aarch64 NEON intrinsics. + +## Introduction + +`sse2neon` is a translator of Intel SSE (Streaming SIMD Extensions) intrinsics +to [Arm NEON](https://developer.arm.com/architectures/instruction-sets/simd-isas/neon), +shortening the time needed to get an Arm working program that then can be used to +extract profiles and to identify hot paths in the code. +The header file `sse2neon.h` contains several of the functions provided by Intel +intrinsic headers such as ``, only implemented with NEON-based counterparts +to produce the exact semantics of the intrinsics. + +## Mapping and Coverage + +Header file | Extension | +---|---| +`` | MMX | +`` | SSE | +`` | SSE2 | +`` | SSE3 | +`` | SSSE3 | +`` | SSE4.1 | +`` | SSE4.2 | +`` | AES | + +`sse2neon` aims to support SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AES extension. + +In order to deliver NEON-equivalent intrinsics for all SSE intrinsics used widely, +please be aware that some SSE intrinsics exist a direct mapping with a concrete +NEON-equivalent intrinsic. Others, unfortunately, lack a 1:1 mapping, meaning that +their equivalents are built utilizing a number of NEON intrinsics. + +For example, SSE intrinsic `_mm_loadu_si128` has a direct NEON mapping (`vld1q_s32`), +but SSE intrinsic `_mm_maddubs_epi16` has to be implemented with 13+ NEON instructions. + +### Floating-point compatibility + +Some conversions require several NEON intrinsics, which may produce inconsistent results +compared to their SSE counterparts due to differences in the arithmetic rules of IEEE-754. + +Taking a possible conversion of `_mm_rsqrt_ps` as example: + +```c +__m128 _mm_rsqrt_ps(__m128 in) +{ + float32x4_t out = vrsqrteq_f32(vreinterpretq_f32_m128(in)); + + out = vmulq_f32( + out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out)); + + return vreinterpretq_m128_f32(out); +} +``` + +The `_mm_rsqrt_ps` conversion will produce NaN if a source value is `0.0` (first INF for the +reciprocal square root of `0.0`, then INF * `0.0` using `vmulq_f32`). In contrast, +the SSE counterpart produces INF if a source value is `0.0`. +As a result, additional treatments should be applied to ensure consistency between the conversion and its SSE counterpart. + +## Requirement + +Developers are advised to utilize sse2neon.h with GCC version 10 or higher, or Clang version 11 or higher. While sse2neon.h might be compatible with earlier versions, certain vector operation errors have been identified in those versions. For further details, refer to the discussion in issue [#622](https://github.com/DLTcollab/sse2neon/issues/622). + +## Usage + +- Put the file `sse2neon.h` in to your source code directory. + +- Locate the following SSE header files included in the code: +```C +#include +#include +``` + {p,t,s,n,w}mmintrin.h could be replaceable as well. + +- Replace them with: +```C +#include "sse2neon.h" +``` +- If you target Windows Arm64EC, pass `/D_DISABLE_SOFTINTRIN_=1` to MSVC or add `#define _DISABLE_SOFTINTRIN_ 1` in before `#include` any Windows header files to disable implicit inclusion of SSE header files. +- Explicitly specify platform-specific options to gcc/clang compilers. + * On ARMv8-A 64-bit targets, you should specify the following compiler option: (Remove `crypto` and/or `crc` if your architecture does not support cryptographic and/or CRC32 extensions) + ```shell + -march=armv8-a+fp+simd+crypto+crc + ``` + * On ARMv8-A 32-bit targets, you should specify the following compiler option: + ```shell + -mfpu=neon-fp-armv8 + ``` + * On ARMv7-A targets, you need to append the following compiler option: + ```shell + -mfpu=neon + ``` + +## Compile-time Configurations + +Though floating-point operations in NEON use the IEEE single-precision format, NEON does not fully comply to the IEEE standard when inputs or results are denormal or NaN values for minimizing power consumption as well as maximizing performance. +Considering the balance between correctness and performance, `sse2neon` recognizes the following compile-time configurations: +* `SSE2NEON_PRECISE_MINMAX`: Enable precise implementation of `_mm_min_{ps,pd}` and `_mm_max_{ps,pd}`. If you need consistent results such as handling with NaN values, enable it. +* `SSE2NEON_PRECISE_DIV`: Enable precise implementation of `_mm_rcp_ps` and `_mm_div_ps` by additional Netwon-Raphson iteration for accuracy. +* `SSE2NEON_PRECISE_SQRT`: Enable precise implementation of `_mm_sqrt_ps` and `_mm_rsqrt_ps` by additional Netwon-Raphson iteration for accuracy. +* `SSE2NEON_PRECISE_DP`: Enable precise implementation of `_mm_dp_pd`. When the conditional bit is not set, the corresponding multiplication would not be executed. +* `SSE2NEON_SUPPRESS_WARNINGS`: Set this macro to disable the warning which is emitted by default when optimizations are enabled. + +The above are turned off by default, and you should define the corresponding macro(s) as `1` before including `sse2neon.h` if you need the precise implementations. + +## Run Built-in Test Suite + +`sse2neon` provides a unified interface for developing test cases. These test +cases are located in `tests` directory, and the input data is specified at +runtime. Use the following commands to perform test cases: +```shell +$ make check +``` + +For running check with enabling features, you can use assign the features with `FEATURE` command. +If `none` is assigned, then the command will be the same as simply calling `make check`. +The following command enable `crypto` and `crc` features in the tests. +``` +$ make FEATURE=crypto+crc check +``` + +For running check on certain CPU, setting the mode of FPU, etc., +you can also assign the desired options with `ARCH_CFLAGS` command. +If `none` is assigned, the command acts as same as calling `make check`. +For instance, to run tests on Cortex-A53 with enabling ARM VFPv4 extension and NEON: +``` +$ make ARCH_CFLAGS="-mcpu=cortex-a53 -mfpu=neon-vfpv4" check +``` + +### Running tests on hosts other than ARM platform + +For running tests on hosts other than ARM platform, +you can specify GNU toolchain for cross compilation with `CROSS_COMPILE` command. +[QEMU](https://www.qemu.org/) should be installed in advance. + +For ARMv8-A running in 64-bit mode type: +```shell +$ make CROSS_COMPILE=aarch64-linux-gnu- check # ARMv8-A +``` + +For ARMv7-A type: +```shell +$ make CROSS_COMPILE=arm-linux-gnueabihf- check # ARMv7-A +``` + +For ARMv8-A running in 32-bit mode (A32 instruction set) type: +```shell +$ make \ + CROSS_COMPILE=arm-linux-gnueabihf- \ + ARCH_CFLAGS="-mcpu=cortex-a32 -mfpu=neon-fp-armv8" \ + check +``` + +Check the details via [Test Suite for SSE2NEON](tests/README.md). + +### Optimization + +The SSE2NEON project is designed with performance-sensitive scenarios in mind, and as such, optimization options (e.g. `O1`, `O2`) can lead to misbehavior under specific circumstances. For example, frequent changes to the rounding mode or repeated calls to `_MM_SET_DENORMALS_ZERO_MODE()` may introduce unintended behavior. + +Enforcing no optimizations for specific intrinsics could solve these boundary cases but may negatively impact general performance. Therefore, we have decided to prioritize performance and shift the responsibility for handling such edge cases to developers. + +It is important to be aware of these potential pitfalls when enabling optimizations and ensure that your code accounts for these scenarios if necessary. + + +## Adoptions +Here is a partial list of open source projects that have adopted `sse2neon` for Arm/Aarch64 support. +* [Aaru Data Preservation Suite](https://www.aaru.app/) is a fully-featured software package to preserve all storage media from the very old to the cutting edge, as well as to give detailed information about any supported image file (whether from Aaru or not) and to extract the files from those images. +* [aether-game-utils](https://github.com/johnhues/aether-game-utils) is a collection of cross platform utilities for quickly creating small game prototypes in C++. +* [ALE](https://github.com/sc932/ALE), aka Assembly Likelihood Evaluation, is a tool for evaluating accuracy of assemblies without the need of a reference genome. +* [AnchorWave](https://github.com/baoxingsong/AnchorWave), Anchored Wavefront Alignment, identifies collinear regions via conserved anchors (full-length CDS and full-length exon have been implemented currently) and breaks collinear regions into shorter fragments, i.e., anchor and inter-anchor intervals. +* [ATAK-CIV](https://github.com/deptofdefense/AndroidTacticalAssaultKit-CIV), Android Tactical Assault Kit for Civilian Use, is the official geospatial-temporal and situational awareness tool used by the US Government. +* [Apache Doris](https://doris.apache.org/) is a Massively Parallel Processing (MPP) based interactive SQL data warehousing for reporting and analysis. +* [Apache Impala](https://impala.apache.org/) is a lightning-fast, distributed SQL queries for petabytes of data stored in Apache Hadoop clusters. +* [Apache Kudu](https://kudu.apache.org/) completes Hadoop's storage layer to enable fast analytics on fast data. +* [apollo](https://github.com/ApolloAuto/apollo) is a high performance, flexible architecture which accelerates the development of Autonomous Vehicles. +* [ares](https://github.com/ares-emulator/ares) is a cross-platform, open source, multi-system emulator, focusing on accuracy and preservation. +* [ART](https://github.com/dinosaure/art) is an implementation in OCaml of [Adaptive Radix Tree](https://db.in.tum.de/~leis/papers/ART.pdf) (ART). +* [Async](https://github.com/romange/async) is a set of c++ primitives that allows efficient and rapid development in C++17 on GNU/Linux systems. +* [avec](https://github.com/unevens/avec) is a little library for using SIMD instructions on both x86 and Arm. +* [BEAGLE](https://github.com/beagle-dev/beagle-lib) is a high-performance library that can perform the core calculations at the heart of most Bayesian and Maximum Likelihood phylogenetics packages. +* [BitMagic](https://github.com/tlk00/BitMagic) implements compressed bit-vectors and containers (vectors) based on ideas of bit-slicing transform and Rank-Select compression, offering sets of method to architect your applications to use HPC techniques to save memory (thus be able to fit more data in one compute unit) and improve storage and traffic patterns when storing data vectors and models in files or object stores. +* [bipartite\_motif\_finder](https://github.com/soedinglab/bipartite_motif_finder) as known as BMF (Bipartite Motif Finder) is an open source tool for finding co-occurences of sequence motifs in genomic sequences. +* [Blender](https://www.blender.org/) is the free and open source 3D creation suite, supporting the entirety of the 3D pipeline. +* [Boo](https://github.com/AxioDL/boo) is a cross-platform windowing and event manager similar to SDL or SFML, with additional 3D rendering functionality. +* [Brickworks](https://github.com/sdangelo/brickworks) is a music DSP toolkit that supplies with the fundamental building blocks for creating and enhancing audio engines on any platform. +* [CARTA](https://github.com/CARTAvis/carta-backend) is a new visualization tool designed for viewing radio astronomy images in CASA, FITS, MIRIAD, and HDF5 formats (using the IDIA custom schema for HDF5). +* [Catcoon](https://github.com/i-evi/catcoon) is a [feedforward neural network](https://en.wikipedia.org/wiki/Feedforward_neural_network) implementation in C. +* [compute-runtime](https://github.com/intel/compute-runtime), the Intel Graphics Compute Runtime for oneAPI Level Zero and OpenCL Driver, provides compute API support (Level Zero, OpenCL) for Intel graphics hardware architectures (HD Graphics, Xe). +* [contour](https://github.com/contour-terminal/contour) is a modern and actually fast virtual terminal emulator. +* [Cog](https://github.com/losnoco/Cog) is a free and open source audio player for macOS. +* [dab-cmdline](https://github.com/JvanKatwijk/dab-cmdline) provides entries for the functionality to handle Digital audio broadcasting (DAB)/DAB+ through some simple calls. +* [DISTRHO](https://distrho.sourceforge.io/) is an open-source project for Cross-Platform Audio Plugins. +* [Dragonfly](https://github.com/dragonflydb/dragonfly) is a modern in-memory datastore, fully compatible with Redis and Memcached APIs. +* [EDGE](https://github.com/3dfxdev/EDGE) is an advanced OpenGL source port spawned from the DOOM engine, with focus on easy development and expansion for modders and end-users. +* [Embree](https://github.com/embree/embree) is a collection of high-performance ray tracing kernels. Its target users are graphics application engineers who want to improve the performance of their photo-realistic rendering application by leveraging Embree's performance-optimized ray tracing kernels. +* [emp-tool](https://github.com/emp-toolkit/emp-tool) aims to provide a benchmark for secure computation and allowing other researchers to experiment and extend. +* [Exudyn](https://github.com/jgerstmayr/EXUDYN) is a C++ based Python library for efficient simulation of flexible multibody dynamics systems. +* [FoundationDB](https://www.foundationdb.org) is a distributed database designed to handle large volumes of structured data across clusters of commodity servers. +* [fsrc](https://github.com/elsamuko/fsrc) is capable of searching large codebases for text snippets. +* [GDAL](https://gdal.org) is a translator library for raster and vector geospatial data formats that comes with a variety of useful command line utilities for data translation and processing. +* [gmmlib](https://github.com/intel/gmmlib) is the Intel Graphics Memory Management Library that provides device specific and buffer management for the Intel Graphics Compute Runtime for OpenCL and the Intel Media Driver for VAAPI. +* [HISE](https://github.com/christophhart/HISE) is a cross-platform open source audio application for building virtual instruments, emphasizing on sampling, but includes some basic synthesis features for making hybrid instruments as well as audio effects. +* [iqtree2](https://github.com/iqtree/iqtree2) is an efficient and versatile stochastic implementation to infer phylogenetic trees by maximum likelihood. +* [indelPost](https://github.com/stjude/indelPost) is a Python library for indel processing via realignment and read-based phasing to resolve alignment ambiguities. +* [IResearch](https://github.com/iresearch-toolkit/iresearch) is a cross-platform, high-performance document oriented search engine library written entirely in C++ with the focus on a pluggability of different ranking/similarity models. +* [Kraken](https://github.com/Wabi-Studios/Kraken) is a 3D animation platform redefining animation composition, collaborative workflows, simulation engines, skeletal rigging systems, and look development from storyboard to final render. +* [kram](https://github.com/alecazam/kram) is a wrapper to several popular encoders to and from PNG/[KTX](https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/) files with [LDR/HDR and BC/ASTC/ETC2](https://developer.arm.com/solutions/graphics-and-gaming/developer-guides/learn-the-basics/adaptive-scalable-texture-compression/single-page). +* [Krita](https://invent.kde.org/graphics/krita) is a cross-platform application that offers an end-to-end solution for creating digital art files from scratch built on the KDE and Qt frameworks. +* [libCML](https://github.com/belosthomas/libCML) is a SLAM library and scientific tool, which include a novel fast thread-safe graph map implementation. +* [libhdfs3](https://github.com/ClickHouse/libhdfs3) is implemented based on native Hadoop RPC protocol and Hadoop Distributed File System (HDFS), a highly fault-tolerant distributed fs, data transfer protocol. +* [libpostal](https://github.com/openvenues/libpostal) is a C library for parsing/normalizing street addresses around the world using statistical NLP and open data. +* [libscapi](https://github.com/cryptobiu/libscapi) stands for the "Secure Computation API", providing reliable, efficient, and highly flexible cryptographic infrastructure. +* [libstreamvbyte](https://github.com/wst24365888/libstreamvbyte) is a C++ implementation of [StreamVByte](https://arxiv.org/abs/1709.08990). +* [libmatoya](https://github.com/matoya/libmatoya) is a cross-platform application development library, providing various features such as common cryptography tasks. +* [Loosejaw](https://github.com/TheHolyDiver/Loosejaw) provides deep hybrid CPU/GPU digital signal processing. +* [Madronalib](https://github.com/madronalabs/madronalib) enables efficient audio DSP on SIMD processors with readable and brief C++ code. +* [minimap2](https://github.com/lh3/minimap2) is a versatile sequence alignment program that aligns DNA or mRNA sequences against a large reference database. +* [mixed-fem](https://github.com/tytrusty/mixed-fem) is an open source reference implementation of Mixed Variational Finite Elements for Implicit Simulation of Deformables. +* [MMseqs2](https://github.com/soedinglab/MMseqs2) (Many-against-Many sequence searching) is a software suite to search and cluster huge protein and nucleotide sequence sets. +* [MRIcroGL](https://github.com/rordenlab/MRIcroGL) is a cross-platform tool for viewing NIfTI, DICOM, MGH, MHD, NRRD, AFNI format medical images. +* [N2](https://github.com/oddconcepts/n2o) is an approximate nearest neighborhoods algorithm library written in C++, providing a much faster search speed than other implementations when modeling large dataset. +* [nanors](https://github.com/sleepybishop/nanors) is a tiny, performant implementation of [Reed-Solomon codes](https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction), capable of reaching multi-gigabit speeds on a single core. +* [niimath](https://github.com/rordenlab/niimath) is a general image calculator with superior performance. +* [NVIDIA GameWorks](https://developer.nvidia.com/gameworks-source-github) has been already used in a lot of games. These repositories are public on GitHub. +* [Nx Meta Platform Open Source Components](https://github.com/networkoptix/nx_open) are used to build all Powered-by-Nx products including Nx Witness Video Management System (VMS). +* [ofxNDI](https://github.com/leadedge/ofxNDI) is an [openFrameworks](https://openframeworks.cc/) addon to allow sending and receiving images over a network using the [NewTek](https://en.wikipedia.org/wiki/NewTek) Network Device Protocol. +* [OGRE](https://github.com/OGRECave/ogre) is a scene-oriented, flexible 3D engine written in C++ designed to make it easier and more intuitive for developers to produce games and demos utilising 3D hardware. +* [Olive](https://github.com/olive-editor/olive) is a free non-linear video editor for Windows, macOS, and Linux. +* [OpenColorIO](https://github.com/AcademySoftwareFoundation/OpenColorIO) a complete color management solution geared towards motion picture production with an emphasis on visual effects and computer animation. +* [OpenXRay](https://github.com/OpenXRay/xray-16) is an improved version of the X-Ray engine, used in world famous S.T.A.L.K.E.R. game series by GSC Game World. +* [parallel-n64](https://github.com/libretro/parallel-n64) is an optimized/rewritten Nintendo 64 emulator made specifically for [Libretro](https://www.libretro.com/). +* [Pathfinder C++](https://github.com/floppyhammer/pathfinder-cpp) is a fast, practical, GPU-based rasterizer for fonts and vector graphics using Vulkan and C++. +* [PFFFT](https://github.com/marton78/pffft) does 1D Fast Fourier Transforms, of single precision real and complex vectors. +* [pixaccess](https://github.com/oliverue/pixaccess) provides the abstractions for integer and float bitmaps, pixels, and aliased (nearest neighbor) and anti-aliased (bi-linearly interpolated) pixel access. +* [PlutoSDR Firmware](https://github.com/seanstone/plutosdr-fw) is the customized firmware for the [PlutoSDR](https://wiki.analog.com/university/tools/pluto) that can be used to introduce fundamentals of Software Defined Radio (SDR) or Radio Frequency (RF) or Communications as advanced topics in electrical engineering in a self or instructor lead setting. +* [PowerToys](https://github.com/microsoft/PowerToys) is a set of utilities for power users to tune and streamline their Windows experience for greater productivity. +* [Pygame](https://www.pygame.org) is cross-platform and designed to make it easy to write multimedia software, such as games, in Python. +* [R:RandomFieldsUtils](https://cran.r-project.org/web/packages/RandomFieldsUtils) provides various utilities might be used in spatial statistics and elsewhere. (CRAN) +* [RAxML](https://github.com/stamatak/standard-RAxML) is tool for Phylogenetic Analysis and Post-Analysis of Large Phylogenies. +* [ReHLDS](https://github.com/gennadykataev/rehlds) is fully compatible with latest Half-Life Dedicated Server (HLDS) with a lot of defects and (potential) bugs fixed. +* [rkcommon](https://github.com/ospray/rkcommon) represents a common set of C++ infrastructure and CMake utilities used by various components of [Intel oneAPI Rendering Toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/rendering-toolkit.html). +* [RPCS3](https://github.com/RPCS3/rpcs3) is the world's first free and open-source PlayStation 3 emulator/debugger, written in C++. +* [simd\_utils](https://github.com/JishinMaster/simd_utils) is a header-only library implementing common mathematical functions using SIMD intrinsics. +* [Sire](https://github.com/OpenBioSim/sire) is a molecular modelling framework that provides extensive functionality to manipulate representations of biomolecular systems. +* [SMhasher](https://github.com/rurban/smhasher) provides comprehensive Hash function quality and speed tests. +* [SNN++](https://github.com/ianmkim/snnpp) implements a single layer non linear Spiking Neural Network for images classification and generation. +* [Spack](https://github.com/spack/spack) is a multi-platform package manager that builds and installs multiple versions and configurations of software. +* [SRA](https://github.com/ncbi/sra-tools) is a collection of tools and libraries for using data in the [INSDC Sequence Read Archives](https://www.ncbi.nlm.nih.gov/sra/docs/). +* [srsLTE](https://github.com/srsLTE/srsLTE) is an open source SDR LTE software suite. +* [SSW](https://github.com/mengyao/Complete-Striped-Smith-Waterman-Library) is a fast implementation of the [Smith-Waterman algorithm](https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm), which uses the SIMD instructions to parallelize the algorithm at the instruction level. +* [Surge](https://github.com/surge-synthesizer/surge) is an open source digital synthesizer. +* [The Forge](https://github.com/ConfettiFX/The-Forge) is a cross-platform rendering framework, providing building blocks to write your own game engine. +* [Typesense](https://github.com/typesense/typesense) is a fast, typo-tolerant search engine for building delightful search experiences. +* [Vcpkg](https://github.com/microsoft/vcpkg) is a C++ Library Manager for Windows, Linux, and macOS. +* [VelocyPack](https://github.com/arangodb/velocypack) is a fast and compact format for serialization and storage. +* [VOLK](https://github.com/gnuradio/volk), Vector-Optimized Library of Kernel, is a sub-project of [GNU Radio](https://www.gnuradio.org/). +* [Vowpal Wabbit](https://github.com/VowpalWabbit/vowpal_wabbit) is a machine learning system which pushes the frontier of machine learning with techniques such as online, hashing, allreduce, reductions, learning2search, active, and interactive learning. +* [Winter](https://github.com/rosenthj/Winter) is the top rated chess engine from Switzerland and has competed at top invite only computer chess events. +* [XEVE](https://github.com/mpeg5/xeve) (eXtra-fast Essential Video Encoder) is an open sourced and fast MPEG-5 EVC encoder. +* [XMRig](https://github.com/xmrig/xmrig) is an open source CPU miner for [Monero](https://web.getmonero.org/) cryptocurrency. +* [xsimd](https://github.com/xtensor-stack/xsimd) provides a unified means for using SIMD intrinsics and parallelized, optimized mathematical functions. +* [YACL](https://github.com/secretflow/yasl) is a C++ library contains modules and utilities which [SecretFlow](https://github.com/secretflow) code depends on. + +## Related Projects +* [SIMDe](https://github.com/simd-everywhere/simde): fast and portable implementations of SIMD + intrinsics on hardware which doesn't natively support them, such as calling SSE functions on ARM. +* [CatBoost's sse2neon](https://github.com/catboost/catboost/blob/master/library/cpp/sse/sse2neon.h) +* [ARM\_NEON\_2\_x86\_SSE](https://github.com/intel/ARM_NEON_2_x86_SSE) +* [AvxToNeon](https://github.com/kunpengcompute/AvxToNeon) +* [sse2rvv](https://github.com/FeddrickAquino/sse2rvv): C header file that converts Intel SSE intrinsics to RISC-V Vector intrinsic. +* [sse2msa](https://github.com/i-evi/sse2msa): A C/C++ header file that converts Intel SSE intrinsics to MIPS/MIPS64 MSA intrinsics. +* [sse2zig](https://github.com/aqrit/sse2zig): Intel SSE intrinsics mapped to [Zig](https://ziglang.org/) vector extensions. +* [POWER/PowerPC support for GCC](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000) contains a series of headers simplifying porting x86\_64 code that makes explicit use of Intel intrinsics to powerpc64le (pure little-endian mode that has been introduced with the [POWER8](https://en.wikipedia.org/wiki/POWER8)). + - implementation: [xmmintrin.h](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000/xmmintrin.h), [emmintrin.h](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000/emmintrin.h), [pmmintrin.h](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000/pmmintrin.h), [tmmintrin.h](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000/tmmintrin.h), [smmintrin.h](https://github.com/gcc-mirror/gcc/blob/master/gcc/config/rs6000/smmintrin.h) + +## Reference +* [Intel Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html) +* [Microsoft: x86 intrinsics list](https://learn.microsoft.com/en-us/cpp/intrinsics/x86-intrinsics-list) +* [Arm Neon Intrinsics Reference](https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics) +* [Neon Programmer's Guide for Armv8-A](https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/neon-programmers-guide-for-armv8-a) +* [NEON Programmer's Guide](https://static.docs.arm.com/den0018/a/DEN0018A_neon_programmers_guide_en.pdf) +* [qemu/target/i386/ops\_sse.h](https://github.com/qemu/qemu/blob/master/target/i386/ops_sse.h): Comprehensive SSE instruction emulation in C. Ideal for semantic checks. +* [Porting Takua Renderer to 64-bit ARM- Part 1](https://blog.yiningkarlli.com/2021/05/porting-takua-to-arm-pt1.html) +* [Porting Takua Renderer to 64-bit ARM- Part 2](https://blog.yiningkarlli.com/2021/07/porting-takua-to-arm-pt2.html) +* [Comparing SIMD on x86-64 and arm64](https://blog.yiningkarlli.com/2021/09/neon-vs-sse.html) +* [Port with SSE2Neon and SIMDe](https://developer.arm.com/documentation/102581/0200/Port-with-SSE2Neon-and-SIMDe) +* [Genomics: Optimizing the BWA aligner for Arm Servers](https://community.arm.com/arm-community-blogs/b/high-performance-computing-blog/posts/optimizing-genomics-and-the-bwa-aligner-for-arm-servers) +* [Bit twiddling with Arm Neon: beating SSE movemasks, counting bits and more](https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon) +* [C/C++ on Graviton](https://github.com/aws/aws-graviton-getting-started/blob/main/c-c%2B%2B.md) +* [C/C++ on NVIDIA Grace](https://nvidia.github.io/grace-cpu-benchmarking-guide/developer/languages/c-c++.html) +* [Tune graphics-intensive games for Apple silicon](https://developer.apple.com/games/pathway/) +* [Benchmarking and Testing of Qualcomm Snapdragon System-on-Chip for JPL Space Applications and Missions](https://ieeexplore.ieee.org/abstract/document/9843518) +* [Spotlight: Petrobras Speeds Up Linear Solvers for Reservoir Simulation Using NVIDIA Grace CPU](https://developer.nvidia.com/blog/spotlight-petrobras-accelerates-linear-solvers-for-reservoir-simulation-using-nvidia-grace-cpu/) + +## Licensing + +`sse2neon` is freely redistributable under the MIT License. diff --git a/deps/sse2neon/sse2neon.h b/deps/sse2neon/sse2neon.h new file mode 100644 index 000000000..67728aac4 --- /dev/null +++ b/deps/sse2neon/sse2neon.h @@ -0,0 +1,9447 @@ +#ifndef SSE2NEON_H +#define SSE2NEON_H + +/* + * sse2neon is freely redistributable under the MIT License. + * + * Copyright (c) 2015-2024 SSE2NEON Contributors. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +// This header file provides a simple API translation layer +// between SSE intrinsics to their corresponding Arm/Aarch64 NEON versions +// +// Contributors to this work are: +// John W. Ratcliff +// Brandon Rowlett +// Ken Fast +// Eric van Beurden +// Alexander Potylitsin +// Hasindu Gamaarachchi +// Jim Huang +// Mark Cheng +// Malcolm James MacLeod +// Devin Hussey (easyaspi314) +// Sebastian Pop +// Developer Ecosystem Engineering +// Danila Kutenin +// François Turban (JishinMaster) +// Pei-Hsuan Hung +// Yang-Hao Yuan +// Syoyo Fujita +// Brecht Van Lommel +// Jonathan Hue +// Cuda Chen +// Aymen Qader +// Anthony Roberts +// Sean Luchen + +/* Tunable configurations */ + +/* Enable precise implementation of math operations + * This would slow down the computation a bit, but gives consistent result with + * x86 SSE. (e.g. would solve a hole or NaN pixel in the rendering result) + */ +/* _mm_min|max_ps|ss|pd|sd */ +#ifndef SSE2NEON_PRECISE_MINMAX +#define SSE2NEON_PRECISE_MINMAX (0) +#endif +/* _mm_rcp_ps */ +#ifndef SSE2NEON_PRECISE_DIV +#define SSE2NEON_PRECISE_DIV (0) +#endif +/* _mm_sqrt_ps and _mm_rsqrt_ps */ +#ifndef SSE2NEON_PRECISE_SQRT +#define SSE2NEON_PRECISE_SQRT (0) +#endif +/* _mm_dp_pd */ +#ifndef SSE2NEON_PRECISE_DP +#define SSE2NEON_PRECISE_DP (0) +#endif + +/* Enable inclusion of windows.h on MSVC platforms + * This makes _mm_clflush functional on windows, as there is no builtin. + */ +#ifndef SSE2NEON_INCLUDE_WINDOWS_H +#define SSE2NEON_INCLUDE_WINDOWS_H (0) +#endif + +/* compiler specific definitions */ +#if defined(__GNUC__) || defined(__clang__) +#pragma push_macro("FORCE_INLINE") +#pragma push_macro("ALIGN_STRUCT") +#define FORCE_INLINE static inline __attribute__((always_inline)) +#define ALIGN_STRUCT(x) __attribute__((aligned(x))) +#define _sse2neon_likely(x) __builtin_expect(!!(x), 1) +#define _sse2neon_unlikely(x) __builtin_expect(!!(x), 0) +#elif defined(_MSC_VER) +#if _MSVC_TRADITIONAL +#error Using the traditional MSVC preprocessor is not supported! Use /Zc:preprocessor instead. +#endif +#ifndef FORCE_INLINE +#define FORCE_INLINE static inline +#endif +#ifndef ALIGN_STRUCT +#define ALIGN_STRUCT(x) __declspec(align(x)) +#endif +#define _sse2neon_likely(x) (x) +#define _sse2neon_unlikely(x) (x) +#else +#pragma message("Macro name collisions may happen with unsupported compilers.") +#endif + +#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 10 +#warning "GCC versions earlier than 10 are not supported." +#endif + +#if defined(__OPTIMIZE__) && !defined(SSE2NEON_SUPPRESS_WARNINGS) +#warning \ + "Report any potential compiler optimization issues when using SSE2NEON. See the 'Optimization' section at https://github.com/DLTcollab/sse2neon." +#endif + +/* C language does not allow initializing a variable with a function call. */ +#ifdef __cplusplus +#define _sse2neon_const static const +#else +#define _sse2neon_const const +#endif + +#include +#include +#include +#include + +FORCE_INLINE double sse2neon_recast_u64_f64(uint64_t val) +{ + double tmp; + memcpy(&tmp, &val, sizeof(uint64_t)); + return tmp; +} +FORCE_INLINE int64_t sse2neon_recast_f64_s64(double val) +{ + int64_t tmp; + memcpy(&tmp, &val, sizeof(uint64_t)); + return tmp; +} + +#if defined(_WIN32) && !defined(__MINGW32__) +/* Definitions for _mm_{malloc,free} are provided by from MSVC. */ +#define SSE2NEON_ALLOC_DEFINED +#endif + +/* If using MSVC */ +#ifdef _MSC_VER +#if defined(_M_ARM64EC) +#define _DISABLE_SOFTINTRIN_ 1 +#endif +#include +#if SSE2NEON_INCLUDE_WINDOWS_H +#include +#include +#endif + +#if !defined(__cplusplus) +#error SSE2NEON only supports C++ compilation with this compiler +#endif + +#ifdef SSE2NEON_ALLOC_DEFINED +#include +#endif + +#if (defined(_M_AMD64) || defined(__x86_64__)) || \ + (defined(_M_ARM64) || defined(_M_ARM64EC) || defined(__arm64__)) +#define SSE2NEON_HAS_BITSCAN64 +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +#define _sse2neon_define0(type, s, body) \ + __extension__({ \ + type _a = (s); \ + body \ + }) +#define _sse2neon_define1(type, s, body) \ + __extension__({ \ + type _a = (s); \ + body \ + }) +#define _sse2neon_define2(type, a, b, body) \ + __extension__({ \ + type _a = (a), _b = (b); \ + body \ + }) +#define _sse2neon_return(ret) (ret) +#else +#define _sse2neon_define0(type, a, body) [=](type _a) { body }(a) +#define _sse2neon_define1(type, a, body) [](type _a) { body }(a) +#define _sse2neon_define2(type, a, b, body) \ + [](type _a, type _b) { body }((a), (b)) +#define _sse2neon_return(ret) return ret +#endif + +#define _sse2neon_init(...) \ + { \ + __VA_ARGS__ \ + } + +/* Compiler barrier */ +#if defined(_MSC_VER) && !defined(__clang__) +#define SSE2NEON_BARRIER() _ReadWriteBarrier() +#else +#define SSE2NEON_BARRIER() \ + do { \ + __asm__ __volatile__("" ::: "memory"); \ + (void) 0; \ + } while (0) +#endif + +/* Memory barriers + * __atomic_thread_fence does not include a compiler barrier; instead, + * the barrier is part of __atomic_load/__atomic_store's "volatile-like" + * semantics. + */ +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#include +#endif + +FORCE_INLINE void _sse2neon_smp_mb(void) +{ + SSE2NEON_BARRIER(); +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(__STDC_NO_ATOMICS__) + atomic_thread_fence(memory_order_seq_cst); +#elif defined(__GNUC__) || defined(__clang__) + __atomic_thread_fence(__ATOMIC_SEQ_CST); +#else /* MSVC */ + __dmb(_ARM64_BARRIER_ISH); +#endif +} + +/* Architecture-specific build options */ +/* FIXME: #pragma GCC push_options is only available on GCC */ +#if defined(__GNUC__) +#if defined(__arm__) && __ARM_ARCH == 7 +/* According to ARM C Language Extensions Architecture specification, + * __ARM_NEON is defined to a value indicating the Advanced SIMD (NEON) + * architecture supported. + */ +#if !defined(__ARM_NEON) || !defined(__ARM_NEON__) +#error "You must enable NEON instructions (e.g. -mfpu=neon) to use SSE2NEON." +#endif +#if !defined(__clang__) +#pragma GCC push_options +#pragma GCC target("fpu=neon") +#endif +#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#if !defined(__clang__) && !defined(_MSC_VER) +#pragma GCC push_options +#pragma GCC target("+simd") +#endif +#elif __ARM_ARCH == 8 +#if !defined(__ARM_NEON) || !defined(__ARM_NEON__) +#error \ + "You must enable NEON instructions (e.g. -mfpu=neon-fp-armv8) to use SSE2NEON." +#endif +#if !defined(__clang__) && !defined(_MSC_VER) +#pragma GCC push_options +#endif +#else +#error \ + "Unsupported target. Must be either ARMv7-A+NEON or ARMv8-A \ +(you could try setting target explicitly with -march or -mcpu)" +#endif +#endif + +#include +#if (!defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC)) && \ + (__ARM_ARCH == 8) +#if defined __has_include && __has_include() +#include +#endif +#endif + +/* Apple Silicon cache lines are double of what is commonly used by Intel, AMD + * and other Arm microarchitectures use. + * From sysctl -a on Apple M1: + * hw.cachelinesize: 128 + */ +#if defined(__APPLE__) && (defined(__aarch64__) || defined(__arm64__)) +#define SSE2NEON_CACHELINE_SIZE 128 +#else +#define SSE2NEON_CACHELINE_SIZE 64 +#endif + +/* Rounding functions require either Aarch64 instructions or libm fallback */ +#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC) +#include +#endif + +/* On ARMv7, some registers, such as PMUSERENR and PMCCNTR, are read-only + * or even not accessible in user mode. + * To write or access to these registers in user mode, + * we have to perform syscall instead. + */ +#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC) +#include +#endif + +/* "__has_builtin" can be used to query support for built-in functions + * provided by gcc/clang and other compilers that support it. + */ +#ifndef __has_builtin /* GCC prior to 10 or non-clang compilers */ +/* Compatibility with gcc <= 9 */ +#if defined(__GNUC__) && (__GNUC__ <= 9) +#define __has_builtin(x) HAS##x +#define HAS__builtin_popcount 1 +#define HAS__builtin_popcountll 1 + +// __builtin_shuffle introduced in GCC 4.7.0 +#if (__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) +#define HAS__builtin_shuffle 1 +#else +#define HAS__builtin_shuffle 0 +#endif + +#define HAS__builtin_shufflevector 0 +#define HAS__builtin_nontemporal_store 0 +#else +#define __has_builtin(x) 0 +#endif +#endif + +/** + * MACRO for shuffle parameter for _mm_shuffle_ps(). + * Argument fp3 is a digit[0123] that represents the fp from argument "b" + * of mm_shuffle_ps that will be placed in fp3 of result. fp2 is the same + * for fp2 in result. fp1 is a digit[0123] that represents the fp from + * argument "a" of mm_shuffle_ps that will be places in fp1 of result. + * fp0 is the same for fp0 of result. + */ +#define _MM_SHUFFLE(fp3, fp2, fp1, fp0) \ + (((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | ((fp0))) + +/** + * MACRO for shuffle parameter for _mm_shuffle_pd(). + * Argument fp1 is a digit[01] that represents the fp from argument "b" + * of mm_shuffle_pd that will be placed in fp1 of result. + * fp0 is a digit[01] that represents the fp from argument "a" of mm_shuffle_pd + * that will be placed in fp0 of result. + */ +#define _MM_SHUFFLE2(fp1, fp0) (((fp1) << 1) | (fp0)) + +#if __has_builtin(__builtin_shufflevector) +#define _sse2neon_shuffle(type, a, b, ...) \ + __builtin_shufflevector(a, b, __VA_ARGS__) +#elif __has_builtin(__builtin_shuffle) +#define _sse2neon_shuffle(type, a, b, ...) \ + __extension__({ \ + type tmp = {__VA_ARGS__}; \ + __builtin_shuffle(a, b, tmp); \ + }) +#endif + +#ifdef _sse2neon_shuffle +#define vshuffle_s16(a, b, ...) _sse2neon_shuffle(int16x4_t, a, b, __VA_ARGS__) +#define vshuffleq_s16(a, b, ...) _sse2neon_shuffle(int16x8_t, a, b, __VA_ARGS__) +#define vshuffle_s32(a, b, ...) _sse2neon_shuffle(int32x2_t, a, b, __VA_ARGS__) +#define vshuffleq_s32(a, b, ...) _sse2neon_shuffle(int32x4_t, a, b, __VA_ARGS__) +#define vshuffle_s64(a, b, ...) _sse2neon_shuffle(int64x1_t, a, b, __VA_ARGS__) +#define vshuffleq_s64(a, b, ...) _sse2neon_shuffle(int64x2_t, a, b, __VA_ARGS__) +#endif + +/* Rounding mode macros. */ +#define _MM_FROUND_TO_NEAREST_INT 0x00 +#define _MM_FROUND_TO_NEG_INF 0x01 +#define _MM_FROUND_TO_POS_INF 0x02 +#define _MM_FROUND_TO_ZERO 0x03 +#define _MM_FROUND_CUR_DIRECTION 0x04 +#define _MM_FROUND_NO_EXC 0x08 +#define _MM_FROUND_RAISE_EXC 0x00 +#define _MM_FROUND_NINT (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_RAISE_EXC) +#define _MM_FROUND_FLOOR (_MM_FROUND_TO_NEG_INF | _MM_FROUND_RAISE_EXC) +#define _MM_FROUND_CEIL (_MM_FROUND_TO_POS_INF | _MM_FROUND_RAISE_EXC) +#define _MM_FROUND_TRUNC (_MM_FROUND_TO_ZERO | _MM_FROUND_RAISE_EXC) +#define _MM_FROUND_RINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_RAISE_EXC) +#define _MM_FROUND_NEARBYINT (_MM_FROUND_CUR_DIRECTION | _MM_FROUND_NO_EXC) +#define _MM_ROUND_NEAREST 0x0000 +#define _MM_ROUND_DOWN 0x2000 +#define _MM_ROUND_UP 0x4000 +#define _MM_ROUND_TOWARD_ZERO 0x6000 +/* Flush zero mode macros. */ +#define _MM_FLUSH_ZERO_MASK 0x8000 +#define _MM_FLUSH_ZERO_ON 0x8000 +#define _MM_FLUSH_ZERO_OFF 0x0000 +/* Denormals are zeros mode macros. */ +#define _MM_DENORMALS_ZERO_MASK 0x0040 +#define _MM_DENORMALS_ZERO_ON 0x0040 +#define _MM_DENORMALS_ZERO_OFF 0x0000 + +/* indicate immediate constant argument in a given range */ +#define __constrange(a, b) const + +/* A few intrinsics accept traditional data types like ints or floats, but + * most operate on data types that are specific to SSE. + * If a vector type ends in d, it contains doubles, and if it does not have + * a suffix, it contains floats. An integer vector type can contain any type + * of integer, from chars to shorts to unsigned long longs. + */ +typedef int64x1_t __m64; +typedef float32x4_t __m128; /* 128-bit vector containing 4 floats */ +// On ARM 32-bit architecture, the float64x2_t is not supported. +// The data type __m128d should be represented in a different way for related +// intrinsic conversion. +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +typedef float64x2_t __m128d; /* 128-bit vector containing 2 doubles */ +#else +typedef float32x4_t __m128d; +#endif +typedef int64x2_t __m128i; /* 128-bit vector containing integers */ + +// Some intrinsics operate on unaligned data types. +typedef int16_t ALIGN_STRUCT(1) unaligned_int16_t; +typedef int32_t ALIGN_STRUCT(1) unaligned_int32_t; +typedef int64_t ALIGN_STRUCT(1) unaligned_int64_t; + +// __int64 is defined in the Intrinsics Guide which maps to different datatype +// in different data model +#if !(defined(_WIN32) || defined(_WIN64) || defined(__int64)) +#if (defined(__x86_64__) || defined(__i386__)) +#define __int64 long long +#else +#define __int64 int64_t +#endif +#endif + +/* type-safe casting between types */ + +#define vreinterpretq_m128_f16(x) vreinterpretq_f32_f16(x) +#define vreinterpretq_m128_f32(x) (x) +#define vreinterpretq_m128_f64(x) vreinterpretq_f32_f64(x) + +#define vreinterpretq_m128_u8(x) vreinterpretq_f32_u8(x) +#define vreinterpretq_m128_u16(x) vreinterpretq_f32_u16(x) +#define vreinterpretq_m128_u32(x) vreinterpretq_f32_u32(x) +#define vreinterpretq_m128_u64(x) vreinterpretq_f32_u64(x) + +#define vreinterpretq_m128_s8(x) vreinterpretq_f32_s8(x) +#define vreinterpretq_m128_s16(x) vreinterpretq_f32_s16(x) +#define vreinterpretq_m128_s32(x) vreinterpretq_f32_s32(x) +#define vreinterpretq_m128_s64(x) vreinterpretq_f32_s64(x) + +#define vreinterpretq_f16_m128(x) vreinterpretq_f16_f32(x) +#define vreinterpretq_f32_m128(x) (x) +#define vreinterpretq_f64_m128(x) vreinterpretq_f64_f32(x) + +#define vreinterpretq_u8_m128(x) vreinterpretq_u8_f32(x) +#define vreinterpretq_u16_m128(x) vreinterpretq_u16_f32(x) +#define vreinterpretq_u32_m128(x) vreinterpretq_u32_f32(x) +#define vreinterpretq_u64_m128(x) vreinterpretq_u64_f32(x) + +#define vreinterpretq_s8_m128(x) vreinterpretq_s8_f32(x) +#define vreinterpretq_s16_m128(x) vreinterpretq_s16_f32(x) +#define vreinterpretq_s32_m128(x) vreinterpretq_s32_f32(x) +#define vreinterpretq_s64_m128(x) vreinterpretq_s64_f32(x) + +#define vreinterpretq_m128i_s8(x) vreinterpretq_s64_s8(x) +#define vreinterpretq_m128i_s16(x) vreinterpretq_s64_s16(x) +#define vreinterpretq_m128i_s32(x) vreinterpretq_s64_s32(x) +#define vreinterpretq_m128i_s64(x) (x) + +#define vreinterpretq_m128i_u8(x) vreinterpretq_s64_u8(x) +#define vreinterpretq_m128i_u16(x) vreinterpretq_s64_u16(x) +#define vreinterpretq_m128i_u32(x) vreinterpretq_s64_u32(x) +#define vreinterpretq_m128i_u64(x) vreinterpretq_s64_u64(x) + +#define vreinterpretq_f32_m128i(x) vreinterpretq_f32_s64(x) +#define vreinterpretq_f64_m128i(x) vreinterpretq_f64_s64(x) + +#define vreinterpretq_s8_m128i(x) vreinterpretq_s8_s64(x) +#define vreinterpretq_s16_m128i(x) vreinterpretq_s16_s64(x) +#define vreinterpretq_s32_m128i(x) vreinterpretq_s32_s64(x) +#define vreinterpretq_s64_m128i(x) (x) + +#define vreinterpretq_u8_m128i(x) vreinterpretq_u8_s64(x) +#define vreinterpretq_u16_m128i(x) vreinterpretq_u16_s64(x) +#define vreinterpretq_u32_m128i(x) vreinterpretq_u32_s64(x) +#define vreinterpretq_u64_m128i(x) vreinterpretq_u64_s64(x) + +#define vreinterpret_m64_s8(x) vreinterpret_s64_s8(x) +#define vreinterpret_m64_s16(x) vreinterpret_s64_s16(x) +#define vreinterpret_m64_s32(x) vreinterpret_s64_s32(x) +#define vreinterpret_m64_s64(x) (x) + +#define vreinterpret_m64_u8(x) vreinterpret_s64_u8(x) +#define vreinterpret_m64_u16(x) vreinterpret_s64_u16(x) +#define vreinterpret_m64_u32(x) vreinterpret_s64_u32(x) +#define vreinterpret_m64_u64(x) vreinterpret_s64_u64(x) + +#define vreinterpret_m64_f16(x) vreinterpret_s64_f16(x) +#define vreinterpret_m64_f32(x) vreinterpret_s64_f32(x) +#define vreinterpret_m64_f64(x) vreinterpret_s64_f64(x) + +#define vreinterpret_u8_m64(x) vreinterpret_u8_s64(x) +#define vreinterpret_u16_m64(x) vreinterpret_u16_s64(x) +#define vreinterpret_u32_m64(x) vreinterpret_u32_s64(x) +#define vreinterpret_u64_m64(x) vreinterpret_u64_s64(x) + +#define vreinterpret_s8_m64(x) vreinterpret_s8_s64(x) +#define vreinterpret_s16_m64(x) vreinterpret_s16_s64(x) +#define vreinterpret_s32_m64(x) vreinterpret_s32_s64(x) +#define vreinterpret_s64_m64(x) (x) + +#define vreinterpret_f32_m64(x) vreinterpret_f32_s64(x) + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#define vreinterpretq_m128d_s32(x) vreinterpretq_f64_s32(x) +#define vreinterpretq_m128d_s64(x) vreinterpretq_f64_s64(x) + +#define vreinterpretq_m128d_u64(x) vreinterpretq_f64_u64(x) + +#define vreinterpretq_m128d_f32(x) vreinterpretq_f64_f32(x) +#define vreinterpretq_m128d_f64(x) (x) + +#define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f64(x) + +#define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f64(x) +#define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f64(x) + +#define vreinterpretq_f64_m128d(x) (x) +#define vreinterpretq_f32_m128d(x) vreinterpretq_f32_f64(x) +#else +#define vreinterpretq_m128d_s32(x) vreinterpretq_f32_s32(x) +#define vreinterpretq_m128d_s64(x) vreinterpretq_f32_s64(x) + +#define vreinterpretq_m128d_u32(x) vreinterpretq_f32_u32(x) +#define vreinterpretq_m128d_u64(x) vreinterpretq_f32_u64(x) + +#define vreinterpretq_m128d_f32(x) (x) + +#define vreinterpretq_s64_m128d(x) vreinterpretq_s64_f32(x) + +#define vreinterpretq_u32_m128d(x) vreinterpretq_u32_f32(x) +#define vreinterpretq_u64_m128d(x) vreinterpretq_u64_f32(x) + +#define vreinterpretq_f32_m128d(x) (x) +#endif + +// A struct is defined in this header file called 'SIMDVec' which can be used +// by applications which attempt to access the contents of an __m128 struct +// directly. It is important to note that accessing the __m128 struct directly +// is bad coding practice by Microsoft: @see: +// https://learn.microsoft.com/en-us/cpp/cpp/m128 +// +// However, some legacy source code may try to access the contents of an __m128 +// struct directly so the developer can use the SIMDVec as an alias for it. Any +// casting must be done manually by the developer, as you cannot cast or +// otherwise alias the base NEON data type for intrinsic operations. +// +// union intended to allow direct access to an __m128 variable using the names +// that the MSVC compiler provides. This union should really only be used when +// trying to access the members of the vector as integer values. GCC/clang +// allow native access to the float members through a simple array access +// operator (in C since 4.6, in C++ since 4.8). +// +// Ideally direct accesses to SIMD vectors should not be used since it can cause +// a performance hit. If it really is needed however, the original __m128 +// variable can be aliased with a pointer to this union and used to access +// individual components. The use of this union should be hidden behind a macro +// that is used throughout the codebase to access the members instead of always +// declaring this type of variable. +typedef union ALIGN_STRUCT(16) SIMDVec { + float m128_f32[4]; // as floats - DON'T USE. Added for convenience. + int8_t m128_i8[16]; // as signed 8-bit integers. + int16_t m128_i16[8]; // as signed 16-bit integers. + int32_t m128_i32[4]; // as signed 32-bit integers. + int64_t m128_i64[2]; // as signed 64-bit integers. + uint8_t m128_u8[16]; // as unsigned 8-bit integers. + uint16_t m128_u16[8]; // as unsigned 16-bit integers. + uint32_t m128_u32[4]; // as unsigned 32-bit integers. + uint64_t m128_u64[2]; // as unsigned 64-bit integers. +} SIMDVec; + +// casting using SIMDVec +#define vreinterpretq_nth_u64_m128i(x, n) (((SIMDVec *) &x)->m128_u64[n]) +#define vreinterpretq_nth_u32_m128i(x, n) (((SIMDVec *) &x)->m128_u32[n]) +#define vreinterpretq_nth_u8_m128i(x, n) (((SIMDVec *) &x)->m128_u8[n]) + +/* SSE macros */ +#define _MM_GET_FLUSH_ZERO_MODE _sse2neon_mm_get_flush_zero_mode +#define _MM_SET_FLUSH_ZERO_MODE _sse2neon_mm_set_flush_zero_mode +#define _MM_GET_DENORMALS_ZERO_MODE _sse2neon_mm_get_denormals_zero_mode +#define _MM_SET_DENORMALS_ZERO_MODE _sse2neon_mm_set_denormals_zero_mode + +// Function declaration +// SSE +FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE(void); +FORCE_INLINE __m128 _mm_move_ss(__m128, __m128); +FORCE_INLINE __m128 _mm_or_ps(__m128, __m128); +FORCE_INLINE __m128 _mm_set_ps1(float); +FORCE_INLINE __m128 _mm_setzero_ps(void); +// SSE2 +FORCE_INLINE __m128i _mm_and_si128(__m128i, __m128i); +FORCE_INLINE __m128i _mm_castps_si128(__m128); +FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i, __m128i); +FORCE_INLINE __m128i _mm_cvtps_epi32(__m128); +FORCE_INLINE __m128d _mm_move_sd(__m128d, __m128d); +FORCE_INLINE __m128i _mm_or_si128(__m128i, __m128i); +FORCE_INLINE __m128i _mm_set_epi32(int, int, int, int); +FORCE_INLINE __m128i _mm_set_epi64x(int64_t, int64_t); +FORCE_INLINE __m128d _mm_set_pd(double, double); +FORCE_INLINE __m128i _mm_set1_epi32(int); +FORCE_INLINE __m128i _mm_setzero_si128(void); +// SSE4.1 +FORCE_INLINE __m128d _mm_ceil_pd(__m128d); +FORCE_INLINE __m128 _mm_ceil_ps(__m128); +FORCE_INLINE __m128d _mm_floor_pd(__m128d); +FORCE_INLINE __m128 _mm_floor_ps(__m128); +FORCE_INLINE __m128d _mm_round_pd(__m128d, int); +FORCE_INLINE __m128 _mm_round_ps(__m128, int); +// SSE4.2 +FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t, uint8_t); + +/* Backwards compatibility for compilers with lack of specific type support */ + +// Older gcc does not define vld1q_u8_x4 type +#if defined(__GNUC__) && !defined(__clang__) && \ + ((__GNUC__ <= 13 && defined(__arm__)) || \ + (__GNUC__ == 10 && __GNUC_MINOR__ < 3 && defined(__aarch64__)) || \ + (__GNUC__ <= 9 && defined(__aarch64__))) +FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p) +{ + uint8x16x4_t ret; + ret.val[0] = vld1q_u8(p + 0); + ret.val[1] = vld1q_u8(p + 16); + ret.val[2] = vld1q_u8(p + 32); + ret.val[3] = vld1q_u8(p + 48); + return ret; +} +#else +// Wraps vld1q_u8_x4 +FORCE_INLINE uint8x16x4_t _sse2neon_vld1q_u8_x4(const uint8_t *p) +{ + return vld1q_u8_x4(p); +} +#endif + +#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC) +/* emulate vaddv u8 variant */ +FORCE_INLINE uint8_t _sse2neon_vaddv_u8(uint8x8_t v8) +{ + const uint64x1_t v1 = vpaddl_u32(vpaddl_u16(vpaddl_u8(v8))); + return vget_lane_u8(vreinterpret_u8_u64(v1), 0); +} +#else +// Wraps vaddv_u8 +FORCE_INLINE uint8_t _sse2neon_vaddv_u8(uint8x8_t v8) +{ + return vaddv_u8(v8); +} +#endif + +#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC) +/* emulate vaddvq u8 variant */ +FORCE_INLINE uint8_t _sse2neon_vaddvq_u8(uint8x16_t a) +{ + uint8x8_t tmp = vpadd_u8(vget_low_u8(a), vget_high_u8(a)); + uint8_t res = 0; + for (int i = 0; i < 8; ++i) + res += tmp[i]; + return res; +} +#else +// Wraps vaddvq_u8 +FORCE_INLINE uint8_t _sse2neon_vaddvq_u8(uint8x16_t a) +{ + return vaddvq_u8(a); +} +#endif + +#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC) +/* emulate vaddvq u16 variant */ +FORCE_INLINE uint16_t _sse2neon_vaddvq_u16(uint16x8_t a) +{ + uint32x4_t m = vpaddlq_u16(a); + uint64x2_t n = vpaddlq_u32(m); + uint64x1_t o = vget_low_u64(n) + vget_high_u64(n); + + return vget_lane_u32((uint32x2_t) o, 0); +} +#else +// Wraps vaddvq_u16 +FORCE_INLINE uint16_t _sse2neon_vaddvq_u16(uint16x8_t a) +{ + return vaddvq_u16(a); +} +#endif + +/* Function Naming Conventions + * The naming convention of SSE intrinsics is straightforward. A generic SSE + * intrinsic function is given as follows: + * _mm__ + * + * The parts of this format are given as follows: + * 1. describes the operation performed by the intrinsic + * 2. identifies the data type of the function's primary arguments + * + * This last part, , is a little complicated. It identifies the + * content of the input values, and can be set to any of the following values: + * + ps - vectors contain floats (ps stands for packed single-precision) + * + pd - vectors contain doubles (pd stands for packed double-precision) + * + epi8/epi16/epi32/epi64 - vectors contain 8-bit/16-bit/32-bit/64-bit + * signed integers + * + epu8/epu16/epu32/epu64 - vectors contain 8-bit/16-bit/32-bit/64-bit + * unsigned integers + * + si128 - unspecified 128-bit vector or 256-bit vector + * + m128/m128i/m128d - identifies input vector types when they are different + * than the type of the returned vector + * + * For example, _mm_setzero_ps. The _mm implies that the function returns + * a 128-bit vector. The _ps at the end implies that the argument vectors + * contain floats. + * + * A complete example: Byte Shuffle - pshufb (_mm_shuffle_epi8) + * // Set packed 16-bit integers. 128 bits, 8 short, per 16 bits + * __m128i v_in = _mm_setr_epi16(1, 2, 3, 4, 5, 6, 7, 8); + * // Set packed 8-bit integers + * // 128 bits, 16 chars, per 8 bits + * __m128i v_perm = _mm_setr_epi8(1, 0, 2, 3, 8, 9, 10, 11, + * 4, 5, 12, 13, 6, 7, 14, 15); + * // Shuffle packed 8-bit integers + * __m128i v_out = _mm_shuffle_epi8(v_in, v_perm); // pshufb + */ + +/* Constants for use with _mm_prefetch. */ +#if defined(_M_ARM64EC) +/* winnt.h already defines these constants as macros, so undefine them first. */ +#undef _MM_HINT_NTA +#undef _MM_HINT_T0 +#undef _MM_HINT_T1 +#undef _MM_HINT_T2 +#endif +enum _mm_hint { + _MM_HINT_NTA = 0, /* load data to L1 and L2 cache, mark it as NTA */ + _MM_HINT_T0 = 1, /* load data to L1 and L2 cache */ + _MM_HINT_T1 = 2, /* load data to L2 cache only */ + _MM_HINT_T2 = 3, /* load data to L2 cache only, mark it as NTA */ +}; + +// The bit field mapping to the FPCR(floating-point control register) +typedef struct { + uint16_t res0; + uint8_t res1 : 6; + uint8_t bit22 : 1; + uint8_t bit23 : 1; + uint8_t bit24 : 1; + uint8_t res2 : 7; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint32_t res3; +#endif +} fpcr_bitfield; + +// Takes the upper 64 bits of a and places it in the low end of the result +// Takes the lower 64 bits of b and places it into the high end of the result. +FORCE_INLINE __m128 _mm_shuffle_ps_1032(__m128 a, __m128 b) +{ + float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); + float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(a32, b10)); +} + +// takes the lower two 32-bit values from a and swaps them and places in high +// end of result takes the higher two 32 bit values from b and swaps them and +// places in low end of result. +FORCE_INLINE __m128 _mm_shuffle_ps_2301(__m128 a, __m128 b) +{ + float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); + float32x2_t b23 = vrev64_f32(vget_high_f32(vreinterpretq_f32_m128(b))); + return vreinterpretq_m128_f32(vcombine_f32(a01, b23)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_0321(__m128 a, __m128 b) +{ + float32x2_t a21 = vget_high_f32( + vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); + float32x2_t b03 = vget_low_f32( + vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); + return vreinterpretq_m128_f32(vcombine_f32(a21, b03)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_2103(__m128 a, __m128 b) +{ + float32x2_t a03 = vget_low_f32( + vextq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 3)); + float32x2_t b21 = vget_high_f32( + vextq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b), 3)); + return vreinterpretq_m128_f32(vcombine_f32(a03, b21)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_1010(__m128 a, __m128 b) +{ + float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); + float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_1001(__m128 a, __m128 b) +{ + float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); + float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(a01, b10)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_0101(__m128 a, __m128 b) +{ + float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); + float32x2_t b01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(b))); + return vreinterpretq_m128_f32(vcombine_f32(a01, b01)); +} + +// keeps the low 64 bits of b in the low and puts the high 64 bits of a in the +// high +FORCE_INLINE __m128 _mm_shuffle_ps_3210(__m128 a, __m128 b) +{ + float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); + float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(a10, b32)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_0011(__m128 a, __m128 b) +{ + float32x2_t a11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 1); + float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); + return vreinterpretq_m128_f32(vcombine_f32(a11, b00)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_0022(__m128 a, __m128 b) +{ + float32x2_t a22 = + vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); + float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); + return vreinterpretq_m128_f32(vcombine_f32(a22, b00)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_2200(__m128 a, __m128 b) +{ + float32x2_t a00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(a)), 0); + float32x2_t b22 = + vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(b)), 0); + return vreinterpretq_m128_f32(vcombine_f32(a00, b22)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_3202(__m128 a, __m128 b) +{ + float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); + float32x2_t a22 = + vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 0); + float32x2_t a02 = vset_lane_f32(a0, a22, 1); /* TODO: use vzip ?*/ + float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(a02, b32)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_1133(__m128 a, __m128 b) +{ + float32x2_t a33 = + vdup_lane_f32(vget_high_f32(vreinterpretq_f32_m128(a)), 1); + float32x2_t b11 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 1); + return vreinterpretq_m128_f32(vcombine_f32(a33, b11)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_2010(__m128 a, __m128 b) +{ + float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); + float32_t b2 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 2); + float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); + float32x2_t b20 = vset_lane_f32(b2, b00, 1); + return vreinterpretq_m128_f32(vcombine_f32(a10, b20)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_2001(__m128 a, __m128 b) +{ + float32x2_t a01 = vrev64_f32(vget_low_f32(vreinterpretq_f32_m128(a))); + float32_t b2 = vgetq_lane_f32(b, 2); + float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); + float32x2_t b20 = vset_lane_f32(b2, b00, 1); + return vreinterpretq_m128_f32(vcombine_f32(a01, b20)); +} + +FORCE_INLINE __m128 _mm_shuffle_ps_2032(__m128 a, __m128 b) +{ + float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); + float32_t b2 = vgetq_lane_f32(b, 2); + float32x2_t b00 = vdup_lane_f32(vget_low_f32(vreinterpretq_f32_m128(b)), 0); + float32x2_t b20 = vset_lane_f32(b2, b00, 1); + return vreinterpretq_m128_f32(vcombine_f32(a32, b20)); +} + +// For MSVC, we check only if it is ARM64, as every single ARM64 processor +// supported by WoA has crypto extensions. If this changes in the future, +// this can be verified via the runtime-only method of: +// IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) +#if ((defined(_M_ARM64) || defined(_M_ARM64EC)) && !defined(__clang__)) || \ + (defined(__ARM_FEATURE_CRYPTO) && \ + (defined(__aarch64__) || __has_builtin(__builtin_arm_crypto_vmullp64))) +// Wraps vmull_p64 +FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) +{ + poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0); + poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0); +#if defined(_MSC_VER) && !defined(__clang__) + __n64 a1 = {a}, b1 = {b}; + return vreinterpretq_u64_p128(vmull_p64(a1, b1)); +#else + return vreinterpretq_u64_p128(vmull_p64(a, b)); +#endif +} +#else // ARMv7 polyfill +// ARMv7/some A64 lacks vmull_p64, but it has vmull_p8. +// +// vmull_p8 calculates 8 8-bit->16-bit polynomial multiplies, but we need a +// 64-bit->128-bit polynomial multiply. +// +// It needs some work and is somewhat slow, but it is still faster than all +// known scalar methods. +// +// Algorithm adapted to C from +// https://www.workofard.com/2017/07/ghash-for-low-end-cores/, which is adapted +// from "Fast Software Polynomial Multiplication on ARM Processors Using the +// NEON Engine" by Danilo Camara, Conrado Gouvea, Julio Lopez and Ricardo Dahab +// (https://hal.inria.fr/hal-01506572) +static uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b) +{ + poly8x8_t a = vreinterpret_p8_u64(_a); + poly8x8_t b = vreinterpret_p8_u64(_b); + + // Masks + uint8x16_t k48_32 = vcombine_u8(vcreate_u8(0x0000ffffffffffff), + vcreate_u8(0x00000000ffffffff)); + uint8x16_t k16_00 = vcombine_u8(vcreate_u8(0x000000000000ffff), + vcreate_u8(0x0000000000000000)); + + // Do the multiplies, rotating with vext to get all combinations + uint8x16_t d = vreinterpretq_u8_p16(vmull_p8(a, b)); // D = A0 * B0 + uint8x16_t e = + vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 1))); // E = A0 * B1 + uint8x16_t f = + vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 1), b)); // F = A1 * B0 + uint8x16_t g = + vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 2))); // G = A0 * B2 + uint8x16_t h = + vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 2), b)); // H = A2 * B0 + uint8x16_t i = + vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 3))); // I = A0 * B3 + uint8x16_t j = + vreinterpretq_u8_p16(vmull_p8(vext_p8(a, a, 3), b)); // J = A3 * B0 + uint8x16_t k = + vreinterpretq_u8_p16(vmull_p8(a, vext_p8(b, b, 4))); // L = A0 * B4 + + // Add cross products + uint8x16_t l = veorq_u8(e, f); // L = E + F + uint8x16_t m = veorq_u8(g, h); // M = G + H + uint8x16_t n = veorq_u8(i, j); // N = I + J + + // Interleave. Using vzip1 and vzip2 prevents Clang from emitting TBL + // instructions. +#if defined(__aarch64__) + uint8x16_t lm_p0 = vreinterpretq_u8_u64( + vzip1q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); + uint8x16_t lm_p1 = vreinterpretq_u8_u64( + vzip2q_u64(vreinterpretq_u64_u8(l), vreinterpretq_u64_u8(m))); + uint8x16_t nk_p0 = vreinterpretq_u8_u64( + vzip1q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); + uint8x16_t nk_p1 = vreinterpretq_u8_u64( + vzip2q_u64(vreinterpretq_u64_u8(n), vreinterpretq_u64_u8(k))); +#else + uint8x16_t lm_p0 = vcombine_u8(vget_low_u8(l), vget_low_u8(m)); + uint8x16_t lm_p1 = vcombine_u8(vget_high_u8(l), vget_high_u8(m)); + uint8x16_t nk_p0 = vcombine_u8(vget_low_u8(n), vget_low_u8(k)); + uint8x16_t nk_p1 = vcombine_u8(vget_high_u8(n), vget_high_u8(k)); +#endif + // t0 = (L) (P0 + P1) << 8 + // t1 = (M) (P2 + P3) << 16 + uint8x16_t t0t1_tmp = veorq_u8(lm_p0, lm_p1); + uint8x16_t t0t1_h = vandq_u8(lm_p1, k48_32); + uint8x16_t t0t1_l = veorq_u8(t0t1_tmp, t0t1_h); + + // t2 = (N) (P4 + P5) << 24 + // t3 = (K) (P6 + P7) << 32 + uint8x16_t t2t3_tmp = veorq_u8(nk_p0, nk_p1); + uint8x16_t t2t3_h = vandq_u8(nk_p1, k16_00); + uint8x16_t t2t3_l = veorq_u8(t2t3_tmp, t2t3_h); + + // De-interleave +#if defined(__aarch64__) + uint8x16_t t0 = vreinterpretq_u8_u64( + vuzp1q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); + uint8x16_t t1 = vreinterpretq_u8_u64( + vuzp2q_u64(vreinterpretq_u64_u8(t0t1_l), vreinterpretq_u64_u8(t0t1_h))); + uint8x16_t t2 = vreinterpretq_u8_u64( + vuzp1q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); + uint8x16_t t3 = vreinterpretq_u8_u64( + vuzp2q_u64(vreinterpretq_u64_u8(t2t3_l), vreinterpretq_u64_u8(t2t3_h))); +#else + uint8x16_t t1 = vcombine_u8(vget_high_u8(t0t1_l), vget_high_u8(t0t1_h)); + uint8x16_t t0 = vcombine_u8(vget_low_u8(t0t1_l), vget_low_u8(t0t1_h)); + uint8x16_t t3 = vcombine_u8(vget_high_u8(t2t3_l), vget_high_u8(t2t3_h)); + uint8x16_t t2 = vcombine_u8(vget_low_u8(t2t3_l), vget_low_u8(t2t3_h)); +#endif + // Shift the cross products + uint8x16_t t0_shift = vextq_u8(t0, t0, 15); // t0 << 8 + uint8x16_t t1_shift = vextq_u8(t1, t1, 14); // t1 << 16 + uint8x16_t t2_shift = vextq_u8(t2, t2, 13); // t2 << 24 + uint8x16_t t3_shift = vextq_u8(t3, t3, 12); // t3 << 32 + + // Accumulate the products + uint8x16_t cross1 = veorq_u8(t0_shift, t1_shift); + uint8x16_t cross2 = veorq_u8(t2_shift, t3_shift); + uint8x16_t mix = veorq_u8(d, cross1); + uint8x16_t r = veorq_u8(mix, cross2); + return vreinterpretq_u64_u8(r); +} +#endif // ARMv7 polyfill + +// C equivalent: +// __m128i _mm_shuffle_epi32_default(__m128i a, +// __constrange(0, 255) int imm) { +// __m128i ret; +// ret[0] = a[(imm) & 0x3]; ret[1] = a[((imm) >> 2) & 0x3]; +// ret[2] = a[((imm) >> 4) & 0x03]; ret[3] = a[((imm) >> 6) & 0x03]; +// return ret; +// } +#define _mm_shuffle_epi32_default(a, imm) \ + vreinterpretq_m128i_s32(vsetq_lane_s32( \ + vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 6) & 0x3), \ + vsetq_lane_s32( \ + vgetq_lane_s32(vreinterpretq_s32_m128i(a), ((imm) >> 4) & 0x3), \ + vsetq_lane_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), \ + ((imm) >> 2) & 0x3), \ + vmovq_n_s32(vgetq_lane_s32( \ + vreinterpretq_s32_m128i(a), (imm) & (0x3))), \ + 1), \ + 2), \ + 3)) + +// Takes the upper 64 bits of a and places it in the low end of the result +// Takes the lower 64 bits of a and places it into the high end of the result. +FORCE_INLINE __m128i _mm_shuffle_epi_1032(__m128i a) +{ + int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); + int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); + return vreinterpretq_m128i_s32(vcombine_s32(a32, a10)); +} + +// takes the lower two 32-bit values from a and swaps them and places in low end +// of result takes the higher two 32 bit values from a and swaps them and places +// in high end of result. +FORCE_INLINE __m128i _mm_shuffle_epi_2301(__m128i a) +{ + int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); + int32x2_t a23 = vrev64_s32(vget_high_s32(vreinterpretq_s32_m128i(a))); + return vreinterpretq_m128i_s32(vcombine_s32(a01, a23)); +} + +// rotates the least significant 32 bits into the most significant 32 bits, and +// shifts the rest down +FORCE_INLINE __m128i _mm_shuffle_epi_0321(__m128i a) +{ + return vreinterpretq_m128i_s32( + vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 1)); +} + +// rotates the most significant 32 bits into the least significant 32 bits, and +// shifts the rest up +FORCE_INLINE __m128i _mm_shuffle_epi_2103(__m128i a) +{ + return vreinterpretq_m128i_s32( + vextq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(a), 3)); +} + +// gets the lower 64 bits of a, and places it in the upper 64 bits +// gets the lower 64 bits of a and places it in the lower 64 bits +FORCE_INLINE __m128i _mm_shuffle_epi_1010(__m128i a) +{ + int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); + return vreinterpretq_m128i_s32(vcombine_s32(a10, a10)); +} + +// gets the lower 64 bits of a, swaps the 0 and 1 elements, and places it in the +// lower 64 bits gets the lower 64 bits of a, and places it in the upper 64 bits +FORCE_INLINE __m128i _mm_shuffle_epi_1001(__m128i a) +{ + int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); + int32x2_t a10 = vget_low_s32(vreinterpretq_s32_m128i(a)); + return vreinterpretq_m128i_s32(vcombine_s32(a01, a10)); +} + +// gets the lower 64 bits of a, swaps the 0 and 1 elements and places it in the +// upper 64 bits gets the lower 64 bits of a, swaps the 0 and 1 elements, and +// places it in the lower 64 bits +FORCE_INLINE __m128i _mm_shuffle_epi_0101(__m128i a) +{ + int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); + return vreinterpretq_m128i_s32(vcombine_s32(a01, a01)); +} + +FORCE_INLINE __m128i _mm_shuffle_epi_2211(__m128i a) +{ + int32x2_t a11 = vdup_lane_s32(vget_low_s32(vreinterpretq_s32_m128i(a)), 1); + int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); + return vreinterpretq_m128i_s32(vcombine_s32(a11, a22)); +} + +FORCE_INLINE __m128i _mm_shuffle_epi_0122(__m128i a) +{ + int32x2_t a22 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 0); + int32x2_t a01 = vrev64_s32(vget_low_s32(vreinterpretq_s32_m128i(a))); + return vreinterpretq_m128i_s32(vcombine_s32(a22, a01)); +} + +FORCE_INLINE __m128i _mm_shuffle_epi_3332(__m128i a) +{ + int32x2_t a32 = vget_high_s32(vreinterpretq_s32_m128i(a)); + int32x2_t a33 = vdup_lane_s32(vget_high_s32(vreinterpretq_s32_m128i(a)), 1); + return vreinterpretq_m128i_s32(vcombine_s32(a32, a33)); +} + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#define _mm_shuffle_epi32_splat(a, imm) \ + vreinterpretq_m128i_s32(vdupq_laneq_s32(vreinterpretq_s32_m128i(a), (imm))) +#else +#define _mm_shuffle_epi32_splat(a, imm) \ + vreinterpretq_m128i_s32( \ + vdupq_n_s32(vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)))) +#endif + +// NEON does not support a general purpose permute intrinsic. +// Shuffle single-precision (32-bit) floating-point elements in a using the +// control in imm8, and store the results in dst. +// +// C equivalent: +// __m128 _mm_shuffle_ps_default(__m128 a, __m128 b, +// __constrange(0, 255) int imm) { +// __m128 ret; +// ret[0] = a[(imm) & 0x3]; ret[1] = a[((imm) >> 2) & 0x3]; +// ret[2] = b[((imm) >> 4) & 0x03]; ret[3] = b[((imm) >> 6) & 0x03]; +// return ret; +// } +// +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_ps +#define _mm_shuffle_ps_default(a, b, imm) \ + vreinterpretq_m128_f32(vsetq_lane_f32( \ + vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 6) & 0x3), \ + vsetq_lane_f32( \ + vgetq_lane_f32(vreinterpretq_f32_m128(b), ((imm) >> 4) & 0x3), \ + vsetq_lane_f32( \ + vgetq_lane_f32(vreinterpretq_f32_m128(a), ((imm) >> 2) & 0x3), \ + vmovq_n_f32( \ + vgetq_lane_f32(vreinterpretq_f32_m128(a), (imm) & (0x3))), \ + 1), \ + 2), \ + 3)) + +// Shuffle 16-bit integers in the low 64 bits of a using the control in imm8. +// Store the results in the low 64 bits of dst, with the high 64 bits being +// copied from a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shufflelo_epi16 +#define _mm_shufflelo_epi16_function(a, imm) \ + _sse2neon_define1( \ + __m128i, a, int16x8_t ret = vreinterpretq_s16_m128i(_a); \ + int16x4_t lowBits = vget_low_s16(ret); \ + ret = vsetq_lane_s16(vget_lane_s16(lowBits, (imm) & (0x3)), ret, 0); \ + ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 2) & 0x3), ret, \ + 1); \ + ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 4) & 0x3), ret, \ + 2); \ + ret = vsetq_lane_s16(vget_lane_s16(lowBits, ((imm) >> 6) & 0x3), ret, \ + 3); \ + _sse2neon_return(vreinterpretq_m128i_s16(ret));) + +// Shuffle 16-bit integers in the high 64 bits of a using the control in imm8. +// Store the results in the high 64 bits of dst, with the low 64 bits being +// copied from a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shufflehi_epi16 +#define _mm_shufflehi_epi16_function(a, imm) \ + _sse2neon_define1( \ + __m128i, a, int16x8_t ret = vreinterpretq_s16_m128i(_a); \ + int16x4_t highBits = vget_high_s16(ret); \ + ret = vsetq_lane_s16(vget_lane_s16(highBits, (imm) & (0x3)), ret, 4); \ + ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 2) & 0x3), ret, \ + 5); \ + ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 4) & 0x3), ret, \ + 6); \ + ret = vsetq_lane_s16(vget_lane_s16(highBits, ((imm) >> 6) & 0x3), ret, \ + 7); \ + _sse2neon_return(vreinterpretq_m128i_s16(ret));) + +/* MMX */ + +//_mm_empty is a no-op on arm +FORCE_INLINE void _mm_empty(void) {} + +/* SSE */ + +// Add packed single-precision (32-bit) floating-point elements in a and b, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_ps +FORCE_INLINE __m128 _mm_add_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Add the lower single-precision (32-bit) floating-point element in a and b, +// store the result in the lower element of dst, and copy the upper 3 packed +// elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_ss +FORCE_INLINE __m128 _mm_add_ss(__m128 a, __m128 b) +{ + float32_t b0 = vgetq_lane_f32(vreinterpretq_f32_m128(b), 0); + float32x4_t value = vsetq_lane_f32(b0, vdupq_n_f32(0), 0); + // the upper values in the result must be the remnants of . + return vreinterpretq_m128_f32(vaddq_f32(a, value)); +} + +// Compute the bitwise AND of packed single-precision (32-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_ps +FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_s32( + vandq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); +} + +// Compute the bitwise NOT of packed single-precision (32-bit) floating-point +// elements in a and then AND with b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_ps +FORCE_INLINE __m128 _mm_andnot_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_s32( + vbicq_s32(vreinterpretq_s32_m128(b), + vreinterpretq_s32_m128(a))); // *NOTE* argument swap +} + +// Average packed unsigned 16-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_pu16 +FORCE_INLINE __m64 _mm_avg_pu16(__m64 a, __m64 b) +{ + return vreinterpret_m64_u16( + vrhadd_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b))); +} + +// Average packed unsigned 8-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_pu8 +FORCE_INLINE __m64 _mm_avg_pu8(__m64 a, __m64 b) +{ + return vreinterpret_m64_u8( + vrhadd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for equality, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_ps +FORCE_INLINE __m128 _mm_cmpeq_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32( + vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for equality, store the result in the lower element of dst, and copy the +// upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_ss +FORCE_INLINE __m128 _mm_cmpeq_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpeq_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for greater-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_ps +FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32( + vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for greater-than-or-equal, store the result in the lower element of dst, +// and copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_ss +FORCE_INLINE __m128 _mm_cmpge_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpge_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for greater-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_ps +FORCE_INLINE __m128 _mm_cmpgt_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32( + vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for greater-than, store the result in the lower element of dst, and copy +// the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_ss +FORCE_INLINE __m128 _mm_cmpgt_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpgt_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for less-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_ps +FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32( + vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for less-than-or-equal, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_ss +FORCE_INLINE __m128 _mm_cmple_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmple_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for less-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_ps +FORCE_INLINE __m128 _mm_cmplt_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32( + vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for less-than, store the result in the lower element of dst, and copy the +// upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_ss +FORCE_INLINE __m128 _mm_cmplt_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmplt_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for not-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_ps +FORCE_INLINE __m128 _mm_cmpneq_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32(vmvnq_u32( + vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for not-equal, store the result in the lower element of dst, and copy the +// upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_ss +FORCE_INLINE __m128 _mm_cmpneq_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpneq_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for not-greater-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_ps +FORCE_INLINE __m128 _mm_cmpnge_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32(vmvnq_u32( + vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for not-greater-than-or-equal, store the result in the lower element of +// dst, and copy the upper 3 packed elements from a to the upper elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_ss +FORCE_INLINE __m128 _mm_cmpnge_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpnge_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for not-greater-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_ps +FORCE_INLINE __m128 _mm_cmpngt_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32(vmvnq_u32( + vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for not-greater-than, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_ss +FORCE_INLINE __m128 _mm_cmpngt_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpngt_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for not-less-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_ps +FORCE_INLINE __m128 _mm_cmpnle_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32(vmvnq_u32( + vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for not-less-than-or-equal, store the result in the lower element of dst, +// and copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_ss +FORCE_INLINE __m128 _mm_cmpnle_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpnle_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// for not-less-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_ps +FORCE_INLINE __m128 _mm_cmpnlt_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_u32(vmvnq_u32( + vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b for not-less-than, store the result in the lower element of dst, and copy +// the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_ss +FORCE_INLINE __m128 _mm_cmpnlt_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpnlt_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// to see if neither is NaN, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_ps +// +// See also: +// http://stackoverflow.com/questions/8627331/what-does-ordered-unordered-comparison-mean +// http://stackoverflow.com/questions/29349621/neon-isnanval-intrinsics +FORCE_INLINE __m128 _mm_cmpord_ps(__m128 a, __m128 b) +{ + // Note: NEON does not have ordered compare builtin + // Need to compare a eq a and b eq b to check for NaN + // Do AND of results to get final + uint32x4_t ceqaa = + vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); + uint32x4_t ceqbb = + vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_u32(vandq_u32(ceqaa, ceqbb)); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b to see if neither is NaN, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_ss +FORCE_INLINE __m128 _mm_cmpord_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpord_ps(a, b)); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b +// to see if either is NaN, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_ps +FORCE_INLINE __m128 _mm_cmpunord_ps(__m128 a, __m128 b) +{ + uint32x4_t f32a = + vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a)); + uint32x4_t f32b = + vceqq_f32(vreinterpretq_f32_m128(b), vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_u32(vmvnq_u32(vandq_u32(f32a, f32b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b to see if either is NaN, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_ss +FORCE_INLINE __m128 _mm_cmpunord_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_cmpunord_ps(a, b)); +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for equality, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comieq_ss +FORCE_INLINE int _mm_comieq_ss(__m128 a, __m128 b) +{ + uint32x4_t a_eq_b = + vceqq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); + return vgetq_lane_u32(a_eq_b, 0) & 0x1; +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for greater-than-or-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comige_ss +FORCE_INLINE int _mm_comige_ss(__m128 a, __m128 b) +{ + uint32x4_t a_ge_b = + vcgeq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); + return vgetq_lane_u32(a_ge_b, 0) & 0x1; +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for greater-than, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comigt_ss +FORCE_INLINE int _mm_comigt_ss(__m128 a, __m128 b) +{ + uint32x4_t a_gt_b = + vcgtq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); + return vgetq_lane_u32(a_gt_b, 0) & 0x1; +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for less-than-or-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comile_ss +FORCE_INLINE int _mm_comile_ss(__m128 a, __m128 b) +{ + uint32x4_t a_le_b = + vcleq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); + return vgetq_lane_u32(a_le_b, 0) & 0x1; +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for less-than, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comilt_ss +FORCE_INLINE int _mm_comilt_ss(__m128 a, __m128 b) +{ + uint32x4_t a_lt_b = + vcltq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b)); + return vgetq_lane_u32(a_lt_b, 0) & 0x1; +} + +// Compare the lower single-precision (32-bit) floating-point element in a and b +// for not-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comineq_ss +FORCE_INLINE int _mm_comineq_ss(__m128 a, __m128 b) +{ + return !_mm_comieq_ss(a, b); +} + +// Convert packed signed 32-bit integers in b to packed single-precision +// (32-bit) floating-point elements, store the results in the lower 2 elements +// of dst, and copy the upper 2 packed elements from a to the upper elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_pi2ps +FORCE_INLINE __m128 _mm_cvt_pi2ps(__m128 a, __m64 b) +{ + return vreinterpretq_m128_f32( + vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)), + vget_high_f32(vreinterpretq_f32_m128(a)))); +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_ps2pi +FORCE_INLINE __m64 _mm_cvt_ps2pi(__m128 a) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + return vreinterpret_m64_s32( + vget_low_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a))))); +#else + return vreinterpret_m64_s32(vcvt_s32_f32(vget_low_f32( + vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION))))); +#endif +} + +// Convert the signed 32-bit integer b to a single-precision (32-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_si2ss +FORCE_INLINE __m128 _mm_cvt_si2ss(__m128 a, int b) +{ + return vreinterpretq_m128_f32( + vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0)); +} + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 32-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvt_ss2si +FORCE_INLINE int _mm_cvt_ss2si(__m128 a) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + return vgetq_lane_s32(vcvtnq_s32_f32(vrndiq_f32(vreinterpretq_f32_m128(a))), + 0); +#else + float32_t data = vgetq_lane_f32( + vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION)), 0); + return (int32_t) data; +#endif +} + +// Convert packed 16-bit integers in a to packed single-precision (32-bit) +// floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi16_ps +FORCE_INLINE __m128 _mm_cvtpi16_ps(__m64 a) +{ + return vreinterpretq_m128_f32( + vcvtq_f32_s32(vmovl_s16(vreinterpret_s16_m64(a)))); +} + +// Convert packed 32-bit integers in b to packed single-precision (32-bit) +// floating-point elements, store the results in the lower 2 elements of dst, +// and copy the upper 2 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32_ps +FORCE_INLINE __m128 _mm_cvtpi32_ps(__m128 a, __m64 b) +{ + return vreinterpretq_m128_f32( + vcombine_f32(vcvt_f32_s32(vreinterpret_s32_m64(b)), + vget_high_f32(vreinterpretq_f32_m128(a)))); +} + +// Convert packed signed 32-bit integers in a to packed single-precision +// (32-bit) floating-point elements, store the results in the lower 2 elements +// of dst, then convert the packed signed 32-bit integers in b to +// single-precision (32-bit) floating-point element, and store the results in +// the upper 2 elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32x2_ps +FORCE_INLINE __m128 _mm_cvtpi32x2_ps(__m64 a, __m64 b) +{ + return vreinterpretq_m128_f32(vcvtq_f32_s32( + vcombine_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b)))); +} + +// Convert the lower packed 8-bit integers in a to packed single-precision +// (32-bit) floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi8_ps +FORCE_INLINE __m128 _mm_cvtpi8_ps(__m64 a) +{ + return vreinterpretq_m128_f32(vcvtq_f32_s32( + vmovl_s16(vget_low_s16(vmovl_s8(vreinterpret_s8_m64(a)))))); +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 16-bit integers, and store the results in dst. Note: this intrinsic +// will generate 0x7FFF, rather than 0x8000, for input values between 0x7FFF and +// 0x7FFFFFFF. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi16 +FORCE_INLINE __m64 _mm_cvtps_pi16(__m128 a) +{ + return vreinterpret_m64_s16( + vqmovn_s32(vreinterpretq_s32_m128i(_mm_cvtps_epi32(a)))); +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi32 +#define _mm_cvtps_pi32(a) _mm_cvt_ps2pi(a) + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 8-bit integers, and store the results in lower 4 elements of dst. +// Note: this intrinsic will generate 0x7F, rather than 0x80, for input values +// between 0x7F and 0x7FFFFFFF. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pi8 +FORCE_INLINE __m64 _mm_cvtps_pi8(__m128 a) +{ + return vreinterpret_m64_s8(vqmovn_s16( + vcombine_s16(vreinterpret_s16_m64(_mm_cvtps_pi16(a)), vdup_n_s16(0)))); +} + +// Convert packed unsigned 16-bit integers in a to packed single-precision +// (32-bit) floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpu16_ps +FORCE_INLINE __m128 _mm_cvtpu16_ps(__m64 a) +{ + return vreinterpretq_m128_f32( + vcvtq_f32_u32(vmovl_u16(vreinterpret_u16_m64(a)))); +} + +// Convert the lower packed unsigned 8-bit integers in a to packed +// single-precision (32-bit) floating-point elements, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpu8_ps +FORCE_INLINE __m128 _mm_cvtpu8_ps(__m64 a) +{ + return vreinterpretq_m128_f32(vcvtq_f32_u32( + vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_m64(a)))))); +} + +// Convert the signed 32-bit integer b to a single-precision (32-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_ss +#define _mm_cvtsi32_ss(a, b) _mm_cvt_si2ss(a, b) + +// Convert the signed 64-bit integer b to a single-precision (32-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_ss +FORCE_INLINE __m128 _mm_cvtsi64_ss(__m128 a, int64_t b) +{ + return vreinterpretq_m128_f32( + vsetq_lane_f32((float) b, vreinterpretq_f32_m128(a), 0)); +} + +// Copy the lower single-precision (32-bit) floating-point element of a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_f32 +FORCE_INLINE float _mm_cvtss_f32(__m128 a) +{ + return vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); +} + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 32-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_si32 +#define _mm_cvtss_si32(a) _mm_cvt_ss2si(a) + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 64-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_si64 +FORCE_INLINE int64_t _mm_cvtss_si64(__m128 a) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + return (int64_t) vgetq_lane_f32(vrndiq_f32(vreinterpretq_f32_m128(a)), 0); +#else + float32_t data = vgetq_lane_f32( + vreinterpretq_f32_m128(_mm_round_ps(a, _MM_FROUND_CUR_DIRECTION)), 0); + return (int64_t) data; +#endif +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers with truncation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtt_ps2pi +FORCE_INLINE __m64 _mm_cvtt_ps2pi(__m128 a) +{ + return vreinterpret_m64_s32( + vget_low_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)))); +} + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 32-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtt_ss2si +FORCE_INLINE int _mm_cvtt_ss2si(__m128 a) +{ + return vgetq_lane_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a)), 0); +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers with truncation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttps_pi32 +#define _mm_cvttps_pi32(a) _mm_cvtt_ps2pi(a) + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 32-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttss_si32 +#define _mm_cvttss_si32(a) _mm_cvtt_ss2si(a) + +// Convert the lower single-precision (32-bit) floating-point element in a to a +// 64-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttss_si64 +FORCE_INLINE int64_t _mm_cvttss_si64(__m128 a) +{ + return (int64_t) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); +} + +// Divide packed single-precision (32-bit) floating-point elements in a by +// packed elements in b, and store the results in dst. +// Due to ARMv7-A NEON's lack of a precise division intrinsic, we implement +// division by multiplying a by b's reciprocal before using the Newton-Raphson +// method to approximate the results. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_ps +FORCE_INLINE __m128 _mm_div_ps(__m128 a, __m128 b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vdivq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#else + float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(b)); + recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b))); + // Additional Netwon-Raphson iteration for accuracy + recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(b))); + return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(a), recip)); +#endif +} + +// Divide the lower single-precision (32-bit) floating-point element in a by the +// lower single-precision (32-bit) floating-point element in b, store the result +// in the lower element of dst, and copy the upper 3 packed elements from a to +// the upper elements of dst. +// Warning: ARMv7-A does not produce the same result compared to Intel and not +// IEEE-compliant. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_ss +FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b) +{ + float32_t value = + vgetq_lane_f32(vreinterpretq_f32_m128(_mm_div_ps(a, b)), 0); + return vreinterpretq_m128_f32( + vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); +} + +// Extract a 16-bit integer from a, selected with imm8, and store the result in +// the lower element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_pi16 +#define _mm_extract_pi16(a, imm) \ + (int32_t) vget_lane_u16(vreinterpret_u16_m64(a), (imm)) + +// Free aligned memory that was allocated with _mm_malloc. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_free +#if !defined(SSE2NEON_ALLOC_DEFINED) +FORCE_INLINE void _mm_free(void *addr) +{ +#if defined(_WIN32) + _aligned_free(addr); +#else + free(addr); +#endif +} +#endif + +FORCE_INLINE uint64_t _sse2neon_get_fpcr(void) +{ + uint64_t value; +#if defined(_MSC_VER) && !defined(__clang__) + value = _ReadStatusReg(ARM64_FPCR); +#else + __asm__ __volatile__("mrs %0, FPCR" : "=r"(value)); /* read */ +#endif + return value; +} + +FORCE_INLINE void _sse2neon_set_fpcr(uint64_t value) +{ +#if defined(_MSC_VER) && !defined(__clang__) + _WriteStatusReg(ARM64_FPCR, value); +#else + __asm__ __volatile__("msr FPCR, %0" ::"r"(value)); /* write */ +#endif +} + +// Macro: Get the flush zero bits from the MXCSR control and status register. +// The flush zero may contain any of the following flags: _MM_FLUSH_ZERO_ON or +// _MM_FLUSH_ZERO_OFF +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_GET_FLUSH_ZERO_MODE +FORCE_INLINE unsigned int _sse2neon_mm_get_flush_zero_mode(void) +{ + union { + fpcr_bitfield field; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint64_t value; +#else + uint32_t value; +#endif + } r; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + r.value = _sse2neon_get_fpcr(); +#else + __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ +#endif + + return r.field.bit24 ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF; +} + +// Macro: Get the rounding mode bits from the MXCSR control and status register. +// The rounding mode may contain any of the following flags: _MM_ROUND_NEAREST, +// _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_GET_ROUNDING_MODE +FORCE_INLINE unsigned int _MM_GET_ROUNDING_MODE(void) +{ + switch (fegetround()) { + case FE_TONEAREST: + return _MM_ROUND_NEAREST; + case FE_DOWNWARD: + return _MM_ROUND_DOWN; + case FE_UPWARD: + return _MM_ROUND_UP; + case FE_TOWARDZERO: + return _MM_ROUND_TOWARD_ZERO; + default: + // fegetround() must return _MM_ROUND_NEAREST, _MM_ROUND_DOWN, + // _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO on success. all the other error + // cases we treat them as FE_TOWARDZERO (truncate). + return _MM_ROUND_TOWARD_ZERO; + } +} + +// Copy a to dst, and insert the 16-bit integer i into dst at the location +// specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_pi16 +#define _mm_insert_pi16(a, b, imm) \ + vreinterpret_m64_s16(vset_lane_s16((b), vreinterpret_s16_m64(a), (imm))) + +// Load 128-bits (composed of 4 packed single-precision (32-bit) floating-point +// elements) from memory into dst. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ps +FORCE_INLINE __m128 _mm_load_ps(const float *p) +{ + return vreinterpretq_m128_f32(vld1q_f32(p)); +} + +// Load a single-precision (32-bit) floating-point element from memory into all +// elements of dst. +// +// dst[31:0] := MEM[mem_addr+31:mem_addr] +// dst[63:32] := MEM[mem_addr+31:mem_addr] +// dst[95:64] := MEM[mem_addr+31:mem_addr] +// dst[127:96] := MEM[mem_addr+31:mem_addr] +// +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ps1 +#define _mm_load_ps1 _mm_load1_ps + +// Load a single-precision (32-bit) floating-point element from memory into the +// lower of dst, and zero the upper 3 elements. mem_addr does not need to be +// aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_ss +FORCE_INLINE __m128 _mm_load_ss(const float *p) +{ + return vreinterpretq_m128_f32(vsetq_lane_f32(*p, vdupq_n_f32(0), 0)); +} + +// Load a single-precision (32-bit) floating-point element from memory into all +// elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load1_ps +FORCE_INLINE __m128 _mm_load1_ps(const float *p) +{ + return vreinterpretq_m128_f32(vld1q_dup_f32(p)); +} + +// Load 2 single-precision (32-bit) floating-point elements from memory into the +// upper 2 elements of dst, and copy the lower 2 elements from a to dst. +// mem_addr does not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadh_pi +FORCE_INLINE __m128 _mm_loadh_pi(__m128 a, __m64 const *p) +{ + return vreinterpretq_m128_f32( + vcombine_f32(vget_low_f32(a), vld1_f32((const float32_t *) p))); +} + +// Load 2 single-precision (32-bit) floating-point elements from memory into the +// lower 2 elements of dst, and copy the upper 2 elements from a to dst. +// mem_addr does not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_pi +FORCE_INLINE __m128 _mm_loadl_pi(__m128 a, __m64 const *p) +{ + return vreinterpretq_m128_f32( + vcombine_f32(vld1_f32((const float32_t *) p), vget_high_f32(a))); +} + +// Load 4 single-precision (32-bit) floating-point elements from memory into dst +// in reverse order. mem_addr must be aligned on a 16-byte boundary or a +// general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadr_ps +FORCE_INLINE __m128 _mm_loadr_ps(const float *p) +{ + float32x4_t v = vrev64q_f32(vld1q_f32(p)); + return vreinterpretq_m128_f32(vextq_f32(v, v, 2)); +} + +// Load 128-bits (composed of 4 packed single-precision (32-bit) floating-point +// elements) from memory into dst. mem_addr does not need to be aligned on any +// particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_ps +FORCE_INLINE __m128 _mm_loadu_ps(const float *p) +{ + // for neon, alignment doesn't matter, so _mm_load_ps and _mm_loadu_ps are + // equivalent for neon + return vreinterpretq_m128_f32(vld1q_f32(p)); +} + +// Load unaligned 16-bit integer from memory into the first element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si16 +FORCE_INLINE __m128i _mm_loadu_si16(const void *p) +{ + return vreinterpretq_m128i_s16( + vsetq_lane_s16(*(const unaligned_int16_t *) p, vdupq_n_s16(0), 0)); +} + +// Load unaligned 64-bit integer from memory into the first element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si64 +FORCE_INLINE __m128i _mm_loadu_si64(const void *p) +{ + return vreinterpretq_m128i_s64( + vsetq_lane_s64(*(const unaligned_int64_t *) p, vdupq_n_s64(0), 0)); +} + +// Allocate size bytes of memory, aligned to the alignment specified in align, +// and return a pointer to the allocated memory. _mm_free should be used to free +// memory that is allocated with _mm_malloc. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_malloc +#if !defined(SSE2NEON_ALLOC_DEFINED) +FORCE_INLINE void *_mm_malloc(size_t size, size_t align) +{ +#if defined(_WIN32) + return _aligned_malloc(size, align); +#else + void *ptr; + if (align == 1) + return malloc(size); + if (align == 2 || (sizeof(void *) == 8 && align == 4)) + align = sizeof(void *); + if (!posix_memalign(&ptr, align, size)) + return ptr; + return NULL; +#endif +} +#endif + +// Conditionally store 8-bit integer elements from a into memory using mask +// (elements are not stored when the highest bit is not set in the corresponding +// element) and a non-temporal memory hint. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maskmove_si64 +FORCE_INLINE void _mm_maskmove_si64(__m64 a, __m64 mask, char *mem_addr) +{ + int8x8_t shr_mask = vshr_n_s8(vreinterpret_s8_m64(mask), 7); + __m128 b = _mm_load_ps((const float *) mem_addr); + int8x8_t masked = + vbsl_s8(vreinterpret_u8_s8(shr_mask), vreinterpret_s8_m64(a), + vreinterpret_s8_u64(vget_low_u64(vreinterpretq_u64_m128(b)))); + vst1_s8((int8_t *) mem_addr, masked); +} + +// Conditionally store 8-bit integer elements from a into memory using mask +// (elements are not stored when the highest bit is not set in the corresponding +// element) and a non-temporal memory hint. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_maskmovq +#define _m_maskmovq(a, mask, mem_addr) _mm_maskmove_si64(a, mask, mem_addr) + +// Compare packed signed 16-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pi16 +FORCE_INLINE __m64 _mm_max_pi16(__m64 a, __m64 b) +{ + return vreinterpret_m64_s16( + vmax_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b, +// and store packed maximum values in dst. dst does not follow the IEEE Standard +// for Floating-Point Arithmetic (IEEE 754) maximum value when inputs are NaN or +// signed-zero values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_ps +FORCE_INLINE __m128 _mm_max_ps(__m128 a, __m128 b) +{ +#if SSE2NEON_PRECISE_MINMAX + float32x4_t _a = vreinterpretq_f32_m128(a); + float32x4_t _b = vreinterpretq_f32_m128(b); + return vreinterpretq_m128_f32(vbslq_f32(vcgtq_f32(_a, _b), _a, _b)); +#else + return vreinterpretq_m128_f32( + vmaxq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#endif +} + +// Compare packed unsigned 8-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pu8 +FORCE_INLINE __m64 _mm_max_pu8(__m64 a, __m64 b) +{ + return vreinterpret_m64_u8( + vmax_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b, store the maximum value in the lower element of dst, and copy the upper 3 +// packed elements from a to the upper element of dst. dst does not follow the +// IEEE Standard for Floating-Point Arithmetic (IEEE 754) maximum value when +// inputs are NaN or signed-zero values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_ss +FORCE_INLINE __m128 _mm_max_ss(__m128 a, __m128 b) +{ + float32_t value = vgetq_lane_f32(_mm_max_ps(a, b), 0); + return vreinterpretq_m128_f32( + vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); +} + +// Compare packed signed 16-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pi16 +FORCE_INLINE __m64 _mm_min_pi16(__m64 a, __m64 b) +{ + return vreinterpret_m64_s16( + vmin_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); +} + +// Compare packed single-precision (32-bit) floating-point elements in a and b, +// and store packed minimum values in dst. dst does not follow the IEEE Standard +// for Floating-Point Arithmetic (IEEE 754) minimum value when inputs are NaN or +// signed-zero values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_ps +FORCE_INLINE __m128 _mm_min_ps(__m128 a, __m128 b) +{ +#if SSE2NEON_PRECISE_MINMAX + float32x4_t _a = vreinterpretq_f32_m128(a); + float32x4_t _b = vreinterpretq_f32_m128(b); + return vreinterpretq_m128_f32(vbslq_f32(vcltq_f32(_a, _b), _a, _b)); +#else + return vreinterpretq_m128_f32( + vminq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#endif +} + +// Compare packed unsigned 8-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pu8 +FORCE_INLINE __m64 _mm_min_pu8(__m64 a, __m64 b) +{ + return vreinterpret_m64_u8( + vmin_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))); +} + +// Compare the lower single-precision (32-bit) floating-point elements in a and +// b, store the minimum value in the lower element of dst, and copy the upper 3 +// packed elements from a to the upper element of dst. dst does not follow the +// IEEE Standard for Floating-Point Arithmetic (IEEE 754) minimum value when +// inputs are NaN or signed-zero values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_ss +FORCE_INLINE __m128 _mm_min_ss(__m128 a, __m128 b) +{ + float32_t value = vgetq_lane_f32(_mm_min_ps(a, b), 0); + return vreinterpretq_m128_f32( + vsetq_lane_f32(value, vreinterpretq_f32_m128(a), 0)); +} + +// Move the lower single-precision (32-bit) floating-point element from b to the +// lower element of dst, and copy the upper 3 packed elements from a to the +// upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_ss +FORCE_INLINE __m128 _mm_move_ss(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vsetq_lane_f32(vgetq_lane_f32(vreinterpretq_f32_m128(b), 0), + vreinterpretq_f32_m128(a), 0)); +} + +// Move the upper 2 single-precision (32-bit) floating-point elements from b to +// the lower 2 elements of dst, and copy the upper 2 elements from a to the +// upper 2 elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movehl_ps +FORCE_INLINE __m128 _mm_movehl_ps(__m128 a, __m128 b) +{ +#if defined(aarch64__) + return vreinterpretq_m128_u64( + vzip2q_u64(vreinterpretq_u64_m128(b), vreinterpretq_u64_m128(a))); +#else + float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); + float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32(vcombine_f32(b32, a32)); +#endif +} + +// Move the lower 2 single-precision (32-bit) floating-point elements from b to +// the upper 2 elements of dst, and copy the lower 2 elements from a to the +// lower 2 elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movelh_ps +FORCE_INLINE __m128 _mm_movelh_ps(__m128 __A, __m128 __B) +{ + float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(__A)); + float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(__B)); + return vreinterpretq_m128_f32(vcombine_f32(a10, b10)); +} + +// Create mask from the most significant bit of each 8-bit element in a, and +// store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_pi8 +FORCE_INLINE int _mm_movemask_pi8(__m64 a) +{ + uint8x8_t input = vreinterpret_u8_m64(a); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + static const int8_t shift[8] = {0, 1, 2, 3, 4, 5, 6, 7}; + uint8x8_t tmp = vshr_n_u8(input, 7); + return vaddv_u8(vshl_u8(tmp, vld1_s8(shift))); +#else + // Refer the implementation of `_mm_movemask_epi8` + uint16x4_t high_bits = vreinterpret_u16_u8(vshr_n_u8(input, 7)); + uint32x2_t paired16 = + vreinterpret_u32_u16(vsra_n_u16(high_bits, high_bits, 7)); + uint8x8_t paired32 = + vreinterpret_u8_u32(vsra_n_u32(paired16, paired16, 14)); + return vget_lane_u8(paired32, 0) | ((int) vget_lane_u8(paired32, 4) << 4); +#endif +} + +// Set each bit of mask dst based on the most significant bit of the +// corresponding packed single-precision (32-bit) floating-point element in a. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_ps +FORCE_INLINE int _mm_movemask_ps(__m128 a) +{ + uint32x4_t input = vreinterpretq_u32_m128(a); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + static const int32_t shift[4] = {0, 1, 2, 3}; + uint32x4_t tmp = vshrq_n_u32(input, 31); + return vaddvq_u32(vshlq_u32(tmp, vld1q_s32(shift))); +#else + // Uses the exact same method as _mm_movemask_epi8, see that for details. + // Shift out everything but the sign bits with a 32-bit unsigned shift + // right. + uint64x2_t high_bits = vreinterpretq_u64_u32(vshrq_n_u32(input, 31)); + // Merge the two pairs together with a 64-bit unsigned shift right + add. + uint8x16_t paired = + vreinterpretq_u8_u64(vsraq_n_u64(high_bits, high_bits, 31)); + // Extract the result. + return vgetq_lane_u8(paired, 0) | (vgetq_lane_u8(paired, 8) << 2); +#endif +} + +// Multiply packed single-precision (32-bit) floating-point elements in a and b, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_ps +FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vmulq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Multiply the lower single-precision (32-bit) floating-point element in a and +// b, store the result in the lower element of dst, and copy the upper 3 packed +// elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_ss +FORCE_INLINE __m128 _mm_mul_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_mul_ps(a, b)); +} + +// Multiply the packed unsigned 16-bit integers in a and b, producing +// intermediate 32-bit integers, and store the high 16 bits of the intermediate +// integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_pu16 +FORCE_INLINE __m64 _mm_mulhi_pu16(__m64 a, __m64 b) +{ + return vreinterpret_m64_u16(vshrn_n_u32( + vmull_u16(vreinterpret_u16_m64(a), vreinterpret_u16_m64(b)), 16)); +} + +// Compute the bitwise OR of packed single-precision (32-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_or_ps +FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_s32( + vorrq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); +} + +// Average packed unsigned 8-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pavgb +#define _m_pavgb(a, b) _mm_avg_pu8(a, b) + +// Average packed unsigned 16-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pavgw +#define _m_pavgw(a, b) _mm_avg_pu16(a, b) + +// Extract a 16-bit integer from a, selected with imm8, and store the result in +// the lower element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pextrw +#define _m_pextrw(a, imm) _mm_extract_pi16(a, imm) + +// Copy a to dst, and insert the 16-bit integer i into dst at the location +// specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=m_pinsrw +#define _m_pinsrw(a, i, imm) _mm_insert_pi16(a, i, imm) + +// Compare packed signed 16-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmaxsw +#define _m_pmaxsw(a, b) _mm_max_pi16(a, b) + +// Compare packed unsigned 8-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmaxub +#define _m_pmaxub(a, b) _mm_max_pu8(a, b) + +// Compare packed signed 16-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pminsw +#define _m_pminsw(a, b) _mm_min_pi16(a, b) + +// Compare packed unsigned 8-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pminub +#define _m_pminub(a, b) _mm_min_pu8(a, b) + +// Create mask from the most significant bit of each 8-bit element in a, and +// store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmovmskb +#define _m_pmovmskb(a) _mm_movemask_pi8(a) + +// Multiply the packed unsigned 16-bit integers in a and b, producing +// intermediate 32-bit integers, and store the high 16 bits of the intermediate +// integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pmulhuw +#define _m_pmulhuw(a, b) _mm_mulhi_pu16(a, b) + +// Fetch the line of data from memory that contains address p to a location in +// the cache hierarchy specified by the locality hint i. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_prefetch +FORCE_INLINE void _mm_prefetch(char const *p, int i) +{ + (void) i; +#if defined(_MSC_VER) && !defined(__clang__) + switch (i) { + case _MM_HINT_NTA: + __prefetch2(p, 1); + break; + case _MM_HINT_T0: + __prefetch2(p, 0); + break; + case _MM_HINT_T1: + __prefetch2(p, 2); + break; + case _MM_HINT_T2: + __prefetch2(p, 4); + break; + } +#else + switch (i) { + case _MM_HINT_NTA: + __builtin_prefetch(p, 0, 0); + break; + case _MM_HINT_T0: + __builtin_prefetch(p, 0, 3); + break; + case _MM_HINT_T1: + __builtin_prefetch(p, 0, 2); + break; + case _MM_HINT_T2: + __builtin_prefetch(p, 0, 1); + break; + } +#endif +} + +// Compute the absolute differences of packed unsigned 8-bit integers in a and +// b, then horizontally sum each consecutive 8 differences to produce four +// unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low +// 16 bits of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=m_psadbw +#define _m_psadbw(a, b) _mm_sad_pu8(a, b) + +// Shuffle 16-bit integers in a using the control in imm8, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_m_pshufw +#define _m_pshufw(a, imm) _mm_shuffle_pi16(a, imm) + +// Compute the approximate reciprocal of packed single-precision (32-bit) +// floating-point elements in a, and store the results in dst. The maximum +// relative error for this approximation is less than 1.5*2^-12. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rcp_ps +FORCE_INLINE __m128 _mm_rcp_ps(__m128 in) +{ + float32x4_t recip = vrecpeq_f32(vreinterpretq_f32_m128(in)); + recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); +#if SSE2NEON_PRECISE_DIV + // Additional Netwon-Raphson iteration for accuracy + recip = vmulq_f32(recip, vrecpsq_f32(recip, vreinterpretq_f32_m128(in))); +#endif + return vreinterpretq_m128_f32(recip); +} + +// Compute the approximate reciprocal of the lower single-precision (32-bit) +// floating-point element in a, store the result in the lower element of dst, +// and copy the upper 3 packed elements from a to the upper elements of dst. The +// maximum relative error for this approximation is less than 1.5*2^-12. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rcp_ss +FORCE_INLINE __m128 _mm_rcp_ss(__m128 a) +{ + return _mm_move_ss(a, _mm_rcp_ps(a)); +} + +// Compute the approximate reciprocal square root of packed single-precision +// (32-bit) floating-point elements in a, and store the results in dst. The +// maximum relative error for this approximation is less than 1.5*2^-12. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rsqrt_ps +FORCE_INLINE __m128 _mm_rsqrt_ps(__m128 in) +{ + float32x4_t out = vrsqrteq_f32(vreinterpretq_f32_m128(in)); + + // Generate masks for detecting whether input has any 0.0f/-0.0f + // (which becomes positive/negative infinity by IEEE-754 arithmetic rules). + const uint32x4_t pos_inf = vdupq_n_u32(0x7F800000); + const uint32x4_t neg_inf = vdupq_n_u32(0xFF800000); + const uint32x4_t has_pos_zero = + vceqq_u32(pos_inf, vreinterpretq_u32_f32(out)); + const uint32x4_t has_neg_zero = + vceqq_u32(neg_inf, vreinterpretq_u32_f32(out)); + + out = vmulq_f32( + out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out)); +#if SSE2NEON_PRECISE_SQRT + // Additional Netwon-Raphson iteration for accuracy + out = vmulq_f32( + out, vrsqrtsq_f32(vmulq_f32(vreinterpretq_f32_m128(in), out), out)); +#endif + + // Set output vector element to infinity/negative-infinity if + // the corresponding input vector element is 0.0f/-0.0f. + out = vbslq_f32(has_pos_zero, (float32x4_t) pos_inf, out); + out = vbslq_f32(has_neg_zero, (float32x4_t) neg_inf, out); + + return vreinterpretq_m128_f32(out); +} + +// Compute the approximate reciprocal square root of the lower single-precision +// (32-bit) floating-point element in a, store the result in the lower element +// of dst, and copy the upper 3 packed elements from a to the upper elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_rsqrt_ss +FORCE_INLINE __m128 _mm_rsqrt_ss(__m128 in) +{ + return vsetq_lane_f32(vgetq_lane_f32(_mm_rsqrt_ps(in), 0), in, 0); +} + +// Compute the absolute differences of packed unsigned 8-bit integers in a and +// b, then horizontally sum each consecutive 8 differences to produce four +// unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low +// 16 bits of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sad_pu8 +FORCE_INLINE __m64 _mm_sad_pu8(__m64 a, __m64 b) +{ + uint64x1_t t = vpaddl_u32(vpaddl_u16( + vpaddl_u8(vabd_u8(vreinterpret_u8_m64(a), vreinterpret_u8_m64(b))))); + return vreinterpret_m64_u16( + vset_lane_u16((uint16_t) vget_lane_u64(t, 0), vdup_n_u16(0), 0)); +} + +// Macro: Set the flush zero bits of the MXCSR control and status register to +// the value in unsigned 32-bit integer a. The flush zero may contain any of the +// following flags: _MM_FLUSH_ZERO_ON or _MM_FLUSH_ZERO_OFF +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_SET_FLUSH_ZERO_MODE +FORCE_INLINE void _sse2neon_mm_set_flush_zero_mode(unsigned int flag) +{ + // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting, + // regardless of the value of the FZ bit. + union { + fpcr_bitfield field; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint64_t value; +#else + uint32_t value; +#endif + } r; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + r.value = _sse2neon_get_fpcr(); +#else + __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ +#endif + + r.field.bit24 = (flag & _MM_FLUSH_ZERO_MASK) == _MM_FLUSH_ZERO_ON; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + _sse2neon_set_fpcr(r.value); +#else + __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */ +#endif +} + +// Set packed single-precision (32-bit) floating-point elements in dst with the +// supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ps +FORCE_INLINE __m128 _mm_set_ps(float w, float z, float y, float x) +{ + float ALIGN_STRUCT(16) data[4] = {x, y, z, w}; + return vreinterpretq_m128_f32(vld1q_f32(data)); +} + +// Broadcast single-precision (32-bit) floating-point value a to all elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ps1 +FORCE_INLINE __m128 _mm_set_ps1(float _w) +{ + return vreinterpretq_m128_f32(vdupq_n_f32(_w)); +} + +// Macro: Set the rounding mode bits of the MXCSR control and status register to +// the value in unsigned 32-bit integer a. The rounding mode may contain any of +// the following flags: _MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, +// _MM_ROUND_TOWARD_ZERO +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_MM_SET_ROUNDING_MODE +FORCE_INLINE void _MM_SET_ROUNDING_MODE(int rounding) +{ + switch (rounding) { + case _MM_ROUND_NEAREST: + rounding = FE_TONEAREST; + break; + case _MM_ROUND_DOWN: + rounding = FE_DOWNWARD; + break; + case _MM_ROUND_UP: + rounding = FE_UPWARD; + break; + case _MM_ROUND_TOWARD_ZERO: + rounding = FE_TOWARDZERO; + break; + default: + // rounding must be _MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, + // _MM_ROUND_TOWARD_ZERO. all the other invalid values we treat them as + // FE_TOWARDZERO (truncate). + rounding = FE_TOWARDZERO; + } + fesetround(rounding); +} + +// Copy single-precision (32-bit) floating-point element a to the lower element +// of dst, and zero the upper 3 elements. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_ss +FORCE_INLINE __m128 _mm_set_ss(float a) +{ + return vreinterpretq_m128_f32(vsetq_lane_f32(a, vdupq_n_f32(0), 0)); +} + +// Broadcast single-precision (32-bit) floating-point value a to all elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_ps +FORCE_INLINE __m128 _mm_set1_ps(float _w) +{ + return vreinterpretq_m128_f32(vdupq_n_f32(_w)); +} + +// Set the MXCSR control and status register with the value in unsigned 32-bit +// integer a. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setcsr +// FIXME: _mm_setcsr() implementation supports changing the rounding mode only. +FORCE_INLINE void _mm_setcsr(unsigned int a) +{ + _MM_SET_ROUNDING_MODE(a); +} + +// Get the unsigned 32-bit value of the MXCSR control and status register. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_getcsr +// FIXME: _mm_getcsr() implementation supports reading the rounding mode only. +FORCE_INLINE unsigned int _mm_getcsr(void) +{ + return _MM_GET_ROUNDING_MODE(); +} + +// Set packed single-precision (32-bit) floating-point elements in dst with the +// supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_ps +FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x) +{ + float ALIGN_STRUCT(16) data[4] = {w, z, y, x}; + return vreinterpretq_m128_f32(vld1q_f32(data)); +} + +// Return vector of type __m128 with all elements set to zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_ps +FORCE_INLINE __m128 _mm_setzero_ps(void) +{ + return vreinterpretq_m128_f32(vdupq_n_f32(0)); +} + +// Shuffle 16-bit integers in a using the control in imm8, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pi16 +#ifdef _sse2neon_shuffle +#define _mm_shuffle_pi16(a, imm) \ + vreinterpret_m64_s16(vshuffle_s16( \ + vreinterpret_s16_m64(a), vreinterpret_s16_m64(a), ((imm) & 0x3), \ + (((imm) >> 2) & 0x3), (((imm) >> 4) & 0x3), (((imm) >> 6) & 0x3))) +#else +#define _mm_shuffle_pi16(a, imm) \ + _sse2neon_define1( \ + __m64, a, int16x4_t ret; \ + ret = vmov_n_s16( \ + vget_lane_s16(vreinterpret_s16_m64(_a), (imm) & (0x3))); \ + ret = vset_lane_s16( \ + vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 2) & 0x3), ret, \ + 1); \ + ret = vset_lane_s16( \ + vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 4) & 0x3), ret, \ + 2); \ + ret = vset_lane_s16( \ + vget_lane_s16(vreinterpret_s16_m64(_a), ((imm) >> 6) & 0x3), ret, \ + 3); \ + _sse2neon_return(vreinterpret_m64_s16(ret));) +#endif + +// Perform a serializing operation on all store-to-memory instructions that were +// issued prior to this instruction. Guarantees that every store instruction +// that precedes, in program order, is globally visible before any store +// instruction which follows the fence in program order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sfence +FORCE_INLINE void _mm_sfence(void) +{ + _sse2neon_smp_mb(); +} + +// Perform a serializing operation on all load-from-memory and store-to-memory +// instructions that were issued prior to this instruction. Guarantees that +// every memory access that precedes, in program order, the memory fence +// instruction is globally visible before any memory instruction which follows +// the fence in program order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mfence +FORCE_INLINE void _mm_mfence(void) +{ + _sse2neon_smp_mb(); +} + +// Perform a serializing operation on all load-from-memory instructions that +// were issued prior to this instruction. Guarantees that every load instruction +// that precedes, in program order, is globally visible before any load +// instruction which follows the fence in program order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_lfence +FORCE_INLINE void _mm_lfence(void) +{ + _sse2neon_smp_mb(); +} + +// FORCE_INLINE __m128 _mm_shuffle_ps(__m128 a, __m128 b, __constrange(0,255) +// int imm) +#ifdef _sse2neon_shuffle +#define _mm_shuffle_ps(a, b, imm) \ + __extension__({ \ + float32x4_t _input1 = vreinterpretq_f32_m128(a); \ + float32x4_t _input2 = vreinterpretq_f32_m128(b); \ + float32x4_t _shuf = \ + vshuffleq_s32(_input1, _input2, (imm) & (0x3), ((imm) >> 2) & 0x3, \ + (((imm) >> 4) & 0x3) + 4, (((imm) >> 6) & 0x3) + 4); \ + vreinterpretq_m128_f32(_shuf); \ + }) +#else // generic +#define _mm_shuffle_ps(a, b, imm) \ + _sse2neon_define2( \ + __m128, a, b, __m128 ret; switch (imm) { \ + case _MM_SHUFFLE(1, 0, 3, 2): \ + ret = _mm_shuffle_ps_1032(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 3, 0, 1): \ + ret = _mm_shuffle_ps_2301(_a, _b); \ + break; \ + case _MM_SHUFFLE(0, 3, 2, 1): \ + ret = _mm_shuffle_ps_0321(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 1, 0, 3): \ + ret = _mm_shuffle_ps_2103(_a, _b); \ + break; \ + case _MM_SHUFFLE(1, 0, 1, 0): \ + ret = _mm_movelh_ps(_a, _b); \ + break; \ + case _MM_SHUFFLE(1, 0, 0, 1): \ + ret = _mm_shuffle_ps_1001(_a, _b); \ + break; \ + case _MM_SHUFFLE(0, 1, 0, 1): \ + ret = _mm_shuffle_ps_0101(_a, _b); \ + break; \ + case _MM_SHUFFLE(3, 2, 1, 0): \ + ret = _mm_shuffle_ps_3210(_a, _b); \ + break; \ + case _MM_SHUFFLE(0, 0, 1, 1): \ + ret = _mm_shuffle_ps_0011(_a, _b); \ + break; \ + case _MM_SHUFFLE(0, 0, 2, 2): \ + ret = _mm_shuffle_ps_0022(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 2, 0, 0): \ + ret = _mm_shuffle_ps_2200(_a, _b); \ + break; \ + case _MM_SHUFFLE(3, 2, 0, 2): \ + ret = _mm_shuffle_ps_3202(_a, _b); \ + break; \ + case _MM_SHUFFLE(3, 2, 3, 2): \ + ret = _mm_movehl_ps(_b, _a); \ + break; \ + case _MM_SHUFFLE(1, 1, 3, 3): \ + ret = _mm_shuffle_ps_1133(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 0, 1, 0): \ + ret = _mm_shuffle_ps_2010(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 0, 0, 1): \ + ret = _mm_shuffle_ps_2001(_a, _b); \ + break; \ + case _MM_SHUFFLE(2, 0, 3, 2): \ + ret = _mm_shuffle_ps_2032(_a, _b); \ + break; \ + default: \ + ret = _mm_shuffle_ps_default(_a, _b, (imm)); \ + break; \ + } _sse2neon_return(ret);) +#endif + +// Compute the square root of packed single-precision (32-bit) floating-point +// elements in a, and store the results in dst. +// Due to ARMv7-A NEON's lack of a precise square root intrinsic, we implement +// square root by multiplying input in with its reciprocal square root before +// using the Newton-Raphson method to approximate the results. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_ps +FORCE_INLINE __m128 _mm_sqrt_ps(__m128 in) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) && \ + !SSE2NEON_PRECISE_SQRT + return vreinterpretq_m128_f32(vsqrtq_f32(vreinterpretq_f32_m128(in))); +#else + float32x4_t recip = vrsqrteq_f32(vreinterpretq_f32_m128(in)); + + // Test for vrsqrteq_f32(0) -> positive infinity case. + // Change to zero, so that s * 1/sqrt(s) result is zero too. + const uint32x4_t pos_inf = vdupq_n_u32(0x7F800000); + const uint32x4_t div_by_zero = + vceqq_u32(pos_inf, vreinterpretq_u32_f32(recip)); + recip = vreinterpretq_f32_u32( + vandq_u32(vmvnq_u32(div_by_zero), vreinterpretq_u32_f32(recip))); + + recip = vmulq_f32( + vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)), + recip); + // Additional Netwon-Raphson iteration for accuracy + recip = vmulq_f32( + vrsqrtsq_f32(vmulq_f32(recip, recip), vreinterpretq_f32_m128(in)), + recip); + + // sqrt(s) = s * 1/sqrt(s) + return vreinterpretq_m128_f32(vmulq_f32(vreinterpretq_f32_m128(in), recip)); +#endif +} + +// Compute the square root of the lower single-precision (32-bit) floating-point +// element in a, store the result in the lower element of dst, and copy the +// upper 3 packed elements from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_ss +FORCE_INLINE __m128 _mm_sqrt_ss(__m128 in) +{ + float32_t value = + vgetq_lane_f32(vreinterpretq_f32_m128(_mm_sqrt_ps(in)), 0); + return vreinterpretq_m128_f32( + vsetq_lane_f32(value, vreinterpretq_f32_m128(in), 0)); +} + +// Store 128-bits (composed of 4 packed single-precision (32-bit) floating-point +// elements) from a into memory. mem_addr must be aligned on a 16-byte boundary +// or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ps +FORCE_INLINE void _mm_store_ps(float *p, __m128 a) +{ + vst1q_f32(p, vreinterpretq_f32_m128(a)); +} + +// Store the lower single-precision (32-bit) floating-point element from a into +// 4 contiguous elements in memory. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ps1 +FORCE_INLINE void _mm_store_ps1(float *p, __m128 a) +{ + float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); + vst1q_f32(p, vdupq_n_f32(a0)); +} + +// Store the lower single-precision (32-bit) floating-point element from a into +// memory. mem_addr does not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_ss +FORCE_INLINE void _mm_store_ss(float *p, __m128 a) +{ + vst1q_lane_f32(p, vreinterpretq_f32_m128(a), 0); +} + +// Store the lower single-precision (32-bit) floating-point element from a into +// 4 contiguous elements in memory. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store1_ps +#define _mm_store1_ps _mm_store_ps1 + +// Store the upper 2 single-precision (32-bit) floating-point elements from a +// into memory. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeh_pi +FORCE_INLINE void _mm_storeh_pi(__m64 *p, __m128 a) +{ + *p = vreinterpret_m64_f32(vget_high_f32(a)); +} + +// Store the lower 2 single-precision (32-bit) floating-point elements from a +// into memory. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_pi +FORCE_INLINE void _mm_storel_pi(__m64 *p, __m128 a) +{ + *p = vreinterpret_m64_f32(vget_low_f32(a)); +} + +// Store 4 single-precision (32-bit) floating-point elements from a into memory +// in reverse order. mem_addr must be aligned on a 16-byte boundary or a +// general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storer_ps +FORCE_INLINE void _mm_storer_ps(float *p, __m128 a) +{ + float32x4_t tmp = vrev64q_f32(vreinterpretq_f32_m128(a)); + float32x4_t rev = vextq_f32(tmp, tmp, 2); + vst1q_f32(p, rev); +} + +// Store 128-bits (composed of 4 packed single-precision (32-bit) floating-point +// elements) from a into memory. mem_addr does not need to be aligned on any +// particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_ps +FORCE_INLINE void _mm_storeu_ps(float *p, __m128 a) +{ + vst1q_f32(p, vreinterpretq_f32_m128(a)); +} + +// Stores 16-bits of integer data a at the address p. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si16 +FORCE_INLINE void _mm_storeu_si16(void *p, __m128i a) +{ + vst1q_lane_s16((int16_t *) p, vreinterpretq_s16_m128i(a), 0); +} + +// Stores 64-bits of integer data a at the address p. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si64 +FORCE_INLINE void _mm_storeu_si64(void *p, __m128i a) +{ + vst1q_lane_s64((int64_t *) p, vreinterpretq_s64_m128i(a), 0); +} + +// Store 64-bits of integer data from a into memory using a non-temporal memory +// hint. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_pi +FORCE_INLINE void _mm_stream_pi(__m64 *p, __m64 a) +{ + vst1_s64((int64_t *) p, vreinterpret_s64_m64(a)); +} + +// Store 128-bits (composed of 4 packed single-precision (32-bit) floating- +// point elements) from a into memory using a non-temporal memory hint. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_ps +FORCE_INLINE void _mm_stream_ps(float *p, __m128 a) +{ +#if __has_builtin(__builtin_nontemporal_store) + __builtin_nontemporal_store(a, (float32x4_t *) p); +#else + vst1q_f32(p, vreinterpretq_f32_m128(a)); +#endif +} + +// Subtract packed single-precision (32-bit) floating-point elements in b from +// packed single-precision (32-bit) floating-point elements in a, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_ps +FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_f32( + vsubq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +} + +// Subtract the lower single-precision (32-bit) floating-point element in b from +// the lower single-precision (32-bit) floating-point element in a, store the +// result in the lower element of dst, and copy the upper 3 packed elements from +// a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_ss +FORCE_INLINE __m128 _mm_sub_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_sub_ps(a, b)); +} + +// Macro: Transpose the 4x4 matrix formed by the 4 rows of single-precision +// (32-bit) floating-point elements in row0, row1, row2, and row3, and store the +// transposed matrix in these vectors (row0 now contains column 0, etc.). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=MM_TRANSPOSE4_PS +#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3) \ + do { \ + float32x4x2_t ROW01 = vtrnq_f32(row0, row1); \ + float32x4x2_t ROW23 = vtrnq_f32(row2, row3); \ + row0 = vcombine_f32(vget_low_f32(ROW01.val[0]), \ + vget_low_f32(ROW23.val[0])); \ + row1 = vcombine_f32(vget_low_f32(ROW01.val[1]), \ + vget_low_f32(ROW23.val[1])); \ + row2 = vcombine_f32(vget_high_f32(ROW01.val[0]), \ + vget_high_f32(ROW23.val[0])); \ + row3 = vcombine_f32(vget_high_f32(ROW01.val[1]), \ + vget_high_f32(ROW23.val[1])); \ + } while (0) + +// according to the documentation, these intrinsics behave the same as the +// non-'u' versions. We'll just alias them here. +#define _mm_ucomieq_ss _mm_comieq_ss +#define _mm_ucomige_ss _mm_comige_ss +#define _mm_ucomigt_ss _mm_comigt_ss +#define _mm_ucomile_ss _mm_comile_ss +#define _mm_ucomilt_ss _mm_comilt_ss +#define _mm_ucomineq_ss _mm_comineq_ss + +// Return vector of type __m128i with undefined elements. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_undefined_si128 +FORCE_INLINE __m128i _mm_undefined_si128(void) +{ +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + __m128i a; +#if defined(_MSC_VER) + a = _mm_setzero_si128(); +#endif + return a; +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif +} + +// Return vector of type __m128 with undefined elements. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_undefined_ps +FORCE_INLINE __m128 _mm_undefined_ps(void) +{ +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + __m128 a; +#if defined(_MSC_VER) + a = _mm_setzero_ps(); +#endif + return a; +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif +} + +// Unpack and interleave single-precision (32-bit) floating-point elements from +// the high half a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_ps +FORCE_INLINE __m128 _mm_unpackhi_ps(__m128 a, __m128 b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vzip2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#else + float32x2_t a1 = vget_high_f32(vreinterpretq_f32_m128(a)); + float32x2_t b1 = vget_high_f32(vreinterpretq_f32_m128(b)); + float32x2x2_t result = vzip_f32(a1, b1); + return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave single-precision (32-bit) floating-point elements from +// the low half of a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_ps +FORCE_INLINE __m128 _mm_unpacklo_ps(__m128 a, __m128 b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vzip1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#else + float32x2_t a1 = vget_low_f32(vreinterpretq_f32_m128(a)); + float32x2_t b1 = vget_low_f32(vreinterpretq_f32_m128(b)); + float32x2x2_t result = vzip_f32(a1, b1); + return vreinterpretq_m128_f32(vcombine_f32(result.val[0], result.val[1])); +#endif +} + +// Compute the bitwise XOR of packed single-precision (32-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_ps +FORCE_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b) +{ + return vreinterpretq_m128_s32( + veorq_s32(vreinterpretq_s32_m128(a), vreinterpretq_s32_m128(b))); +} + +/* SSE2 */ + +// Add packed 16-bit integers in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi16 +FORCE_INLINE __m128i _mm_add_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Add packed 32-bit integers in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi32 +FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vaddq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Add packed 64-bit integers in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi64 +FORCE_INLINE __m128i _mm_add_epi64(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s64( + vaddq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); +} + +// Add packed 8-bit integers in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_epi8 +FORCE_INLINE __m128i _mm_add_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Add packed double-precision (64-bit) floating-point elements in a and b, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_pd +FORCE_INLINE __m128d _mm_add_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[2]; + c[0] = a0 + b0; + c[1] = a1 + b1; + return vld1q_f32((float32_t *) c); +#endif +} + +// Add the lower double-precision (64-bit) floating-point element in a and b, +// store the result in the lower element of dst, and copy the upper element from +// a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_sd +FORCE_INLINE __m128d _mm_add_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_add_pd(a, b)); +#else + double a0, a1, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double c[2]; + c[0] = a0 + b0; + c[1] = a1; + return vld1q_f32((float32_t *) c); +#endif +} + +// Add 64-bit integers a and b, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_add_si64 +FORCE_INLINE __m64 _mm_add_si64(__m64 a, __m64 b) +{ + return vreinterpret_m64_s64( + vadd_s64(vreinterpret_s64_m64(a), vreinterpret_s64_m64(b))); +} + +// Add packed signed 16-bit integers in a and b using saturation, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epi16 +FORCE_INLINE __m128i _mm_adds_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vqaddq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Add packed signed 8-bit integers in a and b using saturation, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epi8 +FORCE_INLINE __m128i _mm_adds_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vqaddq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Add packed unsigned 16-bit integers in a and b using saturation, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epu16 +FORCE_INLINE __m128i _mm_adds_epu16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vqaddq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); +} + +// Add packed unsigned 8-bit integers in a and b using saturation, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_adds_epu8 +FORCE_INLINE __m128i _mm_adds_epu8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vqaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); +} + +// Compute the bitwise AND of packed double-precision (64-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_pd +FORCE_INLINE __m128d _mm_and_pd(__m128d a, __m128d b) +{ + return vreinterpretq_m128d_s64( + vandq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); +} + +// Compute the bitwise AND of 128 bits (representing integer data) in a and b, +// and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_and_si128 +FORCE_INLINE __m128i _mm_and_si128(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vandq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compute the bitwise NOT of packed double-precision (64-bit) floating-point +// elements in a and then AND with b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_pd +FORCE_INLINE __m128d _mm_andnot_pd(__m128d a, __m128d b) +{ + // *NOTE* argument swap + return vreinterpretq_m128d_s64( + vbicq_s64(vreinterpretq_s64_m128d(b), vreinterpretq_s64_m128d(a))); +} + +// Compute the bitwise NOT of 128 bits (representing integer data) in a and then +// AND with b, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_andnot_si128 +FORCE_INLINE __m128i _mm_andnot_si128(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vbicq_s32(vreinterpretq_s32_m128i(b), + vreinterpretq_s32_m128i(a))); // *NOTE* argument swap +} + +// Average packed unsigned 16-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_epu16 +FORCE_INLINE __m128i _mm_avg_epu16(__m128i a, __m128i b) +{ + return (__m128i) vrhaddq_u16(vreinterpretq_u16_m128i(a), + vreinterpretq_u16_m128i(b)); +} + +// Average packed unsigned 8-bit integers in a and b, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_avg_epu8 +FORCE_INLINE __m128i _mm_avg_epu8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vrhaddq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); +} + +// Shift a left by imm8 bytes while shifting in zeros, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_bslli_si128 +#define _mm_bslli_si128(a, imm) _mm_slli_si128(a, imm) + +// Shift a right by imm8 bytes while shifting in zeros, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_bsrli_si128 +#define _mm_bsrli_si128(a, imm) _mm_srli_si128(a, imm) + +// Cast vector of type __m128d to type __m128. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castpd_ps +FORCE_INLINE __m128 _mm_castpd_ps(__m128d a) +{ + return vreinterpretq_m128_s64(vreinterpretq_s64_m128d(a)); +} + +// Cast vector of type __m128d to type __m128i. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castpd_si128 +FORCE_INLINE __m128i _mm_castpd_si128(__m128d a) +{ + return vreinterpretq_m128i_s64(vreinterpretq_s64_m128d(a)); +} + +// Cast vector of type __m128 to type __m128d. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castps_pd +FORCE_INLINE __m128d _mm_castps_pd(__m128 a) +{ + return vreinterpretq_m128d_s32(vreinterpretq_s32_m128(a)); +} + +// Cast vector of type __m128 to type __m128i. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castps_si128 +FORCE_INLINE __m128i _mm_castps_si128(__m128 a) +{ + return vreinterpretq_m128i_s32(vreinterpretq_s32_m128(a)); +} + +// Cast vector of type __m128i to type __m128d. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castsi128_pd +FORCE_INLINE __m128d _mm_castsi128_pd(__m128i a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vreinterpretq_f64_m128i(a)); +#else + return vreinterpretq_m128d_f32(vreinterpretq_f32_m128i(a)); +#endif +} + +// Cast vector of type __m128i to type __m128. This intrinsic is only used for +// compilation and does not generate any instructions, thus it has zero latency. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_castsi128_ps +FORCE_INLINE __m128 _mm_castsi128_ps(__m128i a) +{ + return vreinterpretq_m128_s32(vreinterpretq_s32_m128i(a)); +} + +// Invalidate and flush the cache line that contains p from all levels of the +// cache hierarchy. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_clflush +#if defined(__APPLE__) +#include +#endif +FORCE_INLINE void _mm_clflush(void const *p) +{ + (void) p; + + /* sys_icache_invalidate is supported since macOS 10.5. + * However, it does not work on non-jailbroken iOS devices, although the + * compilation is successful. + */ +#if defined(__APPLE__) + sys_icache_invalidate((void *) (uintptr_t) p, SSE2NEON_CACHELINE_SIZE); +#elif defined(__GNUC__) || defined(__clang__) + uintptr_t ptr = (uintptr_t) p; + __builtin___clear_cache((char *) ptr, + (char *) ptr + SSE2NEON_CACHELINE_SIZE); +#elif (_MSC_VER) && SSE2NEON_INCLUDE_WINDOWS_H + FlushInstructionCache(GetCurrentProcess(), p, SSE2NEON_CACHELINE_SIZE); +#endif +} + +// Compare packed 16-bit integers in a and b for equality, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi16 +FORCE_INLINE __m128i _mm_cmpeq_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vceqq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compare packed 32-bit integers in a and b for equality, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi32 +FORCE_INLINE __m128i _mm_cmpeq_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u32( + vceqq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compare packed 8-bit integers in a and b for equality, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_epi8 +FORCE_INLINE __m128i _mm_cmpeq_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vceqq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for equality, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_pd +FORCE_INLINE __m128d _mm_cmpeq_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64( + vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) + uint32x4_t cmp = + vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); + uint32x4_t swapped = vrev64q_u32(cmp); + return vreinterpretq_m128d_u32(vandq_u32(cmp, swapped)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for equality, store the result in the lower element of dst, and copy the +// upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpeq_sd +FORCE_INLINE __m128d _mm_cmpeq_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpeq_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for greater-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_pd +FORCE_INLINE __m128d _mm_cmpge_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64( + vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = a0 >= b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1 >= b1 ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for greater-than-or-equal, store the result in the lower element of dst, +// and copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpge_sd +FORCE_INLINE __m128d _mm_cmpge_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmpge_pd(a, b)); +#else + // expand "_mm_cmpge_pd()" to reduce unnecessary operations + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = a0 >= b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare packed signed 16-bit integers in a and b for greater-than, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi16 +FORCE_INLINE __m128i _mm_cmpgt_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vcgtq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compare packed signed 32-bit integers in a and b for greater-than, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi32 +FORCE_INLINE __m128i _mm_cmpgt_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u32( + vcgtq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compare packed signed 8-bit integers in a and b for greater-than, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_epi8 +FORCE_INLINE __m128i _mm_cmpgt_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vcgtq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for greater-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_pd +FORCE_INLINE __m128d _mm_cmpgt_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64( + vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = a0 > b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1 > b1 ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for greater-than, store the result in the lower element of dst, and copy +// the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpgt_sd +FORCE_INLINE __m128d _mm_cmpgt_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmpgt_pd(a, b)); +#else + // expand "_mm_cmpge_pd()" to reduce unnecessary operations + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = a0 > b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for less-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_pd +FORCE_INLINE __m128d _mm_cmple_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64( + vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = a0 <= b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1 <= b1 ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for less-than-or-equal, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmple_sd +FORCE_INLINE __m128d _mm_cmple_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmple_pd(a, b)); +#else + // expand "_mm_cmpge_pd()" to reduce unnecessary operations + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = a0 <= b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare packed signed 16-bit integers in a and b for less-than, and store the +// results in dst. Note: This intrinsic emits the pcmpgtw instruction with the +// order of the operands switched. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi16 +FORCE_INLINE __m128i _mm_cmplt_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vcltq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compare packed signed 32-bit integers in a and b for less-than, and store the +// results in dst. Note: This intrinsic emits the pcmpgtd instruction with the +// order of the operands switched. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi32 +FORCE_INLINE __m128i _mm_cmplt_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u32( + vcltq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compare packed signed 8-bit integers in a and b for less-than, and store the +// results in dst. Note: This intrinsic emits the pcmpgtb instruction with the +// order of the operands switched. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_epi8 +FORCE_INLINE __m128i _mm_cmplt_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vcltq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for less-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_pd +FORCE_INLINE __m128d _mm_cmplt_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64( + vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = a0 < b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1 < b1 ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for less-than, store the result in the lower element of dst, and copy the +// upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmplt_sd +FORCE_INLINE __m128d _mm_cmplt_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmplt_pd(a, b)); +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = a0 < b0 ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for not-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_pd +FORCE_INLINE __m128d _mm_cmpneq_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_s32(vmvnq_s32(vreinterpretq_s32_u64( + vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))))); +#else + // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) + uint32x4_t cmp = + vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); + uint32x4_t swapped = vrev64q_u32(cmp); + return vreinterpretq_m128d_u32(vmvnq_u32(vandq_u32(cmp, swapped))); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for not-equal, store the result in the lower element of dst, and copy the +// upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpneq_sd +FORCE_INLINE __m128d _mm_cmpneq_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpneq_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for not-greater-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_pd +FORCE_INLINE __m128d _mm_cmpnge_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64(veorq_u64( + vcgeq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), + vdupq_n_u64(UINT64_MAX))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = !(a0 >= b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = !(a1 >= b1) ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for not-greater-than-or-equal, store the result in the lower element of +// dst, and copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnge_sd +FORCE_INLINE __m128d _mm_cmpnge_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpnge_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for not-greater-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_cmpngt_pd +FORCE_INLINE __m128d _mm_cmpngt_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64(veorq_u64( + vcgtq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), + vdupq_n_u64(UINT64_MAX))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = !(a0 > b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = !(a1 > b1) ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for not-greater-than, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpngt_sd +FORCE_INLINE __m128d _mm_cmpngt_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpngt_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for not-less-than-or-equal, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_pd +FORCE_INLINE __m128d _mm_cmpnle_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64(veorq_u64( + vcleq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), + vdupq_n_u64(UINT64_MAX))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = !(a0 <= b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = !(a1 <= b1) ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for not-less-than-or-equal, store the result in the lower element of dst, +// and copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnle_sd +FORCE_INLINE __m128d _mm_cmpnle_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpnle_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// for not-less-than, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_pd +FORCE_INLINE __m128d _mm_cmpnlt_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_u64(veorq_u64( + vcltq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)), + vdupq_n_u64(UINT64_MAX))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = !(a0 < b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = !(a1 < b1) ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b for not-less-than, store the result in the lower element of dst, and copy +// the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpnlt_sd +FORCE_INLINE __m128d _mm_cmpnlt_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_cmpnlt_pd(a, b)); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// to see if neither is NaN, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_pd +FORCE_INLINE __m128d _mm_cmpord_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + // Excluding NaNs, any two floating point numbers can be compared. + uint64x2_t not_nan_a = + vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a)); + uint64x2_t not_nan_b = + vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b)); + return vreinterpretq_m128d_u64(vandq_u64(not_nan_a, not_nan_b)); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = (a0 == a0 && b0 == b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = (a1 == a1 && b1 == b1) ? ~UINT64_C(0) : UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b to see if neither is NaN, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpord_sd +FORCE_INLINE __m128d _mm_cmpord_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmpord_pd(a, b)); +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = (a0 == a0 && b0 == b0) ? ~UINT64_C(0) : UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b +// to see if either is NaN, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_pd +FORCE_INLINE __m128d _mm_cmpunord_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + // Two NaNs are not equal in comparison operation. + uint64x2_t not_nan_a = + vceqq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(a)); + uint64x2_t not_nan_b = + vceqq_f64(vreinterpretq_f64_m128d(b), vreinterpretq_f64_m128d(b)); + return vreinterpretq_m128d_s32( + vmvnq_s32(vreinterpretq_s32_u64(vandq_u64(not_nan_a, not_nan_b)))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + uint64_t d[2]; + d[0] = (a0 == a0 && b0 == b0) ? UINT64_C(0) : ~UINT64_C(0); + d[1] = (a1 == a1 && b1 == b1) ? UINT64_C(0) : ~UINT64_C(0); + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b to see if either is NaN, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpunord_sd +FORCE_INLINE __m128d _mm_cmpunord_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_cmpunord_pd(a, b)); +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + uint64_t a1 = vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + uint64_t d[2]; + d[0] = (a0 == a0 && b0 == b0) ? UINT64_C(0) : ~UINT64_C(0); + d[1] = a1; + + return vreinterpretq_m128d_u64(vld1q_u64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for greater-than-or-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comige_sd +FORCE_INLINE int _mm_comige_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_u64(vcgeq_f64(a, b), 0) & 0x1; +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + return a0 >= b0; +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for greater-than, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comigt_sd +FORCE_INLINE int _mm_comigt_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_u64(vcgtq_f64(a, b), 0) & 0x1; +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + + return a0 > b0; +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for less-than-or-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comile_sd +FORCE_INLINE int _mm_comile_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_u64(vcleq_f64(a, b), 0) & 0x1; +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + + return a0 <= b0; +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for less-than, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comilt_sd +FORCE_INLINE int _mm_comilt_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_u64(vcltq_f64(a, b), 0) & 0x1; +#else + double a0, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + + return a0 < b0; +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for equality, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comieq_sd +FORCE_INLINE int _mm_comieq_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_u64(vceqq_f64(a, b), 0) & 0x1; +#else + uint32x4_t a_not_nan = + vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(a)); + uint32x4_t b_not_nan = + vceqq_u32(vreinterpretq_u32_m128d(b), vreinterpretq_u32_m128d(b)); + uint32x4_t a_and_b_not_nan = vandq_u32(a_not_nan, b_not_nan); + uint32x4_t a_eq_b = + vceqq_u32(vreinterpretq_u32_m128d(a), vreinterpretq_u32_m128d(b)); + uint64x2_t and_results = vandq_u64(vreinterpretq_u64_u32(a_and_b_not_nan), + vreinterpretq_u64_u32(a_eq_b)); + return vgetq_lane_u64(and_results, 0) & 0x1; +#endif +} + +// Compare the lower double-precision (64-bit) floating-point element in a and b +// for not-equal, and return the boolean result (0 or 1). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_comineq_sd +FORCE_INLINE int _mm_comineq_sd(__m128d a, __m128d b) +{ + return !_mm_comieq_sd(a, b); +} + +// Convert packed signed 32-bit integers in a to packed double-precision +// (64-bit) floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_pd +FORCE_INLINE __m128d _mm_cvtepi32_pd(__m128i a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vcvtq_f64_s64(vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a))))); +#else + double a0 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0); + double a1 = (double) vgetq_lane_s32(vreinterpretq_s32_m128i(a), 1); + return _mm_set_pd(a1, a0); +#endif +} + +// Convert packed signed 32-bit integers in a to packed single-precision +// (32-bit) floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_ps +FORCE_INLINE __m128 _mm_cvtepi32_ps(__m128i a) +{ + return vreinterpretq_m128_f32(vcvtq_f32_s32(vreinterpretq_s32_m128i(a))); +} + +// Convert packed double-precision (64-bit) floating-point elements in a to +// packed 32-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_epi32 +FORCE_INLINE __m128i _mm_cvtpd_epi32(__m128d a) +{ +// vrnd32xq_f64 not supported on clang +#if defined(__ARM_FEATURE_FRINT) && !defined(__clang__) + float64x2_t rounded = vrnd32xq_f64(vreinterpretq_f64_m128d(a)); + int64x2_t integers = vcvtq_s64_f64(rounded); + return vreinterpretq_m128i_s32( + vcombine_s32(vmovn_s64(integers), vdup_n_s32(0))); +#else + __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + double d0, d1; + d0 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 0)); + d1 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 1)); + return _mm_set_epi32(0, 0, (int32_t) d1, (int32_t) d0); +#endif +} + +// Convert packed double-precision (64-bit) floating-point elements in a to +// packed 32-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_pi32 +FORCE_INLINE __m64 _mm_cvtpd_pi32(__m128d a) +{ + __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + double d0, d1; + d0 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 0)); + d1 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 1)); + int32_t ALIGN_STRUCT(16) data[2] = {(int32_t) d0, (int32_t) d1}; + return vreinterpret_m64_s32(vld1_s32(data)); +} + +// Convert packed double-precision (64-bit) floating-point elements in a to +// packed single-precision (32-bit) floating-point elements, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpd_ps +FORCE_INLINE __m128 _mm_cvtpd_ps(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float32x2_t tmp = vcvt_f32_f64(vreinterpretq_f64_m128d(a)); + return vreinterpretq_m128_f32(vcombine_f32(tmp, vdup_n_f32(0))); +#else + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + return _mm_set_ps(0, 0, (float) a1, (float) a0); +#endif +} + +// Convert packed signed 32-bit integers in a to packed double-precision +// (64-bit) floating-point elements, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtpi32_pd +FORCE_INLINE __m128d _mm_cvtpi32_pd(__m64 a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vcvtq_f64_s64(vmovl_s32(vreinterpret_s32_m64(a)))); +#else + double a0 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 0); + double a1 = (double) vget_lane_s32(vreinterpret_s32_m64(a), 1); + return _mm_set_pd(a1, a0); +#endif +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_epi32 +// *NOTE*. The default rounding mode on SSE is 'round to even', which ARMv7-A +// does not support! It is supported on ARMv8-A however. +FORCE_INLINE __m128i _mm_cvtps_epi32(__m128 a) +{ +#if defined(__ARM_FEATURE_FRINT) + return vreinterpretq_m128i_s32(vcvtq_s32_f32(vrnd32xq_f32(a))); +#elif (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + switch (_MM_GET_ROUNDING_MODE()) { + case _MM_ROUND_NEAREST: + return vreinterpretq_m128i_s32(vcvtnq_s32_f32(a)); + case _MM_ROUND_DOWN: + return vreinterpretq_m128i_s32(vcvtmq_s32_f32(a)); + case _MM_ROUND_UP: + return vreinterpretq_m128i_s32(vcvtpq_s32_f32(a)); + default: // _MM_ROUND_TOWARD_ZERO + return vreinterpretq_m128i_s32(vcvtq_s32_f32(a)); + } +#else + float *f = (float *) &a; + switch (_MM_GET_ROUNDING_MODE()) { + case _MM_ROUND_NEAREST: { + uint32x4_t signmask = vdupq_n_u32(0x80000000); + float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a), + vdupq_n_f32(0.5f)); /* +/- 0.5 */ + int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32( + vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/ + int32x4_t r_trunc = vcvtq_s32_f32( + vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */ + int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32( + vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */ + int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), + vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ + float32x4_t delta = vsubq_f32( + vreinterpretq_f32_m128(a), + vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ + uint32x4_t is_delta_half = + vceqq_f32(delta, half); /* delta == +/- 0.5 */ + return vreinterpretq_m128i_s32( + vbslq_s32(is_delta_half, r_even, r_normal)); + } + case _MM_ROUND_DOWN: + return _mm_set_epi32(floorf(f[3]), floorf(f[2]), floorf(f[1]), + floorf(f[0])); + case _MM_ROUND_UP: + return _mm_set_epi32(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]), + ceilf(f[0])); + default: // _MM_ROUND_TOWARD_ZERO + return _mm_set_epi32((int32_t) f[3], (int32_t) f[2], (int32_t) f[1], + (int32_t) f[0]); + } +#endif +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed double-precision (64-bit) floating-point elements, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtps_pd +FORCE_INLINE __m128d _mm_cvtps_pd(__m128 a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vcvt_f64_f32(vget_low_f32(vreinterpretq_f32_m128(a)))); +#else + double a0 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); + double a1 = (double) vgetq_lane_f32(vreinterpretq_f32_m128(a), 1); + return _mm_set_pd(a1, a0); +#endif +} + +// Copy the lower double-precision (64-bit) floating-point element of a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_f64 +FORCE_INLINE double _mm_cvtsd_f64(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return (double) vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0); +#else + double _a = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + return _a; +#endif +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 32-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si32 +FORCE_INLINE int32_t _mm_cvtsd_si32(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return (int32_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0); +#else + __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + double ret = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 0)); + return (int32_t) ret; +#endif +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 64-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si64 +FORCE_INLINE int64_t _mm_cvtsd_si64(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return (int64_t) vgetq_lane_f64(vrndiq_f64(vreinterpretq_f64_m128d(a)), 0); +#else + __m128d rnd = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + double ret = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(rnd), 0)); + return (int64_t) ret; +#endif +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 64-bit integer, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_si64x +#define _mm_cvtsd_si64x _mm_cvtsd_si64 + +// Convert the lower double-precision (64-bit) floating-point element in b to a +// single-precision (32-bit) floating-point element, store the result in the +// lower element of dst, and copy the upper 3 packed elements from a to the +// upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsd_ss +FORCE_INLINE __m128 _mm_cvtsd_ss(__m128 a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32(vsetq_lane_f32( + vget_lane_f32(vcvt_f32_f64(vreinterpretq_f64_m128d(b)), 0), + vreinterpretq_f32_m128(a), 0)); +#else + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + return vreinterpretq_m128_f32( + vsetq_lane_f32((float) b0, vreinterpretq_f32_m128(a), 0)); +#endif +} + +// Copy the lower 32-bit integer in a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si32 +FORCE_INLINE int _mm_cvtsi128_si32(__m128i a) +{ + return vgetq_lane_s32(vreinterpretq_s32_m128i(a), 0); +} + +// Copy the lower 64-bit integer in a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64 +FORCE_INLINE int64_t _mm_cvtsi128_si64(__m128i a) +{ + return vgetq_lane_s64(vreinterpretq_s64_m128i(a), 0); +} + +// Copy the lower 64-bit integer in a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64x +#define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a) + +// Convert the signed 32-bit integer b to a double-precision (64-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_sd +FORCE_INLINE __m128d _mm_cvtsi32_sd(__m128d a, int32_t b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0)); +#else + int64_t _b = sse2neon_recast_f64_s64((double) b); + return vreinterpretq_m128d_s64( + vsetq_lane_s64(_b, vreinterpretq_s64_m128d(a), 0)); +#endif +} + +// Copy the lower 64-bit integer in a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi128_si64x +#define _mm_cvtsi128_si64x(a) _mm_cvtsi128_si64(a) + +// Copy 32-bit integer a to the lower elements of dst, and zero the upper +// elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi32_si128 +FORCE_INLINE __m128i _mm_cvtsi32_si128(int a) +{ + return vreinterpretq_m128i_s32(vsetq_lane_s32(a, vdupq_n_s32(0), 0)); +} + +// Convert the signed 64-bit integer b to a double-precision (64-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_sd +FORCE_INLINE __m128d _mm_cvtsi64_sd(__m128d a, int64_t b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vsetq_lane_f64((double) b, vreinterpretq_f64_m128d(a), 0)); +#else + int64_t _b = sse2neon_recast_f64_s64((double) b); + return vreinterpretq_m128d_s64( + vsetq_lane_s64(_b, vreinterpretq_s64_m128d(a), 0)); +#endif +} + +// Copy 64-bit integer a to the lower element of dst, and zero the upper +// element. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64_si128 +FORCE_INLINE __m128i _mm_cvtsi64_si128(int64_t a) +{ + return vreinterpretq_m128i_s64(vsetq_lane_s64(a, vdupq_n_s64(0), 0)); +} + +// Copy 64-bit integer a to the lower element of dst, and zero the upper +// element. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64x_si128 +#define _mm_cvtsi64x_si128(a) _mm_cvtsi64_si128(a) + +// Convert the signed 64-bit integer b to a double-precision (64-bit) +// floating-point element, store the result in the lower element of dst, and +// copy the upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtsi64x_sd +#define _mm_cvtsi64x_sd(a, b) _mm_cvtsi64_sd(a, b) + +// Convert the lower single-precision (32-bit) floating-point element in b to a +// double-precision (64-bit) floating-point element, store the result in the +// lower element of dst, and copy the upper element from a to the upper element +// of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtss_sd +FORCE_INLINE __m128d _mm_cvtss_sd(__m128d a, __m128 b) +{ + double d = (double) vgetq_lane_f32(vreinterpretq_f32_m128(b), 0); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vsetq_lane_f64(d, vreinterpretq_f64_m128d(a), 0)); +#else + return vreinterpretq_m128d_s64(vsetq_lane_s64( + sse2neon_recast_f64_s64(d), vreinterpretq_s64_m128d(a), 0)); +#endif +} + +// Convert packed double-precision (64-bit) floating-point elements in a to +// packed 32-bit integers with truncation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttpd_epi32 +FORCE_INLINE __m128i _mm_cvttpd_epi32(__m128d a) +{ + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + return _mm_set_epi32(0, 0, (int32_t) a1, (int32_t) a0); +} + +// Convert packed double-precision (64-bit) floating-point elements in a to +// packed 32-bit integers with truncation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttpd_pi32 +FORCE_INLINE __m64 _mm_cvttpd_pi32(__m128d a) +{ + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + int32_t ALIGN_STRUCT(16) data[2] = {(int32_t) a0, (int32_t) a1}; + return vreinterpret_m64_s32(vld1_s32(data)); +} + +// Convert packed single-precision (32-bit) floating-point elements in a to +// packed 32-bit integers with truncation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttps_epi32 +FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a) +{ + return vreinterpretq_m128i_s32(vcvtq_s32_f32(vreinterpretq_f32_m128(a))); +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 32-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si32 +FORCE_INLINE int32_t _mm_cvttsd_si32(__m128d a) +{ + double _a = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + return (int32_t) _a; +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 64-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si64 +FORCE_INLINE int64_t _mm_cvttsd_si64(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vgetq_lane_s64(vcvtq_s64_f64(vreinterpretq_f64_m128d(a)), 0); +#else + double _a = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + return (int64_t) _a; +#endif +} + +// Convert the lower double-precision (64-bit) floating-point element in a to a +// 64-bit integer with truncation, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvttsd_si64x +#define _mm_cvttsd_si64x(a) _mm_cvttsd_si64(a) + +// Divide packed double-precision (64-bit) floating-point elements in a by +// packed elements in b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_pd +FORCE_INLINE __m128d _mm_div_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[2]; + c[0] = a0 / b0; + c[1] = a1 / b1; + return vld1q_f32((float32_t *) c); +#endif +} + +// Divide the lower double-precision (64-bit) floating-point element in a by the +// lower double-precision (64-bit) floating-point element in b, store the result +// in the lower element of dst, and copy the upper element from a to the upper +// element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_div_sd +FORCE_INLINE __m128d _mm_div_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float64x2_t tmp = + vdivq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b)); + return vreinterpretq_m128d_f64( + vsetq_lane_f64(vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1), tmp, 1)); +#else + return _mm_move_sd(a, _mm_div_pd(a, b)); +#endif +} + +// Extract a 16-bit integer from a, selected with imm8, and store the result in +// the lower element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi16 +// FORCE_INLINE int _mm_extract_epi16(__m128i a, __constrange(0,8) int imm) +#define _mm_extract_epi16(a, imm) \ + vgetq_lane_u16(vreinterpretq_u16_m128i(a), (imm)) + +// Copy a to dst, and insert the 16-bit integer i into dst at the location +// specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi16 +// FORCE_INLINE __m128i _mm_insert_epi16(__m128i a, int b, +// __constrange(0,8) int imm) +#define _mm_insert_epi16(a, b, imm) \ + vreinterpretq_m128i_s16( \ + vsetq_lane_s16((b), vreinterpretq_s16_m128i(a), (imm))) + +// Load 128-bits (composed of 2 packed double-precision (64-bit) floating-point +// elements) from memory into dst. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_pd +FORCE_INLINE __m128d _mm_load_pd(const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vld1q_f64(p)); +#else + const float *fp = (const float *) p; + float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], fp[2], fp[3]}; + return vreinterpretq_m128d_f32(vld1q_f32(data)); +#endif +} + +// Load a double-precision (64-bit) floating-point element from memory into both +// elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_pd1 +#define _mm_load_pd1 _mm_load1_pd + +// Load a double-precision (64-bit) floating-point element from memory into the +// lower of dst, and zero the upper element. mem_addr does not need to be +// aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_sd +FORCE_INLINE __m128d _mm_load_sd(const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vsetq_lane_f64(*p, vdupq_n_f64(0), 0)); +#else + const float *fp = (const float *) p; + float ALIGN_STRUCT(16) data[4] = {fp[0], fp[1], 0, 0}; + return vreinterpretq_m128d_f32(vld1q_f32(data)); +#endif +} + +// Load 128-bits of integer data from memory into dst. mem_addr must be aligned +// on a 16-byte boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load_si128 +FORCE_INLINE __m128i _mm_load_si128(const __m128i *p) +{ + return vreinterpretq_m128i_s32(vld1q_s32((const int32_t *) p)); +} + +// Load a double-precision (64-bit) floating-point element from memory into both +// elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_load1_pd +FORCE_INLINE __m128d _mm_load1_pd(const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vld1q_dup_f64(p)); +#else + return vreinterpretq_m128d_s64(vdupq_n_s64(*(const int64_t *) p)); +#endif +} + +// Load a double-precision (64-bit) floating-point element from memory into the +// upper element of dst, and copy the lower element from a to dst. mem_addr does +// not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadh_pd +FORCE_INLINE __m128d _mm_loadh_pd(__m128d a, const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vcombine_f64(vget_low_f64(vreinterpretq_f64_m128d(a)), vld1_f64(p))); +#else + return vreinterpretq_m128d_f32(vcombine_f32( + vget_low_f32(vreinterpretq_f32_m128d(a)), vld1_f32((const float *) p))); +#endif +} + +// Load 64-bit integer from memory into the first element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_epi64 +FORCE_INLINE __m128i _mm_loadl_epi64(__m128i const *p) +{ + /* Load the lower 64 bits of the value pointed to by p into the + * lower 64 bits of the result, zeroing the upper 64 bits of the result. + */ + return vreinterpretq_m128i_s32( + vcombine_s32(vld1_s32((int32_t const *) p), vcreate_s32(0))); +} + +// Load a double-precision (64-bit) floating-point element from memory into the +// lower element of dst, and copy the upper element from a to dst. mem_addr does +// not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadl_pd +FORCE_INLINE __m128d _mm_loadl_pd(__m128d a, const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vcombine_f64(vld1_f64(p), vget_high_f64(vreinterpretq_f64_m128d(a)))); +#else + return vreinterpretq_m128d_f32( + vcombine_f32(vld1_f32((const float *) p), + vget_high_f32(vreinterpretq_f32_m128d(a)))); +#endif +} + +// Load 2 double-precision (64-bit) floating-point elements from memory into dst +// in reverse order. mem_addr must be aligned on a 16-byte boundary or a +// general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadr_pd +FORCE_INLINE __m128d _mm_loadr_pd(const double *p) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float64x2_t v = vld1q_f64(p); + return vreinterpretq_m128d_f64(vextq_f64(v, v, 1)); +#else + int64x2_t v = vld1q_s64((const int64_t *) p); + return vreinterpretq_m128d_s64(vextq_s64(v, v, 1)); +#endif +} + +// Loads two double-precision from unaligned memory, floating-point values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_pd +FORCE_INLINE __m128d _mm_loadu_pd(const double *p) +{ + return _mm_load_pd(p); +} + +// Load 128-bits of integer data from memory into dst. mem_addr does not need to +// be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si128 +FORCE_INLINE __m128i _mm_loadu_si128(const __m128i *p) +{ + return vreinterpretq_m128i_s32(vld1q_s32((const unaligned_int32_t *) p)); +} + +// Load unaligned 32-bit integer from memory into the first element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si32 +FORCE_INLINE __m128i _mm_loadu_si32(const void *p) +{ + return vreinterpretq_m128i_s32( + vsetq_lane_s32(*(const unaligned_int32_t *) p, vdupq_n_s32(0), 0)); +} + +// Multiply packed signed 16-bit integers in a and b, producing intermediate +// signed 32-bit integers. Horizontally add adjacent pairs of intermediate +// 32-bit integers, and pack the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_madd_epi16 +FORCE_INLINE __m128i _mm_madd_epi16(__m128i a, __m128i b) +{ + int32x4_t low = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), + vget_low_s16(vreinterpretq_s16_m128i(b))); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int32x4_t high = + vmull_high_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b)); + + return vreinterpretq_m128i_s32(vpaddq_s32(low, high)); +#else + int32x4_t high = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), + vget_high_s16(vreinterpretq_s16_m128i(b))); + + int32x2_t low_sum = vpadd_s32(vget_low_s32(low), vget_high_s32(low)); + int32x2_t high_sum = vpadd_s32(vget_low_s32(high), vget_high_s32(high)); + + return vreinterpretq_m128i_s32(vcombine_s32(low_sum, high_sum)); +#endif +} + +// Conditionally store 8-bit integer elements from a into memory using mask +// (elements are not stored when the highest bit is not set in the corresponding +// element) and a non-temporal memory hint. mem_addr does not need to be aligned +// on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maskmoveu_si128 +FORCE_INLINE void _mm_maskmoveu_si128(__m128i a, __m128i mask, char *mem_addr) +{ + int8x16_t shr_mask = vshrq_n_s8(vreinterpretq_s8_m128i(mask), 7); + __m128 b = _mm_load_ps((const float *) mem_addr); + int8x16_t masked = + vbslq_s8(vreinterpretq_u8_s8(shr_mask), vreinterpretq_s8_m128i(a), + vreinterpretq_s8_m128(b)); + vst1q_s8((int8_t *) mem_addr, masked); +} + +// Compare packed signed 16-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi16 +FORCE_INLINE __m128i _mm_max_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vmaxq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compare packed unsigned 8-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu8 +FORCE_INLINE __m128i _mm_max_epu8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vmaxq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b, +// and store packed maximum values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_pd +FORCE_INLINE __m128d _mm_max_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#if SSE2NEON_PRECISE_MINMAX + float64x2_t _a = vreinterpretq_f64_m128d(a); + float64x2_t _b = vreinterpretq_f64_m128d(b); + return vreinterpretq_m128d_f64(vbslq_f64(vcgtq_f64(_a, _b), _a, _b)); +#else + return vreinterpretq_m128d_f64( + vmaxq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#endif +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + int64_t d[2]; + d[0] = a0 > b0 ? sse2neon_recast_f64_s64(a0) : sse2neon_recast_f64_s64(b0); + d[1] = a1 > b1 ? sse2neon_recast_f64_s64(a1) : sse2neon_recast_f64_s64(b1); + + return vreinterpretq_m128d_s64(vld1q_s64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b, store the maximum value in the lower element of dst, and copy the upper +// element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_sd +FORCE_INLINE __m128d _mm_max_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_max_pd(a, b)); +#else + double a0, a1, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double c[2] = {a0 > b0 ? a0 : b0, a1}; + return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c)); +#endif +} + +// Compare packed signed 16-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi16 +FORCE_INLINE __m128i _mm_min_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vminq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compare packed unsigned 8-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epu8 +FORCE_INLINE __m128i _mm_min_epu8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vminq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); +} + +// Compare packed double-precision (64-bit) floating-point elements in a and b, +// and store packed minimum values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_pd +FORCE_INLINE __m128d _mm_min_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#if SSE2NEON_PRECISE_MINMAX + float64x2_t _a = vreinterpretq_f64_m128d(a); + float64x2_t _b = vreinterpretq_f64_m128d(b); + return vreinterpretq_m128d_f64(vbslq_f64(vcltq_f64(_a, _b), _a, _b)); +#else + return vreinterpretq_m128d_f64( + vminq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#endif +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + int64_t d[2]; + d[0] = a0 < b0 ? sse2neon_recast_f64_s64(a0) : sse2neon_recast_f64_s64(b0); + d[1] = a1 < b1 ? sse2neon_recast_f64_s64(a1) : sse2neon_recast_f64_s64(b1); + return vreinterpretq_m128d_s64(vld1q_s64(d)); +#endif +} + +// Compare the lower double-precision (64-bit) floating-point elements in a and +// b, store the minimum value in the lower element of dst, and copy the upper +// element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_sd +FORCE_INLINE __m128d _mm_min_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_min_pd(a, b)); +#else + double a0, a1, b0; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + b0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double c[2] = {a0 < b0 ? a0 : b0, a1}; + return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) c)); +#endif +} + +// Copy the lower 64-bit integer in a to the lower element of dst, and zero the +// upper element. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_epi64 +FORCE_INLINE __m128i _mm_move_epi64(__m128i a) +{ + return vreinterpretq_m128i_s64( + vsetq_lane_s64(0, vreinterpretq_s64_m128i(a), 1)); +} + +// Move the lower double-precision (64-bit) floating-point element from b to the +// lower element of dst, and copy the upper element from a to the upper element +// of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_move_sd +FORCE_INLINE __m128d _mm_move_sd(__m128d a, __m128d b) +{ + return vreinterpretq_m128d_f32( + vcombine_f32(vget_low_f32(vreinterpretq_f32_m128d(b)), + vget_high_f32(vreinterpretq_f32_m128d(a)))); +} + +// Create mask from the most significant bit of each 8-bit element in a, and +// store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_epi8 +FORCE_INLINE int _mm_movemask_epi8(__m128i a) +{ + // Use increasingly wide shifts+adds to collect the sign bits + // together. + // Since the widening shifts would be rather confusing to follow in little + // endian, everything will be illustrated in big endian order instead. This + // has a different result - the bits would actually be reversed on a big + // endian machine. + + // Starting input (only half the elements are shown): + // 89 ff 1d c0 00 10 99 33 + uint8x16_t input = vreinterpretq_u8_m128i(a); + + // Shift out everything but the sign bits with an unsigned shift right. + // + // Bytes of the vector:: + // 89 ff 1d c0 00 10 99 33 + // \ \ \ \ \ \ \ \ high_bits = (uint16x4_t)(input >> 7) + // | | | | | | | | + // 01 01 00 01 00 00 01 00 + // + // Bits of first important lane(s): + // 10001001 (89) + // \______ + // | + // 00000001 (01) + uint16x8_t high_bits = vreinterpretq_u16_u8(vshrq_n_u8(input, 7)); + + // Merge the even lanes together with a 16-bit unsigned shift right + add. + // 'xx' represents garbage data which will be ignored in the final result. + // In the important bytes, the add functions like a binary OR. + // + // 01 01 00 01 00 00 01 00 + // \_ | \_ | \_ | \_ | paired16 = (uint32x4_t)(input + (input >> 7)) + // \| \| \| \| + // xx 03 xx 01 xx 00 xx 02 + // + // 00000001 00000001 (01 01) + // \_______ | + // \| + // xxxxxxxx xxxxxx11 (xx 03) + uint32x4_t paired16 = + vreinterpretq_u32_u16(vsraq_n_u16(high_bits, high_bits, 7)); + + // Repeat with a wider 32-bit shift + add. + // xx 03 xx 01 xx 00 xx 02 + // \____ | \____ | paired32 = (uint64x1_t)(paired16 + (paired16 >> + // 14)) + // \| \| + // xx xx xx 0d xx xx xx 02 + // + // 00000011 00000001 (03 01) + // \\_____ || + // '----.\|| + // xxxxxxxx xxxx1101 (xx 0d) + uint64x2_t paired32 = + vreinterpretq_u64_u32(vsraq_n_u32(paired16, paired16, 14)); + + // Last, an even wider 64-bit shift + add to get our result in the low 8 bit + // lanes. xx xx xx 0d xx xx xx 02 + // \_________ | paired64 = (uint8x8_t)(paired32 + (paired32 >> + // 28)) + // \| + // xx xx xx xx xx xx xx d2 + // + // 00001101 00000010 (0d 02) + // \ \___ | | + // '---. \| | + // xxxxxxxx 11010010 (xx d2) + uint8x16_t paired64 = + vreinterpretq_u8_u64(vsraq_n_u64(paired32, paired32, 28)); + + // Extract the low 8 bits from each 64-bit lane with 2 8-bit extracts. + // xx xx xx xx xx xx xx d2 + // || return paired64[0] + // d2 + // Note: Little endian would return the correct value 4b (01001011) instead. + return vgetq_lane_u8(paired64, 0) | ((int) vgetq_lane_u8(paired64, 8) << 8); +} + +// Set each bit of mask dst based on the most significant bit of the +// corresponding packed double-precision (64-bit) floating-point element in a. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movemask_pd +FORCE_INLINE int _mm_movemask_pd(__m128d a) +{ + uint64x2_t input = vreinterpretq_u64_m128d(a); + uint64x2_t high_bits = vshrq_n_u64(input, 63); + return (int) (vgetq_lane_u64(high_bits, 0) | + (vgetq_lane_u64(high_bits, 1) << 1)); +} + +// Copy the lower 64-bit integer in a to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movepi64_pi64 +FORCE_INLINE __m64 _mm_movepi64_pi64(__m128i a) +{ + return vreinterpret_m64_s64(vget_low_s64(vreinterpretq_s64_m128i(a))); +} + +// Copy the 64-bit integer a to the lower element of dst, and zero the upper +// element. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movpi64_epi64 +FORCE_INLINE __m128i _mm_movpi64_epi64(__m64 a) +{ + return vreinterpretq_m128i_s64( + vcombine_s64(vreinterpret_s64_m64(a), vdup_n_s64(0))); +} + +// Multiply the low unsigned 32-bit integers from each packed 64-bit element in +// a and b, and store the unsigned 64-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_epu32 +FORCE_INLINE __m128i _mm_mul_epu32(__m128i a, __m128i b) +{ + // vmull_u32 upcasts instead of masking, so we downcast. + uint32x2_t a_lo = vmovn_u64(vreinterpretq_u64_m128i(a)); + uint32x2_t b_lo = vmovn_u64(vreinterpretq_u64_m128i(b)); + return vreinterpretq_m128i_u64(vmull_u32(a_lo, b_lo)); +} + +// Multiply packed double-precision (64-bit) floating-point elements in a and b, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_pd +FORCE_INLINE __m128d _mm_mul_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vmulq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[2]; + c[0] = a0 * b0; + c[1] = a1 * b1; + return vld1q_f32((float32_t *) c); +#endif +} + +// Multiply the lower double-precision (64-bit) floating-point element in a and +// b, store the result in the lower element of dst, and copy the upper element +// from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_mul_sd +FORCE_INLINE __m128d _mm_mul_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_mul_pd(a, b)); +} + +// Multiply the low unsigned 32-bit integers from a and b, and store the +// unsigned 64-bit result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_su32 +FORCE_INLINE __m64 _mm_mul_su32(__m64 a, __m64 b) +{ + return vreinterpret_m64_u64(vget_low_u64( + vmull_u32(vreinterpret_u32_m64(a), vreinterpret_u32_m64(b)))); +} + +// Multiply the packed signed 16-bit integers in a and b, producing intermediate +// 32-bit integers, and store the high 16 bits of the intermediate integers in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_epi16 +FORCE_INLINE __m128i _mm_mulhi_epi16(__m128i a, __m128i b) +{ + /* FIXME: issue with large values because of result saturation */ + // int16x8_t ret = vqdmulhq_s16(vreinterpretq_s16_m128i(a), + // vreinterpretq_s16_m128i(b)); /* =2*a*b */ return + // vreinterpretq_m128i_s16(vshrq_n_s16(ret, 1)); + int16x4_t a3210 = vget_low_s16(vreinterpretq_s16_m128i(a)); + int16x4_t b3210 = vget_low_s16(vreinterpretq_s16_m128i(b)); + int32x4_t ab3210 = vmull_s16(a3210, b3210); /* 3333222211110000 */ + int16x4_t a7654 = vget_high_s16(vreinterpretq_s16_m128i(a)); + int16x4_t b7654 = vget_high_s16(vreinterpretq_s16_m128i(b)); + int32x4_t ab7654 = vmull_s16(a7654, b7654); /* 7777666655554444 */ + uint16x8x2_t r = + vuzpq_u16(vreinterpretq_u16_s32(ab3210), vreinterpretq_u16_s32(ab7654)); + return vreinterpretq_m128i_u16(r.val[1]); +} + +// Multiply the packed unsigned 16-bit integers in a and b, producing +// intermediate 32-bit integers, and store the high 16 bits of the intermediate +// integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhi_epu16 +FORCE_INLINE __m128i _mm_mulhi_epu16(__m128i a, __m128i b) +{ + uint16x4_t a3210 = vget_low_u16(vreinterpretq_u16_m128i(a)); + uint16x4_t b3210 = vget_low_u16(vreinterpretq_u16_m128i(b)); + uint32x4_t ab3210 = vmull_u16(a3210, b3210); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint32x4_t ab7654 = + vmull_high_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)); + uint16x8_t r = vuzp2q_u16(vreinterpretq_u16_u32(ab3210), + vreinterpretq_u16_u32(ab7654)); + return vreinterpretq_m128i_u16(r); +#else + uint16x4_t a7654 = vget_high_u16(vreinterpretq_u16_m128i(a)); + uint16x4_t b7654 = vget_high_u16(vreinterpretq_u16_m128i(b)); + uint32x4_t ab7654 = vmull_u16(a7654, b7654); + uint16x8x2_t r = + vuzpq_u16(vreinterpretq_u16_u32(ab3210), vreinterpretq_u16_u32(ab7654)); + return vreinterpretq_m128i_u16(r.val[1]); +#endif +} + +// Multiply the packed 16-bit integers in a and b, producing intermediate 32-bit +// integers, and store the low 16 bits of the intermediate integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mullo_epi16 +FORCE_INLINE __m128i _mm_mullo_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vmulq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Compute the bitwise OR of packed double-precision (64-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_or_pd +FORCE_INLINE __m128d _mm_or_pd(__m128d a, __m128d b) +{ + return vreinterpretq_m128d_s64( + vorrq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); +} + +// Compute the bitwise OR of 128 bits (representing integer data) in a and b, +// and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_or_si128 +FORCE_INLINE __m128i _mm_or_si128(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vorrq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Convert packed signed 16-bit integers from a and b to packed 8-bit integers +// using signed saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packs_epi16 +FORCE_INLINE __m128i _mm_packs_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vcombine_s8(vqmovn_s16(vreinterpretq_s16_m128i(a)), + vqmovn_s16(vreinterpretq_s16_m128i(b)))); +} + +// Convert packed signed 32-bit integers from a and b to packed 16-bit integers +// using signed saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packs_epi32 +FORCE_INLINE __m128i _mm_packs_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vcombine_s16(vqmovn_s32(vreinterpretq_s32_m128i(a)), + vqmovn_s32(vreinterpretq_s32_m128i(b)))); +} + +// Convert packed signed 16-bit integers from a and b to packed 8-bit integers +// using unsigned saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packus_epi16 +FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b) +{ + return vreinterpretq_m128i_u8( + vcombine_u8(vqmovun_s16(vreinterpretq_s16_m128i(a)), + vqmovun_s16(vreinterpretq_s16_m128i(b)))); +} + +// Pause the processor. This is typically used in spin-wait loops and depending +// on the x86 processor typical values are in the 40-100 cycle range. The +// 'yield' instruction isn't a good fit because it's effectively a nop on most +// Arm cores. Experience with several databases has shown has shown an 'isb' is +// a reasonable approximation. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_pause +FORCE_INLINE void _mm_pause(void) +{ +#if defined(_MSC_VER) && !defined(__clang__) + __isb(_ARM64_BARRIER_SY); +#else + __asm__ __volatile__("isb\n"); +#endif +} + +// Compute the absolute differences of packed unsigned 8-bit integers in a and +// b, then horizontally sum each consecutive 8 differences to produce two +// unsigned 16-bit integers, and pack these unsigned 16-bit integers in the low +// 16 bits of 64-bit elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sad_epu8 +FORCE_INLINE __m128i _mm_sad_epu8(__m128i a, __m128i b) +{ + uint16x8_t t = vpaddlq_u8(vabdq_u8((uint8x16_t) a, (uint8x16_t) b)); + return vreinterpretq_m128i_u64(vpaddlq_u32(vpaddlq_u16(t))); +} + +// Set packed 16-bit integers in dst with the supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi16 +FORCE_INLINE __m128i _mm_set_epi16(short i7, + short i6, + short i5, + short i4, + short i3, + short i2, + short i1, + short i0) +{ + int16_t ALIGN_STRUCT(16) data[8] = {i0, i1, i2, i3, i4, i5, i6, i7}; + return vreinterpretq_m128i_s16(vld1q_s16(data)); +} + +// Set packed 32-bit integers in dst with the supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi32 +FORCE_INLINE __m128i _mm_set_epi32(int i3, int i2, int i1, int i0) +{ + int32_t ALIGN_STRUCT(16) data[4] = {i0, i1, i2, i3}; + return vreinterpretq_m128i_s32(vld1q_s32(data)); +} + +// Set packed 64-bit integers in dst with the supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi64 +FORCE_INLINE __m128i _mm_set_epi64(__m64 i1, __m64 i2) +{ + return _mm_set_epi64x(vget_lane_s64(i1, 0), vget_lane_s64(i2, 0)); +} + +// Set packed 64-bit integers in dst with the supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi64x +FORCE_INLINE __m128i _mm_set_epi64x(int64_t i1, int64_t i2) +{ + return vreinterpretq_m128i_s64( + vcombine_s64(vcreate_s64(i2), vcreate_s64(i1))); +} + +// Set packed 8-bit integers in dst with the supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_epi8 +FORCE_INLINE __m128i _mm_set_epi8(signed char b15, + signed char b14, + signed char b13, + signed char b12, + signed char b11, + signed char b10, + signed char b9, + signed char b8, + signed char b7, + signed char b6, + signed char b5, + signed char b4, + signed char b3, + signed char b2, + signed char b1, + signed char b0) +{ + int8_t ALIGN_STRUCT(16) data[16] = { + (int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, + (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, + (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, + (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; + return (__m128i) vld1q_s8(data); +} + +// Set packed double-precision (64-bit) floating-point elements in dst with the +// supplied values. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_pd +FORCE_INLINE __m128d _mm_set_pd(double e1, double e0) +{ + double ALIGN_STRUCT(16) data[2] = {e0, e1}; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vld1q_f64((float64_t *) data)); +#else + return vreinterpretq_m128d_f32(vld1q_f32((float32_t *) data)); +#endif +} + +// Broadcast double-precision (64-bit) floating-point value a to all elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_pd1 +#define _mm_set_pd1 _mm_set1_pd + +// Copy double-precision (64-bit) floating-point element a to the lower element +// of dst, and zero the upper element. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set_sd +FORCE_INLINE __m128d _mm_set_sd(double a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vsetq_lane_f64(a, vdupq_n_f64(0), 0)); +#else + return _mm_set_pd(0, a); +#endif +} + +// Broadcast 16-bit integer a to all elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi16 +FORCE_INLINE __m128i _mm_set1_epi16(short w) +{ + return vreinterpretq_m128i_s16(vdupq_n_s16(w)); +} + +// Broadcast 32-bit integer a to all elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi32 +FORCE_INLINE __m128i _mm_set1_epi32(int _i) +{ + return vreinterpretq_m128i_s32(vdupq_n_s32(_i)); +} + +// Broadcast 64-bit integer a to all elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi64 +FORCE_INLINE __m128i _mm_set1_epi64(__m64 _i) +{ + return vreinterpretq_m128i_s64(vdupq_lane_s64(_i, 0)); +} + +// Broadcast 64-bit integer a to all elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi64x +FORCE_INLINE __m128i _mm_set1_epi64x(int64_t _i) +{ + return vreinterpretq_m128i_s64(vdupq_n_s64(_i)); +} + +// Broadcast 8-bit integer a to all elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_epi8 +FORCE_INLINE __m128i _mm_set1_epi8(signed char w) +{ + return vreinterpretq_m128i_s8(vdupq_n_s8(w)); +} + +// Broadcast double-precision (64-bit) floating-point value a to all elements of +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_set1_pd +FORCE_INLINE __m128d _mm_set1_pd(double d) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vdupq_n_f64(d)); +#else + int64_t _d = sse2neon_recast_f64_s64(d); + return vreinterpretq_m128d_s64(vdupq_n_s64(_d)); +#endif +} + +// Set packed 16-bit integers in dst with the supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi16 +FORCE_INLINE __m128i _mm_setr_epi16(short w0, + short w1, + short w2, + short w3, + short w4, + short w5, + short w6, + short w7) +{ + int16_t ALIGN_STRUCT(16) data[8] = {w0, w1, w2, w3, w4, w5, w6, w7}; + return vreinterpretq_m128i_s16(vld1q_s16((int16_t *) data)); +} + +// Set packed 32-bit integers in dst with the supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi32 +FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0) +{ + int32_t ALIGN_STRUCT(16) data[4] = {i3, i2, i1, i0}; + return vreinterpretq_m128i_s32(vld1q_s32(data)); +} + +// Set packed 64-bit integers in dst with the supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi64 +FORCE_INLINE __m128i _mm_setr_epi64(__m64 e1, __m64 e0) +{ + return vreinterpretq_m128i_s64(vcombine_s64(e1, e0)); +} + +// Set packed 8-bit integers in dst with the supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_epi8 +FORCE_INLINE __m128i _mm_setr_epi8(signed char b0, + signed char b1, + signed char b2, + signed char b3, + signed char b4, + signed char b5, + signed char b6, + signed char b7, + signed char b8, + signed char b9, + signed char b10, + signed char b11, + signed char b12, + signed char b13, + signed char b14, + signed char b15) +{ + int8_t ALIGN_STRUCT(16) data[16] = { + (int8_t) b0, (int8_t) b1, (int8_t) b2, (int8_t) b3, + (int8_t) b4, (int8_t) b5, (int8_t) b6, (int8_t) b7, + (int8_t) b8, (int8_t) b9, (int8_t) b10, (int8_t) b11, + (int8_t) b12, (int8_t) b13, (int8_t) b14, (int8_t) b15}; + return (__m128i) vld1q_s8(data); +} + +// Set packed double-precision (64-bit) floating-point elements in dst with the +// supplied values in reverse order. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setr_pd +FORCE_INLINE __m128d _mm_setr_pd(double e1, double e0) +{ + return _mm_set_pd(e0, e1); +} + +// Return vector of type __m128d with all elements set to zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_pd +FORCE_INLINE __m128d _mm_setzero_pd(void) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vdupq_n_f64(0)); +#else + return vreinterpretq_m128d_f32(vdupq_n_f32(0)); +#endif +} + +// Return vector of type __m128i with all elements set to zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_setzero_si128 +FORCE_INLINE __m128i _mm_setzero_si128(void) +{ + return vreinterpretq_m128i_s32(vdupq_n_s32(0)); +} + +// Shuffle 32-bit integers in a using the control in imm8, and store the results +// in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_epi32 +// FORCE_INLINE __m128i _mm_shuffle_epi32(__m128i a, +// __constrange(0,255) int imm) +#if defined(_sse2neon_shuffle) +#define _mm_shuffle_epi32(a, imm) \ + __extension__({ \ + int32x4_t _input = vreinterpretq_s32_m128i(a); \ + int32x4_t _shuf = \ + vshuffleq_s32(_input, _input, (imm) & (0x3), ((imm) >> 2) & 0x3, \ + ((imm) >> 4) & 0x3, ((imm) >> 6) & 0x3); \ + vreinterpretq_m128i_s32(_shuf); \ + }) +#else // generic +#define _mm_shuffle_epi32(a, imm) \ + _sse2neon_define1( \ + __m128i, a, __m128i ret; switch (imm) { \ + case _MM_SHUFFLE(1, 0, 3, 2): \ + ret = _mm_shuffle_epi_1032(_a); \ + break; \ + case _MM_SHUFFLE(2, 3, 0, 1): \ + ret = _mm_shuffle_epi_2301(_a); \ + break; \ + case _MM_SHUFFLE(0, 3, 2, 1): \ + ret = _mm_shuffle_epi_0321(_a); \ + break; \ + case _MM_SHUFFLE(2, 1, 0, 3): \ + ret = _mm_shuffle_epi_2103(_a); \ + break; \ + case _MM_SHUFFLE(1, 0, 1, 0): \ + ret = _mm_shuffle_epi_1010(_a); \ + break; \ + case _MM_SHUFFLE(1, 0, 0, 1): \ + ret = _mm_shuffle_epi_1001(_a); \ + break; \ + case _MM_SHUFFLE(0, 1, 0, 1): \ + ret = _mm_shuffle_epi_0101(_a); \ + break; \ + case _MM_SHUFFLE(2, 2, 1, 1): \ + ret = _mm_shuffle_epi_2211(_a); \ + break; \ + case _MM_SHUFFLE(0, 1, 2, 2): \ + ret = _mm_shuffle_epi_0122(_a); \ + break; \ + case _MM_SHUFFLE(3, 3, 3, 2): \ + ret = _mm_shuffle_epi_3332(_a); \ + break; \ + case _MM_SHUFFLE(0, 0, 0, 0): \ + ret = _mm_shuffle_epi32_splat(_a, 0); \ + break; \ + case _MM_SHUFFLE(1, 1, 1, 1): \ + ret = _mm_shuffle_epi32_splat(_a, 1); \ + break; \ + case _MM_SHUFFLE(2, 2, 2, 2): \ + ret = _mm_shuffle_epi32_splat(_a, 2); \ + break; \ + case _MM_SHUFFLE(3, 3, 3, 3): \ + ret = _mm_shuffle_epi32_splat(_a, 3); \ + break; \ + default: \ + ret = _mm_shuffle_epi32_default(_a, (imm)); \ + break; \ + } _sse2neon_return(ret);) +#endif + +// Shuffle double-precision (64-bit) floating-point elements using the control +// in imm8, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pd +#ifdef _sse2neon_shuffle +#define _mm_shuffle_pd(a, b, imm8) \ + vreinterpretq_m128d_s64( \ + vshuffleq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b), \ + (imm8) & 0x1, (((imm8) & 0x2) >> 1) + 2)) +#else +#define _mm_shuffle_pd(a, b, imm8) \ + _mm_castsi128_pd(_mm_set_epi64x( \ + vgetq_lane_s64(vreinterpretq_s64_m128d(b), ((imm8) & 0x2) >> 1), \ + vgetq_lane_s64(vreinterpretq_s64_m128d(a), (imm8) & 0x1))) +#endif + +// FORCE_INLINE __m128i _mm_shufflehi_epi16(__m128i a, +// __constrange(0,255) int imm) +#if defined(_sse2neon_shuffle) +#define _mm_shufflehi_epi16(a, imm) \ + __extension__({ \ + int16x8_t _input = vreinterpretq_s16_m128i(a); \ + int16x8_t _shuf = \ + vshuffleq_s16(_input, _input, 0, 1, 2, 3, ((imm) & (0x3)) + 4, \ + (((imm) >> 2) & 0x3) + 4, (((imm) >> 4) & 0x3) + 4, \ + (((imm) >> 6) & 0x3) + 4); \ + vreinterpretq_m128i_s16(_shuf); \ + }) +#else // generic +#define _mm_shufflehi_epi16(a, imm) _mm_shufflehi_epi16_function((a), (imm)) +#endif + +// FORCE_INLINE __m128i _mm_shufflelo_epi16(__m128i a, +// __constrange(0,255) int imm) +#if defined(_sse2neon_shuffle) +#define _mm_shufflelo_epi16(a, imm) \ + __extension__({ \ + int16x8_t _input = vreinterpretq_s16_m128i(a); \ + int16x8_t _shuf = vshuffleq_s16( \ + _input, _input, ((imm) & (0x3)), (((imm) >> 2) & 0x3), \ + (((imm) >> 4) & 0x3), (((imm) >> 6) & 0x3), 4, 5, 6, 7); \ + vreinterpretq_m128i_s16(_shuf); \ + }) +#else // generic +#define _mm_shufflelo_epi16(a, imm) _mm_shufflelo_epi16_function((a), (imm)) +#endif + +// Shift packed 16-bit integers in a left by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi16 +FORCE_INLINE __m128i _mm_sll_epi16(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~15)) + return _mm_setzero_si128(); + + int16x8_t vc = vdupq_n_s16((int16_t) c); + return vreinterpretq_m128i_s16(vshlq_s16(vreinterpretq_s16_m128i(a), vc)); +} + +// Shift packed 32-bit integers in a left by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi32 +FORCE_INLINE __m128i _mm_sll_epi32(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~31)) + return _mm_setzero_si128(); + + int32x4_t vc = vdupq_n_s32((int32_t) c); + return vreinterpretq_m128i_s32(vshlq_s32(vreinterpretq_s32_m128i(a), vc)); +} + +// Shift packed 64-bit integers in a left by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sll_epi64 +FORCE_INLINE __m128i _mm_sll_epi64(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~63)) + return _mm_setzero_si128(); + + int64x2_t vc = vdupq_n_s64((int64_t) c); + return vreinterpretq_m128i_s64(vshlq_s64(vreinterpretq_s64_m128i(a), vc)); +} + +// Shift packed 16-bit integers in a left by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi16 +FORCE_INLINE __m128i _mm_slli_epi16(__m128i a, int imm) +{ + if (_sse2neon_unlikely(imm & ~15)) + return _mm_setzero_si128(); + return vreinterpretq_m128i_s16( + vshlq_s16(vreinterpretq_s16_m128i(a), vdupq_n_s16((int16_t) imm))); +} + +// Shift packed 32-bit integers in a left by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi32 +FORCE_INLINE __m128i _mm_slli_epi32(__m128i a, int imm) +{ + if (_sse2neon_unlikely(imm & ~31)) + return _mm_setzero_si128(); + return vreinterpretq_m128i_s32( + vshlq_s32(vreinterpretq_s32_m128i(a), vdupq_n_s32(imm))); +} + +// Shift packed 64-bit integers in a left by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_epi64 +FORCE_INLINE __m128i _mm_slli_epi64(__m128i a, int imm) +{ + if (_sse2neon_unlikely(imm & ~63)) + return _mm_setzero_si128(); + return vreinterpretq_m128i_s64( + vshlq_s64(vreinterpretq_s64_m128i(a), vdupq_n_s64(imm))); +} + +// Shift a left by imm8 bytes while shifting in zeros, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_slli_si128 +#define _mm_slli_si128(a, imm) \ + _sse2neon_define1( \ + __m128i, a, int8x16_t ret; \ + if (_sse2neon_unlikely((imm) == 0)) ret = vreinterpretq_s8_m128i(_a); \ + else if (_sse2neon_unlikely((imm) & ~15)) ret = vdupq_n_s8(0); \ + else ret = vextq_s8(vdupq_n_s8(0), vreinterpretq_s8_m128i(_a), \ + (((imm) <= 0 || (imm) > 15) ? 0 : (16 - (imm)))); \ + _sse2neon_return(vreinterpretq_m128i_s8(ret));) + +// Compute the square root of packed double-precision (64-bit) floating-point +// elements in a, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_pd +FORCE_INLINE __m128d _mm_sqrt_pd(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vsqrtq_f64(vreinterpretq_f64_m128d(a))); +#else + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double _a0 = sqrt(a0); + double _a1 = sqrt(a1); + return _mm_set_pd(_a1, _a0); +#endif +} + +// Compute the square root of the lower double-precision (64-bit) floating-point +// element in b, store the result in the lower element of dst, and copy the +// upper element from a to the upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sqrt_sd +FORCE_INLINE __m128d _mm_sqrt_sd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return _mm_move_sd(a, _mm_sqrt_pd(b)); +#else + double _a, _b; + _a = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + _b = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + return _mm_set_pd(_a, sqrt(_b)); +#endif +} + +// Shift packed 16-bit integers in a right by count while shifting in sign bits, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sra_epi16 +FORCE_INLINE __m128i _mm_sra_epi16(__m128i a, __m128i count) +{ + int64_t c = vgetq_lane_s64(count, 0); + if (_sse2neon_unlikely(c & ~15)) + return _mm_cmplt_epi16(a, _mm_setzero_si128()); + return vreinterpretq_m128i_s16( + vshlq_s16((int16x8_t) a, vdupq_n_s16((int16_t) -c))); +} + +// Shift packed 32-bit integers in a right by count while shifting in sign bits, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sra_epi32 +FORCE_INLINE __m128i _mm_sra_epi32(__m128i a, __m128i count) +{ + int64_t c = vgetq_lane_s64(count, 0); + if (_sse2neon_unlikely(c & ~31)) + return _mm_cmplt_epi32(a, _mm_setzero_si128()); + return vreinterpretq_m128i_s32( + vshlq_s32((int32x4_t) a, vdupq_n_s32((int) -c))); +} + +// Shift packed 16-bit integers in a right by imm8 while shifting in sign +// bits, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srai_epi16 +FORCE_INLINE __m128i _mm_srai_epi16(__m128i a, int imm) +{ + const int16_t count = (imm & ~15) ? 15 : (int16_t) imm; + return (__m128i) vshlq_s16((int16x8_t) a, vdupq_n_s16(-count)); +} + +// Shift packed 32-bit integers in a right by imm8 while shifting in sign bits, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srai_epi32 +// FORCE_INLINE __m128i _mm_srai_epi32(__m128i a, __constrange(0,255) int imm) +#define _mm_srai_epi32(a, imm) \ + _sse2neon_define0( \ + __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) == 0)) { \ + ret = _a; \ + } else if (_sse2neon_likely(0 < (imm) && (imm) < 32)) { \ + ret = vreinterpretq_m128i_s32( \ + vshlq_s32(vreinterpretq_s32_m128i(_a), vdupq_n_s32(-(imm)))); \ + } else { \ + ret = vreinterpretq_m128i_s32( \ + vshrq_n_s32(vreinterpretq_s32_m128i(_a), 31)); \ + } _sse2neon_return(ret);) + +// Shift packed 16-bit integers in a right by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi16 +FORCE_INLINE __m128i _mm_srl_epi16(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~15)) + return _mm_setzero_si128(); + + int16x8_t vc = vdupq_n_s16(-(int16_t) c); + return vreinterpretq_m128i_u16(vshlq_u16(vreinterpretq_u16_m128i(a), vc)); +} + +// Shift packed 32-bit integers in a right by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi32 +FORCE_INLINE __m128i _mm_srl_epi32(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~31)) + return _mm_setzero_si128(); + + int32x4_t vc = vdupq_n_s32(-(int32_t) c); + return vreinterpretq_m128i_u32(vshlq_u32(vreinterpretq_u32_m128i(a), vc)); +} + +// Shift packed 64-bit integers in a right by count while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srl_epi64 +FORCE_INLINE __m128i _mm_srl_epi64(__m128i a, __m128i count) +{ + uint64_t c = vreinterpretq_nth_u64_m128i(count, 0); + if (_sse2neon_unlikely(c & ~63)) + return _mm_setzero_si128(); + + int64x2_t vc = vdupq_n_s64(-(int64_t) c); + return vreinterpretq_m128i_u64(vshlq_u64(vreinterpretq_u64_m128i(a), vc)); +} + +// Shift packed 16-bit integers in a right by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi16 +#define _mm_srli_epi16(a, imm) \ + _sse2neon_define0( \ + __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~15)) { \ + ret = _mm_setzero_si128(); \ + } else { \ + ret = vreinterpretq_m128i_u16(vshlq_u16( \ + vreinterpretq_u16_m128i(_a), vdupq_n_s16((int16_t) - (imm)))); \ + } _sse2neon_return(ret);) + +// Shift packed 32-bit integers in a right by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi32 +// FORCE_INLINE __m128i _mm_srli_epi32(__m128i a, __constrange(0,255) int imm) +#define _mm_srli_epi32(a, imm) \ + _sse2neon_define0( \ + __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~31)) { \ + ret = _mm_setzero_si128(); \ + } else { \ + ret = vreinterpretq_m128i_u32( \ + vshlq_u32(vreinterpretq_u32_m128i(_a), vdupq_n_s32(-(imm)))); \ + } _sse2neon_return(ret);) + +// Shift packed 64-bit integers in a right by imm8 while shifting in zeros, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_epi64 +#define _mm_srli_epi64(a, imm) \ + _sse2neon_define0( \ + __m128i, a, __m128i ret; if (_sse2neon_unlikely((imm) & ~63)) { \ + ret = _mm_setzero_si128(); \ + } else { \ + ret = vreinterpretq_m128i_u64( \ + vshlq_u64(vreinterpretq_u64_m128i(_a), vdupq_n_s64(-(imm)))); \ + } _sse2neon_return(ret);) + +// Shift a right by imm8 bytes while shifting in zeros, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_srli_si128 +#define _mm_srli_si128(a, imm) \ + _sse2neon_define1( \ + __m128i, a, int8x16_t ret; \ + if (_sse2neon_unlikely((imm) & ~15)) ret = vdupq_n_s8(0); \ + else ret = vextq_s8(vreinterpretq_s8_m128i(_a), vdupq_n_s8(0), \ + ((imm) > 15 ? 0 : (imm))); \ + _sse2neon_return(vreinterpretq_m128i_s8(ret));) + +// Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point +// elements) from a into memory. mem_addr must be aligned on a 16-byte boundary +// or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_pd +FORCE_INLINE void _mm_store_pd(double *mem_addr, __m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + vst1q_f64((float64_t *) mem_addr, vreinterpretq_f64_m128d(a)); +#else + vst1q_f32((float32_t *) mem_addr, vreinterpretq_f32_m128d(a)); +#endif +} + +// Store the lower double-precision (64-bit) floating-point element from a into +// 2 contiguous elements in memory. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_pd1 +FORCE_INLINE void _mm_store_pd1(double *mem_addr, __m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float64x1_t a_low = vget_low_f64(vreinterpretq_f64_m128d(a)); + vst1q_f64((float64_t *) mem_addr, + vreinterpretq_f64_m128d(vcombine_f64(a_low, a_low))); +#else + float32x2_t a_low = vget_low_f32(vreinterpretq_f32_m128d(a)); + vst1q_f32((float32_t *) mem_addr, + vreinterpretq_f32_m128d(vcombine_f32(a_low, a_low))); +#endif +} + +// Store the lower double-precision (64-bit) floating-point element from a into +// memory. mem_addr does not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_store_sd +FORCE_INLINE void _mm_store_sd(double *mem_addr, __m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a))); +#else + vst1_u64((uint64_t *) mem_addr, vget_low_u64(vreinterpretq_u64_m128d(a))); +#endif +} + +// Store 128-bits of integer data from a into memory. mem_addr must be aligned +// on a 16-byte boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_store_si128 +FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a) +{ + vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); +} + +// Store the lower double-precision (64-bit) floating-point element from a into +// 2 contiguous elements in memory. mem_addr must be aligned on a 16-byte +// boundary or a general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#expand=9,526,5601&text=_mm_store1_pd +#define _mm_store1_pd _mm_store_pd1 + +// Store the upper double-precision (64-bit) floating-point element from a into +// memory. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeh_pd +FORCE_INLINE void _mm_storeh_pd(double *mem_addr, __m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + vst1_f64((float64_t *) mem_addr, vget_high_f64(vreinterpretq_f64_m128d(a))); +#else + vst1_f32((float32_t *) mem_addr, vget_high_f32(vreinterpretq_f32_m128d(a))); +#endif +} + +// Store 64-bit integer from the first element of a into memory. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_epi64 +FORCE_INLINE void _mm_storel_epi64(__m128i *a, __m128i b) +{ + vst1_u64((uint64_t *) a, vget_low_u64(vreinterpretq_u64_m128i(b))); +} + +// Store the lower double-precision (64-bit) floating-point element from a into +// memory. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storel_pd +FORCE_INLINE void _mm_storel_pd(double *mem_addr, __m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + vst1_f64((float64_t *) mem_addr, vget_low_f64(vreinterpretq_f64_m128d(a))); +#else + vst1_f32((float32_t *) mem_addr, vget_low_f32(vreinterpretq_f32_m128d(a))); +#endif +} + +// Store 2 double-precision (64-bit) floating-point elements from a into memory +// in reverse order. mem_addr must be aligned on a 16-byte boundary or a +// general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storer_pd +FORCE_INLINE void _mm_storer_pd(double *mem_addr, __m128d a) +{ + float32x4_t f = vreinterpretq_f32_m128d(a); + _mm_store_pd(mem_addr, vreinterpretq_m128d_f32(vextq_f32(f, f, 2))); +} + +// Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point +// elements) from a into memory. mem_addr does not need to be aligned on any +// particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_pd +FORCE_INLINE void _mm_storeu_pd(double *mem_addr, __m128d a) +{ + _mm_store_pd(mem_addr, a); +} + +// Store 128-bits of integer data from a into memory. mem_addr does not need to +// be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si128 +FORCE_INLINE void _mm_storeu_si128(__m128i *p, __m128i a) +{ + vst1q_s32((int32_t *) p, vreinterpretq_s32_m128i(a)); +} + +// Store 32-bit integer from the first element of a into memory. mem_addr does +// not need to be aligned on any particular boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si32 +FORCE_INLINE void _mm_storeu_si32(void *p, __m128i a) +{ + vst1q_lane_s32((int32_t *) p, vreinterpretq_s32_m128i(a), 0); +} + +// Store 128-bits (composed of 2 packed double-precision (64-bit) floating-point +// elements) from a into memory using a non-temporal memory hint. mem_addr must +// be aligned on a 16-byte boundary or a general-protection exception may be +// generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_pd +FORCE_INLINE void _mm_stream_pd(double *p, __m128d a) +{ +#if __has_builtin(__builtin_nontemporal_store) + __builtin_nontemporal_store(a, (__m128d *) p); +#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + vst1q_f64(p, vreinterpretq_f64_m128d(a)); +#else + vst1q_s64((int64_t *) p, vreinterpretq_s64_m128d(a)); +#endif +} + +// Store 128-bits of integer data from a into memory using a non-temporal memory +// hint. mem_addr must be aligned on a 16-byte boundary or a general-protection +// exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si128 +FORCE_INLINE void _mm_stream_si128(__m128i *p, __m128i a) +{ +#if __has_builtin(__builtin_nontemporal_store) + __builtin_nontemporal_store(a, p); +#else + vst1q_s64((int64_t *) p, vreinterpretq_s64_m128i(a)); +#endif +} + +// Store 32-bit integer a into memory using a non-temporal hint to minimize +// cache pollution. If the cache line containing address mem_addr is already in +// the cache, the cache will be updated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si32 +FORCE_INLINE void _mm_stream_si32(int *p, int a) +{ + vst1q_lane_s32((int32_t *) p, vdupq_n_s32(a), 0); +} + +// Store 64-bit integer a into memory using a non-temporal hint to minimize +// cache pollution. If the cache line containing address mem_addr is already in +// the cache, the cache will be updated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_si64 +FORCE_INLINE void _mm_stream_si64(__int64 *p, __int64 a) +{ + vst1_s64((int64_t *) p, vdup_n_s64((int64_t) a)); +} + +// Subtract packed 16-bit integers in b from packed 16-bit integers in a, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi16 +FORCE_INLINE __m128i _mm_sub_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Subtract packed 32-bit integers in b from packed 32-bit integers in a, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi32 +FORCE_INLINE __m128i _mm_sub_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vsubq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Subtract packed 64-bit integers in b from packed 64-bit integers in a, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi64 +FORCE_INLINE __m128i _mm_sub_epi64(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s64( + vsubq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); +} + +// Subtract packed 8-bit integers in b from packed 8-bit integers in a, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_epi8 +FORCE_INLINE __m128i _mm_sub_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Subtract packed double-precision (64-bit) floating-point elements in b from +// packed double-precision (64-bit) floating-point elements in a, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_sub_pd +FORCE_INLINE __m128d _mm_sub_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vsubq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[2]; + c[0] = a0 - b0; + c[1] = a1 - b1; + return vld1q_f32((float32_t *) c); +#endif +} + +// Subtract the lower double-precision (64-bit) floating-point element in b from +// the lower double-precision (64-bit) floating-point element in a, store the +// result in the lower element of dst, and copy the upper element from a to the +// upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_sd +FORCE_INLINE __m128d _mm_sub_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_sub_pd(a, b)); +} + +// Subtract 64-bit integer b from 64-bit integer a, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sub_si64 +FORCE_INLINE __m64 _mm_sub_si64(__m64 a, __m64 b) +{ + return vreinterpret_m64_s64( + vsub_s64(vreinterpret_s64_m64(a), vreinterpret_s64_m64(b))); +} + +// Subtract packed signed 16-bit integers in b from packed 16-bit integers in a +// using saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epi16 +FORCE_INLINE __m128i _mm_subs_epi16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s16( + vqsubq_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +} + +// Subtract packed signed 8-bit integers in b from packed 8-bit integers in a +// using saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epi8 +FORCE_INLINE __m128i _mm_subs_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vqsubq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Subtract packed unsigned 16-bit integers in b from packed unsigned 16-bit +// integers in a using saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epu16 +FORCE_INLINE __m128i _mm_subs_epu16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vqsubq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); +} + +// Subtract packed unsigned 8-bit integers in b from packed unsigned 8-bit +// integers in a using saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_subs_epu8 +FORCE_INLINE __m128i _mm_subs_epu8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8( + vqsubq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b))); +} + +#define _mm_ucomieq_sd _mm_comieq_sd +#define _mm_ucomige_sd _mm_comige_sd +#define _mm_ucomigt_sd _mm_comigt_sd +#define _mm_ucomile_sd _mm_comile_sd +#define _mm_ucomilt_sd _mm_comilt_sd +#define _mm_ucomineq_sd _mm_comineq_sd + +// Return vector of type __m128d with undefined elements. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_undefined_pd +FORCE_INLINE __m128d _mm_undefined_pd(void) +{ +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + __m128d a; +#if defined(_MSC_VER) && !defined(__clang__) + a = _mm_setzero_pd(); +#endif + return a; +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif +} + +// Unpack and interleave 16-bit integers from the high half of a and b, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi16 +FORCE_INLINE __m128i _mm_unpackhi_epi16(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s16( + vzip2q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +#else + int16x4_t a1 = vget_high_s16(vreinterpretq_s16_m128i(a)); + int16x4_t b1 = vget_high_s16(vreinterpretq_s16_m128i(b)); + int16x4x2_t result = vzip_s16(a1, b1); + return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave 32-bit integers from the high half of a and b, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi32 +FORCE_INLINE __m128i _mm_unpackhi_epi32(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s32( + vzip2q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +#else + int32x2_t a1 = vget_high_s32(vreinterpretq_s32_m128i(a)); + int32x2_t b1 = vget_high_s32(vreinterpretq_s32_m128i(b)); + int32x2x2_t result = vzip_s32(a1, b1); + return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave 64-bit integers from the high half of a and b, and +// store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi64 +FORCE_INLINE __m128i _mm_unpackhi_epi64(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s64( + vzip2q_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); +#else + int64x1_t a_h = vget_high_s64(vreinterpretq_s64_m128i(a)); + int64x1_t b_h = vget_high_s64(vreinterpretq_s64_m128i(b)); + return vreinterpretq_m128i_s64(vcombine_s64(a_h, b_h)); +#endif +} + +// Unpack and interleave 8-bit integers from the high half of a and b, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_epi8 +FORCE_INLINE __m128i _mm_unpackhi_epi8(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s8( + vzip2q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +#else + int8x8_t a1 = + vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(a))); + int8x8_t b1 = + vreinterpret_s8_s16(vget_high_s16(vreinterpretq_s16_m128i(b))); + int8x8x2_t result = vzip_s8(a1, b1); + return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave double-precision (64-bit) floating-point elements from +// the high half of a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpackhi_pd +FORCE_INLINE __m128d _mm_unpackhi_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vzip2q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + return vreinterpretq_m128d_s64( + vcombine_s64(vget_high_s64(vreinterpretq_s64_m128d(a)), + vget_high_s64(vreinterpretq_s64_m128d(b)))); +#endif +} + +// Unpack and interleave 16-bit integers from the low half of a and b, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi16 +FORCE_INLINE __m128i _mm_unpacklo_epi16(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s16( + vzip1q_s16(vreinterpretq_s16_m128i(a), vreinterpretq_s16_m128i(b))); +#else + int16x4_t a1 = vget_low_s16(vreinterpretq_s16_m128i(a)); + int16x4_t b1 = vget_low_s16(vreinterpretq_s16_m128i(b)); + int16x4x2_t result = vzip_s16(a1, b1); + return vreinterpretq_m128i_s16(vcombine_s16(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave 32-bit integers from the low half of a and b, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi32 +FORCE_INLINE __m128i _mm_unpacklo_epi32(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s32( + vzip1q_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +#else + int32x2_t a1 = vget_low_s32(vreinterpretq_s32_m128i(a)); + int32x2_t b1 = vget_low_s32(vreinterpretq_s32_m128i(b)); + int32x2x2_t result = vzip_s32(a1, b1); + return vreinterpretq_m128i_s32(vcombine_s32(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave 64-bit integers from the low half of a and b, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi64 +FORCE_INLINE __m128i _mm_unpacklo_epi64(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s64( + vzip1q_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); +#else + int64x1_t a_l = vget_low_s64(vreinterpretq_s64_m128i(a)); + int64x1_t b_l = vget_low_s64(vreinterpretq_s64_m128i(b)); + return vreinterpretq_m128i_s64(vcombine_s64(a_l, b_l)); +#endif +} + +// Unpack and interleave 8-bit integers from the low half of a and b, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_epi8 +FORCE_INLINE __m128i _mm_unpacklo_epi8(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s8( + vzip1q_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +#else + int8x8_t a1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(a))); + int8x8_t b1 = vreinterpret_s8_s16(vget_low_s16(vreinterpretq_s16_m128i(b))); + int8x8x2_t result = vzip_s8(a1, b1); + return vreinterpretq_m128i_s8(vcombine_s8(result.val[0], result.val[1])); +#endif +} + +// Unpack and interleave double-precision (64-bit) floating-point elements from +// the low half of a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_unpacklo_pd +FORCE_INLINE __m128d _mm_unpacklo_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vzip1q_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + return vreinterpretq_m128d_s64( + vcombine_s64(vget_low_s64(vreinterpretq_s64_m128d(a)), + vget_low_s64(vreinterpretq_s64_m128d(b)))); +#endif +} + +// Compute the bitwise XOR of packed double-precision (64-bit) floating-point +// elements in a and b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_pd +FORCE_INLINE __m128d _mm_xor_pd(__m128d a, __m128d b) +{ + return vreinterpretq_m128d_s64( + veorq_s64(vreinterpretq_s64_m128d(a), vreinterpretq_s64_m128d(b))); +} + +// Compute the bitwise XOR of 128 bits (representing integer data) in a and b, +// and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_xor_si128 +FORCE_INLINE __m128i _mm_xor_si128(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + veorq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +/* SSE3 */ + +// Alternatively add and subtract packed double-precision (64-bit) +// floating-point elements in a to/from packed elements in b, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_addsub_pd +FORCE_INLINE __m128d _mm_addsub_pd(__m128d a, __m128d b) +{ + _sse2neon_const __m128d mask = _mm_set_pd(1.0f, -1.0f); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vfmaq_f64(vreinterpretq_f64_m128d(a), + vreinterpretq_f64_m128d(b), + vreinterpretq_f64_m128d(mask))); +#else + return _mm_add_pd(_mm_mul_pd(b, mask), a); +#endif +} + +// Alternatively add and subtract packed single-precision (32-bit) +// floating-point elements in a to/from packed elements in b, and store the +// results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=addsub_ps +FORCE_INLINE __m128 _mm_addsub_ps(__m128 a, __m128 b) +{ + _sse2neon_const __m128 mask = _mm_setr_ps(-1.0f, 1.0f, -1.0f, 1.0f); +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_FMA) /* VFPv4+ */ + return vreinterpretq_m128_f32(vfmaq_f32(vreinterpretq_f32_m128(a), + vreinterpretq_f32_m128(mask), + vreinterpretq_f32_m128(b))); +#else + return _mm_add_ps(_mm_mul_ps(b, mask), a); +#endif +} + +// Horizontally add adjacent pairs of double-precision (64-bit) floating-point +// elements in a and b, and pack the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pd +FORCE_INLINE __m128d _mm_hadd_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vpaddq_f64(vreinterpretq_f64_m128d(a), vreinterpretq_f64_m128d(b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[] = {a0 + a1, b0 + b1}; + return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c)); +#endif +} + +// Horizontally add adjacent pairs of single-precision (32-bit) floating-point +// elements in a and b, and pack the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_ps +FORCE_INLINE __m128 _mm_hadd_ps(__m128 a, __m128 b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vpaddq_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(b))); +#else + float32x2_t a10 = vget_low_f32(vreinterpretq_f32_m128(a)); + float32x2_t a32 = vget_high_f32(vreinterpretq_f32_m128(a)); + float32x2_t b10 = vget_low_f32(vreinterpretq_f32_m128(b)); + float32x2_t b32 = vget_high_f32(vreinterpretq_f32_m128(b)); + return vreinterpretq_m128_f32( + vcombine_f32(vpadd_f32(a10, a32), vpadd_f32(b10, b32))); +#endif +} + +// Horizontally subtract adjacent pairs of double-precision (64-bit) +// floating-point elements in a and b, and pack the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_pd +FORCE_INLINE __m128d _mm_hsub_pd(__m128d a, __m128d b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float64x2_t _a = vreinterpretq_f64_m128d(a); + float64x2_t _b = vreinterpretq_f64_m128d(b); + return vreinterpretq_m128d_f64( + vsubq_f64(vuzp1q_f64(_a, _b), vuzp2q_f64(_a, _b))); +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double c[] = {a0 - a1, b0 - b1}; + return vreinterpretq_m128d_u64(vld1q_u64((uint64_t *) c)); +#endif +} + +// Horizontally subtract adjacent pairs of single-precision (32-bit) +// floating-point elements in a and b, and pack the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_ps +FORCE_INLINE __m128 _mm_hsub_ps(__m128 _a, __m128 _b) +{ + float32x4_t a = vreinterpretq_f32_m128(_a); + float32x4_t b = vreinterpretq_f32_m128(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vsubq_f32(vuzp1q_f32(a, b), vuzp2q_f32(a, b))); +#else + float32x4x2_t c = vuzpq_f32(a, b); + return vreinterpretq_m128_f32(vsubq_f32(c.val[0], c.val[1])); +#endif +} + +// Load 128-bits of integer data from unaligned memory into dst. This intrinsic +// may perform better than _mm_loadu_si128 when the data crosses a cache line +// boundary. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_lddqu_si128 +#define _mm_lddqu_si128 _mm_loadu_si128 + +// Load a double-precision (64-bit) floating-point element from memory into both +// elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loaddup_pd +#define _mm_loaddup_pd _mm_load1_pd + +// Duplicate the low double-precision (64-bit) floating-point element from a, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movedup_pd +FORCE_INLINE __m128d _mm_movedup_pd(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64( + vdupq_laneq_f64(vreinterpretq_f64_m128d(a), 0)); +#else + return vreinterpretq_m128d_u64( + vdupq_n_u64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0))); +#endif +} + +// Duplicate odd-indexed single-precision (32-bit) floating-point elements +// from a, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_movehdup_ps +FORCE_INLINE __m128 _mm_movehdup_ps(__m128 a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vtrn2q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a))); +#elif defined(_sse2neon_shuffle) + return vreinterpretq_m128_f32(vshuffleq_s32( + vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 1, 1, 3, 3)); +#else + float32_t a1 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 1); + float32_t a3 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 3); + float ALIGN_STRUCT(16) data[4] = {a1, a1, a3, a3}; + return vreinterpretq_m128_f32(vld1q_f32(data)); +#endif +} + +// Duplicate even-indexed single-precision (32-bit) floating-point elements +// from a, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_moveldup_ps +FORCE_INLINE __m128 _mm_moveldup_ps(__m128 a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128_f32( + vtrn1q_f32(vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a))); +#elif defined(_sse2neon_shuffle) + return vreinterpretq_m128_f32(vshuffleq_s32( + vreinterpretq_f32_m128(a), vreinterpretq_f32_m128(a), 0, 0, 2, 2)); +#else + float32_t a0 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 0); + float32_t a2 = vgetq_lane_f32(vreinterpretq_f32_m128(a), 2); + float ALIGN_STRUCT(16) data[4] = {a0, a0, a2, a2}; + return vreinterpretq_m128_f32(vld1q_f32(data)); +#endif +} + +/* SSSE3 */ + +// Compute the absolute value of packed signed 16-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi16 +FORCE_INLINE __m128i _mm_abs_epi16(__m128i a) +{ + return vreinterpretq_m128i_s16(vabsq_s16(vreinterpretq_s16_m128i(a))); +} + +// Compute the absolute value of packed signed 32-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi32 +FORCE_INLINE __m128i _mm_abs_epi32(__m128i a) +{ + return vreinterpretq_m128i_s32(vabsq_s32(vreinterpretq_s32_m128i(a))); +} + +// Compute the absolute value of packed signed 8-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_epi8 +FORCE_INLINE __m128i _mm_abs_epi8(__m128i a) +{ + return vreinterpretq_m128i_s8(vabsq_s8(vreinterpretq_s8_m128i(a))); +} + +// Compute the absolute value of packed signed 16-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi16 +FORCE_INLINE __m64 _mm_abs_pi16(__m64 a) +{ + return vreinterpret_m64_s16(vabs_s16(vreinterpret_s16_m64(a))); +} + +// Compute the absolute value of packed signed 32-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi32 +FORCE_INLINE __m64 _mm_abs_pi32(__m64 a) +{ + return vreinterpret_m64_s32(vabs_s32(vreinterpret_s32_m64(a))); +} + +// Compute the absolute value of packed signed 8-bit integers in a, and store +// the unsigned results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_abs_pi8 +FORCE_INLINE __m64 _mm_abs_pi8(__m64 a) +{ + return vreinterpret_m64_s8(vabs_s8(vreinterpret_s8_m64(a))); +} + +// Concatenate 16-byte blocks in a and b into a 32-byte temporary result, shift +// the result right by imm8 bytes, and store the low 16 bytes in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_alignr_epi8 +#if defined(__GNUC__) && !defined(__clang__) +#define _mm_alignr_epi8(a, b, imm) \ + __extension__({ \ + uint8x16_t _a = vreinterpretq_u8_m128i(a); \ + uint8x16_t _b = vreinterpretq_u8_m128i(b); \ + __m128i ret; \ + if (_sse2neon_unlikely((imm) & ~31)) \ + ret = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ + else if ((imm) >= 16) \ + ret = _mm_srli_si128(a, (imm) >= 16 ? (imm) - 16 : 0); \ + else \ + ret = vreinterpretq_m128i_u8( \ + vextq_u8(_b, _a, (imm) < 16 ? (imm) : 0)); \ + ret; \ + }) + +#else +#define _mm_alignr_epi8(a, b, imm) \ + _sse2neon_define2( \ + __m128i, a, b, uint8x16_t __a = vreinterpretq_u8_m128i(_a); \ + uint8x16_t __b = vreinterpretq_u8_m128i(_b); __m128i ret; \ + if (_sse2neon_unlikely((imm) & ~31)) ret = \ + vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ + else if ((imm) >= 16) ret = \ + _mm_srli_si128(_a, (imm) >= 16 ? (imm) - 16 : 0); \ + else ret = vreinterpretq_m128i_u8( \ + vextq_u8(__b, __a, (imm) < 16 ? (imm) : 0)); \ + _sse2neon_return(ret);) + +#endif + +// Concatenate 8-byte blocks in a and b into a 16-byte temporary result, shift +// the result right by imm8 bytes, and store the low 8 bytes in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_alignr_pi8 +#define _mm_alignr_pi8(a, b, imm) \ + _sse2neon_define2( \ + __m64, a, b, __m64 ret; if (_sse2neon_unlikely((imm) >= 16)) { \ + ret = vreinterpret_m64_s8(vdup_n_s8(0)); \ + } else { \ + uint8x8_t tmp_low; \ + uint8x8_t tmp_high; \ + if ((imm) >= 8) { \ + const int idx = (imm) - 8; \ + tmp_low = vreinterpret_u8_m64(_a); \ + tmp_high = vdup_n_u8(0); \ + ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \ + } else { \ + const int idx = (imm); \ + tmp_low = vreinterpret_u8_m64(_b); \ + tmp_high = vreinterpret_u8_m64(_a); \ + ret = vreinterpret_m64_u8(vext_u8(tmp_low, tmp_high, idx)); \ + } \ + } _sse2neon_return(ret);) + +// Horizontally add adjacent pairs of 16-bit integers in a and b, and pack the +// signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_epi16 +FORCE_INLINE __m128i _mm_hadd_epi16(__m128i _a, __m128i _b) +{ + int16x8_t a = vreinterpretq_s16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s16(vpaddq_s16(a, b)); +#else + return vreinterpretq_m128i_s16( + vcombine_s16(vpadd_s16(vget_low_s16(a), vget_high_s16(a)), + vpadd_s16(vget_low_s16(b), vget_high_s16(b)))); +#endif +} + +// Horizontally add adjacent pairs of 32-bit integers in a and b, and pack the +// signed 32-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_epi32 +FORCE_INLINE __m128i _mm_hadd_epi32(__m128i _a, __m128i _b) +{ + int32x4_t a = vreinterpretq_s32_m128i(_a); + int32x4_t b = vreinterpretq_s32_m128i(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s32(vpaddq_s32(a, b)); +#else + return vreinterpretq_m128i_s32( + vcombine_s32(vpadd_s32(vget_low_s32(a), vget_high_s32(a)), + vpadd_s32(vget_low_s32(b), vget_high_s32(b)))); +#endif +} + +// Horizontally add adjacent pairs of 16-bit integers in a and b, and pack the +// signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pi16 +FORCE_INLINE __m64 _mm_hadd_pi16(__m64 a, __m64 b) +{ + return vreinterpret_m64_s16( + vpadd_s16(vreinterpret_s16_m64(a), vreinterpret_s16_m64(b))); +} + +// Horizontally add adjacent pairs of 32-bit integers in a and b, and pack the +// signed 32-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadd_pi32 +FORCE_INLINE __m64 _mm_hadd_pi32(__m64 a, __m64 b) +{ + return vreinterpret_m64_s32( + vpadd_s32(vreinterpret_s32_m64(a), vreinterpret_s32_m64(b))); +} + +// Horizontally add adjacent pairs of signed 16-bit integers in a and b using +// saturation, and pack the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadds_epi16 +FORCE_INLINE __m128i _mm_hadds_epi16(__m128i _a, __m128i _b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int16x8_t a = vreinterpretq_s16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); + return vreinterpretq_s64_s16( + vqaddq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); +#else + int32x4_t a = vreinterpretq_s32_m128i(_a); + int32x4_t b = vreinterpretq_s32_m128i(_b); + // Interleave using vshrn/vmovn + // [a0|a2|a4|a6|b0|b2|b4|b6] + // [a1|a3|a5|a7|b1|b3|b5|b7] + int16x8_t ab0246 = vcombine_s16(vmovn_s32(a), vmovn_s32(b)); + int16x8_t ab1357 = vcombine_s16(vshrn_n_s32(a, 16), vshrn_n_s32(b, 16)); + // Saturated add + return vreinterpretq_m128i_s16(vqaddq_s16(ab0246, ab1357)); +#endif +} + +// Horizontally add adjacent pairs of signed 16-bit integers in a and b using +// saturation, and pack the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hadds_pi16 +FORCE_INLINE __m64 _mm_hadds_pi16(__m64 _a, __m64 _b) +{ + int16x4_t a = vreinterpret_s16_m64(_a); + int16x4_t b = vreinterpret_s16_m64(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpret_s64_s16(vqadd_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); +#else + int16x4x2_t res = vuzp_s16(a, b); + return vreinterpret_s64_s16(vqadd_s16(res.val[0], res.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of 16-bit integers in a and b, and pack +// the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_epi16 +FORCE_INLINE __m128i _mm_hsub_epi16(__m128i _a, __m128i _b) +{ + int16x8_t a = vreinterpretq_s16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s16( + vsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); +#else + int16x8x2_t c = vuzpq_s16(a, b); + return vreinterpretq_m128i_s16(vsubq_s16(c.val[0], c.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of 32-bit integers in a and b, and pack +// the signed 32-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_epi32 +FORCE_INLINE __m128i _mm_hsub_epi32(__m128i _a, __m128i _b) +{ + int32x4_t a = vreinterpretq_s32_m128i(_a); + int32x4_t b = vreinterpretq_s32_m128i(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s32( + vsubq_s32(vuzp1q_s32(a, b), vuzp2q_s32(a, b))); +#else + int32x4x2_t c = vuzpq_s32(a, b); + return vreinterpretq_m128i_s32(vsubq_s32(c.val[0], c.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of 16-bit integers in a and b, and pack +// the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsub_pi16 +FORCE_INLINE __m64 _mm_hsub_pi16(__m64 _a, __m64 _b) +{ + int16x4_t a = vreinterpret_s16_m64(_a); + int16x4_t b = vreinterpret_s16_m64(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpret_m64_s16(vsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); +#else + int16x4x2_t c = vuzp_s16(a, b); + return vreinterpret_m64_s16(vsub_s16(c.val[0], c.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of 32-bit integers in a and b, and pack +// the signed 32-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_hsub_pi32 +FORCE_INLINE __m64 _mm_hsub_pi32(__m64 _a, __m64 _b) +{ + int32x2_t a = vreinterpret_s32_m64(_a); + int32x2_t b = vreinterpret_s32_m64(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpret_m64_s32(vsub_s32(vuzp1_s32(a, b), vuzp2_s32(a, b))); +#else + int32x2x2_t c = vuzp_s32(a, b); + return vreinterpret_m64_s32(vsub_s32(c.val[0], c.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of signed 16-bit integers in a and b +// using saturation, and pack the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsubs_epi16 +FORCE_INLINE __m128i _mm_hsubs_epi16(__m128i _a, __m128i _b) +{ + int16x8_t a = vreinterpretq_s16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s16( + vqsubq_s16(vuzp1q_s16(a, b), vuzp2q_s16(a, b))); +#else + int16x8x2_t c = vuzpq_s16(a, b); + return vreinterpretq_m128i_s16(vqsubq_s16(c.val[0], c.val[1])); +#endif +} + +// Horizontally subtract adjacent pairs of signed 16-bit integers in a and b +// using saturation, and pack the signed 16-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_hsubs_pi16 +FORCE_INLINE __m64 _mm_hsubs_pi16(__m64 _a, __m64 _b) +{ + int16x4_t a = vreinterpret_s16_m64(_a); + int16x4_t b = vreinterpret_s16_m64(_b); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpret_m64_s16(vqsub_s16(vuzp1_s16(a, b), vuzp2_s16(a, b))); +#else + int16x4x2_t c = vuzp_s16(a, b); + return vreinterpret_m64_s16(vqsub_s16(c.val[0], c.val[1])); +#endif +} + +// Vertically multiply each unsigned 8-bit integer from a with the corresponding +// signed 8-bit integer from b, producing intermediate signed 16-bit integers. +// Horizontally add adjacent pairs of intermediate signed 16-bit integers, +// and pack the saturated results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maddubs_epi16 +FORCE_INLINE __m128i _mm_maddubs_epi16(__m128i _a, __m128i _b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint8x16_t a = vreinterpretq_u8_m128i(_a); + int8x16_t b = vreinterpretq_s8_m128i(_b); + int16x8_t tl = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_low_u8(a))), + vmovl_s8(vget_low_s8(b))); + int16x8_t th = vmulq_s16(vreinterpretq_s16_u16(vmovl_u8(vget_high_u8(a))), + vmovl_s8(vget_high_s8(b))); + return vreinterpretq_m128i_s16( + vqaddq_s16(vuzp1q_s16(tl, th), vuzp2q_s16(tl, th))); +#else + // This would be much simpler if x86 would choose to zero extend OR sign + // extend, not both. This could probably be optimized better. + uint16x8_t a = vreinterpretq_u16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); + + // Zero extend a + int16x8_t a_odd = vreinterpretq_s16_u16(vshrq_n_u16(a, 8)); + int16x8_t a_even = vreinterpretq_s16_u16(vbicq_u16(a, vdupq_n_u16(0xff00))); + + // Sign extend by shifting left then shifting right. + int16x8_t b_even = vshrq_n_s16(vshlq_n_s16(b, 8), 8); + int16x8_t b_odd = vshrq_n_s16(b, 8); + + // multiply + int16x8_t prod1 = vmulq_s16(a_even, b_even); + int16x8_t prod2 = vmulq_s16(a_odd, b_odd); + + // saturated add + return vreinterpretq_m128i_s16(vqaddq_s16(prod1, prod2)); +#endif +} + +// Vertically multiply each unsigned 8-bit integer from a with the corresponding +// signed 8-bit integer from b, producing intermediate signed 16-bit integers. +// Horizontally add adjacent pairs of intermediate signed 16-bit integers, and +// pack the saturated results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_maddubs_pi16 +FORCE_INLINE __m64 _mm_maddubs_pi16(__m64 _a, __m64 _b) +{ + uint16x4_t a = vreinterpret_u16_m64(_a); + int16x4_t b = vreinterpret_s16_m64(_b); + + // Zero extend a + int16x4_t a_odd = vreinterpret_s16_u16(vshr_n_u16(a, 8)); + int16x4_t a_even = vreinterpret_s16_u16(vand_u16(a, vdup_n_u16(0xff))); + + // Sign extend by shifting left then shifting right. + int16x4_t b_even = vshr_n_s16(vshl_n_s16(b, 8), 8); + int16x4_t b_odd = vshr_n_s16(b, 8); + + // multiply + int16x4_t prod1 = vmul_s16(a_even, b_even); + int16x4_t prod2 = vmul_s16(a_odd, b_odd); + + // saturated add + return vreinterpret_m64_s16(vqadd_s16(prod1, prod2)); +} + +// Multiply packed signed 16-bit integers in a and b, producing intermediate +// signed 32-bit integers. Shift right by 15 bits while rounding up, and store +// the packed 16-bit integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhrs_epi16 +FORCE_INLINE __m128i _mm_mulhrs_epi16(__m128i a, __m128i b) +{ + // Has issues due to saturation + // return vreinterpretq_m128i_s16(vqrdmulhq_s16(a, b)); + + // Multiply + int32x4_t mul_lo = vmull_s16(vget_low_s16(vreinterpretq_s16_m128i(a)), + vget_low_s16(vreinterpretq_s16_m128i(b))); + int32x4_t mul_hi = vmull_s16(vget_high_s16(vreinterpretq_s16_m128i(a)), + vget_high_s16(vreinterpretq_s16_m128i(b))); + + // Rounding narrowing shift right + // narrow = (int16_t)((mul + 16384) >> 15); + int16x4_t narrow_lo = vrshrn_n_s32(mul_lo, 15); + int16x4_t narrow_hi = vrshrn_n_s32(mul_hi, 15); + + // Join together + return vreinterpretq_m128i_s16(vcombine_s16(narrow_lo, narrow_hi)); +} + +// Multiply packed signed 16-bit integers in a and b, producing intermediate +// signed 32-bit integers. Truncate each intermediate integer to the 18 most +// significant bits, round by adding 1, and store bits [16:1] to dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mulhrs_pi16 +FORCE_INLINE __m64 _mm_mulhrs_pi16(__m64 a, __m64 b) +{ + int32x4_t mul_extend = + vmull_s16((vreinterpret_s16_m64(a)), (vreinterpret_s16_m64(b))); + + // Rounding narrowing shift right + return vreinterpret_m64_s16(vrshrn_n_s32(mul_extend, 15)); +} + +// Shuffle packed 8-bit integers in a according to shuffle control mask in the +// corresponding 8-bit element of b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_epi8 +FORCE_INLINE __m128i _mm_shuffle_epi8(__m128i a, __m128i b) +{ + int8x16_t tbl = vreinterpretq_s8_m128i(a); // input a + uint8x16_t idx = vreinterpretq_u8_m128i(b); // input b + uint8x16_t idx_masked = + vandq_u8(idx, vdupq_n_u8(0x8F)); // avoid using meaningless bits +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_s8(vqtbl1q_s8(tbl, idx_masked)); +#elif defined(__GNUC__) + int8x16_t ret; + // %e and %f represent the even and odd D registers + // respectively. + __asm__ __volatile__( + "vtbl.8 %e[ret], {%e[tbl], %f[tbl]}, %e[idx]\n" + "vtbl.8 %f[ret], {%e[tbl], %f[tbl]}, %f[idx]\n" + : [ret] "=&w"(ret) + : [tbl] "w"(tbl), [idx] "w"(idx_masked)); + return vreinterpretq_m128i_s8(ret); +#else + // use this line if testing on aarch64 + int8x8x2_t a_split = {vget_low_s8(tbl), vget_high_s8(tbl)}; + return vreinterpretq_m128i_s8( + vcombine_s8(vtbl2_s8(a_split, vget_low_u8(idx_masked)), + vtbl2_s8(a_split, vget_high_u8(idx_masked)))); +#endif +} + +// Shuffle packed 8-bit integers in a according to shuffle control mask in the +// corresponding 8-bit element of b, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_shuffle_pi8 +FORCE_INLINE __m64 _mm_shuffle_pi8(__m64 a, __m64 b) +{ + const int8x8_t controlMask = + vand_s8(vreinterpret_s8_m64(b), vdup_n_s8((int8_t) (0x1 << 7 | 0x07))); + int8x8_t res = vtbl1_s8(vreinterpret_s8_m64(a), controlMask); + return vreinterpret_m64_s8(res); +} + +// Negate packed 16-bit integers in a when the corresponding signed +// 16-bit integer in b is negative, and store the results in dst. +// Element in dst are zeroed out when the corresponding element +// in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi16 +FORCE_INLINE __m128i _mm_sign_epi16(__m128i _a, __m128i _b) +{ + int16x8_t a = vreinterpretq_s16_m128i(_a); + int16x8_t b = vreinterpretq_s16_m128i(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFFFF : 0 + uint16x8_t ltMask = vreinterpretq_u16_s16(vshrq_n_s16(b, 15)); + // (b == 0) ? 0xFFFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int16x8_t zeroMask = vreinterpretq_s16_u16(vceqzq_s16(b)); +#else + int16x8_t zeroMask = vreinterpretq_s16_u16(vceqq_s16(b, vdupq_n_s16(0))); +#endif + + // bitwise select either a or negative 'a' (vnegq_s16(a) equals to negative + // 'a') based on ltMask + int16x8_t masked = vbslq_s16(ltMask, vnegq_s16(a), a); + // res = masked & (~zeroMask) + int16x8_t res = vbicq_s16(masked, zeroMask); + return vreinterpretq_m128i_s16(res); +} + +// Negate packed 32-bit integers in a when the corresponding signed +// 32-bit integer in b is negative, and store the results in dst. +// Element in dst are zeroed out when the corresponding element +// in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi32 +FORCE_INLINE __m128i _mm_sign_epi32(__m128i _a, __m128i _b) +{ + int32x4_t a = vreinterpretq_s32_m128i(_a); + int32x4_t b = vreinterpretq_s32_m128i(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFFFFFFFF : 0 + uint32x4_t ltMask = vreinterpretq_u32_s32(vshrq_n_s32(b, 31)); + + // (b == 0) ? 0xFFFFFFFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int32x4_t zeroMask = vreinterpretq_s32_u32(vceqzq_s32(b)); +#else + int32x4_t zeroMask = vreinterpretq_s32_u32(vceqq_s32(b, vdupq_n_s32(0))); +#endif + + // bitwise select either a or negative 'a' (vnegq_s32(a) equals to negative + // 'a') based on ltMask + int32x4_t masked = vbslq_s32(ltMask, vnegq_s32(a), a); + // res = masked & (~zeroMask) + int32x4_t res = vbicq_s32(masked, zeroMask); + return vreinterpretq_m128i_s32(res); +} + +// Negate packed 8-bit integers in a when the corresponding signed +// 8-bit integer in b is negative, and store the results in dst. +// Element in dst are zeroed out when the corresponding element +// in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_epi8 +FORCE_INLINE __m128i _mm_sign_epi8(__m128i _a, __m128i _b) +{ + int8x16_t a = vreinterpretq_s8_m128i(_a); + int8x16_t b = vreinterpretq_s8_m128i(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFF : 0 + uint8x16_t ltMask = vreinterpretq_u8_s8(vshrq_n_s8(b, 7)); + + // (b == 0) ? 0xFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int8x16_t zeroMask = vreinterpretq_s8_u8(vceqzq_s8(b)); +#else + int8x16_t zeroMask = vreinterpretq_s8_u8(vceqq_s8(b, vdupq_n_s8(0))); +#endif + + // bitwise select either a or negative 'a' (vnegq_s8(a) return negative 'a') + // based on ltMask + int8x16_t masked = vbslq_s8(ltMask, vnegq_s8(a), a); + // res = masked & (~zeroMask) + int8x16_t res = vbicq_s8(masked, zeroMask); + + return vreinterpretq_m128i_s8(res); +} + +// Negate packed 16-bit integers in a when the corresponding signed 16-bit +// integer in b is negative, and store the results in dst. Element in dst are +// zeroed out when the corresponding element in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi16 +FORCE_INLINE __m64 _mm_sign_pi16(__m64 _a, __m64 _b) +{ + int16x4_t a = vreinterpret_s16_m64(_a); + int16x4_t b = vreinterpret_s16_m64(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFFFF : 0 + uint16x4_t ltMask = vreinterpret_u16_s16(vshr_n_s16(b, 15)); + + // (b == 0) ? 0xFFFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int16x4_t zeroMask = vreinterpret_s16_u16(vceqz_s16(b)); +#else + int16x4_t zeroMask = vreinterpret_s16_u16(vceq_s16(b, vdup_n_s16(0))); +#endif + + // bitwise select either a or negative 'a' (vneg_s16(a) return negative 'a') + // based on ltMask + int16x4_t masked = vbsl_s16(ltMask, vneg_s16(a), a); + // res = masked & (~zeroMask) + int16x4_t res = vbic_s16(masked, zeroMask); + + return vreinterpret_m64_s16(res); +} + +// Negate packed 32-bit integers in a when the corresponding signed 32-bit +// integer in b is negative, and store the results in dst. Element in dst are +// zeroed out when the corresponding element in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi32 +FORCE_INLINE __m64 _mm_sign_pi32(__m64 _a, __m64 _b) +{ + int32x2_t a = vreinterpret_s32_m64(_a); + int32x2_t b = vreinterpret_s32_m64(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFFFFFFFF : 0 + uint32x2_t ltMask = vreinterpret_u32_s32(vshr_n_s32(b, 31)); + + // (b == 0) ? 0xFFFFFFFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int32x2_t zeroMask = vreinterpret_s32_u32(vceqz_s32(b)); +#else + int32x2_t zeroMask = vreinterpret_s32_u32(vceq_s32(b, vdup_n_s32(0))); +#endif + + // bitwise select either a or negative 'a' (vneg_s32(a) return negative 'a') + // based on ltMask + int32x2_t masked = vbsl_s32(ltMask, vneg_s32(a), a); + // res = masked & (~zeroMask) + int32x2_t res = vbic_s32(masked, zeroMask); + + return vreinterpret_m64_s32(res); +} + +// Negate packed 8-bit integers in a when the corresponding signed 8-bit integer +// in b is negative, and store the results in dst. Element in dst are zeroed out +// when the corresponding element in b is zero. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_sign_pi8 +FORCE_INLINE __m64 _mm_sign_pi8(__m64 _a, __m64 _b) +{ + int8x8_t a = vreinterpret_s8_m64(_a); + int8x8_t b = vreinterpret_s8_m64(_b); + + // signed shift right: faster than vclt + // (b < 0) ? 0xFF : 0 + uint8x8_t ltMask = vreinterpret_u8_s8(vshr_n_s8(b, 7)); + + // (b == 0) ? 0xFF : 0 +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + int8x8_t zeroMask = vreinterpret_s8_u8(vceqz_s8(b)); +#else + int8x8_t zeroMask = vreinterpret_s8_u8(vceq_s8(b, vdup_n_s8(0))); +#endif + + // bitwise select either a or negative 'a' (vneg_s8(a) return negative 'a') + // based on ltMask + int8x8_t masked = vbsl_s8(ltMask, vneg_s8(a), a); + // res = masked & (~zeroMask) + int8x8_t res = vbic_s8(masked, zeroMask); + + return vreinterpret_m64_s8(res); +} + +/* SSE4.1 */ + +// Blend packed 16-bit integers from a and b using control mask imm8, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_epi16 +// FORCE_INLINE __m128i _mm_blend_epi16(__m128i a, __m128i b, +// __constrange(0,255) int imm) +#define _mm_blend_epi16(a, b, imm) \ + _sse2neon_define2( \ + __m128i, a, b, \ + const uint16_t _mask[8] = \ + _sse2neon_init(((imm) & (1 << 0)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 1)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 2)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 3)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 4)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 5)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 6)) ? (uint16_t) - 1 : 0x0, \ + ((imm) & (1 << 7)) ? (uint16_t) - 1 : 0x0); \ + uint16x8_t _mask_vec = vld1q_u16(_mask); \ + uint16x8_t __a = vreinterpretq_u16_m128i(_a); \ + uint16x8_t __b = vreinterpretq_u16_m128i(_b); _sse2neon_return( \ + vreinterpretq_m128i_u16(vbslq_u16(_mask_vec, __b, __a)));) + +// Blend packed double-precision (64-bit) floating-point elements from a and b +// using control mask imm8, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_pd +#define _mm_blend_pd(a, b, imm) \ + _sse2neon_define2( \ + __m128d, a, b, \ + const uint64_t _mask[2] = \ + _sse2neon_init(((imm) & (1 << 0)) ? ~UINT64_C(0) : UINT64_C(0), \ + ((imm) & (1 << 1)) ? ~UINT64_C(0) : UINT64_C(0)); \ + uint64x2_t _mask_vec = vld1q_u64(_mask); \ + uint64x2_t __a = vreinterpretq_u64_m128d(_a); \ + uint64x2_t __b = vreinterpretq_u64_m128d(_b); _sse2neon_return( \ + vreinterpretq_m128d_u64(vbslq_u64(_mask_vec, __b, __a)));) + +// Blend packed single-precision (32-bit) floating-point elements from a and b +// using mask, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blend_ps +FORCE_INLINE __m128 _mm_blend_ps(__m128 _a, __m128 _b, const char imm8) +{ + const uint32_t ALIGN_STRUCT(16) data[4] = { + (imm8 & (1 << 0)) ? UINT32_MAX : 0, (imm8 & (1 << 1)) ? UINT32_MAX : 0, + (imm8 & (1 << 2)) ? UINT32_MAX : 0, (imm8 & (1 << 3)) ? UINT32_MAX : 0}; + uint32x4_t mask = vld1q_u32(data); + float32x4_t a = vreinterpretq_f32_m128(_a); + float32x4_t b = vreinterpretq_f32_m128(_b); + return vreinterpretq_m128_f32(vbslq_f32(mask, b, a)); +} + +// Blend packed 8-bit integers from a and b using mask, and store the results in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_epi8 +FORCE_INLINE __m128i _mm_blendv_epi8(__m128i _a, __m128i _b, __m128i _mask) +{ + // Use a signed shift right to create a mask with the sign bit + uint8x16_t mask = + vreinterpretq_u8_s8(vshrq_n_s8(vreinterpretq_s8_m128i(_mask), 7)); + uint8x16_t a = vreinterpretq_u8_m128i(_a); + uint8x16_t b = vreinterpretq_u8_m128i(_b); + return vreinterpretq_m128i_u8(vbslq_u8(mask, b, a)); +} + +// Blend packed double-precision (64-bit) floating-point elements from a and b +// using mask, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_pd +FORCE_INLINE __m128d _mm_blendv_pd(__m128d _a, __m128d _b, __m128d _mask) +{ + uint64x2_t mask = + vreinterpretq_u64_s64(vshrq_n_s64(vreinterpretq_s64_m128d(_mask), 63)); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + float64x2_t a = vreinterpretq_f64_m128d(_a); + float64x2_t b = vreinterpretq_f64_m128d(_b); + return vreinterpretq_m128d_f64(vbslq_f64(mask, b, a)); +#else + uint64x2_t a = vreinterpretq_u64_m128d(_a); + uint64x2_t b = vreinterpretq_u64_m128d(_b); + return vreinterpretq_m128d_u64(vbslq_u64(mask, b, a)); +#endif +} + +// Blend packed single-precision (32-bit) floating-point elements from a and b +// using mask, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_blendv_ps +FORCE_INLINE __m128 _mm_blendv_ps(__m128 _a, __m128 _b, __m128 _mask) +{ + // Use a signed shift right to create a mask with the sign bit + uint32x4_t mask = + vreinterpretq_u32_s32(vshrq_n_s32(vreinterpretq_s32_m128(_mask), 31)); + float32x4_t a = vreinterpretq_f32_m128(_a); + float32x4_t b = vreinterpretq_f32_m128(_b); + return vreinterpretq_m128_f32(vbslq_f32(mask, b, a)); +} + +// Round the packed double-precision (64-bit) floating-point elements in a up +// to an integer value, and store the results as packed double-precision +// floating-point elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_pd +FORCE_INLINE __m128d _mm_ceil_pd(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vrndpq_f64(vreinterpretq_f64_m128d(a))); +#else + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + return _mm_set_pd(ceil(a1), ceil(a0)); +#endif +} + +// Round the packed single-precision (32-bit) floating-point elements in a up to +// an integer value, and store the results as packed single-precision +// floating-point elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_ps +FORCE_INLINE __m128 _mm_ceil_ps(__m128 a) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + return vreinterpretq_m128_f32(vrndpq_f32(vreinterpretq_f32_m128(a))); +#else + float *f = (float *) &a; + return _mm_set_ps(ceilf(f[3]), ceilf(f[2]), ceilf(f[1]), ceilf(f[0])); +#endif +} + +// Round the lower double-precision (64-bit) floating-point element in b up to +// an integer value, store the result as a double-precision floating-point +// element in the lower element of dst, and copy the upper element from a to the +// upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_sd +FORCE_INLINE __m128d _mm_ceil_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_ceil_pd(b)); +} + +// Round the lower single-precision (32-bit) floating-point element in b up to +// an integer value, store the result as a single-precision floating-point +// element in the lower element of dst, and copy the upper 3 packed elements +// from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_ceil_ss +FORCE_INLINE __m128 _mm_ceil_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_ceil_ps(b)); +} + +// Compare packed 64-bit integers in a and b for equality, and store the results +// in dst +FORCE_INLINE __m128i _mm_cmpeq_epi64(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_u64( + vceqq_u64(vreinterpretq_u64_m128i(a), vreinterpretq_u64_m128i(b))); +#else + // ARMv7 lacks vceqq_u64 + // (a == b) -> (a_lo == b_lo) && (a_hi == b_hi) + uint32x4_t cmp = + vceqq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b)); + uint32x4_t swapped = vrev64q_u32(cmp); + return vreinterpretq_m128i_u32(vandq_u32(cmp, swapped)); +#endif +} + +// Sign extend packed 16-bit integers in a to packed 32-bit integers, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi16_epi32 +FORCE_INLINE __m128i _mm_cvtepi16_epi32(__m128i a) +{ + return vreinterpretq_m128i_s32( + vmovl_s16(vget_low_s16(vreinterpretq_s16_m128i(a)))); +} + +// Sign extend packed 16-bit integers in a to packed 64-bit integers, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi16_epi64 +FORCE_INLINE __m128i _mm_cvtepi16_epi64(__m128i a) +{ + int16x8_t s16x8 = vreinterpretq_s16_m128i(a); /* xxxx xxxx xxxx 0B0A */ + int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ + int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ + return vreinterpretq_m128i_s64(s64x2); +} + +// Sign extend packed 32-bit integers in a to packed 64-bit integers, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi32_epi64 +FORCE_INLINE __m128i _mm_cvtepi32_epi64(__m128i a) +{ + return vreinterpretq_m128i_s64( + vmovl_s32(vget_low_s32(vreinterpretq_s32_m128i(a)))); +} + +// Sign extend packed 8-bit integers in a to packed 16-bit integers, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi16 +FORCE_INLINE __m128i _mm_cvtepi8_epi16(__m128i a) +{ + int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ + int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ + return vreinterpretq_m128i_s16(s16x8); +} + +// Sign extend packed 8-bit integers in a to packed 32-bit integers, and store +// the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi32 +FORCE_INLINE __m128i _mm_cvtepi8_epi32(__m128i a) +{ + int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx DCBA */ + int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0D0C 0B0A */ + int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000D 000C 000B 000A */ + return vreinterpretq_m128i_s32(s32x4); +} + +// Sign extend packed 8-bit integers in the low 8 bytes of a to packed 64-bit +// integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepi8_epi64 +FORCE_INLINE __m128i _mm_cvtepi8_epi64(__m128i a) +{ + int8x16_t s8x16 = vreinterpretq_s8_m128i(a); /* xxxx xxxx xxxx xxBA */ + int16x8_t s16x8 = vmovl_s8(vget_low_s8(s8x16)); /* 0x0x 0x0x 0x0x 0B0A */ + int32x4_t s32x4 = vmovl_s16(vget_low_s16(s16x8)); /* 000x 000x 000B 000A */ + int64x2_t s64x2 = vmovl_s32(vget_low_s32(s32x4)); /* 0000 000B 0000 000A */ + return vreinterpretq_m128i_s64(s64x2); +} + +// Zero extend packed unsigned 16-bit integers in a to packed 32-bit integers, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu16_epi32 +FORCE_INLINE __m128i _mm_cvtepu16_epi32(__m128i a) +{ + return vreinterpretq_m128i_u32( + vmovl_u16(vget_low_u16(vreinterpretq_u16_m128i(a)))); +} + +// Zero extend packed unsigned 16-bit integers in a to packed 64-bit integers, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu16_epi64 +FORCE_INLINE __m128i _mm_cvtepu16_epi64(__m128i a) +{ + uint16x8_t u16x8 = vreinterpretq_u16_m128i(a); /* xxxx xxxx xxxx 0B0A */ + uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ + uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ + return vreinterpretq_m128i_u64(u64x2); +} + +// Zero extend packed unsigned 32-bit integers in a to packed 64-bit integers, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu32_epi64 +FORCE_INLINE __m128i _mm_cvtepu32_epi64(__m128i a) +{ + return vreinterpretq_m128i_u64( + vmovl_u32(vget_low_u32(vreinterpretq_u32_m128i(a)))); +} + +// Zero extend packed unsigned 8-bit integers in a to packed 16-bit integers, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi16 +FORCE_INLINE __m128i _mm_cvtepu8_epi16(__m128i a) +{ + uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx HGFE DCBA */ + uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0H0G 0F0E 0D0C 0B0A */ + return vreinterpretq_m128i_u16(u16x8); +} + +// Zero extend packed unsigned 8-bit integers in a to packed 32-bit integers, +// and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi32 +FORCE_INLINE __m128i _mm_cvtepu8_epi32(__m128i a) +{ + uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx DCBA */ + uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0D0C 0B0A */ + uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000D 000C 000B 000A */ + return vreinterpretq_m128i_u32(u32x4); +} + +// Zero extend packed unsigned 8-bit integers in the low 8 bytes of a to packed +// 64-bit integers, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cvtepu8_epi64 +FORCE_INLINE __m128i _mm_cvtepu8_epi64(__m128i a) +{ + uint8x16_t u8x16 = vreinterpretq_u8_m128i(a); /* xxxx xxxx xxxx xxBA */ + uint16x8_t u16x8 = vmovl_u8(vget_low_u8(u8x16)); /* 0x0x 0x0x 0x0x 0B0A */ + uint32x4_t u32x4 = vmovl_u16(vget_low_u16(u16x8)); /* 000x 000x 000B 000A */ + uint64x2_t u64x2 = vmovl_u32(vget_low_u32(u32x4)); /* 0000 000B 0000 000A */ + return vreinterpretq_m128i_u64(u64x2); +} + +// Conditionally multiply the packed double-precision (64-bit) floating-point +// elements in a and b using the high 4 bits in imm8, sum the four products, and +// conditionally store the sum in dst using the low 4 bits of imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_dp_pd +FORCE_INLINE __m128d _mm_dp_pd(__m128d a, __m128d b, const int imm) +{ + // Generate mask value from constant immediate bit value + const int64_t bit0Mask = imm & 0x01 ? UINT64_MAX : 0; + const int64_t bit1Mask = imm & 0x02 ? UINT64_MAX : 0; +#if !SSE2NEON_PRECISE_DP + const int64_t bit4Mask = imm & 0x10 ? UINT64_MAX : 0; + const int64_t bit5Mask = imm & 0x20 ? UINT64_MAX : 0; +#endif + // Conditional multiplication +#if !SSE2NEON_PRECISE_DP + __m128d mul = _mm_mul_pd(a, b); + const __m128d mulMask = + _mm_castsi128_pd(_mm_set_epi64x(bit5Mask, bit4Mask)); + __m128d tmp = _mm_and_pd(mul, mulMask); +#else +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + double d0 = (imm & 0x10) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 0) * + vgetq_lane_f64(vreinterpretq_f64_m128d(b), 0) + : 0; + double d1 = (imm & 0x20) ? vgetq_lane_f64(vreinterpretq_f64_m128d(a), 1) * + vgetq_lane_f64(vreinterpretq_f64_m128d(b), 1) + : 0; +#else + double a0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + double a1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + double b0 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 0)); + double b1 = + sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(b), 1)); + double d0 = (imm & 0x10) ? a0 * b0 : 0; + double d1 = (imm & 0x20) ? a1 * b1 : 0; +#endif + __m128d tmp = _mm_set_pd(d1, d0); +#endif + // Sum the products +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + double sum = vpaddd_f64(vreinterpretq_f64_m128d(tmp)); +#else + double _tmp0 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(tmp), 0)); + double _tmp1 = sse2neon_recast_u64_f64( + vgetq_lane_u64(vreinterpretq_u64_m128d(tmp), 1)); + double sum = _tmp0 + _tmp1; +#endif + // Conditionally store the sum + const __m128d sumMask = + _mm_castsi128_pd(_mm_set_epi64x(bit1Mask, bit0Mask)); + __m128d res = _mm_and_pd(_mm_set_pd1(sum), sumMask); + return res; +} + +// Conditionally multiply the packed single-precision (32-bit) floating-point +// elements in a and b using the high 4 bits in imm8, sum the four products, +// and conditionally store the sum in dst using the low 4 bits of imm. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_dp_ps +FORCE_INLINE __m128 _mm_dp_ps(__m128 a, __m128 b, const int imm) +{ + float32x4_t elementwise_prod = _mm_mul_ps(a, b); + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + /* shortcuts */ + if (imm == 0xFF) { + return _mm_set1_ps(vaddvq_f32(elementwise_prod)); + } + + if ((imm & 0x0F) == 0x0F) { + if (!(imm & (1 << 4))) + elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 0); + if (!(imm & (1 << 5))) + elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 1); + if (!(imm & (1 << 6))) + elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 2); + if (!(imm & (1 << 7))) + elementwise_prod = vsetq_lane_f32(0.0f, elementwise_prod, 3); + + return _mm_set1_ps(vaddvq_f32(elementwise_prod)); + } +#endif + + float s = 0.0f; + + if (imm & (1 << 4)) + s += vgetq_lane_f32(elementwise_prod, 0); + if (imm & (1 << 5)) + s += vgetq_lane_f32(elementwise_prod, 1); + if (imm & (1 << 6)) + s += vgetq_lane_f32(elementwise_prod, 2); + if (imm & (1 << 7)) + s += vgetq_lane_f32(elementwise_prod, 3); + + const float32_t res[4] = { + (imm & 0x1) ? s : 0.0f, + (imm & 0x2) ? s : 0.0f, + (imm & 0x4) ? s : 0.0f, + (imm & 0x8) ? s : 0.0f, + }; + return vreinterpretq_m128_f32(vld1q_f32(res)); +} + +// Extract a 32-bit integer from a, selected with imm8, and store the result in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi32 +// FORCE_INLINE int _mm_extract_epi32(__m128i a, __constrange(0,4) int imm) +#define _mm_extract_epi32(a, imm) \ + vgetq_lane_s32(vreinterpretq_s32_m128i(a), (imm)) + +// Extract a 64-bit integer from a, selected with imm8, and store the result in +// dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi64 +// FORCE_INLINE __int64 _mm_extract_epi64(__m128i a, __constrange(0,2) int imm) +#define _mm_extract_epi64(a, imm) \ + vgetq_lane_s64(vreinterpretq_s64_m128i(a), (imm)) + +// Extract an 8-bit integer from a, selected with imm8, and store the result in +// the lower element of dst. FORCE_INLINE int _mm_extract_epi8(__m128i a, +// __constrange(0,16) int imm) +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_extract_epi8 +#define _mm_extract_epi8(a, imm) vgetq_lane_u8(vreinterpretq_u8_m128i(a), (imm)) + +// Extracts the selected single-precision (32-bit) floating-point from a. +// FORCE_INLINE int _mm_extract_ps(__m128 a, __constrange(0,4) int imm) +#define _mm_extract_ps(a, imm) vgetq_lane_s32(vreinterpretq_s32_m128(a), (imm)) + +// Round the packed double-precision (64-bit) floating-point elements in a down +// to an integer value, and store the results as packed double-precision +// floating-point elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_pd +FORCE_INLINE __m128d _mm_floor_pd(__m128d a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128d_f64(vrndmq_f64(vreinterpretq_f64_m128d(a))); +#else + double a0, a1; + a0 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 0)); + a1 = sse2neon_recast_u64_f64(vgetq_lane_u64(vreinterpretq_u64_m128d(a), 1)); + return _mm_set_pd(floor(a1), floor(a0)); +#endif +} + +// Round the packed single-precision (32-bit) floating-point elements in a down +// to an integer value, and store the results as packed single-precision +// floating-point elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_ps +FORCE_INLINE __m128 _mm_floor_ps(__m128 a) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + return vreinterpretq_m128_f32(vrndmq_f32(vreinterpretq_f32_m128(a))); +#else + float *f = (float *) &a; + return _mm_set_ps(floorf(f[3]), floorf(f[2]), floorf(f[1]), floorf(f[0])); +#endif +} + +// Round the lower double-precision (64-bit) floating-point element in b down to +// an integer value, store the result as a double-precision floating-point +// element in the lower element of dst, and copy the upper element from a to the +// upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_sd +FORCE_INLINE __m128d _mm_floor_sd(__m128d a, __m128d b) +{ + return _mm_move_sd(a, _mm_floor_pd(b)); +} + +// Round the lower single-precision (32-bit) floating-point element in b down to +// an integer value, store the result as a single-precision floating-point +// element in the lower element of dst, and copy the upper 3 packed elements +// from a to the upper elements of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_floor_ss +FORCE_INLINE __m128 _mm_floor_ss(__m128 a, __m128 b) +{ + return _mm_move_ss(a, _mm_floor_ps(b)); +} + +// Copy a to dst, and insert the 32-bit integer i into dst at the location +// specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi32 +// FORCE_INLINE __m128i _mm_insert_epi32(__m128i a, int b, +// __constrange(0,4) int imm) +#define _mm_insert_epi32(a, b, imm) \ + vreinterpretq_m128i_s32( \ + vsetq_lane_s32((b), vreinterpretq_s32_m128i(a), (imm))) + +// Copy a to dst, and insert the 64-bit integer i into dst at the location +// specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi64 +// FORCE_INLINE __m128i _mm_insert_epi64(__m128i a, __int64 b, +// __constrange(0,2) int imm) +#define _mm_insert_epi64(a, b, imm) \ + vreinterpretq_m128i_s64( \ + vsetq_lane_s64((b), vreinterpretq_s64_m128i(a), (imm))) + +// Copy a to dst, and insert the lower 8-bit integer from i into dst at the +// location specified by imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_insert_epi8 +// FORCE_INLINE __m128i _mm_insert_epi8(__m128i a, int b, +// __constrange(0,16) int imm) +#define _mm_insert_epi8(a, b, imm) \ + vreinterpretq_m128i_s8(vsetq_lane_s8((b), vreinterpretq_s8_m128i(a), (imm))) + +// Copy a to tmp, then insert a single-precision (32-bit) floating-point +// element from b into tmp using the control in imm8. Store tmp to dst using +// the mask in imm8 (elements are zeroed out when the corresponding bit is set). +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=insert_ps +#define _mm_insert_ps(a, b, imm8) \ + _sse2neon_define2( \ + __m128, a, b, \ + float32x4_t tmp1 = \ + vsetq_lane_f32(vgetq_lane_f32(_b, ((imm8) >> 6) & 0x3), \ + vreinterpretq_f32_m128(_a), 0); \ + float32x4_t tmp2 = \ + vsetq_lane_f32(vgetq_lane_f32(tmp1, 0), \ + vreinterpretq_f32_m128(_a), (((imm8) >> 4) & 0x3)); \ + const uint32_t data[4] = \ + _sse2neon_init(((imm8) & (1 << 0)) ? UINT32_MAX : 0, \ + ((imm8) & (1 << 1)) ? UINT32_MAX : 0, \ + ((imm8) & (1 << 2)) ? UINT32_MAX : 0, \ + ((imm8) & (1 << 3)) ? UINT32_MAX : 0); \ + uint32x4_t mask = vld1q_u32(data); \ + float32x4_t all_zeros = vdupq_n_f32(0); \ + \ + _sse2neon_return(vreinterpretq_m128_f32( \ + vbslq_f32(mask, all_zeros, vreinterpretq_f32_m128(tmp2))));) + +// Compare packed signed 32-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi32 +FORCE_INLINE __m128i _mm_max_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vmaxq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compare packed signed 8-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epi8 +FORCE_INLINE __m128i _mm_max_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vmaxq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Compare packed unsigned 16-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu16 +FORCE_INLINE __m128i _mm_max_epu16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vmaxq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); +} + +// Compare packed unsigned 32-bit integers in a and b, and store packed maximum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu32 +FORCE_INLINE __m128i _mm_max_epu32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u32( + vmaxq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b))); +} + +// Compare packed signed 32-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi32 +FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vminq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Compare packed signed 8-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epi8 +FORCE_INLINE __m128i _mm_min_epi8(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s8( + vminq_s8(vreinterpretq_s8_m128i(a), vreinterpretq_s8_m128i(b))); +} + +// Compare packed unsigned 16-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_min_epu16 +FORCE_INLINE __m128i _mm_min_epu16(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vminq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b))); +} + +// Compare packed unsigned 32-bit integers in a and b, and store packed minimum +// values in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_max_epu32 +FORCE_INLINE __m128i _mm_min_epu32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u32( + vminq_u32(vreinterpretq_u32_m128i(a), vreinterpretq_u32_m128i(b))); +} + +// Horizontally compute the minimum amongst the packed unsigned 16-bit integers +// in a, store the minimum and index in dst, and zero the remaining bits in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_minpos_epu16 +FORCE_INLINE __m128i _mm_minpos_epu16(__m128i a) +{ + __m128i dst; + uint16_t min, idx = 0; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + // Find the minimum value + min = vminvq_u16(vreinterpretq_u16_m128i(a)); + + // Get the index of the minimum value + static const uint16_t idxv[] = {0, 1, 2, 3, 4, 5, 6, 7}; + uint16x8_t minv = vdupq_n_u16(min); + uint16x8_t cmeq = vceqq_u16(minv, vreinterpretq_u16_m128i(a)); + idx = vminvq_u16(vornq_u16(vld1q_u16(idxv), cmeq)); +#else + // Find the minimum value + __m64 tmp; + tmp = vreinterpret_m64_u16( + vmin_u16(vget_low_u16(vreinterpretq_u16_m128i(a)), + vget_high_u16(vreinterpretq_u16_m128i(a)))); + tmp = vreinterpret_m64_u16( + vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp))); + tmp = vreinterpret_m64_u16( + vpmin_u16(vreinterpret_u16_m64(tmp), vreinterpret_u16_m64(tmp))); + min = vget_lane_u16(vreinterpret_u16_m64(tmp), 0); + // Get the index of the minimum value + int i; + for (i = 0; i < 8; i++) { + if (min == vgetq_lane_u16(vreinterpretq_u16_m128i(a), 0)) { + idx = (uint16_t) i; + break; + } + a = _mm_srli_si128(a, 2); + } +#endif + // Generate result + dst = _mm_setzero_si128(); + dst = vreinterpretq_m128i_u16( + vsetq_lane_u16(min, vreinterpretq_u16_m128i(dst), 0)); + dst = vreinterpretq_m128i_u16( + vsetq_lane_u16(idx, vreinterpretq_u16_m128i(dst), 1)); + return dst; +} + +// Compute the sum of absolute differences (SADs) of quadruplets of unsigned +// 8-bit integers in a compared to those in b, and store the 16-bit results in +// dst. Eight SADs are performed using one quadruplet from b and eight +// quadruplets from a. One quadruplet is selected from b starting at on the +// offset specified in imm8. Eight quadruplets are formed from sequential 8-bit +// integers selected from a starting at the offset specified in imm8. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mpsadbw_epu8 +FORCE_INLINE __m128i _mm_mpsadbw_epu8(__m128i a, __m128i b, const int imm) +{ + uint8x16_t _a, _b; + + switch (imm & 0x4) { + case 0: + // do nothing + _a = vreinterpretq_u8_m128i(a); + break; + case 4: + _a = vreinterpretq_u8_u32(vextq_u32(vreinterpretq_u32_m128i(a), + vreinterpretq_u32_m128i(a), 1)); + break; + default: +#if defined(__GNUC__) || defined(__clang__) + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(0); +#endif + break; + } + + switch (imm & 0x3) { + case 0: + _b = vreinterpretq_u8_u32( + vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 0))); + break; + case 1: + _b = vreinterpretq_u8_u32( + vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 1))); + break; + case 2: + _b = vreinterpretq_u8_u32( + vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 2))); + break; + case 3: + _b = vreinterpretq_u8_u32( + vdupq_n_u32(vgetq_lane_u32(vreinterpretq_u32_m128i(b), 3))); + break; + default: +#if defined(__GNUC__) || defined(__clang__) + __builtin_unreachable(); +#elif defined(_MSC_VER) + __assume(0); +#endif + break; + } + + int16x8_t c04, c15, c26, c37; + uint8x8_t low_b = vget_low_u8(_b); + c04 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a), low_b)); + uint8x16_t _a_1 = vextq_u8(_a, _a, 1); + c15 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_1), low_b)); + uint8x16_t _a_2 = vextq_u8(_a, _a, 2); + c26 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_2), low_b)); + uint8x16_t _a_3 = vextq_u8(_a, _a, 3); + c37 = vreinterpretq_s16_u16(vabdl_u8(vget_low_u8(_a_3), low_b)); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + // |0|4|2|6| + c04 = vpaddq_s16(c04, c26); + // |1|5|3|7| + c15 = vpaddq_s16(c15, c37); + + int32x4_t trn1_c = + vtrn1q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15)); + int32x4_t trn2_c = + vtrn2q_s32(vreinterpretq_s32_s16(c04), vreinterpretq_s32_s16(c15)); + return vreinterpretq_m128i_s16(vpaddq_s16(vreinterpretq_s16_s32(trn1_c), + vreinterpretq_s16_s32(trn2_c))); +#else + int16x4_t c01, c23, c45, c67; + c01 = vpadd_s16(vget_low_s16(c04), vget_low_s16(c15)); + c23 = vpadd_s16(vget_low_s16(c26), vget_low_s16(c37)); + c45 = vpadd_s16(vget_high_s16(c04), vget_high_s16(c15)); + c67 = vpadd_s16(vget_high_s16(c26), vget_high_s16(c37)); + + return vreinterpretq_m128i_s16( + vcombine_s16(vpadd_s16(c01, c23), vpadd_s16(c45, c67))); +#endif +} + +// Multiply the low signed 32-bit integers from each packed 64-bit element in +// a and b, and store the signed 64-bit results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mul_epi32 +FORCE_INLINE __m128i _mm_mul_epi32(__m128i a, __m128i b) +{ + // vmull_s32 upcasts instead of masking, so we downcast. + int32x2_t a_lo = vmovn_s64(vreinterpretq_s64_m128i(a)); + int32x2_t b_lo = vmovn_s64(vreinterpretq_s64_m128i(b)); + return vreinterpretq_m128i_s64(vmull_s32(a_lo, b_lo)); +} + +// Multiply the packed 32-bit integers in a and b, producing intermediate 64-bit +// integers, and store the low 32 bits of the intermediate integers in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_mullo_epi32 +FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_s32( + vmulq_s32(vreinterpretq_s32_m128i(a), vreinterpretq_s32_m128i(b))); +} + +// Convert packed signed 32-bit integers from a and b to packed 16-bit integers +// using unsigned saturation, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_packus_epi32 +FORCE_INLINE __m128i _mm_packus_epi32(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u16( + vcombine_u16(vqmovun_s32(vreinterpretq_s32_m128i(a)), + vqmovun_s32(vreinterpretq_s32_m128i(b)))); +} + +// Round the packed double-precision (64-bit) floating-point elements in a using +// the rounding parameter, and store the results as packed double-precision +// floating-point elements in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_pd +FORCE_INLINE __m128d _mm_round_pd(__m128d a, int rounding) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + switch (rounding) { + case (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC): + return vreinterpretq_m128d_f64(vrndnq_f64(vreinterpretq_f64_m128d(a))); + case (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC): + return _mm_floor_pd(a); + case (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC): + return _mm_ceil_pd(a); + case (_MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC): + return vreinterpretq_m128d_f64(vrndq_f64(vreinterpretq_f64_m128d(a))); + default: //_MM_FROUND_CUR_DIRECTION + return vreinterpretq_m128d_f64(vrndiq_f64(vreinterpretq_f64_m128d(a))); + } +#else + double *v_double = (double *) &a; + + if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_NEAREST)) { + double res[2], tmp; + for (int i = 0; i < 2; i++) { + tmp = (v_double[i] < 0) ? -v_double[i] : v_double[i]; + double roundDown = floor(tmp); // Round down value + double roundUp = ceil(tmp); // Round up value + double diffDown = tmp - roundDown; + double diffUp = roundUp - tmp; + if (diffDown < diffUp) { + /* If it's closer to the round down value, then use it */ + res[i] = roundDown; + } else if (diffDown > diffUp) { + /* If it's closer to the round up value, then use it */ + res[i] = roundUp; + } else { + /* If it's equidistant between round up and round down value, + * pick the one which is an even number */ + double half = roundDown / 2; + if (half != floor(half)) { + /* If the round down value is odd, return the round up value + */ + res[i] = roundUp; + } else { + /* If the round up value is odd, return the round down value + */ + res[i] = roundDown; + } + } + res[i] = (v_double[i] < 0) ? -res[i] : res[i]; + } + return _mm_set_pd(res[1], res[0]); + } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_DOWN)) { + return _mm_floor_pd(a); + } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_UP)) { + return _mm_ceil_pd(a); + } + return _mm_set_pd(v_double[1] > 0 ? floor(v_double[1]) : ceil(v_double[1]), + v_double[0] > 0 ? floor(v_double[0]) : ceil(v_double[0])); +#endif +} + +// Round the packed single-precision (32-bit) floating-point elements in a using +// the rounding parameter, and store the results as packed single-precision +// floating-point elements in dst. +// software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_round_ps +FORCE_INLINE __m128 _mm_round_ps(__m128 a, int rounding) +{ +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__ARM_FEATURE_DIRECTED_ROUNDING) + switch (rounding) { + case (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC): + return vreinterpretq_m128_f32(vrndnq_f32(vreinterpretq_f32_m128(a))); + case (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC): + return _mm_floor_ps(a); + case (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC): + return _mm_ceil_ps(a); + case (_MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC): + return vreinterpretq_m128_f32(vrndq_f32(vreinterpretq_f32_m128(a))); + default: //_MM_FROUND_CUR_DIRECTION + return vreinterpretq_m128_f32(vrndiq_f32(vreinterpretq_f32_m128(a))); + } +#else + float *v_float = (float *) &a; + + if (rounding == (_MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_NEAREST)) { + uint32x4_t signmask = vdupq_n_u32(0x80000000); + float32x4_t half = vbslq_f32(signmask, vreinterpretq_f32_m128(a), + vdupq_n_f32(0.5f)); /* +/- 0.5 */ + int32x4_t r_normal = vcvtq_s32_f32(vaddq_f32( + vreinterpretq_f32_m128(a), half)); /* round to integer: [a + 0.5]*/ + int32x4_t r_trunc = vcvtq_s32_f32( + vreinterpretq_f32_m128(a)); /* truncate to integer: [a] */ + int32x4_t plusone = vreinterpretq_s32_u32(vshrq_n_u32( + vreinterpretq_u32_s32(vnegq_s32(r_trunc)), 31)); /* 1 or 0 */ + int32x4_t r_even = vbicq_s32(vaddq_s32(r_trunc, plusone), + vdupq_n_s32(1)); /* ([a] + {0,1}) & ~1 */ + float32x4_t delta = vsubq_f32( + vreinterpretq_f32_m128(a), + vcvtq_f32_s32(r_trunc)); /* compute delta: delta = (a - [a]) */ + uint32x4_t is_delta_half = + vceqq_f32(delta, half); /* delta == +/- 0.5 */ + return vreinterpretq_m128_f32( + vcvtq_f32_s32(vbslq_s32(is_delta_half, r_even, r_normal))); + } else if (rounding == (_MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_DOWN)) { + return _mm_floor_ps(a); + } else if (rounding == (_MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC) || + (rounding == _MM_FROUND_CUR_DIRECTION && + _MM_GET_ROUNDING_MODE() == _MM_ROUND_UP)) { + return _mm_ceil_ps(a); + } + return _mm_set_ps(v_float[3] > 0 ? floorf(v_float[3]) : ceilf(v_float[3]), + v_float[2] > 0 ? floorf(v_float[2]) : ceilf(v_float[2]), + v_float[1] > 0 ? floorf(v_float[1]) : ceilf(v_float[1]), + v_float[0] > 0 ? floorf(v_float[0]) : ceilf(v_float[0])); +#endif +} + +// Round the lower double-precision (64-bit) floating-point element in b using +// the rounding parameter, store the result as a double-precision floating-point +// element in the lower element of dst, and copy the upper element from a to the +// upper element of dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_sd +FORCE_INLINE __m128d _mm_round_sd(__m128d a, __m128d b, int rounding) +{ + return _mm_move_sd(a, _mm_round_pd(b, rounding)); +} + +// Round the lower single-precision (32-bit) floating-point element in b using +// the rounding parameter, store the result as a single-precision floating-point +// element in the lower element of dst, and copy the upper 3 packed elements +// from a to the upper elements of dst. Rounding is done according to the +// rounding[3:0] parameter, which can be one of: +// (_MM_FROUND_TO_NEAREST_INT |_MM_FROUND_NO_EXC) // round to nearest, and +// suppress exceptions +// (_MM_FROUND_TO_NEG_INF |_MM_FROUND_NO_EXC) // round down, and +// suppress exceptions +// (_MM_FROUND_TO_POS_INF |_MM_FROUND_NO_EXC) // round up, and suppress +// exceptions +// (_MM_FROUND_TO_ZERO |_MM_FROUND_NO_EXC) // truncate, and suppress +// exceptions _MM_FROUND_CUR_DIRECTION // use MXCSR.RC; see +// _MM_SET_ROUNDING_MODE +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_round_ss +FORCE_INLINE __m128 _mm_round_ss(__m128 a, __m128 b, int rounding) +{ + return _mm_move_ss(a, _mm_round_ps(b, rounding)); +} + +// Load 128-bits of integer data from memory into dst using a non-temporal +// memory hint. mem_addr must be aligned on a 16-byte boundary or a +// general-protection exception may be generated. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_stream_load_si128 +FORCE_INLINE __m128i _mm_stream_load_si128(__m128i *p) +{ +#if __has_builtin(__builtin_nontemporal_store) + return __builtin_nontemporal_load(p); +#else + return vreinterpretq_m128i_s64(vld1q_s64((int64_t *) p)); +#endif +} + +// Compute the bitwise NOT of a and then AND with a 128-bit vector containing +// all 1's, and return 1 if the result is zero, otherwise return 0. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_test_all_ones +FORCE_INLINE int _mm_test_all_ones(__m128i a) +{ + return (uint64_t) (vgetq_lane_s64(a, 0) & vgetq_lane_s64(a, 1)) == + ~(uint64_t) 0; +} + +// Compute the bitwise AND of 128 bits (representing integer data) in a and +// mask, and return 1 if the result is zero, otherwise return 0. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_test_all_zeros +FORCE_INLINE int _mm_test_all_zeros(__m128i a, __m128i mask) +{ + int64x2_t a_and_mask = + vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(mask)); + return !(vgetq_lane_s64(a_and_mask, 0) | vgetq_lane_s64(a_and_mask, 1)); +} + +// Compute the bitwise AND of 128 bits (representing integer data) in a and +// mask, and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute +// the bitwise NOT of a and then AND with mask, and set CF to 1 if the result is +// zero, otherwise set CF to 0. Return 1 if both the ZF and CF values are zero, +// otherwise return 0. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=mm_test_mix_ones_zero +// Note: Argument names may be wrong in the Intel intrinsics guide. +FORCE_INLINE int _mm_test_mix_ones_zeros(__m128i a, __m128i mask) +{ + uint64x2_t v = vreinterpretq_u64_m128i(a); + uint64x2_t m = vreinterpretq_u64_m128i(mask); + + // find ones (set-bits) and zeros (clear-bits) under clip mask + uint64x2_t ones = vandq_u64(m, v); + uint64x2_t zeros = vbicq_u64(m, v); + + // If both 128-bit variables are populated (non-zero) then return 1. + // For comparison purposes, first compact each var down to 32-bits. + uint32x2_t reduced = vpmax_u32(vqmovn_u64(ones), vqmovn_u64(zeros)); + + // if folding minimum is non-zero then both vars must be non-zero + return (vget_lane_u32(vpmin_u32(reduced, reduced), 0) != 0); +} + +// Compute the bitwise AND of 128 bits (representing integer data) in a and b, +// and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the +// bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, +// otherwise set CF to 0. Return the CF value. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testc_si128 +FORCE_INLINE int _mm_testc_si128(__m128i a, __m128i b) +{ + int64x2_t s64_vec = + vbicq_s64(vreinterpretq_s64_m128i(b), vreinterpretq_s64_m128i(a)); + return !(vgetq_lane_s64(s64_vec, 0) | vgetq_lane_s64(s64_vec, 1)); +} + +// Compute the bitwise AND of 128 bits (representing integer data) in a and b, +// and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the +// bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, +// otherwise set CF to 0. Return 1 if both the ZF and CF values are zero, +// otherwise return 0. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testnzc_si128 +#define _mm_testnzc_si128(a, b) _mm_test_mix_ones_zeros(a, b) + +// Compute the bitwise AND of 128 bits (representing integer data) in a and b, +// and set ZF to 1 if the result is zero, otherwise set ZF to 0. Compute the +// bitwise NOT of a and then AND with b, and set CF to 1 if the result is zero, +// otherwise set CF to 0. Return the ZF value. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_testz_si128 +FORCE_INLINE int _mm_testz_si128(__m128i a, __m128i b) +{ + int64x2_t s64_vec = + vandq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b)); + return !(vgetq_lane_s64(s64_vec, 0) | vgetq_lane_s64(s64_vec, 1)); +} + +/* SSE4.2 */ + +static const uint16_t ALIGN_STRUCT(16) _sse2neon_cmpestr_mask16b[8] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, +}; +static const uint8_t ALIGN_STRUCT(16) _sse2neon_cmpestr_mask8b[16] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, +}; + +/* specify the source data format */ +#define _SIDD_UBYTE_OPS 0x00 /* unsigned 8-bit characters */ +#define _SIDD_UWORD_OPS 0x01 /* unsigned 16-bit characters */ +#define _SIDD_SBYTE_OPS 0x02 /* signed 8-bit characters */ +#define _SIDD_SWORD_OPS 0x03 /* signed 16-bit characters */ + +/* specify the comparison operation */ +#define _SIDD_CMP_EQUAL_ANY 0x00 /* compare equal any: strchr */ +#define _SIDD_CMP_RANGES 0x04 /* compare ranges */ +#define _SIDD_CMP_EQUAL_EACH 0x08 /* compare equal each: strcmp */ +#define _SIDD_CMP_EQUAL_ORDERED 0x0C /* compare equal ordered */ + +/* specify the polarity */ +#define _SIDD_POSITIVE_POLARITY 0x00 +#define _SIDD_MASKED_POSITIVE_POLARITY 0x20 +#define _SIDD_NEGATIVE_POLARITY 0x10 /* negate results */ +#define _SIDD_MASKED_NEGATIVE_POLARITY \ + 0x30 /* negate results only before end of string */ + +/* specify the output selection in _mm_cmpXstri */ +#define _SIDD_LEAST_SIGNIFICANT 0x00 +#define _SIDD_MOST_SIGNIFICANT 0x40 + +/* specify the output selection in _mm_cmpXstrm */ +#define _SIDD_BIT_MASK 0x00 +#define _SIDD_UNIT_MASK 0x40 + +/* Pattern Matching for C macros. + * https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms + */ + +/* catenate */ +#define SSE2NEON_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__ +#define SSE2NEON_CAT(a, b) SSE2NEON_PRIMITIVE_CAT(a, b) + +#define SSE2NEON_IIF(c) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_IIF_, c) +/* run the 2nd parameter */ +#define SSE2NEON_IIF_0(t, ...) __VA_ARGS__ +/* run the 1st parameter */ +#define SSE2NEON_IIF_1(t, ...) t + +#define SSE2NEON_COMPL(b) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_COMPL_, b) +#define SSE2NEON_COMPL_0 1 +#define SSE2NEON_COMPL_1 0 + +#define SSE2NEON_DEC(x) SSE2NEON_PRIMITIVE_CAT(SSE2NEON_DEC_, x) +#define SSE2NEON_DEC_1 0 +#define SSE2NEON_DEC_2 1 +#define SSE2NEON_DEC_3 2 +#define SSE2NEON_DEC_4 3 +#define SSE2NEON_DEC_5 4 +#define SSE2NEON_DEC_6 5 +#define SSE2NEON_DEC_7 6 +#define SSE2NEON_DEC_8 7 +#define SSE2NEON_DEC_9 8 +#define SSE2NEON_DEC_10 9 +#define SSE2NEON_DEC_11 10 +#define SSE2NEON_DEC_12 11 +#define SSE2NEON_DEC_13 12 +#define SSE2NEON_DEC_14 13 +#define SSE2NEON_DEC_15 14 +#define SSE2NEON_DEC_16 15 + +/* detection */ +#define SSE2NEON_CHECK_N(x, n, ...) n +#define SSE2NEON_CHECK(...) SSE2NEON_CHECK_N(__VA_ARGS__, 0, ) +#define SSE2NEON_PROBE(x) x, 1, + +#define SSE2NEON_NOT(x) SSE2NEON_CHECK(SSE2NEON_PRIMITIVE_CAT(SSE2NEON_NOT_, x)) +#define SSE2NEON_NOT_0 SSE2NEON_PROBE(~) + +#define SSE2NEON_BOOL(x) SSE2NEON_COMPL(SSE2NEON_NOT(x)) +#define SSE2NEON_IF(c) SSE2NEON_IIF(SSE2NEON_BOOL(c)) + +#define SSE2NEON_EAT(...) +#define SSE2NEON_EXPAND(...) __VA_ARGS__ +#define SSE2NEON_WHEN(c) SSE2NEON_IF(c)(SSE2NEON_EXPAND, SSE2NEON_EAT) + +/* recursion */ +/* deferred expression */ +#define SSE2NEON_EMPTY() +#define SSE2NEON_DEFER(id) id SSE2NEON_EMPTY() +#define SSE2NEON_OBSTRUCT(...) __VA_ARGS__ SSE2NEON_DEFER(SSE2NEON_EMPTY)() +#define SSE2NEON_EXPAND(...) __VA_ARGS__ + +#define SSE2NEON_EVAL(...) \ + SSE2NEON_EVAL1(SSE2NEON_EVAL1(SSE2NEON_EVAL1(__VA_ARGS__))) +#define SSE2NEON_EVAL1(...) \ + SSE2NEON_EVAL2(SSE2NEON_EVAL2(SSE2NEON_EVAL2(__VA_ARGS__))) +#define SSE2NEON_EVAL2(...) \ + SSE2NEON_EVAL3(SSE2NEON_EVAL3(SSE2NEON_EVAL3(__VA_ARGS__))) +#define SSE2NEON_EVAL3(...) __VA_ARGS__ + +#define SSE2NEON_REPEAT(count, macro, ...) \ + SSE2NEON_WHEN(count) \ + (SSE2NEON_OBSTRUCT(SSE2NEON_REPEAT_INDIRECT)()( \ + SSE2NEON_DEC(count), macro, \ + __VA_ARGS__) SSE2NEON_OBSTRUCT(macro)(SSE2NEON_DEC(count), \ + __VA_ARGS__)) +#define SSE2NEON_REPEAT_INDIRECT() SSE2NEON_REPEAT + +#define SSE2NEON_SIZE_OF_byte 8 +#define SSE2NEON_NUMBER_OF_LANES_byte 16 +#define SSE2NEON_SIZE_OF_word 16 +#define SSE2NEON_NUMBER_OF_LANES_word 8 + +#define SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE(i, type) \ + mtx[i] = vreinterpretq_m128i_##type(vceqq_##type( \ + vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)), \ + vreinterpretq_##type##_m128i(a))); + +#define SSE2NEON_FILL_LANE(i, type) \ + vec_b[i] = \ + vdupq_n_##type(vgetq_lane_##type(vreinterpretq_##type##_m128i(b), i)); + +#define PCMPSTR_RANGES(a, b, mtx, data_type_prefix, type_prefix, size, \ + number_of_lanes, byte_or_word) \ + do { \ + SSE2NEON_CAT( \ + data_type_prefix, \ + SSE2NEON_CAT(size, \ + SSE2NEON_CAT(x, SSE2NEON_CAT(number_of_lanes, _t)))) \ + vec_b[number_of_lanes]; \ + __m128i mask = SSE2NEON_IIF(byte_or_word)( \ + vreinterpretq_m128i_u16(vdupq_n_u16(0xff)), \ + vreinterpretq_m128i_u32(vdupq_n_u32(0xffff))); \ + SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, SSE2NEON_FILL_LANE, \ + SSE2NEON_CAT(type_prefix, size))) \ + for (int i = 0; i < number_of_lanes; i++) { \ + mtx[i] = SSE2NEON_CAT(vreinterpretq_m128i_u, \ + size)(SSE2NEON_CAT(vbslq_u, size)( \ + SSE2NEON_CAT(vreinterpretq_u, \ + SSE2NEON_CAT(size, _m128i))(mask), \ + SSE2NEON_CAT(vcgeq_, SSE2NEON_CAT(type_prefix, size))( \ + vec_b[i], \ + SSE2NEON_CAT( \ + vreinterpretq_, \ + SSE2NEON_CAT(type_prefix, \ + SSE2NEON_CAT(size, _m128i(a))))), \ + SSE2NEON_CAT(vcleq_, SSE2NEON_CAT(type_prefix, size))( \ + vec_b[i], \ + SSE2NEON_CAT( \ + vreinterpretq_, \ + SSE2NEON_CAT(type_prefix, \ + SSE2NEON_CAT(size, _m128i(a))))))); \ + } \ + } while (0) + +#define PCMPSTR_EQ(a, b, mtx, size, number_of_lanes) \ + do { \ + SSE2NEON_EVAL(SSE2NEON_REPEAT(number_of_lanes, \ + SSE2NEON_COMPARE_EQUAL_THEN_FILL_LANE, \ + SSE2NEON_CAT(u, size))) \ + } while (0) + +#define SSE2NEON_CMP_EQUAL_ANY_IMPL(type) \ + static uint16_t _sse2neon_cmp_##type##_equal_any(__m128i a, int la, \ + __m128i b, int lb) \ + { \ + __m128i mtx[16]; \ + PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \ + return SSE2NEON_CAT( \ + _sse2neon_aggregate_equal_any_, \ + SSE2NEON_CAT( \ + SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \ + type))))(la, lb, mtx); \ + } + +#define SSE2NEON_CMP_RANGES_IMPL(type, data_type, us, byte_or_word) \ + static uint16_t _sse2neon_cmp_##us##type##_ranges(__m128i a, int la, \ + __m128i b, int lb) \ + { \ + __m128i mtx[16]; \ + PCMPSTR_RANGES( \ + a, b, mtx, data_type, us, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), byte_or_word); \ + return SSE2NEON_CAT( \ + _sse2neon_aggregate_ranges_, \ + SSE2NEON_CAT( \ + SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(x, SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, \ + type))))(la, lb, mtx); \ + } + +#define SSE2NEON_CMP_EQUAL_ORDERED_IMPL(type) \ + static uint16_t _sse2neon_cmp_##type##_equal_ordered(__m128i a, int la, \ + __m128i b, int lb) \ + { \ + __m128i mtx[16]; \ + PCMPSTR_EQ(a, b, mtx, SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type)); \ + return SSE2NEON_CAT( \ + _sse2neon_aggregate_equal_ordered_, \ + SSE2NEON_CAT( \ + SSE2NEON_CAT(SSE2NEON_SIZE_OF_, type), \ + SSE2NEON_CAT(x, \ + SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type))))( \ + SSE2NEON_CAT(SSE2NEON_NUMBER_OF_LANES_, type), la, lb, mtx); \ + } + +static uint16_t _sse2neon_aggregate_equal_any_8x16(int la, + int lb, + __m128i mtx[16]) +{ + uint16_t res = 0; + int m = (1 << la) - 1; + uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); + uint8x8_t t_lo = vtst_u8(vdup_n_u8((uint8_t) (m & 0xff)), vec_mask); + uint8x8_t t_hi = vtst_u8(vdup_n_u8((uint8_t) (m >> 8)), vec_mask); + uint8x16_t vec = vcombine_u8(t_lo, t_hi); + for (int j = 0; j < lb; j++) { + mtx[j] = vreinterpretq_m128i_u8( + vandq_u8(vec, vreinterpretq_u8_m128i(mtx[j]))); + mtx[j] = vreinterpretq_m128i_u8( + vshrq_n_u8(vreinterpretq_u8_m128i(mtx[j]), 7)); + uint16_t tmp = + _sse2neon_vaddvq_u8(vreinterpretq_u8_m128i(mtx[j])) ? 1 : 0; + res |= (tmp << j); + } + return res; +} + +static uint16_t _sse2neon_aggregate_equal_any_16x8(int la, + int lb, + __m128i mtx[16]) +{ + uint16_t res = 0; + uint16_t m = (uint16_t) (1 << la) - 1; + uint16x8_t vec = + vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b)); + for (int j = 0; j < lb; j++) { + mtx[j] = vreinterpretq_m128i_u16( + vandq_u16(vec, vreinterpretq_u16_m128i(mtx[j]))); + mtx[j] = vreinterpretq_m128i_u16( + vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 15)); + uint16_t tmp = + _sse2neon_vaddvq_u16(vreinterpretq_u16_m128i(mtx[j])) ? 1 : 0; + res |= (tmp << j); + } + return res; +} + +/* clang-format off */ +#define SSE2NEON_GENERATE_CMP_EQUAL_ANY(prefix) \ + prefix##IMPL(byte) \ + prefix##IMPL(word) +/* clang-format on */ + +SSE2NEON_GENERATE_CMP_EQUAL_ANY(SSE2NEON_CMP_EQUAL_ANY_) + +static uint16_t _sse2neon_aggregate_ranges_16x8(int la, int lb, __m128i mtx[16]) +{ + uint16_t res = 0; + uint16_t m = (uint16_t) (1 << la) - 1; + uint16x8_t vec = + vtstq_u16(vdupq_n_u16(m), vld1q_u16(_sse2neon_cmpestr_mask16b)); + for (int j = 0; j < lb; j++) { + mtx[j] = vreinterpretq_m128i_u16( + vandq_u16(vec, vreinterpretq_u16_m128i(mtx[j]))); + mtx[j] = vreinterpretq_m128i_u16( + vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 15)); + __m128i tmp = vreinterpretq_m128i_u32( + vshrq_n_u32(vreinterpretq_u32_m128i(mtx[j]), 16)); + uint32x4_t vec_res = vandq_u32(vreinterpretq_u32_m128i(mtx[j]), + vreinterpretq_u32_m128i(tmp)); +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint16_t t = vaddvq_u32(vec_res) ? 1 : 0; +#else + uint64x2_t sumh = vpaddlq_u32(vec_res); + uint16_t t = vgetq_lane_u64(sumh, 0) + vgetq_lane_u64(sumh, 1); +#endif + res |= (t << j); + } + return res; +} + +static uint16_t _sse2neon_aggregate_ranges_8x16(int la, int lb, __m128i mtx[16]) +{ + uint16_t res = 0; + uint16_t m = (uint16_t) ((1 << la) - 1); + uint8x8_t vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); + uint8x8_t t_lo = vtst_u8(vdup_n_u8((uint8_t) (m & 0xff)), vec_mask); + uint8x8_t t_hi = vtst_u8(vdup_n_u8((uint8_t) (m >> 8)), vec_mask); + uint8x16_t vec = vcombine_u8(t_lo, t_hi); + for (int j = 0; j < lb; j++) { + mtx[j] = vreinterpretq_m128i_u8( + vandq_u8(vec, vreinterpretq_u8_m128i(mtx[j]))); + mtx[j] = vreinterpretq_m128i_u8( + vshrq_n_u8(vreinterpretq_u8_m128i(mtx[j]), 7)); + __m128i tmp = vreinterpretq_m128i_u16( + vshrq_n_u16(vreinterpretq_u16_m128i(mtx[j]), 8)); + uint16x8_t vec_res = vandq_u16(vreinterpretq_u16_m128i(mtx[j]), + vreinterpretq_u16_m128i(tmp)); + uint16_t t = _sse2neon_vaddvq_u16(vec_res) ? 1 : 0; + res |= (t << j); + } + return res; +} + +#define SSE2NEON_CMP_RANGES_IS_BYTE 1 +#define SSE2NEON_CMP_RANGES_IS_WORD 0 + +/* clang-format off */ +#define SSE2NEON_GENERATE_CMP_RANGES(prefix) \ + prefix##IMPL(byte, uint, u, prefix##IS_BYTE) \ + prefix##IMPL(byte, int, s, prefix##IS_BYTE) \ + prefix##IMPL(word, uint, u, prefix##IS_WORD) \ + prefix##IMPL(word, int, s, prefix##IS_WORD) +/* clang-format on */ + +SSE2NEON_GENERATE_CMP_RANGES(SSE2NEON_CMP_RANGES_) + +#undef SSE2NEON_CMP_RANGES_IS_BYTE +#undef SSE2NEON_CMP_RANGES_IS_WORD + +static uint16_t _sse2neon_cmp_byte_equal_each(__m128i a, + int la, + __m128i b, + int lb) +{ + uint8x16_t mtx = + vceqq_u8(vreinterpretq_u8_m128i(a), vreinterpretq_u8_m128i(b)); + uint16_t m0 = (la < lb) ? 0 : (uint16_t) ((1 << la) - (1 << lb)); + uint16_t m1 = (uint16_t) (0x10000 - (1 << la)); + uint16_t tb = (uint16_t) (0x10000 - (1 << lb)); + uint8x8_t vec_mask, vec0_lo, vec0_hi, vec1_lo, vec1_hi; + uint8x8_t tmp_lo, tmp_hi, res_lo, res_hi; + vec_mask = vld1_u8(_sse2neon_cmpestr_mask8b); + vec0_lo = vtst_u8(vdup_n_u8((uint8_t) m0), vec_mask); + vec0_hi = vtst_u8(vdup_n_u8((uint8_t) (m0 >> 8)), vec_mask); + vec1_lo = vtst_u8(vdup_n_u8((uint8_t) m1), vec_mask); + vec1_hi = vtst_u8(vdup_n_u8((uint8_t) (m1 >> 8)), vec_mask); + tmp_lo = vtst_u8(vdup_n_u8((uint8_t) tb), vec_mask); + tmp_hi = vtst_u8(vdup_n_u8((uint8_t) (tb >> 8)), vec_mask); + + res_lo = vbsl_u8(vec0_lo, vdup_n_u8(0), vget_low_u8(mtx)); + res_hi = vbsl_u8(vec0_hi, vdup_n_u8(0), vget_high_u8(mtx)); + res_lo = vbsl_u8(vec1_lo, tmp_lo, res_lo); + res_hi = vbsl_u8(vec1_hi, tmp_hi, res_hi); + res_lo = vand_u8(res_lo, vec_mask); + res_hi = vand_u8(res_hi, vec_mask); + + return _sse2neon_vaddv_u8(res_lo) + + (uint16_t) (_sse2neon_vaddv_u8(res_hi) << 8); +} + +static uint16_t _sse2neon_cmp_word_equal_each(__m128i a, + int la, + __m128i b, + int lb) +{ + uint16x8_t mtx = + vceqq_u16(vreinterpretq_u16_m128i(a), vreinterpretq_u16_m128i(b)); + uint16_t m0 = (uint16_t) ((la < lb) ? 0 : ((1 << la) - (1 << lb))); + uint16_t m1 = (uint16_t) (0x100 - (1 << la)); + uint16_t tb = (uint16_t) (0x100 - (1 << lb)); + uint16x8_t vec_mask = vld1q_u16(_sse2neon_cmpestr_mask16b); + uint16x8_t vec0 = vtstq_u16(vdupq_n_u16(m0), vec_mask); + uint16x8_t vec1 = vtstq_u16(vdupq_n_u16(m1), vec_mask); + uint16x8_t tmp = vtstq_u16(vdupq_n_u16(tb), vec_mask); + mtx = vbslq_u16(vec0, vdupq_n_u16(0), mtx); + mtx = vbslq_u16(vec1, tmp, mtx); + mtx = vandq_u16(mtx, vec_mask); + return _sse2neon_vaddvq_u16(mtx); +} + +#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE 1 +#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD 0 + +#define SSE2NEON_AGGREGATE_EQUAL_ORDER_IMPL(size, number_of_lanes, data_type) \ + static uint16_t \ + _sse2neon_aggregate_equal_ordered_##size##x##number_of_lanes( \ + int bound, int la, int lb, __m128i mtx[16]) \ + { \ + uint16_t res = 0; \ + uint16_t m1 = \ + (uint16_t) (SSE2NEON_IIF(data_type)(0x10000, 0x100) - (1 << la)); \ + uint##size##x8_t vec_mask = SSE2NEON_IIF(data_type)( \ + vld1_u##size(_sse2neon_cmpestr_mask##size##b), \ + vld1q_u##size(_sse2neon_cmpestr_mask##size##b)); \ + uint##size##x##number_of_lanes##_t vec1 = SSE2NEON_IIF(data_type)( \ + vcombine_u##size( \ + vtst_u##size(vdup_n_u##size((uint##size##_t) m1), vec_mask), \ + vtst_u##size(vdup_n_u##size((uint##size##_t)(m1 >> 8)), \ + vec_mask)), \ + vtstq_u##size(vdupq_n_u##size((uint##size##_t) m1), vec_mask)); \ + uint##size##x##number_of_lanes##_t vec_minusone = vdupq_n_u##size(-1); \ + uint##size##x##number_of_lanes##_t vec_zero = vdupq_n_u##size(0); \ + for (int j = 0; j < lb; j++) { \ + mtx[j] = vreinterpretq_m128i_u##size(vbslq_u##size( \ + vec1, vec_minusone, vreinterpretq_u##size##_m128i(mtx[j]))); \ + } \ + for (int j = lb; j < bound; j++) { \ + mtx[j] = vreinterpretq_m128i_u##size( \ + vbslq_u##size(vec1, vec_minusone, vec_zero)); \ + } \ + unsigned SSE2NEON_IIF(data_type)(char, short) *ptr = \ + (unsigned SSE2NEON_IIF(data_type)(char, short) *) mtx; \ + for (int i = 0; i < bound; i++) { \ + int val = 1; \ + for (int j = 0, k = i; j < bound - i && k < bound; j++, k++) \ + val &= ptr[k * bound + j]; \ + res += (uint16_t) (val << i); \ + } \ + return res; \ + } + +/* clang-format off */ +#define SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(prefix) \ + prefix##IMPL(8, 16, prefix##IS_UBYTE) \ + prefix##IMPL(16, 8, prefix##IS_UWORD) +/* clang-format on */ + +SSE2NEON_GENERATE_AGGREGATE_EQUAL_ORDER(SSE2NEON_AGGREGATE_EQUAL_ORDER_) + +#undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UBYTE +#undef SSE2NEON_AGGREGATE_EQUAL_ORDER_IS_UWORD + +/* clang-format off */ +#define SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(prefix) \ + prefix##IMPL(byte) \ + prefix##IMPL(word) +/* clang-format on */ + +SSE2NEON_GENERATE_CMP_EQUAL_ORDERED(SSE2NEON_CMP_EQUAL_ORDERED_) + +#define SSE2NEON_CMPESTR_LIST \ + _(CMP_UBYTE_EQUAL_ANY, cmp_byte_equal_any) \ + _(CMP_UWORD_EQUAL_ANY, cmp_word_equal_any) \ + _(CMP_SBYTE_EQUAL_ANY, cmp_byte_equal_any) \ + _(CMP_SWORD_EQUAL_ANY, cmp_word_equal_any) \ + _(CMP_UBYTE_RANGES, cmp_ubyte_ranges) \ + _(CMP_UWORD_RANGES, cmp_uword_ranges) \ + _(CMP_SBYTE_RANGES, cmp_sbyte_ranges) \ + _(CMP_SWORD_RANGES, cmp_sword_ranges) \ + _(CMP_UBYTE_EQUAL_EACH, cmp_byte_equal_each) \ + _(CMP_UWORD_EQUAL_EACH, cmp_word_equal_each) \ + _(CMP_SBYTE_EQUAL_EACH, cmp_byte_equal_each) \ + _(CMP_SWORD_EQUAL_EACH, cmp_word_equal_each) \ + _(CMP_UBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \ + _(CMP_UWORD_EQUAL_ORDERED, cmp_word_equal_ordered) \ + _(CMP_SBYTE_EQUAL_ORDERED, cmp_byte_equal_ordered) \ + _(CMP_SWORD_EQUAL_ORDERED, cmp_word_equal_ordered) + +enum { +#define _(name, func_suffix) name, + SSE2NEON_CMPESTR_LIST +#undef _ +}; +typedef uint16_t (*cmpestr_func_t)(__m128i a, int la, __m128i b, int lb); +static cmpestr_func_t _sse2neon_cmpfunc_table[] = { +#define _(name, func_suffix) _sse2neon_##func_suffix, + SSE2NEON_CMPESTR_LIST +#undef _ +}; + +FORCE_INLINE uint16_t _sse2neon_sido_negative(int res, + int lb, + int imm8, + int bound) +{ + switch (imm8 & 0x30) { + case _SIDD_NEGATIVE_POLARITY: + res ^= 0xffffffff; + break; + case _SIDD_MASKED_NEGATIVE_POLARITY: + res ^= (1 << lb) - 1; + break; + default: + break; + } + + return (uint16_t) (res & ((bound == 8) ? 0xFF : 0xFFFF)); +} + +FORCE_INLINE int _sse2neon_clz(unsigned int x) +{ +#if defined(_MSC_VER) && !defined(__clang__) + unsigned long cnt = 0; + if (_BitScanReverse(&cnt, x)) + return 31 - cnt; + return 32; +#else + return x != 0 ? __builtin_clz(x) : 32; +#endif +} + +FORCE_INLINE int _sse2neon_ctz(unsigned int x) +{ +#if defined(_MSC_VER) && !defined(__clang__) + unsigned long cnt = 0; + if (_BitScanForward(&cnt, x)) + return cnt; + return 32; +#else + return x != 0 ? __builtin_ctz(x) : 32; +#endif +} + +FORCE_INLINE int _sse2neon_ctzll(unsigned long long x) +{ +#ifdef _MSC_VER + unsigned long cnt; +#if defined(SSE2NEON_HAS_BITSCAN64) + if (_BitScanForward64(&cnt, x)) + return (int) (cnt); +#else + if (_BitScanForward(&cnt, (unsigned long) (x))) + return (int) cnt; + if (_BitScanForward(&cnt, (unsigned long) (x >> 32))) + return (int) (cnt + 32); +#endif /* SSE2NEON_HAS_BITSCAN64 */ + return 64; +#else /* assume GNU compatible compilers */ + return x != 0 ? __builtin_ctzll(x) : 64; +#endif +} + +#define SSE2NEON_MIN(x, y) (x) < (y) ? (x) : (y) + +#define SSE2NEON_CMPSTR_SET_UPPER(var, imm) \ + const int var = ((imm) & 0x01) ? 8 : 16 + +#define SSE2NEON_CMPESTRX_LEN_PAIR(a, b, la, lb) \ + int tmp1 = la ^ (la >> 31); \ + la = tmp1 - (la >> 31); \ + int tmp2 = lb ^ (lb >> 31); \ + lb = tmp2 - (lb >> 31); \ + la = SSE2NEON_MIN(la, bound); \ + lb = SSE2NEON_MIN(lb, bound) + +// Compare all pairs of character in string a and b, +// then aggregate the result. +// As the only difference of PCMPESTR* and PCMPISTR* is the way to calculate the +// length of string, we use SSE2NEON_CMP{I,E}STRX_GET_LEN to get the length of +// string a and b. +#define SSE2NEON_COMP_AGG(a, b, la, lb, imm8, IE) \ + SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); \ + SSE2NEON_##IE##_LEN_PAIR(a, b, la, lb); \ + uint16_t r2 = (_sse2neon_cmpfunc_table[(imm8) & 0x0f])(a, la, b, lb); \ + r2 = _sse2neon_sido_negative(r2, lb, imm8, bound) + +#define SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8) \ + return (r2 == 0) ? bound \ + : (((imm8) & 0x40) ? (31 - _sse2neon_clz(r2)) \ + : _sse2neon_ctz(r2)) + +#define SSE2NEON_CMPSTR_GENERATE_MASK(dst) \ + __m128i dst = vreinterpretq_m128i_u8(vdupq_n_u8(0)); \ + if ((imm8) & 0x40) { \ + if (bound == 8) { \ + uint16x8_t tmp = vtstq_u16(vdupq_n_u16(r2), \ + vld1q_u16(_sse2neon_cmpestr_mask16b)); \ + dst = vreinterpretq_m128i_u16(vbslq_u16( \ + tmp, vdupq_n_u16(-1), vreinterpretq_u16_m128i(dst))); \ + } else { \ + uint8x16_t vec_r2 = vcombine_u8(vdup_n_u8((uint8_t) r2), \ + vdup_n_u8((uint8_t) (r2 >> 8))); \ + uint8x16_t tmp = \ + vtstq_u8(vec_r2, vld1q_u8(_sse2neon_cmpestr_mask8b)); \ + dst = vreinterpretq_m128i_u8( \ + vbslq_u8(tmp, vdupq_n_u8(-1), vreinterpretq_u8_m128i(dst))); \ + } \ + } else { \ + if (bound == 16) { \ + dst = vreinterpretq_m128i_u16( \ + vsetq_lane_u16(r2 & 0xffff, vreinterpretq_u16_m128i(dst), 0)); \ + } else { \ + dst = vreinterpretq_m128i_u8(vsetq_lane_u8( \ + (uint8_t) (r2 & 0xff), vreinterpretq_u8_m128i(dst), 0)); \ + } \ + } \ + return dst + +// Compare packed strings in a and b with lengths la and lb using the control +// in imm8, and returns 1 if b did not contain a null character and the +// resulting mask was zero, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestra +FORCE_INLINE int _mm_cmpestra(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + int lb_cpy = lb; + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); + return !r2 & (lb_cpy > bound); +} + +// Compare packed strings in a and b with lengths la and lb using the control in +// imm8, and returns 1 if the resulting mask was non-zero, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrc +FORCE_INLINE int _mm_cmpestrc(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); + return r2 != 0; +} + +// Compare packed strings in a and b with lengths la and lb using the control +// in imm8, and store the generated index in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestri +FORCE_INLINE int _mm_cmpestri(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); + SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8); +} + +// Compare packed strings in a and b with lengths la and lb using the control +// in imm8, and store the generated mask in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrm +FORCE_INLINE __m128i +_mm_cmpestrm(__m128i a, int la, __m128i b, int lb, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); + SSE2NEON_CMPSTR_GENERATE_MASK(dst); +} + +// Compare packed strings in a and b with lengths la and lb using the control in +// imm8, and returns bit 0 of the resulting bit mask. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestro +FORCE_INLINE int _mm_cmpestro(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPESTRX); + return r2 & 1; +} + +// Compare packed strings in a and b with lengths la and lb using the control in +// imm8, and returns 1 if any character in a was null, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrs +FORCE_INLINE int _mm_cmpestrs(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + (void) a; + (void) b; + (void) lb; + SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); + return la <= (bound - 1); +} + +// Compare packed strings in a and b with lengths la and lb using the control in +// imm8, and returns 1 if any character in b was null, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrz +FORCE_INLINE int _mm_cmpestrz(__m128i a, + int la, + __m128i b, + int lb, + const int imm8) +{ + (void) a; + (void) b; + (void) la; + SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); + return lb <= (bound - 1); +} + +#define SSE2NEON_CMPISTRX_LENGTH(str, len, imm8) \ + do { \ + if ((imm8) & 0x01) { \ + uint16x8_t equal_mask_##str = \ + vceqq_u16(vreinterpretq_u16_m128i(str), vdupq_n_u16(0)); \ + uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \ + uint64_t matches_##str = \ + vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \ + len = _sse2neon_ctzll(matches_##str) >> 3; \ + } else { \ + uint16x8_t equal_mask_##str = vreinterpretq_u16_u8( \ + vceqq_u8(vreinterpretq_u8_m128i(str), vdupq_n_u8(0))); \ + uint8x8_t res_##str = vshrn_n_u16(equal_mask_##str, 4); \ + uint64_t matches_##str = \ + vget_lane_u64(vreinterpret_u64_u8(res_##str), 0); \ + len = _sse2neon_ctzll(matches_##str) >> 2; \ + } \ + } while (0) + +#define SSE2NEON_CMPISTRX_LEN_PAIR(a, b, la, lb) \ + int la, lb; \ + do { \ + SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); \ + SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); \ + } while (0) + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and returns 1 if b did not contain a null character and the resulting +// mask was zero, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistra +FORCE_INLINE int _mm_cmpistra(__m128i a, __m128i b, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); + return !r2 & (lb >= bound); +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and returns 1 if the resulting mask was non-zero, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrc +FORCE_INLINE int _mm_cmpistrc(__m128i a, __m128i b, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); + return r2 != 0; +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and store the generated index in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistri +FORCE_INLINE int _mm_cmpistri(__m128i a, __m128i b, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); + SSE2NEON_CMPSTR_GENERATE_INDEX(r2, bound, imm8); +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and store the generated mask in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrm +FORCE_INLINE __m128i _mm_cmpistrm(__m128i a, __m128i b, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); + SSE2NEON_CMPSTR_GENERATE_MASK(dst); +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and returns bit 0 of the resulting bit mask. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistro +FORCE_INLINE int _mm_cmpistro(__m128i a, __m128i b, const int imm8) +{ + SSE2NEON_COMP_AGG(a, b, la, lb, imm8, CMPISTRX); + return r2 & 1; +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and returns 1 if any character in a was null, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrs +FORCE_INLINE int _mm_cmpistrs(__m128i a, __m128i b, const int imm8) +{ + (void) b; + SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); + int la; + SSE2NEON_CMPISTRX_LENGTH(a, la, imm8); + return la <= (bound - 1); +} + +// Compare packed strings with implicit lengths in a and b using the control in +// imm8, and returns 1 if any character in b was null, and 0 otherwise. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpistrz +FORCE_INLINE int _mm_cmpistrz(__m128i a, __m128i b, const int imm8) +{ + (void) a; + SSE2NEON_CMPSTR_SET_UPPER(bound, imm8); + int lb; + SSE2NEON_CMPISTRX_LENGTH(b, lb, imm8); + return lb <= (bound - 1); +} + +// Compares the 2 signed 64-bit integers in a and the 2 signed 64-bit integers +// in b for greater than. +FORCE_INLINE __m128i _mm_cmpgt_epi64(__m128i a, __m128i b) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + return vreinterpretq_m128i_u64( + vcgtq_s64(vreinterpretq_s64_m128i(a), vreinterpretq_s64_m128i(b))); +#else + return vreinterpretq_m128i_s64(vshrq_n_s64( + vqsubq_s64(vreinterpretq_s64_m128i(b), vreinterpretq_s64_m128i(a)), + 63)); +#endif +} + +// Starting with the initial value in crc, accumulates a CRC32 value for +// unsigned 16-bit integer v, and stores the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u16 +FORCE_INLINE uint32_t _mm_crc32_u16(uint32_t crc, uint16_t v) +{ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) + __asm__ __volatile__("crc32ch %w[c], %w[c], %w[v]\n\t" + : [c] "+r"(crc) + : [v] "r"(v)); +#elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ + ((defined(_M_ARM64) || defined(_M_ARM64EC)) && !defined(__clang__)) + crc = __crc32ch(crc, v); +#else + crc = _mm_crc32_u8(crc, (uint8_t) (v & 0xff)); + crc = _mm_crc32_u8(crc, (uint8_t) ((v >> 8) & 0xff)); +#endif + return crc; +} + +// Starting with the initial value in crc, accumulates a CRC32 value for +// unsigned 32-bit integer v, and stores the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u32 +FORCE_INLINE uint32_t _mm_crc32_u32(uint32_t crc, uint32_t v) +{ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) + __asm__ __volatile__("crc32cw %w[c], %w[c], %w[v]\n\t" + : [c] "+r"(crc) + : [v] "r"(v)); +#elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ + ((defined(_M_ARM64) || defined(_M_ARM64EC)) && !defined(__clang__)) + crc = __crc32cw(crc, v); +#else + crc = _mm_crc32_u16(crc, (uint16_t) (v & 0xffff)); + crc = _mm_crc32_u16(crc, (uint16_t) ((v >> 16) & 0xffff)); +#endif + return crc; +} + +// Starting with the initial value in crc, accumulates a CRC32 value for +// unsigned 64-bit integer v, and stores the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u64 +FORCE_INLINE uint64_t _mm_crc32_u64(uint64_t crc, uint64_t v) +{ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) + __asm__ __volatile__("crc32cx %w[c], %w[c], %x[v]\n\t" + : [c] "+r"(crc) + : [v] "r"(v)); +#elif ((defined(_M_ARM64) || defined(_M_ARM64EC)) && !defined(__clang__)) + crc = __crc32cd((uint32_t) crc, v); +#else + crc = _mm_crc32_u32((uint32_t) (crc), (uint32_t) (v & 0xffffffff)); + crc = _mm_crc32_u32((uint32_t) (crc), (uint32_t) ((v >> 32) & 0xffffffff)); +#endif + return crc; +} + +// Starting with the initial value in crc, accumulates a CRC32 value for +// unsigned 8-bit integer v, and stores the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u8 +FORCE_INLINE uint32_t _mm_crc32_u8(uint32_t crc, uint8_t v) +{ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) + __asm__ __volatile__("crc32cb %w[c], %w[c], %w[v]\n\t" + : [c] "+r"(crc) + : [v] "r"(v)); +#elif ((__ARM_ARCH == 8) && defined(__ARM_FEATURE_CRC32)) || \ + ((defined(_M_ARM64) || defined(_M_ARM64EC)) && !defined(__clang__)) + crc = __crc32cb(crc, v); +#else + crc ^= v; +#if defined(__ARM_FEATURE_CRYPTO) + // Adapted from: https://mary.rs/lab/crc32/ + // Barrent reduction + uint64x2_t orig = + vcombine_u64(vcreate_u64((uint64_t) (crc) << 24), vcreate_u64(0x0)); + uint64x2_t tmp = orig; + + // Polynomial P(x) of CRC32C + uint64_t p = 0x105EC76F1; + // Barrett Reduction (in bit-reflected form) constant mu_{64} = \lfloor + // 2^{64} / P(x) \rfloor = 0x11f91caf6 + uint64_t mu = 0x1dea713f1; + + // Multiply by mu_{64} + tmp = _sse2neon_vmull_p64(vget_low_u64(tmp), vcreate_u64(mu)); + // Divide by 2^{64} (mask away the unnecessary bits) + tmp = + vandq_u64(tmp, vcombine_u64(vcreate_u64(0xFFFFFFFF), vcreate_u64(0x0))); + // Multiply by P(x) (shifted left by 1 for alignment reasons) + tmp = _sse2neon_vmull_p64(vget_low_u64(tmp), vcreate_u64(p)); + // Subtract original from result + tmp = veorq_u64(tmp, orig); + + // Extract the 'lower' (in bit-reflected sense) 32 bits + crc = vgetq_lane_u32(vreinterpretq_u32_u64(tmp), 1); +#else // Fall back to the generic table lookup approach + // Adapted from: https://create.stephan-brumme.com/crc32/ + // Apply half-byte comparison algorithm for the best ratio between + // performance and lookup table. + + // The lookup table just needs to store every 16th entry + // of the standard look-up table. + static const uint32_t crc32_half_byte_tbl[] = { + 0x00000000, 0x105ec76f, 0x20bd8ede, 0x30e349b1, 0x417b1dbc, 0x5125dad3, + 0x61c69362, 0x7198540d, 0x82f63b78, 0x92a8fc17, 0xa24bb5a6, 0xb21572c9, + 0xc38d26c4, 0xd3d3e1ab, 0xe330a81a, 0xf36e6f75, + }; + + crc = (crc >> 4) ^ crc32_half_byte_tbl[crc & 0x0F]; + crc = (crc >> 4) ^ crc32_half_byte_tbl[crc & 0x0F]; +#endif +#endif + return crc; +} + +/* AES */ + +#if !defined(__ARM_FEATURE_CRYPTO) && \ + ((!defined(_M_ARM64) && !defined(_M_ARM64EC)) || defined(__clang__)) +/* clang-format off */ +#define SSE2NEON_AES_SBOX(w) \ + { \ + w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), \ + w(0xc5), w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), \ + w(0xab), w(0x76), w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), \ + w(0x59), w(0x47), w(0xf0), w(0xad), w(0xd4), w(0xa2), w(0xaf), \ + w(0x9c), w(0xa4), w(0x72), w(0xc0), w(0xb7), w(0xfd), w(0x93), \ + w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc), w(0x34), w(0xa5), \ + w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15), w(0x04), \ + w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a), \ + w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), \ + w(0x75), w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), \ + w(0x5a), w(0xa0), w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), \ + w(0xe3), w(0x2f), w(0x84), w(0x53), w(0xd1), w(0x00), w(0xed), \ + w(0x20), w(0xfc), w(0xb1), w(0x5b), w(0x6a), w(0xcb), w(0xbe), \ + w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf), w(0xd0), w(0xef), \ + w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85), w(0x45), \ + w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8), \ + w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), \ + w(0xf5), w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), \ + w(0xf3), w(0xd2), w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), \ + w(0x97), w(0x44), w(0x17), w(0xc4), w(0xa7), w(0x7e), w(0x3d), \ + w(0x64), w(0x5d), w(0x19), w(0x73), w(0x60), w(0x81), w(0x4f), \ + w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88), w(0x46), w(0xee), \ + w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb), w(0xe0), \ + w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c), \ + w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), \ + w(0x79), w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), \ + w(0x4e), w(0xa9), w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), \ + w(0x7a), w(0xae), w(0x08), w(0xba), w(0x78), w(0x25), w(0x2e), \ + w(0x1c), w(0xa6), w(0xb4), w(0xc6), w(0xe8), w(0xdd), w(0x74), \ + w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a), w(0x70), w(0x3e), \ + w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e), w(0x61), \ + w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e), \ + w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), \ + w(0x94), w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), \ + w(0x28), w(0xdf), w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), \ + w(0xe6), w(0x42), w(0x68), w(0x41), w(0x99), w(0x2d), w(0x0f), \ + w(0xb0), w(0x54), w(0xbb), w(0x16) \ + } +#define SSE2NEON_AES_RSBOX(w) \ + { \ + w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), \ + w(0x38), w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), \ + w(0xd7), w(0xfb), w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), \ + w(0x2f), w(0xff), w(0x87), w(0x34), w(0x8e), w(0x43), w(0x44), \ + w(0xc4), w(0xde), w(0xe9), w(0xcb), w(0x54), w(0x7b), w(0x94), \ + w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d), w(0xee), w(0x4c), \ + w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e), w(0x08), \ + w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2), \ + w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), \ + w(0x25), w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), \ + w(0x98), w(0x16), w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), \ + w(0x65), w(0xb6), w(0x92), w(0x6c), w(0x70), w(0x48), w(0x50), \ + w(0xfd), w(0xed), w(0xb9), w(0xda), w(0x5e), w(0x15), w(0x46), \ + w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84), w(0x90), w(0xd8), \ + w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a), w(0xf7), \ + w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06), \ + w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), \ + w(0x02), w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), \ + w(0x8a), w(0x6b), w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), \ + w(0x67), w(0xdc), w(0xea), w(0x97), w(0xf2), w(0xcf), w(0xce), \ + w(0xf0), w(0xb4), w(0xe6), w(0x73), w(0x96), w(0xac), w(0x74), \ + w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85), w(0xe2), w(0xf9), \ + w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e), w(0x47), \ + w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89), \ + w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), \ + w(0x1b), w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), \ + w(0x79), w(0x20), w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), \ + w(0xcd), w(0x5a), w(0xf4), w(0x1f), w(0xdd), w(0xa8), w(0x33), \ + w(0x88), w(0x07), w(0xc7), w(0x31), w(0xb1), w(0x12), w(0x10), \ + w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f), w(0x60), w(0x51), \ + w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d), w(0x2d), \ + w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef), \ + w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), \ + w(0xb0), w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), \ + w(0x99), w(0x61), w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), \ + w(0x77), w(0xd6), w(0x26), w(0xe1), w(0x69), w(0x14), w(0x63), \ + w(0x55), w(0x21), w(0x0c), w(0x7d) \ + } +/* clang-format on */ + +/* X Macro trick. See https://en.wikipedia.org/wiki/X_Macro */ +#define SSE2NEON_AES_H0(x) (x) +static const uint8_t _sse2neon_sbox[256] = SSE2NEON_AES_SBOX(SSE2NEON_AES_H0); +static const uint8_t _sse2neon_rsbox[256] = SSE2NEON_AES_RSBOX(SSE2NEON_AES_H0); +#undef SSE2NEON_AES_H0 + +/* x_time function and matrix multiply function */ +#if !defined(__aarch64__) +#define SSE2NEON_XT(x) (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b)) +#define SSE2NEON_MULTIPLY(x, y) \ + (((y & 1) * x) ^ ((y >> 1 & 1) * SSE2NEON_XT(x)) ^ \ + ((y >> 2 & 1) * SSE2NEON_XT(SSE2NEON_XT(x))) ^ \ + ((y >> 3 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))) ^ \ + ((y >> 4 & 1) * SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(SSE2NEON_XT(x)))))) +#endif + +// In the absence of crypto extensions, implement aesenc using regular NEON +// intrinsics instead. See: +// https://www.workofard.com/2017/01/accelerated-aes-for-the-arm64-linux-kernel/ +// https://www.workofard.com/2017/07/ghash-for-low-end-cores/ and +// for more information. +FORCE_INLINE __m128i _mm_aesenc_si128(__m128i a, __m128i RoundKey) +{ +#if defined(__aarch64__) + static const uint8_t shift_rows[] = { + 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3, + 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb, + }; + static const uint8_t ror32by8[] = { + 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, + 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, + }; + + uint8x16_t v; + uint8x16_t w = vreinterpretq_u8_m128i(a); + + /* shift rows */ + w = vqtbl1q_u8(w, vld1q_u8(shift_rows)); + + /* sub bytes */ + // Here, we separate the whole 256-bytes table into 4 64-bytes tables, and + // look up each of the table. After each lookup, we load the next table + // which locates at the next 64-bytes. In the meantime, the index in the + // table would be smaller than it was, so the index parameters of + // `vqtbx4q_u8()` need to be added the same constant as the loaded tables. + v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w); + // 'w-0x40' equals to 'vsubq_u8(w, vdupq_n_u8(0x40))' + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0); + + /* mix columns */ + w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); + w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); + w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); + + /* add round key */ + return vreinterpretq_m128i_u8(w) ^ RoundKey; + +#else /* ARMv7-A implementation for a table-based AES */ +#define SSE2NEON_AES_B2W(b0, b1, b2, b3) \ + (((uint32_t) (b3) << 24) | ((uint32_t) (b2) << 16) | \ + ((uint32_t) (b1) << 8) | (uint32_t) (b0)) +// multiplying 'x' by 2 in GF(2^8) +#define SSE2NEON_AES_F2(x) ((x << 1) ^ (((x >> 7) & 1) * 0x011b /* WPOLY */)) +// multiplying 'x' by 3 in GF(2^8) +#define SSE2NEON_AES_F3(x) (SSE2NEON_AES_F2(x) ^ x) +#define SSE2NEON_AES_U0(p) \ + SSE2NEON_AES_B2W(SSE2NEON_AES_F2(p), p, p, SSE2NEON_AES_F3(p)) +#define SSE2NEON_AES_U1(p) \ + SSE2NEON_AES_B2W(SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p, p) +#define SSE2NEON_AES_U2(p) \ + SSE2NEON_AES_B2W(p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p), p) +#define SSE2NEON_AES_U3(p) \ + SSE2NEON_AES_B2W(p, p, SSE2NEON_AES_F3(p), SSE2NEON_AES_F2(p)) + + // this generates a table containing every possible permutation of + // shift_rows() and sub_bytes() with mix_columns(). + static const uint32_t ALIGN_STRUCT(16) aes_table[4][256] = { + SSE2NEON_AES_SBOX(SSE2NEON_AES_U0), + SSE2NEON_AES_SBOX(SSE2NEON_AES_U1), + SSE2NEON_AES_SBOX(SSE2NEON_AES_U2), + SSE2NEON_AES_SBOX(SSE2NEON_AES_U3), + }; +#undef SSE2NEON_AES_B2W +#undef SSE2NEON_AES_F2 +#undef SSE2NEON_AES_F3 +#undef SSE2NEON_AES_U0 +#undef SSE2NEON_AES_U1 +#undef SSE2NEON_AES_U2 +#undef SSE2NEON_AES_U3 + + uint32_t x0 = _mm_cvtsi128_si32(a); // get a[31:0] + uint32_t x1 = + _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55)); // get a[63:32] + uint32_t x2 = + _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xAA)); // get a[95:64] + uint32_t x3 = + _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF)); // get a[127:96] + + // finish the modulo addition step in mix_columns() + __m128i out = _mm_set_epi32( + (aes_table[0][x3 & 0xff] ^ aes_table[1][(x0 >> 8) & 0xff] ^ + aes_table[2][(x1 >> 16) & 0xff] ^ aes_table[3][x2 >> 24]), + (aes_table[0][x2 & 0xff] ^ aes_table[1][(x3 >> 8) & 0xff] ^ + aes_table[2][(x0 >> 16) & 0xff] ^ aes_table[3][x1 >> 24]), + (aes_table[0][x1 & 0xff] ^ aes_table[1][(x2 >> 8) & 0xff] ^ + aes_table[2][(x3 >> 16) & 0xff] ^ aes_table[3][x0 >> 24]), + (aes_table[0][x0 & 0xff] ^ aes_table[1][(x1 >> 8) & 0xff] ^ + aes_table[2][(x2 >> 16) & 0xff] ^ aes_table[3][x3 >> 24])); + + return _mm_xor_si128(out, RoundKey); +#endif +} + +// Perform one round of an AES decryption flow on data (state) in a using the +// round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdec_si128 +FORCE_INLINE __m128i _mm_aesdec_si128(__m128i a, __m128i RoundKey) +{ +#if defined(__aarch64__) + static const uint8_t inv_shift_rows[] = { + 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb, + 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3, + }; + static const uint8_t ror32by8[] = { + 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, + 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, + }; + + uint8x16_t v; + uint8x16_t w = vreinterpretq_u8_m128i(a); + + // inverse shift rows + w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows)); + + // inverse sub bytes + v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0); + + // inverse mix columns + // multiplying 'v' by 4 in GF(2^8) + w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); + w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b); + v ^= w; + v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w); + + w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & + 0x1b); // multiplying 'v' by 2 in GF(2^8) + w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); + w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); + + // add round key + return vreinterpretq_m128i_u8(w) ^ RoundKey; + +#else /* ARMv7-A NEON implementation */ + /* FIXME: optimized for NEON */ + uint8_t i, e, f, g, h, v[4][4]; + uint8_t *_a = (uint8_t *) &a; + for (i = 0; i < 16; ++i) { + v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]]; + } + + // inverse mix columns + for (i = 0; i < 4; ++i) { + e = v[i][0]; + f = v[i][1]; + g = v[i][2]; + h = v[i][3]; + + v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^ + SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09); + v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^ + SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d); + v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^ + SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b); + v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^ + SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e); + } + + return _mm_xor_si128(vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)), + RoundKey); +#endif +} + +// Perform the last round of an AES encryption flow on data (state) in a using +// the round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesenclast_si128 +FORCE_INLINE __m128i _mm_aesenclast_si128(__m128i a, __m128i RoundKey) +{ +#if defined(__aarch64__) + static const uint8_t shift_rows[] = { + 0x0, 0x5, 0xa, 0xf, 0x4, 0x9, 0xe, 0x3, + 0x8, 0xd, 0x2, 0x7, 0xc, 0x1, 0x6, 0xb, + }; + + uint8x16_t v; + uint8x16_t w = vreinterpretq_u8_m128i(a); + + // shift rows + w = vqtbl1q_u8(w, vld1q_u8(shift_rows)); + + // sub bytes + v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), w); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), w - 0x40); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), w - 0x80); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), w - 0xc0); + + // add round key + return vreinterpretq_m128i_u8(v) ^ RoundKey; + +#else /* ARMv7-A implementation */ + uint8_t v[16] = { + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 0)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 5)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 10)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 15)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 4)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 9)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 14)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 3)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 8)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 13)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 2)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 7)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 12)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 1)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 6)], + _sse2neon_sbox[vgetq_lane_u8(vreinterpretq_u8_m128i(a), 11)], + }; + + return _mm_xor_si128(vreinterpretq_m128i_u8(vld1q_u8(v)), RoundKey); +#endif +} + +// Perform the last round of an AES decryption flow on data (state) in a using +// the round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdeclast_si128 +FORCE_INLINE __m128i _mm_aesdeclast_si128(__m128i a, __m128i RoundKey) +{ +#if defined(__aarch64__) + static const uint8_t inv_shift_rows[] = { + 0x0, 0xd, 0xa, 0x7, 0x4, 0x1, 0xe, 0xb, + 0x8, 0x5, 0x2, 0xf, 0xc, 0x9, 0x6, 0x3, + }; + + uint8x16_t v; + uint8x16_t w = vreinterpretq_u8_m128i(a); + + // inverse shift rows + w = vqtbl1q_u8(w, vld1q_u8(inv_shift_rows)); + + // inverse sub bytes + v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_rsbox), w); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x40), w - 0x40); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0x80), w - 0x80); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_rsbox + 0xc0), w - 0xc0); + + // add round key + return vreinterpretq_m128i_u8(v) ^ RoundKey; + +#else /* ARMv7-A NEON implementation */ + /* FIXME: optimized for NEON */ + uint8_t v[4][4]; + uint8_t *_a = (uint8_t *) &a; + for (int i = 0; i < 16; ++i) { + v[((i / 4) + (i % 4)) % 4][i % 4] = _sse2neon_rsbox[_a[i]]; + } + + return _mm_xor_si128(vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)), + RoundKey); +#endif +} + +// Perform the InvMixColumns transformation on a and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesimc_si128 +FORCE_INLINE __m128i _mm_aesimc_si128(__m128i a) +{ +#if defined(__aarch64__) + static const uint8_t ror32by8[] = { + 0x1, 0x2, 0x3, 0x0, 0x5, 0x6, 0x7, 0x4, + 0x9, 0xa, 0xb, 0x8, 0xd, 0xe, 0xf, 0xc, + }; + uint8x16_t v = vreinterpretq_u8_m128i(a); + uint8x16_t w; + + // multiplying 'v' by 4 in GF(2^8) + w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); + w = (w << 1) ^ (uint8x16_t) (((int8x16_t) w >> 7) & 0x1b); + v ^= w; + v ^= (uint8x16_t) vrev32q_u16((uint16x8_t) w); + + // multiplying 'v' by 2 in GF(2^8) + w = (v << 1) ^ (uint8x16_t) (((int8x16_t) v >> 7) & 0x1b); + w ^= (uint8x16_t) vrev32q_u16((uint16x8_t) v); + w ^= vqtbl1q_u8(v ^ w, vld1q_u8(ror32by8)); + return vreinterpretq_m128i_u8(w); + +#else /* ARMv7-A NEON implementation */ + uint8_t i, e, f, g, h, v[4][4]; + vst1q_u8((uint8_t *) v, vreinterpretq_u8_m128i(a)); + for (i = 0; i < 4; ++i) { + e = v[i][0]; + f = v[i][1]; + g = v[i][2]; + h = v[i][3]; + + v[i][0] = SSE2NEON_MULTIPLY(e, 0x0e) ^ SSE2NEON_MULTIPLY(f, 0x0b) ^ + SSE2NEON_MULTIPLY(g, 0x0d) ^ SSE2NEON_MULTIPLY(h, 0x09); + v[i][1] = SSE2NEON_MULTIPLY(e, 0x09) ^ SSE2NEON_MULTIPLY(f, 0x0e) ^ + SSE2NEON_MULTIPLY(g, 0x0b) ^ SSE2NEON_MULTIPLY(h, 0x0d); + v[i][2] = SSE2NEON_MULTIPLY(e, 0x0d) ^ SSE2NEON_MULTIPLY(f, 0x09) ^ + SSE2NEON_MULTIPLY(g, 0x0e) ^ SSE2NEON_MULTIPLY(h, 0x0b); + v[i][3] = SSE2NEON_MULTIPLY(e, 0x0b) ^ SSE2NEON_MULTIPLY(f, 0x0d) ^ + SSE2NEON_MULTIPLY(g, 0x09) ^ SSE2NEON_MULTIPLY(h, 0x0e); + } + + return vreinterpretq_m128i_u8(vld1q_u8((uint8_t *) v)); +#endif +} + +// Assist in expanding the AES cipher key by computing steps towards generating +// a round key for encryption cipher using data from a and an 8-bit round +// constant specified in imm8, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aeskeygenassist_si128 +// +// Emits the Advanced Encryption Standard (AES) instruction aeskeygenassist. +// This instruction generates a round key for AES encryption. See +// https://kazakov.life/2017/11/01/cryptocurrency-mining-on-ios-devices/ +// for details. +FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon) +{ +#if defined(__aarch64__) + uint8x16_t _a = vreinterpretq_u8_m128i(a); + uint8x16_t v = vqtbl4q_u8(_sse2neon_vld1q_u8_x4(_sse2neon_sbox), _a); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x40), _a - 0x40); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0x80), _a - 0x80); + v = vqtbx4q_u8(v, _sse2neon_vld1q_u8_x4(_sse2neon_sbox + 0xc0), _a - 0xc0); + + uint32x4_t v_u32 = vreinterpretq_u32_u8(v); + uint32x4_t ror_v = vorrq_u32(vshrq_n_u32(v_u32, 8), vshlq_n_u32(v_u32, 24)); + uint32x4_t ror_xor_v = veorq_u32(ror_v, vdupq_n_u32(rcon)); + + return vreinterpretq_m128i_u32(vtrn2q_u32(v_u32, ror_xor_v)); + +#else /* ARMv7-A NEON implementation */ + uint32_t X1 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0x55)); + uint32_t X3 = _mm_cvtsi128_si32(_mm_shuffle_epi32(a, 0xFF)); + for (int i = 0; i < 4; ++i) { + ((uint8_t *) &X1)[i] = _sse2neon_sbox[((uint8_t *) &X1)[i]]; + ((uint8_t *) &X3)[i] = _sse2neon_sbox[((uint8_t *) &X3)[i]]; + } + return _mm_set_epi32(((X3 >> 8) | (X3 << 24)) ^ rcon, X3, + ((X1 >> 8) | (X1 << 24)) ^ rcon, X1); +#endif +} +#undef SSE2NEON_AES_SBOX +#undef SSE2NEON_AES_RSBOX + +#if defined(__aarch64__) +#undef SSE2NEON_XT +#undef SSE2NEON_MULTIPLY +#endif + +#else /* __ARM_FEATURE_CRYPTO */ +// Implements equivalent of 'aesenc' by combining AESE (with an empty key) and +// AESMC and then manually applying the real key as an xor operation. This +// unfortunately means an additional xor op; the compiler should be able to +// optimize this away for repeated calls however. See +// https://blog.michaelbrase.com/2018/05/08/emulating-x86-aes-intrinsics-on-armv8-a +// for more details. +FORCE_INLINE __m128i _mm_aesenc_si128(__m128i a, __m128i b) +{ + return vreinterpretq_m128i_u8(veorq_u8( + vaesmcq_u8(vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), + vreinterpretq_u8_m128i(b))); +} + +// Perform one round of an AES decryption flow on data (state) in a using the +// round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdec_si128 +FORCE_INLINE __m128i _mm_aesdec_si128(__m128i a, __m128i RoundKey) +{ + return vreinterpretq_m128i_u8(veorq_u8( + vaesimcq_u8(vaesdq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), + vreinterpretq_u8_m128i(RoundKey))); +} + +// Perform the last round of an AES encryption flow on data (state) in a using +// the round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesenclast_si128 +FORCE_INLINE __m128i _mm_aesenclast_si128(__m128i a, __m128i RoundKey) +{ + return _mm_xor_si128(vreinterpretq_m128i_u8(vaeseq_u8( + vreinterpretq_u8_m128i(a), vdupq_n_u8(0))), + RoundKey); +} + +// Perform the last round of an AES decryption flow on data (state) in a using +// the round key in RoundKey, and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesdeclast_si128 +FORCE_INLINE __m128i _mm_aesdeclast_si128(__m128i a, __m128i RoundKey) +{ + return vreinterpretq_m128i_u8( + veorq_u8(vaesdq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0)), + vreinterpretq_u8_m128i(RoundKey))); +} + +// Perform the InvMixColumns transformation on a and store the result in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aesimc_si128 +FORCE_INLINE __m128i _mm_aesimc_si128(__m128i a) +{ + return vreinterpretq_m128i_u8(vaesimcq_u8(vreinterpretq_u8_m128i(a))); +} + +// Assist in expanding the AES cipher key by computing steps towards generating +// a round key for encryption cipher using data from a and an 8-bit round +// constant specified in imm8, and store the result in dst." +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_aeskeygenassist_si128 +FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon) +{ + // AESE does ShiftRows and SubBytes on A + uint8x16_t u8 = vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0)); + +#if !defined(_MSC_VER) || defined(__clang__) + uint8x16_t dest = { + // Undo ShiftRows step from AESE and extract X1 and X3 + u8[0x4], u8[0x1], u8[0xE], u8[0xB], // SubBytes(X1) + u8[0x1], u8[0xE], u8[0xB], u8[0x4], // ROT(SubBytes(X1)) + u8[0xC], u8[0x9], u8[0x6], u8[0x3], // SubBytes(X3) + u8[0x9], u8[0x6], u8[0x3], u8[0xC], // ROT(SubBytes(X3)) + }; + uint32x4_t r = {0, (unsigned) rcon, 0, (unsigned) rcon}; + return vreinterpretq_m128i_u8(dest) ^ vreinterpretq_m128i_u32(r); +#else + // We have to do this hack because MSVC is strictly adhering to the CPP + // standard, in particular C++03 8.5.1 sub-section 15, which states that + // unions must be initialized by their first member type. + + // As per the Windows ARM64 ABI, it is always little endian, so this works + __n128 dest{ + ((uint64_t) u8.n128_u8[0x4] << 0) | ((uint64_t) u8.n128_u8[0x1] << 8) | + ((uint64_t) u8.n128_u8[0xE] << 16) | + ((uint64_t) u8.n128_u8[0xB] << 24) | + ((uint64_t) u8.n128_u8[0x1] << 32) | + ((uint64_t) u8.n128_u8[0xE] << 40) | + ((uint64_t) u8.n128_u8[0xB] << 48) | + ((uint64_t) u8.n128_u8[0x4] << 56), + ((uint64_t) u8.n128_u8[0xC] << 0) | ((uint64_t) u8.n128_u8[0x9] << 8) | + ((uint64_t) u8.n128_u8[0x6] << 16) | + ((uint64_t) u8.n128_u8[0x3] << 24) | + ((uint64_t) u8.n128_u8[0x9] << 32) | + ((uint64_t) u8.n128_u8[0x6] << 40) | + ((uint64_t) u8.n128_u8[0x3] << 48) | + ((uint64_t) u8.n128_u8[0xC] << 56)}; + + dest.n128_u32[1] = dest.n128_u32[1] ^ rcon; + dest.n128_u32[3] = dest.n128_u32[3] ^ rcon; + + return dest; +#endif +} +#endif + +/* Others */ + +// Perform a carry-less multiplication of two 64-bit integers, selected from a +// and b according to imm8, and store the results in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_clmulepi64_si128 +FORCE_INLINE __m128i _mm_clmulepi64_si128(__m128i _a, __m128i _b, const int imm) +{ + uint64x2_t a = vreinterpretq_u64_m128i(_a); + uint64x2_t b = vreinterpretq_u64_m128i(_b); + switch (imm & 0x11) { + case 0x00: + return vreinterpretq_m128i_u64( + _sse2neon_vmull_p64(vget_low_u64(a), vget_low_u64(b))); + case 0x01: + return vreinterpretq_m128i_u64( + _sse2neon_vmull_p64(vget_high_u64(a), vget_low_u64(b))); + case 0x10: + return vreinterpretq_m128i_u64( + _sse2neon_vmull_p64(vget_low_u64(a), vget_high_u64(b))); + case 0x11: + return vreinterpretq_m128i_u64( + _sse2neon_vmull_p64(vget_high_u64(a), vget_high_u64(b))); + default: + abort(); + } +} + +FORCE_INLINE unsigned int _sse2neon_mm_get_denormals_zero_mode(void) +{ + union { + fpcr_bitfield field; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint64_t value; +#else + uint32_t value; +#endif + } r; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + r.value = _sse2neon_get_fpcr(); +#else + __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ +#endif + + return r.field.bit24 ? _MM_DENORMALS_ZERO_ON : _MM_DENORMALS_ZERO_OFF; +} + +// Count the number of bits set to 1 in unsigned 32-bit integer a, and +// return that count in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_popcnt_u32 +FORCE_INLINE int _mm_popcnt_u32(unsigned int a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#if __has_builtin(__builtin_popcount) + return __builtin_popcount(a); +#elif defined(_MSC_VER) + return _CountOneBits(a); +#else + return (int) vaddlv_u8(vcnt_u8(vcreate_u8((uint64_t) a))); +#endif +#else + uint32_t count = 0; + uint8x8_t input_val, count8x8_val; + uint16x4_t count16x4_val; + uint32x2_t count32x2_val; + + input_val = vld1_u8((uint8_t *) &a); + count8x8_val = vcnt_u8(input_val); + count16x4_val = vpaddl_u8(count8x8_val); + count32x2_val = vpaddl_u16(count16x4_val); + + vst1_u32(&count, count32x2_val); + return count; +#endif +} + +// Count the number of bits set to 1 in unsigned 64-bit integer a, and +// return that count in dst. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_popcnt_u64 +FORCE_INLINE int64_t _mm_popcnt_u64(uint64_t a) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) +#if __has_builtin(__builtin_popcountll) + return __builtin_popcountll(a); +#elif defined(_MSC_VER) + return _CountOneBits64(a); +#else + return (int64_t) vaddlv_u8(vcnt_u8(vcreate_u8(a))); +#endif +#else + uint64_t count = 0; + uint8x8_t input_val, count8x8_val; + uint16x4_t count16x4_val; + uint32x2_t count32x2_val; + uint64x1_t count64x1_val; + + input_val = vld1_u8((uint8_t *) &a); + count8x8_val = vcnt_u8(input_val); + count16x4_val = vpaddl_u8(count8x8_val); + count32x2_val = vpaddl_u16(count16x4_val); + count64x1_val = vpaddl_u32(count32x2_val); + vst1_u64(&count, count64x1_val); + return count; +#endif +} + +FORCE_INLINE void _sse2neon_mm_set_denormals_zero_mode(unsigned int flag) +{ + // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting, + // regardless of the value of the FZ bit. + union { + fpcr_bitfield field; +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint64_t value; +#else + uint32_t value; +#endif + } r; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + r.value = _sse2neon_get_fpcr(); +#else + __asm__ __volatile__("vmrs %0, FPSCR" : "=r"(r.value)); /* read */ +#endif + + r.field.bit24 = (flag & _MM_DENORMALS_ZERO_MASK) == _MM_DENORMALS_ZERO_ON; + +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + _sse2neon_set_fpcr(r.value); +#else + __asm__ __volatile__("vmsr FPSCR, %0" ::"r"(r)); /* write */ +#endif +} + +// Return the current 64-bit value of the processor's time-stamp counter. +// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=rdtsc +FORCE_INLINE uint64_t _rdtsc(void) +{ +#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC) + uint64_t val; + + /* According to ARM DDI 0487F.c, from Armv8.0 to Armv8.5 inclusive, the + * system counter is at least 56 bits wide; from Armv8.6, the counter + * must be 64 bits wide. So the system counter could be less than 64 + * bits wide and it is attributed with the flag 'cap_user_time_short' + * is true. + */ +#if defined(_MSC_VER) && !defined(__clang__) + val = _ReadStatusReg(ARM64_SYSREG(3, 3, 14, 0, 2)); +#else + __asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val)); +#endif + + return val; +#else + uint32_t pmccntr, pmuseren, pmcntenset; + // Read the user mode Performance Monitoring Unit (PMU) + // User Enable Register (PMUSERENR) access permissions. + __asm__ __volatile__("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); + if (pmuseren & 1) { // Allows reading PMUSERENR for user mode code. + __asm__ __volatile__("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); + if (pmcntenset & 0x80000000UL) { // Is it counting? + __asm__ __volatile__("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); + // The counter is set up to count every 64th cycle + return (uint64_t) (pmccntr) << 6; + } + } + + // Fallback to syscall as we can't enable PMUSERENR in user mode. + struct timeval tv; + gettimeofday(&tv, NULL); + return (uint64_t) (tv.tv_sec) * 1000000 + tv.tv_usec; +#endif +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma pop_macro("ALIGN_STRUCT") +#pragma pop_macro("FORCE_INLINE") +#endif + +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC pop_options +#endif + +#endif diff --git a/deps/sse2neon/sse2neon.sln b/deps/sse2neon/sse2neon.sln new file mode 100644 index 000000000..28582e3dc --- /dev/null +++ b/deps/sse2neon/sse2neon.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32901.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sse2neon", "sse2neon.vcxproj", "{341BF194-865B-4DA6-8120-93173498E774}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|ARM64EC = Debug|ARM64EC + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|ARM64EC = Release|ARM64EC + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM.ActiveCfg = Debug|ARM + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM.Build.0 = Debug|ARM + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM64.Build.0 = Debug|ARM64 + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC + {341BF194-865B-4DA6-8120-93173498E774}.Debug|ARM64EC.Build.0 = Debug|ARM64EC + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM.ActiveCfg = Release|ARM + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM.Build.0 = Release|ARM + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM64.ActiveCfg = Release|ARM64 + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM64.Build.0 = Release|ARM64 + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {341BF194-865B-4DA6-8120-93173498E774}.Release|ARM64EC.Build.0 = Release|ARM64EC + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {D503B299-AA05-4E05-A8D9-37C8D229ACB1} + EndGlobalSection +EndGlobal diff --git a/deps/sse2neon/sse2neon.vcxproj b/deps/sse2neon/sse2neon.vcxproj new file mode 100644 index 000000000..5397174e4 --- /dev/null +++ b/deps/sse2neon/sse2neon.vcxproj @@ -0,0 +1,217 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + ARM64EC + + + Release + ARM + + + Release + ARM64 + + + Release + ARM64EC + + + + 16.0 + Win32Proj + {341bf194-865b-4da6-8120-93173498e774} + sse2neon + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + __i386__;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + true + true + true + __i386__;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + /Zc:preprocessor + true + + + Console + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + /Zc:preprocessor + true + stdcpp20 + false + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + /Zc:preprocessor %(AdditionalOptions) + + + Console + true + true + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + .;%(AdditionalIncludeDirectories) + /Zc:preprocessor %(AdditionalOptions) + false + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/sse2neon/sse2neon.vcxproj.filters b/deps/sse2neon/sse2neon.vcxproj.filters new file mode 100644 index 000000000..e4f5e0454 --- /dev/null +++ b/deps/sse2neon/sse2neon.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + {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 + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/deps/sse2neon/tests/README.md b/deps/sse2neon/tests/README.md new file mode 100644 index 000000000..b345b0857 --- /dev/null +++ b/deps/sse2neon/tests/README.md @@ -0,0 +1,29 @@ +# Test Suite for SSE2NEON + +:warning: **Warning: The test suite is based on the little-endian architecture.** + +## Add More Test Items +Once the conversion is implemented, the test can be added with the following steps: + +* File `tests/impl.h` + + Add the intrinsic under `INTRIN_LIST` macro. The naming convention + should be `mm_xxx`. + Place it in the correct classification with the alphabetical order. + The classification can be referenced from [Intel Intrinsics Guide](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html). + +* File `tests/impl.cpp` + ```c + result_t test_mm_xxx() + { + // The C implementation + ... + + // The Neon implementation + ret = _mm_xxx(); + + // Compare the result of two implementations and return either + // TEST_SUCCESS, TEST_FAIL, or TEST_UNIMPL + ... + } + ``` diff --git a/deps/sse2neon/tests/binding.cpp b/deps/sse2neon/tests/binding.cpp new file mode 100644 index 000000000..ca1bb57fe --- /dev/null +++ b/deps/sse2neon/tests/binding.cpp @@ -0,0 +1,35 @@ +#include "binding.h" + +#include +#include + +namespace SSE2NEON +{ +void *platformAlignedAlloc(size_t size) +{ + void *address; +#if defined(_WIN32) + address = _aligned_malloc(size, 16); + if (!address) { +#else + int ret = posix_memalign(&address, 16, size); + if (ret != 0) { +#endif + fprintf(stderr, "Error at File %s line number %d\n", __FILE__, + __LINE__); + exit(EXIT_FAILURE); + } + return address; +} + +void platformAlignedFree(void *ptr) +{ +#if defined(_WIN32) + _aligned_free(ptr); +#else + free(ptr); +#endif +} + + +} // namespace SSE2NEON diff --git a/deps/sse2neon/tests/binding.h b/deps/sse2neon/tests/binding.h new file mode 100644 index 000000000..64a9fa506 --- /dev/null +++ b/deps/sse2neon/tests/binding.h @@ -0,0 +1,19 @@ +#ifndef SSE2NEONBINDING_H +#define SSE2NEONBINDING_H + +#include + +// The SSE2NEON unit tests run both within our own internal project +// as well as within the open source framework. +// This header file is used to abstract any distinctions between +// those two build environments. +// +// Initially, this is for how 16 byte aligned memory is allocated +namespace SSE2NEON +{ +void *platformAlignedAlloc(size_t size); +void platformAlignedFree(void *ptr); + +} // namespace SSE2NEON + +#endif diff --git a/deps/sse2neon/tests/common.cpp b/deps/sse2neon/tests/common.cpp new file mode 100644 index 000000000..f1427aca1 --- /dev/null +++ b/deps/sse2neon/tests/common.cpp @@ -0,0 +1,414 @@ +#include "common.h" +#include +#include + +namespace SSE2NEON +{ +int32_t NaN = ~0; +int64_t NaN64 = ~0; + +result_t validateInt64(__m128i a, int64_t i0, int64_t i1) +{ + const int64_t *t = (const int64_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + return TEST_SUCCESS; +} + +result_t validateInt64(__m64 a, int64_t i0) +{ + const int64_t *t = (const int64_t *) &a; + ASSERT_RETURN(t[0] == i0); + return TEST_SUCCESS; +} + +result_t validateUInt64(__m128i a, uint64_t u0, uint64_t u1) +{ + const uint64_t *t = (const uint64_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + return TEST_SUCCESS; +} + +result_t validateUInt64(__m64 a, uint64_t u0) +{ + const uint64_t *t = (const uint64_t *) &a; + ASSERT_RETURN(t[0] == u0); + return TEST_SUCCESS; +} + +result_t validateInt32(__m128i a, + int32_t i0, + int32_t i1, + int32_t i2, + int32_t i3) +{ + const int32_t *t = (const int32_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + ASSERT_RETURN(t[2] == i2); + ASSERT_RETURN(t[3] == i3); + return TEST_SUCCESS; +} + +result_t validateUInt32(__m128i a, + uint32_t u0, + uint32_t u1, + uint32_t u2, + uint32_t u3) +{ + const uint32_t *t = (const uint32_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + ASSERT_RETURN(t[2] == u2); + ASSERT_RETURN(t[3] == u3); + return TEST_SUCCESS; +} + +result_t validateUInt32(__m64 a, uint32_t u0, uint32_t u1) +{ + const uint32_t *t = (const uint32_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + return TEST_SUCCESS; +} + +result_t validateInt16(__m128i a, + int16_t i0, + int16_t i1, + int16_t i2, + int16_t i3, + int16_t i4, + int16_t i5, + int16_t i6, + int16_t i7) +{ + const int16_t *t = (const int16_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + ASSERT_RETURN(t[2] == i2); + ASSERT_RETURN(t[3] == i3); + ASSERT_RETURN(t[4] == i4); + ASSERT_RETURN(t[5] == i5); + ASSERT_RETURN(t[6] == i6); + ASSERT_RETURN(t[7] == i7); + return TEST_SUCCESS; +} + +result_t validateInt16(__m64 a, int16_t i0, int16_t i1, int16_t i2, int16_t i3) +{ + const int16_t *t = (const int16_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + ASSERT_RETURN(t[2] == i2); + ASSERT_RETURN(t[3] == i3); + return TEST_SUCCESS; +} + +result_t validateUInt16(__m128i a, + uint16_t u0, + uint16_t u1, + uint16_t u2, + uint16_t u3, + uint16_t u4, + uint16_t u5, + uint16_t u6, + uint16_t u7) +{ + const uint16_t *t = (const uint16_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + ASSERT_RETURN(t[2] == u2); + ASSERT_RETURN(t[3] == u3); + ASSERT_RETURN(t[4] == u4); + ASSERT_RETURN(t[5] == u5); + ASSERT_RETURN(t[6] == u6); + ASSERT_RETURN(t[7] == u7); + return TEST_SUCCESS; +} + +result_t validateInt32(__m64 a, int32_t u0, int32_t u1) +{ + const int32_t *t = (const int32_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + return TEST_SUCCESS; +} + +result_t validateUInt16(__m64 a, + uint16_t u0, + uint16_t u1, + uint16_t u2, + uint16_t u3) +{ + const uint16_t *t = (const uint16_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + ASSERT_RETURN(t[2] == u2); + ASSERT_RETURN(t[3] == u3); + return TEST_SUCCESS; +} + +result_t validateInt8(__m128i a, + int8_t i0, + int8_t i1, + int8_t i2, + int8_t i3, + int8_t i4, + int8_t i5, + int8_t i6, + int8_t i7, + int8_t i8, + int8_t i9, + int8_t i10, + int8_t i11, + int8_t i12, + int8_t i13, + int8_t i14, + int8_t i15) +{ + const int8_t *t = (const int8_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + ASSERT_RETURN(t[2] == i2); + ASSERT_RETURN(t[3] == i3); + ASSERT_RETURN(t[4] == i4); + ASSERT_RETURN(t[5] == i5); + ASSERT_RETURN(t[6] == i6); + ASSERT_RETURN(t[7] == i7); + ASSERT_RETURN(t[8] == i8); + ASSERT_RETURN(t[9] == i9); + ASSERT_RETURN(t[10] == i10); + ASSERT_RETURN(t[11] == i11); + ASSERT_RETURN(t[12] == i12); + ASSERT_RETURN(t[13] == i13); + ASSERT_RETURN(t[14] == i14); + ASSERT_RETURN(t[15] == i15); + return TEST_SUCCESS; +} + +result_t validateInt8(__m64 a, + int8_t i0, + int8_t i1, + int8_t i2, + int8_t i3, + int8_t i4, + int8_t i5, + int8_t i6, + int8_t i7) +{ + const int8_t *t = (const int8_t *) &a; + ASSERT_RETURN(t[0] == i0); + ASSERT_RETURN(t[1] == i1); + ASSERT_RETURN(t[2] == i2); + ASSERT_RETURN(t[3] == i3); + ASSERT_RETURN(t[4] == i4); + ASSERT_RETURN(t[5] == i5); + ASSERT_RETURN(t[6] == i6); + ASSERT_RETURN(t[7] == i7); + return TEST_SUCCESS; +} + +result_t validateUInt8(__m128i a, + uint8_t u0, + uint8_t u1, + uint8_t u2, + uint8_t u3, + uint8_t u4, + uint8_t u5, + uint8_t u6, + uint8_t u7, + uint8_t u8, + uint8_t u9, + uint8_t u10, + uint8_t u11, + uint8_t u12, + uint8_t u13, + uint8_t u14, + uint8_t u15) +{ + const uint8_t *t = (const uint8_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + ASSERT_RETURN(t[2] == u2); + ASSERT_RETURN(t[3] == u3); + ASSERT_RETURN(t[4] == u4); + ASSERT_RETURN(t[5] == u5); + ASSERT_RETURN(t[6] == u6); + ASSERT_RETURN(t[7] == u7); + ASSERT_RETURN(t[8] == u8); + ASSERT_RETURN(t[9] == u9); + ASSERT_RETURN(t[10] == u10); + ASSERT_RETURN(t[11] == u11); + ASSERT_RETURN(t[12] == u12); + ASSERT_RETURN(t[13] == u13); + ASSERT_RETURN(t[14] == u14); + ASSERT_RETURN(t[15] == u15); + return TEST_SUCCESS; +} + +result_t validateUInt8(__m64 a, + uint8_t u0, + uint8_t u1, + uint8_t u2, + uint8_t u3, + uint8_t u4, + uint8_t u5, + uint8_t u6, + uint8_t u7) +{ + const uint8_t *t = (const uint8_t *) &a; + ASSERT_RETURN(t[0] == u0); + ASSERT_RETURN(t[1] == u1); + ASSERT_RETURN(t[2] == u2); + ASSERT_RETURN(t[3] == u3); + ASSERT_RETURN(t[4] == u4); + ASSERT_RETURN(t[5] == u5); + ASSERT_RETURN(t[6] == u6); + ASSERT_RETURN(t[7] == u7); + return TEST_SUCCESS; +} + +result_t validateSingleFloatPair(float a, float b) +{ + const uint32_t *ua = (const uint32_t *) &a; + const uint32_t *ub = (const uint32_t *) &b; + // We do an integer (binary) compare rather than a + // floating point compare to take NaNs and infinities + // into account as well. + return (*ua) == (*ub) ? TEST_SUCCESS : TEST_FAIL; +} + +result_t validateSingleDoublePair(double a, double b) +{ + const uint64_t *ua = (const uint64_t *) &a; + const uint64_t *ub = (const uint64_t *) &b; + // We do an integer (binary) compare rather than a + // floating point compare to take NaNs and infinities + // into account as well. + + if (std::isnan(a) && std::isnan(b)) { + return TEST_SUCCESS; + } + + return (*ua) == (*ub) ? TEST_SUCCESS : TEST_FAIL; +} + +result_t validateFloat(__m128 a, float f0, float f1, float f2, float f3) +{ + const float *t = (const float *) &a; + ASSERT_RETURN(validateSingleFloatPair(t[0], f0)); + ASSERT_RETURN(validateSingleFloatPair(t[1], f1)); + ASSERT_RETURN(validateSingleFloatPair(t[2], f2)); + ASSERT_RETURN(validateSingleFloatPair(t[3], f3)); + return TEST_SUCCESS; +} + +result_t validateFloatEpsilon(__m128 a, + float f0, + float f1, + float f2, + float f3, + float epsilon) +{ + const float *t = (const float *) &a; + float df0 = fabsf(t[0] - f0); + float df1 = fabsf(t[1] - f1); + float df2 = fabsf(t[2] - f2); + float df3 = fabsf(t[3] - f3); + + // Due to floating-point error, subtracting floating-point number with NaN + // and zero value usually produces erroneous result. Therefore, we directly + // define the difference of two floating-point numbers to zero if both + // numbers are NaN or zero. + if ((std::isnan(t[0]) && std::isnan(f0)) || (t[0] == 0 && f0 == 0)) { + df0 = 0; + } + + if ((std::isnan(t[1]) && std::isnan(f1)) || (t[1] == 0 && f1 == 0)) { + df1 = 0; + } + + if ((std::isnan(t[2]) && std::isnan(f2)) || (t[2] == 0 && f2 == 0)) { + df2 = 0; + } + + if ((std::isnan(t[3]) && std::isnan(f3)) || (t[3] == 0 && f3 == 0)) { + df3 = 0; + } + + ASSERT_RETURN(df0 < epsilon); + ASSERT_RETURN(df1 < epsilon); + ASSERT_RETURN(df2 < epsilon); + ASSERT_RETURN(df3 < epsilon); + return TEST_SUCCESS; +} + +result_t validateFloatError(__m128 a, + float f0, + float f1, + float f2, + float f3, + float err) +{ + const float *t = (const float *) &a; + float df0 = fabsf((t[0] - f0) / f0); + float df1 = fabsf((t[1] - f1) / f1); + float df2 = fabsf((t[2] - f2) / f2); + float df3 = fabsf((t[3] - f3) / f3); + + if ((std::isnan(t[0]) && std::isnan(f0)) || (t[0] == 0 && f0 == 0) || + (std::isinf(t[0]) && std::isinf(f0))) { + df0 = 0; + } + + if ((std::isnan(t[1]) && std::isnan(f1)) || (t[1] == 0 && f1 == 0) || + (std::isinf(t[1]) && std::isinf(f1))) { + df1 = 0; + } + + if ((std::isnan(t[2]) && std::isnan(f2)) || (t[2] == 0 && f2 == 0) || + (std::isinf(t[2]) && std::isinf(f2))) { + df2 = 0; + } + + if ((std::isnan(t[3]) && std::isnan(f3)) || (t[3] == 0 && f3 == 0) || + (std::isinf(t[3]) && std::isinf(f3))) { + df3 = 0; + } + + ASSERT_RETURN(df0 < err); + ASSERT_RETURN(df1 < err); + ASSERT_RETURN(df2 < err); + ASSERT_RETURN(df3 < err); + return TEST_SUCCESS; +} + +result_t validateDouble(__m128d a, double d0, double d1) +{ + const double *t = (const double *) &a; + ASSERT_RETURN(validateSingleDoublePair(t[0], d0)); + ASSERT_RETURN(validateSingleDoublePair(t[1], d1)); + return TEST_SUCCESS; +} + +result_t validateFloatError(__m128d a, double d0, double d1, double err) +{ + const double *t = (const double *) &a; + double td0 = fabs((t[0] - d0) / d0); + double td1 = fabs((t[1] - d1) / d1); + + if (std::isnan(t[0]) && std::isnan(d0)) { + td0 = 0; + } + + if (std::isnan(t[1]) && std::isnan(d1)) { + td1 = 0; + } + + ASSERT_RETURN(td0 < err); + ASSERT_RETURN(td1 < err); + return TEST_SUCCESS; +} + +} // namespace SSE2NEON diff --git a/deps/sse2neon/tests/common.h b/deps/sse2neon/tests/common.h new file mode 100644 index 000000000..74d6dea21 --- /dev/null +++ b/deps/sse2neon/tests/common.h @@ -0,0 +1,527 @@ +#ifndef SSE2NEONCOMMON_H +#define SSE2NEONCOMMON_H +#include +#if (defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) || \ + defined(__arm__) +#include "sse2neon.h" +#elif defined(__x86_64__) || defined(__i386__) +#include +#include +#include +#include +#include +#include + +// __int64 is defined in the Intrinsics Guide which maps to different datatype +// in different data model +#if !(defined(_WIN32) || defined(_WIN64) || defined(__int64)) +#if (defined(__x86_64__) || defined(__i386__)) +#define __int64 long long +#else +#define __int64 int64_t +#endif +#endif + +#if defined(__GNUC__) || defined(__clang__) +#pragma push_macro("ALIGN_STRUCT") +#define ALIGN_STRUCT(x) __attribute__((aligned(x))) +#else +#define ALIGN_STRUCT(x) __declspec(align(x)) +#endif + +typedef union ALIGN_STRUCT(16) SIMDVec { + float m128_f32[4]; // as floats - DON'T USE. Added for convenience. + int8_t m128_i8[16]; // as signed 8-bit integers. + int16_t m128_i16[8]; // as signed 16-bit integers. + int32_t m128_i32[4]; // as signed 32-bit integers. + int64_t m128_i64[2]; // as signed 64-bit integers. + uint8_t m128_u8[16]; // as unsigned 8-bit integers. + uint16_t m128_u16[8]; // as unsigned 16-bit integers. + uint32_t m128_u32[4]; // as unsigned 32-bit integers. + uint64_t m128_u64[2]; // as unsigned 64-bit integers. +} SIMDVec; + +#if defined(__GNUC__) || defined(__clang__) +#pragma pop_macro("ALIGN_STRUCT") +#endif + +/* Tunable testing configuration for precise testing */ +/* _mm_min|max_ps|ss|pd|sd */ +#ifndef SSE2NEON_PRECISE_MINMAX +#define SSE2NEON_PRECISE_MINMAX (0) +#endif +#endif + +#define ASSERT_RETURN(x) \ + if (!(x)) \ + return TEST_FAIL; + +namespace SSE2NEON +{ +enum result_t { + TEST_SUCCESS = 1, + TEST_FAIL = 0, + TEST_UNIMPL = -1, +}; +extern int32_t NaN; +extern int64_t NaN64; + +#if defined(__GNUC__) && !defined(__clang__) +#pragma push_macro("OPTNONE") +#define OPTNONE __attribute__((optimize("O0"))) +#elif defined(__clang__) +#pragma push_macro("OPTNONE") +#define OPTNONE __attribute__((optnone)) +#else +#define OPTNONE +#endif + +#include +static inline double sse2neon_tool_recast_f64(uint64_t u64) +{ + double f64; + memcpy(&f64, &u64, sizeof(uint64_t)); + return f64; +} +static inline int64_t sse2neon_tool_recast_i64(double f64) +{ + int64_t i64; + memcpy(&i64, &f64, sizeof(int64_t)); + return i64; +} +static inline float sse2neon_tool_recast_f32(uint32_t u32) +{ + float f32; + memcpy(&f32, &u32, sizeof(uint32_t)); + return f32; +} +static inline float sse2neon_tool_recast_f32(int32_t i32) +{ + float f32; + memcpy(&f32, &i32, sizeof(int32_t)); + return f32; +} +#define ALL_BIT_1_32 sse2neon_tool_recast_f32(UINT32_MAX) +#define ALL_BIT_1_64 sse2neon_tool_recast_f64(UINT64_MAX) + +template +result_t validate128(T a, T b) +{ + const int32_t *t1 = (const int32_t *) &a; + const int32_t *t2 = (const int32_t *) &b; + + ASSERT_RETURN(t1[0] == t2[0]); + ASSERT_RETURN(t1[1] == t2[1]); + ASSERT_RETURN(t1[2] == t2[2]); + ASSERT_RETURN(t1[3] == t2[3]); + return TEST_SUCCESS; +} +result_t validateInt64(__m128i a, int64_t i0, int64_t i1); +result_t validateInt64(__m64 a, int64_t i0); +result_t validateUInt64(__m128i a, uint64_t u0, uint64_t u1); +result_t validateUInt64(__m64 a, uint64_t u0); +result_t validateInt32(__m128i a, + int32_t i0, + int32_t i1, + int32_t i2, + int32_t i3); +result_t validateUInt32(__m128i a, + uint32_t u0, + uint32_t u1, + uint32_t u2, + uint32_t u3); +result_t validateUInt32(__m64 a, uint32_t u0, uint32_t u1); +result_t validateInt32(__m64 a, int32_t u0, int32_t u1); +result_t validateInt16(__m128i a, + int16_t i0, + int16_t i1, + int16_t i2, + int16_t i3, + int16_t i4, + int16_t i5, + int16_t i6, + int16_t i7); +result_t validateInt16(__m64 a, int16_t i0, int16_t i1, int16_t i2, int16_t i3); +result_t validateUInt16(__m128i a, + uint16_t u0, + uint16_t u1, + uint16_t u2, + uint16_t u3, + uint16_t u4, + uint16_t u5, + uint16_t u6, + uint16_t u7); +result_t validateUInt16(__m64 a, + uint16_t u0, + uint16_t u1, + uint16_t u2, + uint16_t u3); +result_t validateInt8(__m128i a, + int8_t i0, + int8_t i1, + int8_t i2, + int8_t i3, + int8_t i4, + int8_t i5, + int8_t i6, + int8_t i7, + int8_t i8, + int8_t i9, + int8_t i10, + int8_t i11, + int8_t i12, + int8_t i13, + int8_t i14, + int8_t i15); +result_t validateInt8(__m64 a, + int8_t i0, + int8_t i1, + int8_t i2, + int8_t i3, + int8_t i4, + int8_t i5, + int8_t i6, + int8_t i7); +result_t validateUInt8(__m128i a, + uint8_t u0, + uint8_t u1, + uint8_t u2, + uint8_t u3, + uint8_t u4, + uint8_t u5, + uint8_t u6, + uint8_t u7, + uint8_t u8, + uint8_t u9, + uint8_t u10, + uint8_t u11, + uint8_t u12, + uint8_t u13, + uint8_t u14, + uint8_t u15); +result_t validateUInt8(__m64 a, + uint8_t u0, + uint8_t u1, + uint8_t u2, + uint8_t u3, + uint8_t u4, + uint8_t u5, + uint8_t u6, + uint8_t u7); +result_t validateSingleFloatPair(float a, float b); +result_t validateSingleDoublePair(double a, double b); +result_t validateFloat(__m128 a, float f0, float f1, float f2, float f3); +result_t validateFloatEpsilon(__m128 a, + float f0, + float f1, + float f2, + float f3, + float epsilon); +result_t validateFloatError(__m128 a, + float f0, + float f1, + float f2, + float f3, + float err); +result_t validateDouble(__m128d a, double d0, double d1); +result_t validateFloatError(__m128d a, double d0, double d1, double err); + +#define VALIDATE_INT8_M128(A, B) \ + validateInt8(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7], B[8], \ + B[9], B[10], B[11], B[12], B[13], B[14], B[15]) +#define VALIDATE_UINT8_M128(A, B) \ + validateUInt8(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7], B[8], \ + B[9], B[10], B[11], B[12], B[13], B[14], B[15]) +#define VALIDATE_INT16_M128(A, B) \ + validateInt16(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7]) +#define VALIDATE_UINT16_M128(A, B) \ + validateUInt16(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7]) +#define VALIDATE_INT32_M128(A, B) validateInt32(A, B[0], B[1], B[2], B[3]) +#define VALIDATE_UINT32_M128(A, B) validateUInt32(A, B[0], B[1], B[2], B[3]) + +#define VALIDATE_INT8_M64(A, B) \ + validateInt8(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7]) +#define VALIDATE_UINT8_M64(A, B) \ + validateUInt8(A, B[0], B[1], B[2], B[3], B[4], B[5], B[6], B[7]) +#define VALIDATE_INT16_M64(A, B) validateInt16(A, B[0], B[1], B[2], B[3]) +#define VALIDATE_UINT16_M64(A, B) validateUInt16(A, B[0], B[1], B[2], B[3]) +#define VALIDATE_INT32_M64(A, B) validateInt32(A, B[0], B[1]) +#define VALIDATE_UINT32_M64(A, B) validateUInt32(A, B[0], B[1]) +#define CHECK_RESULT(EXP) \ + if (EXP != TEST_SUCCESS) { \ + return TEST_FAIL; \ + } +#define IMM_2_ITER \ + TEST_IMPL(0) \ + TEST_IMPL(1) +#define IMM_4_ITER \ + IMM_2_ITER \ + TEST_IMPL(2) \ + TEST_IMPL(3) +#define IMM_8_ITER \ + IMM_4_ITER \ + TEST_IMPL(4) \ + TEST_IMPL(5) \ + TEST_IMPL(6) \ + TEST_IMPL(7) +#define IMM_16_ITER \ + IMM_8_ITER \ + TEST_IMPL(8) \ + TEST_IMPL(9) \ + TEST_IMPL(10) \ + TEST_IMPL(11) \ + TEST_IMPL(12) \ + TEST_IMPL(13) \ + TEST_IMPL(14) \ + TEST_IMPL(15) +#define IMM_32_ITER \ + IMM_16_ITER \ + TEST_IMPL(16) \ + TEST_IMPL(17) \ + TEST_IMPL(18) \ + TEST_IMPL(19) \ + TEST_IMPL(20) \ + TEST_IMPL(21) \ + TEST_IMPL(22) \ + TEST_IMPL(23) \ + TEST_IMPL(24) \ + TEST_IMPL(25) \ + TEST_IMPL(26) \ + TEST_IMPL(27) \ + TEST_IMPL(28) \ + TEST_IMPL(29) \ + TEST_IMPL(30) \ + TEST_IMPL(31) +#define IMM_64_ITER \ + IMM_32_ITER \ + TEST_IMPL(32) \ + TEST_IMPL(33) \ + TEST_IMPL(34) \ + TEST_IMPL(35) \ + TEST_IMPL(36) \ + TEST_IMPL(37) \ + TEST_IMPL(38) \ + TEST_IMPL(39) \ + TEST_IMPL(40) \ + TEST_IMPL(41) \ + TEST_IMPL(42) \ + TEST_IMPL(43) \ + TEST_IMPL(44) \ + TEST_IMPL(45) \ + TEST_IMPL(46) \ + TEST_IMPL(47) \ + TEST_IMPL(48) \ + TEST_IMPL(49) \ + TEST_IMPL(50) \ + TEST_IMPL(51) \ + TEST_IMPL(52) \ + TEST_IMPL(53) \ + TEST_IMPL(54) \ + TEST_IMPL(55) \ + TEST_IMPL(56) \ + TEST_IMPL(57) \ + TEST_IMPL(58) \ + TEST_IMPL(59) \ + TEST_IMPL(60) \ + TEST_IMPL(61) \ + TEST_IMPL(62) \ + TEST_IMPL(63) +#define IMM_128_ITER \ + IMM_64_ITER \ + TEST_IMPL(64) \ + TEST_IMPL(65) \ + TEST_IMPL(66) \ + TEST_IMPL(67) \ + TEST_IMPL(68) \ + TEST_IMPL(69) \ + TEST_IMPL(70) \ + TEST_IMPL(71) \ + TEST_IMPL(72) \ + TEST_IMPL(73) \ + TEST_IMPL(74) \ + TEST_IMPL(75) \ + TEST_IMPL(76) \ + TEST_IMPL(77) \ + TEST_IMPL(78) \ + TEST_IMPL(79) \ + TEST_IMPL(80) \ + TEST_IMPL(81) \ + TEST_IMPL(82) \ + TEST_IMPL(83) \ + TEST_IMPL(84) \ + TEST_IMPL(85) \ + TEST_IMPL(86) \ + TEST_IMPL(87) \ + TEST_IMPL(88) \ + TEST_IMPL(89) \ + TEST_IMPL(90) \ + TEST_IMPL(91) \ + TEST_IMPL(92) \ + TEST_IMPL(93) \ + TEST_IMPL(94) \ + TEST_IMPL(95) \ + TEST_IMPL(96) \ + TEST_IMPL(97) \ + TEST_IMPL(98) \ + TEST_IMPL(99) \ + TEST_IMPL(100) \ + TEST_IMPL(101) \ + TEST_IMPL(102) \ + TEST_IMPL(103) \ + TEST_IMPL(104) \ + TEST_IMPL(105) \ + TEST_IMPL(106) \ + TEST_IMPL(107) \ + TEST_IMPL(108) \ + TEST_IMPL(109) \ + TEST_IMPL(110) \ + TEST_IMPL(111) \ + TEST_IMPL(112) \ + TEST_IMPL(113) \ + TEST_IMPL(114) \ + TEST_IMPL(115) \ + TEST_IMPL(116) \ + TEST_IMPL(117) \ + TEST_IMPL(118) \ + TEST_IMPL(119) \ + TEST_IMPL(120) \ + TEST_IMPL(121) \ + TEST_IMPL(122) \ + TEST_IMPL(123) \ + TEST_IMPL(124) \ + TEST_IMPL(125) \ + TEST_IMPL(126) \ + TEST_IMPL(127) +#define IMM_256_ITER \ + IMM_128_ITER \ + TEST_IMPL(128) \ + TEST_IMPL(129) \ + TEST_IMPL(130) \ + TEST_IMPL(131) \ + TEST_IMPL(132) \ + TEST_IMPL(133) \ + TEST_IMPL(134) \ + TEST_IMPL(135) \ + TEST_IMPL(136) \ + TEST_IMPL(137) \ + TEST_IMPL(138) \ + TEST_IMPL(139) \ + TEST_IMPL(140) \ + TEST_IMPL(141) \ + TEST_IMPL(142) \ + TEST_IMPL(143) \ + TEST_IMPL(144) \ + TEST_IMPL(145) \ + TEST_IMPL(146) \ + TEST_IMPL(147) \ + TEST_IMPL(148) \ + TEST_IMPL(149) \ + TEST_IMPL(150) \ + TEST_IMPL(151) \ + TEST_IMPL(152) \ + TEST_IMPL(153) \ + TEST_IMPL(154) \ + TEST_IMPL(155) \ + TEST_IMPL(156) \ + TEST_IMPL(157) \ + TEST_IMPL(158) \ + TEST_IMPL(159) \ + TEST_IMPL(160) \ + TEST_IMPL(161) \ + TEST_IMPL(162) \ + TEST_IMPL(163) \ + TEST_IMPL(164) \ + TEST_IMPL(165) \ + TEST_IMPL(166) \ + TEST_IMPL(167) \ + TEST_IMPL(168) \ + TEST_IMPL(169) \ + TEST_IMPL(170) \ + TEST_IMPL(171) \ + TEST_IMPL(172) \ + TEST_IMPL(173) \ + TEST_IMPL(174) \ + TEST_IMPL(175) \ + TEST_IMPL(176) \ + TEST_IMPL(177) \ + TEST_IMPL(178) \ + TEST_IMPL(179) \ + TEST_IMPL(180) \ + TEST_IMPL(181) \ + TEST_IMPL(182) \ + TEST_IMPL(183) \ + TEST_IMPL(184) \ + TEST_IMPL(185) \ + TEST_IMPL(186) \ + TEST_IMPL(187) \ + TEST_IMPL(188) \ + TEST_IMPL(189) \ + TEST_IMPL(190) \ + TEST_IMPL(191) \ + TEST_IMPL(192) \ + TEST_IMPL(193) \ + TEST_IMPL(194) \ + TEST_IMPL(195) \ + TEST_IMPL(196) \ + TEST_IMPL(197) \ + TEST_IMPL(198) \ + TEST_IMPL(199) \ + TEST_IMPL(200) \ + TEST_IMPL(201) \ + TEST_IMPL(202) \ + TEST_IMPL(203) \ + TEST_IMPL(204) \ + TEST_IMPL(205) \ + TEST_IMPL(206) \ + TEST_IMPL(207) \ + TEST_IMPL(208) \ + TEST_IMPL(209) \ + TEST_IMPL(210) \ + TEST_IMPL(211) \ + TEST_IMPL(212) \ + TEST_IMPL(213) \ + TEST_IMPL(214) \ + TEST_IMPL(215) \ + TEST_IMPL(216) \ + TEST_IMPL(217) \ + TEST_IMPL(218) \ + TEST_IMPL(219) \ + TEST_IMPL(220) \ + TEST_IMPL(221) \ + TEST_IMPL(222) \ + TEST_IMPL(223) \ + TEST_IMPL(224) \ + TEST_IMPL(225) \ + TEST_IMPL(226) \ + TEST_IMPL(227) \ + TEST_IMPL(228) \ + TEST_IMPL(229) \ + TEST_IMPL(230) \ + TEST_IMPL(231) \ + TEST_IMPL(232) \ + TEST_IMPL(233) \ + TEST_IMPL(234) \ + TEST_IMPL(235) \ + TEST_IMPL(236) \ + TEST_IMPL(237) \ + TEST_IMPL(238) \ + TEST_IMPL(239) \ + TEST_IMPL(240) \ + TEST_IMPL(241) \ + TEST_IMPL(242) \ + TEST_IMPL(243) \ + TEST_IMPL(244) \ + TEST_IMPL(245) \ + TEST_IMPL(246) \ + TEST_IMPL(247) \ + TEST_IMPL(248) \ + TEST_IMPL(249) \ + TEST_IMPL(250) \ + TEST_IMPL(251) \ + TEST_IMPL(252) \ + TEST_IMPL(253) \ + TEST_IMPL(254) \ + TEST_IMPL(255) +} // namespace SSE2NEON + +#endif diff --git a/deps/sse2neon/tests/impl.cpp b/deps/sse2neon/tests/impl.cpp new file mode 100644 index 000000000..3140b5aa4 --- /dev/null +++ b/deps/sse2neon/tests/impl.cpp @@ -0,0 +1,11883 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "binding.h" +#include "impl.h" + +// Try 10,000 random floating point values for each test we run +#define MAX_TEST_VALUE 10000 + +/* Pattern Matching for C macros. + * https://github.com/pfultz2/Cloak/wiki/C-Preprocessor-tricks,-tips,-and-idioms + */ + +/* catenate */ +#define PRIMITIVE_CAT(a, ...) a##__VA_ARGS__ + +#define IIF(c) PRIMITIVE_CAT(IIF_, c) +/* run the 2nd parameter */ +#define IIF_0(t, ...) __VA_ARGS__ +/* run the 1st parameter */ +#define IIF_1(t, ...) t + +// Some intrinsics operate on unaligned data types. +#if defined(__GNUC__) || defined(__clang__) +#define ALIGN_STRUCT(x) __attribute__((aligned(x))) +#elif defined(_MSC_VER) +#ifndef ALIGN_STRUCT +#define ALIGN_STRUCT(x) __declspec(align(x)) +#endif +#endif + +typedef int16_t ALIGN_STRUCT(1) unaligned_int16_t; +typedef int32_t ALIGN_STRUCT(1) unaligned_int32_t; +typedef int64_t ALIGN_STRUCT(1) unaligned_int64_t; + +// This program a set of unit tests to ensure that each SSE call provide the +// output we expect. If this fires an assert, then something didn't match up. +// +// Functions with "test_" prefix will be called in runSingleTest. +namespace SSE2NEON +{ +// Forward declaration +class SSE2NEONTestImpl : public SSE2NEONTest +{ +public: + SSE2NEONTestImpl(void); + result_t loadTestFloatPointers(uint32_t i); + result_t loadTestIntPointers(uint32_t i); + result_t runSingleTest(InstructionTest test, uint32_t i); + + float *mTestFloatPointer1; + float *mTestFloatPointer2; + int32_t *mTestIntPointer1; + int32_t *mTestIntPointer2; + float mTestFloats[MAX_TEST_VALUE]; + int32_t mTestInts[MAX_TEST_VALUE]; + int8_t mTestUnalignedInts[32] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + }; + + virtual ~SSE2NEONTestImpl(void) + { + platformAlignedFree(mTestFloatPointer1); + platformAlignedFree(mTestFloatPointer2); + platformAlignedFree(mTestIntPointer1); + platformAlignedFree(mTestIntPointer2); + } + virtual void release(void) { delete this; } + virtual result_t runTest(InstructionTest test) + { + result_t ret = TEST_SUCCESS; + + // Test a whole bunch of values + for (uint32_t i = 0; i < (MAX_TEST_VALUE - 8); i++) { + ret = loadTestFloatPointers(i); // Load some random float values + if (ret == TEST_FAIL) + break; // load test float failed?? + ret = loadTestIntPointers(i); // load some random int values + if (ret == TEST_FAIL) + break; // load test float failed?? + // If we are testing the reciprocal, then invert the input data + // (easier for debugging) + if (test == it_mm_rcp_ps) { + mTestFloatPointer1[0] = 1.0f / mTestFloatPointer1[0]; + mTestFloatPointer1[1] = 1.0f / mTestFloatPointer1[1]; + mTestFloatPointer1[2] = 1.0f / mTestFloatPointer1[2]; + mTestFloatPointer1[3] = 1.0f / mTestFloatPointer1[3]; + } + if (test == it_mm_rcp_ps || test == it_mm_rcp_ss || + test == it_mm_rsqrt_ps || test == it_mm_rsqrt_ss) { + if ((rand() & 3) == 0) { + uint32_t r1 = rand() & 3; + uint32_t r2 = rand() & 3; + uint32_t r3 = rand() & 3; + uint32_t r4 = rand() & 3; + uint32_t r5 = rand() & 3; + uint32_t r6 = rand() & 3; + uint32_t r7 = rand() & 3; + uint32_t r8 = rand() & 3; + mTestFloatPointer1[r1] = 0.0f; + mTestFloatPointer1[r2] = 0.0f; + mTestFloatPointer1[r3] = 0.0f; + mTestFloatPointer1[r4] = 0.0f; + mTestFloatPointer1[r5] = -0.0f; + mTestFloatPointer1[r6] = -0.0f; + mTestFloatPointer1[r7] = -0.0f; + mTestFloatPointer1[r8] = -0.0f; + } + } + if (test == it_mm_cmpge_ps || test == it_mm_cmpge_ss || + test == it_mm_cmple_ps || test == it_mm_cmple_ss || + test == it_mm_cmpeq_ps || test == it_mm_cmpeq_ss) { + // Make sure at least one value is the same. + mTestFloatPointer1[3] = mTestFloatPointer2[3]; + } + + if (test == it_mm_cmpord_ps || test == it_mm_cmpord_ss || + test == it_mm_cmpunord_ps || test == it_mm_cmpunord_ss || + test == it_mm_cmpeq_ps || test == it_mm_cmpeq_ss || + test == it_mm_cmpge_ps || test == it_mm_cmpge_ss || + test == it_mm_cmpgt_ps || test == it_mm_cmpgt_ss || + test == it_mm_cmple_ps || test == it_mm_cmple_ss || + test == it_mm_cmplt_ps || test == it_mm_cmplt_ss || + test == it_mm_cmpneq_ps || test == it_mm_cmpneq_ss || + test == it_mm_cmpnge_ps || test == it_mm_cmpnge_ss || + test == it_mm_cmpngt_ps || test == it_mm_cmpngt_ss || + test == it_mm_cmpnle_ps || test == it_mm_cmpnle_ss || + test == it_mm_cmpnlt_ps || test == it_mm_cmpnlt_ss || + test == it_mm_comieq_ss || test == it_mm_ucomieq_ss || + test == it_mm_comige_ss || test == it_mm_ucomige_ss || + test == it_mm_comigt_ss || test == it_mm_ucomigt_ss || + test == it_mm_comile_ss || test == it_mm_ucomile_ss || + test == it_mm_comilt_ss || test == it_mm_ucomilt_ss || + test == it_mm_comineq_ss || test == it_mm_ucomineq_ss) { + // Make sure the NaN values are included in the testing + // one out of four times. + if ((rand() & 3) == 0) { + uint32_t r1 = rand() & 3; + uint32_t r2 = rand() & 3; + mTestFloatPointer1[r1] = nanf(""); + mTestFloatPointer2[r2] = nanf(""); + } + } + + if (test == it_mm_cmpord_pd || test == it_mm_cmpord_sd || + test == it_mm_cmpunord_pd || test == it_mm_cmpunord_sd || + test == it_mm_cmpeq_pd || test == it_mm_cmpeq_sd || + test == it_mm_cmpge_pd || test == it_mm_cmpge_sd || + test == it_mm_cmpgt_pd || test == it_mm_cmpgt_sd || + test == it_mm_cmple_pd || test == it_mm_cmple_sd || + test == it_mm_cmplt_pd || test == it_mm_cmplt_sd || + test == it_mm_cmpneq_pd || test == it_mm_cmpneq_sd || + test == it_mm_cmpnge_pd || test == it_mm_cmpnge_sd || + test == it_mm_cmpngt_pd || test == it_mm_cmpngt_sd || + test == it_mm_cmpnle_pd || test == it_mm_cmpnle_sd || + test == it_mm_cmpnlt_pd || test == it_mm_cmpnlt_sd || + test == it_mm_comieq_sd || test == it_mm_ucomieq_sd || + test == it_mm_comige_sd || test == it_mm_ucomige_sd || + test == it_mm_comigt_sd || test == it_mm_ucomigt_sd || + test == it_mm_comile_sd || test == it_mm_ucomile_sd || + test == it_mm_comilt_sd || test == it_mm_ucomilt_sd || + test == it_mm_comineq_sd || test == it_mm_ucomineq_sd) { + // Make sure the NaN values are included in the testing + // one out of four times. + if ((rand() & 3) == 0) { + // FIXME: + // The argument "0xFFFFFFFFFFFF" is a tricky workaround to + // set the NaN value for doubles. The code is not intuitive + // and should be fixed in the future. + uint32_t r1 = ((rand() & 1) << 1) + 1; + uint32_t r2 = ((rand() & 1) << 1) + 1; + mTestFloatPointer1[r1] = nanf("0xFFFFFFFFFFFF"); + mTestFloatPointer2[r2] = nanf("0xFFFFFFFFFFFF"); + } + } + + if (test == it_mm_max_pd || test == it_mm_max_sd || + test == it_mm_min_pd || test == it_mm_min_sd) { + // Make sure the positive/negative inifinity values are included + // in the testing one out of four times. + if ((rand() & 3) == 0) { + uint32_t r1 = ((rand() & 1) << 1) + 1; + uint32_t r2 = ((rand() & 1) << 1) + 1; + uint32_t r3 = ((rand() & 1) << 1) + 1; + uint32_t r4 = ((rand() & 1) << 1) + 1; + mTestFloatPointer1[r1] = INFINITY; + mTestFloatPointer2[r2] = INFINITY; + mTestFloatPointer1[r3] = -INFINITY; + mTestFloatPointer1[r4] = -INFINITY; + } + } + +#if SSE2NEON_PRECISE_MINMAX + if (test == it_mm_max_ps || test == it_mm_max_ss || + test == it_mm_min_ps || test == it_mm_min_ss) { + // Make sure the NaN values are included in the testing + // one out of four times. + if ((rand() & 3) == 0) { + uint32_t r1 = rand() & 3; + uint32_t r2 = rand() & 3; + mTestFloatPointer1[r1] = nanf(""); + mTestFloatPointer2[r2] = nanf(""); + } + } + + if (test == it_mm_max_pd || test == it_mm_max_sd || + test == it_mm_min_pd || test == it_mm_min_sd) { + // Make sure the NaN values are included in the testing + // one out of four times. + if ((rand() & 3) == 0) { + // FIXME: + // The argument "0xFFFFFFFFFFFF" is a tricky workaround to + // set the NaN value for doubles. The code is not intuitive + // and should be fixed in the future. + uint32_t r1 = ((rand() & 1) << 1) + 1; + uint32_t r2 = ((rand() & 1) << 1) + 1; + mTestFloatPointer1[r1] = nanf("0xFFFFFFFFFFFF"); + mTestFloatPointer2[r2] = nanf("0xFFFFFFFFFFFF"); + } + } +#endif + + // one out of every random 64 times or so, mix up the test floats to + // contain some integer values + if ((rand() & 63) == 0) { + uint32_t option = rand() & 3; + switch (option) { + // All integers.. + case 0: + mTestFloatPointer1[0] = float(mTestIntPointer1[0]); + mTestFloatPointer1[1] = float(mTestIntPointer1[1]); + mTestFloatPointer1[2] = float(mTestIntPointer1[2]); + mTestFloatPointer1[3] = float(mTestIntPointer1[3]); + + mTestFloatPointer2[0] = float(mTestIntPointer2[0]); + mTestFloatPointer2[1] = float(mTestIntPointer2[1]); + mTestFloatPointer2[2] = float(mTestIntPointer2[2]); + mTestFloatPointer2[3] = float(mTestIntPointer2[3]); + + break; + case 1: { + uint32_t index = rand() & 3; + mTestFloatPointer1[index] = float(mTestIntPointer1[index]); + index = rand() & 3; + mTestFloatPointer2[index] = float(mTestIntPointer2[index]); + } break; + case 2: { + uint32_t index1 = rand() & 3; + uint32_t index2 = rand() & 3; + mTestFloatPointer1[index1] = + float(mTestIntPointer1[index1]); + mTestFloatPointer1[index2] = + float(mTestIntPointer1[index2]); + index1 = rand() & 3; + index2 = rand() & 3; + mTestFloatPointer1[index1] = + float(mTestIntPointer1[index1]); + mTestFloatPointer1[index2] = + float(mTestIntPointer1[index2]); + } break; + case 3: + mTestFloatPointer1[0] = float(mTestIntPointer1[0]); + mTestFloatPointer1[1] = float(mTestIntPointer1[1]); + mTestFloatPointer1[2] = float(mTestIntPointer1[2]); + mTestFloatPointer1[3] = float(mTestIntPointer1[3]); + break; + } + if ((rand() & 3) == 0) { // one out of 4 times, make halves + for (uint32_t j = 0; j < 4; j++) { + mTestFloatPointer1[j] *= 0.5f; + mTestFloatPointer2[j] *= 0.5f; + } + } + } + + ret = runSingleTest(test, i); + if (ret == TEST_FAIL) // the test failed... + { + // Set a breakpoint here if you want to step through the failure + // case in the debugger + ret = runSingleTest(test, i); + break; + } + } + return ret; + } +}; + +const char *instructionString[] = { +#define _(x) #x, + INTRIN_LIST +#undef _ +}; + +// Produce rounding which is the same as SSE instructions with _MM_ROUND_NEAREST +// rounding mode +static inline float bankersRounding(float val) +{ + if (val < 0) + return -bankersRounding(-val); + + float ret; + float roundDown = floorf(val); // Round down value + float roundUp = ceilf(val); // Round up value + float diffDown = val - roundDown; + float diffUp = roundUp - val; + + if (diffDown < diffUp) { + /* If it's closer to the round down value, then use it */ + ret = roundDown; + } else if (diffDown > diffUp) { + /* If it's closer to the round up value, then use it */ + ret = roundUp; + } else { + /* If it's equidistant between round up and round down value, pick the + * one which is an even number */ + float half = roundDown / 2; + if (half != floorf(half)) { + /* If the round down value is odd, return the round up value */ + ret = roundUp; + } else { + /* If the round up value is odd, return the round down value */ + ret = roundDown; + } + } + return ret; +} + +static inline double bankersRounding(double val) +{ + if (val < 0) + return -bankersRounding(-val); + + double ret; + double roundDown = floor(val); // Round down value + double roundUp = ceil(val); // Round up value + double diffDown = val - roundDown; + double diffUp = roundUp - val; + + if (diffDown < diffUp) { + /* If it's closer to the round down value, then use it */ + ret = roundDown; + } else if (diffDown > diffUp) { + /* If it's closer to the round up value, then use it */ + ret = roundUp; + } else { + /* If it's equidistant between round up and round down value, pick the + * one which is an even number */ + double half = roundDown / 2; + if (half != floor(half)) { + /* If the round down value is odd, return the round up value */ + ret = roundUp; + } else { + /* If the round up value is odd, return the round down value */ + ret = roundDown; + } + } + return ret; +} + +// SplitMix64 PRNG by Sebastiano Vigna, see: +// +static uint64_t state; // the state of SplitMix64 PRNG +const double TWOPOWER64 = pow(2, 64); + +#define SSE2NEON_INIT_RNG(seed) \ + do { \ + state = seed; \ + } while (0) + +static double next() +{ + uint64_t z = (state += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return (double) (z ^ (z >> 31)); +} + +static float ranf() +{ + return (float) (next() / TWOPOWER64); +} + +static float ranf(float low, float high) +{ + return ranf() * (high - low) + low; +} + +// Enable the tests which are using the macro of another tests +result_t test_mm_slli_si128(const SSE2NEONTestImpl &impl, uint32_t iter); +result_t test_mm_srli_si128(const SSE2NEONTestImpl &impl, uint32_t iter); +result_t test_mm_shuffle_pi16(const SSE2NEONTestImpl &impl, uint32_t iter); + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_set_epi32". +__m128i do_mm_set_epi32(int32_t x, int32_t y, int32_t z, int32_t w) +{ + __m128i a = _mm_set_epi32(x, y, z, w); + validateInt32(a, w, z, y, x); + return a; +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to load __m64 data. +template +__m64 load_m64(const T *p) +{ + return *((const __m64 *) p); +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_load_ps". +template +__m128 load_m128(const T *p) +{ + return _mm_loadu_ps((const float *) p); +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_load_ps". +template +__m128i load_m128i(const T *p) +{ + __m128 a = _mm_loadu_ps((const float *) p); + __m128i ia = _mm_castps_si128(a); + return ia; +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_load_pd". +template +__m128d load_m128d(const T *p) +{ + return _mm_loadu_pd((const double *) p); +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_store_ps". +result_t do_mm_store_ps(float *p, float x, float y, float z, float w) +{ + __m128 a = _mm_set_ps(x, y, z, w); + _mm_store_ps(p, a); + ASSERT_RETURN(p[0] == w); + ASSERT_RETURN(p[1] == z); + ASSERT_RETURN(p[2] == y); + ASSERT_RETURN(p[3] == x); + return TEST_SUCCESS; +} + +// This function is not called from "runSingleTest", but for other intrinsic +// tests that might need to call "_mm_store_ps". +result_t do_mm_store_ps(int32_t *p, int32_t x, int32_t y, int32_t z, int32_t w) +{ + __m128i a = _mm_set_epi32(x, y, z, w); + _mm_store_ps((float *) p, _mm_castsi128_ps(a)); + ASSERT_RETURN(p[0] == w); + ASSERT_RETURN(p[1] == z); + ASSERT_RETURN(p[2] == y); + ASSERT_RETURN(p[3] == x); + return TEST_SUCCESS; +} + +float cmp_noNaN(float a, float b) +{ + return (!isnan(a) && !isnan(b)) ? ALL_BIT_1_32 : 0.0f; +} + +double cmp_noNaN(double a, double b) +{ + return (!isnan(a) && !isnan(b)) ? ALL_BIT_1_64 : 0.0f; +} + +float cmp_hasNaN(float a, float b) +{ + return (isnan(a) || isnan(b)) ? ALL_BIT_1_32 : 0.0f; +} + +double cmp_hasNaN(double a, double b) +{ + return (isnan(a) || isnan(b)) ? ALL_BIT_1_64 : 0.0f; +} + +int32_t comilt_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 0; + return (a < b); +} + +int32_t comigt_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 0; + return (a > b); +} + +int32_t comile_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 0; + return (a <= b); +} + +int32_t comige_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 0; + return (a >= b); +} + +int32_t comieq_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 0; + return (a == b); +} + +int32_t comineq_ss(float a, float b) +{ + if (isnan(a) || isnan(b)) + return 1; + return (a != b); +} + +static inline int16_t saturate_i16(int32_t a) +{ + if (a > INT16_MAX) + return INT16_MAX; + if (a < INT16_MIN) + return INT16_MIN; + return (int16_t) a; +} + +static inline uint16_t saturate_u16(uint32_t a) +{ + if (a > UINT16_MAX) + return UINT16_MAX; + return (uint16_t) a; +} + +uint32_t canonical_crc32_u8(uint32_t crc, uint8_t v) +{ + crc ^= v; + for (int bit = 0; bit < 8; bit++) { + if (crc & 1) + crc = (crc >> 1) ^ UINT32_C(0x82f63b78); + else + crc = (crc >> 1); + } + return crc; +} + +uint32_t canonical_crc32_u16(uint32_t crc, uint16_t v) +{ + crc = canonical_crc32_u8(crc, (uint8_t) (v & 0xff)); + crc = canonical_crc32_u8(crc, (uint8_t) ((v >> 8) & 0xff)); + return crc; +} + +uint32_t canonical_crc32_u32(uint32_t crc, uint32_t v) +{ + crc = canonical_crc32_u16(crc, (uint16_t) (v & 0xffff)); + crc = canonical_crc32_u16(crc, (uint16_t) (v >> 16) & 0xffff); + return crc; +} + +uint64_t canonical_crc32_u64(uint64_t crc, uint64_t v) +{ + crc = canonical_crc32_u32((uint32_t) (crc), (uint32_t) (v & 0xffffffff)); + crc = canonical_crc32_u32((uint32_t) (crc), + (uint32_t) ((v >> 32) & 0xffffffff)); + return crc; +} + +static const uint8_t crypto_aes_sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, + 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, + 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, + 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, + 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, + 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, + 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, + 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, + 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, + 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, + 0xb0, 0x54, 0xbb, 0x16, +}; + +static const uint8_t crypto_aes_rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, + 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, + 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, + 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, + 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, + 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, + 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, + 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, + 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, + 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, + 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, + 0x55, 0x21, 0x0c, 0x7d, +}; + +// XT is x_time function that muliplies 'x' by 2 in GF(2^8) +#define XT(x) (((x) << 1) ^ ((((x) >> 7) & 1) * 0x1b)) + +inline __m128i aesenc_128_reference(__m128i a, __m128i b) +{ + uint8_t i, t, u, v[4][4]; + for (i = 0; i < 16; ++i) { + v[((i / 4) + 4 - (i % 4)) % 4][i % 4] = + crypto_aes_sbox[((SIMDVec *) &a)->m128_u8[i]]; + } + for (i = 0; i < 4; ++i) { + t = v[i][0]; + u = v[i][0] ^ v[i][1] ^ v[i][2] ^ v[i][3]; + v[i][0] ^= u ^ XT(v[i][0] ^ v[i][1]); + v[i][1] ^= u ^ XT(v[i][1] ^ v[i][2]); + v[i][2] ^= u ^ XT(v[i][2] ^ v[i][3]); + v[i][3] ^= u ^ XT(v[i][3] ^ t); + } + + for (i = 0; i < 16; ++i) { + ((SIMDVec *) &a)->m128_u8[i] = + v[i / 4][i % 4] ^ ((SIMDVec *) &b)->m128_u8[i]; + } + + return a; +} + +#define MULTIPLY(x, y) \ + (((y & 1) * x) ^ ((y >> 1 & 1) * XT(x)) ^ ((y >> 2 & 1) * XT(XT(x))) ^ \ + ((y >> 3 & 1) * XT(XT(XT(x)))) ^ ((y >> 4 & 1) * XT(XT(XT(XT(x)))))) + +inline __m128i aesdec_128_reference(__m128i a, __m128i b) +{ + uint8_t i, e, f, g, h, v[4][4]; + for (i = 0; i < 16; ++i) { + v[((i / 4) + (i % 4)) % 4][i % 4] = + crypto_aes_rsbox[((SIMDVec *) &a)->m128_u8[i]]; + } + + for (i = 0; i < 4; ++i) { + e = v[i][0]; + f = v[i][1]; + g = v[i][2]; + h = v[i][3]; + + v[i][0] = (uint8_t) (MULTIPLY(e, 0x0e) ^ MULTIPLY(f, 0x0b) ^ + MULTIPLY(g, 0x0d) ^ MULTIPLY(h, 0x09)); + v[i][1] = (uint8_t) (MULTIPLY(e, 0x09) ^ MULTIPLY(f, 0x0e) ^ + MULTIPLY(g, 0x0b) ^ MULTIPLY(h, 0x0d)); + v[i][2] = (uint8_t) (MULTIPLY(e, 0x0d) ^ MULTIPLY(f, 0x09) ^ + MULTIPLY(g, 0x0e) ^ MULTIPLY(h, 0x0b)); + v[i][3] = (uint8_t) (MULTIPLY(e, 0x0b) ^ MULTIPLY(f, 0x0d) ^ + MULTIPLY(g, 0x09) ^ MULTIPLY(h, 0x0e)); + } + + for (i = 0; i < 16; ++i) { + ((SIMDVec *) &a)->m128_u8[i] = + v[i / 4][i % 4] ^ ((SIMDVec *) &b)->m128_u8[i]; + } + return a; +} + +inline __m128i aesenclast_128_reference(__m128i s, __m128i rk) +{ + uint8_t i, v[4][4]; + for (i = 0; i < 16; ++i) + v[((i / 4) + 4 - (i % 4)) % 4][i % 4] = + crypto_aes_sbox[((SIMDVec *) &s)->m128_u8[i]]; + for (i = 0; i < 16; ++i) + ((SIMDVec *) &s)->m128_u8[i] = + v[i / 4][i % 4] ^ ((SIMDVec *) &rk)->m128_u8[i]; + return s; +} + +// Rotates right (circular right shift) value by "amount" positions +static inline uint32_t rotr(uint32_t value, uint32_t amount) +{ + return (value >> amount) | (value << ((32 - amount) & 31)); +} + +static inline uint64_t MUL(uint32_t a, uint32_t b) +{ + return (uint64_t) a * (uint64_t) b; +} + +// From BearSSL. Performs a 32-bit->64-bit carryless/polynomial +// long multiply. +// +// This implementation was chosen because it is reasonably fast +// without a lookup table or branching. +// +// This does it by splitting up the bits in a way that they +// would not carry, then combine them together with xor (a +// carryless add). +// +// https://www.bearssl.org/gitweb/?p=BearSSL;a=blob;f=src/hash/ghash_ctmul.c;h=3623202;hb=5f045c7#l164 +static uint64_t clmul_32(uint32_t x, uint32_t y) +{ + uint32_t x0, x1, x2, x3; + uint32_t y0, y1, y2, y3; + uint64_t z0, z1, z2, z3; + + x0 = x & (uint32_t) 0x11111111; + x1 = x & (uint32_t) 0x22222222; + x2 = x & (uint32_t) 0x44444444; + x3 = x & (uint32_t) 0x88888888; + y0 = y & (uint32_t) 0x11111111; + y1 = y & (uint32_t) 0x22222222; + y2 = y & (uint32_t) 0x44444444; + y3 = y & (uint32_t) 0x88888888; + z0 = MUL(x0, y0) ^ MUL(x1, y3) ^ MUL(x2, y2) ^ MUL(x3, y1); + z1 = MUL(x0, y1) ^ MUL(x1, y0) ^ MUL(x2, y3) ^ MUL(x3, y2); + z2 = MUL(x0, y2) ^ MUL(x1, y1) ^ MUL(x2, y0) ^ MUL(x3, y3); + z3 = MUL(x0, y3) ^ MUL(x1, y2) ^ MUL(x2, y1) ^ MUL(x3, y0); + z0 &= (uint64_t) 0x1111111111111111; + z1 &= (uint64_t) 0x2222222222222222; + z2 &= (uint64_t) 0x4444444444444444; + z3 &= (uint64_t) 0x8888888888888888; + return z0 | z1 | z2 | z3; +} + +// Performs a 64x64->128-bit carryless/polynomial long +// multiply, using the above routine to calculate the +// subproducts needed for the full-size multiply. +// +// This uses the Karatsuba algorithm. +// +// Normally, the Karatsuba algorithm isn't beneficial +// until very large numbers due to carry tracking and +// multiplication being relatively cheap. +// +// However, we have no carries and multiplication is +// definitely not cheap, so the Karatsuba algorithm is +// a low cost and easy optimization. +// +// https://en.m.wikipedia.org/wiki/Karatsuba_algorithm +// +// Note that addition and subtraction are both +// performed with xor, since all operations are +// carryless. +// +// The comments represent the actual mathematical +// operations being performed (instead of the bitwise +// operations) and to reflect the linked Wikipedia article. +static std::pair clmul_64(uint64_t x, uint64_t y) +{ + // B = 2 + // m = 32 + // x = (x1 * B^m) + x0 + uint32_t x0 = (uint32_t) (x & 0xffffffff); + uint32_t x1 = (uint32_t) (x >> 32); + // y = (y1 * B^m) + y0 + uint32_t y0 = (uint32_t) (y & 0xffffffff); + uint32_t y1 = (uint32_t) (y >> 32); + + // z0 = x0 * y0 + uint64_t z0 = clmul_32(x0, y0); + // z2 = x1 * y1 + uint64_t z2 = clmul_32(x1, y1); + // z1 = (x0 + x1) * (y0 + y1) - z0 - z2 + uint64_t z1 = clmul_32(x0 ^ x1, y0 ^ y1) ^ z0 ^ z2; + + // xy = z0 + (z1 * B^m) + (z2 * B^2m) + // note: z1 is split between the low and high halves + uint64_t xy0 = z0 ^ (z1 << 32); + uint64_t xy1 = z2 ^ (z1 >> 32); + + return std::make_pair(xy0, xy1); +} + +/* MMX */ +result_t test_mm_empty(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return TEST_SUCCESS; +} + +/* SSE */ +result_t test_mm_add_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float dx = _a[0] + _b[0]; + float dy = _a[1] + _b[1]; + float dz = _a[2] + _b[2]; + float dw = _a[3] + _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_add_ps(a, b); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_add_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer1; + + float f0 = _a[0] + _b[0]; + float f1 = _a[1]; + float f2 = _a[2]; + float f3 = _a[3]; + + __m128 a = _mm_load_ps(_a); + __m128 b = _mm_load_ps(_b); + __m128 c = _mm_add_ss(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_and_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_and_ps(a, b); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ia[0] & ib[0]; + r[1] = ia[1] & ib[1]; + r[2] = ia[2] & ib[2]; + r[3] = ia[3] & ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = VALIDATE_INT32_M128(_mm_castps_si128(c), r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + return res; +} + +// r0 := ~a0 & b0 +// r1 := ~a1 & b1 +// r2 := ~a2 & b2 +// r3 := ~a3 & b3 +result_t test_mm_andnot_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_andnot_ps(a, b); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ~ia[0] & ib[0]; + r[1] = ~ia[1] & ib[1]; + r[2] = ~ia[2] & ib[2]; + r[3] = ~ia[3] & ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = TEST_FAIL; + res = VALIDATE_INT32_M128(_mm_castps_si128(c), r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + return res; +} + +result_t test_mm_avg_pu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + uint16_t d[4]; + d[0] = (uint16_t) ((_a[0] + _b[0] + 1) >> 1); + d[1] = (uint16_t) ((_a[1] + _b[1] + 1) >> 1); + d[2] = (uint16_t) ((_a[2] + _b[2] + 1) >> 1); + d[3] = (uint16_t) ((_a[3] + _b[3] + 1) >> 1); + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_avg_pu16(a, b); + + return VALIDATE_UINT16_M64(c, d); +} + +result_t test_mm_avg_pu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint8_t d[8]; + d[0] = (uint8_t) ((_a[0] + _b[0] + 1) >> 1); + d[1] = (uint8_t) ((_a[1] + _b[1] + 1) >> 1); + d[2] = (uint8_t) ((_a[2] + _b[2] + 1) >> 1); + d[3] = (uint8_t) ((_a[3] + _b[3] + 1) >> 1); + d[4] = (uint8_t) ((_a[4] + _b[4] + 1) >> 1); + d[5] = (uint8_t) ((_a[5] + _b[5] + 1) >> 1); + d[6] = (uint8_t) ((_a[6] + _b[6] + 1) >> 1); + d[7] = (uint8_t) ((_a[7] + _b[7] + 1) >> 1); + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_avg_pu8(a, b); + + return VALIDATE_UINT8_M64(c, d); +} + +result_t test_mm_cmpeq_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] == _b[0] ? -1 : 0; + result[1] = _a[1] == _b[1] ? -1 : 0; + result[2] = _a[2] == _b[2] ? -1 : 0; + result[3] = _a[3] == _b[3] ? -1 : 0; + + __m128 ret = _mm_cmpeq_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmpeq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] == _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpeq_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpge_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] >= _b[0] ? -1 : 0; + result[1] = _a[1] >= _b[1] ? -1 : 0; + result[2] = _a[2] >= _b[2] ? -1 : 0; + result[3] = _a[3] >= _b[3] ? -1 : 0; + + __m128 ret = _mm_cmpge_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmpge_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] >= _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpge_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpgt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] > _b[0] ? -1 : 0; + result[1] = _a[1] > _b[1] ? -1 : 0; + result[2] = _a[2] > _b[2] ? -1 : 0; + result[3] = _a[3] > _b[3] ? -1 : 0; + + __m128 ret = _mm_cmpgt_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmpgt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] > _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpgt_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmple_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] <= _b[0] ? -1 : 0; + result[1] = _a[1] <= _b[1] ? -1 : 0; + result[2] = _a[2] <= _b[2] ? -1 : 0; + result[3] = _a[3] <= _b[3] ? -1 : 0; + + __m128 ret = _mm_cmple_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmple_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] <= _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmple_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmplt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] < _b[0] ? -1 : 0; + result[1] = _a[1] < _b[1] ? -1 : 0; + result[2] = _a[2] < _b[2] ? -1 : 0; + result[3] = _a[3] < _b[3] ? -1 : 0; + + __m128 ret = _mm_cmplt_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmplt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] < _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmplt_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpneq_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result[4]; + result[0] = _a[0] != _b[0] ? -1 : 0; + result[1] = _a[1] != _b[1] ? -1 : 0; + result[2] = _a[2] != _b[2] ? -1 : 0; + result[3] = _a[3] != _b[3] ? -1 : 0; + + __m128 ret = _mm_cmpneq_ps(a, b); + __m128i iret = _mm_castps_si128(ret); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmpneq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _a[0] != _b[0] ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpneq_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnge_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] >= _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = !(_a[1] >= _b[1]) ? ALL_BIT_1_32 : 0; + result[2] = !(_a[2] >= _b[2]) ? ALL_BIT_1_32 : 0; + result[3] = !(_a[3] >= _b[3]) ? ALL_BIT_1_32 : 0; + + __m128 ret = _mm_cmpnge_ps(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnge_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] >= _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpnge_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpngt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] > _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = !(_a[1] > _b[1]) ? ALL_BIT_1_32 : 0; + result[2] = !(_a[2] > _b[2]) ? ALL_BIT_1_32 : 0; + result[3] = !(_a[3] > _b[3]) ? ALL_BIT_1_32 : 0; + + __m128 ret = _mm_cmpngt_ps(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpngt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] > _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpngt_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnle_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] <= _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = !(_a[1] <= _b[1]) ? ALL_BIT_1_32 : 0; + result[2] = !(_a[2] <= _b[2]) ? ALL_BIT_1_32 : 0; + result[3] = !(_a[3] <= _b[3]) ? ALL_BIT_1_32 : 0; + + __m128 ret = _mm_cmpnle_ps(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnle_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] <= _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpnle_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnlt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] < _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = !(_a[1] < _b[1]) ? ALL_BIT_1_32 : 0; + result[2] = !(_a[2] < _b[2]) ? ALL_BIT_1_32 : 0; + result[3] = !(_a[3] < _b[3]) ? ALL_BIT_1_32 : 0; + + __m128 ret = _mm_cmpnlt_ps(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpnlt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = !(_a[0] < _b[0]) ? ALL_BIT_1_32 : 0; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpnlt_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpord_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + + for (uint32_t i = 0; i < 4; i++) { + result[i] = cmp_noNaN(_a[i], _b[i]); + } + + __m128 ret = _mm_cmpord_ps(a, b); + + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpord_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = cmp_noNaN(_a[0], _b[0]); + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpord_ss(a, b); + + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpunord_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + + for (uint32_t i = 0; i < 4; i++) { + result[i] = cmp_hasNaN(_a[i], _b[i]); + } + + __m128 ret = _mm_cmpunord_ps(a, b); + + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_cmpunord_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = cmp_hasNaN(_a[0], _b[0]); + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_cmpunord_ss(a, b); + + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_comieq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comieq_ss correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comieq_ss(_a[0], _b[0]); + int32_t ret = _mm_comieq_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +#endif +} + +result_t test_mm_comige_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comige_ss(_a[0], _b[0]); + int32_t ret = _mm_comige_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_comigt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comigt_ss(_a[0], _b[0]); + int32_t ret = _mm_comigt_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_comile_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comile_ss correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comile_ss(_a[0], _b[0]); + int32_t ret = _mm_comile_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +#endif +} + +result_t test_mm_comilt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comilt_ss correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comilt_ss(_a[0], _b[0]); + + int32_t ret = _mm_comilt_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +#endif +} + +result_t test_mm_comineq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comineq_ss correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + int32_t result = comineq_ss(_a[0], _b[0]); + int32_t ret = _mm_comineq_ss(a, b); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +#endif +} + +result_t test_mm_cvt_pi2ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const int32_t *_b = impl.mTestIntPointer2; + + float dx = (float) _b[0]; + float dy = (float) _b[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m64 b = load_m64(_b); + __m128 c = _mm_cvt_pi2ps(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvt_ps2pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int32_t d[2]; + + for (int idx = 0; idx < 2; idx++) { + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d[idx] = (int32_t) (bankersRounding(_a[idx])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d[idx] = (int32_t) (floorf(_a[idx])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d[idx] = (int32_t) (ceilf(_a[idx])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d[idx] = (int32_t) (_a[idx]); + break; + } + } + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvt_ps2pi(a); + + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_cvt_si2ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const int32_t b = *impl.mTestIntPointer2; + + float dx = (float) b; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_cvt_si2ss(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvt_ss2si(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int32_t d0; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d0 = (int32_t) (bankersRounding(_a[0])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d0 = (int32_t) (floorf(_a[0])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d0 = (int32_t) (ceilf(_a[0])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d0 = (int32_t) (_a[0]); + break; + } + + __m128 a = load_m128(_a); + int32_t ret = _mm_cvt_ss2si(a); + return ret == d0 ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtpi16_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + + float dx = (float) _a[0]; + float dy = (float) _a[1]; + float dz = (float) _a[2]; + float dw = (float) _a[3]; + + __m64 a = load_m64(_a); + __m128 c = _mm_cvtpi16_ps(a); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtpi32_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + float dx = (float) _b[0]; + float dy = (float) _b[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m64 b = load_m64(_b); + __m128 c = _mm_cvtpi32_ps(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtpi32x2_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + float dx = (float) _a[0]; + float dy = (float) _a[1]; + float dz = (float) _b[0]; + float dw = (float) _b[1]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m128 c = _mm_cvtpi32x2_ps(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtpi8_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + + float dx = (float) _a[0]; + float dy = (float) _a[1]; + float dz = (float) _a[2]; + float dw = (float) _a[3]; + + __m64 a = load_m64(_a); + __m128 c = _mm_cvtpi8_ps(a); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtps_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int16_t rnd[4]; + + for (int i = 0; i < 4; i++) { + if ((float) INT16_MAX <= _a[i] && _a[i] <= (float) INT32_MAX) { + rnd[i] = INT16_MAX; + } else if (INT16_MIN < _a[i] && _a[i] < INT16_MAX) { + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + rnd[i] = (int16_t) bankersRounding(_a[i]); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + rnd[i] = (int16_t) floorf(_a[i]); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + rnd[i] = (int16_t) ceilf(_a[i]); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + rnd[i] = (int16_t) _a[i]; + break; + } + } else { + rnd[i] = INT16_MIN; + } + } + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvtps_pi16(a); + return VALIDATE_INT16_M64(ret, rnd); +} + +result_t test_mm_cvtps_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int32_t d[2] = {}; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d[0] = (int32_t) bankersRounding(_a[0]); + d[1] = (int32_t) bankersRounding(_a[1]); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d[0] = (int32_t) floorf(_a[0]); + d[1] = (int32_t) floorf(_a[1]); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d[0] = (int32_t) ceilf(_a[0]); + d[1] = (int32_t) ceilf(_a[1]); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + break; + } + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvtps_pi32(a); + + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_cvtps_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int8_t rnd[8] = {}; + + for (int i = 0; i < 4; i++) { + if ((float) INT8_MAX <= _a[i] && _a[i] <= (float) INT32_MAX) { + rnd[i] = INT8_MAX; + } else if (INT8_MIN < _a[i] && _a[i] < INT8_MAX) { + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + rnd[i] = (int8_t) bankersRounding(_a[i]); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + rnd[i] = (int8_t) floorf(_a[i]); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + rnd[i] = (int8_t) ceilf(_a[i]); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + rnd[i] = (int8_t) _a[i]; + break; + } + } else { + rnd[i] = INT8_MIN; + } + } + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvtps_pi8(a); + return VALIDATE_INT8_M64(ret, rnd); +} + +result_t test_mm_cvtpu16_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + + float dx = (float) _a[0]; + float dy = (float) _a[1]; + float dz = (float) _a[2]; + float dw = (float) _a[3]; + + __m64 a = load_m64(_a); + __m128 c = _mm_cvtpu16_ps(a); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtpu8_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + + float dx = (float) _a[0]; + float dy = (float) _a[1]; + float dz = (float) _a[2]; + float dw = (float) _a[3]; + + __m64 a = load_m64(_a); + __m128 c = _mm_cvtpu8_ps(a); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtsi32_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const int32_t b = *impl.mTestIntPointer2; + + float dx = (float) b; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_cvtsi32_ss(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtsi64_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const int64_t b = *(int64_t *) impl.mTestIntPointer2; + + float dx = (float) b; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_cvtsi64_ss(a, b); + + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_cvtss_f32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + float f = _a[0]; + + __m128 a = load_m128(_a); + float c = _mm_cvtss_f32(a); + + return f == c ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtss_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + int32_t d0 = 0; + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d0 = (int32_t) (bankersRounding(_a[0])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d0 = (int32_t) (floorf(_a[0])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d0 = (int32_t) (ceilf(_a[0])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d0 = (int32_t) (_a[0]); + break; + } + + __m128 a = load_m128(_a); + int32_t ret = _mm_cvtss_si32(a); + + return ret == d0 ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtss_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + int64_t d0 = 0; + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d0 = (int64_t) (bankersRounding(_a[0])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d0 = (int64_t) (floorf(_a[0])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d0 = (int64_t) (ceilf(_a[0])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d0 = (int64_t) (_a[0]); + break; + } + + __m128 a = load_m128(_a); + int64_t ret = _mm_cvtss_si64(a); + + return ret == d0 ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtt_ps2pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int32_t d[2]; + + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvtt_ps2pi(a); + + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_cvtt_ss2si(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + __m128 a = load_m128(_a); + int ret = _mm_cvtt_ss2si(a); + + return ret == (int32_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvttps_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + int32_t d[2]; + + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + + __m128 a = load_m128(_a); + __m64 ret = _mm_cvttps_pi32(a); + + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_cvttss_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + __m128 a = load_m128(_a); + int ret = _mm_cvttss_si32(a); + + return ret == (int32_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvttss_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + __m128 a = load_m128(_a); + int64_t ret = _mm_cvttss_si64(a); + + return ret == (int64_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_div_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float f0 = _a[0] / _b[0]; + float f1 = _a[1] / _b[1]; + float f2 = _a[2] / _b[2]; + float f3 = _a[3] / _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_div_ps(a, b); + +#if defined(__arm__) && !defined(__aarch64__) && !defined(_M_ARM64) + // The implementation of "_mm_div_ps()" on ARM 32bit doesn't use "DIV" + // instruction directly, instead it uses "FRECPE" instruction to approximate + // it. Therefore, the precision is not as small as other architecture + return validateFloatError(c, f0, f1, f2, f3, 0.00001f); +#else + return validateFloat(c, f0, f1, f2, f3); +#endif +} + +result_t test_mm_div_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float d0 = _a[0] / _b[0]; + float d1 = _a[1]; + float d2 = _a[2]; + float d3 = _a[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_div_ss(a, b); + +#if defined(__arm__) && !defined(__aarch64__) && !defined(_M_ARM64) + // The implementation of "_mm_div_ps()" on ARM 32bit doesn't use "DIV" + // instruction directly, instead it uses "FRECPE" instruction to approximate + // it. Therefore, the precision is not as small as other architecture + return validateFloatError(c, d0, d1, d2, d3, 0.00001f); +#else + return validateFloat(c, d0, d1, d2, d3); +#endif +} + +result_t test_mm_extract_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME GCC has bug on "_mm_extract_pi16" intrinsics. We will enable this + // test when GCC fix this bug. + // see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98495 for more + // information +#if defined(__clang__) || defined(_MSC_VER) + uint64_t *_a = (uint64_t *) impl.mTestIntPointer1; + const int idx = iter & 0x3; + + __m64 a = load_m64(_a); + int c; + switch (idx) { + case 0: + c = _mm_extract_pi16(a, 0); + break; + case 1: + c = _mm_extract_pi16(a, 1); + break; + case 2: + c = _mm_extract_pi16(a, 2); + break; + case 3: + c = _mm_extract_pi16(a, 3); + break; + } + + ASSERT_RETURN((uint64_t) c == ((*_a >> (idx * 16)) & 0xFFFF)); + ASSERT_RETURN(0 == ((uint64_t) c & 0xFFFF0000)); + return TEST_SUCCESS; +#else + return TEST_UNIMPL; +#endif +} + +result_t test_mm_malloc(const SSE2NEONTestImpl &impl, uint32_t iter); +result_t test_mm_free(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + /* We verify _mm_malloc first, and there is no need to check _mm_free . */ + return test_mm_malloc(impl, iter); +} + +result_t test_mm_get_flush_zero_mode(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + int res_flush_zero_on, res_flush_zero_off; + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); + res_flush_zero_on = _MM_GET_FLUSH_ZERO_MODE() == _MM_FLUSH_ZERO_ON; + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF); + res_flush_zero_off = _MM_GET_FLUSH_ZERO_MODE() == _MM_FLUSH_ZERO_OFF; + + return (res_flush_zero_on && res_flush_zero_off) ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_get_rounding_mode(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int res_toward_zero, res_to_neg_inf, res_to_pos_inf, res_nearest; + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + res_toward_zero = _MM_GET_ROUNDING_MODE() == _MM_ROUND_TOWARD_ZERO ? 1 : 0; + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + res_to_neg_inf = _MM_GET_ROUNDING_MODE() == _MM_ROUND_DOWN ? 1 : 0; + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + res_to_pos_inf = _MM_GET_ROUNDING_MODE() == _MM_ROUND_UP ? 1 : 0; + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + res_nearest = _MM_GET_ROUNDING_MODE() == _MM_ROUND_NEAREST ? 1 : 0; + + if (res_toward_zero && res_to_neg_inf && res_to_pos_inf && res_nearest) { + return TEST_SUCCESS; + } else { + return TEST_FAIL; + } +} + +result_t test_mm_getcsr(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // store original csr value for post test restoring + unsigned int originalCsr = _mm_getcsr(); + + unsigned int roundings[] = {_MM_ROUND_TOWARD_ZERO, _MM_ROUND_DOWN, + _MM_ROUND_UP, _MM_ROUND_NEAREST}; + for (size_t i = 0; i < sizeof(roundings) / sizeof(roundings[0]); i++) { + _mm_setcsr(_mm_getcsr() | roundings[i]); + if ((_mm_getcsr() & roundings[i]) != roundings[i]) { + return TEST_FAIL; + } + } + + // restore original csr value for remaining tests + _mm_setcsr(originalCsr); + + return TEST_SUCCESS; +} + +result_t test_mm_insert_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t insert = (int16_t) impl.mTestInts[iter]; + __m64 a; + __m64 b; + +#define TEST_IMPL(IDX) \ + int16_t d##IDX[4]; \ + for (int i = 0; i < 4; i++) { \ + d##IDX[i] = _a[i]; \ + } \ + d##IDX[IDX] = insert; \ + \ + a = load_m64(_a); \ + b = _mm_insert_pi16(a, insert, IDX); \ + CHECK_RESULT(VALIDATE_INT16_M64(b, d##IDX)) + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_load_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *addr = impl.mTestFloatPointer1; + + __m128 ret = _mm_load_ps(addr); + + return validateFloat(ret, addr[0], addr[1], addr[2], addr[3]); +} + +result_t test_mm_load_ps1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *addr = impl.mTestFloatPointer1; + + __m128 ret = _mm_load_ps1(addr); + + return validateFloat(ret, addr[0], addr[0], addr[0], addr[0]); +} + +result_t test_mm_load_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *addr = impl.mTestFloatPointer1; + + __m128 ret = _mm_load_ss(addr); + + return validateFloat(ret, addr[0], 0, 0, 0); +} + +result_t test_mm_load1_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + __m128 a = _mm_load1_ps(p); + return validateFloat(a, p[0], p[0], p[0], p[0]); +} + +result_t test_mm_loadh_pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p1 = impl.mTestFloatPointer1; + const float *p2 = impl.mTestFloatPointer2; + const __m64 *b = (const __m64 *) p2; + __m128 a = _mm_load_ps(p1); + __m128 c = _mm_loadh_pi(a, b); + + return validateFloat(c, p1[0], p1[1], p2[0], p2[1]); +} + +result_t test_mm_loadl_pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p1 = impl.mTestFloatPointer1; + const float *p2 = impl.mTestFloatPointer2; + __m128 a = _mm_load_ps(p1); + const __m64 *b = (const __m64 *) p2; + __m128 c = _mm_loadl_pi(a, b); + + return validateFloat(c, p2[0], p2[1], p1[2], p1[3]); +} + +result_t test_mm_loadr_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *addr = impl.mTestFloatPointer1; + + __m128 ret = _mm_loadr_ps(addr); + + return validateFloat(ret, addr[3], addr[2], addr[1], addr[0]); +} + +result_t test_mm_loadu_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *addr = impl.mTestFloatPointer1; + + __m128 ret = _mm_loadu_ps(addr); + + return validateFloat(ret, addr[0], addr[1], addr[2], addr[3]); +} + +result_t test_mm_loadu_si16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // The GCC version before 11 does not implement intrinsic function + // _mm_loadu_si16. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95483 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ <= 10) + return TEST_UNIMPL; +#else + const unaligned_int16_t *addr = + (const unaligned_int16_t *) (impl.mTestUnalignedInts + 1); + + __m128i ret = _mm_loadu_si16((const void *) addr); + + return validateInt16(ret, addr[0], 0, 0, 0, 0, 0, 0, 0); +#endif +} + +result_t test_mm_loadu_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // Versions of GCC prior to 9 do not implement intrinsic function + // _mm_loadu_si64. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78782 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ < 9) + return TEST_UNIMPL; +#else + const unaligned_int64_t *addr = + (const unaligned_int64_t *) (impl.mTestUnalignedInts + 1); + + __m128i ret = _mm_loadu_si64((const void *) addr); + + return validateInt64(ret, addr[0], 0); +#endif +} + +result_t test_mm_malloc(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const size_t *a = (const size_t *) impl.mTestIntPointer1; + const size_t *b = (const size_t *) impl.mTestIntPointer2; + size_t size = *a % (1024 * 16) + 1; + size_t align = 2 << (*b % 5); + + void *p = _mm_malloc(size, align); + if (!p) + return TEST_FAIL; + result_t res = (((uintptr_t) p % align) == 0) ? TEST_SUCCESS : TEST_FAIL; + _mm_free(p); + return res; +} + +result_t test_mm_maskmove_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_mask = (const uint8_t *) impl.mTestIntPointer2; + char mem_addr[16]; + + const __m64 *a = (const __m64 *) _a; + const __m64 *mask = (const __m64 *) _mask; + _mm_maskmove_si64(*a, *mask, (char *) mem_addr); + + for (int i = 0; i < 8; i++) { + if (_mask[i] >> 7) { + ASSERT_RETURN(_a[i] == (uint8_t) mem_addr[i]); + } + } + + return TEST_SUCCESS; +} + +result_t test_m_maskmovq(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_maskmove_si64(impl, iter); +} + +result_t test_mm_max_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t c[4]; + + c[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_max_pi16(a, b); + return VALIDATE_INT16_M64(ret, c); +} + +result_t test_mm_max_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float c[4]; + + c[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 ret = _mm_max_ps(a, b); + return validateFloat(ret, c[0], c[1], c[2], c[3]); +} + +result_t test_mm_max_pu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint8_t c[8]; + + c[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + c[4] = _a[4] > _b[4] ? _a[4] : _b[4]; + c[5] = _a[5] > _b[5] ? _a[5] : _b[5]; + c[6] = _a[6] > _b[6] ? _a[6] : _b[6]; + c[7] = _a[7] > _b[7] ? _a[7] : _b[7]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_max_pu8(a, b); + return VALIDATE_UINT8_M64(ret, c); +} + +result_t test_mm_max_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer1; + + float f0 = _a[0] > _b[0] ? _a[0] : _b[0]; + float f1 = _a[1]; + float f2 = _a[2]; + float f3 = _a[3]; + + __m128 a = _mm_load_ps(_a); + __m128 b = _mm_load_ps(_b); + __m128 c = _mm_max_ss(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_min_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t c[4]; + + c[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_min_pi16(a, b); + return VALIDATE_INT16_M64(ret, c); +} + +result_t test_mm_min_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float c[4]; + + c[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 ret = _mm_min_ps(a, b); + return validateFloat(ret, c[0], c[1], c[2], c[3]); +} + +result_t test_mm_min_pu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint8_t c[8]; + + c[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + c[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + c[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + c[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + c[4] = _a[4] < _b[4] ? _a[4] : _b[4]; + c[5] = _a[5] < _b[5] ? _a[5] : _b[5]; + c[6] = _a[6] < _b[6] ? _a[6] : _b[6]; + c[7] = _a[7] < _b[7] ? _a[7] : _b[7]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_min_pu8(a, b); + return VALIDATE_UINT8_M64(ret, c); +} + +result_t test_mm_min_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float c; + + c = _a[0] < _b[0] ? _a[0] : _b[0]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 ret = _mm_min_ss(a, b); + + return validateFloat(ret, c, _a[1], _a[2], _a[3]); +} + +result_t test_mm_move_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + + float result[4]; + result[0] = _b[0]; + result[1] = _a[1]; + result[2] = _a[2]; + result[3] = _a[3]; + + __m128 ret = _mm_move_ss(a, b); + return validateFloat(ret, result[0], result[1], result[2], result[3]); +} + +result_t test_mm_movehl_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float f0 = _b[2]; + float f1 = _b[3]; + float f2 = _a[2]; + float f3 = _a[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 ret = _mm_movehl_ps(a, b); + + return validateFloat(ret, f0, f1, f2, f3); +} + +result_t test_mm_movelh_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float f0 = _a[0]; + float f1 = _a[1]; + float f2 = _b[0]; + float f3 = _b[1]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 ret = _mm_movelh_ps(a, b); + + return validateFloat(ret, f0, f1, f2, f3); +} + +result_t test_mm_movemask_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + unsigned int _c = 0; + for (int i = 0; i < 8; i++) { + if (_a[i] & 0x80) { + _c |= (1 << i); + } + } + + const __m64 *a = (const __m64 *) _a; + int c = _mm_movemask_pi8(*a); + + ASSERT_RETURN((unsigned int) c == _c); + return TEST_SUCCESS; +} + +result_t test_mm_movemask_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + int ret = 0; + + const uint32_t *ip = (const uint32_t *) p; + if (ip[0] & 0x80000000) { + ret |= 1; + } + if (ip[1] & 0x80000000) { + ret |= 2; + } + if (ip[2] & 0x80000000) { + ret |= 4; + } + if (ip[3] & 0x80000000) { + ret |= 8; + } + __m128 a = load_m128(p); + int val = _mm_movemask_ps(a); + return val == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_mul_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float dx = _a[0] * _b[0]; + float dy = _a[1] * _b[1]; + float dz = _a[2] * _b[2]; + float dw = _a[3] * _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_mul_ps(a, b); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_mul_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float dx = _a[0] * _b[0]; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_mul_ss(a, b); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_mulhi_pu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + uint16_t d[4]; + for (uint32_t i = 0; i < 4; i++) { + uint32_t m = (uint32_t) _a[i] * (uint32_t) _b[i]; + d[i] = (uint16_t) (m >> 16); + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_mulhi_pu16(a, b); + return VALIDATE_UINT16_M64(c, d); +} + +result_t test_mm_or_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_or_ps(a, b); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ia[0] | ib[0]; + r[1] = ia[1] | ib[1]; + r[2] = ia[2] | ib[2]; + r[3] = ia[3] | ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = VALIDATE_INT32_M128(_mm_castps_si128(c), r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + + return res; +} + +result_t test_m_pavgb(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_avg_pu8(impl, iter); +} + +result_t test_m_pavgw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_avg_pu16(impl, iter); +} + +result_t test_m_pextrw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_extract_pi16(impl, iter); +} + +result_t test_m_pinsrw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_insert_pi16(impl, iter); +} + +result_t test_m_pmaxsw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_max_pi16(impl, iter); +} + +result_t test_m_pmaxub(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_max_pu8(impl, iter); +} + +result_t test_m_pminsw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_min_pi16(impl, iter); +} + +result_t test_m_pminub(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_min_pu8(impl, iter); +} + +result_t test_m_pmovmskb(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_movemask_pi8(impl, iter); +} + +result_t test_m_pmulhuw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_mulhi_pu16(impl, iter); +} + +result_t test_mm_prefetch(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + typedef struct { + __m128 a; + float r[4]; + } prefetch_test_t; + prefetch_test_t test_vec[8] = { + { + _mm_set_ps(-0.1f, 0.2f, 0.3f, 0.4f), + {0.4f, 0.3f, 0.2f, -0.1f}, + }, + { + _mm_set_ps(0.5f, 0.6f, -0.7f, -0.8f), + {-0.8f, -0.7f, 0.6f, 0.5f}, + }, + { + _mm_set_ps(0.9f, 0.10f, -0.11f, 0.12f), + {0.12f, -0.11f, 0.10f, 0.9f}, + }, + { + _mm_set_ps(-1.1f, -2.1f, -3.1f, -4.1f), + {-4.1f, -3.1f, -2.1f, -1.1f}, + }, + { + _mm_set_ps(100.0f, -110.0f, 120.0f, -130.0f), + {-130.0f, 120.0f, -110.0f, 100.0f}, + }, + { + _mm_set_ps(200.5f, 210.5f, -220.5f, 230.5f), + {995.74f, -93.04f, 144.03f, 902.50f}, + }, + { + _mm_set_ps(10.11f, -11.12f, -12.13f, 13.14f), + {13.14f, -12.13f, -11.12f, 10.11f}, + }, + { + _mm_set_ps(10.1f, -20.2f, 30.3f, 40.4f), + {40.4f, 30.3f, -20.2f, 10.1f}, + }, + }; + + for (size_t i = 0; i < (sizeof(test_vec) / (sizeof(test_vec[0]))); i++) { + _mm_prefetch(((const char *) &test_vec[i].a), _MM_HINT_T0); + _mm_prefetch(((const char *) &test_vec[i].a), _MM_HINT_T1); + _mm_prefetch(((const char *) &test_vec[i].a), _MM_HINT_T2); + _mm_prefetch(((const char *) &test_vec[i].a), _MM_HINT_NTA); + } + + return TEST_SUCCESS; +} + +result_t test_m_psadbw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint16_t d = 0; + for (int i = 0; i < 8; i++) { + d += (uint16_t) abs(_a[i] - _b[i]); + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _m_psadbw(a, b); + return validateUInt16(c, d, 0, 0, 0); +} + +result_t test_m_pshufw(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_shuffle_pi16(impl, iter); +} + +result_t test_mm_rcp_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + float dx = 1.0f / _a[0]; + float dy = 1.0f / _a[1]; + float dz = 1.0f / _a[2]; + float dw = 1.0f / _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_rcp_ps(a); + return validateFloatError(c, dx, dy, dz, dw, 0.001f); +} + +result_t test_mm_rcp_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + float dx = 1.0f / _a[0]; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + __m128 a = load_m128(_a); + __m128 c = _mm_rcp_ss(a); + return validateFloatError(c, dx, dy, dz, dw, 0.001f); +} + +result_t test_mm_rsqrt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = (const float *) impl.mTestFloatPointer1; + + float f0 = 1 / sqrtf(_a[0]); + float f1 = 1 / sqrtf(_a[1]); + float f2 = 1 / sqrtf(_a[2]); + float f3 = 1 / sqrtf(_a[3]); + + __m128 a = load_m128(_a); + __m128 c = _mm_rsqrt_ps(a); + + // Here, we ensure the error rate of "_mm_rsqrt_ps()" is under 0.1% compared + // to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.001f); +} + +result_t test_mm_rsqrt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = (const float *) impl.mTestFloatPointer1; + + float f0 = 1 / sqrtf(_a[0]); + float f1 = _a[1]; + float f2 = _a[2]; + float f3 = _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_rsqrt_ss(a); + + // Here, we ensure the error rate of "_mm_rsqrt_ps()" is under 0.1% compared + // to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.001f); +} + +result_t test_mm_sad_pu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint16_t d = 0; + for (int i = 0; i < 8; i++) { + d += (uint16_t) abs(_a[i] - _b[i]); + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_sad_pu8(a, b); + return validateUInt16(c, d, 0, 0, 0); +} + +result_t test_mm_set_flush_zero_mode(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + // TODO: + // After the behavior of denormal number and flush zero mode is fully + // investigated, the testing would be added. + return TEST_UNIMPL; +} + +result_t test_mm_set_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float x = impl.mTestFloats[iter]; + float y = impl.mTestFloats[iter + 1]; + float z = impl.mTestFloats[iter + 2]; + float w = impl.mTestFloats[iter + 3]; + __m128 a = _mm_set_ps(x, y, z, w); + return validateFloat(a, w, z, y, x); +} + +result_t test_mm_set_ps1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float a = impl.mTestFloats[iter]; + + __m128 ret = _mm_set_ps1(a); + + return validateFloat(ret, a, a, a, a); +} + +OPTNONE result_t test_mm_set_rounding_mode(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + result_t res_toward_zero, res_to_neg_inf, res_to_pos_inf, res_nearest; + + __m128 a = load_m128(_a); + __m128 b = _mm_setzero_ps(), c = _mm_setzero_ps(); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + b = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + c = _mm_round_ps(a, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); + res_toward_zero = validate128(c, b); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + b = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + c = _mm_round_ps(a, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); + res_to_neg_inf = validate128(c, b); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + b = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + c = _mm_round_ps(a, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); + res_to_pos_inf = validate128(c, b); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + b = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + c = _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); + res_nearest = validate128(c, b); + + if (res_toward_zero == TEST_SUCCESS && res_to_neg_inf == TEST_SUCCESS && + res_to_pos_inf == TEST_SUCCESS && res_nearest == TEST_SUCCESS) { + return TEST_SUCCESS; + } else { + return TEST_FAIL; + } +} + +result_t test_mm_set_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float a = impl.mTestFloats[iter]; + __m128 c = _mm_set_ss(a); + return validateFloat(c, a, 0, 0, 0); +} + +result_t test_mm_set1_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float w = impl.mTestFloats[iter]; + __m128 a = _mm_set1_ps(w); + return validateFloat(a, w, w, w, w); +} + +result_t test_mm_setcsr(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_set_rounding_mode(impl, iter); +} + +result_t test_mm_setr_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float x = impl.mTestFloats[iter]; + float y = impl.mTestFloats[iter + 1]; + float z = impl.mTestFloats[iter + 2]; + float w = impl.mTestFloats[iter + 3]; + + __m128 ret = _mm_setr_ps(w, z, y, x); + + return validateFloat(ret, w, z, y, x); +} + +result_t test_mm_setzero_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128 a = _mm_setzero_ps(); + return validateFloat(a, 0, 0, 0, 0); +} + +result_t test_mm_sfence(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + /* FIXME: Assume that memory barriers always function as intended. */ + return TEST_SUCCESS; +} + +result_t test_mm_shuffle_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m64 a; + __m64 d; + int16_t _d[4]; +#define TEST_IMPL(IDX) \ + a = load_m64(_a); \ + d = _mm_shuffle_pi16(a, IDX); \ + \ + _d[0] = _a[IDX & 0x3]; \ + _d[1] = _a[(IDX >> 2) & 0x3]; \ + _d[2] = _a[(IDX >> 4) & 0x3]; \ + _d[3] = _a[(IDX >> 6) & 0x3]; \ + if (VALIDATE_INT16_M64(d, _d) != TEST_SUCCESS) { \ + return TEST_FAIL; \ + } + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +#endif +} + +// Note, NEON does not have a general purpose shuffled command like SSE. +// When invoking this method, there is special code for a number of the most +// common shuffle permutations +result_t test_mm_shuffle_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + result_t isValid = TEST_SUCCESS; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + // Test many permutations of the shuffle operation, including all + // permutations which have an optimized/customized implementation + __m128 ret; + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(0, 1, 2, 3)); + if (!validateFloat(ret, _a[3], _a[2], _b[1], _b[0])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(3, 2, 1, 0)); + if (!validateFloat(ret, _a[0], _a[1], _b[2], _b[3])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(0, 0, 1, 1)); + if (!validateFloat(ret, _a[1], _a[1], _b[0], _b[0])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(3, 1, 0, 2)); + if (!validateFloat(ret, _a[2], _a[0], _b[1], _b[3])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(1, 0, 3, 2)); + if (!validateFloat(ret, _a[2], _a[3], _b[0], _b[1])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(2, 3, 0, 1)); + if (!validateFloat(ret, _a[1], _a[0], _b[3], _b[2])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(0, 0, 2, 2)); + if (!validateFloat(ret, _a[2], _a[2], _b[0], _b[0])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(2, 2, 0, 0)); + if (!validateFloat(ret, _a[0], _a[0], _b[2], _b[2])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(3, 2, 0, 2)); + if (!validateFloat(ret, _a[2], _a[0], _b[2], _b[3])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(1, 1, 3, 3)); + if (!validateFloat(ret, _a[3], _a[3], _b[1], _b[1])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(2, 0, 1, 0)); + if (!validateFloat(ret, _a[0], _a[1], _b[0], _b[2])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(2, 0, 0, 1)); + if (!validateFloat(ret, _a[1], _a[0], _b[0], _b[2])) { + isValid = TEST_FAIL; + } + ret = _mm_shuffle_ps(a, b, _MM_SHUFFLE(2, 0, 3, 2)); + if (!validateFloat(ret, _a[2], _a[3], _b[0], _b[2])) { + isValid = TEST_FAIL; + } + + return isValid; +} + +result_t test_mm_sqrt_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = (const float *) impl.mTestFloatPointer1; + + float f0 = sqrtf(_a[0]); + float f1 = sqrtf(_a[1]); + float f2 = sqrtf(_a[2]); + float f3 = sqrtf(_a[3]); + + __m128 a = load_m128(_a); + __m128 c = _mm_sqrt_ps(a); + +#if defined(__arm__) && !defined(__arm64__) && !defined(_M_ARM64) + // Here, we ensure the error rate of "_mm_sqrt_ps()" ARMv7-A implementation + // is under 10^-4% compared to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.0001f); +#else + // Here, we ensure the error rate of "_mm_sqrt_ps()" is under 10^-6% + // compared to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.000001f); +#endif +} + +result_t test_mm_sqrt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = (const float *) impl.mTestFloatPointer1; + + float f0 = sqrtf(_a[0]); + float f1 = _a[1]; + float f2 = _a[2]; + float f3 = _a[3]; + + __m128 a = load_m128(_a); + __m128 c = _mm_sqrt_ss(a); + +#if defined(__arm__) && !defined(__arm64__) && !defined(_M_ARM64) + // Here, we ensure the error rate of "_mm_sqrt_ps()" ARMv7-A implementation + // is under 10^-4% compared to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.0001f); +#else + // Here, we ensure the error rate of "_mm_sqrt_ps()" is under 10^-6% + // compared to the C implementation. + return validateFloatError(c, f0, f1, f2, f3, 0.000001f); +#endif +} + +result_t test_mm_store_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int32_t *p = impl.mTestIntPointer1; + int32_t x = impl.mTestInts[iter]; + int32_t y = impl.mTestInts[iter + 1]; + int32_t z = impl.mTestInts[iter + 2]; + int32_t w = impl.mTestInts[iter + 3]; + __m128i a = _mm_set_epi32(x, y, z, w); + _mm_store_ps((float *) p, _mm_castsi128_ps(a)); + ASSERT_RETURN(p[0] == w); + ASSERT_RETURN(p[1] == z); + ASSERT_RETURN(p[2] == y); + ASSERT_RETURN(p[3] == x); + return TEST_SUCCESS; +} + +result_t test_mm_store_ps1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *p = impl.mTestFloatPointer1; + float d[4]; + + __m128 a = load_m128(p); + _mm_store_ps1(d, a); + + ASSERT_RETURN(d[0] == *p); + ASSERT_RETURN(d[1] == *p); + ASSERT_RETURN(d[2] == *p); + ASSERT_RETURN(d[3] == *p); + return TEST_SUCCESS; +} + +result_t test_mm_store_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float x = impl.mTestFloats[iter]; + float p[4]; + + __m128 a = _mm_set_ss(x); + _mm_store_ss(p, a); + ASSERT_RETURN(p[0] == x); + return TEST_SUCCESS; +} + +result_t test_mm_store1_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *p = impl.mTestFloatPointer1; + float d[4]; + + __m128 a = load_m128(p); + _mm_store1_ps(d, a); + + ASSERT_RETURN(d[0] == *p); + ASSERT_RETURN(d[1] == *p); + ASSERT_RETURN(d[2] == *p); + ASSERT_RETURN(d[3] == *p); + return TEST_SUCCESS; +} + +result_t test_mm_storeh_pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + float d[4] = {1.0f, 2.0f, 3.0f, 4.0f}; + __m128 a = _mm_load_ps(p); + __m64 *b = (__m64 *) d; + + _mm_storeh_pi(b, a); + ASSERT_RETURN(d[0] == p[2]); + ASSERT_RETURN(d[1] == p[3]); + ASSERT_RETURN(d[2] == 3.0f); + ASSERT_RETURN(d[3] == 4.0f); + return TEST_SUCCESS; +} + +result_t test_mm_storel_pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + float d[4] = {1.0f, 2.0f, 3.0f, 4.0f}; + __m128 a = _mm_load_ps(p); + __m64 *b = (__m64 *) d; + + _mm_storel_pi(b, a); + ASSERT_RETURN(d[0] == p[0]); + ASSERT_RETURN(d[1] == p[1]); + ASSERT_RETURN(d[2] == 3.0f); + ASSERT_RETURN(d[3] == 4.0f); + return TEST_SUCCESS; +} + +result_t test_mm_storer_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *p = impl.mTestFloatPointer1; + float d[4]; + + __m128 a = load_m128(p); + _mm_storer_ps(d, a); + + ASSERT_RETURN(d[0] == p[3]); + ASSERT_RETURN(d[1] == p[2]); + ASSERT_RETURN(d[2] == p[1]); + ASSERT_RETURN(d[3] == p[0]); + return TEST_SUCCESS; +} + +result_t test_mm_storeu_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *_a = impl.mTestFloatPointer1; + float f[4]; + __m128 a = _mm_load_ps(_a); + + _mm_storeu_ps(f, a); + return validateFloat(a, f[0], f[1], f[2], f[3]); +} + +result_t test_mm_storeu_si16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // The GCC version before 11 does not implement intrinsic function + // _mm_storeu_si16. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95483 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ <= 10) + return TEST_UNIMPL; +#else + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i b = _mm_setzero_si128(); + __m128i a = load_m128i(_a); + _mm_storeu_si16(&b, a); + int16_t *_b = (int16_t *) &b; + int16_t *_c = (int16_t *) &a; + return validateInt16(b, _c[0], _b[1], _b[2], _b[3], _b[4], _b[5], _b[6], + _b[7]); +#endif +} + +result_t test_mm_storeu_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // Versions of GCC prior to 9 do not implement intrinsic function + // _mm_storeu_si64. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87558 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ < 9) + return TEST_UNIMPL; +#else + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i b = _mm_setzero_si128(); + __m128i a = load_m128i(_a); + _mm_storeu_si64(&b, a); + int64_t *_b = (int64_t *) &b; + int64_t *_c = (int64_t *) &a; + return validateInt64(b, _c[0], _b[1]); +#endif +} + +result_t test_mm_stream_pi(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + __m64 a = load_m64(_a); + __m64 p; + + _mm_stream_pi(&p, a); + return validateInt64(p, _a[0]); +} + +result_t test_mm_stream_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + __m128 a = load_m128(_a); + alignas(16) float p[4]; + + _mm_stream_ps(p, a); + ASSERT_RETURN(p[0] == _a[0]); + ASSERT_RETURN(p[1] == _a[1]); + ASSERT_RETURN(p[2] == _a[2]); + ASSERT_RETURN(p[3] == _a[3]); + return TEST_SUCCESS; +} + +result_t test_mm_sub_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float dx = _a[0] - _b[0]; + float dy = _a[1] - _b[1]; + float dz = _a[2] - _b[2]; + float dw = _a[3] - _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_sub_ps(a, b); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_sub_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float dx = _a[0] - _b[0]; + float dy = _a[1]; + float dz = _a[2]; + float dw = _a[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_sub_ss(a, b); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_ucomieq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomieq_ss is equal to _mm_comieq_ss + return test_mm_comieq_ss(impl, iter); +} + +result_t test_mm_ucomige_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomige_ss is equal to _mm_comige_ss + return test_mm_comige_ss(impl, iter); +} + +result_t test_mm_ucomigt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomigt_ss is equal to _mm_comigt_ss + return test_mm_comigt_ss(impl, iter); +} + +result_t test_mm_ucomile_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomile_ss is equal to _mm_comile_ss + return test_mm_comile_ss(impl, iter); +} + +result_t test_mm_ucomilt_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomilt_ss is equal to _mm_comilt_ss + return test_mm_comilt_ss(impl, iter); +} + +result_t test_mm_ucomineq_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // _mm_ucomineq_ss is equal to _mm_comineq_ss + return test_mm_comineq_ss(impl, iter); +} + +result_t test_mm_undefined_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128 a = _mm_undefined_ps(); + a = _mm_xor_ps(a, a); + return validateFloat(a, 0, 0, 0, 0); +} + +result_t test_mm_unpackhi_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *_a = impl.mTestFloatPointer1; + float *_b = impl.mTestFloatPointer1; + + float f0 = _a[2]; + float f1 = _b[2]; + float f2 = _a[3]; + float f3 = _b[3]; + + __m128 a = _mm_load_ps(_a); + __m128 b = _mm_load_ps(_b); + __m128 c = _mm_unpackhi_ps(a, b); + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_unpacklo_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + float *_a = impl.mTestFloatPointer1; + float *_b = impl.mTestFloatPointer1; + + float f0 = _a[0]; + float f1 = _b[0]; + float f2 = _a[1]; + float f3 = _b[1]; + + __m128 a = _mm_load_ps(_a); + __m128 b = _mm_load_ps(_b); + __m128 c = _mm_unpacklo_ps(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_xor_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestFloatPointer1; + const int32_t *_b = (const int32_t *) impl.mTestFloatPointer2; + float d0 = sse2neon_tool_recast_f32(_a[0] ^ _b[0]); + float d1 = sse2neon_tool_recast_f32(_a[1] ^ _b[1]); + float d2 = sse2neon_tool_recast_f32(_a[2] ^ _b[2]); + float d3 = sse2neon_tool_recast_f32(_a[3] ^ _b[3]); + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_xor_ps(a, b); + + return validateFloat(c, d0, d1, d2, d3); +} + +/* SSE2 */ +result_t test_mm_add_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[8]; + d[0] = _a[0] + _b[0]; + d[1] = _a[1] + _b[1]; + d[2] = _a[2] + _b[2]; + d[3] = _a[3] + _b[3]; + d[4] = _a[4] + _b[4]; + d[5] = _a[5] + _b[5]; + d[6] = _a[6] + _b[6]; + d[7] = _a[7] + _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_add_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_add_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + int32_t d[4]; + d[0] = _a[0] + _b[0]; + d[1] = _a[1] + _b[1]; + d[2] = _a[2] + _b[2]; + d[3] = _a[3] + _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_add_epi32(a, b); + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_add_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t d0 = _a[0] + _b[0]; + int64_t d1 = _a[1] + _b[1]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_add_epi64(a, b); + + return validateInt64(c, d0, d1); +} + +result_t test_mm_add_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = _a[0] + _b[0]; + d[1] = _a[1] + _b[1]; + d[2] = _a[2] + _b[2]; + d[3] = _a[3] + _b[3]; + d[4] = _a[4] + _b[4]; + d[5] = _a[5] + _b[5]; + d[6] = _a[6] + _b[6]; + d[7] = _a[7] + _b[7]; + d[8] = _a[8] + _b[8]; + d[9] = _a[9] + _b[9]; + d[10] = _a[10] + _b[10]; + d[11] = _a[11] + _b[11]; + d[12] = _a[12] + _b[12]; + d[13] = _a[13] + _b[13]; + d[14] = _a[14] + _b[14]; + d[15] = _a[15] + _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_add_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_add_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] + _b[0]; + double d1 = _a[1] + _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_add_pd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_add_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] + _b[0]; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_add_sd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_add_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t d0 = _a[0] + _b[0]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_add_si64(a, b); + + return validateInt64(c, d0); +} + +result_t test_mm_adds_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = saturate_i16((int32_t) _a[0] + (int32_t) _b[0]); + d[1] = saturate_i16((int32_t) _a[1] + (int32_t) _b[1]); + d[2] = saturate_i16((int32_t) _a[2] + (int32_t) _b[2]); + d[3] = saturate_i16((int32_t) _a[3] + (int32_t) _b[3]); + d[4] = saturate_i16((int32_t) _a[4] + (int32_t) _b[4]); + d[5] = saturate_i16((int32_t) _a[5] + (int32_t) _b[5]); + d[6] = saturate_i16((int32_t) _a[6] + (int32_t) _b[6]); + d[7] = saturate_i16((int32_t) _a[7] + (int32_t) _b[7]); + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + __m128i c = _mm_adds_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_adds_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int16_t d[16]; + for (int i = 0; i < 16; i++) { + d[i] = (int16_t) _a[i] + (int16_t) _b[i]; + if (d[i] > 127) + d[i] = 127; + if (d[i] < -128) + d[i] = -128; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_adds_epi8(a, b); + + return VALIDATE_INT8_M128(c, (int8_t) d); +} + +result_t test_mm_adds_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + + uint16_t d[8]; + d[0] = saturate_u16((uint32_t) _a[0] + (uint32_t) _b[0]); + d[1] = saturate_u16((uint32_t) _a[1] + (uint32_t) _b[1]); + d[2] = saturate_u16((uint32_t) _a[2] + (uint32_t) _b[2]); + d[3] = saturate_u16((uint32_t) _a[3] + (uint32_t) _b[3]); + d[4] = saturate_u16((uint32_t) _a[4] + (uint32_t) _b[4]); + d[5] = saturate_u16((uint32_t) _a[5] + (uint32_t) _b[5]); + d[6] = saturate_u16((uint32_t) _a[6] + (uint32_t) _b[6]); + d[7] = saturate_u16((uint32_t) _a[7] + (uint32_t) _b[7]); + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_adds_epu16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_adds_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + uint8_t d[16]; + d[0] = (uint8_t) _a[0] + (uint8_t) _b[0]; + if (d[0] < (uint8_t) _a[0]) + d[0] = 255; + d[1] = (uint8_t) _a[1] + (uint8_t) _b[1]; + if (d[1] < (uint8_t) _a[1]) + d[1] = 255; + d[2] = (uint8_t) _a[2] + (uint8_t) _b[2]; + if (d[2] < (uint8_t) _a[2]) + d[2] = 255; + d[3] = (uint8_t) _a[3] + (uint8_t) _b[3]; + if (d[3] < (uint8_t) _a[3]) + d[3] = 255; + d[4] = (uint8_t) _a[4] + (uint8_t) _b[4]; + if (d[4] < (uint8_t) _a[4]) + d[4] = 255; + d[5] = (uint8_t) _a[5] + (uint8_t) _b[5]; + if (d[5] < (uint8_t) _a[5]) + d[5] = 255; + d[6] = (uint8_t) _a[6] + (uint8_t) _b[6]; + if (d[6] < (uint8_t) _a[6]) + d[6] = 255; + d[7] = (uint8_t) _a[7] + (uint8_t) _b[7]; + if (d[7] < (uint8_t) _a[7]) + d[7] = 255; + d[8] = (uint8_t) _a[8] + (uint8_t) _b[8]; + if (d[8] < (uint8_t) _a[8]) + d[8] = 255; + d[9] = (uint8_t) _a[9] + (uint8_t) _b[9]; + if (d[9] < (uint8_t) _a[9]) + d[9] = 255; + d[10] = (uint8_t) _a[10] + (uint8_t) _b[10]; + if (d[10] < (uint8_t) _a[10]) + d[10] = 255; + d[11] = (uint8_t) _a[11] + (uint8_t) _b[11]; + if (d[11] < (uint8_t) _a[11]) + d[11] = 255; + d[12] = (uint8_t) _a[12] + (uint8_t) _b[12]; + if (d[12] < (uint8_t) _a[12]) + d[12] = 255; + d[13] = (uint8_t) _a[13] + (uint8_t) _b[13]; + if (d[13] < (uint8_t) _a[13]) + d[13] = 255; + d[14] = (uint8_t) _a[14] + (uint8_t) _b[14]; + if (d[14] < (uint8_t) _a[14]) + d[14] = 255; + d[15] = (uint8_t) _a[15] + (uint8_t) _b[15]; + if (d[15] < (uint8_t) _a[15]) + d[15] = 255; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_adds_epu8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_and_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestFloatPointer1; + const int64_t *_b = (const int64_t *) impl.mTestFloatPointer2; + double d0 = sse2neon_tool_recast_f64(_a[0] & _b[0]); + double d1 = sse2neon_tool_recast_f64(_a[1] & _b[1]); + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_and_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_and_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128 fc = _mm_and_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b)); + __m128i c = _mm_castps_si128(fc); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ia[0] & ib[0]; + r[1] = ia[1] & ib[1]; + r[2] = ia[2] & ib[2]; + r[3] = ia[3] & ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = VALIDATE_INT32_M128(c, r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + return res; +} + +result_t test_mm_andnot_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_andnot_pd(a, b); + + // Take AND operation a complement of 'a' and 'b'. Bitwise operations are + // not allowed on float/double datatype, so 'a' and 'b' are calculated in + // uint64_t datatype. + const uint64_t *ia = (const uint64_t *) &a; + const uint64_t *ib = (const uint64_t *) &b; + uint64_t r0 = ~ia[0] & ib[0]; + uint64_t r1 = ~ia[1] & ib[1]; + return validateUInt64(_mm_castpd_si128(c), r0, r1); +} + +result_t test_mm_andnot_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128 fc = _mm_andnot_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b)); + __m128i c = _mm_castps_si128(fc); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ~ia[0] & ib[0]; + r[1] = ~ia[1] & ib[1]; + r[2] = ~ia[2] & ib[2]; + r[3] = ~ia[3] & ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = TEST_SUCCESS; + res = VALIDATE_INT32_M128(c, r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + return res; +} + +result_t test_mm_avg_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + uint16_t d[8]; + d[0] = (uint16_t) ((_a[0] + _b[0] + 1) >> 1); + d[1] = (uint16_t) ((_a[1] + _b[1] + 1) >> 1); + d[2] = (uint16_t) ((_a[2] + _b[2] + 1) >> 1); + d[3] = (uint16_t) ((_a[3] + _b[3] + 1) >> 1); + d[4] = (uint16_t) ((_a[4] + _b[4] + 1) >> 1); + d[5] = (uint16_t) ((_a[5] + _b[5] + 1) >> 1); + d[6] = (uint16_t) ((_a[6] + _b[6] + 1) >> 1); + d[7] = (uint16_t) ((_a[7] + _b[7] + 1) >> 1); + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_avg_epu16(a, b); + return VALIDATE_UINT16_M128(c, d); +} + +result_t test_mm_avg_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint8_t d[16]; + d[0] = (uint8_t) ((_a[0] + _b[0] + 1) >> 1); + d[1] = (uint8_t) ((_a[1] + _b[1] + 1) >> 1); + d[2] = (uint8_t) ((_a[2] + _b[2] + 1) >> 1); + d[3] = (uint8_t) ((_a[3] + _b[3] + 1) >> 1); + d[4] = (uint8_t) ((_a[4] + _b[4] + 1) >> 1); + d[5] = (uint8_t) ((_a[5] + _b[5] + 1) >> 1); + d[6] = (uint8_t) ((_a[6] + _b[6] + 1) >> 1); + d[7] = (uint8_t) ((_a[7] + _b[7] + 1) >> 1); + d[8] = (uint8_t) ((_a[8] + _b[8] + 1) >> 1); + d[9] = (uint8_t) ((_a[9] + _b[9] + 1) >> 1); + d[10] = (uint8_t) ((_a[10] + _b[10] + 1) >> 1); + d[11] = (uint8_t) ((_a[11] + _b[11] + 1) >> 1); + d[12] = (uint8_t) ((_a[12] + _b[12] + 1) >> 1); + d[13] = (uint8_t) ((_a[13] + _b[13] + 1) >> 1); + d[14] = (uint8_t) ((_a[14] + _b[14] + 1) >> 1); + d[15] = (uint8_t) ((_a[15] + _b[15] + 1) >> 1); + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_avg_epu8(a, b); + return VALIDATE_UINT8_M128(c, d); +} + +result_t test_mm_bslli_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_slli_si128(impl, iter); +} + +result_t test_mm_bsrli_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_srli_si128(impl, iter); +} + +result_t test_mm_castpd_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const __m128d a = load_m128d(_a); + const __m128 _c = load_m128(_a); + + __m128 r = _mm_castpd_ps(a); + + return validate128(r, _c); +} + +result_t test_mm_castpd_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const __m128d a = load_m128d(_a); + const __m128i *_c = (const __m128i *) _a; + + __m128i r = _mm_castpd_si128(a); + + return validate128(r, *_c); +} + +result_t test_mm_castps_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const __m128 a = load_m128(_a); + const __m128d *_c = (const __m128d *) _a; + + __m128d r = _mm_castps_pd(a); + + return validate128(r, *_c); +} + +result_t test_mm_castps_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + + const __m128i *_c = (const __m128i *) _a; + + const __m128 a = load_m128(_a); + __m128i r = _mm_castps_si128(a); + + return validate128(r, *_c); +} + +result_t test_mm_castsi128_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + + const __m128d *_c = (const __m128d *) _a; + + const __m128i a = load_m128i(_a); + __m128d r = _mm_castsi128_pd(a); + + return validate128(r, *_c); +} + +result_t test_mm_castsi128_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + + const __m128 *_c = (const __m128 *) _a; + + const __m128i a = load_m128i(_a); + __m128 r = _mm_castsi128_ps(a); + + return validate128(r, *_c); +} + +result_t test_mm_clflush(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + /* FIXME: Assume that we have portable mechanisms to flush cache. */ + return TEST_SUCCESS; +} + +result_t test_mm_cmpeq_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = (_a[0] == _b[0]) ? ~UINT16_C(0) : 0x0; + d[1] = (_a[1] == _b[1]) ? ~UINT16_C(0) : 0x0; + d[2] = (_a[2] == _b[2]) ? ~UINT16_C(0) : 0x0; + d[3] = (_a[3] == _b[3]) ? ~UINT16_C(0) : 0x0; + d[4] = (_a[4] == _b[4]) ? ~UINT16_C(0) : 0x0; + d[5] = (_a[5] == _b[5]) ? ~UINT16_C(0) : 0x0; + d[6] = (_a[6] == _b[6]) ? ~UINT16_C(0) : 0x0; + d[7] = (_a[7] == _b[7]) ? ~UINT16_C(0) : 0x0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpeq_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_cmpeq_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + + int32_t d[4]; + d[0] = (_a[0] == _b[0]) ? ~UINT32_C(0) : 0x0; + d[1] = (_a[1] == _b[1]) ? ~UINT32_C(0) : 0x0; + d[2] = (_a[2] == _b[2]) ? ~UINT32_C(0) : 0x0; + d[3] = (_a[3] == _b[3]) ? ~UINT32_C(0) : 0x0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpeq_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_cmpeq_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = (_a[0] == _b[0]) ? ~UINT8_C(0) : 0x00; + d[1] = (_a[1] == _b[1]) ? ~UINT8_C(0) : 0x00; + d[2] = (_a[2] == _b[2]) ? ~UINT8_C(0) : 0x00; + d[3] = (_a[3] == _b[3]) ? ~UINT8_C(0) : 0x00; + d[4] = (_a[4] == _b[4]) ? ~UINT8_C(0) : 0x00; + d[5] = (_a[5] == _b[5]) ? ~UINT8_C(0) : 0x00; + d[6] = (_a[6] == _b[6]) ? ~UINT8_C(0) : 0x00; + d[7] = (_a[7] == _b[7]) ? ~UINT8_C(0) : 0x00; + d[8] = (_a[8] == _b[8]) ? ~UINT8_C(0) : 0x00; + d[9] = (_a[9] == _b[9]) ? ~UINT8_C(0) : 0x00; + d[10] = (_a[10] == _b[10]) ? ~UINT8_C(0) : 0x00; + d[11] = (_a[11] == _b[11]) ? ~UINT8_C(0) : 0x00; + d[12] = (_a[12] == _b[12]) ? ~UINT8_C(0) : 0x00; + d[13] = (_a[13] == _b[13]) ? ~UINT8_C(0) : 0x00; + d[14] = (_a[14] == _b[14]) ? ~UINT8_C(0) : 0x00; + d[15] = (_a[15] == _b[15]) ? ~UINT8_C(0) : 0x00; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpeq_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_cmpeq_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] == _b[0]) ? sse2neon_tool_recast_f64(UINT64_MAX) : 0; + double d1 = (_a[1] == _b[1]) ? sse2neon_tool_recast_f64(UINT64_MAX) : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpeq_pd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpeq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] == _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpeq_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpge_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] >= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = (_a[1] >= _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpge_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpge_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = (_a[0] >= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpge_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpgt_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + uint16_t d[8]; + d[0] = _a[0] > _b[0] ? ~UINT16_C(0) : 0; + d[1] = _a[1] > _b[1] ? ~UINT16_C(0) : 0; + d[2] = _a[2] > _b[2] ? ~UINT16_C(0) : 0; + d[3] = _a[3] > _b[3] ? ~UINT16_C(0) : 0; + d[4] = _a[4] > _b[4] ? ~UINT16_C(0) : 0; + d[5] = _a[5] > _b[5] ? ~UINT16_C(0) : 0; + d[6] = _a[6] > _b[6] ? ~UINT16_C(0) : 0; + d[7] = _a[7] > _b[7] ? ~UINT16_C(0) : 0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpgt_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_cmpgt_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + int32_t result[4]; + + result[0] = _a[0] > _b[0] ? -1 : 0; + result[1] = _a[1] > _b[1] ? -1 : 0; + result[2] = _a[2] > _b[2] ? -1 : 0; + result[3] = _a[3] > _b[3] ? -1 : 0; + + __m128i iret = _mm_cmpgt_epi32(a, b); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmpgt_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = (_a[0] > _b[0]) ? ~UINT8_C(0) : 0x00; + d[1] = (_a[1] > _b[1]) ? ~UINT8_C(0) : 0x00; + d[2] = (_a[2] > _b[2]) ? ~UINT8_C(0) : 0x00; + d[3] = (_a[3] > _b[3]) ? ~UINT8_C(0) : 0x00; + d[4] = (_a[4] > _b[4]) ? ~UINT8_C(0) : 0x00; + d[5] = (_a[5] > _b[5]) ? ~UINT8_C(0) : 0x00; + d[6] = (_a[6] > _b[6]) ? ~UINT8_C(0) : 0x00; + d[7] = (_a[7] > _b[7]) ? ~UINT8_C(0) : 0x00; + d[8] = (_a[8] > _b[8]) ? ~UINT8_C(0) : 0x00; + d[9] = (_a[9] > _b[9]) ? ~UINT8_C(0) : 0x00; + d[10] = (_a[10] > _b[10]) ? ~UINT8_C(0) : 0x00; + d[11] = (_a[11] > _b[11]) ? ~UINT8_C(0) : 0x00; + d[12] = (_a[12] > _b[12]) ? ~UINT8_C(0) : 0x00; + d[13] = (_a[13] > _b[13]) ? ~UINT8_C(0) : 0x00; + d[14] = (_a[14] > _b[14]) ? ~UINT8_C(0) : 0x00; + d[15] = (_a[15] > _b[15]) ? ~UINT8_C(0) : 0x00; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpgt_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_cmpgt_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] > _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = (_a[1] > _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpgt_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpgt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = (_a[0] > _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpgt_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmple_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] <= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = (_a[1] <= _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmple_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmple_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = (_a[0] <= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmple_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmplt_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + uint16_t d[8]; + d[0] = _a[0] < _b[0] ? ~UINT16_C(0) : 0; + d[1] = _a[1] < _b[1] ? ~UINT16_C(0) : 0; + d[2] = _a[2] < _b[2] ? ~UINT16_C(0) : 0; + d[3] = _a[3] < _b[3] ? ~UINT16_C(0) : 0; + d[4] = _a[4] < _b[4] ? ~UINT16_C(0) : 0; + d[5] = _a[5] < _b[5] ? ~UINT16_C(0) : 0; + d[6] = _a[6] < _b[6] ? ~UINT16_C(0) : 0; + d[7] = _a[7] < _b[7] ? ~UINT16_C(0) : 0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmplt_epi16(a, b); + + return VALIDATE_UINT16_M128(c, d); +} + +result_t test_mm_cmplt_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + int32_t result[4]; + result[0] = _a[0] < _b[0] ? -1 : 0; + result[1] = _a[1] < _b[1] ? -1 : 0; + result[2] = _a[2] < _b[2] ? -1 : 0; + result[3] = _a[3] < _b[3] ? -1 : 0; + + __m128i iret = _mm_cmplt_epi32(a, b); + return VALIDATE_INT32_M128(iret, result); +} + +result_t test_mm_cmplt_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = (_a[0] < _b[0]) ? ~UINT8_C(0) : 0x00; + d[1] = (_a[1] < _b[1]) ? ~UINT8_C(0) : 0x00; + d[2] = (_a[2] < _b[2]) ? ~UINT8_C(0) : 0x00; + d[3] = (_a[3] < _b[3]) ? ~UINT8_C(0) : 0x00; + d[4] = (_a[4] < _b[4]) ? ~UINT8_C(0) : 0x00; + d[5] = (_a[5] < _b[5]) ? ~UINT8_C(0) : 0x00; + d[6] = (_a[6] < _b[6]) ? ~UINT8_C(0) : 0x00; + d[7] = (_a[7] < _b[7]) ? ~UINT8_C(0) : 0x00; + d[8] = (_a[8] < _b[8]) ? ~UINT8_C(0) : 0x00; + d[9] = (_a[9] < _b[9]) ? ~UINT8_C(0) : 0x00; + d[10] = (_a[10] < _b[10]) ? ~UINT8_C(0) : 0x00; + d[11] = (_a[11] < _b[11]) ? ~UINT8_C(0) : 0x00; + d[12] = (_a[12] < _b[12]) ? ~UINT8_C(0) : 0x00; + d[13] = (_a[13] < _b[13]) ? ~UINT8_C(0) : 0x00; + d[14] = (_a[14] < _b[14]) ? ~UINT8_C(0) : 0x00; + d[15] = (_a[15] < _b[15]) ? ~UINT8_C(0) : 0x00; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmplt_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_cmplt_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] < _b[0]) ? ALL_BIT_1_64 : UINT64_C(0); + double d1 = (_a[1] < _b[1]) ? ALL_BIT_1_64 : UINT64_C(0); + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmplt_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmplt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = (_a[0] < _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmplt_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpneq_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = (_a[0] != _b[0]) ? ALL_BIT_1_64 : UINT64_C(0); + double d1 = (_a[1] != _b[1]) ? ALL_BIT_1_64 : UINT64_C(0); + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpneq_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpneq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = (_a[0] != _b[0]) ? ALL_BIT_1_64 : UINT64_C(0); + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpneq_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnge_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] >= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = !(_a[1] >= _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnge_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnge_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] >= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnge_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpngt_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] > _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = !(_a[1] > _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpngt_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpngt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] > _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpngt_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnle_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] <= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = !(_a[1] <= _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnle_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnle_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] <= _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnle_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnlt_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] < _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = !(_a[1] < _b[1]) ? ALL_BIT_1_64 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnlt_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpnlt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + double d0 = !(_a[0] < _b[0]) ? ALL_BIT_1_64 : 0; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_cmpnlt_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_cmpord_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a = _mm_load_pd(_a); + __m128d b = _mm_load_pd(_b); + + double result[2]; + + for (uint32_t i = 0; i < 2; i++) { + result[i] = cmp_noNaN(_a[i], _b[i]); + } + + __m128d ret = _mm_cmpord_pd(a, b); + + return validateDouble(ret, result[0], result[1]); +} + +result_t test_mm_cmpord_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a = _mm_load_pd(_a); + __m128d b = _mm_load_pd(_b); + + double c0 = cmp_noNaN(_a[0], _b[0]); + double c1 = _a[1]; + + __m128d ret = _mm_cmpord_sd(a, b); + return validateDouble(ret, c0, c1); +} + +result_t test_mm_cmpunord_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a = _mm_load_pd(_a); + __m128d b = _mm_load_pd(_b); + + double result[2]; + result[0] = cmp_hasNaN(_a[0], _b[0]); + result[1] = cmp_hasNaN(_a[1], _b[1]); + + __m128d ret = _mm_cmpunord_pd(a, b); + return validateDouble(ret, result[0], result[1]); +} + +result_t test_mm_cmpunord_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *_a = (double *) impl.mTestFloatPointer1; + double *_b = (double *) impl.mTestFloatPointer2; + __m128d a = _mm_load_pd(_a); + __m128d b = _mm_load_pd(_b); + + double result[2]; + result[0] = cmp_hasNaN(_a[0], _b[0]); + result[1] = _a[1]; + + __m128d ret = _mm_cmpunord_sd(a, b); + return validateDouble(ret, result[0], result[1]); +} + +result_t test_mm_comieq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comieq_sd correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] == _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comieq_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +#endif +} + +result_t test_mm_comige_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] >= _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comige_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +} + +result_t test_mm_comigt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] > _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comigt_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +} + +result_t test_mm_comile_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comile_sd correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] <= _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comile_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +#endif +} + +result_t test_mm_comilt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comilt_sd correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] < _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comilt_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +#endif +} + +result_t test_mm_comineq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: + // The GCC does not implement _mm_comineq_sd correctly. + // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612 for more + // information. +#if defined(__GNUC__) && !defined(__clang__) + return TEST_UNIMPL; +#else + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + int32_t _c = (_a[0] != _b[0]) ? 1 : 0; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + int32_t c = _mm_comineq_sd(a, b); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +#endif +} + +result_t test_mm_cvtepi32_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + double trun[2] = {(double) _a[0], (double) _a[1]}; + + __m128d ret = _mm_cvtepi32_pd(a); + return validateDouble(ret, trun[0], trun[1]); +} + +result_t test_mm_cvtepi32_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + float trun[4]; + for (uint32_t i = 0; i < 4; i++) { + trun[i] = (float) _a[i]; + } + + __m128 ret = _mm_cvtepi32_ps(a); + return validateFloat(ret, trun[0], trun[1], trun[2], trun[3]); +} + +OPTNONE result_t test_mm_cvtpd_epi32(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + int32_t d[2] = {}; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d[0] = (int32_t) (bankersRounding(_a[0])); + d[1] = (int32_t) (bankersRounding(_a[1])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d[0] = (int32_t) (floor(_a[0])); + d[1] = (int32_t) (floor(_a[1])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d[0] = (int32_t) (ceil(_a[0])); + d[1] = (int32_t) (ceil(_a[1])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d[0] = (int32_t) (_a[0]); + d[1] = (int32_t) (_a[1]); + break; + } + +#if defined(__ARM_FEATURE_FRINT) && !defined(__clang__) + /* Floats that cannot fit into 32-bits should instead return + * indefinite integer value (INT32_MIN). This behaviour is + * currently only emulated when using the round-to-integral + * instructions. */ + for (int i = 0; i < 2; i++) { + if (_a[i] > (float) INT32_MAX || _a[i] < (float) INT32_MIN) + d[i] = INT32_MIN; + } +#endif + + __m128d a = load_m128d(_a); + __m128i ret = _mm_cvtpd_epi32(a); + + return validateInt32(ret, d[0], d[1], 0, 0); +} + +OPTNONE result_t test_mm_cvtpd_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + int32_t d[2] = {}; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d[0] = (int32_t) (bankersRounding(_a[0])); + d[1] = (int32_t) (bankersRounding(_a[1])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d[0] = (int32_t) (floor(_a[0])); + d[1] = (int32_t) (floor(_a[1])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d[0] = (int32_t) (ceil(_a[0])); + d[1] = (int32_t) (ceil(_a[1])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d[0] = (int32_t) (_a[0]); + d[1] = (int32_t) (_a[1]); + break; + } + + __m128d a = load_m128d(_a); + __m64 ret = _mm_cvtpd_pi32(a); + + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_cvtpd_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + float f0 = (float) _a[0]; + float f1 = (float) _a[1]; + const __m128d a = load_m128d(_a); + + __m128 r = _mm_cvtpd_ps(a); + + return validateFloat(r, f0, f1, 0, 0); +} + +result_t test_mm_cvtpi32_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + __m64 a = load_m64(_a); + + double trun[2] = {(double) _a[0], (double) _a[1]}; + + __m128d ret = _mm_cvtpi32_pd(a); + + return validateDouble(ret, trun[0], trun[1]); +} + +result_t test_mm_cvtps_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + __m128 a = load_m128(_a); + int32_t d[4]; + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + for (uint32_t i = 0; i < 4; i++) { + d[i] = (int32_t) (bankersRounding(_a[i])); + } + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + for (uint32_t i = 0; i < 4; i++) { + d[i] = (int32_t) (floorf(_a[i])); + } + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + for (uint32_t i = 0; i < 4; i++) { + d[i] = (int32_t) (ceilf(_a[i])); + } + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + for (uint32_t i = 0; i < 4; i++) { + d[i] = (int32_t) (_a[i]); + } + break; + } + + __m128i ret = _mm_cvtps_epi32(a); + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_cvtps_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + double d0 = (double) _a[0]; + double d1 = (double) _a[1]; + const __m128 a = load_m128(_a); + + __m128d r = _mm_cvtps_pd(a); + + return validateDouble(r, d0, d1); +} + +result_t test_mm_cvtsd_f64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + double d = _a[0]; + + const __m128d *a = (const __m128d *) _a; + double r = _mm_cvtsd_f64(*a); + + return r == d ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtsd_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + int32_t d; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d = (int32_t) (bankersRounding(_a[0])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d = (int32_t) (floor(_a[0])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d = (int32_t) (ceil(_a[0])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d = (int32_t) (_a[0]); + break; + } + + __m128d a = load_m128d(_a); + int32_t ret = _mm_cvtsd_si32(a); + + return ret == d ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtsd_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + int64_t d = 0; + + switch (iter & 0x3) { + case 0: + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + d = (int64_t) (bankersRounding(_a[0])); + break; + case 1: + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + d = (int64_t) (floor(_a[0])); + break; + case 2: + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + d = (int64_t) (ceil(_a[0])); + break; + case 3: + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + d = (int64_t) (_a[0]); + break; + } + + __m128d a = load_m128d(_a); + int64_t ret = _mm_cvtsd_si64(a); + + return ret == d ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtsd_si64x(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_cvtsd_si64(impl, iter); +} + +result_t test_mm_cvtsd_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + float f0 = (float) _b[0]; + float f1 = (float) _a[1]; + float f2 = (float) _a[2]; + float f3 = (float) _a[3]; + + __m128 a = load_m128(_a); + __m128d b = load_m128d(_b); + __m128 c = _mm_cvtsd_ss(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_cvtsi128_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + + int32_t d = _a[0]; + + __m128i a = load_m128i(_a); + int c = _mm_cvtsi128_si32(a); + + return d == c ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtsi128_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + int64_t d = _a[0]; + + __m128i a = load_m128i(_a); + int64_t c = _mm_cvtsi128_si64(a); + + return d == c ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvtsi128_si64x(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_cvtsi128_si64(impl, iter); +} + +result_t test_mm_cvtsi32_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const int32_t b = (const int32_t) impl.mTestInts[iter]; + + __m128d a = load_m128d(_a); + __m128d c = _mm_cvtsi32_sd(a, b); + + return validateDouble(c, b, _a[1]); +} + +result_t test_mm_cvtsi32_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + + int32_t d = _a[0]; + + __m128i c = _mm_cvtsi32_si128(*_a); + + return validateInt32(c, d, 0, 0, 0); +} + +result_t test_mm_cvtsi64_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const int64_t b = (const int64_t) impl.mTestInts[iter]; + + __m128d a = load_m128d(_a); + __m128d c = _mm_cvtsi64_sd(a, b); + + return validateDouble(c, (double) b, _a[1]); +} + +result_t test_mm_cvtsi64_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + int64_t d = _a[0]; + + __m128i c = _mm_cvtsi64_si128(*_a); + + return validateInt64(c, d, 0); +} + +result_t test_mm_cvtsi64x_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_cvtsi64_sd(impl, iter); +} + +result_t test_mm_cvtsi64x_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_cvtsi64_si128(impl, iter); +} + +result_t test_mm_cvtss_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + double d0 = double(_b[0]); + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128 b = load_m128(_b); + __m128d c = _mm_cvtss_sd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_cvttpd_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + __m128d a = load_m128d(_a); + int32_t d0 = (int32_t) (_a[0]); + int32_t d1 = (int32_t) (_a[1]); + + __m128i ret = _mm_cvttpd_epi32(a); + return validateInt32(ret, d0, d1, 0, 0); +} + +OPTNONE result_t test_mm_cvttpd_pi32(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + __m128d a = load_m128d(_a); + int32_t d0 = (int32_t) (_a[0]); + int32_t d1 = (int32_t) (_a[1]); + + __m64 ret = _mm_cvttpd_pi32(a); + return validateInt32(ret, d0, d1); +} + +result_t test_mm_cvttps_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + __m128 a = load_m128(_a); + int32_t trun[4]; + for (uint32_t i = 0; i < 4; i++) { + trun[i] = (int32_t) _a[i]; + } + + __m128i ret = _mm_cvttps_epi32(a); + return VALIDATE_INT32_M128(ret, trun); +} + +result_t test_mm_cvttsd_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + __m128d a = _mm_load_sd(_a); + int32_t ret = _mm_cvttsd_si32(a); + + return ret == (int32_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvttsd_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + __m128d a = _mm_load_sd(_a); + int64_t ret = _mm_cvttsd_si64(a); + + return ret == (int64_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_cvttsd_si64x(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if defined(__clang__) + // The intrinsic _mm_cvttsd_si64x() does not exist in Clang + return TEST_UNIMPL; +#else + const double *_a = (const double *) impl.mTestFloatPointer1; + + __m128d a = _mm_load_sd(_a); + int64_t ret = _mm_cvttsd_si64x(a); + + return ret == (int64_t) _a[0] ? TEST_SUCCESS : TEST_FAIL; +#endif +} + +result_t test_mm_div_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = 0.0, d1 = 0.0; + + if (_b[0] != 0.0) + d0 = _a[0] / _b[0]; + if (_b[1] != 0.0) + d1 = _a[1] / _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_div_pd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_div_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double d0 = _a[0] / _b[0]; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + + __m128d c = _mm_div_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_extract_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint16_t *_a = (uint16_t *) impl.mTestIntPointer1; + const int idx = iter & 0x7; + __m128i a = load_m128i(_a); + int c = 0; + switch (idx) { + case 0: + c = _mm_extract_epi16(a, 0); + break; + case 1: + c = _mm_extract_epi16(a, 1); + break; + case 2: + c = _mm_extract_epi16(a, 2); + break; + case 3: + c = _mm_extract_epi16(a, 3); + break; + case 4: + c = _mm_extract_epi16(a, 4); + break; + case 5: + c = _mm_extract_epi16(a, 5); + break; + case 6: + c = _mm_extract_epi16(a, 6); + break; + case 7: + c = _mm_extract_epi16(a, 7); + break; + } + + ASSERT_RETURN(c == *(_a + idx)); + return TEST_SUCCESS; +} + +result_t test_mm_insert_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t insert = (int16_t) *impl.mTestIntPointer2; + +#define TEST_IMPL(IDX) \ + int16_t d##IDX[8]; \ + for (int i = 0; i < 8; i++) { \ + d##IDX[i] = _a[i]; \ + } \ + d##IDX[IDX] = insert; \ + \ + __m128i a##IDX = load_m128i(_a); \ + __m128i b##IDX = _mm_insert_epi16(a##IDX, insert, IDX); \ + CHECK_RESULT(VALIDATE_INT16_M128(b##IDX, d##IDX)) + + IMM_8_ITER +#undef TEST_IMPL + + return TEST_SUCCESS; +} + +result_t test_mm_lfence(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + /* FIXME: Assume that memory barriers always function as intended. */ + return TEST_SUCCESS; +} + +result_t test_mm_load_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + __m128d a = _mm_load_pd(p); + return validateDouble(a, p[0], p[1]); +} + +result_t test_mm_load_pd1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + __m128d a = _mm_load_pd1(p); + return validateDouble(a, p[0], p[0]); +} + +result_t test_mm_load_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + __m128d a = _mm_load_sd(p); + return validateDouble(a, p[0], 0); +} + +result_t test_mm_load_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *addr = impl.mTestIntPointer1; + + __m128i ret = _mm_load_si128((const __m128i *) addr); + + return VALIDATE_INT32_M128(ret, addr); +} + +result_t test_mm_load1_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *addr = (const double *) impl.mTestFloatPointer1; + + __m128d ret = _mm_load1_pd(addr); + + return validateDouble(ret, addr[0], addr[0]); +} + +result_t test_mm_loadh_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *addr = (const double *) impl.mTestFloatPointer2; + + __m128d a = load_m128d(_a); + __m128d ret = _mm_loadh_pd(a, addr); + + return validateDouble(ret, _a[0], addr[0]); +} + +result_t test_mm_loadl_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *addr = (const int64_t *) impl.mTestIntPointer1; + + __m128i ret = _mm_loadl_epi64((const __m128i *) addr); + + return validateInt64(ret, addr[0], 0); +} + +result_t test_mm_loadl_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *addr = (const double *) impl.mTestFloatPointer2; + + __m128d a = load_m128d(_a); + __m128d ret = _mm_loadl_pd(a, addr); + + return validateDouble(ret, addr[0], _a[1]); +} + +result_t test_mm_loadr_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *addr = (const double *) impl.mTestFloatPointer1; + + __m128d ret = _mm_loadr_pd(addr); + + return validateDouble(ret, addr[1], addr[0]); +} + +result_t test_mm_loadu_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + __m128d a = _mm_loadu_pd(p); + return validateDouble(a, p[0], p[1]); +} + +result_t test_mm_loadu_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const unaligned_int32_t *_a = + (const unaligned_int32_t *) (impl.mTestUnalignedInts + 1); + __m128i c = _mm_loadu_si128((const __m128i *) _a); + return VALIDATE_INT32_M128(c, _a); +} + +result_t test_mm_loadu_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // The GCC version before 11 does not implement intrinsic function + // _mm_loadu_si32. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95483 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ <= 10) + return TEST_UNIMPL; +#else + const unaligned_int32_t *addr = + (const unaligned_int32_t *) (impl.mTestUnalignedInts + 1); + + __m128i ret = _mm_loadu_si32((const void *) addr); + + return validateInt32(ret, addr[0], 0, 0, 0); +#endif +} + +result_t test_mm_madd_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int32_t d0 = (int32_t) _a[0] * _b[0]; + int32_t d1 = (int32_t) _a[1] * _b[1]; + int32_t d2 = (int32_t) _a[2] * _b[2]; + int32_t d3 = (int32_t) _a[3] * _b[3]; + int32_t d4 = (int32_t) _a[4] * _b[4]; + int32_t d5 = (int32_t) _a[5] * _b[5]; + int32_t d6 = (int32_t) _a[6] * _b[6]; + int32_t d7 = (int32_t) _a[7] * _b[7]; + + int32_t e[4]; + e[0] = d0 + d1; + e[1] = d2 + d3; + e[2] = d4 + d5; + e[3] = d6 + d7; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_madd_epi16(a, b); + return VALIDATE_INT32_M128(c, e); +} + +result_t test_mm_maskmoveu_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_mask = (const uint8_t *) impl.mTestIntPointer2; + char mem_addr[16]; + + __m128i a = load_m128i(_a); + __m128i mask = load_m128i(_mask); + _mm_maskmoveu_si128(a, mask, mem_addr); + + for (int i = 0; i < 16; i++) { + if (_mask[i] >> 7) { + ASSERT_RETURN(_a[i] == (uint8_t) mem_addr[i]); + } + } + + return TEST_SUCCESS; +} + +result_t test_mm_max_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] > _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] > _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] > _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] > _b[7] ? _a[7] : _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + __m128i c = _mm_max_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +#endif +} + +result_t test_mm_max_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + uint8_t d[16]; + d[0] = ((uint8_t) _a[0] > (uint8_t) _b[0]) ? ((uint8_t) _a[0]) + : ((uint8_t) _b[0]); + d[1] = ((uint8_t) _a[1] > (uint8_t) _b[1]) ? ((uint8_t) _a[1]) + : ((uint8_t) _b[1]); + d[2] = ((uint8_t) _a[2] > (uint8_t) _b[2]) ? ((uint8_t) _a[2]) + : ((uint8_t) _b[2]); + d[3] = ((uint8_t) _a[3] > (uint8_t) _b[3]) ? ((uint8_t) _a[3]) + : ((uint8_t) _b[3]); + d[4] = ((uint8_t) _a[4] > (uint8_t) _b[4]) ? ((uint8_t) _a[4]) + : ((uint8_t) _b[4]); + d[5] = ((uint8_t) _a[5] > (uint8_t) _b[5]) ? ((uint8_t) _a[5]) + : ((uint8_t) _b[5]); + d[6] = ((uint8_t) _a[6] > (uint8_t) _b[6]) ? ((uint8_t) _a[6]) + : ((uint8_t) _b[6]); + d[7] = ((uint8_t) _a[7] > (uint8_t) _b[7]) ? ((uint8_t) _a[7]) + : ((uint8_t) _b[7]); + d[8] = ((uint8_t) _a[8] > (uint8_t) _b[8]) ? ((uint8_t) _a[8]) + : ((uint8_t) _b[8]); + d[9] = ((uint8_t) _a[9] > (uint8_t) _b[9]) ? ((uint8_t) _a[9]) + : ((uint8_t) _b[9]); + d[10] = ((uint8_t) _a[10] > (uint8_t) _b[10]) ? ((uint8_t) _a[10]) + : ((uint8_t) _b[10]); + d[11] = ((uint8_t) _a[11] > (uint8_t) _b[11]) ? ((uint8_t) _a[11]) + : ((uint8_t) _b[11]); + d[12] = ((uint8_t) _a[12] > (uint8_t) _b[12]) ? ((uint8_t) _a[12]) + : ((uint8_t) _b[12]); + d[13] = ((uint8_t) _a[13] > (uint8_t) _b[13]) ? ((uint8_t) _a[13]) + : ((uint8_t) _b[13]); + d[14] = ((uint8_t) _a[14] > (uint8_t) _b[14]) ? ((uint8_t) _a[14]) + : ((uint8_t) _b[14]); + d[15] = ((uint8_t) _a[15] > (uint8_t) _b[15]) ? ((uint8_t) _a[15]) + : ((uint8_t) _b[15]); + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_max_epu8(a, b); + return VALIDATE_INT8_M128(c, d); +#endif +} + +result_t test_mm_max_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double f0 = _a[0] > _b[0] ? _a[0] : _b[0]; + double f1 = _a[1] > _b[1] ? _a[1] : _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_max_pd(a, b); + + return validateDouble(c, f0, f1); +} + +result_t test_mm_max_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] > _b[0] ? _a[0] : _b[0]; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_max_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_mfence(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + /* FIXME: Assume that memory barriers always function as intended. */ + return TEST_SUCCESS; +} + +result_t test_mm_min_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] < _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] < _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] < _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] < _b[7] ? _a[7] : _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_min_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_min_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + uint8_t d[16]; + d[0] = + ((uint8_t) _a[0] < (uint8_t) _b[0]) ? (uint8_t) _a[0] : (uint8_t) _b[0]; + d[1] = + ((uint8_t) _a[1] < (uint8_t) _b[1]) ? (uint8_t) _a[1] : (uint8_t) _b[1]; + d[2] = + ((uint8_t) _a[2] < (uint8_t) _b[2]) ? (uint8_t) _a[2] : (uint8_t) _b[2]; + d[3] = + ((uint8_t) _a[3] < (uint8_t) _b[3]) ? (uint8_t) _a[3] : (uint8_t) _b[3]; + d[4] = + ((uint8_t) _a[4] < (uint8_t) _b[4]) ? (uint8_t) _a[4] : (uint8_t) _b[4]; + d[5] = + ((uint8_t) _a[5] < (uint8_t) _b[5]) ? (uint8_t) _a[5] : (uint8_t) _b[5]; + d[6] = + ((uint8_t) _a[6] < (uint8_t) _b[6]) ? (uint8_t) _a[6] : (uint8_t) _b[6]; + d[7] = + ((uint8_t) _a[7] < (uint8_t) _b[7]) ? (uint8_t) _a[7] : (uint8_t) _b[7]; + d[8] = + ((uint8_t) _a[8] < (uint8_t) _b[8]) ? (uint8_t) _a[8] : (uint8_t) _b[8]; + d[9] = + ((uint8_t) _a[9] < (uint8_t) _b[9]) ? (uint8_t) _a[9] : (uint8_t) _b[9]; + d[10] = ((uint8_t) _a[10] < (uint8_t) _b[10]) ? (uint8_t) _a[10] + : (uint8_t) _b[10]; + d[11] = ((uint8_t) _a[11] < (uint8_t) _b[11]) ? (uint8_t) _a[11] + : (uint8_t) _b[11]; + d[12] = ((uint8_t) _a[12] < (uint8_t) _b[12]) ? (uint8_t) _a[12] + : (uint8_t) _b[12]; + d[13] = ((uint8_t) _a[13] < (uint8_t) _b[13]) ? (uint8_t) _a[13] + : (uint8_t) _b[13]; + d[14] = ((uint8_t) _a[14] < (uint8_t) _b[14]) ? (uint8_t) _a[14] + : (uint8_t) _b[14]; + d[15] = ((uint8_t) _a[15] < (uint8_t) _b[15]) ? (uint8_t) _a[15] + : (uint8_t) _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_min_epu8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_min_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double f0 = _a[0] < _b[0] ? _a[0] : _b[0]; + double f1 = _a[1] < _b[1] ? _a[1] : _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + + __m128d c = _mm_min_pd(a, b); + return validateDouble(c, f0, f1); +} + +result_t test_mm_min_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] < _b[0] ? _a[0] : _b[0]; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_min_sd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_move_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + int64_t d0 = _a[0]; + int64_t d1 = 0; + + __m128i a = load_m128i(_a); + __m128i c = _mm_move_epi64(a); + + return validateInt64(c, d0, d1); +} + +result_t test_mm_move_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + + double result[2]; + result[0] = _b[0]; + result[1] = _a[1]; + + __m128d ret = _mm_move_sd(a, b); + return validateDouble(ret, result[0], result[1]); +} + +result_t test_mm_movemask_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + + const uint8_t *ip = (const uint8_t *) _a; + int ret = 0; + uint32_t mask = 1; + for (uint32_t i = 0; i < 16; i++) { + if (ip[i] & 0x80) { + ret |= mask; + } + mask = mask << 1; + } + int test = _mm_movemask_epi8(a); + ASSERT_RETURN(test == ret); + return TEST_SUCCESS; +} + +result_t test_mm_movemask_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + int _c = 0; + _c |= (int) (((*(const uint64_t *) _a) >> 63) & 0x1); + _c |= (((*(const uint64_t *) (_a + 1)) >> 62) & 0x2); + + __m128d a = load_m128d(_a); + int c = _mm_movemask_pd(a); + + ASSERT_RETURN(c == _c); + return TEST_SUCCESS; +} + +result_t test_mm_movepi64_pi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + int64_t d0 = _a[0]; + + __m128i a = load_m128i(_a); + __m64 c = _mm_movepi64_pi64(a); + + return validateInt64(c, d0); +} + +result_t test_mm_movpi64_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + int64_t d0 = _a[0]; + + __m64 a = load_m64(_a); + __m128i c = _mm_movpi64_epi64(a); + + return validateInt64(c, d0, 0); +} + +result_t test_mm_mul_epu32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + const uint32_t *_b = (const uint32_t *) impl.mTestIntPointer2; + uint64_t dx = (uint64_t) (_a[0]) * (uint64_t) (_b[0]); + uint64_t dy = (uint64_t) (_a[2]) * (uint64_t) (_b[2]); + + __m128i a = _mm_loadu_si128((const __m128i *) _a); + __m128i b = _mm_loadu_si128((const __m128i *) _b); + __m128i r = _mm_mul_epu32(a, b); + return validateUInt64(r, dx, dy); +} + +result_t test_mm_mul_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] * _b[0]; + double d1 = _a[1] * _b[1]; + + __m128d a = _mm_load_pd(_a); + __m128d b = _mm_load_pd(_b); + __m128d c = _mm_mul_pd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_mul_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double dx = _a[0] * _b[0]; + double dy = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_mul_sd(a, b); + return validateDouble(c, dx, dy); +} + +result_t test_mm_mul_su32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + const uint32_t *_b = (const uint32_t *) impl.mTestIntPointer2; + + uint64_t u = (uint64_t) (_a[0]) * (uint64_t) (_b[0]); + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 r = _mm_mul_su32(a, b); + + return validateUInt64(r, u); +} + +result_t test_mm_mulhi_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + for (uint32_t i = 0; i < 8; i++) { + int32_t m = (int32_t) _a[i] * (int32_t) _b[i]; + d[i] = (int16_t) (m >> 16); + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_mulhi_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_mulhi_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + uint16_t d[8]; + for (uint32_t i = 0; i < 8; i++) { + uint32_t m = (uint32_t) _a[i] * (uint32_t) _b[i]; + d[i] = (uint16_t) (m >> 16); + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_mulhi_epu16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_mullo_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = _a[0] * _b[0]; + d[1] = _a[1] * _b[1]; + d[2] = _a[2] * _b[2]; + d[3] = _a[3] * _b[3]; + d[4] = _a[4] * _b[4]; + d[5] = _a[5] * _b[5]; + d[6] = _a[6] * _b[6]; + d[7] = _a[7] * _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_mullo_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_or_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestFloatPointer1; + const int64_t *_b = (const int64_t *) impl.mTestFloatPointer2; + double d0 = sse2neon_tool_recast_f64(_a[0] | _b[0]); + double d1 = sse2neon_tool_recast_f64(_a[1] | _b[1]); + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_or_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_or_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128 fc = _mm_or_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b)); + __m128i c = _mm_castps_si128(fc); + // now for the assertion... + const uint32_t *ia = (const uint32_t *) &a; + const uint32_t *ib = (const uint32_t *) &b; + uint32_t r[4]; + r[0] = ia[0] | ib[0]; + r[1] = ia[1] | ib[1]; + r[2] = ia[2] | ib[2]; + r[3] = ia[3] | ib[3]; + __m128i ret = do_mm_set_epi32(r[3], r[2], r[1], r[0]); + result_t res = VALIDATE_INT32_M128(c, r); + if (res) { + res = VALIDATE_INT32_M128(ret, r); + } + return res; +} + +result_t test_mm_packs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int8_t max = INT8_MAX; + int8_t min = INT8_MIN; + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int8_t d[16]; + for (int i = 0; i < 8; i++) { + if (_a[i] > max) + d[i] = max; + else if (_a[i] < min) + d[i] = min; + else + d[i] = (int8_t) _a[i]; + } + for (int i = 0; i < 8; i++) { + if (_b[i] > max) + d[i + 8] = max; + else if (_b[i] < min) + d[i + 8] = min; + else + d[i + 8] = (int8_t) _b[i]; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_packs_epi16(a, b); + + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_packs_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int16_t max = INT16_MAX; + int16_t min = INT16_MIN; + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int16_t d[8]; + for (int i = 0; i < 4; i++) { + if (_a[i] > max) + d[i] = max; + else if (_a[i] < min) + d[i] = min; + else + d[i] = (int16_t) _a[i]; + } + for (int i = 0; i < 4; i++) { + if (_b[i] > max) + d[i + 4] = max; + else if (_b[i] < min) + d[i + 4] = min; + else + d[i + 4] = (int16_t) _b[i]; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_packs_epi32(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_packus_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint8_t max = UINT8_MAX; + uint8_t min = 0; + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + uint8_t d[16]; + for (int i = 0; i < 8; i++) { + if (_a[i] > (int16_t) max) + d[i] = max; + else if (_a[i] < (int16_t) min) + d[i] = min; + else + d[i] = (uint8_t) _a[i]; + } + for (int i = 0; i < 8; i++) { + if (_b[i] > (int16_t) max) + d[i + 8] = max; + else if (_b[i] < (int16_t) min) + d[i + 8] = min; + else + d[i + 8] = (uint8_t) _b[i]; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_packus_epi16(a, b); + + return VALIDATE_UINT8_M128(c, d); +} + +result_t test_mm_pause(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + _mm_pause(); + return TEST_SUCCESS; +} + +result_t test_mm_sad_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + uint16_t d0 = 0; + uint16_t d1 = 0; + for (int i = 0; i < 8; i++) { + d0 += (uint16_t) abs(_a[i] - _b[i]); + } + for (int i = 8; i < 16; i++) { + d1 += (uint16_t) abs(_a[i] - _b[i]); + } + + const __m128i a = load_m128i(_a); + const __m128i b = load_m128i(_b); + __m128i c = _mm_sad_epu8(a, b); + return validateUInt16(c, d0, 0, 0, 0, d1, 0, 0, 0); +} + +result_t test_mm_set_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + int16_t d[8]; + d[0] = _a[0]; + d[1] = _a[1]; + d[2] = _a[2]; + d[3] = _a[3]; + d[4] = _a[4]; + d[5] = _a[5]; + d[6] = _a[6]; + d[7] = _a[7]; + + __m128i c = _mm_set_epi16(d[7], d[6], d[5], d[4], d[3], d[2], d[1], d[0]); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_set_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int32_t d[4]; + d[3] = impl.mTestInts[iter]; + d[2] = impl.mTestInts[iter + 1]; + d[1] = impl.mTestInts[iter + 2]; + d[0] = impl.mTestInts[iter + 3]; + __m128i a = _mm_set_epi32(d[3], d[2], d[1], d[0]); + return VALIDATE_INT32_M128(a, d); +} + +result_t test_mm_set_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + __m128i ret = _mm_set_epi64(load_m64(&_a[1]), load_m64(&_a[0])); + + return validateInt64(ret, _a[0], _a[1]); +} + +result_t test_mm_set_epi64x(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + __m128i ret = _mm_set_epi64x(_a[1], _a[0]); + + return validateInt64(ret, _a[0], _a[1]); +} + +result_t test_mm_set_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + int8_t d[16]; + d[0] = _a[0]; + d[1] = _a[1]; + d[2] = _a[2]; + d[3] = _a[3]; + d[4] = _a[4]; + d[5] = _a[5]; + d[6] = _a[6]; + d[7] = _a[7]; + d[8] = _a[8]; + d[9] = _a[9]; + d[10] = _a[10]; + d[11] = _a[11]; + d[12] = _a[12]; + d[13] = _a[13]; + d[14] = _a[14]; + d[15] = _a[15]; + + __m128i c = + _mm_set_epi8(d[15], d[14], d[13], d[12], d[11], d[10], d[9], d[8], d[7], + d[6], d[5], d[4], d[3], d[2], d[1], d[0]); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_set_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + double x = p[0]; + double y = p[1]; + __m128d a = _mm_set_pd(x, y); + return validateDouble(a, y, x); +} + +result_t test_mm_set_pd1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double _a = impl.mTestFloats[iter]; + + __m128d a = _mm_set_pd1(_a); + + return validateDouble(a, _a, _a); +} + +result_t test_mm_set_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + double f0 = _a[0]; + double f1 = 0.0; + + __m128d a = _mm_set_sd(_a[0]); + return validateDouble(a, f0, f1); +} + +result_t test_mm_set1_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + int16_t d0 = _a[0]; + + __m128i c = _mm_set1_epi16(d0); + return validateInt16(c, d0, d0, d0, d0, d0, d0, d0, d0); +} + +result_t test_mm_set1_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int32_t x = impl.mTestInts[iter]; + __m128i a = _mm_set1_epi32(x); + return validateInt32(a, x, x, x, x); +} + +result_t test_mm_set1_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + __m128i ret = _mm_set1_epi64(load_m64(&_a[0])); + + return validateInt64(ret, _a[0], _a[0]); +} + +result_t test_mm_set1_epi64x(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + + __m128i ret = _mm_set1_epi64x(_a[0]); + + return validateInt64(ret, _a[0], _a[0]); +} + +result_t test_mm_set1_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + int8_t d0 = _a[0]; + __m128i c = _mm_set1_epi8(d0); + return validateInt8(c, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, d0, + d0, d0, d0); +} + +result_t test_mm_set1_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + double d0 = _a[0]; + __m128d c = _mm_set1_pd(d0); + return validateDouble(c, d0, d0); +} + +result_t test_mm_setr_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + + __m128i c = + _mm_setr_epi16(_a[0], _a[1], _a[2], _a[3], _a[4], _a[5], _a[6], _a[7]); + + return VALIDATE_INT16_M128(c, _a); +} + +result_t test_mm_setr_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i c = _mm_setr_epi32(_a[0], _a[1], _a[2], _a[3]); + return VALIDATE_INT32_M128(c, _a); +} + +result_t test_mm_setr_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + __m128i c = _mm_setr_epi64(load_m64(&_a[0]), load_m64(&_a[1])); + return validateInt64(c, _a[0], _a[1]); +} + +result_t test_mm_setr_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + + __m128i c = _mm_setr_epi8(_a[0], _a[1], _a[2], _a[3], _a[4], _a[5], _a[6], + _a[7], _a[8], _a[9], _a[10], _a[11], _a[12], + _a[13], _a[14], _a[15]); + + return VALIDATE_INT8_M128(c, _a); +} + +result_t test_mm_setr_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + + double x = p[0]; + double y = p[1]; + + __m128d a = _mm_setr_pd(x, y); + + return validateDouble(a, x, y); +} + +result_t test_mm_setzero_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128d a = _mm_setzero_pd(); + return validateDouble(a, 0, 0); +} + +result_t test_mm_setzero_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128i a = _mm_setzero_si128(); + return validateInt32(a, 0, 0, 0, 0); +} + +result_t test_mm_shuffle_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int32_t *_a = impl.mTestIntPointer1; + __m128i a, c; + int32_t _d[4]; + +#define TEST_IMPL(IDX) \ + _d[0] = _a[((IDX) & 0x3)]; \ + _d[1] = _a[((IDX >> 2) & 0x3)]; \ + _d[2] = _a[((IDX >> 4) & 0x3)]; \ + _d[3] = _a[((IDX >> 6) & 0x3)]; \ + \ + a = load_m128i(_a); \ + c = _mm_shuffle_epi32(a, IDX); \ + CHECK_RESULT(VALIDATE_INT32_M128(c, _d)) + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +#endif +} + +result_t test_mm_shuffle_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a, b, c; + +#define TEST_IMPL(IDX) \ + a = load_m128d(_a); \ + b = load_m128d(_b); \ + c = _mm_shuffle_pd(a, b, IDX); \ + \ + double d0##IDX = _a[IDX & 0x1]; \ + double d1##IDX = _b[(IDX & 0x2) >> 1]; \ + CHECK_RESULT(validateDouble(c, d0##IDX, d1##IDX)) + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_shufflehi_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m128i a, c; + + int16_t _d[8]; +#define TEST_IMPL(IDX) \ + _d[0] = _a[0]; \ + _d[1] = _a[1]; \ + _d[2] = _a[2]; \ + _d[3] = _a[3]; \ + _d[4] = (int16_t) (((const int64_t *) _a)[1] >> ((IDX & 0x3) * 16)); \ + _d[5] = \ + (int16_t) (((const int64_t *) _a)[1] >> (((IDX >> 2) & 0x3) * 16)); \ + _d[6] = \ + (int16_t) (((const int64_t *) _a)[1] >> (((IDX >> 4) & 0x3) * 16)); \ + _d[7] = \ + (int16_t) (((const int64_t *) _a)[1] >> (((IDX >> 6) & 0x3) * 16)); \ + \ + a = load_m128i(_a); \ + c = _mm_shufflehi_epi16(a, IDX); \ + \ + CHECK_RESULT(VALIDATE_INT16_M128(c, _d)) + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +#endif +} + +result_t test_mm_shufflelo_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if (__GNUC__ == 8) || (__GNUC__ == 9 && __GNUC_MINOR__ == 2) +#error Using older gcc versions can lead to an operand mismatch error. This issue affects all versions prior to gcc 10. +#else + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m128i a, c; + int16_t _d[8]; + +#define TEST_IMPL(IDX) \ + _d[0] = (int16_t) (((const int64_t *) _a)[0] >> ((IDX & 0x3) * 16)); \ + _d[1] = \ + (int16_t) (((const int64_t *) _a)[0] >> (((IDX >> 2) & 0x3) * 16)); \ + _d[2] = \ + (int16_t) (((const int64_t *) _a)[0] >> (((IDX >> 4) & 0x3) * 16)); \ + _d[3] = \ + (int16_t) (((const int64_t *) _a)[0] >> (((IDX >> 6) & 0x3) * 16)); \ + _d[4] = _a[4]; \ + _d[5] = _a[5]; \ + _d[6] = _a[6]; \ + _d[7] = _a[7]; \ + \ + a = load_m128i(_a); \ + c = _mm_shufflelo_epi16(a, IDX); \ + \ + CHECK_RESULT(VALIDATE_INT16_M128(c, _d)) + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +#endif +} + +result_t test_mm_sll_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m128i a, b, c; + uint8_t idx; +#define TEST_IMPL(IDX) \ + uint16_t d##IDX[8]; \ + idx = IDX; \ + d##IDX[0] = (idx > 15) ? 0 : (uint16_t) (_a[0] << idx); \ + d##IDX[1] = (idx > 15) ? 0 : (uint16_t) (_a[1] << idx); \ + d##IDX[2] = (idx > 15) ? 0 : (uint16_t) (_a[2] << idx); \ + d##IDX[3] = (idx > 15) ? 0 : (uint16_t) (_a[3] << idx); \ + d##IDX[4] = (idx > 15) ? 0 : (uint16_t) (_a[4] << idx); \ + d##IDX[5] = (idx > 15) ? 0 : (uint16_t) (_a[5] << idx); \ + d##IDX[6] = (idx > 15) ? 0 : (uint16_t) (_a[6] << idx); \ + d##IDX[7] = (idx > 15) ? 0 : (uint16_t) (_a[7] << idx); \ + \ + a = load_m128i(_a); \ + b = _mm_set1_epi64x(IDX); \ + c = _mm_sll_epi16(a, b); \ + CHECK_RESULT(VALIDATE_INT16_M128(c, d##IDX)) + + IMM_64_ITER +#undef TEST_IMPL + + return TEST_SUCCESS; +} + +result_t test_mm_sll_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i a, b, c; + uint8_t idx; + +#define TEST_IMPL(IDX) \ + uint32_t d##IDX[4]; \ + idx = IDX; \ + d##IDX[0] = (idx > 31) ? 0 : _a[0] << idx; \ + d##IDX[1] = (idx > 31) ? 0 : _a[1] << idx; \ + d##IDX[2] = (idx > 31) ? 0 : _a[2] << idx; \ + d##IDX[3] = (idx > 31) ? 0 : _a[3] << idx; \ + \ + a = load_m128i(_a); \ + b = _mm_set1_epi64x(IDX); \ + c = _mm_sll_epi32(a, b); \ + CHECK_RESULT(VALIDATE_INT32_M128(c, d##IDX)) + + IMM_64_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_sll_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + __m128i a, b, c; + +#define TEST_IMPL(IDX) \ + uint64_t d0##IDX = (IDX & ~63) ? 0 : _a[0] << IDX; \ + uint64_t d1##IDX = (IDX & ~63) ? 0 : _a[1] << IDX; \ + \ + a = load_m128i(_a); \ + b = _mm_set1_epi64x(IDX); \ + c = _mm_sll_epi64(a, b); \ + \ + CHECK_RESULT(validateInt64(c, d0##IDX, d1##IDX)) + + IMM_64_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_slli_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m128i a, c; + uint8_t idx; +#define TEST_IMPL(IDX) \ + int16_t d##IDX[8]; \ + idx = IDX; \ + d##IDX[0] = (idx > 15) ? 0 : _a[0] << idx; \ + d##IDX[1] = (idx > 15) ? 0 : _a[1] << idx; \ + d##IDX[2] = (idx > 15) ? 0 : _a[2] << idx; \ + d##IDX[3] = (idx > 15) ? 0 : _a[3] << idx; \ + d##IDX[4] = (idx > 15) ? 0 : _a[4] << idx; \ + d##IDX[5] = (idx > 15) ? 0 : _a[5] << idx; \ + d##IDX[6] = (idx > 15) ? 0 : _a[6] << idx; \ + d##IDX[7] = (idx > 15) ? 0 : _a[7] << idx; \ + \ + a = load_m128i(_a); \ + c = _mm_slli_epi16(a, IDX); \ + CHECK_RESULT(VALIDATE_INT16_M128(c, d##IDX)) + + IMM_64_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_slli_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; +#if defined(__clang__) + // Clang compiler does not allow the second argument of _mm_slli_epi32() to + // be greater than 31. + const int count = (int) (iter % 33 - 1); // range: -1 ~ 31 +#else + const int count = (int) (iter % 34 - 1); // range: -1 ~ 32 +#endif + + int32_t d[4]; + d[0] = (count & ~31) ? 0 : _a[0] << count; + d[1] = (count & ~31) ? 0 : _a[1] << count; + d[2] = (count & ~31) ? 0 : _a[2] << count; + d[3] = (count & ~31) ? 0 : _a[3] << count; + + __m128i a = load_m128i(_a); + __m128i c = _mm_slli_epi32(a, count); + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_slli_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; +#if defined(__clang__) + // Clang compiler does not allow the second argument of "_mm_slli_epi64()" + // to be greater than 63. + const int count = (int) (iter % 65 - 1); // range: -1 ~ 63 +#else + const int count = (int) (iter % 66 - 1); // range: -1 ~ 64 +#endif + int64_t d0 = (count & ~63) ? 0 : _a[0] << count; + int64_t d1 = (count & ~63) ? 0 : _a[1] << count; + + __m128i a = load_m128i(_a); + __m128i c = _mm_slli_epi64(a, count); + return validateInt64(c, d0, d1); +} + +result_t test_mm_slli_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + + int8_t d[16]; + int count = (iter % 5) << 2; + for (int i = 0; i < 16; i++) { + if (i < count) + d[i] = 0; + else + d[i] = ((const int8_t *) _a)[i - count]; + } + + __m128i a = load_m128i(_a); + __m128i ret = _mm_setzero_si128(); + switch (iter % 5) { + case 0: + ret = _mm_slli_si128(a, 0); + break; + case 1: + ret = _mm_slli_si128(a, 4); + break; + case 2: + ret = _mm_slli_si128(a, 8); + break; + case 3: + ret = _mm_slli_si128(a, 12); + break; + case 4: + ret = _mm_slli_si128(a, 16); + break; + } + + return VALIDATE_INT8_M128(ret, d); +} + +result_t test_mm_sqrt_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + double f0 = sqrt(_a[0]); + double f1 = sqrt(_a[1]); + + __m128d a = load_m128d(_a); + __m128d c = _mm_sqrt_pd(a); + + return validateFloatError(c, f0, f1, 1.0e-15); +} + +result_t test_mm_sqrt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double f0 = sqrt(_b[0]); + double f1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_sqrt_sd(a, b); + + return validateFloatError(c, f0, f1, 1.0e-15); +} + +result_t test_mm_sra_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int64_t count = (int64_t) (iter % 18 - 1); // range: -1 ~ 16 + + int16_t d[8]; + d[0] = (count & ~15) ? (_a[0] < 0 ? ~UINT16_C(0) : 0) : (_a[0] >> count); + d[1] = (count & ~15) ? (_a[1] < 0 ? ~UINT16_C(0) : 0) : (_a[1] >> count); + d[2] = (count & ~15) ? (_a[2] < 0 ? ~UINT16_C(0) : 0) : (_a[2] >> count); + d[3] = (count & ~15) ? (_a[3] < 0 ? ~UINT16_C(0) : 0) : (_a[3] >> count); + d[4] = (count & ~15) ? (_a[4] < 0 ? ~UINT16_C(0) : 0) : (_a[4] >> count); + d[5] = (count & ~15) ? (_a[5] < 0 ? ~UINT16_C(0) : 0) : (_a[5] >> count); + d[6] = (count & ~15) ? (_a[6] < 0 ? ~UINT16_C(0) : 0) : (_a[6] >> count); + d[7] = (count & ~15) ? (_a[7] < 0 ? ~UINT16_C(0) : 0) : (_a[7] >> count); + + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i b = _mm_set1_epi64x(count); + __m128i c = _mm_sra_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_sra_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int64_t count = (int64_t) (iter % 34 - 1); // range: -1 ~ 32 + + int32_t d[4]; + d[0] = (count & ~31) ? (_a[0] < 0 ? ~UINT32_C(0) : 0) : _a[0] >> count; + d[1] = (count & ~31) ? (_a[1] < 0 ? ~UINT32_C(0) : 0) : _a[1] >> count; + d[2] = (count & ~31) ? (_a[2] < 0 ? ~UINT32_C(0) : 0) : _a[2] >> count; + d[3] = (count & ~31) ? (_a[3] < 0 ? ~UINT32_C(0) : 0) : _a[3] >> count; + + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i b = _mm_set1_epi64x(count); + __m128i c = _mm_sra_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_srai_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int32_t b = (int32_t) (iter % 18 - 1); // range: -1 ~ 16 + int16_t d[8]; + int count = (b & ~15) ? 15 : b; + + for (int i = 0; i < 8; i++) { + d[i] = _a[i] >> count; + } + + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i c = _mm_srai_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_srai_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t b = (int32_t) (iter % 34 - 1); // range: -1 ~ 32 + + int32_t d[4]; + int count = (b & ~31) ? 31 : b; + for (int i = 0; i < 4; i++) { + d[i] = _a[i] >> count; + } + + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i c = _mm_srai_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_srl_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int64_t count = (int64_t) (iter % 18 - 1); // range: -1 ~ 16 + + uint16_t d[8]; + d[0] = (count & ~15) ? 0 : (uint16_t) (_a[0]) >> count; + d[1] = (count & ~15) ? 0 : (uint16_t) (_a[1]) >> count; + d[2] = (count & ~15) ? 0 : (uint16_t) (_a[2]) >> count; + d[3] = (count & ~15) ? 0 : (uint16_t) (_a[3]) >> count; + d[4] = (count & ~15) ? 0 : (uint16_t) (_a[4]) >> count; + d[5] = (count & ~15) ? 0 : (uint16_t) (_a[5]) >> count; + d[6] = (count & ~15) ? 0 : (uint16_t) (_a[6]) >> count; + d[7] = (count & ~15) ? 0 : (uint16_t) (_a[7]) >> count; + + __m128i a = load_m128i(_a); + __m128i b = _mm_set1_epi64x(count); + __m128i c = _mm_srl_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_srl_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int64_t count = (int64_t) (iter % 34 - 1); // range: -1 ~ 32 + + uint32_t d[4]; + d[0] = (count & ~31) ? 0 : (uint32_t) (_a[0]) >> count; + d[1] = (count & ~31) ? 0 : (uint32_t) (_a[1]) >> count; + d[2] = (count & ~31) ? 0 : (uint32_t) (_a[2]) >> count; + d[3] = (count & ~31) ? 0 : (uint32_t) (_a[3]) >> count; + + __m128i a = load_m128i(_a); + __m128i b = _mm_set1_epi64x(count); + __m128i c = _mm_srl_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_srl_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t count = (int64_t) (iter % 66 - 1); // range: -1 ~ 64 + + uint64_t d0 = (count & ~63) ? 0 : (uint64_t) (_a[0]) >> count; + uint64_t d1 = (count & ~63) ? 0 : (uint64_t) (_a[1]) >> count; + + __m128i a = load_m128i(_a); + __m128i b = _mm_set1_epi64x(count); + __m128i c = _mm_srl_epi64(a, b); + + return validateInt64(c, d0, d1); +} + +result_t test_mm_srli_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const int count = (int) (iter % 18 - 1); // range: -1 ~ 16 + + int16_t d[8]; + d[0] = count & (~15) ? 0 : (int16_t) (_a[0] >> count); + d[1] = count & (~15) ? 0 : (int16_t) (_a[1] >> count); + d[2] = count & (~15) ? 0 : (int16_t) (_a[2] >> count); + d[3] = count & (~15) ? 0 : (int16_t) (_a[3] >> count); + d[4] = count & (~15) ? 0 : (int16_t) (_a[4] >> count); + d[5] = count & (~15) ? 0 : (int16_t) (_a[5] >> count); + d[6] = count & (~15) ? 0 : (int16_t) (_a[6] >> count); + d[7] = count & (~15) ? 0 : (int16_t) (_a[7] >> count); + + __m128i a = load_m128i(_a); + __m128i c = _mm_srli_epi16(a, count); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_srli_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + const int count = (int) (iter % 34 - 1); // range: -1 ~ 32 + + int32_t d[4]; + d[0] = count & (~31) ? 0 : (int32_t) (_a[0] >> count); + d[1] = count & (~31) ? 0 : (int32_t) (_a[1] >> count); + d[2] = count & (~31) ? 0 : (int32_t) (_a[2] >> count); + d[3] = count & (~31) ? 0 : (int32_t) (_a[3] >> count); + + __m128i a = load_m128i(_a); + __m128i c = _mm_srli_epi32(a, count); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_srli_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int count = (int) (iter % 66 - 1); // range: -1 ~ 64 + + int64_t d0 = count & (~63) ? 0 : (uint64_t) (_a[0]) >> count; + int64_t d1 = count & (~63) ? 0 : (uint64_t) (_a[1]) >> count; + + __m128i a = load_m128i(_a); + __m128i c = _mm_srli_epi64(a, count); + + return validateInt64(c, d0, d1); +} + +result_t test_mm_srli_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int count = (iter % 5) << 2; + + int8_t d[16]; + for (int i = 0; i < 16; i++) { + if (i >= (16 - count)) + d[i] = 0; + else + d[i] = _a[i + count]; + } + + __m128i a = load_m128i(_a); + __m128i ret = _mm_setzero_si128(); + switch (iter % 5) { + case 0: + ret = _mm_srli_si128(a, 0); + break; + case 1: + ret = _mm_srli_si128(a, 4); + break; + case 2: + ret = _mm_srli_si128(a, 8); + break; + case 3: + ret = _mm_srli_si128(a, 12); + break; + case 4: + ret = _mm_srli_si128(a, 16); + break; + } + + return VALIDATE_INT8_M128(ret, d); +} + +result_t test_mm_store_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double x = impl.mTestFloats[iter + 4]; + double y = impl.mTestFloats[iter + 6]; + + __m128d a = _mm_set_pd(x, y); + _mm_store_pd(p, a); + ASSERT_RETURN(p[0] == y); + ASSERT_RETURN(p[1] == x); + return TEST_SUCCESS; +} + +result_t test_mm_store_pd1(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double _a[2] = {(double) impl.mTestFloats[iter], + (double) impl.mTestFloats[iter + 1]}; + + __m128d a = load_m128d(_a); + _mm_store_pd1(p, a); + ASSERT_RETURN(p[0] == impl.mTestFloats[iter]); + ASSERT_RETURN(p[1] == impl.mTestFloats[iter]); + return TEST_SUCCESS; +} + +result_t test_mm_store_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double _a[2] = {(double) impl.mTestFloats[iter], + (double) impl.mTestFloats[iter + 1]}; + + __m128d a = load_m128d(_a); + _mm_store_sd(p, a); + ASSERT_RETURN(p[0] == impl.mTestFloats[iter]); + return TEST_SUCCESS; +} + +result_t test_mm_store_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + alignas(16) int32_t p[4]; + + __m128i a = load_m128i(_a); + _mm_store_si128((__m128i *) p, a); + + return VALIDATE_INT32_M128(a, p); +} + +result_t test_mm_store1_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_store_pd1(impl, iter); +} + +result_t test_mm_storeh_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double mem; + + __m128d a = load_m128d(p); + _mm_storeh_pd(&mem, a); + + ASSERT_RETURN(mem == p[1]); + return TEST_SUCCESS; +} + +result_t test_mm_storel_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int64_t *p = (int64_t *) impl.mTestIntPointer1; + __m128i mem; + + __m128i a = load_m128i(p); + _mm_storel_epi64(&mem, a); + + ASSERT_RETURN(((SIMDVec *) &mem)->m128_u64[0] == (uint64_t) p[0]); + return TEST_SUCCESS; +} + +result_t test_mm_storel_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double mem; + + __m128d a = load_m128d(p); + _mm_storel_pd(&mem, a); + + ASSERT_RETURN(mem == p[0]); + return TEST_SUCCESS; +} + +result_t test_mm_storer_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double mem[2]; + + __m128d a = load_m128d(p); + _mm_storer_pd(mem, a); + + __m128d res = load_m128d(mem); + return validateDouble(res, p[1], p[0]); +} + +result_t test_mm_storeu_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + double *p = (double *) impl.mTestFloatPointer1; + double x = impl.mTestFloats[iter + 4]; + double y = impl.mTestFloats[iter + 6]; + + __m128d a = _mm_set_pd(x, y); + _mm_storeu_pd(p, a); + ASSERT_RETURN(p[0] == y); + ASSERT_RETURN(p[1] == x); + return TEST_SUCCESS; +} + +result_t test_mm_storeu_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i b; + __m128i a = load_m128i(_a); + _mm_storeu_si128(&b, a); + int32_t *_b = (int32_t *) &b; + return VALIDATE_INT32_M128(a, _b); +} + +result_t test_mm_storeu_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // The GCC version before 11 does not implement intrinsic function + // _mm_storeu_si32. Check https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95483 + // for more information. +#if (defined(__GNUC__) && !defined(__clang__)) && (__GNUC__ <= 10) + return TEST_UNIMPL; +#else + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i b = _mm_setzero_si128(); + __m128i a = load_m128i(_a); + _mm_storeu_si32(&b, a); + int32_t *_b = (int32_t *) &b; + return validateInt32(b, _a[0], _b[1], _b[2], _b[3]); +#endif +} + +result_t test_mm_stream_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + double p[2]; + + __m128d a = load_m128d(_a); + _mm_stream_pd(p, a); + + return validateDouble(a, p[0], p[1]); +} + +result_t test_mm_stream_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + alignas(16) int32_t p[4]; + + __m128i a = load_m128i(_a); + _mm_stream_si128((__m128i *) p, a); + + return VALIDATE_INT32_M128(a, p); +} + +result_t test_mm_stream_si32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t a = (const int32_t) impl.mTestInts[iter]; + int32_t p; + + _mm_stream_si32(&p, a); + + ASSERT_RETURN(a == p) + return TEST_SUCCESS; +} + +result_t test_mm_stream_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t a = (const int64_t) impl.mTestInts[iter]; + __int64 p[1]; + _mm_stream_si64(p, a); + ASSERT_RETURN(p[0] == a); + return TEST_SUCCESS; +} + +result_t test_mm_sub_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = _a[0] - _b[0]; + d[1] = _a[1] - _b[1]; + d[2] = _a[2] - _b[2]; + d[3] = _a[3] - _b[3]; + d[4] = _a[4] - _b[4]; + d[5] = _a[5] - _b[5]; + d[6] = _a[6] - _b[6]; + d[7] = _a[7] - _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sub_epi16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_sub_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + int32_t d[4]; + d[0] = _a[0] - _b[0]; + d[1] = _a[1] - _b[1]; + d[2] = _a[2] - _b[2]; + d[3] = _a[3] - _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sub_epi32(a, b); + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_sub_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (int64_t *) impl.mTestIntPointer2; + int64_t d0 = _a[0] - _b[0]; + int64_t d1 = _a[1] - _b[1]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sub_epi64(a, b); + return validateInt64(c, d0, d1); +} + +result_t test_mm_sub_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = _a[0] - _b[0]; + d[1] = _a[1] - _b[1]; + d[2] = _a[2] - _b[2]; + d[3] = _a[3] - _b[3]; + d[4] = _a[4] - _b[4]; + d[5] = _a[5] - _b[5]; + d[6] = _a[6] - _b[6]; + d[7] = _a[7] - _b[7]; + d[8] = _a[8] - _b[8]; + d[9] = _a[9] - _b[9]; + d[10] = _a[10] - _b[10]; + d[11] = _a[11] - _b[11]; + d[12] = _a[12] - _b[12]; + d[13] = _a[13] - _b[13]; + d[14] = _a[14] - _b[14]; + d[15] = _a[15] - _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sub_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_sub_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] - _b[0]; + double d1 = _a[1] - _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_sub_pd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_sub_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + double d0 = _a[0] - _b[0]; + double d1 = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_sub_sd(a, b); + return validateDouble(c, d0, d1); +} + +result_t test_mm_sub_si64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t d = _a[0] - _b[0]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_sub_si64(a, b); + + return validateInt64(c, d); +} + +result_t test_mm_subs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[8]; + for (int i = 0; i < 8; i++) { + d[i] = saturate_i16((int32_t) _a[i] - (int32_t) _b[i]); + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_subs_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_subs_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int16_t max = 127; + int16_t min = -128; + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[16]; + for (int i = 0; i < 16; i++) { + int16_t res = (int16_t) _a[i] - (int16_t) _b[i]; + if (res > max) + d[i] = (int8_t) max; + else if (res < min) + d[i] = (int8_t) min; + else + d[i] = (int8_t) res; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_subs_epi8(a, b); + + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_subs_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + uint16_t d[8]; + d[0] = (uint16_t) _a[0] - (uint16_t) _b[0]; + if (d[0] > (uint16_t) _a[0]) + d[0] = 0; + d[1] = (uint16_t) _a[1] - (uint16_t) _b[1]; + if (d[1] > (uint16_t) _a[1]) + d[1] = 0; + d[2] = (uint16_t) _a[2] - (uint16_t) _b[2]; + if (d[2] > (uint16_t) _a[2]) + d[2] = 0; + d[3] = (uint16_t) _a[3] - (uint16_t) _b[3]; + if (d[3] > (uint16_t) _a[3]) + d[3] = 0; + d[4] = (uint16_t) _a[4] - (uint16_t) _b[4]; + if (d[4] > (uint16_t) _a[4]) + d[4] = 0; + d[5] = (uint16_t) _a[5] - (uint16_t) _b[5]; + if (d[5] > (uint16_t) _a[5]) + d[5] = 0; + d[6] = (uint16_t) _a[6] - (uint16_t) _b[6]; + if (d[6] > (uint16_t) _a[6]) + d[6] = 0; + d[7] = (uint16_t) _a[7] - (uint16_t) _b[7]; + if (d[7] > (uint16_t) _a[7]) + d[7] = 0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + __m128i c = _mm_subs_epu16(a, b); + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_subs_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + uint8_t d[16]; + d[0] = (uint8_t) _a[0] - (uint8_t) _b[0]; + if (d[0] > (uint8_t) _a[0]) + d[0] = 0; + d[1] = (uint8_t) _a[1] - (uint8_t) _b[1]; + if (d[1] > (uint8_t) _a[1]) + d[1] = 0; + d[2] = (uint8_t) _a[2] - (uint8_t) _b[2]; + if (d[2] > (uint8_t) _a[2]) + d[2] = 0; + d[3] = (uint8_t) _a[3] - (uint8_t) _b[3]; + if (d[3] > (uint8_t) _a[3]) + d[3] = 0; + d[4] = (uint8_t) _a[4] - (uint8_t) _b[4]; + if (d[4] > (uint8_t) _a[4]) + d[4] = 0; + d[5] = (uint8_t) _a[5] - (uint8_t) _b[5]; + if (d[5] > (uint8_t) _a[5]) + d[5] = 0; + d[6] = (uint8_t) _a[6] - (uint8_t) _b[6]; + if (d[6] > (uint8_t) _a[6]) + d[6] = 0; + d[7] = (uint8_t) _a[7] - (uint8_t) _b[7]; + if (d[7] > (uint8_t) _a[7]) + d[7] = 0; + d[8] = (uint8_t) _a[8] - (uint8_t) _b[8]; + if (d[8] > (uint8_t) _a[8]) + d[8] = 0; + d[9] = (uint8_t) _a[9] - (uint8_t) _b[9]; + if (d[9] > (uint8_t) _a[9]) + d[9] = 0; + d[10] = (uint8_t) _a[10] - (uint8_t) _b[10]; + if (d[10] > (uint8_t) _a[10]) + d[10] = 0; + d[11] = (uint8_t) _a[11] - (uint8_t) _b[11]; + if (d[11] > (uint8_t) _a[11]) + d[11] = 0; + d[12] = (uint8_t) _a[12] - (uint8_t) _b[12]; + if (d[12] > (uint8_t) _a[12]) + d[12] = 0; + d[13] = (uint8_t) _a[13] - (uint8_t) _b[13]; + if (d[13] > (uint8_t) _a[13]) + d[13] = 0; + d[14] = (uint8_t) _a[14] - (uint8_t) _b[14]; + if (d[14] > (uint8_t) _a[14]) + d[14] = 0; + d[15] = (uint8_t) _a[15] - (uint8_t) _b[15]; + if (d[15] > (uint8_t) _a[15]) + d[15] = 0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_subs_epu8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_ucomieq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comieq_sd(impl, iter); +} + +result_t test_mm_ucomige_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comige_sd(impl, iter); +} + +result_t test_mm_ucomigt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comigt_sd(impl, iter); +} + +result_t test_mm_ucomile_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comile_sd(impl, iter); +} + +result_t test_mm_ucomilt_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comilt_sd(impl, iter); +} + +result_t test_mm_ucomineq_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_comineq_sd(impl, iter); +} + +result_t test_mm_undefined_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128d a = _mm_undefined_pd(); + a = _mm_xor_pd(a, a); + return validateDouble(a, 0, 0); +} + +result_t test_mm_undefined_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + __m128i a = _mm_undefined_si128(); + a = _mm_xor_si128(a, a); + return validateInt64(a, 0, 0); +} + +result_t test_mm_unpackhi_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[8]; + d[0] = _a[4]; + d[1] = _b[4]; + d[2] = _a[5]; + d[3] = _b[5]; + d[4] = _a[6]; + d[5] = _b[6]; + d[6] = _a[7]; + d[7] = _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpackhi_epi16(a, b); + + return VALIDATE_INT16_M128(ret, d); +} + +result_t test_mm_unpackhi_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[4]; + d[0] = _a[2]; + d[1] = _b[2]; + d[2] = _a[3]; + d[3] = _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpackhi_epi32(a, b); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_unpackhi_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t i0 = _a[1]; + int64_t i1 = _b[1]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpackhi_epi64(a, b); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_unpackhi_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[16]; + d[0] = _a[8]; + d[1] = _b[8]; + d[2] = _a[9]; + d[3] = _b[9]; + d[4] = _a[10]; + d[5] = _b[10]; + d[6] = _a[11]; + d[7] = _b[11]; + d[8] = _a[12]; + d[9] = _b[12]; + d[10] = _a[13]; + d[11] = _b[13]; + d[12] = _a[14]; + d[13] = _b[14]; + d[14] = _a[15]; + d[15] = _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpackhi_epi8(a, b); + + return VALIDATE_INT8_M128(ret, d); +} + +result_t test_mm_unpackhi_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d ret = _mm_unpackhi_pd(a, b); + + return validateDouble(ret, _a[1], _b[1]); +} + +result_t test_mm_unpacklo_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[8]; + d[0] = _a[0]; + d[1] = _b[0]; + d[2] = _a[1]; + d[3] = _b[1]; + d[4] = _a[2]; + d[5] = _b[2]; + d[6] = _a[3]; + d[7] = _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpacklo_epi16(a, b); + + return VALIDATE_INT16_M128(ret, d); +} + +result_t test_mm_unpacklo_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[4]; + d[0] = _a[0]; + d[1] = _b[0]; + d[2] = _a[1]; + d[3] = _b[1]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpacklo_epi32(a, b); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_unpacklo_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t i0 = _a[0]; + int64_t i1 = _b[0]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpacklo_epi64(a, b); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_unpacklo_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[16]; + d[0] = _a[0]; + d[1] = _b[0]; + d[2] = _a[1]; + d[3] = _b[1]; + d[4] = _a[2]; + d[5] = _b[2]; + d[6] = _a[3]; + d[7] = _b[3]; + d[8] = _a[4]; + d[9] = _b[4]; + d[10] = _a[5]; + d[11] = _b[5]; + d[12] = _a[6]; + d[13] = _b[6]; + d[14] = _a[7]; + d[15] = _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_unpacklo_epi8(a, b); + + return VALIDATE_INT8_M128(ret, d); +} + +result_t test_mm_unpacklo_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d ret = _mm_unpacklo_pd(a, b); + + return validateDouble(ret, _a[0], _b[0]); +} + +result_t test_mm_xor_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestFloatPointer1; + const int64_t *_b = (const int64_t *) impl.mTestFloatPointer2; + double d0 = sse2neon_tool_recast_f64(_a[0] ^ _b[0]); + double d1 = sse2neon_tool_recast_f64(_a[1] ^ _b[1]); + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_xor_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_xor_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t d0 = _a[0] ^ _b[0]; + int64_t d1 = _a[1] ^ _b[1]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_xor_si128(a, b); + + return validateInt64(c, d0, d1); +} + +/* SSE3 */ +result_t test_mm_addsub_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double d0 = _a[0] - _b[0]; + double d1 = _a[1] + _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_addsub_pd(a, b); + + return validateDouble(c, d0, d1); +} + +result_t test_mm_addsub_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: The rounding mode would affect the testing result on ARM platform. + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float f0 = _a[0] - _b[0]; + float f1 = _a[1] + _b[1]; + float f2 = _a[2] - _b[2]; + float f3 = _a[3] + _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_addsub_ps(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_hadd_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double f0 = _a[0] + _a[1]; + double f1 = _b[0] + _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_hadd_pd(a, b); + + return validateDouble(c, f0, f1); +} + +result_t test_mm_hadd_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: The rounding mode would affect the testing result on ARM platform. + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float f0 = _a[0] + _a[1]; + float f1 = _a[2] + _a[3]; + float f2 = _b[0] + _b[1]; + float f3 = _b[2] + _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_hadd_ps(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_hsub_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double f0 = _a[0] - _a[1]; + double f1 = _b[0] - _b[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d c = _mm_hsub_pd(a, b); + + return validateDouble(c, f0, f1); +} + +result_t test_mm_hsub_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + // FIXME: The rounding mode would affect the testing result on ARM platform. + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + float f0 = _a[0] - _a[1]; + float f1 = _a[2] - _a[3]; + float f2 = _b[0] - _b[1]; + float f3 = _b[2] - _b[3]; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_hsub_ps(a, b); + + return validateFloat(c, f0, f1, f2, f3); +} + +result_t test_mm_lddqu_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_loadu_si128(impl, iter); +} + +result_t test_mm_loaddup_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *addr = (const double *) impl.mTestFloatPointer1; + + __m128d ret = _mm_loaddup_pd(addr); + + return validateDouble(ret, addr[0], addr[0]); +} + +result_t test_mm_movedup_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *p = (const double *) impl.mTestFloatPointer1; + __m128d a = load_m128d(p); + __m128d b = _mm_movedup_pd(a); + + return validateDouble(b, p[0], p[0]); +} + +result_t test_mm_movehdup_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + __m128 a = load_m128(p); + return validateFloat(_mm_movehdup_ps(a), p[1], p[1], p[3], p[3]); +} + +result_t test_mm_moveldup_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *p = impl.mTestFloatPointer1; + __m128 a = load_m128(p); + return validateFloat(_mm_moveldup_ps(a), p[0], p[0], p[2], p[2]); +} + +/* SSSE3 */ +result_t test_mm_abs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + __m128i c = _mm_abs_epi16(a); + + uint16_t d[8]; + d[0] = (_a[0] < 0) ? -_a[0] : _a[0]; + d[1] = (_a[1] < 0) ? -_a[1] : _a[1]; + d[2] = (_a[2] < 0) ? -_a[2] : _a[2]; + d[3] = (_a[3] < 0) ? -_a[3] : _a[3]; + d[4] = (_a[4] < 0) ? -_a[4] : _a[4]; + d[5] = (_a[5] < 0) ? -_a[5] : _a[5]; + d[6] = (_a[6] < 0) ? -_a[6] : _a[6]; + d[7] = (_a[7] < 0) ? -_a[7] : _a[7]; + + return VALIDATE_UINT16_M128(c, d); +} + +result_t test_mm_abs_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + __m128i c = _mm_abs_epi32(a); + + uint32_t d[4]; + d[0] = (_a[0] < 0) ? -_a[0] : _a[0]; + d[1] = (_a[1] < 0) ? -_a[1] : _a[1]; + d[2] = (_a[2] < 0) ? -_a[2] : _a[2]; + d[3] = (_a[3] < 0) ? -_a[3] : _a[3]; + + return VALIDATE_UINT32_M128(c, d); +} + +result_t test_mm_abs_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + __m128i c = _mm_abs_epi8(a); + + uint8_t d[16]; + for (int i = 0; i < 16; i++) { + d[i] = (_a[i] < 0) ? -_a[i] : _a[i]; + } + + return VALIDATE_UINT8_M128(c, d); +} + +result_t test_mm_abs_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + __m64 a = load_m64(_a); + __m64 c = _mm_abs_pi16(a); + + uint16_t d[4]; + d[0] = (_a[0] < 0) ? -_a[0] : _a[0]; + d[1] = (_a[1] < 0) ? -_a[1] : _a[1]; + d[2] = (_a[2] < 0) ? -_a[2] : _a[2]; + d[3] = (_a[3] < 0) ? -_a[3] : _a[3]; + + return VALIDATE_UINT16_M64(c, d); +} + +result_t test_mm_abs_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m64 a = load_m64(_a); + __m64 c = _mm_abs_pi32(a); + + uint32_t d[2]; + d[0] = (_a[0] < 0) ? -_a[0] : _a[0]; + d[1] = (_a[1] < 0) ? -_a[1] : _a[1]; + + return VALIDATE_UINT32_M64(c, d); +} + +result_t test_mm_abs_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + __m64 a = load_m64(_a); + __m64 c = _mm_abs_pi8(a); + + uint8_t d[8]; + d[0] = (_a[0] < 0) ? -_a[0] : _a[0]; + d[1] = (_a[1] < 0) ? -_a[1] : _a[1]; + d[2] = (_a[2] < 0) ? -_a[2] : _a[2]; + d[3] = (_a[3] < 0) ? -_a[3] : _a[3]; + d[4] = (_a[4] < 0) ? -_a[4] : _a[4]; + d[5] = (_a[5] < 0) ? -_a[5] : _a[5]; + d[6] = (_a[6] < 0) ? -_a[6] : _a[6]; + d[7] = (_a[7] < 0) ? -_a[7] : _a[7]; + + return VALIDATE_UINT8_M64(c, d); +} + +result_t test_mm_alignr_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if defined(__clang__) + return TEST_UNIMPL; +#else + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + unsigned int shift = (iter % 5) << 3; + uint8_t d[32]; + + if (shift >= 32) { + memset((void *) d, 0, sizeof(d)); + } else { + memcpy((void *) d, (const void *) _b, 16); + memcpy((void *) (d + 16), (const void *) _a, 16); + // shifting + for (size_t x = 0; x < sizeof(d); x++) { + if (x + shift >= sizeof(d)) + d[x] = 0; + else + d[x] = d[x + shift]; + } + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_setzero_si128(); + switch (iter % 5) { + case 0: + ret = _mm_alignr_epi8(a, b, 0); + break; + case 1: + ret = _mm_alignr_epi8(a, b, 8); + break; + case 2: + ret = _mm_alignr_epi8(a, b, 16); + break; + case 3: + ret = _mm_alignr_epi8(a, b, 24); + break; + case 4: + ret = _mm_alignr_epi8(a, b, 32); + break; + } + + return VALIDATE_UINT8_M128(ret, d); +#endif +} + +result_t test_mm_alignr_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ +#if defined(__clang__) + return TEST_UNIMPL; +#else + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + unsigned int shift = (iter % 3) << 3; + uint8_t d[16]; + + if (shift >= 16) { + memset((void *) d, 0, sizeof(d)); + } else { + memcpy((void *) d, (const void *) _b, 8); + memcpy((void *) (d + 8), (const void *) _a, 8); + // shifting + for (size_t x = 0; x < sizeof(d); x++) { + if (x + shift >= sizeof(d)) + d[x] = 0; + else + d[x] = d[x + shift]; + } + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + uint8_t zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; + __m64 ret = load_m64(zeros); + switch (iter % 3) { + case 0: + ret = _mm_alignr_pi8(a, b, 0); + break; + case 1: + ret = _mm_alignr_pi8(a, b, 8); + break; + case 2: + ret = _mm_alignr_pi8(a, b, 16); + break; + } + + return VALIDATE_UINT8_M64(ret, d); +#endif +} + +result_t test_mm_hadd_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[8]; + d[0] = _a[0] + _a[1]; + d[1] = _a[2] + _a[3]; + d[2] = _a[4] + _a[5]; + d[3] = _a[6] + _a[7]; + d[4] = _b[0] + _b[1]; + d[5] = _b[2] + _b[3]; + d[6] = _b[4] + _b[5]; + d[7] = _b[6] + _b[7]; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_hadd_epi16(a, b); + return VALIDATE_INT16_M128(ret, d); +} + +result_t test_mm_hadd_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + int32_t d[4]; + d[0] = _a[0] + _a[1]; + d[1] = _a[2] + _a[3]; + d[2] = _b[0] + _b[1]; + d[3] = _b[2] + _b[3]; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_hadd_epi32(a, b); + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_hadd_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t d[4]; + d[0] = _a[0] + _a[1]; + d[1] = _a[2] + _a[3]; + d[2] = _b[0] + _b[1]; + d[3] = _b[2] + _b[3]; + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_hadd_pi16(a, b); + return VALIDATE_INT16_M64(ret, d); +} + +result_t test_mm_hadd_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + int32_t d[2]; + d[0] = _a[0] + _a[1]; + d[1] = _b[0] + _b[1]; + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_hadd_pi32(a, b); + return VALIDATE_INT32_M64(ret, d); +} + +result_t test_mm_hadds_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer1; + + int16_t d16[8]; + int32_t d32[8]; + d32[0] = (int32_t) _a[0] + (int32_t) _a[1]; + d32[1] = (int32_t) _a[2] + (int32_t) _a[3]; + d32[2] = (int32_t) _a[4] + (int32_t) _a[5]; + d32[3] = (int32_t) _a[6] + (int32_t) _a[7]; + d32[4] = (int32_t) _b[0] + (int32_t) _b[1]; + d32[5] = (int32_t) _b[2] + (int32_t) _b[3]; + d32[6] = (int32_t) _b[4] + (int32_t) _b[5]; + d32[7] = (int32_t) _b[6] + (int32_t) _b[7]; + for (int i = 0; i < 8; i++) { + if (d32[i] > (int32_t) INT16_MAX) + d16[i] = INT16_MAX; + else if (d32[i] < (int32_t) INT16_MIN) + d16[i] = INT16_MIN; + else + d16[i] = (int16_t) d32[i]; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_hadds_epi16(a, b); + + return VALIDATE_INT16_M128(c, d16); +} + +result_t test_mm_hadds_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer1; + + int16_t d16[8]; + int32_t d32[8]; + d32[0] = (int32_t) _a[0] + (int32_t) _a[1]; + d32[1] = (int32_t) _a[2] + (int32_t) _a[3]; + d32[2] = (int32_t) _b[0] + (int32_t) _b[1]; + d32[3] = (int32_t) _b[2] + (int32_t) _b[3]; + for (int i = 0; i < 8; i++) { + if (d32[i] > (int32_t) INT16_MAX) + d16[i] = INT16_MAX; + else if (d32[i] < (int32_t) INT16_MIN) + d16[i] = INT16_MIN; + else + d16[i] = (int16_t) d32[i]; + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_hadds_pi16(a, b); + + return VALIDATE_INT16_M64(c, d16); +} + +result_t test_mm_hsub_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer1; + + int16_t d[8]; + d[0] = _a[0] - _a[1]; + d[1] = _a[2] - _a[3]; + d[2] = _a[4] - _a[5]; + d[3] = _a[6] - _a[7]; + d[4] = _b[0] - _b[1]; + d[5] = _b[2] - _b[3]; + d[6] = _b[4] - _b[5]; + d[7] = _b[6] - _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_hsub_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_hsub_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer1; + + int32_t d[4]; + d[0] = _a[0] - _a[1]; + d[1] = _a[2] - _a[3]; + d[2] = _b[0] - _b[1]; + d[3] = _b[2] - _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_hsub_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_hsub_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[4]; + d[0] = _a[0] - _a[1]; + d[1] = _a[2] - _a[3]; + d[2] = _b[0] - _b[1]; + d[3] = _b[2] - _b[3]; + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_hsub_pi16(a, b); + + return VALIDATE_INT16_M64(c, d); +} + +result_t test_mm_hsub_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + + int32_t d[2]; + d[0] = _a[0] - _a[1]; + d[1] = _b[0] - _b[1]; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_hsub_pi32(a, b); + + return VALIDATE_INT32_M64(c, d); +} + +result_t test_mm_hsubs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer1; + + int16_t d16[8]; + d16[0] = saturate_i16((int32_t) _a[0] - (int32_t) _a[1]); + d16[1] = saturate_i16((int32_t) _a[2] - (int32_t) _a[3]); + d16[2] = saturate_i16((int32_t) _a[4] - (int32_t) _a[5]); + d16[3] = saturate_i16((int32_t) _a[6] - (int32_t) _a[7]); + d16[4] = saturate_i16((int32_t) _b[0] - (int32_t) _b[1]); + d16[5] = saturate_i16((int32_t) _b[2] - (int32_t) _b[3]); + d16[6] = saturate_i16((int32_t) _b[4] - (int32_t) _b[5]); + d16[7] = saturate_i16((int32_t) _b[6] - (int32_t) _b[7]); + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_hsubs_epi16(a, b); + + return VALIDATE_INT16_M128(c, d16); +} + +result_t test_mm_hsubs_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer1; + + int16_t _d[4]; + _d[0] = saturate_i16((int32_t) _a[0] - (int32_t) _a[1]); + _d[1] = saturate_i16((int32_t) _a[2] - (int32_t) _a[3]); + _d[2] = saturate_i16((int32_t) _b[0] - (int32_t) _b[1]); + _d[3] = saturate_i16((int32_t) _b[2] - (int32_t) _b[3]); + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_hsubs_pi16(a, b); + + return VALIDATE_INT16_M64(c, _d); +} + +result_t test_mm_maddubs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int32_t d0 = (int32_t) (_a[0] * _b[0]); + int32_t d1 = (int32_t) (_a[1] * _b[1]); + int32_t d2 = (int32_t) (_a[2] * _b[2]); + int32_t d3 = (int32_t) (_a[3] * _b[3]); + int32_t d4 = (int32_t) (_a[4] * _b[4]); + int32_t d5 = (int32_t) (_a[5] * _b[5]); + int32_t d6 = (int32_t) (_a[6] * _b[6]); + int32_t d7 = (int32_t) (_a[7] * _b[7]); + int32_t d8 = (int32_t) (_a[8] * _b[8]); + int32_t d9 = (int32_t) (_a[9] * _b[9]); + int32_t d10 = (int32_t) (_a[10] * _b[10]); + int32_t d11 = (int32_t) (_a[11] * _b[11]); + int32_t d12 = (int32_t) (_a[12] * _b[12]); + int32_t d13 = (int32_t) (_a[13] * _b[13]); + int32_t d14 = (int32_t) (_a[14] * _b[14]); + int32_t d15 = (int32_t) (_a[15] * _b[15]); + + int16_t e[8]; + e[0] = saturate_i16(d0 + d1); + e[1] = saturate_i16(d2 + d3); + e[2] = saturate_i16(d4 + d5); + e[3] = saturate_i16(d6 + d7); + e[4] = saturate_i16(d8 + d9); + e[5] = saturate_i16(d10 + d11); + e[6] = saturate_i16(d12 + d13); + e[7] = saturate_i16(d14 + d15); + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_maddubs_epi16(a, b); + return VALIDATE_INT16_M128(c, e); +} + +result_t test_mm_maddubs_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int16_t d0 = (int16_t) (_a[0] * _b[0]); + int16_t d1 = (int16_t) (_a[1] * _b[1]); + int16_t d2 = (int16_t) (_a[2] * _b[2]); + int16_t d3 = (int16_t) (_a[3] * _b[3]); + int16_t d4 = (int16_t) (_a[4] * _b[4]); + int16_t d5 = (int16_t) (_a[5] * _b[5]); + int16_t d6 = (int16_t) (_a[6] * _b[6]); + int16_t d7 = (int16_t) (_a[7] * _b[7]); + + int16_t e[4]; + e[0] = saturate_i16(d0 + d1); + e[1] = saturate_i16(d2 + d3); + e[2] = saturate_i16(d4 + d5); + e[3] = saturate_i16(d6 + d7); + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_maddubs_pi16(a, b); + + return VALIDATE_INT16_M64(c, e); +} + +result_t test_mm_mulhrs_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + int16_t _c[8]; + for (int i = 0; i < 8; i++) { + _c[i] = (int16_t) ((((((int32_t) _a[i] * (int32_t) _b[i]) >> 14) + 1) & + 0x1FFFE) >> + 1); + } + __m128i c = _mm_mulhrs_epi16(a, b); + + return VALIDATE_INT16_M128(c, _c); +} + +result_t test_mm_mulhrs_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + int16_t _c[4]; + for (int i = 0; i < 4; i++) { + _c[i] = (int16_t) ((((((int32_t) _a[i] * (int32_t) _b[i]) >> 14) + 1) & + 0x1FFFE) >> + 1); + } + __m64 c = _mm_mulhrs_pi16(a, b); + + return VALIDATE_INT16_M64(c, _c); +} + +result_t test_mm_shuffle_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t dst[16]; + + for (int i = 0; i < 16; i++) { + if (_b[i] & 0x80) { + dst[i] = 0; + } else { + dst[i] = _a[_b[i] & 0x0F]; + } + } + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i ret = _mm_shuffle_epi8(a, b); + + return VALIDATE_INT8_M128(ret, dst); +} + +result_t test_mm_shuffle_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t dst[8]; + + for (int i = 0; i < 8; i++) { + if (_b[i] & 0x80) { + dst[i] = 0; + } else { + dst[i] = _a[_b[i] & 0x07]; + } + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 ret = _mm_shuffle_pi8(a, b); + + return VALIDATE_INT8_M64(ret, dst); +} + +result_t test_mm_sign_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[8]; + for (int i = 0; i < 8; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sign_epi16(a, b); + + return VALIDATE_INT16_M128(c, d); +} + +result_t test_mm_sign_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[4]; + for (int i = 0; i < 4; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sign_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_sign_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[16]; + for (int i = 0; i < 16; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_sign_epi8(a, b); + + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_sign_pi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + + int16_t d[4]; + for (int i = 0; i < 4; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_sign_pi16(a, b); + + return VALIDATE_INT16_M64(c, d); +} + +result_t test_mm_sign_pi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[2]; + for (int i = 0; i < 2; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_sign_pi32(a, b); + + return VALIDATE_INT32_M64(c, d); +} + +result_t test_mm_sign_pi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[8]; + for (int i = 0; i < 8; i++) { + if (_b[i] < 0) { + d[i] = -_a[i]; + } else if (_b[i] == 0) { + d[i] = 0; + } else { + d[i] = _a[i]; + } + } + + __m64 a = load_m64(_a); + __m64 b = load_m64(_b); + __m64 c = _mm_sign_pi8(a, b); + + return VALIDATE_INT8_M64(c, d); +} + +/* SSE4.1 */ +result_t test_mm_blend_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + const int16_t *_b = (const int16_t *) impl.mTestIntPointer2; + int16_t _c[8]; + __m128i a, b, c; + +#define TEST_IMPL(IDX) \ + for (int j = 0; j < 8; j++) { \ + if ((IDX >> j) & 0x1) { \ + _c[j] = _b[j]; \ + } else { \ + _c[j] = _a[j]; \ + } \ + } \ + a = load_m128i(_a); \ + b = load_m128i(_b); \ + c = _mm_blend_epi16(a, b, IDX); \ + CHECK_RESULT(VALIDATE_INT16_M128(c, _c)); + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_blend_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + __m128d a, b, c; + +#define TEST_IMPL(IDX) \ + double _c##IDX[2]; \ + for (int j = 0; j < 2; j++) { \ + if ((IDX >> j) & 0x1) { \ + _c##IDX[j] = _b[j]; \ + } else { \ + _c##IDX[j] = _a[j]; \ + } \ + } \ + \ + a = load_m128d(_a); \ + b = load_m128d(_b); \ + c = _mm_blend_pd(a, b, IDX); \ + CHECK_RESULT(validateDouble(c, _c##IDX[0], _c##IDX[1])) + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_blend_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c; + + // gcc and clang can't compile call to _mm_blend_ps with 3rd argument as + // integer type due 4 bit size limitation. +#define TEST_IMPL(IDX) \ + float _c##IDX[4]; \ + for (int i = 0; i < 4; i++) { \ + if (IDX & (1 << i)) { \ + _c##IDX[i] = _b[i]; \ + } else { \ + _c##IDX[i] = _a[i]; \ + } \ + } \ + \ + c = _mm_blend_ps(a, b, IDX); \ + CHECK_RESULT( \ + validateFloat(c, _c##IDX[0], _c##IDX[1], _c##IDX[2], _c##IDX[3])) + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_blendv_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + const int8_t _mask[16] = {(const int8_t) impl.mTestInts[iter], + (const int8_t) impl.mTestInts[iter + 1], + (const int8_t) impl.mTestInts[iter + 2], + (const int8_t) impl.mTestInts[iter + 3], + (const int8_t) impl.mTestInts[iter + 4], + (const int8_t) impl.mTestInts[iter + 5], + (const int8_t) impl.mTestInts[iter + 6], + (const int8_t) impl.mTestInts[iter + 7]}; + + int8_t _c[16]; + for (int i = 0; i < 16; i++) { + if (_mask[i] >> 7) { + _c[i] = _b[i]; + } else { + _c[i] = _a[i]; + } + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i mask = load_m128i(_mask); + __m128i c = _mm_blendv_epi8(a, b, mask); + + return VALIDATE_INT8_M128(c, _c); +} + +result_t test_mm_blendv_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + const double _mask[] = {(double) impl.mTestFloats[iter], + (double) impl.mTestFloats[iter + 1]}; + + double _c[2]; + for (int i = 0; i < 2; i++) { + // signed shift right would return a result which is either all 1's from + // negative numbers or all 0's from positive numbers + int64_t m = sse2neon_tool_recast_i64(_mask[i]); + if (m >> 63) { + _c[i] = _b[i]; + } else { + _c[i] = _a[i]; + } + } + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d mask = load_m128d(_mask); + + __m128d c = _mm_blendv_pd(a, b, mask); + + return validateDouble(c, _c[0], _c[1]); +} + +result_t test_mm_blendv_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + const float _mask[] = {impl.mTestFloats[iter], impl.mTestFloats[iter + 1], + impl.mTestFloats[iter + 2], + impl.mTestFloats[iter + 3]}; + + float _c[4]; + for (int i = 0; i < 4; i++) { + // signed shift right would return a result which is either all 1's from + // negative numbers or all 0's from positive numbers + if ((*(const int32_t *) (_mask + i)) >> 31) { + _c[i] = _b[i]; + } else { + _c[i] = _a[i]; + } + } + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 mask = load_m128(_mask); + + __m128 c = _mm_blendv_ps(a, b, mask); + + return validateFloat(c, _c[0], _c[1], _c[2], _c[3]); +} + +result_t test_mm_ceil_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + double dx = ceil(_a[0]); + double dy = ceil(_a[1]); + + __m128d a = load_m128d(_a); + __m128d ret = _mm_ceil_pd(a); + + return validateDouble(ret, dx, dy); +} + +result_t test_mm_ceil_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + float dx = ceilf(_a[0]); + float dy = ceilf(_a[1]); + float dz = ceilf(_a[2]); + float dw = ceilf(_a[3]); + + __m128 a = _mm_load_ps(_a); + __m128 c = _mm_ceil_ps(a); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_ceil_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double dx = ceil(_b[0]); + double dy = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d ret = _mm_ceil_sd(a, b); + + return validateDouble(ret, dx, dy); +} + +result_t test_mm_ceil_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer1; + + float f0 = ceilf(_b[0]); + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_ceil_ss(a, b); + + return validateFloat(c, f0, _a[1], _a[2], _a[3]); +} + +result_t test_mm_cmpeq_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + int64_t d0 = (_a[0] == _b[0]) ? 0xffffffffffffffff : 0x0; + int64_t d1 = (_a[1] == _b[1]) ? 0xffffffffffffffff : 0x0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_cmpeq_epi64(a, b); + return validateInt64(c, d0, d1); +} + +result_t test_mm_cvtepi16_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + + int32_t d[4]; + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + d[2] = (int32_t) _a[2]; + d[3] = (int32_t) _a[3]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi16_epi32(a); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_cvtepi16_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi16_epi64(a); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_cvtepi32_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi32_epi64(a); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_cvtepi8_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + + int16_t d[8]; + d[0] = (int16_t) _a[0]; + d[1] = (int16_t) _a[1]; + d[2] = (int16_t) _a[2]; + d[3] = (int16_t) _a[3]; + d[4] = (int16_t) _a[4]; + d[5] = (int16_t) _a[5]; + d[6] = (int16_t) _a[6]; + d[7] = (int16_t) _a[7]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi8_epi16(a); + + return VALIDATE_INT16_M128(ret, d); +} + +result_t test_mm_cvtepi8_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + + int32_t d[4]; + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + d[2] = (int32_t) _a[2]; + d[3] = (int32_t) _a[3]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi8_epi32(a); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_cvtepi8_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepi8_epi64(a); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_cvtepu16_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + + int32_t d[4]; + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + d[2] = (int32_t) _a[2]; + d[3] = (int32_t) _a[3]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu16_epi32(a); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_cvtepu16_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu16_epi64(a); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_cvtepu32_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu32_epi64(a); + + return validateInt64(ret, i0, i1); +} + +result_t test_mm_cvtepu8_epi16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + + int16_t d[8]; + d[0] = (int16_t) _a[0]; + d[1] = (int16_t) _a[1]; + d[2] = (int16_t) _a[2]; + d[3] = (int16_t) _a[3]; + d[4] = (int16_t) _a[4]; + d[5] = (int16_t) _a[5]; + d[6] = (int16_t) _a[6]; + d[7] = (int16_t) _a[7]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu8_epi16(a); + + return VALIDATE_INT16_M128(ret, d); +} + +result_t test_mm_cvtepu8_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + + int32_t d[4]; + d[0] = (int32_t) _a[0]; + d[1] = (int32_t) _a[1]; + d[2] = (int32_t) _a[2]; + d[3] = (int32_t) _a[3]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu8_epi32(a); + + return VALIDATE_INT32_M128(ret, d); +} + +result_t test_mm_cvtepu8_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + + int64_t i0 = (int64_t) _a[0]; + int64_t i1 = (int64_t) _a[1]; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_cvtepu8_epi64(a); + + return validateInt64(ret, i0, i1); +} + +#define MM_DP_PD_TEST_CASE_WITH(imm8) \ + do { \ + const double _a[] = {impl.mTestFloatPointer1[0], \ + impl.mTestFloatPointer1[1]}; \ + const double _b[] = {impl.mTestFloatPointer2[0], \ + impl.mTestFloatPointer2[1]}; \ + const int imm = imm8; \ + double d[2] = {0}; \ + double sum = 0; \ + for (size_t i = 0; i < 2; i++) \ + sum += ((imm) & (1 << (i + 4))) ? _a[i] * _b[i] : 0; \ + for (size_t i = 0; i < 2; i++) \ + d[i] = (imm & (1 << i)) ? sum : 0; \ + __m128d a = load_m128d(_a); \ + __m128d b = load_m128d(_b); \ + __m128d ret = _mm_dp_pd(a, b, imm); \ + if (validateDouble(ret, d[0], d[1]) != TEST_SUCCESS) \ + return TEST_FAIL; \ + } while (0) + +#define GENERATE_MM_DP_PD_TEST_CASES \ + MM_DP_PD_TEST_CASE_WITH(0xF0); \ + MM_DP_PD_TEST_CASE_WITH(0xF1); \ + MM_DP_PD_TEST_CASE_WITH(0xF2); \ + MM_DP_PD_TEST_CASE_WITH(0xFF); \ + MM_DP_PD_TEST_CASE_WITH(0x10); \ + MM_DP_PD_TEST_CASE_WITH(0x11); \ + MM_DP_PD_TEST_CASE_WITH(0x12); \ + MM_DP_PD_TEST_CASE_WITH(0x13); \ + MM_DP_PD_TEST_CASE_WITH(0x00); \ + MM_DP_PD_TEST_CASE_WITH(0x01); \ + MM_DP_PD_TEST_CASE_WITH(0x02); \ + MM_DP_PD_TEST_CASE_WITH(0x03); \ + MM_DP_PD_TEST_CASE_WITH(0x20); \ + MM_DP_PD_TEST_CASE_WITH(0x21); \ + MM_DP_PD_TEST_CASE_WITH(0x22); \ + MM_DP_PD_TEST_CASE_WITH(0x23); + +OPTNONE result_t test_mm_dp_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_DP_PD_TEST_CASES + return TEST_SUCCESS; +} + +#define MM_DP_PS_TEST_CASE_WITH(IMM) \ + do { \ + const float *_a = impl.mTestFloatPointer1; \ + const float *_b = impl.mTestFloatPointer2; \ + const int imm = IMM; \ + __m128 a = load_m128(_a); \ + __m128 b = load_m128(_b); \ + __m128 out = _mm_dp_ps(a, b, imm); \ + float r[4]; /* the reference */ \ + float sum = 0; \ + for (size_t i = 0; i < 4; i++) \ + sum += ((imm) & (1 << (i + 4))) ? _a[i] * _b[i] : 0; \ + for (size_t i = 0; i < 4; i++) \ + r[i] = (imm & (1 << i)) ? sum : 0; \ + /* the epsilon has to be large enough, otherwise test suite fails. */ \ + if (validateFloatEpsilon(out, r[0], r[1], r[2], r[3], 2050.0f) != \ + TEST_SUCCESS) \ + return TEST_FAIL; \ + } while (0) + +#define GENERATE_MM_DP_PS_TEST_CASES \ + MM_DP_PS_TEST_CASE_WITH(0xFF); \ + MM_DP_PS_TEST_CASE_WITH(0x7F); \ + MM_DP_PS_TEST_CASE_WITH(0x9F); \ + MM_DP_PS_TEST_CASE_WITH(0x2F); \ + MM_DP_PS_TEST_CASE_WITH(0x0F); \ + MM_DP_PS_TEST_CASE_WITH(0x23); \ + MM_DP_PS_TEST_CASE_WITH(0xB5); + +OPTNONE result_t test_mm_dp_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_DP_PS_TEST_CASES + return TEST_SUCCESS; +} + +result_t test_mm_extract_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int32_t *_a = (int32_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + int c; + +#define TEST_IMPL(IDX) \ + c = _mm_extract_epi32(a, IDX); \ + ASSERT_RETURN(c == *(_a + IDX)); + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_extract_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int64_t *_a = (int64_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + __int64 c; + +#define TEST_IMPL(IDX) \ + c = _mm_extract_epi64(a, IDX); \ + ASSERT_RETURN(c == *(_a + IDX)); + + IMM_2_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_extract_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint8_t *_a = (uint8_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + int c; + +#define TEST_IMPL(IDX) \ + c = _mm_extract_epi8(a, IDX); \ + ASSERT_RETURN(c == *(_a + IDX)); + + IMM_8_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_extract_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = (const float *) impl.mTestFloatPointer1; + + __m128 a = _mm_load_ps(_a); + int32_t c; + +#define TEST_IMPL(IDX) \ + c = _mm_extract_ps(a, IDX); \ + ASSERT_RETURN(c == *(const int32_t *) (_a + IDX)); + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_floor_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + + double dx = floor(_a[0]); + double dy = floor(_a[1]); + + __m128d a = load_m128d(_a); + __m128d ret = _mm_floor_pd(a); + + return validateDouble(ret, dx, dy); +} + +result_t test_mm_floor_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + float dx = floorf(_a[0]); + float dy = floorf(_a[1]); + float dz = floorf(_a[2]); + float dw = floorf(_a[3]); + + __m128 a = load_m128(_a); + __m128 c = _mm_floor_ps(a); + return validateFloat(c, dx, dy, dz, dw); +} + +result_t test_mm_floor_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (const double *) impl.mTestFloatPointer1; + const double *_b = (const double *) impl.mTestFloatPointer2; + + double dx = floor(_b[0]); + double dy = _a[1]; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + __m128d ret = _mm_floor_sd(a, b); + + return validateDouble(ret, dx, dy); +} + +result_t test_mm_floor_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer1; + + float f0 = floorf(_b[0]); + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + __m128 c = _mm_floor_ss(a, b); + + return validateFloat(c, f0, _a[1], _a[2], _a[3]); +} + +result_t test_mm_insert_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t insert = (int32_t) *impl.mTestIntPointer2; + __m128i a, b; + +#define TEST_IMPL(IDX) \ + int32_t d##IDX[4]; \ + for (int i = 0; i < 4; i++) { \ + d##IDX[i] = _a[i]; \ + } \ + d##IDX[IDX] = insert; \ + \ + a = load_m128i(_a); \ + b = _mm_insert_epi32(a, (int) insert, IDX); \ + CHECK_RESULT(VALIDATE_INT32_M128(b, d##IDX)); + + IMM_4_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_insert_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + int64_t insert = (int64_t) *impl.mTestIntPointer2; + + __m128i a, b; + int64_t d[2]; +#define TEST_IMPL(IDX) \ + d[0] = _a[0]; \ + d[1] = _a[1]; \ + d[IDX] = insert; \ + a = load_m128i(_a); \ + b = _mm_insert_epi64(a, insert, IDX); \ + CHECK_RESULT(validateInt64(b, d[0], d[1])); + + IMM_2_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_insert_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t insert = (int8_t) *impl.mTestIntPointer2; + __m128i a, b; + int8_t d[16]; + +#define TEST_IMPL(IDX) \ + for (int i = 0; i < 16; i++) { \ + d[i] = _a[i]; \ + } \ + d[IDX] = insert; \ + a = load_m128i(_a); \ + b = _mm_insert_epi8(a, insert, IDX); \ + CHECK_RESULT(VALIDATE_INT8_M128(b, d)); + + IMM_16_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_insert_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + + __m128 a, b, c; +#define TEST_IMPL(IDX) \ + float d##IDX[4] = {_a[0], _a[1], _a[2], _a[3]}; \ + d##IDX[(IDX >> 4) & 0x3] = _b[(IDX >> 6) & 0x3]; \ + \ + for (int j = 0; j < 4; j++) { \ + if (IDX & (1 << j)) { \ + d##IDX[j] = 0; \ + } \ + } \ + \ + a = _mm_load_ps(_a); \ + b = _mm_load_ps(_b); \ + c = _mm_insert_ps(a, b, IDX); \ + CHECK_RESULT(validateFloat(c, d##IDX[0], d##IDX[1], d##IDX[2], d##IDX[3])); + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_max_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[4]; + d[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_max_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_max_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + int8_t d[16]; + d[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] > _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] > _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] > _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] > _b[7] ? _a[7] : _b[7]; + d[8] = _a[8] > _b[8] ? _a[8] : _b[8]; + d[9] = _a[9] > _b[9] ? _a[9] : _b[9]; + d[10] = _a[10] > _b[10] ? _a[10] : _b[10]; + d[11] = _a[11] > _b[11] ? _a[11] : _b[11]; + d[12] = _a[12] > _b[12] ? _a[12] : _b[12]; + d[13] = _a[13] > _b[13] ? _a[13] : _b[13]; + d[14] = _a[14] > _b[14] ? _a[14] : _b[14]; + d[15] = _a[15] > _b[15] ? _a[15] : _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + __m128i c = _mm_max_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_max_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + + uint16_t d[8]; + d[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] > _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] > _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] > _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] > _b[7] ? _a[7] : _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_max_epu16(a, b); + + return VALIDATE_UINT16_M128(c, d); +} + +result_t test_mm_max_epu32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + const uint32_t *_b = (const uint32_t *) impl.mTestIntPointer2; + + uint32_t d[4]; + d[0] = _a[0] > _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] > _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] > _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] > _b[3] ? _a[3] : _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_max_epu32(a, b); + + return VALIDATE_UINT32_M128(c, d); +} + +result_t test_mm_min_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int32_t d[4]; + d[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_min_epi32(a, b); + + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_min_epi8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int8_t *_a = (const int8_t *) impl.mTestIntPointer1; + const int8_t *_b = (const int8_t *) impl.mTestIntPointer2; + + int8_t d[16]; + d[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] < _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] < _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] < _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] < _b[7] ? _a[7] : _b[7]; + d[8] = _a[8] < _b[8] ? _a[8] : _b[8]; + d[9] = _a[9] < _b[9] ? _a[9] : _b[9]; + d[10] = _a[10] < _b[10] ? _a[10] : _b[10]; + d[11] = _a[11] < _b[11] ? _a[11] : _b[11]; + d[12] = _a[12] < _b[12] ? _a[12] : _b[12]; + d[13] = _a[13] < _b[13] ? _a[13] : _b[13]; + d[14] = _a[14] < _b[14] ? _a[14] : _b[14]; + d[15] = _a[15] < _b[15] ? _a[15] : _b[15]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + + __m128i c = _mm_min_epi8(a, b); + return VALIDATE_INT8_M128(c, d); +} + +result_t test_mm_min_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint16_t *_a = (const uint16_t *) impl.mTestIntPointer1; + const uint16_t *_b = (const uint16_t *) impl.mTestIntPointer2; + + uint16_t d[8]; + d[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + d[4] = _a[4] < _b[4] ? _a[4] : _b[4]; + d[5] = _a[5] < _b[5] ? _a[5] : _b[5]; + d[6] = _a[6] < _b[6] ? _a[6] : _b[6]; + d[7] = _a[7] < _b[7] ? _a[7] : _b[7]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_min_epu16(a, b); + + return VALIDATE_UINT16_M128(c, d); +} + +result_t test_mm_min_epu32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint32_t *_a = (const uint32_t *) impl.mTestIntPointer1; + const uint32_t *_b = (const uint32_t *) impl.mTestIntPointer2; + + uint32_t d[4]; + d[0] = _a[0] < _b[0] ? _a[0] : _b[0]; + d[1] = _a[1] < _b[1] ? _a[1] : _b[1]; + d[2] = _a[2] < _b[2] ? _a[2] : _b[2]; + d[3] = _a[3] < _b[3] ? _a[3] : _b[3]; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_min_epu32(a, b); + + return VALIDATE_UINT32_M128(c, d); +} + +result_t test_mm_minpos_epu16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int16_t *_a = (const int16_t *) impl.mTestIntPointer1; + uint16_t index = 0, min = (uint16_t) _a[0]; + for (int i = 0; i < 8; i++) { + if ((uint16_t) _a[i] < min) { + index = (uint16_t) i; + min = (uint16_t) _a[i]; + } + } + + uint16_t d[8] = {min, index, 0, 0, 0, 0, 0, 0}; + + __m128i a = load_m128i(_a); + __m128i ret = _mm_minpos_epu16(a); + return VALIDATE_UINT16_M128(ret, d); +} + +result_t test_mm_mpsadbw_epu8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *_a = (const uint8_t *) impl.mTestIntPointer1; + const uint8_t *_b = (const uint8_t *) impl.mTestIntPointer2; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c; +#define TEST_IMPL(IDX) \ + uint8_t a_offset##IDX = ((IDX >> 2) & 0x1) * 4; \ + uint8_t b_offset##IDX = (IDX & 0x3) * 4; \ + \ + uint16_t d##IDX[8] = {}; \ + for (int i = 0; i < 8; i++) { \ + for (int j = 0; j < 4; j++) { \ + d##IDX[i] += (uint16_t) abs(_a[(a_offset##IDX + i) + j] - \ + _b[b_offset##IDX + j]); \ + } \ + } \ + c = _mm_mpsadbw_epu8(a, b, IDX); \ + CHECK_RESULT(VALIDATE_UINT16_M128(c, d##IDX)); + + IMM_8_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +result_t test_mm_mul_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + int64_t dx = (int64_t) (_a[0]) * (int64_t) (_b[0]); + int64_t dy = (int64_t) (_a[2]) * (int64_t) (_b[2]); + + __m128i a = _mm_loadu_si128((const __m128i *) _a); + __m128i b = _mm_loadu_si128((const __m128i *) _b); + __m128i r = _mm_mul_epi32(a, b); + + return validateInt64(r, dx, dy); +} + +result_t test_mm_mullo_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + int32_t d[4]; + + for (int i = 0; i < 4; i++) { + d[i] = (int32_t) ((int64_t) _a[i] * (int64_t) _b[i]); + } + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_mullo_epi32(a, b); + return VALIDATE_INT32_M128(c, d); +} + +result_t test_mm_packus_epi32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint16_t max = UINT16_MAX; + uint16_t min = 0; + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_b = (const int32_t *) impl.mTestIntPointer2; + + uint16_t d[8]; + for (int i = 0; i < 4; i++) { + if (_a[i] > (int32_t) max) + d[i] = max; + else if (_a[i] < (int32_t) min) + d[i] = min; + else + d[i] = (uint16_t) _a[i]; + } + for (int i = 0; i < 4; i++) { + if (_b[i] > (int32_t) max) + d[i + 4] = max; + else if (_b[i] < (int32_t) min) + d[i + 4] = min; + else + d[i + 4] = (uint16_t) _b[i]; + } + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i c = _mm_packus_epi32(a, b); + + return VALIDATE_UINT16_M128(c, d); +} + +OPTNONE result_t test_mm_round_pd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (double *) impl.mTestFloatPointer1; + double d[2] = {}; + __m128d ret; + + __m128d a = load_m128d(_a); + switch (iter & 0x7) { + case 0: + d[0] = bankersRounding(_a[0]); + d[1] = bankersRounding(_a[1]); + + ret = _mm_round_pd(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); + break; + case 1: + d[0] = floor(_a[0]); + d[1] = floor(_a[1]); + + ret = _mm_round_pd(a, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); + break; + case 2: + d[0] = ceil(_a[0]); + d[1] = ceil(_a[1]); + + ret = _mm_round_pd(a, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); + break; + case 3: + d[0] = _a[0] > 0 ? floor(_a[0]) : ceil(_a[0]); + d[1] = _a[1] > 0 ? floor(_a[1]) : ceil(_a[1]); + + ret = _mm_round_pd(a, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); + break; + case 4: + d[0] = bankersRounding(_a[0]); + d[1] = bankersRounding(_a[1]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + ret = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + break; + case 5: + d[0] = floor(_a[0]); + d[1] = floor(_a[1]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + ret = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + break; + case 6: + d[0] = ceil(_a[0]); + d[1] = ceil(_a[1]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + ret = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + break; + case 7: + d[0] = _a[0] > 0 ? floor(_a[0]) : ceil(_a[0]); + d[1] = _a[1] > 0 ? floor(_a[1]) : ceil(_a[1]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + ret = _mm_round_pd(a, _MM_FROUND_CUR_DIRECTION); + break; + } + + return validateDouble(ret, d[0], d[1]); +} + +OPTNONE result_t test_mm_round_ps(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + float f[4] = {}; + __m128 ret; + + __m128 a = load_m128(_a); + switch (iter & 0x7) { + case 0: + f[0] = bankersRounding(_a[0]); + f[1] = bankersRounding(_a[1]); + f[2] = bankersRounding(_a[2]); + f[3] = bankersRounding(_a[3]); + + ret = _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); + break; + case 1: + f[0] = floorf(_a[0]); + f[1] = floorf(_a[1]); + f[2] = floorf(_a[2]); + f[3] = floorf(_a[3]); + + ret = _mm_round_ps(a, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); + break; + case 2: + f[0] = ceilf(_a[0]); + f[1] = ceilf(_a[1]); + f[2] = ceilf(_a[2]); + f[3] = ceilf(_a[3]); + + ret = _mm_round_ps(a, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); + break; + case 3: + f[0] = _a[0] > 0 ? floorf(_a[0]) : ceilf(_a[0]); + f[1] = _a[1] > 0 ? floorf(_a[1]) : ceilf(_a[1]); + f[2] = _a[2] > 0 ? floorf(_a[2]) : ceilf(_a[2]); + f[3] = _a[3] > 0 ? floorf(_a[3]) : ceilf(_a[3]); + + ret = _mm_round_ps(a, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); + break; + case 4: + f[0] = bankersRounding(_a[0]); + f[1] = bankersRounding(_a[1]); + f[2] = bankersRounding(_a[2]); + f[3] = bankersRounding(_a[3]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + ret = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + break; + case 5: + f[0] = floorf(_a[0]); + f[1] = floorf(_a[1]); + f[2] = floorf(_a[2]); + f[3] = floorf(_a[3]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + ret = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + break; + case 6: + f[0] = ceilf(_a[0]); + f[1] = ceilf(_a[1]); + f[2] = ceilf(_a[2]); + f[3] = ceilf(_a[3]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + ret = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + break; + case 7: + f[0] = _a[0] > 0 ? floorf(_a[0]) : ceilf(_a[0]); + f[1] = _a[1] > 0 ? floorf(_a[1]) : ceilf(_a[1]); + f[2] = _a[2] > 0 ? floorf(_a[2]) : ceilf(_a[2]); + f[3] = _a[3] > 0 ? floorf(_a[3]) : ceilf(_a[3]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + ret = _mm_round_ps(a, _MM_FROUND_CUR_DIRECTION); + break; + } + + return validateFloat(ret, f[0], f[1], f[2], f[3]); +} + +result_t test_mm_round_sd(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const double *_a = (double *) impl.mTestFloatPointer1; + const double *_b = (double *) impl.mTestFloatPointer2; + double d[2] = {}; + __m128d ret; + + __m128d a = load_m128d(_a); + __m128d b = load_m128d(_b); + d[1] = _a[1]; + switch (iter & 0x7) { + case 0: + d[0] = bankersRounding(_b[0]); + + ret = _mm_round_sd(a, b, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); + break; + case 1: + d[0] = floor(_b[0]); + + ret = _mm_round_sd(a, b, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); + break; + case 2: + d[0] = ceil(_b[0]); + + ret = _mm_round_sd(a, b, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); + break; + case 3: + d[0] = _b[0] > 0 ? floor(_b[0]) : ceil(_b[0]); + + ret = _mm_round_sd(a, b, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); + break; + case 4: + d[0] = bankersRounding(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + ret = _mm_round_sd(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 5: + d[0] = floor(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + ret = _mm_round_sd(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 6: + d[0] = ceil(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + ret = _mm_round_sd(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 7: + d[0] = _b[0] > 0 ? floor(_b[0]) : ceil(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + ret = _mm_round_sd(a, b, _MM_FROUND_CUR_DIRECTION); + break; + } + + return validateDouble(ret, d[0], d[1]); +} + +result_t test_mm_round_ss(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const float *_a = impl.mTestFloatPointer1; + const float *_b = impl.mTestFloatPointer2; + float f[4]; + __m128 ret; + + __m128 a = load_m128(_a); + __m128 b = load_m128(_b); + switch (iter & 0x7) { + case 0: + f[0] = bankersRounding(_b[0]); + + ret = _mm_round_ss(a, b, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); + break; + case 1: + f[0] = floorf(_b[0]); + + ret = _mm_round_ss(a, b, _MM_FROUND_TO_NEG_INF | _MM_FROUND_NO_EXC); + break; + case 2: + f[0] = ceilf(_b[0]); + + ret = _mm_round_ss(a, b, _MM_FROUND_TO_POS_INF | _MM_FROUND_NO_EXC); + break; + case 3: + f[0] = _b[0] > 0 ? floorf(_b[0]) : ceilf(_b[0]); + + ret = _mm_round_ss(a, b, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); + break; + case 4: + f[0] = bankersRounding(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST); + ret = _mm_round_ss(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 5: + f[0] = floorf(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_DOWN); + ret = _mm_round_ss(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 6: + f[0] = ceilf(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_UP); + ret = _mm_round_ss(a, b, _MM_FROUND_CUR_DIRECTION); + break; + case 7: + f[0] = _b[0] > 0 ? floorf(_b[0]) : ceilf(_b[0]); + + _MM_SET_ROUNDING_MODE(_MM_ROUND_TOWARD_ZERO); + ret = _mm_round_ss(a, b, _MM_FROUND_CUR_DIRECTION); + break; + } + f[1] = _a[1]; + f[2] = _a[2]; + f[3] = _a[3]; + + + return validateFloat(ret, f[0], f[1], f[2], f[3]); +} + +result_t test_mm_stream_load_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + int32_t *addr = impl.mTestIntPointer1; + + __m128i ret = _mm_stream_load_si128((__m128i *) addr); + + return VALIDATE_INT32_M128(ret, addr); +} + +result_t test_mm_test_all_ones(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + __m128i a = load_m128i(_a); + + int32_t d0 = ~_a[0] & (~(uint32_t) 0); + int32_t d1 = ~_a[1] & (~(uint32_t) 0); + int32_t d2 = ~_a[2] & (~(uint32_t) 0); + int32_t d3 = ~_a[3] & (~(uint32_t) 0); + int32_t result = ((d0 | d1 | d2 | d3) == 0) ? 1 : 0; + + int32_t ret = _mm_test_all_ones(a); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_test_all_zeros(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_mask = (const int32_t *) impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i mask = load_m128i(_mask); + + int32_t d0 = _a[0] & _mask[0]; + int32_t d1 = _a[1] & _mask[1]; + int32_t d2 = _a[2] & _mask[2]; + int32_t d3 = _a[3] & _mask[3]; + int32_t result = ((d0 | d1 | d2 | d3) == 0) ? 1 : 0; + + int32_t ret = _mm_test_all_zeros(a, mask); + + return result == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_test_mix_ones_zeros(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + const int32_t *_a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *_mask = (const int32_t *) impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i mask = load_m128i(_mask); + + int32_t ZF = 1; + int32_t CF = 1; + for (int i = 0; i < 4; i++) { + ZF &= ((_a[i] & _mask[i]) == 0); + CF &= ((~_a[i] & _mask[i]) == 0); + } + int32_t result = (ZF == 0 && CF == 0); + + int32_t ret = _mm_test_mix_ones_zeros(a, mask); + return result == ret ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_testc_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i b = _mm_load_si128((const __m128i *) _b); + int testc = 1; + for (int i = 0; i < 2; i++) { + if ((~(((SIMDVec *) &a)->m128_u64[i]) & + ((SIMDVec *) &b)->m128_u64[i])) { + testc = 0; + break; + } + } + return _mm_testc_si128(a, b) == testc ? TEST_SUCCESS : TEST_FAIL; +} + +result_t test_mm_testnzc_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return test_mm_test_mix_ones_zeros(impl, iter); +} + +result_t test_mm_testz_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *_a = impl.mTestIntPointer1; + const int32_t *_b = impl.mTestIntPointer2; + __m128i a = _mm_load_si128((const __m128i *) _a); + __m128i b = _mm_load_si128((const __m128i *) _b); + int testz = 1; + for (int i = 0; i < 2; i++) { + if ((((SIMDVec *) &a)->m128_u64[i] & ((SIMDVec *) &b)->m128_u64[i])) { + testz = 0; + break; + } + } + return _mm_testz_si128(a, b) == testz ? TEST_SUCCESS : TEST_FAIL; +} + +/* SSE4.2 */ +#define IS_CMPESTRI 1 + +#define DEF_ENUM_MM_CMPESTRX_VARIANT(c, ...) c, + +#define EVAL_MM_CMPESTRX_TEST_CASE(c, type, data_type, im, IM) \ + do { \ + data_type *a = test_mm_##im##_##type##_data[c].a, \ + *b = test_mm_##im##_##type##_data[c].b; \ + int la = test_mm_##im##_##type##_data[c].la, \ + lb = test_mm_##im##_##type##_data[c].lb; \ + const int imm8 = IMM_##c; \ + IIF(IM) \ + (int expect = test_mm_##im##_##type##_data[c].expect, \ + data_type *expect = test_mm_##im##_##type##_data[c].expect); \ + __m128i ma, mb; \ + memcpy(&ma, a, sizeof(ma)); \ + memcpy(&mb, b, sizeof(mb)); \ + IIF(IM) \ + (int res = _mm_##im(ma, la, mb, lb, imm8), \ + __m128i res = _mm_##im(ma, la, mb, lb, imm8)); \ + if (IIF(IM)(res != expect, memcmp(expect, &res, sizeof(__m128i)))) \ + return TEST_FAIL; \ + } while (0); + +#define ENUM_MM_CMPESTRX_TEST_CASES(type, type_lower, data_type, func, FUNC, \ + IM) \ + enum { MM_##FUNC##_##type##_TEST_CASES(DEF_ENUM_MM_CMPESTRX_VARIANT) }; \ + MM_##FUNC##_##type##_TEST_CASES(EVAL_MM_CMPESTRX_TEST_CASE, type_lower, \ + data_type, func, IM) + +#define IMM_UBYTE_EACH_LEAST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UBYTE_EACH_LEAST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_EACH_LEAST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_EACH_MOST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT) +#define IMM_UBYTE_EACH_MOST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_EACH_MOST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_ANY_LEAST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UBYTE_ANY_LEAST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_ANY_LEAST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_ANY_MOST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT) +#define IMM_UBYTE_ANY_MOST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_ANY_MOST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_RANGES_LEAST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UBYTE_RANGES_MOST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT) +#define IMM_UBYTE_RANGES_LEAST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_RANGES_MOST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_RANGES_LEAST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_RANGES_MOST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UBYTE_ORDERED_LEAST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UBYTE_ORDERED_LEAST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_ORDERED_MOST \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT) +#define IMM_UBYTE_ORDERED_MOST_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_ORDERED_MOST_MASKED_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) + +#define IMM_SBYTE_EACH_LEAST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SBYTE_EACH_LEAST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_EACH_LEAST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_EACH_MOST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT) +#define IMM_SBYTE_EACH_MOST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_EACH_MOST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_ANY_LEAST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SBYTE_ANY_LEAST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_ANY_MOST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT) +#define IMM_SBYTE_ANY_MOST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_RANGES_LEAST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SBYTE_RANGES_LEAST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_RANGES_LEAST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_RANGES_MOST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT) +#define IMM_SBYTE_RANGES_MOST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_RANGES_MOST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_ORDERED_LEAST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SBYTE_ORDERED_LEAST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_ORDERED_LEAST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_ORDERED_MOST_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SBYTE_ORDERED_MOST \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT) +#define IMM_SBYTE_ORDERED_MOST_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) + +#define IMM_UWORD_RANGES_LEAST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UWORD_RANGES_LEAST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_RANGES_LEAST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_RANGES_MOST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT) +#define IMM_UWORD_RANGES_MOST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_RANGES_MOST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_EACH_LEAST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UWORD_EACH_MOST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT) +#define IMM_UWORD_EACH_LEAST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_EACH_LEAST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_EACH_MOST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_ANY_LEAST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UWORD_ANY_MOST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT) +#define IMM_UWORD_ANY_MOST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_ANY_LEAST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_ANY_LEAST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_ORDERED_LEAST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT) +#define IMM_UWORD_ORDERED_LEAST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_ORDERED_LEAST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_UWORD_ORDERED_MOST \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT) +#define IMM_UWORD_ORDERED_MOST_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UWORD_ORDERED_MOST_MASKED_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) + +#define IMM_SWORD_RANGES_LEAST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SWORD_RANGES_MOST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT) +#define IMM_SWORD_RANGES_LEAST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SWORD_RANGES_LEAST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_RANGES_MOST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_EACH_LEAST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SWORD_EACH_MOST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT) +#define IMM_SWORD_EACH_LEAST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SWORD_EACH_LEAST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_EACH_MOST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SWORD_EACH_MOST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_ANY_LEAST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SWORD_ANY_LEAST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SWORD_ANY_LEAST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_ANY_MOST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT) +#define IMM_SWORD_ANY_MOST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SWORD_ANY_MOST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_ANY_MOST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_ORDERED_LEAST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT) +#define IMM_SWORD_ORDERED_LEAST_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_SWORD_ORDERED_LEAST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_LEAST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SWORD_ORDERED_MOST \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT) +#define IMM_SWORD_ORDERED_MOST_MASKED_NEGATIVE \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_MOST_SIGNIFICANT | \ + _SIDD_MASKED_NEGATIVE_POLARITY) + +typedef struct { + uint8_t a[16], b[16]; + int la, lb; + const int imm8; + int expect; +} test_mm_cmpestri_ubyte_data_t; +typedef struct { + int8_t a[16], b[16]; + int la, lb; + const int imm8; + int expect; +} test_mm_cmpestri_sbyte_data_t; +typedef struct { + uint16_t a[8], b[8]; + int la, lb; + const int imm8; + int expect; +} test_mm_cmpestri_uword_data_t; +typedef struct { + int16_t a[8], b[8]; + int la, lb; + const int imm8; + int expect; +} test_mm_cmpestri_sword_data_t; + +#define TEST_MM_CMPESTRA_UBYTE_DATA_LEN 3 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestra_ubyte_data[TEST_MM_CMPESTRA_UBYTE_DATA_LEN] = { + {{20, 10, 33, 56, 78}, + {20, 10, 34, 98, 127, 20, 10, 32, 20, 10, 32, 11, 3, 20, 10, 31}, + 3, + 17, + IMM_UBYTE_ORDERED_MOST, + 1}, + {{20, 127, 0, 45, 77, 1, 34, 43, 109}, + {2, 127, 0, 54, 6, 43, 12, 110, 100}, + 9, + 20, + IMM_UBYTE_EACH_LEAST_NEGATIVE, + 0}, + {{22, 33, 90, 1}, + {22, 33, 90, 1, 1, 5, 4, 7, 98, 34, 1, 12, 13, 14, 15, 16}, + 4, + 11, + IMM_UBYTE_ANY_LEAST_MASKED_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPESTRA_SBYTE_DATA_LEN 3 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestra_sbyte_data[TEST_MM_CMPESTRA_SBYTE_DATA_LEN] = { + {{45, -94, 38, -11, 84, -123, -43, -49, 25, -55, -121, -6, 57, 108, -55, + 69}, + {-26, -61, -21, -96, 48, -112, 95, -56, 29, -55, -121, -6, 57, 108, + -55, 69}, + 23, + 28, + IMM_SBYTE_RANGES_LEAST, + 0}, + {{-12, 8}, + {-12, 7, -12, 8, -13, 45, -12, 8}, + 2, + 8, + IMM_SBYTE_ORDERED_MOST_NEGATIVE, + 0}, + {{-100, -127, 56, 78, 21, -1, 9, 127, 45}, + {100, 126, 30, 65, 87, 54, 80, 81, -98, -101, 90, 1, 5, 60, -77, -65}, + 10, + 20, + IMM_SBYTE_ANY_LEAST, + 1}, +}; + +#define TEST_MM_CMPESTRA_UWORD_DATA_LEN 3 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestra_uword_data[TEST_MM_CMPESTRA_UWORD_DATA_LEN] = { + {{10000, 20000, 30000, 40000, 50000}, + {40001, 50002, 10000, 20000, 30000, 40000, 50000}, + 5, + 10, + IMM_UWORD_ORDERED_LEAST, + 0}, + {{1001, 9487, 9487, 8000}, + {1001, 1002, 1003, 8709, 100, 1, 1000, 999}, + 4, + 6, + IMM_UWORD_RANGES_LEAST_MASKED_NEGATIVE, + 0}, + {{12, 21, 0, 45, 88, 10001, 10002, 65535}, + {22, 13, 3, 54, 888, 10003, 10000, 65530}, + 13, + 13, + IMM_UWORD_EACH_MOST, + 1}, +}; + +#define TEST_MM_CMPESTRA_SWORD_DATA_LEN 3 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestra_sword_data[TEST_MM_CMPESTRA_SWORD_DATA_LEN] = { + {{-100, -80, -5, -1, 10, 1000}, + {-100, -99, -80, -2, 11, 789, 889, 999}, + 6, + 12, + IMM_SWORD_RANGES_LEAST_NEGATIVE, + 1}, + {{-30000, -90, -32766, 1200, 5}, + {-30001, 21, 10000, 1201, 888}, + 5, + 5, + IMM_SWORD_EACH_MOST, + 0}, + {{2001, -1928}, + {2000, 1928, 3000, 2289, 4000, 111, 2002, -1928}, + 2, + 9, + IMM_SWORD_ANY_LEAST_MASKED_NEGATIVE, + 0}, +}; + + +#define MM_CMPESTRA_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ORDERED_MOST, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_ANY_LEAST_MASKED_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRA_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_MOST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) + +#define MM_CMPESTRA_UWORD_TEST_CASES(_, ...) \ + _(UWORD_ORDERED_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UWORD_EACH_MOST, __VA_ARGS__) + +#define MM_CMPESTRA_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST_NEGATIVE, __VA_ARGS__) \ + _(SWORD_EACH_MOST, __VA_ARGS__) \ + _(SWORD_ANY_LEAST_MASKED_NEGATIVE, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRA_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestra, CMPESTRA, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestra, CMPESTRA, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestra, CMPESTRA, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestra, CMPESTRA, \ + IS_CMPESTRI) + +result_t test_mm_cmpestra(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRA_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPESTRC_UBYTE_DATA_LEN 4 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestrc_ubyte_data[TEST_MM_CMPESTRC_UBYTE_DATA_LEN] = { + {{66, 3, 3, 65}, + {66, 3, 3, 65, 67, 2, 2, 67, 56, 11, 1, 23, 66, 3, 3, 65}, + 4, + 16, + IMM_UBYTE_ORDERED_MOST_MASKED_NEGATIVE, + 1}, + {{1, 11, 2, 22, 3, 33, 4, 44, 5, 55, 6, 66, 7, 77, 8, 88}, + {2, 22, 3, 23, 5, 66, 255, 43, 6, 66, 7, 77, 9, 99, 10, 100}, + 16, + 16, + IMM_UBYTE_EACH_MOST, + 0}, + {{36, 72, 108}, {12, 24, 48, 96, 77, 84}, 3, 6, IMM_UBYTE_ANY_LEAST, 0}, + {{12, 24, 36, 48}, + {11, 49, 50, 56, 77, 15, 10}, + 4, + 7, + IMM_UBYTE_RANGES_LEAST_NEGATIVE, + 1}, +}; + +#define TEST_MM_CMPESTRC_SBYTE_DATA_LEN 4 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestrc_sbyte_data[TEST_MM_CMPESTRC_SBYTE_DATA_LEN] = { + {{-22, -30, 40, 45}, + {-31, -32, 46, 77}, + 4, + 4, + IMM_SBYTE_RANGES_MOST, + 0}, + {{-12, -7, 33, 100, 12}, + {-12, -7, 33, 100, 11, -11, -7, 33, 100, 12}, + 5, + 10, + IMM_SBYTE_ORDERED_MOST_MASKED_NEGATIVE, + 1}, + {{1, 2, 3, 4, 5, -1, -2, -3, -4, -5}, + {1, 2, 3, 4, 5, -1, -2, -3, -5}, + 10, + 9, + IMM_SBYTE_ANY_MOST_MASKED_NEGATIVE, + 0}, + {{101, -128, -88, -76, 89, 109, 44, -12, -45, -100, 22, 1, 91}, + {102, -120, 88, -76, 98, 107, 33, 12, 45, -100, 22, 10, 19}, + 13, + 13, + IMM_SBYTE_EACH_MOST, + 1}, +}; + +#define TEST_MM_CMPESTRC_UWORD_DATA_LEN 4 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestrc_uword_data[TEST_MM_CMPESTRC_UWORD_DATA_LEN] = { + {{1000, 2000, 4000, 8000, 16000}, + {40001, 1000, 2000, 40000, 8000, 16000}, + 5, + 6, + IMM_UWORD_ORDERED_LEAST_NEGATIVE, + 1}, + {{1111, 1212}, + {1110, 1213, 1110, 1214, 1100, 1220, 1000, 1233}, + 2, + 8, + IMM_UWORD_RANGES_MOST, + 0}, + {{10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000}, + {9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000}, + 13, + 13, + IMM_UWORD_EACH_LEAST_MASKED_NEGATIVE, + 1}, + {{12}, {11, 13, 14, 15, 10}, 1, 5, IMM_UWORD_ANY_MOST, 0}, +}; + +#define TEST_MM_CMPESTRC_SWORD_DATA_LEN 4 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestrc_sword_data[TEST_MM_CMPESTRC_SWORD_DATA_LEN] = { + {{-100, -90, -80, -66, 1}, + {-101, -102, -1000, 2, 67, 10000}, + 5, + 6, + IMM_SWORD_RANGES_LEAST, + 0}, + {{12, 13, -700, 888, 44, -987, 19}, + {12, 13, -700, 888, 44, -987, 19}, + 7, + 7, + IMM_SWORD_EACH_MOST_NEGATIVE, + 0}, + {{2001, -1992, 1995, 10007, 2000}, + {2000, 1928, 3000, 9822, 5000, 1111, 2002, -1928}, + 5, + 9, + IMM_SWORD_ANY_LEAST_NEGATIVE, + 1}, + {{13, -26, 39}, + {12, -25, 33, 13, -26, 39}, + 3, + 6, + IMM_SWORD_ORDERED_MOST, + 1}, +}; + + +#define MM_CMPESTRC_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ORDERED_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_EACH_MOST, __VA_ARGS__) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRC_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_RANGES_MOST, __VA_ARGS__) \ + _(SBYTE_ORDERED_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ANY_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_EACH_MOST, __VA_ARGS__) + +#define MM_CMPESTRC_UWORD_TEST_CASES(_, ...) \ + _(UWORD_ORDERED_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UWORD_RANGES_MOST, __VA_ARGS__) \ + _(UWORD_EACH_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UWORD_ANY_MOST, __VA_ARGS__) + +#define MM_CMPESTRC_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_MOST_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ANY_LEAST_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ORDERED_MOST, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRC_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestrc, CMPESTRC, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestrc, CMPESTRC, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestrc, CMPESTRC, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestrc, CMPESTRC, \ + IS_CMPESTRI) + +result_t test_mm_cmpestrc(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRC_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPESTRI_UBYTE_DATA_LEN 4 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestri_ubyte_data[TEST_MM_CMPESTRI_UBYTE_DATA_LEN] = { + {{23, 89, 255, 0, 90, 45, 67, 12, 1, 56, 200, 141, 3, 4, 2, 76}, + {32, 89, 255, 128, 9, 54, 78, 12, 1, 56, 100, 41, 42, 68, 32, 5}, + 16, + 16, + IMM_UBYTE_ANY_LEAST_NEGATIVE, + 0}, + {{0, 83, 112, 12, 221, 54, 76, 83, 112, 10}, + {0, 83, 112, 83, 122, 45, 67, 83, 112, 9}, + 10, + 10, + IMM_UBYTE_EACH_LEAST, + 0}, + {{34, 78, 12}, + {56, 100, 11, 67, 35, 79, 67, 255, 0, 43, 121, 234, 225, 91, 31, 23}, + 3, + 16, + IMM_UBYTE_RANGES_LEAST, + 0}, + {{13, 10, 9, 32, 105, 103, 110, 111, 114, 101, 32, 116, 104, 105, 115, + 32}, + {83, 112, 108, 105, 116, 32, 13, 10, 9, 32, 108, 105, 110, 101, 32, + 32}, + 3, + 15, + IMM_UBYTE_ORDERED_LEAST, + 6}, +}; + +#define TEST_MM_CMPESTRI_SBYTE_DATA_LEN 4 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestri_sbyte_data[TEST_MM_CMPESTRI_SBYTE_DATA_LEN] = { + {{-12, -1, 90, -128, 43, 6, 87, 127}, + {-1, -1, 9, -127, 126, 6, 78, 23}, + 8, + 8, + IMM_SBYTE_EACH_LEAST, + 1}, + {{34, 67, -90, 33, 123, -100, 43, 56}, + {43, 76, -90, 44, 20, -100, 54, 56}, + 8, + 8, + IMM_SBYTE_ANY_LEAST, + 0}, + {{-43, 67, 89}, + {-44, -54, -30, -128, 127, 34, 10, -62}, + 3, + 7, + IMM_SBYTE_RANGES_LEAST, + 2}, + {{90, 34, -32, 0, 5}, + {19, 34, -32, 90, 34, -32, 45, 0, 5, 90, 34, -32, 0, 5, 19, 87}, + 3, + 16, + IMM_SBYTE_ORDERED_LEAST, + 3}, +}; + +#define TEST_MM_CMPESTRI_UWORD_DATA_LEN 4 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestri_uword_data[TEST_MM_CMPESTRI_UWORD_DATA_LEN] = { + {{45, 65535, 0, 87, 1000, 10, 45, 26}, + {65534, 0, 0, 78, 1000, 10, 32, 26}, + 8, + 8, + IMM_UWORD_EACH_LEAST, + 2}, + {{45, 23, 10, 54, 88, 10000, 20000, 100}, + {544, 10000, 20000, 1, 0, 2897, 2330, 2892}, + 8, + 8, + IMM_UWORD_ANY_LEAST, + 1}, + {{10000, 15000}, + {12, 45, 67, 899, 10001, 32, 15001, 15000}, + 2, + 8, + IMM_UWORD_RANGES_LEAST, + 4}, + {{0, 1, 54, 89, 100}, + {101, 102, 65535, 0, 1, 54, 89, 100}, + 5, + 8, + IMM_UWORD_ORDERED_LEAST, + 3}, +}; + +#define TEST_MM_CMPESTRI_SWORD_DATA_LEN 4 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestri_sword_data[TEST_MM_CMPESTRI_SWORD_DATA_LEN] = { + {{13, 6, 5, 4, 3, 2, 1, 3}, + {-7, 16, 5, 4, -1, 6, 1, 3}, + 10, + 10, + IMM_SWORD_RANGES_MOST, + 7}, + {{13, 6, 5, 4, 3, 2, 1, 3}, + {-7, 16, 5, 4, -1, 6, 1, 3}, + 8, + 8, + IMM_SWORD_EACH_LEAST, + 2}, + {{-32768, 90, 455, 67, -1000, -10000, 21, 12}, + {-7, 61, 455, 67, -32768, 32767, 11, 888}, + 8, + 8, + IMM_SWORD_ANY_LEAST, + 2}, + {{-12, -56}, + {-7, 16, 555, 554, -12, 61, -16, 3}, + 2, + 8, + IMM_SWORD_ORDERED_LEAST, + 8}, +}; + +#define MM_CMPESTRI_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPESTRI_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPESTRI_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPESTRI_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_MOST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_LEAST, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRI_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestri, CMPESTRI, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestri, CMPESTRI, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestri, CMPESTRI, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestri, CMPESTRI, \ + IS_CMPESTRI) + +result_t test_mm_cmpestri(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRI_TEST_CASES + return TEST_SUCCESS; +} + +#define IS_CMPESTRM 0 + +typedef struct { + uint8_t a[16], b[16]; + int la, lb; + const int imm8; + uint8_t expect[16]; +} test_mm_cmpestrm_ubyte_data_t; +typedef struct { + int8_t a[16], b[16]; + int la, lb; + const int imm8; + int8_t expect[16]; +} test_mm_cmpestrm_sbyte_data_t; +typedef struct { + uint16_t a[8], b[8]; + int la, lb; + const int imm8; + uint16_t expect[8]; +} test_mm_cmpestrm_uword_data_t; +typedef struct { + int16_t a[8], b[8]; + int la, lb; + const int imm8; + int16_t expect[8]; +} test_mm_cmpestrm_sword_data_t; + +#define IMM_UBYTE_EACH_UNIT \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_UNIT_MASK) +#define IMM_UBYTE_EACH_UNIT_NEGATIVE \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_UNIT_MASK | \ + _SIDD_NEGATIVE_POLARITY) +#define IMM_UBYTE_ANY_UNIT \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_UNIT_MASK) +#define IMM_UBYTE_ANY_BIT \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK) +#define IMM_UBYTE_RANGES_UNIT \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK) +#define IMM_UBYTE_ORDERED_UNIT \ + (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_UNIT_MASK) + +#define IMM_SBYTE_EACH_UNIT \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_UNIT_MASK) +#define IMM_SBYTE_EACH_BIT_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_BIT_MASK | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_ANY_UNIT \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_UNIT_MASK) +#define IMM_SBYTE_ANY_UNIT_MASKED_NEGATIVE \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_UNIT_MASK | \ + _SIDD_MASKED_NEGATIVE_POLARITY) +#define IMM_SBYTE_RANGES_UNIT \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK) +#define IMM_SBYTE_ORDERED_UNIT \ + (_SIDD_SBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_UNIT_MASK) + +#define IMM_UWORD_RANGES_UNIT \ + (_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK) +#define IMM_UWORD_EACH_UNIT \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_UNIT_MASK) +#define IMM_UWORD_ANY_UNIT \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_UNIT_MASK) +#define IMM_UWORD_ANY_BIT \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_BIT_MASK) +#define IMM_UWORD_ORDERED_UNIT \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_UNIT_MASK) +#define IMM_UWORD_ORDERED_UNIT_NEGATIVE \ + (_SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_UNIT_MASK | \ + _SIDD_NEGATIVE_POLARITY) + +#define IMM_SWORD_RANGES_UNIT \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK) +#define IMM_SWORD_RANGES_BIT \ + (_SIDD_SWORD_OPS | _SIDD_CMP_RANGES | _SIDD_BIT_MASK) +#define IMM_SWORD_EACH_UNIT \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_UNIT_MASK) +#define IMM_SWORD_ANY_UNIT \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ANY | _SIDD_UNIT_MASK) +#define IMM_SWORD_ORDERED_UNIT \ + (_SIDD_SWORD_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_UNIT_MASK) + +#define TEST_MM_CMPESTRM_UBYTE_DATA_LEN 4 +static test_mm_cmpestrm_ubyte_data_t + test_mm_cmpestrm_ubyte_data[TEST_MM_CMPESTRM_UBYTE_DATA_LEN] = { + {{85, 115, 101, 70, 108, 97, 116, 65, 115, 115, 101, 109, 98, 108, 101, + 114}, + {85, 115, 105, 110, 103, 65, 110, 65, 115, 115, 101, 109, 98, 108, 101, + 114}, + 16, + 16, + IMM_UBYTE_EACH_UNIT_NEGATIVE, + {0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{97, 101, 105, 111, 117, 121}, + {89, 111, 117, 32, 68, 114, 105, 118, 101, 32, 77, 101, 32, 77, 97, + 100}, + 6, + 16, + IMM_UBYTE_ANY_UNIT, + {0, 255, 255, 0, 0, 0, 255, 0, 255, 0, 0, 255, 0, 0, 255, 0}}, + {{97, 122, 65, 90}, + {73, 39, 109, 32, 104, 101, 114, 101, 32, 98, 101, 99, 97, 117, 115, + 101}, + 4, + 16, + IMM_UBYTE_RANGES_UNIT, + {255, 0, 255, 0, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, + 255}}, + {{87, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {87, 104, 101, 110, 87, 101, 87, 105, 108, 108, 66, 101, 87, 101, 100, + 33}, + 2, + 16, + IMM_UBYTE_ORDERED_UNIT, + {0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0}}, +}; + +#define TEST_MM_CMPESTRM_SBYTE_DATA_LEN 4 +static test_mm_cmpestrm_sbyte_data_t + test_mm_cmpestrm_sbyte_data[TEST_MM_CMPESTRM_SBYTE_DATA_LEN] = { + {{-127, -127, 34, 88, 0, 1, -1, 78, 90, 9, 23, 34, 3, -128, 127, 0}, + {0, -127, 34, 88, 12, 43, -128, 78, 8, 9, 43, 32, 7, 126, 115, 0}, + 16, + 16, + IMM_SBYTE_EACH_UNIT, + {0, -1, -1, -1, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, -1}}, + {{0, 32, 7, 115, -128, 44, 33}, + {0, -127, 34, 88, 12, 43, -128, 78, 8, 9, 43, 32, 7, 126, 115, 0}, + 7, + 10, + IMM_SBYTE_ANY_UNIT_MASKED_NEGATIVE, + {0, -1, -1, -1, -1, -1, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0}}, + {{-128, -80, -90, 10, 33}, + {-126, -93, -80, -77, -56, -23, -10, -1, 0, 3, 10, 12, 13, 33, 34, 56}, + 5, + 16, + IMM_SBYTE_RANGES_UNIT, + {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0}}, + {{104, 9, -12}, + {0, 0, 87, 104, 9, -12, 89, -117, 9, 10, -11, 87, -114, 104, 9, -61}, + 3, + 16, + IMM_SBYTE_ORDERED_UNIT, + {0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, +}; + +#define TEST_MM_CMPESTRM_UWORD_DATA_LEN 4 +static test_mm_cmpestrm_uword_data_t + test_mm_cmpestrm_uword_data[TEST_MM_CMPESTRM_UWORD_DATA_LEN] = { + {{1, 5, 13, 19, 22}, + {12, 60000, 5, 1, 100, 1000, 34, 20}, + 5, + 8, + IMM_UWORD_RANGES_UNIT, + {0, 0, 65535, 65535, 0, 0, 0, 0}}, + {{65535, 12, 7, 9876, 3456, 12345, 10, 98}, + {65535, 0, 10, 9876, 3456, 0, 13, 32}, + 8, + 8, + IMM_UWORD_EACH_UNIT, + {65535, 0, 0, 65535, 65535, 0, 0, 0}}, + {{100, 0}, + {12345, 6766, 234, 0, 1, 34, 89, 100}, + 2, + 8, + IMM_UWORD_ANY_BIT, + {136, 0, 0, 0, 0, 0, 0, 0}}, + {{123, 67, 890}, + {123, 67, 890, 8900, 4, 0, 123, 67}, + 3, + 8, + IMM_UWORD_ORDERED_UNIT, + {65535, 0, 0, 0, 0, 0, 65535, 0}}, +}; + +#define TEST_MM_CMPESTRM_SWORD_DATA_LEN 4 +static test_mm_cmpestrm_sword_data_t + test_mm_cmpestrm_sword_data[TEST_MM_CMPESTRM_SWORD_DATA_LEN] = { + {{13, 6, 5, 4, 3, 2, 1, 3}, + {-7, 16, 5, 4, -1, 6, 1, 3}, + 10, + 10, + IMM_SWORD_RANGES_UNIT, + {0, 0, 0, 0, 0, 0, -1, -1}}, + {{85, 115, 101, 70, 108, 97, 116, 65}, + {85, 115, 105, 110, 103, 65, 110, 65}, + 8, + 8, + IMM_SWORD_EACH_UNIT, + {-1, -1, 0, 0, 0, 0, 0, -1}}, + {{-32768, 10000, 10, -13}, + {-32767, 32767, -32768, 90, 0, -13, 23, 45}, + 4, + 8, + IMM_SWORD_ANY_UNIT, + {0, 0, -1, 0, 0, -1, 0, 0}}, + {{10, 20, -10, 60}, + {0, 0, 0, 10, 20, -10, 60, 10}, + 4, + 8, + IMM_SWORD_ORDERED_UNIT, + {0, 0, 0, -1, 0, 0, 0, -1}}, +}; + +#define MM_CMPESTRM_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_EACH_UNIT_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_ANY_UNIT, __VA_ARGS__) \ + _(UBYTE_RANGES_UNIT, __VA_ARGS__) \ + _(UBYTE_ORDERED_UNIT, __VA_ARGS__) + +#define MM_CMPESTRM_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_UNIT, __VA_ARGS__) \ + _(SBYTE_ANY_UNIT_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_RANGES_UNIT, __VA_ARGS__) \ + _(SBYTE_ORDERED_UNIT, __VA_ARGS__) + +#define MM_CMPESTRM_UWORD_TEST_CASES(_, ...) \ + _(UWORD_RANGES_UNIT, __VA_ARGS__) \ + _(UWORD_EACH_UNIT, __VA_ARGS__) \ + _(UWORD_ANY_BIT, __VA_ARGS__) \ + _(UWORD_ORDERED_UNIT, __VA_ARGS__) + +#define MM_CMPESTRM_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_UNIT, __VA_ARGS__) \ + _(SWORD_EACH_UNIT, __VA_ARGS__) \ + _(SWORD_ANY_UNIT, __VA_ARGS__) \ + _(SWORD_ORDERED_UNIT, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRM_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestrm, CMPESTRM, \ + IS_CMPESTRM) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestrm, CMPESTRM, \ + IS_CMPESTRM) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestrm, CMPESTRM, \ + IS_CMPESTRM) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestrm, CMPESTRM, \ + IS_CMPESTRM) + +result_t test_mm_cmpestrm(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRM_TEST_CASES + return TEST_SUCCESS; +} + +#undef IS_CMPESTRM + +#define TEST_MM_CMPESTRO_UBYTE_DATA_LEN 4 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestro_ubyte_data[TEST_MM_CMPESTRO_UBYTE_DATA_LEN] = { + {{56, 78, 255, 1, 9}, + {56, 78, 43, 255, 1, 6, 9}, + 5, + 7, + IMM_UBYTE_ANY_MOST_NEGATIVE, + 0}, + {{33, 44, 100, 24, 3, 89, 127, 254, 33, 45, 250}, + {33, 44, 100, 22, 3, 98, 125, 254, 33, 4, 243}, + 11, + 11, + IMM_UBYTE_EACH_LEAST_MASKED_NEGATIVE, + 0}, + {{34, 27, 18, 9}, {}, 4, 16, IMM_UBYTE_RANGES_LEAST_MASKED_NEGATIVE, 1}, + {{3, 18, 216}, + {3, 18, 222, 3, 17, 216, 3, 18, 216}, + 3, + 9, + IMM_UBYTE_ORDERED_LEAST_NEGATIVE, + 1}, +}; + +#define TEST_MM_CMPESTRO_SBYTE_DATA_LEN 4 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestro_sbyte_data[TEST_MM_CMPESTRO_SBYTE_DATA_LEN] = { + {{23, -23, 24, -24, 25, -25, 26, -26, 27, -27, 28, -28, -29, 29, 30, + 31}, + {24, -23, 25, -24, 25, -25, 26, -26, 27, -27, 28, -28, -29, 29, 30, + 31}, + 16, + 16, + IMM_SBYTE_EACH_MOST_NEGATIVE, + 1}, + {{34, 33, 67, 72, -90, 127, 33, -128, 123, -90, -100, 34, 43, 15, 56, + 3}, + {3, 14, 15, 65, 90, -127, 100, 100}, + 16, + 8, + IMM_SBYTE_ANY_MOST, + 1}, + {{-13, 0, 34}, + {-12, -11, 1, 12, 56, 57, 3, 2, -17}, + 6, + 9, + IMM_SBYTE_RANGES_MOST_MASKED_NEGATIVE, + 0}, + {{1, 2, 3, 4, 5, 6, 7, 8}, + {-1, -2, -3, -4, -5, -6, -7, -8, 1, 2, 3, 4, 5, 6, 7, 8}, + 8, + 16, + IMM_SBYTE_ORDERED_MOST, + 0}, +}; + +#define TEST_MM_CMPESTRO_UWORD_DATA_LEN 4 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestro_uword_data[TEST_MM_CMPESTRO_UWORD_DATA_LEN] = { + {{0, 0, 0, 4, 4, 4, 8, 8}, + {0, 0, 0, 3, 3, 16653, 3333, 222}, + 8, + 8, + IMM_UWORD_EACH_MOST_MASKED_NEGATIVE, + 0}, + {{12, 666, 9456, 10000, 32, 444, 57, 0}, + {11, 777, 9999, 32767, 23}, + 8, + 5, + IMM_UWORD_ANY_LEAST_MASKED_NEGATIVE, + 1}, + {{23, 32, 45, 67}, + {10022, 23, 32, 44, 66, 67, 12, 22}, + 4, + 8, + IMM_UWORD_RANGES_LEAST_NEGATIVE, + 1}, + {{222, 45, 8989}, + {221, 222, 45, 8989, 222, 45, 8989}, + 3, + 7, + IMM_UWORD_ORDERED_MOST, + 0}, +}; + +#define TEST_MM_CMPESTRO_SWORD_DATA_LEN 4 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestro_sword_data[TEST_MM_CMPESTRO_SWORD_DATA_LEN] = { + {{-9999, -9487, -5000, -4433, -3000, -2999, -2000, -1087}, + {-32767, -30000, -4998}, + 100, + 3, + IMM_SWORD_RANGES_MOST_MASKED_NEGATIVE, + 1}, + {{-30, 89, 7777}, + {-30, 89, 7777}, + 3, + 3, + IMM_SWORD_EACH_MOST_MASKED_NEGATIVE, + 0}, + {{8, 9, -100, 1000, -5000, -32000, 32000, 7}, + {29999, 32001, 5, 555}, + 8, + 4, + IMM_SWORD_ANY_MOST_MASKED_NEGATIVE, + 1}, + {{-1, 56, -888, 9000, -23, 12, -1, -1}, + {-1, 56, -888, 9000, -23, 12, -1, -1}, + 8, + 8, + IMM_SWORD_ORDERED_MOST_MASKED_NEGATIVE, + 0}, +}; + +#define MM_CMPESTRO_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_MOST_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRO_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_MOST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ANY_MOST, __VA_ARGS__) \ + _(SBYTE_RANGES_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ORDERED_MOST, __VA_ARGS__) + +#define MM_CMPESTRO_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UWORD_ANY_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UWORD_ORDERED_MOST, __VA_ARGS__) + +#define MM_CMPESTRO_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_EACH_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ANY_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ORDERED_MOST_MASKED_NEGATIVE, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRO_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestro, CMPESTRO, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestro, CMPESTRO, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestro, CMPESTRO, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestro, CMPESTRO, \ + IS_CMPESTRI) + +result_t test_mm_cmpestro(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRO_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPESTRS_UBYTE_DATA_LEN 2 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestrs_ubyte_data[TEST_MM_CMPESTRS_UBYTE_DATA_LEN] = { + {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + {0}, + 16, + 0, + IMM_UBYTE_ANY_MOST, + 0}, + {{1, 2, 3}, {1, 2, 3}, 3, 8, IMM_UBYTE_RANGES_MOST, 1}, +}; + +#define TEST_MM_CMPESTRS_SBYTE_DATA_LEN 2 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestrs_sbyte_data[TEST_MM_CMPESTRS_SBYTE_DATA_LEN] = { + {{-1, -2, -3, -4, -100, 100, 1, 2, 3, 4}, + {-90, -80, 111, 67, 88}, + 10, + 5, + IMM_SBYTE_EACH_LEAST_MASKED_NEGATIVE, + 1}, + {{99, 100, 101, -99, -100, -101, 56, 7}, + {-128, -126, 100, 127}, + 23, + 4, + IMM_SBYTE_ORDERED_LEAST_MASKED_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPESTRS_UWORD_DATA_LEN 2 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestrs_uword_data[TEST_MM_CMPESTRS_UWORD_DATA_LEN] = { + {{1}, + {90, 65535, 63355, 12, 8, 5, 34, 10000}, + 100, + 7, + IMM_UWORD_ANY_MOST_NEGATIVE, + 0}, + {{}, {0}, 0, 28, IMM_UWORD_RANGES_MOST_MASKED_NEGATIVE, 1}, +}; + +#define TEST_MM_CMPESTRS_SWORD_DATA_LEN 2 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestrs_sword_data[TEST_MM_CMPESTRS_SWORD_DATA_LEN] = { + {{-30000, 2897, 1111, -4455}, + {30, 40, 500, 6000, 20, -10, -789, -29999}, + 4, + 8, + IMM_SWORD_ORDERED_LEAST_MASKED_NEGATIVE, + 1}, + {{34, 56, 789, 1024, 2048, 4096, 8192, -16384}, + {3, 9, -27, 81, -216, 1011}, + 9, + 6, + IMM_SWORD_EACH_LEAST_NEGATIVE, + 0}, +}; + +#define MM_CMPESTRS_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_MOST, __VA_ARGS__) \ + _(UBYTE_RANGES_MOST, __VA_ARGS__) + +#define MM_CMPESTRS_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST_MASKED_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRS_UWORD_TEST_CASES(_, ...) \ + _(UWORD_ANY_MOST_NEGATIVE, __VA_ARGS__) \ + _(UWORD_RANGES_MOST_MASKED_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRS_SWORD_TEST_CASES(_, ...) \ + _(SWORD_ANY_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_EACH_LEAST_NEGATIVE, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRS_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestrs, CMPESTRS, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestrs, CMPESTRS, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestrs, CMPESTRS, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestrs, CMPESTRS, \ + IS_CMPESTRI) + +result_t test_mm_cmpestrs(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRS_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPESTRZ_UBYTE_DATA_LEN 2 +static test_mm_cmpestri_ubyte_data_t + test_mm_cmpestrz_ubyte_data[TEST_MM_CMPESTRZ_UBYTE_DATA_LEN] = { + {{0, 1, 2, 3, 4, 5, 6, 7}, + {12, 67, 0, 3}, + 8, + 4, + IMM_UBYTE_ANY_MOST_MASKED_NEGATIVE, + 1}, + {{255, 0, 127, 88}, + {1, 2, 4, 8, 16, 32, 64, 128, 254, 233, 209, 41, 66, 77, 90, 100}, + 4, + 16, + IMM_UBYTE_RANGES_MOST_MASKED_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPESTRZ_SBYTE_DATA_LEN 2 +static test_mm_cmpestri_sbyte_data_t + test_mm_cmpestrz_sbyte_data[TEST_MM_CMPESTRZ_SBYTE_DATA_LEN] = { + {{}, {-90, -80, 111, 67, 88}, 0, 18, IMM_SBYTE_EACH_LEAST_NEGATIVE, 0}, + {{9, 10, 10, -99, -100, -101, 56, 76}, + {-127, 127, -100, -120, 13, 108, 1, -66, -34, 89, -89, 123, 22, -19, + -8}, + 7, + 15, + IMM_SBYTE_ORDERED_LEAST_NEGATIVE, + 1}, +}; + +#define TEST_MM_CMPESTRZ_UWORD_DATA_LEN 2 +static test_mm_cmpestri_uword_data_t + test_mm_cmpestrz_uword_data[TEST_MM_CMPESTRZ_UWORD_DATA_LEN] = { + {{1}, + {9000, 33333, 63333, 120, 8, 55, 34, 100}, + 100, + 7, + IMM_UWORD_ANY_LEAST_NEGATIVE, + 1}, + {{1, 2, 3}, + {1, 10000, 65535, 8964, 9487, 32, 451, 666}, + 3, + 8, + IMM_UWORD_RANGES_MOST_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPESTRZ_SWORD_DATA_LEN 2 +static test_mm_cmpestri_sword_data_t + test_mm_cmpestrz_sword_data[TEST_MM_CMPESTRZ_SWORD_DATA_LEN] = { + {{30000, 28997, 11111, 4455}, + {30, 40, 500, 6000, 20, -10, -789, -29999}, + 4, + 8, + IMM_SWORD_ORDERED_LEAST_MASKED_NEGATIVE, + 0}, + {{789, 1024, 2048, 4096, 8192}, + {-3, 9, -27, 18, -217, 10111, 22222}, + 5, + 7, + IMM_SWORD_EACH_LEAST_MASKED_NEGATIVE, + 1}, +}; + +#define MM_CMPESTRZ_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_MOST, __VA_ARGS__) \ + _(UBYTE_RANGES_MOST, __VA_ARGS__) + +#define MM_CMPESTRZ_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRZ_UWORD_TEST_CASES(_, ...) \ + _(UWORD_ANY_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UWORD_RANGES_MOST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPESTRZ_SWORD_TEST_CASES(_, ...) \ + _(SWORD_ANY_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_EACH_LEAST_MASKED_NEGATIVE, __VA_ARGS__) + +#define GENERATE_MM_CMPESTRZ_TEST_CASES \ + ENUM_MM_CMPESTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpestrz, CMPESTRZ, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpestrz, CMPESTRZ, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(UWORD, uword, uint16_t, cmpestrz, CMPESTRZ, \ + IS_CMPESTRI) \ + ENUM_MM_CMPESTRX_TEST_CASES(SWORD, sword, int16_t, cmpestrz, CMPESTRZ, \ + IS_CMPESTRI) + +result_t test_mm_cmpestrz(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPESTRZ_TEST_CASES + return TEST_SUCCESS; +} + +#undef IS_CMPESTRI + +result_t test_mm_cmpgt_epi64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int64_t *_a = (const int64_t *) impl.mTestIntPointer1; + const int64_t *_b = (const int64_t *) impl.mTestIntPointer2; + + int64_t result[2]; + result[0] = _a[0] > _b[0] ? -1 : 0; + result[1] = _a[1] > _b[1] ? -1 : 0; + + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + __m128i iret = _mm_cmpgt_epi64(a, b); + + return validateInt64(iret, result[0], result[1]); +} + +#define IS_CMPISTRI 1 + +#define DEF_ENUM_MM_CMPISTRX_VARIANT(c, ...) c, + +#define EVAL_MM_CMPISTRX_TEST_CASE(c, type, data_type, im, IM) \ + do { \ + data_type *a = test_mm_##im##_##type##_data[c].a, \ + *b = test_mm_##im##_##type##_data[c].b; \ + const int imm8 = IMM_##c; \ + IIF(IM) \ + (int expect = test_mm_##im##_##type##_data[c].expect, \ + data_type *expect = test_mm_##im##_##type##_data[c].expect); \ + __m128i ma, mb; \ + memcpy(&ma, a, sizeof(ma)); \ + memcpy(&mb, b, sizeof(mb)); \ + IIF(IM) \ + (int res = _mm_##im(ma, mb, imm8), \ + __m128i res = _mm_##im(ma, mb, imm8)); \ + if (IIF(IM)(res != expect, memcmp(expect, &res, sizeof(__m128i)))) \ + return TEST_FAIL; \ + } while (0); + +#define ENUM_MM_CMPISTRX_TEST_CASES(type, type_lower, data_type, func, FUNC, \ + IM) \ + enum { MM_##FUNC##_##type##_TEST_CASES(DEF_ENUM_MM_CMPISTRX_VARIANT) }; \ + MM_##FUNC##_##type##_TEST_CASES(EVAL_MM_CMPISTRX_TEST_CASE, type_lower, \ + data_type, func, IM) + +typedef struct { + uint8_t a[16], b[16]; + const int imm8; + int expect; +} test_mm_cmpistri_ubyte_data_t; +typedef struct { + int8_t a[16], b[16]; + const int imm8; + int expect; +} test_mm_cmpistri_sbyte_data_t; +typedef struct { + uint16_t a[8], b[8]; + const int imm8; + int expect; +} test_mm_cmpistri_uword_data_t; +typedef struct { + int16_t a[8], b[8]; + const int imm8; + int expect; +} test_mm_cmpistri_sword_data_t; + +#define TEST_MM_CMPISTRA_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistra_ubyte_data[TEST_MM_CMPISTRA_UBYTE_DATA_LEN] = { + {{10, 11, 12, 13, 14, 15, 16, 17, 18, 9, 20, 98, 97, 96, 95, 127}, + {1, 2, 3, 4, 5, 6, 7, 8, 99, 100, 101, 102, 103, 104, 105, 106}, + IMM_UBYTE_ANY_LEAST, + 1}, + {{1, 22, 33, 44, 5, 66, 7, 88, 9, 10, 111, 0}, + {2, 23, 34, 21, 6, 65, 8, 84, 99, 100, 11, 112, 123, 14, 15, 6}, + IMM_UBYTE_EACH_LEAST, + 1}, + {{5, 15, 25, 35, 45, 55, 65, 75, 0}, + {4, 6, 14, 16, 24, 26, 34, 36, 44, 46, 54, 56, 74, 76}, + IMM_UBYTE_RANGES_LEAST, + 0}, + {{4, 14, 64, 84, 0}, + {4, 14, 64, 84, 0, 4, 14, 65, 84, 0, 4, 14, 64, 84, 0, 1}, + IMM_UBYTE_ORDERED_MOST_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPISTRA_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistra_sbyte_data[TEST_MM_CMPISTRA_SBYTE_DATA_LEN] = { + {{-11, -13, -43, -50, 66, 77, 87, 98, -128, 127, 126, 99, 1, 2, 3, -5}, + {-12, -13, -43, -56, 66, 78, 88, 98, -125, 127, 120, 9, 100, 22, 54, + -10}, + IMM_SBYTE_EACH_LEAST, + 0}, + {{10, 11, 100, -90, 0}, + {8, 9, 10, 11, 0, 8, 9, 10, -90, 0}, + IMM_SBYTE_ANY_LEAST_NEGATIVE, + 0}, + {{-90, -60, -34, -25, 34, 56, 70, 79, 0}, + {-100, -59, -35, -24, -101, 33, 57, 69, 80, 81, -128, 100, 101, 102, + -101, -102}, + IMM_SBYTE_RANGES_LEAST, + 1}, + {{1, 1, 1, 1, -1, -1, -1, -1, -10, 10, -10, 10, 44, -44, 44, -44}, + {1, 1, -1, 1, -1, -1, -1, -1, -10, 10, -10, 10, 44, -44, 44, -44}, + IMM_SBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRA_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistra_uword_data[TEST_MM_CMPISTRA_UWORD_DATA_LEN] = { + {{88, 888, 8888, 31888, 10888, 18088, 10880, 28888}, + {888, 88, 8888, 32000, 10888, 18000, 10888, 28888}, + IMM_UWORD_EACH_LEAST_NEGATIVE, + 0}, + {{3, 4, 555, 6666, 7777, 888, 9, 100}, + {1, 2, 333, 4444, 5555, 666, 7, 8}, + IMM_UWORD_ANY_LEAST, + 1}, + {{1000, 2000, 2002, 3000, 3002, 4000, 5000, 5999}, + {999, 2001, 3001, 4001, 4002, 4999, 6000, 6001}, + IMM_UWORD_RANGES_LEAST, + 1}, + {{55, 66, 77, 888, 0}, + {55, 66, 77, 888, 0, 33, 2, 10000}, + IMM_UWORD_ORDERED_LEAST, + 0}, +}; + +#define TEST_MM_CMPISTRA_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistra_sword_data[TEST_MM_CMPISTRA_SWORD_DATA_LEN] = { + {{-32000, -28000, 0}, + {-32001, -29999, -28001, -28000, -27999, -26000, -32768}, + IMM_SWORD_RANGES_LEAST_MASKED_NEGATIVE, + 0}, + {{-12, -11, -10, -9, -8, -7, 90, 1000}, + {-13, -10, 9, -8, -7, 1000, 1000, 90}, + IMM_SWORD_EACH_LEAST, + 1}, + {{33, 44, 787, 23, 0}, + {32, 43, 788, 0, 32, 0, 43, 0}, + IMM_SWORD_ANY_LEAST, + 0}, + {{18, 78, 999, -56, 0}, + {18, 78, 999, 56, 18, 78, 999, 4}, + IMM_SWORD_ORDERED_LEAST, + 1}, +}; + +#define MM_CMPISTRA_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_MOST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPISTRA_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRA_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST_NEGATIVE, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRA_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_LEAST, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRA_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistra, CMPISTRA, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistra, CMPISTRA, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistra, CMPISTRA, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistra, CMPISTRA, \ + IS_CMPISTRI) + +result_t test_mm_cmpistra(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRA_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPISTRC_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistrc_ubyte_data[TEST_MM_CMPISTRC_UBYTE_DATA_LEN] = { + {{89, 64, 88, 23, 11, 109, 34, 55, 0}, + {2, 64, 87, 32, 1, 110, 43, 66, 0}, + IMM_UBYTE_ANY_LEAST, + 1}, + {{99, 67, 2, 127, 125, 3, 24, 77, 32, 68, 96, 74, 70, 110, 111, 5}, + {98, 88, 67, 125, 111, 4, 56, 88, 33, 69, 99, 79, 123, 11, 10, 6}, + IMM_UBYTE_EACH_LEAST, + 0}, + {{2, 3, 74, 78, 81, 83, 85, 87, 89, 90, 0}, + {86, 90, 74, 85, 87, 81, 2, 3, 3, 3, 75, 76, 77, 78, 82, 85}, + IMM_UBYTE_RANGES_MOST_NEGATIVE, + 0}, + {{45, 67, 8, 9, 0}, + {67, 45, 67, 8, 9, 45, 67, 8, 9, 45, 67, 8, 9, 45, 67, 8}, + IMM_UBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRC_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistrc_sbyte_data[TEST_MM_CMPISTRC_SBYTE_DATA_LEN] = { + {{35, -35, 67, -66, 34, 55, 12, -100, 34, -34, 66, -67, 52, 100, 127, + -128}, + {35, -35, 67, -66, 0, 55, 12, -100, 0, -34, 66, -67, 0, 100, 127, + -128}, + IMM_SBYTE_EACH_MOST_MASKED_NEGATIVE, + 0}, + {{-119, 112, 105, 104, 0}, + {119, -112, 105, -104, 104, -34, 112, -119, 0}, + IMM_SBYTE_ANY_LEAST, + 1}, + {{-79, -69, -40, -35, 34, 45, 67, 88, 0}, + {1, 2, 3, 4, 5, 6, 7, 8, 0}, + IMM_SBYTE_RANGES_LEAST, + 0}, + {{22, -109, 123, 115, -12, 0}, + {22, -109, 12, 115, 22, -109, 123, 115, -12, 0}, + IMM_SBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRC_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistrc_uword_data[TEST_MM_CMPISTRC_UWORD_DATA_LEN] = { + {{23, 45, 67, 89, 102, 121, 23, 45}, + {23, 45, 67, 89, 102, 121, 23, 44}, + IMM_UWORD_EACH_LEAST, + 1}, + {{1, 11, 55, 75}, {13, 14, 56, 77, 0}, IMM_UWORD_ANY_LEAST, 0}, + {{1, 9, 11, 19, 21, 29, 91, 99}, + {10, 29, 30, 40, 50, 60, 70, 80}, + IMM_UWORD_RANGES_LEAST, + 1}, + {{3, 4, 5, 0}, + {0, 3, 4, 5, 3, 4, 5, 0}, + IMM_UWORD_ORDERED_LEAST_MASKED_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPISTRC_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistrc_sword_data[TEST_MM_CMPISTRC_SWORD_DATA_LEN] = { + {{-78, -56, 1000, 1002}, + {-79, -55, -12, -13, 999, 1003, -80, 10000}, + IMM_SWORD_RANGES_LEAST, + 0}, + {{45, 32767, -30000, 2345, -23450, 0}, + {45, 32767, -30000, 2346, -23456, 0, 45, 333}, + IMM_SWORD_EACH_LEAST, + 1}, + {{-10000, -20000, -30000, 10000, 20000, 30000, 0}, + {10000, 20000, 30000, -10000, -20000, 20000, -30000, 12}, + IMM_SWORD_ANY_MOST_NEGATIVE, + 1}, + {{1, 2, -3, -55, -666, -7777, 8888}, + {2, -3, -55, -666, -7777, 8888, 1}, + IMM_SWORD_ORDERED_LEAST, + 0}, +}; + +#define MM_CMPISTRC_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_MOST_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRC_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRC_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_LEAST_MASKED_NEGATIVE, __VA_ARGS__) + +#define MM_CMPISTRC_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_MOST_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRC_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistrc, CMPISTRC, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistrc, CMPISTRC, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistrc, CMPISTRC, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistrc, CMPISTRC, \ + IS_CMPISTRI) + +result_t test_mm_cmpistrc(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRC_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPISTRI_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistri_ubyte_data[TEST_MM_CMPISTRI_UBYTE_DATA_LEN] = { + {{104, 117, 110, 116, 114, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {33, 64, 35, 36, 37, 94, 38, 42, 40, 41, 91, 93, 58, 59, 60, 62}, + IMM_UBYTE_ANY_LEAST, + 16}, + {{4, 5, 6, 7, 8, 111, 34, 21, 0, 0, 0, 0, 0, 0, 0, 0}, + {5, 6, 7, 8, 8, 111, 43, 12, 0, 0, 0, 0, 0, 0, 0, 0}, + IMM_UBYTE_EACH_MOST_MASKED_NEGATIVE, + 15}, + {{65, 90, 97, 122, 48, 57, 0}, + {47, 46, 43, 44, 42, 43, 45, 41, 40, 123, 124, 125, 126, 127, 1, 2}, + IMM_UBYTE_RANGES_LEAST, + 16}, + {{111, 222, 22, 0}, + {33, 44, 55, 66, 77, 88, 99, 111, 222, 22, 11, 0}, + IMM_UBYTE_ORDERED_LEAST, + 7}, +}; + +#define TEST_MM_CMPISTRI_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistri_sbyte_data[TEST_MM_CMPISTRI_SBYTE_DATA_LEN] = { + {{1, 2, 3, 4, 5, -99, -128, -100, -1, 49, 0}, + {2, 3, 3, 4, 5, -100, -128, -99, 1, 44, 0}, + IMM_SBYTE_EACH_LEAST, + 2}, + {{99, 100, 23, -90, 0}, + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 99, 100, 23, -90, -90, 100}, + IMM_SBYTE_ANY_LEAST, + 10}, + {{-10, -2, 89, 97, 0}, + {-11, -12, -3, 1, 97, 0}, + IMM_SBYTE_RANGES_LEAST_NEGATIVE, + 0}, + {{-10, -90, -22, 30, 87, 127, 0}, {0}, IMM_SBYTE_ORDERED_LEAST, 16}, +}; + +#define TEST_MM_CMPISTRI_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistri_uword_data[TEST_MM_CMPISTRI_UWORD_DATA_LEN] = { + {{38767, 99, 1234, 65535, 2222, 1, 34456, 11}, + {38768, 999, 1235, 4444, 2222, 1, 34456, 12}, + IMM_UWORD_EACH_LEAST, + 4}, + {{22222, 33333, 44444, 55555, 6000, 600, 60, 6}, + {0}, + IMM_UWORD_ANY_LEAST, + 8}, + {{34, 777, 1000, 1004, 0}, + {33, 32, 889, 1003, 0}, + IMM_UWORD_RANGES_LEAST, + 3}, + {{44, 555, 44, 0}, + {44, 555, 44, 555, 44, 555, 44, 0}, + IMM_UWORD_ORDERED_MOST_NEGATIVE, + 7}, +}; + +#define TEST_MM_CMPISTRI_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistri_sword_data[TEST_MM_CMPISTRI_SWORD_DATA_LEN] = { + {{-1, -5, 10, 30, 40, 0}, + {13, -2, 7, 80, 11, 0}, + IMM_SWORD_RANGES_LEAST, + 0}, + {{-12, 12, 6666, 777, 0}, + {11, 12, 6666, 777, 0}, + IMM_SWORD_EACH_LEAST, + 1}, + {{23, 22, 33, 567, 9999, 12345, 0}, + {23, 22, 23, 22, 23, 22, 23, 12222}, + IMM_SWORD_ANY_MOST, + 6}, + {{12, -234, -567, 8888, 0}, + {13, -234, -567, 8888, 12, -234, -567, 8889}, + IMM_SWORD_ORDERED_LEAST, + 8}, +}; + +#define MM_CMPISTRI_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRI_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRI_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_MOST_NEGATIVE, __VA_ARGS__) + +#define MM_CMPISTRI_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_MOST, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRI_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistri, CMPISTRI, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistri, CMPISTRI, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistri, CMPISTRI, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistri, CMPISTRI, \ + IS_CMPISTRI) + +result_t test_mm_cmpistri(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRI_TEST_CASES + return TEST_SUCCESS; +} + +#define IS_CMPISTRM 0 + +typedef struct { + uint8_t a[16], b[16]; + const int imm8; + uint8_t expect[16]; +} test_mm_cmpistrm_ubyte_data_t; +typedef struct { + int8_t a[16], b[16]; + const int imm8; + int8_t expect[16]; +} test_mm_cmpistrm_sbyte_data_t; +typedef struct { + uint16_t a[8], b[8]; + const int imm8; + uint16_t expect[8]; +} test_mm_cmpistrm_uword_data_t; +typedef struct { + int16_t a[8], b[8]; + const int imm8; + int16_t expect[8]; +} test_mm_cmpistrm_sword_data_t; + +#define TEST_MM_CMPISTRM_UBYTE_DATA_LEN 4 +static test_mm_cmpistrm_ubyte_data_t + test_mm_cmpistrm_ubyte_data[TEST_MM_CMPISTRM_UBYTE_DATA_LEN] = { + {{88, 89, 90, 91, 92, 93, 0}, + {78, 88, 99, 127, 92, 93, 0}, + IMM_UBYTE_EACH_UNIT, + {0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255}}, + {{30, 41, 52, 63, 74, 85, 0}, + {30, 42, 51, 63, 74, 85, 0}, + IMM_UBYTE_ANY_BIT, + {57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{34, 32, 21, 16, 7, 0}, + {34, 33, 32, 31, 30, 29, 10, 6, 0}, + IMM_UBYTE_RANGES_UNIT, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{33, 21, 123, 89, 76, 56, 0}, + {33, 21, 124, 33, 21, 123, 89, 76, 56, 33, 21, 123, 89, 76, 56, 22}, + IMM_UBYTE_ORDERED_UNIT, + {0, 0, 0, 255, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0}}, +}; + +#define TEST_MM_CMPISTRM_SBYTE_DATA_LEN 4 +static test_mm_cmpistrm_sbyte_data_t + test_mm_cmpistrm_sbyte_data[TEST_MM_CMPISTRM_SBYTE_DATA_LEN] = { + {{-11, -90, -128, 127, 66, 45, 23, 32, 99, 10, 0}, + {-10, -90, -124, 33, 66, 45, 23, 22, 99, 100, 0}, + IMM_SBYTE_EACH_BIT_MASKED_NEGATIVE, + {-115, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{13, 14, 55, 1, 32, 100, 101, 102, 103, 97, 23, 21, 45, 54, 55, 56}, + {22, 109, 87, 45, 1, 103, 22, 102, 43, 87, 78, 56, 65, 55, 44, 33}, + IMM_SBYTE_ANY_UNIT, + {0, 0, 0, -1, -1, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, 0}}, + {{-31, -28, -9, 10, 45, 67, 88, 0}, + {-30, -32, -33, -44, 93, 44, 9, 89, 0}, + IMM_SBYTE_RANGES_UNIT, + {-1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{34, -10, 78, -99, -100, 100, 0}, + {34, 123, 88, 4, 34, -10, 78, -99, -100, 100, 34, -10, 78, -99, -100, + -100}, + IMM_SBYTE_ORDERED_UNIT, + {0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, +}; + +#define TEST_MM_CMPISTRM_UWORD_DATA_LEN 4 +static test_mm_cmpistrm_uword_data_t + test_mm_cmpistrm_uword_data[TEST_MM_CMPISTRM_UWORD_DATA_LEN] = { + {{1024, 2048, 4096, 5000, 0}, + {1023, 1000, 2047, 1596, 5566, 5666, 4477, 9487}, + IMM_UWORD_RANGES_UNIT, + {0, 0, 65535, 65535, 0, 0, 65535, 0}}, + {{1, 2, 345, 7788, 10000, 0}, + {2, 1, 345, 7788, 10000, 0}, + IMM_UWORD_EACH_UNIT, + {0, 0, 65535, 65535, 65535, 65535, 65535, 65535}}, + {{100, 0}, + {12345, 6766, 234, 0, 1, 34, 89, 100}, + IMM_UWORD_ANY_UNIT, + {0, 0, 0, 0, 0, 0, 0, 0}}, + {{34, 122, 9000, 0}, + {34, 122, 9000, 34, 122, 9000, 34, 122}, + IMM_UWORD_ORDERED_UNIT_NEGATIVE, + {0, 65535, 65535, 0, 65535, 65535, 0, 65535}}, +}; + +#define TEST_MM_CMPISTRM_SWORD_DATA_LEN 4 +static test_mm_cmpistrm_sword_data_t + test_mm_cmpistrm_sword_data[TEST_MM_CMPISTRM_SWORD_DATA_LEN] = { + {{-39, -10, 17, 89, 998, 1000, 1234, 4566}, + {-40, -52, -39, -29, 100, 1024, 4565, 4600}, + IMM_SWORD_RANGES_BIT, + {0, 0, -1, -1, 0, 0, -1, 0}}, + {{345, -1900, -10000, -30000, 50, 6789, 0}, + {103, -1901, -10000, 32767, 50, 6780, 0}, + IMM_SWORD_EACH_UNIT, + {0, 0, -1, 0, -1, 0, -1, -1}}, + {{677, 10001, 1001, 23, 0}, + {345, 677, 10001, 1003, 1001, 32, 23, 677}, + IMM_SWORD_ANY_UNIT, + {0, -1, -1, 0, -1, 0, -1, -1}}, + {{1024, -2288, 3752, -4096, 0}, + {1024, 1024, -2288, 3752, -4096, 1024, -2288, 3752}, + IMM_SWORD_ORDERED_UNIT, + {0, -1, 0, 0, 0, -1, 0, 0}}, +}; + +#define MM_CMPISTRM_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_EACH_UNIT, __VA_ARGS__) \ + _(UBYTE_ANY_BIT, __VA_ARGS__) \ + _(UBYTE_RANGES_UNIT, __VA_ARGS__) \ + _(UBYTE_ORDERED_UNIT, __VA_ARGS__) + +#define MM_CMPISTRM_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_BIT_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ANY_UNIT, __VA_ARGS__) \ + _(SBYTE_RANGES_UNIT, __VA_ARGS__) \ + _(SBYTE_ORDERED_UNIT, __VA_ARGS__) + +#define MM_CMPISTRM_UWORD_TEST_CASES(_, ...) \ + _(UWORD_RANGES_UNIT, __VA_ARGS__) \ + _(UWORD_EACH_UNIT, __VA_ARGS__) \ + _(UWORD_ANY_UNIT, __VA_ARGS__) \ + _(UWORD_ORDERED_UNIT_NEGATIVE, __VA_ARGS__) + +#define MM_CMPISTRM_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_UNIT, __VA_ARGS__) \ + _(SWORD_EACH_UNIT, __VA_ARGS__) \ + _(SWORD_ANY_UNIT, __VA_ARGS__) \ + _(SWORD_ORDERED_UNIT, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRM_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistrm, CMPISTRM, \ + IS_CMPISTRM) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistrm, CMPISTRM, \ + IS_CMPISTRM) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistrm, CMPISTRM, \ + IS_CMPISTRM) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistrm, CMPISTRM, \ + IS_CMPISTRM) + +result_t test_mm_cmpistrm(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRM_TEST_CASES + return TEST_SUCCESS; +} + +#undef IS_CMPISTRM + +#define TEST_MM_CMPISTRO_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistro_ubyte_data[TEST_MM_CMPISTRO_UBYTE_DATA_LEN] = { + {{3, 4, 5, 0}, {5, 5, 5, 4, 3, 0}, IMM_UBYTE_ANY_LEAST, 1}, + {{23, 127, 88, 3, 45, 6, 7, 2, 0}, + {32, 127, 87, 2, 44, 32, 1, 2, 0}, + IMM_UBYTE_EACH_MOST_NEGATIVE, + 1}, + {{3, 4, 55, 56, 0}, + {2, 3, 4, 5, 43, 54, 55, 56, 0}, + IMM_UBYTE_RANGES_LEAST, + 0}, + {{55, 66, 77, 11, 23, 0}, + {55, 55, 66, 77, 11, 23, 55, 66, 77, 11, 23, 33, 123, 18, 0}, + IMM_UBYTE_ORDERED_LEAST, + 0}, +}; + +#define TEST_MM_CMPISTRO_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistro_sbyte_data[TEST_MM_CMPISTRO_SBYTE_DATA_LEN] = { + {{33, -33, 23, -32, -1, -1, 23, 46, 78, 34, 54, 100, 90, 91, 92, 101}, + {32, 33, 23, -33, -2, -3, 23, 46, -78, 43, 56, 10, 9, 91, 90, 126}, + IMM_SBYTE_EACH_LEAST, + 0}, + {{-1, -2, -3, -4, -5, -6, -7, -8, 87, 86, 85, 84, 83, 82, 81, 80}, + {87, 79, 0}, + IMM_SBYTE_ANY_LEAST, + 1}, + {{3, 4, 2, 0}, + {3, 3, 4, 5, 6, 2, 0}, + IMM_SBYTE_RANGES_MOST_NEGATIVE, + 0}, + {{23, 66, 1, 13, 17, 1, 13, 17, 0}, + {23, 66, 1, 13, 17, 1, 13, 17, 32, 23, 66, 1, 13, 17, 1, 13}, + IMM_SBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRO_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistro_uword_data[TEST_MM_CMPISTRO_UWORD_DATA_LEN] = { + {{3333, 4444, 10000, 20000, 40000, 50000, 65535, 0}, + {3332, 4443, 10000, 20001, 40000, 50000, 65534, 0}, + IMM_UWORD_EACH_LEAST, + 0}, + {{1, 2, 333, 4444, 55555, 7777, 23, 347}, + {4444, 7777, 55555, 23, 347, 2, 1, 0}, + IMM_UWORD_ANY_LEAST, + 1}, + {{356, 380, 320, 456, 0}, + {455, 379, 333, 319, 300, 299, 0}, + IMM_UWORD_RANGES_LEAST, + 1}, + {{3, 1001, 235, 0}, + {3, 1001, 235, 0, 3, 1001, 235, 0}, + IMM_UWORD_ORDERED_MOST_MASKED_NEGATIVE, + 0}, +}; + +#define TEST_MM_CMPISTRO_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistro_sword_data[TEST_MM_CMPISTRO_SWORD_DATA_LEN] = { + {{-10, -5, -100, -90, 45, 56, 1000, 1009}, + {54, -1, -5, -6, 1001, 10001, 1009, 1009}, + IMM_SWORD_RANGES_LEAST, + 1}, + {{456, -32768, 32767, 13, 0}, + {455, -32768, 32767, 31, 0}, + IMM_SWORD_EACH_LEAST, + 0}, + {{23, 46, -44, 32000, 0}, + {23, 66, -44, 678, 32000, 0}, + IMM_SWORD_ANY_MOST_MASKED_NEGATIVE, + 0}, + {{-7900, -101, -34, 666, 345, 0}, + {-7900, -101, -34, 666, 345, -7900, -191, -34}, + IMM_SWORD_ORDERED_LEAST, + 1}, +}; + +#define MM_CMPISTRO_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_MOST_NEGATIVE, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRO_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_MOST_NEGATIVE, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRO_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_MOST_MASKED_NEGATIVE, __VA_ARGS__) + +#define MM_CMPISTRO_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_MOST_MASKED_NEGATIVE, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRO_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistro, CMPISTRO, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistro, CMPISTRO, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistro, CMPISTRO, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistro, CMPISTRO, \ + IS_CMPISTRI) + +result_t test_mm_cmpistro(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRO_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPISTRS_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistrs_ubyte_data[TEST_MM_CMPISTRS_UBYTE_DATA_LEN] = { + {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + {1, 2, 3, 4, 5, 0}, + IMM_UBYTE_ANY_LEAST, + 0}, + {{127, 126, 125, 124, 0}, + {127, 1, 34, 43, 54, 0}, + IMM_UBYTE_EACH_LEAST, + 1}, + {{127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127}, + {56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 0}, + IMM_UBYTE_RANGES_LEAST, + 0}, + {{33, 44, 55, 78, 99, 100, 101, 102, 0}, + {0}, + IMM_UBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRS_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistrs_sbyte_data[TEST_MM_CMPISTRS_SBYTE_DATA_LEN] = { + {{100, 99, 98, 97, -67, -4, -5, -6, -7, -1, -2, -3, -128, -128, -128, + -128}, + {0}, + IMM_SBYTE_EACH_LEAST, + 0}, + {{-128, -128, -128, -128, 127, 127, 127, 127, -128, -128, -128, -128, + 127, 127, 127, 127}, + {-1, -2, -11, -98, -12, 0}, + IMM_SBYTE_ANY_LEAST, + 0}, + {{0, 1, 2, 3, 4, 5, -6, -7}, + {0, 1, 2, 3, 4, 5, 6, 7}, + IMM_SBYTE_RANGES_LEAST, + 1}, + {{0, 1, 0, -1, 0, -2, 0, 0, -3, 4, 0, 0, 5, 6, 7, 8}, + {0}, + IMM_SBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRS_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistrs_uword_data[TEST_MM_CMPISTRS_UWORD_DATA_LEN] = { + {{0, 1, 2, 3, 65535, 0, 0, 0}, + {9, 8, 7, 6, 5, 4, 3, 2}, + IMM_UWORD_EACH_LEAST, + 1}, + {{4, 567, 65535, 32, 34, 0}, {0}, IMM_UWORD_ANY_LEAST, 1}, + {{65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535}, + {1, 2, 3, 4, 900, 7890, 6767, 0}, + IMM_UWORD_RANGES_LEAST, + 0}, + {{1, 2, 3, 4, 5, 6, 7, 8}, {1, 2, 3, 4, 0}, IMM_UWORD_ORDERED_LEAST, 0}, +}; + +#define TEST_MM_CMPISTRS_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistrs_sword_data[TEST_MM_CMPISTRS_SWORD_DATA_LEN] = { + {{-32768, -32768, -32768, -32768, -32768, -32768, -32768, -3276}, + {34, 45, 6, 7, 9, 8, 7, 6}, + IMM_SWORD_RANGES_LEAST, + 0}, + {{1000, 2000, 4000, 8000, 16000, 32000, 32767, 0}, + {3, 4, 56, 23, 0}, + IMM_SWORD_EACH_LEAST, + 1}, + {{0, 1, 3, 4, -32768, 9, 0, 1}, + {56, 47, 43, 999, 1111, 0}, + IMM_SWORD_ANY_LEAST, + 1}, + {{1111, 1212, 831, 2345, 32767, 32767, -32768, 32767}, + {0}, + IMM_SWORD_ORDERED_LEAST, + 0}, +}; + +#define MM_CMPISTRS_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRS_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRS_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRS_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_LEAST, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRS_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistrs, CMPISTRS, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistrs, CMPISTRS, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistrs, CMPISTRS, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistrs, CMPISTRS, \ + IS_CMPISTRI) + +result_t test_mm_cmpistrs(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRS_TEST_CASES + return TEST_SUCCESS; +} + +#define TEST_MM_CMPISTRZ_UBYTE_DATA_LEN 4 +static test_mm_cmpistri_ubyte_data_t + test_mm_cmpistrz_ubyte_data[TEST_MM_CMPISTRZ_UBYTE_DATA_LEN] = { + {{0}, + {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255}, + IMM_UBYTE_ANY_LEAST, + 0}, + {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}, + {1, 1, 1, 1, 2, 2, 2, 2, 4, 5, 6, 7, 89, 89, 89, 89}, + IMM_UBYTE_EACH_LEAST, + 0}, + {{1, 2, 3, 4, 0}, {}, IMM_UBYTE_RANGES_LEAST, 1}, + {{127, 126, 125, 124, 124, 0}, + {100, 101, 123, 100, 111, 122, 0}, + IMM_UBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRZ_SBYTE_DATA_LEN 4 +static test_mm_cmpistri_sbyte_data_t + test_mm_cmpistrz_sbyte_data[TEST_MM_CMPISTRZ_SBYTE_DATA_LEN] = { + {{127, 126, 99, -100, 0}, + {-128, -128, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, -128, -128}, + IMM_SBYTE_EACH_LEAST, + 0}, + {{120, 66, 54, 0}, {3, 4, 5, -99, -6, 0}, IMM_SBYTE_ANY_LEAST, 1}, + {{0}, + {127, 127, 127, 127, 126, 126, 126, 126, -127, -127, -127, -127, -1, + -1, -1, -1}, + IMM_SBYTE_RANGES_LEAST, + 0}, + {{12, 3, 4, 5, 6, 7, 8, 0}, + {-1, -2, -3, -4, -6, 75, 0}, + IMM_SBYTE_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRZ_UWORD_DATA_LEN 4 +static test_mm_cmpistri_uword_data_t + test_mm_cmpistrz_uword_data[TEST_MM_CMPISTRZ_UWORD_DATA_LEN] = { + {{10000, 20000, 50000, 40000, 0}, + {65535, 65533, 60000, 60000, 50000, 123, 1, 2}, + IMM_UWORD_EACH_LEAST, + 0}, + {{0}, + {65528, 65529, 65530, 65531, 65532, 65533, 65534, 65535}, + IMM_UWORD_ANY_LEAST, + 0}, + {{3, 333, 3333, 33333, 0}, {0}, IMM_UWORD_RANGES_LEAST, 1}, + {{123, 456, 7, 890, 0}, + {123, 456, 7, 900, 0}, + IMM_UWORD_ORDERED_LEAST, + 1}, +}; + +#define TEST_MM_CMPISTRZ_SWORD_DATA_LEN 4 +static test_mm_cmpistri_sword_data_t + test_mm_cmpistrz_sword_data[TEST_MM_CMPISTRZ_SWORD_DATA_LEN] = { + {{2, 22, 222, 2222, 22222, -2222, -222, -22}, + {-32768, 32767, -32767, 32766, -32766, 32765, -32768, 32767}, + IMM_SWORD_RANGES_LEAST, + 0}, + {{345, 10000, -10000, -30000, 0}, + {1, 2, 3, 4, 5, 6, 7, 0}, + IMM_SWORD_EACH_LEAST, + 1}, + {{}, {0}, IMM_SWORD_ANY_LEAST, 1}, + {{1, 2, -789, -1, -90, 0}, + {1, 10, 100, 1000, 10000, -10000, -1000, 1000}, + IMM_SWORD_ORDERED_LEAST, + 0}, +}; + +#define MM_CMPISTRZ_UBYTE_TEST_CASES(_, ...) \ + _(UBYTE_ANY_LEAST, __VA_ARGS__) \ + _(UBYTE_EACH_LEAST, __VA_ARGS__) \ + _(UBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(UBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRZ_SBYTE_TEST_CASES(_, ...) \ + _(SBYTE_EACH_LEAST, __VA_ARGS__) \ + _(SBYTE_ANY_LEAST, __VA_ARGS__) \ + _(SBYTE_RANGES_LEAST, __VA_ARGS__) \ + _(SBYTE_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRZ_UWORD_TEST_CASES(_, ...) \ + _(UWORD_EACH_LEAST, __VA_ARGS__) \ + _(UWORD_ANY_LEAST, __VA_ARGS__) \ + _(UWORD_RANGES_LEAST, __VA_ARGS__) \ + _(UWORD_ORDERED_LEAST, __VA_ARGS__) + +#define MM_CMPISTRZ_SWORD_TEST_CASES(_, ...) \ + _(SWORD_RANGES_LEAST, __VA_ARGS__) \ + _(SWORD_EACH_LEAST, __VA_ARGS__) \ + _(SWORD_ANY_LEAST, __VA_ARGS__) \ + _(SWORD_ORDERED_LEAST, __VA_ARGS__) + +#define GENERATE_MM_CMPISTRZ_TEST_CASES \ + ENUM_MM_CMPISTRX_TEST_CASES(UBYTE, ubyte, uint8_t, cmpistrz, CMPISTRZ, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SBYTE, sbyte, int8_t, cmpistrz, CMPISTRZ, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(UWORD, uword, uint16_t, cmpistrz, CMPISTRZ, \ + IS_CMPISTRI) \ + ENUM_MM_CMPISTRX_TEST_CASES(SWORD, sword, int16_t, cmpistrz, CMPISTRZ, \ + IS_CMPISTRI) + +result_t test_mm_cmpistrz(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + GENERATE_MM_CMPISTRZ_TEST_CASES + return TEST_SUCCESS; +} + +result_t test_mm_crc32_u16(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint32_t crc = *(const uint32_t *) impl.mTestIntPointer1; + uint16_t v = (uint16_t) iter; + uint32_t result = _mm_crc32_u16(crc, v); + ASSERT_RETURN(result == canonical_crc32_u16(crc, v)); + return TEST_SUCCESS; +} + +result_t test_mm_crc32_u32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint32_t crc = *(const uint32_t *) impl.mTestIntPointer1; + uint32_t v = *(const uint32_t *) impl.mTestIntPointer2; + uint32_t result = _mm_crc32_u32(crc, v); + ASSERT_RETURN(result == canonical_crc32_u32(crc, v)); + return TEST_SUCCESS; +} + +result_t test_mm_crc32_u64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint64_t crc = *(const uint64_t *) impl.mTestIntPointer1; + uint64_t v = *(const uint64_t *) impl.mTestIntPointer2; + uint64_t result = _mm_crc32_u64(crc, v); + ASSERT_RETURN(result == canonical_crc32_u64(crc, v)); + return TEST_SUCCESS; +} + +result_t test_mm_crc32_u8(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint32_t crc = *(const uint32_t *) impl.mTestIntPointer1; + uint8_t v = (uint8_t) iter; + uint32_t result = _mm_crc32_u8(crc, v); + ASSERT_RETURN(result == canonical_crc32_u8(crc, v)); + return TEST_SUCCESS; +} + +/* AES */ +result_t test_mm_aesenc_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *a = (int32_t *) impl.mTestIntPointer1; + const int32_t *b = (int32_t *) impl.mTestIntPointer2; + __m128i data = _mm_loadu_si128((const __m128i *) a); + __m128i rk = _mm_loadu_si128((const __m128i *) b); + + __m128i resultReference = aesenc_128_reference(data, rk); + __m128i resultIntrinsic = _mm_aesenc_si128(data, rk); + + return validate128(resultReference, resultIntrinsic); +} + +result_t test_mm_aesdec_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *a = (int32_t *) impl.mTestIntPointer1; + const int32_t *b = (int32_t *) impl.mTestIntPointer2; + __m128i data = _mm_loadu_si128((const __m128i *) a); + __m128i rk = _mm_loadu_si128((const __m128i *) b); + + __m128i resultReference = aesdec_128_reference(data, rk); + __m128i resultIntrinsic = _mm_aesdec_si128(data, rk); + + return validate128(resultReference, resultIntrinsic); +} + +result_t test_mm_aesenclast_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const int32_t *a = (const int32_t *) impl.mTestIntPointer1; + const int32_t *b = (const int32_t *) impl.mTestIntPointer2; + __m128i data = _mm_loadu_si128((const __m128i *) a); + __m128i rk = _mm_loadu_si128((const __m128i *) b); + + __m128i resultReference = aesenclast_128_reference(data, rk); + __m128i resultIntrinsic = _mm_aesenclast_si128(data, rk); + + return validate128(resultReference, resultIntrinsic); +} + +result_t test_mm_aesdeclast_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *a = (uint8_t *) impl.mTestIntPointer1; + const uint8_t *rk = (uint8_t *) impl.mTestIntPointer2; + __m128i _a = _mm_loadu_si128((const __m128i *) a); + __m128i _rk = _mm_loadu_si128((const __m128i *) rk); + uint8_t c[16] = {}; + + uint8_t v[4][4]; + for (int i = 0; i < 16; ++i) { + v[((i / 4) + (i % 4)) % 4][i % 4] = crypto_aes_rsbox[a[i]]; + } + for (int i = 0; i < 16; ++i) { + c[i] = v[i / 4][i % 4] ^ rk[i]; + } + + __m128i result_reference = _mm_loadu_si128((const __m128i *) c); + __m128i result_intrinsic = _mm_aesdeclast_si128(_a, _rk); + + return validate128(result_reference, result_intrinsic); +} + +result_t test_mm_aesimc_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint8_t *a = (uint8_t *) impl.mTestIntPointer1; + __m128i _a = _mm_loadu_si128((const __m128i *) a); + + uint8_t e, f, g, h, v[4][4]; + for (int i = 0; i < 16; ++i) { + ((uint8_t *) v)[i] = a[i]; + } + for (int i = 0; i < 4; ++i) { + e = v[i][0]; + f = v[i][1]; + g = v[i][2]; + h = v[i][3]; + + v[i][0] = (uint8_t) (MULTIPLY(e, 0x0e) ^ MULTIPLY(f, 0x0b) ^ + MULTIPLY(g, 0x0d) ^ MULTIPLY(h, 0x09)); + v[i][1] = (uint8_t) (MULTIPLY(e, 0x09) ^ MULTIPLY(f, 0x0e) ^ + MULTIPLY(g, 0x0b) ^ MULTIPLY(h, 0x0d)); + v[i][2] = (uint8_t) (MULTIPLY(e, 0x0d) ^ MULTIPLY(f, 0x09) ^ + MULTIPLY(g, 0x0e) ^ MULTIPLY(h, 0x0b)); + v[i][3] = (uint8_t) (MULTIPLY(e, 0x0b) ^ MULTIPLY(f, 0x0d) ^ + MULTIPLY(g, 0x09) ^ MULTIPLY(h, 0x0e)); + } + + __m128i result_reference = _mm_loadu_si128((const __m128i *) v); + __m128i result_intrinsic = _mm_aesimc_si128(_a); + + return validate128(result_reference, result_intrinsic); +} + +static inline uint32_t sub_word(uint32_t in) +{ + return (crypto_aes_sbox[(in >> 24) & 0xff] << 24) | + (crypto_aes_sbox[(in >> 16) & 0xff] << 16) | + (crypto_aes_sbox[(in >> 8) & 0xff] << 8) | + (crypto_aes_sbox[in & 0xff]); +} + +// FIXME: improve the test case for AES-256 key expansion. +// Reference: +// https://github.com/randombit/botan/blob/master/src/lib/block/aes/aes_ni/aes_ni.cpp +result_t test_mm_aeskeygenassist_si128(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + const uint32_t *a = (uint32_t *) impl.mTestIntPointer1; + __m128i data = load_m128i(a); + uint32_t sub_x1 = sub_word(a[1]); + uint32_t sub_x3 = sub_word(a[3]); + __m128i result_reference; + __m128i result_intrinsic; +#define TEST_IMPL(IDX) \ + uint32_t res##IDX[4] = { \ + sub_x1, \ + rotr(sub_x1, 8) ^ IDX, \ + sub_x3, \ + rotr(sub_x3, 8) ^ IDX, \ + }; \ + result_reference = load_m128i(res##IDX); \ + result_intrinsic = _mm_aeskeygenassist_si128(data, IDX); \ + CHECK_RESULT(validate128(result_reference, result_intrinsic)); + + IMM_256_ITER +#undef TEST_IMPL + return TEST_SUCCESS; +} + +/* Others */ +result_t test_mm_clmulepi64_si128(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint64_t *_a = (const uint64_t *) impl.mTestIntPointer1; + const uint64_t *_b = (const uint64_t *) impl.mTestIntPointer2; + __m128i a = load_m128i(_a); + __m128i b = load_m128i(_b); + auto result = clmul_64(_a[0], _b[0]); + if (!validateUInt64(_mm_clmulepi64_si128(a, b, 0x00), result.first, + result.second)) + return TEST_FAIL; + result = clmul_64(_a[1], _b[0]); + if (!validateUInt64(_mm_clmulepi64_si128(a, b, 0x01), result.first, + result.second)) + return TEST_FAIL; + result = clmul_64(_a[0], _b[1]); + if (!validateUInt64(_mm_clmulepi64_si128(a, b, 0x10), result.first, + result.second)) + return TEST_FAIL; + result = clmul_64(_a[1], _b[1]); + if (!validateUInt64(_mm_clmulepi64_si128(a, b, 0x11), result.first, + result.second)) + return TEST_FAIL; + return TEST_SUCCESS; +} + +result_t test_mm_get_denormals_zero_mode(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + int res_denormals_zero_on, res_denormals_zero_off; + + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); + res_denormals_zero_on = + _MM_GET_DENORMALS_ZERO_MODE() == _MM_DENORMALS_ZERO_ON; + + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF); + res_denormals_zero_off = + _MM_GET_DENORMALS_ZERO_MODE() == _MM_DENORMALS_ZERO_OFF; + + return (res_denormals_zero_on && res_denormals_zero_off) ? TEST_SUCCESS + : TEST_FAIL; +} + +static int popcnt_reference(uint64_t a) +{ + int count = 0; + while (a != 0) { + count += a & 1; + a >>= 1; + } + return count; +} + +result_t test_mm_popcnt_u32(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint64_t *a = (const uint64_t *) impl.mTestIntPointer1; + ASSERT_RETURN(popcnt_reference((uint32_t) a[0]) == + _mm_popcnt_u32((unsigned int) a[0])); + return TEST_SUCCESS; +} + +result_t test_mm_popcnt_u64(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + const uint64_t *a = (const uint64_t *) impl.mTestIntPointer1; + ASSERT_RETURN(popcnt_reference(a[0]) == _mm_popcnt_u64(a[0])); + return TEST_SUCCESS; +} + +OPTNONE result_t test_mm_set_denormals_zero_mode(const SSE2NEONTestImpl &impl, + uint32_t iter) +{ + result_t res_set_denormals_zero_on, res_set_denormals_zero_off; + float factor = 2; + float denormal = FLT_MIN / factor; + float denormals[4] = {denormal, denormal, denormal, denormal}; + float factors[4] = {factor, factor, factor, factor}; + __m128 ret = _mm_setzero_ps(); + + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); + ret = _mm_mul_ps(load_m128(denormals), load_m128(factors)); + res_set_denormals_zero_on = validateFloat(ret, 0, 0, 0, 0); + + _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_OFF); + ret = _mm_mul_ps(load_m128(denormals), load_m128(factors)); +#if defined(__arm__) + // AArch32 Advanced SIMD arithmetic always uses the Flush-to-zero setting, + // regardless of the value of the FZ bit. + res_set_denormals_zero_off = validateFloat(ret, 0, 0, 0, 0); +#else + res_set_denormals_zero_off = + validateFloat(ret, FLT_MIN, FLT_MIN, FLT_MIN, FLT_MIN); +#endif + + if (res_set_denormals_zero_on == TEST_FAIL || + res_set_denormals_zero_off == TEST_FAIL) + return TEST_FAIL; + return TEST_SUCCESS; +} + +result_t test_rdtsc(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + uint64_t start = _rdtsc(); + for (int i = 0; i < 100000; i++) { +#if defined(_MSC_VER) + _ReadWriteBarrier(); +#else + __asm__ __volatile__("" ::: "memory"); +#endif + } + uint64_t end = _rdtsc(); + return end > start ? TEST_SUCCESS : TEST_FAIL; +} + +SSE2NEONTestImpl::SSE2NEONTestImpl(void) +{ + mTestFloatPointer1 = (float *) platformAlignedAlloc(sizeof(__m128)); + mTestFloatPointer2 = (float *) platformAlignedAlloc(sizeof(__m128)); + mTestIntPointer1 = (int32_t *) platformAlignedAlloc(sizeof(__m128i)); + mTestIntPointer2 = (int32_t *) platformAlignedAlloc(sizeof(__m128i)); + SSE2NEON_INIT_RNG(123456); + for (uint32_t i = 0; i < MAX_TEST_VALUE; i++) { + mTestFloats[i] = ranf(-100000, 100000); + mTestInts[i] = (int32_t) ranf(-100000, 100000); + } +} + +// Dummy function to match the case label in runSingleTest. +result_t test_last(const SSE2NEONTestImpl &impl, uint32_t iter) +{ + return TEST_SUCCESS; +} + +result_t SSE2NEONTestImpl::loadTestFloatPointers(uint32_t i) +{ + result_t ret = + do_mm_store_ps(mTestFloatPointer1, mTestFloats[i], mTestFloats[i + 1], + mTestFloats[i + 2], mTestFloats[i + 3]); + if (ret == TEST_SUCCESS) { + ret = do_mm_store_ps(mTestFloatPointer2, mTestFloats[i + 4], + mTestFloats[i + 5], mTestFloats[i + 6], + mTestFloats[i + 7]); + } + return ret; +} + +result_t SSE2NEONTestImpl::loadTestIntPointers(uint32_t i) +{ + result_t ret = + do_mm_store_ps(mTestIntPointer1, mTestInts[i], mTestInts[i + 1], + mTestInts[i + 2], mTestInts[i + 3]); + if (ret == TEST_SUCCESS) { + ret = + do_mm_store_ps(mTestIntPointer2, mTestInts[i + 4], mTestInts[i + 5], + mTestInts[i + 6], mTestInts[i + 7]); + } + + return ret; +} + +result_t SSE2NEONTestImpl::runSingleTest(InstructionTest test, uint32_t i) +{ + result_t ret = TEST_SUCCESS; + + switch (test) { +#define _(x) \ + case it_##x: \ + ret = test_##x(*this, i); \ + break; + INTRIN_LIST +#undef _ + } + + return ret; +} + +SSE2NEONTest *SSE2NEONTest::create(void) +{ + SSE2NEONTestImpl *st = new SSE2NEONTestImpl; + return static_cast(st); +} + +} // namespace SSE2NEON diff --git a/deps/sse2neon/tests/impl.h b/deps/sse2neon/tests/impl.h new file mode 100644 index 000000000..5cc5a6f8c --- /dev/null +++ b/deps/sse2neon/tests/impl.h @@ -0,0 +1,572 @@ +#ifndef SSE2NEONTEST_H +#define SSE2NEONTEST_H + +#include "common.h" + +#define INTRIN_LIST \ + /* MMX */ \ + _(mm_empty) \ + /* SSE */ \ + _(mm_add_ps) \ + _(mm_add_ss) \ + _(mm_and_ps) \ + _(mm_andnot_ps) \ + _(mm_avg_pu16) \ + _(mm_avg_pu8) \ + _(mm_cmpeq_ps) \ + _(mm_cmpeq_ss) \ + _(mm_cmpge_ps) \ + _(mm_cmpge_ss) \ + _(mm_cmpgt_ps) \ + _(mm_cmpgt_ss) \ + _(mm_cmple_ps) \ + _(mm_cmple_ss) \ + _(mm_cmplt_ps) \ + _(mm_cmplt_ss) \ + _(mm_cmpneq_ps) \ + _(mm_cmpneq_ss) \ + _(mm_cmpnge_ps) \ + _(mm_cmpnge_ss) \ + _(mm_cmpngt_ps) \ + _(mm_cmpngt_ss) \ + _(mm_cmpnle_ps) \ + _(mm_cmpnle_ss) \ + _(mm_cmpnlt_ps) \ + _(mm_cmpnlt_ss) \ + _(mm_cmpord_ps) \ + _(mm_cmpord_ss) \ + _(mm_cmpunord_ps) \ + _(mm_cmpunord_ss) \ + _(mm_comieq_ss) \ + _(mm_comige_ss) \ + _(mm_comigt_ss) \ + _(mm_comile_ss) \ + _(mm_comilt_ss) \ + _(mm_comineq_ss) \ + _(mm_cvt_pi2ps) \ + _(mm_cvt_ps2pi) \ + _(mm_cvt_si2ss) \ + _(mm_cvt_ss2si) \ + _(mm_cvtpi16_ps) \ + _(mm_cvtpi32_ps) \ + _(mm_cvtpi32x2_ps) \ + _(mm_cvtpi8_ps) \ + _(mm_cvtps_pi16) \ + _(mm_cvtps_pi32) \ + _(mm_cvtps_pi8) \ + _(mm_cvtpu16_ps) \ + _(mm_cvtpu8_ps) \ + _(mm_cvtsi32_ss) \ + _(mm_cvtsi64_ss) \ + _(mm_cvtss_f32) \ + _(mm_cvtss_si32) \ + _(mm_cvtss_si64) \ + _(mm_cvtt_ps2pi) \ + _(mm_cvtt_ss2si) \ + _(mm_cvttps_pi32) \ + _(mm_cvttss_si32) \ + _(mm_cvttss_si64) \ + _(mm_div_ps) \ + _(mm_div_ss) \ + _(mm_extract_pi16) \ + _(mm_free) \ + _(mm_get_flush_zero_mode) \ + _(mm_get_rounding_mode) \ + _(mm_getcsr) \ + _(mm_insert_pi16) \ + _(mm_load_ps) \ + _(mm_load_ps1) \ + _(mm_load_ss) \ + _(mm_load1_ps) \ + _(mm_loadh_pi) \ + _(mm_loadl_pi) \ + _(mm_loadr_ps) \ + _(mm_loadu_ps) \ + _(mm_loadu_si16) \ + _(mm_loadu_si64) \ + _(mm_malloc) \ + _(mm_maskmove_si64) \ + _(m_maskmovq) \ + _(mm_max_pi16) \ + _(mm_max_ps) \ + _(mm_max_pu8) \ + _(mm_max_ss) \ + _(mm_min_pi16) \ + _(mm_min_ps) \ + _(mm_min_pu8) \ + _(mm_min_ss) \ + _(mm_move_ss) \ + _(mm_movehl_ps) \ + _(mm_movelh_ps) \ + _(mm_movemask_pi8) \ + _(mm_movemask_ps) \ + _(mm_mul_ps) \ + _(mm_mul_ss) \ + _(mm_mulhi_pu16) \ + _(mm_or_ps) \ + _(m_pavgb) \ + _(m_pavgw) \ + _(m_pextrw) \ + _(m_pinsrw) \ + _(m_pmaxsw) \ + _(m_pmaxub) \ + _(m_pminsw) \ + _(m_pminub) \ + _(m_pmovmskb) \ + _(m_pmulhuw) \ + _(mm_prefetch) \ + _(m_psadbw) \ + _(m_pshufw) \ + _(mm_rcp_ps) \ + _(mm_rcp_ss) \ + _(mm_rsqrt_ps) \ + _(mm_rsqrt_ss) \ + _(mm_sad_pu8) \ + _(mm_set_flush_zero_mode) \ + _(mm_set_ps) \ + _(mm_set_ps1) \ + _(mm_set_rounding_mode) \ + _(mm_set_ss) \ + _(mm_set1_ps) \ + _(mm_setcsr) \ + _(mm_setr_ps) \ + _(mm_setzero_ps) \ + _(mm_sfence) \ + _(mm_shuffle_pi16) \ + _(mm_shuffle_ps) \ + _(mm_sqrt_ps) \ + _(mm_sqrt_ss) \ + _(mm_store_ps) \ + _(mm_store_ps1) \ + _(mm_store_ss) \ + _(mm_store1_ps) \ + _(mm_storeh_pi) \ + _(mm_storel_pi) \ + _(mm_storer_ps) \ + _(mm_storeu_ps) \ + _(mm_storeu_si16) \ + _(mm_storeu_si64) \ + _(mm_stream_pi) \ + _(mm_stream_ps) \ + _(mm_sub_ps) \ + _(mm_sub_ss) \ + _(mm_ucomieq_ss) \ + _(mm_ucomige_ss) \ + _(mm_ucomigt_ss) \ + _(mm_ucomile_ss) \ + _(mm_ucomilt_ss) \ + _(mm_ucomineq_ss) \ + _(mm_undefined_ps) \ + _(mm_unpackhi_ps) \ + _(mm_unpacklo_ps) \ + _(mm_xor_ps) \ + /* SSE2 */ \ + _(mm_add_epi16) \ + _(mm_add_epi32) \ + _(mm_add_epi64) \ + _(mm_add_epi8) \ + _(mm_add_pd) \ + _(mm_add_sd) \ + _(mm_add_si64) \ + _(mm_adds_epi16) \ + _(mm_adds_epi8) \ + _(mm_adds_epu16) \ + _(mm_adds_epu8) \ + _(mm_and_pd) \ + _(mm_and_si128) \ + _(mm_andnot_pd) \ + _(mm_andnot_si128) \ + _(mm_avg_epu16) \ + _(mm_avg_epu8) \ + _(mm_bslli_si128) \ + _(mm_bsrli_si128) \ + _(mm_castpd_ps) \ + _(mm_castpd_si128) \ + _(mm_castps_pd) \ + _(mm_castps_si128) \ + _(mm_castsi128_pd) \ + _(mm_castsi128_ps) \ + _(mm_clflush) \ + _(mm_cmpeq_epi16) \ + _(mm_cmpeq_epi32) \ + _(mm_cmpeq_epi8) \ + _(mm_cmpeq_pd) \ + _(mm_cmpeq_sd) \ + _(mm_cmpge_pd) \ + _(mm_cmpge_sd) \ + _(mm_cmpgt_epi16) \ + _(mm_cmpgt_epi32) \ + _(mm_cmpgt_epi8) \ + _(mm_cmpgt_pd) \ + _(mm_cmpgt_sd) \ + _(mm_cmple_pd) \ + _(mm_cmple_sd) \ + _(mm_cmplt_epi16) \ + _(mm_cmplt_epi32) \ + _(mm_cmplt_epi8) \ + _(mm_cmplt_pd) \ + _(mm_cmplt_sd) \ + _(mm_cmpneq_pd) \ + _(mm_cmpneq_sd) \ + _(mm_cmpnge_pd) \ + _(mm_cmpnge_sd) \ + _(mm_cmpngt_pd) \ + _(mm_cmpngt_sd) \ + _(mm_cmpnle_pd) \ + _(mm_cmpnle_sd) \ + _(mm_cmpnlt_pd) \ + _(mm_cmpnlt_sd) \ + _(mm_cmpord_pd) \ + _(mm_cmpord_sd) \ + _(mm_cmpunord_pd) \ + _(mm_cmpunord_sd) \ + _(mm_comieq_sd) \ + _(mm_comige_sd) \ + _(mm_comigt_sd) \ + _(mm_comile_sd) \ + _(mm_comilt_sd) \ + _(mm_comineq_sd) \ + _(mm_cvtepi32_pd) \ + _(mm_cvtepi32_ps) \ + _(mm_cvtpd_epi32) \ + _(mm_cvtpd_pi32) \ + _(mm_cvtpd_ps) \ + _(mm_cvtpi32_pd) \ + _(mm_cvtps_epi32) \ + _(mm_cvtps_pd) \ + _(mm_cvtsd_f64) \ + _(mm_cvtsd_si32) \ + _(mm_cvtsd_si64) \ + _(mm_cvtsd_si64x) \ + _(mm_cvtsd_ss) \ + _(mm_cvtsi128_si32) \ + _(mm_cvtsi128_si64) \ + _(mm_cvtsi128_si64x) \ + _(mm_cvtsi32_sd) \ + _(mm_cvtsi32_si128) \ + _(mm_cvtsi64_sd) \ + _(mm_cvtsi64_si128) \ + _(mm_cvtsi64x_sd) \ + _(mm_cvtsi64x_si128) \ + _(mm_cvtss_sd) \ + _(mm_cvttpd_epi32) \ + _(mm_cvttpd_pi32) \ + _(mm_cvttps_epi32) \ + _(mm_cvttsd_si32) \ + _(mm_cvttsd_si64) \ + _(mm_cvttsd_si64x) \ + _(mm_div_pd) \ + _(mm_div_sd) \ + _(mm_extract_epi16) \ + _(mm_insert_epi16) \ + _(mm_lfence) \ + _(mm_load_pd) \ + _(mm_load_pd1) \ + _(mm_load_sd) \ + _(mm_load_si128) \ + _(mm_load1_pd) \ + _(mm_loadh_pd) \ + _(mm_loadl_epi64) \ + _(mm_loadl_pd) \ + _(mm_loadr_pd) \ + _(mm_loadu_pd) \ + _(mm_loadu_si128) \ + _(mm_loadu_si32) \ + _(mm_madd_epi16) \ + _(mm_maskmoveu_si128) \ + _(mm_max_epi16) \ + _(mm_max_epu8) \ + _(mm_max_pd) \ + _(mm_max_sd) \ + _(mm_mfence) \ + _(mm_min_epi16) \ + _(mm_min_epu8) \ + _(mm_min_pd) \ + _(mm_min_sd) \ + _(mm_move_epi64) \ + _(mm_move_sd) \ + _(mm_movemask_epi8) \ + _(mm_movemask_pd) \ + _(mm_movepi64_pi64) \ + _(mm_movpi64_epi64) \ + _(mm_mul_epu32) \ + _(mm_mul_pd) \ + _(mm_mul_sd) \ + _(mm_mul_su32) \ + _(mm_mulhi_epi16) \ + _(mm_mulhi_epu16) \ + _(mm_mullo_epi16) \ + _(mm_or_pd) \ + _(mm_or_si128) \ + _(mm_packs_epi16) \ + _(mm_packs_epi32) \ + _(mm_packus_epi16) \ + _(mm_pause) \ + _(mm_sad_epu8) \ + _(mm_set_epi16) \ + _(mm_set_epi32) \ + _(mm_set_epi64) \ + _(mm_set_epi64x) \ + _(mm_set_epi8) \ + _(mm_set_pd) \ + _(mm_set_pd1) \ + _(mm_set_sd) \ + _(mm_set1_epi16) \ + _(mm_set1_epi32) \ + _(mm_set1_epi64) \ + _(mm_set1_epi64x) \ + _(mm_set1_epi8) \ + _(mm_set1_pd) \ + _(mm_setr_epi16) \ + _(mm_setr_epi32) \ + _(mm_setr_epi64) \ + _(mm_setr_epi8) \ + _(mm_setr_pd) \ + _(mm_setzero_pd) \ + _(mm_setzero_si128) \ + _(mm_shuffle_epi32) \ + _(mm_shuffle_pd) \ + _(mm_shufflehi_epi16) \ + _(mm_shufflelo_epi16) \ + _(mm_sll_epi16) \ + _(mm_sll_epi32) \ + _(mm_sll_epi64) \ + _(mm_slli_epi16) \ + _(mm_slli_epi32) \ + _(mm_slli_epi64) \ + _(mm_slli_si128) \ + _(mm_sqrt_pd) \ + _(mm_sqrt_sd) \ + _(mm_sra_epi16) \ + _(mm_sra_epi32) \ + _(mm_srai_epi16) \ + _(mm_srai_epi32) \ + _(mm_srl_epi16) \ + _(mm_srl_epi32) \ + _(mm_srl_epi64) \ + _(mm_srli_epi16) \ + _(mm_srli_epi32) \ + _(mm_srli_epi64) \ + _(mm_srli_si128) \ + _(mm_store_pd) \ + _(mm_store_pd1) \ + _(mm_store_sd) \ + _(mm_store_si128) \ + _(mm_store1_pd) \ + _(mm_storeh_pd) \ + _(mm_storel_epi64) \ + _(mm_storel_pd) \ + _(mm_storer_pd) \ + _(mm_storeu_pd) \ + _(mm_storeu_si128) \ + _(mm_storeu_si32) \ + _(mm_stream_pd) \ + _(mm_stream_si128) \ + _(mm_stream_si32) \ + _(mm_stream_si64) \ + _(mm_sub_epi16) \ + _(mm_sub_epi32) \ + _(mm_sub_epi64) \ + _(mm_sub_epi8) \ + _(mm_sub_pd) \ + _(mm_sub_sd) \ + _(mm_sub_si64) \ + _(mm_subs_epi16) \ + _(mm_subs_epi8) \ + _(mm_subs_epu16) \ + _(mm_subs_epu8) \ + _(mm_ucomieq_sd) \ + _(mm_ucomige_sd) \ + _(mm_ucomigt_sd) \ + _(mm_ucomile_sd) \ + _(mm_ucomilt_sd) \ + _(mm_ucomineq_sd) \ + _(mm_undefined_pd) \ + _(mm_undefined_si128) \ + _(mm_unpackhi_epi16) \ + _(mm_unpackhi_epi32) \ + _(mm_unpackhi_epi64) \ + _(mm_unpackhi_epi8) \ + _(mm_unpackhi_pd) \ + _(mm_unpacklo_epi16) \ + _(mm_unpacklo_epi32) \ + _(mm_unpacklo_epi64) \ + _(mm_unpacklo_epi8) \ + _(mm_unpacklo_pd) \ + _(mm_xor_pd) \ + _(mm_xor_si128) \ + /* SSE3 */ \ + _(mm_addsub_pd) \ + _(mm_addsub_ps) \ + _(mm_hadd_pd) \ + _(mm_hadd_ps) \ + _(mm_hsub_pd) \ + _(mm_hsub_ps) \ + _(mm_lddqu_si128) \ + _(mm_loaddup_pd) \ + _(mm_movedup_pd) \ + _(mm_movehdup_ps) \ + _(mm_moveldup_ps) \ + /* SSSE3 */ \ + _(mm_abs_epi16) \ + _(mm_abs_epi32) \ + _(mm_abs_epi8) \ + _(mm_abs_pi16) \ + _(mm_abs_pi32) \ + _(mm_abs_pi8) \ + _(mm_alignr_epi8) \ + _(mm_alignr_pi8) \ + _(mm_hadd_epi16) \ + _(mm_hadd_epi32) \ + _(mm_hadd_pi16) \ + _(mm_hadd_pi32) \ + _(mm_hadds_epi16) \ + _(mm_hadds_pi16) \ + _(mm_hsub_epi16) \ + _(mm_hsub_epi32) \ + _(mm_hsub_pi16) \ + _(mm_hsub_pi32) \ + _(mm_hsubs_epi16) \ + _(mm_hsubs_pi16) \ + _(mm_maddubs_epi16) \ + _(mm_maddubs_pi16) \ + _(mm_mulhrs_epi16) \ + _(mm_mulhrs_pi16) \ + _(mm_shuffle_epi8) \ + _(mm_shuffle_pi8) \ + _(mm_sign_epi16) \ + _(mm_sign_epi32) \ + _(mm_sign_epi8) \ + _(mm_sign_pi16) \ + _(mm_sign_pi32) \ + _(mm_sign_pi8) \ + /* SSE4.1 */ \ + _(mm_blend_epi16) \ + _(mm_blend_pd) \ + _(mm_blend_ps) \ + _(mm_blendv_epi8) \ + _(mm_blendv_pd) \ + _(mm_blendv_ps) \ + _(mm_ceil_pd) \ + _(mm_ceil_ps) \ + _(mm_ceil_sd) \ + _(mm_ceil_ss) \ + _(mm_cmpeq_epi64) \ + _(mm_cvtepi16_epi32) \ + _(mm_cvtepi16_epi64) \ + _(mm_cvtepi32_epi64) \ + _(mm_cvtepi8_epi16) \ + _(mm_cvtepi8_epi32) \ + _(mm_cvtepi8_epi64) \ + _(mm_cvtepu16_epi32) \ + _(mm_cvtepu16_epi64) \ + _(mm_cvtepu32_epi64) \ + _(mm_cvtepu8_epi16) \ + _(mm_cvtepu8_epi32) \ + _(mm_cvtepu8_epi64) \ + _(mm_dp_pd) \ + _(mm_dp_ps) \ + _(mm_extract_epi32) \ + _(mm_extract_epi64) \ + _(mm_extract_epi8) \ + _(mm_extract_ps) \ + _(mm_floor_pd) \ + _(mm_floor_ps) \ + _(mm_floor_sd) \ + _(mm_floor_ss) \ + _(mm_insert_epi32) \ + _(mm_insert_epi64) \ + _(mm_insert_epi8) \ + _(mm_insert_ps) \ + _(mm_max_epi32) \ + _(mm_max_epi8) \ + _(mm_max_epu16) \ + _(mm_max_epu32) \ + _(mm_min_epi32) \ + _(mm_min_epi8) \ + _(mm_min_epu16) \ + _(mm_min_epu32) \ + _(mm_minpos_epu16) \ + _(mm_mpsadbw_epu8) \ + _(mm_mul_epi32) \ + _(mm_mullo_epi32) \ + _(mm_packus_epi32) \ + _(mm_round_pd) \ + _(mm_round_ps) \ + _(mm_round_sd) \ + _(mm_round_ss) \ + _(mm_stream_load_si128) \ + _(mm_test_all_ones) \ + _(mm_test_all_zeros) \ + _(mm_test_mix_ones_zeros) \ + _(mm_testc_si128) \ + _(mm_testnzc_si128) \ + _(mm_testz_si128) \ + /* SSE4.2 */ \ + _(mm_cmpestra) \ + _(mm_cmpestrc) \ + _(mm_cmpestri) \ + _(mm_cmpestrm) \ + _(mm_cmpestro) \ + _(mm_cmpestrs) \ + _(mm_cmpestrz) \ + _(mm_cmpgt_epi64) \ + _(mm_cmpistra) \ + _(mm_cmpistrc) \ + _(mm_cmpistri) \ + _(mm_cmpistrm) \ + _(mm_cmpistro) \ + _(mm_cmpistrs) \ + _(mm_cmpistrz) \ + _(mm_crc32_u16) \ + _(mm_crc32_u32) \ + _(mm_crc32_u64) \ + _(mm_crc32_u8) \ + /* AES */ \ + _(mm_aesenc_si128) \ + _(mm_aesdec_si128) \ + _(mm_aesenclast_si128) \ + _(mm_aesdeclast_si128) \ + _(mm_aesimc_si128) \ + _(mm_aeskeygenassist_si128) \ + /* Others */ \ + _(mm_clmulepi64_si128) \ + _(mm_get_denormals_zero_mode) \ + _(mm_popcnt_u32) \ + _(mm_popcnt_u64) \ + _(mm_set_denormals_zero_mode) \ + _(rdtsc) \ + _(last) /* This indicates the end of macros */ + +namespace SSE2NEON +{ +// The way unit tests are implemented is that 10,000 random floating point and +// integer vec4 numbers are generated as sample data. +// +// A short C implementation of every intrinsic is implemented and compared to +// the actual expected results from the corresponding SSE intrinsic against all +// of the 10,000 randomized input vectors. When running on ARM, then the results +// are compared to the NEON approximate version. +extern const char *instructionString[]; +enum InstructionTest { +#define _(x) it_##x, + INTRIN_LIST +#undef _ +}; + +class SSE2NEONTest +{ +public: + static SSE2NEONTest *create(void); // create the test. + + // Run test of this instruction; + // Passed: TEST_SUCCESS (1) + // Failed: TEST_FAIL (0) + // Unimplemented: TEST_UNIMPL (-1) + virtual result_t runTest(InstructionTest test) = 0; + virtual void release(void) = 0; +}; + +} // namespace SSE2NEON + +#endif diff --git a/deps/sse2neon/tests/main.cpp b/deps/sse2neon/tests/main.cpp new file mode 100644 index 000000000..844353e08 --- /dev/null +++ b/deps/sse2neon/tests/main.cpp @@ -0,0 +1,39 @@ +#include +#include +#include "impl.h" + +int main(int /*argc*/, const char ** /*argv*/) +{ + SSE2NEON::SSE2NEONTest *test = SSE2NEON::SSE2NEONTest::create(); + uint32_t passCount = 0; + uint32_t failedCount = 0; + uint32_t ignoreCount = 0; + for (uint32_t i = 0; i < SSE2NEON::it_last; i++) { + SSE2NEON::InstructionTest it = SSE2NEON::InstructionTest(i); + SSE2NEON::result_t ret = test->runTest(it); + // If the test fails, we will run it again so we can step into the + // debugger and figure out why! + if (ret == SSE2NEON::TEST_FAIL) { + printf("Test %-30s failed\n", SSE2NEON::instructionString[it]); + failedCount++; + } else if (ret == SSE2NEON::TEST_UNIMPL) { + printf("Test %-30s skipped\n", SSE2NEON::instructionString[it]); + ignoreCount++; + } else { + printf("Test %-30s passed\n", SSE2NEON::instructionString[it]); + passCount++; + } + } + test->release(); + printf( + "SSE2NEONTest Complete!\n" + "Passed: %d\n" + "Failed: %d\n" + "Ignored: %d\n" + "Coverage rate: %.2f%%\n", + passCount, failedCount, ignoreCount, + (float) passCount / (float) (passCount + failedCount + ignoreCount) * + 100); + + return failedCount ? -1 : 0; +} diff --git a/deps/unrar/hc_decompress_rar.cpp b/deps/unrar/hc_decompress_rar.cpp index 7266c0877..59ffea5fd 100644 --- a/deps/unrar/hc_decompress_rar.cpp +++ b/deps/unrar/hc_decompress_rar.cpp @@ -12,7 +12,7 @@ #define SOLID false #define METHOD VER_UNPACK // 29 for RAR3 archives -extern "C" unsigned int hc_decompress_rar (unsigned char *Win, unsigned char *Inp, unsigned char *VM, unsigned char *PPM, const unsigned int OutputSize, const unsigned char *Input, const unsigned int PackSize, const unsigned int UnpackSize, const unsigned char *Key, const unsigned char *IV) +extern "C" unsigned int hc_decompress_rar (unsigned char *Win, unsigned char *Inp, unsigned char *VM, unsigned char *PPM, const unsigned int OutputSize, const unsigned char *Input, const unsigned int PackSize, const unsigned int UnpackSize, const unsigned char *Key, const unsigned char *IV, unsigned int *unpack_failed) { ComprDataIO DataIO; @@ -47,6 +47,8 @@ extern "C" unsigned int hc_decompress_rar (unsigned char *Win, unsigned char *In Unp.DoUnpack (METHOD, SOLID); // sets output + *unpack_failed = (Unp.WrittenFileSize != UnpackSize); + unsigned int crc32 = (unsigned int) DataIO.UnpHash.GetCRC32 (); return crc32; diff --git a/deps/unrar/unpack.hpp b/deps/unrar/unpack.hpp index 3e23cd320..769fac467 100644 --- a/deps/unrar/unpack.hpp +++ b/deps/unrar/unpack.hpp @@ -279,7 +279,6 @@ class Unpack:PackDef bool Suspended; bool UnpAllBuf; bool UnpSomeRead; - int64 WrittenFileSize; bool FileExtracted; @@ -389,6 +388,8 @@ class Unpack:PackDef void UnpackDecode(UnpackThreadData &D); #endif + int64 WrittenFileSize; + byte *hcwin; byte *hcppm; diff --git a/deps/yescrypt-master/CHANGES b/deps/yescrypt-master/CHANGES new file mode 100644 index 000000000..e1dc1e2e8 --- /dev/null +++ b/deps/yescrypt-master/CHANGES @@ -0,0 +1,200 @@ + Changes made since 1.1.0 (2019/06/30). + +Use AVX512VL XOP-like bit rotates for faster Salsa20 on supporting CPUs. + +Implemented a little-known SHA-2 Maj() optimization proposed by Wei Dai. + +Minor code cleanups and documentation updates. + + + Changes made between 1.0.3 (2018/06/13) and 1.1.0 (2019/06/30). + +Merged yescrypt-opt.c and yescrypt-simd.c into one source file, which is +a closer match to -simd but is called -opt (and -simd is now gone). +With this change, performance of SIMD builds should be almost unchanged, +while scalar builds should be faster than before on register-rich 64-bit +architectures but may be slower than before on register-starved 32-bit +architectures (this shortcoming may be addressed later). This also +happens to make SSE prefetch available even in otherwise-scalar builds +and it paves the way for adding SIMD support on big-endian architectures +(previously, -simd assumed little-endian). + +Added x32 ABI support (x86-64 with 32-bit pointers). + + + Changes made between 1.0.2 (2018/06/06) and 1.0.3 (2018/06/13). + +In SMix1, optimized out the indexing of V for the sequential writes. + + + Changes made between 1.0.1 (2018/04/22) and 1.0.2 (2018/06/06). + +Don't use MAP_POPULATE anymore because new multi-threaded benchmarks on +RHEL6'ish and RHEL7'ish systems revealed that it sometimes has adverse +effect far in excess of its occasional positive effect. + +In the SIMD code, we now reuse the same buffer for BlockMix_pwxform's +input and output in SMix2. This might slightly improve cache hit rate +and thus performance. + +Also in the SIMD code, a compiler memory barrier has been added between +sub-blocks to ensure that none of the writes into what was S2 during +processing of the previous sub-block are postponed until after a read +from S0 or S1 in the inline asm code for the current sub-block. This +potential problem was never observed so far due to other constraints +that we have, but strictly speaking those constraints were insufficient +to guarantee it couldn't occur. + + + Changes made between 1.0.0 (2018/03/09) and 1.0.1 (2018/04/22). + +The included documentation has been improved, most notably adding new +text files PARAMETERS (guidelines on parameter selection, and currently +recommended parameter sets by use case) and COMPARISON (comparison to +scrypt and Argon2). + +Code cleanups have been made, including removal of AVX2 support, which +was deliberately temporarily preserved for the 1.0.0 release, but which +almost always hurt performance with currently recommended low-level +yescrypt parameters on Intel & AMD CPUs tested so far. (The low-level +parameters are chosen with consideration for relative performance of +defensive vs. offensive implementations on different hardware, and not +only for seemingly best performance on CPUs. It is possible to change +them such that AVX2 would be worthwhile, and this might happen in the +future, but currently this wouldn't be obviously beneficial overall.) + + + Changes made between 0.8.1 (2015/10/25) and 1.0.0 (2018/03/09). + +Hash string encoding has been finalized under the "$y$" prefix for both +native yescrypt and classic scrypt hashes, using a new variable-length +and extremely compact encoding of (ye)scrypt's many parameters. (Also +still recognized under the "$7$" prefix is the previously used encoding +for classic scrypt hashes, which is fixed-length and not so compact.) + +Optional format-preserving salt and hash (re-)encryption has been added, +using the Luby-Rackoff construction with SHA-256 as the PRF. + +Support for hash upgrades has been temporarily excluded to allow for its +finalization at a later time and based on actual needs (e.g., will 3x +ROM size upgrades be in demand now that Intel went from 4 to 6 memory +channels in their server CPUs, bringing a factor of 3 into RAM sizes?) + +ROM initialization has been sped up through a new simplified algorithm. + +ROM tags (magic constant values) and digests (values that depend on the +entire computation of the ROM contents) have been added to the last +block of ROM. (The placement of these tags/digests is such that nested +ROMs are possible, to allow for ROM size upgrades later.) + +The last block of ROM is now checked for the tag and is always used for +hash computation before a secret-dependent memory access is first made. +This ensures that hashes won't be computed with a partially initialized +ROM or with one initialized using different machine word endianness, and +that they will be consistently miscomputed if the ROM digest is other +than what the caller expected. This in turn helps early detection of +problems with ROM initialization even if the calling application fails +to check for them. This also helps mitigate cache-timing attacks when +the attacker doesn't know the contents of the last block of ROM. + +Many implementation changes have been made, such as for performance, +portability, security (intentional reuse and thus rewrite of memory +where practical and optional zeroization elsewhere), and coding style. +This includes addition of optional SSE2 inline assembly code (a macro +with 8 instructions) to yescrypt-simd.c, which tends to slightly +outperform compiler-generated code, including AVX(2)-enabled code, for +yescrypt's currently recommended settings. This is no surprise since +yescrypt was designed to fit the 64-bit mode extended SSE2 instruction +set perfectly (including SSE2's lack of 3-register instructions), so for +its optimal implementation AVX would merely result in extra instruction +prefixes and not provide any benefit (except for the uses of Salsa20 +inherited from scrypt, but those are infrequent). + +The auxiliary files inherited from scrypt have been sync'ed with scrypt +1.2.1, and the implementation of PBKDF2 has been further optimized, +especially for its use in (ye)scrypt where the "iteration count" is 1 +but the output size is relatively large. (The speedup is measurable at +realistically low settings for yescrypt, such as at 2 MiB of memory.) + +The included tests have been revised and test vectors regenerated to +account for the ROM initialization/use updates and hash (re-)encryption. + +The PHC test vectors have been compacted into a single SHA-256 hash of +the expected output of phc.c, but have otherwise remained unchanged as +none of the incompatible changes have affected the subset of yescrypt +exposed via the PHS() interface for the Password Hashing Competition. + +The specification document and extra programs that were included with +the PHC submission and its updates are now excluded from this release. + +The rest of documentation files have been updated for the 1.0.0 release. + + + Changes made between 0.7.1 (2015/01/31) and 0.8.1 (2015/10/25). + +pwxform became stateful, through writes to its S-boxes. This further +discourages TMTO attacks on yescrypt as a whole, as well as on pwxform +S-boxes separately. It also increases the total size of the S-boxes by +a factor of 1.5 (8 KiB to 12 KiB by default) and it puts the previously +mostly idle L1 cache write ports on CPUs to use. + +Salsa20/8 in BlockMix_pwxform has been replaced with Salsa20/2. + +An extra HMAC-SHA256 update of the password buffer (which is eventually +passed into the final PBKDF2 invocation) is now performed right after +the pwxform S-boxes initialization. + +Nloop_rw rounding has been adjusted to be the same as Nloop_all's. +This avoids an unnecessary invocation of SMix2 with Nloop = 2, which +would otherwise have occurred in some cases. + +t is now halved per hash upgrade (rather than reset to 0 right away on +the very first upgrade, like it was in 0.7.1). + +Minor corrections and improvements to the specification and the code +have been made. + + + Changes made between 0.6.4 (2015/01/30) and 0.7.1 (2015/01/31). + +The YESCRYPT_PARALLEL_SMIX and YESCRYPT_PWXFORM flags have been removed, +with the corresponding functionality enabled along with the YESCRYPT_RW +flag. This change has simplified the SIMD implementation a little bit +(eliminating specialized code for some flag combinations that are no +longer possible), and it should help simplify documentation, analysis, +testing, and benchmarking (fewer combinations of settings to test). + +Adjustments to pre- and post-hashing have been made to address subtle +issues and non-intuitive behavior, as well as in some cases to reduce +impact of garbage collector attacks. + +Support for hash upgrades has been added (the g parameter). + +Extra tests have been written and test vectors re-generated. + + + Changes made between 0.5.2 (2014/03/31) and 0.6.4 (2015/01/30). + +Dropped support for ROM access frequency mask since it made little sense +when supporting only one ROM at a time. (It'd make sense with two ROMs, +for simultaneous use of a ROM-in-RAM and a ROM-on-SSD. With just one +ROM, the mask could still be used for a ROM-on-SSD, but only in lieu of +a ROM-in-RAM, which would arguably be unreasonable.) + +Simplified the API by having it accept NULL for the "shared" parameter +to indicate no ROM in use. (Previously, a dummy "shared" structure had +to be created.) + +Completed the specification of pwxform, BlockMix_pwxform, Salsa20 SIMD +shuffling, and potential endianness conversion. (No change to these has +been made - they have just been specified in the included document more +completely.) + +Provided rationale for the default compile-time settings for pwxform. + +Revised the reference and optimized implementations' source code to more +closely match the current specification document in terms of identifier +names, compile-time constant expressions, source code comments, and in +some cases the ordering of source code lines. None of these changes +affect the computed hash values, hence the test vectors have remained +the same. diff --git a/deps/yescrypt-master/COMPARISON b/deps/yescrypt-master/COMPARISON new file mode 100644 index 000000000..05a9d570e --- /dev/null +++ b/deps/yescrypt-master/COMPARISON @@ -0,0 +1,129 @@ + Comparison of yescrypt to scrypt and Argon2. + +yescrypt's advantages: + + + Greater resistance to offline attacks (increasing attacker's cost at + same defender's cost) + + + yescrypt supports optional ROM for protection from use of botnet + nodes (and other relatively small memory devices) + + + yescrypt has a dependency not only on RAM and maybe ROM, but + also on fast on-die local memory (such as a CPU's L1 or L2 cache), + which provides bcrypt-like anti-GPU properties even at very low + per-hash RAM sizes (where scrypt and Argon2 are more likely to lose + to bcrypt in terms of GPU attack speed) and even without ROM + + + yescrypt and scrypt currently have little low-level + parallelism within processing of a block (yescrypt allows for + tuning this later, scrypt does not), whereas Argon2 has a fixed and + currently commonly excessive amount of such parallelism, which may + be extracted to speed up e.g. GPU attacks through use of more + computing resources per the same total memory size due to each hash + computation's memory needs being split between 32 threads (yescrypt + currently has four 16-byte lanes that can be processed in parallel + within a 64-byte sub-block before running into a data dependency + for the next sub-block, whereas Argon2 allows for parallel + processing of eight 128-byte chunks within a 1 KiB block with only + two synchronization points for the entire block, as well as of four + 32-byte parts of the 128-byte chunks with only two more + synchronization points for the entire 1 KiB block) + + + yescrypt uses computation latency hardening based on integer + multiplication and local memory access speed, which ties its + per-hash RAMs up for a guaranteed minimum amount of time regardless + of possibly much higher memory bandwidth on the attacker's + hardware, whereas Argon2 uses only the multiplications and performs + 6 times fewer of those sequentially (96 sequential multiplications + per 1 KiB for yescrypt vs. 16 per 1 KiB for Argon2, providing + correspondingly different minimum time guarantees) and scrypt does + not use this technique at all (but is no worse than Argon2 in this + respect anyway due to having less low-level parallelism) + + + yescrypt and Argon2 are time-memory trade-off (TMTO) resistant + (thus, computing them in less memory takes disproportionately + longer), whereas scrypt is deliberately TMTO-friendly (and + moreover, computing it in less memory takes up to 4x less than + proportionately longer) + + + Extra optional built-in features + + + Hash encryption so that the hashes are not crackable without + the key (to be stored separately) + + + Hash upgrade to higher settings without knowledge of password + (temporarily removed from 1.0, to be re-added later) + + + SCRAM-like client-side computation of challenge responses + (already part of the algorithm, not yet exposed via the API) + + + yescrypt's and Argon2's running time is tunable on top of + memory usage and parallelism, unlike in scrypt's + + + Cryptographic security provided by NIST-approved primitives + + + (ye)scrypt's cryptographic security is provided by SHA-256, + HMAC, and PBKDF2, which are NIST-approved and time-tested (the rest + of yescrypt's processing, while most crucial for its offline attack + resistance properties, provably does not affect its basic + cryptographic hash properties), whereas Argon2 relies on the newer + BLAKE2 (either choice is just fine for security, but use of + approved algorithms may sometimes be required for compliance) + + + SHA-256, HMAC, PBKDF2, and scrypt are usable from the same codebase + +yescrypt's drawbacks: + + - Complex (higher risk of human error occurring and remaining + unnoticed for long) + + - Cache-timing unsafe (like bcrypt, scrypt, and Argon2d, but + unlike Argon2i) + + - Not the PHC winner (Argon2 is), but is merely a "special recognition" + + - Supported in fewer third-party projects (as of this writing, there's + yescrypt support in libxcrypt, Linux-PAM, shadow, and mkpasswd) + +Other observations: + + * yescrypt's complexity is related to its current primary target use + case (mass user authentication) and is relatively small compared to + the total complexity of the authentication service, so the risk may + be justified + + * Cache-timing safety is unimportant on dedicated servers, is + mitigated for some use cases and threat models by proper use of + salts, and is fully achieved in Argon2 only in its 2i flavor and only + through reduction of resistance to the usual offline attacks compared + to the 2d flavor + + * yescrypt's single-threaded memory filling speed on an otherwise + idle machine and at our currently recommended settings is lower than + Argon2's, but that's a result of our deliberate tuning (there's a + knob to change that, but we don't recommend doing so) preventing + yescrypt from bumping into memory access speed prematurely, and is + irrelevant for determining server request rate capacity and maximum + response latency where multiple instances or threads would be run + (under that scenario, the algorithms deliver similar speeds) + + * yescrypt has been designed and currently configured to fit the + SSE2 and NEON instruction sets and 128-bit SIMD perfectly, not + benefiting from AVX's 3-register instructions (unlike classic scrypt, + which doesn't fit SSE2 as perfectly and thus benefits from AVX and + XOP) nor from AVX2's and AVX-512's wider SIMD (although it can be + reconfigured for wider SIMD later), whereas Argon2 significantly + benefits from those at least when running fewer threads or concurrent + instances than are supported by the hardware (yet yescrypt's SSE2 + code is competitive with Argon2's AVX2 code under full server load) + + * yescrypt vs. Argon2 benchmarks are further complicated by these + two schemes having different minimum amount of processing over memory + (yescrypt's is 4/3 of Argon2's), and thus different average memory + usage (5/8 of peak for yescrypt t=0 vs. 1/2 of peak for Argon2 t=1), + which needs to be taken into account + + * scrypt benchmarks are also different in amount of processing over + memory (twice Argon2's minimum) and average memory usage (3/4 of + peak), but that's even further complicated by scrypt's + TMTO-friendliness providing up to a 4x advantage to some attackers diff --git a/deps/yescrypt-master/Makefile b/deps/yescrypt-master/Makefile new file mode 100644 index 000000000..7abea8d62 --- /dev/null +++ b/deps/yescrypt-master/Makefile @@ -0,0 +1,85 @@ +# Copyright 2013-2018 Alexander Peslyak +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +CC = gcc +LD = $(CC) +RM = rm -f +OMPFLAGS = -fopenmp +OMPFLAGS_MAYBE = $(OMPFLAGS) +#CFLAGS = -Wall -O2 -fomit-frame-pointer $(OMPFLAGS_MAYBE) -DSKIP_MEMZERO +CFLAGS = -Wall -O2 -march=native -fomit-frame-pointer $(OMPFLAGS_MAYBE) -DSKIP_MEMZERO +#CFLAGS = -Wall -O2 -funroll-loops -fomit-frame-pointer $(OMPFLAGS_MAYBE) -DSKIP_MEMZERO +#CFLAGS = -Wall -O2 -march=native -funroll-loops -fomit-frame-pointer $(OMPFLAGS_MAYBE) -DSKIP_MEMZERO +# -lrt is for userom's use of clock_gettime() +LDFLAGS = -s -lrt $(OMPFLAGS_MAYBE) + +PROJ = tests phc-test initrom userom +OBJS_CORE = yescrypt-opt.o +OBJS_COMMON = yescrypt-common.o sha256.o insecure_memzero.o +OBJS_TESTS = $(OBJS_CORE) $(OBJS_COMMON) tests.o +OBJS_PHC = $(OBJS_CORE) $(OBJS_COMMON) phc-test.o +OBJS_INITROM = $(OBJS_CORE) $(OBJS_COMMON) initrom.o +OBJS_USEROM = $(OBJS_CORE) $(OBJS_COMMON) userom.o +OBJS_RM = yescrypt-*.o + +all: $(PROJ) + +check: tests phc-test + @echo 'Running main tests' + @time ./tests | tee TESTS-OUT + @diff -U0 TESTS-OK TESTS-OUT && echo PASSED || echo FAILED + @if [ -e PHC-TEST-OK-SHA256 ]; then \ + echo 'Running PHC tests'; \ + time ./phc-test > PHC-TEST-OUT; \ + sha256sum -c PHC-TEST-OK-SHA256; \ + fi + +ref: + $(MAKE) $(PROJ) OBJS_CORE=yescrypt-ref.o + +check-ref: + $(MAKE) check OBJS_CORE=yescrypt-ref.o + +tests: $(OBJS_TESTS) + $(LD) $(LDFLAGS) $(OBJS_TESTS) -o $@ + +phc-test.o: phc.c + $(CC) -c $(CFLAGS) -DTEST phc.c -o $@ + +phc-test: $(OBJS_PHC) + $(LD) $(LDFLAGS) $(OBJS_PHC) -o $@ + +initrom: $(OBJS_INITROM) + $(LD) $(LDFLAGS) $(OBJS_INITROM) -o $@ + +userom: $(OBJS_USEROM) + $(LD) $(LDFLAGS) $(OMPFLAGS) $(OBJS_USEROM) -o $@ + +userom.o: userom.c + $(CC) -c $(CFLAGS) $(OMPFLAGS) $*.c + +.c.o: + $(CC) -c $(CFLAGS) $*.c + +yescrypt-opt.o: yescrypt-platform.c + +clean: + $(RM) $(PROJ) + $(RM) $(OBJS_TESTS) $(OBJS_PHC) $(OBJS_INITROM) $(OBJS_USEROM) + $(RM) $(OBJS_RM) + $(RM) TESTS-OUT PHC-TEST-OUT diff --git a/deps/yescrypt-master/PARAMETERS b/deps/yescrypt-master/PARAMETERS new file mode 100644 index 000000000..d9f5d24e6 --- /dev/null +++ b/deps/yescrypt-master/PARAMETERS @@ -0,0 +1,196 @@ + Optimal yescrypt configuration. + +yescrypt is very flexible, but configuring it optimally is complicated. +Here are some guidelines to simplify near-optimal configuration. We +start by listing the parameters and their typical values, and then give +currently recommended parameter sets by use case. + + + Parameters and their typical values. + +Set flags (yescrypt flavor) to YESCRYPT_DEFAULTS to use the currently +recommended flavor. (Other flags values exist for compatibility and for +specialized cases where you think you know what you're doing.) + +Set N (block count) based on target memory usage and running time, as +well as on the value of r (block size in 128 byte units). N must be a +power of two. + +Set r (block size) to 8 (so that N is in KiB, which is convenient) or to +another small value (if more optimal or for fine-tuning of the total +size and/or running time). Reasonable values for r are from 8 to 96. + +Set p (parallelism) to 1 meaning no thread-level parallelism within one +computation of yescrypt. (Use of thread-level parallelism within +yescrypt makes sense for ROM initialization and for key derivation at +high memory usage, but usually not for password hashing where +parallelism is available through concurrent authentication attempts. +Don't use p > 1 unnecessarily.) + +Set t (time) to 0 to use the optimal running time for a given memory +usage. This will allow you to maximize the memory usage (the value of +N*r) while staying within your running time constraints. (Non-zero t +makes sense in specialized cases where you can't afford higher memory +usage but can afford more time.) + +Set g (upgrades) to 0 because there have been no hash upgrades yet. + +Set NROM (block count of ROM) to 0 unless you use a ROM (see below). +NROM must be a power of two. + + + Password hashing for user authentication, no ROM. + +Small and fast (memory usage 2 MiB, performance like bcrypt cost 2^5 - +latency 2-3 ms and throughput 10,000+ per second on a 16-core server): + +flags = YESCRYPT_DEFAULTS, N = 2048, r = 8, p = 1, t = 0, g = 0, NROM = 0 + +Large and slow (memory usage 16 MiB, performance like bcrypt cost 2^8 - +latency 10-30 ms and throughput 1000+ per second on a 16-core server): + +flags = YESCRYPT_DEFAULTS, N = 4096, r = 32, p = 1, t = 0, g = 0, NROM = 0 + +Of course, even heavier and slower settings are possible, if affordable. +Simply double the value of N as many times as needed. Since N must be a +power of two, you may use r (in the range of 8 to 32) or/and t (in the +range of 0 to 2) for fine-tuning the running time, but first bring N to +the maximum you can afford. If this feels too complicated, just use one +of the two parameter sets given above (preferably the second) as-is. + + + Password hashing for user authentication, with ROM. + +It's similar to the above, except that you need to adjust r, set NROM, +and initialize the ROM. + +First decide on a ROM size, such as making it a large portion of your +dedicated authentication servers' RAM sizes. Since NROM (block count) +must be a power of two, you might need to choose r (block size) based on +how your desired ROM size corresponds to a power of two. Also tuning +for performance on current hardware, you'll likely end up with r in the +range from slightly below 16 to 32. For example, to use 15/16 of a +server's 256 GiB RAM as ROM (thus, making it 240 GiB), you could use +r=15 or r=30. To use 23/24 of a server's 384 GiB RAM as ROM (thus, +making it 368 GiB), you'd use r=23. Then set NROM to your desired ROM +size in KiB divided by 128*r. Note that these examples might (or might +not) be too extreme, leaving little memory for the rest of the system. +You could as well opt for 7/8 with r=14 or 11/12 with r=11 or r=22. + +Note that higher r may make placing of ROM in e.g. NVMe flash memory +instead of in RAM more reasonable (or less unreasonable) than it would +have been with a lower r. If this is a concern as it relates to +possible attacks and you do not intend to ever do it defensively, you +might want to keep r lower (e.g., prefer r=15 over r=30 in the example +above, even if 30 performs slightly faster). + +Your adjustments to r, if you deviate from powers of two, will also +result in weirder memory usage per hash. Like 1.75 MiB at r=14 instead +of 2 MiB at r=8 that you would have used without a ROM. That's OK. + +For ROM initialization, which you do with yescrypt_init_shared(), use +the same r and NROM that you'd later use for password hashing, choose p +based on your servers' physical and/or logical CPU count (maybe +considering eventual upgrades as you won't be able to change this later, +but without going unnecessarily high - e.g., p=28, p=56, or p=112 make +sense on servers that currently have 28 physical / 56 logical CPUs), and +set the rest of the parameters to: + +flags = YESCRYPT_DEFAULTS, N = 0, t = 0, g = 0 + +N is set to 0 because it isn't relevant during ROM initialization (you +can use different values of N for hashing passwords with the same ROM). + +To keep the ROM in e.g. SysV shared memory and reuse it across your +authentication service restarts, you'd need to allocate the memory and +set the flags to "YESCRYPT_DEFAULTS | YESCRYPT_SHARED_PREALLOCATED". + +For actual password hashing, you'd use your chosen values for N, r, +NROM, and set the rest of the parameters to: + +flags = YESCRYPT_DEFAULTS, p = 1, t = 0, g = 0 + +Note that although you'd use a large p for ROM initialization, you +should use p=1 for actual password hashing like you would without a ROM. + +Do not forget to pass the ROM into the actual password hashing (and keep +r and NROM set accordingly). + +Since N must be a power of two and r is dependent on ROM size, you may +use t (in the range of 0 to 2) for fine-tuning the running time, but +first bring N to the maximum you can afford. + +If this feels too complicated, or even if it doesn't, please consider +engaging Openwall for your yescrypt deployment. We'd be happy to help. + + + Password-based key derivation. + +(Or rather passphrase-based.) + +Use settings similar to those for password hashing without a ROM, but +adjusted for higher memory usage and running time, and optionally with +thread-level parallelism. + +Small and fast (memory usage 128 MiB, running time under 100 ms on a +fast desktop): + +flags = YESCRYPT_DEFAULTS, N = 32768, r = 32, p = 1, t = 0, g = 0, NROM = 0 + +Large and fast (memory usage 1 GiB, running time under 200 ms on a fast +quad-core desktop not including memory allocation overhead, under 250 ms +with the overhead included), but requires build with OpenMP support (or +otherwise will run as slow as yet be weaker than its p=1 alternative): + +flags = YESCRYPT_DEFAULTS, N = 262144, r = 32, p = 4, t = 0, g = 0, NROM = 0 + +Large and slower (memory usage 1 GiB, running time under 300 ms on a +fast quad-core desktop not including memory allocation overhead, under +350 ms with the overhead included), also requires build with OpenMP +support (or otherwise will run slower than the p=1 alternative below): + +flags = YESCRYPT_DEFAULTS, N = 262144, r = 32, p = 4, t = 2, g = 0, NROM = 0 + +Large and slow (memory usage 1 GiB, running time under 600 ms on a fast +desktop not including memory allocation overhead, under 650 ms with the +overhead included): + +flags = YESCRYPT_DEFAULTS, N = 262144, r = 32, p = 1, t = 0, g = 0, NROM = 0 + +Just like with password hashing, even heavier and slower settings are +possible, if affordable, and you achieve them by adjusting N, r, t in +the same way and in the same preferred ranges (please see the section on +password hashing without a ROM, above). Unlike with password hashing, +it makes some sense to go above t=2 if you expect that your users might +not be able to afford more memory but can afford more time. However, +increasing the memory usage provides better protection, and we don't +recommend forcing your users to wait for more than 1 second as they +could as well type more characters in that time. If this feels too +complicated, just use one of the above parameter sets as-is. + + + Amortization of memory allocation overhead. + +It takes a significant fraction of yescrypt's total running time to +allocate memory from the operating system, especially considering that +the kernel zeroizes the memory before handing it over to your program. + +Unless you naturally need to compute yescrypt just once per process, you +may achieve greater efficiency by fully using advanced yescrypt APIs +that let you preserve and reuse the memory allocation across yescrypt +invocations. This is done by reusing the structure pointed to by the +"yescrypt_local_t *local" argument of yescrypt_r() or yescrypt_kdf() +without calling yescrypt_free_local() inbetween the repeated invocations +of yescrypt. + + + YESCRYPT_DEFAULTS macro. + +Please note that the value of the YESCRYPT_DEFAULTS macro might change +later, so if you use the macro like it's recommended here then for +results reproducible across versions you might need to store its value +somewhere along with the hashes or the encrypted data. + +If you use yescrypt's standard hash string encoding, then yescrypt +already encodes and decodes this value for you, so you don't need to +worry about this. diff --git a/deps/yescrypt-master/PERFORMANCE b/deps/yescrypt-master/PERFORMANCE new file mode 100644 index 000000000..7d303d395 --- /dev/null +++ b/deps/yescrypt-master/PERFORMANCE @@ -0,0 +1,206 @@ +Although yescrypt is usable for a variety of purposes (password hashing, +KDF, PoW) and is extremely scalable (from 1 CPU core to many, from +kilobytes to terabytes and beyond) while achieving good security +properties across this whole range of use cases and settings, at this +time we're primarily targeting the mass user authentication use case. +Hence, this is what the setup and benchmarks shown in here focus on. + +The test system is a server (kindly provided by Packet.net) with dual +Xeon Gold 5120 CPUs (2.2 GHz, turbo to up to 3.2 GHz) and 384 GiB RAM +(12x DDR4-2400 ECC Reg). These CPUs have 14 cores and 6 memory channels +each, for a total of 28 physical cores, 56 logical CPUs (HT is enabled), +and 12 memory channels. The OS is Ubuntu 17.10 with kernel +"4.13.0-25-generic #29-Ubuntu SMP Mon Jan 8 21:14:41 UTC 2018 x86_64" +and compiler "gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0". + +First, we need to configure the Linux system, as root. Grant our user +account's group the privilege to access "huge pages" (2 MiB or 1 GiB as +opposed to x86's default 4 KiB pages): + +# sysctl -w vm.hugetlb_shm_group=1000 + +(You may need to replace the "1000" with your user account's actual +group id.) + +Disable swap, so that it doesn't get in the way: + +# swapoff -a + +Let processes allocate shared memory segments of up to 368 GiB each, and +up to 369 GiB total for the system: + +# sysctl -w kernel.shmmax=395136991232 +# sysctl -w kernel.shmall=396210733056 + +(The allowance for an extra gigabyte is in case any processes unrelated +to ours make use of SysV shared memory as well.) + +Preallocate the 368 GiB and 2 GiB more (to be potentially used for +threads' "RAM" lookup tables), thus 370 GiB total, into huge pages (this +will only work when existing memory allocations aren't too fragmented +yet, so is normally to be performed right upon system bootup): + +# sysctl -w vm.nr_hugepages=189440 + +Check that the preallocation has succeeded by examining /proc/meminfo: + +# grep ^Huge /proc/meminfo +HugePages_Total: 189440 +HugePages_Free: 189440 + +(If the memory were too fragmented, this would show lower numbers, which +would be problematic - worse than no use of huge pages at all.) + +This is quite extreme. Although it sort of leaves 14 GiB free (as the +difference between 370 GiB and the physical RAM of 384 GiB), in practice +on our test system only less than 5 GiB remains allocatable by user +processes after this point. For actual use, you might consider using a +slightly lower fraction (than 23/24 that we're targeting here) of total +memory for yescrypt ROM, or/and not pre-allocating any huge pages for +the RAMs (especially if they won't be used that way anyway, which +depends on the HUGEPAGE_THRESHOLD setting in yescrypt-platform.c - +currently at 32 MiB). + +Now initialization of the ROM is possible, and we can work as non-root +from this point on: + +$ GOMP_CPU_AFFINITY=0-55 time ./initrom 368 1 +r=23 N=2^9 NROM=2^27 +Will use 385875968.00 KiB ROM + 1472.00 KiB RAM +Initializing ROM ... DONE (98764b03) +'$y$j6K5O$LdJMENpBABJJ3hIHjB1Bi.$VtHhEYlX3mDbxmXUUYt9Xldf.2R5/G0E/tMioNUQ/F8' +1058.64user 163.70system 0:22.04elapsed 5544%CPU (0avgtext+0avgdata 4692maxresident)k +0inputs+0outputs (0major+193094minor)pagefaults 0swaps + +It took 22 seconds to initialize our 368 GiB ROM, and now we may hash +passwords from another process (this may be the authentication service): + +$ GOMP_CPU_AFFINITY=0-55 ./userom 368 1 +r=23 N=2^9 NROM=2^27 +Will use 385875968.00 KiB ROM + 1472.00 KiB RAM +Plaintext: '$y$j6K5O$LdJMENpBABJJ3hIHjB1Bi.$VtHhEYlX3mDbxmXUUYt9Xldf.2R5/G0E/tMioNUQ/F8' +Encrypted: '$y$j6K5O$LdJMENpBABJJ3hIHjB1Bi.$LZropFwwbIVeo/8DfHbxg6VhFLkUqdvdNy7L.T8tud.' +Benchmarking 1 thread ... +809 c/s real, 812 c/s virtual (2047 hashes in 2.53 seconds) +Benchmarking 56 threads ... +21307 c/s real, 384 c/s virtual (114632 hashes in 5.38 seconds) +min 1.393 ms, avg 2.591 ms, max 3.628 ms + +$ GOMP_CPU_AFFINITY=0-55 ./userom 368 2 +r=23 N=2^10 NROM=2^27 +Will use 385875968.00 KiB ROM + 2944.00 KiB RAM +Plaintext: '$y$j7K5O$LdJMENpBABJJ3hIHjB1Bi.$ljg0jm5/lpMa98qlF1GeAI9YkqWXSA4KVTGxidC6Gy0' +Encrypted: '$y$j7K5O$LdJMENpBABJJ3hIHjB1Bi.$7X1fd6TFYK5VQOH.7M2dRJMxvFTZbv5d1i7.GwQ/7YC' +Benchmarking 1 thread ... +419 c/s real, 420 c/s virtual (1023 hashes in 2.44 seconds) +Benchmarking 56 threads ... +10248 c/s real, 184 c/s virtual (57288 hashes in 5.59 seconds) +min 2.571 ms, avg 5.413 ms, max 6.704 ms + +$ GOMP_CPU_AFFINITY=0-55 ./userom 368 23 +r=23 N=2^13 NROM=2^27 +Will use 385875968.00 KiB ROM + 23552.00 KiB RAM +Plaintext: '$y$jAK5O$LdJMENpBABJJ3hIHjB1Bi.$UL29LYGiz.rXa6c620meFuqT3IiZmBO0BlW6HenRmA4' +Encrypted: '$y$jAK5O$LdJMENpBABJJ3hIHjB1Bi.$U15LiKcR4vHbUmCbt7SUllXp/jUyNXYOC1I.426Vk80' +Benchmarking 1 thread ... +50 c/s real, 50 c/s virtual (127 hashes in 2.52 seconds) +Benchmarking 56 threads ... +1201 c/s real, 21 c/s virtual (7112 hashes in 5.92 seconds) +min 32.444 ms, avg 46.362 ms, max 48.067 ms + +While using the ROM, we're able to compute over 21k, over 10k, or around +1200 password hashes per second with per-thread RAM sizes of 1.4375 MiB, +2.875 MiB, or 23 MiB, respectively. + +We can also reasonably use yescrypt without a ROM: + +$ GOMP_CPU_AFFINITY=0-55 ./userom 0 2 +r=16 N=2^10 NROM=2^0 +Will use 0.00 KiB ROM + 2048.00 KiB RAM +Plaintext: '$y$j7D$LdJMENpBABJJ3hIHjB1Bi.$MpcIFGNF/2yn.6pugGKCS3k6Js5sbJ7j3qLBBqKLUk4' +Encrypted: '$y$j7D$LdJMENpBABJJ3hIHjB1Bi.$7yuShztNep5CDrsQE9Ms9DkH1zqJzTy8wRiSHozJy.9' +Benchmarking 1 thread ... +828 c/s real, 828 c/s virtual (2047 hashes in 2.47 seconds) +Benchmarking 56 threads ... +21710 c/s real, 388 c/s virtual (114632 hashes in 5.28 seconds) +min 1.679 ms, avg 2.571 ms, max 3.591 ms + +$ GOMP_CPU_AFFINITY=0-55 ./userom 0 4 +r=16 N=2^11 NROM=2^0 +Will use 0.00 KiB ROM + 4096.00 KiB RAM +Plaintext: '$y$j8D$LdJMENpBABJJ3hIHjB1Bi.$dT8UO1PVT6lpQcAuWsreFpgdw9TeYdEkqsCp5syNoL9' +Encrypted: '$y$j8D$LdJMENpBABJJ3hIHjB1Bi.$evEI7SjEM6GKYxcIaNYmanAesDLMRezuOfT4V01aj33' +Benchmarking 1 thread ... +417 c/s real, 417 c/s virtual (1023 hashes in 2.45 seconds) +Benchmarking 56 threads ... +10434 c/s real, 186 c/s virtual (57288 hashes in 5.49 seconds) +min 3.120 ms, avg 5.339 ms, max 6.878 ms + +$ GOMP_CPU_AFFINITY=0-55 ./userom 0 16 +r=16 N=2^13 NROM=2^0 +Will use 0.00 KiB ROM + 16384.00 KiB RAM +Plaintext: '$y$jAD$LdJMENpBABJJ3hIHjB1Bi.$Cap65IlIDN8g9Lh0aVhLLWORQhpwxvh0rhkIB6OOpqC' +Encrypted: '$y$jAD$LdJMENpBABJJ3hIHjB1Bi.$d5Qoew0sKNt63xBRsAxNDhGV52p1jHAFN1/fglibMbA' +Benchmarking 1 thread ... +100 c/s real, 100 c/s virtual (255 hashes in 2.54 seconds) +Benchmarking 56 threads ... +2314 c/s real, 41 c/s virtual (14280 hashes in 6.17 seconds) +min 13.440 ms, avg 24.049 ms, max 25.467 ms + +$ GOMP_CPU_AFFINITY=0-55 ./userom 0 32 +r=16 N=2^14 NROM=2^0 +Will use 0.00 KiB ROM + 32768.00 KiB RAM +Plaintext: '$y$jBD$LdJMENpBABJJ3hIHjB1Bi.$zdJjnnDFSqeRbC8ZUQFZShGpP2gvFCGjAZ01h10dWa9' +Encrypted: '$y$jBD$LdJMENpBABJJ3hIHjB1Bi.$U45EV25V/KtqyetJ7AHsJaeeNTJwvQ3hBG7lokzkyR6' +Benchmarking 1 thread ... +48 c/s real, 49 c/s virtual (127 hashes in 2.61 seconds) +Benchmarking 56 threads ... +1136 c/s real, 20 c/s virtual (7112 hashes in 6.26 seconds) +min 27.844 ms, avg 48.837 ms, max 50.792 ms + +Slightly higher speeds are possible for 4 MiB and higher with larger +yescrypt block size (r=32 instead of r=16, thus 4 KiB blocks instead of +2 KiB blocks benchmarked above). Here they are for 4 MiB, 16 MiB, and +32 MiB, respectively: + +10589 c/s real, 189 c/s virtual (57288 hashes in 5.41 seconds) +min 3.465 ms, avg 5.260 ms, max 6.705 ms + +2462 c/s real, 44 c/s virtual (14280 hashes in 5.80 seconds) +min 13.923 ms, avg 22.638 ms, max 24.042 ms + +1221 c/s real, 21 c/s virtual (7112 hashes in 5.82 seconds) +min 28.909 ms, avg 45.658 ms, max 47.265 ms + +Thus, when not using a ROM we're able to compute over 21k, over 10k, +around 2400, or around 1200 hashes per second with per-thread RAM sizes +of 2 MiB, 4 MiB, 16 MiB, or 32 MiB, respectively. + +The same might not hold on another machine. + +By the way, here's what our SysV shared memory segment looks like: + +$ ipcs -m + +------ Shared Memory Segments -------- +key shmid owner perms bytes nattch status +[...] +0x7965730a 327683 user 640 395136991232 0 + +The 395+ GB size corresponds to 368 GiB. + +To cleanup, let's remove the SysV shared memory segment holding the ROM: + +$ ipcrm -M 0x7965730a + +and free up the preallocated huge pages, as root: + +# sysctl -w vm.nr_hugepages=0 diff --git a/deps/yescrypt-master/PHC-TEST-OK-SHA256 b/deps/yescrypt-master/PHC-TEST-OK-SHA256 new file mode 100644 index 000000000..aab409ae7 --- /dev/null +++ b/deps/yescrypt-master/PHC-TEST-OK-SHA256 @@ -0,0 +1 @@ +05ad49b9d9fb9eb65df78c919c3a778b7952e2e63f2e8ddb6b2b3f4b645e3cd0 PHC-TEST-OUT diff --git a/deps/yescrypt-master/README b/deps/yescrypt-master/README new file mode 100644 index 000000000..f017c6717 --- /dev/null +++ b/deps/yescrypt-master/README @@ -0,0 +1,197 @@ + What is yescrypt? + +yescrypt is a password-based key derivation function (KDF) and password +hashing scheme. It builds upon Colin Percival's scrypt. This +implementation is able to compute native yescrypt hashes as well as +classic scrypt. + +As of this writing, yescrypt is the default password hashing scheme on +recent ALT Linux, Arch Linux, Debian 11+, Fedora 35+, Kali Linux 2021.1+, +and Ubuntu 22.04+. It is also supported in Fedora 29+, RHEL 9+, and +Ubuntu 20.04+, and is recommended for new passwords in Fedora CoreOS. + + + Why yescrypt? + +Like it or not, password authentication remains relevant (including as +one of several authentication factors), password hash database leaks +happen, the leaks are not always detected and fully dealt with right +away, and even once they are many users' same or similar passwords +reused elsewhere remain exposed. To mitigate these risks (as well as +those present in other scenarios where password-based key derivation or +password hashing is relevant), computationally expensive (bcrypt, +PBKDF2, etc.) and more recently also memory-hard (scrypt, Argon2, etc.) +password hashing schemes have been introduced. Unfortunately, at high +target throughput and/or low target latency their memory usage is +unreasonably low, up to the point where they're not obviously better +than the much older bcrypt (considering attackers with pre-existing +hardware). This is a primary drawback that yescrypt addresses. + +Most notable for large-scale deployments is yescrypt's optional +initialization and reuse of a large lookup table, typically occupying +at least tens of gigabytes of RAM and essentially forming a +site-specific ROM. This limits attackers' use of pre-existing hardware +such as botnet nodes. + +yescrypt's other changes from scrypt additionally slow down GPUs and to +a lesser extent FPGAs and ASICs even when its memory usage is low and +even when there's no ROM, and provide extra knobs and built-in features. + +Technically, yescrypt is the most scalable password hashing scheme so +far, providing near-optimal security from offline password cracking +across the whole range from kilobytes to terabytes and beyond. However, +the price for this is complexity, and we recognize that complexity is a +major drawback of any software. Thus, at this time we focus on +large-scale deployments, where the added complexity is relatively small +compared to the total complexity of the authentication service setup. +For smaller deployments, bcrypt with its simplicity and existing library +support is a reasonable short-term choice (although we're making +progress towards more efficient FPGA attacks on bcrypt under a separate +project). We might introduce a cut-down yescrypt-lite later or/and +yescrypt might become part of standard or popular libraries, making it +more suitable for smaller deployments as well. + + + Parameter selection. + +Please refer to PARAMETERS for guidelines on parameter selection and the +currently recommended parameter sets by use case (password hashing with +or without a ROM, and KDF). + + + Performance. + +Please refer to PERFORMANCE for example setup and benchmarks relevant to +the mass user authentication use case. + +The test system is a server (kindly provided by Packet.net) with dual +Xeon Gold 5120 CPUs (2.2 GHz, turbo to up to 3.2 GHz) and 384 GiB RAM +(12x DDR4-2400 ECC Reg). These CPUs have 14 cores and 6 memory channels +each, for a total of 28 physical cores, 56 logical CPUs (HT is enabled), +and 12 memory channels. + +Some highlights: initialization of a 368 GiB ROM takes 22 seconds (to +be done on server bootup), and while using the ROM we're able to compute +over 21k, over 10k, or around 1200 hashes per second with per-hash RAM +usage of 1.4375 MiB, 2.875 MiB, or 23 MiB, respectively. + +When not using a ROM, we're able to compute over 21k, over 10k, or +around 1200 hashes per second with per-hash RAM usage of 2 MiB, 4 MiB, +or 32 MiB, respectively. + + + Comparison to scrypt and Argon2. + +yescrypt's advantages: + + + Greater resistance to offline attacks + + Extra optional built-in features + + Cryptographic security provided by NIST-approved primitives + + SHA-256, HMAC, PBKDF2, and scrypt are usable from the same codebase + +yescrypt's drawbacks: + + - Complex + - Cache-timing unsafe (like scrypt and Argon2d, but unlike Argon2i) + - Not the PHC winner (Argon2 is), but is merely a "special recognition" + - Supported in fewer third-party projects + +Please refer to COMPARISON for a lot more detail and other observations. + + + A note on cryptocurrencies. + +For historical reasons, multiple CPU mining focused cryptocurrencies use +yescrypt 0.5'ish as their proof-of-work (PoW) scheme. We currently have +a separate project for the PoW use case: yespower. Thus, rather than +misuse yescrypt 1.0+ for PoW, those and other projects are advised to +use yespower 1.0+ instead. The yespower homepage is: + + https://www.openwall.com/yespower/ + + + How to test yescrypt for proper operation. + +On a Unix-like system, invoke "make check". This will build and run a +program called "tests", and check its output against the supplied file +TESTS-OK. It will also build a program called "phc-test", and if a file +called PHC-TEST-OK-SHA256 is present will run that program and check its +output against that file's contents. If everything matches, each of +these two sets of tests prints one word "PASSED", so there will be two +such lines among "make check" output, one of them being the final line +of output. + +We do most of our testing on Linux systems with gcc. The supplied +Makefile assumes that you use gcc. + + + ROM in SysV shared memory demo and benchmark. + +Also included with this version of yescrypt are "initrom" and "userom" +demo programs. They're built by simply typing "make". Please refer to +PERFORMANCE for their usage. + + + Alternate code versions and make targets. + +Two implementations of yescrypt are included: reference and optimized. +By default, the optimized implementation is built. Internally, the +optimized implementation uses conditional compilation to choose between +usage of various SIMD instruction sets where supported and scalar code. + +The reference implementation is unoptimized and is very slow, but it has +simpler and shorter source code. Its purpose is to provide a simple +human- and machine-readable specification that implementations intended +for actual use should be tested against. It is deliberately mostly not +optimized, and it is not meant to be used in production. + +Similarly to "make check", there's "make check-ref" to build and test +the reference implementation. There's also "make ref" to build the +reference implementation and have the "initrom" and "userom" programs +use it. + +"make clean" may need to be run between making different builds. + + + Development status. + +This yescrypt distribution is a work-in-progress. Its interfaces other +than crypto_scrypt() are subject to change in future revisions, however +no incompatible changes to the yescrypt algorithm are expected. + + + Credits. + +scrypt has been designed by Colin Percival. yescrypt has been designed +by Solar Designer building upon scrypt. + +The following other people and projects have also indirectly helped make +yescrypt what it is: + + - Bill Cox + - Rich Felker + - Anthony Ferrara + - Christian Forler + - Taylor Hornby + - Dmitry Khovratovich + - Samuel Neves + - Marcos Simplicio + - Ken T Takusagawa + - Jakob Wenzel + - Christian Winnerlein + + - DARPA Cyber Fast Track + - Password Hashing Competition + + + Contact info. + +First, please check the yescrypt homepage for new versions, etc.: + + https://www.openwall.com/yescrypt/ + +If you have anything valuable to add or a non-trivial question to ask, +you may join and post to the yescrypt mailing list (referenced on the +yescrypt homepage above) or contact the maintainer of yescrypt at: + + Solar Designer diff --git a/deps/yescrypt-master/TESTS-OK b/deps/yescrypt-master/TESTS-OK new file mode 100644 index 000000000..ace7fb2ef --- /dev/null +++ b/deps/yescrypt-master/TESTS-OK @@ -0,0 +1,80 @@ +scrypt("", "", 16, 1, 1) = 77 d6 57 62 38 65 7b 20 3b 19 ca 42 c1 8a 04 97 f1 6b 48 44 e3 07 4a e8 df df fa 3f ed e2 14 42 fc d0 06 9d ed 09 48 f8 32 6a 75 3a 0f c8 1f 17 e8 d3 e0 fb 2e 0d 36 28 cf 35 e2 0c 38 d1 89 06 +scrypt("password", "NaCl", 1024, 8, 16) = fd ba be 1c 9d 34 72 00 78 56 e7 19 0d 01 e9 fe 7c 6a d7 cb c8 23 78 30 e7 73 76 63 4b 37 31 62 2e af 30 d9 2e 22 a3 88 6f f1 09 27 9d 98 30 da c7 27 af b9 4a 83 ee 6d 83 60 cb df a2 cc 06 40 +scrypt("pleaseletmein", "SodiumChloride", 16384, 8, 1) = 70 23 bd cb 3a fd 73 48 46 1c 06 cd 81 fd 38 eb fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54 5d a1 f2 d5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9 e6 1e 85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87 +scrypt("pleaseletmein", "SodiumChloride", 1048576, 8, 1) = 21 01 cb 9b 6a 51 1a ae ad db be 09 cf 70 f8 81 ec 56 8d 57 4a 2f fd 4d ab e5 ee 98 20 ad aa 47 8e 56 fd 8f 4b a5 d0 9f fa 1c 6d 92 7c 40 f4 c3 37 30 40 49 e8 a9 52 fb cb f4 5c 6f a7 7a 41 a4 +yescrypt("", "", 0, 16, 1, 1, 0, 0) = 77 d6 57 62 38 65 7b 20 3b 19 ca 42 c1 8a 04 97 f1 6b 48 44 e3 07 4a e8 df df fa 3f ed e2 14 42 fc d0 06 9d ed 09 48 f8 32 6a 75 3a 0f c8 1f 17 e8 d3 e0 fb 2e 0d 36 28 cf 35 e2 0c 38 d1 89 06 +yescrypt("", "", 0, 16, 1, 1, 0, 0) = 77 d6 57 62 38 65 7b 20 +yescrypt("", "", 0, 4, 1, 1, 0, 0) = ef ad 0c 23 31 4c b5 72 bc 3c fb 15 43 da 42 f8 a8 b0 73 00 4c 86 6b 64 ab 50 55 a4 f0 9f a5 f5 71 14 2e bf e7 e0 5a 3b 92 c4 32 f3 1d ea 95 ad 5f 9c 85 4b 64 56 46 2f 4b d0 f7 32 b7 cd c5 49 +yescrypt("", "", 1, 4, 1, 1, 0, 0) = 85 dd a4 8c 9e c9 de 2f 7f 1a e8 b4 df ed a5 1f 8b 6d 56 f3 08 1b e1 a7 c0 83 3b a2 71 9a 36 ab 02 88 5d ae 36 55 7d 34 26 86 b1 7b a7 5f 2c 21 77 92 de 09 70 ab 1d 07 a9 c7 50 93 6d 31 42 6f +yescrypt("", "", 1, 4, 1, 1, 0, 0) = 85 dd a4 8c 9e c9 de 2f +yescrypt("", "", 1, 4, 1, 1, 1, 0) = 4b aa 8c d8 60 8b a9 1f 3e 34 39 d9 ec 4f ae 8f 9f c0 92 d9 ca 22 b7 37 7e 31 ae 5b 9a d7 87 7c 11 68 69 11 62 dd 0e 5e f0 49 e5 70 65 0c be d4 38 4a d6 05 34 fb 0c be d1 9f f3 f0 33 c9 4b 0c +yescrypt("", "", 1, 4, 1, 1, 2, 0) = e6 e8 bb a0 9b 64 12 ff b0 b3 cc 35 e3 7d 0b 78 2a 47 fb aa dc 57 a0 76 d7 c6 cc 2e 70 91 9a 1b 8d 47 38 c4 f8 33 55 69 07 42 d9 be d7 1c 3b 8f b0 d7 eb 08 6a b1 34 c5 e5 57 07 c2 c1 3c 75 ef +yescrypt("", "", 1, 4, 1, 1, 3, 0) = ac d9 a4 20 1c f4 a4 76 ec f7 ba a6 11 3d 86 fb 65 cd 07 10 2b 40 04 e4 f9 d9 9c d3 42 55 a1 08 99 7d 70 ae 0a 64 bf 0a 4d 96 c1 73 ab f8 82 79 c1 a9 4a d9 bd f1 68 ed fb bd 90 f6 6e d5 c8 0d +yescrypt("", "", 1, 4, 1, 1, 3, 0) = ac d9 a4 20 1c f4 a4 76 ec f7 ba a6 11 3d 86 fb 65 cd 07 10 2b 40 04 e4 f9 d9 9c d3 42 55 a1 08 99 +yescrypt("", "", 1, 4, 1, 1, 3, 0) = ac d9 a4 20 1c f4 a4 76 ec f7 ba a6 11 3d 86 fb 65 cd 07 10 2b 40 04 e4 f9 d9 9c d3 42 55 a1 08 +yescrypt("", "", 1, 4, 1, 1, 3, 0) = ac d9 a4 20 1c f4 a4 76 ec f7 ba a6 11 3d 86 fb 65 cd 07 10 2b 40 04 e4 f9 d9 9c d3 42 55 a1 +yescrypt("", "", 1, 4, 1, 1, 3, 0) = ac +yescrypt("", "", 182, 4, 1, 1, 0, 0) = 0c d5 af 76 eb 24 1d f8 11 9a 9a 12 2a e3 69 20 bc c7 f4 14 b9 c0 d5 8f 45 00 80 60 da de 46 b0 c8 09 22 bd cc 16 a3 ab 5d 20 1d 4c 61 40 c6 71 be 1f 75 27 2c a9 04 73 9d 5a d1 ff 67 2b 0c 21 +yescrypt("", "", 182, 4, 1, 1, 0, 0) = 0c d5 af 76 +yescrypt("", "", 182, 4, 1, 1, 1, 0) = 23 b6 ad f0 b6 0c 9a 99 7f 58 58 3d 80 cd a4 8c 63 8c dc 2f 28 9e df 93 a7 08 07 72 5a 0d 35 c4 68 ca 36 2c 55 57 cc 04 b6 81 1e 2e 73 08 41 f5 26 d8 f4 f7 ac fb fa 9e 06 fe 1f 38 3a 71 15 5e +yescrypt("", "", 182, 4, 1, 1, 1, 0) = 23 b6 ad f0 b6 0c 9a 99 7f 58 58 3d 80 cd a4 8c 63 8c dc 2f 28 9e df 93 a7 08 07 72 5a 0d 35 c4 68 +yescrypt("", "", 182, 4, 1, 1, 1, 0) = 23 b6 ad f0 b6 0c 9a 99 7f 58 58 3d 80 cd a4 8c 63 8c dc 2f 28 9e df 93 a7 08 07 72 5a 0d 35 c4 +yescrypt("", "", 182, 4, 1, 1, 1, 0) = 23 b6 ad f0 b6 0c 9a 99 7f 58 58 3d 80 cd a4 8c 63 8c dc 2f 28 9e df 93 a7 08 07 72 5a 0d 35 +yescrypt("", "", 182, 4, 1, 1, 1, 0) = 23 +yescrypt("p", "s", 182, 16, 8, 1, 10, 0) = e1 f9 81 73 3a 94 05 2f cd 7a cb 14 05 df 0b bd e8 e4 99 b6 a1 33 1b 77 59 09 b4 8c 2f 51 6c 40 dc c8 30 16 35 b7 23 7b +yescrypt("p", "s", 1, 16, 8, 1, 10, 0) = 9e 7a 40 97 64 42 84 cf 3b 73 b6 04 50 ff 23 0c dc b6 b1 b1 9b 15 09 ee b4 82 f6 96 c4 f1 c7 05 c0 0f 74 02 16 18 3a 12 +yescrypt("p", "s", 182, 16, 8, 1, 0, 0) = c8 c7 ff 11 22 b0 b2 91 c3 f2 60 89 48 78 2c d6 89 cc 45 57 90 17 aa a5 ff 8b aa 74 a6 32 ec 99 c3 d6 69 30 fb 20 23 bb +yescrypt("p", "s", 1, 16, 8, 1, 0, 0) = 9d d6 36 c2 d0 bb 92 34 52 86 ef da f8 a6 8c fc 1b 4f fd c4 b1 ad ac cc 7d 86 4b 9a 67 87 b8 5d 6a e0 f5 28 0d a8 88 9f +yescrypt("p", "s", 182, 16, 8, 1, 0, 0) = c8 c7 ff 11 22 b0 b2 91 c3 f2 60 89 48 78 2c d6 89 cc 45 57 90 17 aa a5 ff 8b aa 74 a6 32 ec 99 +yescrypt("p", "s", 182, 16, 8, 1, 0, 0) = c8 c7 ff 11 22 b0 b2 91 +'$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.' +Plaintext: '$y$jD5.7$LdJMENpBABJJ3hIHjB1Bi.$HboGM6qPrsK.StKYGt6KErmUYtioHreJd98oIugoNB6' +Encrypted: '$y$jD5.7$BkbiDbyWZnzlLWOAcru671$zLAHafRUyp9n9XZWnltUbj3ULWUtMN4fteTltjWkARC' +Plaintext: '$y$jC4$LdJMENpBABJJ3hIHjB1B$jVg4HoqqpbmQv/NCpin.QCMagJ8o4QX7lXdzvVV0xFC' +Encrypted: '$y$jC4$qiyh2SQgE5vrF3ORvFho$HurI7MuukXHz..TpxrwKuakji/j9VKDh2WVUK4DIsq5' +Plaintext: '$y$/B3.6$LdJMENpBABJJ3hIHjB1$h8sE4hJo.BsdlfJr0.d8bNJNPZymH7Y3kLj4aY1Rfc8' +Encrypted: '$y$/B3.6$YiN5s/dKpjNrdKm9ND0$lBNMoUaAsw.JR0zMq9IBKIi/VPxj7lD7Sg64nB5LFw2' +Plaintext: '$y$/A2$LdJMENpBABJJ3hIHj/$5IEld1eWdmh5lylrqHLF5dvA3ISpimEM9J1Dd05n/.3' +Encrypted: '$y$/A2$TqjvmGXoqnsNU/8Y40$ZB43..7UnMt6ySU7XbpPyvyahahHSkJJgztkLWp6/IC' +Plaintext: '$y$j91.5$LdJMENpBABJJ3hIH$ebKnn23URD5vyLgF9cP2EvVosrUXf7UErGRV0KmC6e6' +Encrypted: '$y$j91.5$bICydADAaInC9UR/$rpsDDkULkr1caCVYV9PNAsiZxijoQ2/gDcbonlowRi7' +Plaintext: '$y$j80$LdJMENpBABJJ3h2$ysXVVJwuaVlI1BWoEKt/Bz3WNDDmdOWz/8KTQaHL1cC' +Encrypted: '$y$j80$fmxyeGYOC34lh19$mm9FRBs0iHLTHfSNznm1kJVchXN4PaS8hoNI6TTAlB7' +Plaintext: '$y$/7/.4$LdJMENpBABJJ3/$lXHleh7bIZMGNtJVxGVrsIWkEIXfBedlfPui/PITflC' +Encrypted: '$y$/7/.4$EuTbL3Wtm3khW0$1jvKQzIcAqYnYxfb4TEs.FeAZ7rLDl5vNQEkPPcj2KC' +Plaintext: '$y$/6.$LdJMENpBABJJ$zQITmYSih5.CTY47x0IuE4wl.b3HzYGKKCSggakaQ22' +Encrypted: '$y$/6.$x0G/jIr053ui$4O.aVGTPptkjx6eXrW8fdvqcPEV28w7a1PSos6CXV31' +Plaintext: '$y$j5..3$LdJMENpBAB3$xi27PTUNd8NsChHeLOz85JFnUOyibRHkWzprowRlR5/' +Encrypted: '$y$j5..3$/nwg3UXJWp/$5jcvDgeotKpaG9IeSJx0fJNSz33JjTYYD4Kwao3Eki5' +Plaintext: '$y$j4/$LdJMENpBA/$tHlkpTQ8V/eEnTVau1uW36T97LIXlfPrEzdeV5SE5K7' +Encrypted: '$y$j4/$yoneNBwae0$uPBnH0yXBCOM5v5BU9qlvUUtUr3QD5btS0upc6sdvf4' +Plaintext: '$y$/3..2$LdJMENpB$tNczXFuNUd3HMqypStCRsEaL4e4KF7ZYLBe8Hbeg0B7' +Encrypted: '$y$/3..2$VD20uHT3$AV5WWaN6bEKRvZlCuurj.mnHMmZmJ9ExQ9HjiReCDwC' +Plaintext: '$y$/2/$LdJMEN3$RRorHhfsw1/P/WR6Aurg4U72e9Q7qt9vFPURdyfiqK8' +Encrypted: '$y$/2/$BYujKJA$fsMwVvFm8r1caFQP.mem3OUuMYBCDGj9CEoDfSwFDLB' +Plaintext: '$y$j2..1$LdJME/$iLEt6kuTwHch6XdCxtTHfsQzYwWFmpUwgl6Ax8RH4d1' +Encrypted: '$y$j2..1$.mZga/$X6GFMkoYPxFapo.3H4LllEjltFapONQcKUOdEd9oPa/' +Plaintext: '$y$j0/$LdJM$k7BXzSDuoGHW56SY3HxROCiA0gWRscZe2aA0q5oHPM0' +Encrypted: '$y$j0/$SkNZ$DQ06H0br45bpE7lGgCD9gOxTMP9SsO6Mt1T9lo5PHz1' +Plaintext: '$y$//..0$Ld3$6BJXezMFxaMiO5wsuoEmztvtCs/79085dZO56ADlV5B' +Encrypted: '$y$//..0$lM1$60gjeUIW/3QidfN6zU9NqB09Ni1NBMfj2VaSZMjDd18' +Plaintext: '$y$///$L/$Rrrkp6OVljrIk0kcwkCDhAiHJiSthh3cKeIGHUW7Z0C' +Encrypted: '$y$///$q.$/.tR4GqigxciLYGoB8fmzudWQR7IzSu9s3dR8wp3VsD' +Plaintext: '$y$j1../$LdJMENpBABJJ3hIHjB1Bi.$L8OQFc8mxJPd7CpUFgkS7KqJM2I9jGXu3BdqX2D.647' +Encrypted: '$y$j1../$BkbiDbyWZnzlLWOAcru671$iicGI2gNZyhimPVgz2VoKrJAB9fWykBN.3Mh0AwEy29' +Plaintext: '$y$j//$LdJMENpBABJJ3hIHjB1B$U8a2MaK.yesqWySK8Owk6PWeWmp/XuagMbpP45q1/q1' +Encrypted: '$y$j//$qiyh2SQgE5vrF3ORvFho$5dD9ick8ugystfp8wa3xbV7ASDux0dpoOh0QJxFuXH5' +'$7$C6..../....SodiumChloride$kBGj9fHznVYFQMEn/qDCfrDevf9YDtcDdKvEqHJLV8D' +'$7$06..../....SodiumChloride$ENlyo6fGw4PCcDBOFepfSZjFUnVatHzCcW55.ZGz3B0' +r=8 N=2^11 NROM=2^18 +Will use 262144.00 KiB ROM + 2048.00 KiB RAM +Initializing ROM ... DONE (696ebab2) +'$y$j8567F$LdJMENpBABJJ3hIHjB1Bi.' +'$y$j8567F$LdJMENpBABJJ3hIHjB1Bi.$4XJGTsv75AjIN60Z31kPN3.86vkCYzIq7LMz2Pb2lC.' +Initializing ROM in preallocated memory ... DONE (696ebab2) +'$y$j8567F$LdJMENpBABJJ3hIHjB1Bi.$4XJGTsv75AjIN60Z31kPN3.86vkCYzIq7LMz2Pb2lC.' +'$y$j8567F$LdJMENpBABJJ3hIHjB1Bi.$K3wFVK9/t3QsjCk/oK2s8dKzzZ4m7QTP8Ms5uywhWv8' +'$y$j8567F$LdJMENpBABJJ3ZIHjB1Bi.$/OnmIkP0UK5OxyxD0Af/V1oL0zWvTLAUWg3Nr0bsFEB' +'$y$j8567F$LdJMENpBABJJ3ZIHjB1Bi.$DskEGULspNduIZVFK5SOK8enlXnSs/vkuXFdi0wkQ1.' +'$y$j/.5I$LdJMENpBABJJ3hIHjB1Bi.$NqCMKxN9Y9Uw821.72ScGDMpyk7U7V51qnHSRPapzW8' diff --git a/deps/yescrypt-master/initrom.c b/deps/yescrypt-master/initrom.c new file mode 100644 index 000000000..fde858cc4 --- /dev/null +++ b/deps/yescrypt-master/initrom.c @@ -0,0 +1,217 @@ +/*- + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define YESCRYPT_FLAGS YESCRYPT_DEFAULTS + +#define ROM_SHM_KEY 0x7965730a +#define ROM_LOCAL_PARAM "change this before use" + +/* Maximum parallelism factor during ROM initialization */ +#define YESCRYPT_PROM_SHM 112 +#define YESCRYPT_PROM_FILE 4 + +//#define USE_HUGEPAGE +//#define DUMP_SHARED + +#include +#include +#include /* for atoi() */ +#include +#include +#include +#include +#include +#include + +#include "yescrypt.h" + +int main(int argc, const char * const *argv) +{ +#if 0 + uint64_t rom_bytes = 112 * (1024ULL*1024*1024); + uint64_t ram_bytes = 1 * (1024ULL*1024); +#else + uint64_t rom_bytes = 3 * (1024ULL*1024*1024); + uint64_t ram_bytes = 2 * (1024ULL*1024); +#endif + uint32_t r, min_r; + uint64_t NROM_log2, N_log2; + int shmid; + yescrypt_shared_t shared; + yescrypt_binary_t *digest; + const char *rom_filename = NULL; + int rom_fd; + + if (argc > 1) + rom_bytes = atoi(argv[1]) * (1024ULL*1024*1024); + if (argc > 2) + ram_bytes = atoi(argv[2]) * (1024ULL*1024); + if (argc > 3) + rom_filename = argv[3]; + + if (!rom_bytes) { + puts("Wrong ROM size requested"); + return 1; + } + + min_r = 9; + if (rom_filename) + min_r = 8 * 256; + + NROM_log2 = 0; + while (((rom_bytes >> NROM_log2) & 0xff) == 0) + NROM_log2++; + r = rom_bytes >> (7 + NROM_log2); + while (r < min_r && NROM_log2 > 0) { + r <<= 1; + NROM_log2--; + } + rom_bytes = (uint64_t)r << (7 + NROM_log2); + + N_log2 = 3; + while (((uint64_t)r << (7 + N_log2)) < ram_bytes) + N_log2++; + ram_bytes = (uint64_t)r << (7 + N_log2); + + printf("r=%u N=2^%u NROM=2^%u\n", r, + (unsigned int)N_log2, (unsigned int)NROM_log2); + + printf("Will use %.2f KiB ROM\n", rom_bytes / 1024.0); + printf(" %.2f KiB RAM\n", ram_bytes / 1024.0); + + shared.aligned_size = rom_bytes; + + if (rom_filename) { + rom_fd = open(rom_filename, O_CREAT|O_RDWR|O_EXCL, + S_IRUSR|S_IRGRP|S_IWUSR); + if (rom_fd < 0) { + perror("open"); + return 1; + } + if (ftruncate(rom_fd, rom_bytes)) { + perror("ftruncate"); + close(rom_fd); + unlink(rom_filename); + return 1; + } + + int flags = +#ifdef MAP_NOCORE + MAP_NOCORE | +#endif +#if defined(MAP_HUGETLB) && defined(USE_HUGEPAGE) + MAP_HUGETLB | +#endif + MAP_SHARED; + void *p = mmap(NULL, rom_bytes, PROT_READ | PROT_WRITE, + flags, rom_fd, 0); +#if defined(MAP_HUGETLB) && defined(USE_HUGEPAGE) + if (p == MAP_FAILED) + p = mmap(NULL, rom_bytes, PROT_READ | PROT_WRITE, + flags & ~MAP_HUGETLB, rom_fd, 0); +#endif + if (p == MAP_FAILED) { + perror("mmap"); + close(rom_fd); + unlink(rom_filename); + return 1; + } + close(rom_fd); + shared.base = shared.aligned = p; + } else { + shmid = shmget(ROM_SHM_KEY, shared.aligned_size, +#ifdef SHM_HUGETLB + SHM_HUGETLB | +#endif + IPC_CREAT|IPC_EXCL | S_IRUSR|S_IRGRP|S_IWUSR); + if (shmid == -1) { +#ifdef SHM_HUGETLB + perror("shmget"); + puts("Retrying without SHM_HUGETLB"); + shmid = shmget(ROM_SHM_KEY, shared.aligned_size, + IPC_CREAT|IPC_EXCL | S_IRUSR|S_IRGRP|S_IWUSR); +#endif + if (shmid == -1) { + perror("shmget"); + return 1; + } + } + + shared.base = shared.aligned = shmat(shmid, NULL, 0); + if (shared.base == (void *)-1) { + int save_errno = errno; + shmctl(shmid, IPC_RMID, NULL); + errno = save_errno; + perror("shmat"); + return 1; + } + } + + printf("Initializing ROM ..."); + fflush(stdout); + yescrypt_params_t rom_params = { + .flags = YESCRYPT_DEFAULTS | YESCRYPT_SHARED_PREALLOCATED, + .NROM = (uint64_t)1 << NROM_log2, + .r = r, + .p = rom_filename ? YESCRYPT_PROM_FILE : YESCRYPT_PROM_SHM }; + if (yescrypt_init_shared(&shared, + (uint8_t *)ROM_LOCAL_PARAM, strlen(ROM_LOCAL_PARAM), + &rom_params)) { + puts(" FAILED"); + if (rom_filename) + unlink(rom_filename); + return 1; + } +#ifdef DUMP_SHARED + fwrite(shared.aligned, shared.aligned_size, 1, stderr); +#endif + digest = yescrypt_digest_shared(&shared); + printf(" DONE (%02x%02x%02x%02x)\n", + digest->uc[0], digest->uc[1], digest->uc[2], digest->uc[3]); + + { + yescrypt_local_t local; + const uint8_t *setting; + uint8_t hash[128]; + + if (yescrypt_init_local(&local)) { + puts("yescrypt_init_local() FAILED"); + return 1; + } + + yescrypt_params_t params = rom_params; + params.flags = YESCRYPT_FLAGS; + params.N = (uint64_t)1 << N_log2; + params.p = 1; + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEKMo34.", 16); + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))); + } + + if (rom_filename && munmap(shared.base, rom_bytes)) { + perror("munmap"); + return 1; + } + + return 0; +} diff --git a/deps/yescrypt-master/insecure_memzero.c b/deps/yescrypt-master/insecure_memzero.c new file mode 100644 index 000000000..d0e8cbad7 --- /dev/null +++ b/deps/yescrypt-master/insecure_memzero.c @@ -0,0 +1,49 @@ +/*- + * Copyright 2014 Colin Percival + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef SKIP_MEMZERO + +#include +#include + +#include "insecure_memzero.h" + +/* Function which does the zeroing. */ +static void +insecure_memzero_func(volatile void * buf, size_t len) +{ + volatile uint8_t * _buf = buf; + size_t i; + + for (i = 0; i < len; i++) + _buf[i] = 0; +} + +/* Pointer to memory-zeroing function. */ +void (* volatile insecure_memzero_ptr)(volatile void *, size_t) = + insecure_memzero_func; + +#endif diff --git a/deps/yescrypt-master/insecure_memzero.h b/deps/yescrypt-master/insecure_memzero.h new file mode 100644 index 000000000..d5a41d157 --- /dev/null +++ b/deps/yescrypt-master/insecure_memzero.h @@ -0,0 +1,69 @@ +/*- + * Copyright 2014 Colin Percival + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _INSECURE_MEMZERO_H_ +#define _INSECURE_MEMZERO_H_ + +#ifdef SKIP_MEMZERO +#define insecure_memzero(buf, len) /* empty */ +#else + +#include + +/* Pointer to memory-zeroing function. */ +extern void (* volatile insecure_memzero_ptr)(volatile void *, size_t); + +/** + * insecure_memzero(buf, len): + * Attempt to zero ${len} bytes at ${buf} in spite of optimizing compilers' + * best (standards-compliant) attempts to remove the buffer-zeroing. In + * particular, to avoid performing the zeroing, a compiler would need to + * use optimistic devirtualization; recognize that non-volatile objects do not + * need to be treated as volatile, even if they are accessed via volatile + * qualified pointers; and perform link-time optimization; in addition to the + * dead-code elimination which often causes buffer-zeroing to be elided. + * + * Note however that zeroing a buffer does not guarantee that the data held + * in the buffer is not stored elsewhere; in particular, there may be copies + * held in CPU registers or in anonymous allocations on the stack, even if + * every named variable is successfully sanitized. Solving the "wipe data + * from the system" problem will require a C language extension which does not + * yet exist. + * + * For more information, see: + * http://www.daemonology.net/blog/2014-09-04-how-to-zero-a-buffer.html + * http://www.daemonology.net/blog/2014-09-06-zeroing-buffers-is-insufficient.html + */ +static inline void +insecure_memzero(volatile void * buf, size_t len) +{ + + (insecure_memzero_ptr)(buf, len); +} + +#endif + +#endif /* !_INSECURE_MEMZERO_H_ */ diff --git a/deps/yescrypt-master/phc.c b/deps/yescrypt-master/phc.c new file mode 100644 index 000000000..ceb5935cc --- /dev/null +++ b/deps/yescrypt-master/phc.c @@ -0,0 +1,145 @@ +/*- + * Copyright 2014-2016,2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define YESCRYPT_FLAGS YESCRYPT_DEFAULTS +#define YESCRYPT_BASE_N 8 +#define YESCRYPT_R 8 +#define YESCRYPT_P 1 + +#include "yescrypt.h" + +#ifdef TEST +static +#endif +int PHS(void *out, size_t outlen, const void *in, size_t inlen, + const void *salt, size_t saltlen, unsigned int t_cost, unsigned int m_cost) +{ + yescrypt_local_t local; + yescrypt_params_t params = { + .flags = YESCRYPT_FLAGS, + .N = (uint64_t)YESCRYPT_BASE_N << m_cost, + .r = YESCRYPT_R, + .p = YESCRYPT_P, + .t = t_cost, + .g = 0 }; + int retval; + + if (yescrypt_init_local(&local)) + return -1; + retval = yescrypt_kdf(NULL, &local, in, inlen, salt, saltlen, ¶ms, + out, outlen); + if (yescrypt_free_local(&local)) + return -1; + return retval; +} + +#ifdef TEST +#include +#include /* for sysconf() */ +#include + +static void print_hex(const uint8_t *buf, size_t buflen, const char *sep) +{ + size_t i; + + putchar('"'); + for (i = 0; i < buflen; i++) + printf("\\x%02x", buf[i]); + printf("\"%s", sep); +} + +static void print_PHS(const void *in, size_t inlen, + const void *salt, size_t saltlen, unsigned int t_cost, unsigned int m_cost) +{ + uint8_t dk[32]; + + printf("PHS("); + print_hex(in, inlen, ", "); + print_hex(salt, saltlen, ", "); + printf("%u, %u) = ", t_cost, m_cost); + + if (PHS(dk, sizeof(dk), in, inlen, salt, saltlen, t_cost, m_cost)) { + puts("FAILED"); + return; + } + + print_hex(dk, sizeof(dk), "\n"); +} + +static void print_all_PHS(unsigned int t_cost, unsigned int m_cost) +{ + clock_t clk_tck = sysconf(_SC_CLK_TCK); + struct tms start_tms, end_tms; + clock_t start = times(&start_tms), end, start_v, end_v; + const size_t count = 0x102; + size_t inlen, i, j; + + inlen = 0; + for (i = 0; i < count; i++) { + uint8_t in[128], salt[16]; + + for (j = 0; j < inlen; j++) + in[j] = (i + j) & 0xff; + for (j = 0; j < sizeof(salt); j++) + salt[j] = ~(i + j) & 0xff; + + print_PHS(in, inlen, salt, sizeof(salt), t_cost, m_cost); + + if (++inlen > sizeof(in)) + inlen = 0; + } + + end = times(&end_tms); + + start_v = start_tms.tms_utime + start_tms.tms_stime + + start_tms.tms_cutime + start_tms.tms_cstime; + end_v = end_tms.tms_utime + end_tms.tms_stime + + end_tms.tms_cutime + end_tms.tms_cstime; + + if (end == start) + end++; + if (end_v == start_v) + end_v++; + + fprintf(stderr, "m_cost=%u (%.0f KiB), t_cost=%u\n" + "%llu c/s real, %llu c/s virtual (%llu hashes in %.2f seconds)\n", + m_cost, (YESCRYPT_BASE_N << m_cost) * YESCRYPT_R / 8.0, t_cost, + (unsigned long long)count * clk_tck / (end - start), + (unsigned long long)count * clk_tck / (end_v - start_v), + (unsigned long long)count, (double)(end - start) / clk_tck); +} + +int main(void) +{ +#if 0 + setvbuf(stdout, NULL, _IOLBF, 0); +#endif + + print_all_PHS(0, 0); + print_all_PHS(0, 7); + print_all_PHS(0, 8); + print_all_PHS(1, 8); + print_all_PHS(2, 8); + print_all_PHS(3, 8); + print_all_PHS(0, 11); + + return 0; +} +#endif diff --git a/deps/yescrypt-master/sha256.c b/deps/yescrypt-master/sha256.c new file mode 100644 index 000000000..1a5372793 --- /dev/null +++ b/deps/yescrypt-master/sha256.c @@ -0,0 +1,652 @@ +/*- + * Copyright 2005-2016 Colin Percival + * Copyright 2016-2018,2021 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include "insecure_memzero.h" +#include "sysendian.h" + +#include "sha256.h" + +#ifdef __ICC +/* Miscompile with icc 14.0.0 (at least), so don't use restrict there */ +#define restrict +#elif __STDC_VERSION__ >= 199901L +/* Have restrict */ +#elif defined(__GNUC__) +#define restrict __restrict +#else +#define restrict +#endif + +/* + * Encode a length len*2 vector of (uint32_t) into a length len*8 vector of + * (uint8_t) in big-endian form. + */ +static void +be32enc_vect(uint8_t * dst, const uint32_t * src, size_t len) +{ + + /* Encode vector, two words at a time. */ + do { + be32enc(&dst[0], src[0]); + be32enc(&dst[4], src[1]); + src += 2; + dst += 8; + } while (--len); +} + +/* + * Decode a big-endian length len*8 vector of (uint8_t) into a length + * len*2 vector of (uint32_t). + */ +static void +be32dec_vect(uint32_t * dst, const uint8_t * src, size_t len) +{ + + /* Decode vector, two words at a time. */ + do { + dst[0] = be32dec(&src[0]); + dst[1] = be32dec(&src[4]); + src += 8; + dst += 2; + } while (--len); +} + +/* SHA256 round constants. */ +static const uint32_t Krnd[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +/* Elementary functions used by SHA256 */ +#define Ch(x, y, z) ((x & (y ^ z)) ^ z) +#if 1 /* Explicit caching/reuse of common subexpression between rounds */ +#define Maj(x, y, z) (y ^ ((x_xor_y = x ^ y) & y_xor_z)) +#else /* Let the compiler cache/reuse or not */ +#define Maj(x, y, z) (y ^ ((x ^ y) & (y ^ z))) +#endif +#define SHR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << (32 - n))) +#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +/* SHA256 round function */ +#define RND(a, b, c, d, e, f, g, h, k) \ + h += S1(e) + Ch(e, f, g) + k; \ + d += h; \ + h += S0(a) + Maj(a, b, c); \ + y_xor_z = x_xor_y; + +/* Adjusted round function for rotating state */ +#define RNDr(S, W, i, ii) \ + RND(S[(64 - i) % 8], S[(65 - i) % 8], \ + S[(66 - i) % 8], S[(67 - i) % 8], \ + S[(68 - i) % 8], S[(69 - i) % 8], \ + S[(70 - i) % 8], S[(71 - i) % 8], \ + W[i + ii] + Krnd[i + ii]) + +/* Message schedule computation */ +#define MSCH(W, ii, i) \ + W[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii] + +/* + * SHA256 block compression function. The 256-bit state is transformed via + * the 512-bit input block to produce a new state. + */ +static void +SHA256_Transform(uint32_t state[static restrict 8], + const uint8_t block[static restrict 64], + uint32_t W[static restrict 64], uint32_t S[static restrict 8]) +{ + int i; + + /* 1. Prepare the first part of the message schedule W. */ + be32dec_vect(W, block, 8); + + /* 2. Initialize working variables. */ + memcpy(S, state, 32); + + /* 3. Mix. */ + for (i = 0; i < 64; i += 16) { + uint32_t x_xor_y, y_xor_z = S[(65 - i) % 8] ^ S[(66 - i) % 8]; + RNDr(S, W, 0, i); + RNDr(S, W, 1, i); + RNDr(S, W, 2, i); + RNDr(S, W, 3, i); + RNDr(S, W, 4, i); + RNDr(S, W, 5, i); + RNDr(S, W, 6, i); + RNDr(S, W, 7, i); + RNDr(S, W, 8, i); + RNDr(S, W, 9, i); + RNDr(S, W, 10, i); + RNDr(S, W, 11, i); + RNDr(S, W, 12, i); + RNDr(S, W, 13, i); + RNDr(S, W, 14, i); + RNDr(S, W, 15, i); + + if (i == 48) + break; + MSCH(W, 0, i); + MSCH(W, 1, i); + MSCH(W, 2, i); + MSCH(W, 3, i); + MSCH(W, 4, i); + MSCH(W, 5, i); + MSCH(W, 6, i); + MSCH(W, 7, i); + MSCH(W, 8, i); + MSCH(W, 9, i); + MSCH(W, 10, i); + MSCH(W, 11, i); + MSCH(W, 12, i); + MSCH(W, 13, i); + MSCH(W, 14, i); + MSCH(W, 15, i); + } + + /* 4. Mix local working variables into global state. */ + state[0] += S[0]; + state[1] += S[1]; + state[2] += S[2]; + state[3] += S[3]; + state[4] += S[4]; + state[5] += S[5]; + state[6] += S[6]; + state[7] += S[7]; +} + +static const uint8_t PAD[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* Add padding and terminating bit-count. */ +static void +SHA256_Pad(SHA256_CTX * ctx, uint32_t tmp32[static restrict 72]) +{ + size_t r; + + /* Figure out how many bytes we have buffered. */ + r = (ctx->count >> 3) & 0x3f; + + /* Pad to 56 mod 64, transforming if we finish a block en route. */ + if (r < 56) { + /* Pad to 56 mod 64. */ + memcpy(&ctx->buf[r], PAD, 56 - r); + } else { + /* Finish the current block and mix. */ + memcpy(&ctx->buf[r], PAD, 64 - r); + SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]); + + /* The start of the final block is all zeroes. */ + memset(&ctx->buf[0], 0, 56); + } + + /* Add the terminating bit-count. */ + be64enc(&ctx->buf[56], ctx->count); + + /* Mix in the final block. */ + SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]); +} + +/* Magic initialization constants. */ +static const uint32_t initial_state[8] = { + 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, + 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 +}; + +/** + * SHA256_Init(ctx): + * Initialize the SHA256 context ${ctx}. + */ +void +SHA256_Init(SHA256_CTX * ctx) +{ + + /* Zero bits processed so far. */ + ctx->count = 0; + + /* Initialize state. */ + memcpy(ctx->state, initial_state, sizeof(initial_state)); +} + +/** + * SHA256_Update(ctx, in, len): + * Input ${len} bytes from ${in} into the SHA256 context ${ctx}. + */ +static void +_SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len, + uint32_t tmp32[static restrict 72]) +{ + uint32_t r; + const uint8_t * src = in; + + /* Return immediately if we have nothing to do. */ + if (len == 0) + return; + + /* Number of bytes left in the buffer from previous updates. */ + r = (ctx->count >> 3) & 0x3f; + + /* Update number of bits. */ + ctx->count += (uint64_t)(len) << 3; + + /* Handle the case where we don't need to perform any transforms. */ + if (len < 64 - r) { + memcpy(&ctx->buf[r], src, len); + return; + } + + /* Finish the current block. */ + memcpy(&ctx->buf[r], src, 64 - r); + SHA256_Transform(ctx->state, ctx->buf, &tmp32[0], &tmp32[64]); + src += 64 - r; + len -= 64 - r; + + /* Perform complete blocks. */ + while (len >= 64) { + SHA256_Transform(ctx->state, src, &tmp32[0], &tmp32[64]); + src += 64; + len -= 64; + } + + /* Copy left over data into buffer. */ + memcpy(ctx->buf, src, len); +} + +/* Wrapper function for intermediate-values sanitization. */ +void +SHA256_Update(SHA256_CTX * ctx, const void * in, size_t len) +{ + uint32_t tmp32[72]; + + /* Call the real function. */ + _SHA256_Update(ctx, in, len, tmp32); + + /* Clean the stack. */ + insecure_memzero(tmp32, 288); +} + +/** + * SHA256_Final(digest, ctx): + * Output the SHA256 hash of the data input to the context ${ctx} into the + * buffer ${digest}. + */ +static void +_SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx, + uint32_t tmp32[static restrict 72]) +{ + + /* Add padding. */ + SHA256_Pad(ctx, tmp32); + + /* Write the hash. */ + be32enc_vect(digest, ctx->state, 4); +} + +/* Wrapper function for intermediate-values sanitization. */ +void +SHA256_Final(uint8_t digest[32], SHA256_CTX * ctx) +{ + uint32_t tmp32[72]; + + /* Call the real function. */ + _SHA256_Final(digest, ctx, tmp32); + + /* Clear the context state. */ + insecure_memzero(ctx, sizeof(SHA256_CTX)); + + /* Clean the stack. */ + insecure_memzero(tmp32, 288); +} + +/** + * SHA256_Buf(in, len, digest): + * Compute the SHA256 hash of ${len} bytes from ${in} and write it to ${digest}. + */ +void +SHA256_Buf(const void * in, size_t len, uint8_t digest[32]) +{ + SHA256_CTX ctx; + uint32_t tmp32[72]; + + SHA256_Init(&ctx); + _SHA256_Update(&ctx, in, len, tmp32); + _SHA256_Final(digest, &ctx, tmp32); + + /* Clean the stack. */ + insecure_memzero(&ctx, sizeof(SHA256_CTX)); + insecure_memzero(tmp32, 288); +} + +/** + * HMAC_SHA256_Init(ctx, K, Klen): + * Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from + * ${K}. + */ +static void +_HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen, + uint32_t tmp32[static restrict 72], uint8_t pad[static restrict 64], + uint8_t khash[static restrict 32]) +{ + const uint8_t * K = _K; + size_t i; + + /* If Klen > 64, the key is really SHA256(K). */ + if (Klen > 64) { + SHA256_Init(&ctx->ictx); + _SHA256_Update(&ctx->ictx, K, Klen, tmp32); + _SHA256_Final(khash, &ctx->ictx, tmp32); + K = khash; + Klen = 32; + } + + /* Inner SHA256 operation is SHA256(K xor [block of 0x36] || data). */ + SHA256_Init(&ctx->ictx); + memset(pad, 0x36, 64); + for (i = 0; i < Klen; i++) + pad[i] ^= K[i]; + _SHA256_Update(&ctx->ictx, pad, 64, tmp32); + + /* Outer SHA256 operation is SHA256(K xor [block of 0x5c] || hash). */ + SHA256_Init(&ctx->octx); + memset(pad, 0x5c, 64); + for (i = 0; i < Klen; i++) + pad[i] ^= K[i]; + _SHA256_Update(&ctx->octx, pad, 64, tmp32); +} + +/* Wrapper function for intermediate-values sanitization. */ +void +HMAC_SHA256_Init(HMAC_SHA256_CTX * ctx, const void * _K, size_t Klen) +{ + uint32_t tmp32[72]; + uint8_t pad[64]; + uint8_t khash[32]; + + /* Call the real function. */ + _HMAC_SHA256_Init(ctx, _K, Klen, tmp32, pad, khash); + + /* Clean the stack. */ + insecure_memzero(tmp32, 288); + insecure_memzero(khash, 32); + insecure_memzero(pad, 64); +} + +/** + * HMAC_SHA256_Update(ctx, in, len): + * Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}. + */ +static void +_HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len, + uint32_t tmp32[static restrict 72]) +{ + + /* Feed data to the inner SHA256 operation. */ + _SHA256_Update(&ctx->ictx, in, len, tmp32); +} + +/* Wrapper function for intermediate-values sanitization. */ +void +HMAC_SHA256_Update(HMAC_SHA256_CTX * ctx, const void * in, size_t len) +{ + uint32_t tmp32[72]; + + /* Call the real function. */ + _HMAC_SHA256_Update(ctx, in, len, tmp32); + + /* Clean the stack. */ + insecure_memzero(tmp32, 288); +} + +/** + * HMAC_SHA256_Final(digest, ctx): + * Output the HMAC-SHA256 of the data input to the context ${ctx} into the + * buffer ${digest}. + */ +static void +_HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx, + uint32_t tmp32[static restrict 72], uint8_t ihash[static restrict 32]) +{ + + /* Finish the inner SHA256 operation. */ + _SHA256_Final(ihash, &ctx->ictx, tmp32); + + /* Feed the inner hash to the outer SHA256 operation. */ + _SHA256_Update(&ctx->octx, ihash, 32, tmp32); + + /* Finish the outer SHA256 operation. */ + _SHA256_Final(digest, &ctx->octx, tmp32); +} + +/* Wrapper function for intermediate-values sanitization. */ +void +HMAC_SHA256_Final(uint8_t digest[32], HMAC_SHA256_CTX * ctx) +{ + uint32_t tmp32[72]; + uint8_t ihash[32]; + + /* Call the real function. */ + _HMAC_SHA256_Final(digest, ctx, tmp32, ihash); + + /* Clean the stack. */ + insecure_memzero(tmp32, 288); + insecure_memzero(ihash, 32); +} + +/** + * HMAC_SHA256_Buf(K, Klen, in, len, digest): + * Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of + * length ${Klen}, and write the result to ${digest}. + */ +void +HMAC_SHA256_Buf(const void * K, size_t Klen, const void * in, size_t len, + uint8_t digest[32]) +{ + HMAC_SHA256_CTX ctx; + uint32_t tmp32[72]; + uint8_t tmp8[96]; + + _HMAC_SHA256_Init(&ctx, K, Klen, tmp32, &tmp8[0], &tmp8[64]); + _HMAC_SHA256_Update(&ctx, in, len, tmp32); + _HMAC_SHA256_Final(digest, &ctx, tmp32, &tmp8[0]); + + /* Clean the stack. */ + insecure_memzero(&ctx, sizeof(HMAC_SHA256_CTX)); + insecure_memzero(tmp32, 288); + insecure_memzero(tmp8, 96); +} + +/* Add padding and terminating bit-count, but don't invoke Transform yet. */ +static int +SHA256_Pad_Almost(SHA256_CTX * ctx, uint8_t len[static restrict 8], + uint32_t tmp32[static restrict 72]) +{ + uint32_t r; + + r = (ctx->count >> 3) & 0x3f; + if (r >= 56) + return -1; + + /* + * Convert length to a vector of bytes -- we do this now rather + * than later because the length will change after we pad. + */ + be64enc(len, ctx->count); + + /* Add 1--56 bytes so that the resulting length is 56 mod 64. */ + _SHA256_Update(ctx, PAD, 56 - r, tmp32); + + /* Add the terminating bit-count. */ + ctx->buf[63] = len[7]; + _SHA256_Update(ctx, len, 7, tmp32); + + return 0; +} + +/** + * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): + * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and + * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1). + */ +void +PBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt, + size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen) +{ + HMAC_SHA256_CTX Phctx, PShctx, hctx; + uint32_t tmp32[72]; + union { + uint8_t tmp8[96]; + uint32_t state[8]; + } u; + size_t i; + uint8_t ivec[4]; + uint8_t U[32]; + uint8_t T[32]; + uint64_t j; + int k; + size_t clen; + + /* Sanity-check. */ + assert(dkLen <= 32 * (size_t)(UINT32_MAX)); + + if (c == 1 && (dkLen & 31) == 0 && (saltlen & 63) <= 51) { + uint32_t oldcount; + uint8_t * ivecp; + + /* Compute HMAC state after processing P and S. */ + _HMAC_SHA256_Init(&hctx, passwd, passwdlen, + tmp32, &u.tmp8[0], &u.tmp8[64]); + _HMAC_SHA256_Update(&hctx, salt, saltlen, tmp32); + + /* Prepare ictx padding. */ + oldcount = hctx.ictx.count & (0x3f << 3); + _HMAC_SHA256_Update(&hctx, "\0\0\0", 4, tmp32); + if ((hctx.ictx.count & (0x3f << 3)) < oldcount || + SHA256_Pad_Almost(&hctx.ictx, u.tmp8, tmp32)) + goto generic; /* Can't happen due to saltlen check */ + ivecp = hctx.ictx.buf + (oldcount >> 3); + + /* Prepare octx padding. */ + hctx.octx.count += 32 << 3; + SHA256_Pad_Almost(&hctx.octx, u.tmp8, tmp32); + + /* Iterate through the blocks. */ + for (i = 0; i * 32 < dkLen; i++) { + /* Generate INT(i + 1). */ + be32enc(ivecp, (uint32_t)(i + 1)); + + /* Compute U_1 = PRF(P, S || INT(i)). */ + memcpy(u.state, hctx.ictx.state, sizeof(u.state)); + SHA256_Transform(u.state, hctx.ictx.buf, + &tmp32[0], &tmp32[64]); + be32enc_vect(hctx.octx.buf, u.state, 4); + memcpy(u.state, hctx.octx.state, sizeof(u.state)); + SHA256_Transform(u.state, hctx.octx.buf, + &tmp32[0], &tmp32[64]); + be32enc_vect(&buf[i * 32], u.state, 4); + } + + goto cleanup; + } + +generic: + /* Compute HMAC state after processing P. */ + _HMAC_SHA256_Init(&Phctx, passwd, passwdlen, + tmp32, &u.tmp8[0], &u.tmp8[64]); + + /* Compute HMAC state after processing P and S. */ + memcpy(&PShctx, &Phctx, sizeof(HMAC_SHA256_CTX)); + _HMAC_SHA256_Update(&PShctx, salt, saltlen, tmp32); + + /* Iterate through the blocks. */ + for (i = 0; i * 32 < dkLen; i++) { + /* Generate INT(i + 1). */ + be32enc(ivec, (uint32_t)(i + 1)); + + /* Compute U_1 = PRF(P, S || INT(i)). */ + memcpy(&hctx, &PShctx, sizeof(HMAC_SHA256_CTX)); + _HMAC_SHA256_Update(&hctx, ivec, 4, tmp32); + _HMAC_SHA256_Final(T, &hctx, tmp32, u.tmp8); + + if (c > 1) { + /* T_i = U_1 ... */ + memcpy(U, T, 32); + + for (j = 2; j <= c; j++) { + /* Compute U_j. */ + memcpy(&hctx, &Phctx, sizeof(HMAC_SHA256_CTX)); + _HMAC_SHA256_Update(&hctx, U, 32, tmp32); + _HMAC_SHA256_Final(U, &hctx, tmp32, u.tmp8); + + /* ... xor U_j ... */ + for (k = 0; k < 32; k++) + T[k] ^= U[k]; + } + } + + /* Copy as many bytes as necessary into buf. */ + clen = dkLen - i * 32; + if (clen > 32) + clen = 32; + memcpy(&buf[i * 32], T, clen); + } + + /* Clean the stack. */ + insecure_memzero(&Phctx, sizeof(HMAC_SHA256_CTX)); + insecure_memzero(&PShctx, sizeof(HMAC_SHA256_CTX)); + insecure_memzero(U, 32); + insecure_memzero(T, 32); + +cleanup: + insecure_memzero(&hctx, sizeof(HMAC_SHA256_CTX)); + insecure_memzero(tmp32, 288); + insecure_memzero(&u, sizeof(u)); +} diff --git a/deps/yescrypt-master/sha256.h b/deps/yescrypt-master/sha256.h new file mode 100644 index 000000000..6210502ff --- /dev/null +++ b/deps/yescrypt-master/sha256.h @@ -0,0 +1,129 @@ +/*- + * Copyright 2005-2016 Colin Percival + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SHA256_H_ +#define _SHA256_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Use #defines in order to avoid namespace collisions with anyone else's + * SHA256 code (e.g., the code in OpenSSL). + */ +#define SHA256_Init libcperciva_SHA256_Init +#define SHA256_Update libcperciva_SHA256_Update +#define SHA256_Final libcperciva_SHA256_Final +#define SHA256_Buf libcperciva_SHA256_Buf +#define SHA256_CTX libcperciva_SHA256_CTX +#define HMAC_SHA256_Init libcperciva_HMAC_SHA256_Init +#define HMAC_SHA256_Update libcperciva_HMAC_SHA256_Update +#define HMAC_SHA256_Final libcperciva_HMAC_SHA256_Final +#define HMAC_SHA256_Buf libcperciva_HMAC_SHA256_Buf +#define HMAC_SHA256_CTX libcperciva_HMAC_SHA256_CTX + +/* Context structure for SHA256 operations. */ +typedef struct { + uint32_t state[8]; + uint64_t count; + uint8_t buf[64]; +} SHA256_CTX; + +/** + * SHA256_Init(ctx): + * Initialize the SHA256 context ${ctx}. + */ +void SHA256_Init(SHA256_CTX *); + +/** + * SHA256_Update(ctx, in, len): + * Input ${len} bytes from ${in} into the SHA256 context ${ctx}. + */ +void SHA256_Update(SHA256_CTX *, const void *, size_t); + +/** + * SHA256_Final(digest, ctx): + * Output the SHA256 hash of the data input to the context ${ctx} into the + * buffer ${digest}. + */ +void SHA256_Final(uint8_t[32], SHA256_CTX *); + +/** + * SHA256_Buf(in, len, digest): + * Compute the SHA256 hash of ${len} bytes from ${in} and write it to ${digest}. + */ +void SHA256_Buf(const void *, size_t, uint8_t[32]); + +/* Context structure for HMAC-SHA256 operations. */ +typedef struct { + SHA256_CTX ictx; + SHA256_CTX octx; +} HMAC_SHA256_CTX; + +/** + * HMAC_SHA256_Init(ctx, K, Klen): + * Initialize the HMAC-SHA256 context ${ctx} with ${Klen} bytes of key from + * ${K}. + */ +void HMAC_SHA256_Init(HMAC_SHA256_CTX *, const void *, size_t); + +/** + * HMAC_SHA256_Update(ctx, in, len): + * Input ${len} bytes from ${in} into the HMAC-SHA256 context ${ctx}. + */ +void HMAC_SHA256_Update(HMAC_SHA256_CTX *, const void *, size_t); + +/** + * HMAC_SHA256_Final(digest, ctx): + * Output the HMAC-SHA256 of the data input to the context ${ctx} into the + * buffer ${digest}. + */ +void HMAC_SHA256_Final(uint8_t[32], HMAC_SHA256_CTX *); + +/** + * HMAC_SHA256_Buf(K, Klen, in, len, digest): + * Compute the HMAC-SHA256 of ${len} bytes from ${in} using the key ${K} of + * length ${Klen}, and write the result to ${digest}. + */ +void HMAC_SHA256_Buf(const void *, size_t, const void *, size_t, uint8_t[32]); + +/** + * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): + * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and + * write the output to buf. The value dkLen must be at most 32 * (2^32 - 1). + */ +void PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t, + uint64_t, uint8_t *, size_t); + +#ifdef __cplusplus +} +#endif + +#endif /* !_SHA256_H_ */ diff --git a/deps/yescrypt-master/sysendian.h b/deps/yescrypt-master/sysendian.h new file mode 100644 index 000000000..c51730d1c --- /dev/null +++ b/deps/yescrypt-master/sysendian.h @@ -0,0 +1,122 @@ +/*- + * Copyright 2007-2014 Colin Percival + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SYSENDIAN_H_ +#define _SYSENDIAN_H_ + +#include + +/* Avoid namespace collisions with BSD . */ +#define be32dec libcperciva_be32dec +#define be32enc libcperciva_be32enc +#define be64enc libcperciva_be64enc +#define le32dec libcperciva_le32dec +#define le32enc libcperciva_le32enc +#define le64dec libcperciva_le64dec +#define le64enc libcperciva_le64enc + +static inline uint32_t +be32dec(const void * pp) +{ + const uint8_t * p = (uint8_t const *)pp; + + return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) + + ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24)); +} + +static inline void +be32enc(void * pp, uint32_t x) +{ + uint8_t * p = (uint8_t *)pp; + + p[3] = x & 0xff; + p[2] = (x >> 8) & 0xff; + p[1] = (x >> 16) & 0xff; + p[0] = (x >> 24) & 0xff; +} + +static inline void +be64enc(void * pp, uint64_t x) +{ + uint8_t * p = (uint8_t *)pp; + + p[7] = x & 0xff; + p[6] = (x >> 8) & 0xff; + p[5] = (x >> 16) & 0xff; + p[4] = (x >> 24) & 0xff; + p[3] = (x >> 32) & 0xff; + p[2] = (x >> 40) & 0xff; + p[1] = (x >> 48) & 0xff; + p[0] = (x >> 56) & 0xff; +} + +static inline uint32_t +le32dec(const void * pp) +{ + const uint8_t * p = (uint8_t const *)pp; + + return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); +} + +static inline void +le32enc(void * pp, uint32_t x) +{ + uint8_t * p = (uint8_t *)pp; + + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; +} + +static inline uint64_t +le64dec(const void * pp) +{ + const uint8_t * p = (uint8_t const *)pp; + + return ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) + + ((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) + + ((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) + + ((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56)); +} + +static inline void +le64enc(void * pp, uint64_t x) +{ + uint8_t * p = (uint8_t *)pp; + + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; + p[4] = (x >> 32) & 0xff; + p[5] = (x >> 40) & 0xff; + p[6] = (x >> 48) & 0xff; + p[7] = (x >> 56) & 0xff; +} + +#endif /* !_SYSENDIAN_H_ */ diff --git a/deps/yescrypt-master/tests.c b/deps/yescrypt-master/tests.c new file mode 100644 index 000000000..ed342449d --- /dev/null +++ b/deps/yescrypt-master/tests.c @@ -0,0 +1,418 @@ +/*- + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#define YESCRYPT_FLAGS YESCRYPT_DEFAULTS +#if 1 +#define YESCRYPT_P 11 +#define YESCRYPT_PROM 8 +#else +#define YESCRYPT_P 1 +#define YESCRYPT_PROM 1 +#endif + +#undef TEST_PBKDF2_SHA256 +#define TEST_SCRYPT +#define TEST_YESCRYPT_KDF +#define TEST_YESCRYPT_ENCODING +#define TEST_ROM +#define TEST_ROM_PREALLOC + +#ifdef TEST_ROM_PREALLOC +#include /* for malloc() */ +#endif + +#ifdef TEST_PBKDF2_SHA256 +#include + +#include "sha256.h" + +static void print_PBKDF2_SHA256_raw(const char *passwd, size_t passwdlen, + const char *salt, size_t saltlen, uint64_t c, size_t dkLen) +{ + uint8_t dk[64]; + size_t i; + + assert(dkLen <= sizeof(dk)); + + /* XXX This prints the strings truncated at first NUL */ + printf("PBKDF2_SHA256(\"%s\", \"%s\", %llu, %llu) =", + passwd, salt, (unsigned long long)c, (unsigned long long)dkLen); + + PBKDF2_SHA256((const uint8_t *) passwd, passwdlen, + (const uint8_t *) salt, saltlen, c, dk, dkLen); + + for (i = 0; i < dkLen; i++) + printf(" %02x", dk[i]); + puts(""); +} + +static void print_PBKDF2_SHA256(const char *passwd, + const char *salt, uint64_t c, size_t dkLen) +{ + print_PBKDF2_SHA256_raw(passwd, strlen(passwd), salt, strlen(salt), c, + dkLen); +} +#endif + +#if defined(TEST_SCRYPT) || defined(TEST_YESCRYPT_ENCODING) +#include "yescrypt.h" +#endif + +#ifdef TEST_SCRYPT +static void print_scrypt(const char *passwd, const char *salt, + uint64_t N, uint32_t r, uint32_t p) +{ + uint8_t dk[64]; + size_t i; + + printf("scrypt(\"%s\", \"%s\", %llu, %u, %u) =", + passwd, salt, (unsigned long long)N, r, p); + + if (crypto_scrypt((const uint8_t *) passwd, strlen(passwd), + (const uint8_t *) salt, strlen(salt), N, r, p, dk, sizeof(dk))) { + puts(" FAILED"); + return; + } + + for (i = 0; i < sizeof(dk); i++) + printf(" %02x", dk[i]); + puts(""); +} +#endif + +#ifdef TEST_YESCRYPT_KDF +static void print_yescrypt(const char *passwd, const char *salt, + yescrypt_flags_t flags, + uint64_t N, uint32_t r, uint32_t p, uint32_t t, uint32_t g, + uint32_t dklen) +{ + yescrypt_local_t local; + yescrypt_params_t params = {flags, N, r, p, t, g, 0}; + uint8_t dk[64]; + uint32_t i; + +#if 1 + /* Don't test hash upgrades */ + if (g) + return; +#endif + + if (dklen > sizeof(dk) || yescrypt_init_local(&local)) { + puts("FAILED"); + return; + } + + printf("yescrypt(\"%s\", \"%s\", %u, %llu, %u, %u, %u, %u) =", + passwd, salt, flags, (unsigned long long)N, r, p, t, g); + + if (yescrypt_kdf(NULL, &local, + (const uint8_t *) passwd, strlen(passwd), + (const uint8_t *) salt, strlen(salt), ¶ms, dk, dklen)) { + yescrypt_free_local(&local); + puts(" FAILED"); + return; + } + + yescrypt_free_local(&local); + + for (i = 0; i < dklen; i++) + printf(" %02x", dk[i]); + puts(""); +} +#endif + +int main(void) +{ + int i; + + setvbuf(stdout, NULL, _IOLBF, 0); + +#ifdef TEST_PBKDF2_SHA256 + print_PBKDF2_SHA256("password", "salt", 1, 20); + print_PBKDF2_SHA256("password", "salt", 2, 20); + print_PBKDF2_SHA256("password", "salt", 4096, 20); + print_PBKDF2_SHA256("password", "salt", 16777216, 20); + print_PBKDF2_SHA256("passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 25); + print_PBKDF2_SHA256_raw("pass\0word", 9, "sa\0lt", 5, 4096, 16); +#if 0 + print_PBKDF2_SHA256("password", "salt", 1, 32); + print_PBKDF2_SHA256("password", "salt", 2, 32); + print_PBKDF2_SHA256("password", "salt", 4096, 32); + print_PBKDF2_SHA256("password", "salt", 16777216, 32); + print_PBKDF2_SHA256("passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 40); + print_PBKDF2_SHA256("password", "salt", 4096, 16); + print_PBKDF2_SHA256("password", "salt", 1, 20); + print_PBKDF2_SHA256("password", "salt", 2, 20); + print_PBKDF2_SHA256("password", "salt", 4096, 20); + print_PBKDF2_SHA256("password", "salt", 16777216, 20); + print_PBKDF2_SHA256("password", "salt", 4096, 25); + print_PBKDF2_SHA256("password", "salt", 4096, 16); +#endif +#endif + +#ifdef TEST_SCRYPT + print_scrypt("", "", 16, 1, 1); + print_scrypt("password", "NaCl", 1024, 8, 16); + print_scrypt("pleaseletmein", "SodiumChloride", 16384, 8, 1); + print_scrypt("pleaseletmein", "SodiumChloride", 1048576, 8, 1); +#endif + +#ifdef TEST_YESCRYPT_KDF + print_yescrypt("", "", 0, 16, 1, 1, 0, 0, 64); + print_yescrypt("", "", 0, 16, 1, 1, 0, 0, 8); + print_yescrypt("", "", 0, 4, 1, 1, 0, 0, 64); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 0, 0, 64); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 0, 0, 8); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 1, 0, 64); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 2, 0, 64); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 3, 0, 64); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 3, 0, 33); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 3, 0, 32); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 3, 0, 31); + print_yescrypt("", "", YESCRYPT_WORM, 4, 1, 1, 3, 0, 1); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 0, 0, 64); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 0, 0, 4); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 64); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 33); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 32); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 31); + print_yescrypt("", "", YESCRYPT_DEFAULTS, 4, 1, 1, 1, 0, 1); + for (i = 0; i <= 6; i++) + print_yescrypt("p", "s", YESCRYPT_DEFAULTS, 16, 8, 1, i + 10, i, 40); + for (i = 0; i <= 6; i++) + print_yescrypt("p", "s", YESCRYPT_WORM, 16, 8, 1, i + 10, i, 40); + for (i = 0; i <= 6; i++) + print_yescrypt("p", "s", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 40); + for (i = 0; i <= 6; i++) + print_yescrypt("p", "s", YESCRYPT_WORM, 16, 8, 1, 0, i, 40); + for (i = 0; i <= 2; i++) + print_yescrypt("p", "s", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 32); + for (i = 0; i <= 2; i++) + print_yescrypt("p", "s", YESCRYPT_DEFAULTS, 16, 8, 1, 0, i, 8); +#endif + +#ifdef TEST_YESCRYPT_ENCODING + { + uint8_t *setting; + yescrypt_binary_t key = {.uc={ + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, + 17,18,19,20,21,22,23,24,25,26,27,28,255,128,64,32}}; + + for (i = 0; i < 18; i++) { + uint32_t N_log2 = (i < 14) ? (16 - i) : 2; + uint32_t r = (i < 8) ? (8 - i) : (1 + (i & 1)); + uint32_t p = (i & 1) ? 1 : YESCRYPT_P; + yescrypt_flags_t flags = YESCRYPT_DEFAULTS; + if ((int)p - (i / 2) > 1) + p -= i / 2; + if (i & 2) { + flags = YESCRYPT_WORM; + } else { + while ((1ULL << N_log2) / p <= 3) + N_log2++; + } + yescrypt_params_t params = + {flags, (uint64_t)1 << N_log2, r, p, 0, 0, 0}; + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEKMo34.", 16 - (i & 15)); + if (i == 0) + printf("'%s'\n", (char *)setting); + if (!setting) + printf("%d yescrypt_encode_params() = NULL\n", i); + if (setting) { + uint8_t *hash = yescrypt( + (const uint8_t *)"pleaseletmein", setting); + printf("Plaintext: '%s'\n", (char *)hash); + hash = (uint8_t *)strdup((char *)hash); + if (!hash || strcmp( + (char *)hash, (char *)yescrypt( + (const uint8_t *)"pleaseletmein", hash))) + puts("Validation FAILED"); + uint8_t *orig = (uint8_t *)strdup((char *)hash); + if (!yescrypt_reencrypt(hash, NULL, &key)) + printf("%d yescrypt_reencrypt() = NULL\n", i); + printf("Encrypted: '%s'\n", (char *)hash); + yescrypt_local_t local; + if (yescrypt_init_local(&local)) { + puts("yescrypt_init_local() FAILED"); + return 1; + } + uint8_t buf[128]; + if (strcmp((char *)hash, (char *)yescrypt_r( + NULL, &local, + (const uint8_t *)"pleaseletmein", 13, + hash, &key, buf, sizeof(buf)))) + puts("Validation of encrypted FAILED"); + if (!strcmp((char *)hash, (char *)yescrypt_r( + NULL, &local, + (const uint8_t *)"pleaseletmein", 13, + hash, NULL, buf, sizeof(buf)))) + puts("Validation of encrypted " + "unexpectedly succeeded"); + if (!strcmp((char *)orig, (char *)yescrypt_r( + NULL, &local, + (const uint8_t *)"pleaseletmein", 13, + orig, &key, buf, sizeof(buf)))) + puts("Validation of unencrypted " + "unexpectedly succeeded"); + yescrypt_free_local(&local); + if (!yescrypt_reencrypt(hash, &key, NULL)) + printf("%d yescrypt_reencrypt() = NULL\n", i); + if (strcmp((char *)hash, (char *)orig)) + puts("Decryption FAILED"); + free(orig); + free(hash); + } + } + + printf("'%s'\n", (char *)yescrypt( + (const uint8_t *)"pleaseletmein", + (const uint8_t *)"$7$C6..../....SodiumChloride")); + + printf("'%s'\n", (char *)yescrypt( + (const uint8_t *)"pleaseletmein", + (const uint8_t *)"$7$06..../....SodiumChloride")); + +#ifdef TEST_ROM + uint64_t rom_bytes = 256 * (1024ULL*1024); + uint64_t ram_bytes = 2 * (1024ULL*1024); + uint32_t r; + uint64_t NROM_log2, N_log2; + yescrypt_shared_t shared; + yescrypt_local_t local; + + NROM_log2 = 0; + while (((rom_bytes >> NROM_log2) & 0xff) == 0) + NROM_log2++; + r = rom_bytes >> (7 + NROM_log2); + while (r < 5 && NROM_log2 > 0) { + r <<= 1; + NROM_log2--; + } + rom_bytes = (uint64_t)r << (7 + NROM_log2); + + N_log2 = 0; + while (((uint64_t)r << (7 + N_log2)) < ram_bytes) + N_log2++; + ram_bytes = (uint64_t)r << (7 + N_log2); + + printf("r=%u N=2^%u NROM=2^%u\n", r, + (unsigned int)N_log2, (unsigned int)NROM_log2); + + printf("Will use %.2f KiB ROM\n", rom_bytes / 1024.0); + printf(" %.2f KiB RAM\n", ram_bytes / 1024.0); + + printf("Initializing ROM ..."); + fflush(stdout); + yescrypt_params_t rom_params = { YESCRYPT_DEFAULTS, + 0, r, YESCRYPT_PROM, 0, 0, (uint64_t)1 << NROM_log2 }; + if (yescrypt_init_shared(&shared, + (const uint8_t *)"local param", 12, &rom_params)) { + puts(" FAILED"); + return 1; + } + yescrypt_binary_t *digest = yescrypt_digest_shared(&shared); + printf(" DONE (%02x%02x%02x%02x)\n", + digest->uc[0], digest->uc[1], digest->uc[2], digest->uc[3]); + + if (yescrypt_init_local(&local)) { + puts("FAILED"); + return 1; + } + + yescrypt_params_t params = rom_params; + params.flags = YESCRYPT_FLAGS; + params.N = (uint64_t)1 << N_log2; + params.p = YESCRYPT_P; + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEKMo34.", 16); + printf("'%s'\n", (char *)setting); + + uint8_t hash[128]; + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))); + +#ifdef TEST_ROM_PREALLOC + yescrypt_free_shared(&shared); + + shared.aligned_size = ((uint64_t)1 << NROM_log2) * 128 * r; + shared.base_size = shared.aligned_size + 63; + uint8_t *where = shared.base = malloc(shared.base_size); + where += 63; + where = shared.aligned = where - ((uintptr_t)where & 63); + + printf("Initializing ROM in preallocated memory ..."); + fflush(stdout); + rom_params.flags |= YESCRYPT_SHARED_PREALLOCATED; + if (yescrypt_init_shared(&shared, + (const uint8_t *)"local param", 12, &rom_params)) { + puts(" FAILED"); + return 1; + } + digest = yescrypt_digest_shared(&shared); + printf(" DONE (%02x%02x%02x%02x)\n", + digest->uc[0], digest->uc[1], digest->uc[2], digest->uc[3]); + + if ((void *)where != shared.aligned) + puts("YESCRYPT_SHARED_PREALLOCATED failed"); +#endif + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))); + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmeIn", 13, setting, NULL, + hash, sizeof(hash))); + + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEIMo34.", 16); + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))); + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmeIn", 13, setting, NULL, + hash, sizeof(hash))); + + params.N = 4; + params.NROM *= params.r; + params.r = 1; + params.p = 1; + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEKMo34.", 16); + + printf("'%s'\n", (char *)yescrypt_r(&shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))); +#endif + } +#endif + + return 0; +} diff --git a/deps/yescrypt-master/userom.c b/deps/yescrypt-master/userom.c new file mode 100644 index 000000000..d8d89d178 --- /dev/null +++ b/deps/yescrypt-master/userom.c @@ -0,0 +1,405 @@ +/*- + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define YESCRYPT_FLAGS YESCRYPT_DEFAULTS +//#define YESCRYPT_FLAGS YESCRYPT_WORM +//#define YESCRYPT_FLAGS 0 + +#define ROM_SHM_KEY 0x7965730a + +//#define DISABLE_ROM +//#define DUMP_LOCAL + +#include +#include /* for atoi() */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "yescrypt.h" + +#ifdef _OPENMP +#include + +#define NSAVE 1000 + +static uint64_t time_us(void) +{ + struct timespec t; +#ifdef CLOCK_MONOTONIC_RAW + if (clock_gettime(CLOCK_MONOTONIC_RAW, &t)) + return 0; +#else + if (clock_gettime(CLOCK_MONOTONIC, &t)) + return 0; +#endif + return 1 + (uint64_t)t.tv_sec * 1000000 + t.tv_nsec / 1000; +} +#endif + +int main(int argc, const char * const *argv) +{ +#if 0 + uint64_t rom_bytes = 112 * (1024ULL*1024*1024); + uint64_t ram_bytes = 1 * (1024ULL*1024); +#else + uint64_t rom_bytes = 3 * (1024ULL*1024*1024); + uint64_t ram_bytes = 2 * (1024ULL*1024); +#endif + uint32_t r, min_r; + uint64_t NROM_log2, N_log2; + yescrypt_shared_t shared_s; + yescrypt_shared_t *shared = NULL; +#ifndef DISABLE_ROM + int shmid; +#endif + const char *rom_filename = NULL; + int rom_fd; + yescrypt_binary_t key = {.uc={ + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, + 17,18,19,20,21,22,23,24,25,26,27,28,255,128,64,32}}; + + if (argc > 1) + rom_bytes = atoi(argv[1]) * (1024ULL*1024*1024); + if (argc > 2) + ram_bytes = atoi(argv[2]) * (1024ULL*1024); + if (argc > 3 && rom_bytes) + rom_filename = argv[3]; + + r = 16; + min_r = 9; + if (rom_filename) + min_r = 8 * 64; + + NROM_log2 = 0; + if (rom_bytes) { + while (((rom_bytes >> NROM_log2) & 0xff) == 0) + NROM_log2++; + r = rom_bytes >> (7 + NROM_log2); + while (r < min_r && NROM_log2 > 0) { + r <<= 1; + NROM_log2--; + } + rom_bytes = (uint64_t)r << (7 + NROM_log2); + } + + N_log2 = 0; + while (((uint64_t)r << (7 + N_log2)) < ram_bytes) + N_log2++; + ram_bytes = (uint64_t)r << (7 + N_log2); + + printf("r=%u N=2^%u NROM=2^%u\n", r, + (unsigned int)N_log2, (unsigned int)NROM_log2); + +#ifdef DISABLE_ROM + rom_bytes = 0; +#endif + + printf("Will use %.2f KiB ROM\n", rom_bytes / 1024.0); + printf(" %.2f KiB RAM\n", ram_bytes / 1024.0); + +#ifndef DISABLE_ROM + if (rom_filename) { + rom_fd = open(rom_filename, O_RDONLY); + if (rom_fd < 0) { + perror("open"); + return 1; + } + + int flags = +#ifdef MAP_NOCORE + MAP_NOCORE | +#endif +#ifdef MAP_HUGETLB + MAP_HUGETLB | +#endif + MAP_SHARED; + void *p = mmap(NULL, rom_bytes, PROT_READ, flags, rom_fd, 0); +#ifdef MAP_HUGETLB + if (p == MAP_FAILED) + p = mmap(NULL, rom_bytes, PROT_READ, + flags & ~MAP_HUGETLB, rom_fd, 0); +#endif + if (p == MAP_FAILED) { + perror("mmap"); + close(rom_fd); + return 1; + } + close(rom_fd); + + shared = &shared_s; + shared->base = shared->aligned = p; + shared->aligned_size = rom_bytes; + } else if (rom_bytes) { + shared = &shared_s; + shared->aligned_size = rom_bytes; + shmid = shmget(ROM_SHM_KEY, shared->aligned_size, 0); + if (shmid == -1) { + perror("shmget"); + return 1; + } + + shared->base = shared->aligned = shmat(shmid, NULL, SHM_RDONLY); + if (shared->base == (void *)-1) { + perror("shmat"); + return 1; + } + } +#endif + + { + yescrypt_local_t local; + const uint8_t *setting; + + if (yescrypt_init_local(&local)) { + puts("yescrypt_init_local() FAILED"); + return 1; + } + + yescrypt_params_t params = { + .flags = YESCRYPT_FLAGS, + .N = (uint64_t)1 << N_log2, + .NROM = NROM_log2 ? ((uint64_t)1 << NROM_log2) : 0, + .r = r, + .p = 1 }; + setting = yescrypt_encode_params(¶ms, + (const uint8_t *)"WZaPV7LSUEKMo34.", 16); + + { + uint8_t hash[128]; + if (!yescrypt_r(shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, NULL, + hash, sizeof(hash))) { + puts("yescrypt_r() FAILED"); + return 1; + } + printf("Plaintext: '%s'\n", (char *)hash); + if (!yescrypt_r(shared, &local, + (const uint8_t *)"pleaseletmein", 13, setting, &key, + hash, sizeof(hash))) { + puts("yescrypt_r() FAILED"); + return 1; + } + printf("Encrypted: '%s'\n", (char *)hash); + } + +#ifdef DUMP_LOCAL +#if 0 + fwrite(local.aligned, local.aligned_size, 1, stderr); +#else + /* Skip B, dump only V */ + if (local.aligned_size >= ram_bytes + 128 * r) + fwrite((char *)local.aligned + 128 * r, ram_bytes, + 1, stderr); +#endif +#endif + + puts("Benchmarking 1 thread ..."); + + clock_t clk_tck = sysconf(_SC_CLK_TCK); + struct tms start_tms, end_tms; + clock_t start = times(&start_tms), end; + unsigned int i, n; + unsigned long long count; +#ifdef _OPENMP + char save[NSAVE][128]; + unsigned int nsave = 0; +#endif + unsigned int seed = start * 1812433253U; + + n = 1; + count = 0; + do { + for (i = 0; i < n; i++) { + unsigned int j = count + i; + char p[32]; + uint8_t hash[128]; + snprintf(p, sizeof(p), "%u", seed + j); +#ifdef _OPENMP + const uint8_t *h = +#endif + yescrypt_r(shared, &local, + (const uint8_t *)p, strlen(p), + setting, &key, hash, sizeof(hash)); +#ifdef _OPENMP + if (j < NSAVE) { + save[j][0] = 0; + strncat(save[j], (char *)h, + sizeof(save[j]) - 1); + nsave = j; + } +#endif + } + count += n; + + end = times(&end_tms); + n <<= 1; + } while (end - start < clk_tck * 2); + + clock_t start_v = start_tms.tms_utime + start_tms.tms_stime + + start_tms.tms_cutime + start_tms.tms_cstime; + clock_t end_v = end_tms.tms_utime + end_tms.tms_stime + + end_tms.tms_cutime + end_tms.tms_cstime; + + printf("%llu c/s real, %llu c/s virtual " + "(%llu hashes in %.2f seconds)\n", + count * clk_tck / (end - start), + count * clk_tck / (end_v - start_v), + count, (double)(end - start) / clk_tck); + +#ifdef _OPENMP + unsigned int nt = omp_get_max_threads(); + + printf("Benchmarking %u thread%s ...\n", + nt, nt == 1 ? "" : "s"); + + typedef struct { + yescrypt_local_t local; + uint64_t min, max, total; + } thread_data_s; + union { + thread_data_s s; + uint8_t cachelines[2][64]; /* avoid false sharing */ + } thread_data[nt]; /* tricky to align this when on stack */ + + unsigned int t; + for (t = 0; t < nt; t++) { + thread_data_s *td = &thread_data[t].s; + if (yescrypt_init_local(&td->local)) { + puts("yescrypt_init_local() FAILED"); + return 1; + } + td->min = ~(uint64_t)0; td->max = 0; td->total = 0; + } + + unsigned long long count1 = count, count_restart = 0; + + if (!geteuid()) { + puts("Running as root, so trying to set SCHED_RR"); +#pragma omp parallel + { + struct sched_param param = { .sched_priority = 1 }; + if (sched_setscheduler(getpid(), SCHED_RR, ¶m)) + perror("sched_setscheduler"); + } + } + + start = times(&start_tms); + + n = count * omp_get_max_threads(); + count = 0; + do { +#pragma omp parallel for default(none) private(i) shared(n, shared, thread_data, setting, seed, count, save, nsave, key) + for (i = 0; i < n; i++) { + unsigned int j = count + i; + char p[32]; + uint8_t hash[128]; + snprintf(p, sizeof(p), "%u", seed + j); + thread_data_s *td = &thread_data[omp_get_thread_num()].s; + uint64_t start1 = time_us(); +#if 1 + const char *h = (const char *)yescrypt_r( + shared, &td->local, + (const uint8_t *)p, strlen(p), + setting, &key, hash, sizeof(hash)); +#else + yescrypt_local_t local; + yescrypt_init_local(&local); + const char *h = (const char *)yescrypt_r( + shared, &local, + (const uint8_t *)p, strlen(p), + setting, &key, hash, sizeof(hash)); + yescrypt_free_local(&local); +#endif + uint64_t end1 = time_us(); + if (end1 < start1) + end1 = start1; + uint64_t diff1 = end1 - start1; + td->total += diff1; + if (diff1 < td->min) + td->min = diff1; + if (diff1 > td->max) + td->max = diff1; + if (j < nsave && strcmp(save[j], h)) { +#pragma omp critical + printf("Mismatch at %u, %s != %s\n", + j, save[j], h); + } + } + + count += n; + if ((count - n) < count1 && count >= count1) { +/* Disregard our repeat of single thread's results (could be partially cached + * by same core, but OTOH other cores not yet warmed up to full clock rate). */ + start = times(&start_tms); + count_restart = count; + for (t = 0; t < nt; t++) { + thread_data_s *td = &thread_data[t].s; + td->min = ~(uint64_t)0; td->max = 0; td->total = 0; + } + } else { + n <<= 1; + } + + end = times(&end_tms); + } while (end - start < clk_tck); + + if (!count_restart) + puts("Didn't reach single-thread's hash count"); + count -= count_restart; + + start_v = start_tms.tms_utime + start_tms.tms_stime + + start_tms.tms_cutime + start_tms.tms_cstime; + end_v = end_tms.tms_utime + end_tms.tms_stime + + end_tms.tms_cutime + end_tms.tms_cstime; + + printf("%llu c/s real, %llu c/s virtual " + "(%llu hashes in %.2f seconds)\n", + count * clk_tck / (end - start), + count * clk_tck / (end_v - start_v), + count, (double)(end - start) / clk_tck); + + uint64_t min = ~(uint64_t)0, max = 0, total = 0; + for (t = 0; t < nt; t++) { + thread_data_s *td = &thread_data[t].s; + total += td->total; + if (td->min < min) + min = td->min; + if (td->max > max) + max = td->max; + } + printf("min %.3f ms, avg %.3f ms, max %.3f ms\n", + min / 1000.0, total / 1000.0 / count, max / 1000.0); +#endif + } + + if (rom_filename && munmap(shared->base, rom_bytes)) { + perror("munmap"); + return 1; + } + + return 0; +} diff --git a/deps/yescrypt-master/yescrypt-common.c b/deps/yescrypt-master/yescrypt-common.c new file mode 100644 index 000000000..ce32b3e52 --- /dev/null +++ b/deps/yescrypt-master/yescrypt-common.c @@ -0,0 +1,703 @@ +/*- + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "insecure_memzero.h" +#include "sha256.h" + +#define YESCRYPT_INTERNAL +#include "yescrypt.h" + +#define BYTES2CHARS(bytes) ((((bytes) * 8) + 5) / 6) + +#define HASH_SIZE sizeof(yescrypt_binary_t) /* bytes */ +#define HASH_LEN BYTES2CHARS(HASH_SIZE) /* base-64 chars */ + +/* + * "$y$", up to 8 params of up to 6 chars each, '$', salt + * Alternatively, but that's smaller: + * "$7$", 3 params encoded as 1+5+5 chars, salt + */ +#define PREFIX_LEN (3 + 8 * 6 + 1 + BYTES2CHARS(32)) + +static const char * const itoa64 = + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +static const uint8_t atoi64_partial[77] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 64, 64, 64, 64, 64, 64, 64, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 64, 64, 64, 64, 64, 64, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 +}; + +static uint8_t *encode64_uint32(uint8_t *dst, size_t dstlen, + uint32_t src, uint32_t min) +{ + uint32_t start = 0, end = 47, chars = 1, bits = 0; + + if (src < min) + return NULL; + src -= min; + + do { + uint32_t count = (end + 1 - start) << bits; + if (src < count) + break; + if (start >= 63) + return NULL; + start = end + 1; + end = start + (62 - end) / 2; + src -= count; + chars++; + bits += 6; + } while (1); + + if (dstlen <= chars) /* require room for a NUL terminator */ + return NULL; + + *dst++ = itoa64[start + (src >> bits)]; + + while (--chars) { + bits -= 6; + *dst++ = itoa64[(src >> bits) & 0x3f]; + } + + *dst = 0; /* NUL terminate just in case */ + + return dst; +} + +static inline uint32_t atoi64(uint8_t src) +{ + if (src >= '.' && src <= 'z') + return atoi64_partial[src - '.']; + + return 64; +} + +static const uint8_t *decode64_uint32(uint32_t *dst, + const uint8_t *src, uint32_t min) +{ + uint32_t start = 0, end = 47, chars = 1, bits = 0; + uint32_t c; + + c = atoi64(*src++); + if (c > 63) + goto fail; + + *dst = min; + while (c > end) { + *dst += (end + 1 - start) << bits; + start = end + 1; + end = start + (62 - end) / 2; + chars++; + bits += 6; + } + + *dst += (c - start) << bits; + + while (--chars) { + c = atoi64(*src++); + if (c > 63) + goto fail; + bits -= 6; + *dst += c << bits; + } + + return src; + +fail: + *dst = 0; + return NULL; +} + +static uint8_t *encode64_uint32_fixed(uint8_t *dst, size_t dstlen, + uint32_t src, uint32_t srcbits) +{ + uint32_t bits; + + for (bits = 0; bits < srcbits; bits += 6) { + if (dstlen < 2) + return NULL; + *dst++ = itoa64[src & 0x3f]; + dstlen--; + src >>= 6; + } + + if (src || dstlen < 1) + return NULL; + + *dst = 0; /* NUL terminate just in case */ + + return dst; +} + +static uint8_t *encode64(uint8_t *dst, size_t dstlen, + const uint8_t *src, size_t srclen) +{ + size_t i; + + for (i = 0; i < srclen; ) { + uint8_t *dnext; + uint32_t value = 0, bits = 0; + do { + value |= (uint32_t)src[i++] << bits; + bits += 8; + } while (bits < 24 && i < srclen); + dnext = encode64_uint32_fixed(dst, dstlen, value, bits); + if (!dnext) + return NULL; + dstlen -= dnext - dst; + dst = dnext; + } + + if (dstlen < 1) + return NULL; + + *dst = 0; /* NUL terminate just in case */ + + return dst; +} + +static const uint8_t *decode64_uint32_fixed(uint32_t *dst, uint32_t dstbits, + const uint8_t *src) +{ + uint32_t bits; + + *dst = 0; + for (bits = 0; bits < dstbits; bits += 6) { + uint32_t c = atoi64(*src++); + if (c > 63) { + *dst = 0; + return NULL; + } + *dst |= c << bits; + } + + return src; +} + +static const uint8_t *decode64(uint8_t *dst, size_t *dstlen, + const uint8_t *src, size_t srclen) +{ + size_t dstpos = 0; + + while (dstpos <= *dstlen && srclen) { + uint32_t value = 0, bits = 0; + while (srclen--) { + uint32_t c = atoi64(*src); + if (c > 63) { + srclen = 0; + break; + } + src++; + value |= c << bits; + bits += 6; + if (bits >= 24) + break; + } + if (!bits) + break; + if (bits < 12) /* must have at least one full byte */ + goto fail; + while (dstpos++ < *dstlen) { + *dst++ = value; + value >>= 8; + bits -= 8; + if (bits < 8) { /* 2 or 4 */ + if (value) /* must be 0 */ + goto fail; + bits = 0; + break; + } + } + if (bits) + goto fail; + } + + if (!srclen && dstpos <= *dstlen) { + *dstlen = dstpos; + return src; + } + +fail: + *dstlen = 0; + return NULL; +} + +typedef enum { ENC = 1, DEC = -1 } encrypt_dir_t; + +static void memxor(unsigned char *dst, unsigned char *src, size_t size) +{ + while (size--) + *dst++ ^= *src++; +} + +static void encrypt(unsigned char *data, size_t datalen, + const yescrypt_binary_t *key, encrypt_dir_t dir) +{ + SHA256_CTX ctx; + unsigned char f[32 + 4]; + size_t halflen, which; + unsigned char mask, round, target; + + if (!datalen) + return; + if (datalen > 64) + datalen = 64; + + halflen = datalen >> 1; + + which = 0; /* offset to half we are working on (0 or halflen) */ + mask = 0x0f; /* current half's extra nibble mask if datalen is odd */ + + round = 0; + target = 5; /* 6 rounds due to Jacques Patarin's CRYPTO 2004 paper */ + + if (dir == DEC) { + which = halflen; /* even round count, so swap the halves */ + mask ^= 0xff; + + round = target; + target = 0; + } + + f[32] = 0; + f[33] = sizeof(*key); + f[34] = datalen; + + do { + SHA256_Init(&ctx); + f[35] = round; + SHA256_Update(&ctx, &f[32], 4); + SHA256_Update(&ctx, key, sizeof(*key)); + SHA256_Update(&ctx, &data[which], halflen); + if (datalen & 1) { + f[0] = data[datalen - 1] & mask; + SHA256_Update(&ctx, f, 1); + } + SHA256_Final(f, &ctx); + which ^= halflen; + memxor(&data[which], f, halflen); + if (datalen & 1) { + mask ^= 0xff; + data[datalen - 1] ^= f[halflen] & mask; + } + if (round == target) + break; + round += dir; + } while (1); + + /* ctx is presumably zeroized by SHA256_Final() */ + insecure_memzero(f, sizeof(f)); +} + +uint8_t *yescrypt_r(const yescrypt_shared_t *shared, yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *setting, + const yescrypt_binary_t *key, + uint8_t *buf, size_t buflen) +{ + unsigned char saltbin[64], hashbin[32]; + const uint8_t *src, *saltstr, *salt; + uint8_t *dst; + size_t need, prefixlen, saltstrlen, saltlen; + yescrypt_params_t params = { .p = 1 }; + + if (setting[0] != '$' || + (setting[1] != '7' && setting[1] != 'y') || + setting[2] != '$') + return NULL; + src = setting + 3; + + if (setting[1] == '7') { + uint32_t N_log2 = atoi64(*src++); + if (N_log2 < 1 || N_log2 > 63) + return NULL; + params.N = (uint64_t)1 << N_log2; + + src = decode64_uint32_fixed(¶ms.r, 30, src); + if (!src) + return NULL; + + src = decode64_uint32_fixed(¶ms.p, 30, src); + if (!src) + return NULL; + + if (key) + return NULL; + } else { + uint32_t flavor, N_log2; + + src = decode64_uint32(&flavor, src, 0); + if (!src) + return NULL; + + if (flavor < YESCRYPT_RW) { + params.flags = flavor; + } else if (flavor <= YESCRYPT_RW + (YESCRYPT_RW_FLAVOR_MASK >> 2)) { + params.flags = YESCRYPT_RW + ((flavor - YESCRYPT_RW) << 2); + } else { + return NULL; + } + + src = decode64_uint32(&N_log2, src, 1); + if (!src || N_log2 > 63) + return NULL; + params.N = (uint64_t)1 << N_log2; + + src = decode64_uint32(¶ms.r, src, 1); + if (!src) + return NULL; + + if (*src != '$') { + uint32_t have; + + src = decode64_uint32(&have, src, 1); + if (!src) + return NULL; + + if (have & 1) { + src = decode64_uint32(¶ms.p, src, 2); + if (!src) + return NULL; + } + + if (have & 2) { + src = decode64_uint32(¶ms.t, src, 1); + if (!src) + return NULL; + } + + if (have & 4) { + src = decode64_uint32(¶ms.g, src, 1); + if (!src) + return NULL; + } + + if (have & 8) { + uint32_t NROM_log2; + src = decode64_uint32(&NROM_log2, src, 1); + if (!src || NROM_log2 > 63) + return NULL; + params.NROM = (uint64_t)1 << NROM_log2; + } + } + + if (*src++ != '$') + return NULL; + } + + prefixlen = src - setting; + + saltstr = src; + src = (uint8_t *)strrchr((char *)saltstr, '$'); + if (src) + saltstrlen = src - saltstr; + else + saltstrlen = strlen((char *)saltstr); + + if (setting[1] == '7') { + salt = saltstr; + saltlen = saltstrlen; + } else { + const uint8_t *saltend; + + saltlen = sizeof(saltbin); + saltend = decode64(saltbin, &saltlen, saltstr, saltstrlen); + + if (!saltend || (size_t)(saltend - saltstr) != saltstrlen) + goto fail; + + salt = saltbin; + + if (key) + encrypt(saltbin, saltlen, key, ENC); + } + + need = prefixlen + saltstrlen + 1 + HASH_LEN + 1; + if (need > buflen || need < saltstrlen) + goto fail; + + if (yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, + ¶ms, hashbin, sizeof(hashbin))) + goto fail; + + if (key) { + insecure_memzero(saltbin, sizeof(saltbin)); + encrypt(hashbin, sizeof(hashbin), key, ENC); + } + + dst = buf; + memcpy(dst, setting, prefixlen + saltstrlen); + dst += prefixlen + saltstrlen; + *dst++ = '$'; + + dst = encode64(dst, buflen - (dst - buf), hashbin, sizeof(hashbin)); + insecure_memzero(hashbin, sizeof(hashbin)); + if (!dst || dst >= buf + buflen) + return NULL; + + *dst = 0; /* NUL termination */ + + return buf; + +fail: + insecure_memzero(saltbin, sizeof(saltbin)); + insecure_memzero(hashbin, sizeof(hashbin)); + return NULL; +} + +uint8_t *yescrypt(const uint8_t *passwd, const uint8_t *setting) +{ + /* prefix, '$', hash, NUL */ + static uint8_t buf[PREFIX_LEN + 1 + HASH_LEN + 1]; + yescrypt_local_t local; + uint8_t *retval; + + if (yescrypt_init_local(&local)) + return NULL; + retval = yescrypt_r(NULL, &local, + passwd, strlen((char *)passwd), setting, NULL, buf, sizeof(buf)); + if (yescrypt_free_local(&local)) + return NULL; + return retval; +} + +uint8_t *yescrypt_reencrypt(uint8_t *hash, + const yescrypt_binary_t *from_key, + const yescrypt_binary_t *to_key) +{ + uint8_t *retval = NULL, *saltstart, *hashstart; + const uint8_t *hashend; + unsigned char saltbin[64], hashbin[32]; + size_t saltstrlen, saltlen = 0, hashlen; + + if (strncmp((char *)hash, "$y$", 3)) + return NULL; + + saltstart = NULL; + hashstart = (uint8_t *)strrchr((char *)hash, '$'); + if (hashstart) { + if (hashstart > (uint8_t *)hash) { + saltstart = hashstart - 1; + while (*saltstart != '$' && saltstart > hash) + saltstart--; + if (*saltstart == '$') + saltstart++; + } + hashstart++; + } else { + hashstart = hash; + } + saltstrlen = saltstart ? (hashstart - 1 - saltstart) : 0; + if (saltstrlen > BYTES2CHARS(64) || + strlen((char *)hashstart) != HASH_LEN) + return NULL; + + if (saltstrlen) { + const uint8_t *saltend; + saltlen = sizeof(saltbin); + saltend = decode64(saltbin, &saltlen, saltstart, saltstrlen); + if (!saltend || *saltend != '$' || saltlen < 1 || saltlen > 64) + goto out; + + if (from_key) + encrypt(saltbin, saltlen, from_key, ENC); + if (to_key) + encrypt(saltbin, saltlen, to_key, DEC); + } + + hashlen = sizeof(hashbin); + hashend = decode64(hashbin, &hashlen, hashstart, HASH_LEN); + if (!hashend || *hashend || hashlen != sizeof(hashbin)) + goto out; + + if (from_key) + encrypt(hashbin, hashlen, from_key, DEC); + if (to_key) + encrypt(hashbin, hashlen, to_key, ENC); + + if (saltstrlen) { + if (!encode64(saltstart, saltstrlen + 1, saltbin, saltlen)) + goto out; /* can't happen */ + *(saltstart + saltstrlen) = '$'; + } + + if (!encode64(hashstart, HASH_LEN + 1, hashbin, hashlen)) + goto out; /* can't happen */ + + retval = hash; + +out: + insecure_memzero(saltbin, sizeof(saltbin)); + insecure_memzero(hashbin, sizeof(hashbin)); + + return retval; +} + +static uint32_t N2log2(uint64_t N) +{ + uint32_t N_log2; + + if (N < 2) + return 0; + + N_log2 = 2; + while (N >> N_log2 != 0) + N_log2++; + N_log2--; + + if (N >> N_log2 != 1) + return 0; + + return N_log2; +} + +uint8_t *yescrypt_encode_params_r(const yescrypt_params_t *params, + const uint8_t *src, size_t srclen, + uint8_t *buf, size_t buflen) +{ + uint32_t flavor, N_log2, NROM_log2, have; + uint8_t *dst; + + if (srclen > SIZE_MAX / 16) + return NULL; + + if (params->flags < YESCRYPT_RW) { + flavor = params->flags; + } else if ((params->flags & YESCRYPT_MODE_MASK) == YESCRYPT_RW && + params->flags <= (YESCRYPT_RW | YESCRYPT_RW_FLAVOR_MASK)) { + flavor = YESCRYPT_RW + (params->flags >> 2); + } else { + return NULL; + } + + N_log2 = N2log2(params->N); + if (!N_log2) + return NULL; + + NROM_log2 = N2log2(params->NROM); + if (params->NROM && !NROM_log2) + return NULL; + + if ((uint64_t)params->r * (uint64_t)params->p >= (1U << 30)) + return NULL; + + dst = buf; + *dst++ = '$'; + *dst++ = 'y'; + *dst++ = '$'; + + dst = encode64_uint32(dst, buflen - (dst - buf), flavor, 0); + if (!dst) + return NULL; + + dst = encode64_uint32(dst, buflen - (dst - buf), N_log2, 1); + if (!dst) + return NULL; + + dst = encode64_uint32(dst, buflen - (dst - buf), params->r, 1); + if (!dst) + return NULL; + + have = 0; + if (params->p != 1) + have |= 1; + if (params->t) + have |= 2; + if (params->g) + have |= 4; + if (NROM_log2) + have |= 8; + + if (have) { + dst = encode64_uint32(dst, buflen - (dst - buf), have, 1); + if (!dst) + return NULL; + } + + if (params->p != 1) { + dst = encode64_uint32(dst, buflen - (dst - buf), params->p, 2); + if (!dst) + return NULL; + } + + if (params->t) { + dst = encode64_uint32(dst, buflen - (dst - buf), params->t, 1); + if (!dst) + return NULL; + } + + if (params->g) { + dst = encode64_uint32(dst, buflen - (dst - buf), params->g, 1); + if (!dst) + return NULL; + } + + if (NROM_log2) { + dst = encode64_uint32(dst, buflen - (dst - buf), NROM_log2, 1); + if (!dst) + return NULL; + } + + if (dst >= buf + buflen) + return NULL; + + *dst++ = '$'; + + dst = encode64(dst, buflen - (dst - buf), src, srclen); + if (!dst || dst >= buf + buflen) + return NULL; + + *dst = 0; /* NUL termination */ + + return buf; +} + +uint8_t *yescrypt_encode_params(const yescrypt_params_t *params, + const uint8_t *src, size_t srclen) +{ + /* prefix, NUL */ + static uint8_t buf[PREFIX_LEN + 1]; + return yescrypt_encode_params_r(params, src, srclen, buf, sizeof(buf)); +} + +int crypto_scrypt(const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, uint64_t N, uint32_t r, uint32_t p, + uint8_t *buf, size_t buflen) +{ + yescrypt_local_t local; + yescrypt_params_t params = { .flags = 0, .N = N, .r = r, .p = p }; + int retval; + + if (yescrypt_init_local(&local)) + return -1; + retval = yescrypt_kdf(NULL, &local, + passwd, passwdlen, salt, saltlen, ¶ms, buf, buflen); + if (yescrypt_free_local(&local)) + return -1; + return retval; +} diff --git a/deps/yescrypt-master/yescrypt-opt.c b/deps/yescrypt-master/yescrypt-opt.c new file mode 100644 index 000000000..97ef1e44c --- /dev/null +++ b/deps/yescrypt-master/yescrypt-opt.c @@ -0,0 +1,1533 @@ +/*- + * Copyright 2009 Colin Percival + * Copyright 2012-2025 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ + +/* + * AVX and especially XOP speed up Salsa20 a lot, but this mostly matters for + * classic scrypt and for YESCRYPT_WORM (which use 8 rounds of Salsa20 per + * sub-block), and much less so for YESCRYPT_RW (which uses 2 rounds of Salsa20 + * per block except during pwxform S-box initialization). + */ +#ifdef __GNUC__ +#ifdef __XOP__ +#warning "Note: XOP is enabled. That's great." +#elif defined(__AVX512VL__) +#warning "Note: AVX512VL is enabled. That's great." +#elif defined(__AVX__) +#warning "Note: AVX is enabled, which is great for classic scrypt and YESCRYPT_WORM, but is sometimes slightly slower than plain SSE2 for YESCRYPT_RW" +#elif defined(__SSE2__) +#warning "Note: AVX and XOP are not enabled, which is great for YESCRYPT_RW, but they would substantially improve performance at classic scrypt and YESCRYPT_WORM" +#elif defined(__x86_64__) || defined(__i386__) +#warning "SSE2 not enabled. Expect poor performance." +#else +#warning "Note: building generic code for non-x86. That's OK." +#endif +#endif + +/* + * The SSE4 code version has fewer instructions than the generic SSE2 version, + * but all of the instructions are SIMD, thereby wasting the scalar execution + * units. Thus, the generic SSE2 version below actually runs faster on some + * CPUs due to its balanced mix of SIMD and scalar instructions. + */ +#undef USE_SSE4_FOR_32BIT + +#ifdef __SSE2__ +/* + * GCC before 4.9 would by default unnecessarily use store/load (without + * SSE4.1) or (V)PEXTR (with SSE4.1 or AVX) instead of simply (V)MOV. + * This was tracked as GCC bug 54349. + * "-mtune=corei7" works around this, but is only supported for GCC 4.6+. + * We use inline asm for pre-4.6 GCC, further down this file. + */ +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 6 && __GNUC_MINOR__ < 9 && \ + !defined(__clang__) && !defined(__ICC) +#pragma GCC target ("tune=corei7") +#endif +#include +#ifdef __XOP__ +#include +#elif defined(__AVX512VL__) +#include +#endif +#elif defined(__SSE__) +#include +#endif + +#include +#include +#include +#include + +#include "insecure_memzero.h" +#include "sha256.h" +#include "sysendian.h" + +#define YESCRYPT_INTERNAL +#include "yescrypt.h" + +#include "yescrypt-platform.c" + +#if __STDC_VERSION__ >= 199901L +/* Have restrict */ +#elif defined(__GNUC__) +#define restrict __restrict +#else +#define restrict +#endif + +#ifdef __GNUC__ +#define unlikely(exp) __builtin_expect(exp, 0) +#else +#define unlikely(exp) (exp) +#endif + +#ifdef __SSE__ +#define PREFETCH(x, hint) _mm_prefetch((const char *)(x), (hint)); +#else +#undef PREFETCH +#endif + +typedef union { + uint32_t w[16]; + uint64_t d[8]; +#ifdef __SSE2__ + __m128i q[4]; +#endif +} salsa20_blk_t; + +static inline void salsa20_simd_shuffle(const salsa20_blk_t *Bin, + salsa20_blk_t *Bout) +{ +#define COMBINE(out, in1, in2) \ + Bout->d[out] = Bin->w[in1 * 2] | ((uint64_t)Bin->w[in2 * 2 + 1] << 32); + COMBINE(0, 0, 2) + COMBINE(1, 5, 7) + COMBINE(2, 2, 4) + COMBINE(3, 7, 1) + COMBINE(4, 4, 6) + COMBINE(5, 1, 3) + COMBINE(6, 6, 0) + COMBINE(7, 3, 5) +#undef COMBINE +} + +static inline void salsa20_simd_unshuffle(const salsa20_blk_t *Bin, + salsa20_blk_t *Bout) +{ +#define UNCOMBINE(out, in1, in2) \ + Bout->w[out * 2] = Bin->d[in1]; \ + Bout->w[out * 2 + 1] = Bin->d[in2] >> 32; + UNCOMBINE(0, 0, 6) + UNCOMBINE(1, 5, 3) + UNCOMBINE(2, 2, 0) + UNCOMBINE(3, 7, 5) + UNCOMBINE(4, 4, 2) + UNCOMBINE(5, 1, 7) + UNCOMBINE(6, 6, 4) + UNCOMBINE(7, 3, 1) +#undef UNCOMBINE +} + +#ifdef __SSE2__ +#define DECL_X \ + __m128i X0, X1, X2, X3; +#define DECL_Y \ + __m128i Y0, Y1, Y2, Y3; +#define READ_X(in) \ + X0 = (in).q[0]; X1 = (in).q[1]; X2 = (in).q[2]; X3 = (in).q[3]; +#define WRITE_X(out) \ + (out).q[0] = X0; (out).q[1] = X1; (out).q[2] = X2; (out).q[3] = X3; + +#ifdef __XOP__ +#define ARX(out, in1, in2, s) \ + out = _mm_xor_si128(out, _mm_roti_epi32(_mm_add_epi32(in1, in2), s)); +#elif defined(__AVX512VL__) +#define ARX(out, in1, in2, s) \ + out = _mm_xor_si128(out, _mm_rol_epi32(_mm_add_epi32(in1, in2), s)); +#else +#define ARX(out, in1, in2, s) { \ + __m128i tmp = _mm_add_epi32(in1, in2); \ + out = _mm_xor_si128(out, _mm_slli_epi32(tmp, s)); \ + out = _mm_xor_si128(out, _mm_srli_epi32(tmp, 32 - s)); \ +} +#endif + +#define SALSA20_2ROUNDS \ + /* Operate on "columns" */ \ + ARX(X1, X0, X3, 7) \ + ARX(X2, X1, X0, 9) \ + ARX(X3, X2, X1, 13) \ + ARX(X0, X3, X2, 18) \ + /* Rearrange data */ \ + X1 = _mm_shuffle_epi32(X1, 0x93); \ + X2 = _mm_shuffle_epi32(X2, 0x4E); \ + X3 = _mm_shuffle_epi32(X3, 0x39); \ + /* Operate on "rows" */ \ + ARX(X3, X0, X1, 7) \ + ARX(X2, X3, X0, 9) \ + ARX(X1, X2, X3, 13) \ + ARX(X0, X1, X2, 18) \ + /* Rearrange data */ \ + X1 = _mm_shuffle_epi32(X1, 0x39); \ + X2 = _mm_shuffle_epi32(X2, 0x4E); \ + X3 = _mm_shuffle_epi32(X3, 0x93); + +/** + * Apply the Salsa20 core to the block provided in (X0 ... X3). + */ +#define SALSA20_wrapper(out, rounds) { \ + __m128i Z0 = X0, Z1 = X1, Z2 = X2, Z3 = X3; \ + rounds \ + (out).q[0] = X0 = _mm_add_epi32(X0, Z0); \ + (out).q[1] = X1 = _mm_add_epi32(X1, Z1); \ + (out).q[2] = X2 = _mm_add_epi32(X2, Z2); \ + (out).q[3] = X3 = _mm_add_epi32(X3, Z3); \ +} + +/** + * Apply the Salsa20/2 core to the block provided in X. + */ +#define SALSA20_2(out) \ + SALSA20_wrapper(out, SALSA20_2ROUNDS) + +#define SALSA20_8ROUNDS \ + SALSA20_2ROUNDS SALSA20_2ROUNDS SALSA20_2ROUNDS SALSA20_2ROUNDS + +#define XOR_X(in) \ + X0 = _mm_xor_si128(X0, (in).q[0]); \ + X1 = _mm_xor_si128(X1, (in).q[1]); \ + X2 = _mm_xor_si128(X2, (in).q[2]); \ + X3 = _mm_xor_si128(X3, (in).q[3]); + +#define XOR_X_2(in1, in2) \ + X0 = _mm_xor_si128((in1).q[0], (in2).q[0]); \ + X1 = _mm_xor_si128((in1).q[1], (in2).q[1]); \ + X2 = _mm_xor_si128((in1).q[2], (in2).q[2]); \ + X3 = _mm_xor_si128((in1).q[3], (in2).q[3]); + +#define XOR_X_WRITE_XOR_Y_2(out, in) \ + (out).q[0] = Y0 = _mm_xor_si128((out).q[0], (in).q[0]); \ + (out).q[1] = Y1 = _mm_xor_si128((out).q[1], (in).q[1]); \ + (out).q[2] = Y2 = _mm_xor_si128((out).q[2], (in).q[2]); \ + (out).q[3] = Y3 = _mm_xor_si128((out).q[3], (in).q[3]); \ + X0 = _mm_xor_si128(X0, Y0); \ + X1 = _mm_xor_si128(X1, Y1); \ + X2 = _mm_xor_si128(X2, Y2); \ + X3 = _mm_xor_si128(X3, Y3); + +/** + * Apply the Salsa20/8 core to the block provided in X ^ in. + */ +#define SALSA20_8_XOR_MEM(in, out) \ + XOR_X(in) \ + SALSA20_wrapper(out, SALSA20_8ROUNDS) + +#define INTEGERIFY _mm_cvtsi128_si32(X0) + +#else /* !defined(__SSE2__) */ + +#define DECL_X \ + salsa20_blk_t X; +#define DECL_Y \ + salsa20_blk_t Y; + +#define COPY(out, in) \ + (out).d[0] = (in).d[0]; \ + (out).d[1] = (in).d[1]; \ + (out).d[2] = (in).d[2]; \ + (out).d[3] = (in).d[3]; \ + (out).d[4] = (in).d[4]; \ + (out).d[5] = (in).d[5]; \ + (out).d[6] = (in).d[6]; \ + (out).d[7] = (in).d[7]; + +#define READ_X(in) COPY(X, in) +#define WRITE_X(out) COPY(out, X) + +/** + * salsa20(B): + * Apply the Salsa20 core to the provided block. + */ +static inline void salsa20(salsa20_blk_t *restrict B, + salsa20_blk_t *restrict Bout, uint32_t doublerounds) +{ + salsa20_blk_t X; +#define x X.w + + salsa20_simd_unshuffle(B, &X); + + do { +#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) + /* Operate on columns */ + x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); + x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); + + x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); + x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); + + x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); + x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); + + x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); + x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); + + /* Operate on rows */ + x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); + x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); + + x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); + x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); + + x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); + x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); + + x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); + x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); +#undef R + } while (--doublerounds); +#undef x + + { + uint32_t i; + salsa20_simd_shuffle(&X, Bout); + for (i = 0; i < 16; i += 4) { + B->w[i] = Bout->w[i] += B->w[i]; + B->w[i + 1] = Bout->w[i + 1] += B->w[i + 1]; + B->w[i + 2] = Bout->w[i + 2] += B->w[i + 2]; + B->w[i + 3] = Bout->w[i + 3] += B->w[i + 3]; + } + } + +#if 0 + /* Too expensive */ + insecure_memzero(&X, sizeof(X)); +#endif +} + +/** + * Apply the Salsa20/2 core to the block provided in X. + */ +#define SALSA20_2(out) \ + salsa20(&X, &out, 1); + +#define XOR(out, in1, in2) \ + (out).d[0] = (in1).d[0] ^ (in2).d[0]; \ + (out).d[1] = (in1).d[1] ^ (in2).d[1]; \ + (out).d[2] = (in1).d[2] ^ (in2).d[2]; \ + (out).d[3] = (in1).d[3] ^ (in2).d[3]; \ + (out).d[4] = (in1).d[4] ^ (in2).d[4]; \ + (out).d[5] = (in1).d[5] ^ (in2).d[5]; \ + (out).d[6] = (in1).d[6] ^ (in2).d[6]; \ + (out).d[7] = (in1).d[7] ^ (in2).d[7]; + +#define XOR_X(in) XOR(X, X, in) +#define XOR_X_2(in1, in2) XOR(X, in1, in2) +#define XOR_X_WRITE_XOR_Y_2(out, in) \ + XOR(Y, out, in) \ + COPY(out, Y) \ + XOR(X, X, Y) + +/** + * Apply the Salsa20/8 core to the block provided in X ^ in. + */ +#define SALSA20_8_XOR_MEM(in, out) \ + XOR_X(in); \ + salsa20(&X, &out, 4); + +#define INTEGERIFY (uint32_t)X.d[0] +#endif + +/** + * blockmix_salsa8(Bin, Bout, r): + * Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r + * bytes in length; the output Bout must also be the same size. + */ +static void blockmix_salsa8(const salsa20_blk_t *restrict Bin, + salsa20_blk_t *restrict Bout, size_t r) +{ + size_t i; + DECL_X + + READ_X(Bin[r * 2 - 1]) + for (i = 0; i < r; i++) { + SALSA20_8_XOR_MEM(Bin[i * 2], Bout[i]) + SALSA20_8_XOR_MEM(Bin[i * 2 + 1], Bout[r + i]) + } +} + +static uint32_t blockmix_salsa8_xor(const salsa20_blk_t *restrict Bin1, + const salsa20_blk_t *restrict Bin2, salsa20_blk_t *restrict Bout, + size_t r) +{ + size_t i; + DECL_X + +#ifdef PREFETCH + PREFETCH(&Bin2[r * 2 - 1], _MM_HINT_T0) + for (i = 0; i < r - 1; i++) { + PREFETCH(&Bin2[i * 2], _MM_HINT_T0) + PREFETCH(&Bin2[i * 2 + 1], _MM_HINT_T0) + } + PREFETCH(&Bin2[i * 2], _MM_HINT_T0) +#endif + + XOR_X_2(Bin1[r * 2 - 1], Bin2[r * 2 - 1]) + for (i = 0; i < r; i++) { + XOR_X(Bin1[i * 2]) + SALSA20_8_XOR_MEM(Bin2[i * 2], Bout[i]) + XOR_X(Bin1[i * 2 + 1]) + SALSA20_8_XOR_MEM(Bin2[i * 2 + 1], Bout[r + i]) + } + + return INTEGERIFY; +} + +/* This is tunable */ +#define Swidth 8 + +/* Not tunable in this implementation, hard-coded in a few places */ +#define PWXsimple 2 +#define PWXgather 4 + +/* Derived values. Not tunable except via Swidth above. */ +#define PWXbytes (PWXgather * PWXsimple * 8) +#define Sbytes (3 * (1 << Swidth) * PWXsimple * 8) +#define Smask (((1 << Swidth) - 1) * PWXsimple * 8) +#define Smask2 (((uint64_t)Smask << 32) | Smask) + +#define DECL_SMASK2REG /* empty */ +#define FORCE_REGALLOC_3 /* empty */ +#define MAYBE_MEMORY_BARRIER /* empty */ + +#ifdef __SSE2__ +/* + * (V)PSRLDQ and (V)PSHUFD have higher throughput than (V)PSRLQ on some CPUs + * starting with Sandy Bridge. Additionally, PSHUFD uses separate source and + * destination registers, whereas the shifts would require an extra move + * instruction for our code when building without AVX. Unfortunately, PSHUFD + * is much slower on Conroe (4 cycles latency vs. 1 cycle latency for PSRLQ) + * and somewhat slower on some non-Intel CPUs (luckily not including AMD + * Bulldozer and Piledriver). + */ +#ifdef __AVX__ +#define HI32(X) \ + _mm_srli_si128((X), 4) +#elif 1 /* As an option, check for __SSE4_1__ here not to hurt Conroe */ +#define HI32(X) \ + _mm_shuffle_epi32((X), _MM_SHUFFLE(2,3,0,1)) +#else +#define HI32(X) \ + _mm_srli_epi64((X), 32) +#endif + +#if defined(__x86_64__) && \ + __GNUC__ == 4 && __GNUC_MINOR__ < 6 && !defined(__ICC) +#ifdef __AVX__ +#define MOVQ "vmovq" +#else +/* "movq" would be more correct, but "movd" is supported by older binutils + * due to an error in AMD's spec for x86-64. */ +#define MOVQ "movd" +#endif +#define EXTRACT64(X) ({ \ + uint64_t result; \ + __asm__(MOVQ " %1, %0" : "=r" (result) : "x" (X)); \ + result; \ +}) +#elif defined(__x86_64__) && !defined(_MSC_VER) && !defined(__OPEN64__) +/* MSVC and Open64 had bugs */ +#define EXTRACT64(X) _mm_cvtsi128_si64(X) +#elif defined(__x86_64__) && defined(__SSE4_1__) +/* No known bugs for this intrinsic */ +#include +#define EXTRACT64(X) _mm_extract_epi64((X), 0) +#elif defined(USE_SSE4_FOR_32BIT) && defined(__SSE4_1__) +/* 32-bit */ +#include +#if 0 +/* This is currently unused by the code below, which instead uses these two + * intrinsics explicitly when (!defined(__x86_64__) && defined(__SSE4_1__)) */ +#define EXTRACT64(X) \ + ((uint64_t)(uint32_t)_mm_cvtsi128_si32(X) | \ + ((uint64_t)(uint32_t)_mm_extract_epi32((X), 1) << 32)) +#endif +#else +/* 32-bit or compilers with known past bugs in _mm_cvtsi128_si64() */ +#define EXTRACT64(X) \ + ((uint64_t)(uint32_t)_mm_cvtsi128_si32(X) | \ + ((uint64_t)(uint32_t)_mm_cvtsi128_si32(HI32(X)) << 32)) +#endif + +#if defined(__x86_64__) && (defined(__AVX__) || !defined(__GNUC__)) +/* 64-bit with AVX */ +/* Force use of 64-bit AND instead of two 32-bit ANDs */ +#undef DECL_SMASK2REG +#if defined(__GNUC__) && !defined(__ICC) +#define DECL_SMASK2REG uint64_t Smask2reg = Smask2; +/* Force use of lower-numbered registers to reduce number of prefixes, relying + * on out-of-order execution and register renaming. */ +#define FORCE_REGALLOC_1 \ + __asm__("" : "=a" (x), "+d" (Smask2reg), "+S" (S0), "+D" (S1)); +#define FORCE_REGALLOC_2 \ + __asm__("" : : "c" (lo)); +#else +static volatile uint64_t Smask2var = Smask2; +#define DECL_SMASK2REG uint64_t Smask2reg = Smask2var; +#define FORCE_REGALLOC_1 /* empty */ +#define FORCE_REGALLOC_2 /* empty */ +#endif +#define PWXFORM_SIMD(X) { \ + uint64_t x; \ + FORCE_REGALLOC_1 \ + uint32_t lo = x = EXTRACT64(X) & Smask2reg; \ + FORCE_REGALLOC_2 \ + uint32_t hi = x >> 32; \ + X = _mm_mul_epu32(HI32(X), X); \ + X = _mm_add_epi64(X, *(__m128i *)(S0 + lo)); \ + X = _mm_xor_si128(X, *(__m128i *)(S1 + hi)); \ +} +#elif defined(__x86_64__) +/* 64-bit without AVX. This relies on out-of-order execution and register + * renaming. It may actually be fastest on CPUs with AVX(2) as well - e.g., + * it runs great on Haswell. */ +#warning "Note: using x86-64 inline assembly for YESCRYPT_RW. That's great." +/* We need a compiler memory barrier between sub-blocks to ensure that none of + * the writes into what was S2 during processing of the previous sub-block are + * postponed until after a read from S0 or S1 in the inline asm code below. */ +#undef MAYBE_MEMORY_BARRIER +#define MAYBE_MEMORY_BARRIER \ + __asm__("" : : : "memory"); +#ifdef __ILP32__ /* x32 */ +#define REGISTER_PREFIX "e" +#else +#define REGISTER_PREFIX "r" +#endif +#define PWXFORM_SIMD(X) { \ + __m128i H; \ + __asm__( \ + "movd %0, %%rax\n\t" \ + "pshufd $0xb1, %0, %1\n\t" \ + "andq %2, %%rax\n\t" \ + "pmuludq %1, %0\n\t" \ + "movl %%eax, %%ecx\n\t" \ + "shrq $0x20, %%rax\n\t" \ + "paddq (%3,%%" REGISTER_PREFIX "cx), %0\n\t" \ + "pxor (%4,%%" REGISTER_PREFIX "ax), %0\n\t" \ + : "+x" (X), "=x" (H) \ + : "d" (Smask2), "S" (S0), "D" (S1) \ + : "cc", "ax", "cx"); \ +} +#elif defined(USE_SSE4_FOR_32BIT) && defined(__SSE4_1__) +/* 32-bit with SSE4.1 */ +#define PWXFORM_SIMD(X) { \ + __m128i x = _mm_and_si128(X, _mm_set1_epi64x(Smask2)); \ + __m128i s0 = *(__m128i *)(S0 + (uint32_t)_mm_cvtsi128_si32(x)); \ + __m128i s1 = *(__m128i *)(S1 + (uint32_t)_mm_extract_epi32(x, 1)); \ + X = _mm_mul_epu32(HI32(X), X); \ + X = _mm_add_epi64(X, s0); \ + X = _mm_xor_si128(X, s1); \ +} +#else +/* 32-bit without SSE4.1 */ +#define PWXFORM_SIMD(X) { \ + uint64_t x = EXTRACT64(X) & Smask2; \ + __m128i s0 = *(__m128i *)(S0 + (uint32_t)x); \ + __m128i s1 = *(__m128i *)(S1 + (x >> 32)); \ + X = _mm_mul_epu32(HI32(X), X); \ + X = _mm_add_epi64(X, s0); \ + X = _mm_xor_si128(X, s1); \ +} +#endif + +#define PWXFORM_ROUND \ + PWXFORM_SIMD(X0) \ + PWXFORM_SIMD(X1) \ + PWXFORM_SIMD(X2) \ + PWXFORM_SIMD(X3) + +#if defined(__x86_64__) && defined(__GNUC__) && !defined(__ICC) +#undef FORCE_REGALLOC_3 +#define FORCE_REGALLOC_3 __asm__("" : : "b" (Sw)); +#endif + +#else /* !defined(__SSE2__) */ + +#define PWXFORM_SIMD(x0, x1) { \ + uint64_t x = x0 & Smask2; \ + uint64_t *p0 = (uint64_t *)(S0 + (uint32_t)x); \ + uint64_t *p1 = (uint64_t *)(S1 + (x >> 32)); \ + x0 = ((x0 >> 32) * (uint32_t)x0 + p0[0]) ^ p1[0]; \ + x1 = ((x1 >> 32) * (uint32_t)x1 + p0[1]) ^ p1[1]; \ +} + +#define PWXFORM_ROUND \ + PWXFORM_SIMD(X.d[0], X.d[1]) \ + PWXFORM_SIMD(X.d[2], X.d[3]) \ + PWXFORM_SIMD(X.d[4], X.d[5]) \ + PWXFORM_SIMD(X.d[6], X.d[7]) +#endif + +/* + * This offset helps address the 256-byte write block via the single-byte + * displacements encodable in x86(-64) instructions. It is needed because the + * displacements are signed. Without it, we'd get 4-byte displacements for + * half of the writes. Setting it to 0x80 instead of 0x7c would avoid needing + * a displacement for one of the writes, but then the LEA instruction would + * need a 4-byte displacement. + */ +#define PWXFORM_WRITE_OFFSET 0x7c + +#define PWXFORM_WRITE \ + WRITE_X(*(salsa20_blk_t *)(Sw - PWXFORM_WRITE_OFFSET)) \ + Sw += 64; + +#define PWXFORM { \ + uint8_t *Sw = S2 + w + PWXFORM_WRITE_OFFSET; \ + FORCE_REGALLOC_3 \ + MAYBE_MEMORY_BARRIER \ + PWXFORM_ROUND \ + PWXFORM_ROUND PWXFORM_WRITE \ + PWXFORM_ROUND PWXFORM_WRITE \ + PWXFORM_ROUND PWXFORM_WRITE \ + PWXFORM_ROUND PWXFORM_WRITE \ + PWXFORM_ROUND \ + w = (w + 64 * 4) & Smask2; \ + { \ + uint8_t *Stmp = S2; \ + S2 = S1; \ + S1 = S0; \ + S0 = Stmp; \ + } \ +} + +typedef struct { + uint8_t *S0, *S1, *S2; + size_t w; +} pwxform_ctx_t; + +#define Salloc (Sbytes + ((sizeof(pwxform_ctx_t) + 63) & ~63U)) + +/** + * blockmix_pwxform(Bin, Bout, r, S): + * Compute Bout = BlockMix_pwxform{salsa20/2, r, S}(Bin). The input Bin must + * be 128r bytes in length; the output Bout must also be the same size. + */ +static void blockmix(const salsa20_blk_t *restrict Bin, + salsa20_blk_t *restrict Bout, size_t r, pwxform_ctx_t *restrict ctx) +{ + uint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2; + size_t w = ctx->w; + size_t i; + DECL_X + + /* Convert count of 128-byte blocks to max index of 64-byte block */ + r = r * 2 - 1; + + READ_X(Bin[r]) + + DECL_SMASK2REG + + i = 0; + do { + XOR_X(Bin[i]) + PWXFORM + if (unlikely(i >= r)) + break; + WRITE_X(Bout[i]) + i++; + } while (1); + + ctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2; + ctx->w = w; + + SALSA20_2(Bout[i]) +} + +static uint32_t blockmix_xor(const salsa20_blk_t *Bin1, + const salsa20_blk_t *restrict Bin2, salsa20_blk_t *Bout, + size_t r, int Bin2_in_ROM, pwxform_ctx_t *restrict ctx) +{ + uint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2; + size_t w = ctx->w; + size_t i; + DECL_X + + /* Convert count of 128-byte blocks to max index of 64-byte block */ + r = r * 2 - 1; + +#ifdef PREFETCH + if (Bin2_in_ROM) { + PREFETCH(&Bin2[r], _MM_HINT_NTA) + for (i = 0; i < r; i++) { + PREFETCH(&Bin2[i], _MM_HINT_NTA) + } + } else { + PREFETCH(&Bin2[r], _MM_HINT_T0) + for (i = 0; i < r; i++) { + PREFETCH(&Bin2[i], _MM_HINT_T0) + } + } +#else + (void)Bin2_in_ROM; /* unused */ +#endif + + XOR_X_2(Bin1[r], Bin2[r]) + + DECL_SMASK2REG + + i = 0; + r--; + do { + XOR_X(Bin1[i]) + XOR_X(Bin2[i]) + PWXFORM + WRITE_X(Bout[i]) + + XOR_X(Bin1[i + 1]) + XOR_X(Bin2[i + 1]) + PWXFORM + + if (unlikely(i >= r)) + break; + + WRITE_X(Bout[i + 1]) + + i += 2; + } while (1); + i++; + + ctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2; + ctx->w = w; + + SALSA20_2(Bout[i]) + + return INTEGERIFY; +} + +static uint32_t blockmix_xor_save(salsa20_blk_t *restrict Bin1out, + salsa20_blk_t *restrict Bin2, + size_t r, pwxform_ctx_t *restrict ctx) +{ + uint8_t *S0 = ctx->S0, *S1 = ctx->S1, *S2 = ctx->S2; + size_t w = ctx->w; + size_t i; + DECL_X + DECL_Y + + /* Convert count of 128-byte blocks to max index of 64-byte block */ + r = r * 2 - 1; + +#ifdef PREFETCH + PREFETCH(&Bin2[r], _MM_HINT_T0) + for (i = 0; i < r; i++) { + PREFETCH(&Bin2[i], _MM_HINT_T0) + } +#endif + + XOR_X_2(Bin1out[r], Bin2[r]) + + DECL_SMASK2REG + + i = 0; + r--; + do { + XOR_X_WRITE_XOR_Y_2(Bin2[i], Bin1out[i]) + PWXFORM + WRITE_X(Bin1out[i]) + + XOR_X_WRITE_XOR_Y_2(Bin2[i + 1], Bin1out[i + 1]) + PWXFORM + + if (unlikely(i >= r)) + break; + + WRITE_X(Bin1out[i + 1]) + + i += 2; + } while (1); + i++; + + ctx->S0 = S0; ctx->S1 = S1; ctx->S2 = S2; + ctx->w = w; + + SALSA20_2(Bin1out[i]) + + return INTEGERIFY; +} + +/** + * integerify(B, r): + * Return the result of parsing B_{2r-1} as a little-endian integer. + */ +static inline uint32_t integerify(const salsa20_blk_t *B, size_t r) +{ +/* + * Our 64-bit words are in host byte order, which is why we don't just read + * w[0] here (would be wrong on big-endian). Also, our 32-bit words are + * SIMD-shuffled (so the next 32 bits would be part of d[6]), but currently + * this does not matter as we only care about the least significant 32 bits. + */ + return (uint32_t)B[2 * r - 1].d[0]; +} + +/** + * smix1(B, r, N, flags, V, NROM, VROM, XY, ctx): + * Compute first loop of B = SMix_r(B, N). The input B must be 128r bytes in + * length; the temporary storage V must be 128rN bytes in length; the temporary + * storage XY must be 128r+64 bytes in length. N must be even and at least 4. + * The array V must be aligned to a multiple of 64 bytes, and arrays B and XY + * to a multiple of at least 16 bytes. + */ +static void smix1(uint8_t *B, size_t r, uint32_t N, yescrypt_flags_t flags, + salsa20_blk_t *V, uint32_t NROM, const salsa20_blk_t *VROM, + salsa20_blk_t *XY, pwxform_ctx_t *ctx) +{ + size_t s = 2 * r; + salsa20_blk_t *X = V, *Y = &V[s]; + uint32_t i, j; + + for (i = 0; i < 2 * r; i++) { + const salsa20_blk_t *src = (salsa20_blk_t *)&B[i * 64]; + salsa20_blk_t *tmp = Y; + salsa20_blk_t *dst = &X[i]; + size_t k; + for (k = 0; k < 16; k++) + tmp->w[k] = le32dec(&src->w[k]); + salsa20_simd_shuffle(tmp, dst); + } + + if (VROM) { + uint32_t n; + const salsa20_blk_t *V_j; + + V_j = &VROM[(NROM - 1) * s]; + j = blockmix_xor(X, V_j, Y, r, 1, ctx) & (NROM - 1); + V_j = &VROM[j * s]; + X = Y + s; + j = blockmix_xor(Y, V_j, X, r, 1, ctx); + + for (n = 2; n < N; n <<= 1) { + uint32_t m = (n < N / 2) ? n : (N - 1 - n); + for (i = 1; i < m; i += 2) { + j &= n - 1; + j += i - 1; + V_j = &V[j * s]; + Y = X + s; + j = blockmix_xor(X, V_j, Y, r, 0, ctx) & (NROM - 1); + V_j = &VROM[j * s]; + X = Y + s; + j = blockmix_xor(Y, V_j, X, r, 1, ctx); + } + } + n >>= 1; + + j &= n - 1; + j += N - 2 - n; + V_j = &V[j * s]; + Y = X + s; + j = blockmix_xor(X, V_j, Y, r, 0, ctx) & (NROM - 1); + V_j = &VROM[j * s]; + blockmix_xor(Y, V_j, XY, r, 1, ctx); + } else if (flags & YESCRYPT_RW) { + uint32_t n; + salsa20_blk_t *V_j; + + blockmix(X, Y, r, ctx); + X = Y + s; + blockmix(Y, X, r, ctx); + j = integerify(X, r); + + for (n = 2; n < N; n <<= 1) { + uint32_t m = (n < N / 2) ? n : (N - 1 - n); + for (i = 1; i < m; i += 2) { + Y = X + s; + j &= n - 1; + j += i - 1; + V_j = &V[j * s]; + j = blockmix_xor(X, V_j, Y, r, 0, ctx); + j &= n - 1; + j += i; + V_j = &V[j * s]; + X = Y + s; + j = blockmix_xor(Y, V_j, X, r, 0, ctx); + } + } + n >>= 1; + + j &= n - 1; + j += N - 2 - n; + V_j = &V[j * s]; + Y = X + s; + j = blockmix_xor(X, V_j, Y, r, 0, ctx); + j &= n - 1; + j += N - 1 - n; + V_j = &V[j * s]; + blockmix_xor(Y, V_j, XY, r, 0, ctx); + } else { + N -= 2; + do { + blockmix_salsa8(X, Y, r); + X = Y + s; + blockmix_salsa8(Y, X, r); + Y = X + s; + } while ((N -= 2)); + + blockmix_salsa8(X, Y, r); + blockmix_salsa8(Y, XY, r); + } + + for (i = 0; i < 2 * r; i++) { + const salsa20_blk_t *src = &XY[i]; + salsa20_blk_t *tmp = &XY[s]; + salsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64]; + size_t k; + for (k = 0; k < 16; k++) + le32enc(&tmp->w[k], src->w[k]); + salsa20_simd_unshuffle(tmp, dst); + } +} + +/** + * smix2(B, r, N, Nloop, flags, V, NROM, VROM, XY, ctx): + * Compute second loop of B = SMix_r(B, N). The input B must be 128r bytes in + * length; the temporary storage V must be 128rN bytes in length; the temporary + * storage XY must be 256r bytes in length. N must be a power of 2 and at + * least 2. Nloop must be even. The array V must be aligned to a multiple of + * 64 bytes, and arrays B and XY to a multiple of at least 16 bytes. + */ +static void smix2(uint8_t *B, size_t r, uint32_t N, uint64_t Nloop, + yescrypt_flags_t flags, salsa20_blk_t *V, uint32_t NROM, + const salsa20_blk_t *VROM, salsa20_blk_t *XY, pwxform_ctx_t *ctx) +{ + size_t s = 2 * r; + salsa20_blk_t *X = XY, *Y = &XY[s]; + uint32_t i, j; + + if (Nloop == 0) + return; + + for (i = 0; i < 2 * r; i++) { + const salsa20_blk_t *src = (salsa20_blk_t *)&B[i * 64]; + salsa20_blk_t *tmp = Y; + salsa20_blk_t *dst = &X[i]; + size_t k; + for (k = 0; k < 16; k++) + tmp->w[k] = le32dec(&src->w[k]); + salsa20_simd_shuffle(tmp, dst); + } + + j = integerify(X, r) & (N - 1); + +/* + * Normally, VROM implies YESCRYPT_RW, but we check for these separately + * because our SMix resets YESCRYPT_RW for the smix2() calls operating on the + * entire V when p > 1. + */ + if (VROM && (flags & YESCRYPT_RW)) { + do { + salsa20_blk_t *V_j = &V[j * s]; + const salsa20_blk_t *VROM_j; + j = blockmix_xor_save(X, V_j, r, ctx) & (NROM - 1); + VROM_j = &VROM[j * s]; + j = blockmix_xor(X, VROM_j, X, r, 1, ctx) & (N - 1); + } while (Nloop -= 2); + } else if (VROM) { + do { + const salsa20_blk_t *V_j = &V[j * s]; + j = blockmix_xor(X, V_j, X, r, 0, ctx) & (NROM - 1); + V_j = &VROM[j * s]; + j = blockmix_xor(X, V_j, X, r, 1, ctx) & (N - 1); + } while (Nloop -= 2); + } else if (flags & YESCRYPT_RW) { + do { + salsa20_blk_t *V_j = &V[j * s]; + j = blockmix_xor_save(X, V_j, r, ctx) & (N - 1); + V_j = &V[j * s]; + j = blockmix_xor_save(X, V_j, r, ctx) & (N - 1); + } while (Nloop -= 2); + } else if (ctx) { + do { + const salsa20_blk_t *V_j = &V[j * s]; + j = blockmix_xor(X, V_j, X, r, 0, ctx) & (N - 1); + V_j = &V[j * s]; + j = blockmix_xor(X, V_j, X, r, 0, ctx) & (N - 1); + } while (Nloop -= 2); + } else { + do { + const salsa20_blk_t *V_j = &V[j * s]; + j = blockmix_salsa8_xor(X, V_j, Y, r) & (N - 1); + V_j = &V[j * s]; + j = blockmix_salsa8_xor(Y, V_j, X, r) & (N - 1); + } while (Nloop -= 2); + } + + for (i = 0; i < 2 * r; i++) { + const salsa20_blk_t *src = &X[i]; + salsa20_blk_t *tmp = Y; + salsa20_blk_t *dst = (salsa20_blk_t *)&B[i * 64]; + size_t k; + for (k = 0; k < 16; k++) + le32enc(&tmp->w[k], src->w[k]); + salsa20_simd_unshuffle(tmp, dst); + } +} + +/** + * p2floor(x): + * Largest power of 2 not greater than argument. + */ +static uint64_t p2floor(uint64_t x) +{ + uint64_t y; + while ((y = x & (x - 1))) + x = y; + return x; +} + +/** + * smix(B, r, N, p, t, flags, V, NROM, VROM, XY, S, passwd): + * Compute B = SMix_r(B, N). The input B must be 128rp bytes in length; the + * temporary storage V must be 128rN bytes in length; the temporary storage + * XY must be 256r or 256rp bytes in length (the larger size is required with + * OpenMP-enabled builds). N must be a power of 2 and at least 4. The array V + * must be aligned to a multiple of 64 bytes, and arrays B and XY to a multiple + * of at least 16 bytes (aligning them to 64 bytes as well saves cache lines + * and helps avoid false sharing in OpenMP-enabled builds when p > 1, but it + * might also result in cache bank conflicts). + */ +//hashcat: removed static, need direct access +//static void smix(uint8_t *B, size_t r, uint32_t N, uint32_t p, uint32_t t, +void smix(uint8_t *B, size_t r, uint32_t N, uint32_t p, uint32_t t, + yescrypt_flags_t flags, + salsa20_blk_t *V, uint32_t NROM, const salsa20_blk_t *VROM, + salsa20_blk_t *XY, uint8_t *S, uint8_t *passwd) +{ + size_t s = 2 * r; + uint32_t Nchunk; + uint64_t Nloop_all, Nloop_rw; + uint32_t i; + + Nchunk = N / p; + Nloop_all = Nchunk; + if (flags & YESCRYPT_RW) { + if (t <= 1) { + if (t) + Nloop_all *= 2; /* 2/3 */ + Nloop_all = (Nloop_all + 2) / 3; /* 1/3, round up */ + } else { + Nloop_all *= t - 1; + } + } else if (t) { + if (t == 1) + Nloop_all += (Nloop_all + 1) / 2; /* 1.5, round up */ + Nloop_all *= t; + } + + Nloop_rw = 0; + if (flags & YESCRYPT_INIT_SHARED) + Nloop_rw = Nloop_all; + else if (flags & YESCRYPT_RW) + Nloop_rw = Nloop_all / p; + + Nchunk &= ~(uint32_t)1; /* round down to even */ + Nloop_all++; Nloop_all &= ~(uint64_t)1; /* round up to even */ + Nloop_rw++; Nloop_rw &= ~(uint64_t)1; /* round up to even */ + +#ifdef _OPENMP +#pragma omp parallel if (p > 1) default(none) private(i) shared(B, r, N, p, flags, V, NROM, VROM, XY, S, passwd, s, Nchunk, Nloop_all, Nloop_rw) + { +#pragma omp for +#endif + for (i = 0; i < p; i++) { + uint32_t Vchunk = i * Nchunk; + uint32_t Np = (i < p - 1) ? Nchunk : (N - Vchunk); + uint8_t *Bp = &B[128 * r * i]; + salsa20_blk_t *Vp = &V[Vchunk * s]; +#ifdef _OPENMP + salsa20_blk_t *XYp = &XY[i * (2 * s)]; +#else + salsa20_blk_t *XYp = XY; +#endif + pwxform_ctx_t *ctx_i = NULL; + if (flags & YESCRYPT_RW) { + uint8_t *Si = S + i * Salloc; + smix1(Bp, 1, Sbytes / 128, 0 /* no flags */, + (salsa20_blk_t *)Si, 0, NULL, XYp, NULL); + ctx_i = (pwxform_ctx_t *)(Si + Sbytes); + ctx_i->S2 = Si; + ctx_i->S1 = Si + Sbytes / 3; + ctx_i->S0 = Si + Sbytes / 3 * 2; + ctx_i->w = 0; + if (i == 0) + HMAC_SHA256_Buf(Bp + (128 * r - 64), 64, + passwd, 32, passwd); + } + smix1(Bp, r, Np, flags, Vp, NROM, VROM, XYp, ctx_i); + smix2(Bp, r, p2floor(Np), Nloop_rw, flags, Vp, + NROM, VROM, XYp, ctx_i); + } + + if (Nloop_all > Nloop_rw) { +#ifdef _OPENMP +#pragma omp for +#endif + for (i = 0; i < p; i++) { + uint8_t *Bp = &B[128 * r * i]; +#ifdef _OPENMP + salsa20_blk_t *XYp = &XY[i * (2 * s)]; +#else + salsa20_blk_t *XYp = XY; +#endif + pwxform_ctx_t *ctx_i = NULL; + if (flags & YESCRYPT_RW) { + uint8_t *Si = S + i * Salloc; + ctx_i = (pwxform_ctx_t *)(Si + Sbytes); + } + smix2(Bp, r, N, Nloop_all - Nloop_rw, + flags & ~YESCRYPT_RW, V, NROM, VROM, XYp, ctx_i); + } + } +#ifdef _OPENMP + } +#endif +} + +/** + * yescrypt_kdf_body(shared, local, passwd, passwdlen, salt, saltlen, + * flags, N, r, p, t, NROM, buf, buflen): + * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, + * p, buflen), or a revision of scrypt as requested by flags and shared, and + * write the result into buf. + * + * shared and flags may request special modes as described in yescrypt.h. + * + * local is the thread-local data structure, allowing to preserve and reuse a + * memory allocation across calls, thereby reducing its overhead. + * + * t controls computation time while not affecting peak memory usage. + * + * Return 0 on success; or -1 on error. + * + * This optimized implementation currently limits N to the range from 4 to + * 2^31, but other implementations might not. + */ +static int yescrypt_kdf_body(const yescrypt_shared_t *shared, + yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + yescrypt_flags_t flags, uint64_t N, uint32_t r, uint32_t p, uint32_t t, + uint64_t NROM, + uint8_t *buf, size_t buflen) +{ + yescrypt_region_t tmp; + const salsa20_blk_t *VROM; + size_t B_size, V_size, XY_size, need; + uint8_t *B, *S; + salsa20_blk_t *V, *XY; + uint8_t sha256[32]; + uint8_t dk[sizeof(sha256)], *dkp = buf; + + /* Sanity-check parameters */ + switch (flags & YESCRYPT_MODE_MASK) { + case 0: /* classic scrypt - can't have anything non-standard */ + if (flags || t || NROM) + goto out_EINVAL; + break; + case YESCRYPT_WORM: + if (flags != YESCRYPT_WORM || NROM) + goto out_EINVAL; + break; + case YESCRYPT_RW: + if (flags != (flags & YESCRYPT_KNOWN_FLAGS)) + goto out_EINVAL; +#if PWXsimple == 2 && PWXgather == 4 && Sbytes == 12288 + if ((flags & YESCRYPT_RW_FLAVOR_MASK) == + (YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | + YESCRYPT_SIMPLE_2 | YESCRYPT_SBOX_12K)) + break; +#else +#error "Unsupported pwxform settings" +#endif + /* FALLTHRU */ + default: + goto out_EINVAL; + } +#if SIZE_MAX > UINT32_MAX + if (buflen > (((uint64_t)1 << 32) - 1) * 32) + goto out_EINVAL; +#endif + if ((uint64_t)r * (uint64_t)p >= 1 << 30) + goto out_EINVAL; + if (N > UINT32_MAX) + goto out_EINVAL; + if ((N & (N - 1)) != 0 || N <= 3 || r < 1 || p < 1) + goto out_EINVAL; + if (r > SIZE_MAX / 256 / p || + N > SIZE_MAX / 128 / r) + goto out_EINVAL; + if (flags & YESCRYPT_RW) { + if (N / p <= 3 || p > SIZE_MAX / Salloc) + goto out_EINVAL; + } +#ifdef _OPENMP + else if (N > SIZE_MAX / 128 / (r * p)) { + goto out_EINVAL; + } +#endif + + VROM = NULL; + if (shared) { + uint64_t expected_size = (size_t)128 * r * NROM; + if ((NROM & (NROM - 1)) != 0 || + NROM <= 1 || NROM > UINT32_MAX || + shared->aligned_size < expected_size) + goto out_EINVAL; + if (!(flags & YESCRYPT_INIT_SHARED)) { + uint64_t *tag = (uint64_t *) + ((uint8_t *)shared->aligned + expected_size - 48); + if (tag[0] != YESCRYPT_ROM_TAG1 || tag[1] != YESCRYPT_ROM_TAG2) + goto out_EINVAL; + } + VROM = shared->aligned; + } else { + if (NROM) + goto out_EINVAL; + } + + /* Allocate memory */ + V = NULL; + V_size = (size_t)128 * r * N; +#ifdef _OPENMP + if (!(flags & YESCRYPT_RW)) + V_size *= p; +#endif + need = V_size; + if (flags & YESCRYPT_INIT_SHARED) { + if (local->aligned_size < need) { + if (local->base || local->aligned || + local->base_size || local->aligned_size) + goto out_EINVAL; + if (!alloc_region(local, need)) + return -1; + } + if (flags & YESCRYPT_ALLOC_ONLY) + return -2; /* expected "failure" */ + V = (salsa20_blk_t *)local->aligned; + need = 0; + } + B_size = (size_t)128 * r * p; + need += B_size; + if (need < B_size) + goto out_EINVAL; + XY_size = (size_t)256 * r; +#ifdef _OPENMP + XY_size *= p; +#endif + need += XY_size; + if (need < XY_size) + goto out_EINVAL; + if (flags & YESCRYPT_RW) { + size_t S_size = (size_t)Salloc * p; + need += S_size; + if (need < S_size) + goto out_EINVAL; + } + if (flags & YESCRYPT_INIT_SHARED) { + if (!alloc_region(&tmp, need)) + return -1; + B = (uint8_t *)tmp.aligned; + XY = (salsa20_blk_t *)((uint8_t *)B + B_size); + } else { + init_region(&tmp); + if (local->aligned_size < need) { + if (free_region(local)) + return -1; + if (!alloc_region(local, need)) + return -1; + } + if (flags & YESCRYPT_ALLOC_ONLY) + return -3; /* expected "failure" */ + B = (uint8_t *)local->aligned; + V = (salsa20_blk_t *)((uint8_t *)B + B_size); + XY = (salsa20_blk_t *)((uint8_t *)V + V_size); + } + S = NULL; + if (flags & YESCRYPT_RW) + S = (uint8_t *)XY + XY_size; + + if (flags) { + HMAC_SHA256_Buf("yescrypt-prehash", + (flags & YESCRYPT_PREHASH) ? 16 : 8, + passwd, passwdlen, sha256); + passwd = sha256; + passwdlen = sizeof(sha256); + } + + PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size); + + if (flags) + memcpy(sha256, B, sizeof(sha256)); + + if (p == 1 || (flags & YESCRYPT_RW)) { + smix(B, r, N, p, t, flags, V, NROM, VROM, XY, S, sha256); + } else { + uint32_t i; +#ifdef _OPENMP +#pragma omp parallel for default(none) private(i) shared(B, r, N, p, t, flags, V, NROM, VROM, XY, S) +#endif + for (i = 0; i < p; i++) { +#ifdef _OPENMP + smix(&B[(size_t)128 * r * i], r, N, 1, t, flags, + &V[(size_t)2 * r * i * N], + NROM, VROM, + &XY[(size_t)4 * r * i], NULL, NULL); +#else + smix(&B[(size_t)128 * r * i], r, N, 1, t, flags, V, + NROM, VROM, XY, NULL, NULL); +#endif + } + } + + dkp = buf; + if (flags && buflen < sizeof(dk)) { + PBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, dk, sizeof(dk)); + dkp = dk; + } + + PBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen); + + /* + * Except when computing classic scrypt, allow all computation so far + * to be performed on the client. The final steps below match those of + * SCRAM (RFC 5802), so that an extension of SCRAM (with the steps so + * far in place of SCRAM's use of PBKDF2 and with SHA-256 in place of + * SCRAM's use of SHA-1) would be usable with yescrypt hashes. + */ + if (flags && !(flags & YESCRYPT_PREHASH)) { + /* Compute ClientKey */ + HMAC_SHA256_Buf(dkp, sizeof(dk), "Client Key", 10, sha256); + /* Compute StoredKey */ + { + size_t clen = buflen; + if (clen > sizeof(dk)) + clen = sizeof(dk); + SHA256_Buf(sha256, sizeof(sha256), dk); + memcpy(buf, dk, clen); + } + } + + if (flags) { + insecure_memzero(sha256, sizeof(sha256)); + insecure_memzero(dk, sizeof(dk)); + } + + if (free_region(&tmp)) { + insecure_memzero(buf, buflen); /* must preserve errno */ + return -1; + } + + /* Success! */ + return 0; + +out_EINVAL: + errno = EINVAL; + return -1; +} + +/** + * yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, params, + * buf, buflen): + * Compute scrypt or its revision as requested by the parameters. The inputs + * to this function are the same as those for yescrypt_kdf_body() above, with + * the addition of g, which controls hash upgrades (0 for no upgrades so far). + */ +int yescrypt_kdf(const yescrypt_shared_t *shared, yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + const yescrypt_params_t *params, + uint8_t *buf, size_t buflen) +{ + yescrypt_flags_t flags = params->flags; + uint64_t N = params->N; + uint32_t r = params->r; + uint32_t p = params->p; + uint32_t t = params->t; + uint32_t g = params->g; + uint64_t NROM = params->NROM; + uint8_t dk[32]; + int retval; + + /* Support for hash upgrades has been temporarily removed */ + if (g) { + errno = EINVAL; + return -1; + } + + if ((flags & (YESCRYPT_RW | YESCRYPT_INIT_SHARED)) == YESCRYPT_RW && + p >= 1 && N / p >= 0x100 && N / p * r >= 0x20000) { + if (yescrypt_kdf_body(shared, local, + passwd, passwdlen, salt, saltlen, + flags | YESCRYPT_ALLOC_ONLY, N, r, p, t, NROM, + buf, buflen) != -3) { + errno = EINVAL; + return -1; + } + if ((retval = yescrypt_kdf_body(shared, local, + passwd, passwdlen, salt, saltlen, + flags | YESCRYPT_PREHASH, N >> 6, r, p, 0, NROM, + dk, sizeof(dk)))) + return retval; + passwd = dk; + passwdlen = sizeof(dk); + } + + retval = yescrypt_kdf_body(shared, local, + passwd, passwdlen, salt, saltlen, + flags, N, r, p, t, NROM, buf, buflen); +#ifndef SKIP_MEMZERO + if (passwd == dk) + insecure_memzero(dk, sizeof(dk)); +#endif + return retval; +} + +int yescrypt_init_shared(yescrypt_shared_t *shared, + const uint8_t *seed, size_t seedlen, + const yescrypt_params_t *params) +{ + yescrypt_params_t subparams; + yescrypt_shared_t half1, half2; + uint8_t salt[32]; + uint64_t *tag; + + subparams = *params; + subparams.flags |= YESCRYPT_INIT_SHARED; + subparams.N = params->NROM; + subparams.NROM = 0; + + if (!(params->flags & YESCRYPT_RW) || params->N || params->g) + return -1; + + if (params->flags & YESCRYPT_SHARED_PREALLOCATED) { + if (!shared->aligned || !shared->aligned_size) + return -1; + +/* Overwrite a possible old ROM tag before we overwrite the rest */ + tag = (uint64_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + memset(tag, 0, 48); + } else { + init_region(shared); + + subparams.flags |= YESCRYPT_ALLOC_ONLY; + if (yescrypt_kdf(NULL, shared, NULL, 0, NULL, 0, &subparams, + NULL, 0) != -2 || !shared->aligned) + return -1; + subparams.flags -= YESCRYPT_ALLOC_ONLY; + } + + subparams.N /= 2; + + half1 = *shared; + half1.aligned_size /= 2; + half2 = half1; + half2.aligned = (uint8_t *)half2.aligned + half1.aligned_size; + + if (yescrypt_kdf(NULL, &half1, + seed, seedlen, (const uint8_t *)"yescrypt-ROMhash", 16, &subparams, + salt, sizeof(salt))) + goto fail; + + subparams.NROM = subparams.N; + + if (yescrypt_kdf(&half1, &half2, + seed, seedlen, salt, sizeof(salt), &subparams, salt, sizeof(salt))) + goto fail; + + if (yescrypt_kdf(&half2, &half1, + seed, seedlen, salt, sizeof(salt), &subparams, salt, sizeof(salt))) + goto fail; + + tag = (uint64_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + tag[0] = YESCRYPT_ROM_TAG1; + tag[1] = YESCRYPT_ROM_TAG2; + tag[2] = le64dec(salt); + tag[3] = le64dec(salt + 8); + tag[4] = le64dec(salt + 16); + tag[5] = le64dec(salt + 24); + + insecure_memzero(salt, sizeof(salt)); + return 0; + +fail: + insecure_memzero(salt, sizeof(salt)); + if (!(params->flags & YESCRYPT_SHARED_PREALLOCATED)) + free_region(shared); + return -1; +} + +yescrypt_binary_t *yescrypt_digest_shared(yescrypt_shared_t *shared) +{ + static yescrypt_binary_t digest; + uint64_t *tag; + + if (shared->aligned_size < 48) + return NULL; + + tag = (uint64_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + + if (tag[0] != YESCRYPT_ROM_TAG1 || tag[1] != YESCRYPT_ROM_TAG2) + return NULL; + + le64enc(digest.uc, tag[2]); + le64enc(digest.uc + 8, tag[3]); + le64enc(digest.uc + 16, tag[4]); + le64enc(digest.uc + 24, tag[5]); + + return &digest; +} + +int yescrypt_free_shared(yescrypt_shared_t *shared) +{ + return free_region(shared); +} + +int yescrypt_init_local(yescrypt_local_t *local) +{ + init_region(local); + return 0; +} + +int yescrypt_free_local(yescrypt_local_t *local) +{ + return free_region(local); +} diff --git a/deps/yescrypt-master/yescrypt-platform.c b/deps/yescrypt-master/yescrypt-platform.c new file mode 100644 index 000000000..6632f14c0 --- /dev/null +++ b/deps/yescrypt-master/yescrypt-platform.c @@ -0,0 +1,110 @@ +/*- + * Copyright 2013-2018,2022 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef __unix__ +#include +#endif +#ifdef __linux__ +#include /* for MAP_HUGE_2MB */ +#endif + +#define HUGEPAGE_THRESHOLD (32 * 1024 * 1024) + +#ifdef __x86_64__ +#define HUGEPAGE_SIZE (2 * 1024 * 1024) +#else +#undef HUGEPAGE_SIZE +#endif + +static void *alloc_region(yescrypt_region_t *region, size_t size) +{ + size_t base_size = size; + uint8_t *base, *aligned; +#ifdef MAP_ANON + int flags = +#ifdef MAP_NOCORE + MAP_NOCORE | +#endif + MAP_ANON | MAP_PRIVATE; +#if defined(MAP_HUGETLB) && defined(MAP_HUGE_2MB) && defined(HUGEPAGE_SIZE) + size_t new_size = size; + const size_t hugepage_mask = (size_t)HUGEPAGE_SIZE - 1; + if (size >= HUGEPAGE_THRESHOLD && size + hugepage_mask >= size) { + flags |= MAP_HUGETLB | MAP_HUGE_2MB; +/* + * Linux's munmap() fails on MAP_HUGETLB mappings if size is not a multiple of + * huge page size, so let's round up to huge page size here. + */ + new_size = size + hugepage_mask; + new_size &= ~hugepage_mask; + } + base = mmap(NULL, new_size, PROT_READ | PROT_WRITE, flags, -1, 0); + if (base != MAP_FAILED) { + base_size = new_size; + } else if (flags & MAP_HUGETLB) { + flags &= ~(MAP_HUGETLB | MAP_HUGE_2MB); + base = mmap(NULL, size, PROT_READ | PROT_WRITE, flags, -1, 0); + } + +#else + base = mmap(NULL, size, PROT_READ | PROT_WRITE, flags, -1, 0); +#endif + if (base == MAP_FAILED) + base = NULL; + aligned = base; +#elif defined(HAVE_POSIX_MEMALIGN) + if ((errno = posix_memalign((void **)&base, 64, size)) != 0) + base = NULL; + aligned = base; +#else + base = aligned = NULL; + if (size + 63 < size) { + errno = ENOMEM; + } else if ((base = malloc(size + 63)) != NULL) { + aligned = base + 63; + aligned -= (uintptr_t)aligned & 63; + } +#endif + region->base = base; + region->aligned = aligned; + region->base_size = base ? base_size : 0; + region->aligned_size = base ? size : 0; + return aligned; +} + +static inline void init_region(yescrypt_region_t *region) +{ + region->base = region->aligned = NULL; + region->base_size = region->aligned_size = 0; +} + +static int free_region(yescrypt_region_t *region) +{ + if (region->base) { +#ifdef MAP_ANON + if (munmap(region->base, region->base_size)) + return -1; +#else + free(region->base); +#endif + } + init_region(region); + return 0; +} diff --git a/deps/yescrypt-master/yescrypt-ref.c b/deps/yescrypt-master/yescrypt-ref.c new file mode 100644 index 000000000..532304519 --- /dev/null +++ b/deps/yescrypt-master/yescrypt-ref.c @@ -0,0 +1,925 @@ +/*- + * Copyright 2009 Colin Percival + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + * + * This is the reference implementation. Its purpose is to provide a simple + * human- and machine-readable specification that implementations intended + * for actual use should be tested against. It is deliberately mostly not + * optimized, and it is not meant to be used in production. Instead, use + * yescrypt-opt.c. + */ + +#ifdef __GNUC__ +#warning "This reference implementation is deliberately mostly not optimized, nor does it make any attempt not to leave sensitive data in memory. Use yescrypt-opt.c instead unless you're testing (against) the reference implementation on purpose." +#endif + +#include +#include +#include +#include + +#include "sha256.h" +#include "sysendian.h" + +#define YESCRYPT_INTERNAL +#include "yescrypt.h" + +static void blkcpy(uint32_t *dst, const uint32_t *src, size_t count) +{ + do { + *dst++ = *src++; + } while (--count); +} + +static void blkxor(uint32_t *dst, const uint32_t *src, size_t count) +{ + do { + *dst++ ^= *src++; + } while (--count); +} + +/** + * salsa20(B): + * Apply the Salsa20 core to the provided block. + */ +static void salsa20(uint32_t B[16], uint32_t rounds) +{ + uint32_t x[16]; + size_t i; + + /* SIMD unshuffle */ + for (i = 0; i < 16; i++) + x[i * 5 % 16] = B[i]; + + for (i = 0; i < rounds; i += 2) { +#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b)))) + /* Operate on columns */ + x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); + x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); + + x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); + x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); + + x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); + x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); + + x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); + x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); + + /* Operate on rows */ + x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); + x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); + + x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); + x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); + + x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); + x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); + + x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); + x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); +#undef R + } + + /* SIMD shuffle */ + for (i = 0; i < 16; i++) + B[i] += x[i * 5 % 16]; +} + +/** + * blockmix_salsa8(B, Y, r): + * Compute B = BlockMix_{salsa20/8, r}(B). The input B must be 128r bytes in + * length; the temporary space Y must also be the same size. + */ +static void blockmix_salsa8(uint32_t *B, uint32_t *Y, size_t r) +{ + uint32_t X[16]; + size_t i; + + /* 1: X <-- B_{2r - 1} */ + blkcpy(X, &B[(2 * r - 1) * 16], 16); + + /* 2: for i = 0 to 2r - 1 do */ + for (i = 0; i < 2 * r; i++) { + /* 3: X <-- H(X xor B_i) */ + blkxor(X, &B[i * 16], 16); + salsa20(X, 8); + + /* 4: Y_i <-- X */ + blkcpy(&Y[i * 16], X, 16); + } + + /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ + for (i = 0; i < r; i++) + blkcpy(&B[i * 16], &Y[(i * 2) * 16], 16); + for (i = 0; i < r; i++) + blkcpy(&B[(i + r) * 16], &Y[(i * 2 + 1) * 16], 16); +} + +/* These are tunable, but they must meet certain constraints */ +#define PWXsimple 2 +#define PWXgather 4 +#define PWXrounds 6 +#define Swidth 8 + +/* Derived values. Not tunable on their own. */ +#define PWXbytes (PWXgather * PWXsimple * 8) +#define PWXwords (PWXbytes / sizeof(uint32_t)) +#define Sbytes (3 * (1 << Swidth) * PWXsimple * 8) +#define Swords (Sbytes / sizeof(uint32_t)) +#define Smask (((1 << Swidth) - 1) * PWXsimple * 8) +#define rmin ((PWXbytes + 127) / 128) + +typedef struct { + uint32_t *S; + uint32_t (*S0)[2], (*S1)[2], (*S2)[2]; + size_t w; +} pwxform_ctx_t; + +/** + * pwxform(B): + * Transform the provided block using the provided S-boxes. + */ +static void pwxform(uint32_t *B, pwxform_ctx_t *ctx) +{ + uint32_t (*X)[PWXsimple][2] = (uint32_t (*)[PWXsimple][2])B; + uint32_t (*S0)[2] = ctx->S0, (*S1)[2] = ctx->S1, (*S2)[2] = ctx->S2; + size_t w = ctx->w; + size_t i, j, k; + + /* 1: for i = 0 to PWXrounds - 1 do */ + for (i = 0; i < PWXrounds; i++) { + /* 2: for j = 0 to PWXgather - 1 do */ + for (j = 0; j < PWXgather; j++) { + uint32_t xl = X[j][0][0]; + uint32_t xh = X[j][0][1]; + uint32_t (*p0)[2], (*p1)[2]; + + /* 3: p0 <-- (lo(B_{j,0}) & Smask) / (PWXsimple * 8) */ + p0 = S0 + (xl & Smask) / sizeof(*S0); + /* 4: p1 <-- (hi(B_{j,0}) & Smask) / (PWXsimple * 8) */ + p1 = S1 + (xh & Smask) / sizeof(*S1); + + /* 5: for k = 0 to PWXsimple - 1 do */ + for (k = 0; k < PWXsimple; k++) { + uint64_t x, s0, s1; + + /* 6: B_{j,k} <-- (hi(B_{j,k}) * lo(B_{j,k}) + S0_{p0,k}) xor S1_{p1,k} */ + s0 = ((uint64_t)p0[k][1] << 32) + p0[k][0]; + s1 = ((uint64_t)p1[k][1] << 32) + p1[k][0]; + + xl = X[j][k][0]; + xh = X[j][k][1]; + + x = (uint64_t)xh * xl; + x += s0; + x ^= s1; + + X[j][k][0] = x; + X[j][k][1] = x >> 32; + + /* 8: if (i != 0) and (i != PWXrounds - 1) */ + if (i != 0 && i != PWXrounds - 1) { + /* 9: S2_w <-- B_j */ + S2[w][0] = x; + S2[w][1] = x >> 32; + /* 10: w <-- w + 1 */ + w++; + } + } + } + } + + /* 14: (S0, S1, S2) <-- (S2, S0, S1) */ + ctx->S0 = S2; + ctx->S1 = S0; + ctx->S2 = S1; + /* 15: w <-- w mod 2^Swidth */ + ctx->w = w & ((1 << Swidth) * PWXsimple - 1); +} + +/** + * blockmix_pwxform(B, ctx, r): + * Compute B = BlockMix_pwxform{salsa20/2, ctx, r}(B). The input B must be + * 128r bytes in length. + */ +static void blockmix_pwxform(uint32_t *B, pwxform_ctx_t *ctx, size_t r) +{ + uint32_t X[PWXwords]; + size_t r1, i; + + /* Convert 128-byte blocks to PWXbytes blocks */ + /* 1: r_1 <-- 128r / PWXbytes */ + r1 = 128 * r / PWXbytes; + + /* 2: X <-- B'_{r_1 - 1} */ + blkcpy(X, &B[(r1 - 1) * PWXwords], PWXwords); + + /* 3: for i = 0 to r_1 - 1 do */ + for (i = 0; i < r1; i++) { + /* 4: if r_1 > 1 */ + if (r1 > 1) { + /* 5: X <-- X xor B'_i */ + blkxor(X, &B[i * PWXwords], PWXwords); + } + + /* 7: X <-- pwxform(X) */ + pwxform(X, ctx); + + /* 8: B'_i <-- X */ + blkcpy(&B[i * PWXwords], X, PWXwords); + } + + /* 10: i <-- floor((r_1 - 1) * PWXbytes / 64) */ + i = (r1 - 1) * PWXbytes / 64; + + /* 11: B_i <-- H(B_i) */ + salsa20(&B[i * 16], 2); + +#if 1 /* No-op with our current pwxform settings, but do it to make sure */ + /* 12: for i = i + 1 to 2r - 1 do */ + for (i++; i < 2 * r; i++) { + /* 13: B_i <-- H(B_i xor B_{i-1}) */ + blkxor(&B[i * 16], &B[(i - 1) * 16], 16); + salsa20(&B[i * 16], 2); + } +#endif +} + +/** + * integerify(B, r): + * Return the result of parsing B_{2r-1} as a little-endian integer. + */ +static uint64_t integerify(const uint32_t *B, size_t r) +{ +/* + * Our 32-bit words are in host byte order, and word 13 is the second word of + * B_{2r-1} due to SIMD shuffling. The 64-bit value we return is also in host + * byte order, as it should be. + */ + const uint32_t *X = &B[(2 * r - 1) * 16]; + return ((uint64_t)X[13] << 32) + X[0]; +} + +/** + * p2floor(x): + * Largest power of 2 not greater than argument. + */ +static uint64_t p2floor(uint64_t x) +{ + uint64_t y; + while ((y = x & (x - 1))) + x = y; + return x; +} + +/** + * wrap(x, i): + * Wrap x to the range 0 to i-1. + */ +static uint64_t wrap(uint64_t x, uint64_t i) +{ + uint64_t n = p2floor(i); + return (x & (n - 1)) + (i - n); +} + +/** + * smix1(B, r, N, flags, V, NROM, VROM, XY, ctx): + * Compute first loop of B = SMix_r(B, N). The input B must be 128r bytes in + * length; the temporary storage V must be 128rN bytes in length; the temporary + * storage XY must be 256r bytes in length. + */ +static void smix1(uint32_t *B, size_t r, uint64_t N, yescrypt_flags_t flags, + uint32_t *V, uint64_t NROM, const uint32_t *VROM, + uint32_t *XY, pwxform_ctx_t *ctx) +{ + size_t s = 32 * r; + uint32_t *X = XY; + uint32_t *Y = &XY[s]; + uint64_t i, j; + size_t k; + + /* 1: X <-- B */ + for (k = 0; k < 2 * r; k++) + for (i = 0; i < 16; i++) + X[k * 16 + i] = le32dec(&B[k * 16 + (i * 5 % 16)]); + + /* 2: for i = 0 to N - 1 do */ + for (i = 0; i < N; i++) { + /* 3: V_i <-- X */ + blkcpy(&V[i * s], X, s); + + if (VROM && i == 0) { + /* X <-- X xor VROM_{NROM-1} */ + blkxor(X, &VROM[(NROM - 1) * s], s); + } else if (VROM && (i & 1)) { + /* j <-- Integerify(X) mod NROM */ + j = integerify(X, r) & (NROM - 1); + + /* X <-- X xor VROM_j */ + blkxor(X, &VROM[j * s], s); + } else if ((flags & YESCRYPT_RW) && i > 1) { + /* j <-- Wrap(Integerify(X), i) */ + j = wrap(integerify(X, r), i); + + /* X <-- X xor V_j */ + blkxor(X, &V[j * s], s); + } + + /* 4: X <-- H(X) */ + if (ctx) + blockmix_pwxform(X, ctx, r); + else + blockmix_salsa8(X, Y, r); + } + + /* B' <-- X */ + for (k = 0; k < 2 * r; k++) + for (i = 0; i < 16; i++) + le32enc(&B[k * 16 + (i * 5 % 16)], X[k * 16 + i]); +} + +/** + * smix2(B, r, N, Nloop, flags, V, NROM, VROM, XY, ctx): + * Compute second loop of B = SMix_r(B, N). The input B must be 128r bytes in + * length; the temporary storage V must be 128rN bytes in length; the temporary + * storage XY must be 256r bytes in length. The value N must be a power of 2 + * greater than 1. + */ +static void smix2(uint32_t *B, size_t r, uint64_t N, uint64_t Nloop, + yescrypt_flags_t flags, uint32_t *V, uint64_t NROM, + const uint32_t *VROM, uint32_t *XY, pwxform_ctx_t *ctx) +{ + size_t s = 32 * r; + uint32_t *X = XY; + uint32_t *Y = &XY[s]; + uint64_t i, j; + size_t k; + + /* X <-- B */ + for (k = 0; k < 2 * r; k++) + for (i = 0; i < 16; i++) + X[k * 16 + i] = le32dec(&B[k * 16 + (i * 5 % 16)]); + + /* 6: for i = 0 to N - 1 do */ + for (i = 0; i < Nloop; i++) { + if (VROM && (i & 1)) { + /* j <-- Integerify(X) mod NROM */ + j = integerify(X, r) & (NROM - 1); + + /* X <-- H(X xor VROM_j) */ + blkxor(X, &VROM[j * s], s); + } else { + /* 7: j <-- Integerify(X) mod N */ + j = integerify(X, r) & (N - 1); + + /* 8.1: X <-- X xor V_j */ + blkxor(X, &V[j * s], s); + /* V_j <-- X */ + if (flags & YESCRYPT_RW) + blkcpy(&V[j * s], X, s); + } + + /* 8.2: X <-- H(X) */ + if (ctx) + blockmix_pwxform(X, ctx, r); + else + blockmix_salsa8(X, Y, r); + } + + /* 10: B' <-- X */ + for (k = 0; k < 2 * r; k++) + for (i = 0; i < 16; i++) + le32enc(&B[k * 16 + (i * 5 % 16)], X[k * 16 + i]); +} + +/** + * smix(B, r, N, p, t, flags, V, NROM, VROM, XY, ctx, passwd): + * Compute B = SMix_r(B, N). The input B must be 128rp bytes in length; the + * temporary storage V must be 128rN bytes in length; the temporary storage + * XY must be 256r bytes in length. The value N must be a power of 2 greater + * than 1. + */ +static void smix(uint32_t *B, size_t r, uint64_t N, uint32_t p, uint32_t t, + yescrypt_flags_t flags, + uint32_t *V, uint64_t NROM, const uint32_t *VROM, + uint32_t *XY, pwxform_ctx_t *ctx, uint8_t *passwd) +{ + size_t s = 32 * r; + uint64_t Nchunk, Nloop_all, Nloop_rw, Vchunk; + uint32_t i; + + /* 1: n <-- N / p */ + Nchunk = N / p; + + /* 2: Nloop_all <-- fNloop(n, t, flags) */ + Nloop_all = Nchunk; + if (flags & YESCRYPT_RW) { + if (t <= 1) { + if (t) + Nloop_all *= 2; /* 2/3 */ + Nloop_all = (Nloop_all + 2) / 3; /* 1/3, round up */ + } else { + Nloop_all *= t - 1; + } + } else if (t) { + if (t == 1) + Nloop_all += (Nloop_all + 1) / 2; /* 1.5, round up */ + Nloop_all *= t; + } + + /* 6: Nloop_rw <-- 0 */ + Nloop_rw = 0; + if (flags & YESCRYPT_INIT_SHARED) { + Nloop_rw = Nloop_all; + } else { + /* 3: if YESCRYPT_RW flag is set */ + if (flags & YESCRYPT_RW) { + /* 4: Nloop_rw <-- Nloop_all / p */ + Nloop_rw = Nloop_all / p; + } + } + + /* 8: n <-- n - (n mod 2) */ + Nchunk &= ~(uint64_t)1; /* round down to even */ + /* 9: Nloop_all <-- Nloop_all + (Nloop_all mod 2) */ + Nloop_all++; Nloop_all &= ~(uint64_t)1; /* round up to even */ + /* 10: Nloop_rw <-- Nloop_rw + (Nloop_rw mod 2) */ + Nloop_rw++; Nloop_rw &= ~(uint64_t)1; /* round up to even */ + + /* 11: for i = 0 to p - 1 do */ + /* 12: u <-- in */ + for (i = 0, Vchunk = 0; i < p; i++, Vchunk += Nchunk) { + /* 13: if i = p - 1 */ + /* 14: n <-- N - u */ + /* 15: end if */ + /* 16: v <-- u + n - 1 */ + uint64_t Np = (i < p - 1) ? Nchunk : (N - Vchunk); + uint32_t *Bp = &B[i * s]; + uint32_t *Vp = &V[Vchunk * s]; + pwxform_ctx_t *ctx_i = NULL; + /* 17: if YESCRYPT_RW flag is set */ + if (flags & YESCRYPT_RW) { + ctx_i = &ctx[i]; + /* 18: SMix1_1(B_i, Sbytes / 128, S_i, no flags) */ + smix1(Bp, 1, Sbytes / 128, 0 /* no flags */, + ctx_i->S, 0, NULL, XY, NULL); + /* 19: S2_i <-- S_{i,0...2^Swidth-1} */ + ctx_i->S2 = (uint32_t (*)[2])ctx_i->S; + /* 20: S1_i <-- S_{i,2^Swidth...2*2^Swidth-1} */ + ctx_i->S1 = ctx_i->S2 + (1 << Swidth) * PWXsimple; + /* 21: S0_i <-- S_{i,2*2^Swidth...3*2^Swidth-1} */ + ctx_i->S0 = ctx_i->S1 + (1 << Swidth) * PWXsimple; + /* 22: w_i <-- 0 */ + ctx_i->w = 0; + /* 23: if i = 0 */ + if (i == 0) { + /* 24: passwd <-- HMAC-SHA256(B_{0,2r-1}, passwd) */ + HMAC_SHA256_Buf(Bp + (s - 16), 64, + passwd, 32, passwd); + } + } + /* 27: SMix1_r(B_i, n, V_{u..v}, flags) */ + smix1(Bp, r, Np, flags, Vp, NROM, VROM, XY, ctx_i); + /* 28: SMix2_r(B_i, p2floor(n), Nloop_rw, V_{u..v}, flags) */ + smix2(Bp, r, p2floor(Np), Nloop_rw, flags, Vp, + NROM, VROM, XY, ctx_i); + } + + /* 30: for i = 0 to p - 1 do */ + for (i = 0; i < p; i++) { + uint32_t *Bp = &B[i * s]; + /* 31: SMix2_r(B_i, N, Nloop_all - Nloop_rw, V, flags excluding YESCRYPT_RW) */ + smix2(Bp, r, N, Nloop_all - Nloop_rw, flags & ~YESCRYPT_RW, + V, NROM, VROM, XY, (flags & YESCRYPT_RW) ? &ctx[i] : NULL); + } +} + +/** + * yescrypt_kdf_body(shared, local, passwd, passwdlen, salt, saltlen, + * flags, N, r, p, t, NROM, buf, buflen): + * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, + * p, buflen), or a revision of scrypt as requested by flags and shared, and + * write the result into buf. + * + * shared and flags may request special modes as described in yescrypt.h. + * + * local is the thread-local data structure, allowing optimized implementations + * to preserve and reuse a memory allocation across calls, thereby reducing its + * overhead (this reference implementation does not make that optimization). + * + * t controls computation time while not affecting peak memory usage. + * + * Return 0 on success; or -1 on error. + */ +static int yescrypt_kdf_body(const yescrypt_shared_t *shared, + yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + yescrypt_flags_t flags, uint64_t N, uint32_t r, uint32_t p, uint32_t t, + uint64_t NROM, + uint8_t *buf, size_t buflen) +{ + int retval = -1; + const uint32_t *VROM; + size_t B_size, V_size; + uint32_t *B, *V, *XY, *S; + pwxform_ctx_t *pwxform_ctx; + uint32_t sha256[8]; + uint8_t dk[sizeof(sha256)], *dkp = buf; + uint32_t i; + + /* Sanity-check parameters */ + switch (flags & YESCRYPT_MODE_MASK) { + case 0: /* classic scrypt - can't have anything non-standard */ + if (flags || t || NROM) + goto out_EINVAL; + break; + case YESCRYPT_WORM: + if (flags != YESCRYPT_WORM || NROM) + goto out_EINVAL; + break; + case YESCRYPT_RW: + if (flags != (flags & YESCRYPT_KNOWN_FLAGS)) + goto out_EINVAL; +#if PWXsimple == 2 && PWXgather == 4 && PWXrounds == 6 && Sbytes == 12288 + if ((flags & YESCRYPT_RW_FLAVOR_MASK) == + (YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | + YESCRYPT_SIMPLE_2 | YESCRYPT_SBOX_12K)) + break; +#else +#error "Unsupported pwxform settings" +#endif + /* FALLTHRU */ + default: + goto out_EINVAL; + } +#if SIZE_MAX > UINT32_MAX + if (buflen > (((uint64_t)1 << 32) - 1) * 32) + goto out_EINVAL; +#endif + if ((uint64_t)r * (uint64_t)p >= 1 << 30) + goto out_EINVAL; + if ((N & (N - 1)) != 0 || N <= 1 || r < 1 || p < 1) + goto out_EINVAL; + if (r > SIZE_MAX / 128 / p || +#if SIZE_MAX / 256 <= UINT32_MAX + r > SIZE_MAX / 256 || +#endif + N > SIZE_MAX / 128 / r) + goto out_EINVAL; + if (N > UINT64_MAX / ((uint64_t)t + 1)) + goto out_EINVAL; + if (flags & YESCRYPT_RW) { + if (N / p <= 1 || r < rmin || + p > SIZE_MAX / Sbytes || + p > SIZE_MAX / sizeof(*pwxform_ctx)) + goto out_EINVAL; + } + + VROM = NULL; + if (shared) { + uint64_t expected_size = (size_t)128 * r * NROM; + if ((NROM & (NROM - 1)) != 0 || NROM <= 1 || + shared->aligned_size < expected_size) + goto out_EINVAL; + if (!(flags & YESCRYPT_INIT_SHARED)) { + uint32_t *tag = (uint32_t *) + ((uint8_t *)shared->aligned + expected_size - 48); + uint64_t tag1 = ((uint64_t)tag[1] << 32) + tag[0]; + uint64_t tag2 = ((uint64_t)tag[3] << 32) + tag[2]; + if (tag1 != YESCRYPT_ROM_TAG1 || tag2 != YESCRYPT_ROM_TAG2) + goto out_EINVAL; + } + VROM = shared->aligned; + } else { + if (NROM) + goto out_EINVAL; + } + + /* Allocate memory */ + V_size = (size_t)128 * r * N; + if (flags & YESCRYPT_INIT_SHARED) { + V = (uint32_t *)local->aligned; + if (local->aligned_size < V_size) { + if (local->base || local->aligned || + local->base_size || local->aligned_size) + goto out_EINVAL; + if ((V = malloc(V_size)) == NULL) + return -1; + local->base = local->aligned = V; + local->base_size = local->aligned_size = V_size; + } + if (flags & YESCRYPT_ALLOC_ONLY) + return -2; /* expected "failure" */ + } else { + if ((V = malloc(V_size)) == NULL) + return -1; + } + B_size = (size_t)128 * r * p; + if ((B = malloc(B_size)) == NULL) + goto free_V; + if ((XY = malloc((size_t)256 * r)) == NULL) + goto free_B; + S = NULL; + pwxform_ctx = NULL; + if (flags & YESCRYPT_RW) { + if ((S = malloc((size_t)Sbytes * p)) == NULL) + goto free_XY; + if ((pwxform_ctx = malloc(sizeof(*pwxform_ctx) * p)) == NULL) + goto free_S; + } + + if (flags) { + HMAC_SHA256_Buf("yescrypt-prehash", + (flags & YESCRYPT_PREHASH) ? 16 : 8, + passwd, passwdlen, (uint8_t *)sha256); + passwd = (uint8_t *)sha256; + passwdlen = sizeof(sha256); + } + + /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ + PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, + (uint8_t *)B, B_size); + + if (flags) + blkcpy(sha256, B, sizeof(sha256) / sizeof(sha256[0])); + + if (flags & YESCRYPT_RW) { + for (i = 0; i < p; i++) + pwxform_ctx[i].S = &S[i * Swords]; + smix(B, r, N, p, t, flags, V, NROM, VROM, XY, pwxform_ctx, + (uint8_t *)sha256); + } else { + /* 2: for i = 0 to p - 1 do */ + for (i = 0; i < p; i++) { + /* 3: B_i <-- MF(B_i, N) */ + smix(&B[(size_t)32 * r * i], r, N, 1, t, flags, V, + NROM, VROM, XY, NULL, NULL); + } + } + + dkp = buf; + if (flags && buflen < sizeof(dk)) { + PBKDF2_SHA256(passwd, passwdlen, (uint8_t *)B, B_size, 1, + dk, sizeof(dk)); + dkp = dk; + } + + /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ + PBKDF2_SHA256(passwd, passwdlen, (uint8_t *)B, B_size, 1, buf, buflen); + + /* + * Except when computing classic scrypt, allow all computation so far + * to be performed on the client. The final steps below match those of + * SCRAM (RFC 5802), so that an extension of SCRAM (with the steps so + * far in place of SCRAM's use of PBKDF2 and with SHA-256 in place of + * SCRAM's use of SHA-1) would be usable with yescrypt hashes. + */ + if (flags && !(flags & YESCRYPT_PREHASH)) { + /* Compute ClientKey */ + HMAC_SHA256_Buf(dkp, sizeof(dk), "Client Key", 10, + (uint8_t *)sha256); + /* Compute StoredKey */ + { + size_t clen = buflen; + if (clen > sizeof(dk)) + clen = sizeof(dk); + SHA256_Buf((uint8_t *)sha256, sizeof(sha256), dk); + memcpy(buf, dk, clen); + } + } + + /* Success! */ + retval = 0; + + /* Free memory */ + free(pwxform_ctx); +free_S: + free(S); +free_XY: + free(XY); +free_B: + free(B); +free_V: + if (!(flags & YESCRYPT_INIT_SHARED)) + free(V); + + return retval; + +out_EINVAL: + errno = EINVAL; + return -1; +} + +/** + * yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, params, + * buf, buflen): + * Compute scrypt or its revision as requested by the parameters. The inputs + * to this function are the same as those for yescrypt_kdf_body() above, with + * the addition of g, which controls hash upgrades (0 for no upgrades so far). + */ +int yescrypt_kdf(const yescrypt_shared_t *shared, yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + const yescrypt_params_t *params, + uint8_t *buf, size_t buflen) +{ + yescrypt_flags_t flags = params->flags; + uint64_t N = params->N; + uint32_t r = params->r; + uint32_t p = params->p; + uint32_t t = params->t; + uint32_t g = params->g; + uint64_t NROM = params->NROM; + uint8_t dk[32]; + + /* Support for hash upgrades has been temporarily removed */ + if (g) { + errno = EINVAL; + return -1; + } + + if ((flags & YESCRYPT_RW) && + p >= 1 && N / p >= 0x100 && N / p * r >= 0x20000) { + /* + * This reference implementation's yescrypt_kdf_body() + * (de)allocates memory on each call, which defeats the purpose + * of this pre-hashing. The optimized implementations, which + * you should actually use, make the larger allocation first + * and then reuse it. Thus, this implementation doing things + * differently serves as a test that the computation result is + * unaffected by such differences. + */ + int retval = yescrypt_kdf_body(shared, local, + passwd, passwdlen, salt, saltlen, + flags | YESCRYPT_PREHASH, N >> 6, r, p, 0, NROM, + dk, sizeof(dk)); + if (retval) + return retval; + passwd = dk; + passwdlen = sizeof(dk); + } + + return yescrypt_kdf_body(shared, local, + passwd, passwdlen, salt, saltlen, + flags, N, r, p, t, NROM, buf, buflen); +} + +int yescrypt_init_shared(yescrypt_shared_t *shared, + const uint8_t *seed, size_t seedlen, + const yescrypt_params_t *params) +{ + yescrypt_flags_t flags = params->flags; + uint64_t N = params->NROM; + uint32_t r = params->r; + uint32_t p = params->p; + uint32_t t = params->t; + yescrypt_shared_t half1, half2; + uint8_t salt[32]; + uint32_t *tag; + + if (!(params->flags & YESCRYPT_RW) || params->N || params->g) + return -1; + + if (flags & YESCRYPT_SHARED_PREALLOCATED) { + if (!shared->aligned || !shared->aligned_size) + return -1; + +/* Overwrite a possible old ROM tag before we overwrite the rest */ + tag = (uint32_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + memset(tag, 0, 48); + } else { + shared->base = shared->aligned = NULL; + shared->base_size = shared->aligned_size = 0; + + if (yescrypt_kdf_body(NULL, shared, NULL, 0, NULL, 0, + flags | YESCRYPT_INIT_SHARED | YESCRYPT_ALLOC_ONLY, + N, r, p, t, 0, NULL, 0) != -2 || !shared->aligned) + goto fail; + } + + half1 = half2 = *shared; + half1.aligned_size /= 2; + half2.aligned = (uint8_t *)half2.aligned + half1.aligned_size; + half2.aligned_size = half1.aligned_size; + N /= 2; + + if (yescrypt_kdf_body(NULL, &half1, + seed, seedlen, (const uint8_t *)"yescrypt-ROMhash", 16, + flags | YESCRYPT_INIT_SHARED, N, r, p, t, 0, + salt, sizeof(salt))) + goto fail; + + if (yescrypt_kdf_body(&half1, &half2, + seed, seedlen, salt, sizeof(salt), + flags | YESCRYPT_INIT_SHARED, N, r, p, t, N, + salt, sizeof(salt))) + goto fail; + + if (yescrypt_kdf_body(&half2, &half1, + seed, seedlen, salt, sizeof(salt), + flags | YESCRYPT_INIT_SHARED, N, r, p, t, N, + salt, sizeof(salt))) + goto fail; + + tag = (uint32_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + tag[0] = YESCRYPT_ROM_TAG1 & 0xffffffffU; + tag[1] = YESCRYPT_ROM_TAG1 >> 32; + tag[2] = YESCRYPT_ROM_TAG2 & 0xffffffffU; + tag[3] = YESCRYPT_ROM_TAG2 >> 32; + tag[4] = le32dec(salt); + tag[5] = le32dec(salt + 4); + tag[6] = le32dec(salt + 8); + tag[7] = le32dec(salt + 12); + tag[8] = le32dec(salt + 16); + tag[9] = le32dec(salt + 20); + tag[10] = le32dec(salt + 24); + tag[11] = le32dec(salt + 28); + + return 0; + +fail: + if (!(flags & YESCRYPT_SHARED_PREALLOCATED)) + free(shared->base); + return -1; +} + +yescrypt_binary_t *yescrypt_digest_shared(yescrypt_shared_t *shared) +{ + static yescrypt_binary_t digest; + uint32_t *tag; + uint64_t tag1, tag2; + + if (shared->aligned_size < 48) + return NULL; + + tag = (uint32_t *) + ((uint8_t *)shared->aligned + shared->aligned_size - 48); + + tag1 = ((uint64_t)tag[1] << 32) + tag[0]; + tag2 = ((uint64_t)tag[3] << 32) + tag[2]; + if (tag1 != YESCRYPT_ROM_TAG1 || tag2 != YESCRYPT_ROM_TAG2) + return NULL; + + le32enc(digest.uc, tag[4]); + le32enc(digest.uc + 4, tag[5]); + le32enc(digest.uc + 8, tag[6]); + le32enc(digest.uc + 12, tag[7]); + le32enc(digest.uc + 16, tag[8]); + le32enc(digest.uc + 20, tag[9]); + le32enc(digest.uc + 24, tag[10]); + le32enc(digest.uc + 28, tag[11]); + + return &digest; +} + +int yescrypt_free_shared(yescrypt_shared_t *shared) +{ + free(shared->base); + shared->base = shared->aligned = NULL; + shared->base_size = shared->aligned_size = 0; + return 0; +} + +int yescrypt_init_local(yescrypt_local_t *local) +{ +/* The reference implementation doesn't use the local structure */ + local->base = local->aligned = NULL; + local->base_size = local->aligned_size = 0; + return 0; +} + +int yescrypt_free_local(yescrypt_local_t *local) +{ +/* The reference implementation frees its memory in yescrypt_kdf() */ + (void)local; /* unused */ + return 0; +} diff --git a/deps/yescrypt-master/yescrypt.h b/deps/yescrypt-master/yescrypt.h new file mode 100644 index 000000000..f00b5a88a --- /dev/null +++ b/deps/yescrypt-master/yescrypt.h @@ -0,0 +1,346 @@ +/*- + * Copyright 2009 Colin Percival + * Copyright 2013-2018 Alexander Peslyak + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ +#ifndef _YESCRYPT_H_ +#define _YESCRYPT_H_ + +#include +#include /* for size_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * crypto_scrypt(passwd, passwdlen, salt, saltlen, N, r, p, buf, buflen): + * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, + * p, buflen) and write the result into buf. The parameters r, p, and buflen + * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N + * must be a power of 2 greater than 1. + * + * Return 0 on success; or -1 on error. + * + * MT-safe as long as buf is local to the thread. + */ +extern int crypto_scrypt(const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + uint64_t N, uint32_t r, uint32_t p, uint8_t *buf, size_t buflen); + +/** + * Internal type used by the memory allocator. Please do not use it directly. + * Use yescrypt_shared_t and yescrypt_local_t as appropriate instead, since + * they might differ from each other in a future version. + */ +typedef struct { + void *base, *aligned; + size_t base_size, aligned_size; +} yescrypt_region_t; + +/** + * Types for shared (ROM) and thread-local (RAM) data structures. + */ +typedef yescrypt_region_t yescrypt_shared_t; +typedef yescrypt_region_t yescrypt_local_t; + +/** + * Two 64-bit tags placed 48 bytes to the end of a ROM in host byte endianness + * (and followed by 32 bytes of the ROM digest). + */ +#define YESCRYPT_ROM_TAG1 0x7470797263736579ULL /* "yescrypt" */ +#define YESCRYPT_ROM_TAG2 0x687361684d4f522dULL /* "-ROMhash" */ + +/** + * Type and possible values for the flags argument of yescrypt_kdf(), + * yescrypt_encode_params_r(), yescrypt_encode_params(). Most of these may be + * OR'ed together, except that YESCRYPT_WORM stands on its own. + * Please refer to the description of yescrypt_kdf() below for the meaning of + * these flags. + */ +typedef uint32_t yescrypt_flags_t; +/* Public */ +#define YESCRYPT_WORM 1 +#define YESCRYPT_RW 0x002 +#define YESCRYPT_ROUNDS_3 0x000 +#define YESCRYPT_ROUNDS_6 0x004 +#define YESCRYPT_GATHER_1 0x000 +#define YESCRYPT_GATHER_2 0x008 +#define YESCRYPT_GATHER_4 0x010 +#define YESCRYPT_GATHER_8 0x018 +#define YESCRYPT_SIMPLE_1 0x000 +#define YESCRYPT_SIMPLE_2 0x020 +#define YESCRYPT_SIMPLE_4 0x040 +#define YESCRYPT_SIMPLE_8 0x060 +#define YESCRYPT_SBOX_6K 0x000 +#define YESCRYPT_SBOX_12K 0x080 +#define YESCRYPT_SBOX_24K 0x100 +#define YESCRYPT_SBOX_48K 0x180 +#define YESCRYPT_SBOX_96K 0x200 +#define YESCRYPT_SBOX_192K 0x280 +#define YESCRYPT_SBOX_384K 0x300 +#define YESCRYPT_SBOX_768K 0x380 +/* Only valid for yescrypt_init_shared() */ +#define YESCRYPT_SHARED_PREALLOCATED 0x10000 +#ifdef YESCRYPT_INTERNAL +/* Private */ +#define YESCRYPT_MODE_MASK 0x003 +#define YESCRYPT_RW_FLAVOR_MASK 0x3fc +#define YESCRYPT_INIT_SHARED 0x01000000 +#define YESCRYPT_ALLOC_ONLY 0x08000000 +#define YESCRYPT_PREHASH 0x10000000 +#endif + +#define YESCRYPT_RW_DEFAULTS \ + (YESCRYPT_RW | \ + YESCRYPT_ROUNDS_6 | YESCRYPT_GATHER_4 | YESCRYPT_SIMPLE_2 | \ + YESCRYPT_SBOX_12K) + +#define YESCRYPT_DEFAULTS YESCRYPT_RW_DEFAULTS + +#ifdef YESCRYPT_INTERNAL +#define YESCRYPT_KNOWN_FLAGS \ + (YESCRYPT_MODE_MASK | YESCRYPT_RW_FLAVOR_MASK | \ + YESCRYPT_SHARED_PREALLOCATED | \ + YESCRYPT_INIT_SHARED | YESCRYPT_ALLOC_ONLY | YESCRYPT_PREHASH) +#endif + +/** + * yescrypt parameters combined into one struct. N, r, p are the same as in + * classic scrypt, except that the meaning of p changes when YESCRYPT_RW is + * set. flags, t, g, NROM are special to yescrypt. + */ +typedef struct { + yescrypt_flags_t flags; + uint64_t N; + uint32_t r, p, t, g; + uint64_t NROM; +} yescrypt_params_t; + +/** + * A 256-bit yescrypt hash, or a hash encryption key (which may itself have + * been derived as a yescrypt hash of a human-specified key string). + */ +typedef union { + unsigned char uc[32]; + uint64_t u64[4]; +} yescrypt_binary_t; + +/** + * yescrypt_init_shared(shared, seed, seedlen, params): + * Optionally allocate memory for and initialize the shared (ROM) data + * structure. The parameters flags, NROM, r, p, and t specify how the ROM is + * to be initialized, and seed and seedlen specify the initial seed affecting + * the data with which the ROM is filled. + * + * Return 0 on success; or -1 on error. + * + * If bit YESCRYPT_SHARED_PREALLOCATED in flags is set, then memory for the + * ROM is assumed to have been preallocated by the caller, with shared->aligned + * being the start address of the ROM and shared->aligned_size being its size + * (which must be sufficient for NROM, r, p). This may be used e.g. when the + * ROM is to be placed in a SysV shared memory segment allocated by the caller. + * + * MT-safe as long as shared is local to the thread. + */ +extern int yescrypt_init_shared(yescrypt_shared_t *shared, + const uint8_t *seed, size_t seedlen, const yescrypt_params_t *params); + +/** + * yescrypt_digest_shared(shared): + * Extract the previously stored message digest of the provided yescrypt ROM. + * + * Return pointer to the message digest on success; or NULL on error. + * + * MT-unsafe. + */ +extern yescrypt_binary_t *yescrypt_digest_shared(yescrypt_shared_t *shared); + +/** + * yescrypt_free_shared(shared): + * Free memory that had been allocated with yescrypt_init_shared(). + * + * Return 0 on success; or -1 on error. + * + * MT-safe as long as shared is local to the thread. + */ +extern int yescrypt_free_shared(yescrypt_shared_t *shared); + +/** + * yescrypt_init_local(local): + * Initialize the thread-local (RAM) data structure. Actual memory allocation + * is currently fully postponed until a call to yescrypt_kdf() or yescrypt_r(). + * + * Return 0 on success; or -1 on error. + * + * MT-safe as long as local is local to the thread. + */ +extern int yescrypt_init_local(yescrypt_local_t *local); + +/** + * yescrypt_free_local(local): + * Free memory that may have been allocated for an initialized thread-local + * (RAM) data structure. + * + * Return 0 on success; or -1 on error. + * + * MT-safe as long as local is local to the thread. + */ +extern int yescrypt_free_local(yescrypt_local_t *local); + +/** + * yescrypt_kdf(shared, local, passwd, passwdlen, salt, saltlen, params, + * buf, buflen): + * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, + * p, buflen), or a revision of scrypt as requested by flags and shared, and + * write the result into buf. The parameters N, r, p, and buflen must satisfy + * the same conditions as with crypto_scrypt(). t controls computation time + * while not affecting peak memory usage (t = 0 is optimal unless higher N*r + * is not affordable while higher t is). g controls hash upgrades (g = 0 for + * no upgrades so far). shared and flags may request special modes. local is + * the thread-local data structure, allowing to preserve and reuse a memory + * allocation across calls, thereby reducing processing overhead. + * + * Return 0 on success; or -1 on error. + * + * Classic scrypt is available by setting shared = NULL, flags = 0, and t = 0. + * + * Setting YESCRYPT_WORM enables only minimal deviations from classic scrypt: + * support for the t parameter, and pre- and post-hashing. + * + * Setting YESCRYPT_RW fully enables yescrypt. As a side effect of differences + * between the algorithms, it also prevents p > 1 from growing the threads' + * combined processing time and memory allocation (like it did with classic + * scrypt and YESCRYPT_WORM), treating p as a divider rather than a multiplier. + * + * Passing a shared structure, with ROM contents previously computed by + * yescrypt_init_shared(), enables the use of ROM and requires YESCRYPT_RW. + * + * In order to allow for initialization of the ROM to be split into a separate + * program (or separate invocation of the same program), the shared->aligned + * and shared->aligned_size fields may optionally be set by the caller directly + * (e.g., to a mapped SysV shm segment), without using yescrypt_init_shared(). + * + * local must be initialized with yescrypt_init_local(). + * + * MT-safe as long as local and buf are local to the thread. + */ +extern int yescrypt_kdf(const yescrypt_shared_t *shared, + yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *salt, size_t saltlen, + const yescrypt_params_t *params, + uint8_t *buf, size_t buflen); + +/** + * yescrypt_r(shared, local, passwd, passwdlen, setting, key, buf, buflen): + * Compute and encode an scrypt or enhanced scrypt hash of passwd given the + * parameters and salt value encoded in setting. If shared is not NULL, a ROM + * is used and YESCRYPT_RW is required. Otherwise, whether to compute classic + * scrypt, YESCRYPT_WORM (a slight deviation from classic scrypt), or + * YESCRYPT_RW (time-memory tradeoff discouraging modification) is determined + * by the setting string. shared (if not NULL) and local must be initialized + * as described above for yescrypt_kdf(). buf must be large enough (as + * indicated by buflen) to hold the encoded hash string. + * + * Return the encoded hash string on success; or NULL on error. + * + * MT-safe as long as local and buf are local to the thread. + */ +extern uint8_t *yescrypt_r(const yescrypt_shared_t *shared, + yescrypt_local_t *local, + const uint8_t *passwd, size_t passwdlen, + const uint8_t *setting, + const yescrypt_binary_t *key, + uint8_t *buf, size_t buflen); + +/** + * yescrypt(passwd, setting): + * Compute and encode an scrypt or enhanced scrypt hash of passwd given the + * parameters and salt value encoded in setting. Whether to compute classic + * scrypt, YESCRYPT_WORM (a slight deviation from classic scrypt), or + * YESCRYPT_RW (time-memory tradeoff discouraging modification) is determined + * by the setting string. + * + * Return the encoded hash string on success; or NULL on error. + * + * This is a crypt(3)-like interface, which is simpler to use than + * yescrypt_r(), but it is not MT-safe, it does not allow for the use of a ROM, + * and it is slower than yescrypt_r() for repeated calls because it allocates + * and frees memory on each call. + * + * MT-unsafe. + */ +extern uint8_t *yescrypt(const uint8_t *passwd, const uint8_t *setting); + +/** + * yescrypt_reencrypt(hash, from_key, to_key): + * Re-encrypt a yescrypt hash from one key to another. Either key may be NULL + * to indicate unencrypted hash. The encoded hash string is modified in-place. + * + * Return the hash pointer on success; or NULL on error (in which case the hash + * string is left unmodified). + * + * MT-safe as long as hash is local to the thread. + */ +extern uint8_t *yescrypt_reencrypt(uint8_t *hash, + const yescrypt_binary_t *from_key, + const yescrypt_binary_t *to_key); + +/** + * yescrypt_encode_params_r(params, src, srclen, buf, buflen): + * Generate a setting string for use with yescrypt_r() and yescrypt() by + * encoding into it the parameters flags, N, r, p, t, g, and a salt given by + * src (of srclen bytes). buf must be large enough (as indicated by buflen) + * to hold the setting string. + * + * Return the setting string on success; or NULL on error. + * + * MT-safe as long as buf is local to the thread. + */ +extern uint8_t *yescrypt_encode_params_r(const yescrypt_params_t *params, + const uint8_t *src, size_t srclen, + uint8_t *buf, size_t buflen); + +/** + * yescrypt_encode_params(params, src, srclen): + * Generate a setting string for use with yescrypt_r() and yescrypt(). This + * function is the same as yescrypt_encode_params_r() except that it uses a + * static buffer and thus is not MT-safe. + * + * Return the setting string on success; or NULL on error. + * + * MT-unsafe. + */ +extern uint8_t *yescrypt_encode_params(const yescrypt_params_t *params, + const uint8_t *src, size_t srclen); + +#ifdef __cplusplus +} +#endif + +#endif /* !_YESCRYPT_H_ */ diff --git a/docker/BinaryPackage.arch b/docker/BinaryPackage.arch new file mode 100644 index 000000000..e6ddbd4a1 --- /dev/null +++ b/docker/BinaryPackage.arch @@ -0,0 +1,66 @@ +FROM archlinux:latest + +# Set environment +RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ + locale-gen && \ + echo "LANG=en_US.UTF-8" > /etc/locale.conf && \ + ln -sf /usr/share/zoneinfo/UTC /etc/localtime +ENV LANG=en_US.UTF-8 +ENV LC_ALL=en_US.UTF-8 + +# Install all necessary packages +RUN pacman -Sy --noconfirm \ + base-devel \ + git \ + cmake \ + unzip \ + wget \ + zstd \ + python \ + mingw-w64-gcc \ + mingw-w64-crt \ + mingw-w64-headers \ + mingw-w64-binutils \ + mingw-w64-winpthreads \ + p7zip \ + dos2unix \ + && pacman -Scc --noconfirm + +# Set source working directory +WORKDIR /root + +# Clone hashcat and win-iconv repositories +RUN git clone https://github.com/win-iconv/win-iconv.git + +# Build win-iconv for Windows target +WORKDIR /root/win-iconv +RUN cmake \ + -D WIN_ICONV_BUILD_EXECUTABLE=OFF \ + -D CMAKE_INSTALL_PREFIX=/opt/win-iconv-64 \ + -D CMAKE_C_COMPILER=$(which x86_64-w64-mingw32-gcc) \ + -D CMAKE_CXX_COMPILER=$(which x86_64-w64-mingw32-g++) \ + . && \ + make -j$(nproc) && make install + +# Download and extract MSYS2 Python headers (still 3.12) +RUN mkdir /opt/win-python +WORKDIR /opt/win-python +RUN wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst && \ + zstd -d mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst && \ + tar -xf mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar + +## Custom patches +WORKDIR /root +COPY docker/patches/ /root/patches/ + +## hashcat +WORKDIR /root +RUN git clone https://github.com/hashcat/hashcat.git + +## Compile +WORKDIR /root/hashcat +RUN bash -c 'shopt -s nullglob; for p in /root/patches/*.patch /root/patches/*.diff; do pwd && git apply "$p"; done' +RUN make -s binaries +RUN tools/package_bin.sh + +CMD ["/bin/bash"] diff --git a/docker/BinaryPackage.ubuntu20 b/docker/BinaryPackage.ubuntu20 new file mode 100644 index 000000000..c23d5832d --- /dev/null +++ b/docker/BinaryPackage.ubuntu20 @@ -0,0 +1,104 @@ +FROM ubuntu:20.04 + +ENV DEBIAN_FRONTEND=noninteractive + +## Change to bash + +RUN echo "dash dash/sh boolean false" | debconf-set-selections && dpkg-reconfigure dash + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + build-essential \ + git \ + wget \ + pkg-config \ + make \ + gcc-mingw-w64-x86-64 \ + g++-mingw-w64-x86-64 \ + dos2unix \ + libssl-dev \ + zlib1g-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libreadline-dev \ + libsqlite3-dev \ + libgdbm-dev \ + libdb5.3-dev \ + libbz2-dev \ + libexpat1-dev \ + liblzma-dev tk-dev \ + unzip \ + zstd \ + tar + +WORKDIR /root + +## Ubuntu 20.04 cmake version is incompatible to recent win-iconv so we use our own +RUN wget https://github.com/Kitware/CMake/releases/download/v3.25.3/cmake-3.25.3-linux-x86_64.sh && \ + chmod +x cmake-3.25.3-linux-x86_64.sh && \ + ./cmake-3.25.3-linux-x86_64.sh --skip-license --prefix=/usr/local + +## Also 7z on ubuntu 20.04 is very outdated +WORKDIR /root +RUN git clone --branch 24.09 https://github.com/ip7z/7zip.git +WORKDIR /root/7zip/CPP/7zip/Bundles/Alone2 +RUN make -f makefile.gcc -j +RUN cp /root/7zip/CPP/7zip/Bundles/Alone2/_o/7zz /usr/local/bin/7z + +## Iconv for windows +WORKDIR /root +RUN git clone --branch v0.0.10 https://github.com/win-iconv/win-iconv.git + +WORKDIR /root/win-iconv +RUN cmake \ + -D WIN_ICONV_BUILD_EXECUTABLE=OFF \ + -D CMAKE_INSTALL_PREFIX=/opt/win-iconv-64 \ + -D CMAKE_C_COMPILER=$(which x86_64-w64-mingw32-gcc) \ + -D CMAKE_CXX_COMPILER=$(which x86_64-w64-mingw32-g++) \ + . && \ + make install + +## Ubuntu 20.04 python version 3.10 is too old, it lacks support for non-GIL mode + +WORKDIR /root + +ENV PYTHON_VERSION=3.13.3 + +RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \ + tar xzf Python-${PYTHON_VERSION}.tgz + +WORKDIR /root/Python-${PYTHON_VERSION} + +RUN ./configure --prefix=/opt/linux-python && \ + make -j && make install + +ENV PATH="/opt/linux-python/bin:$PATH" + +## For Windows we also need python + +WORKDIR /root + +RUN mkdir /opt/win-python +WORKDIR /opt/win-python +RUN wget https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst +RUN unzstd mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar.zst +RUN tar -xf mingw-w64-x86_64-python-3.12.10-1-any.pkg.tar + +## Custom patches + +WORKDIR /root + +COPY docker/patches/ /root/patches/ + +RUN git clone https://github.com/hashcat/hashcat.git + +WORKDIR /root/hashcat + +RUN bash -c 'shopt -s nullglob; for p in /root/patches/*.patch /root/patches/*.diff; do pwd && git apply "$p"; done' + +RUN make -s binaries + +RUN tools/package_bin.sh + +RUN ["/bin/bash"] diff --git a/obj/.lock b/docker/patches/.gitkeep similarity index 100% rename from obj/.lock rename to docker/patches/.gitkeep diff --git a/docs/changes.txt b/docs/changes.txt index 991d43615..cc75fe622 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -33,6 +33,7 @@ - Added hash-mode: Kerberos 5, etype 18, AS-REP - Added hash-mode: MetaMask Mobile Wallet - Added hash-mode: MetaMask Wallet (short hash, plaintext check) +- Added hash-mode: Microsoft Online Account (PBKDF2-HMAC-SHA256 + AES256) - Added hash-mode: NetIQ SSPR (MD5) - Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA1) - Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA256) @@ -69,6 +70,7 @@ - Added new feature (-Y) that creates N virtual instances for each device in your system at the cost of N times the device memory consumption - Added options --benchmark-min and --benchmark-max to set a hash-mode range to be used during the benchmark +- Added option --backend-devices-keepfree to configure X percentage of device memory available to keep free ## ## Performance @@ -95,6 +97,7 @@ - Fixed build failed for 18400 with Apple Metal - Fixed build failed for 18600 with Apple Metal - Fixed build failed for 4410 with vector width > 1 +- Fixed clang identification in src/Makefile - Fixed build failure for almost all hash modes that make use of hc_swap64 and/or hc_swap64_S with Apple Metal / Apple Silicon - Fixed debug mode 5 by adding the missing colon between original-word and finding-rule - Fixed display problem of the "Optimizers applied" list for algorithms using OPTI_TYPE_SLOW_HASH_SIMD_INIT2 and/or OPTI_TYPE_SLOW_HASH_SIMD_LOOP2 @@ -103,9 +106,11 @@ - Fixed keys extraction in luks2hashcat - now extracts all active keys - Fixed maximum password length in module/test_module of hash-mode 2400 - Fixed maximum password length in module/test_module of hash-mode 2410 +- Fixed memory leaks in tuning_db_init in tuningdb.c - Fixed minimum password length in module of hash-mode 28200 - Fixed minimum password length in module of hash-mode 29800 - Fixed out-of-boundary read when a fast hash defines a kernel_loops_min value higher than the amplifiers provided by the user +- Fixed stack buffer overflow in PKZIP modules (17200, 17210, 17220, 17225, 17230) - Fixed vector datatypes usage for HIP - Fix missing check for -j and -k before writing hashcat.dictstat2 which can lead to false negatives - Handle signed/unsigned PDF permission P value for all PDF hash-modes @@ -118,10 +123,13 @@ ## - AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (23.7.2 or later) and "AMD HIP SDK" (23.Q3 or later) +- Alias Devices: Prevents hashcat, when started with x86_64 emulation on Apple Silicon, from showing the Apple M1 OpenCL CPU as an alias for the Apple M1 Metal GPU - Apple Driver: Automatically enable GPU support on Apple OpenCL instead of CPU support - Apple Driver: Updated requirements to use Apple OpenCL API to macOS 13.0 - use +- Backend: Updated filename chksum format to prevent invalid cache on Apple Silicon when switching arch - Backend Checks: Describe workaround in error message when detecting more than 64 backend devices - Brain: Added sanity check and corresponding error message for invalid --brain-port values +- Dependencies: Added sse2neon v1.8.0 (commit 658eeac) - Dependencies: Updated LZMA SDK to 24.09 - Dependencies: Updated unrar source to 6.2.7 - Dependencies: Updated xxHash to 0.8.3 (commit 50f4226) @@ -131,6 +139,7 @@ - Modules: Added support for non-zero IVs for -m 6800 (Lastpass). Also added `tools/lastpass2hashcat.py` - Modules: Updated module_unstable_warning - Open Document Format: Added support for small documents with content length < 1024 +- OpenCL Backend: added workaround to set device_available_memory from CUDA/HIP alias device - Status Code: Add specific return code for self-test fail (-11) - Scrypt: Increase buffer sizes in module for hash mode 8900 to allow longer scrypt digests - Unicode: Update UTF-8 to UTF-16 conversion to match RFC 3629 @@ -138,8 +147,10 @@ - MetaMask: update extraction tool to support MetaMask Mobile wallets - SecureCRT MasterPassphrase v2: update module, pure kernels and test unit. Add optimized kernels. - Metal Backend: added workaround to prevent 'Infinite Loop' bug when build kernels +- Metal Backend: added workaround to set the true Processor value in Metal devices on Apple Intel - Metal Backend: allow use of devices with Metal if runtime version is >= 200 - Metal Backend: disable Metal devices only if at least one OpenCL device is active +- Modules: Check UnpackSize to raise false positive with hc_decompress_rar - User Options: added --metal-compiler-runtime option - Hardware Monitor: avoid sprintf in src/ext_iokit.c - Help: show supported hash-modes only with -hh diff --git a/docs/hashcat-assimilation-bridge-development.md b/docs/hashcat-assimilation-bridge-development.md new file mode 100644 index 000000000..72794c494 --- /dev/null +++ b/docs/hashcat-assimilation-bridge-development.md @@ -0,0 +1,207 @@ +# Assimilation Bridge Plugin Development + +## Developer Section + +The following section is for plugin and bridge developers. It contains low-level implementation details. + +## Update existing plugins + +In case you have written a hashcat plugin, you need to update the init function and add the following two lines: + ++ module_ctx->module_bridge_name = MODULE_DEFAULT; ++ module_ctx->module_bridge_type = MODULE_DEFAULT; + +Existing modules on hashcat repository will be automatically updated. + +## Plugin Integration and Bridge Registration + +Plugins can opt in to bridge support by adding: + +```c +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS + | BRIDGE_TYPE_LAUNCH_LOOP; +static const char *BRIDGE_NAME = "scrypt_jane"; +``` + +* `BRIDGE_NAME` tells Hashcat which bridge to load (e.g., `bridge_scrypt_jane.so`). +* `BRIDGE_TYPE` indicates which backend kernel functions the bridge will override: + + * `BRIDGE_TYPE_LAUNCH_LOOP`: Entry point for all bridges that register to run after `RUN_LOOP` + * `BRIDGE_TYPE_LAUNCH_LOOP2`: Entry point for all bridges that register to run after `RUN_LOOP2` + * `BRIDGE_TYPE_REPLACE_LOOP`: Same as BRIDGE_TYPE_LAUNCH_LOOP, but deactivates `RUN_LOOP` + * `BRIDGE_TYPE_REPLACE_LOOP2`: Same as BRIDGE_TYPE_LAUNCH_LOOP2, but deactivates `RUN_LOOP2` + +Hashcat loads the bridge dynamically and uses it for any declared invocation. + +Note that bridges only load for outside kernel, aka "slow hash" kernels. In "fast hash" kernels, such as MD5, they are ignored. In case you want to implement a "fast hash" + bridge hybrid, you can move the "fast hash" code into a new "slow hash" kernel. + +Here's a high-level view on how hashcat executes several key points during a password batch: + +``` +ATTACK_EXEC_OUTSIDE_KERNEL: + COPY_AMPLIFIER_MATERIAL + RUN_AMPLIFIER + RUN_UTF16_CONVERT + RUN_INIT + COPY_HOOK_DATA_TO_HOST + CALL_HOOK12 + COPY_HOOK_DATA_TO_DEVICE + SALT_REPEATS (default 1): + RUN_PREPARE + ITER_REPEATS: + RUN_LOOP + RUN_EXTENTED + COPY_BRIDGE_MATERIAL_TO_HOST + BRIDGE_LAUNCH_LOOP + COPY_BRIDGE_MATERIAL_TO_DEVICE + COPY_HOOK_DATA_TO_HOST + CALL_HOOK23 + COPY_HOOK_DATA_TO_DEVICE + RUN_INIT2 + SALT_REPEATS (default 1): + RUN_PREPARE2 + ITER2_REPEATS: + RUN_LOOP2 + COPY_BRIDGE_MATERIAL_TO_HOST + BRIDGE_LAUNCH_LOOP2 + COPY_BRIDGE_MATERIAL_TO_DEVICE + DEEP_COMP_KERNEL: + RUN_AUX1/2/3/4 + RUN_COMP + CLEAN_HOOK_DATA +``` + +- RUN_* refers to compute kernel executions, such as "init" kernel, but also "amplifier" (typically base-word * modifier-word multiplication). +- COPY_* refers to host-to-device or device-to-host copies and typically involve PCIe data transfer. +- CALL_* are code functions executed on the host CPU. They are plugin-specific and defined in a module. They were the predecessor of bridges but are still usable. +- SALT_* typically are optional steps which allow certain algorithms specific optimizations. For instance in Scrypt with P > 1, the V and XY buffer can be reused and allow temporary storage of result values into B. This saves memory requirement, improving parallelization +- ITER_* is the main loop that chunks what typically is defined as "iterations" in a algorithm computation. For instance a PBKDF2 function is called with 10,000 iterations, which would take a while to compute. The time this takes could be longer than a GPU drivers watchdog allows (before it resets the compute engine.). Hashcat will divide the 10,000 into chunks of let's say 1,000 and call the same kernel 10 times +- BRIDGE_* existing bridge entry points. During the "lifetime" of a hash computation the tmps[] variable is used (algorithm specific, so defined in the specific plugin module and kernel). This variable is which we refer to as bridge material, but it's possible we add other types of variables to "material" in the future +- ITER2/LOOP2: Optional entry points in case the algorithm consists of two types of long running (high iterated) sub-components. For instance one iteration of 10k loops sha256 followed by 100k loops of sha512, or bcrypt followed by scrypt + + * `BRIDGE_TYPE_LAUNCH_INIT` + * `BRIDGE_TYPE_LAUNCH_COMP` + +Hashcat devs will add support on request. + +As mentioned in the BRIDGE_* entry points, it's the developer's responsibility to ensure compatibility. That typically means the handling of the `tmps` variable relevant in the `kernel_loop` and how it changes over algorithm computations lifetime. Hashcat will take care of copying the data from and to the compute backend buffers (bridge material). + +But the bridge developer must ensure data transformation compatibility. For instance, if we replace the loop section in SCRYPT (8900), the long running part is the smix() activity. But SCRYPT implements the PBKDF2 handling in both init and comp kernels, preparing the values in B[] after the init kernel, and expecting modified values in B[] before running comp kernel. If you want to replace the smix() section with let's say FPGA code, the bridge needs to understand the structure of the tmps[] variable. In this case tmps[] just reflect SCRYPT B[], making this simple, but other algorithms may require more than just one large buffer array. That means the structure itself (datatypes), but also the amount of workitems, because there's almost always more than one workitem (to reduce overhead times). + +There's some more BRIDGE PARAMETERs that you should know: + ++ BRIDGE_TYPE_MATCH_TUNINGS = Disables autotune and adjusts -n, -u and -T for the backend device according to match the bridge's dimensions ++ BRIDGE_TYPE_UPDATE_SELFTEST = updates the selftest configured in the module. Can be useful for generic hash modes such as the python plugin + +## How Bridges Work + +When Hashcat starts with a plugin that specifies a bridge, it loads the bridge and invokes its initialization function. The bridge must then discover its internal compute units, called *bridge units*. Handling the units must be implemented by the bridge developer, and typically involves loading some library, init it, and retrieve some resources available, for instances loading XRT, asking how many FPGA are available. If there's two FPGA, then the bridge unit count would be two. You also need to provide some detailed information on the unit itself, for instance the name of the device, or version or your software solution if it's not a hardware. + +Each of these bridge unit maps to one virtual backend device, which allows asynchronous and independent parallel execution, and this were virtual backend devices become relevant. Read section about virtual backend devices for a better understanding + +From the bridge_init() function you have access to the following generic parameters, set on the command line by the user: + +```c ++ " --bridge-parameter1 | Str | Sets the generic parameter 1 for a Bridge |", ++ " --bridge-parameter2 | Str | Sets the generic parameter 2 for a Bridge |", ++ " --bridge-parameter3 | Str | Sets the generic parameter 3 for a Bridge |", ++ " --bridge-parameter4 | Str | Sets the generic parameter 4 for a Bridge |", +``` + +## Virtual Backend Devices + +This feature is available also outside of bridges, eg in order to increase some workload on a compute device, but it was added in the first place to support bridges. The main problem is that it's possible that a bridge return 2 bridge units which may have different speeds (clocking), or an ideal batch size. The time it takes to compute a certain batch of passwords would be different, so there was a need for an asynchronous execution strategy. Hashcat supports mixed speed device types, but that typically mean "backend" devices. To solve the issue, we partition (virtualize) one physical backend device into multiple virtual backend devices (done internally by hashcat), and "link" each of the virtual backend device to a bridge unit. Due to this binding we can support bridge units of different speed. There's two flags a user can control in regard to virtual device backend: + +* Use `-Y` to define how many virtual backend devices to create. +* Use `-R` to bind these virtual devices to a physical backend host (new in v7). + +Note that if a bridge is used, the user's `-Y` parameter is overridden with the bridge unit count. If no bridge is used for a hash mode, then -Y can be manually specified. `-R` works in both cases. The default is device `1`, unless overridden. + +## Writing a Bridge + +### File Layout + +Bridges live in the `src/bridges/` directory and consist of a `.c` file and a `.mk` build rule: + +``` +src/bridges/bridge_scrypt_jane.c +src/bridges/bridge_scrypt_jane.mk +``` + +The target output should be named like this: `bridges/bridge_scrypt_jane.so` and `bridges/bridge_scrypt_jane.dll`. Use any of the existing `.mk` files as template. + +When hashcat starts, it finds the plugin using this pathfinder: + +``` + #if defined (_WIN) || defined (__CYGWIN__) + return snprintf (out_buf, out_size, "%s/bridges/bridge_%s.dll", folder_config->shared_dir, bridge_name); + #else + return snprintf (out_buf, out_size, "%s/bridges/bridge_%s.so", folder_config->shared_dir, bridge_name); + #endif +``` + +### Required Function Exports + +```c +bridge_ctx->platform_init = platform_init; +bridge_ctx->platform_term = platform_term; +bridge_ctx->get_unit_count = get_unit_count; +bridge_ctx->get_unit_info = get_unit_info; +bridge_ctx->get_workitem_count = get_workitem_count; +bridge_ctx->thread_init = BRIDGE_DEFAULT; +bridge_ctx->thread_term = BRIDGE_DEFAULT; +bridge_ctx->salt_prepare = salt_prepare; +bridge_ctx->salt_destroy = salt_destroy; +bridge_ctx->launch_loop = launch_loop; +bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; +bridge_ctx->st_update_hash = BRIDGE_DEFAULT; +bridge_ctx->st_update_pass = BRIDGE_DEFAULT; +``` + +They are defined like this: + +```c + void *(*platform_init) (user_options_t *); + void (*platform_term) (void *); + int (*get_unit_count) (void *); + char *(*get_unit_info) (void *, const int); + int (*get_workitem_count) (void *, const int); + bool (*salt_prepare) (void *, hashconfig_t *, hashes_t *); + void (*salt_destroy) (void *, hashconfig_t *, hashes_t *); + bool (*thread_init) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *); + void (*thread_term) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *); + bool (*launch_loop) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *, const u32, const u64); + bool (*launch_loop2) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *, const u32, const u64); + const char *(*st_update_pass) (void *); + const char *(*st_update_hash) (void *); +``` + +**Note**: Use `BRIDGE_DEFAULT` when no function implementation is required. + +### Mandatory Functions + +The following functions must be defined: + +```c +CHECK_MANDATORY (bridge_ctx->platform_init); +CHECK_MANDATORY (bridge_ctx->platform_term); +CHECK_MANDATORY (bridge_ctx->get_unit_count); +CHECK_MANDATORY (bridge_ctx->get_unit_info); +CHECK_MANDATORY (bridge_ctx->get_workitem_count); +``` + +### Function Roles + +- platform_init: Called at startup. Responsible for initialization. This might include loading libraries, connecting to remote endpoints, or setting up hardware APIs. Returns a context pointer. +- platform_term: Final cleanup logic. Frees any context data allocated during initialization. +- get_unit_count: Returns the number of available units. For example, return `2` if two FPGAs are detected. +- get_unit_info: Returns a human-readable description of a unit, like "Python v3.13.3". +- get_workitem_count: Returns the number of password candidates to process per invocation. +- thread_init: Optional. Use for per-thread setup, such as creating a new Python interpreter. +- thread_term: Optional. Use for per-thread cleanup. +- salt_prepare: Called once per salt. Useful for preprocessing or storing large salt/esalt buffers. +- salt_destroy: Optional cleanup routine for any salt-specific memory. +- launch_loop: Main compute function. Replaces the traditional `_loop` kernel. +- launch_loop2: Secondary compute function. Replaces `_loop2` if needed. +- st_update_hash: Optionally override the module's default self-test hash. +- st_update_pass: Optionally override the module's default self-test password. diff --git a/docs/hashcat-assimilation-bridge.md b/docs/hashcat-assimilation-bridge.md new file mode 100644 index 000000000..f1606f405 --- /dev/null +++ b/docs/hashcat-assimilation-bridge.md @@ -0,0 +1,73 @@ +# Assimilation Bridge in Hashcat v7 + +## Overview + +Hashcat has historically optimized password cracking GPU and CPU compute backends. However, other types of hardware compute systems or pure software solutions were not supported. The Assimilation Bridge is a feature introduced in Hashcat v7 that extends the compute pipeline beyond traditional backends. It enables the integration of additional compute resources and software solutions such as FPGAs, remote TPMs, CPU reference implementations, or embedded runtimes into new or existing hash mode plugins. + +All existing hash-mode plugins continue to function as before. Bridges are optional and only active when explicitly declared within a plugin's configuration. This ensures full backward compatibility with existing setups. + +## Use Cases + +### Embedded Language Runtimes + +Hashcat v7 introduces support for an embedded Python interpreter as its premier demonstration example: + +- Hash modes `-m 72000` and `-m 73000` use embedded Python; start with `-m 73000`. +- These demonstrate a "generic hash" model, enabling full hash mode creation in Python. +- Users don’t need to recompile when making changes. +- Python’s crypto ecosystem helps developers or AI generate new hash mode code easily and efficiently. +- Here's a sample how a user can add `yescrypt` (`$y$...`) support with just one line of code: + +```python +from pyescrypt import Yescrypt,Mode + +def calc_hash(password: bytes, salt: dict) -> str: + return Yescrypt(n=4096, r=32, p=1, mode=Mode.MCF).digest(password=password, settings=hcshared.get_salt_buf(salt)).decode('utf8') +``` + +This is just a preview. See `docs/hashcat-python-plugin-quickstart.md` for details about hashing formats, self-test pairs, or when to use `-m 72000` vs. `-m 73000`. + +### Hybrid Architecture + +Note that in the Python example, only CPU resources are used and Hashcat does not transform Python into GPU code. However, the Bridge supports hybrid setups, where part of the workload runs on a traditional backend and another part on the Bridge. This model allows performance-critical components to be handled by the most suitable type of compute unit. + +For example, in hash mode `-m 70100`, a demonstration of SCRYPT, the PBKDF2 stage runs on a GPU using OpenCL/CUDA/HIP/Metal, while the memory-intensive `smix()` runs on the CPU through a bridge using the scrypt-jane implementation. This could just as easily be offloaded to an FPGA instead, which would benefit from reduced code complexity and increased parallelization boosting performance significantly. + +A mix of traditional backend compute on GPU and embedded Python is also possible. + +### CPU-Based Reference Code + +Bridges can also be used to quickly integrate reference implementations of new algorithms. We will provide initial examples for Argon2 and SCRYPT. These can run entirely on CPU or form part of a hybrid setup. + +- Mode `-m 70000` uses the official Argon2 implementation from the Password Hashing Competition (PHC). +- Mode `-m 70200` demonstrates Yescrypt in its scrypt-emulation mode and benefits from AVX512 acceleration on capable CPUs. + +### Secure Distributed Cracking + +In scenarios where raw password data must remain local, bridges can enable remote processing of depersonalized intermediate keys. This allows secure password cracking using external compute infrastructure without compromising sensitive input. + +A working proof-of-concept exists, but it's not yet confirmed for inclusion in the v7 release. + +## Other Ideas for Use Cases (Not Yet Implemented) + +### Remote Hardware + +A bridge could be built to interact with TPMs on mobile devices or laptops, accessed through networked agents. This enables secure challenge/response flows with hardware-backed key storage. + +### Project Interoperability + +Depending on interface compatibility, code from other password cracking tools (e.g., JtR) could be wrapped in bridges, allowing functionality reuse and deeper collaboration. + +## Limitations and Status + +- Bridges are optional and configured on a per-plugin basis. +- Hashcat v7 includes working bridges for CPU and Python. +- FPGA support has been verified internally but is excluded from this release due to licensing issues. + +> **Call to FPGA Developers**: Contribute an open FPGA implementation and bitstream and the Hashcat Developer Team will support in integrating it into a bridge. Please contact us on Discord. + +## Conclusion + +The Assimilation Bridge introduces a highly extensible mechanism to integrate custom compute resources and logic into Hashcat. + +For hands-on examples and developer guidance, refer to the accompanying documentation in `docs/hashcat-assimiliation-bridge-development.md` (first draft). diff --git a/docs/hashcat-python-plugin-development-guide.md b/docs/hashcat-python-plugin-development-guide.md new file mode 100644 index 000000000..308b6d918 --- /dev/null +++ b/docs/hashcat-python-plugin-development-guide.md @@ -0,0 +1,258 @@ +# Hashcat Python Plugin Development Guide + +This document is a comprehensive guide for writing custom hash modes in Python via Hashcat's Assimilation Bridge plugin. + +## 1. Introduction + +The Assimilation Bridge enables developers to implement complete hash mode logic in languages other than C, most notably Python. Traditionally, customizing Hashcat required writing a module in C and a kernel in OpenCL/CUDA. With the bridge, you can now implement a complete hash mode in Python. + +The bridge supports two hash modes to run python code: + +- `-m 72000`: Uses single-threaded Python interpreter and hashcat controlling the multi-threading. +- `-m 73000`: Uses classic multiprocessing module controlling multi-threaded support. + +Having two hash modes is currently a workaround; future Python developments toward a fully GIL-free mode should eventually resolve this. The single-threaded Python route is the way to go, and when Python will be totally GIL-free, we will remove the multiprocessing support completely. For now, we must work around platform-specific behavior (see `hashcat-python-plugin-requirements.md`). + +## 2. Requirements + +Ideally, start by walking through `hashcat-python-plugin-quickstart.md`, or read `hashcat-python-plugin-requirements.md`. + +## 3. Python Bridge basics + +Hashcat implements the CPython interface, loading the embedded interpreter via dynamic loading mechanisms (`dlopen()`, `LoadLibrary()`, etc). This enables runtime flexibility, allowing Hashcat to use whatever Python version is installed on the system. Users of the precompiled Hashcat binaries don’t need Python headers and just a working Python interpreter. Compatibility is checked at runtime, not compile time. If hashcat detect an invalid python version it will stop and print informative instructions on what to do next. + +In general, when using any assimilation bridge "application" (such as the Python bridge), the hash mode determines which bridge plugin is loaded (this is a 1:1 relationship). From there, the bridge decides how to proceed. In the case of the Python bridge, it loads the Python library, sets up the interpreter, and finally selects which Python script to execute. Understanding this flow is essential, especially if you plan to contribute to upstream Hashcat on GitHub or want to register a dedicated hash mode number. + +You can decide to use the generic hash mode and only contribute the .py file itself with your implementation, or you copy the bridge code and hardcode the path to you .py implementation in there. The advantage in the generic mode is that it's super simple, but it will run a little slower and you have less control about workload tuning. Also having a dedicated mode allows you to implement a unit test, because you have a dedicated hash mode that you can refer to. + +Hashcat includes a top-level `Python/` directory with standard helpers and bridge modules: + +The following three files are relevant regardless of whether you plan to create a generic or a dedicated hash mode. These modules do the heavy lifting to interact with Hashcat internals from Python. Basically you should not need to change them, and instead you import them from your implementation: + +```text +- hcsp.py: Helper for single-threaded mode. Manages queue handling, function invocation, and context propagation. +- hcmp.py: Extends `hcsp.py` to support multiprocessing. It spawns worker processes and routes password batches via queues. +- hcshared.py: Shared utility functions between SP and MP, for instance some getter function for salt data retrieval. +``` + +There are two additional files, and they are mainly relevant in case you plan to make use of the generic hash mode. But even if you plan to make a dedicated hash mode have a look into them, most likely they will be a very good template for your non-generic mode + +```text +- generic_hash_mp.py +- generic_hash_sp.py +``` + +We will discuss these two in more detail in the `generic hash mode` section. + +## 4. Required Functions in a Python Module + +Both `-m 72000` and `-m 73000` follow the same requirements, with the idea that your python code will run in both hash-modes, whatever your user decides to use. + +The requirements are to implement the following three functions: + +```python +def init(ctx): +def term(ctx): +def kernel_loop(ctx, passwords, salt_id, is_selftest): +``` + +- `init(ctx)`: Called once during plugin startup. All salts and esalts are copied at this stage. You use it to wire up callbacks to helper modules. +- `term(ctx)`: Called once at shutdown. Use it to clean up resources like file handles or sockets if you use them. +- `kernel_loop(...)`: Main function for processing password batches. This is called many times during cracking. + +A typical `init()` might look like this: + +```python +def init(ctx): + hcsp.init(ctx, calc_hash, extract_esalts) +``` + +Here: +- `calc_hash()` is your main implementation that processes one password (with one specific salt). You return the result in the format that hashcat requires. In generic hash mode that would be just the same format as in your hashlist. Instead, if you write your own decoder and encoder in the module, this can also be in binary for better performance. +- `extract_esalts()` is an optional function to deserialize binary esalt blobs. Depends on your hash, if esalts (such as binary blobs for decryption) are required. +- `hcsp.init()` stores these so that `handle_queue()` (described later) can call `calc_hash()` for each password in a batch. + +Note the the ctx will hold your salt data from all hashes. Whenever calc_hash() is called, this context is given. If you have multiple hashes with multiple salts, the context will have all of them. The helper module hcsp.init() will deserialize the static salt and the dynamic salt and store the data in your context. + +A typical `term()` might look like this: + +```python +def term(ctx): + hcsp.term(ctx) +``` + +This should be used in case you had open files, open networking connection, or similar. We are good citizens! + +Here's our main function `kernel_loop()` where we spend almost all our time: + +```python +def kernel_loop(ctx,passwords,salt_id,is_selftest): + return hcsp.handle_queue(ctx,passwords,salt_id,is_selftest) +``` + +Hashcat optimizes performance by sending password candidates in batches. The `passwords` parameter in `kernel_loop()` is a list. Instead of manually looping over them, the helper module will queue them, and call your callback function which you had specified in the `init()` function before. The idea is that whenever your calc_hash() is called, it will always be only about one password and one salt (and optional some binary blobs), and you do not have to deal with queuing, whether it is threaded or not. + +Of course, you can also fully control this yourself: + +```python +def calc_hash(ctx, password, salt_id, is_selftest): + # Your custom logic here + return encoded_guess +``` + +If you want to control all by youself, here's what's important to know: + +- salt_id: Basically a index number which tells you about which salt your calculation is about. When you initially receive the context, it will hold all salts at once, and you need to store them in the context. The helper scripts do that for your, but just for you to know, its the salt_id which tells the handle_queue() which salt data to pick before it calls your hash_calc() function. +- is_selftest: Historically hashcat keeps two parallel structures for the selftest hash and real hash. As such they arrive in the context buffer, and you need to make a decision on that `is_selftest` flag which salt buffer to pick. + +## 5. Esalts and Structured Binary Blobs, and fixed Salts + +One of the most confusing parts for developers new to hashcat is salt handling. While simple hash modes may work out-of-the-box with default helpers, dealing with salts in real-world formats requires deeper understanding. + +For complex formats, you may need a structured binary blob ("esalt") passed from the C plugin to Python. Since only you as the developer know the structures of your hash mode, structures vary. For that reason you can optionally write Python code to unpack it. + +### Some C Structure + +Let's say you need to transfer a salt value to python. You can specify an exact structure in the module to do so. Or, as in this example, this is how we had designed a generic hash mode: + +```c +typedef struct { + u32 hash_buf[16384]; + u32 hash_len; + u32 salt_buf[16384]; + u32 salt_len; +} generic_io_t; +``` + +### Unpacking esalts + +To access the data, we typically want to unpack it so it's easier to access from python: + +```python +def extract_esalts(esalts_buf): + esalts = [] + for hash_buf, hash_len, salt_buf, salt_len in struct.iter_unpack("65536s I 65536s I", esalts_buf): + hash_buf = hash_buf[0:hash_len] + salt_buf = salt_buf[0:salt_len] + esalts.append({ "hash_buf": hash_buf, "salt_buf": salt_buf }) + return esalts +``` + +Remember, the extract_esalts() was given as function pointer to hcsp.init(). That's how the helper can include your code from outside the helper code. The esalt format is based on what is defined in the module struct. + +### Salts Appear as Binary Blobs using 32 bit datatypes + +Hashcat is optimized for performance, especially on GPUs. To improve performance, it mostly works on 32 bit datatypes instead of 8 bit datatypes. In python the helper scripts convert these binary blobs into byte[] objects that are easier to work with. As you can see from the above example: `16384 * 4 = 65536` + +### Fixed salt datatypes + +In general, in all hashcat hash modes: + +- The `salt_t` structure is **fixed and consistent**. +- The esalt (extra salt) is **custom and plugin-specific**. + +Since `salt_t` is a fixed structure, the helper mode come with a salt unpacker code and in addition, it provides getter functions: + +```python +def get_salt_buf(salt: dict) -> bytes: +def get_salt_buf_pc(salt: dict) -> bytes: +def get_salt_iter(salt: dict) -> int: +def get_salt_iter2(salt: dict) -> int: +def get_salt_sign(salt: dict) -> bytes: +def get_salt_repeats(salt: dict) -> int: +def get_orig_pos(salt: dict) -> int: +def get_digests_cnt(salt: dict) -> int: +def get_digests_done(salt: dict) -> int: +def get_digests_offset(salt: dict) -> int: +def get_scrypt_N(salt: dict) -> int: +def get_scrypt_r(salt: dict) -> int: +``` + +These go back to the `salt_t` fixed structure you can find in `OpenCL/inc_types.h`. As an example on how to use these, here's a snippet from the `yescrypt`: + +```python +settings=hcshared.get_salt_buf(salt) +``` + +The `salt` variable is one of the parameters from the calc_hash(): + +```python +def calc_hash(password: bytes, salt: dict) -> str: +``` + +Note that if you fully exhaust the Hashcat keyspace, your function has been called X times Y.. X is the number of candidates, and Y is all the salts (except if a salt has been cracked). What's important to realize that within your function, you implement hashing logic only for precisely that situation where you have one password and one salt. + + +### Merging Salts and Esalts into a Single Object + +Finally, after unpacking both salts and esalts from their binary blob form, they are explicitly combined into a single dictionary object to simplify access: + +```python +for salt, esalt in zip(salts, esalts): + salt["esalt"] = esalt +``` + +Initially, salts and esalts are unpacked separately from their respective binary structures. Each salt entry contains standardized fields defined by the fixed `salt_t` structure and each esalt is dynamically structured and plugin-specific. Merging the esalt dictionary into the salt dictionary makes accessing all related data straightforward and intuitive within Python. + +## 6. Python generic hash mode `-m 72000` and `-m 73000` + +The "generic hash" support in hashcat is using python. The main idea behind "generic" is to write freely. Ideal for rapid prototyping and achieving your goal. + +The most straight-forward way is to edit the following files directly: + +- `generic_hash_sp.py` for single-threaded (SP), typically when the user is using `-m 72000`. +- `generic_hash_mp.py` for multiprocessing (MP), typically when the user is using `-m 73000`. + +Notes: + +- Even though `-m 72000` uses single-threaded Python, the bridge plugin above it manages multiple Python interpreters (one per thread) making it effectively multi-threaded. +- On Windows/macOS, if `-m 73000` is selected, it silently falls back to `generic_hash_sp.py` due to limitations with multiprocessing. This behavior is important to understand and you might otherwise wonder why your code changes have no effect. + +If you modify one of these plugin files, there's a trade-off: you won’t be able to contribute that code directly to the upstream Hashcat repository, since those files are meant to remain clean for demonstration purposes. + +To address this, the assimilation bridge provides a generic parameter that users can specify via the command line. In the case of the Python bridge, only the first parameter is used. You can override the Python script to be loaded using `--bridge-parameter1`: + +``` +$ ./hashcat -m 73000 --bridge-parameter1 myimplementation.py hash.txt wordlist.txt ... +``` + +This tells the Python bridge plugin to load `myimplementation.py` instead of the default `generic_hash_mp.py`. This approach is especially useful if you plan to contribute `myimplementation.py` to the upstream Hashcat repository. If you choose to stay within the generic mode, your Python code won’t have a dedicated hash mode, and you'll need to instruct users to use the `--bridge-parameter1` flag to load your implementation. + +### Design Tradeoffs and Format Considerations + +In the generic hash mode, we are using a generic binary esalt to avoid writing complex C encode/decode logic. However, guesses returned from Python must match the **original encoded format** exactly. This can be inefficient if encoding is complex. The hash lines are intentionally not decoded and re-encoded in a structured way. Instead, a simple trick such as appending the salt after an asterisk (`*`) is used: + +``` +hash-with-embedded-salt*salt +``` + +This technique makes each hash appear unique, especially when multiple salts are involved, and simplifies initial parsing and processing. + +However, it is crucial to highlight: + +- You are **not obligated to follow this generic approach**. In fact, it's generally preferable to implement proper hash line decoding and encoding logic. +- For instance, a proper Yescrypt implementation (unlike the quickstart document) would ideally decode hash lines into clear, separate components (digest, salt, parameters) and encode them accordingly upon successful cracking. + +The reason the generic hash mode provided by Hashcat employs a simplified approach is to: + +- Demonstrate a flexible, format-agnostic solution suitable for initial prototyping or unfamiliar hash formats. +- Avoid complexity and make it easy for plugin developers to get started quickly without deep understanding of specific hash format parsing logic. + +In summary, while the generic mode is quick and easy, robust real-world plugins **should implement proper hash decoding and encoding logic** to ensure accuracy, efficiency, and maintainability. + +## 7. Debugging Without Hashcat + +You can run your plugin as a standalone script: + +``` +python3 generic_hash.py +``` + +It reads passwords from stdin and prints the result of `calc_hash()`: + +``` +echo "password" | python3 generic_hash_mp.py +``` + +Note that you probably want to inline the correct salt value, see the `main` section in the code. TBD: Add some sample + diff --git a/docs/hashcat-python-plugin-quickstart.md b/docs/hashcat-python-plugin-quickstart.md new file mode 100644 index 000000000..760607cd7 --- /dev/null +++ b/docs/hashcat-python-plugin-quickstart.md @@ -0,0 +1,87 @@ +# Hashcat Python Plugin Quickstart + +## Introduction + +Hashcat v7 introduces a `Python plugin bridge` that allows you to write and integrate custom hash-matching algorithms directly in Python. This plugin system fits into the regular cracking workflow by replacing or extending internal kernel routines. + +When enabled, Hashcat uses the plugin’s `calc_hash()` function to compute hash candidates for verification, making it easy to experiment with new or obscure algorithms without modifying core C code or writing OpenCL/CUDA kernels. + +This guide demonstrates how to quickly customize such an algorithm using pure Python. Whether you're prototyping a new hash mode, supporting a proprietary format, or simply prefer high-level development, Python plugins make the process fast and straightforward. + +No C required. No recompilation. Just write your logic in Python using `calc_hash()`, and you're ready to crack. + +You can use any Python modules you like. + +## Quick Start + +A benchmark is a good way to verify that your setup is working correctly. + +Hashcat mode `73000` is preconfigured to load a generic Python plugin from the source file `Python/generic_hash_mp.py`: + +``` +hashcat -m 73000 -b +``` + +If you encounter issues with your Python installation, refer to `hashcat-python-plugin-requirements.md`. + +To learn how to modify the plugin source, see `hashcat-python-plugin-development-guide.md`. + +## Yescrypt in One Line + +### Generate a Yescrypt Test Hash + +``` +echo password | mkpasswd -s -m yescrypt +``` + +Example output: + +``` +$y$j9T$uxVFACnNnGBakt9MLrpFf0$SmbSZAge5oa1BfHPBxYGq3mITgHeO/iG2Mdfgo93UN0 +``` + +### Prepare the Hash Line for Hashcat + +``` +$y$j9T$uxVFACnNnGBakt9MLrpFf0$SmbSZAge5oa1BfHPBxYGq3mITgHeO/iG2Mdfgo93UN0*$y$j9T$uxVFACnNnGBakt9MLrpFf0$ +``` + +(Use the full hash before the `*` and the salt portion after the `*`.) + +Hashcat modes `73000` and `72000` are generic modes that do not parse the hash, which can lead to redundancy. + +Refer to `hashcat-python-plugin-development-guide.md` to learn how to develop plugins for the generic hash mode. + +### Plugin Code + +Install the required module: + +``` +pip install pyescrypt +``` + +Then in your plugin (either `generic_hash_mp.py` for `-m 73000` or `generic_hash_sp.py` for `-m 72000`): + +**Note for Windows and MacOS users:** Mode `73000` automatically switches to `generic_hash_sp.py`, so be sure to edit that file. + +```python +from pyescrypt import Yescrypt, Mode + +# Self-test pair +ST_HASH = "$y$j9T$uxVFACnNnGBakt9MLrpFf0$SmbSZAge5oa1BfHPBxYGq3mITgHeO/iG2Mdfgo93UN0*$y$j9T$uxVFACnNnGBakt9MLrpFf0$" +ST_PASS = "password" + +def calc_hash(password: bytes, salt: dict) -> str: + return Yescrypt(n=4096, r=32, p=1, mode=Mode.MCF).digest( + password=password, + settings=hcshared.get_salt_buf(salt) + ).decode("utf-8") +``` + +That’s it. + +### Run Regularly + +``` +hashcat -m 73000 yescrypt.hash wordlist.txt +``` diff --git a/docs/hashcat-python-plugin-requirements.md b/docs/hashcat-python-plugin-requirements.md new file mode 100644 index 000000000..41564afbd --- /dev/null +++ b/docs/hashcat-python-plugin-requirements.md @@ -0,0 +1,51 @@ +# Hashcat Python Plugin Requirements + +## Windows/macOS and Linux + +There are significant differences between Windows/macOS and Linux when embedding Python as done here. + +### On Windows/macOS + +The `multiprocessing` module is not fully supported in this embedded environment, so only a single process can run effectively. In contrast, even though `threading` module does work correctly on Windows/macOS for starting threads and enabling parallelism, most cryptographic functions like `sha256()` block the Global Interpreter Lock (GIL). Since we often run CPU-intensive algorithms (e.g., 10,000 iterations of `sha256()`), this monopolizes the GIL, making the program effectively single-threaded. To achieve true multithreading on Windows/macOS, we need to move to a free-threaded Python runtime. + +**On Windows**: Use the official installer from https://www.python.org/downloads/windows/ and ensure you check the "Install free-threaded" option - it's disabled by default. Do not use python from Microsoft Store it's too old. + +**On macOS**: Use `pyenv`. It's the easiest way to install and manage Python versions, see below section + +### On Linux + +The `multiprocessing` module functions correctly, allowing full CPU utilization through parallel worker processes. However, since threading is managed by Python, it relies on `fork()` and inter-process communication (IPC). This adds complexity and code bloat to Hashcat, effectively duplicating modules and bridge plugins, making the codebase harder to understand for those exploring how it all works. We could switch to a free-threaded Python runtime, but it's still unstable at the time of writing even on Linux (see the `cffi` problem below). For now, we’ve chosen to use the `multiprocessing` module as a more practical solution. + +**On Linux**: Use `pyenv`. It's the easiest way to install and manage Python versions, see below section + +### Free-threaded Python (3.13+) + +In order to have multithreading on Windows/macOS, we were looking into Python 3.13 which introduces optional GIL-free support. This allows multithreading to work even in embedded Python. However, it has a major downside. Most relevant modules such as `cffi` still lacks support for running with the Python free-threaded ABI. But if your hash-mode does not rely on modules with `cffi` you should be fine using `-m 72000` no matter the OS. + +At the time of writing, several Linux distributions, including Ubuntu 24.04, do not ship with Python 3.13 because it was released after the distro’s feature freeze. You will likely need to install it manually, which is one of the reason we are refering to use `pyenv`. + +### Real-world best practice + +For now, multiprocessing (-m 73000) supports most modules and is generally better for real-world workloads, but it works only on Linux. Developers on Windows/macOS may use `-m 72000` for development, except if `cffi` modules are requested and in this case switch back to `-m 73000`. Then use Linux (or WSL2 on Windows) for long running tasks. + +### Pyenv + +Pyenv is great for managing local python versions, and also frees us from using virtual environments while at the same time to not break global system installs when using `pip` to install new modules. + +Check out https://github.com/pyenv/pyenv in order how to install `pyenv`. + +After install, if you are fine with `-m 73000` + +``` +pyenv install 3.13 +pyenv local 3.13 +``` + +In order to use `-m 72000` + +``` +pyenv install 3.13t +pyenv local 3.13t +``` + +Note that unlike on Windows, there is no combined Python 3.13 + 3.13t version. This can be a bit confusing. If you plan to use `-m 72000`, you must switch your pyenv to Python `3.13t` beforehand. Similarly, you need to switch back to Python `3.13` before using `-m 73000`. diff --git a/docs/license_libs/SSE2NEON_LICENSE.txt b/docs/license_libs/SSE2NEON_LICENSE.txt new file mode 100644 index 000000000..edc36de51 --- /dev/null +++ b/docs/license_libs/SSE2NEON_LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2015-2025 SSE2NEON Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/readme.txt b/docs/readme.txt index 2f0efe391..c0f38d25d 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -487,6 +487,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - RC4 40-bit DropN - RC4 72-bit DropN - RC4 104-bit DropN +- Microsoft Online Account (PBKDF2-HMAC-SHA256 + AES256) ## ## Attack-Modes diff --git a/extra/tab_completion/hashcat.sh b/extra/tab_completion/hashcat.sh index f823cda72..f1d01e0f5 100755 --- a/extra/tab_completion/hashcat.sh +++ b/extra/tab_completion/hashcat.sh @@ -425,9 +425,9 @@ _hashcat () local HIDDEN_FILES_AGGRESSIVE="${HIDDEN_FILES}|hcmask|hcchr" local BUILD_IN_CHARSETS='?l ?u ?d ?a ?b ?s ?h ?H' - local SHORT_OPTS="-m -a -V -h -b -t -T -o -p -c -d -D -w -n -u -j -k -r -g -1 -2 -3 -4 -i -I -s -l -O -S -z -M -Y" - local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --benchmark-all --hex-salt --hex-wordlist --hex-charset --force --status --status-json --status-timer --stdin-timeout-abort --machine-readable --loopback --markov-hcstat2 --markov-disable --markov-inverse --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-json --outfile-check-timer --outfile-check-dir --wordlist-autohex-disable --separator --show --deprecated-check-disable --left --username --dynamic-x --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --example-hashes --hash-info --backend-ignore-cuda --backend-ignore-opencl --backend-ignore-hip --backend-ignore-metal --backend-info --backend-devices --backend-devices-virtual --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-disable --hwmon-temp-abort --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --optimized-kernel-enable --multiply-accel-disable --self-test-disable --slow-candidates --brain-server --brain-server-timer --brain-client --brain-client-features --brain-host --brain-port --brain-session --brain-session-whitelist --brain-password --identify" - local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --status-timer --stdin-timeout-abort --markov-hcstat2 --markov-threshold --runtime --session --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --backend-devices --backend-devices-virtual --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-temp-abort --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment-min --increment-max --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --brain-server-timer --brain-client-features --brain-host --brain-password --brain-port --brain-session --brain-session-whitelist" + local SHORT_OPTS="-m -a -V -h -b -t -T -o -p -c -d -D -w -n -u -j -k -r -g -1 -2 -3 -4 -i -I -s -l -O -S -z -M -Y -R" + local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --benchmark-all --hex-salt --hex-wordlist --hex-charset --force --status --status-json --status-timer --stdin-timeout-abort --machine-readable --loopback --markov-hcstat2 --markov-disable --markov-inverse --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-json --outfile-check-timer --outfile-check-dir --wordlist-autohex-disable --separator --show --deprecated-check-disable --left --username --dynamic-x --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --example-hashes --hash-info --backend-ignore-cuda --backend-ignore-opencl --backend-ignore-hip --backend-ignore-metal --backend-info --backend-devices --backend-devices-virtmulti --backend-devices-virthost --backend-devices-keepfree --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-disable --hwmon-temp-abort --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --optimized-kernel-enable --multiply-accel-disable --self-test-disable --slow-candidates --brain-server --brain-server-timer --brain-client --brain-client-features --brain-host --brain-port --brain-session --brain-session-whitelist --brain-password --identify --bridge-parameter1 --bridge-parameter2 --bridge-parameter3 --bridge-parameter4" + local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --status-timer --stdin-timeout-abort --markov-hcstat2 --markov-threshold --runtime --session --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --backend-devices --backend-devices-virtmulti --backend-devices-virthost --backend-devices-keepfree --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-temp-abort --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment-min --increment-max --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --brain-server-timer --brain-client-features --brain-host --brain-password --brain-port --brain-session --brain-session-whitelist --bridge-parameter1 --bridge-parameter2 --bridge-parameter3 --bridge-parameter4" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" diff --git a/include/autotune.h b/include/autotune.h index 09d297d04..d919b02ba 100644 --- a/include/autotune.h +++ b/include/autotune.h @@ -6,6 +6,8 @@ #ifndef HC_AUTOTUNE_H #define HC_AUTOTUNE_H +int find_tuning_function (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param); + HC_API_CALL void *thread_autotune (void *p); #endif // HC_AUTOTUNE_H diff --git a/include/backend.h b/include/backend.h index ce1e9cfe4..339fd6bf9 100644 --- a/include/backend.h +++ b/include/backend.h @@ -22,6 +22,7 @@ static const char CL_VENDOR_INTEL_SDK[] = "Intel(R) Corporation"; static const char CL_VENDOR_MESA[] = "Mesa"; static const char CL_VENDOR_NV[] = "NVIDIA Corporation"; static const char CL_VENDOR_POCL[] = "The pocl project"; +static const char CL_VENDOR_MICROSOFT[] = "Microsoft"; int backend_ctx_init (hashcat_ctx_t *hashcat_ctx); void backend_ctx_destroy (hashcat_ctx_t *hashcat_ctx); @@ -39,8 +40,6 @@ int backend_session_update_combinator (hashcat_ctx_t *hashcat_ctx); int backend_session_update_mp (hashcat_ctx_t *hashcat_ctx); int backend_session_update_mp_rl (hashcat_ctx_t *hashcat_ctx, const u32 css_cnt_l, const u32 css_cnt_r); -u32 backend_device_idx_real_from_virtual (const u32 device_idx, const u32 backend_devices_virtual); - void generate_source_kernel_filename (const bool slow_candidates, const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *shared_dir, char *source_file); void generate_cached_kernel_filename (const bool slow_candidates, const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *cache_dir, const char *device_name_chksum, char *cached_file, bool is_metal); void generate_source_kernel_shared_filename (char *shared_dir, char *source_file); @@ -57,7 +56,7 @@ int gidd_to_pw_t (hashcat_ctx_t *hashcat_ctx, hc_devi int copy_pws_idx (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, u64 gidd, const u64 cnt, pw_idx_t *dest); int copy_pws_comp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, u32 off, u32 cnt, u32 *dest); -int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u64 pws_pos, const u64 pws_cnt, const u32 fast_iteration, const u32 salt_pos); +int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u64 pws_pos, const u64 pws_cnt, const u32 fast_iteration, const u32 salt_pos, const bool is_autotune); int run_cuda_kernel_atinit (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, CUdeviceptr buf, const u64 num); int run_cuda_kernel_utf8toutf16le (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, CUdeviceptr buf, const u64 num); @@ -85,7 +84,7 @@ int run_opencl_kernel_memset (hashcat_ctx_t *hashcat_ctx, hc_devi int run_opencl_kernel_memset32 (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u64 offset, const u32 value, const u64 size); int run_opencl_kernel_bzero (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_mem buf, const u64 size); -int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 pws_pos, const u64 num, const u32 event_update, const u32 iteration); +int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 pws_pos, const u64 num, const u32 event_update, const u32 iteration, const bool is_autotune); int run_kernel_mp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 num); int run_kernel_tm (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param); int run_kernel_amp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 num); diff --git a/include/bridges.h b/include/bridges.h new file mode 100644 index 000000000..cd98a7b2f --- /dev/null +++ b/include/bridges.h @@ -0,0 +1,30 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifndef HC_BRIDGE_H +#define HC_BRIDGE_H + +#include +#include +#include +#include +#include +#include + +static const int BRIDGE_INTERFACE_VERSION_MINIMUM = 700; + +static const size_t BRIDGE_CONTEXT_SIZE_CURRENT = sizeof (bridge_ctx_t); + +/** + * output functions + */ + +bool bridges_init (hashcat_ctx_t *hashcat_ctx); +void bridges_destroy (hashcat_ctx_t *hashcat_ctx); + +bool bridges_salt_prepare (hashcat_ctx_t *hashcat_ctx); +void bridges_salt_destroy (hashcat_ctx_t *hashcat_ctx); + +#endif // HC_BRIDGE_H diff --git a/include/cpu_features.h b/include/cpu_features.h new file mode 100644 index 000000000..f583ed9bc --- /dev/null +++ b/include/cpu_features.h @@ -0,0 +1,24 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#ifndef HC_CPU_FEATURES_H +#define HC_CPU_FEATURES_H + +#include + +#if defined(__x86_64__) || defined(_M_X64) +#include +#endif + +// SIMD detection + +int cpu_supports_sse2 (); +int cpu_supports_ssse3 (); +int cpu_supports_xop (); +int cpu_supports_avx2 (); +int cpu_supports_avx512f (); +int cpu_chipset_test (); + +#endif // HC_CPU_FEATURES_H diff --git a/include/ext_cuda.h b/include/ext_cuda.h index 3a05aff1a..44ae01cd6 100644 --- a/include/ext_cuda.h +++ b/include/ext_cuda.h @@ -712,118 +712,160 @@ typedef enum CUjit_option_enum /** * Device properties */ -typedef enum CUdevice_attribute_enum -{ - CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 1, /**< Maximum number of threads per block */ - CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X = 2, /**< Maximum block dimension X */ - CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y = 3, /**< Maximum block dimension Y */ - CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z = 4, /**< Maximum block dimension Z */ - CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X = 5, /**< Maximum grid dimension X */ - CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y = 6, /**< Maximum grid dimension Y */ - CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z = 7, /**< Maximum grid dimension Z */ - CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK = 8, /**< Maximum shared memory available per block in bytes */ - CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK = 8, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK */ - CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY = 9, /**< Memory available on device for __constant__ variables in a CUDA C kernel in bytes */ - CU_DEVICE_ATTRIBUTE_WARP_SIZE = 10, /**< Warp size in threads */ - CU_DEVICE_ATTRIBUTE_MAX_PITCH = 11, /**< Maximum pitch in bytes allowed by memory copies */ - CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK = 12, /**< Maximum number of 32-bit registers available per block */ - CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK = 12, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK */ - CU_DEVICE_ATTRIBUTE_CLOCK_RATE = 13, /**< Typical clock frequency in kilohertz */ - CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT = 14, /**< Alignment requirement for textures */ - CU_DEVICE_ATTRIBUTE_GPU_OVERLAP = 15, /**< Device can possibly copy memory and execute a kernel concurrently. Deprecated. Use instead CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT. */ - CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT = 16, /**< Number of multiprocessors on device */ - CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT = 17, /**< Specifies whether there is a run time limit on kernels */ - CU_DEVICE_ATTRIBUTE_INTEGRATED = 18, /**< Device is integrated with host memory */ - CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY = 19, /**< Device can map host memory into CUDA address space */ - CU_DEVICE_ATTRIBUTE_COMPUTE_MODE = 20, /**< Compute mode (See ::CUcomputemode for details) */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH = 21, /**< Maximum 1D texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH = 22, /**< Maximum 2D texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT = 23, /**< Maximum 2D texture height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH = 24, /**< Maximum 3D texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT = 25, /**< Maximum 3D texture height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH = 26, /**< Maximum 3D texture depth */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH = 27, /**< Maximum 2D layered texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT = 28, /**< Maximum 2D layered texture height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS = 29, /**< Maximum layers in a 2D layered texture */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH = 27, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT = 28, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES = 29, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS */ - CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT = 30, /**< Alignment requirement for surfaces */ - CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS = 31, /**< Device can possibly execute multiple kernels concurrently */ - CU_DEVICE_ATTRIBUTE_ECC_ENABLED = 32, /**< Device has ECC support enabled */ - CU_DEVICE_ATTRIBUTE_PCI_BUS_ID = 33, /**< PCI bus ID of the device */ - CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID = 34, /**< PCI device ID of the device */ - CU_DEVICE_ATTRIBUTE_TCC_DRIVER = 35, /**< Device is using TCC driver model */ - CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE = 36, /**< Peak memory clock frequency in kilohertz */ - CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH = 37, /**< Global memory bus width in bits */ - CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE = 38, /**< Size of L2 cache in bytes */ - CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR = 39, /**< Maximum resident threads per multiprocessor */ - CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT = 40, /**< Number of asynchronous engines */ - CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING = 41, /**< Device shares a unified address space with the host */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH = 42, /**< Maximum 1D layered texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS = 43, /**< Maximum layers in a 1D layered texture */ - CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER = 44, /**< Deprecated, do not use. */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH = 45, /**< Maximum 2D texture width if CUDA_ARRAY3D_TEXTURE_GATHER is set */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT = 46, /**< Maximum 2D texture height if CUDA_ARRAY3D_TEXTURE_GATHER is set */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE = 47, /**< Alternate maximum 3D texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE = 48,/**< Alternate maximum 3D texture height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE = 49, /**< Alternate maximum 3D texture depth */ - CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID = 50, /**< PCI domain ID of the device */ - CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT = 51, /**< Pitch alignment requirement for textures */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH = 52, /**< Maximum cubemap texture width/height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH = 53, /**< Maximum cubemap layered texture width/height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS = 54, /**< Maximum layers in a cubemap layered texture */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH = 55, /**< Maximum 1D surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH = 56, /**< Maximum 2D surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT = 57, /**< Maximum 2D surface height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH = 58, /**< Maximum 3D surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT = 59, /**< Maximum 3D surface height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH = 60, /**< Maximum 3D surface depth */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH = 61, /**< Maximum 1D layered surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS = 62, /**< Maximum layers in a 1D layered surface */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH = 63, /**< Maximum 2D layered surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT = 64, /**< Maximum 2D layered surface height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS = 65, /**< Maximum layers in a 2D layered surface */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH = 66, /**< Maximum cubemap surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH = 67, /**< Maximum cubemap layered surface width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS = 68, /**< Maximum layers in a cubemap layered surface */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH = 69, /**< Maximum 1D linear texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH = 70, /**< Maximum 2D linear texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT = 71, /**< Maximum 2D linear texture height */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH = 72, /**< Maximum 2D linear texture pitch in bytes */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH = 73, /**< Maximum mipmapped 2D texture width */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT = 74,/**< Maximum mipmapped 2D texture height */ - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR = 75, /**< Major compute capability version number */ - CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR = 76, /**< Minor compute capability version number */ - CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH = 77, /**< Maximum mipmapped 1D texture width */ - CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED = 78, /**< Device supports stream priorities */ - CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED = 79, /**< Device supports caching globals in L1 */ - CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED = 80, /**< Device supports caching locals in L1 */ - CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR = 81, /**< Maximum shared memory available per multiprocessor in bytes */ - CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR = 82, /**< Maximum number of 32-bit registers available per multiprocessor */ - CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY = 83, /**< Device can allocate managed memory on this system */ - CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD = 84, /**< Device is on a multi-GPU board */ - CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID = 85, /**< Unique id for a group of devices on the same multi-GPU board */ - CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED = 86, /**< Link between the device and the host supports native atomic operations (this is a placeholder attribute, and is not supported on any current hardware)*/ - CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO = 87, /**< Ratio of single precision performance (in floating-point operations per second) to double precision performance */ - CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS = 88, /**< Device supports coherently accessing pageable memory without calling cudaHostRegister on it */ - CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS = 89, /**< Device can coherently access managed memory concurrently with the CPU */ - CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED = 90, /**< Device supports compute preemption. */ - CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM = 91, /**< Device can access host registered memory at the same virtual address as the CPU */ - CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS = 92, /**< ::cuStreamBatchMemOp and related APIs are supported. */ - CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS = 93, /**< 64-bit operations are supported in ::cuStreamBatchMemOp and related APIs. */ - CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR = 94, /**< ::CU_STREAM_WAIT_VALUE_NOR is supported. */ - CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH = 95, /**< Device supports launching cooperative kernels via ::cuLaunchCooperativeKernel */ - CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH = 96, /**< Device can participate in cooperative kernels launched via ::cuLaunchCooperativeKernelMultiDevice */ - CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN = 97, /**< Maximum optin shared memory per block */ - CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES = 98, /**< Both the ::CU_STREAM_WAIT_VALUE_FLUSH flag and the ::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES MemOp are supported on the device. See \ref CUDA_MEMOP for additional details. */ - CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED = 99, /**< Device supports host memory registration via ::cudaHostRegister. */ - CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES = 100, /**< Device accesses pageable memory via the host's page tables. */ - CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST = 101, /**< The host can directly access managed memory on the device without migration. */ - CU_DEVICE_ATTRIBUTE_MAX - +typedef enum CUdevice_attribute_enum { + CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 1, /**< Maximum number of threads per block */ + CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X = 2, /**< Maximum block dimension X */ + CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Y = 3, /**< Maximum block dimension Y */ + CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_Z = 4, /**< Maximum block dimension Z */ + CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X = 5, /**< Maximum grid dimension X */ + CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Y = 6, /**< Maximum grid dimension Y */ + CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_Z = 7, /**< Maximum grid dimension Z */ + CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK = 8, /**< Maximum shared memory available per block in bytes */ + CU_DEVICE_ATTRIBUTE_SHARED_MEMORY_PER_BLOCK = 8, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK */ + CU_DEVICE_ATTRIBUTE_TOTAL_CONSTANT_MEMORY = 9, /**< Memory available on device for __constant__ variables in a CUDA C kernel in bytes */ + CU_DEVICE_ATTRIBUTE_WARP_SIZE = 10, /**< Warp size in threads */ + CU_DEVICE_ATTRIBUTE_MAX_PITCH = 11, /**< Maximum pitch in bytes allowed by memory copies */ + CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK = 12, /**< Maximum number of 32-bit registers available per block */ + CU_DEVICE_ATTRIBUTE_REGISTERS_PER_BLOCK = 12, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK */ + CU_DEVICE_ATTRIBUTE_CLOCK_RATE = 13, /**< Typical clock frequency in kilohertz */ + CU_DEVICE_ATTRIBUTE_TEXTURE_ALIGNMENT = 14, /**< Alignment requirement for textures */ + CU_DEVICE_ATTRIBUTE_GPU_OVERLAP = 15, /**< Device can possibly copy memory and execute a kernel concurrently. Deprecated. Use instead CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT. */ + CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT = 16, /**< Number of multiprocessors on device */ + CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT = 17, /**< Specifies whether there is a run time limit on kernels */ + CU_DEVICE_ATTRIBUTE_INTEGRATED = 18, /**< Device is integrated with host memory */ + CU_DEVICE_ATTRIBUTE_CAN_MAP_HOST_MEMORY = 19, /**< Device can map host memory into CUDA address space */ + CU_DEVICE_ATTRIBUTE_COMPUTE_MODE = 20, /**< Compute mode (See ::CUcomputemode for details) */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_WIDTH = 21, /**< Maximum 1D texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_WIDTH = 22, /**< Maximum 2D texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_HEIGHT = 23, /**< Maximum 2D texture height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH = 24, /**< Maximum 3D texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT = 25, /**< Maximum 3D texture height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH = 26, /**< Maximum 3D texture depth */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH = 27, /**< Maximum 2D layered texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT = 28, /**< Maximum 2D layered texture height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS = 29, /**< Maximum layers in a 2D layered texture */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_WIDTH = 27, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_WIDTH */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_HEIGHT = 28, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_HEIGHT */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES = 29, /**< Deprecated, use CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LAYERED_LAYERS */ + CU_DEVICE_ATTRIBUTE_SURFACE_ALIGNMENT = 30, /**< Alignment requirement for surfaces */ + CU_DEVICE_ATTRIBUTE_CONCURRENT_KERNELS = 31, /**< Device can possibly execute multiple kernels concurrently */ + CU_DEVICE_ATTRIBUTE_ECC_ENABLED = 32, /**< Device has ECC support enabled */ + CU_DEVICE_ATTRIBUTE_PCI_BUS_ID = 33, /**< PCI bus ID of the device */ + CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID = 34, /**< PCI device ID of the device */ + CU_DEVICE_ATTRIBUTE_TCC_DRIVER = 35, /**< Device is using TCC driver model */ + CU_DEVICE_ATTRIBUTE_MEMORY_CLOCK_RATE = 36, /**< Peak memory clock frequency in kilohertz */ + CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH = 37, /**< Global memory bus width in bits */ + CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE = 38, /**< Size of L2 cache in bytes */ + CU_DEVICE_ATTRIBUTE_MAX_THREADS_PER_MULTIPROCESSOR = 39, /**< Maximum resident threads per multiprocessor */ + CU_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT = 40, /**< Number of asynchronous engines */ + CU_DEVICE_ATTRIBUTE_UNIFIED_ADDRESSING = 41, /**< Device shares a unified address space with the host */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_WIDTH = 42, /**< Maximum 1D layered texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LAYERED_LAYERS = 43, /**< Maximum layers in a 1D layered texture */ + CU_DEVICE_ATTRIBUTE_CAN_TEX2D_GATHER = 44, /**< Deprecated, do not use. */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_WIDTH = 45, /**< Maximum 2D texture width if CUDA_ARRAY3D_TEXTURE_GATHER is set */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_GATHER_HEIGHT = 46, /**< Maximum 2D texture height if CUDA_ARRAY3D_TEXTURE_GATHER is set */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE = 47, /**< Alternate maximum 3D texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE = 48, /**< Alternate maximum 3D texture height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE = 49, /**< Alternate maximum 3D texture depth */ + CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID = 50, /**< PCI domain ID of the device */ + CU_DEVICE_ATTRIBUTE_TEXTURE_PITCH_ALIGNMENT = 51, /**< Pitch alignment requirement for textures */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_WIDTH = 52, /**< Maximum cubemap texture width/height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH = 53, /**< Maximum cubemap layered texture width/height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS = 54, /**< Maximum layers in a cubemap layered texture */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_WIDTH = 55, /**< Maximum 1D surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_WIDTH = 56, /**< Maximum 2D surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_HEIGHT = 57, /**< Maximum 2D surface height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_WIDTH = 58, /**< Maximum 3D surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_HEIGHT = 59, /**< Maximum 3D surface height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE3D_DEPTH = 60, /**< Maximum 3D surface depth */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_WIDTH = 61, /**< Maximum 1D layered surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE1D_LAYERED_LAYERS = 62, /**< Maximum layers in a 1D layered surface */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_WIDTH = 63, /**< Maximum 2D layered surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_HEIGHT = 64, /**< Maximum 2D layered surface height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACE2D_LAYERED_LAYERS = 65, /**< Maximum layers in a 2D layered surface */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_WIDTH = 66, /**< Maximum cubemap surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH = 67, /**< Maximum cubemap layered surface width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS = 68, /**< Maximum layers in a cubemap layered surface */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_LINEAR_WIDTH = 69, /**< Deprecated, do not use. Use cudaDeviceGetTexture1DLinearMaxWidth() or cuDeviceGetTexture1DLinearMaxWidth() instead. */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_WIDTH = 70, /**< Maximum 2D linear texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_HEIGHT = 71, /**< Maximum 2D linear texture height */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_LINEAR_PITCH = 72, /**< Maximum 2D linear texture pitch in bytes */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH = 73, /**< Maximum mipmapped 2D texture width */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT = 74, /**< Maximum mipmapped 2D texture height */ + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR = 75, /**< Major compute capability version number */ + CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR = 76, /**< Minor compute capability version number */ + CU_DEVICE_ATTRIBUTE_MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH = 77, /**< Maximum mipmapped 1D texture width */ + CU_DEVICE_ATTRIBUTE_STREAM_PRIORITIES_SUPPORTED = 78, /**< Device supports stream priorities */ + CU_DEVICE_ATTRIBUTE_GLOBAL_L1_CACHE_SUPPORTED = 79, /**< Device supports caching globals in L1 */ + CU_DEVICE_ATTRIBUTE_LOCAL_L1_CACHE_SUPPORTED = 80, /**< Device supports caching locals in L1 */ + CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR = 81, /**< Maximum shared memory available per multiprocessor in bytes */ + CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR = 82, /**< Maximum number of 32-bit registers available per multiprocessor */ + CU_DEVICE_ATTRIBUTE_MANAGED_MEMORY = 83, /**< Device can allocate managed memory on this system */ + CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD = 84, /**< Device is on a multi-GPU board */ + CU_DEVICE_ATTRIBUTE_MULTI_GPU_BOARD_GROUP_ID = 85, /**< Unique id for a group of devices on the same multi-GPU board */ + CU_DEVICE_ATTRIBUTE_HOST_NATIVE_ATOMIC_SUPPORTED = 86, /**< Link between the device and the host supports native atomic operations */ + CU_DEVICE_ATTRIBUTE_SINGLE_TO_DOUBLE_PRECISION_PERF_RATIO = 87, /**< Ratio of single precision performance (in floating-point operations per second) to double precision performance */ + CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS = 88, /**< Device supports coherently accessing pageable memory without calling cudaHostRegister on it */ + CU_DEVICE_ATTRIBUTE_CONCURRENT_MANAGED_ACCESS = 89, /**< Device can coherently access managed memory concurrently with the CPU */ + CU_DEVICE_ATTRIBUTE_COMPUTE_PREEMPTION_SUPPORTED = 90, /**< Device supports compute preemption. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_HOST_POINTER_FOR_REGISTERED_MEM = 91, /**< Device can access host registered memory at the same virtual address as the CPU */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_MEM_OPS_V1 = 92, /**< Deprecated, along with v1 MemOps API, ::cuStreamBatchMemOp and related APIs are supported. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS_V1 = 93, /**< Deprecated, along with v1 MemOps API, 64-bit operations are supported in ::cuStreamBatchMemOp and related APIs. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR_V1 = 94, /**< Deprecated, along with v1 MemOps API, ::CU_STREAM_WAIT_VALUE_NOR is supported. */ + CU_DEVICE_ATTRIBUTE_COOPERATIVE_LAUNCH = 95, /**< Device supports launching cooperative kernels via ::cuLaunchCooperativeKernel */ + CU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH = 96, /**< Deprecated, ::cuLaunchCooperativeKernelMultiDevice is deprecated. */ + CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_BLOCK_OPTIN = 97, /**< Maximum optin shared memory per block */ + CU_DEVICE_ATTRIBUTE_CAN_FLUSH_REMOTE_WRITES = 98, /**< The ::CU_STREAM_WAIT_VALUE_FLUSH flag and the ::CU_STREAM_MEM_OP_FLUSH_REMOTE_WRITES MemOp are supported on the device. See \ref CUDA_MEMOP for additional details. */ + CU_DEVICE_ATTRIBUTE_HOST_REGISTER_SUPPORTED = 99, /**< Device supports host memory registration via ::cudaHostRegister. */ + CU_DEVICE_ATTRIBUTE_PAGEABLE_MEMORY_ACCESS_USES_HOST_PAGE_TABLES = 100, /**< Device accesses pageable memory via the host's page tables. */ + CU_DEVICE_ATTRIBUTE_DIRECT_MANAGED_MEM_ACCESS_FROM_HOST = 101, /**< The host can directly access managed memory on the device without migration. */ + CU_DEVICE_ATTRIBUTE_VIRTUAL_ADDRESS_MANAGEMENT_SUPPORTED = 102, /**< Deprecated, Use CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED*/ + CU_DEVICE_ATTRIBUTE_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED = 102, /**< Device supports virtual memory management APIs like ::cuMemAddressReserve, ::cuMemCreate, ::cuMemMap and related APIs */ + CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_POSIX_FILE_DESCRIPTOR_SUPPORTED = 103, /**< Device supports exporting memory to a posix file descriptor with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate */ + CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_HANDLE_SUPPORTED = 104, /**< Device supports exporting memory to a Win32 NT handle with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate */ + CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_WIN32_KMT_HANDLE_SUPPORTED = 105, /**< Device supports exporting memory to a Win32 KMT handle with ::cuMemExportToShareableHandle, if requested via ::cuMemCreate */ + CU_DEVICE_ATTRIBUTE_MAX_BLOCKS_PER_MULTIPROCESSOR = 106, /**< Maximum number of blocks per multiprocessor */ + CU_DEVICE_ATTRIBUTE_GENERIC_COMPRESSION_SUPPORTED = 107, /**< Device supports compression of memory */ + CU_DEVICE_ATTRIBUTE_MAX_PERSISTING_L2_CACHE_SIZE = 108, /**< Maximum L2 persisting lines capacity setting in bytes. */ + CU_DEVICE_ATTRIBUTE_MAX_ACCESS_POLICY_WINDOW_SIZE = 109, /**< Maximum value of CUaccessPolicyWindow::num_bytes. */ + CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WITH_CUDA_VMM_SUPPORTED = 110, /**< Device supports specifying the GPUDirect RDMA flag with ::cuMemCreate */ + CU_DEVICE_ATTRIBUTE_RESERVED_SHARED_MEMORY_PER_BLOCK = 111, /**< Shared memory reserved by CUDA driver per block in bytes */ + CU_DEVICE_ATTRIBUTE_SPARSE_CUDA_ARRAY_SUPPORTED = 112, /**< Device supports sparse CUDA arrays and sparse CUDA mipmapped arrays */ + CU_DEVICE_ATTRIBUTE_READ_ONLY_HOST_REGISTER_SUPPORTED = 113, /**< Device supports using the ::cuMemHostRegister flag ::CU_MEMHOSTERGISTER_READ_ONLY to register memory that must be mapped as read-only to the GPU */ + CU_DEVICE_ATTRIBUTE_TIMELINE_SEMAPHORE_INTEROP_SUPPORTED = 114, /**< External timeline semaphore interop is supported on the device */ + CU_DEVICE_ATTRIBUTE_MEMORY_POOLS_SUPPORTED = 115, /**< Device supports using the ::cuMemAllocAsync and ::cuMemPool family of APIs */ + CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_SUPPORTED = 116, /**< Device supports GPUDirect RDMA APIs, like nvidia_p2p_get_pages (see https://docs.nvidia.com/cuda/gpudirect-rdma for more information) */ + CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_FLUSH_WRITES_OPTIONS = 117, /**< The returned attribute shall be interpreted as a bitmask, where the individual bits are described by the ::CUflushGPUDirectRDMAWritesOptions enum */ + CU_DEVICE_ATTRIBUTE_GPU_DIRECT_RDMA_WRITES_ORDERING = 118, /**< GPUDirect RDMA writes to the device do not need to be flushed for consumers within the scope indicated by the returned attribute. See ::CUGPUDirectRDMAWritesOrdering for the numerical values returned here. */ + CU_DEVICE_ATTRIBUTE_MEMPOOL_SUPPORTED_HANDLE_TYPES = 119, /**< Handle types supported with mempool based IPC */ + CU_DEVICE_ATTRIBUTE_CLUSTER_LAUNCH = 120, /**< Indicates device supports cluster launch */ + CU_DEVICE_ATTRIBUTE_DEFERRED_MAPPING_CUDA_ARRAY_SUPPORTED = 121, /**< Device supports deferred mapping CUDA arrays and CUDA mipmapped arrays */ + CU_DEVICE_ATTRIBUTE_CAN_USE_64_BIT_STREAM_MEM_OPS = 122, /**< 64-bit operations are supported in ::cuStreamBatchMemOp and related MemOp APIs. */ + CU_DEVICE_ATTRIBUTE_CAN_USE_STREAM_WAIT_VALUE_NOR = 123, /**< ::CU_STREAM_WAIT_VALUE_NOR is supported by MemOp APIs. */ + CU_DEVICE_ATTRIBUTE_DMA_BUF_SUPPORTED = 124, /**< Device supports buffer sharing with dma_buf mechanism. */ + CU_DEVICE_ATTRIBUTE_IPC_EVENT_SUPPORTED = 125, /**< Device supports IPC Events. */ + CU_DEVICE_ATTRIBUTE_MEM_SYNC_DOMAIN_COUNT = 126, /**< Number of memory domains the device supports. */ + CU_DEVICE_ATTRIBUTE_TENSOR_MAP_ACCESS_SUPPORTED = 127, /**< Device supports accessing memory using Tensor Map. */ + CU_DEVICE_ATTRIBUTE_HANDLE_TYPE_FABRIC_SUPPORTED = 128, /**< Device supports exporting memory to a fabric handle with cuMemExportToShareableHandle() or requested with cuMemCreate() */ + CU_DEVICE_ATTRIBUTE_UNIFIED_FUNCTION_POINTERS = 129, /**< Device supports unified function pointers. */ + CU_DEVICE_ATTRIBUTE_NUMA_CONFIG = 130, /**< NUMA configuration of a device: value is of type ::CUdeviceNumaConfig enum */ + CU_DEVICE_ATTRIBUTE_NUMA_ID = 131, /**< NUMA node ID of the GPU memory */ + CU_DEVICE_ATTRIBUTE_MULTICAST_SUPPORTED = 132, /**< Device supports switch multicast and reduction operations. */ + CU_DEVICE_ATTRIBUTE_MPS_ENABLED = 133, /**< Indicates if contexts created on this device will be shared via MPS */ + CU_DEVICE_ATTRIBUTE_HOST_NUMA_ID = 134, /**< NUMA ID of the host node closest to the device. Returns -1 when system does not support NUMA. */ + CU_DEVICE_ATTRIBUTE_D3D12_CIG_SUPPORTED = 135, /**< Device supports CIG with D3D12. */ + CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_ALGORITHM_MASK = 136, /**< The returned valued shall be interpreted as a bitmask, where the individual bits are described by the ::CUmemDecompressAlgorithm enum. */ + CU_DEVICE_ATTRIBUTE_MEM_DECOMPRESS_MAXIMUM_LENGTH = 137, /**< The returned valued is the maximum length in bytes of a single decompress operation that is allowed. */ + CU_DEVICE_ATTRIBUTE_VULKAN_CIG_SUPPORTED = 138, /**< Device supports CIG with Vulkan. */ + CU_DEVICE_ATTRIBUTE_GPU_PCI_DEVICE_ID = 139, /**< The combined 16-bit PCI device ID and 16-bit PCI vendor ID. */ + CU_DEVICE_ATTRIBUTE_GPU_PCI_SUBSYSTEM_ID = 140, /**< The combined 16-bit PCI subsystem ID and 16-bit PCI subsystem vendor ID. */ + CU_DEVICE_ATTRIBUTE_HOST_NUMA_VIRTUAL_MEMORY_MANAGEMENT_SUPPORTED = 141, /**< Device supports HOST_NUMA location with the virtual memory management APIs like ::cuMemCreate, ::cuMemMap and related APIs */ + CU_DEVICE_ATTRIBUTE_HOST_NUMA_MEMORY_POOLS_SUPPORTED = 142, /**< Device supports HOST_NUMA location with the ::cuMemAllocAsync and ::cuMemPool family of APIs */ + CU_DEVICE_ATTRIBUTE_HOST_NUMA_MULTINODE_IPC_SUPPORTED = 143, /**< Device supports HOST_NUMA location IPC between nodes in a multi-node system. */ + CU_DEVICE_ATTRIBUTE_MAX } CUdevice_attribute; + /** * Function cache configurations */ @@ -850,81 +892,148 @@ typedef enum CUsharedconfig_enum /** * Function properties */ -typedef enum CUfunction_attribute_enum -{ - /** - * The maximum number of threads per block, beyond which a launch of the - * function would fail. This number depends on both the function and the - * device on which the function is currently loaded. - */ - CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 0, +typedef enum CUfunction_attribute_enum { + /** + * The maximum number of threads per block, beyond which a launch of the + * function would fail. This number depends on both the function and the + * device on which the function is currently loaded. + */ + CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK = 0, - /** - * The size in bytes of statically-allocated shared memory required by - * this function. This does not include dynamically-allocated shared - * memory requested by the user at runtime. - */ - CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES = 1, + /** + * The size in bytes of statically-allocated shared memory required by + * this function. This does not include dynamically-allocated shared + * memory requested by the user at runtime. + */ + CU_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES = 1, - /** - * The size in bytes of user-allocated constant memory required by this - * function. - */ - CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES = 2, + /** + * The size in bytes of user-allocated constant memory required by this + * function. + */ + CU_FUNC_ATTRIBUTE_CONST_SIZE_BYTES = 2, - /** - * The size in bytes of local memory used by each thread of this function. - */ - CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES = 3, + /** + * The size in bytes of local memory used by each thread of this function. + */ + CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES = 3, - /** - * The number of registers used by each thread of this function. - */ - CU_FUNC_ATTRIBUTE_NUM_REGS = 4, + /** + * The number of registers used by each thread of this function. + */ + CU_FUNC_ATTRIBUTE_NUM_REGS = 4, - /** - * The PTX virtual architecture version for which the function was - * compiled. This value is the major PTX version * 10 + the minor PTX - * version, so a PTX version 1.3 function would return the value 13. - * Note that this may return the undefined value of 0 for cubins - * compiled prior to CUDA 3.0. - */ - CU_FUNC_ATTRIBUTE_PTX_VERSION = 5, + /** + * The PTX virtual architecture version for which the function was + * compiled. This value is the major PTX version * 10 + the minor PTX + * version, so a PTX version 1.3 function would return the value 13. + * Note that this may return the undefined value of 0 for cubins + * compiled prior to CUDA 3.0. + */ + CU_FUNC_ATTRIBUTE_PTX_VERSION = 5, - /** - * The binary architecture version for which the function was compiled. - * This value is the major binary version * 10 + the minor binary version, - * so a binary version 1.3 function would return the value 13. Note that - * this will return a value of 10 for legacy cubins that do not have a - * properly-encoded binary architecture version. - */ - CU_FUNC_ATTRIBUTE_BINARY_VERSION = 6, + /** + * The binary architecture version for which the function was compiled. + * This value is the major binary version * 10 + the minor binary version, + * so a binary version 1.3 function would return the value 13. Note that + * this will return a value of 10 for legacy cubins that do not have a + * properly-encoded binary architecture version. + */ + CU_FUNC_ATTRIBUTE_BINARY_VERSION = 6, - /** - * The attribute to indicate whether the function has been compiled with - * user specified option "-Xptxas --dlcm=ca" set . - */ - CU_FUNC_ATTRIBUTE_CACHE_MODE_CA = 7, + /** + * The attribute to indicate whether the function has been compiled with + * user specified option "-Xptxas --dlcm=ca" set . + */ + CU_FUNC_ATTRIBUTE_CACHE_MODE_CA = 7, - /** - * The maximum size in bytes of dynamically-allocated shared memory that can be used by - * this function. If the user-specified dynamic shared memory size is larger than this - * value, the launch will fail. - * See ::cuFuncSetAttribute - */ - CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES = 8, + /** + * The maximum size in bytes of dynamically-allocated shared memory that can be used by + * this function. If the user-specified dynamic shared memory size is larger than this + * value, the launch will fail. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES = 8, - /** - * On devices where the L1 cache and shared memory use the same hardware resources, - * this sets the shared memory carveout preference, in percent of the total shared memory. - * Refer to ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR. - * This is only a hint, and the driver can choose a different ratio if required to execute the function. - * See ::cuFuncSetAttribute - */ - CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT = 9, + /** + * On devices where the L1 cache and shared memory use the same hardware resources, + * this sets the shared memory carveout preference, in percent of the total shared memory. + * Refer to ::CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR. + * This is only a hint, and the driver can choose a different ratio if required to execute the function. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT = 9, - CU_FUNC_ATTRIBUTE_MAX + /** + * If this attribute is set, the kernel must launch with a valid cluster + * size specified. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_CLUSTER_SIZE_MUST_BE_SET = 10, + /** + * The required cluster width in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime will return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_WIDTH = 11, + + /** + * The required cluster height in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_HEIGHT = 12, + + /** + * The required cluster depth in blocks. The values must either all be 0 or + * all be positive. The validity of the cluster dimensions is otherwise + * checked at launch time. + * + * If the value is set during compile time, it cannot be set at runtime. + * Setting it at runtime should return CUDA_ERROR_NOT_PERMITTED. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_REQUIRED_CLUSTER_DEPTH = 13, + + /** + * Whether the function can be launched with non-portable cluster size. 1 is + * allowed, 0 is disallowed. A non-portable cluster size may only function + * on the specific SKUs the program is tested on. The launch might fail if + * the program is run on a different hardware platform. + * + * CUDA API provides cudaOccupancyMaxActiveClusters to assist with checking + * whether the desired size can be launched on the current device. + * + * Portable Cluster Size + * + * A portable cluster size is guaranteed to be functional on all compute + * capabilities higher than the target compute capability. The portable + * cluster size for sm_90 is 8 blocks per cluster. This value may increase + * for future compute capabilities. + * + * The specific hardware unit may support higher cluster sizes that’s not + * guaranteed to be portable. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_NON_PORTABLE_CLUSTER_SIZE_ALLOWED = 14, + + /** + * The block scheduling policy of a function. The value type is + * CUclusterSchedulingPolicy / cudaClusterSchedulingPolicy. + * See ::cuFuncSetAttribute, ::cuKernelSetAttribute + */ + CU_FUNC_ATTRIBUTE_CLUSTER_SCHEDULING_POLICY_PREFERENCE = 15, + + CU_FUNC_ATTRIBUTE_MAX } CUfunction_attribute; /** @@ -1069,6 +1178,7 @@ typedef CUresult (CUDA_API_CALL *CUDA_CULINKCREATE) (unsigned int, C typedef CUresult (CUDA_API_CALL *CUDA_CULINKADDDATA) (CUlinkState, CUjitInputType, void *, size_t, const char *, unsigned int, CUjit_option *, void **); typedef CUresult (CUDA_API_CALL *CUDA_CULINKDESTROY) (CUlinkState); typedef CUresult (CUDA_API_CALL *CUDA_CULINKCOMPLETE) (CUlinkState, void **, size_t *); +typedef CUresult (CUDA_API_CALL *CUDA_CUOCCUPANCYMAXBLOCKSPERMULTIPROCESSOR) (int *, CUfunction, int, size_t); typedef struct hc_cuda_lib { @@ -1131,6 +1241,7 @@ typedef struct hc_cuda_lib CUDA_CULINKADDDATA cuLinkAddData; CUDA_CULINKDESTROY cuLinkDestroy; CUDA_CULINKCOMPLETE cuLinkComplete; + CUDA_CUOCCUPANCYMAXBLOCKSPERMULTIPROCESSOR cuOccupancyMaxActiveBlocksPerMultiprocessor; } hc_cuda_lib_t; @@ -1181,5 +1292,6 @@ int hc_cuLinkCreate (void *hashcat_ctx, unsigned int numOptions, CUji int hc_cuLinkAddData (void *hashcat_ctx, CUlinkState state, CUjitInputType type, void *data, size_t size, const char *name, unsigned int numOptions, CUjit_option *options, void **optionValues); int hc_cuLinkDestroy (void *hashcat_ctx, CUlinkState state); int hc_cuLinkComplete (void *hashcat_ctx, CUlinkState state, void **cubinOut, size_t *sizeOut); +int hc_cuOccupancyMaxActiveBlocksPerMultiprocessor (void *hashcat_ctx, int *numBlocks, CUfunction func, int blockSize, size_t dynamicSMemSize); #endif // HC_EXT_CUDA_H diff --git a/include/ext_hip.h b/include/ext_hip.h index eb0d52a59..4cc6fb797 100644 --- a/include/ext_hip.h +++ b/include/ext_hip.h @@ -15,16 +15,16 @@ typedef void* hipDeviceptr_t; typedef enum hipFunction_attribute { - HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, - HIP_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES, - HIP_FUNC_ATTRIBUTE_CONST_SIZE_BYTES, - HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES, - HIP_FUNC_ATTRIBUTE_NUM_REGS, - HIP_FUNC_ATTRIBUTE_PTX_VERSION, - HIP_FUNC_ATTRIBUTE_BINARY_VERSION, - HIP_FUNC_ATTRIBUTE_CACHE_MODE_CA, - HIP_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, - HIP_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT, + HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, ///< The maximum number of threads per block. Depends on function and device. + HIP_FUNC_ATTRIBUTE_SHARED_SIZE_BYTES, ///< The statically allocated shared memory size in bytes per block required by the function. + HIP_FUNC_ATTRIBUTE_CONST_SIZE_BYTES, ///< The user-allocated constant memory by the function in bytes. + HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES, ///< The local memory usage of each thread by this function in bytes. + HIP_FUNC_ATTRIBUTE_NUM_REGS, ///< The number of registers used by each thread of this function. + HIP_FUNC_ATTRIBUTE_PTX_VERSION, ///< PTX version + HIP_FUNC_ATTRIBUTE_BINARY_VERSION, ///< Binary version + HIP_FUNC_ATTRIBUTE_CACHE_MODE_CA, ///< Cache mode + HIP_FUNC_ATTRIBUTE_MAX_DYNAMIC_SHARED_SIZE_BYTES, ///< The maximum dynamic shared memory per block for this function in bytes. + HIP_FUNC_ATTRIBUTE_PREFERRED_SHARED_MEMORY_CARVEOUT, ///< The shared memory carveout preference in percent of the maximum shared memory. HIP_FUNC_ATTRIBUTE_MAX } hipFunction_attribute; @@ -165,38 +165,43 @@ typedef enum __HIP_NODISCARD hipError_t { #undef __HIP_NODISCARD + +/** + * hipDeviceAttribute_t + * hipDeviceAttributeUnused number: 5 + */ typedef enum hipDeviceAttribute_t { hipDeviceAttributeCudaCompatibleBegin = 0, hipDeviceAttributeEccEnabled = hipDeviceAttributeCudaCompatibleBegin, ///< Whether ECC support is enabled. hipDeviceAttributeAccessPolicyMaxWindowSize, ///< Cuda only. The maximum size of the window policy in bytes. - hipDeviceAttributeAsyncEngineCount, ///< Cuda only. Asynchronous engines number. + hipDeviceAttributeAsyncEngineCount, ///< Asynchronous engines number. hipDeviceAttributeCanMapHostMemory, ///< Whether host memory can be mapped into device address space - hipDeviceAttributeCanUseHostPointerForRegisteredMem,///< Cuda only. Device can access host registered memory + hipDeviceAttributeCanUseHostPointerForRegisteredMem,///< Device can access host registered memory ///< at the same virtual address as the CPU hipDeviceAttributeClockRate, ///< Peak clock frequency in kilohertz. hipDeviceAttributeComputeMode, ///< Compute mode that device is currently in. - hipDeviceAttributeComputePreemptionSupported, ///< Cuda only. Device supports Compute Preemption. + hipDeviceAttributeComputePreemptionSupported, ///< Device supports Compute Preemption. hipDeviceAttributeConcurrentKernels, ///< Device can possibly execute multiple kernels concurrently. hipDeviceAttributeConcurrentManagedAccess, ///< Device can coherently access managed memory concurrently with the CPU hipDeviceAttributeCooperativeLaunch, ///< Support cooperative launch hipDeviceAttributeCooperativeMultiDeviceLaunch, ///< Support cooperative launch on multiple devices - hipDeviceAttributeDeviceOverlap, ///< Cuda only. Device can concurrently copy memory and execute a kernel. + hipDeviceAttributeDeviceOverlap, ///< Device can concurrently copy memory and execute a kernel. ///< Deprecated. Use instead asyncEngineCount. hipDeviceAttributeDirectManagedMemAccessFromHost, ///< Host can directly access managed memory on ///< the device without migration - hipDeviceAttributeGlobalL1CacheSupported, ///< Cuda only. Device supports caching globals in L1 - hipDeviceAttributeHostNativeAtomicSupported, ///< Cuda only. Link between the device and the host supports native atomic operations + hipDeviceAttributeGlobalL1CacheSupported, ///< Device supports caching globals in L1 + hipDeviceAttributeHostNativeAtomicSupported, ///< Link between the device and the host supports native atomic operations hipDeviceAttributeIntegrated, ///< Device is integrated GPU hipDeviceAttributeIsMultiGpuBoard, ///< Multiple GPU devices. hipDeviceAttributeKernelExecTimeout, ///< Run time limit for kernels executed on the device hipDeviceAttributeL2CacheSize, ///< Size of L2 cache in bytes. 0 if the device doesn't have L2 cache. hipDeviceAttributeLocalL1CacheSupported, ///< caching locals in L1 is supported - hipDeviceAttributeLuid, ///< Cuda only. 8-byte locally unique identifier in 8 bytes. Undefined on TCC and non-Windows platforms - hipDeviceAttributeLuidDeviceNodeMask, ///< Cuda only. Luid device node mask. Undefined on TCC and non-Windows platforms + hipDeviceAttributeLuid, ///< 8-byte locally unique identifier in 8 bytes. Undefined on TCC and non-Windows platforms + hipDeviceAttributeLuidDeviceNodeMask, ///< Luid device node mask. Undefined on TCC and non-Windows platforms hipDeviceAttributeComputeCapabilityMajor, ///< Major compute capability version number. hipDeviceAttributeManagedMemory, ///< Device supports allocating managed memory on this system - hipDeviceAttributeMaxBlocksPerMultiProcessor, ///< Cuda only. Max block size per multiprocessor + hipDeviceAttributeMaxBlocksPerMultiProcessor, ///< Max block size per multiprocessor hipDeviceAttributeMaxBlockDimX, ///< Max block size in width. hipDeviceAttributeMaxBlockDimY, ///< Max block size in height. hipDeviceAttributeMaxBlockDimZ, ///< Max block size in depth. @@ -211,22 +216,22 @@ typedef enum hipDeviceAttribute_t { hipDeviceAttributeMaxSurfaceCubemap, ///< Cuda only. Maximum dimensions of Cubemap surface. hipDeviceAttributeMaxSurfaceCubemapLayered, ///< Cuda only. Maximum dimension of Cubemap layered surface. hipDeviceAttributeMaxTexture1DWidth, ///< Maximum size of 1D texture. - hipDeviceAttributeMaxTexture1DLayered, ///< Cuda only. Maximum dimensions of 1D layered texture. + hipDeviceAttributeMaxTexture1DLayered, ///< Maximum dimensions of 1D layered texture. hipDeviceAttributeMaxTexture1DLinear, ///< Maximum number of elements allocatable in a 1D linear texture. ///< Use cudaDeviceGetTexture1DLinearMaxWidth() instead on Cuda. - hipDeviceAttributeMaxTexture1DMipmap, ///< Cuda only. Maximum size of 1D mipmapped texture. + hipDeviceAttributeMaxTexture1DMipmap, ///< Maximum size of 1D mipmapped texture. hipDeviceAttributeMaxTexture2DWidth, ///< Maximum dimension width of 2D texture. - hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension height of 2D texture. - hipDeviceAttributeMaxTexture2DGather, ///< Cuda only. Maximum dimensions of 2D texture if gather operations performed. - hipDeviceAttributeMaxTexture2DLayered, ///< Cuda only. Maximum dimensions of 2D layered texture. - hipDeviceAttributeMaxTexture2DLinear, ///< Cuda only. Maximum dimensions (width, height, pitch) of 2D textures bound to pitched memory. - hipDeviceAttributeMaxTexture2DMipmap, ///< Cuda only. Maximum dimensions of 2D mipmapped texture. + hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension hight of 2D texture. + hipDeviceAttributeMaxTexture2DGather, ///< Maximum dimensions of 2D texture if gather operations performed. + hipDeviceAttributeMaxTexture2DLayered, ///< Maximum dimensions of 2D layered texture. + hipDeviceAttributeMaxTexture2DLinear, ///< Maximum dimensions (width, height, pitch) of 2D textures bound to pitched memory. + hipDeviceAttributeMaxTexture2DMipmap, ///< Maximum dimensions of 2D mipmapped texture. hipDeviceAttributeMaxTexture3DWidth, ///< Maximum dimension width of 3D texture. hipDeviceAttributeMaxTexture3DHeight, ///< Maximum dimension height of 3D texture. hipDeviceAttributeMaxTexture3DDepth, ///< Maximum dimension depth of 3D texture. - hipDeviceAttributeMaxTexture3DAlt, ///< Cuda only. Maximum dimensions of alternate 3D texture. - hipDeviceAttributeMaxTextureCubemap, ///< Cuda only. Maximum dimensions of Cubemap texture - hipDeviceAttributeMaxTextureCubemapLayered, ///< Cuda only. Maximum dimensions of Cubemap layered texture. + hipDeviceAttributeMaxTexture3DAlt, ///< Maximum dimensions of alternate 3D texture. + hipDeviceAttributeMaxTextureCubemap, ///< Maximum dimensions of Cubemap texture + hipDeviceAttributeMaxTextureCubemapLayered, ///< Maximum dimensions of Cubemap layered texture. hipDeviceAttributeMaxThreadsDim, ///< Maximum dimension of a block hipDeviceAttributeMaxThreadsPerBlock, ///< Maximum number of threads per block. hipDeviceAttributeMaxThreadsPerMultiProcessor, ///< Maximum resident threads per multiprocessor. @@ -234,45 +239,47 @@ typedef enum hipDeviceAttribute_t { hipDeviceAttributeMemoryBusWidth, ///< Global memory bus width in bits. hipDeviceAttributeMemoryClockRate, ///< Peak memory clock frequency in kilohertz. hipDeviceAttributeComputeCapabilityMinor, ///< Minor compute capability version number. - hipDeviceAttributeMultiGpuBoardGroupID, ///< Cuda only. Unique ID of device group on the same multi-GPU board + hipDeviceAttributeMultiGpuBoardGroupID, ///< Unique ID of device group on the same multi-GPU board hipDeviceAttributeMultiprocessorCount, ///< Number of multiprocessors on the device. - hipDeviceAttributeName, ///< Device name. + hipDeviceAttributeUnused1, ///< Previously hipDeviceAttributeName hipDeviceAttributePageableMemoryAccess, ///< Device supports coherently accessing pageable memory ///< without calling hipHostRegister on it hipDeviceAttributePageableMemoryAccessUsesHostPageTables, ///< Device accesses pageable memory via the host's page tables hipDeviceAttributePciBusId, ///< PCI Bus ID. hipDeviceAttributePciDeviceId, ///< PCI Device ID. hipDeviceAttributePciDomainID, ///< PCI Domain ID. - hipDeviceAttributePersistingL2CacheMaxSize, ///< Cuda11 only. Maximum l2 persisting lines capacity in bytes + hipDeviceAttributePersistingL2CacheMaxSize, ///< Maximum l2 persisting lines capacity in bytes hipDeviceAttributeMaxRegistersPerBlock, ///< 32-bit registers available to a thread block. This number is shared ///< by all thread blocks simultaneously resident on a multiprocessor. hipDeviceAttributeMaxRegistersPerMultiprocessor, ///< 32-bit registers available per block. - hipDeviceAttributeReservedSharedMemPerBlock, ///< Cuda11 only. Shared memory reserved by CUDA driver per block. + hipDeviceAttributeReservedSharedMemPerBlock, ///< Shared memory reserved by CUDA driver per block. hipDeviceAttributeMaxSharedMemoryPerBlock, ///< Maximum shared memory available per block in bytes. - hipDeviceAttributeSharedMemPerBlockOptin, ///< Cuda only. Maximum shared memory per block usable by special opt in. - hipDeviceAttributeSharedMemPerMultiprocessor, ///< Cuda only. Shared memory available per multiprocessor. + hipDeviceAttributeSharedMemPerBlockOptin, ///< Maximum shared memory per block usable by special opt in. + hipDeviceAttributeSharedMemPerMultiprocessor, ///< Shared memory available per multiprocessor. hipDeviceAttributeSingleToDoublePrecisionPerfRatio, ///< Cuda only. Performance ratio of single precision to double precision. - hipDeviceAttributeStreamPrioritiesSupported, ///< Cuda only. Whether to support stream priorities. - hipDeviceAttributeSurfaceAlignment, ///< Cuda only. Alignment requirement for surfaces + hipDeviceAttributeStreamPrioritiesSupported, ///< Whether to support stream priorities. + hipDeviceAttributeSurfaceAlignment, ///< Alignment requirement for surfaces hipDeviceAttributeTccDriver, ///< Cuda only. Whether device is a Tesla device using TCC driver hipDeviceAttributeTextureAlignment, ///< Alignment requirement for textures hipDeviceAttributeTexturePitchAlignment, ///< Pitch alignment requirement for 2D texture references bound to pitched memory; hipDeviceAttributeTotalConstantMemory, ///< Constant memory size in bytes. - hipDeviceAttributeTotalGlobalMem, ///< Global memory available on device. + hipDeviceAttributeTotalGlobalMem, ///< Global memory available on devicice. hipDeviceAttributeUnifiedAddressing, ///< Cuda only. An unified address space shared with the host. - hipDeviceAttributeUuid, ///< Cuda only. Unique ID in 16 byte. + hipDeviceAttributeUnused2, ///< Previously hipDeviceAttributeUuid hipDeviceAttributeWarpSize, ///< Warp size in threads. hipDeviceAttributeMemoryPoolsSupported, ///< Device supports HIP Stream Ordered Memory Allocator hipDeviceAttributeVirtualMemoryManagementSupported, ///< Device supports HIP virtual memory management + hipDeviceAttributeHostRegisterSupported, ///< Can device support host memory registration via hipHostRegister + hipDeviceAttributeMemoryPoolSupportedHandleTypes, ///< Supported handle mask for HIP Stream Ordered Memory Allocator hipDeviceAttributeCudaCompatibleEnd = 9999, hipDeviceAttributeAmdSpecificBegin = 10000, hipDeviceAttributeClockInstructionRate = hipDeviceAttributeAmdSpecificBegin, ///< Frequency in khz of the timer used by the device-side "clock*" - hipDeviceAttributeArch, ///< Device architecture + hipDeviceAttributeUnused3, ///< Previously hipDeviceAttributeArch hipDeviceAttributeMaxSharedMemoryPerMultiprocessor, ///< Maximum Shared Memory PerMultiprocessor. - hipDeviceAttributeGcnArch, ///< Device gcn architecture - hipDeviceAttributeGcnArchName, ///< Device gcnArch name in 256 bytes + hipDeviceAttributeUnused4, ///< Previously hipDeviceAttributeGcnArch + hipDeviceAttributeUnused5, ///< Previously hipDeviceAttributeGcnArchName hipDeviceAttributeHdpMemFlushCntl, ///< Address of the HDP_MEM_COHERENCY_FLUSH_CNTL register hipDeviceAttributeHdpRegFlushCntl, ///< Address of the HDP_REG_COHERENCY_FLUSH_CNTL register hipDeviceAttributeCooperativeMultiDeviceUnmatchedFunc, ///< Supports cooperative launch on multiple @@ -298,6 +305,190 @@ typedef enum hipDeviceAttribute_t { // Extended attributes for vendors } hipDeviceAttribute_t; +/** + * hipDeviceArch_t + * + */ +typedef struct { + // 32-bit Atomics + unsigned hasGlobalInt32Atomics : 1; ///< 32-bit integer atomics for global memory. + unsigned hasGlobalFloatAtomicExch : 1; ///< 32-bit float atomic exch for global memory. + unsigned hasSharedInt32Atomics : 1; ///< 32-bit integer atomics for shared memory. + unsigned hasSharedFloatAtomicExch : 1; ///< 32-bit float atomic exch for shared memory. + unsigned hasFloatAtomicAdd : 1; ///< 32-bit float atomic add in global and shared memory. + + // 64-bit Atomics + unsigned hasGlobalInt64Atomics : 1; ///< 64-bit integer atomics for global memory. + unsigned hasSharedInt64Atomics : 1; ///< 64-bit integer atomics for shared memory. + + // Doubles + unsigned hasDoubles : 1; ///< Double-precision floating point. + + // Warp cross-lane operations + unsigned hasWarpVote : 1; ///< Warp vote instructions (__any, __all). + unsigned hasWarpBallot : 1; ///< Warp ballot instructions (__ballot). + unsigned hasWarpShuffle : 1; ///< Warp shuffle operations. (__shfl_*). + unsigned hasFunnelShift : 1; ///< Funnel two words into one with shift&mask caps. + + // Sync + unsigned hasThreadFenceSystem : 1; ///< __threadfence_system. + unsigned hasSyncThreadsExt : 1; ///< __syncthreads_count, syncthreads_and, syncthreads_or. + + // Misc + unsigned hasSurfaceFuncs : 1; ///< Surface functions. + unsigned has3dGrid : 1; ///< Grid and group dims are 3D (rather than 2D). + unsigned hasDynamicParallelism : 1; ///< Dynamic parallelism. +} hipDeviceArch_t; + +typedef struct hipUUID_t { + char bytes[16]; +} hipUUID; + + +/** + * hipDeviceProp + * + */ +typedef struct hipDeviceProp_t { + char name[256]; ///< Device name. + hipUUID uuid; ///< UUID of a device + char luid[8]; ///< 8-byte unique identifier. Only valid on windows + unsigned int luidDeviceNodeMask; ///< LUID node mask + size_t totalGlobalMem; ///< Size of global memory region (in bytes). + size_t sharedMemPerBlock; ///< Size of shared memory per block (in bytes). + int regsPerBlock; ///< Registers per block. + int warpSize; ///< Warp size. + size_t memPitch; ///< Maximum pitch in bytes allowed by memory copies + ///< pitched memory + int maxThreadsPerBlock; ///< Max work items per work group or workgroup max size. + int maxThreadsDim[3]; ///< Max number of threads in each dimension (XYZ) of a block. + int maxGridSize[3]; ///< Max grid dimensions (XYZ). + int clockRate; ///< Max clock frequency of the multiProcessors in khz. + size_t totalConstMem; ///< Size of shared constant memory region on the device + ///< (in bytes). + int major; ///< Major compute capability. On HCC, this is an approximation and features may + ///< differ from CUDA CC. See the arch feature flags for portable ways to query + ///< feature caps. + int minor; ///< Minor compute capability. On HCC, this is an approximation and features may + ///< differ from CUDA CC. See the arch feature flags for portable ways to query + ///< feature caps. + size_t textureAlignment; ///< Alignment requirement for textures + size_t texturePitchAlignment; ///< Pitch alignment requirement for texture references bound to + int deviceOverlap; ///< Deprecated. Use asyncEngineCount instead + int multiProcessorCount; ///< Number of multi-processors (compute units). + int kernelExecTimeoutEnabled; ///< Run time limit for kernels executed on the device + int integrated; ///< APU vs dGPU + int canMapHostMemory; ///< Check whether HIP can map host memory + int computeMode; ///< Compute mode. + int maxTexture1D; ///< Maximum number of elements in 1D images + int maxTexture1DMipmap; ///< Maximum 1D mipmap texture size + int maxTexture1DLinear; ///< Maximum size for 1D textures bound to linear memory + int maxTexture2D[2]; ///< Maximum dimensions (width, height) of 2D images, in image elements + int maxTexture2DMipmap[2]; ///< Maximum number of elements in 2D array mipmap of images + int maxTexture2DLinear[3]; ///< Maximum 2D tex dimensions if tex are bound to pitched memory + int maxTexture2DGather[2]; ///< Maximum 2D tex dimensions if gather has to be performed + int maxTexture3D[3]; ///< Maximum dimensions (width, height, depth) of 3D images, in image + ///< elements + int maxTexture3DAlt[3]; ///< Maximum alternate 3D texture dims + int maxTextureCubemap; ///< Maximum cubemap texture dims + int maxTexture1DLayered[2]; ///< Maximum number of elements in 1D array images + int maxTexture2DLayered[3]; ///< Maximum number of elements in 2D array images + int maxTextureCubemapLayered[2]; ///< Maximum cubemaps layered texture dims + int maxSurface1D; ///< Maximum 1D surface size + int maxSurface2D[2]; ///< Maximum 2D surface size + int maxSurface3D[3]; ///< Maximum 3D surface size + int maxSurface1DLayered[2]; ///< Maximum 1D layered surface size + int maxSurface2DLayered[3]; ///< Maximum 2D layared surface size + int maxSurfaceCubemap; ///< Maximum cubemap surface size + int maxSurfaceCubemapLayered[2]; ///< Maximum cubemap layered surface size + size_t surfaceAlignment; ///< Alignment requirement for surface + int concurrentKernels; ///< Device can possibly execute multiple kernels concurrently. + int ECCEnabled; ///< Device has ECC support enabled + int pciBusID; ///< PCI Bus ID. + int pciDeviceID; ///< PCI Device ID. + int pciDomainID; ///< PCI Domain ID + int tccDriver; ///< 1:If device is Tesla device using TCC driver, else 0 + int asyncEngineCount; ///< Number of async engines + int unifiedAddressing; ///< Does device and host share unified address space + int memoryClockRate; ///< Max global memory clock frequency in khz. + int memoryBusWidth; ///< Global memory bus width in bits. + int l2CacheSize; ///< L2 cache size. + int persistingL2CacheMaxSize; ///< Device's max L2 persisting lines in bytes + int maxThreadsPerMultiProcessor; ///< Maximum resident threads per multi-processor. + int streamPrioritiesSupported; ///< Device supports stream priority + int globalL1CacheSupported; ///< Indicates globals are cached in L1 + int localL1CacheSupported; ///< Locals are cahced in L1 + size_t sharedMemPerMultiprocessor; ///< Amount of shared memory available per multiprocessor. + int regsPerMultiprocessor; ///< registers available per multiprocessor + int managedMemory; ///< Device supports allocating managed memory on this system + int isMultiGpuBoard; ///< 1 if device is on a multi-GPU board, 0 if not. + int multiGpuBoardGroupID; ///< Unique identifier for a group of devices on same multiboard GPU + int hostNativeAtomicSupported; ///< Link between host and device supports native atomics + int singleToDoublePrecisionPerfRatio; ///< Deprecated. CUDA only. + int pageableMemoryAccess; ///< Device supports coherently accessing pageable memory + ///< without calling hipHostRegister on it + int concurrentManagedAccess; ///< Device can coherently access managed memory concurrently with + ///< the CPU + int computePreemptionSupported; ///< Is compute preemption supported on the device + int canUseHostPointerForRegisteredMem; ///< Device can access host registered memory with same + ///< address as the host + int cooperativeLaunch; ///< HIP device supports cooperative launch + int cooperativeMultiDeviceLaunch; ///< HIP device supports cooperative launch on multiple + ///< devices + size_t + sharedMemPerBlockOptin; ///< Per device m ax shared mem per block usable by special opt in + int pageableMemoryAccessUsesHostPageTables; ///< Device accesses pageable memory via the host's + ///< page tables + int directManagedMemAccessFromHost; ///< Host can directly access managed memory on the device + ///< without migration + int maxBlocksPerMultiProcessor; ///< Max number of blocks on CU + int accessPolicyMaxWindowSize; ///< Max value of access policy window + size_t reservedSharedMemPerBlock; ///< Shared memory reserved by driver per block + int hostRegisterSupported; ///< Device supports hipHostRegister + int sparseHipArraySupported; ///< Indicates if device supports sparse hip arrays + int hostRegisterReadOnlySupported; ///< Device supports using the hipHostRegisterReadOnly flag + ///< with hipHostRegistger + int timelineSemaphoreInteropSupported; ///< Indicates external timeline semaphore support + int memoryPoolsSupported; ///< Indicates if device supports hipMallocAsync and hipMemPool APIs + int gpuDirectRDMASupported; ///< Indicates device support of RDMA APIs + unsigned int gpuDirectRDMAFlushWritesOptions; ///< Bitmask to be interpreted according to + ///< hipFlushGPUDirectRDMAWritesOptions + int gpuDirectRDMAWritesOrdering; ///< value of hipGPUDirectRDMAWritesOrdering + unsigned int + memoryPoolSupportedHandleTypes; ///< Bitmask of handle types support with mempool based IPC + int deferredMappingHipArraySupported; ///< Device supports deferred mapping HIP arrays and HIP + ///< mipmapped arrays + int ipcEventSupported; ///< Device supports IPC events + int clusterLaunch; ///< Device supports cluster launch + int unifiedFunctionPointers; ///< Indicates device supports unified function pointers + int reserved[63]; ///< CUDA Reserved. + + int hipReserved[32]; ///< Reserved for adding new entries for HIP/CUDA. + + /* HIP Only struct members */ + char gcnArchName[256]; ///< AMD GCN Arch Name. HIP Only. + size_t maxSharedMemoryPerMultiProcessor; ///< Maximum Shared Memory Per CU. HIP Only. + int clockInstructionRate; ///< Frequency in khz of the timer used by the device-side "clock*" + ///< instructions. New for HIP. + hipDeviceArch_t arch; ///< Architectural feature flags. New for HIP. + unsigned int* hdpMemFlushCntl; ///< Addres of HDP_MEM_COHERENCY_FLUSH_CNTL register + unsigned int* hdpRegFlushCntl; ///< Addres of HDP_REG_COHERENCY_FLUSH_CNTL register + int cooperativeMultiDeviceUnmatchedFunc; ///< HIP device supports cooperative launch on + ///< multiple + /// devices with unmatched functions + int cooperativeMultiDeviceUnmatchedGridDim; ///< HIP device supports cooperative launch on + ///< multiple + /// devices with unmatched grid dimensions + int cooperativeMultiDeviceUnmatchedBlockDim; ///< HIP device supports cooperative launch on + ///< multiple + /// devices with unmatched block dimensions + int cooperativeMultiDeviceUnmatchedSharedMem; ///< HIP device supports cooperative launch on + ///< multiple + /// devices with unmatched shared memories + int isLargeBar; ///< 1: if it is a large PCI bar device, else 0 + int asicRevision; ///< Revision of the GPU in this device +} hipDeviceProp_t; + //Flags that can be used with hipStreamCreateWithFlags. /** Default stream creation flags. These are used with hipStreamCreate().*/ #define hipStreamDefault 0x00 @@ -410,6 +601,8 @@ typedef hipError_t (HIP_API_CALL *HIP_HIPRUNTIMEGETVERSION) (int *); typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMCREATE) (hipStream_t *, unsigned int); typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMDESTROY) (hipStream_t); typedef hipError_t (HIP_API_CALL *HIP_HIPSTREAMSYNCHRONIZE) (hipStream_t); +typedef hipError_t (HIP_API_CALL *HIP_HIPGETDEVICEPROPERTIES) (hipDeviceProp_t *, hipDevice_t); +typedef hipError_t (HIP_API_CALL *HIP_HIPMODULEOCCUPANCYMAXACTIVEBLOCKSPERMULTIPROCESSOR) (int *, hipFunction_t, int, size_t); typedef struct hc_hip_lib { @@ -453,6 +646,8 @@ typedef struct hc_hip_lib HIP_HIPSTREAMCREATE hipStreamCreate; HIP_HIPSTREAMDESTROY hipStreamDestroy; HIP_HIPSTREAMSYNCHRONIZE hipStreamSynchronize; + HIP_HIPGETDEVICEPROPERTIES hipGetDeviceProperties; + HIP_HIPMODULEOCCUPANCYMAXACTIVEBLOCKSPERMULTIPROCESSOR hipModuleOccupancyMaxActiveBlocksPerMultiprocessor; } hc_hip_lib_t; @@ -498,5 +693,7 @@ int hc_hipRuntimeGetVersion (void *hashcat_ctx, int *runtimeVersion); int hc_hipStreamCreate (void *hashcat_ctx, hipStream_t *phStream, unsigned int Flags); int hc_hipStreamDestroy (void *hashcat_ctx, hipStream_t hStream); int hc_hipStreamSynchronize (void *hashcat_ctx, hipStream_t hStream); +int hc_hipGetDeviceProperties (void *hashcat_ctx, hipDeviceProp_t *prop, hipDevice_t dev); +int hc_hipModuleOccupancyMaxActiveBlocksPerMultiprocessor (void *hashcat_ctx, int *numBlocks, hipFunction_t f, int blockSize, size_t dynSharedMemPerBlk); #endif // HC_EXT_HIP_H diff --git a/include/ext_nvml.h b/include/ext_nvml.h index 02c5d490c..0215e1a32 100644 --- a/include/ext_nvml.h +++ b/include/ext_nvml.h @@ -161,6 +161,18 @@ typedef enum nvmlGom_enum * */ #define nvmlClocksThrottleReasonNone 0x0000000000000000LL +/** + * Memory allocation information for a device (v1). + * The total amount is equal to the sum of the amounts of free and used memory. + */ +typedef struct nvmlMemory_st +{ + unsigned long long total; //!< Total physical device memory (in bytes) + unsigned long long free; //!< Unallocated device memory (in bytes) + unsigned long long used; //!< Sum of Reserved and Allocated device memory (in bytes). + //!< Note that the driver/GPU always sets aside a small amount of memory for bookkeeping +} nvmlMemory_t; + /* * End of declarations from nvml.h **/ @@ -191,6 +203,7 @@ typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREAS typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_SET_COMPUTEMODE) (nvmlDevice_t, nvmlComputeMode_t); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_SET_OPERATIONMODE) (nvmlDevice_t, nvmlGpuOperationMode_t); typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_PCIINFO) (nvmlDevice_t, nvmlPciInfo_t *); +typedef nvmlReturn_t (*NVML_API_CALL NVML_DEVICE_GET_MEMORYINFO) (nvmlDevice_t, nvmlMemory_t *); typedef struct hm_nvml_lib { @@ -212,6 +225,7 @@ typedef struct hm_nvml_lib NVML_DEVICE_GET_CURRENTCLOCKSTHROTTLEREASONS nvmlDeviceGetCurrentClocksThrottleReasons; NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREASONS nvmlDeviceGetSupportedClocksThrottleReasons; NVML_DEVICE_GET_PCIINFO nvmlDeviceGetPciInfo; + NVML_DEVICE_GET_MEMORYINFO nvmlDeviceGetMemoryInfo; } hm_nvml_lib_t; @@ -232,5 +246,6 @@ int hm_NVML_nvmlDeviceGetClockInfo (void *hashcat_ctx, nvmlDevice_t device, nvml int hm_NVML_nvmlDeviceGetTemperatureThreshold (void *hashcat_ctx, nvmlDevice_t device, nvmlTemperatureThresholds_t thresholdType, unsigned int *temp); int hm_NVML_nvmlDeviceGetCurrPcieLinkWidth (void *hashcat_ctx, nvmlDevice_t device, unsigned int *currLinkWidth); int hm_NVML_nvmlDeviceGetPciInfo (void *hashcat_ctx, nvmlDevice_t device, nvmlPciInfo_t *pci); +int hm_NVML_nvmlDeviceGetMemoryInfo (void *hashcat_ctx, nvmlDevice_t device, nvmlMemory_t *mem); #endif // HC_NVML_H diff --git a/include/ext_sysfs_amdgpu.h b/include/ext_sysfs_amdgpu.h index 50c0dc569..d381d9cec 100644 --- a/include/ext_sysfs_amdgpu.h +++ b/include/ext_sysfs_amdgpu.h @@ -34,5 +34,6 @@ int hm_SYSFS_AMDGPU_get_pp_dpm_sclk (void *hashcat_ctx, const int backend_device int hm_SYSFS_AMDGPU_get_pp_dpm_mclk (void *hashcat_ctx, const int backend_device_idx, int *val); int hm_SYSFS_AMDGPU_get_pp_dpm_pcie (void *hashcat_ctx, const int backend_device_idx, int *val); int hm_SYSFS_AMDGPU_get_gpu_busy_percent (void *hashcat_ctx, const int backend_device_idx, int *val); +int hm_SYSFS_AMDGPU_get_mem_info_vram_used (void *hashcat_ctx, const int backend_device_idx, u64 *val); #endif // HC_EXT_SYSFS_AMDGPU_H diff --git a/include/hashes.h b/include/hashes.h index 9daa87583..35b5a1d42 100644 --- a/include/hashes.h +++ b/include/hashes.h @@ -25,6 +25,7 @@ int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage2 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage3 (hashcat_ctx_t *hashcat_ctx); int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx); +int hashes_init_stage5 (hashcat_ctx_t *hashcat_ctx); int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx); int hashes_init_benchmark (hashcat_ctx_t *hashcat_ctx); int hashes_init_zerohash (hashcat_ctx_t *hashcat_ctx); diff --git a/include/hwmon.h b/include/hwmon.h index 545e22b2d..3d4bd7940 100644 --- a/include/hwmon.h +++ b/include/hwmon.h @@ -24,6 +24,7 @@ int hm_get_utilization_with_devices_idx (hashcat_ctx_t *hashcat_ctx, cons int hm_get_memoryspeed_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int backend_device_idx); int hm_get_corespeed_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int backend_device_idx); int hm_get_throttle_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int backend_device_idx); +u64 hm_get_memoryused_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int backend_device_idx); int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx); void hwmon_ctx_destroy (hashcat_ctx_t *hashcat_ctx); diff --git a/include/modules.h b/include/modules.h index 9768c11de..713b3f46f 100644 --- a/include/modules.h +++ b/include/modules.h @@ -20,7 +20,7 @@ u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *ha u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); -const char *module_extra_tuningdb_block (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); +const char *module_extra_tuningdb_block (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, const backend_ctx_t *backend_ctx, MAYBE_UNUSED const hashes_t *hashes, const u32 device_id, const u32 kernel_accel); u32 module_forced_outfile_format (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra); diff --git a/include/shared.h b/include/shared.h index f1660c58e..ae968281c 100644 --- a/include/shared.h +++ b/include/shared.h @@ -46,7 +46,7 @@ void naive_escape (char *s, size_t s_max, const char key_char, const char escape __attribute__ ((format (printf, 2, 3))) int hc_asprintf (char **strp, const char *fmt, ...); -void setup_environment_variables (const folder_config_t *folder_config); +void setup_environment_variables (const folder_config_t *folder_config, const user_options_t *user_options); void setup_umask (void); void setup_seeding (const bool rp_gen_seed_chgd, const u32 rp_gen_seed); @@ -106,10 +106,23 @@ int input_tokenizer (const u8 *input_buf, const int input_len, hc_token_t *token int extract_dynamicx_hash (const u8 *input_buf, const int input_len, u8 **output_buf, int *output_len); +int get_current_arch(); + #if defined (__APPLE__) bool is_apple_silicon (void); #endif char *file_to_buffer (const char *filename); +bool check_file_suffix (const char *file, const char *suffix); +bool remove_file_suffix (char *file, const char *suffix); + +int suppress_stderr (void); +void restore_stderr (int saved_fd); + +bool get_free_memory (u64 *free_mem); + +u32 previous_power_of_two (const u32 x); +u32 next_power_of_two (const u32 x); + #endif // HC_SHARED_H diff --git a/include/types.h b/include/types.h index 919e7758a..9b60f4532 100644 --- a/include/types.h +++ b/include/types.h @@ -103,9 +103,17 @@ typedef enum event_identifier EVENT_AUTODETECT_STARTING = 0x00000101, EVENT_AUTOTUNE_FINISHED = 0x00000000, EVENT_AUTOTUNE_STARTING = 0x00000001, + EVENT_BACKEND_RUNTIMES_INIT_POST = 0x00000130, + EVENT_BACKEND_RUNTIMES_INIT_PRE = 0x00000131, + EVENT_BACKEND_DEVICES_INIT_POST = 0x00000132, + EVENT_BACKEND_DEVICES_INIT_PRE = 0x00000133, EVENT_BITMAP_INIT_POST = 0x00000010, EVENT_BITMAP_INIT_PRE = 0x00000011, EVENT_BITMAP_FINAL_OVERFLOW = 0x00000012, + EVENT_BRIDGES_INIT_POST = 0x00000120, + EVENT_BRIDGES_INIT_PRE = 0x00000121, + EVENT_BRIDGES_SALT_POST = 0x00000122, + EVENT_BRIDGES_SALT_PRE = 0x00000123, EVENT_CALCULATED_WORDS_BASE = 0x00000020, EVENT_CRACKER_FINISHED = 0x00000030, EVENT_CRACKER_HASH_CRACKED = 0x00000031, @@ -183,6 +191,7 @@ typedef enum vendor_id VENDOR_ID_POCL = (1U << 6), VENDOR_ID_AMD_USE_INTEL = (1U << 7), VENDOR_ID_AMD_USE_HIP = (1U << 8), + VENDOR_ID_MICROSOFT = (1U << 9), VENDOR_ID_GENERIC = (1U << 31) } vendor_id_t; @@ -438,41 +447,78 @@ typedef enum opts_type OPTS_TYPE_MT_HEX = (1ULL << 27), // mask is always in hex OPTS_TYPE_HASH_COPY = (1ULL << 28), OPTS_TYPE_HASH_SPLIT = (1ULL << 29), - OPTS_TYPE_LOOP_PREPARE = (1ULL << 30), // a kernel which is called each time before _loop kernel started. + OPTS_TYPE_INIT = (1ULL << 30), // Added v7, since bridge can fully replace these, but are set by default automatically + OPTS_TYPE_LOOP = (1ULL << 31), // Added v7, since bridge can fully replace these, but are set by default automatically + OPTS_TYPE_COMP = (1ULL << 32), // Added v7, since bridge can fully replace these, but are set by default automatically + OPTS_TYPE_LOOP_PREPARE = (1ULL << 33), // a kernel which is called each time before _loop kernel started. // like a hook12 kernel but without extra buffers. - OPTS_TYPE_LOOP_EXTENDED = (1ULL << 31), // a kernel which is called each time normal _loop kernel finished. + OPTS_TYPE_LOOP_EXTENDED = (1ULL << 34), // a kernel which is called each time normal _loop kernel finished. // but unlike a hook kernel this kernel is called for every _loop iteration offset - OPTS_TYPE_HOOK12 = (1ULL << 32), - OPTS_TYPE_HOOK23 = (1ULL << 33), - OPTS_TYPE_INIT2 = (1ULL << 34), - OPTS_TYPE_LOOP2_PREPARE = (1ULL << 35), // same as OPTS_TYPE_LOOP_PREPARE but for loop2 kernel - OPTS_TYPE_LOOP2 = (1ULL << 36), - OPTS_TYPE_AUX1 = (1ULL << 37), - OPTS_TYPE_AUX2 = (1ULL << 38), - OPTS_TYPE_AUX3 = (1ULL << 39), - OPTS_TYPE_AUX4 = (1ULL << 40), - OPTS_TYPE_BINARY_HASHFILE = (1ULL << 41), + OPTS_TYPE_HOOK12 = (1ULL << 35), + OPTS_TYPE_HOOK23 = (1ULL << 36), + OPTS_TYPE_INIT2 = (1ULL << 37), + OPTS_TYPE_LOOP2_PREPARE = (1ULL << 38), // same as OPTS_TYPE_LOOP_PREPARE but for loop2 kernel + OPTS_TYPE_LOOP2 = (1ULL << 39), + OPTS_TYPE_AUX1 = (1ULL << 40), + OPTS_TYPE_AUX2 = (1ULL << 41), + OPTS_TYPE_AUX3 = (1ULL << 42), + OPTS_TYPE_AUX4 = (1ULL << 43), + OPTS_TYPE_BINARY_HASHFILE = (1ULL << 44), OPTS_TYPE_BINARY_HASHFILE_OPTIONAL - = (1ULL << 42), // this allows us to not enforce the use of a binary file. requires OPTS_TYPE_BINARY_HASHFILE set to be effective. - OPTS_TYPE_PT_ADD06 = (1ULL << 43), - OPTS_TYPE_KEYBOARD_MAPPING = (1ULL << 44), - OPTS_TYPE_DEEP_COMP_KERNEL = (1ULL << 45), // if we have to iterate through each hash inside the comp kernel, for example if each hash has to be decrypted separately - OPTS_TYPE_TM_KERNEL = (1ULL << 46), - OPTS_TYPE_SUGGEST_KG = (1ULL << 47), // suggest keep guessing for modules the user maybe wants to use --keep-guessing - OPTS_TYPE_COPY_TMPS = (1ULL << 48), // if we want to use data from tmps buffer (for example get the PMK in WPA) - OPTS_TYPE_POTFILE_NOPASS = (1ULL << 49), // sometimes the password should not be printed to potfile - OPTS_TYPE_DYNAMIC_SHARED = (1ULL << 50), // use dynamic shared memory (note: needs special kernel changes) - OPTS_TYPE_SELF_TEST_DISABLE = (1ULL << 51), // some algos use JiT in combinations with a salt or create too much startup time - OPTS_TYPE_MP_MULTI_DISABLE = (1ULL << 52), // do not multiply the kernel-accel with the multiprocessor count per device to allow more fine-tuned workload settings - OPTS_TYPE_NATIVE_THREADS = (1ULL << 53), // forces "native" thread count: CPU=1, GPU-Intel=8, GPU-AMD=64 (wavefront), GPU-NV=32 (warps) - OPTS_TYPE_MAXIMUM_THREADS = (1ULL << 54), // disable else branch in pre-compilation thread count optimization setting - OPTS_TYPE_POST_AMP_UTF16LE = (1ULL << 55), // run the utf8 to utf16le conversion kernel after they have been processed from amplifiers + = (1ULL << 45), // this allows us to not enforce the use of a binary file. requires OPTS_TYPE_BINARY_HASHFILE set to be effective. + OPTS_TYPE_PT_ADD06 = (1ULL << 46), + OPTS_TYPE_KEYBOARD_MAPPING = (1ULL << 47), + OPTS_TYPE_DEEP_COMP_KERNEL = (1ULL << 48), // if we have to iterate through each hash inside the comp kernel, for example if each hash has to be decrypted separately + OPTS_TYPE_TM_KERNEL = (1ULL << 49), + OPTS_TYPE_SUGGEST_KG = (1ULL << 50), // suggest keep guessing for modules the user maybe wants to use --keep-guessing + OPTS_TYPE_COPY_TMPS = (1ULL << 51), // if we want to use data from tmps buffer (for example get the PMK in WPA) + OPTS_TYPE_POTFILE_NOPASS = (1ULL << 52), // sometimes the password should not be printed to potfile + OPTS_TYPE_DYNAMIC_SHARED = (1ULL << 53), // use dynamic shared memory (note: needs special kernel changes) + OPTS_TYPE_SELF_TEST_DISABLE = (1ULL << 54), // some algos use JiT in combinations with a salt or create too much startup time + OPTS_TYPE_MP_MULTI_DISABLE = (1ULL << 55), // do not multiply the kernel-accel with the multiprocessor count per device to allow more fine-tuned workload settings + OPTS_TYPE_NATIVE_THREADS = (1ULL << 56), // forces "native" thread count: CPU=1, GPU-Intel=8, GPU-AMD=64 (wavefront), GPU-NV=32 (warps) + OPTS_TYPE_MAXIMUM_THREADS = (1ULL << 57), // disable else branch in pre-compilation thread count optimization setting + OPTS_TYPE_POST_AMP_UTF16LE = (1ULL << 58), // run the utf8 to utf16le conversion kernel after they have been processed from amplifiers OPTS_TYPE_AUTODETECT_DISABLE - = (1ULL << 56), // skip autodetect engine - OPTS_TYPE_STOCK_MODULE = (1ULL << 57), // module included with hashcat default distribution + = (1ULL << 59), // skip autodetect engine + OPTS_TYPE_STOCK_MODULE = (1ULL << 60), // module included with hashcat default distribution + OPTS_TYPE_MULTIHASH_DESPITE_ESALT + = (1ULL << 61), // overrule multihash cracking check same salt but not same esalt } opts_type_t; +typedef enum bridge_type +{ + BRIDGE_TYPE_NONE = 0, // no bridge support + BRIDGE_TYPE_MATCH_TUNINGS = (1ULL << 1), // Disables autotune and adjusts -n, -u and -T for the backend device according to match bridge dimensions + BRIDGE_TYPE_UPDATE_SELFTEST = (1ULL << 2), // updates the selftest configured in the module. Can be useful for generic hash modes such as the python one + + BRIDGE_TYPE_LAUNCH_INIT = (1ULL << 10), // attention! not yet implemented + BRIDGE_TYPE_LAUNCH_LOOP = (1ULL << 11), + BRIDGE_TYPE_LAUNCH_LOOP2 = (1ULL << 12), + BRIDGE_TYPE_LAUNCH_COMP = (1ULL << 13), // attention! not yet implemented + + // BRIDGE_TYPE_REPLACE_* is like + // BRIDGE_TYPE_LAUNCH_*, but + // deactivates KERN_RUN INIT/LOOP/COMP + + BRIDGE_TYPE_REPLACE_INIT = (1ULL << 20), // attention! not yet implemented + BRIDGE_TYPE_REPLACE_LOOP = (1ULL << 21), + BRIDGE_TYPE_REPLACE_LOOP2 = (1ULL << 22), + BRIDGE_TYPE_REPLACE_COMP = (1ULL << 23), // attention! not yet implemented + + BRIDGE_TYPE_FORCE_WORKITEMS_001 = (1ULL << 30), // This override the workitem counts reported from the bridge device + BRIDGE_TYPE_FORCE_WORKITEMS_002 = (1ULL << 31), // Can be useful if this is not a physical hardware + BRIDGE_TYPE_FORCE_WORKITEMS_004 = (1ULL << 32), + BRIDGE_TYPE_FORCE_WORKITEMS_008 = (1ULL << 33), + BRIDGE_TYPE_FORCE_WORKITEMS_016 = (1ULL << 34), + BRIDGE_TYPE_FORCE_WORKITEMS_032 = (1ULL << 35), + BRIDGE_TYPE_FORCE_WORKITEMS_064 = (1ULL << 36), + BRIDGE_TYPE_FORCE_WORKITEMS_128 = (1ULL << 37), + BRIDGE_TYPE_FORCE_WORKITEMS_256 = (1ULL << 36), + +} bridge_type_t; + typedef enum dgst_size { DGST_SIZE_4_2 = (2 * sizeof (u32)), // 8 @@ -627,7 +673,9 @@ typedef enum user_options_defaults ADVICE = true, ATTACK_MODE = ATTACK_MODE_STRAIGHT, AUTODETECT = false, - BACKEND_DEVICES_VIRTUAL = 1, + BACKEND_DEVICES_VIRTMULTI = 1, + BACKEND_DEVICES_VIRTHOST = 1, + BACKEND_DEVICES_KEEPFREE = 0, BENCHMARK_ALL = false, BENCHMARK_MAX = 99999, BENCHMARK_MIN = 0, @@ -733,7 +781,9 @@ typedef enum user_options_map IDX_ADVICE_DISABLE = 0xff00, IDX_ATTACK_MODE = 'a', IDX_BACKEND_DEVICES = 'd', - IDX_BACKEND_DEVICES_VIRTUAL = 'Y', + IDX_BACKEND_DEVICES_VIRTMULTI = 'Y', + IDX_BACKEND_DEVICES_VIRTHOST = 'R', + IDX_BACKEND_DEVICES_KEEPFREE = 0xff60, IDX_BACKEND_IGNORE_CUDA = 0xff01, IDX_BACKEND_IGNORE_HIP = 0xff02, IDX_BACKEND_IGNORE_METAL = 0xff03, @@ -757,6 +807,10 @@ typedef enum user_options_map IDX_BRAIN_SESSION = 0xff0f, IDX_BRAIN_SESSION_WHITELIST = 0xff10, #endif + IDX_BRIDGE_PARAMETER1 = 0xff80, + IDX_BRIDGE_PARAMETER2 = 0xff81, + IDX_BRIDGE_PARAMETER3 = 0xff82, + IDX_BRIDGE_PARAMETER4 = 0xff83, IDX_CPU_AFFINITY = 0xff11, IDX_CUSTOM_CHARSET_1 = '1', IDX_CUSTOM_CHARSET_2 = '2', @@ -1093,6 +1147,11 @@ typedef struct hashconfig u32 pwdump_column; + // bridge + + u64 bridge_type; + const char *bridge_name; + } hashconfig_t; typedef struct pw_pre @@ -1181,10 +1240,15 @@ typedef struct hc_device_param int sm_major; int sm_minor; + char *gcnArchName; + int regsPerBlock; + int regsPerMultiprocessor; u32 kernel_exec_timeout; u32 kernel_preferred_wgs_multiple; + int bridge_link_device; + st_status_t st_status; // selftest status at_status_t at_status; // autotune status @@ -1375,6 +1439,8 @@ typedef struct hc_device_param pw_pre_t *pws_base_buf; // for debug mode u64 pws_base_cnt; + void *h_tmps; // we need this only for bridges + u64 words_off; u64 words_done; @@ -1896,7 +1962,9 @@ typedef struct backend_ctx int backend_device_from_opencl_platform[CL_PLATFORMS_MAX][DEVICES_MAX]; // from opencl device index to backend device index (by platform) int backend_devices_cnt; - int backend_devices_virtual; + int backend_devices_virtmulti; + int backend_devices_virthost; + int backend_devices_keepfree; int backend_devices_active; int cuda_devices_cnt; @@ -1908,7 +1976,7 @@ typedef struct backend_ctx int opencl_devices_cnt; int opencl_devices_active; - bool backend_devices_filter[DEVICES_MAX + 1]; + int backend_devices_filter[DEVICES_MAX]; hc_device_param_t *devices_param; @@ -2007,6 +2075,7 @@ typedef struct hm_attrs bool threshold_slowdown_get_supported; bool throttle_get_supported; bool utilization_get_supported; + bool memoryused_get_supported; } hm_attrs_t; @@ -2264,6 +2333,7 @@ typedef struct tuning_db_entry int vector_width; int kernel_accel; int kernel_loops; + int source; // 1 = dbfile, 2 = module } tuning_db_entry_t; @@ -2339,6 +2409,7 @@ typedef struct user_options bool separator_chgd; bool rule_buf_l_chgd; bool rule_buf_r_chgd; + bool session_chgd; bool advice; bool benchmark; @@ -2397,6 +2468,10 @@ typedef struct user_options char *brain_password; char *brain_session_whitelist; #endif + char *bridge_parameter1; + char *bridge_parameter2; + char *bridge_parameter3; + char *bridge_parameter4; char *cpu_affinity; char *custom_charset_4; char *debug_file; @@ -2423,7 +2498,9 @@ typedef struct user_options const char *rule_buf_r; const char *session; u32 attack_mode; - u32 backend_devices_virtual; + u32 backend_devices_virtmulti; + u32 backend_devices_virthost; + u32 backend_devices_keepfree; u32 backend_info; u32 benchmark_max; u32 benchmark_min; @@ -2873,6 +2950,50 @@ typedef struct event_ctx } event_ctx_t; +#define BRIDGE_DEFAULT (void *) -1 + +typedef void (*BRIDGE_INIT) (void *); + +typedef struct bridge_ctx +{ + // local variables + + size_t bridge_context_size; + int bridge_interface_version; + + hc_dynlib_t bridge_handle; + + BRIDGE_INIT bridge_init; + + bool enabled; + + void *platform_context; + + void *pws_buf; // transfer buffer for tmps[] + + // functions + + void *(*platform_init) (user_options_t *); + void (*platform_term) (void *); + + int (*get_unit_count) (void *); + char *(*get_unit_info) (void *, const int); + int (*get_workitem_count) (void *, const int); + + bool (*salt_prepare) (void *, hashconfig_t *, hashes_t *); + void (*salt_destroy) (void *, hashconfig_t *, hashes_t *); + + bool (*thread_init) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *); + void (*thread_term) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *); + + bool (*launch_loop) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *, const u32, const u64); + bool (*launch_loop2) (void *, hc_device_param_t *, hashconfig_t *, hashes_t *, const u32, const u64); + + const char *(*st_update_pass) (void *); + const char *(*st_update_hash) (void *); + +} bridge_ctx_t; + #define MODULE_DEFAULT (void *) -1 typedef void (*MODULE_INIT) (void *); @@ -2902,7 +3023,7 @@ typedef struct module_ctx u32 (*module_dgst_size) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); bool (*module_dictstat_disable) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); u64 (*module_esalt_size) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); - const char *(*module_extra_tuningdb_block) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); + const char *(*module_extra_tuningdb_block) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *, const backend_ctx_t *, const hashes_t *, const u32, const u32); u32 (*module_forced_outfile_format) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); u32 (*module_hash_category) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); const char *(*module_hash_name) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); @@ -2970,12 +3091,16 @@ typedef struct module_ctx bool (*module_potfile_custom_check) (const hashconfig_t *, const hash_t *, const hash_t *, const void *); + u64 (*module_bridge_type) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); + const char *(*module_bridge_name) (const hashconfig_t *, const user_options_t *, const user_options_extra_t *); + } module_ctx_t; typedef struct hashcat_ctx { brain_ctx_t *brain_ctx; bitmap_ctx_t *bitmap_ctx; + bridge_ctx_t *bridge_ctx; combinator_ctx_t *combinator_ctx; cpt_ctx_t *cpt_ctx; debugfile_ctx_t *debugfile_ctx; @@ -3021,6 +3146,7 @@ typedef struct hook_thread_param int tid; int tsz; + bridge_ctx_t *bridge_ctx; module_ctx_t *module_ctx; status_ctx_t *status_ctx; diff --git a/obj/contrib/minizip/.lock b/modules/.gitkeep similarity index 100% rename from obj/contrib/minizip/.lock rename to modules/.gitkeep diff --git a/obj/.gitkeep b/obj/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/obj/contrib/minizip/.gitkeep b/obj/contrib/minizip/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/Makefile b/src/Makefile index 0563eebee..2ed479330 100644 --- a/src/Makefile +++ b/src/Makefile @@ -37,6 +37,14 @@ endif ifeq ($(DEBUG),1) $(info "## Detected Operating System : $(UNAME)") +$(info "## Detected CC : $(CC)") +$(info "## Detected CXX : $(CXX)") +endif + +BUILD_MODE := native + +ifneq ($(filter binaries linux host_linux modules_linux bridges_linux win host_win modules_win bridges_win,$(MAKECMDGOALS)),) + BUILD_MODE := cross endif ## @@ -54,6 +62,7 @@ endif ## MODULE_INTERFACE_VERSION := 700 +BRIDGE_INTERFACE_VERSION := 700 ## ## Native compiler paths @@ -148,6 +157,8 @@ DEPS_UNRAR_PATH := $(LIBRARY_DEV_ROOT_FOLDER) endif endif +DEPS_SSE2NEON := deps/sse2neon + ## ## Filenames for library and frontend ## @@ -188,15 +199,17 @@ CFLAGS += -Wextra endif ## because LZMA SDK -ifeq ($(CC),clang) -#No longer supported in clang 10.0.0 -#CFLAGS += -Wno-enum-conversion +ifneq (,$(findstring clang, $(CC))) CFLAGS += -Wno-typedef-redefinition +else +ifeq ($(CC),cc) +CFLAGS += -Wno-typedef-redefinition +endif endif ifeq ($(USE_SYSTEM_LZMA),0) CFLAGS_LZMA += -D_7ZIP_ST -ifneq ($(CC),clang) +ifeq (,$(findstring clang, $(CC))) CFLAGS_LZMA += -Wno-misleading-indentation endif endif @@ -208,17 +221,21 @@ CFLAGS_ZLIB += -Wno-implicit-function-declaration CFLAGS_ZLIB += -Wno-unused-parameter CFLAGS_ZLIB += -DIOAPI_NO_64 CFLAGS_ZLIB += -DUNZ_BUFSIZE=262144 +ifneq (,$(findstring clang, $(CC))) +CFLAGS_ZLIB += -Wno-deprecated-non-prototype -Wno-unknown-warning-option +endif endif ## because UNRAR ifeq ($(ENABLE_UNRAR),1) ifeq ($(USE_SYSTEM_UNRAR),0) +ifeq ($(UNAME),Darwin) +CFLAGS_UNRAR += -std=c++14 +endif ifneq ($(CC),clang) CFLAGS_UNRAR += -Wno-class-memaccess CFLAGS_UNRAR += -Wno-misleading-indentation CFLAGS_UNRAR += -Wno-format-overflow -else -CFLAGS_UNRAR += -std=c++11 endif CFLAGS_UNRAR += -Wno-missing-braces CFLAGS_UNRAR += -Wno-unused-variable @@ -359,6 +376,8 @@ LFLAGS_NATIVE += -lpthread LFLAGS_NATIVE += -liconv ifeq ($(IS_APPLE_SILICON),1) +CFLAGS_NATIVE += -DSSE2NEON_SUPPRESS_WARNINGS +CFLAGS_NATIVE += -I$(DEPS_SSE2NEON) CFLAGS_NATIVE += -arch arm64 CFLAGS_NATIVE += -arch x86_64 ifeq ($(SHARED),1) @@ -407,7 +426,7 @@ EMU_OBJS_ALL += emu_inc_hash_md4 emu_inc_hash_md5 emu_inc_hash_ripemd EMU_OBJS_ALL += emu_inc_cipher_aes emu_inc_cipher_camellia emu_inc_cipher_des emu_inc_cipher_kuznyechik emu_inc_cipher_serpent emu_inc_cipher_twofish EMU_OBJS_ALL += emu_inc_hash_base58 -OBJS_ALL := affinity autotune backend benchmark bitmap bitops combinator common convert cpt cpu_crc32 debugfile dictstat dispatch dynloader event ext_ADL ext_cuda ext_hip ext_nvapi ext_nvml ext_nvrtc ext_hiprtc ext_OpenCL ext_sysfs_amdgpu ext_sysfs_cpu ext_iokit ext_lzma filehandling folder hashcat hashes hlfmt hwmon induct interface keyboard_layout locking logfile loopback memory monitor mpsp outfile_check outfile pidfile potfile restore rp rp_cpu selftest slow_candidates shared status stdout straight terminal thread timer tuningdb usage user_options wordlist $(EMU_OBJS_ALL) +OBJS_ALL := affinity autotune backend benchmark bitmap bitops bridges combinator common convert cpt cpu_crc32 debugfile dictstat dispatch dynloader event ext_ADL ext_cuda ext_hip ext_nvapi ext_nvml ext_nvrtc ext_hiprtc ext_OpenCL ext_sysfs_amdgpu ext_sysfs_cpu ext_iokit ext_lzma filehandling folder hashcat hashes hlfmt hwmon induct interface keyboard_layout locking logfile loopback memory monitor mpsp outfile_check outfile pidfile potfile restore rp rp_cpu selftest slow_candidates shared status stdout straight terminal thread timer tuningdb usage user_options wordlist $(EMU_OBJS_ALL) ifeq ($(ENABLE_BRAIN),1) OBJS_ALL += brain @@ -464,15 +483,18 @@ endif ## .PHONY: default -default: $(HASHCAT_FRONTEND) modules +default: $(HASHCAT_FRONTEND) modules bridges .PHONY: clean clean: $(RM) -f $(HASHCAT_FRONTEND) $(RM) -f $(HASHCAT_LIBRARY) $(RM) -rf modules/*.dSYM + $(RM) -rf bridges/*.dSYM $(RM) -f modules/*.dll $(RM) -f modules/*.so + $(RM) -f bridges/*.dll + $(RM) -f bridges/*.so $(RM) -f obj/*/*/*.o $(RM) -f obj/*/*.o $(RM) -f obj/*.o @@ -516,9 +538,9 @@ endif .PHONY: install ifeq ($(SHARED),1) -install: install_docs install_shared install_library install_library_dev install_tunings install_kernels install_modules install_hashcat +install: install_docs install_shared install_library install_library_dev install_tunings install_kernels install_modules install_bridges install_hashcat else -install: install_docs install_shared install_tunings install_kernels install_modules install_hashcat +install: install_docs install_shared install_tunings install_kernels install_modules install_bridges install_hashcat endif # we need this extra target to make sure that for parallel builds (i.e. 2+ Makefile targets could possible run at the same time) @@ -591,6 +613,12 @@ install_modules: install_shared modules $(FIND) modules/ -mindepth 1 -type d -execdir $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER)/modules/{} \; $(FIND) modules/ -mindepth 1 -type f -execdir $(INSTALL) -m 644 {} $(DESTDIR)$(SHARED_FOLDER)/modules/{} \; +.PHONY: install_bridges +install_bridges: install_shared bridges + $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER)/bridges + $(FIND) bridges/ -mindepth 1 -type d -execdir $(INSTALL) -m 755 -d $(DESTDIR)$(SHARED_FOLDER)/bridges/{} \; + $(FIND) bridges/ -mindepth 1 -type f -execdir $(INSTALL) -m 644 {} $(DESTDIR)$(SHARED_FOLDER)/bridges/{} \; + .PHONY: install_library install_library: $(HASHCAT_LIBRARY) $(INSTALL) -m 755 -d $(DESTDIR)$(LIBRARY_FOLDER) @@ -714,6 +742,40 @@ MODULES_LIB := $(patsubst src/modules/module_%.c, modules/module_%.$(MODULE_SU .PHONY: modules modules: $(MODULES_LIB) +## +## native compiled bridges +## + +BRIDGE_SUFFIX := so + +ifeq ($(UNAME),CYGWIN) +BRIDGE_SUFFIX := dll +endif + +ifeq ($(UNAME),MSYS2) +BRIDGE_SUFFIX := dll +endif + +BRIDGES_SRC := $(wildcard src/bridges/*.c) + +## not used so far, see modules above +BRIDGES_DISABLE ?= + +$(BRIDGES_DISABLE): ; + +ifeq ($(SHARED),1) +bridges/bridge_%.$(BRIDGE_SUFFIX): src/bridges/bridge_%.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) +else +bridges/bridge_%.$(BRIDGE_SUFFIX): src/bridges/bridge_%.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) +endif + +BRIDGES_LIB := $(patsubst src/bridges/bridge_%.c, bridges/bridge_%.$(BRIDGE_SUFFIX), $(BRIDGES_SRC)) + +.PHONY: bridges +bridges: $(BRIDGES_LIB) + ## ## Cross Compilation (binary release version) ## @@ -732,12 +794,9 @@ CXX_WIN := x86_64-w64-mingw32-g++ AR_LINUX := ar AR_WIN := x86_64-w64-mingw32-ar -## To compile win-iconv with mingw clone from here: https://github.com/win-iconv/win-iconv -## -## Then patch the makefile with the patches from tools/win-iconv-64.diff and run make install -## - +# See BUILD_WSL.md to make these WIN_ICONV := /opt/win-iconv-64 +WIN_PYTHON := /opt/win-python ## ## Compiler options @@ -775,6 +834,11 @@ CFLAGS_LZMA_WIN += -Wno-misleading-indentation CFLAGS_UNRAR_WIN += -Wno-misleading-indentation CFLAGS_UNRAR_WIN += -Wno-class-memaccess + +ifeq ($(IS_APPLE_SILICON),1) +CFLAGS_CROSS_LINUX += -DSSE2NEON_SUPPRESS_WARNINGS +CFLAGS_CROSS_LINUX += -I$(DEPS_SSE2NEON) +endif endif ## @@ -789,7 +853,7 @@ binaries: win host_win: hashcat.exe .PHONY: win -win: host_win modules_win +win: host_win modules_win bridges_win else .PHONY: binaries binaries: linux win @@ -799,8 +863,8 @@ host_linux: hashcat.bin host_win: hashcat.exe .PHONY: linux win -linux: host_linux modules_linux -win: host_win modules_win +linux: host_linux modules_linux bridges_linux +win: host_win modules_win bridges_win endif ## @@ -820,6 +884,23 @@ modules/module_%.so: src/modules/module_%.c obj/combined.LINUX.a modules/module_%.dll: src/modules/module_%.c obj/combined.WIN.a $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D MODULE_INTERFACE_VERSION_CURRENT=$(MODULE_INTERFACE_VERSION) +## +## cross compiled bridges +## + +BRIDGES_LIB_LINUX := $(patsubst src/bridges/bridge_%.c, bridges/bridge_%.so, $(BRIDGES_SRC)) +BRIDGES_LIB_WIN := $(patsubst src/bridges/bridge_%.c, bridges/bridge_%.dll, $(BRIDGES_SRC)) + +.PHONY: bridges_linux bridges_win +bridges_linux: $(BRIDGES_LIB_LINUX) +bridges_win: $(BRIDGES_LIB_WIN) + +bridges/bridge_%.so: src/bridges/bridge_%.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) + +bridges/bridge_%.dll: src/bridges/bridge_%.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) + ## ## cross compiled hashcat ## @@ -885,3 +966,6 @@ endif # Give plugin developers a chance to add some 3rd party libraries include $(wildcard src/modules/module_*.mk) + +# Give plugin developers a chance to add some 3rd party libraries +include $(wildcard src/bridges/bridge_*.mk) diff --git a/src/autotune.c b/src/autotune.c index 64bfab721..b33ed36d6 100644 --- a/src/autotune.c +++ b/src/autotune.c @@ -8,8 +8,32 @@ #include "event.h" #include "backend.h" #include "status.h" +#include "shared.h" #include "autotune.h" +int find_tuning_function (hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED hc_device_param_t *device_param) +{ + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + + if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) + { + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + return KERN_RUN_1; + } + else + { + return KERN_RUN_4; + } + } + else + { + return KERN_RUN_2; + } + + return -1; +} + static double try_run (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kernel_accel, const u32 kernel_loops, const u32 kernel_threads) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; @@ -43,21 +67,9 @@ static double try_run (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par device_param->spin_damp = 0; - if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) - { - if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) - { - run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, kernel_power_try, true, 0); - } - else - { - run_kernel (hashcat_ctx, device_param, KERN_RUN_4, 0, kernel_power_try, true, 0); - } - } - else - { - run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 0, kernel_power_try, true, 0); - } + const u32 kern_run = find_tuning_function (hashcat_ctx, device_param); + + run_kernel (hashcat_ctx, device_param, kern_run, 0, kernel_power_try, true, 0, true); device_param->spin_damp = spin_damp_sav; @@ -84,24 +96,6 @@ static double try_run_times (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *devi return exec_msec_best; } -static u32 previous_power_of_two (const u32 x) -{ - // https://stackoverflow.com/questions/2679815/previous-power-of-2 - // really cool! - - if (x == 0) return 0; - - u32 r = x; - - r |= (r >> 1); - r |= (r >> 2); - r |= (r >> 4); - r |= (r >> 8); - r |= (r >> 16); - - return r - (r >> 1); -} - static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; @@ -120,6 +114,16 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param const u32 kernel_threads_min = device_param->kernel_threads_min; const u32 kernel_threads_max = device_param->kernel_threads_max; + /* + printf ("starting autotune with: %d %d %d %d %d %d\n", + kernel_accel_min, + kernel_accel_max, + kernel_loops_min, + kernel_loops_max, + kernel_threads_min, + kernel_threads_max); + */ + // stores the minimum values // they could be used if the autotune fails and user specify --force @@ -136,34 +140,29 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param u32 kernel_accel = kernel_accel_min; u32 kernel_loops = kernel_loops_min; + u32 kernel_threads = kernel_threads_min; // for the threads we take as initial value what we receive from the runtime // but is only to start with something, we will fine tune this value as soon as we have our workload specified // this thread limiting is also performed inside run_kernel() so we need to redo it here, too + /* u32 kernel_wgs = 0; - u32 kernel_wgs_multiple = 0; if (hashconfig->attack_exec == ATTACK_EXEC_INSIDE_KERNEL) { if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { kernel_wgs = device_param->kernel_wgs1; - - kernel_wgs_multiple = device_param->kernel_preferred_wgs_multiple1; } else { kernel_wgs = device_param->kernel_wgs4; - - kernel_wgs_multiple = device_param->kernel_preferred_wgs_multiple4; } } else { kernel_wgs = device_param->kernel_wgs2; - - kernel_wgs_multiple = device_param->kernel_preferred_wgs_multiple2; } u32 kernel_threads = kernel_threads_max; @@ -175,18 +174,20 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param // having a value power of 2 makes it easier to divide + const u32 kernel_threads_p2 = previous_power_of_two (kernel_threads); if ((kernel_threads_p2 >= kernel_threads_min) && (kernel_threads_p2 <= kernel_threads_max)) { kernel_threads = kernel_threads_p2; } + */ // in this case the user specified a fixed -n and -u on the commandline // no way to tune anything // but we need to run a few caching rounds - if ((kernel_accel_min == kernel_accel_max) && (kernel_loops_min == kernel_loops_max)) + if ((kernel_threads_min == kernel_threads_max) && (kernel_accel_min == kernel_accel_max) && (kernel_loops_min == kernel_loops_max)) { #if defined (DEBUG) @@ -298,13 +299,13 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param device_param->kernel_threads = device_param->kernel_wgs1; - run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, kernel_power_max, false, 0); + run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, kernel_power_max, false, 0, true); if (hashconfig->opts_type & OPTS_TYPE_LOOP_PREPARE) { device_param->kernel_threads = device_param->kernel_wgs2p; - run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, 0, kernel_power_max, false, 0); + run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, 0, kernel_power_max, false, 0, true); } device_param->kernel_threads = kernel_threads_sav; @@ -312,8 +313,6 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param // Do a pre-autotune test run to find out if kernel runtime is above some TDR limit - u32 kernel_loops_max_reduced = kernel_loops_max; - if (true) { double exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_min, kernel_loops_min, kernel_threads); @@ -326,144 +325,147 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param return -1; } - - exec_msec = try_run (hashcat_ctx, device_param, kernel_accel_min, kernel_loops_min, kernel_threads); - - const u32 mm = kernel_loops_max / kernel_loops_min; - - if ((exec_msec * mm) > target_msec) - { - const u32 loops_valid = (const u32) (target_msec / exec_msec); - - kernel_loops_max_reduced = kernel_loops_min * loops_valid; - } } - // first find out highest kernel-loops that stays below target_msec + // v7 autotuner is a lot more straight forward - if (kernel_loops_min < kernel_loops_max) + for (u32 kernel_loops_test = kernel_loops_min; kernel_loops_test <= kernel_loops_max; kernel_loops_test <<= 1) { - for (kernel_loops = kernel_loops_max; kernel_loops > kernel_loops_min; kernel_loops >>= 1) + double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_min, kernel_loops_test, kernel_threads_min, 2); + + //printf ("loop %f %u %u %u\n", exec_msec, kernel_accel_min, kernel_loops_test, kernel_threads_min); + if (exec_msec > target_msec) break; + + // we want a little room for threads to play with so not full target_msec + // but of course only if we are going to make use of that :) + + if ((kernel_accel_min < kernel_accel_max) || (kernel_threads_min < kernel_threads_max)) { - if (kernel_loops > kernel_loops_max_reduced) continue; + if (exec_msec > target_msec / 8) break; - double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_min, kernel_loops, kernel_threads, 1); + // in general, an unparallelized kernel should not run that long. + // if the kernel uses barriers it will have a bad impact on performance. + // streebog is a good testing example - if (exec_msec < target_msec) break; + if (exec_msec > 4) break; } + + kernel_loops = kernel_loops_test; } - #define STEPS_CNT 16 + for (u32 kernel_threads_test = kernel_threads_min; kernel_threads_test <= kernel_threads_max; kernel_threads_test <<= 1) + { + double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_min, kernel_loops, kernel_threads_test, 2); - // now the same for kernel-accel but with the new kernel-loops from previous loop set + //printf ("threads %f %u %u %u\n", exec_msec, kernel_accel_min, kernel_loops, kernel_threads_test); + if (exec_msec > target_msec) break; + + if (kernel_threads >= 32) + { + // we want a little room for accel to play with so not full target_msec + + if (exec_msec > target_msec / 8) break; + } + + kernel_threads = kernel_threads_test; + } + + #define STEPS_CNT 12 + + // now we tune for kernel-accel but with the new kernel-loops from previous loop set if (kernel_accel_min < kernel_accel_max) { for (int i = 0; i < STEPS_CNT; i++) { - const u32 kernel_accel_try = 1U << i; + const u32 kernel_accel_try = kernel_accel; if (kernel_accel_try < kernel_accel_min) continue; if (kernel_accel_try > kernel_accel_max) break; - double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_try, kernel_loops, kernel_threads, 1); + double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_try, kernel_loops, kernel_threads, 2); + //printf ("accel %f %u %u %u\n", exec_msec, kernel_accel_try, kernel_loops, kernel_threads); if (exec_msec > target_msec) break; - kernel_accel = kernel_accel_try; + float multi = target_msec / exec_msec; + + // we cap that multiplier, because on low accel numbers we do not run into spilling + multi = (multi > 4) ? 4 : multi; + + kernel_accel = (float) kernel_accel_try * multi; + + if (kernel_accel == kernel_accel_try) break; // too close } + + if (kernel_accel > kernel_accel_max) kernel_accel = kernel_accel_max; } - // now find the middle balance between kernel_accel and kernel_loops - // while respecting allowed ranges at the same time + if (kernel_accel > 64) kernel_accel -= kernel_accel % 32; - if (kernel_accel < kernel_loops) + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) { - const u32 kernel_accel_orig = kernel_accel; - const u32 kernel_loops_orig = kernel_loops; + if (kernel_accel > device_param->device_processors) kernel_accel -= kernel_accel % device_param->device_processors; + } - double exec_msec_prev = try_run_times (hashcat_ctx, device_param, kernel_accel, kernel_loops, kernel_threads, 1); + // some final play, if we have strange numbers from the APIs, namely 96, 384, and such - for (int i = 1; i < STEPS_CNT; i++) + if ((kernel_accel_min == kernel_accel_max) || (kernel_threads_min == kernel_threads_max)) + { + } + else + { + u32 fun[2]; + + if (is_power_of_2 (kernel_threads) == false) { - const u32 kernel_accel_try = kernel_accel_orig * (1U << i); - const u32 kernel_loops_try = kernel_loops_orig / (1U << i); - - if (kernel_accel_try < kernel_accel_min) continue; - if (kernel_accel_try > kernel_accel_max) break; - - if (kernel_loops_try > kernel_loops_max) continue; - if (kernel_loops_try < kernel_loops_min) break; - - // do a real test - - const double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_try, kernel_loops_try, kernel_threads, 1); - - if (exec_msec_prev < exec_msec) break; - - exec_msec_prev = exec_msec; - - // so far, so good! save - - kernel_accel = kernel_accel_try; - kernel_loops = kernel_loops_try; - - // too much if the next test is true - - if (kernel_loops_try < kernel_accel_try) break; + fun[0] = previous_power_of_two (kernel_threads); + fun[1] = next_power_of_two (kernel_threads); } - } - - double exec_msec_pre_final = try_run_times (hashcat_ctx, device_param, kernel_accel, kernel_loops, kernel_threads, 1); - - const u32 exec_left = (const u32) (target_msec / exec_msec_pre_final); - - const u32 accel_left = kernel_accel_max / kernel_accel; - - const u32 exec_accel_min = MIN (exec_left, accel_left); // we want that to be int - - if (exec_accel_min >= 1) - { - // this is safe to not overflow kernel_accel_max because of accel_left - - kernel_accel *= exec_accel_min; - } - - // v6.2.4 new section: find thread count - // This is not as effective as it could be because of inaccurate kernel return timers - // But is better than fixed values - // Timers in this section are critical, so we rerun measurements 3 times - - if (kernel_threads_max > kernel_threads_min) - { - const u32 kernel_accel_orig = kernel_accel; - const u32 kernel_threads_orig = kernel_threads; - - double exec_msec_prev = try_run_times (hashcat_ctx, device_param, kernel_accel, kernel_loops, kernel_threads, 3); - - for (int i = 1; i < STEPS_CNT; i++) + else { - const u32 kernel_accel_try = kernel_accel_orig * (1U << i); - const u32 kernel_threads_try = kernel_threads_orig / (1U << i); + fun[0] = kernel_threads >> 1; + fun[1] = kernel_threads << 1; + } - // since we do not modify total amount of workitems, we can (and need) to do increase kernel_accel_max + float fact[2]; - const u32 kernel_accel_max_try = kernel_accel_max * (1U << i); + fact[0] = (float) kernel_threads / fun[0]; + fact[1] = (float) kernel_threads / fun[1]; - if (kernel_accel_try > kernel_accel_max_try) break; + float ms_prev = try_run_times (hashcat_ctx, device_param, kernel_accel, kernel_loops, kernel_threads, 2); - if (kernel_threads_try < kernel_threads_min) break; + float res[2] = { 0 }; - if (kernel_threads_try % kernel_wgs_multiple) break; // this would just be waste of time + for (int i = 0; i < 2; i++) + { + const u32 kernel_threads_test = fun[i]; + const u32 kernel_accel_test = kernel_accel * fact[i]; - double exec_msec = try_run_times (hashcat_ctx, device_param, kernel_accel_try, kernel_loops, kernel_threads_try, 3); + if (kernel_accel_test == 0) continue; + if (kernel_threads_test == 0) continue; - if (exec_msec > exec_msec_prev) continue; + if (kernel_threads_test > device_param->device_maxworkgroup_size) continue; - exec_msec_prev = exec_msec; + const float ms = try_run_times (hashcat_ctx, device_param, kernel_accel_test, kernel_loops, kernel_threads_test, 2); - kernel_accel = kernel_accel_try; - kernel_threads = kernel_threads_try; + res[i] = ms_prev / ms; + } + + const int sel = (res[0] > res[1]) ? 0 : 1; + + if (res[sel] > 1.01) + { + const u32 kernel_accel_new = kernel_accel * fact[sel]; + const u32 kernel_threads_new = fun[sel]; + + if ((kernel_accel_new >= kernel_accel_min) && (kernel_accel_new <= kernel_accel_max)) + { + // we can't check kernel_threads because that is for sure outside the range + + kernel_accel = kernel_accel_new; + kernel_threads = kernel_threads_new; + } } } } @@ -545,6 +547,8 @@ static int autotune (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param device_param->kernel_power = kernel_power; + //printf ("Final: %d %d %d %d %d\n", kernel_accel, kernel_loops, kernel_threads, hardware_power, kernel_power); + return 0; } diff --git a/src/backend.c b/src/backend.c index f63aec1b1..6bb511c5b 100644 --- a/src/backend.c +++ b/src/backend.c @@ -24,6 +24,8 @@ #include "dynloader.h" #include "backend.h" #include "terminal.h" +#include "hwmon.h" +#include "autotune.h" #if defined (__linux__) static const char *const dri_card0_path = "/dev/dri/card0"; @@ -43,7 +45,7 @@ static const u32 bzeros[4] = { 0, 0, 0, 0 }; /* forward declarations */ static void rebuild_pws_compressed_append (hc_device_param_t *device_param, const u64 pws_cnt, const u8 chr); - +// static bool is_same_device (const hc_device_param_t *src, const hc_device_param_t *dst) { // First check by PCI address @@ -69,6 +71,15 @@ static bool is_same_device (const hc_device_param_t *src, const hc_device_param_ // Metal can't have aliases if ((src->is_metal == true) && (dst->is_metal == true)) return false; + + // But Metal and OpenCL can have aliases + + if ((src->is_metal == true) && (dst->is_opencl == true)) + { + // Prevents hashcat, when started with x86_64 emulation on Apple Silicon, from showing the Apple M1 OpenCL CPU as an alias for the Apple M1 Metal GPU + + if (src->opencl_device_type != dst->opencl_device_type) return false; + } #endif // But OpenCL can have aliases @@ -87,6 +98,210 @@ static bool is_same_device (const hc_device_param_t *src, const hc_device_param_ return true; } +static const int kern_run_cnt = 15; + +static const int kern_run_all[] = +{ + KERN_RUN_1, + KERN_RUN_12, + KERN_RUN_2P, + KERN_RUN_2, + KERN_RUN_2E, + KERN_RUN_23, + KERN_RUN_3, + KERN_RUN_4, + KERN_RUN_INIT2, + KERN_RUN_LOOP2P, + KERN_RUN_LOOP2, + KERN_RUN_AUX1, + KERN_RUN_AUX2, + KERN_RUN_AUX3, + KERN_RUN_AUX4, +}; + +static cl_kernel opencl_kernel_with_id (hc_device_param_t *device_param, const int kern_run) +{ + switch (kern_run) + { + case KERN_RUN_1: return device_param->opencl_kernel1; break; + case KERN_RUN_12: return device_param->opencl_kernel12; break; + case KERN_RUN_2P: return device_param->opencl_kernel2p; break; + case KERN_RUN_2: return device_param->opencl_kernel2; break; + case KERN_RUN_2E: return device_param->opencl_kernel2e; break; + case KERN_RUN_23: return device_param->opencl_kernel23; break; + case KERN_RUN_3: return device_param->opencl_kernel3; break; + case KERN_RUN_4: return device_param->opencl_kernel4; break; + case KERN_RUN_INIT2: return device_param->opencl_kernel_init2; break; + case KERN_RUN_LOOP2P: return device_param->opencl_kernel_loop2p; break; + case KERN_RUN_LOOP2: return device_param->opencl_kernel_loop2; break; + case KERN_RUN_AUX1: return device_param->opencl_kernel_aux1; break; + case KERN_RUN_AUX2: return device_param->opencl_kernel_aux1; break; + case KERN_RUN_AUX3: return device_param->opencl_kernel_aux1; break; + case KERN_RUN_AUX4: return device_param->opencl_kernel_aux1; break; + } + + return NULL; +} + +static hipFunction_t hip_function_with_id (hc_device_param_t *device_param, const int kern_run) +{ + switch (kern_run) + { + case KERN_RUN_1: return device_param->hip_function1; break; + case KERN_RUN_12: return device_param->hip_function12; break; + case KERN_RUN_2P: return device_param->hip_function2p; break; + case KERN_RUN_2: return device_param->hip_function2; break; + case KERN_RUN_2E: return device_param->hip_function2e; break; + case KERN_RUN_23: return device_param->hip_function23; break; + case KERN_RUN_3: return device_param->hip_function3; break; + case KERN_RUN_4: return device_param->hip_function4; break; + case KERN_RUN_INIT2: return device_param->hip_function_init2; break; + case KERN_RUN_LOOP2P: return device_param->hip_function_loop2p; break; + case KERN_RUN_LOOP2: return device_param->hip_function_loop2; break; + case KERN_RUN_AUX1: return device_param->hip_function_aux1; break; + case KERN_RUN_AUX2: return device_param->hip_function_aux2; break; + case KERN_RUN_AUX3: return device_param->hip_function_aux3; break; + case KERN_RUN_AUX4: return device_param->hip_function_aux4; break; + } + + return NULL; +} + +static CUfunction cuda_function_with_id (hc_device_param_t *device_param, const int kern_run) +{ + switch (kern_run) + { + case KERN_RUN_1: return device_param->cuda_function1; break; + case KERN_RUN_12: return device_param->cuda_function12; break; + case KERN_RUN_2P: return device_param->cuda_function2p; break; + case KERN_RUN_2: return device_param->cuda_function2; break; + case KERN_RUN_2E: return device_param->cuda_function2e; break; + case KERN_RUN_23: return device_param->cuda_function23; break; + case KERN_RUN_3: return device_param->cuda_function3; break; + case KERN_RUN_4: return device_param->cuda_function4; break; + case KERN_RUN_INIT2: return device_param->cuda_function_init2; break; + case KERN_RUN_LOOP2P: return device_param->cuda_function_loop2p; break; + case KERN_RUN_LOOP2: return device_param->cuda_function_loop2; break; + case KERN_RUN_AUX1: return device_param->cuda_function_aux1; break; + case KERN_RUN_AUX2: return device_param->cuda_function_aux2; break; + case KERN_RUN_AUX3: return device_param->cuda_function_aux3; break; + case KERN_RUN_AUX4: return device_param->cuda_function_aux4; break; + } + + return NULL; +} + +int opencl_query_threads_per_block (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, cl_kernel kernel) +{ + size_t threads_per_block = 0; + + if (hc_clGetKernelWorkGroupInfo (hashcat_ctx, kernel, device_param->opencl_device, CL_KERNEL_WORK_GROUP_SIZE, sizeof (threads_per_block), &threads_per_block, NULL) == -1) return -1; + + return threads_per_block; +} + +int opencl_query_max_local_size_bytes (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) +{ + size_t max_local_size_bytes = 0; + + for (int kern_run_idx = 0; kern_run_idx < kern_run_cnt; kern_run_idx++) + { + cl_kernel kernel = opencl_kernel_with_id (device_param, kern_run_all[kern_run_idx]); + + if (kernel == NULL) continue; + + size_t local_size_bytes = 0; + + if (hc_clGetKernelWorkGroupInfo (hashcat_ctx, kernel, device_param->opencl_device, CL_KERNEL_PRIVATE_MEM_SIZE, sizeof (local_size_bytes), &local_size_bytes, NULL) == -1) return -1; + + if (local_size_bytes == 0) continue; + + max_local_size_bytes = MAX (max_local_size_bytes, local_size_bytes); + } + + return (int) max_local_size_bytes; +} + +int hip_query_num_regs (hashcat_ctx_t *hashcat_ctx, hipFunction_t hip_function) +{ + int num_regs = 0; + + if (hc_hipFuncGetAttribute (hashcat_ctx, &num_regs, HIP_FUNC_ATTRIBUTE_NUM_REGS, hip_function) == -1) return -1; + + return num_regs; +} + +int hip_query_threads_per_block (hashcat_ctx_t *hashcat_ctx, hipFunction_t hip_function) +{ + int threads_per_block = 0; + + if (hc_hipFuncGetAttribute (hashcat_ctx, &threads_per_block, HIP_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, hip_function) == -1) return -1; + + return threads_per_block; +} + +int hip_query_max_local_size_bytes (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) +{ + int max_local_size_bytes = 0; + + for (int kern_run_idx = 0; kern_run_idx < kern_run_cnt; kern_run_idx++) + { + hipFunction_t hip_function = hip_function_with_id (device_param, kern_run_all[kern_run_idx]); + + if (hip_function == NULL) continue; + + int local_size_bytes = 0; + + if (hc_hipFuncGetAttribute (hashcat_ctx, &local_size_bytes, HIP_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES, hip_function) == -1) return -1; + + if (local_size_bytes == 0) continue; + + max_local_size_bytes = MAX (max_local_size_bytes, local_size_bytes); + } + + return max_local_size_bytes; +} + +int cuda_query_num_regs (hashcat_ctx_t *hashcat_ctx, CUfunction cuda_function) +{ + int num_regs = 0; + + if (hc_cuFuncGetAttribute (hashcat_ctx, &num_regs, CU_FUNC_ATTRIBUTE_NUM_REGS, cuda_function) == -1) return -1; + + return num_regs; +} + +int cuda_query_threads_per_block (hashcat_ctx_t *hashcat_ctx, CUfunction cuda_function) +{ + int threads_per_block = 0; + + if (hc_cuFuncGetAttribute (hashcat_ctx, &threads_per_block, CU_FUNC_ATTRIBUTE_MAX_THREADS_PER_BLOCK, cuda_function) == -1) return -1; + + return threads_per_block; +} + +int cuda_query_max_local_size_bytes (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) +{ + int max_local_size_bytes = 0; + + for (int kern_run_idx = 0; kern_run_idx < kern_run_cnt; kern_run_idx++) + { + CUfunction cuda_function = cuda_function_with_id (device_param, kern_run_all[kern_run_idx]); + + if (cuda_function == NULL) continue; + + int local_size_bytes = 0; + + if (hc_cuFuncGetAttribute (hashcat_ctx, &local_size_bytes, CU_FUNC_ATTRIBUTE_LOCAL_SIZE_BYTES, cuda_function) == -1) return -1; + + if (local_size_bytes == 0) continue; + + max_local_size_bytes = MAX (max_local_size_bytes, local_size_bytes); + } + + return max_local_size_bytes; +} + static int backend_ctx_find_alias_devices (hashcat_ctx_t *hashcat_ctx) { backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; @@ -157,7 +372,7 @@ static int backend_ctx_find_alias_devices (hashcat_ctx_t *hashcat_ctx) // show a warning for specifically listed devices if they are an alias - if (backend_ctx->backend_devices_filter[alias_device->device_id]) + if (backend_ctx->backend_devices_filter[alias_device->device_id] == 1) { event_log_warning (hashcat_ctx, "The device #%d specifically listed was skipped because it is an alias of device #%d", alias_device->device_id + 1, backend_device->device_id + 1); event_log_warning (hashcat_ctx, NULL); @@ -270,51 +485,46 @@ static int ocl_check_dri (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx) return 0; } -static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char *backend_devices, bool *out) +static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char *backend_devices, int *backend_devices_filter) { - bool backend_devices_filter[DEVICES_MAX + 1] = {false}; + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; - if (backend_devices) + for (int i = 0; i < DEVICES_MAX; i++) backend_devices_filter[i] = 0; + + if (bridge_ctx->enabled == true) return true; + + if (backend_devices == NULL) return true; + + // in this case opposite + + for (int i = 0; i < DEVICES_MAX; i++) backend_devices_filter[i] = 1; + + char *devices = hcstrdup (backend_devices); + + if (devices == NULL) return false; + + char *saveptr = NULL; + + char *next = strtok_r (devices, ",", &saveptr); + + do { - char *devices = hcstrdup (backend_devices); + const int backend_device_id = (const int) strtol (next, NULL, 10); - if (devices == NULL) return false; - - char *saveptr = NULL; - - char *next = strtok_r (devices, ",", &saveptr); - - do + if ((backend_device_id <= 0) || (backend_device_id >= DEVICES_MAX)) { - const int backend_device_id = (const int) strtol (next, NULL, 10); + event_log_error (hashcat_ctx, "Invalid device_id %d specified.", backend_device_id); - if ((backend_device_id <= 0) || (backend_device_id >= DEVICES_MAX)) - { - event_log_error (hashcat_ctx, "Invalid device_id %d specified.", backend_device_id); + hcfree (devices); - hcfree (devices); - - return false; - } - - backend_devices_filter[backend_device_id - 1] = true; - - } while ((next = strtok_r ((char *) NULL, ",", &saveptr)) != NULL); - - hcfree (devices); - } - else - { - for (int i = 0; i <= DEVICES_MAX; i++) - { - backend_devices_filter[i] = true; + return false; } - } - for (int i = 0; i <= DEVICES_MAX; i++) - { - out[i] = backend_devices_filter[i]; - } + backend_devices_filter[backend_device_id - 1] = 0; + + } while ((next = strtok_r ((char *) NULL, ",", &saveptr)) != NULL); + + hcfree (devices); return true; } @@ -403,7 +613,7 @@ static bool cuda_test_instruction (hashcat_ctx_t *hashcat_ctx, const int sm_majo nvrtc_options[0] = "--restrict"; nvrtc_options[1] = "--gpu-architecture"; - hc_asprintf (&nvrtc_options[2], "compute_%d%d", sm_major, sm_minor); + hc_asprintf (&nvrtc_options[2], "compute_%d", (device_param->sm_major * 10) + device_param->sm_minor); nvrtc_options[3] = NULL; @@ -481,22 +691,13 @@ static bool opencl_test_instruction (hashcat_ctx_t *hashcat_ctx, cl_context cont OCL_PTR *ocl = (OCL_PTR *) backend_ctx->ocl; #ifndef DEBUG - const int fd_stderr = fileno (stderr); - const int stderr_bak = dup (fd_stderr); - #ifdef _WIN - const int tmp = open ("NUL", O_WRONLY); - #else - const int tmp = open ("/dev/null", O_WRONLY); - #endif - dup2 (tmp, fd_stderr); - close (tmp); + int saved_stderr = suppress_stderr (); #endif const int CL_rc = ocl->clBuildProgram (program, 1, &device, NULL, NULL, NULL); #ifndef DEBUG - dup2 (stderr_bak, fd_stderr); - close (stderr_bak); + restore_stderr (saved_stderr); #endif if (CL_rc != CL_SUCCESS) @@ -620,11 +821,6 @@ static bool write_kernel_binary (hashcat_ctx_t *hashcat_ctx, const char *kernel_ return true; } -u32 backend_device_idx_real_from_virtual (const u32 device_idx, const u32 backend_devices_virtual) -{ - return device_idx / backend_devices_virtual; -} - void generate_source_kernel_filename (const bool slow_candidates, const u32 attack_exec, const u32 attack_kern, const u32 kern_type, const u32 opti_type, char *shared_dir, char *source_file) { if (opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) @@ -950,8 +1146,9 @@ int copy_pws_comp (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, return 0; } -int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u64 pws_pos, const u64 pws_cnt, const u32 fast_iteration, const u32 salt_pos) +int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 highest_pw_len, const u64 pws_pos, const u64 pws_cnt, const u32 fast_iteration, const u32 salt_pos, const bool is_autotune) { + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; module_ctx_t *module_ctx = hashcat_ctx->module_ctx; @@ -1033,20 +1230,20 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (highest_pw_len < 16) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_pos, pws_cnt, true, fast_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_pos, pws_cnt, true, fast_iteration, is_autotune) == -1) return -1; } else if (highest_pw_len < 32) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_pos, pws_cnt, true, fast_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_pos, pws_cnt, true, fast_iteration, is_autotune) == -1) return -1; } else { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, true, fast_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, true, fast_iteration, is_autotune) == -1) return -1; } } else { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_4, pws_pos, pws_cnt, true, fast_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_4, pws_pos, pws_cnt, true, fast_iteration, is_autotune) == -1) return -1; } } else @@ -1073,6 +1270,41 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, // as soon as the first restore checkpoint is reached the prediction is accurate. // also the closer it gets to that point. + /* workflow overview: + + ATTACK_EXEC_OUTSIDE_KERNEL: + COPY_AMPLIFIER_MATERIAL + RUN_AMPLIFIER + RUN_UTF16_CONVERT + RUN_INIT + COPY_HOOK_DATA_TO_HOST + CALL_HOOK12 + COPY_HOOK_DATA_TO_DEVICE + SALT_REPEATS (default 1): + RUN_PREPARE + ITER_REPEATS: + RUN_LOOP + RUN_EXTENTED + COPY_BRIDGE_MATERIAL_TO_HOST + BRIDGE_LOOP + COPY_BRIDGE_MATERIAL_TO_DEVICE + COPY_HOOK_DATA_TO_HOST + CALL_HOOK23 + COPY_HOOK_DATA_TO_DEVICE + RUN_INIT2 + SALT_REPEATS (default 1): + RUN_PREPARE2 + ITER2_REPEATS: + RUN_LOOP2 + COPY_BRIDGE_MATERIAL_TO_HOST + BRIDGE_LOOP2 + COPY_BRIDGE_MATERIAL_TO_DEVICE + DEEP_COMP_KERNEL: + RUN_AUX1/2/3/4 + RUN_COMP + CLEAN_HOOK_DATA + */ + if (true) { if (device_param->is_cuda == true) @@ -1130,11 +1362,14 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, } } - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_INIT) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; + } if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_12, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_12, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (device_param->is_cuda == true) { @@ -1214,7 +1449,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (device_param->is_opencl == true) { - if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_hooks, CL_FALSE, 0, pws_cnt * hashconfig->hook_size, device_param->hooks_buf, 0, NULL, NULL) == -1) return -1; + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_hooks, CL_TRUE, 0, pws_cnt * hashconfig->hook_size, device_param->hooks_buf, 0, NULL, NULL) == -1) return -1; } } } @@ -1229,7 +1464,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_LOOP_PREPARE) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; } if (true) @@ -1247,11 +1482,14 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, device_param->kernel_param.loop_pos = loop_pos; device_param->kernel_param.loop_cnt = loop_left; - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_pos, pws_cnt, true, slow_iteration) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_LOOP) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, pws_pos, pws_cnt, true, slow_iteration, is_autotune) == -1) return -1; + } if (hashconfig->opts_type & OPTS_TYPE_LOOP_EXTENDED) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2E, pws_pos, pws_cnt, true, slow_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2E, pws_pos, pws_cnt, true, slow_iteration, is_autotune) == -1) return -1; } //bug? @@ -1292,9 +1530,98 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, } } + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->cuda_d_tmps, pws_cnt * hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->hip_d_tmps, pws_cnt * hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyDtoH (hashcat_ctx, device_param->metal_command_queue, device_param->h_tmps, device_param->metal_d_tmps, 0, pws_cnt * hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueReadBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, pws_cnt * hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + + if (bridge_ctx->launch_loop (bridge_ctx->platform_context, device_param, hashconfig, hashes, salt_pos, pws_cnt) == false) return -1; + + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_tmps, device_param->h_tmps, pws_cnt * hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_tmps, device_param->h_tmps, pws_cnt * hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_tmps, 0, device_param->h_tmps, pws_cnt * hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, pws_cnt * hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + + //bug? + //while (status_ctx->run_thread_level2 == false) break; + if (status_ctx->run_thread_level2 == false) break; + + /** + * speed + */ + + const u64 perf_sum_all = (u64) (pws_cnt); + + double speed_msec = hc_timer_get (device_param->timer_speed); + + const u32 speed_pos = device_param->speed_pos; + + device_param->speed_cnt[speed_pos] = perf_sum_all; + + device_param->speed_msec[speed_pos] = speed_msec; + + if (user_options->speed_only == true) + { + if (speed_msec > 4000) + { + device_param->speed_pos = 1; + + device_param->speed_only_finish = true; + + return 0; + } + } + } + if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_23, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_23, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (device_param->is_cuda == true) { @@ -1374,7 +1701,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (device_param->is_opencl == true) { - if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_hooks, CL_FALSE, 0, pws_cnt * hashconfig->hook_size, device_param->hooks_buf, 0, NULL, NULL) == -1) return -1; + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_hooks, CL_TRUE, 0, pws_cnt * hashconfig->hook_size, device_param->hooks_buf, 0, NULL, NULL) == -1) return -1; } } } @@ -1386,7 +1713,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_INIT2) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; } if (true) @@ -1399,7 +1726,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_LOOP2_PREPARE) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2P, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2P, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_LOOP2) @@ -1417,7 +1744,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, device_param->kernel_param.loop_pos = loop_pos; device_param->kernel_param.loop_cnt = loop_left; - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, pws_pos, pws_cnt, true, slow_iteration) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, pws_pos, pws_cnt, true, slow_iteration, is_autotune) == -1) return -1; //bug? //while (status_ctx->run_thread_level2 == false) break; @@ -1442,6 +1769,65 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, device_param->speed_msec[speed_pos] = speed_msec; } + + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP2) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->cuda_d_tmps, pws_cnt * hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->hip_d_tmps, pws_cnt * hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyDtoH (hashcat_ctx, device_param->metal_command_queue, device_param->h_tmps, device_param->metal_d_tmps, 0, pws_cnt * hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueReadBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, pws_cnt * hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + + if (bridge_ctx->launch_loop2 (bridge_ctx->platform_context, device_param, hashconfig, hashes, salt_pos, pws_cnt) == false) return -1; + + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_tmps, device_param->h_tmps, pws_cnt * hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_tmps, device_param->h_tmps, pws_cnt * hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_tmps, 0, device_param->h_tmps, pws_cnt * hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, pws_cnt * hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + } } } } @@ -1466,7 +1852,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_AUX1) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX1, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX1, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (status_ctx->run_thread_level2 == false) break; @@ -1475,7 +1861,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_AUX2) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX2, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX2, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (status_ctx->run_thread_level2 == false) break; @@ -1484,7 +1870,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_AUX3) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX3, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX3, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (status_ctx->run_thread_level2 == false) break; @@ -1493,7 +1879,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (hashconfig->opts_type & OPTS_TYPE_AUX4) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX4, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX4, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (status_ctx->run_thread_level2 == false) break; @@ -1502,7 +1888,10 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, if (aux_cnt == 0) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_COMP) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; + } if (status_ctx->run_thread_level2 == false) break; } @@ -1519,7 +1908,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 deep_comp_kernel = module_ctx->module_deep_comp_kernel (hashes, salt_pos, loops_pos); - if (run_kernel (hashcat_ctx, device_param, deep_comp_kernel, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, deep_comp_kernel, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; if (status_ctx->run_thread_level2 == false) break; } @@ -1527,7 +1916,10 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, } else { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_COMP) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, pws_pos, pws_cnt, false, 0, is_autotune) == -1) return -1; + } } } @@ -2081,7 +2473,7 @@ int run_opencl_kernel_bzero (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *devi return 0; } -int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 pws_pos, const u64 num, const u32 event_update, const u32 iteration) +int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u32 kern_run, const u64 pws_pos, const u64 num, const u32 event_update, const u32 iteration, const bool is_autotune) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const status_ctx_t *status_ctx = hashcat_ctx->status_ctx; @@ -2244,6 +2636,11 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con } } + if (is_autotune == true) + { + if (hc_cuLaunchKernel (hashcat_ctx, cuda_function, num_elements, 1, 1, kernel_threads, 1, 1, dynamic_shared_mem, device_param->cuda_stream, device_param->kernel_params, NULL) == -1) return -1; + } + if (hc_cuEventRecord (hashcat_ctx, device_param->cuda_event1, device_param->cuda_stream) == -1) return -1; if (hc_cuLaunchKernel (hashcat_ctx, cuda_function, num_elements, 1, 1, kernel_threads, 1, 1, dynamic_shared_mem, device_param->cuda_stream, device_param->kernel_params, NULL) == -1) return -1; @@ -2340,6 +2737,11 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con } } + if (is_autotune == true) + { + if (hc_hipLaunchKernel (hashcat_ctx, hip_function, num_elements, 1, 1, kernel_threads, 1, 1, dynamic_shared_mem, device_param->hip_stream, device_param->kernel_params, NULL) == -1) return -1; + } + if (hc_hipEventRecord (hashcat_ctx, device_param->hip_event1, device_param->hip_stream) == -1) return -1; if (hc_hipLaunchKernel (hashcat_ctx, hip_function, num_elements, 1, 1, kernel_threads, 1, 1, dynamic_shared_mem, device_param->hip_stream, device_param->kernel_params, NULL) == -1) return -1; @@ -2399,18 +2801,17 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con if (hc_mtlEncodeComputeCommand_pre (hashcat_ctx, metal_pipeline, device_param->metal_command_queue, &metal_command_buffer, &metal_command_encoder) == -1) return -1; - // all buffers must be allocated - int tmp_buf_cnt = 0; - mtl_mem tmp_buf[25] = { 0 }; + mtl_mem metal_buffer = NULL; + if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, sizeof (u8), NULL, &metal_buffer) == -1) return -1; + + // all buffers must be allocated for (u32 i = 0; i <= 24; i++) { // allocate fake buffer if NULL if (device_param->kernel_params[i] == NULL) { - if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, sizeof (u8), NULL, &tmp_buf[tmp_buf_cnt]) == -1) return -1; - if (hc_mtlSetCommandEncoderArg (hashcat_ctx, metal_command_encoder, 0, i, tmp_buf[tmp_buf_cnt], NULL, 0) == -1) return -1; - tmp_buf_cnt++; + if (hc_mtlSetCommandEncoderArg (hashcat_ctx, metal_command_encoder, 0, i, metal_buffer, NULL, 0) == -1) return -1; } else { @@ -2465,6 +2866,27 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con double ms = 0; + if (is_autotune == true) + { + hc_mtlEncodeComputeCommand (hashcat_ctx, metal_command_encoder, metal_command_buffer, global_work_size[0], local_work_size[0], &ms); + + // hc_mtlEncodeComputeCommand_pre() must be called before every hc_mtlEncodeComputeCommand() + if (hc_mtlEncodeComputeCommand_pre (hashcat_ctx, metal_pipeline, device_param->metal_command_queue, &metal_command_buffer, &metal_command_encoder) == -1) return -1; + + for (u32 i = 0; i <= 24; i++) + { + // allocate fake buffer if NULL + if (device_param->kernel_params[i] == NULL) + { + if (hc_mtlSetCommandEncoderArg (hashcat_ctx, metal_command_encoder, 0, i, metal_buffer, NULL, 0) == -1) return -1; + } + else + { + if (hc_mtlSetCommandEncoderArg (hashcat_ctx, metal_command_encoder, 0, i, device_param->kernel_params[i], NULL, 0) == -1) return -1; + } + } + } + const int rc_cc = hc_mtlEncodeComputeCommand (hashcat_ctx, metal_command_encoder, metal_command_buffer, global_work_size[0], local_work_size[0], &ms); if (rc_cc != -1) @@ -2490,12 +2912,6 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con // release tmp_buf - for (int i = 0; i < tmp_buf_cnt; i++) - { - hc_mtlReleaseMemObject (hashcat_ctx, tmp_buf[i]); - tmp_buf[i] = NULL; - } - if (rc_cc == -1) return -1; } #endif // __APPLE__ @@ -2573,6 +2989,11 @@ int run_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, con const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; + if (is_autotune == true) + { + if (hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->opencl_command_queue, opencl_kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, &opencl_event) == -1) return -1; + } + if (hc_clEnqueueNDRangeKernel (hashcat_ctx, device_param->opencl_command_queue, opencl_kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, &opencl_event) == -1) return -1; // spin damper section @@ -3496,6 +3917,23 @@ int run_copy (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const } } + if (device_param->is_cuda == true) + { + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + // what to do here? + } + #endif + if (device_param->is_opencl == true) { if (hc_clFlush (hashcat_ctx, device_param->opencl_command_queue) == -1) return -1; @@ -3569,13 +4007,6 @@ int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, co device_param->outerloop_pos = 0; device_param->outerloop_left = pws_cnt; - // we ignore the time to copy data over pci bus in this case - - if (user_options->speed_only == true) - { - hc_timer_set (&device_param->timer_speed); - } - // loop start: most outer loop = salt iteration, then innerloops (if multi) u32 salts_cnt = hashes->salts_cnt; @@ -4103,7 +4534,7 @@ int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, co } } - if (choose_kernel (hashcat_ctx, device_param, highest_pw_len, pws_pos, pws_cnt, fast_iteration, salt_pos) == -1) return -1; + if (choose_kernel (hashcat_ctx, device_param, highest_pw_len, pws_pos, pws_cnt, fast_iteration, salt_pos, false) == -1) return -1; /** * benchmark was aborted because too long kernel runtime (slow hashes only) @@ -4170,16 +4601,6 @@ int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, co if (user_options->speed_only == true) { - // let's abort this so that the user doesn't have to wait too long on the result - // for slow hashes it's fine anyway as boost mode should be turned on - - if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) - { - device_param->speed_only_finish = true; - - break; - } - double total_msec = device_param->speed_msec[0]; for (u32 speed_pos = 1; speed_pos < device_param->speed_pos; speed_pos++) @@ -4256,7 +4677,7 @@ int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, co device_param->outerloop_msec = total_msec * hashes->salts_cnt * device_param->outerloop_multi; - device_param->speed_only_finish = true; + //device_param->speed_only_finish = true; } if (iconv_enabled == true) @@ -4621,11 +5042,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) * Backend device selection */ - bool backend_devices_filter[DEVICES_MAX + 1]; - - if (setup_backend_devices_filter (hashcat_ctx, user_options->backend_devices, backend_devices_filter) == false) return -1; - - for (int i = 0; i <= DEVICES_MAX; i++) backend_ctx->backend_devices_filter[i] = backend_devices_filter[i]; + if (setup_backend_devices_filter (hashcat_ctx, user_options->backend_devices, backend_ctx->backend_devices_filter) == false) return -1; /** * OpenCL device type selection @@ -4798,6 +5215,10 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) { opencl_platform_vendor_id = VENDOR_ID_POCL; } + else if (strcmp (opencl_platform_vendor, CL_VENDOR_MICROSOFT) == 0) + { + opencl_platform_vendor_id = VENDOR_ID_MICROSOFT; + } else { opencl_platform_vendor_id = VENDOR_ID_GENERIC; @@ -4844,12 +5265,14 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) } } + /* no longer used opencl_platform_devices_cnt *= user_options->backend_devices_virtual; for (int i = opencl_platform_devices_cnt - 1; i >= 0; i--) { opencl_platform_devices[i] = opencl_platform_devices[backend_device_idx_real_from_virtual (i, user_options->backend_devices_virtual)]; } + */ opencl_platforms_devices[opencl_platforms_idx] = opencl_platform_devices; opencl_platforms_devices_cnt[opencl_platforms_idx] = opencl_platform_devices_cnt; @@ -4904,6 +5327,11 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) } } + // we don't want accelerators here + // for this kind of devices, we use accelerator bridge plugin interface + + opencl_device_types_filter &= ~CL_DEVICE_TYPE_ACCELERATOR; + backend_ctx->opencl_device_types_filter = opencl_device_types_filter; } } @@ -4951,6 +5379,8 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) event_log_warning (hashcat_ctx, " \"CUDA Toolkit\" (9.0 or later)"); event_log_warning (hashcat_ctx, NULL); + hcfree (backend_ctx->devices_param); + return -1; } @@ -4990,6 +5420,7 @@ void backend_ctx_destroy (hashcat_ctx_t *hashcat_ctx) int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; const folder_config_t *folder_config = hashcat_ctx->folder_config; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; user_options_t *user_options = hashcat_ctx->user_options; @@ -5005,7 +5436,16 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) bool need_sysfs_cpu = false; bool need_iokit = false; - int backend_devices_idx = 0; + int bridge_link_device = 0; // this will only count active device + + int backend_devices_idx = 0; // this will not only count active devices + + bool is_virtualized = ((user_options->backend_devices_virtmulti > 1) || (bridge_ctx->enabled == true)) ? true : false; + + int virtmulti = (bridge_ctx->enabled == true) ? bridge_ctx->get_unit_count (bridge_ctx->platform_context) : (int) user_options->backend_devices_virtmulti; + + int virthost = -1; + int virthost_finder = user_options->backend_devices_virthost; // CUDA @@ -5021,7 +5461,21 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) cuda_close (hashcat_ctx); } - cuda_devices_cnt *= user_options->backend_devices_virtual; + if (is_virtualized == true) + { + if ((virthost == -1) && (virthost_finder <= cuda_devices_cnt)) + { + cuda_devices_cnt = virtmulti; + + virthost = virthost_finder - 1; + } + else + { + virthost_finder -= cuda_devices_cnt; + + cuda_devices_cnt = 0; + } + } backend_ctx->cuda_devices_cnt = cuda_devices_cnt; @@ -5031,7 +5485,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { const u32 device_id = backend_devices_idx; - const u32 cuda_devices_idx_real = backend_device_idx_real_from_virtual (cuda_devices_idx, user_options->backend_devices_virtual); + const u32 cuda_devices_idx_real = (is_virtualized == true) ? virthost : cuda_devices_idx; hc_device_param_t *device_param = &devices_param[backend_devices_idx]; @@ -5078,6 +5532,45 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) hc_string_trim_trailing (device_name); + // regsPerBlock + + int max_registers_per_block = 0; + + if (hc_cuDeviceGetAttribute (hashcat_ctx, &max_registers_per_block, CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_BLOCK, cuda_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->regsPerBlock = max_registers_per_block; + + // regsPerMultiprocessor + + int max_registers_per_multiprocessor = 0; + + if (hc_cuDeviceGetAttribute (hashcat_ctx, &max_registers_per_multiprocessor, CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR, cuda_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->regsPerMultiprocessor = max_registers_per_multiprocessor; + + // unified memory + + int device_host_unified_memory = 0; + + if (hc_cuDeviceGetAttribute (hashcat_ctx, &device_host_unified_memory, CU_DEVICE_ATTRIBUTE_INTEGRATED, cuda_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->device_host_unified_memory = device_host_unified_memory; + // device_processors int device_processors = 0; @@ -5284,7 +5777,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if (!backend_ctx->backend_devices_filter[device_id]) + if (backend_ctx->backend_devices_filter[device_id] == 1) { device_param->skipped = true; } @@ -5333,7 +5826,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) if (device_param->kernel_exec_timeout != 0) { - if (user_options->quiet == false) + if ((user_options->quiet == false) && (is_virtualized == false)) { event_log_advice (hashcat_ctx, "* Device #%u: WARNING! Kernel exec timeout is not disabled.", device_id + 1); event_log_advice (hashcat_ctx, " This may cause \"CL_OUT_OF_RESOURCES\" or related errors."); @@ -5391,7 +5884,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) continue; } - device_param->device_available_mem = (u64) free; + device_param->device_available_mem = ((u64) free * (100 - user_options->backend_devices_keepfree)) / 100; if (hc_cuCtxPopCurrent (hashcat_ctx, &cuda_context) == -1) { @@ -5411,7 +5904,12 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) * activate device */ - if (device_param->skipped == false) cuda_devices_active++; + if (device_param->skipped == false) + { + device_param->bridge_link_device = bridge_link_device++; + + cuda_devices_active++; + } } } @@ -5432,7 +5930,21 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) hip_close (hashcat_ctx); } - hip_devices_cnt *= user_options->backend_devices_virtual; + if (is_virtualized == true) + { + if ((virthost == -1) && (virthost_finder <= hip_devices_cnt)) + { + hip_devices_cnt = virtmulti; + + virthost = virthost_finder - 1; + } + else + { + virthost_finder -= hip_devices_cnt; + + hip_devices_cnt = 0; + } + } backend_ctx->hip_devices_cnt = hip_devices_cnt; @@ -5442,7 +5954,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { const u32 device_id = backend_devices_idx; - const u32 hip_devices_idx_real = backend_device_idx_real_from_virtual (hip_devices_idx, user_options->backend_devices_virtual); + const u32 hip_devices_idx_real = (is_virtualized == true) ? virthost : hip_devices_idx; hc_device_param_t *device_param = &devices_param[backend_devices_idx]; @@ -5489,6 +6001,19 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) hc_string_trim_trailing (device_name); + // unified memory + + int device_host_unified_memory = 0; + + if (hc_hipDeviceGetAttribute (hashcat_ctx, &device_host_unified_memory, hipDeviceAttributeIntegrated, hip_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->device_host_unified_memory = device_host_unified_memory; + // device_processors int device_processors = 0; @@ -5532,6 +6057,41 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->hip_warp_size = hip_warp_size; + // gcnArchName + + hipDeviceProp_t prop; + + if (hc_hipGetDeviceProperties (hashcat_ctx, &prop, hip_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->gcnArchName = strdup (prop.gcnArchName); + + // regsPerBlock + + if (hc_hipGetDeviceProperties (hashcat_ctx, &prop, hip_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->regsPerBlock = prop.regsPerBlock; + + // regsPerMultiprocessor + + if (hc_hipGetDeviceProperties (hashcat_ctx, &prop, hip_device) == -1) + { + device_param->skipped = true; + + continue; + } + + device_param->regsPerMultiprocessor = prop.regsPerMultiprocessor; + // sm_minor, sm_major int sm_major = 0; @@ -5701,7 +6261,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if (!backend_ctx->backend_devices_filter[device_id]) + if (backend_ctx->backend_devices_filter[device_id] == 1) { device_param->skipped = true; } @@ -5750,7 +6310,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) if (device_param->kernel_exec_timeout != 0) { - if (user_options->quiet == false) + if ((user_options->quiet == false) && (is_virtualized == false)) { event_log_advice (hashcat_ctx, "* Device #%u: WARNING! Kernel exec timeout is not disabled.", device_id + 1); event_log_advice (hashcat_ctx, " This may cause \"CL_OUT_OF_RESOURCES\" or related errors."); @@ -5801,7 +6361,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) continue; } - device_param->device_available_mem = (u64) free; + device_param->device_available_mem = ((u64) free * (100 - user_options->backend_devices_keepfree)) / 100; if (hc_hipCtxPopCurrent (hashcat_ctx, &hip_context) == -1) { @@ -5842,7 +6402,12 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) * activate device */ - if (device_param->skipped == false) hip_devices_active++; + if (device_param->skipped == false) + { + device_param->bridge_link_device = bridge_link_device++; + + hip_devices_active++; + } } } @@ -5864,7 +6429,21 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) mtl_close (hashcat_ctx); } - metal_devices_cnt *= user_options->backend_devices_virtual; + if (is_virtualized == true) + { + if ((virthost == -1) && (virthost_finder <= metal_devices_cnt)) + { + metal_devices_cnt = virtmulti; + + virthost = virthost_finder - 1; + } + else + { + virthost_finder -= metal_devices_cnt; + + metal_devices_cnt = 0; + } + } backend_ctx->metal_devices_cnt = metal_devices_cnt; @@ -5874,7 +6453,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { const u32 device_id = backend_devices_idx; - const u32 metal_devices_idx_real = backend_device_idx_real_from_virtual (metal_devices_idx, user_options->backend_devices_virtual); + const u32 metal_devices_idx_real = (is_virtualized == true) ? virthost : metal_devices_idx; hc_device_param_t *device_param = &devices_param[backend_devices_idx]; @@ -6198,7 +6777,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if (!backend_ctx->backend_devices_filter[device_id]) + if (backend_ctx->backend_devices_filter[device_id] == 1) { device_param->skipped = true; } @@ -6250,7 +6829,12 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) * activate device */ - if (device_param->skipped == false) metal_devices_active++; + if (device_param->skipped == false) + { + device_param->bridge_link_device = bridge_link_device++; + + metal_devices_active++; + } } } #endif // __APPLE__ @@ -6282,6 +6866,24 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) cl_uint opencl_platform_vendor_id = opencl_platforms_vendor_id[opencl_platforms_idx]; char *opencl_platform_version = opencl_platforms_version[opencl_platforms_idx]; + if (is_virtualized == true) + { + if ((virthost == -1) && (virthost_finder <= (int) opencl_platform_devices_cnt)) + { + opencl_platform_devices_cnt = virtmulti; + + virthost = virthost_finder - 1; + } + else + { + virthost_finder -= (int) opencl_platform_devices_cnt; + + opencl_platform_devices_cnt = 0; + } + + opencl_platforms_devices_cnt[opencl_platforms_idx] = opencl_platform_devices_cnt; + } + for (u32 opencl_platform_devices_idx = 0; opencl_platform_devices_idx < opencl_platform_devices_cnt; opencl_platform_devices_idx++, backend_devices_idx++, opencl_devices_cnt++) { const u32 device_id = backend_devices_idx; @@ -6296,7 +6898,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->opencl_platform_vendor_id = opencl_platform_vendor_id; - device_param->opencl_device = opencl_platform_devices[opencl_platform_devices_idx]; + device_param->opencl_device = opencl_platform_devices[(is_virtualized == true) ? virthost : (int) opencl_platform_devices_idx]; //device_param->opencl_platform = opencl_platform; @@ -6492,6 +7094,10 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) { opencl_device_vendor_id = VENDOR_ID_POCL; } + else if (strcmp (opencl_device_vendor, CL_VENDOR_MICROSOFT) == 0) + { + opencl_device_vendor_id = VENDOR_ID_MICROSOFT; + } else { opencl_device_vendor_id = VENDOR_ID_GENERIC; @@ -6556,6 +7162,33 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->device_processors = device_processors; + #if defined (__APPLE__) + if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) + { + if (backend_ctx->metal_devices_cnt > 0 && backend_ctx->metal_devices_active > 0) + { + for (int metal_devices_idx = 0; metal_devices_idx < backend_ctx->metal_devices_cnt; metal_devices_idx++) + { + const int tmp_backend_devices_idx = backend_ctx->backend_device_from_metal[metal_devices_idx]; + + hc_device_param_t *tmp_device_param = backend_ctx->devices_param + tmp_backend_devices_idx; + + if (strstr (device_param->device_name, tmp_device_param->device_name) || strstr (tmp_device_param->device_name, device_param->device_name)) + { + // can't detect the actual value of device_processors on macOS Intel with Metal + // set the value of Metal device_processor from OpenCL to solve the issue + if (tmp_device_param->device_processors != device_param->device_processors) + { + tmp_device_param->device_processors = device_param->device_processors; + + break; + } + } + } + } + } + #endif // __APPLE__ + // device_host_unified_memory cl_bool device_host_unified_memory = false; @@ -6604,10 +7237,6 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->device_maxmem_alloc /= 2; } - // note we'll limit to 2gb, otherwise this causes all kinds of weird errors because of possible integer overflows in opencl runtimes - // testwise disabling that - //device_param->device_maxmem_alloc = MIN (device_maxmem_alloc, 0x7fffffff); - // max_work_group_size size_t device_maxworkgroup_size = 0; @@ -6997,7 +7626,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if (!backend_ctx->backend_devices_filter[device_id]) + if (backend_ctx->backend_devices_filter[device_id] == 1) { device_param->skipped = true; } @@ -7499,7 +8128,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) if (device_param->kernel_exec_timeout != 0) { - if (user_options->quiet == false) + if ((user_options->quiet == false) && (is_virtualized == false)) { event_log_warning (hashcat_ctx, "* Device #%u: WARNING! Kernel exec timeout is not disabled.", device_id + 1); event_log_warning (hashcat_ctx, " This may cause \"CL_OUT_OF_RESOURCES\" or related errors."); @@ -7602,6 +8231,8 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) * activate device */ + device_param->bridge_link_device = bridge_link_device++; + opencl_devices_active++; } } @@ -7633,7 +8264,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) if (device_param->skipped == false) { - if (backend_ctx->backend_devices_filter[DEVICES_MAX]) + if (backend_ctx->backend_devices_filter[device_param->device_id] == 1) { if ((user_options->quiet == false) && (user_options->backend_info == 0)) { @@ -7710,23 +8341,6 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) return -1; } - if (!backend_ctx->backend_devices_filter[DEVICES_MAX]) - { - // maybe we will need this in the future - //const u64 backend_devices_cnt_mask = ~(((u64) -1 >> backend_ctx->backend_devices_cnt) << backend_ctx->backend_devices_cnt); - - for (int i = backend_ctx->backend_devices_cnt; i < DEVICES_MAX; i++) - { - if (backend_ctx->backend_devices_filter[i]) - { - event_log_error (hashcat_ctx, "An invalid device was specified using the --backend-devices parameter."); - event_log_error (hashcat_ctx, "The specified device was higher than the number of available devices (%u).", backend_ctx->backend_devices_cnt); - - return -1; - } - } - } - // time or resource intensive operations which we do not run if the corresponding device was skipped by the user if (backend_ctx->cuda) @@ -7849,7 +8463,13 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->device_available_mem = device_param->device_global_mem - MAX_ALLOC_CHECKS_SIZE; - if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) + if (user_options->backend_devices_keepfree < 100) + { + device_param->device_available_mem = (device_param->device_global_mem * (100 - user_options->backend_devices_keepfree)) / 100; + } + // this section is creating more problems than it solves, so lets use a fixed multiplier instead + // users can override with --backend-devices-keepfree=100 + else if ((device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) && (device_param->device_host_unified_memory == 0)) { // following the same logic as for OpenCL, explained later @@ -8062,108 +8682,168 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) */ } - // available device memory - // This test causes an GPU memory usage spike. - // In case there are multiple hashcat instances starting at the same time this will cause GPU out of memory errors which otherwise would not exist. - // We will simply not run it if that device was skipped by the user. + // available device memory + // first trying to check if we can get device_available_mem from cuda/hip alias device - if (device_param->device_global_mem) + bool updated_device_available_mem = false; + + if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) { - #define MAX_ALLOC_CHECKS_CNT 8192 - #define MAX_ALLOC_CHECKS_SIZE (64 * 1024 * 1024) - - device_param->device_available_mem = device_param->device_global_mem - MAX_ALLOC_CHECKS_SIZE; - - if ((device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) && ((device_param->opencl_platform_vendor_id != VENDOR_ID_INTEL_SDK) || (device_param->device_host_unified_memory == 0))) + if (device_param->opencl_platform_vendor_id == VENDOR_ID_NV) { - // OK, so the problem here is the following: - // There's just CL_DEVICE_GLOBAL_MEM_SIZE to ask OpenCL about the total memory on the device, - // but there's no way to ask for available memory on the device. - // In combination, most OpenCL runtimes implementation of clCreateBuffer() - // are doing so called lazy memory allocation on the device. - // Now, if the user has X11 (or a game or anything that takes a lot of GPU memory) - // running on the host we end up with an error type of this: - // clEnqueueNDRangeKernel(): CL_MEM_OBJECT_ALLOCATION_FAILURE - // The clEnqueueNDRangeKernel() is because of the lazy allocation - // The best way to workaround this problem is if we would be able to ask for available memory, - // The idea here is to try to evaluate available memory by allocating it till it errors - - cl_mem *tmp_device = (cl_mem *) hccalloc (MAX_ALLOC_CHECKS_CNT, sizeof (cl_mem)); - - u64 c; - - for (c = 0; c < MAX_ALLOC_CHECKS_CNT; c++) + if (backend_ctx->cuda_devices_cnt > 0 && backend_ctx->cuda_devices_active > 0) { - if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= device_param->device_global_mem) break; - - // work around, for some reason apple opencl can't have buffers larger 2^31 - // typically runs into trap 6 - // maybe 32/64 bit problem affecting size_t? - // this seems to affect global memory as well no just single allocations - - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->is_metal == false)) + for (int cuda_devices_idx = 0; cuda_devices_idx < backend_ctx->cuda_devices_cnt; cuda_devices_idx++) { - const size_t undocumented_single_allocation_apple = 0x7fffffff; + const int tmp_backend_devices_idx = backend_ctx->backend_device_from_cuda[cuda_devices_idx]; - if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= undocumented_single_allocation_apple) break; - } + hc_device_param_t *tmp_device_param = backend_ctx->devices_param + tmp_backend_devices_idx; - cl_int CL_err; - - OCL_PTR *ocl = (OCL_PTR *) backend_ctx->ocl; - - tmp_device[c] = ocl->clCreateBuffer (context, CL_MEM_READ_WRITE, MAX_ALLOC_CHECKS_SIZE, NULL, &CL_err); - - if (CL_err != CL_SUCCESS) - { - c--; - - break; - } - - // transfer only a few byte should be enough to force the runtime to actually allocate the memory - - u8 tmp_host[8]; - - if (ocl->clEnqueueReadBuffer (command_queue, tmp_device[c], CL_TRUE, 0, sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; - if (ocl->clEnqueueWriteBuffer (command_queue, tmp_device[c], CL_TRUE, 0, sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; - - if (ocl->clEnqueueReadBuffer (command_queue, tmp_device[c], CL_TRUE, MAX_ALLOC_CHECKS_SIZE - sizeof (tmp_host), sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; - if (ocl->clEnqueueWriteBuffer (command_queue, tmp_device[c], CL_TRUE, MAX_ALLOC_CHECKS_SIZE - sizeof (tmp_host), sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; - } - - device_param->device_available_mem = MAX_ALLOC_CHECKS_SIZE; - - if (c > 0) - { - device_param->device_available_mem *= c; - } - - // clean up - - for (c = 0; c < MAX_ALLOC_CHECKS_CNT; c++) - { - if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= device_param->device_global_mem) break; - - if (tmp_device[c] != NULL) - { - if (hc_clReleaseMemObject (hashcat_ctx, tmp_device[c]) == -1) return -1; + if (is_same_device (device_param, tmp_device_param)) + { + device_param->device_available_mem = tmp_device_param->device_available_mem; + updated_device_available_mem = true; + break; + } } } + } + else if (device_param->opencl_platform_vendor_id == VENDOR_ID_AMD) + { + if (backend_ctx->hip_devices_cnt > 0 && backend_ctx->hip_devices_active > 0) + { + for (int hip_devices_idx = 0; hip_devices_idx < backend_ctx->hip_devices_cnt; hip_devices_idx++) + { + const int tmp_backend_devices_idx = backend_ctx->backend_device_from_hip[hip_devices_idx]; - hcfree (tmp_device); + hc_device_param_t *tmp_device_param = backend_ctx->devices_param + tmp_backend_devices_idx; + + if (is_same_device (device_param, tmp_device_param)) + { + device_param->device_available_mem = tmp_device_param->device_available_mem; + updated_device_available_mem = true; + break; + } + } + } } } - hc_clReleaseCommandQueue (hashcat_ctx, command_queue); + // if not found ... use old strategy - hc_clReleaseContext (hashcat_ctx, context); - - if (device_param->device_host_unified_memory == 1) + if (updated_device_available_mem == false) { - // so, we actually have only half the memory because we need the same buffers on host side + // This test causes an GPU memory usage spike. + // In case there are multiple hashcat instances starting at the same time this will cause GPU out of memory errors which otherwise would not exist. + // We will simply not run it if that device was skipped by the user. - device_param->device_available_mem /= 2; + if (device_param->device_global_mem) + { + #define MAX_ALLOC_CHECKS_CNT 8192 + #define MAX_ALLOC_CHECKS_SIZE (64 * 1024 * 1024) + + device_param->device_available_mem = device_param->device_global_mem - MAX_ALLOC_CHECKS_SIZE; + + if (user_options->backend_devices_keepfree < 100) + { + device_param->device_available_mem = (device_param->device_global_mem * (100 - user_options->backend_devices_keepfree)) / 100; + } + // this section is creating more problems than it solves, so lets use a fixed multiplier instead + // users can override with --backend-devices-keepfree=100 + else if ((device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) && (device_param->device_host_unified_memory == 0)) + { + // OK, so the problem here is the following: + // There's just CL_DEVICE_GLOBAL_MEM_SIZE to ask OpenCL about the total memory on the device, + // but there's no way to ask for available memory on the device. + // In combination, most OpenCL runtimes implementation of clCreateBuffer() + // are doing so called lazy memory allocation on the device. + // Now, if the user has X11 (or a game or anything that takes a lot of GPU memory) + // running on the host we end up with an error type of this: + // clEnqueueNDRangeKernel(): CL_MEM_OBJECT_ALLOCATION_FAILURE + // The clEnqueueNDRangeKernel() is because of the lazy allocation + // The best way to workaround this problem is if we would be able to ask for available memory, + // The idea here is to try to evaluate available memory by allocating it till it errors + + cl_mem *tmp_device = (cl_mem *) hccalloc (MAX_ALLOC_CHECKS_CNT, sizeof (cl_mem)); + + u64 c; + + for (c = 0; c < MAX_ALLOC_CHECKS_CNT; c++) + { + if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= device_param->device_global_mem) break; + + // work around, for some reason apple opencl can't have buffers larger 2^31 + // typically runs into trap 6 + // maybe 32/64 bit problem affecting size_t? + // this seems to affect global memory as well no just single allocations + // this is really ugly, and still in place 2025/06/09 + // Version.: OpenCL 1.2 (Apr 18 2025 21:45:30) + // Driver.Version.: 1.2 (Apr 22 2025 20:11:41) + + if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->is_metal == false)) + { + const size_t undocumented_single_allocation_apple = 0x7fffffff; + + if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= undocumented_single_allocation_apple) break; + } + + cl_int CL_err; + + OCL_PTR *ocl = (OCL_PTR *) backend_ctx->ocl; + + tmp_device[c] = ocl->clCreateBuffer (context, CL_MEM_READ_WRITE, MAX_ALLOC_CHECKS_SIZE, NULL, &CL_err); + + if (CL_err != CL_SUCCESS) + { + c--; + + break; + } + + // transfer only a few byte should be enough to force the runtime to actually allocate the memory + + u8 tmp_host[8]; + + if (ocl->clEnqueueReadBuffer (command_queue, tmp_device[c], CL_TRUE, 0, sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; + if (ocl->clEnqueueWriteBuffer (command_queue, tmp_device[c], CL_TRUE, 0, sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; + + if (ocl->clEnqueueReadBuffer (command_queue, tmp_device[c], CL_TRUE, MAX_ALLOC_CHECKS_SIZE - sizeof (tmp_host), sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; + if (ocl->clEnqueueWriteBuffer (command_queue, tmp_device[c], CL_TRUE, MAX_ALLOC_CHECKS_SIZE - sizeof (tmp_host), sizeof (tmp_host), tmp_host, 0, NULL, NULL) != CL_SUCCESS) break; + } + + device_param->device_available_mem = MAX_ALLOC_CHECKS_SIZE; + + if (c > 0) + { + device_param->device_available_mem *= c; + } + + // clean up + + for (c = 0; c < MAX_ALLOC_CHECKS_CNT; c++) + { + if (((c + 1 + 1) * MAX_ALLOC_CHECKS_SIZE) >= device_param->device_global_mem) break; + + if (tmp_device[c] != NULL) + { + if (hc_clReleaseMemObject (hashcat_ctx, tmp_device[c]) == -1) return -1; + } + } + + hcfree (tmp_device); + } + } + + hc_clReleaseCommandQueue (hashcat_ctx, command_queue); + + hc_clReleaseContext (hashcat_ctx, context); + + if (device_param->device_host_unified_memory == 1) + { + // so, we actually have only half the memory because we need the same buffers on host side + + device_param->device_available_mem /= 2; + } } } } @@ -8217,6 +8897,11 @@ void backend_ctx_devices_destroy (hashcat_ctx_t *hashcat_ctx) hcfree (device_param->opencl_device_c_version); hcfree (device_param->opencl_device_vendor); } + + if (device_param->is_hip == true) + { + hcfree (device_param->gcnArchName); + } } backend_ctx->backend_devices_cnt = 0; @@ -8240,8 +8925,10 @@ void backend_ctx_devices_destroy (hashcat_ctx_t *hashcat_ctx) void backend_ctx_devices_sync_tuning (hashcat_ctx_t *hashcat_ctx) { - backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; - hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + user_options_t *user_options = hashcat_ctx->user_options; if (backend_ctx->enabled == false) return; @@ -8274,6 +8961,38 @@ void backend_ctx_devices_sync_tuning (hashcat_ctx_t *hashcat_ctx) device_param_dst->kernel_power = kernel_power; } } + + // bridge overrides everything + + if (hashconfig->bridge_type) + { + for (int backend_devices_cnt = 0; backend_devices_cnt < backend_ctx->backend_devices_cnt; backend_devices_cnt++) + { + hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_cnt]; + + if (device_param->skipped == true) continue; + if (device_param->skipped_warning == true) continue; + + int workitem_count = bridge_ctx->get_workitem_count (bridge_ctx->platform_context, device_param->bridge_link_device); + + if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_001) workitem_count = 1; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_002) workitem_count = 2; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_004) workitem_count = 4; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_008) workitem_count = 8; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_016) workitem_count = 16; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_032) workitem_count = 32; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_064) workitem_count = 64; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_128) workitem_count = 128; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_256) workitem_count = 256; + + if ((int) device_param->kernel_power < workitem_count) + { + if (user_options->quiet == false) event_log_warning (hashcat_ctx, "* Device #%u/Bridge #%u: kernel_power:%" PRIu64 " < workitem_count:%d", device_param->device_id + 1, device_param->bridge_link_device + 1, device_param->kernel_power, workitem_count); + } + + device_param->kernel_power = workitem_count; + } + } } void backend_ctx_devices_update_power (hashcat_ctx_t *hashcat_ctx) @@ -8488,6 +9207,7 @@ static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_p static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const char *kernel_name, char *source_file, char *cached_file, const char *build_options_buf, const bool cache_disable, cl_program *opencl_program, CUmodule *cuda_module, hipModule_t *hip_module, MAYBE_UNUSED void *metal_library) #endif { + const backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const user_options_t *user_options = hashcat_ctx->user_options; const folder_config_t *folder_config = hashcat_ctx->folder_config; @@ -8535,27 +9255,46 @@ static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_p if (hc_nvrtcCreateProgram (hashcat_ctx, &program, kernel_sources[0], kernel_name, 0, NULL, NULL) == -1) return false; - char **nvrtc_options = (char **) hccalloc (7 + strlen (build_options_buf) + 1, sizeof (char *)); // ... + char **nvrtc_options = (char **) hccalloc (16 + strlen (build_options_buf) + 1, sizeof (char *)); // ... - nvrtc_options[0] = "--restrict"; - nvrtc_options[1] = "--device-as-default-execution-space"; - nvrtc_options[2] = "--gpu-architecture"; + int nvrtc_options_idx = 0; - hc_asprintf (&nvrtc_options[3], "compute_%d%d", device_param->sm_major, device_param->sm_minor); + if (backend_ctx->nvrtc_driver_version >= 12000) + { + nvrtc_options[nvrtc_options_idx++] = "--std=c++14"; + } + + //nvrtc_options[nvrtc_options_idx++] = "--restrict"; + nvrtc_options[nvrtc_options_idx++] = "--gpu-architecture"; + + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "compute_%d", (device_param->sm_major * 10) + device_param->sm_minor); + + if (backend_ctx->nvrtc_driver_version >= 12010) + { + nvrtc_options[nvrtc_options_idx++] = "--split-compile"; + + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "%d", 0); + } + + if (backend_ctx->nvrtc_driver_version >= 12040) + { + nvrtc_options[nvrtc_options_idx++] = "--minimal"; + } // untested on windows, but it should work #if defined (_WIN) || defined (__CYGWIN__) || defined (__MSYS__) - hc_asprintf (&nvrtc_options[4], "-D INCLUDE_PATH=%s", "OpenCL"); + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "-D INCLUDE_PATH=%s", "OpenCL"); #else - hc_asprintf (&nvrtc_options[4], "-D INCLUDE_PATH=%s", folder_config->cpath_real); + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "-D INCLUDE_PATH=%s", folder_config->cpath_real); #endif - hc_asprintf (&nvrtc_options[5], "-D XM2S(x)=#x"); - hc_asprintf (&nvrtc_options[6], "-D M2S(x)=XM2S(x)"); + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "-D XM2S(x)=#x"); + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "-D M2S(x)=XM2S(x)"); + hc_asprintf (&nvrtc_options[nvrtc_options_idx++], "-D MAX_THREADS_PER_BLOCK=%d", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); char *nvrtc_options_string = hcstrdup (build_options_buf); - const int num_options = 7 + nvrtc_make_options_array_from_string (nvrtc_options_string, nvrtc_options + 7); + const int num_options = nvrtc_options_idx + nvrtc_make_options_array_from_string (nvrtc_options_string, nvrtc_options + nvrtc_options_idx); const int rc_nvrtcCompileProgram = hc_nvrtcCompileProgram (hashcat_ctx, program, num_options, (const char * const *) nvrtc_options); @@ -8777,42 +9516,28 @@ static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_p if (hc_hiprtcCreateProgram (hashcat_ctx, &program, kernel_sources[0], kernel_name, 0, NULL, NULL) == -1) return false; - char **hiprtc_options = (char **) hccalloc (8 + strlen (build_options_buf) + 1, sizeof (char *)); // ... + char **hiprtc_options = (char **) hccalloc (16 + strlen (build_options_buf) + 1, sizeof (char *)); // ... - //hiprtc_options[0] = "--restrict"; - //hiprtc_options[1] = "--device-as-default-execution-space"; - //hiprtc_options[2] = "--gpu-architecture"; + int hiprtc_options_idx = 0; - hc_asprintf (&hiprtc_options[0], "--gpu-max-threads-per-block=%d", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); - - /* 4.3 linux - hiprtc_options[1] = "-I"; - hiprtc_options[2] = "/opt/rocm/hip/bin/include"; - hiprtc_options[3] = "-I"; - hiprtc_options[4] = "/opt/rocm/include"; - hiprtc_options[5] = "-I"; - */ - - hiprtc_options[1] = ""; - hiprtc_options[2] = ""; - hiprtc_options[3] = ""; - hiprtc_options[4] = ""; - hiprtc_options[5] = ""; + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "-D MAX_THREADS_PER_BLOCK=%d", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "--gpu-architecture=%s", device_param->gcnArchName); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "--gpu-max-threads-per-block=%d", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); // untested but it should work #if defined (_WIN) || defined (__CYGWIN__) || defined (__MSYS__) - hc_asprintf (&hiprtc_options[5], "-D INCLUDE_PATH=%s/OpenCL/", folder_config->cwd); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "-D INCLUDE_PATH=%s/OpenCL/", folder_config->cwd); // ugly, but required since HIPRTC is changing the current working folder to the temporary compile folder #else - hc_asprintf (&hiprtc_options[5], "-D INCLUDE_PATH=%s", folder_config->cpath_real); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "-D INCLUDE_PATH=%s", folder_config->cpath_real); #endif - hc_asprintf (&hiprtc_options[6], "-D XM2S(x)=#x"); - hc_asprintf (&hiprtc_options[7], "-D M2S(x)=XM2S(x)"); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "-D XM2S(x)=#x"); + hc_asprintf (&hiprtc_options[hiprtc_options_idx++], "-D M2S(x)=XM2S(x)"); char *hiprtc_options_string = hcstrdup (build_options_buf); - const int num_options = 8 + hiprtc_make_options_array_from_string (hiprtc_options_string, hiprtc_options + 8); + const int num_options = hiprtc_options_idx + hiprtc_make_options_array_from_string (hiprtc_options_string, hiprtc_options + hiprtc_options_idx); const int rc_hiprtcCompileProgram = hc_hiprtcCompileProgram (hashcat_ctx, program, num_options, (const char * const *) hiprtc_options); @@ -9172,6 +9897,7 @@ static bool load_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_p int backend_session_begin (hashcat_ctx_t *hashcat_ctx) { const bitmap_ctx_t *bitmap_ctx = hashcat_ctx->bitmap_ctx; + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; const folder_config_t *folder_config = hashcat_ctx->folder_config; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hashes_t *hashes = hashcat_ctx->hashes; @@ -9216,6 +9942,18 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) const int device_id = device_param->device_id; + /** + * Query used memory from the device using low-level API and update device_available_mem + * If there's no low-level API available we will silently ignore + */ + + const u64 used_bytes = hm_get_memoryused_with_devices_idx (hashcat_ctx, device_id); + + if (used_bytes) + { + device_param->device_available_mem = MIN (device_param->device_available_mem, device_param->device_global_mem - used_bytes); + } + /** * module depending checks */ @@ -9257,7 +9995,64 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (module_ctx->module_extra_tuningdb_block != MODULE_DEFAULT) { - const char *extra_tuningdb_block = module_ctx->module_extra_tuningdb_block (hashconfig, user_options, user_options_extra); + // We need this because we can't trust CUDA/HIP to give us the real free device memory + // The only way to do so is through low level APIs + + for (int i = 0; i < 10; i++) + { + const u64 used_bytes = hm_get_memoryused_with_devices_idx (hashcat_ctx, device_id); + + if (used_bytes) + { + if ((used_bytes > (3ULL * 1024 * 1024 * 1024)) + || (used_bytes > (device_param->device_global_mem * 0.5))) + { + event_log_warning (hashcat_ctx, "* Device #%u: Memory usage is too high: %" PRIu64 "/%" PRIu64 ", waiting...", device_id + 1, used_bytes, device_param->device_global_mem); + + sleep (1); + + continue; + } + + device_param->device_available_mem = MIN (device_param->device_available_mem, device_param->device_global_mem - used_bytes); + + break; + } + else + { + if (user_options->backend_devices_keepfree == 0) + { + const u64 device_available_mem_sav = device_param->device_available_mem; + + const u64 device_available_mem_new = device_available_mem_sav - (device_available_mem_sav * 0.2); + + event_log_warning (hashcat_ctx, "* Device #%u: This system does not offer any reliable method to query actual free memory. Estimated base: %" PRIu64, device_id + 1, device_available_mem_sav); + event_log_warning (hashcat_ctx, " Assuming normal desktop activity, reducing estimate by 20%%: %" PRIu64, device_available_mem_new); + event_log_warning (hashcat_ctx, " This can hurt performance drastically, especially on memory-heavy algorithms."); + event_log_warning (hashcat_ctx, " You can adjust this percentage using --backend-devices-keepfree"); + event_log_warning (hashcat_ctx, NULL); + + device_param->device_available_mem = device_available_mem_new; + } + + break; + } + } + + u32 _kernel_accel = 0; + + if (user_options->kernel_accel_chgd == true) + { + _kernel_accel = user_options->kernel_accel; + } + else + { + tuning_db_entry_t *tuningdb_entry = tuning_db_search (hashcat_ctx, device_param->device_name, device_param->opencl_device_type, user_options->attack_mode, hashconfig->hash_mode); + + if (tuningdb_entry != NULL) _kernel_accel = tuningdb_entry->kernel_accel; + } + + const char *extra_tuningdb_block = module_ctx->module_extra_tuningdb_block (hashconfig, user_options, user_options_extra, backend_ctx, hashes, device_id, _kernel_accel); char *lines_buf = hcstrdup (extra_tuningdb_block); @@ -9277,7 +10072,13 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (next[0] == '#') continue; - tuning_db_process_line (hashcat_ctx, next, line_num); + char *search_name = NULL; + + hc_asprintf (&search_name, "MODULE_%02d_%s", device_param->device_id, next); + + tuning_db_process_line (hashcat_ctx, search_name, line_num); + + hcfree (search_name); } while ((next = strtok_r ((char *) NULL, "\n", &saveptr)) != NULL); @@ -9438,13 +10239,31 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) tuning_db_entry_t *tuningdb_entry = NULL; - if (user_options->slow_candidates == true) + for (int i = 0; i < 2; i++) { - tuningdb_entry = tuning_db_search (hashcat_ctx, device_param->device_name, device_param->opencl_device_type, 0, hashconfig->hash_mode); - } - else - { - tuningdb_entry = tuning_db_search (hashcat_ctx, device_param->device_name, device_param->opencl_device_type, user_options->attack_mode, hashconfig->hash_mode); + char *search_name = NULL; + + if (i == 0) + { + hc_asprintf (&search_name, "MODULE_%02d_%s", device_param->device_id, device_param->device_name); + } + else + { + search_name = device_param->device_name; + } + + if (user_options->slow_candidates == true) + { + tuningdb_entry = tuning_db_search (hashcat_ctx, search_name, device_param->opencl_device_type, 0, hashconfig->hash_mode); + } + else + { + tuningdb_entry = tuning_db_search (hashcat_ctx, search_name, device_param->opencl_device_type, user_options->attack_mode, hashconfig->hash_mode); + } + + if (i == 0) hcfree (search_name); + + if (tuningdb_entry != NULL) break; } // user commandline option override tuning db @@ -9501,6 +10320,37 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) } } } + + if (hashconfig->bridge_type & BRIDGE_TYPE_MATCH_TUNINGS) + { + u32 workitem_count = bridge_ctx->get_workitem_count (bridge_ctx->platform_context, device_param->bridge_link_device); + + if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_001) workitem_count = 1; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_002) workitem_count = 2; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_004) workitem_count = 4; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_008) workitem_count = 8; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_016) workitem_count = 16; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_032) workitem_count = 32; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_064) workitem_count = 64; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_128) workitem_count = 128; + else if (hashconfig->bridge_type & BRIDGE_TYPE_FORCE_WORKITEMS_256) workitem_count = 256; + + u32 native_threads = 0; + + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) + { + native_threads = 1; + } + else if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) + { + native_threads = device_param->kernel_preferred_wgs_multiple; + } + + const u32 _kernel_accel = ((workitem_count + native_threads - 1) / native_threads) * native_threads; + + device_param->kernel_accel_min = _kernel_accel; + device_param->kernel_accel_max = _kernel_accel; + } } if (user_options->kernel_loops_chgd == true) @@ -9627,8 +10477,24 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) } else { - if (device_param->is_hip == true) + // v7 test, needs some larger test, but I think we will need to stick to this + + if (device_param->is_cuda == true) { + // we will find this after loading the kernel with suppport of runtime api + } + else if (device_param->is_hip == true) + { + // we will find this after loading the kernel with suppport of runtime api + } + else if (device_param->is_opencl == true) + { + // we will find this after loading the kernel with suppport of runtime api + } + else if (device_param->is_metal == true) + { + // metal: todo - remove this section after below section is implemented + const u32 native_threads = device_param->kernel_preferred_wgs_multiple; if ((native_threads >= device_param->kernel_threads_min) && (native_threads <= device_param->kernel_threads_max)) @@ -9857,8 +10723,9 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) u32 aligned_rules_cnt = MAX (MAX (straight_ctx->kernel_rules_cnt, device_param->kernel_loops_min), KERNEL_RULES); - u64 size_rules = (u64) aligned_rules_cnt * sizeof (kernel_rule_t); - u64 size_rules_c = (u64) KERNEL_RULES * sizeof (kernel_rule_t); + u64 size_rules = (u64) aligned_rules_cnt * sizeof (kernel_rule_t); + u64 size_rules_src = (u64) straight_ctx->kernel_rules_cnt * sizeof (kernel_rule_t); // size of source rules buffer can be less than aligned_rules_cnt + u64 size_rules_c = (u64) KERNEL_RULES * sizeof (kernel_rule_t); device_param->size_rules = size_rules; device_param->size_rules_c = size_rules_c; @@ -9895,7 +10762,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) // extra buffer - u64 size_extra_buffer = 4; + u64 size_extra_buffer1 = 4096; + u64 size_extra_buffer2 = 4096; + u64 size_extra_buffer3 = 4096; + u64 size_extra_buffer4 = 4096; if (module_ctx->module_extra_buffer_size != MODULE_DEFAULT) { @@ -9913,20 +10783,51 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) device_param->extra_buffer_size = extra_buffer_size; - // for the size we actually allocate we need to cheat a bit in order to make it more easy for plugin developer. - // - // we will divide this size by 4 to workaround opencl limitation. - // this collides with a theoretical scenario (like -n1 -T1) where there's only one workitem, - // because inside the kernel the target buffer is selected by workitem_id / 4. - // but the maximum size of the buffer would be only 1/4 of what is needed -> overflow. - // - // to workaround this we make sure that there's always a full buffer in each of the 4 allocated buffers available. + /** + * We use a "4-buffer" strategy for certain hash types (like scrypt) + * that require large scratch buffers per work-item. + * + * The kernel assigns each work-item to one of 4 sub-buffers using: + * buffer index = workitem_id % 4 + * + * This means that each of the 4 sub-buffers must be large enough to hold + * all work-items that map to it. However, the total number of work-items + * is not always a multiple of 4. If we naively split the total buffer size + * evenly into 4 parts, the last chunk may be too small and cause buffer + * overflows for configurations where work-items spill into a partially sized chunk. + * + * Previous versions worked around this by over-allocating a full extra buffer, + * but this wasted gpu memory for large hashes like scrypt with high N. + * + * This improved logic computes the exact number of work-items assigned to + * each of the 4 chunks and sizes each chunk precisely: + * + * - The first 'leftover' chunks get one extra work-item to cover any remainder. + * - This guarantees each chunk is large enough for its assigned work-items. + */ - const u64 kernel_power_max = ((hashconfig->opts_type & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; + const u64 kernel_power_max = ((hashconfig->opts_type & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_accel_max; - const u64 extra_buffer_size_one = extra_buffer_size / kernel_power_max; + const u64 extra_buffer_size_threads = extra_buffer_size / kernel_power_max; - size_extra_buffer = extra_buffer_size + (extra_buffer_size_one * 4); + const u64 workitems_per_chunk = kernel_power_max / 4; + + const u64 base_chunk_size = workitems_per_chunk * extra_buffer_size_threads; + + size_extra_buffer1 += base_chunk_size; + size_extra_buffer2 += base_chunk_size; + size_extra_buffer3 += base_chunk_size; + size_extra_buffer4 += base_chunk_size; + + const u64 leftover = kernel_power_max % 4; + + switch (leftover) + { + case 3: size_extra_buffer3 += extra_buffer_size_threads; // fall-through + case 2: size_extra_buffer2 += extra_buffer_size_threads; // fall-through + case 1: size_extra_buffer1 += extra_buffer_size_threads; // fall-through + case 0: break; + } } // kern type @@ -9993,6 +10894,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) build_options_len += snprintf (build_options_buf + build_options_len, build_options_sz - build_options_len, "-D XM2S(x)=#x "); build_options_len += snprintf (build_options_buf + build_options_len, build_options_sz - build_options_len, "-D M2S(x)=XM2S(x) "); + build_options_len += snprintf (build_options_buf + build_options_len, build_options_sz - build_options_len, "-D MAX_THREADS_PER_BLOCK=%d ", (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); #if defined (__APPLE__) if (is_apple_silicon () == true) @@ -10053,17 +10955,21 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) char device_name_chksum_amp_mp[HCBUFSIZ_TINY] = { 0 }; - const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%u", + const size_t dnclen_amp_mp = snprintf (device_name_chksum_amp_mp, HCBUFSIZ_TINY, "%d-%d-%d-%u-%u-%u-%s-%d-%u-%s-%s-%s-%u-%u", backend_ctx->comptime, backend_ctx->cuda_driver_version, backend_ctx->hip_runtimeVersion, backend_ctx->metal_runtimeVersion, + device_param->sm_major, + device_param->sm_minor, + (device_param->is_hip == true) ? device_param->gcnArchName : "", device_param->is_opencl, device_param->opencl_platform_vendor_id, device_param->device_name, device_param->opencl_device_version, device_param->opencl_driver_version, - (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max); + (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max, + get_current_arch()); md5_ctx_t md5_ctx; @@ -10615,11 +11521,14 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) const u32 extra_value = (user_options->attack_mode == ATTACK_MODE_ASSOCIATION) ? ATTACK_MODE_ASSOCIATION : ATTACK_MODE_NONE; - const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY, "%d-%d-%d-%u-%d-%u-%s-%s-%s-%d-%u-%u-%u-%s", + const size_t dnclen = snprintf (device_name_chksum, HCBUFSIZ_TINY, "%d-%d-%d-%u-%u-%u-%s-%d-%u-%s-%s-%s-%d-%u-%u-%u-%u-%s", backend_ctx->comptime, backend_ctx->cuda_driver_version, backend_ctx->hip_runtimeVersion, backend_ctx->metal_runtimeVersion, + device_param->sm_major, + device_param->sm_minor, + (device_param->is_hip == true) ? device_param->gcnArchName : "", device_param->is_opencl, device_param->opencl_platform_vendor_id, device_param->device_name, @@ -10629,6 +11538,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) hashconfig->kern_type, extra_value, (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : device_param->kernel_threads_max, + get_current_arch(), build_options_module_buf); memset (&md5_ctx, 0, sizeof (md5_ctx_t)); @@ -10831,7 +11741,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) + size_shown + size_salts + size_results - + size_extra_buffer + + size_extra_buffer1 + + size_extra_buffer2 + + size_extra_buffer3 + + size_extra_buffer4 + size_st_digests + size_st_salts + size_st_esalts @@ -10868,10 +11781,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_digests_shown, size_shown) == -1) return -1; if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_salt_bufs, size_salts) == -1) return -1; if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_result, size_results) == -1) return -1; - if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra0_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra1_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra2_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra3_buf, size_extra_buffer / 4) == -1) return -1; + if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra0_buf, size_extra_buffer1) == -1) return -1; + if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra1_buf, size_extra_buffer2) == -1) return -1; + if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra2_buf, size_extra_buffer3) == -1) return -1; + if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_extra3_buf, size_extra_buffer4) == -1) return -1; if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_st_digests_buf, size_st_digests) == -1) return -1; if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_st_salts_buf, size_st_salts) == -1) return -1; if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_kernel_param, size_kernel_params) == -1) return -1; @@ -10912,7 +11825,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_cuMemAlloc (hashcat_ctx, &device_param->cuda_d_rules_c, size_rules_c) == -1) return -1; } - if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_rules, straight_ctx->kernel_rules_buf, size_rules, device_param->cuda_stream) == -1) return -1; + if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_rules, straight_ctx->kernel_rules_buf, size_rules_src, device_param->cuda_stream) == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { @@ -10979,10 +11892,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_digests_shown, size_shown) == -1) return -1; if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_salt_bufs, size_salts) == -1) return -1; if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_result, size_results) == -1) return -1; - if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra0_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra1_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra2_buf, size_extra_buffer / 4) == -1) return -1; - if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra3_buf, size_extra_buffer / 4) == -1) return -1; + if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra0_buf, size_extra_buffer1) == -1) return -1; + if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra1_buf, size_extra_buffer2) == -1) return -1; + if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra2_buf, size_extra_buffer3) == -1) return -1; + if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_extra3_buf, size_extra_buffer4) == -1) return -1; if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_st_digests_buf, size_st_digests) == -1) return -1; if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_st_salts_buf, size_st_salts) == -1) return -1; if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_kernel_param, size_kernel_params) == -1) return -1; @@ -11023,7 +11936,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_hipMemAlloc (hashcat_ctx, &device_param->hip_d_rules_c, size_rules_c) == -1) return -1; } - if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_rules, straight_ctx->kernel_rules_buf, size_rules, device_param->hip_stream) == -1) return -1; + if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_rules, straight_ctx->kernel_rules_buf, size_rules_src, device_param->hip_stream) == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { @@ -11102,10 +12015,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) // shared if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_results, NULL, &device_param->metal_d_result) == -1) return -1; - if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer / 4, NULL, &device_param->metal_d_extra0_buf) == -1) return -1; - if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer / 4, NULL, &device_param->metal_d_extra1_buf) == -1) return -1; - if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer / 4, NULL, &device_param->metal_d_extra2_buf) == -1) return -1; - if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer / 4, NULL, &device_param->metal_d_extra3_buf) == -1) return -1; + if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer1, NULL, &device_param->metal_d_extra0_buf) == -1) return -1; + if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer2, NULL, &device_param->metal_d_extra1_buf) == -1) return -1; + if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer3, NULL, &device_param->metal_d_extra2_buf) == -1) return -1; + if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_extra_buffer4, NULL, &device_param->metal_d_extra3_buf) == -1) return -1; // gpu only if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_st_digests, NULL, &device_param->metal_d_st_digests_buf) == -1) return -1; @@ -11140,7 +12053,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_rules, NULL, &device_param->metal_d_rules) == -1) return -1; if (hc_mtlCreateBuffer (hashcat_ctx, device_param->metal_device, size_rules_c, NULL, &device_param->metal_d_rules_c) == -1) return -1; - if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_rules, 0, straight_ctx->kernel_rules_buf, size_rules) == -1) return -1; + if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_rules, 0, straight_ctx->kernel_rules_buf, size_rules_src) == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { @@ -11200,10 +12113,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_shown, NULL, &device_param->opencl_d_digests_shown) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_salts, NULL, &device_param->opencl_d_salt_bufs) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_results, NULL, &device_param->opencl_d_result) == -1) return -1; - if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer / 4, NULL, &device_param->opencl_d_extra0_buf) == -1) return -1; - if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer / 4, NULL, &device_param->opencl_d_extra1_buf) == -1) return -1; - if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer / 4, NULL, &device_param->opencl_d_extra2_buf) == -1) return -1; - if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer / 4, NULL, &device_param->opencl_d_extra3_buf) == -1) return -1; + if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer1, NULL, &device_param->opencl_d_extra0_buf) == -1) return -1; + if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer2, NULL, &device_param->opencl_d_extra1_buf) == -1) return -1; + if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer3, NULL, &device_param->opencl_d_extra2_buf) == -1) return -1; + if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_WRITE, size_extra_buffer4, NULL, &device_param->opencl_d_extra3_buf) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_st_digests, NULL, &device_param->opencl_d_st_digests_buf) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_st_salts, NULL, &device_param->opencl_d_st_salts_buf) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_kernel_params, NULL, &device_param->opencl_d_kernel_param) == -1) return -1; @@ -11234,7 +12147,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_rules, NULL, &device_param->opencl_d_rules) == -1) return -1; if (hc_clCreateBuffer (hashcat_ctx, device_param->opencl_context, CL_MEM_READ_ONLY, size_rules_c, NULL, &device_param->opencl_d_rules_c) == -1) return -1; - if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_rules, CL_FALSE, 0, size_rules, straight_ctx->kernel_rules_buf, 0, NULL, NULL) == -1) return -1; + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_rules, CL_FALSE, 0, size_rules_src, straight_ctx->kernel_rules_buf, 0, NULL, NULL) == -1) return -1; } else if (user_options_extra->attack_kern == ATTACK_KERN_COMBI) { @@ -15015,6 +15928,75 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) } } + u32 threads_per_block = 32; + + if (device_param->is_cuda == true) + { + const int kern_run = find_tuning_function (hashcat_ctx, device_param); + + CUfunction func = cuda_function_with_id (device_param, kern_run); + + threads_per_block = cuda_query_threads_per_block (hashcat_ctx, func); + + const u32 num_regs = cuda_query_num_regs (hashcat_ctx, func); + + if (num_regs) + { + u32 threads_per_block_with_regs = (floor) ((float) device_param->regsPerBlock / num_regs); + + if (threads_per_block_with_regs > device_param->kernel_preferred_wgs_multiple) threads_per_block_with_regs -= threads_per_block_with_regs % device_param->kernel_preferred_wgs_multiple; + + threads_per_block = MIN (threads_per_block, threads_per_block_with_regs); + } + } + else if (device_param->is_hip == true) + { + const int kern_run = find_tuning_function (hashcat_ctx, device_param); + + hipFunction_t func = hip_function_with_id (device_param, kern_run); + + threads_per_block = hip_query_threads_per_block (hashcat_ctx, func); + + const u32 num_regs = hip_query_num_regs (hashcat_ctx, func); + + if (num_regs) + { + u32 threads_per_block_with_regs = (floor) ((float) device_param->regsPerBlock / num_regs); + + if (threads_per_block_with_regs > device_param->kernel_preferred_wgs_multiple) threads_per_block_with_regs -= threads_per_block_with_regs % device_param->kernel_preferred_wgs_multiple; + + threads_per_block = MIN (threads_per_block, threads_per_block_with_regs); + } + } + else if (device_param->is_opencl == true) + { + const int kern_run = find_tuning_function (hashcat_ctx, device_param); + + cl_kernel kernel = opencl_kernel_with_id (device_param, kern_run); + + threads_per_block = opencl_query_threads_per_block (hashcat_ctx, device_param, kernel); + + // num_regs check should be included in opencl's CL_KERNEL_WORK_GROUP_SIZE + } + else if (device_param->is_metal == true) + { + threads_per_block = device_param->kernel_preferred_wgs_multiple; + } + + if ((threads_per_block >= device_param->kernel_threads_min) && (threads_per_block <= device_param->kernel_threads_max)) + { + //printf ("auto thread max: %d\n", threads_per_block); + device_param->kernel_threads_max = threads_per_block; + } + + const u32 threads_per_block_p2f = threads_per_block / (threads_per_block & -threads_per_block); + + if ((threads_per_block_p2f >= device_param->kernel_threads_min) && (threads_per_block_p2f <= device_param->kernel_threads_max)) + { + //printf ("auto thread min: %d\n", threads_per_block_p2f); + device_param->kernel_threads_min = threads_per_block_p2f; + } + // this is required because inside the kernels there is this: // __local pw_t s_pws[64]; @@ -15060,61 +16042,25 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) u32 kernel_accel_min = device_param->kernel_accel_min; u32 kernel_accel_max = device_param->kernel_accel_max; - // We need to deal with the situation that the total video RAM > total host RAM. - // For the opposite direction, we do that in the loop section below. - // Especially in multi-GPU setups that is very likely. - // The buffers which actually take a lot of memory (except for SCRYPT) are the ones for the password candidates. - // They are stored in an aligned order for better performance, but this increases the memory pressure. - // The best way to keep these buffers to a reasonable size is by controlling the kernel_accel parameter. - // - // In theory this check could be disabled if we check if total video RAM < total host RAM, - // but at this point of initialization phase we don't have this information available. + // check if there's enough host memory left for upcoming allocations, otherwise reduce skip device and present user an option to deal with - // We need to hard-code some value, let's assume that (in 2021) the host has at least 4GB ram per active GPU + u64 accel_limit_host = 0; - const u64 SIZE_4GB = 4ULL * 1024 * 1024 * 1024; - - u64 accel_limit = SIZE_4GB; - - // in slow candidate mode we need to keep the buffers on the host alive - // a high accel value doesn't help much here anyway - - if (user_options->slow_candidates == true) + if (get_free_memory (&accel_limit_host) == false) { - // Tested with NTLM, almost no difference in performance + const u64 GiB4 = 4ULL * 1024 * 1024 * 1024; - accel_limit /= 8; + event_log_warning (hashcat_ctx, "Couldn't query the OS for free memory, assuming 4GiB"); + + accel_limit_host = GiB4; } - - // this is device_processors * kernel_threads - - accel_limit /= hardware_power_max; - - // single password candidate size - - accel_limit /= sizeof (pw_t); - - // pws[], pws_comp[] and pw_pre[] are some large blocks with password candidates - - accel_limit /= 3; - - // Is possible that the GPU simply has too much hardware resources and 8GB per GPU is not enough, but OTOH we can't get lower than 1 - - accel_limit = MAX (accel_limit, 1); - - // I think vector size is not required because vector_size is dividing the pws_cnt in run_kernel() - - kernel_accel_max = MIN (kernel_accel_max, accel_limit); - - if (kernel_accel_min > kernel_accel_max) + else { - event_log_error (hashcat_ctx, "* Device #%u: Too many compute units to keep minimum kernel accel limit.", device_id + 1); - event_log_error (hashcat_ctx, " Retry with lower --kernel-threads value."); + // even tho let's not be greedy - backend_kernel_accel_warnings++; + const u64 GiB8 = 8ULL * 1024 * 1024 * 1024; - device_param->skipped_warning = true; - continue; + accel_limit_host = MIN (accel_limit_host, GiB8); } // Opposite direction check: find out if we would request too much memory on memory blocks which are based on kernel_accel @@ -15132,10 +16078,38 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) u64 size_brain_link_out = 4; #endif + u32 local_size_bytes = 0; + + if ((device_param->is_cuda == true) || (device_param->is_hip == true) || (device_param->is_opencl == true)) + { + if (device_param->is_cuda == true) local_size_bytes = cuda_query_max_local_size_bytes (hashcat_ctx, device_param); + if (device_param->is_hip == true) local_size_bytes = hip_query_max_local_size_bytes (hashcat_ctx, device_param); + if (device_param->is_opencl == true) local_size_bytes = opencl_query_max_local_size_bytes (hashcat_ctx, device_param); + // metal todo + + // use this parameter to tune down kernel_accel_max, because it has such a huge impact on memory requirement + // let's target a maximum use of memory of 8GiB so that there's some room left for other stuff + + if (local_size_bytes) + { + const u64 SIZE_8GiB = 8ULL * 1024 * 1024 * 1024; + + const u64 max_accel = SIZE_8GiB / (hardware_power_max * local_size_bytes); + + kernel_accel_max = MIN (kernel_accel_max, max_accel); + } + } + + const u64 size_device_extra1234 = size_extra_buffer1 + size_extra_buffer2 + size_extra_buffer3 + size_extra_buffer4; + + const u64 size_device_extra = MAX ((1024 * 1024 * 1024), size_device_extra1234); + while (kernel_accel_max >= kernel_accel_min) { const u64 kernel_power_max = hardware_power_max * kernel_accel_max; + const u64 size_spilling = kernel_power_max * local_size_bytes; + // size_pws size_pws = kernel_power_max * sizeof (pw_t); @@ -15184,11 +16158,12 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. // let's add some extra space just to be sure. // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit + // let's see if we still need this now that we have low-level API to report free memory - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * kernel_accel_max; + u64 EXTRA_SPACE = 4096; //(1024ULL * 1024ULL) * kernel_accel_max; - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 256ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); + //EXTRA_SPACE = MAX (EXTRA_SPACE, ( 256ULL * 1024ULL * 1024ULL)); + //EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); if ((size_pws + EXTRA_SPACE) > device_param->device_maxmem_alloc) memory_limit_hit = 1; if ((size_tmps + EXTRA_SPACE) > device_param->device_maxmem_alloc) memory_limit_hit = 1; @@ -15197,6 +16172,9 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) // work around, for some reason apple opencl can't have buffers larger 2^31 // typically runs into trap 6 // maybe 32/64 bit problem affecting size_t? + // this is really ugly, and still in place 2025/06/09 + // Version.: OpenCL 1.2 (Apr 18 2025 21:45:30) + // Driver.Version.: 1.2 (Apr 22 2025 20:11:41) if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->is_metal == false)) { @@ -15219,7 +16197,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (size_rules > undocumented_single_allocation_apple) memory_limit_hit = 1; if (size_rules_c > undocumented_single_allocation_apple) memory_limit_hit = 1; if (size_salts > undocumented_single_allocation_apple) memory_limit_hit = 1; - if (size_extra_buffer > undocumented_single_allocation_apple) memory_limit_hit = 1; + if (size_extra_buffer1 > undocumented_single_allocation_apple) memory_limit_hit = 1; + if (size_extra_buffer2 > undocumented_single_allocation_apple) memory_limit_hit = 1; + if (size_extra_buffer3 > undocumented_single_allocation_apple) memory_limit_hit = 1; + if (size_extra_buffer4 > undocumented_single_allocation_apple) memory_limit_hit = 1; if (size_shown > undocumented_single_allocation_apple) memory_limit_hit = 1; if (size_tm > undocumented_single_allocation_apple) memory_limit_hit = 1; if (size_tmps > undocumented_single_allocation_apple) memory_limit_hit = 1; @@ -15254,14 +16235,15 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) + size_rules + size_rules_c + size_salts - + size_extra_buffer + + size_device_extra + size_shown + size_tm + size_tmps + size_st_digests + size_st_salts + size_st_esalts - + size_kernel_params; + + size_kernel_params + + size_spilling; if ((size_total + EXTRA_SPACE) > device_param->device_available_mem) memory_limit_hit = 1; @@ -15272,6 +16254,8 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) continue; } + const u64 size_host_extra = (512 * 1024 * 1024); + const u64 size_total_host = size_pws_comp + size_pws_idx @@ -15281,7 +16265,17 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) + size_brain_link_out #endif + size_pws_pre - + size_pws_base; + + size_pws_base + + size_host_extra; + + if ((size_total_host + EXTRA_SPACE) > accel_limit_host) memory_limit_hit = 1; + + if (memory_limit_hit == 1) + { + kernel_accel_max--; + + continue; + } size_total_host_all += size_total_host; @@ -15290,7 +16284,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) if (kernel_accel_max < kernel_accel_min) { - event_log_error (hashcat_ctx, "* Device #%u: Not enough allocatable device memory for this attack.", device_id + 1); + event_log_error (hashcat_ctx, "* Device #%u: Not enough allocatable device memory or free host memory for mapping.", device_id + 1); backend_memory_hit_warnings++; @@ -15408,6 +16402,13 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) * main host data */ + if (hashconfig->bridge_type) + { + void *h_tmps = hcmalloc_aligned (device_param->size_tmps, 64); + + device_param->h_tmps = h_tmps; + } + u32 *pws_comp = (u32 *) hcmalloc (size_pws_comp); device_param->pws_comp = pws_comp; @@ -15742,6 +16743,7 @@ void backend_session_destroy (hashcat_ctx_t *hashcat_ctx) if (device_param->skipped == true) continue; + hcfree_aligned (device_param->h_tmps); hcfree (device_param->pws_comp); hcfree (device_param->pws_idx); hcfree (device_param->pws_pre_buf); @@ -16308,6 +17310,7 @@ void backend_session_destroy (hashcat_ctx_t *hashcat_ctx) device_param->opencl_context = NULL; } + device_param->h_tmps = NULL; device_param->pws_comp = NULL; device_param->pws_idx = NULL; device_param->pws_pre_buf = NULL; diff --git a/src/brain.c b/src/brain.c index fbb1f206a..88b896c55 100644 --- a/src/brain.c +++ b/src/brain.c @@ -3052,6 +3052,8 @@ int brain_server (const char *listen_host, const int listen_port, const char *br { brain_logging (stderr, 0, "setsockopt: %s\n", strerror (errno)); + close(server_fd); + if (brain_password == NULL) hcfree (auth_password); return -1; @@ -3061,6 +3063,8 @@ int brain_server (const char *listen_host, const int listen_port, const char *br { brain_logging (stderr, 0, "setsockopt: %s\n", strerror (errno)); + close(server_fd); + if (brain_password == NULL) hcfree (auth_password); return -1; @@ -3104,6 +3108,8 @@ int brain_server (const char *listen_host, const int listen_port, const char *br { brain_logging (stderr, 0, "%s: %s\n", listen_host, gai_strerror (rc_getaddrinfo)); + close(server_fd); + if (brain_password == NULL) hcfree (auth_password); return -1; @@ -3114,6 +3120,8 @@ int brain_server (const char *listen_host, const int listen_port, const char *br { brain_logging (stderr, 0, "bind: %s\n", strerror (errno)); + close(server_fd); + if (brain_password == NULL) hcfree (auth_password); return -1; @@ -3123,6 +3131,8 @@ int brain_server (const char *listen_host, const int listen_port, const char *br { brain_logging (stderr, 0, "listen: %s\n", strerror (errno)); + close(server_fd); + if (brain_password == NULL) hcfree (auth_password); return -1; diff --git a/src/bridges.c b/src/bridges.c new file mode 100644 index 000000000..9b37aa25a --- /dev/null +++ b/src/bridges.c @@ -0,0 +1,276 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "memory.h" +#include "event.h" +#include "shared.h" +#include "modules.h" +#include "backend.h" +#include "dynloader.h" +#include "bridges.h" +#include "interface.h" + +/** + * parsing + */ + +int bridge_filename (const folder_config_t *folder_config, const char *bridge_name, char *out_buf, const size_t out_size) +{ + // native compiled + #if defined (_WIN) || defined (__CYGWIN__) + return snprintf (out_buf, out_size, "%s/bridges/bridge_%s.dll", folder_config->shared_dir, bridge_name); + #else + return snprintf (out_buf, out_size, "%s/bridges/bridge_%s.so", folder_config->shared_dir, bridge_name); + #endif +} + +bool bridge_load (hashcat_ctx_t *hashcat_ctx, bridge_ctx_t *bridge_ctx, const char *bridge_name) +{ + const folder_config_t *folder_config = hashcat_ctx->folder_config; + + char *bridge_file = (char *) hcmalloc (HCBUFSIZ_TINY); + + bridge_filename (folder_config, bridge_name, bridge_file, HCBUFSIZ_TINY); + + struct stat s; + + memset (&s, 0, sizeof (struct stat)); + + if (stat (bridge_file, &s) == -1) + { + event_log_warning (hashcat_ctx, "The bridge plugin '%s' couldn't be found.", bridge_file); + event_log_warning (hashcat_ctx, NULL); + } + + bridge_ctx->bridge_handle = hc_dlopen (bridge_file); + + if (bridge_ctx->bridge_handle == NULL) + { + #if defined (_WIN) + event_log_error (hashcat_ctx, "Cannot load bridge %s", bridge_file); // todo: maybe there's a dlerror () equivalent + #else + event_log_error (hashcat_ctx, "%s", dlerror ()); + #endif + + return false; + } + + bridge_ctx->bridge_init = (BRIDGE_INIT) hc_dlsym (bridge_ctx->bridge_handle, "bridge_init"); + + if (bridge_ctx->bridge_init == NULL) + { + event_log_error (hashcat_ctx, "Cannot load symbol 'bridge_init' in bridge %s", bridge_file); + + return false; + } + + hcfree (bridge_file); + + return true; +} + +void bridge_unload (bridge_ctx_t *bridge_ctx) +{ + if (bridge_ctx->bridge_handle) + { + hc_dlclose (bridge_ctx->bridge_handle); + } +} + +bool bridges_init (hashcat_ctx_t *hashcat_ctx) +{ + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + user_options_t *user_options = hashcat_ctx->user_options; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + + if (user_options->hash_info == true) return true; + if (user_options->left == true) return true; + if (user_options->show == true) return true; + if (user_options->usage > 0) return true; + if (user_options->version == true) return true; + if (user_options->backend_info > 0) return true; + + // There is a problem here. At this point, hashconfig is not yet initialized. + // This is because initializing hashconfig requires the module to be loaded, + // but in order to load the module, we need to know the backend devices. + // However, the backend devices are also not yet initialized, because + // they require the virtualization count, which we only determine here. + // To break this chicken-and-egg problem, we cheat by quick-loading the module + // and unloading it afterwards, so it can be properly initialized later. + + const int hashconfig_init_rc = hashconfig_init (hashcat_ctx); + + if (hashconfig_init_rc == -1) return false; + + // ok, we can start + + if (hashconfig->bridge_type == BRIDGE_TYPE_NONE) + { + hashconfig_destroy (hashcat_ctx); + + return true; + } + + bridge_ctx->enabled = true; + + // finally, the real stuff + + const bool rc_load = bridge_load (hashcat_ctx, bridge_ctx, hashconfig->bridge_name); + + if (rc_load == false) return false; + + bridge_ctx->bridge_init (bridge_ctx); + + if (bridge_ctx->bridge_context_size != BRIDGE_CONTEXT_SIZE_CURRENT) + { + event_log_error (hashcat_ctx, "bridge context size is invalid. Old template?"); + + return false; + } + + if (bridge_ctx->bridge_interface_version < BRIDGE_INTERFACE_VERSION_MINIMUM) + { + event_log_error (hashcat_ctx, "bridge interface version is outdated, please compile"); + + return false; + } + + // check for missing pointer assignements + + #define CHECK_DEFINED(func) \ + if ((func) == NULL) \ + { \ + event_log_error (hashcat_ctx, "Missing symbol definitions in bridge '%s'. Old template?", hashconfig->bridge_name); \ + \ + return false; \ + } + + CHECK_DEFINED (bridge_ctx->platform_init); + CHECK_DEFINED (bridge_ctx->platform_term); + CHECK_DEFINED (bridge_ctx->get_unit_count); + CHECK_DEFINED (bridge_ctx->get_unit_info); + CHECK_DEFINED (bridge_ctx->get_workitem_count); + CHECK_DEFINED (bridge_ctx->thread_init); + CHECK_DEFINED (bridge_ctx->thread_term); + CHECK_DEFINED (bridge_ctx->salt_prepare); + CHECK_DEFINED (bridge_ctx->salt_destroy); + CHECK_DEFINED (bridge_ctx->launch_loop); + CHECK_DEFINED (bridge_ctx->launch_loop2); + CHECK_DEFINED (bridge_ctx->st_update_hash); + CHECK_DEFINED (bridge_ctx->st_update_pass); + + #undef CHECK_DEFINED + + // mandatory functions check + + #define CHECK_MANDATORY(func) \ + if ((func) == MODULE_DEFAULT) \ + { \ + event_log_error (hashcat_ctx, "Missing mandatory symbol definitions"); \ + \ + return false; \ + } + + CHECK_MANDATORY (bridge_ctx->platform_init); + CHECK_MANDATORY (bridge_ctx->platform_term); + CHECK_MANDATORY (bridge_ctx->get_unit_count); + CHECK_MANDATORY (bridge_ctx->get_unit_info); + CHECK_MANDATORY (bridge_ctx->get_workitem_count); + + if (hashconfig->bridge_type & BRIDGE_TYPE_REPLACE_LOOP) CHECK_MANDATORY (bridge_ctx->launch_loop); + if (hashconfig->bridge_type & BRIDGE_TYPE_REPLACE_LOOP2) CHECK_MANDATORY (bridge_ctx->launch_loop2); + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP) CHECK_MANDATORY (bridge_ctx->launch_loop); + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP2) CHECK_MANDATORY (bridge_ctx->launch_loop2); + + #undef CHECK_MANDATORY + + bridge_ctx->platform_context = bridge_ctx->platform_init (user_options); + + if (bridge_ctx->platform_context == NULL) + { + event_log_error (hashcat_ctx, "Platform initialization failed"); + + return false; + } + + // auto adjust workitem counts + + if (hashconfig->bridge_type & BRIDGE_TYPE_MATCH_TUNINGS) + { + if ((hashconfig->opts_type & OPTS_TYPE_NATIVE_THREADS) == 0) + { + event_log_error (hashcat_ctx, "BRIDGE_TYPE_MATCH_TUNINGS requires OPTS_TYPE_NATIVE_THREADS"); + + return false; + } + + if ((hashconfig->opts_type & OPTS_TYPE_MP_MULTI_DISABLE) == 0) + { + event_log_error (hashcat_ctx, "BRIDGE_TYPE_MATCH_TUNINGS requires OPTS_TYPE_MP_MULTI_DISABLE"); + + return false; + } + } + + // clean up + + hashconfig_destroy (hashcat_ctx); + + return true; +} + +void bridges_destroy (hashcat_ctx_t *hashcat_ctx) +{ + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + + if (bridge_ctx->enabled == false) return; + + bridge_ctx->platform_term (bridge_ctx->platform_context); + + bridge_unload (bridge_ctx); +} + +bool bridges_salt_prepare (hashcat_ctx_t *hashcat_ctx) +{ + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; + user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->hash_info == true) return true; + if (user_options->left == true) return true; + if (user_options->show == true) return true; + if (user_options->usage > 0) return true; + if (user_options->version == true) return true; + if (user_options->backend_info > 0) return true; + + if (bridge_ctx->enabled == false) return true; + + if (bridge_ctx->salt_prepare == MODULE_DEFAULT) return true; + + if (bridge_ctx->salt_prepare (bridge_ctx->platform_context, hashconfig, hashes) == false) + { + event_log_error (hashcat_ctx, "Couldn't prepare salt specific data in bridge"); + + return false; + } + + return true; +} + +void bridges_salt_destroy (hashcat_ctx_t *hashcat_ctx) +{ + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; + + if (bridge_ctx->enabled == false) return; + + if (bridge_ctx->salt_destroy == MODULE_DEFAULT) return; + + bridge_ctx->salt_destroy (bridge_ctx->platform_context, hashconfig, hashes); +} diff --git a/src/bridges/.gitkeep b/src/bridges/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/bridges/bridge_argon2id_reference.c b/src/bridges/bridge_argon2id_reference.c new file mode 100644 index 000000000..06c9eda22 --- /dev/null +++ b/src/bridges/bridge_argon2id_reference.c @@ -0,0 +1,305 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "bridges.h" +#include "memory.h" +#include "shared.h" +#include "cpu_features.h" + +// argon2 reference + +#undef _DEFAULT_SOURCE + +#include "argon2.c" +#include "core.c" +#include "blake2/blake2b.c" +#include "opt.c" + +// good: we can use this multiplier do reduce copy overhead to increase the guessing speed, +// bad: but we also increase the password candidate batch size. +// slow hashes which make use of this bridge probably are used with smaller wordlists, +// and therefore it's easier for hashcat to parallelize if this multiplier is low. +// in the end, it's a trade-off. + +#define N_ACCEL 8 + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 h[64]; + +} argon2_reference_tmp_t; + +typedef struct +{ + u32 salt_buf[64]; + u32 salt_len; + + u32 digest_buf[64]; + u32 digest_len; + + u32 m; + u32 t; + u32 p; + +} argon2_t; + +typedef struct +{ + // template + + char unit_info_buf[1024]; + int unit_info_len; + + u64 workitem_count; + size_t workitem_size; + + // implementation specific + + void *memory; + +} unit_t; + +typedef struct +{ + unit_t *units_buf; + int units_cnt; + +} bridge_argon2id_t; + +static bool units_init (bridge_argon2id_t *bridge_argon2id) +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetSystemInfo (&sysinfo); + + int num_devices = sysinfo.dwNumberOfProcessors; + + #else + + int num_devices = sysconf (_SC_NPROCESSORS_ONLN); + + #endif + + // this works really good for me, I think is because of register pressure on SIMD enabled code + num_devices /= 2; + + // this is just a wild guess, but memory bus will probably bottleneck if we + // have too many cores using it. we set some upper limit which is not ideal, but good enough for now. + //num_devices = MIN (num_devices, 8); + + unit_t *units_buf = (unit_t *) hccalloc (num_devices, sizeof (unit_t)); + + int units_cnt = 0; + + for (int i = 0; i < num_devices; i++) + { + unit_t *unit_buf = &units_buf[i]; + + unit_buf->unit_info_len = snprintf (unit_buf->unit_info_buf, sizeof (unit_buf->unit_info_buf) - 1, + "%s", + "Argon2 reference implementation + tunings"); + + unit_buf->unit_info_buf[unit_buf->unit_info_len] = 0; + + unit_buf->workitem_count = N_ACCEL; + + units_cnt++; + } + + bridge_argon2id->units_buf = units_buf; + bridge_argon2id->units_cnt = units_cnt; + + return true; +} + +static void units_term (bridge_argon2id_t *bridge_argon2id) +{ + if (bridge_argon2id->units_buf) + { + hcfree (bridge_argon2id->units_buf); + } +} + +void *platform_init () +{ + // Verify CPU features + + if (cpu_chipset_test () == -1) return NULL; + + // Allocate platform context + + bridge_argon2id_t *bridge_argon2id = (bridge_argon2id_t *) hcmalloc (sizeof (bridge_argon2id_t)); + + if (units_init (bridge_argon2id) == false) + { + hcfree (bridge_argon2id); + + return NULL; + } + + return bridge_argon2id; +} + +void platform_term (void *platform_context) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + if (bridge_argon2id) + { + units_term (bridge_argon2id); + + hcfree (bridge_argon2id); + } +} + +int get_unit_count (void *platform_context) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + return bridge_argon2id->units_cnt; +} + +// we support units of mixed speed, that's why the workitem count is unit specific + +int get_workitem_count (void *platform_context, const int unit_idx) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + unit_t *unit_buf = &bridge_argon2id->units_buf[unit_idx]; + + return unit_buf->workitem_count; +} + +char *get_unit_info (void *platform_context, const int unit_idx) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + unit_t *unit_buf = &bridge_argon2id->units_buf[unit_idx]; + + return unit_buf->unit_info_buf; +} + +bool salt_prepare (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + // we can use self-test hash as base + + argon2_t *argon2_st = (argon2_t *) hashes->st_esalts_buf; + + size_t largest_m = argon2_st->m; + + // from here regular hashes + + argon2_t *argon2 = (argon2_t *) hashes->esalts_buf; + + for (u32 salt_idx = 0; salt_idx < hashes->salts_cnt; salt_idx++, argon2++) + { + if (argon2->m > largest_m) largest_m = argon2->m; + } + + bridge_argon2id_t *bridge_argon2id = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_argon2id->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_argon2id->units_buf[unit_idx]; + + unit_buf->memory = hcmalloc_aligned ((largest_m * 1024), 32); // because AVX2 + } + + return true; +} + +void salt_destroy (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_argon2id->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_argon2id->units_buf[unit_idx]; + + hcfree_aligned (unit_buf->memory); + } +} + +bool launch_loop (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u64 pws_cnt) +{ + bridge_argon2id_t *bridge_argon2id = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &bridge_argon2id->units_buf[unit_idx]; + + argon2_t *esalts_buf = (argon2_t *) hashes->esalts_buf; + + argon2_t *argon2id = &esalts_buf[salt_pos]; + + argon2_reference_tmp_t *argon2_reference_tmp = (argon2_reference_tmp_t *) device_param->h_tmps; + + argon2_context context; + + context.out = (uint8_t *) NULL; + context.outlen = (uint32_t) 0; + context.pwd = (uint8_t *) NULL; + context.pwdlen = (uint32_t) 0; + context.salt = (uint8_t *) argon2id->salt_buf; + context.saltlen = (uint32_t) argon2id->salt_len; + context.secret = NULL; + context.secretlen = 0; + context.ad = NULL; + context.adlen = 0; + context.t_cost = argon2id->t; + context.m_cost = argon2id->m; + context.lanes = argon2id->p; + context.threads = 1; + context.allocate_cbk = NULL; + context.free_cbk = NULL; + context.flags = ARGON2_DEFAULT_FLAGS; + context.version = ARGON2_VERSION_NUMBER; + context.memory = unit_buf->memory; + + for (u64 i = 0; i < pws_cnt; i++) + { + context.out = (uint8_t *) argon2_reference_tmp->h; + context.outlen = (uint32_t) argon2id->digest_len; + context.pwd = (uint8_t *) argon2_reference_tmp->pw_buf; + context.pwdlen = (uint32_t) argon2_reference_tmp->pw_len; + + argon2_ctx (&context, Argon2_id); + + argon2_reference_tmp++; + } + + return true; +} + +void bridge_init (bridge_ctx_t *bridge_ctx) +{ + bridge_ctx->bridge_context_size = BRIDGE_CONTEXT_SIZE_CURRENT; + bridge_ctx->bridge_interface_version = BRIDGE_INTERFACE_VERSION_CURRENT; + + bridge_ctx->platform_init = platform_init; + bridge_ctx->platform_term = platform_term; + bridge_ctx->get_unit_count = get_unit_count; + bridge_ctx->get_unit_info = get_unit_info; + bridge_ctx->get_workitem_count = get_workitem_count; + bridge_ctx->thread_init = BRIDGE_DEFAULT; + bridge_ctx->thread_term = BRIDGE_DEFAULT; + bridge_ctx->salt_prepare = salt_prepare; + bridge_ctx->salt_destroy = salt_destroy; + bridge_ctx->launch_loop = launch_loop; + bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; + bridge_ctx->st_update_hash = BRIDGE_DEFAULT; + bridge_ctx->st_update_pass = BRIDGE_DEFAULT; +} diff --git a/src/bridges/bridge_argon2id_reference.mk b/src/bridges/bridge_argon2id_reference.mk new file mode 100644 index 000000000..d02eed8ff --- /dev/null +++ b/src/bridges/bridge_argon2id_reference.mk @@ -0,0 +1,30 @@ + +ARGON2_REFERENCE := deps/phc-winner-argon2-20190702 +ARGON2_REFERENCE_CFLAGS := -I$(ARGON2_REFERENCE)/_hashcat/ + +ifeq ($(BUILD_MODE),cross) +ARGON2_REFERENCE_CFLAGS += -mavx2 +else +ifeq ($(UNAME),Darwin) +ifeq ($(IS_APPLE_SILICON),0) +ARGON2_REFERENCE_CFLAGS += -mavx2 +endif +else +ARGON2_REFERENCE_CFLAGS += -march=native +endif +endif + +ifeq ($(BUILD_MODE),cross) +bridges/bridge_argon2id_reference.so: src/bridges/bridge_argon2id_reference.c src/cpu_features.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(ARGON2_REFERENCE_CFLAGS) +bridges/bridge_argon2id_reference.dll: src/bridges/bridge_argon2id_reference.c src/cpu_features.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(ARGON2_REFERENCE_CFLAGS) +else +ifeq ($(SHARED),1) +bridges/bridge_argon2id_reference.$(BRIDGE_SUFFIX): src/bridges/bridge_argon2id_reference.c src/cpu_features.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(ARGON2_REFERENCE_CFLAGS) +else +bridges/bridge_argon2id_reference.$(BRIDGE_SUFFIX): src/bridges/bridge_argon2id_reference.c src/cpu_features.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(ARGON2_REFERENCE_CFLAGS) +endif +endif diff --git a/src/bridges/bridge_python_generic_hash_mp.c b/src/bridges/bridge_python_generic_hash_mp.c new file mode 100644 index 000000000..4dcfe0ea5 --- /dev/null +++ b/src/bridges/bridge_python_generic_hash_mp.c @@ -0,0 +1,1136 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "bridges.h" +#include "memory.h" +#include "shared.h" +#include "cpu_features.h" +#include "dynloader.h" + +#if defined (_WIN) +#include "processenv.h" +#endif + +// python interpreter + +#define PY_SSIZE_T_CLEAN + +#undef _GNU_SOURCE +#include + +#define PYTHON_API_CALL + +typedef void (PYTHON_API_CALL *PY_INITIALIZE) (); +typedef void (PYTHON_API_CALL *PY_FINALIZE) (); +typedef void (PYTHON_API_CALL *PY_DECREF) (PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYBOOL_FROMLONG) (long); +typedef PyObject *(PYTHON_API_CALL *PYBYTES_FROMSTRINGANDSIZE) (const char *, Py_ssize_t); +typedef int (PYTHON_API_CALL *PYDICT_DELITEMSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYDICT_GETITEMSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYDICT_NEW) (); +typedef int (PYTHON_API_CALL *PYDICT_SETITEMSTRING) (PyObject *, const char *, PyObject *); +typedef void (PYTHON_API_CALL *PYERR_PRINT) (); +typedef PyObject *(PYTHON_API_CALL *PYIMPORT_IMPORTMODULE) (const char *); +typedef PyObject *(PYTHON_API_CALL *PYIMPORT_IMPORT) (PyObject *); +typedef int (PYTHON_API_CALL *PYLIST_APPEND) (PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYLIST_GETITEM) (PyObject *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYLIST_NEW) (Py_ssize_t); +typedef int (PYTHON_API_CALL *PYLIST_SETITEM) (PyObject *, Py_ssize_t, PyObject *); +typedef Py_ssize_t (PYTHON_API_CALL *PYLIST_SIZE) (PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYLONG_FROMLONG) (long); +typedef PyObject *(PYTHON_API_CALL *PYOBJECT_CALLOBJECT) (PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYOBJECT_GETATTRSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYTUPLE_NEW) (Py_ssize_t); +typedef int (PYTHON_API_CALL *PYTUPLE_SETITEM) (PyObject *, Py_ssize_t, PyObject *); +typedef const char *(PYTHON_API_CALL *PYUNICODE_ASUTF8) (PyObject *); +typedef const char *(PYTHON_API_CALL *PYUNICODE_ASUTF8ANDSIZE) (PyObject *, Py_ssize_t *); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_DECODEFSDEFAULTANDSIZE) (const char *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_DECODEFSDEFAULT) (const char *); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_FROMSTRINGANDSIZE) (const char *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_FROMSTRING) (const char *); +typedef void (PYTHON_API_CALL *PYEVAL_ACQUIRELOCK) (void); +typedef void (PYTHON_API_CALL *PYEVAL_RELEASELOCK) (void); +typedef PyThreadState *(PYTHON_API_CALL *PYTHREADSTATE_SWAP) (PyThreadState *); +typedef PyThreadState *(PYTHON_API_CALL *PYNEWINTERPRETER) (void); +typedef void (PYTHON_API_CALL *PYENDINTERPRETER) (PyThreadState *); +typedef PyGILState_STATE (PYTHON_API_CALL *PYGILSTATE_ENSURE) (void); +typedef void (PYTHON_API_CALL *PYGILSTATE_RELEASE) (PyGILState_STATE); +typedef void (PYTHON_API_CALL *PYEVAL_ACQUIRETHREAD) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYEVAL_RELEASETHREAD) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYTHREADSTATE_CLEAR) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYTHREADSTATE_DELETE) (PyThreadState *); +typedef PyThreadState *(PYTHON_API_CALL *PYTHREADSTATE_NEW) (PyInterpreterState *); +typedef PyInterpreterState *(PYTHON_API_CALL *PYINTERPRETERSTATE_MAIN) (void); +typedef void (PYTHON_API_CALL *PYEVAL_INITTHREADS) (void); +typedef PyThreadState *(PYTHON_API_CALL *PYEVAL_SAVETHREAD) (void); +//typedef PyStatus (PYTHON_API_CALL *PYNEWINTERPRETERFROMCONFIG) (PyThreadState **, const PyInterpreterConfig *); +typedef void (PYTHON_API_CALL *PYEXITSTATUSEXCEPTION) (PyStatus); +typedef PyStatus (PYTHON_API_CALL *PYINITIALIZEFROMCONFIG) (const PyConfig *); +typedef void (PYTHON_API_CALL *PYEVAL_RESTORETHREAD) (PyThreadState *); +typedef const char *(PYTHON_API_CALL *PYGETVERSION) (void); +typedef PyObject *(PYTHON_API_CALL *PY_COMPILESTRINGEXFLAGS) (const char *, const char *, int, PyCompilerFlags *, int); +typedef PyObject *(PYTHON_API_CALL *PYEVAL_EVALCODE) (PyObject *, PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYEVAL_GETBUILTINS) (void); + +typedef struct hc_python_lib +{ + hc_dynlib_t lib; + + PY_INITIALIZE Py_Initialize; + PY_FINALIZE Py_Finalize; + PY_DECREF Py_DecRef; + PYBOOL_FROMLONG PyBool_FromLong; + PYBYTES_FROMSTRINGANDSIZE PyBytes_FromStringAndSize; + PYDICT_DELITEMSTRING PyDict_DelItemString; + PYDICT_GETITEMSTRING PyDict_GetItemString; + PYDICT_NEW PyDict_New; + PYDICT_SETITEMSTRING PyDict_SetItemString; + PYERR_PRINT PyErr_Print; + PYIMPORT_IMPORTMODULE PyImport_ImportModule; + PYIMPORT_IMPORT PyImport_Import; + PYLIST_APPEND PyList_Append; + PYLIST_GETITEM PyList_GetItem; + PYLIST_NEW PyList_New; + PYLIST_SETITEM PyList_SetItem; + PYLIST_SIZE PyList_Size; + PYLONG_FROMLONG PyLong_FromLong; + PYOBJECT_CALLOBJECT PyObject_CallObject; + PYOBJECT_GETATTRSTRING PyObject_GetAttrString; + PYTUPLE_NEW PyTuple_New; + PYTUPLE_SETITEM PyTuple_SetItem; + PYUNICODE_ASUTF8 PyUnicode_AsUTF8; + PYUNICODE_ASUTF8ANDSIZE PyUnicode_AsUTF8AndSize; + PYUNICODE_DECODEFSDEFAULTANDSIZE PyUnicode_DecodeFSDefaultAndSize; + PYUNICODE_DECODEFSDEFAULT PyUnicode_DecodeFSDefault; + PYUNICODE_FROMSTRINGANDSIZE PyUnicode_FromStringAndSize; + PYUNICODE_FROMSTRING PyUnicode_FromString; + PYEVAL_ACQUIRELOCK PyEval_AcquireLock; + PYEVAL_RELEASELOCK PyEval_ReleaseLock; + PYTHREADSTATE_SWAP PyThreadState_Swap; + PYNEWINTERPRETER Py_NewInterpreter; + PYENDINTERPRETER Py_EndInterpreter; + PYGILSTATE_ENSURE PyGILState_Ensure; + PYGILSTATE_RELEASE PyGILState_Release; + PYEVAL_ACQUIRETHREAD PyEval_AcquireThread; + PYEVAL_RELEASETHREAD PyEval_ReleaseThread; + PYTHREADSTATE_CLEAR PyThreadState_Clear; + PYTHREADSTATE_DELETE PyThreadState_Delete; + PYTHREADSTATE_NEW PyThreadState_New; + PYINTERPRETERSTATE_MAIN PyInterpreterState_Main; + PYEVAL_INITTHREADS PyEval_InitThreads; + PYEVAL_SAVETHREAD PyEval_SaveThread; + //PYNEWINTERPRETERFROMCONFIG Py_NewInterpreterFromConfig; + PYEXITSTATUSEXCEPTION Py_ExitStatusException; + PYINITIALIZEFROMCONFIG Py_InitializeFromConfig; + PYEVAL_RESTORETHREAD PyEval_RestoreThread; + PYGETVERSION Py_GetVersion; + PY_COMPILESTRINGEXFLAGS Py_CompileStringExFlags; + PYEVAL_EVALCODE PyEval_EvalCode; + PYEVAL_GETBUILTINS PyEval_GetBuiltins; + +} hc_python_lib_t; + +// good: we can use this multiplier do reduce copy overhead to increase the guessing speed, +// bad: but we also increase the password candidate batch size. +// slow hashes which make use of this bridge probably are used with smaller wordlists, +// and therefore it's easier for hashcat to parallelize if this multiplier is low. +// in the end, it's a trade-off. + +#define N_ACCEL 8 + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +typedef struct +{ + // template + + char unit_info_buf[1024]; + int unit_info_len; + + u64 workitem_count; + size_t workitem_size; + + // implementation specific + + int parallelism; + + PyGILState_STATE gstate; + + PyObject *pArgs; + PyObject *pContext; + PyObject *pGlobals; + PyObject *pFunc_Init; + PyObject *pFunc_Term; + PyObject *pFunc_kernel_loop; + +} unit_t; + +typedef struct +{ + unit_t *units_buf; + int units_cnt; + + hc_python_lib_t *python; + + PyThreadState *tstate; + + char *source_filename; + +} python_interpreter_t; + +#if defined (_WIN) || defined (__CYGWIN__) || defined (__APPLE__) +static char *DEFAULT_SOURCE_FILENAME = "Python/generic_hash_sp.py"; +#else +static char *DEFAULT_SOURCE_FILENAME = "Python/generic_hash_mp.py"; +#endif + +const char *extract_module_name (const char *path) +{ + char *filename = strdup (path); + + remove_file_suffix (filename, ".py"); + + const char *slash = strrchr (filename, '/'); + const char *backslash = strrchr (filename, '\\'); + + const char *module_name = NULL; + + if (slash) + { + module_name = slash + 1; + } + else if (backslash) + { + module_name = backslash + 1; + } + else + { + module_name = filename; + } + + return module_name; +} + +static char *expand_pyenv_libpath (const char *prefix, const int maj, const int min) +{ + char *out = NULL; + + #if defined (_WIN) + const int len = asprintf (&out, "%s/python%d%d.dll", prefix, maj, min); //untested + #elif defined (__MSYS__) + const int len = asprintf (&out, "%s/msys-python%d.%d.dll", prefix, maj, min); //untested could be wrong + #elif defined (__APPLE__) + const int len = asprintf (&out, "%s/lib/libpython%d.%d.dylib", prefix, maj, min); //untested + #elif defined (__CYGWIN__) + const int len = asprintf (&out, "%s/lib/python%d%d.dll", prefix, maj, min); //untested + #else + const int len = asprintf (&out, "%s/lib/libpython%d.%d.so", prefix, maj, min); + #endif + + if (len == -1) return NULL; + + struct stat st; + + if (stat (out, &st) != 0) + { + free (out); + + return NULL; + } + + return out; +} + +static int resolve_pyenv_libpath (char *out_buf, const size_t out_sz) +{ + // prefix + + FILE *fp1 = popen ("pyenv prefix", "r"); + + if (fp1 == NULL) return -1; + + char prefix_path[PATH_MAX]; + + if (fgets (prefix_path, sizeof (prefix_path), fp1) == NULL) + { + pclose (fp1); + + return -1; + } + + pclose (fp1); + + superchop_with_length (prefix_path, strlen (prefix_path)); + + int maj = 0; + int min = 0; + + // local + + FILE *fp2 = popen ("pyenv local", "r"); + + if (fp2 == NULL) return -1; + + if (fscanf (fp2, "%d.%d", &maj, &min) == 2) + { + pclose (fp2); + + char *pyenv_libpath = expand_pyenv_libpath (prefix_path, maj, min); + + if (pyenv_libpath != NULL) + { + strncpy (out_buf, pyenv_libpath, out_sz - 1); + + free (pyenv_libpath); + + return 0; + } + + return -1; + } + + pclose (fp2); + + // global + + FILE *fp3 = popen ("pyenv global", "r"); + + if (fp3 == NULL) return -1; + + if (fscanf (fp3, "%d.%d", &maj, &min) == 2) + { + pclose (fp3); + + char *pyenv_libpath = expand_pyenv_libpath (prefix_path, maj, min); + + if (pyenv_libpath != NULL) + { + strncpy (out_buf, pyenv_libpath, out_sz - 1); + + free (pyenv_libpath); + + return 0; + } + + return -1; + } + + pclose (fp3); + + return -1; +} + +static bool init_python (hc_python_lib_t *python) +{ + char pythondll_path[PATH_MAX]; + + python->lib = NULL; + + // let's see if we have pyenv, that will save us a lot of guessing... + + int saved_stderr = suppress_stderr (); + + const int pyenv_rc = resolve_pyenv_libpath (pythondll_path, sizeof (pythondll_path)); + + restore_stderr (saved_stderr); + + if (pyenv_rc == 0) + { + #if defined (_WIN) + python->lib = hc_dlopen (pythondll_path); + #elif defined (__MSYS__) + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #elif defined (__APPLE__) + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #elif defined (__CYGWIN__) + python->lib = hc_dlopen (pythondll_path); + #else + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #endif + } + + #define MIN_MAJ 3 + #define MAX_MAJ 8 + + #define MIN_MIN 0 + #define MAX_MIN 50 + + for (int maj = MAX_MAJ; maj >= MIN_MAJ; --maj) + { + if (python->lib != NULL) break; + + for (int min = MAX_MIN; min >= MIN_MIN; --min) + { + #if defined (_WIN) + + // first try %LocalAppData% default path + char expandedPath[MAX_PATH - 1]; + + char *libpython_namelocal = NULL; + + hc_asprintf (&libpython_namelocal, "%%LocalAppData%%\\Programs\\Python\\Python%d%d\\python%d%d.dll", maj, min, maj, min); + + DWORD len = ExpandEnvironmentStringsA (libpython_namelocal, expandedPath, sizeof (expandedPath)); + + if (len) + { + python->lib = hc_dlopen (expandedPath); + + if (python->lib != NULL) + { + strncpy (pythondll_path, expandedPath, sizeof (pythondll_path) - 1); + + hcfree (libpython_namelocal); + + break; + } + else + { + hcfree (libpython_namelocal); + }; + } + + // use %PATH% + char *libpython_namepath = NULL; + + hc_asprintf (&libpython_namepath, "python%d%d.dll", maj, min); + + python->lib = hc_dlopen (libpython_namepath); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_namepath, sizeof (pythondll_path) - 1); + + hcfree (libpython_namepath); + + break; + } + else + { + hcfree (libpython_namepath); + }; + + #elif defined (__MSYS__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "msys-python%d.%d.dll", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #elif defined (__APPLE__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "libpython%d.%d.dylib", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #elif defined (__CYGWIN__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "python%d%d.dll", maj, min); + + python->lib = hc_dlopen (libpython_name); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #else + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "libpython%d.%d.so", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #endif + + if (python->lib != NULL) break; + } + + if (python->lib != NULL) break; + } + + if (python->lib == NULL) + { + fprintf (stderr, "Awww, unable to find Python shared library.\n"); + + return false; + } + else + { + printf ("Loaded python library from: %s\n\n", pythondll_path); + } + + #define HC_LOAD_FUNC_PYTHON(ptr,name,pythonname,type,libname,noerr) \ + do { \ + ptr->name = (type) hc_dlsym ((ptr)->lib, #pythonname); \ + if ((noerr) != -1) { \ + if (!(ptr)->name) { \ + if ((noerr) == 1) { \ + fprintf (stderr, "%s is missing from %s shared library.", #name, #libname); \ + return false; \ + } \ + if ((noerr) != 1) { \ + fprintf (stderr, "%s is missing from %s shared library.", #name, #libname); \ + return true; \ + } \ + } \ + } \ + } while (0) + + HC_LOAD_FUNC_PYTHON (python, Py_GetVersion, Py_GetVersion, PYGETVERSION, PYTHON, 1); + + const char *version_str = python->Py_GetVersion (); + + int major = 0; + int minor = 0; + + if (sscanf (version_str, "%d.%d", &major, &minor) != 2) + { + fprintf (stderr, "Python version string is not valid: %s\n", version_str); + + return false; + } + + if ((major < 3) || (major == 3 && minor < 10)) + { + fprintf (stderr, "Python version mismatch: Need at least v3.10\n"); + + return false; + } + + HC_LOAD_FUNC_PYTHON (python, Py_Initialize, Py_Initialize, PY_INITIALIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_Finalize, Py_Finalize, PY_FINALIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_DecRef, Py_DecRef, PY_DECREF, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyBool_FromLong, PyBool_FromLong, PYBOOL_FROMLONG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyBytes_FromStringAndSize, PyBytes_FromStringAndSize, PYBYTES_FROMSTRINGANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_DelItemString, PyDict_DelItemString, PYDICT_DELITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_GetItemString, PyDict_GetItemString, PYDICT_GETITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_New, PyDict_New, PYDICT_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_SetItemString, PyDict_SetItemString, PYDICT_SETITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyErr_Print, PyErr_Print, PYERR_PRINT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyImport_ImportModule, PyImport_ImportModule, PYIMPORT_IMPORTMODULE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyImport_Import, PyImport_Import, PYIMPORT_IMPORT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_Append, PyList_Append, PYLIST_APPEND, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_GetItem, PyList_GetItem, PYLIST_GETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_New, PyList_New, PYLIST_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_SetItem, PyList_SetItem, PYLIST_SETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_Size, PyList_Size, PYLIST_SIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyLong_FromLong, PyLong_FromLong, PYLONG_FROMLONG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyObject_CallObject, PyObject_CallObject, PYOBJECT_CALLOBJECT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyObject_GetAttrString, PyObject_GetAttrString, PYOBJECT_GETATTRSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyTuple_New, PyTuple_New, PYTUPLE_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyTuple_SetItem, PyTuple_SetItem, PYTUPLE_SETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_AsUTF8, PyUnicode_AsUTF8, PYUNICODE_ASUTF8, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_AsUTF8AndSize, PyUnicode_AsUTF8AndSize, PYUNICODE_ASUTF8ANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_DecodeFSDefaultAndSize, PyUnicode_DecodeFSDefaultAndSize, PYUNICODE_DECODEFSDEFAULTANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_DecodeFSDefault, PyUnicode_DecodeFSDefault, PYUNICODE_DECODEFSDEFAULT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_FromStringAndSize, PyUnicode_FromStringAndSize, PYUNICODE_FROMSTRINGANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_FromString, PyUnicode_FromString, PYUNICODE_FROMSTRING, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_AcquireLock, PyEval_AcquireLock, PYEVAL_ACQUIRELOCK, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_ReleaseLock, PyEval_ReleaseLock, PYEVAL_RELEASELOCK, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Swap, PyThreadState_Swap, PYTHREADSTATE_SWAP, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_NewInterpreter, Py_NewInterpreter, PYNEWINTERPRETER, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_EndInterpreter, Py_EndInterpreter, PYENDINTERPRETER, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyGILState_Ensure, PyGILState_Ensure, PYGILSTATE_ENSURE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyGILState_Release, PyGILState_Release, PYGILSTATE_RELEASE, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_AcquireThread, PyEval_AcquireThread, PYEVAL_ACQUIRETHREAD, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_ReleaseThread, PyEval_ReleaseThread, PYEVAL_RELEASETHREAD, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Clear, PyThreadState_Clear, PYTHREADSTATE_CLEAR, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Delete, PyThreadState_Delete, PYTHREADSTATE_DELETE, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_New, PyThreadState_New, PYTHREADSTATE_NEW, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyInterpreterState_Main, PyInterpreterState_Main, PYINTERPRETERSTATE_MAIN, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_InitThreads, PyEval_InitThreads, PYEVAL_INITTHREADS, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_SaveThread, PyEval_SaveThread, PYEVAL_SAVETHREAD, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_NewInterpreterFromConfig, Py_NewInterpreterFromConfig, PYNEWINTERPRETERFROMCONFIG, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_ExitStatusException, Py_ExitStatusException, PYEXITSTATUSEXCEPTION, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_InitializeFromConfig, Py_InitializeFromConfig, PYINITIALIZEFROMCONFIG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_RestoreThread, PyEval_RestoreThread, PYEVAL_RESTORETHREAD, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_CompileStringExFlags, Py_CompileStringExFlags, PY_COMPILESTRINGEXFLAGS, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_EvalCode, PyEval_EvalCode, PYEVAL_EVALCODE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_GetBuiltins, PyEval_GetBuiltins, PYEVAL_GETBUILTINS, PYTHON, 1); + + return true; +} + +static bool units_init (python_interpreter_t *python_interpreter) +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetSystemInfo (&sysinfo); + + int num_devices = sysinfo.dwNumberOfProcessors; + + #else + + int num_devices = sysconf (_SC_NPROCESSORS_ONLN); + + #endif + + // This branch of python plugin handles threads through multiprocessing module, so we only need one thread + // Bu we will multiply N_ACCEL later with the num_devices count to achieve the same workload size + + const int num_devices_sav = num_devices; + + num_devices = 1; + + unit_t *units_buf = (unit_t *) hccalloc (num_devices, sizeof (unit_t)); + + int units_cnt = 0; + + for (int i = 0; i < num_devices; i++) + { + unit_t *unit_buf = &units_buf[i]; + + hc_python_lib_t *python = python_interpreter->python; + + unit_buf->unit_info_len = snprintf (unit_buf->unit_info_buf, sizeof (unit_buf->unit_info_buf) - 1, "Python Interpreter (%s)", python->Py_GetVersion ()); + + unit_buf->unit_info_buf[unit_buf->unit_info_len] = 0; + + unit_buf->parallelism = num_devices_sav; + unit_buf->workitem_count = N_ACCEL * num_devices_sav; + + units_cnt++; + } + + python_interpreter->units_buf = units_buf; + python_interpreter->units_cnt = units_cnt; + + return true; +} + +static void units_term (python_interpreter_t *python_interpreter) +{ + unit_t *units_buf = python_interpreter->units_buf; + + if (units_buf) + { + hcfree (python_interpreter->units_buf); + } +} + +void *platform_init (user_options_t *user_options) +{ + // Verify CPU features + + if (cpu_chipset_test () == -1) return NULL; + + // Allocate platform context + + python_interpreter_t *python_interpreter = (python_interpreter_t *) hcmalloc (sizeof (python_interpreter_t)); + + hc_python_lib_t *python = (hc_python_lib_t *) hcmalloc (sizeof (hc_python_lib_t)); + + python_interpreter->python = python; + + if (init_python (python) == false) return NULL; + + python->Py_Initialize (); + + PyObject *sys = python->PyImport_ImportModule ("sys"); + PyObject *path = python->PyObject_GetAttrString (sys, "path"); + python->PyList_Append (path, python->PyUnicode_FromString ("./Python")); + python->Py_DecRef (path); + python->Py_DecRef (sys); + + if (units_init (python_interpreter) == false) + { + hcfree (python_interpreter); + + return NULL; + } + + unit_t *unit_buf = &python_interpreter->units_buf[0]; + + #if defined (_WIN) || defined (__CYGWIN__) || defined (__APPLE__) + fprintf (stderr, "Attention!!! Falling back to single-threaded mode.\n"); + fprintf (stderr, " Windows and MacOS ds not support multiprocessing module cleanly!\n"); + fprintf (stderr, " For multithreading on Windows and MacOS, please use -m 72000 instead.\n\n"); + #endif + + python_interpreter->source_filename = (user_options->bridge_parameter1 == NULL) ? DEFAULT_SOURCE_FILENAME : user_options->bridge_parameter1; + + char *source = file_to_buffer (python_interpreter->source_filename); + + if (source == NULL) + { + fprintf (stderr, "ERROR: %s: %s\n\n", python_interpreter->source_filename, strerror (errno)); + + return NULL; + } + + PyObject *code = python->Py_CompileStringExFlags (source, python_interpreter->source_filename, Py_file_input, NULL, -1); + + free (source); + + if (code == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pGlobals = python->PyDict_New (); + + python->PyDict_SetItemString (unit_buf->pGlobals, "__builtins__", python->PyEval_GetBuiltins ()); + + PyObject *result = python->PyEval_EvalCode (code, unit_buf->pGlobals, unit_buf->pGlobals); + + if (result == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (result); + + unit_buf->pFunc_Init = python->PyDict_GetItemString (unit_buf->pGlobals, "init"); + + if (unit_buf->pFunc_Init == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pFunc_Term = python->PyDict_GetItemString (unit_buf->pGlobals, "term"); + + if (unit_buf->pFunc_Term == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pFunc_kernel_loop = python->PyDict_GetItemString (unit_buf->pGlobals, "kernel_loop"); + + if (unit_buf->pFunc_kernel_loop == NULL) + { + python->PyErr_Print (); + + return false; + } + + // Initialize Context (which also means copy salts because they are part of the context) + + unit_buf->pContext = python->PyDict_New (); + + if (unit_buf->pContext == NULL) + { + python->PyErr_Print (); + + return false; + } + + // for later calls + + unit_buf->pArgs = python->PyTuple_New (4); + + if (unit_buf->pArgs == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->PyTuple_SetItem (unit_buf->pArgs, 0, unit_buf->pContext); + python->PyTuple_SetItem (unit_buf->pArgs, 2, python->PyLong_FromLong (0)); + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (false)); + + python_interpreter->tstate = python->PyEval_SaveThread (); + + return python_interpreter; +} + +void platform_term (void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + hc_python_lib_t *python = python_interpreter->python; + + unit_t *unit_buf = &python_interpreter->units_buf[0]; + + unit_buf->gstate = python->PyGILState_Ensure (); + + python->Py_DecRef (unit_buf->pArgs); + python->Py_DecRef (unit_buf->pContext); + python->Py_DecRef (unit_buf->pFunc_kernel_loop); + python->Py_DecRef (unit_buf->pFunc_Term); + python->Py_DecRef (unit_buf->pFunc_Init); + python->Py_DecRef (unit_buf->pGlobals); + + //python->PyEval_RestoreThread (python_interpreter->tstate); + + python->Py_Finalize (); + + units_term (python_interpreter); + + hcfree (python_interpreter); +} + +bool thread_init (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + unit_buf->gstate = python->PyGILState_Ensure (); + + int rc = 0; + + const char *module_name = extract_module_name (python_interpreter->source_filename); + + rc |= python->PyDict_SetItemString (unit_buf->pContext, "module_name", python->PyUnicode_FromString ((const char *) module_name)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "parallelism", python->PyLong_FromLong (unit_buf->parallelism)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_cnt", python->PyLong_FromLong (hashes->salts_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_size", python->PyLong_FromLong (sizeof (salt_t))); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->salts_buf, sizeof (salt_t) * hashes->salts_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_cnt", python->PyLong_FromLong (hashes->digests_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_size", python->PyLong_FromLong (hashconfig->esalt_size)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->esalts_buf, hashconfig->esalt_size * hashes->digests_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_cnt", python->PyLong_FromLong (1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_size", python->PyLong_FromLong (sizeof (salt_t))); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->st_salts_buf, sizeof (salt_t) * 1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_cnt", python->PyLong_FromLong (1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_size", python->PyLong_FromLong (hashconfig->esalt_size)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->st_esalts_buf, hashconfig->esalt_size * 1)); + + if (rc != 0) + { + python->PyErr_Print (); + + return false; + } + + PyObject *pArgs = python->PyTuple_New (1); + + if (pArgs == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->PyTuple_SetItem (pArgs, 0, unit_buf->pContext); + + PyObject *pReturn = python->PyObject_CallObject (unit_buf->pFunc_Init, pArgs); + + if (pReturn == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (pReturn); + + python->PyGILState_Release (unit_buf->gstate); + + return true; +} + +void thread_term (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + unit_buf->gstate = python->PyGILState_Ensure (); + + PyObject *pArgs = python->PyTuple_New (1); + + if (pArgs == NULL) + { + python->PyErr_Print (); + + return; + } + + python->PyTuple_SetItem (pArgs, 0, unit_buf->pContext); + + python->PyObject_CallObject (unit_buf->pFunc_Term, pArgs); + + python->PyDict_DelItemString (unit_buf->pContext, "salts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "salts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "salts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_buf"); + + python->PyGILState_Release (unit_buf->gstate); +} + +int get_unit_count (void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + return python_interpreter->units_cnt; +} + +// we support units of mixed speed, that's why the workitem count is unit specific + +int get_workitem_count (void *platform_context, const int unit_idx) +{ + python_interpreter_t *python_interpreter = platform_context; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + return unit_buf->workitem_count; +} + +char *get_unit_info (void *platform_context, const int unit_idx) +{ + python_interpreter_t *python_interpreter = platform_context; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + return unit_buf->unit_info_buf; +} + +bool launch_loop (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u64 pws_cnt) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + unit_buf->gstate = python->PyGILState_Ensure (); + + generic_io_tmp_t *generic_io_tmp = (generic_io_tmp_t *) device_param->h_tmps; + + PyObject *pws = python->PyList_New (pws_cnt); + + if (pws == NULL) + { + python->PyErr_Print (); + + return false; + } + + for (u64 i = 0; i < pws_cnt; i++) + { + PyObject *pw = python->PyBytes_FromStringAndSize ((char *) generic_io_tmp->pw_buf, generic_io_tmp->pw_len); + + if (pw == NULL) return false; + + python->PyList_SetItem (pws, i, pw); + + generic_io_tmp++; + } + + python->PyTuple_SetItem (unit_buf->pArgs, 1, pws); + python->PyTuple_SetItem (unit_buf->pArgs, 2, python->PyLong_FromLong (salt_pos)); + + if (hashes->salts_buf == hashes->st_salts_buf) + { + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (true)); + } + else + { + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (false)); + } + + PyObject *pReturn = python->PyObject_CallObject (unit_buf->pFunc_kernel_loop, unit_buf->pArgs); + + if (pReturn == NULL) + { + python->PyErr_Print (); + + return false; + } + + Py_ssize_t retsz = python->PyList_Size (pReturn); + + if (retsz != (Py_ssize_t) pws_cnt) return false; + + generic_io_tmp = (generic_io_tmp_t *) device_param->h_tmps; + + for (Py_ssize_t i = 0; i < retsz; i++) + { + PyObject *hash = python->PyList_GetItem (pReturn, i); + + Py_ssize_t len; + + const char *s = python->PyUnicode_AsUTF8AndSize (hash, &len); + + if (s) + { + memcpy (generic_io_tmp->out_buf, s, len); + + generic_io_tmp->out_len = len; + } + + generic_io_tmp++; + } + + python->Py_DecRef (pReturn); + + python->PyGILState_Release (unit_buf->gstate); + + return true; +} + +const char *st_update_hash (MAYBE_UNUSED void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + hc_python_lib_t *python = python_interpreter->python; + + unit_t *unit_buf = &python_interpreter->units_buf[0]; + + unit_buf->gstate = python->PyGILState_Ensure (); + + PyObject *constant = python->PyDict_GetItemString (unit_buf->pGlobals, "ST_HASH"); + + if (constant == NULL) + { + python->PyGILState_Release (unit_buf->gstate); + + return NULL; + } + + const char *s = python->PyUnicode_AsUTF8 (constant); + + python->Py_DecRef (constant); + + python->PyGILState_Release (unit_buf->gstate); + + return s; +} + +const char *st_update_pass (MAYBE_UNUSED void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + hc_python_lib_t *python = python_interpreter->python; + + unit_t *unit_buf = &python_interpreter->units_buf[0]; + + unit_buf->gstate = python->PyGILState_Ensure (); + + PyObject *constant = python->PyDict_GetItemString (unit_buf->pGlobals, "ST_PASS"); + + if (constant == NULL) + { + python->PyGILState_Release (unit_buf->gstate); + + return NULL; + } + + const char *s = python->PyUnicode_AsUTF8 (constant); + + python->Py_DecRef (constant); + + python->PyGILState_Release (unit_buf->gstate); + + return s; +} + +void bridge_init (bridge_ctx_t *bridge_ctx) +{ + bridge_ctx->bridge_context_size = BRIDGE_CONTEXT_SIZE_CURRENT; + bridge_ctx->bridge_interface_version = BRIDGE_INTERFACE_VERSION_CURRENT; + + bridge_ctx->platform_init = platform_init; + bridge_ctx->platform_term = platform_term; + bridge_ctx->get_unit_count = get_unit_count; + bridge_ctx->get_unit_info = get_unit_info; + bridge_ctx->get_workitem_count = get_workitem_count; + bridge_ctx->thread_init = thread_init; + bridge_ctx->thread_term = thread_term; + bridge_ctx->salt_prepare = BRIDGE_DEFAULT; + bridge_ctx->salt_destroy = BRIDGE_DEFAULT; + bridge_ctx->launch_loop = launch_loop; + bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; + bridge_ctx->st_update_hash = st_update_hash; + bridge_ctx->st_update_pass = st_update_pass; +} diff --git a/src/bridges/bridge_python_generic_hash_mp.mk b/src/bridges/bridge_python_generic_hash_mp.mk new file mode 100644 index 000000000..2903553a3 --- /dev/null +++ b/src/bridges/bridge_python_generic_hash_mp.mk @@ -0,0 +1,74 @@ +REPORT_MISSING_SO := false +REPORT_MISSING_DLL := false + +ifeq ($(BRIDGE_SUFFIX),so) +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_CONFIG := $(shell command -v python3-config 2>/dev/null) +ifeq ($(PYTHON_CONFIG),) + REPORT_MISSING_SO := true +endif +endif +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_CFLAGS := $(shell python3-config --includes 2>/dev/null) +ifeq ($(strip $(PYTHON_CFLAGS)),) + REPORT_MISSING_SO := true +endif +endif +endif + +CHECK_DLL := false + +ifeq ($(BRIDGE_SUFFIX),dll) + CHECK_DLL := true +endif +ifeq ($(BUILD_MODE),cross) + CHECK_DLL := true +endif + +ifeq ($(CHECK_DLL),true) +ifeq ($(REPORT_MISSING_DLL),false) +PYTHON_CONFIG := $(shell ls $(WIN_PYTHON)/mingw64/include/python3.12/ 2>/dev/null) +ifeq ($(PYTHON_CONFIG),) + REPORT_MISSING_DLL := true +endif +endif +PYTHON_CFLAGS_WIN := -I$(WIN_PYTHON)/mingw64/include/python3.12/ +endif + +ifeq ($(BUILD_MODE),cross) +bridges/bridge_python_generic_hash_mp.so: src/bridges/bridge_python_generic_hash_mp.c src/cpu_features.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +bridges/bridge_python_generic_hash_mp.dll: src/bridges/bridge_python_generic_hash_mp.c src/cpu_features.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS_WIN) +else +ifeq ($(SHARED),1) +bridges/bridge_python_generic_hash_mp.$(BRIDGE_SUFFIX): src/bridges/bridge_python_generic_hash_mp.c src/cpu_features.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +else +bridges/bridge_python_generic_hash_mp.$(BRIDGE_SUFFIX): src/bridges/bridge_python_generic_hash_mp.c src/cpu_features.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +endif +endif + +RED = \033[1;31m +RESET = \033[0m + +ifeq ($(REPORT_MISSING_DLL),true) +bridges/bridge_python_generic_hash_mp.dll: + @echo "" + @echo "$(RED)WARNING$(RESET): Skipping regular plugin 70300: Python Windows headers not found." + @echo " To use -m 70300, you must install the required Python headers." + @echo " Otherwise, you can safely ignore this warning." + @echo " See BUILD_WSL.md how to prepare $(WIN_PYTHON)." + @echo "" +endif + +ifeq ($(REPORT_MISSING_SO),true) +bridges/bridge_python_generic_hash_mp.so: + @echo "" + @echo "$(RED)WARNING$(RESET): Skipping regular plugin 70300: Python headers not found." + @echo " To use -m 70300, you must install the required Python headers." + @echo " Otherwise, you can safely ignore this warning." + @echo " For more information, see 'docs/hashcat-python-plugin-requirements.md'." + @echo "" +endif diff --git a/src/bridges/bridge_python_generic_hash_sp.c b/src/bridges/bridge_python_generic_hash_sp.c new file mode 100644 index 000000000..3d2dbb994 --- /dev/null +++ b/src/bridges/bridge_python_generic_hash_sp.c @@ -0,0 +1,1220 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "bridges.h" +#include "memory.h" +#include "shared.h" +#include "cpu_features.h" +#include "dynloader.h" + +#if defined (_WIN) +#include "processenv.h" +#endif + +// python interpreter + +#define PY_SSIZE_T_CLEAN + +#undef _GNU_SOURCE +#include + +#define PYTHON_API_CALL + +typedef void (PYTHON_API_CALL *PY_INITIALIZE) (); +typedef void (PYTHON_API_CALL *PY_FINALIZE) (); +typedef void (PYTHON_API_CALL *PY_DECREF) (PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYBOOL_FROMLONG) (long); +typedef PyObject *(PYTHON_API_CALL *PYBYTES_FROMSTRINGANDSIZE) (const char *, Py_ssize_t); +typedef int (PYTHON_API_CALL *PYDICT_DELITEMSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYDICT_GETITEMSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYDICT_NEW) (); +typedef int (PYTHON_API_CALL *PYDICT_SETITEMSTRING) (PyObject *, const char *, PyObject *); +typedef void (PYTHON_API_CALL *PYERR_PRINT) (); +typedef PyObject *(PYTHON_API_CALL *PYIMPORT_IMPORTMODULE) (const char *); +typedef PyObject *(PYTHON_API_CALL *PYIMPORT_IMPORT) (PyObject *); +typedef int (PYTHON_API_CALL *PYLIST_APPEND) (PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYLIST_GETITEM) (PyObject *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYLIST_NEW) (Py_ssize_t); +typedef int (PYTHON_API_CALL *PYLIST_SETITEM) (PyObject *, Py_ssize_t, PyObject *); +typedef Py_ssize_t (PYTHON_API_CALL *PYLIST_SIZE) (PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYLONG_FROMLONG) (long); +typedef PyObject *(PYTHON_API_CALL *PYOBJECT_CALLOBJECT) (PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYOBJECT_GETATTRSTRING) (PyObject *, const char *); +typedef PyObject *(PYTHON_API_CALL *PYTUPLE_NEW) (Py_ssize_t); +typedef int (PYTHON_API_CALL *PYTUPLE_SETITEM) (PyObject *, Py_ssize_t, PyObject *); +typedef const char *(PYTHON_API_CALL *PYUNICODE_ASUTF8) (PyObject *); +typedef const char *(PYTHON_API_CALL *PYUNICODE_ASUTF8ANDSIZE) (PyObject *, Py_ssize_t *); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_DECODEFSDEFAULTANDSIZE) (const char *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_DECODEFSDEFAULT) (const char *); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_FROMSTRINGANDSIZE) (const char *, Py_ssize_t); +typedef PyObject *(PYTHON_API_CALL *PYUNICODE_FROMSTRING) (const char *); +typedef void (PYTHON_API_CALL *PYEVAL_ACQUIRELOCK) (void); +typedef void (PYTHON_API_CALL *PYEVAL_RELEASELOCK) (void); +typedef PyThreadState *(PYTHON_API_CALL *PYTHREADSTATE_SWAP) (PyThreadState *); +typedef PyThreadState *(PYTHON_API_CALL *PYNEWINTERPRETER) (void); +typedef void (PYTHON_API_CALL *PYENDINTERPRETER) (PyThreadState *); +typedef PyGILState_STATE (PYTHON_API_CALL *PYGILSTATE_ENSURE) (void); +typedef void (PYTHON_API_CALL *PYGILSTATE_RELEASE) (PyGILState_STATE); +typedef void (PYTHON_API_CALL *PYEVAL_ACQUIRETHREAD) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYEVAL_RELEASETHREAD) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYTHREADSTATE_CLEAR) (PyThreadState *); +typedef void (PYTHON_API_CALL *PYTHREADSTATE_DELETE) (PyThreadState *); +typedef PyThreadState *(PYTHON_API_CALL *PYTHREADSTATE_NEW) (PyInterpreterState *); +typedef PyInterpreterState *(PYTHON_API_CALL *PYINTERPRETERSTATE_MAIN) (void); +typedef void (PYTHON_API_CALL *PYEVAL_INITTHREADS) (void); +typedef PyThreadState *(PYTHON_API_CALL *PYEVAL_SAVETHREAD) (void); +typedef PyStatus (PYTHON_API_CALL *PYNEWINTERPRETERFROMCONFIG) (PyThreadState **, const PyInterpreterConfig *); +typedef void (PYTHON_API_CALL *PYEXITSTATUSEXCEPTION) (PyStatus); +typedef PyStatus (PYTHON_API_CALL *PYINITIALIZEFROMCONFIG) (const PyConfig *); +typedef void (PYTHON_API_CALL *PYEVAL_RESTORETHREAD) (PyThreadState *); +typedef const char *(PYTHON_API_CALL *PYGETVERSION) (void); +typedef PyObject *(PYTHON_API_CALL *PY_COMPILESTRINGEXFLAGS) (const char *, const char *, int, PyCompilerFlags *, int); +typedef PyObject *(PYTHON_API_CALL *PYEVAL_EVALCODE) (PyObject *, PyObject *, PyObject *); +typedef PyObject *(PYTHON_API_CALL *PYEVAL_GETBUILTINS) (void); + +typedef struct hc_python_lib +{ + hc_dynlib_t lib; + + PY_INITIALIZE Py_Initialize; + PY_FINALIZE Py_Finalize; + PY_DECREF Py_DecRef; + PYBOOL_FROMLONG PyBool_FromLong; + PYBYTES_FROMSTRINGANDSIZE PyBytes_FromStringAndSize; + PYDICT_DELITEMSTRING PyDict_DelItemString; + PYDICT_GETITEMSTRING PyDict_GetItemString; + PYDICT_NEW PyDict_New; + PYDICT_SETITEMSTRING PyDict_SetItemString; + PYERR_PRINT PyErr_Print; + PYIMPORT_IMPORTMODULE PyImport_ImportModule; + PYIMPORT_IMPORT PyImport_Import; + PYLIST_APPEND PyList_Append; + PYLIST_GETITEM PyList_GetItem; + PYLIST_NEW PyList_New; + PYLIST_SETITEM PyList_SetItem; + PYLIST_SIZE PyList_Size; + PYLONG_FROMLONG PyLong_FromLong; + PYOBJECT_CALLOBJECT PyObject_CallObject; + PYOBJECT_GETATTRSTRING PyObject_GetAttrString; + PYTUPLE_NEW PyTuple_New; + PYTUPLE_SETITEM PyTuple_SetItem; + PYUNICODE_ASUTF8 PyUnicode_AsUTF8; + PYUNICODE_ASUTF8ANDSIZE PyUnicode_AsUTF8AndSize; + PYUNICODE_DECODEFSDEFAULTANDSIZE PyUnicode_DecodeFSDefaultAndSize; + PYUNICODE_DECODEFSDEFAULT PyUnicode_DecodeFSDefault; + PYUNICODE_FROMSTRINGANDSIZE PyUnicode_FromStringAndSize; + PYUNICODE_FROMSTRING PyUnicode_FromString; + PYEVAL_ACQUIRELOCK PyEval_AcquireLock; + PYEVAL_RELEASELOCK PyEval_ReleaseLock; + PYTHREADSTATE_SWAP PyThreadState_Swap; + PYNEWINTERPRETER Py_NewInterpreter; + PYENDINTERPRETER Py_EndInterpreter; + PYGILSTATE_ENSURE PyGILState_Ensure; + PYGILSTATE_RELEASE PyGILState_Release; + PYEVAL_ACQUIRETHREAD PyEval_AcquireThread; + PYEVAL_RELEASETHREAD PyEval_ReleaseThread; + PYTHREADSTATE_CLEAR PyThreadState_Clear; + PYTHREADSTATE_DELETE PyThreadState_Delete; + PYTHREADSTATE_NEW PyThreadState_New; + PYINTERPRETERSTATE_MAIN PyInterpreterState_Main; + PYEVAL_INITTHREADS PyEval_InitThreads; + PYEVAL_SAVETHREAD PyEval_SaveThread; + PYNEWINTERPRETERFROMCONFIG Py_NewInterpreterFromConfig; + PYEXITSTATUSEXCEPTION Py_ExitStatusException; + PYINITIALIZEFROMCONFIG Py_InitializeFromConfig; + PYEVAL_RESTORETHREAD PyEval_RestoreThread; + PYGETVERSION Py_GetVersion; + PY_COMPILESTRINGEXFLAGS Py_CompileStringExFlags; + PYEVAL_EVALCODE PyEval_EvalCode; + PYEVAL_GETBUILTINS PyEval_GetBuiltins; + +} hc_python_lib_t; + +// good: we can use this multiplier do reduce copy overhead to increase the guessing speed, +// bad: but we also increase the password candidate batch size. +// slow hashes which make use of this bridge probably are used with smaller wordlists, +// and therefore it's easier for hashcat to parallelize if this multiplier is low. +// in the end, it's a trade-off. + +#define N_ACCEL 8 + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +typedef struct +{ + // template + + char unit_info_buf[1024]; + int unit_info_len; + + u64 workitem_count; + size_t workitem_size; + + // implementation specific + + PyThreadState *tstate; + + PyObject *pArgs; + PyObject *pContext; + PyObject *pGlobals; + PyObject *pFunc_Init; + PyObject *pFunc_Term; + PyObject *pFunc_kernel_loop; + +} unit_t; + +typedef struct +{ + unit_t *units_buf; + int units_cnt; + + hc_python_lib_t *python; + + PyThreadState *thread_state; + + char *source_filename; + +} python_interpreter_t; + +static char *DEFAULT_SOURCE_FILENAME = "Python/generic_hash_sp.py"; + +const char *extract_module_name (const char *path) +{ + char *filename = strdup (path); + + remove_file_suffix (filename, ".py"); + + const char *slash = strrchr (filename, '/'); + const char *backslash = strrchr (filename, '\\'); + + const char *module_name = NULL; + + if (slash) + { + module_name = slash + 1; + } + else if (backslash) + { + module_name = backslash + 1; + } + else + { + module_name = filename; + } + + return module_name; +} + +static char *expand_pyenv_libpath (const char *prefix, const int maj, const int min) +{ + char *out = NULL; + + #if defined (_WIN) + const int len = asprintf (&out, "%s/python%d%dt.dll", prefix, maj, min); //untested + #elif defined (__MSYS__) + const int len = asprintf (&out, "%s/msys-python%d.%dt.dll", prefix, maj, min); //untested could be wrong + #elif defined (__APPLE__) + const int len = asprintf (&out, "%s/lib/libpython%d.%dt.dylib", prefix, maj, min); //untested + #elif defined (__CYGWIN__) + const int len = asprintf (&out, "%s/lib/python%d%dt.dll", prefix, maj, min); //untested + #else + const int len = asprintf (&out, "%s/lib/libpython%d.%dt.so", prefix, maj, min); + #endif + + if (len == -1) return NULL; + + struct stat st; + + if (stat (out, &st) != 0) + { + free (out); + + return NULL; + } + + return out; +} + +static int resolve_pyenv_libpath (char *out_buf, const size_t out_sz) +{ + // prefix + + FILE *fp1 = popen ("pyenv prefix", "r"); + + if (fp1 == NULL) return -1; + + char prefix_path[PATH_MAX]; + + if (fgets (prefix_path, sizeof (prefix_path), fp1) == NULL) + { + pclose (fp1); + + return -1; + } + + pclose (fp1); + + superchop_with_length (prefix_path, strlen (prefix_path)); + + int maj = 0; + int min = 0; + + // local + + FILE *fp2 = popen ("pyenv local", "r"); + + if (fp2 == NULL) return -1; + + if (fscanf (fp2, "%d.%d", &maj, &min) == 2) + { + pclose (fp2); + + char *pyenv_libpath = expand_pyenv_libpath (prefix_path, maj, min); + + if (pyenv_libpath != NULL) + { + strncpy (out_buf, pyenv_libpath, out_sz - 1); + + free (pyenv_libpath); + + return 0; + } + + return -1; + } + + pclose (fp2); + + // global + + FILE *fp3 = popen ("pyenv global", "r"); + + if (fp3 == NULL) return -1; + + if (fscanf (fp3, "%d.%d", &maj, &min) == 2) + { + pclose (fp3); + + char *pyenv_libpath = expand_pyenv_libpath (prefix_path, maj, min); + + if (pyenv_libpath != NULL) + { + strncpy (out_buf, pyenv_libpath, out_sz - 1); + + free (pyenv_libpath); + + return 0; + } + + return -1; + } + + pclose (fp3); + + return -1; +} + +static bool init_python (hc_python_lib_t *python) +{ + char pythondll_path[PATH_MAX]; + + python->lib = NULL; + + // let's see if we have pyenv, that will save us a lot of guessing... + + int saved_stderr = suppress_stderr (); + + const int pyenv_rc = resolve_pyenv_libpath (pythondll_path, sizeof (pythondll_path)); + + restore_stderr (saved_stderr); + + if (pyenv_rc == 0) + { + #if defined (_WIN) + python->lib = hc_dlopen (pythondll_path); + #elif defined (__MSYS__) + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #elif defined (__APPLE__) + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #elif defined (__CYGWIN__) + python->lib = hc_dlopen (pythondll_path); + #else + python->lib = dlopen (pythondll_path, RTLD_NOW | RTLD_GLOBAL); + #endif + } + + #define MIN_MAJ 3 + #define MAX_MAJ 8 + + #define MIN_MIN 0 + #define MAX_MIN 50 + + for (int maj = MAX_MAJ; maj >= MIN_MAJ; --maj) + { + if (python->lib != NULL) break; + + for (int min = MAX_MIN; min >= MIN_MIN; --min) + { + #if defined (_WIN) + + // first try %LocalAppData% default path + char expandedPath[MAX_PATH - 1]; + + char *libpython_namelocal = NULL; + + hc_asprintf (&libpython_namelocal, "%%LocalAppData%%\\Programs\\Python\\Python%d%d\\python%d%dt.dll", maj, min, maj, min); + + DWORD len = ExpandEnvironmentStringsA (libpython_namelocal, expandedPath, sizeof (expandedPath)); + + if (len) + { + python->lib = hc_dlopen (expandedPath); + + if (python->lib != NULL) + { + strncpy (pythondll_path, expandedPath, sizeof (pythondll_path) - 1); + + hcfree (libpython_namelocal); + + break; + } + else + { + hcfree (libpython_namelocal); + }; + } + + // use %PATH% + char *libpython_namepath = NULL; + + hc_asprintf (&libpython_namepath, "python%d%dt.dll", maj, min); + + python->lib = hc_dlopen (libpython_namepath); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_namepath, sizeof (pythondll_path) - 1); + + hcfree (libpython_namepath); + + break; + } + else + { + hcfree (libpython_namepath); + }; + + #elif defined (__MSYS__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "msys-python%d.%dt.dll", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #elif defined (__APPLE__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "libpython%d.%dt.dylib", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #elif defined (__CYGWIN__) + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "python%d%dt.dll", maj, min); + + python->lib = hc_dlopen (libpython_name); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #else + + char *libpython_name = NULL; + + hc_asprintf (&libpython_name, "libpython%d.%dt.so", maj, min); + + python->lib = dlopen (libpython_name, RTLD_NOW | RTLD_GLOBAL); + + if (python->lib != NULL) + { + strncpy (pythondll_path, libpython_name, sizeof (pythondll_path) - 1); + + hcfree (libpython_name); + + break; + } + else + { + hcfree (libpython_name); + }; + + #endif + + if (python->lib != NULL) break; + } + + if (python->lib != NULL) break; + } + + if (python->lib == NULL) + { + fprintf (stderr, "Unable to find suitable Python library for -m 72000.\n\n"); + fprintf (stderr, "Most users who encounter this error are just missing the so called 'free-threaded' library support.\n"); + fprintf (stderr, "* On Windows, during install, there's an option 'free-threaded' that you need to click, it's just disabled by default.\n"); + fprintf (stderr, "* On Linux and MacOS, use `pyenv` and select a version that ends with a `t` (for instance `3.13t`).\n"); + fprintf (stderr, " However, on Linux (not MacOS) it's better to use -m 73000 instead. So you probably want to ignore this.\n"); + fprintf (stderr, "\n"); + + return false; + } + else + { + printf ("Loaded python library from: %s\n\n", pythondll_path); + } + + #if defined (_WIN) || defined (__CYGWIN__) || defined (__APPLE__) + + #else + fprintf (stderr, "Attention!!! The 'free-threaded' python library has some major downsides.\n"); + fprintf (stderr, " The main purpose of this module is to give Windows and macOS users a multithreading option.\n"); + fprintf (stderr, " It seems to be a lot slower, and relevant modules such as `cffi` are incompatibile.\n"); + fprintf (stderr, " Since your are on Linux we highly recommend to stick to multiprocessing module.\n"); + fprintf (stderr, " Maybe 'free-threaded' mode will become more mature in the future.\n"); + fprintf (stderr, " For now, we high recommend to stick to -m 73000 instead.\n\n"); + #endif + + #define HC_LOAD_FUNC_PYTHON(ptr,name,pythonname,type,libname,noerr) \ + do { \ + ptr->name = (type) hc_dlsym ((ptr)->lib, #pythonname); \ + if ((noerr) != -1) { \ + if (!(ptr)->name) { \ + if ((noerr) == 1) { \ + fprintf (stderr, "%s is missing from %s shared library.", #name, #libname); \ + return false; \ + } \ + if ((noerr) != 1) { \ + fprintf (stderr, "%s is missing from %s shared library.", #name, #libname); \ + return true; \ + } \ + } \ + } \ + } while (0) + + HC_LOAD_FUNC_PYTHON (python, Py_GetVersion, Py_GetVersion, PYGETVERSION, PYTHON, 1); + + const char *version_str = python->Py_GetVersion (); + + int major = 0; + int minor = 0; + + if (sscanf (version_str, "%d.%d", &major, &minor) != 2) + { + fprintf (stderr, "Python version string is not valid: %s\n", version_str); + + return false; + } + + if ((major < 3) || (major == 3 && minor < 13)) + { + fprintf (stderr, "Python version mismatch: Need at least v3.13\n"); + + return false; + } + + HC_LOAD_FUNC_PYTHON (python, Py_Initialize, Py_Initialize, PY_INITIALIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_Finalize, Py_Finalize, PY_FINALIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_DecRef, Py_DecRef, PY_DECREF, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyBool_FromLong, PyBool_FromLong, PYBOOL_FROMLONG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyBytes_FromStringAndSize, PyBytes_FromStringAndSize, PYBYTES_FROMSTRINGANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_DelItemString, PyDict_DelItemString, PYDICT_DELITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_GetItemString, PyDict_GetItemString, PYDICT_GETITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_New, PyDict_New, PYDICT_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyDict_SetItemString, PyDict_SetItemString, PYDICT_SETITEMSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyErr_Print, PyErr_Print, PYERR_PRINT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyImport_ImportModule, PyImport_ImportModule, PYIMPORT_IMPORTMODULE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyImport_Import, PyImport_Import, PYIMPORT_IMPORT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_Append, PyList_Append, PYLIST_APPEND, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_GetItem, PyList_GetItem, PYLIST_GETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_New, PyList_New, PYLIST_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_SetItem, PyList_SetItem, PYLIST_SETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyList_Size, PyList_Size, PYLIST_SIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyLong_FromLong, PyLong_FromLong, PYLONG_FROMLONG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyObject_CallObject, PyObject_CallObject, PYOBJECT_CALLOBJECT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyObject_GetAttrString, PyObject_GetAttrString, PYOBJECT_GETATTRSTRING, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyTuple_New, PyTuple_New, PYTUPLE_NEW, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyTuple_SetItem, PyTuple_SetItem, PYTUPLE_SETITEM, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_AsUTF8, PyUnicode_AsUTF8, PYUNICODE_ASUTF8, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_AsUTF8AndSize, PyUnicode_AsUTF8AndSize, PYUNICODE_ASUTF8ANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_DecodeFSDefaultAndSize, PyUnicode_DecodeFSDefaultAndSize, PYUNICODE_DECODEFSDEFAULTANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_DecodeFSDefault, PyUnicode_DecodeFSDefault, PYUNICODE_DECODEFSDEFAULT, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_FromStringAndSize, PyUnicode_FromStringAndSize, PYUNICODE_FROMSTRINGANDSIZE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyUnicode_FromString, PyUnicode_FromString, PYUNICODE_FROMSTRING, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_AcquireLock, PyEval_AcquireLock, PYEVAL_ACQUIRELOCK, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_ReleaseLock, PyEval_ReleaseLock, PYEVAL_RELEASELOCK, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Swap, PyThreadState_Swap, PYTHREADSTATE_SWAP, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_NewInterpreter, Py_NewInterpreter, PYNEWINTERPRETER, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_EndInterpreter, Py_EndInterpreter, PYENDINTERPRETER, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyGILState_Ensure, PyGILState_Ensure, PYGILSTATE_ENSURE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyGILState_Release, PyGILState_Release, PYGILSTATE_RELEASE, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_AcquireThread, PyEval_AcquireThread, PYEVAL_ACQUIRETHREAD, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_ReleaseThread, PyEval_ReleaseThread, PYEVAL_RELEASETHREAD, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Clear, PyThreadState_Clear, PYTHREADSTATE_CLEAR, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_Delete, PyThreadState_Delete, PYTHREADSTATE_DELETE, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyThreadState_New, PyThreadState_New, PYTHREADSTATE_NEW, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyInterpreterState_Main, PyInterpreterState_Main, PYINTERPRETERSTATE_MAIN, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, PyEval_InitThreads, PyEval_InitThreads, PYEVAL_INITTHREADS, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_SaveThread, PyEval_SaveThread, PYEVAL_SAVETHREAD, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_NewInterpreterFromConfig, Py_NewInterpreterFromConfig, PYNEWINTERPRETERFROMCONFIG, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_ExitStatusException, Py_ExitStatusException, PYEXITSTATUSEXCEPTION, PYTHON, 1); + //HC_LOAD_FUNC_PYTHON (python, Py_InitializeFromConfig, Py_InitializeFromConfig, PYINITIALIZEFROMCONFIG, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_RestoreThread, PyEval_RestoreThread, PYEVAL_RESTORETHREAD, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, Py_CompileStringExFlags, Py_CompileStringExFlags, PY_COMPILESTRINGEXFLAGS, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_EvalCode, PyEval_EvalCode, PYEVAL_EVALCODE, PYTHON, 1); + HC_LOAD_FUNC_PYTHON (python, PyEval_GetBuiltins, PyEval_GetBuiltins, PYEVAL_GETBUILTINS, PYTHON, 1); + + return true; +} + +static bool units_init (python_interpreter_t *python_interpreter) +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetSystemInfo (&sysinfo); + + int num_devices = sysinfo.dwNumberOfProcessors; + + #else + + int num_devices = sysconf (_SC_NPROCESSORS_ONLN); + + #endif + + unit_t *units_buf = (unit_t *) hccalloc (num_devices, sizeof (unit_t)); + + int units_cnt = 0; + + for (int i = 0; i < num_devices; i++) + { + unit_t *unit_buf = &units_buf[i]; + + hc_python_lib_t *python = python_interpreter->python; + + unit_buf->unit_info_len = snprintf (unit_buf->unit_info_buf, sizeof (unit_buf->unit_info_buf) - 1, "Python Interpreter (%s)", python->Py_GetVersion ()); + + unit_buf->unit_info_buf[unit_buf->unit_info_len] = 0; + + unit_buf->workitem_count = N_ACCEL; + + units_cnt++; + } + + python_interpreter->units_buf = units_buf; + python_interpreter->units_cnt = units_cnt; + + return true; +} + +static void units_term (python_interpreter_t *python_interpreter) +{ + unit_t *units_buf = python_interpreter->units_buf; + + if (units_buf) + { + hcfree (python_interpreter->units_buf); + } +} + +void *platform_init (user_options_t *user_options) +{ + // Verify CPU features + + if (cpu_chipset_test () == -1) return NULL; + + // Allocate platform context + + python_interpreter_t *python_interpreter = (python_interpreter_t *) hcmalloc (sizeof (python_interpreter_t)); + + hc_python_lib_t *python = (hc_python_lib_t *) hcmalloc (sizeof (hc_python_lib_t)); + + python_interpreter->python = python; + + if (init_python (python) == false) return NULL; + + python->Py_Initialize (); + + python_interpreter->thread_state = python->PyEval_SaveThread (); + + python_interpreter->source_filename = (user_options->bridge_parameter1 == NULL) ? DEFAULT_SOURCE_FILENAME : user_options->bridge_parameter1; + + if (units_init (python_interpreter) == false) + { + hcfree (python_interpreter); + + return NULL; + } + + return python_interpreter; +} + +void platform_term (void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + if (python_interpreter == NULL) return; + + hc_python_lib_t *python = python_interpreter->python; + + // python->PyGILState_Ensure (); + + python->PyEval_RestoreThread (python_interpreter->thread_state); + + python->Py_Finalize (); + + units_term (python_interpreter); + + hcfree (python_interpreter); +} + +bool thread_init (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + PyInterpreterConfig config = + { + .use_main_obmalloc = 0, + .allow_fork = 1, + .allow_exec = 1, + .allow_threads = 1, + .allow_daemon_threads = 0, + .check_multi_interp_extensions = 1, + .gil = PyInterpreterConfig_OWN_GIL + }; + + unit_buf->tstate = NULL; + + PyStatus status = python->Py_NewInterpreterFromConfig (&unit_buf->tstate, &config); + + if (status.exitcode) + { + python->PyErr_Print (); + + return false; + } + + PyObject *sys = python->PyImport_ImportModule ("sys"); + PyObject *path = python->PyObject_GetAttrString (sys, "path"); + python->PyList_Append (path, python->PyUnicode_FromString ("./Python")); + python->Py_DecRef (path); + python->Py_DecRef (sys); + + char *source = file_to_buffer (python_interpreter->source_filename); + + if (source == NULL) return NULL; + + PyObject *code = python->Py_CompileStringExFlags (source, python_interpreter->source_filename, Py_file_input, NULL, -1); + + free (source); + + if (code == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pGlobals = python->PyDict_New (); + + python->PyDict_SetItemString (unit_buf->pGlobals, "__builtins__", python->PyEval_GetBuiltins ()); + + PyObject *result = python->PyEval_EvalCode (code, unit_buf->pGlobals, unit_buf->pGlobals); + + if (result == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (result); + + unit_buf->pFunc_Init = python->PyDict_GetItemString (unit_buf->pGlobals, "init"); + + if (unit_buf->pFunc_Init == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pFunc_Term = python->PyDict_GetItemString (unit_buf->pGlobals, "term"); + + if (unit_buf->pFunc_Term == NULL) + { + python->PyErr_Print (); + + return false; + } + + unit_buf->pFunc_kernel_loop = python->PyDict_GetItemString (unit_buf->pGlobals, "kernel_loop"); + + if (unit_buf->pFunc_kernel_loop == NULL) + { + python->PyErr_Print (); + + return false; + } + + // Initialize Context (which also means copy salts because they are part of the context) + + unit_buf->pContext = python->PyDict_New (); + + if (unit_buf->pContext == NULL) + { + python->PyErr_Print (); + + return false; + } + + const char *module_name = extract_module_name (python_interpreter->source_filename); + + int rc = 0; + + + + rc |= python->PyDict_SetItemString (unit_buf->pContext, "module_name", python->PyUnicode_FromString ((const char *) module_name)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_cnt", python->PyLong_FromLong (hashes->salts_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_size", python->PyLong_FromLong (sizeof (salt_t))); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "salts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->salts_buf, sizeof (salt_t) * hashes->salts_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_cnt", python->PyLong_FromLong (hashes->digests_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_size", python->PyLong_FromLong (hashconfig->esalt_size)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "esalts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->esalts_buf, hashconfig->esalt_size * hashes->digests_cnt)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_cnt", python->PyLong_FromLong (1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_size", python->PyLong_FromLong (sizeof (salt_t))); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_salts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->st_salts_buf, sizeof (salt_t) * 1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_cnt", python->PyLong_FromLong (1)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_size", python->PyLong_FromLong (hashconfig->esalt_size)); + rc |= python->PyDict_SetItemString (unit_buf->pContext, "st_esalts_buf", python->PyBytes_FromStringAndSize ((const char *) hashes->st_esalts_buf, hashconfig->esalt_size * 1)); + + if (rc != 0) + { + python->PyErr_Print (); + + return false; + } + + PyObject *pArgs = python->PyTuple_New (1); + + if (pArgs == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->PyTuple_SetItem (pArgs, 0, unit_buf->pContext); + + PyObject *pReturn = python->PyObject_CallObject (unit_buf->pFunc_Init, pArgs); + + if (pReturn == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (pReturn); + + //python->Py_DecRef (pArgs); + + // for later calls + + unit_buf->pArgs = python->PyTuple_New (4); + + if (unit_buf->pArgs == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->PyTuple_SetItem (unit_buf->pArgs, 0, unit_buf->pContext); + python->PyTuple_SetItem (unit_buf->pArgs, 2, python->PyLong_FromLong (0)); + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (false)); + + return true; +} + +void thread_term (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + python->PyDict_DelItemString (unit_buf->pContext, "module_name"); + python->PyDict_DelItemString (unit_buf->pContext, "salts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "salts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "salts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "esalts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "st_salts_buf"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_cnt"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_size"); + python->PyDict_DelItemString (unit_buf->pContext, "st_esalts_buf"); + + PyObject *pArgs = python->PyTuple_New (1); + + if (pArgs == NULL) + { + python->PyErr_Print (); + + return; + } + + python->PyTuple_SetItem (pArgs, 0, unit_buf->pContext); + + python->PyObject_CallObject (unit_buf->pFunc_Term, pArgs); + + python->Py_DecRef (pArgs); + + python->Py_DecRef (unit_buf->pArgs); + python->Py_DecRef (unit_buf->pContext); + python->Py_DecRef (unit_buf->pFunc_kernel_loop); + python->Py_DecRef (unit_buf->pFunc_Term); + python->Py_DecRef (unit_buf->pFunc_Init); + python->Py_DecRef (unit_buf->pGlobals); + + python->Py_EndInterpreter (unit_buf->tstate); +} + +int get_unit_count (void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + return python_interpreter->units_cnt; +} + +// we support units of mixed speed, that's why the workitem count is unit specific + +int get_workitem_count (void *platform_context, const int unit_idx) +{ + python_interpreter_t *python_interpreter = platform_context; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + return unit_buf->workitem_count; +} + +char *get_unit_info (void *platform_context, const int unit_idx) +{ + python_interpreter_t *python_interpreter = platform_context; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + return unit_buf->unit_info_buf; +} + +bool launch_loop (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u64 pws_cnt) +{ + python_interpreter_t *python_interpreter = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &python_interpreter->units_buf[unit_idx]; + + hc_python_lib_t *python = python_interpreter->python; + + generic_io_tmp_t *generic_io_tmp = (generic_io_tmp_t *) device_param->h_tmps; + + PyObject *pws = python->PyList_New (pws_cnt); + + if (pws == NULL) + { + python->PyErr_Print (); + + return false; + } + + for (u64 i = 0; i < pws_cnt; i++) + { + PyObject *pw = python->PyBytes_FromStringAndSize ((char *) generic_io_tmp->pw_buf, generic_io_tmp->pw_len); + + if (pw == NULL) return false; + + python->PyList_SetItem (pws, i, pw); + + generic_io_tmp++; + } + + python->PyTuple_SetItem (unit_buf->pArgs, 1, pws); + python->PyTuple_SetItem (unit_buf->pArgs, 2, python->PyLong_FromLong (salt_pos)); + + if (hashes->salts_buf == hashes->st_salts_buf) + { + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (true)); + } + else + { + python->PyTuple_SetItem (unit_buf->pArgs, 3, python->PyBool_FromLong (false)); + } + + PyObject *pReturn = python->PyObject_CallObject (unit_buf->pFunc_kernel_loop, unit_buf->pArgs); + + if (pReturn == NULL) + { + python->PyErr_Print (); + + return false; + } + + Py_ssize_t retsz = python->PyList_Size (pReturn); + + if (retsz != (Py_ssize_t) pws_cnt) return false; + + generic_io_tmp = (generic_io_tmp_t *) device_param->h_tmps; + + for (Py_ssize_t i = 0; i < retsz; i++) + { + PyObject *hash = python->PyList_GetItem (pReturn, i); + + Py_ssize_t len; + + const char *s = python->PyUnicode_AsUTF8AndSize (hash, &len); + + if (s) + { + memcpy (generic_io_tmp->out_buf, s, len); + + generic_io_tmp->out_len = len; + } + + generic_io_tmp++; + } + + python->Py_DecRef (pReturn); + + return true; +} + +const char *st_update_hash (MAYBE_UNUSED void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + hc_python_lib_t *python = python_interpreter->python; + + python->PyEval_RestoreThread (python_interpreter->thread_state); + + // this is ugly to load that entire thing just to get that one variable + + PyObject *sys = python->PyImport_ImportModule ("sys"); + PyObject *path = python->PyObject_GetAttrString (sys, "path"); + python->PyList_Append (path, python->PyUnicode_FromString ("./Python")); + python->Py_DecRef (path); + python->Py_DecRef (sys); + + char *source = file_to_buffer (python_interpreter->source_filename); + + if (source == NULL) + { + fprintf (stderr, "ERROR: %s: %s\n\n", python_interpreter->source_filename, strerror (errno)); + + return NULL; + } + + PyObject *code = python->Py_CompileStringExFlags (source, python_interpreter->source_filename, Py_file_input, NULL, -1); + + free (source); + + if (code == NULL) + { + python->PyErr_Print (); + + return false; + } + + PyObject *pGlobals = python->PyDict_New (); + + python->PyDict_SetItemString (pGlobals, "__builtins__", python->PyEval_GetBuiltins ()); + + PyObject *result = python->PyEval_EvalCode (code, pGlobals, pGlobals); + + if (result == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (result); + + PyObject *constant = python->PyDict_GetItemString (pGlobals, "ST_HASH"); + + if (constant == NULL) + { + python_interpreter->thread_state = python->PyEval_SaveThread (); + + return NULL; + } + + const char *s = python->PyUnicode_AsUTF8 (constant); + + python->Py_DecRef (constant); + + python_interpreter->thread_state = python->PyEval_SaveThread (); + + return s; +} + +const char *st_update_pass (MAYBE_UNUSED void *platform_context) +{ + python_interpreter_t *python_interpreter = platform_context; + + hc_python_lib_t *python = python_interpreter->python; + + python->PyEval_RestoreThread (python_interpreter->thread_state); + + PyObject *sys = python->PyImport_ImportModule ("sys"); + PyObject *path = python->PyObject_GetAttrString (sys, "path"); + python->PyList_Append (path, python->PyUnicode_FromString ("./Python")); + python->Py_DecRef (path); + python->Py_DecRef (sys); + + // this is ugly to load that entire thing just to get that one variable + + char *source = file_to_buffer (python_interpreter->source_filename); + + if (source == NULL) return NULL; + + PyObject *code = python->Py_CompileStringExFlags (source, python_interpreter->source_filename, Py_file_input, NULL, -1); + + free (source); + + if (code == NULL) + { + python->PyErr_Print (); + + return false; + } + + PyObject *pGlobals = python->PyDict_New (); + + python->PyDict_SetItemString (pGlobals, "__builtins__", python->PyEval_GetBuiltins ()); + + PyObject *result = python->PyEval_EvalCode (code, pGlobals, pGlobals); + + if (result == NULL) + { + python->PyErr_Print (); + + return false; + } + + python->Py_DecRef (result); + + PyObject *constant = python->PyDict_GetItemString (pGlobals, "ST_PASS"); + + if (constant == NULL) + { + python_interpreter->thread_state = python->PyEval_SaveThread (); + + return NULL; + } + + const char *s = python->PyUnicode_AsUTF8 (constant); + + python->Py_DecRef (constant); + + python_interpreter->thread_state = python->PyEval_SaveThread (); + + return s; +} + +void bridge_init (bridge_ctx_t *bridge_ctx) +{ + bridge_ctx->bridge_context_size = BRIDGE_CONTEXT_SIZE_CURRENT; + bridge_ctx->bridge_interface_version = BRIDGE_INTERFACE_VERSION_CURRENT; + + bridge_ctx->platform_init = platform_init; + bridge_ctx->platform_term = platform_term; + bridge_ctx->get_unit_count = get_unit_count; + bridge_ctx->get_unit_info = get_unit_info; + bridge_ctx->get_workitem_count = get_workitem_count; + bridge_ctx->thread_init = thread_init; + bridge_ctx->thread_term = thread_term; + bridge_ctx->salt_prepare = BRIDGE_DEFAULT; + bridge_ctx->salt_destroy = BRIDGE_DEFAULT; + bridge_ctx->launch_loop = launch_loop; + bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; + bridge_ctx->st_update_hash = st_update_hash; + bridge_ctx->st_update_pass = st_update_pass; +} diff --git a/src/bridges/bridge_python_generic_hash_sp.mk b/src/bridges/bridge_python_generic_hash_sp.mk new file mode 100644 index 000000000..cbef434cb --- /dev/null +++ b/src/bridges/bridge_python_generic_hash_sp.mk @@ -0,0 +1,86 @@ +REPORT_MISSING_SO := false +REPORT_MISSING_DLL := false + +ifeq ($(BRIDGE_SUFFIX),so) +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_CONFIG := $(shell command -v python3-config 2>/dev/null) +ifeq ($(PYTHON_CONFIG),) + REPORT_MISSING_SO := true +endif +endif +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_CFLAGS := $(shell python3-config --includes 2>/dev/null) +ifeq ($(strip $(PYTHON_CFLAGS)),) + REPORT_MISSING_SO := true +endif +endif +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_INCLUDE_PATH := $(shell echo "$(PYTHON_CFLAGS)" | sed -n 's/-I\([^ ]*\).*/\1/p') +ifeq ($(PYTHON_INCLUDE_PATH),) + REPORT_MISSING_SO := true +endif +endif +ifeq ($(REPORT_MISSING_SO),false) +PYTHON_HAS_OWN_GIL := $(shell grep -r -q 'PyInterpreterConfig_OWN_GIL' "$(PYTHON_INCLUDE_PATH)" && echo true || echo false) +ifeq ($(PYTHON_HAS_OWN_GIL),false) + REPORT_MISSING_SO := true +endif +endif +endif + +CHECK_DLL := false + +ifeq ($(BRIDGE_SUFFIX),dll) + CHECK_DLL := true +endif +ifeq ($(BUILD_MODE),cross) + CHECK_DLL := true +endif + +ifeq ($(CHECK_DLL),true) +ifeq ($(REPORT_MISSING_DLL),false) +PYTHON_CONFIG := $(shell ls $(WIN_PYTHON)/mingw64/include/python3.12/ 2>/dev/null) +ifeq ($(PYTHON_CONFIG),) + REPORT_MISSING_DLL := true +endif +endif +PYTHON_CFLAGS_WIN := -I$(WIN_PYTHON)/mingw64/include/python3.12/ +endif + +ifeq ($(BUILD_MODE),cross) +bridges/bridge_python_generic_hash_sp.so: src/bridges/bridge_python_generic_hash_sp.c src/cpu_features.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +bridges/bridge_python_generic_hash_sp.dll: src/bridges/bridge_python_generic_hash_sp.c src/cpu_features.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS_WIN) +else +ifeq ($(SHARED),1) +bridges/bridge_python_generic_hash_sp.$(BRIDGE_SUFFIX): src/bridges/bridge_python_generic_hash_sp.c src/cpu_features.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +else +bridges/bridge_python_generic_hash_sp.$(BRIDGE_SUFFIX): src/bridges/bridge_python_generic_hash_sp.c src/cpu_features.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(PYTHON_CFLAGS) +endif +endif + +RED = \033[1;31m +RESET = \033[0m + +ifeq ($(REPORT_MISSING_DLL),true) +bridges/bridge_python_generic_hash_sp.dll: + @echo "" + @echo "$(RED)WARNING$(RESET): Skipping freethreaded plugin 70200: Python Windows headers not found." + @echo " To use -m 70200, you must install the required Python headers." + @echo " Otherwise, you can safely ignore this warning." + @echo " See BUILD_WSL.md how to prepare $(WIN_PYTHON)." + @echo "" +endif + +ifeq ($(REPORT_MISSING_SO),true) +bridges/bridge_python_generic_hash_sp.so: + @echo "" + @echo "$(RED)WARNING$(RESET): Skipping freethreaded plugin 70200: Python 3.12+ headers not found." + @echo " To use -m 70200, you must install the required Python headers." + @echo " Otherwise, you can safely ignore this warning." + @echo " For more information, see 'docs/hashcat-python-plugin-requirements.md'." + @echo "" +endif diff --git a/src/bridges/bridge_scrypt_jane.c b/src/bridges/bridge_scrypt_jane.c new file mode 100644 index 000000000..f6df8fd12 --- /dev/null +++ b/src/bridges/bridge_scrypt_jane.c @@ -0,0 +1,284 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "bridges.h" +#include "memory.h" +#include "shared.h" +#include "cpu_features.h" + +#include "code/scrypt-jane-portable.h" +#include "code/scrypt-jane-hash.h" +#include "code/scrypt-jane-romix.h" + +// good: we can use this multiplier do reduce copy overhead to increase the guessing speed, +// bad: but we also increase the password candidate batch size. +// slow hashes which make use of this bridge probably are used with smaller wordlists, +// and therefore it's easier for hashcat to parallelize if this multiplier is low. +// in the end, it's a trade-off. + +#define N_ACCEL 8 + +#define SCRYPT_R_MAX 16 +#define SCRYPT_P_MAX 16 + +#define SCRYPT_TMP_SIZE (128ULL * SCRYPT_R_MAX * SCRYPT_P_MAX) +#define SCRYPT_TMP_SIZE4 (SCRYPT_TMP_SIZE / 4) + +typedef struct +{ + u32 P[SCRYPT_TMP_SIZE4]; + +} scrypt_tmp_t; + +typedef struct +{ + void *V; + //void *X; + void *Y; + + // implementation specific + + char unit_info_buf[1024]; + int unit_info_len; + + u64 workitem_count; + size_t workitem_size; + +} unit_t; + +typedef struct +{ + unit_t *units_buf; + int units_cnt; + +} bridge_scrypt_jane_t; + +static bool units_init (bridge_scrypt_jane_t *bridge_scrypt_jane) +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetSystemInfo (&sysinfo); + + int num_devices = sysinfo.dwNumberOfProcessors; + + #else + + int num_devices = sysconf (_SC_NPROCESSORS_ONLN); + + #endif + + unit_t *units_buf = (unit_t *) hccalloc (num_devices, sizeof (unit_t)); + + int units_cnt = 0; + + for (int i = 0; i < num_devices; i++) + { + unit_t *unit_buf = &units_buf[i]; + + unit_buf->unit_info_len = snprintf (unit_buf->unit_info_buf, sizeof (unit_buf->unit_info_buf) - 1, + "%s", + "Scrypt-Jane ROMix"); + + unit_buf->unit_info_buf[unit_buf->unit_info_len] = 0; + + unit_buf->workitem_count = N_ACCEL; + + units_cnt++; + } + + bridge_scrypt_jane->units_buf = units_buf; + bridge_scrypt_jane->units_cnt = units_cnt; + + return true; +} + +static void units_term (bridge_scrypt_jane_t *bridge_scrypt_jane) +{ + if (bridge_scrypt_jane) + { + hcfree (bridge_scrypt_jane->units_buf); + } +} + +void *platform_init () +{ + // Verify CPU features + + if (cpu_chipset_test () == -1) return NULL; + + // Allocate platform context + + bridge_scrypt_jane_t *bridge_scrypt_jane = (bridge_scrypt_jane_t *) hcmalloc (sizeof (bridge_scrypt_jane_t)); + + if (units_init (bridge_scrypt_jane) == false) + { + hcfree (bridge_scrypt_jane); + + return NULL; + } + + return bridge_scrypt_jane; +} + +void platform_term (void *platform_context) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + if (bridge_scrypt_jane) + { + units_term (bridge_scrypt_jane); + + hcfree (bridge_scrypt_jane); + } +} + +int get_unit_count (void *platform_context) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + return bridge_scrypt_jane->units_cnt; +} + +// we support units of mixed speed, that's why the workitem count is unit specific + +int get_workitem_count (void *platform_context, const int unit_idx) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + unit_t *unit_buf = &bridge_scrypt_jane->units_buf[unit_idx]; + + return unit_buf->workitem_count; +} + +char *get_unit_info (void *platform_context, const int unit_idx) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + unit_t *unit_buf = &bridge_scrypt_jane->units_buf[unit_idx]; + + return unit_buf->unit_info_buf; +} + +bool salt_prepare (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + // selftest hash + + salt_t *scrypt_st = (salt_t *) hashes->st_salts_buf; + + const size_t chunk_bytes = 64 * 2 * scrypt_st->scrypt_r; + + size_t largest_V = chunk_bytes * scrypt_st->scrypt_N; + //size_t largest_X = chunk_bytes * scrypt_st->scrypt_p; + size_t largest_Y = chunk_bytes; + + // from here regular hashes + + salt_t *scrypt = (salt_t *) hashes->salts_buf; + + for (u32 salt_idx = 0; salt_idx < hashes->salts_cnt; salt_idx++, scrypt++) + { + const size_t chunk_bytes = 64 * 2 * scrypt->scrypt_r; + + const size_t sz_V = chunk_bytes * scrypt->scrypt_N; + //const size_t sz_X = chunk_bytes * scrypt->scrypt_p; + const size_t sz_Y = chunk_bytes; + + if (sz_V > largest_V) largest_V = sz_V; + //if (sz_X > largest_X) largest_X = sz_X; + if (sz_Y > largest_Y) largest_Y = sz_Y; + } + + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_scrypt_jane->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_scrypt_jane->units_buf[unit_idx]; + + unit_buf->V = hcmalloc_aligned (largest_V, 64); + //unit_buf->X = hcmalloc_aligned (largest_X, 64); + unit_buf->Y = hcmalloc_aligned (largest_Y, 64); + } + + return true; +} + +void salt_destroy (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_scrypt_jane->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_scrypt_jane->units_buf[unit_idx]; + + hcfree_aligned (unit_buf->V); + //hcfree_aligned (unit_buf->X); + hcfree_aligned (unit_buf->Y); + } +} + +bool launch_loop (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u64 pws_cnt) +{ + bridge_scrypt_jane_t *bridge_scrypt_jane = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &bridge_scrypt_jane->units_buf[unit_idx]; + + salt_t *salts_buf = (salt_t *) hashes->salts_buf; + + salt_t *salt_buf = &salts_buf[salt_pos]; + + scrypt_tmp_t *scrypt_tmp = (scrypt_tmp_t *) device_param->h_tmps; + + scrypt_mix_word_t *V = unit_buf->V; + //scrypt_mix_word_t *X = unit_buf->X; + scrypt_mix_word_t *Y = unit_buf->Y; + + const u32 N = salt_buf->scrypt_N; + const u32 r = salt_buf->scrypt_r; + const u32 p = salt_buf->scrypt_p; + + const size_t chunk_bytes = 64 * 2 * r; + + // hashcat guarantees h_tmps[] is 64 byte aligned + + for (u64 pw_cnt = 0; pw_cnt < pws_cnt; pw_cnt++) + { + u8 *X = (u8 *) scrypt_tmp->P; + + for (u32 i = 0; i < p; i++) + { + scrypt_ROMix ((scrypt_mix_word_t *) (X + (chunk_bytes * i)), (scrypt_mix_word_t *) Y, (scrypt_mix_word_t *) V, N, r); + } + + scrypt_tmp++; + } + + return true; +} + +void bridge_init (bridge_ctx_t *bridge_ctx) +{ + bridge_ctx->bridge_context_size = BRIDGE_CONTEXT_SIZE_CURRENT; + bridge_ctx->bridge_interface_version = BRIDGE_INTERFACE_VERSION_CURRENT; + + bridge_ctx->platform_init = platform_init; + bridge_ctx->platform_term = platform_term; + bridge_ctx->get_unit_count = get_unit_count; + bridge_ctx->get_unit_info = get_unit_info; + bridge_ctx->get_workitem_count = get_workitem_count; + bridge_ctx->thread_init = BRIDGE_DEFAULT; + bridge_ctx->thread_term = BRIDGE_DEFAULT; + bridge_ctx->salt_prepare = salt_prepare; + bridge_ctx->salt_destroy = salt_destroy; + bridge_ctx->launch_loop = launch_loop; + bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; + bridge_ctx->st_update_hash = BRIDGE_DEFAULT; + bridge_ctx->st_update_pass = BRIDGE_DEFAULT; +} diff --git a/src/bridges/bridge_scrypt_jane.mk b/src/bridges/bridge_scrypt_jane.mk new file mode 100644 index 000000000..9aa789fc3 --- /dev/null +++ b/src/bridges/bridge_scrypt_jane.mk @@ -0,0 +1,30 @@ + +SCRYPT_JANE := deps/scrypt-jane-master +SCRYPT_JANE_CFLAGS := -I$(SCRYPT_JANE)/ -DSCRYPT_SHA256 -DSCRYPT_SALSA -DSCRYPT_CHOOSE_COMPILETIME -Wno-unused-function -Wno-unused-but-set-variable + +ifeq ($(BUILD_MODE),cross) +SCRYPT_JANE_CFLAGS += -mavx2 +else +ifeq ($(UNAME),Darwin) +ifeq ($(IS_APPLE_SILICON),0) +SCRYPT_JANE_CFLAGS += -mavx2 +endif +else +SCRYPT_JANE_CFLAGS += -march=native +endif +endif + +ifeq ($(BUILD_MODE),cross) +bridges/bridge_scrypt_jane.so: src/bridges/bridge_scrypt_jane.c src/cpu_features.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_JANE_CFLAGS) +bridges/bridge_scrypt_jane.dll: src/bridges/bridge_scrypt_jane.c src/cpu_features.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_JANE_CFLAGS) +else +ifeq ($(SHARED),1) +bridges/bridge_scrypt_jane.$(BRIDGE_SUFFIX): src/bridges/bridge_scrypt_jane.c src/cpu_features.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_JANE_CFLAGS) +else +bridges/bridge_scrypt_jane.$(BRIDGE_SUFFIX): src/bridges/bridge_scrypt_jane.c src/cpu_features.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_JANE_CFLAGS) +endif +endif diff --git a/src/bridges/bridge_scrypt_yescrypt.c b/src/bridges/bridge_scrypt_yescrypt.c new file mode 100644 index 000000000..4e709153f --- /dev/null +++ b/src/bridges/bridge_scrypt_yescrypt.c @@ -0,0 +1,277 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "bridges.h" +#include "memory.h" +#include "shared.h" +#include "cpu_features.h" + +#include "yescrypt.h" + +void smix(uint8_t *B, size_t r, uint32_t N, uint32_t p, uint32_t t, + yescrypt_flags_t flags, + void *V, uint32_t NROM, const void *VROM, + void *XY, uint8_t *S, uint8_t *passwd); + +// good: we can use this multiplier do reduce copy overhead to increase the guessing speed, +// bad: but we also increase the password candidate batch size. +// slow hashes which make use of this bridge probably are used with smaller wordlists, +// and therefore it's easier for hashcat to parallelize if this multiplier is low. +// in the end, it's a trade-off. + +#define N_ACCEL 8 + +#define SCRYPT_R_MAX 16 +#define SCRYPT_P_MAX 16 + +#define SCRYPT_TMP_SIZE (128ULL * SCRYPT_R_MAX * SCRYPT_P_MAX) +#define SCRYPT_TMP_SIZE4 (SCRYPT_TMP_SIZE / 4) + +typedef struct +{ + u32 B[SCRYPT_TMP_SIZE4]; + +} scrypt_tmp_t; + +typedef struct +{ + void *V; + void *XY; + + // implementation specific + + char unit_info_buf[1024]; + int unit_info_len; + + u64 workitem_count; + size_t workitem_size; + +} unit_t; + +typedef struct +{ + unit_t *units_buf; + int units_cnt; + +} bridge_scrypt_yescrypt_t; + +static bool units_init (bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt) +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetSystemInfo (&sysinfo); + + int num_devices = sysinfo.dwNumberOfProcessors; + + #else + + int num_devices = sysconf (_SC_NPROCESSORS_ONLN); + + #endif + + unit_t *units_buf = (unit_t *) hccalloc (num_devices, sizeof (unit_t)); + + int units_cnt = 0; + + for (int i = 0; i < num_devices; i++) + { + unit_t *unit_buf = &units_buf[i]; + + unit_buf->unit_info_len = snprintf (unit_buf->unit_info_buf, sizeof (unit_buf->unit_info_buf) - 1, + "%s", + "Scrypt-Yescrypt"); + + unit_buf->unit_info_buf[unit_buf->unit_info_len] = 0; + + unit_buf->workitem_count = N_ACCEL; + + units_cnt++; + } + + bridge_scrypt_yescrypt->units_buf = units_buf; + bridge_scrypt_yescrypt->units_cnt = units_cnt; + + return true; +} + +static void units_term (bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt) +{ + if (bridge_scrypt_yescrypt) + { + hcfree (bridge_scrypt_yescrypt->units_buf); + } +} + +void *platform_init () +{ + // Verify CPU features + + if (cpu_chipset_test () == -1) return NULL; + + // Allocate platform context + + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = (bridge_scrypt_yescrypt_t *) hcmalloc (sizeof (bridge_scrypt_yescrypt_t)); + + if (units_init (bridge_scrypt_yescrypt) == false) + { + hcfree (bridge_scrypt_yescrypt); + + return NULL; + } + + return bridge_scrypt_yescrypt; +} + +void platform_term (void *platform_context) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + if (bridge_scrypt_yescrypt) + { + units_term (bridge_scrypt_yescrypt); + + hcfree (bridge_scrypt_yescrypt); + } +} + +int get_unit_count (void *platform_context) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + return bridge_scrypt_yescrypt->units_cnt; +} + +// we support units of mixed speed, that's why the workitem count is unit specific + +int get_workitem_count (void *platform_context, const int unit_idx) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + unit_t *unit_buf = &bridge_scrypt_yescrypt->units_buf[unit_idx]; + + return unit_buf->workitem_count; +} + +char *get_unit_info (void *platform_context, const int unit_idx) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + unit_t *unit_buf = &bridge_scrypt_yescrypt->units_buf[unit_idx]; + + return unit_buf->unit_info_buf; +} + +bool salt_prepare (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + // selftest hash + + salt_t *scrypt_st = (salt_t *) hashes->st_salts_buf; + + size_t largest_V = 128 * scrypt_st->scrypt_r * scrypt_st->scrypt_N; // yescrypt: the temporary storage V must be 128rN bytes in length + size_t largest_XY = 256 * scrypt_st->scrypt_r * scrypt_st->scrypt_p; // yescrypt: the temporary storage XY must be 256r or 256rp bytes in length + + // from here regular hashes + + salt_t *scrypt = (salt_t *) hashes->salts_buf; + + for (u32 salt_idx = 0; salt_idx < hashes->salts_cnt; salt_idx++, scrypt++) + { + const size_t sz_V = 128 * scrypt->scrypt_r * scrypt->scrypt_N; // yescrypt: the temporary storage V must be 128rN bytes in length + const size_t sz_XY = 256 * scrypt->scrypt_r * scrypt->scrypt_p; // yescrypt: the temporary storage XY must be 256r or 256rp bytes in length + + if (sz_V > largest_V) largest_V = sz_V; + if (sz_XY > largest_XY) largest_XY = sz_XY; + } + + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_scrypt_yescrypt->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_scrypt_yescrypt->units_buf[unit_idx]; + + unit_buf->V = hcmalloc_aligned (largest_V, 64); + unit_buf->XY = hcmalloc_aligned (largest_XY, 64); + } + + return true; +} + +void salt_destroy (void *platform_context, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + for (int unit_idx = 0; unit_idx < bridge_scrypt_yescrypt->units_cnt; unit_idx++) + { + unit_t *unit_buf = &bridge_scrypt_yescrypt->units_buf[unit_idx]; + + hcfree_aligned (unit_buf->V); + hcfree_aligned (unit_buf->XY); + } +} + +bool launch_loop (MAYBE_UNUSED void *platform_context, MAYBE_UNUSED hc_device_param_t *device_param, MAYBE_UNUSED hashconfig_t *hashconfig, MAYBE_UNUSED hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u64 pws_cnt) +{ + bridge_scrypt_yescrypt_t *bridge_scrypt_yescrypt = platform_context; + + const int unit_idx = device_param->bridge_link_device; + + unit_t *unit_buf = &bridge_scrypt_yescrypt->units_buf[unit_idx]; + + salt_t *salts_buf = (salt_t *) hashes->salts_buf; + + salt_t *salt_buf = &salts_buf[salt_pos]; + + // hashcat guarantees h_tmps[] is 64 byte aligned, so is *B + + scrypt_tmp_t *scrypt_tmp = (scrypt_tmp_t *) device_param->h_tmps; + + for (u64 pw_cnt = 0; pw_cnt < pws_cnt; pw_cnt++) + { + u8 *B = (u8 *) scrypt_tmp->B; + + // We could use p-based parallelization from yescrypt instead, + // but since we're already multi-threading, there's no need to run OpenMP. + // With that in mind, we can optimize by using a constant p=1, + // allowing the compiler to eliminate branches in smix(). + + for (u32 i = 0; i < salt_buf->scrypt_p; i++) + { + // Same here: using constants allows the compiler to optimize away branches in smix(), + // so there's no need to call smix1()/smix2() directly and unnecessarily complicate the code. + + smix (B, salt_buf->scrypt_r, salt_buf->scrypt_N, 1, 0, 0, unit_buf->V, 0, NULL, unit_buf->XY, NULL, NULL); + + B += 128 * salt_buf->scrypt_r; + } + + scrypt_tmp++; + } + + return true; +} + +void bridge_init (bridge_ctx_t *bridge_ctx) +{ + bridge_ctx->bridge_context_size = BRIDGE_CONTEXT_SIZE_CURRENT; + bridge_ctx->bridge_interface_version = BRIDGE_INTERFACE_VERSION_CURRENT; + + bridge_ctx->platform_init = platform_init; + bridge_ctx->platform_term = platform_term; + bridge_ctx->get_unit_count = get_unit_count; + bridge_ctx->get_unit_info = get_unit_info; + bridge_ctx->get_workitem_count = get_workitem_count; + bridge_ctx->thread_init = BRIDGE_DEFAULT; + bridge_ctx->thread_term = BRIDGE_DEFAULT; + bridge_ctx->salt_prepare = salt_prepare; + bridge_ctx->salt_destroy = salt_destroy; + bridge_ctx->launch_loop = launch_loop; + bridge_ctx->launch_loop2 = BRIDGE_DEFAULT; + bridge_ctx->st_update_hash = BRIDGE_DEFAULT; + bridge_ctx->st_update_pass = BRIDGE_DEFAULT; +} diff --git a/src/bridges/bridge_scrypt_yescrypt.mk b/src/bridges/bridge_scrypt_yescrypt.mk new file mode 100644 index 000000000..046450a33 --- /dev/null +++ b/src/bridges/bridge_scrypt_yescrypt.mk @@ -0,0 +1,30 @@ + +SCRYPT_YESCRYPT := deps/yescrypt-master +SCRYPT_YESCRYPT_CFLAGS := -I$(SCRYPT_YESCRYPT)/ -DSKIP_MEMZERO -Wno-cpp -Wno-type-limits + +ifeq ($(BUILD_MODE),cross) +SCRYPT_YESCRYPT_CFLAGS += -mavx2 +else +ifeq ($(UNAME),Darwin) +ifeq ($(IS_APPLE_SILICON),0) +SCRYPT_YESCRYPT_CFLAGS += -mavx2 +endif +else +SCRYPT_YESCRYPT_CFLAGS += -march=native +endif +endif + +ifeq ($(BUILD_MODE),cross) +bridges/bridge_scrypt_yescrypt.so: src/bridges/bridge_scrypt_yescrypt.c src/cpu_features.c $(SCRYPT_YESCRYPT)/yescrypt-opt.c $(SCRYPT_YESCRYPT)/sha256.c obj/combined.LINUX.a + $(CC_LINUX) $(CCFLAGS) $(CFLAGS_CROSS_LINUX) $^ -o $@ $(LFLAGS_CROSS_LINUX) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_YESCRYPT_CFLAGS) +bridges/bridge_scrypt_yescrypt.dll: src/bridges/bridge_scrypt_yescrypt.c src/cpu_features.c $(SCRYPT_YESCRYPT)/yescrypt-opt.c $(SCRYPT_YESCRYPT)/sha256.c obj/combined.WIN.a + $(CC_WIN) $(CCFLAGS) $(CFLAGS_CROSS_WIN) $^ -o $@ $(LFLAGS_CROSS_WIN) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_YESCRYPT_CFLAGS) +else +ifeq ($(SHARED),1) +bridges/bridge_scrypt_yescrypt.$(BRIDGE_SUFFIX): src/bridges/bridge_scrypt_yescrypt.c src/cpu_features.c $(SCRYPT_YESCRYPT)/yescrypt-opt.c $(SCRYPT_YESCRYPT)/sha256.c $(HASHCAT_LIBRARY) + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_YESCRYPT_CFLAGS) +else +bridges/bridge_scrypt_yescrypt.$(BRIDGE_SUFFIX): src/bridges/bridge_scrypt_yescrypt.c src/cpu_features.c $(SCRYPT_YESCRYPT)/yescrypt-opt.c $(SCRYPT_YESCRYPT)/sha256.c obj/combined.NATIVE.a + $(CC) $(CCFLAGS) $(CFLAGS_NATIVE) $^ -o $@ $(LFLAGS_NATIVE) -shared -fPIC -D BRIDGE_INTERFACE_VERSION_CURRENT=$(BRIDGE_INTERFACE_VERSION) $(SCRYPT_YESCRYPT_CFLAGS) +endif +endif diff --git a/src/cpu_features.c b/src/cpu_features.c new file mode 100644 index 000000000..cf00a8438 --- /dev/null +++ b/src/cpu_features.c @@ -0,0 +1,192 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "cpu_features.h" + +#if defined(__aarch64__) || defined(__arm64__) + +int cpu_supports_sse2 () { return 1; } +int cpu_supports_ssse3 () { return 0; } +int cpu_supports_xop () { return 0; } +int cpu_supports_avx2 () { return 0; } +int cpu_supports_avx512f () { return 0; } +int cpu_supports_avx512vl () { return 0; } + +#else +static inline void cpuid (u32 leaf, u32 subleaf, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx) +{ + __cpuid_count (leaf, subleaf, *eax, *ebx, *ecx, *edx); +} + +static inline u64 xgetbv (u32 index) +{ + u32 eax, edx; + + __asm__ volatile (".byte 0x0f, 0x01, 0xd0" + : "=a"(eax), "=d"(edx) + : "c"(index)); + + return ((u64)edx << 32) | eax; +} + +// Should always be present on 64 bit? +int cpu_supports_sse2 () +{ + u32 eax, ebx, ecx, edx; + + cpuid (1, 0, &eax, &ebx, &ecx, &edx); + + return (edx & bit_SSE2) != 0; +} + +int cpu_supports_ssse3 () +{ + u32 eax, ebx, ecx, edx; + + cpuid (1, 0, &eax, &ebx, &ecx, &edx); + + return (ecx & bit_SSSE3) != 0; +} + +int cpu_supports_xop () +{ + u32 eax, ebx, ecx, edx; + + cpuid (0x80000000, 0, &eax, &ebx, &ecx, &edx); + + if (eax < 0x80000001) + { + return 0; + } + + cpuid (0x80000001, 0, &eax, &ebx, &ecx, &edx); + + return (ecx & (1 << 11)) != 0; // No macro for XOP +} + +int cpu_supports_avx2 () +{ + u32 eax, ebx, ecx, edx; + + cpuid (1, 0, &eax, &ebx, &ecx, &edx); + + if (!(ecx & bit_OSXSAVE) || !(ecx & bit_AVX)) + { + return 0; + } + + if ((xgetbv(0) & 0x6) != 0x6) // XMM and YMM state + { + return 0; + } + + cpuid (7, 0, &eax, &ebx, &ecx, &edx); + + return (ebx & bit_AVX2) != 0; +} + +int cpu_supports_avx512f () +{ + u32 eax, ebx, ecx, edx; + + cpuid (1, 0, &eax, &ebx, &ecx, &edx); + + if (!(ecx & bit_OSXSAVE) || !(ecx & bit_AVX)) + { + return 0; + } + + if ((xgetbv(0) & 0xE6) != 0xE6) + { + return 0; + } + + cpuid (7, 0, &eax, &ebx, &ecx, &edx); + + return (ebx & bit_AVX512F) != 0; +} + +int cpu_supports_avx512vl () +{ + u32 eax, ebx, ecx, edx; + + cpuid (1, 0, &eax, &ebx, &ecx, &edx); + + if (!(ecx & bit_OSXSAVE) || !(ecx & bit_AVX)) + { + return 0; + } + + if ((xgetbv(0) & 0xE6) != 0xE6) + { + return 0; + } + + cpuid (7, 0, &eax, &ebx, &ecx, &edx); + + return (ebx & (1u << 31)) != 0; +} +#endif + +int cpu_chipset_test () +{ + #ifdef __SSE2__ + if (cpu_supports_sse2 () == 0) + { + fprintf (stderr, "ERROR: Compiled with SSE2 but CPU does not support it.\n"); + + return -1; + } + #endif + + #ifdef __SSSE3__ + if (cpu_supports_ssse3 () == 0) + { + fprintf (stderr, "ERROR: Compiled with SSSE3 but CPU does not support it.\n"); + + return -1; + } + #endif + + #ifdef __XOP__ + if (cpu_supports_xop () == 0) + { + fprintf (stderr, "ERROR: Compiled with XOP but CPU does not support it.\n"); + + return -1; + } + #endif + + #ifdef __AVX2__ + if (cpu_supports_avx2 () == 0) + { + fprintf (stderr, "ERROR: Compiled with AVX2 but CPU does not support it.\n"); + + return -1; + } + #endif + + #ifdef __AVX512F__ + if (cpu_supports_avx512f () == 0) + { + fprintf (stderr, "ERROR: Compiled with AVX512F but CPU does not support it.\n"); + + return -1; + } + #endif + + #ifdef __AVX512VL__ + if (cpu_supports_avx512vl () == 0) + { + fprintf (stderr, "ERROR: Compiled with AVX512VL but CPU does not support it.\n"); + + return -1; + } + #endif + + return 0; +} diff --git a/src/dispatch.c b/src/dispatch.c index fdb0b441d..ad7c9851b 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -355,6 +355,9 @@ HC_API_CALL void *thread_calc_stdin (void *p) hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; if (backend_ctx->enabled == false) return NULL; @@ -363,6 +366,14 @@ HC_API_CALL void *thread_calc_stdin (void *p) if (device_param->skipped) return NULL; if (device_param->skipped_warning == true) return NULL; + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_init != BRIDGE_DEFAULT) + { + if (bridge_ctx->thread_init (bridge_ctx->platform_context, device_param, hashconfig, hashes) == false) return NULL; + } + } + if (device_param->is_cuda == true) { if (hc_cuCtxPushCurrent (hashcat_ctx, device_param->cuda_context) == -1) return NULL; @@ -390,6 +401,14 @@ HC_API_CALL void *thread_calc_stdin (void *p) if (hc_hipCtxPopCurrent (hashcat_ctx, &device_param->hip_context) == -1) return NULL; } + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_term != BRIDGE_DEFAULT) + { + bridge_ctx->thread_term (bridge_ctx->platform_context, device_param, hashconfig, hashes); + } + } + return NULL; } @@ -1640,6 +1659,9 @@ HC_API_CALL void *thread_calc (void *p) hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; if (backend_ctx->enabled == false) return NULL; @@ -1648,6 +1670,14 @@ HC_API_CALL void *thread_calc (void *p) if (device_param->skipped) return NULL; if (device_param->skipped_warning == true) return NULL; + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_init != BRIDGE_DEFAULT) + { + if (bridge_ctx->thread_init (bridge_ctx->platform_context, device_param, hashconfig, hashes) == false) return NULL; + } + } + if (device_param->is_cuda == true) { if (hc_cuCtxPushCurrent (hashcat_ctx, device_param->cuda_context) == -1) return NULL; @@ -1675,5 +1705,13 @@ HC_API_CALL void *thread_calc (void *p) if (hc_hipCtxPopCurrent (hashcat_ctx, &device_param->hip_context) == -1) return NULL; } + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_term != BRIDGE_DEFAULT) + { + bridge_ctx->thread_term (bridge_ctx->platform_context, device_param, hashconfig, hashes); + } + } + return NULL; } diff --git a/src/ext_cuda.c b/src/ext_cuda.c index dbafa065e..4c0db9ffb 100644 --- a/src/ext_cuda.c +++ b/src/ext_cuda.c @@ -107,6 +107,9 @@ int cuda_init (void *hashcat_ctx) HC_LOAD_FUNC_CUDA (cuda, cuStreamDestroy, cuStreamDestroy_v2, CUDA_CUSTREAMDESTROY, CUDA, 1); HC_LOAD_FUNC_CUDA (cuda, cuStreamSynchronize, cuStreamSynchronize, CUDA_CUSTREAMSYNCHRONIZE, CUDA, 1); HC_LOAD_FUNC_CUDA (cuda, cuStreamWaitEvent, cuStreamWaitEvent, CUDA_CUSTREAMWAITEVENT, CUDA, 1); + HC_LOAD_FUNC_CUDA (cuda, cuStreamWaitEvent, cuStreamWaitEvent, CUDA_CUSTREAMWAITEVENT, CUDA, 1); + HC_LOAD_FUNC_CUDA (cuda, cuOccupancyMaxActiveBlocksPerMultiprocessor, cuOccupancyMaxActiveBlocksPerMultiprocessor, CUDA_CUOCCUPANCYMAXBLOCKSPERMULTIPROCESSOR, CUDA, 1); + #if defined (WITH_CUBIN) HC_LOAD_FUNC_CUDA (cuda, cuLinkCreate, cuLinkCreate_v2, CUDA_CULINKCREATE, CUDA, 1); HC_LOAD_FUNC_CUDA (cuda, cuLinkAddData, cuLinkAddData_v2, CUDA_CULINKADDDATA, CUDA, 1); @@ -1269,3 +1272,31 @@ int hc_cuLinkComplete (void *hashcat_ctx, CUlinkState state, void **cubinOut, si return 0; } + +int hc_cuOccupancyMaxActiveBlocksPerMultiprocessor (void *hashcat_ctx, int *numBlocks, CUfunction func, int blockSize, size_t dynamicSMemSize) +{ + backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx; + + CUDA_PTR *cuda = (CUDA_PTR *) backend_ctx->cuda; + + const CUresult CU_err = cuda->cuOccupancyMaxActiveBlocksPerMultiprocessor (numBlocks, func, blockSize, dynamicSMemSize); + + if (CU_err != CUDA_SUCCESS) + { + const char *pStr = NULL; + + if (cuda->cuGetErrorString (CU_err, &pStr) == CUDA_SUCCESS) + { + event_log_error (hashcat_ctx, "cuOccupancyMaxActiveBlocksPerMultiprocessor(): %s", pStr); + } + else + { + event_log_error (hashcat_ctx, "cuOccupancyMaxActiveBlocksPerMultiprocessor(): %d", CU_err); + } + + return -1; + } + + return 0; +} + diff --git a/src/ext_hip.c b/src/ext_hip.c index 0611733aa..c0145504b 100644 --- a/src/ext_hip.c +++ b/src/ext_hip.c @@ -154,6 +154,8 @@ int hip_init (void *hashcat_ctx) HC_LOAD_FUNC_HIP (hip, hipStreamCreate, hipStreamCreate, HIP_HIPSTREAMCREATE, HIP, 1); HC_LOAD_FUNC_HIP (hip, hipStreamDestroy, hipStreamDestroy, HIP_HIPSTREAMDESTROY, HIP, 1); HC_LOAD_FUNC_HIP (hip, hipStreamSynchronize, hipStreamSynchronize, HIP_HIPSTREAMSYNCHRONIZE, HIP, 1); + HC_LOAD_FUNC_HIP (hip, hipGetDeviceProperties, hipGetDevicePropertiesR0600, HIP_HIPGETDEVICEPROPERTIES, HIP, 1); + HC_LOAD_FUNC_HIP (hip, hipModuleOccupancyMaxActiveBlocksPerMultiprocessor, hipModuleOccupancyMaxActiveBlocksPerMultiprocessor, HIP_HIPMODULEOCCUPANCYMAXACTIVEBLOCKSPERMULTIPROCESSOR, HIP, 1); return 0; } @@ -1148,3 +1150,57 @@ int hc_hipStreamSynchronize (void *hashcat_ctx, hipStream_t hStream) return 0; } + +int hc_hipGetDeviceProperties (void *hashcat_ctx, hipDeviceProp_t *prop, hipDevice_t dev) +{ + backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx; + + HIP_PTR *hip = (HIP_PTR *) backend_ctx->hip; + + const hipError_t HIP_err = hip->hipGetDeviceProperties (prop, dev); + + if (HIP_err != hipSuccess) + { + const char *pStr = NULL; + + if (hip->hipGetErrorString (HIP_err, &pStr) == hipSuccess) + { + event_log_error (hashcat_ctx, "hipDeviceGetAttribute(): %s", pStr); + } + else + { + event_log_error (hashcat_ctx, "hipDeviceGetAttribute(): %d", HIP_err); + } + + return -1; + } + + return 0; +} + +int hc_hipModuleOccupancyMaxActiveBlocksPerMultiprocessor (void *hashcat_ctx, int *numBlocks, hipFunction_t f, int blockSize, size_t dynSharedMemPerBlk) +{ + backend_ctx_t *backend_ctx = ((hashcat_ctx_t *) hashcat_ctx)->backend_ctx; + + HIP_PTR *hip = (HIP_PTR *) backend_ctx->hip; + + const hipError_t HIP_err = hip->hipModuleOccupancyMaxActiveBlocksPerMultiprocessor (numBlocks, f, blockSize, dynSharedMemPerBlk); + + if (HIP_err != hipSuccess) + { + const char *pStr = NULL; + + if (hip->hipGetErrorString (HIP_err, &pStr) == hipSuccess) + { + event_log_error (hashcat_ctx, "hipModuleOccupancyMaxActiveBlocksPerMultiprocessor(): %s", pStr); + } + else + { + event_log_error (hashcat_ctx, "hipModuleOccupancyMaxActiveBlocksPerMultiprocessor(): %d", HIP_err); + } + + return -1; + } + + return 0; +} diff --git a/src/ext_nvml.c b/src/ext_nvml.c index 25911df14..e6d49cd08 100644 --- a/src/ext_nvml.c +++ b/src/ext_nvml.c @@ -149,6 +149,7 @@ int nvml_init (void *hashcat_ctx) HC_LOAD_FUNC(nvml, nvmlDeviceGetCurrentClocksThrottleReasons, NVML_DEVICE_GET_CURRENTCLOCKSTHROTTLEREASONS, NVML, 0); HC_LOAD_FUNC(nvml, nvmlDeviceGetSupportedClocksThrottleReasons, NVML_DEVICE_GET_SUPPORTEDCLOCKSTHROTTLEREASONS, NVML, 0); HC_LOAD_FUNC(nvml, nvmlDeviceGetPciInfo, NVML_DEVICE_GET_PCIINFO, NVML, 0); + HC_LOAD_FUNC(nvml, nvmlDeviceGetMemoryInfo, NVML_DEVICE_GET_MEMORYINFO, NVML, 0); return 0; } @@ -392,3 +393,24 @@ int hm_NVML_nvmlDeviceGetPciInfo (void *hashcat_ctx, nvmlDevice_t device, nvmlPc return 0; } + +int hm_NVML_nvmlDeviceGetMemoryInfo (void *hashcat_ctx, nvmlDevice_t device, nvmlMemory_t *mem) +{ + hwmon_ctx_t *hwmon_ctx = ((hashcat_ctx_t *) hashcat_ctx)->hwmon_ctx; + + NVML_PTR *nvml = (NVML_PTR *) hwmon_ctx->hm_nvml; + + const nvmlReturn_t nvml_rc = nvml->nvmlDeviceGetMemoryInfo (device, mem); + + if (nvml_rc != NVML_SUCCESS) + { + const char *string = hm_NVML_nvmlErrorString (nvml, nvml_rc); + + event_log_error (hashcat_ctx, "nvmlDeviceGetMemoryInfo(): %s", string); + + return -1; + } + + return 0; +} + diff --git a/src/ext_sysfs_amdgpu.c b/src/ext_sysfs_amdgpu.c index 1aa53b210..70f071649 100644 --- a/src/ext_sysfs_amdgpu.c +++ b/src/ext_sysfs_amdgpu.c @@ -441,3 +441,55 @@ int hm_SYSFS_AMDGPU_get_gpu_busy_percent (void *hashcat_ctx, const int backend_d return 0; } + +int hm_SYSFS_AMDGPU_get_mem_info_vram_used (void *hashcat_ctx, const int backend_device_idx, u64 *val) +{ + char *syspath = hm_SYSFS_AMDGPU_get_syspath_device (hashcat_ctx, backend_device_idx); + + if (syspath == NULL) return -1; + + char *path; + + hc_asprintf (&path, "%s/mem_info_vram_used", syspath); + + hcfree (syspath); + + HCFILE fp; + + if (hc_fopen (&fp, path, "r") == false) + { + event_log_error (hashcat_ctx, "%s: %s", path, strerror (errno)); + + hcfree (path); + + return -1; + } + + u64 mem_info_vram_used = 0; + + while (!hc_feof (&fp)) + { + char buf[HCBUFSIZ_TINY]; + + char *ptr = hc_fgets (buf, sizeof (buf), &fp); + + if (ptr == NULL) continue; + + size_t len = strlen (ptr); + + if (len < 1) continue; + + int rc = sscanf (ptr, "%" PRIu64, &mem_info_vram_used); + + if (rc == 1) break; + } + + hc_fclose (&fp); + + *val = mem_info_vram_used; + + hcfree (path); + + return 0; +} + diff --git a/src/ext_sysfs_cpu.c b/src/ext_sysfs_cpu.c index 54683d741..5b89023d5 100644 --- a/src/ext_sysfs_cpu.c +++ b/src/ext_sysfs_cpu.c @@ -44,12 +44,9 @@ void sysfs_cpu_close (void *hashcat_ctx) char *hm_SYSFS_CPU_get_syspath_hwmon (void) { - char *found[4]; + char *found = NULL; - found[0] = NULL; - found[1] = NULL; - found[2] = NULL; - found[3] = NULL; + int best = 4; // 16 ok? @@ -61,31 +58,43 @@ char *hm_SYSFS_CPU_get_syspath_hwmon (void) HCFILE fp; - if (hc_fopen_raw (&fp, path, "rb") == false) continue; + if (hc_fopen_raw (&fp, path, "rb") == false) + { + hcfree (path); + + continue; + } char buf[64] = { 0 }; const size_t line_len = fgetl (&fp, buf, sizeof (buf)); - if (line_len) - { - if (strcmp (buf, SENSOR_CORETEMP) == 0) hc_asprintf (&found[0], "%s/hwmon%d", SYSFS_HWMON, i); - if (strcmp (buf, SENSOR_K10TEMP) == 0) hc_asprintf (&found[1], "%s/hwmon%d", SYSFS_HWMON, i); - if (strcmp (buf, SENSOR_K8TEMP) == 0) hc_asprintf (&found[2], "%s/hwmon%d", SYSFS_HWMON, i); - if (strcmp (buf, SENSOR_ACPITZ) == 0) hc_asprintf (&found[3], "%s/hwmon%d", SYSFS_HWMON, i); - } - hc_fclose (&fp); hcfree (path); + + if (line_len == 0) continue; + + int tmp_best = -1; + + if (strcmp (buf, SENSOR_CORETEMP) == 0) tmp_best = 0; + if (strcmp (buf, SENSOR_K10TEMP) == 0) tmp_best = 1; + if (strcmp (buf, SENSOR_K8TEMP) == 0) tmp_best = 2; + if (strcmp (buf, SENSOR_ACPITZ) == 0) tmp_best = 3; + + if (tmp_best >= 0 && tmp_best < best) + { + hcfree (found); + + best = tmp_best; + + hc_asprintf (&found, "%s/hwmon%d", SYSFS_HWMON, i); + + if (best == 0) break; + } } - if (found[0]) return found[0]; - if (found[1]) return found[1]; - if (found[2]) return found[2]; - if (found[3]) return found[3]; - - return NULL; + return found; } int hm_SYSFS_CPU_get_temperature_current (void *hashcat_ctx, int *val) diff --git a/src/hashcat.c b/src/hashcat.c index e1607450c..5f54fd68e 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -20,6 +20,7 @@ #include "autotune.h" #include "benchmark.h" #include "bitmap.h" +#include "bridges.h" #include "combinator.h" #include "cpt.h" #include "debugfile.h" @@ -727,6 +728,12 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) if (hashes_init_selftest (hashcat_ctx) == -1) return -1; + /** + * load hashes, post automatisation + */ + + if (hashes_init_stage5 (hashcat_ctx) == -1) return -1; + /** * load hashes, benchmark */ @@ -836,6 +843,21 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) EVENT (EVENT_POTFILE_NUM_CRACKED); + /** + * setup salts for bridges, needs to be after bridge init, but before session start + */ + + EVENT (EVENT_BRIDGES_SALT_PRE); + + if (bridges_salt_prepare (hashcat_ctx) == false) + { + event_log_error (hashcat_ctx, "Bridge salt preparation for hash-mode '%u' failed.", user_options->hash_mode); + + return -1; + } + + EVENT (EVENT_BRIDGES_SALT_POST); + /** * inform the user */ @@ -858,6 +880,8 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) brain_ctx_destroy (hashcat_ctx); #endif + bridges_salt_destroy (hashcat_ctx); + bridges_destroy (hashcat_ctx); bitmap_ctx_destroy (hashcat_ctx); combinator_ctx_destroy (hashcat_ctx); cpt_ctx_destroy (hashcat_ctx); @@ -1034,6 +1058,8 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) brain_ctx_destroy (hashcat_ctx); #endif + bridges_salt_destroy (hashcat_ctx); + bridges_destroy (hashcat_ctx); bitmap_ctx_destroy (hashcat_ctx); combinator_ctx_destroy (hashcat_ctx); cpt_ctx_destroy (hashcat_ctx); @@ -1065,6 +1091,7 @@ int hashcat_init (hashcat_ctx_t *hashcat_ctx, void (*event) (const u32, struct h hashcat_ctx->bitmap_ctx = (bitmap_ctx_t *) hcmalloc (sizeof (bitmap_ctx_t)); hashcat_ctx->brain_ctx = (brain_ctx_t *) hcmalloc (sizeof (brain_ctx_t)); + hashcat_ctx->bridge_ctx = (bridge_ctx_t *) hcmalloc (sizeof (bridge_ctx_t)); hashcat_ctx->combinator_ctx = (combinator_ctx_t *) hcmalloc (sizeof (combinator_ctx_t)); hashcat_ctx->cpt_ctx = (cpt_ctx_t *) hcmalloc (sizeof (cpt_ctx_t)); hashcat_ctx->debugfile_ctx = (debugfile_ctx_t *) hcmalloc (sizeof (debugfile_ctx_t)); @@ -1100,6 +1127,7 @@ void hashcat_destroy (hashcat_ctx_t *hashcat_ctx) { hcfree (hashcat_ctx->bitmap_ctx); hcfree (hashcat_ctx->brain_ctx); + hcfree (hashcat_ctx->bridge_ctx); hcfree (hashcat_ctx->combinator_ctx); hcfree (hashcat_ctx->cpt_ctx); hcfree (hashcat_ctx->debugfile_ctx); @@ -1231,7 +1259,7 @@ int hashcat_session_init (hashcat_ctx_t *hashcat_ctx, const char *install_folder * To help users a bit */ - setup_environment_variables (hashcat_ctx->folder_config); + setup_environment_variables (hashcat_ctx->folder_config, hashcat_ctx->user_options); setup_umask (); @@ -1291,18 +1319,41 @@ int hashcat_session_init (hashcat_ctx_t *hashcat_ctx, const char *install_folder if (user_options_check_files (hashcat_ctx) == -1) return -1; + /** + * Load bridge a bit too early actually, but we need to know the unit count so we can automatically configure virtualization for the user + */ + + EVENT (EVENT_BRIDGES_INIT_PRE); + + if (bridges_init (hashcat_ctx) == false) + { + event_log_error (hashcat_ctx, "Bridge initialization for hash-mode '%u' failed.", user_options->hash_mode); + + return -1; + } + + EVENT (EVENT_BRIDGES_INIT_POST); + /** * Init backend library loader */ + EVENT (EVENT_BACKEND_RUNTIMES_INIT_PRE); + if (backend_ctx_init (hashcat_ctx) == -1) return -1; + EVENT (EVENT_BACKEND_RUNTIMES_INIT_POST); + /** * Init backend devices */ + EVENT (EVENT_BACKEND_DEVICES_INIT_PRE); + if (backend_ctx_devices_init (hashcat_ctx, comptime) == -1) return -1; + EVENT (EVENT_BACKEND_DEVICES_INIT_POST); + /** * HM devices: init */ diff --git a/src/hashes.c b/src/hashes.c index 9de7a95a3..78a6d5b90 100644 --- a/src/hashes.c +++ b/src/hashes.c @@ -2236,9 +2236,7 @@ int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; - module_ctx_t *module_ctx = hashcat_ctx->module_ctx; user_options_t *user_options = hashcat_ctx->user_options; - user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; if (hashes->salts_cnt == 1) hashconfig->opti_type |= OPTI_TYPE_SINGLE_SALT; @@ -2283,13 +2281,19 @@ int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx) if ((hashconfig->opts_type & OPTS_TYPE_DEEP_COMP_KERNEL) == 0) { - if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) + if ((hashconfig->opts_type & OPTS_TYPE_MULTIHASH_DESPITE_ESALT) == 0) { - if (hashes->digests_cnt != hashes->salts_cnt) + if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) { - event_log_error (hashcat_ctx, "This hash-mode plugin cannot crack multiple hashes with the same salt, please select one of the hashes."); + if (hashconfig->esalt_size > 0) + { + if (hashes->digests_cnt != hashes->salts_cnt) + { + event_log_error (hashcat_ctx, "This hash-mode plugin cannot crack multiple hashes with the same salt, please select one of the hashes."); - return -1; + return -1; + } + } } } } @@ -2311,22 +2315,6 @@ int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx) } } - // time to update extra_tmp_size which is tmp_size value based on hash configuration - - if (module_ctx->module_extra_tmp_size != MODULE_DEFAULT) - { - const u64 extra_tmp_size = module_ctx->module_extra_tmp_size (hashconfig, user_options, user_options_extra, hashes); - - if (extra_tmp_size == (u64) -1) - { - event_log_error (hashcat_ctx, "Mixed hash settings are not supported."); - - return -1; - } - - hashconfig->tmp_size = extra_tmp_size; - } - // at this point we no longer need hash_t* structure hash_t *hashes_buf = hashes->hashes_buf; @@ -2362,6 +2350,96 @@ int hashes_init_stage4 (hashcat_ctx_t *hashcat_ctx) return 0; } +int hashes_init_stage5 (hashcat_ctx_t *hashcat_ctx) +{ + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; + module_ctx_t *module_ctx = hashcat_ctx->module_ctx; + user_options_t *user_options = hashcat_ctx->user_options; + user_options_extra_t *user_options_extra = hashcat_ctx->user_options_extra; + + // time to update extra_tmp_size which is tmp_size value based on hash configuration + + if (module_ctx->module_extra_tmp_size != MODULE_DEFAULT) + { + const u64 extra_tmp_size = module_ctx->module_extra_tmp_size (hashconfig, user_options, user_options_extra, hashes); + + if ((extra_tmp_size & (1ULL << 62)) || (extra_tmp_size & (1ULL << 63))) + { + const u64 salt_pos = extra_tmp_size & 0xffffffff; + + char *tmp_buf = (char *) hcmalloc (HCBUFSIZ_LARGE); + + const int tmp_len = hash_encode (hashcat_ctx->hashconfig, hashcat_ctx->hashes, hashcat_ctx->module_ctx, tmp_buf, HCBUFSIZ_LARGE, salt_pos, 0); + + tmp_buf[tmp_len] = 0; + + compress_terminal_line_length (tmp_buf, 47, 6); + + char *user_hash = strdup (tmp_buf); + + if (extra_tmp_size & (1ULL << 62)) + { + strncpy (tmp_buf, hashconfig->st_hash, HCBUFSIZ_LARGE - 1); + + compress_terminal_line_length (tmp_buf, 47, 6); + + char *st_hash = strdup (tmp_buf); + + event_log_error (hashcat_ctx, "ERROR: Incompatible self-test SCRYPT configuration detected."); + + event_log_warning (hashcat_ctx, "The specified target hash:"); + event_log_warning (hashcat_ctx, " -> %s", user_hash); + event_log_warning (hashcat_ctx, "does not match the SCRYPT configuration of the self-test hash:"); + event_log_warning (hashcat_ctx, " -> %s", st_hash); + event_log_warning (hashcat_ctx, "The JIT-compiled kernel for this SCRYPT configuration may be incompatible."); + event_log_warning (hashcat_ctx, "You must disable the self-test functionality or recompile the plugin with a matching self-test hash."); + event_log_warning (hashcat_ctx, "To disable the self-test, use the --self-test-disable option."); + event_log_warning (hashcat_ctx, NULL); + + hcfree (tmp_buf); + hcfree (user_hash); + hcfree (st_hash); + + return -1; + } + + if (extra_tmp_size & (1ULL << 63)) + { + const int tmp_len = hash_encode (hashcat_ctx->hashconfig, hashcat_ctx->hashes, hashcat_ctx->module_ctx, tmp_buf, HCBUFSIZ_LARGE, 0, 0); + + tmp_buf[tmp_len] = 0; + + compress_terminal_line_length (tmp_buf, 47, 6); + + char *user_hash2 = strdup (tmp_buf); + + event_log_error (hashcat_ctx, "ERROR: Mixed SCRYPT configuration detected."); + + event_log_warning (hashcat_ctx, "The specified target hash:"); + event_log_warning (hashcat_ctx, " -> %s", user_hash); + event_log_warning (hashcat_ctx, "does not match the SCRYPT configuration of another target hash:"); + event_log_warning (hashcat_ctx, " -> %s", user_hash2); + event_log_warning (hashcat_ctx, "Please run these hashes in separate cracking sessions."); + event_log_warning (hashcat_ctx, NULL); + + hcfree (tmp_buf); + hcfree (user_hash); + hcfree (user_hash2); + + return -1; + } + + hcfree (tmp_buf); + hcfree (user_hash); + } + + hashconfig->tmp_size = extra_tmp_size; + } + + return 0; +} + int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx) { folder_config_t *folder_config = hashcat_ctx->folder_config; diff --git a/src/hwmon.c b/src/hwmon.c index d18d12552..4f5264b3d 100644 --- a/src/hwmon.c +++ b/src/hwmon.c @@ -1214,20 +1214,79 @@ int hm_get_throttle_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int back return -1; } +u64 hm_get_memoryused_with_devices_idx (hashcat_ctx_t *hashcat_ctx, const int backend_device_idx) +{ + hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; + backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + + if (hwmon_ctx->enabled == false) return 0; + + if (hwmon_ctx->hm_device[backend_device_idx].memoryused_get_supported == false) return 0; + + if ((backend_ctx->devices_param[backend_device_idx].is_opencl == true) || (backend_ctx->devices_param[backend_device_idx].is_hip == true) || (backend_ctx->devices_param[backend_device_idx].is_cuda == true)) + { + if (backend_ctx->devices_param[backend_device_idx].opencl_device_type & CL_DEVICE_TYPE_GPU) + { + if ((backend_ctx->devices_param[backend_device_idx].opencl_device_vendor_id == VENDOR_ID_AMD) || (backend_ctx->devices_param[backend_device_idx].opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP)) + { + if (hwmon_ctx->hm_sysfs_amdgpu) + { + u64 used = 0; + + if (hm_SYSFS_AMDGPU_get_mem_info_vram_used (hashcat_ctx, backend_device_idx, &used) == -1) + { + hwmon_ctx->hm_device[backend_device_idx].memoryused_get_supported = false; + + return 0; + } + + return used; + } + } + + if (backend_ctx->devices_param[backend_device_idx].opencl_device_vendor_id == VENDOR_ID_NV) + { + if (hwmon_ctx->hm_nvml) + { + nvmlMemory_t mem; + + if (hm_NVML_nvmlDeviceGetMemoryInfo (hashcat_ctx, hwmon_ctx->hm_device[backend_device_idx].nvml, &mem) == -1) + { + hwmon_ctx->hm_device[backend_device_idx].memoryused_get_supported = false; + + return 0; + } + + return mem.used; + } + } + } + } + + hwmon_ctx->hm_device[backend_device_idx].memoryused_get_supported = false; + + return 0; +} + int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) { + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; user_options_t *user_options = hashcat_ctx->user_options; hwmon_ctx->enabled = false; - #if !defined (WITH_HWMON) - return 0; - #endif // WITH_HWMON + int backend_devices_cnt = backend_ctx->backend_devices_cnt; + + if (bridge_ctx->enabled == true) backend_devices_cnt = 1; + + //#if !defined (WITH_HWMON) + //return 0; + //#endif // WITH_HWMON if (user_options->usage > 0) return 0; - if (user_options->backend_info > 0) return 0; + //if (user_options->backend_info > 0) return 0; if (user_options->hash_info == true) return 0; if (user_options->keyspace == true) return 0; @@ -1236,7 +1295,9 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) if (user_options->stdout_flag == true) return 0; if (user_options->version == true) return 0; if (user_options->identify == true) return 0; - if (user_options->hwmon == false) return 0; + //we need hwmon support to get free memory per device support + //its a joke, but there's no way around + //if (user_options->hwmon == false) return 0; hwmon_ctx->hm_device = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); @@ -1352,7 +1413,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) int tmp_in = hm_get_adapter_index_nvml (hashcat_ctx, nvmlGPUHandle); - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1382,6 +1443,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hm_adapters_nvml[device_id].threshold_shutdown_get_supported = true; hm_adapters_nvml[device_id].threshold_slowdown_get_supported = true; hm_adapters_nvml[device_id].utilization_get_supported = true; + hm_adapters_nvml[device_id].memoryused_get_supported = true; } } } @@ -1414,6 +1476,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hm_adapters_nvml[device_id].threshold_shutdown_get_supported = true; hm_adapters_nvml[device_id].threshold_slowdown_get_supported = true; hm_adapters_nvml[device_id].utilization_get_supported = true; + hm_adapters_nvml[device_id].memoryused_get_supported = true; } } } @@ -1431,7 +1494,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) int tmp_in = hm_get_adapter_index_nvapi (hashcat_ctx, nvGPUHandle); - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1522,7 +1585,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) return -1; } - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1580,7 +1643,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) { if (true) { - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1635,6 +1698,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hm_adapters_sysfs_amdgpu[device_id].memoryspeed_get_supported = true; hm_adapters_sysfs_amdgpu[device_id].temperature_get_supported = true; hm_adapters_sysfs_amdgpu[device_id].utilization_get_supported = true; + hm_adapters_sysfs_amdgpu[device_id].memoryused_get_supported = true; } } } @@ -1645,7 +1709,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) { if (true) { - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1708,7 +1772,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) * HM devices: copy */ - for (int backend_devices_idx = 0; backend_devices_idx < backend_ctx->backend_devices_cnt; backend_devices_idx++) + for (int backend_devices_idx = 0; backend_devices_idx < backend_devices_cnt; backend_devices_idx++) { hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_idx]; @@ -1741,6 +1805,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hwmon_ctx->hm_device[backend_devices_idx].threshold_slowdown_get_supported |= hm_adapters_nvml[device_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[backend_devices_idx].throttle_get_supported |= hm_adapters_nvml[device_id].throttle_get_supported; hwmon_ctx->hm_device[backend_devices_idx].utilization_get_supported |= hm_adapters_nvml[device_id].utilization_get_supported; + hwmon_ctx->hm_device[backend_devices_idx].memoryused_get_supported |= hm_adapters_nvml[device_id].memoryused_get_supported; } if (hwmon_ctx->hm_nvapi) @@ -1870,6 +1935,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hwmon_ctx->hm_device[backend_devices_idx].threshold_slowdown_get_supported |= hm_adapters_sysfs_amdgpu[device_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[backend_devices_idx].throttle_get_supported |= hm_adapters_sysfs_amdgpu[device_id].throttle_get_supported; hwmon_ctx->hm_device[backend_devices_idx].utilization_get_supported |= hm_adapters_sysfs_amdgpu[device_id].utilization_get_supported; + hwmon_ctx->hm_device[backend_devices_idx].memoryused_get_supported |= hm_adapters_sysfs_amdgpu[device_id].memoryused_get_supported; } } @@ -1890,6 +1956,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hwmon_ctx->hm_device[backend_devices_idx].threshold_slowdown_get_supported |= hm_adapters_nvml[device_id].threshold_slowdown_get_supported; hwmon_ctx->hm_device[backend_devices_idx].throttle_get_supported |= hm_adapters_nvml[device_id].throttle_get_supported; hwmon_ctx->hm_device[backend_devices_idx].utilization_get_supported |= hm_adapters_nvml[device_id].utilization_get_supported; + hwmon_ctx->hm_device[backend_devices_idx].memoryused_get_supported |= hm_adapters_nvml[device_id].memoryused_get_supported; } if (hwmon_ctx->hm_nvapi) @@ -1922,6 +1989,7 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) hm_get_threshold_slowdown_with_devices_idx (hashcat_ctx, backend_devices_idx); hm_get_throttle_with_devices_idx (hashcat_ctx, backend_devices_idx); hm_get_utilization_with_devices_idx (hashcat_ctx, backend_devices_idx); + hm_get_memoryused_with_devices_idx (hashcat_ctx, backend_devices_idx); } FREE_ADAPTERS; diff --git a/src/interface.c b/src/interface.c index 691e2931b..3c9c7ed2d 100644 --- a/src/interface.c +++ b/src/interface.c @@ -87,6 +87,7 @@ void module_unload (module_ctx_t *module_ctx) int hashconfig_init (hashcat_ctx_t *hashcat_ctx) { const backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; const folder_config_t *folder_config = hashcat_ctx->folder_config; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; module_ctx_t *module_ctx = hashcat_ctx->module_ctx; @@ -153,6 +154,8 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) CHECK_DEFINED (module_ctx->module_benchmark_mask); CHECK_DEFINED (module_ctx->module_benchmark_charset); CHECK_DEFINED (module_ctx->module_benchmark_salt); + CHECK_DEFINED (module_ctx->module_bridge_name); + CHECK_DEFINED (module_ctx->module_bridge_type); CHECK_DEFINED (module_ctx->module_build_plain_postprocess); CHECK_DEFINED (module_ctx->module_deep_comp_kernel); CHECK_DEFINED (module_ctx->module_deprecated_notice); @@ -333,6 +336,11 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) } } + if (hashconfig->attack_exec == ATTACK_EXEC_OUTSIDE_KERNEL) + { + hashconfig->opts_type |= OPTS_TYPE_INIT | OPTS_TYPE_LOOP | OPTS_TYPE_COMP; + } + hashconfig->has_optimized_kernel = false; hashconfig->has_pure_kernel = false; @@ -464,6 +472,8 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) if (module_ctx->module_kernel_loops_max != MODULE_DEFAULT) hashconfig->kernel_loops_max = module_ctx->module_kernel_loops_max (hashconfig, user_options, user_options_extra); if (module_ctx->module_kernel_threads_min != MODULE_DEFAULT) hashconfig->kernel_threads_min = module_ctx->module_kernel_threads_min (hashconfig, user_options, user_options_extra); if (module_ctx->module_kernel_threads_max != MODULE_DEFAULT) hashconfig->kernel_threads_max = module_ctx->module_kernel_threads_max (hashconfig, user_options, user_options_extra); + if (module_ctx->module_bridge_name != MODULE_DEFAULT) hashconfig->bridge_name = module_ctx->module_bridge_name (hashconfig, user_options, user_options_extra); + if (module_ctx->module_bridge_type != MODULE_DEFAULT) hashconfig->bridge_type = module_ctx->module_bridge_type (hashconfig, user_options, user_options_extra); if (hashconfig->hook_extra_param_size) { @@ -495,6 +505,28 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) } } + // bridges have some serious impact on hashconfig + if (hashconfig->bridge_type & BRIDGE_TYPE_REPLACE_LOOP) + { + hashconfig->opts_type &= ~OPTS_TYPE_LOOP; + + hashconfig->bridge_type |= BRIDGE_TYPE_LAUNCH_LOOP; + } + + if (hashconfig->bridge_type & BRIDGE_TYPE_REPLACE_LOOP2) + { + hashconfig->opts_type &= ~OPTS_TYPE_LOOP2; + + hashconfig->bridge_type |= BRIDGE_TYPE_LAUNCH_LOOP2; + } + + // selftest bridge update + if (hashconfig->bridge_type & BRIDGE_TYPE_UPDATE_SELFTEST) + { + if (bridge_ctx->st_update_hash) hashconfig->st_hash = bridge_ctx->st_update_hash (bridge_ctx->platform_context); + if (bridge_ctx->st_update_pass) hashconfig->st_pass = bridge_ctx->st_update_pass (bridge_ctx->platform_context); + } + return 0; } @@ -548,7 +580,7 @@ void hashconfig_destroy (hashcat_ctx_t *hashcat_ctx) const char *default_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - const char *mask = "?b?b?b?b?b?b?b"; + const char *mask = "?a?a?a?a?a?a?a"; return mask; } diff --git a/src/keyboard_layout.c b/src/keyboard_layout.c index 18e338038..83a85a847 100644 --- a/src/keyboard_layout.c +++ b/src/keyboard_layout.c @@ -15,7 +15,10 @@ static int sort_by_src_len (const void *p1, const void *p2) const keyboard_layout_mapping_t *k1 = (const keyboard_layout_mapping_t *) p1; const keyboard_layout_mapping_t *k2 = (const keyboard_layout_mapping_t *) p2; - return k1->src_len < k2->src_len; + if (k1->src_len < k2->src_len) return 1; + if (k1->src_len > k2->src_len) return -1; + + return 0; } bool initialize_keyboard_layout_mapping (const char *filename, keyboard_layout_mapping_t *keyboard_layout_mapping, int *keyboard_layout_mapping_cnt) diff --git a/src/locking.c b/src/locking.c index 8918101a2..492350bab 100644 --- a/src/locking.c +++ b/src/locking.c @@ -20,9 +20,18 @@ int hc_lockfile (HCFILE *fp) lock.l_type = F_WRLCK; - /* Needs this loop because a signal may interrupt a wait for lock */ while (fcntl (fp->fd, F_SETLKW, &lock)) { + // These shouldn't happen with F_SETLKW yet are (rarely) seen IRL. Recoverable! + if (errno == EAGAIN || errno == ENOLCK) + { + struct timeval tv = { .tv_sec = 0, .tv_usec = 10000 }; + select (0, NULL, NULL, NULL, &tv); + + continue; + } + + // A signal may interrupt a wait for lock with EINTR. Anything else is fatal if (errno != EINTR) return -1; } diff --git a/src/main.c b/src/main.c index 085ce38b4..deef5873c 100644 --- a/src/main.c +++ b/src/main.c @@ -1157,6 +1157,78 @@ static void main_autotune_finished (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAY event_log_info_nn (hashcat_ctx, "Finished autotune"); } +static void main_backend_runtimes_init_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initializing backend runtimes. Please be patient..."); +} + +static void main_backend_runtimes_init_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initialized backend runtimes"); +} + +static void main_backend_devices_init_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initializing backend devices. Please be patient..."); +} + +static void main_backend_devices_init_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initialized backend devices"); +} + +static void main_bridges_init_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initializing bridges. Please be patient..."); +} + +static void main_bridges_init_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initialized bridges"); +} + +static void main_bridges_salt_pre (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initializing bridge salts. Please be patient..."); +} + +static void main_bridges_salt_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUSED const void *buf, MAYBE_UNUSED const size_t len) +{ + const user_options_t *user_options = hashcat_ctx->user_options; + + if (user_options->quiet == true) return; + + event_log_info_nn (hashcat_ctx, "Initialized bridge salts"); +} + static void event (const u32 id, hashcat_ctx_t *hashcat_ctx, const void *buf, const size_t len) { switch (id) @@ -1167,9 +1239,17 @@ static void event (const u32 id, hashcat_ctx_t *hashcat_ctx, const void *buf, co case EVENT_SELFTEST_STARTING: main_selftest_starting (hashcat_ctx, buf, len); break; case EVENT_AUTODETECT_FINISHED: main_autodetect_finished (hashcat_ctx, buf, len); break; case EVENT_AUTODETECT_STARTING: main_autodetect_starting (hashcat_ctx, buf, len); break; + case EVENT_BACKEND_RUNTIMES_INIT_POST:main_backend_runtimes_init_post(hashcat_ctx, buf, len); break; + case EVENT_BACKEND_RUNTIMES_INIT_PRE: main_backend_runtimes_init_pre (hashcat_ctx, buf, len); break; + case EVENT_BACKEND_DEVICES_INIT_POST: main_backend_devices_init_post (hashcat_ctx, buf, len); break; + case EVENT_BACKEND_DEVICES_INIT_PRE: main_backend_devices_init_pre (hashcat_ctx, buf, len); break; case EVENT_BITMAP_INIT_POST: main_bitmap_init_post (hashcat_ctx, buf, len); break; case EVENT_BITMAP_INIT_PRE: main_bitmap_init_pre (hashcat_ctx, buf, len); break; case EVENT_BITMAP_FINAL_OVERFLOW: main_bitmap_final_overflow (hashcat_ctx, buf, len); break; + case EVENT_BRIDGES_INIT_POST: main_bridges_init_post (hashcat_ctx, buf, len); break; + case EVENT_BRIDGES_INIT_PRE: main_bridges_init_pre (hashcat_ctx, buf, len); break; + case EVENT_BRIDGES_SALT_POST: main_bridges_salt_post (hashcat_ctx, buf, len); break; + case EVENT_BRIDGES_SALT_PRE: main_bridges_salt_pre (hashcat_ctx, buf, len); break; case EVENT_CALCULATED_WORDS_BASE: main_calculated_words_base (hashcat_ctx, buf, len); break; case EVENT_CRACKER_FINISHED: main_cracker_finished (hashcat_ctx, buf, len); break; case EVENT_CRACKER_HASH_CRACKED: main_cracker_hash_cracked (hashcat_ctx, buf, len); break; diff --git a/src/memory.c b/src/memory.c index 54995cc86..15f4cbe19 100644 --- a/src/memory.c +++ b/src/memory.c @@ -69,23 +69,27 @@ void hcfree (void *ptr) void *hcmalloc_aligned (const size_t sz, const int align) { - // store the original allocated address so we can later use it to free the memory - // this is convenient to use because we don't need to store two memory addresses + uintptr_t align_mask = (uintptr_t) (align - 1); - const int align1 = align - 1; + void *raw = malloc (sz + align + sizeof (void *)); - void *ptr1 = hcmalloc (sz + sizeof (void *) + align1); + if (raw == NULL) return NULL; - void *ptr2 = (void **) ((uintptr_t) (ptr1 + sizeof (void *) + align1) & ~align1); + uintptr_t raw_addr = (uintptr_t) raw + sizeof (void *); - ((void **) ptr2)[-1] = ptr1; + uintptr_t aligned_addr = (raw_addr + align_mask) & ~align_mask; - return ptr2; + void **aligned_ptr = (void **) aligned_addr; + + aligned_ptr[-1] = raw; + + return aligned_ptr; } -void hcfree_aligned (void *ptr) +void hcfree_aligned(void *ptr) { - if (ptr == NULL) return; - - free (((void **) ptr)[-1]); + if (ptr != NULL) + { + free (((void **) ptr)[-1]); + } } diff --git a/src/modules/module_00000.c b/src/modules/module_00000.c index 127d95c16..2ac0449b7 100644 --- a/src/modules/module_00000.c +++ b/src/modules/module_00000.c @@ -130,6 +130,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00010.c b/src/modules/module_00010.c index 57197205e..3918445b4 100644 --- a/src/modules/module_00010.c +++ b/src/modules/module_00010.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00011.c b/src/modules/module_00011.c index e762f70d7..7026bd04f 100644 --- a/src/modules/module_00011.c +++ b/src/modules/module_00011.c @@ -155,6 +155,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00012.c b/src/modules/module_00012.c index f0236e151..115c24073 100644 --- a/src/modules/module_00012.c +++ b/src/modules/module_00012.c @@ -148,6 +148,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00020.c b/src/modules/module_00020.c index 505f648e4..3d514be55 100644 --- a/src/modules/module_00020.c +++ b/src/modules/module_00020.c @@ -152,6 +152,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00021.c b/src/modules/module_00021.c index 7ad9d9acf..a9072fb4e 100644 --- a/src/modules/module_00021.c +++ b/src/modules/module_00021.c @@ -147,6 +147,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00022.c b/src/modules/module_00022.c index 6e974b024..4252f2f6d 100644 --- a/src/modules/module_00022.c +++ b/src/modules/module_00022.c @@ -260,6 +260,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00023.c b/src/modules/module_00023.c index 1cbce89a2..b50bf7a84 100644 --- a/src/modules/module_00023.c +++ b/src/modules/module_00023.c @@ -162,6 +162,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00024.c b/src/modules/module_00024.c index fedd77c37..a2c4d2e90 100644 --- a/src/modules/module_00024.c +++ b/src/modules/module_00024.c @@ -146,6 +146,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00030.c b/src/modules/module_00030.c index 50c5ca511..48d76c069 100644 --- a/src/modules/module_00030.c +++ b/src/modules/module_00030.c @@ -154,6 +154,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00040.c b/src/modules/module_00040.c index 2d0186982..16907aa00 100644 --- a/src/modules/module_00040.c +++ b/src/modules/module_00040.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00050.c b/src/modules/module_00050.c index 7e4eeaa4d..a3c1bf1c4 100644 --- a/src/modules/module_00050.c +++ b/src/modules/module_00050.c @@ -132,6 +132,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00060.c b/src/modules/module_00060.c index 7a3e0757d..bba42dfa3 100644 --- a/src/modules/module_00060.c +++ b/src/modules/module_00060.c @@ -132,6 +132,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00070.c b/src/modules/module_00070.c index d503dd5fe..995c2b34e 100644 --- a/src/modules/module_00070.c +++ b/src/modules/module_00070.c @@ -128,6 +128,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00100.c b/src/modules/module_00100.c index 3d6bb223d..186616de0 100644 --- a/src/modules/module_00100.c +++ b/src/modules/module_00100.c @@ -146,6 +146,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00101.c b/src/modules/module_00101.c index 7482896e2..9d873f97b 100644 --- a/src/modules/module_00101.c +++ b/src/modules/module_00101.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00110.c b/src/modules/module_00110.c index 30ce167af..8ce8652bf 100644 --- a/src/modules/module_00110.c +++ b/src/modules/module_00110.c @@ -172,6 +172,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00111.c b/src/modules/module_00111.c index 499c9a67c..fbb4f312c 100644 --- a/src/modules/module_00111.c +++ b/src/modules/module_00111.c @@ -177,6 +177,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00112.c b/src/modules/module_00112.c index 152f2314a..f7220e57e 100644 --- a/src/modules/module_00112.c +++ b/src/modules/module_00112.c @@ -172,6 +172,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00120.c b/src/modules/module_00120.c index 2ecb1aa79..6a94d02fe 100644 --- a/src/modules/module_00120.c +++ b/src/modules/module_00120.c @@ -172,6 +172,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00121.c b/src/modules/module_00121.c index e988a45a6..6307a4311 100644 --- a/src/modules/module_00121.c +++ b/src/modules/module_00121.c @@ -173,6 +173,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00122.c b/src/modules/module_00122.c index c806a2055..ea9c8574f 100644 --- a/src/modules/module_00122.c +++ b/src/modules/module_00122.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00124.c b/src/modules/module_00124.c index ccdfe4e63..723165ee9 100644 --- a/src/modules/module_00124.c +++ b/src/modules/module_00124.c @@ -172,6 +172,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00125.c b/src/modules/module_00125.c index b865e087a..53ce3a8d8 100644 --- a/src/modules/module_00125.c +++ b/src/modules/module_00125.c @@ -155,6 +155,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00130.c b/src/modules/module_00130.c index d071fdc94..32ee6ae02 100644 --- a/src/modules/module_00130.c +++ b/src/modules/module_00130.c @@ -173,6 +173,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00131.c b/src/modules/module_00131.c index 26eae96f9..381634701 100644 --- a/src/modules/module_00131.c +++ b/src/modules/module_00131.c @@ -169,6 +169,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00132.c b/src/modules/module_00132.c index ab05701cb..e30f2bba4 100644 --- a/src/modules/module_00132.c +++ b/src/modules/module_00132.c @@ -163,6 +163,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00133.c b/src/modules/module_00133.c index ecef6b61f..925701f3b 100644 --- a/src/modules/module_00133.c +++ b/src/modules/module_00133.c @@ -145,6 +145,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00140.c b/src/modules/module_00140.c index bfded211a..abf65ff12 100644 --- a/src/modules/module_00140.c +++ b/src/modules/module_00140.c @@ -173,6 +173,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00141.c b/src/modules/module_00141.c index 6a356562f..d78a2a2c2 100644 --- a/src/modules/module_00141.c +++ b/src/modules/module_00141.c @@ -179,6 +179,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00150.c b/src/modules/module_00150.c index 9df2e605c..4a36fc8c5 100644 --- a/src/modules/module_00150.c +++ b/src/modules/module_00150.c @@ -44,6 +44,15 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; +} + int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -150,6 +159,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -188,7 +199,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_00160.c b/src/modules/module_00160.c index ab82bed03..466f97d77 100644 --- a/src/modules/module_00160.c +++ b/src/modules/module_00160.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00170.c b/src/modules/module_00170.c index ae08beca6..cd973e8a4 100644 --- a/src/modules/module_00170.c +++ b/src/modules/module_00170.c @@ -147,6 +147,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00200.c b/src/modules/module_00200.c index e2bd7c8f4..4eeffc1e5 100644 --- a/src/modules/module_00200.c +++ b/src/modules/module_00200.c @@ -114,6 +114,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00300.c b/src/modules/module_00300.c index db4731a85..d4369553e 100644 --- a/src/modules/module_00300.c +++ b/src/modules/module_00300.c @@ -145,6 +145,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00400.c b/src/modules/module_00400.c index 23dc5c4c4..3e30912a5 100644 --- a/src/modules/module_00400.c +++ b/src/modules/module_00400.c @@ -242,6 +242,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00500.c b/src/modules/module_00500.c index dad794f1b..108d08c45 100644 --- a/src/modules/module_00500.c +++ b/src/modules/module_00500.c @@ -261,6 +261,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00501.c b/src/modules/module_00501.c index f31985406..ef20df5a9 100644 --- a/src/modules/module_00501.c +++ b/src/modules/module_00501.c @@ -335,6 +335,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00600.c b/src/modules/module_00600.c index 9165bb744..d9d3831ea 100644 --- a/src/modules/module_00600.c +++ b/src/modules/module_00600.c @@ -120,6 +120,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00610.c b/src/modules/module_00610.c index 05f5074dc..4127aa481 100644 --- a/src/modules/module_00610.c +++ b/src/modules/module_00610.c @@ -154,6 +154,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00620.c b/src/modules/module_00620.c index fc56fadb6..e15777a66 100644 --- a/src/modules/module_00620.c +++ b/src/modules/module_00620.c @@ -154,6 +154,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_00900.c b/src/modules/module_00900.c index 8e007962a..0ff85f3ae 100644 --- a/src/modules/module_00900.c +++ b/src/modules/module_00900.c @@ -130,6 +130,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01000.c b/src/modules/module_01000.c index 7662af81b..c0a4078f3 100644 --- a/src/modules/module_01000.c +++ b/src/modules/module_01000.c @@ -133,6 +133,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01100.c b/src/modules/module_01100.c index d514c311e..1c3cbd731 100644 --- a/src/modules/module_01100.c +++ b/src/modules/module_01100.c @@ -50,6 +50,15 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; +} + int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -157,6 +166,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -195,7 +206,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_01300.c b/src/modules/module_01300.c index 149fd39ad..b50a0e99c 100644 --- a/src/modules/module_01300.c +++ b/src/modules/module_01300.c @@ -160,6 +160,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01400.c b/src/modules/module_01400.c index ab002efbe..8b74d4ee0 100644 --- a/src/modules/module_01400.c +++ b/src/modules/module_01400.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01410.c b/src/modules/module_01410.c index f2f763bfe..c95e4aeed 100644 --- a/src/modules/module_01410.c +++ b/src/modules/module_01410.c @@ -193,6 +193,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01411.c b/src/modules/module_01411.c index 63d8bde69..35f352e8b 100644 --- a/src/modules/module_01411.c +++ b/src/modules/module_01411.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01420.c b/src/modules/module_01420.c index 795bd254f..01d8a649b 100644 --- a/src/modules/module_01420.c +++ b/src/modules/module_01420.c @@ -193,6 +193,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01421.c b/src/modules/module_01421.c index 22cda42c1..def451112 100644 --- a/src/modules/module_01421.c +++ b/src/modules/module_01421.c @@ -169,6 +169,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01430.c b/src/modules/module_01430.c index 650a7ec92..38277bbff 100644 --- a/src/modules/module_01430.c +++ b/src/modules/module_01430.c @@ -194,6 +194,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01440.c b/src/modules/module_01440.c index 4dd8fb3c6..67b88bd65 100644 --- a/src/modules/module_01440.c +++ b/src/modules/module_01440.c @@ -194,6 +194,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01441.c b/src/modules/module_01441.c index 89ff454d6..cd6757780 100644 --- a/src/modules/module_01441.c +++ b/src/modules/module_01441.c @@ -194,6 +194,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01450.c b/src/modules/module_01450.c index b909b0b70..cd0f541df 100644 --- a/src/modules/module_01450.c +++ b/src/modules/module_01450.c @@ -164,6 +164,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01460.c b/src/modules/module_01460.c index 08937aeb2..7b4d28c7d 100644 --- a/src/modules/module_01460.c +++ b/src/modules/module_01460.c @@ -196,6 +196,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01470.c b/src/modules/module_01470.c index 07d3b5bee..53592fed6 100644 --- a/src/modules/module_01470.c +++ b/src/modules/module_01470.c @@ -168,6 +168,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01500.c b/src/modules/module_01500.c index 04992ff81..b66dddff1 100644 --- a/src/modules/module_01500.c +++ b/src/modules/module_01500.c @@ -46,9 +46,27 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { - // Intel(R) Xeon(R) W-3223 CPU @ 3.50GHz; OpenCL C 1.2; 11.3.1; 20E241 - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE || device_param->opencl_platform_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU)) + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) { + if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) + { + // works on Apple Intel: Intel(R) Core(TM) i7-4578U CPU @ 3.00GHz + return false; + } + + if (strncmp (device_param->device_name, "AMD EPYC", 8) == 0) + { + // works on Linux: AMD EPYC 7642 48-Core Processor, OpenCL 2.1 (Build 0) + return false; + } + + if (device_param->opencl_platform_vendor_id != VENDOR_ID_INTEL_SDK) + { + // works on Linux/POCL + return false; + } + + // skip by default for now return true; } @@ -250,6 +268,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01600.c b/src/modules/module_01600.c index fd2698d9d..197dbd1ba 100644 --- a/src/modules/module_01600.c +++ b/src/modules/module_01600.c @@ -255,6 +255,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01700.c b/src/modules/module_01700.c index 66398ad54..a17a2cb6b 100644 --- a/src/modules/module_01700.c +++ b/src/modules/module_01700.c @@ -200,6 +200,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01710.c b/src/modules/module_01710.c index 870bc22ef..93d51c731 100644 --- a/src/modules/module_01710.c +++ b/src/modules/module_01710.c @@ -225,6 +225,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01711.c b/src/modules/module_01711.c index 7d5f1b112..8afc9a83e 100644 --- a/src/modules/module_01711.c +++ b/src/modules/module_01711.c @@ -222,6 +222,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01720.c b/src/modules/module_01720.c index 01b2571ee..70bcc1d93 100644 --- a/src/modules/module_01720.c +++ b/src/modules/module_01720.c @@ -225,6 +225,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01722.c b/src/modules/module_01722.c index 9da97c101..05c8e6b34 100644 --- a/src/modules/module_01722.c +++ b/src/modules/module_01722.c @@ -203,6 +203,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01730.c b/src/modules/module_01730.c index 0f9d1632b..1e0561669 100644 --- a/src/modules/module_01730.c +++ b/src/modules/module_01730.c @@ -226,6 +226,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01731.c b/src/modules/module_01731.c index a150b407d..65a259dbe 100644 --- a/src/modules/module_01731.c +++ b/src/modules/module_01731.c @@ -213,6 +213,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01740.c b/src/modules/module_01740.c index c45cb2cdf..36b653c6d 100644 --- a/src/modules/module_01740.c +++ b/src/modules/module_01740.c @@ -226,6 +226,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01750.c b/src/modules/module_01750.c index e2eaa5382..9563fc997 100644 --- a/src/modules/module_01750.c +++ b/src/modules/module_01750.c @@ -165,6 +165,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01760.c b/src/modules/module_01760.c index b2bff2f12..349ea045b 100644 --- a/src/modules/module_01760.c +++ b/src/modules/module_01760.c @@ -166,6 +166,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01770.c b/src/modules/module_01770.c index 799f0d71f..c42574c1a 100644 --- a/src/modules/module_01770.c +++ b/src/modules/module_01770.c @@ -183,6 +183,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_01800.c b/src/modules/module_01800.c index 2c9be27b4..fea4851c6 100644 --- a/src/modules/module_01800.c +++ b/src/modules/module_01800.c @@ -22,9 +22,7 @@ static const u64 KERN_TYPE = 1800; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$6$72820166$U4DVzpcYxgw7MVVDGGvB2/H5lRistD5.Ah4upwENR5UtffLR4X4SxSzfREv8z6wVl0jRFX40/KnYVvK4829kD1"; @@ -417,13 +415,6 @@ static void sha512crypt_encode (const u8 digest[64], u8 buf[86]) buf[85] = int_to_itoa64 (l & 0x3f); //l >>= 6; } -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 256; - - return kernel_threads_max; -} - bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) @@ -456,12 +447,6 @@ char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAY return jit_build_options; } - // HIP - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - hc_asprintf (&jit_build_options, "-fno-unroll-loops"); - } - // ROCM if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true)) { @@ -576,6 +561,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -620,7 +607,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_02000.c b/src/modules/module_02000.c index 6df5bff06..aa4110daf 100644 --- a/src/modules/module_02000.c +++ b/src/modules/module_02000.c @@ -70,6 +70,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02100.c b/src/modules/module_02100.c index 34b407cd6..a5d69390f 100644 --- a/src/modules/module_02100.c +++ b/src/modules/module_02100.c @@ -184,6 +184,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02400.c b/src/modules/module_02400.c index 1856a6f1d..5932bfea3 100644 --- a/src/modules/module_02400.c +++ b/src/modules/module_02400.c @@ -175,6 +175,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02410.c b/src/modules/module_02410.c index e7aa402b8..10195f701 100644 --- a/src/modules/module_02410.c +++ b/src/modules/module_02410.c @@ -212,6 +212,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02500.c b/src/modules/module_02500.c index 95e0c8713..e0ffc746d 100644 --- a/src/modules/module_02500.c +++ b/src/modules/module_02500.c @@ -912,6 +912,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = module_deprecated_notice; diff --git a/src/modules/module_02501.c b/src/modules/module_02501.c index 3b987cee8..458724712 100644 --- a/src/modules/module_02501.c +++ b/src/modules/module_02501.c @@ -910,6 +910,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = module_deprecated_notice; diff --git a/src/modules/module_02600.c b/src/modules/module_02600.c index a784dcb79..2d24809d3 100644 --- a/src/modules/module_02600.c +++ b/src/modules/module_02600.c @@ -139,6 +139,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02611.c b/src/modules/module_02611.c index 096fb3cd8..50c91eb8f 100644 --- a/src/modules/module_02611.c +++ b/src/modules/module_02611.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02612.c b/src/modules/module_02612.c index 56edc1de8..e4445ca13 100644 --- a/src/modules/module_02612.c +++ b/src/modules/module_02612.c @@ -155,6 +155,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02630.c b/src/modules/module_02630.c index f1098413d..2cb6f0877 100644 --- a/src/modules/module_02630.c +++ b/src/modules/module_02630.c @@ -156,6 +156,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02711.c b/src/modules/module_02711.c index e9943538f..11a2495d1 100644 --- a/src/modules/module_02711.c +++ b/src/modules/module_02711.c @@ -137,6 +137,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_02811.c b/src/modules/module_02811.c index 7f9c5fb3a..945878bae 100644 --- a/src/modules/module_02811.c +++ b/src/modules/module_02811.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03000.c b/src/modules/module_03000.c index 451693052..2da2023f0 100644 --- a/src/modules/module_03000.c +++ b/src/modules/module_03000.c @@ -49,11 +49,27 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_threads_max = 64; + + return kernel_threads_max; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { // Intel(R) Xeon(R) W-3223 CPU @ 3.50GHz; OpenCL C 1.2; 11.3.1; 20E241 if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE || device_param->opencl_platform_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU)) { + if (strncmp (device_param->device_name, "AMD EPYC", 8) == 0) + { + // works on: AMD EPYC 7642 48-Core Processor, OpenCL 2.1 (Build 0) + return false; + } + + // fail also on Apple Intel + + // skip by default for now return true; } @@ -224,6 +240,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03100.c b/src/modules/module_03100.c index af0f98840..f5b77a395 100644 --- a/src/modules/module_03100.c +++ b/src/modules/module_03100.c @@ -135,6 +135,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03200.c b/src/modules/module_03200.c index 69cd54cf3..9e2579df9 100644 --- a/src/modules/module_03200.c +++ b/src/modules/module_03200.c @@ -60,6 +60,20 @@ typedef struct bcrypt_tmp } bcrypt_tmp_t; +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = 32; + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 32; + + return kernel_loops_max; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) @@ -312,6 +326,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -354,8 +370,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_jit_cache_disable = module_jit_cache_disable; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = MODULE_DEFAULT; - module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = module_kernel_loops_max; + module_ctx->module_kernel_loops_min = module_kernel_loops_min; module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; diff --git a/src/modules/module_03500.c b/src/modules/module_03500.c index cdca0d157..b6a94471d 100644 --- a/src/modules/module_03500.c +++ b/src/modules/module_03500.c @@ -139,6 +139,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03610.c b/src/modules/module_03610.c index e93be95ed..413d0776f 100644 --- a/src/modules/module_03610.c +++ b/src/modules/module_03610.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03710.c b/src/modules/module_03710.c index 787473468..f9c038577 100644 --- a/src/modules/module_03710.c +++ b/src/modules/module_03710.c @@ -152,6 +152,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03711.c b/src/modules/module_03711.c index ad7fd3a9a..e1f221cfa 100644 --- a/src/modules/module_03711.c +++ b/src/modules/module_03711.c @@ -155,6 +155,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03730.c b/src/modules/module_03730.c index c5959ad06..746fdff9a 100644 --- a/src/modules/module_03730.c +++ b/src/modules/module_03730.c @@ -207,6 +207,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03800.c b/src/modules/module_03800.c index a863b7ec0..f80aea247 100644 --- a/src/modules/module_03800.c +++ b/src/modules/module_03800.c @@ -153,6 +153,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_03910.c b/src/modules/module_03910.c index 4aebe37c3..0adb66ef7 100644 --- a/src/modules/module_03910.c +++ b/src/modules/module_03910.c @@ -169,6 +169,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04010.c b/src/modules/module_04010.c index 0e7e2063e..8a77bc84d 100644 --- a/src/modules/module_04010.c +++ b/src/modules/module_04010.c @@ -152,6 +152,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04110.c b/src/modules/module_04110.c index 396238751..e364454f8 100644 --- a/src/modules/module_04110.c +++ b/src/modules/module_04110.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04300.c b/src/modules/module_04300.c index 85d999530..05b1ae98b 100644 --- a/src/modules/module_04300.c +++ b/src/modules/module_04300.c @@ -139,6 +139,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04400.c b/src/modules/module_04400.c index 6c86306d1..c00f9555c 100644 --- a/src/modules/module_04400.c +++ b/src/modules/module_04400.c @@ -129,6 +129,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04410.c b/src/modules/module_04410.c index 4a763340a..e7c631a7b 100644 --- a/src/modules/module_04410.c +++ b/src/modules/module_04410.c @@ -152,6 +152,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04420.c b/src/modules/module_04420.c index 9a2727935..c2dee200b 100644 --- a/src/modules/module_04420.c +++ b/src/modules/module_04420.c @@ -151,6 +151,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04430.c b/src/modules/module_04430.c index 52eae5dea..e9acfe3f2 100644 --- a/src/modules/module_04430.c +++ b/src/modules/module_04430.c @@ -151,6 +151,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04500.c b/src/modules/module_04500.c index ad98eb05d..7973d962d 100644 --- a/src/modules/module_04500.c +++ b/src/modules/module_04500.c @@ -144,6 +144,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04510.c b/src/modules/module_04510.c index 6659b478d..b3e8cb224 100644 --- a/src/modules/module_04510.c +++ b/src/modules/module_04510.c @@ -182,6 +182,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04520.c b/src/modules/module_04520.c index 3c0ff2eb5..5a92a0dc0 100644 --- a/src/modules/module_04520.c +++ b/src/modules/module_04520.c @@ -152,6 +152,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04521.c b/src/modules/module_04521.c index 3e0f8abe8..ce8e3b859 100644 --- a/src/modules/module_04521.c +++ b/src/modules/module_04521.c @@ -143,6 +143,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04522.c b/src/modules/module_04522.c index 5423f86cc..fc8ce061e 100644 --- a/src/modules/module_04522.c +++ b/src/modules/module_04522.c @@ -143,6 +143,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04700.c b/src/modules/module_04700.c index 90b1f0f18..1b510503f 100644 --- a/src/modules/module_04700.c +++ b/src/modules/module_04700.c @@ -146,6 +146,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04710.c b/src/modules/module_04710.c index 6a04380c0..27f47ccc6 100644 --- a/src/modules/module_04710.c +++ b/src/modules/module_04710.c @@ -182,6 +182,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04711.c b/src/modules/module_04711.c index 1e1bfdcc0..bebcb9fda 100644 --- a/src/modules/module_04711.c +++ b/src/modules/module_04711.c @@ -183,6 +183,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04800.c b/src/modules/module_04800.c index d65124938..05a3b11e3 100644 --- a/src/modules/module_04800.c +++ b/src/modules/module_04800.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_04900.c b/src/modules/module_04900.c index 02c7a2ca7..b82b5c8ee 100644 --- a/src/modules/module_04900.c +++ b/src/modules/module_04900.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05000.c b/src/modules/module_05000.c index 85c5c9e87..8d2cb7f05 100644 --- a/src/modules/module_05000.c +++ b/src/modules/module_05000.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05100.c b/src/modules/module_05100.c index d16ae19d6..a8c3800c3 100644 --- a/src/modules/module_05100.c +++ b/src/modules/module_05100.c @@ -107,6 +107,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05200.c b/src/modules/module_05200.c index 47fb863cb..fae79c537 100644 --- a/src/modules/module_05200.c +++ b/src/modules/module_05200.c @@ -192,6 +192,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05300.c b/src/modules/module_05300.c index ea10850b2..036043f57 100644 --- a/src/modules/module_05300.c +++ b/src/modules/module_05300.c @@ -248,6 +248,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05400.c b/src/modules/module_05400.c index f6470f0c0..e5df606cf 100644 --- a/src/modules/module_05400.c +++ b/src/modules/module_05400.c @@ -255,6 +255,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05500.c b/src/modules/module_05500.c index 9fc1de726..ffb3b3ba5 100644 --- a/src/modules/module_05500.c +++ b/src/modules/module_05500.c @@ -410,6 +410,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05600.c b/src/modules/module_05600.c index a40ec4e64..bb347e372 100644 --- a/src/modules/module_05600.c +++ b/src/modules/module_05600.c @@ -305,6 +305,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05700.c b/src/modules/module_05700.c index e981eeea1..78ed12a1f 100644 --- a/src/modules/module_05700.c +++ b/src/modules/module_05700.c @@ -156,6 +156,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_05800.c b/src/modules/module_05800.c index b646d0f89..9595ab988 100644 --- a/src/modules/module_05800.c +++ b/src/modules/module_05800.c @@ -168,6 +168,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06000.c b/src/modules/module_06000.c index 6c7b5ffec..8b118d9af 100644 --- a/src/modules/module_06000.c +++ b/src/modules/module_06000.c @@ -42,6 +42,15 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; +} + int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -110,6 +119,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -148,7 +159,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_06050.c b/src/modules/module_06050.c index 7cb55504c..e092facd7 100644 --- a/src/modules/module_06050.c +++ b/src/modules/module_06050.c @@ -138,6 +138,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06060.c b/src/modules/module_06060.c index 5407e642e..c9009589f 100644 --- a/src/modules/module_06060.c +++ b/src/modules/module_06060.c @@ -138,6 +138,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06100.c b/src/modules/module_06100.c index 339a933fc..2791501ea 100644 --- a/src/modules/module_06100.c +++ b/src/modules/module_06100.c @@ -51,6 +51,11 @@ char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAY hc_asprintf (&jit_build_options, "-D FORCE_DISABLE_SHM"); } + if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) + { + hc_asprintf (&jit_build_options, "-D FORCE_DISABLE_SHM"); + } + return jit_build_options; } @@ -189,6 +194,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06211.c b/src/modules/module_06211.c index 7fc1d3761..0faa59d79 100644 --- a/src/modules/module_06211.c +++ b/src/modules/module_06211.c @@ -77,21 +77,13 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } + char *jit_build_options = NULL; - return false; + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; } bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -258,6 +250,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -296,7 +290,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; @@ -323,6 +317,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06212.c b/src/modules/module_06212.c index d6b5d3e59..8601a32ab 100644 --- a/src/modules/module_06212.c +++ b/src/modules/module_06212.c @@ -77,21 +77,13 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } + char *jit_build_options = NULL; - return false; + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; } bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -258,6 +250,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -296,7 +290,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; @@ -323,6 +317,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06213.c b/src/modules/module_06213.c index 0a7cb01d7..7f0af57cc 100644 --- a/src/modules/module_06213.c +++ b/src/modules/module_06213.c @@ -77,27 +77,13 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm06213_comp' pipeline, timeout reached - return true; - } + char *jit_build_options = NULL; - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); - return false; + return jit_build_options; } bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -264,6 +250,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -302,7 +290,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; @@ -329,6 +317,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06221.c b/src/modules/module_06221.c index 1948ccd46..08a1abe3c 100644 --- a/src/modules/module_06221.c +++ b/src/modules/module_06221.c @@ -78,31 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - self-test failed - return true; - } - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -269,6 +244,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -334,6 +311,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06222.c b/src/modules/module_06222.c index c46b7d2a7..ae050a8fb 100644 --- a/src/modules/module_06222.c +++ b/src/modules/module_06222.c @@ -78,31 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - self-test failed - return true; - } - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -269,6 +244,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -334,6 +311,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06223.c b/src/modules/module_06223.c index a87928a2d..f424a1ede 100644 --- a/src/modules/module_06223.c +++ b/src/modules/module_06223.c @@ -78,34 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm06223_comp' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - else if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X, OpenCL: self-test failed - return true; - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -272,6 +244,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -337,6 +311,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06231.c b/src/modules/module_06231.c index e9835cdd2..11679dd43 100644 --- a/src/modules/module_06231.c +++ b/src/modules/module_06231.c @@ -26,8 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_BINARY_HASHFILE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_BINARY_HASHFILE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "cf53d4153414b63285e701e52c2d99e148c6ccc4508132f82cb41862d0a0ac9ea16274285ac261c339c1508eec9fea54c33e382458662913678f2a88a84959a678e238973985ec670d50252677430587ee28b72bfa5edfb2f79c40b734ba8a54a3662642a6ab067e75f41154688ad4adb5d6decd891462dd537188195a51e06fa5baf22b69d0f472cfeeae77ab9a90091731863af1d8b5b380da179fa7d5227ef031732b1ae06e0fe34c0b28b7a64eac34e5a08e09d7001394b3afc804ac69bf819cdd2d383fe96a721f7c683628da8e529d84bdaa68d702573d8f7ef26f75d1bd5c91efa88cb33b1e9c006b87981c55ed3b8063ab7068f8e99b128bc56ea3e883efa55d6f340b2681e50405d91f5f6d76cdbeac404944164d329d3ee01311de0bc6547310f126b5a4c0e9fb74825f91faefa60b7ac828819d4544c1872ff5041e61d5cf093553f427358b2181046376d7b876e1bccf0774d5d251b7c922c214bb5c70c715165d028e1dca73e7adeca3396d77f6e597a10dd4c58f37fdbbdc1d04cd8890ba4c5025776a88a349bb925add13193becf1ca10fe32536db0c0b06a1ef799fb692e304b3716ca5a8a80859c4012ca3e06701b46b5a32f4d10e285a0cdaf6c24e0d98139e7f306e52503c9b503aa28f1fbbb236284907068074fcb3e267e3c4aab2bd3b79b24a7a08106bb55850fa2bb8e2f6d9919a6743cb822c164"; @@ -78,36 +77,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm06231_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -274,6 +243,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -318,7 +289,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -339,6 +310,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06232.c b/src/modules/module_06232.c index 65c50597c..3d02dbef4 100644 --- a/src/modules/module_06232.c +++ b/src/modules/module_06232.c @@ -26,8 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_BINARY_HASHFILE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_BINARY_HASHFILE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "e9e503972b72dee996b0bfced2df003a54b42399e3586520cf1f69475ba32aff564e40e604a505af95ce15220f558ae815e94ce4953882a8299ee3fffb12e9bd62bf8e2c41c0a8337ce20d45715440cc83e394200d351c5b04be5b70fa11b8467320a091a1d703c88cc7b26fd114795c04a973b3266ba97f55d4b4e4771bb1b4a6aabc9d57e03f0ae7c8a77dfc3d37078efba45031e7d63bb514726e2f2dc6da8cce167a17e36b32c326a5bcaa2c4b445f6e10e1f899a9adcc2a698769f900b7909f7aec52fc9862d75286ffda67933f9c52e5c681d590ad0329b85f8db0f6bb6daa3b2d55b62c65da37e3e7fcb99954e0abe20c39724e8fb2c7f839ec67d35f151dfd8c4dd4bc8dc4393fab291efa08cc0099277d219a0ba4c6272af3684d8043ed3f502b98e196dc7aa0291627613179199976f28eff08649acf70aa0c0dc5896ed13eb18ea28fdd6c460a9c7cfedeab5ac80a3c195226cfca094a7590fa2ae5ed2133ba09b5466b2049b6291f8dcf345e5718a4c0ef3f9c8d8e07d0e5dddd07452b533fbf243ef063fb6d26759ae725d8ca430f8cf17b86665d23bdff1c9dbdfe601b88e87cb7c89f23abc4a8bb1f0b7375cc29b1d81c950ffe92e16e2080e1d6270bbb3ba753322d2b623caed87213e552c33e699d4010f0f61df2b7f460d7cd82e70a711388f1c0b591d424259d3de8b3628daf62c6c5b71864eb0e7d31"; @@ -78,36 +77,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm06232_init' pipeline, Compilation failed - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -274,6 +243,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -318,7 +289,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -339,6 +310,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06233.c b/src/modules/module_06233.c index 3017e8093..337bf3beb 100644 --- a/src/modules/module_06233.c +++ b/src/modules/module_06233.c @@ -26,8 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_BINARY_HASHFILE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_BINARY_HASHFILE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "de7d6725cc4c910a7e96307df69d41335e64d17b4425ca5bf1730f27820f92df9f20f3e855d8566eb5255927153f987348789666c8e563e366a09e68a8126b11c25ac817b2706dde5cec3946e64332b21b41b928985c1a637559ead5b4fecac74ff0d625ef6d8be93dea3eaca05394f23ee9e079d3504a77b4c0b22d3cfcafa9c670966bfa3a5f30539250d97267a9e56b5a1437b1fd2ce58f4ab78b52ba61d01c28d7a6b726d92c8819711c70f820690cf2b9bbef75f196ba87fb5f72a29e213096a8be3b6e6d0ff3dc22563dc9e7d95be68ad169c233289fccfdc2f5528c658cb178b4e78d54e96cb452859b01dd756ca0245bdd586fb450e84988071428c80af0a6dc5f16dea8094da3acb51ac5d2a710414256b2423e0333584437ea9a65a07f06bd241103a478d137e9a274a78a19d3ca121f1bc10e4c9e5fc277d23107db1fb447f71ba0f92b20e3ead77cffaca25f772182705a75e500d9aab3996bfda042f4bdfe35a3a477e355c76a711ad0f64848d6144073ce6ec4152c87973fc3e69626523463812061c51f51fc08487e8a4dbae1ca7965c11f222c607688b3384c5c29d4fe91d14d2cc940a6a9d94486d1823261928d88f56fe00e206d7a31734de0217afd38afa3d2cf3499c2dcff13332a369c4b1f39867f6dfc83ec32d19b931b082f07acac7e70bdd537e8432245c11662d89ec3cc97e582de5d2cc6bde7"; @@ -78,36 +77,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm06233_init' pipeline, Compilation failed - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool potfile_disable = true; @@ -274,6 +243,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -318,7 +289,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -339,6 +310,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06241.c b/src/modules/module_06241.c index f202cbc37..ff8647ae0 100644 --- a/src/modules/module_06241.c +++ b/src/modules/module_06241.c @@ -78,23 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -273,6 +256,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -338,6 +323,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06242.c b/src/modules/module_06242.c index d7687337a..7bc2f961f 100644 --- a/src/modules/module_06242.c +++ b/src/modules/module_06242.c @@ -78,23 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -273,6 +256,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -338,6 +323,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06243.c b/src/modules/module_06243.c index 005c4db9f..a2205b498 100644 --- a/src/modules/module_06243.c +++ b/src/modules/module_06243.c @@ -78,23 +78,6 @@ typedef struct tc static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -273,6 +256,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -338,6 +323,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06300.c b/src/modules/module_06300.c index 0f6ed5bc0..bf8c1e37f 100644 --- a/src/modules/module_06300.c +++ b/src/modules/module_06300.c @@ -246,6 +246,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06400.c b/src/modules/module_06400.c index 79e825509..b7ac9d87f 100644 --- a/src/modules/module_06400.c +++ b/src/modules/module_06400.c @@ -370,6 +370,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06500.c b/src/modules/module_06500.c index 2407f87da..29ec729f3 100644 --- a/src/modules/module_06500.c +++ b/src/modules/module_06500.c @@ -411,23 +411,6 @@ static void sha512aix_encode (const u8 digest[64], u8 buf[86]) buf[85] = int_to_itoa64 (l & 0x3f); //l >>= 6; } -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (sha512aix_tmp_t); @@ -560,6 +543,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -625,6 +610,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_06600.c b/src/modules/module_06600.c index f7bea8cdd..a78540944 100644 --- a/src/modules/module_06600.c +++ b/src/modules/module_06600.c @@ -220,6 +220,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06700.c b/src/modules/module_06700.c index 3305f1502..717908cf5 100644 --- a/src/modules/module_06700.c +++ b/src/modules/module_06700.c @@ -296,6 +296,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06800.c b/src/modules/module_06800.c index 6439f98f3..215f26992 100644 --- a/src/modules/module_06800.c +++ b/src/modules/module_06800.c @@ -218,6 +218,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_06900.c b/src/modules/module_06900.c index eff993986..537f9df8f 100644 --- a/src/modules/module_06900.c +++ b/src/modules/module_06900.c @@ -121,6 +121,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07000.c b/src/modules/module_07000.c index 99fb188cc..d11968a80 100644 --- a/src/modules/module_07000.c +++ b/src/modules/module_07000.c @@ -194,6 +194,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07100.c b/src/modules/module_07100.c index d8bdba34f..ec3924cec 100644 --- a/src/modules/module_07100.c +++ b/src/modules/module_07100.c @@ -85,23 +85,6 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con return pw_max; } -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -375,6 +358,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -440,6 +425,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_07200.c b/src/modules/module_07200.c index f69f26e75..ed3485a70 100644 --- a/src/modules/module_07200.c +++ b/src/modules/module_07200.c @@ -61,23 +61,6 @@ typedef struct pbkdf2_sha512_tmp static const char *SIGNATURE_SHA512GRUB = "grub.pbkdf2.sha512."; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (pbkdf2_sha512_t); @@ -232,6 +215,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -297,6 +282,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_07300.c b/src/modules/module_07300.c index 00bff337a..42efc5721 100644 --- a/src/modules/module_07300.c +++ b/src/modules/module_07300.c @@ -171,6 +171,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07350.c b/src/modules/module_07350.c index fd79d31d1..ff59537cf 100644 --- a/src/modules/module_07350.c +++ b/src/modules/module_07350.c @@ -129,6 +129,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07400.c b/src/modules/module_07400.c index 251aec4f8..5584e0482 100644 --- a/src/modules/module_07400.c +++ b/src/modules/module_07400.c @@ -376,6 +376,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07401.c b/src/modules/module_07401.c index ae5fdd434..633c5dd47 100644 --- a/src/modules/module_07401.c +++ b/src/modules/module_07401.c @@ -412,6 +412,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07500.c b/src/modules/module_07500.c index a9331d876..bca6a02d3 100644 --- a/src/modules/module_07500.c +++ b/src/modules/module_07500.c @@ -273,6 +273,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07700.c b/src/modules/module_07700.c index af5dd78d6..2642a0bb7 100644 --- a/src/modules/module_07700.c +++ b/src/modules/module_07700.c @@ -142,6 +142,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07701.c b/src/modules/module_07701.c index 8ca22e4c3..bc852639b 100644 --- a/src/modules/module_07701.c +++ b/src/modules/module_07701.c @@ -134,6 +134,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07800.c b/src/modules/module_07800.c index 8aa784460..ce94bead4 100644 --- a/src/modules/module_07800.c +++ b/src/modules/module_07800.c @@ -156,6 +156,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07801.c b/src/modules/module_07801.c index 4caf03e84..17f8777d4 100644 --- a/src/modules/module_07801.c +++ b/src/modules/module_07801.c @@ -156,6 +156,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_07900.c b/src/modules/module_07900.c index 68a75ec58..29e458de3 100644 --- a/src/modules/module_07900.c +++ b/src/modules/module_07900.c @@ -51,23 +51,6 @@ typedef struct drupal7_tmp static const char *SIGNATURE_DRUPAL7 = "$S$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -458,6 +441,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -523,6 +508,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_08000.c b/src/modules/module_08000.c index 8b6c978a3..ba0913cb2 100644 --- a/src/modules/module_08000.c +++ b/src/modules/module_08000.c @@ -192,6 +192,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08100.c b/src/modules/module_08100.c index 14459192a..8974f004b 100644 --- a/src/modules/module_08100.c +++ b/src/modules/module_08100.c @@ -165,6 +165,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08200.c b/src/modules/module_08200.c index 1aeb647d0..6ebb1288d 100644 --- a/src/modules/module_08200.c +++ b/src/modules/module_08200.c @@ -60,28 +60,6 @@ typedef struct pbkdf2_sha512_tmp } pbkdf2_sha512_tmp_t; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - return true; - } - - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -283,6 +261,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -348,6 +328,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_08300.c b/src/modules/module_08300.c index 74bb19823..c499667ae 100644 --- a/src/modules/module_08300.c +++ b/src/modules/module_08300.c @@ -212,6 +212,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08400.c b/src/modules/module_08400.c index 199177f2c..455243297 100644 --- a/src/modules/module_08400.c +++ b/src/modules/module_08400.c @@ -142,6 +142,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08500.c b/src/modules/module_08500.c index 30984cb2e..ecaf87f4e 100644 --- a/src/modules/module_08500.c +++ b/src/modules/module_08500.c @@ -209,6 +209,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08600.c b/src/modules/module_08600.c index 498e3f378..f1e83a17e 100644 --- a/src/modules/module_08600.c +++ b/src/modules/module_08600.c @@ -106,6 +106,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08700.c b/src/modules/module_08700.c index 6b3b2970e..39b157196 100644 --- a/src/modules/module_08700.c +++ b/src/modules/module_08700.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_EARLY_SKIP | OPTI_TYPE_NOT_ITERATED | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "(GDJ0nDZI8l8RJzlRbemg)"; @@ -62,19 +61,6 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con return pw_max; } -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - char *jit_build_options = NULL; - - // HIP - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - hc_asprintf (&jit_build_options, "-fno-unroll-loops"); - } - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -162,6 +148,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -200,7 +188,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = MODULE_DEFAULT; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_08800.c b/src/modules/module_08800.c index 6b78e7f16..575c912fe 100644 --- a/src/modules/module_08800.c +++ b/src/modules/module_08800.c @@ -214,6 +214,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_08900.c b/src/modules/module_08900.c index 6f996a3b0..44cf20537 100644 --- a/src/modules/module_08900.c +++ b/src/modules/module_08900.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -25,8 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "SCRYPT:16384:8:1:OTEyNzU0ODg=:Cc8SPjRH1hFQhuIPCdF51uNGtJ2aOY/isuoMlMUsJ8c="; @@ -48,222 +48,9 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_SCRYPT = "SCRYPT"; -static const u64 SCRYPT_N = 16384; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 32; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} - -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} +#include "scrypt_common.c" int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { @@ -392,6 +179,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -402,9 +191,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = MODULE_DEFAULT; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -430,13 +219,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -448,7 +237,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -456,7 +245,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_09000.c b/src/modules/module_09000.c index 4ed3b41ff..5e0f66941 100644 --- a/src/modules/module_09000.c +++ b/src/modules/module_09000.c @@ -226,6 +226,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09100.c b/src/modules/module_09100.c index b0378756a..c0195f136 100644 --- a/src/modules/module_09100.c +++ b/src/modules/module_09100.c @@ -200,6 +200,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09200.c b/src/modules/module_09200.c index 495dea9fd..75266262d 100644 --- a/src/modules/module_09200.c +++ b/src/modules/module_09200.c @@ -213,6 +213,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09300.c b/src/modules/module_09300.c index b4e06bef9..4293053ab 100644 --- a/src/modules/module_09300.c +++ b/src/modules/module_09300.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -25,8 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$9$87023684531115$phio0TBQwaO7KZ8toQFyGFyDvyOzidaypRWN0uKX0hU"; @@ -48,222 +48,9 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_CISCO9 = "$9$"; -static const u64 SCRYPT_N = 16384; -static const u64 SCRYPT_R = 1; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 32; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} - -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} +#include "scrypt_common.c" int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { @@ -305,14 +92,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_len = salt_len; - salt->scrypt_N = SCRYPT_N; - salt->scrypt_r = SCRYPT_R; - salt->scrypt_p = SCRYPT_P; + // fixed scrypt configuration in this mode + + salt->scrypt_N = 16384; + salt->scrypt_r = 1; + salt->scrypt_p = 1; salt->salt_iter = salt->scrypt_N; salt->salt_repeats = salt->scrypt_p - 1; - // base64 decode hash const u8 *hash_pos = token.buf[2]; @@ -353,6 +141,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -363,9 +153,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = MODULE_DEFAULT; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -391,13 +181,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -409,7 +199,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -417,7 +207,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_09400.c b/src/modules/module_09400.c index a5961f4fb..756607efa 100644 --- a/src/modules/module_09400.c +++ b/src/modules/module_09400.c @@ -256,6 +256,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09500.c b/src/modules/module_09500.c index a9b179889..c91ae9511 100644 --- a/src/modules/module_09500.c +++ b/src/modules/module_09500.c @@ -266,6 +266,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09600.c b/src/modules/module_09600.c index 988908828..e0f7727fe 100644 --- a/src/modules/module_09600.c +++ b/src/modules/module_09600.c @@ -24,9 +24,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_DEEP_COMP_KERNEL - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_DEEP_COMP_KERNEL; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$office$*2013*100000*256*16*67805436882475302087847656644837*0c392d3b9ca889656d1e615c54f9f3c9*612b79e33b96322c3253fc8a0f314463cd76bc4efe1352f7efffca0f374f7e4b"; @@ -61,6 +59,13 @@ typedef struct office2013_tmp static const char *SIGNATURE_OFFICE2013 = "$office$"; +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 1000; + + return kernel_loops_max; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) @@ -317,6 +322,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09700.c b/src/modules/module_09700.c index 1bd16405f..8050babb7 100644 --- a/src/modules/module_09700.c +++ b/src/modules/module_09700.c @@ -258,6 +258,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09710.c b/src/modules/module_09710.c index 79bb7587b..1698ba1bc 100644 --- a/src/modules/module_09710.c +++ b/src/modules/module_09710.c @@ -28,6 +28,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_ALWAYS_HEXIFY | OPTS_TYPE_AUTODETECT_DISABLE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *BENCHMARK_MASK = "?b?b?b?b?b"; static const char *ST_PASS = "\x91\xb2\xe0\x62\xb9"; static const char *ST_HASH = "$oldoffice$0*55045061647456688860411218030058*e7e24d163fbd743992d4b8892bf3f2f7*493410dbc832557d3fe1870ace8397e2"; @@ -134,7 +135,7 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - return "?b?b?b?b?b"; + return BENCHMARK_MASK; } u32 module_forced_outfile_format (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -278,6 +279,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09720.c b/src/modules/module_09720.c index ee1b6c6e8..daf23c6ea 100644 --- a/src/modules/module_09720.c +++ b/src/modules/module_09720.c @@ -273,6 +273,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09800.c b/src/modules/module_09800.c index 193531626..31085ff4c 100644 --- a/src/modules/module_09800.c +++ b/src/modules/module_09800.c @@ -101,7 +101,9 @@ char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAY } else { - native_threads = device_param->kernel_preferred_wgs_multiple; + const u32 possible = MIN (device_param->device_local_mem_size / 256, 32768 / 256); + + native_threads = possible - (possible % device_param->kernel_preferred_wgs_multiple); } #endif @@ -316,6 +318,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09810.c b/src/modules/module_09810.c index 33dd15186..a4aa244e4 100644 --- a/src/modules/module_09810.c +++ b/src/modules/module_09810.c @@ -27,6 +27,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_ALWAYS_HEXIFY | OPTS_TYPE_AUTODETECT_DISABLE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *BENCHMARK_MASK = "?b?b?b?b?b"; static const char *ST_PASS = "\xb8\xf6\x36\x19\xca"; static const char *ST_HASH = "$oldoffice$3*83328705222323020515404251156288*2855956a165ff6511bc7f4cd77b9e101*941861655e73a09c40f7b1e9dfd0c256ed285acd"; @@ -135,7 +136,7 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - return "?b?b?b?b?b"; + return BENCHMARK_MASK; } u32 module_forced_outfile_format (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -335,6 +336,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09820.c b/src/modules/module_09820.c index f356fcbcb..99314896d 100644 --- a/src/modules/module_09820.c +++ b/src/modules/module_09820.c @@ -338,6 +338,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_09900.c b/src/modules/module_09900.c index 3d845f55a..9e772ea46 100644 --- a/src/modules/module_09900.c +++ b/src/modules/module_09900.c @@ -119,6 +119,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10000.c b/src/modules/module_10000.c index 47901e03c..33fa062c0 100644 --- a/src/modules/module_10000.c +++ b/src/modules/module_10000.c @@ -222,6 +222,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10100.c b/src/modules/module_10100.c index 096b8eba2..149cc5bf2 100644 --- a/src/modules/module_10100.c +++ b/src/modules/module_10100.c @@ -137,6 +137,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10200.c b/src/modules/module_10200.c index 8c743a518..502984264 100644 --- a/src/modules/module_10200.c +++ b/src/modules/module_10200.c @@ -183,6 +183,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10300.c b/src/modules/module_10300.c index 85937d115..cc83dc1d5 100644 --- a/src/modules/module_10300.c +++ b/src/modules/module_10300.c @@ -185,6 +185,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10400.c b/src/modules/module_10400.c index c53cac8db..0f5ecb970 100644 --- a/src/modules/module_10400.c +++ b/src/modules/module_10400.c @@ -355,6 +355,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10410.c b/src/modules/module_10410.c index bf6ec3723..063ac4916 100644 --- a/src/modules/module_10410.c +++ b/src/modules/module_10410.c @@ -26,6 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_ALWAYS_HEXIFY | OPTS_TYPE_AUTODETECT_DISABLE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *BENCHMARK_MASK = "?b?b?b?b?b"; static const char *ST_PASS = "\x6a\x8a\xed\xcc\xb7"; static const char *ST_HASH = "$pdf$1*2*40*-1*0*16*01221086741440841668371056103222*32*27c3fecef6d46a78eb61b8b4dbc690f5f8a2912bbb9afc842c12d79481568b74*32*0000000000000000000000000000000000000000000000000000000000000000"; @@ -144,7 +145,7 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - return "?b?b?b?b?b"; + return BENCHMARK_MASK; } u32 module_forced_outfile_format (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) @@ -376,6 +377,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10420.c b/src/modules/module_10420.c index 14054efc7..af90f250e 100644 --- a/src/modules/module_10420.c +++ b/src/modules/module_10420.c @@ -373,6 +373,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10500.c b/src/modules/module_10500.c index 811df922f..7c746ef10 100644 --- a/src/modules/module_10500.c +++ b/src/modules/module_10500.c @@ -486,6 +486,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10600.c b/src/modules/module_10600.c index 6cd76cbbd..66506fb1d 100644 --- a/src/modules/module_10600.c +++ b/src/modules/module_10600.c @@ -291,6 +291,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10700.c b/src/modules/module_10700.c index a5de11366..4a7725e52 100644 --- a/src/modules/module_10700.c +++ b/src/modules/module_10700.c @@ -24,8 +24,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_REGISTER_LIMIT; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_HASH_COPY - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_HASH_COPY; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$pdf$5*6*256*-1028*1*16*62137640825124540503886403748430*127*0391647179352257f7181236ba371e540c2dbb82fac1c462313eb58b772a54956213764082512454050388640374843000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; @@ -82,6 +81,30 @@ typedef struct pdf17l8_tmp static const char *SIGNATURE_PDF = "$pdf$"; static const int ROUNDS_PDF17L8 = 64; +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + u32 kernel_loops_min = KERNEL_LOOPS_MIN; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + kernel_loops_min = 1; + } + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + u32 kernel_loops_max = KERNEL_LOOPS_MAX; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + kernel_loops_max = 1; + } + + return kernel_loops_max; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) @@ -127,47 +150,40 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con return pw_max; } -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 256; - - return kernel_threads_max; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; - if (device_param->is_metal == true) + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { - hc_asprintf (&jit_build_options, "-D FORCE_DISABLE_SHM"); - } + u32 native_threads = 0; - if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == false)) - { - // this is a workaround to avoid a Segmentation fault and self-test fails on AMD GPU PRO - - hc_asprintf (&jit_build_options, "-cl-opt-disable"); - } - - if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true)) - { - if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) { - // this is a workaround to avoid a compile time of over an hour (and then to not work) on ROCM in pure kernel mode - - hc_asprintf (&jit_build_options, "-cl-opt-disable"); + native_threads = 1; } - } - - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 1) + else if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) { - // this is a workaround to avoid a compile time of over an hour (and then to not work) on ROCM in pure kernel mode + #if defined (__APPLE__) - hc_asprintf (&jit_build_options, "-D NO_INLINE"); + native_threads = 32; + + #else + + if (device_param->device_local_mem_size < 49152) + { + native_threads = MIN (device_param->kernel_preferred_wgs_multiple, 32); // We can't just set 32, because Intel GPU need 8 + } + else + { + // to go over 48KiB, we need to use dynamic shared mem + native_threads = 49152 / 128; + } + + #endif } + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u -D _unroll", native_threads); } return jit_build_options; @@ -357,6 +373,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -399,9 +417,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = MODULE_DEFAULT; - module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = module_kernel_loops_max; + module_ctx->module_kernel_loops_min = module_kernel_loops_min; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_10800.c b/src/modules/module_10800.c index d121df35b..61258f778 100644 --- a/src/modules/module_10800.c +++ b/src/modules/module_10800.c @@ -211,6 +211,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10810.c b/src/modules/module_10810.c index a21fcdb56..3c31bbdcf 100644 --- a/src/modules/module_10810.c +++ b/src/modules/module_10810.c @@ -223,6 +223,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10820.c b/src/modules/module_10820.c index 97dd5b775..e4379bf54 100644 --- a/src/modules/module_10820.c +++ b/src/modules/module_10820.c @@ -223,6 +223,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10830.c b/src/modules/module_10830.c index 6e3831d78..5e71c75ff 100644 --- a/src/modules/module_10830.c +++ b/src/modules/module_10830.c @@ -224,6 +224,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10840.c b/src/modules/module_10840.c index 77e070dc0..d75d03cc3 100644 --- a/src/modules/module_10840.c +++ b/src/modules/module_10840.c @@ -224,6 +224,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10870.c b/src/modules/module_10870.c index 3e2e4bfdd..c60b34586 100644 --- a/src/modules/module_10870.c +++ b/src/modules/module_10870.c @@ -198,6 +198,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10900.c b/src/modules/module_10900.c index 75385f023..c1bf6b92f 100644 --- a/src/modules/module_10900.c +++ b/src/modules/module_10900.c @@ -228,6 +228,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_10901.c b/src/modules/module_10901.c index b0444bb8d..a5c2a2fd8 100644 --- a/src/modules/module_10901.c +++ b/src/modules/module_10901.c @@ -203,6 +203,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11000.c b/src/modules/module_11000.c index 60ab88df0..916f0ffa1 100644 --- a/src/modules/module_11000.c +++ b/src/modules/module_11000.c @@ -45,6 +45,15 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; +} + u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u32 salt_min = 56; @@ -141,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -179,7 +190,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_11100.c b/src/modules/module_11100.c index c95bd6893..a6f20dc6c 100644 --- a/src/modules/module_11100.c +++ b/src/modules/module_11100.c @@ -176,6 +176,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11200.c b/src/modules/module_11200.c index 938b179b1..c899f7eb1 100644 --- a/src/modules/module_11200.c +++ b/src/modules/module_11200.c @@ -140,6 +140,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11300.c b/src/modules/module_11300.c index 6ece4048a..5c7920e7a 100644 --- a/src/modules/module_11300.c +++ b/src/modules/module_11300.c @@ -286,6 +286,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11400.c b/src/modules/module_11400.c index e5264d053..d3540797e 100644 --- a/src/modules/module_11400.c +++ b/src/modules/module_11400.c @@ -432,6 +432,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11500.c b/src/modules/module_11500.c index fa691a2e2..48c803592 100644 --- a/src/modules/module_11500.c +++ b/src/modules/module_11500.c @@ -115,6 +115,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11600.c b/src/modules/module_11600.c index 7205f6b7e..f2b848141 100644 --- a/src/modules/module_11600.c +++ b/src/modules/module_11600.c @@ -791,6 +791,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11700.c b/src/modules/module_11700.c index 55b1bd13b..9df95c265 100644 --- a/src/modules/module_11700.c +++ b/src/modules/module_11700.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "57e9e50caec93d72e9498c211d6dc4f4d328248b48ecf46ba7abfa874f666e36"; @@ -142,6 +141,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11750.c b/src/modules/module_11750.c index bf49d3f9e..afd277f68 100644 --- a/src/modules/module_11750.c +++ b/src/modules/module_11750.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_GENERIC; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "0f71c7c82700c9094ca95eee3d804cc283b538bec49428a9ef8da7b34effb3ba:08151337"; @@ -168,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11760.c b/src/modules/module_11760.c index b9d0c19a2..df888f5aa 100644 --- a/src/modules/module_11760.c +++ b/src/modules/module_11760.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_GENERIC; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "d5c6b874338a492ac57ddc6871afc3c70dcfd264185a69d84cf839a07ef92b2c:08151337"; @@ -168,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11800.c b/src/modules/module_11800.c index 36fa205ce..7e8711f94 100644 --- a/src/modules/module_11800.c +++ b/src/modules/module_11800.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "5d5bdba48c8f89ee6c0a0e11023540424283e84902de08013aeeb626e819950bb32842903593a1d2e8f71897ff7fe72e17ac9ba8ce1d1d2f7e9c4359ea63bdc3"; @@ -166,6 +165,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11850.c b/src/modules/module_11850.c index 4e952013a..28ccdc94f 100644 --- a/src/modules/module_11850.c +++ b/src/modules/module_11850.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_GENERIC; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "be4555415af4a05078dcf260bb3c0a35948135df3dbf93f7c8b80574ceb0d71ea4312127f839b7707bf39ccc932d9e7cb799671183455889e8dde3738dfab5b6:08151337"; @@ -192,6 +191,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11860.c b/src/modules/module_11860.c index 3147c7a8c..f08306f3d 100644 --- a/src/modules/module_11860.c +++ b/src/modules/module_11860.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_PT_ADD01 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADD01; static const u32 SALT_TYPE = SALT_TYPE_GENERIC; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "bebf6831b3f9f958acb345a88cb98f30cb0374cff13e6012818487c8dc8d5857f23bca2caed280195ad558b8ce393503e632e901e8d1eb2ccb349a544ac195fd:08151337"; @@ -192,6 +191,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_11900.c b/src/modules/module_11900.c index 6e85beb0d..83b2c769a 100644 --- a/src/modules/module_11900.c +++ b/src/modules/module_11900.c @@ -192,6 +192,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12000.c b/src/modules/module_12000.c index 733f161b6..32b26c261 100644 --- a/src/modules/module_12000.c +++ b/src/modules/module_12000.c @@ -197,6 +197,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12001.c b/src/modules/module_12001.c index e2be237fe..300068589 100644 --- a/src/modules/module_12001.c +++ b/src/modules/module_12001.c @@ -170,6 +170,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12100.c b/src/modules/module_12100.c index 556476236..d7dc28ddd 100644 --- a/src/modules/module_12100.c +++ b/src/modules/module_12100.c @@ -202,6 +202,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12200.c b/src/modules/module_12200.c index c731fc89f..14868bad6 100644 --- a/src/modules/module_12200.c +++ b/src/modules/module_12200.c @@ -206,6 +206,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12300.c b/src/modules/module_12300.c index e07b42b17..c474e1cef 100644 --- a/src/modules/module_12300.c +++ b/src/modules/module_12300.c @@ -55,23 +55,6 @@ typedef struct oraclet_tmp static const int ROUNDS_ORACLET = 4096; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (oraclet_tmp_t); @@ -197,6 +180,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -262,6 +247,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_12400.c b/src/modules/module_12400.c index e84420685..04ec8b03c 100644 --- a/src/modules/module_12400.c +++ b/src/modules/module_12400.c @@ -222,6 +222,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12500.c b/src/modules/module_12500.c index f0aa23ede..b46e19ab0 100644 --- a/src/modules/module_12500.c +++ b/src/modules/module_12500.c @@ -220,6 +220,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12600.c b/src/modules/module_12600.c index 27606ceeb..15ba04535 100644 --- a/src/modules/module_12600.c +++ b/src/modules/module_12600.c @@ -222,6 +222,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12700.c b/src/modules/module_12700.c index f7af4f4d1..7a5fa69fc 100644 --- a/src/modules/module_12700.c +++ b/src/modules/module_12700.c @@ -56,6 +56,20 @@ typedef struct mywallet_tmp static const char *SIGNATURE_MYWALLET = "$blockchain$"; static const int ROUNDS_MYWALLET = 10; +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = ROUNDS_MYWALLET - 1; + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = ROUNDS_MYWALLET - 1; + + return kernel_loops_max; +} + u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (mywallet_tmp_t); @@ -153,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -195,8 +211,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = MODULE_DEFAULT; - module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = module_kernel_loops_min; + module_ctx->module_kernel_loops_min = module_kernel_loops_max; module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; diff --git a/src/modules/module_12800.c b/src/modules/module_12800.c index 066ed8a1d..848946cbe 100644 --- a/src/modules/module_12800.c +++ b/src/modules/module_12800.c @@ -225,6 +225,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_12900.c b/src/modules/module_12900.c index 2a09a0652..b77312145 100644 --- a/src/modules/module_12900.c +++ b/src/modules/module_12900.c @@ -233,6 +233,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13000.c b/src/modules/module_13000.c index a0f178372..7a4b4748b 100644 --- a/src/modules/module_13000.c +++ b/src/modules/module_13000.c @@ -275,6 +275,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13100.c b/src/modules/module_13100.c index 3fa5c30bb..49b609d54 100644 --- a/src/modules/module_13100.c +++ b/src/modules/module_13100.c @@ -22,8 +22,7 @@ static const u64 KERN_TYPE = 13100; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$krb5tgs$23$*user$realm$test/spn*$b548e10f5694ae018d7ad63c257af7dc$35e8e45658860bc31a859b41a08989265f4ef8afd75652ab4d7a30ef151bf6350d879ae189a8cb769e01fa573c6315232b37e4bcad9105520640a781e5fd85c09615e78267e494f433f067cc6958200a82f70627ce0eebc2ac445729c2a8a0255dc3ede2c4973d2d93ac8c1a56b26444df300cb93045d05ff2326affaa3ae97f5cd866c14b78a459f0933a550e0b6507bf8af27c2391ef69fbdd649dd059a4b9ae2440edd96c82479645ccdb06bae0eead3b7f639178a90cf24d9a"; @@ -374,6 +373,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13200.c b/src/modules/module_13200.c index 22d201208..9f87b6a62 100644 --- a/src/modules/module_13200.c +++ b/src/modules/module_13200.c @@ -189,6 +189,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13300.c b/src/modules/module_13300.c index daef383d7..b8c7fb56b 100644 --- a/src/modules/module_13300.c +++ b/src/modules/module_13300.c @@ -117,6 +117,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13400.c b/src/modules/module_13400.c index 8f019d859..c5f9d6faf 100644 --- a/src/modules/module_13400.c +++ b/src/modules/module_13400.c @@ -637,6 +637,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13500.c b/src/modules/module_13500.c index 5f59900df..1079a32a7 100644 --- a/src/modules/module_13500.c +++ b/src/modules/module_13500.c @@ -210,6 +210,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13600.c b/src/modules/module_13600.c index f927d5761..1a419067c 100644 --- a/src/modules/module_13600.c +++ b/src/modules/module_13600.c @@ -411,6 +411,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13711.c b/src/modules/module_13711.c index 05ab89ecc..ff18b6c52 100644 --- a/src/modules/module_13711.c +++ b/src/modules/module_13711.c @@ -299,6 +299,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13712.c b/src/modules/module_13712.c index ffba232e1..b39eecfe7 100644 --- a/src/modules/module_13712.c +++ b/src/modules/module_13712.c @@ -316,6 +316,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13713.c b/src/modules/module_13713.c index f5aebfe91..d3c8d5fa4 100644 --- a/src/modules/module_13713.c +++ b/src/modules/module_13713.c @@ -316,6 +316,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13721.c b/src/modules/module_13721.c index ea94e290e..b6c937875 100644 --- a/src/modules/module_13721.c +++ b/src/modules/module_13721.c @@ -89,23 +89,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc64_tmp_t *vc64_tmp = (const vc64_tmp_t *) tmps; @@ -318,6 +301,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -383,6 +368,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_13722.c b/src/modules/module_13722.c index 37bd46b06..89b65cf6b 100644 --- a/src/modules/module_13722.c +++ b/src/modules/module_13722.c @@ -89,29 +89,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13722_comp' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc64_tmp_t *vc64_tmp = (const vc64_tmp_t *) tmps; @@ -324,6 +301,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -389,6 +368,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_13723.c b/src/modules/module_13723.c index 5e76c81e8..92fb1bb5b 100644 --- a/src/modules/module_13723.c +++ b/src/modules/module_13723.c @@ -89,29 +89,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13723_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc64_tmp_t *vc64_tmp = (const vc64_tmp_t *) tmps; @@ -324,6 +301,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -389,6 +368,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_13731.c b/src/modules/module_13731.c index 7b0fe41d6..27f0e5033 100644 --- a/src/modules/module_13731.c +++ b/src/modules/module_13731.c @@ -29,8 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "48f79476aa0aa8327a8a9056e61450f4e2883c9e9669142f2e2f022c2f85303b897d088dea03d64329f6c402a56fed05b3919715929090a25c8ae84c67dbdb364ebfa3e9ccc0b391c130a4c3dd6495a1d6eb5d2eab72f8009096f7475ecb736bb3225b6da144e1596d859dad159fae5a739beea88ea074771e9d0b2d7c48ae302606a60d7cff6db54f3e460c548c06a4f47dc1ac203a8c8349fbff6a652219a63f27bc76327543e22be4f8dab8e4f90a4283fbf1552119fe24114ce8869eb20ce87dd72300f7aad3f7b4a26a355f16517725449151cf0373dbd0b281f6ac753485a14a5361cc75d40928e241a6b4684658801774843238048cf8c7f2fd88950abac040e12b0c41fdcaca3702907e951ec11c061a91b3050a4855abe6f3b50b4bd0b17c4be1f5b50b873eadc2d8446cd72c4fcac576bbce3acea769f740c5322ee8c927ffd4dd11c8a9e66f06e58df2e5d4d85c13b44c412bab839c9512b7a0acdd97b37dcccc4b70854eda0f36de12d62dd10cc13bc6154103d083bf6540bc78e5d0aad5d063cc74dad4cbe6e060febda2a9fd79c238f99dcb0766ff4addcfd0c03e619c765f65b1c75d5d22c6536958bcda78077ff44b64c4da741bf50154df310d4e0724238a777b524237b9478277e400ad8146dc3ca1da83e3d2f1c5115a4b7fcdc71dd7d56ba86a2f9b721c9a4137aabb07c3c5fedcf5342c4fae4898c9"; @@ -88,13 +87,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -307,6 +299,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -351,7 +345,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = module_kernel_loops_max; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_13732.c b/src/modules/module_13732.c index 6c9c6ea57..e78dbaa83 100644 --- a/src/modules/module_13732.c +++ b/src/modules/module_13732.c @@ -29,8 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "1b721942019ebe8cedddbed7744a0702c0e053281a467e0ed69bf875c7406407d72eb8f2aea21270e41898c0a2c14382f86e04c15e7bc019d1d9dd813eabee0ae5173e3cb1d927859d3e6de1006335a5184ae12b4c8dc2db2b1cd785063152a776f4dc5cacc1856a919b880d704b7450f5a0e0c9521bc9b4d67213c36a50e6664a1cbcea33f997b858e654111c7e9fca74f361528e85a28880381ec2600e3c1cd508c3833dd21cc91978185cba53caefd7b3c82d219d49f0b41e536d32e8d3ce194ad7923ca742213e19dcebdbd9687979d5a594654a5c611e8b829c4019e90a3cfb14e5fd7f8ed91e0fc79eed182399f02a3e3e202d4becaa6730e1f05f99ce06ce16dba7777ccddac72e85f2d3be5ecc9c808ac273f10ceb71cad666166abc327c4061a5f47424a5b6d9d093782f34b49924342a2e8cea663446ed4232a9a415ee2dfde988fa827b06d7438fec20ad0689543c3ee4602ce3ec3806fc7d668ef7e34330edd1e077b329a7627fa3ae5c89308258a17ecefbee114c80c2ab06f8271f14de8f2d13d1d6e5a119b71a6bae88ab151f76cdb2442284bc481d0df7e2163c3acfe763d3968195450d275af9034a00184a30cefed163e636626bffe6a35df3472508a49cb2b9b4c4a95d11c5d17e4e0539e9f13112125515778bcd1c2813c62a02673663062ad60583ec6a02c8a572865829e5b8c767b285728bea4907"; @@ -88,13 +87,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -307,6 +299,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -351,7 +345,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = module_kernel_loops_max; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_13733.c b/src/modules/module_13733.c index 979884c4b..1d7c36628 100644 --- a/src/modules/module_13733.c +++ b/src/modules/module_13733.c @@ -29,8 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "5eb128daef63eff7e6db6aa10a8858f89964f47844acca68df82ebb2e73866fa75e3b7a53f9d2ff1ecdd1f4dc90e9c0fdf51f60d11b1992cd2971b4889edfc8920bbf346fd7693f675b617cb9e4e9a43e6f445021068fc13453b130f2eb1d753ee83ecc61dabec293e88b62110cf6a8fab670e171f6aba2226550b54893263f5fa086b3cc41dd3db2eae07b585e5162c7a0d9723a426d408d83266c4d6018dc1b8b456d28a224033a30bfe62b1e58c2ddf596e07f7ff31849a6f5cfcc1c977b82d8484c270d44ededb0afdb781295e92968fc8cc69766af0ce1e72f02d6b4e124ba4b1af71519dcaade857bb3f371f93a350da6e65ee46c2ac782f134c75c10fe9d653fccc08c614dc362871911af8b83bdfc479f770dfe4b3c86b5d895842c53852fe4912738f848bf7c3e10b8189d25faceab9ef30b6fa0284edaa471752ac2b65335179b8d605417709f64fded7d94383618a921660d4cdb190bbb3769a8e56d2cd1ee07078ebc3b68ebeb016893f7099018e40cb326e32b29a62806eaf1a3fd382f4f876bf721eadfc019c5545813e81fd7168995f743663b136762b07910a63b6eec5b728a4ad07a689cceecb14c2802f334401a0a4fd2ec49e2da7f3cb24d6181f01ceed93ee73dedc3378133c83c9a71155c86785ff20dd5a64323d2fd4bf076bab3c17a1bb45edf81c30a7bd7dbbb097ece0dca83fff9138d56ae668"; @@ -88,13 +87,6 @@ typedef struct vc static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -307,6 +299,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -351,7 +345,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = module_kernel_loops_max; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_13741.c b/src/modules/module_13741.c index e4811633c..7dfb33100 100644 --- a/src/modules/module_13741.c +++ b/src/modules/module_13741.c @@ -301,6 +301,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13742.c b/src/modules/module_13742.c index 9340de8a4..25aa069d2 100644 --- a/src/modules/module_13742.c +++ b/src/modules/module_13742.c @@ -318,6 +318,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13743.c b/src/modules/module_13743.c index 7791c783f..4aa9a36e0 100644 --- a/src/modules/module_13743.c +++ b/src/modules/module_13743.c @@ -318,6 +318,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13751.c b/src/modules/module_13751.c index bad748893..dac31a633 100644 --- a/src/modules/module_13751.c +++ b/src/modules/module_13751.c @@ -335,6 +335,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13752.c b/src/modules/module_13752.c index 60891b7d8..e959a80af 100644 --- a/src/modules/module_13752.c +++ b/src/modules/module_13752.c @@ -335,6 +335,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13753.c b/src/modules/module_13753.c index d3304a48a..277afaf02 100644 --- a/src/modules/module_13753.c +++ b/src/modules/module_13753.c @@ -335,6 +335,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13761.c b/src/modules/module_13761.c index daf567523..e33a693e2 100644 --- a/src/modules/module_13761.c +++ b/src/modules/module_13761.c @@ -337,6 +337,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13762.c b/src/modules/module_13762.c index ccd9e3a1b..0f5f18545 100644 --- a/src/modules/module_13762.c +++ b/src/modules/module_13762.c @@ -337,6 +337,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13763.c b/src/modules/module_13763.c index 3f33c54a2..c9e28d4c7 100644 --- a/src/modules/module_13763.c +++ b/src/modules/module_13763.c @@ -337,6 +337,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13771.c b/src/modules/module_13771.c index 6d5485f6e..b753d171f 100644 --- a/src/modules/module_13771.c +++ b/src/modules/module_13771.c @@ -30,8 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "444ec71554f0a2989b34bd8a5750ae7b5ed8b1ccdead29120fc030bd5186f312a7fa18ab4f4389d7798e43c073afd1e71dda2052db38dec04a700e8d6b488802ead0cf95d6e6cecc8eaf6464baf94a64acbbd1a86f826333115b6380bda18cf936150efd6ffc2a344bb78b0b4875781a8c5079772429ef50ddf148f35895496d2e39f32ffaf68a007b070b0beaad316c4b3adf43c0c58ad24430a34abf168ed455b64958ca5465cae0684adadc00f7b9c13fc7671b4520892d23aebff49ea92bc15e804cc650dc3bbd5b8f5122051636f0c576977d4b64ba355bf6e6a8e042fc5165f2a8affa51aa12ff718cee4c543976bf565997b4b57c74e79584e317f4bdb3920f2937c4251af87f432bb8ce78dcb30675246f0303db4aaea913c93be5a26d16dbf8d4d20773aa2a4608d2151491ca6593b51965baeaf9b58f78905df522bf88976fe9436a916c8de38d5a6ca7ca7f436e7982a36335a404298304322ebe194bb34e91e8f7ee7c6541679bb0ce9d80bf4431d1c475b1a785e943e57f8e27a4e665940389b6da2771bd27d943955185379f83ca6a124ec55b2b63d4ef2e2ad6ee27de25f959708f3a64facfe07f06e29459a14f02699751d530f258d0c744a759c188de4f9423f2bd21d3d999ea28df4f3a93a2c47a7e788fe43ccbfbe267277b048002da1ef8c1e7b26690230285675a3a8fdc0f2acf46a4cb24141b3ad1"; @@ -321,6 +320,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13772.c b/src/modules/module_13772.c index f1b61cf1d..6494ee637 100644 --- a/src/modules/module_13772.c +++ b/src/modules/module_13772.c @@ -30,8 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "0f5da0b17c60edcd392058752ec29c389b140b54cd1f94de43dccea703b1fd37936e75a500b7f9d4e94e7f214c4696c051be9697792a856ebf9c0f5a598cf8ba5621e49c7505eba3b4738acdc860b6ed648f52e5b673ae06bb04616de438a090ab19abea11c30984ead06859de9b7aec8e436c40816f67a56cb53d5f125e58c42225315a4bf494da8128f0df924bcf6ad4b91c9efc5cb0be67cb0cd753c392388d780f57aba39197513a191cc684e9ebee41bc901dd99e9a625141cf98e55e8f74d838baea3bf8f411b85c14eff8cddd1720c2539eef7a38a72c4ed9745a05476b6a16bcda2a5391c94b6f499e3bea64ff412d03d060741e938ed3dc905d8bd6dbb2420e9277251ebe3421be389ea8b02782baeb258b9ec7e0732b3817ee6da58209871aee4e16d57a132c6215782364570238157d8a7fdcd29f54ab2295f68d027dc9f2e0c951afad7500cafe3219e6530699918ac55f4fa1141bc3596155b05bae2fdc8b0a5438edeb5bb0cfac592565b20645be90b406a1fd59846957e7539fd8423bfd4c7ae7d608aacb084ae887baa1a83b14afff8d2063565086c66e293234a8667af39642b90a38c3a5bd4fa8a787c60f73882535c9b34cb7b243465dcc32aff29cee0e741ff059c6acd8ddcbdb3cfafecdcd0f45c84dd871be4fbffd5ac2ab9e01898009adcf7d932c37d6568ad875e4d6ea15db29a1e8ba5a4e86bd"; @@ -321,6 +320,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13773.c b/src/modules/module_13773.c index d4dd936dd..6f2740347 100644 --- a/src/modules/module_13773.c +++ b/src/modules/module_13773.c @@ -30,8 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "18d2e8314961850f8fc26d2bc6f896db9c4eee301b5fa7295615166552b2422042c6cf6212187ec9c0234908e7934009c23ceed0c4858a7a4deecbc59b50a303afdc7d583cde1b0c06f0bf56162ef1d6d8df8f194aadcbe395780b3d1d7127faf39910eb10f4805abdd1c3ef7a66972603124a475e2b9224699e60a9e12f4096597f20c5fb0528f590d7bd317e41dc6a2128cf5e58a99803a28c213feb8286350b1d7ab56d43bb52e511f3c860e5002472a4454a549509c8ce0c34f17ece23d5b61aa7c63389c8ca44ed10c2caae03e7ed30b3ef98565926d7e4f3a2a9abf03b278083bed7aaadd78d5bffb7cd45ffae92990c06d9e9f375a77a94226035d1f90e177c46a04dab416dfb7ed7c4ed9ee7e84580bed65c5fee9f4b1545b9a7cf6af533870d393eced609aebe308ec1eee3729da09eb7df7a8d1282b15c4a1b8266a456c06b4ea20c209c549d5d6b58a861f8e15cca3b6cef114accbf470ec76d717f6d7d416d7a32f064ab560c1167f9ef4e93310fbd927b088bffbb0cf5d5c2e271c9cad4c604e489e9983a990b23e1a2f973682fdfe38df385474f73ecdc9bce701d01d627192d3051240f4b96bbdcf2346b275e05aa75add4acb97b286cc00e830fee95d0f86a8b1e315ccb6f3f8642180392b3baac01ed2c97c200489b5e5ca4dcb0a6417e622b6196482a10e640b2b6b08e3f62acac3d45dfc6b88c666205"; @@ -321,6 +320,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13781.c b/src/modules/module_13781.c index b793bcc6e..fbbb6b0bf 100644 --- a/src/modules/module_13781.c +++ b/src/modules/module_13781.c @@ -31,8 +31,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_KEYBOARD_MAPPING - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "2bfe4a72e13388a9ce074bbe0711a48d62f123df85b09e0350771edc4a0e4f397038a49b900275c9158145a96b52f95e92f927b3f963c7eadb71a07518d643231041c457d2794d0aa505f794153b52b24441271185d386833fbabf0e880c51b544f583d0db2ab6a926ddd3cdd0b68a61d7f5fe3f0ac6aa06ca676a868f373d35073605cf9d521ff55862b5005213a881a7b9025afc3409fa34dc86496620835df072fecd5b501f15e08113835c510d9f0bfd09d2ef1ac0e7bd01f0523d74a54fe984eb497cb960cce5bb154e024dc0c6c61a61e20a45a8f8ef319c63ca9646fbe00930302a5910891a1bc84bd936c926ca535b3b40c9e0ab255363b24a28bb8216d3d32244a725774e6ebbd73d6d3f2a2adcbc28d5341679cbb747efd56db1a09ce80b24640583ffc6f7ca5bd60d59114afcc78601184ba8feadb8d472f86c32bebf70e8158aa56f9db3b3200ef432aa7b370aa4ba408ef11b70d6806f1a21aaa3b629fa06f71dac0ae3e0ce95c7e5b550fc8c46017e151cbbcdf64b3b62b1b846a08925a217227286acfdad35b28407d589bec9578c2a4e9a4320f4a78e1e590fdf53c0a20fe0a1bb6c7d693abcd0e991c449e569477980d4b8972d21e4abc917d897e48ca427c954c3a3e0c8465ef40de51ffc9188047c043224c4a18638f1d91cd88c36623a1d880f18fd0d6ca0b3bbfa7d5d795acfb63576e2c2d83772e8"; @@ -323,6 +322,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13782.c b/src/modules/module_13782.c index b1b70a48b..e1e6c89c4 100644 --- a/src/modules/module_13782.c +++ b/src/modules/module_13782.c @@ -31,8 +31,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_KEYBOARD_MAPPING - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "af7a64c7c81f608527552532cc7049b0d369e2ce20202d7a41ffb94300cbc9c7ce2130247f49ace4c1512fc3d1b4289ca965e8eb065b35faee5b8479a4e43c4a269f4ee7f6d20f22fe61b2570d46df07b4307f44ba6926f3b44524f0a47be2a0d677d225e2c50ff618b2e5078a19f0613a856bb3145d765cc4c1726aef27b5f03648dcf421b040e7b4fde3193ad9f8a0ae6d91c079610f826e3d556776753d8ca11320632c16a2e49a4eec6e8371681b39be2d7bb826d81dea19eb1dda2e6c71c520a2ad9128b3209a7caf10c196a16ac6f4267ffea8e7be7ddb856976438e0e997773dab75e3dfe0c047f82e4ed0b6e107261b891c4b161fa3c29017428afaaabee5c2dc727fa23b4195265716d92d06e7b828535a77521113077e6f219d7ca721eb5dab66524a530ca3ceba52e3703ec3f435ad1dfee092b090174f4acd1546107db5b403a0ba4fa90c0b4ec19af92a54ebedfd28783dcd83c78499bd33baf3ed10af229ff29634110e2970b6c04232dc95120a365947688abe011f0c8de0e651d9bd112ce0bdf80c4e37c77b962d92f1418272e7484df5217f5f2f3ba1e9b965773ed2727c5d03938516dd789236479b5ff340335c92260b1ad82a313ffa568f912fac799f93b857aaff7b4d76cb525f120a0a9efc376d39c8e27866eff689be01f5adf693ae63ad4b2a77ca96ea985ab7931457f4d8d1afaeb7e423dd752"; @@ -323,6 +322,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13783.c b/src/modules/module_13783.c index 0b046ea67..b1339f7a4 100644 --- a/src/modules/module_13783.c +++ b/src/modules/module_13783.c @@ -31,8 +31,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_KEYBOARD_MAPPING - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "0c9d7444e9e64a833e857163787b2f6349224bdb4bbf788ce25156c870514226674725be3eebc3f2a2c2ee8adbf8bb3ec1405a333e8e091cec0c5aa77fa9b65048ca01d954912bf3a3b1c38c00297a33ea0e014156ce08d9526150c085e5e2776a1faeb272c6e9539f466f4f93ffe6497c77d3aed54ffcdf1a3e6171cffac7b2ad96bd9e7cc553058894058def68beea05891b0ce734b6a166b8a5f24b4052fc7014b424bd6c33c9d710fb409cdf1a6c7567c1ba6a3010b03f9bda8aa2ef6733542d198a316da0c83106a6c31043f11ac191169db3db994493168ea996737355ccff84f27f6792b3dc87025d3594edb9e759ba3885980df17bc8c751ce3aba0df67aa7997906348729e81c4893cc654dc6b1da3ff7c588a327f45b8acff976d0593cc607dad48a25468d7c3ebc6dd49aa32fc526dd513852cdec4b36f3683b4998800afa25bb968c242d4c66b9b0c77b20d7bd40ffb403e9e087990d59c94ee7d36e9ebfa35a310bab963c253596e6bc89f67d5307823851c526ac789d0628a3eb81f2cdfd7d7612d8be1dade1b17f30aa2bb5d02eb8534caca0c334a269085939a5041c4ad112d325b1bfe3e9851bfdcad80bbc05ecbddc3f2ac09e2ad7182daf6ca5ccc510a100514f5d2dce1ff5046e0c8e7edf0bdc27f8fcdf4e9b3bce786c24bfa28dacee65ee8c913fc18eee5df61b8a43224f3a9c4e1b5de7b600d9e0"; @@ -323,6 +322,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13800.c b/src/modules/module_13800.c index 3a73858e3..507600568 100644 --- a/src/modules/module_13800.c +++ b/src/modules/module_13800.c @@ -209,6 +209,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_13900.c b/src/modules/module_13900.c index 9e6713396..20d016cb4 100644 --- a/src/modules/module_13900.c +++ b/src/modules/module_13900.c @@ -159,6 +159,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14000.c b/src/modules/module_14000.c index 03abf486f..bb8c141e8 100644 --- a/src/modules/module_14000.c +++ b/src/modules/module_14000.c @@ -23,6 +23,7 @@ static const u64 KERN_TYPE = 14000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_TM_KERNEL | OPTS_TYPE_ST_HEX; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; @@ -49,6 +50,15 @@ bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE // Intel(R) Xeon(R) W-3223 CPU @ 3.50GHz; OpenCL C 1.2; 11.3.1; 20E241 if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE || device_param->opencl_platform_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU)) { + if (strncmp (device_param->device_name, "AMD EPYC", 8) == 0) + { + // works on: AMD EPYC 7642 48-Core Processor, OpenCL 2.1 (Build 0) + return false; + } + + // fail also on Apple Intel + + // skip by default for now return true; } @@ -254,6 +264,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14100.c b/src/modules/module_14100.c index bece404ad..da7a0b40c 100644 --- a/src/modules/module_14100.c +++ b/src/modules/module_14100.c @@ -205,6 +205,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14400.c b/src/modules/module_14400.c index 7c10075a6..18c8d4c4a 100644 --- a/src/modules/module_14400.c +++ b/src/modules/module_14400.c @@ -43,6 +43,15 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + hc_asprintf (&jit_build_options, "-D NO_FUNNELSHIFT"); + + return jit_build_options; +} + u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const bool optimized_kernel = (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL); @@ -148,6 +157,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -186,7 +197,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_14500.c b/src/modules/module_14500.c index c940dc953..3970fac13 100644 --- a/src/modules/module_14500.c +++ b/src/modules/module_14500.c @@ -347,6 +347,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14600.c b/src/modules/module_14600.c index 6848ca06a..e850e3cc3 100644 --- a/src/modules/module_14600.c +++ b/src/modules/module_14600.c @@ -620,6 +620,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14700.c b/src/modules/module_14700.c index f71fd99a9..4f29f52b6 100644 --- a/src/modules/module_14700.c +++ b/src/modules/module_14700.c @@ -345,6 +345,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14800.c b/src/modules/module_14800.c index 2a5f6b33c..9f3c1ca0f 100644 --- a/src/modules/module_14800.c +++ b/src/modules/module_14800.c @@ -383,6 +383,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_14900.c b/src/modules/module_14900.c index 62499126f..cbe009024 100644 --- a/src/modules/module_14900.c +++ b/src/modules/module_14900.c @@ -24,6 +24,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_SUGGEST_KG; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *BENCHMARK_MASK = "?b?b?b?b?bxxxxx"; static const char *ST_PASS = "hashcat!!!"; static const char *ST_HASH = "7090b6b9:04223875"; @@ -58,7 +59,7 @@ u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - return "?b?b?b?b?bxxxxx"; + return BENCHMARK_MASK; } int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) @@ -126,6 +127,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15000.c b/src/modules/module_15000.c index b41d51d35..998fc2692 100644 --- a/src/modules/module_15000.c +++ b/src/modules/module_15000.c @@ -227,6 +227,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15100.c b/src/modules/module_15100.c index e1c27067c..40ee7efbb 100644 --- a/src/modules/module_15100.c +++ b/src/modules/module_15100.c @@ -321,6 +321,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15200.c b/src/modules/module_15200.c index 91c25f0c3..00b966b8e 100644 --- a/src/modules/module_15200.c +++ b/src/modules/module_15200.c @@ -159,6 +159,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15300.c b/src/modules/module_15300.c index 650004903..071ce7680 100644 --- a/src/modules/module_15300.c +++ b/src/modules/module_15300.c @@ -398,6 +398,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15310.c b/src/modules/module_15310.c index 0908be7a1..724034ce9 100644 --- a/src/modules/module_15310.c +++ b/src/modules/module_15310.c @@ -415,6 +415,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15400.c b/src/modules/module_15400.c index ffcbc1b5a..fac76c8a1 100644 --- a/src/modules/module_15400.c +++ b/src/modules/module_15400.c @@ -216,6 +216,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15500.c b/src/modules/module_15500.c index b87390fb7..cd8f4639b 100644 --- a/src/modules/module_15500.c +++ b/src/modules/module_15500.c @@ -282,6 +282,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15600.c b/src/modules/module_15600.c index c06af7f29..1f2b7b9a3 100644 --- a/src/modules/module_15600.c +++ b/src/modules/module_15600.c @@ -273,6 +273,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_15700.c b/src/modules/module_15700.c index 6b8550095..c4b04ab90 100644 --- a/src/modules/module_15700.c +++ b/src/modules/module_15700.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -24,8 +25,8 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE | OPTS_TYPE_ST_HEX; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -55,30 +56,9 @@ typedef struct ethereum_scrypt static const char *SIGNATURE_ETHEREUM_SCRYPT = "$ethereum$s"; -static const u64 SCRYPT_N = 262144; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 4; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 4; - - return kernel_threads_max; -} +#include "scrypt_common.c" u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { @@ -87,198 +67,6 @@ u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED return esalt_size; } -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -452,6 +240,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -462,9 +252,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = module_esalt_size; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -490,13 +280,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -508,7 +298,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -516,7 +306,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_15900.c b/src/modules/module_15900.c index 3f3302ea4..5ba7bd83d 100644 --- a/src/modules/module_15900.c +++ b/src/modules/module_15900.c @@ -77,29 +77,6 @@ typedef struct dpapimk_tmp_v2 static const char *SIGNATURE_DPAPIMK = "$DPAPImk$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm15900_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (dpapimk_tmp_v2_t); @@ -404,6 +381,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -469,6 +448,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_15910.c b/src/modules/module_15910.c index a512a9111..cda606458 100644 --- a/src/modules/module_15910.c +++ b/src/modules/module_15910.c @@ -421,6 +421,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16000.c b/src/modules/module_16000.c index 0d9536f73..9781e0e72 100644 --- a/src/modules/module_16000.c +++ b/src/modules/module_16000.c @@ -126,6 +126,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16100.c b/src/modules/module_16100.c index 57b0d5a33..5ad51f65a 100644 --- a/src/modules/module_16100.c +++ b/src/modules/module_16100.c @@ -196,6 +196,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16200.c b/src/modules/module_16200.c index f3d65d007..e6294a333 100644 --- a/src/modules/module_16200.c +++ b/src/modules/module_16200.c @@ -260,6 +260,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16300.c b/src/modules/module_16300.c index 1b885e8d3..e7507f1fa 100644 --- a/src/modules/module_16300.c +++ b/src/modules/module_16300.c @@ -64,23 +64,6 @@ typedef struct pbkdf2_sha256_tmp static const char *SIGNATURE_ETHEREUM_PRESALE = "$ethereum$w"; static const int ROUNDS_ETHEREUM_PRESALE = 2000; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -290,6 +273,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -355,6 +340,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_16400.c b/src/modules/module_16400.c index eecd9fe3d..3c8ab0504 100644 --- a/src/modules/module_16400.c +++ b/src/modules/module_16400.c @@ -123,6 +123,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16500.c b/src/modules/module_16500.c index cea9e0a24..a9e9fa1af 100644 --- a/src/modules/module_16500.c +++ b/src/modules/module_16500.c @@ -343,6 +343,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16600.c b/src/modules/module_16600.c index 47ed037d7..75d6b3cb5 100644 --- a/src/modules/module_16600.c +++ b/src/modules/module_16600.c @@ -55,6 +55,18 @@ typedef struct electrum_wallet static const char *SIGNATURE_ELECTRUM_WALLET = "$electrum$"; +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + if (device_param->is_cuda == true) + { + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u", (u32) device_param->device_maxworkgroup_size); + } + + return jit_build_options; +} + u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (electrum_wallet_t); @@ -192,6 +204,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -230,7 +244,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_16700.c b/src/modules/module_16700.c index 3066b8f0b..9dce98e62 100644 --- a/src/modules/module_16700.c +++ b/src/modules/module_16700.c @@ -232,6 +232,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_16800.c b/src/modules/module_16800.c index 9022b4cfb..22d7efba4 100644 --- a/src/modules/module_16800.c +++ b/src/modules/module_16800.c @@ -520,6 +520,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = module_deprecated_notice; diff --git a/src/modules/module_16801.c b/src/modules/module_16801.c index 183677ace..2d9132391 100644 --- a/src/modules/module_16801.c +++ b/src/modules/module_16801.c @@ -593,6 +593,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = module_deprecated_notice; diff --git a/src/modules/module_16900.c b/src/modules/module_16900.c index 3fd5a3d40..443da6007 100644 --- a/src/modules/module_16900.c +++ b/src/modules/module_16900.c @@ -295,6 +295,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17010.c b/src/modules/module_17010.c index c5b4280b0..6dafe2296 100644 --- a/src/modules/module_17010.c +++ b/src/modules/module_17010.c @@ -336,6 +336,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17020.c b/src/modules/module_17020.c index 624b07242..4f982ebf7 100644 --- a/src/modules/module_17020.c +++ b/src/modules/module_17020.c @@ -355,6 +355,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17030.c b/src/modules/module_17030.c index 52fa74c92..4ebb0a1bf 100644 --- a/src/modules/module_17030.c +++ b/src/modules/module_17030.c @@ -334,6 +334,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17040.c b/src/modules/module_17040.c index dd3661136..693c5bfc1 100644 --- a/src/modules/module_17040.c +++ b/src/modules/module_17040.c @@ -365,6 +365,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17200.c b/src/modules/module_17200.c index d43e8132f..1810182bb 100644 --- a/src/modules/module_17200.c +++ b/src/modules/module_17200.c @@ -91,6 +91,7 @@ Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -102,8 +103,7 @@ static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE; static const char *HASH_NAME = "PKZIP (Compressed)"; static const u64 KERN_TYPE = 17200; static const u32 OPTI_TYPE = 0; -static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$pkzip2$1*1*2*0*e3*1c5*eda7a8de*0*28*8*e3*eda7*5096*a9fc1f4e951c8fb3031a6f903e5f4e3211c8fdc4671547bf77f6f682afbfcc7475d83898985621a7af9bccd1349d1976500a68c48f630b7f22d7a0955524d768e34868880461335417ddd149c65a917c0eb0a4bf7224e24a1e04cf4ace5eef52205f4452e66ded937db9545f843a68b1e84a2e933cc05fb36d3db90e6c5faf1bee2249fdd06a7307849902a8bb24ec7e8a0886a4544ca47979a9dfeefe034bdfc5bd593904cfe9a5309dd199d337d3183f307c2cb39622549a5b9b8b485b7949a4803f63f67ca427a0640ad3793a519b2476c52198488e3e2e04cac202d624fb7d13c2*$/pkzip2$"; @@ -218,9 +218,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *digest = (u32 *) digest_buf; - char input[line_len + 1]; + char *input = (char *) hcmalloc (line_len + 1); + if (!input) return PARSER_HAVE_ERRNO; + + memcpy (input, line_buf, line_len); input[line_len] = '\0'; - memcpy (&input, line_buf, line_len); char *saveptr = NULL; @@ -330,6 +332,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[2] = 0; digest[3] = 0; + hcfree (input); + return (PARSER_OK); } @@ -395,6 +399,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17210.c b/src/modules/module_17210.c index 307757689..050ca05d1 100644 --- a/src/modules/module_17210.c +++ b/src/modules/module_17210.c @@ -91,6 +91,7 @@ Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -186,9 +187,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *digest = (u32 *) digest_buf; - char input[line_len + 1]; + char *input = (char *) hcmalloc (line_len + 1); + if (!input) return PARSER_HAVE_ERRNO; + + memcpy (input, line_buf, line_len); input[line_len] = '\0'; - memcpy (&input, line_buf, line_len); char *saveptr = NULL; @@ -297,6 +300,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[2] = 0; digest[3] = 0; + hcfree (input); + return (PARSER_OK); } @@ -362,6 +367,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17220.c b/src/modules/module_17220.c index 1bc26bfd2..e9fa6ffec 100644 --- a/src/modules/module_17220.c +++ b/src/modules/module_17220.c @@ -91,6 +91,7 @@ Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -102,8 +103,7 @@ static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE; static const char *HASH_NAME = "PKZIP (Compressed Multi-File)"; static const u64 KERN_TYPE = 17220; static const u32 OPTI_TYPE = 0; -static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$pkzip2$3*1*1*0*8*24*a425*8827*d1730095cd829e245df04ebba6c52c0573d49d3bbeab6cb385b7fa8a28dcccd3098bfdd7*1*0*8*24*2a74*882a*51281ac874a60baedc375ca645888d29780e20d4076edd1e7154a99bde982152a736311f*2*0*e3*1c5*eda7a8de*0*29*8*e3*eda7*5096*1455781b59707f5151139e018bdcfeebfc89bc37e372883a7ec0670a5eafc622feb338f9b021b6601a674094898a91beac70e41e675f77702834ca6156111a1bf7361bc9f3715d77dfcdd626634c68354c6f2e5e0a7b1e1ce84a44e632d0f6e36019feeab92fb7eac9dda8df436e287aafece95d042059a1b27d533c5eab62c1c559af220dc432f2eb1a38a70f29e8f3cb5a207704274d1e305d7402180fd47e026522792f5113c52a116d5bb25b67074ffd6f4926b221555234aabddc69775335d592d5c7d22462b75de1259e8342a9ba71cb06223d13c7f51f13be2ad76352c3b8ed*$/pkzip2$"; @@ -218,9 +218,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *digest = (u32 *) digest_buf; - char input[line_len + 1]; + char *input = (char *) hcmalloc (line_len + 1); + if (!input) return PARSER_HAVE_ERRNO; + + memcpy (input, line_buf, line_len); input[line_len] = '\0'; - memcpy (&input, line_buf, line_len); char *saveptr = NULL; @@ -326,6 +328,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_len = pkzip->hash_count << 2; + hcfree (input); + return (PARSER_OK); } @@ -398,6 +402,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17225.c b/src/modules/module_17225.c index 8ab15f05b..41debbd09 100644 --- a/src/modules/module_17225.c +++ b/src/modules/module_17225.c @@ -91,6 +91,7 @@ Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -102,8 +103,7 @@ static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE; static const char *HASH_NAME = "PKZIP (Mixed Multi-File)"; static const u64 KERN_TYPE = 17225; static const u32 OPTI_TYPE = 0; -static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$pkzip2$3*1*1*0*0*24*3e2c*3ef8*0619e9d17ff3f994065b99b1fa8aef41c056edf9fa4540919c109742dcb32f797fc90ce0*1*0*8*24*431a*3f26*18e2461c0dbad89bd9cc763067a020c89b5e16195b1ac5fa7fb13bd246d000b6833a2988*2*0*23*17*1e3c1a16*2e4*2f*0*23*1e3c*3f2d*54ea4dbc711026561485bbd191bf300ae24fa0997f3779b688cdad323985f8d3bb8b0c*$/pkzip2$"; @@ -219,9 +219,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *digest = (u32 *) digest_buf; - char input[line_len + 1]; + char *input = (char *) hcmalloc (line_len + 1); + if (!input) return PARSER_HAVE_ERRNO; + + memcpy (input, line_buf, line_len); input[line_len] = '\0'; - memcpy (&input, line_buf, line_len); char *saveptr = NULL; @@ -327,6 +329,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_len = pkzip->hash_count << 2; + hcfree (input); + return (PARSER_OK); } @@ -399,6 +403,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17230.c b/src/modules/module_17230.c index 2b3ef24c9..fd285f5b9 100644 --- a/src/modules/module_17230.c +++ b/src/modules/module_17230.c @@ -91,6 +91,7 @@ Related publication: https://scitepress.org/PublicationsDetail.aspx?ID=KLPzPqStp #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -199,9 +200,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *digest = (u32 *) digest_buf; - char input[line_len + 1]; + char *input = (char *) hcmalloc (line_len + 1); + if (!input) return PARSER_HAVE_ERRNO; + + memcpy (input, line_buf, line_len); input[line_len] = '\0'; - memcpy (&input, line_buf, line_len); char *saveptr = NULL; @@ -308,6 +311,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_len = pkzip->hash_count << 2; + hcfree (input); + return (PARSER_OK); } @@ -380,6 +385,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17300.c b/src/modules/module_17300.c index 139bf7181..36eb6d681 100644 --- a/src/modules/module_17300.c +++ b/src/modules/module_17300.c @@ -118,6 +118,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17400.c b/src/modules/module_17400.c index 74a7b2275..99c0ed604 100644 --- a/src/modules/module_17400.c +++ b/src/modules/module_17400.c @@ -109,6 +109,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17500.c b/src/modules/module_17500.c index 2bd2448e4..06d396b0a 100644 --- a/src/modules/module_17500.c +++ b/src/modules/module_17500.c @@ -115,6 +115,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17600.c b/src/modules/module_17600.c index b6760541b..ccf6101f3 100644 --- a/src/modules/module_17600.c +++ b/src/modules/module_17600.c @@ -121,6 +121,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17700.c b/src/modules/module_17700.c index 803bed8c5..445d8e579 100644 --- a/src/modules/module_17700.c +++ b/src/modules/module_17700.c @@ -118,6 +118,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17800.c b/src/modules/module_17800.c index ae6abb885..519566ec0 100644 --- a/src/modules/module_17800.c +++ b/src/modules/module_17800.c @@ -109,6 +109,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_17900.c b/src/modules/module_17900.c index 3db6a9496..c83930537 100644 --- a/src/modules/module_17900.c +++ b/src/modules/module_17900.c @@ -115,6 +115,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18000.c b/src/modules/module_18000.c index 5f3209c5b..98d352b31 100644 --- a/src/modules/module_18000.c +++ b/src/modules/module_18000.c @@ -121,6 +121,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18100.c b/src/modules/module_18100.c index 37a8ef2e7..46dadfe60 100644 --- a/src/modules/module_18100.c +++ b/src/modules/module_18100.c @@ -135,6 +135,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18200.c b/src/modules/module_18200.c index 159f30fa8..4e5023160 100644 --- a/src/modules/module_18200.c +++ b/src/modules/module_18200.c @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18300.c b/src/modules/module_18300.c index adc98432a..5c8926719 100644 --- a/src/modules/module_18300.c +++ b/src/modules/module_18300.c @@ -271,6 +271,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18400.c b/src/modules/module_18400.c index 549e6ab71..86e43ef45 100644 --- a/src/modules/module_18400.c +++ b/src/modules/module_18400.c @@ -291,6 +291,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18500.c b/src/modules/module_18500.c index f4e0e3cdc..78834a96f 100644 --- a/src/modules/module_18500.c +++ b/src/modules/module_18500.c @@ -48,20 +48,6 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - char *jit_build_options = NULL; - - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - // this is a workaround to avoid a compile time of over an hour (and then to not work) on ROCM in pure kernel mode - - hc_asprintf (&jit_build_options, "-D NO_INLINE"); - } - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -160,6 +146,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -198,7 +186,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = MODULE_DEFAULT; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_18600.c b/src/modules/module_18600.c index ec7e5cbef..e97870d51 100644 --- a/src/modules/module_18600.c +++ b/src/modules/module_18600.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_DYNAMIC_SHARED - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_DYNAMIC_SHARED; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$odf$*0*0*1024*16*bff753835f4ea15644b8a2f8e4b5be3d147b9576*8*ee371da34333b69d*16*a902eff54a4d782a26a899a31f97bef4*0*dae7e41fbc3a500d3ce152edd8876c4f38fb17d673ee2ac44ef1e0e283622cd2ae298a82d8d98f2ea737247881fc353e73a2f535c6e13e0cdc60821c1a61c53a4b0c46ff3a3b355d7b793fad50de15999fc7c1194321d1c54316c3806956c4a3ade7daabb912a2a36398eba883af088b3cb69b43365d9ba9fce3fb0c1524f73947a7e9fc1bf3adb5f85a367035feacb5d97c578b037144c2793f34aa09dcd04bdaa455aee0d4c52fe377248611dd56f2bd4eb294673525db905f5d905a28dec0909348e6bf94bcebf03ddd61a48797cd5728ce6dbb71037b268f526e806401abcf495f6edd0b5d87118671ec690d4627f86a43e51c7f6d42a75a56eec51204d47e115e813ed4425c97b16b195e02ce776c185194b9de43ae89f356e29face016cb393d6fb93af8ea305d921d5592dd184051ac790b9b90266f52b8d53ce1cb1d762942d6d5bbd0e3821be21af9fa6874ba0c60e64f41d3e5b6caca1c53b575afdc5d8f6a3edbf874dbe009c6cb296466fe9637aed4aed8a43a95ea7d26b4090ad33d4ee7a83844b0893e8bc0f04944205fb9576cb5720f019028cd75ca9ac47b3e5fa231354d74135564df43b659cfaea7e195c4a896e0e0e0c85dc9ce3a9ce9ba552bc2a6dbac4901c19558818e1957ed72d78662bb5ba53475ca584371f1825ae0c92322a4404e63c2baad92665aac29b5c6f96e1e6338d48fb0aef4d0b686063974f58b839484f8dcf0a02537cba67a7d2c4de13125d74820cb07ec72782035af1ea6c4db61c77016d1c021b63c8b07adb4e8510f5c41bbc501f60f3dd16462399b52eb146787e38e700147c7aa23ac4d5d22d9d1c93e67a01c92a197d4765cbf8d56a862a1205abb450a182913a69b8d5334a59924f86fb3ccd0dcfe7426053e26ba26b57c05f38d85863fff1f81135b0366e8cd8680663ae8aaf7d005317b849d5e08be882708fa0d8d02d47e89150124b507c34845c922b95e62aa0b3fef218773d7aeb572c67b35ad8787f31ecc6e1846b673b8ba6172223176eabf0020b6aa3aa71405b40b2fc2127bf9741a103f1d8eca21bf27328cdf15153f2f223eff7b831a72ed8ecacf4ea8df4ea44f3a3921e5a88fb2cfa355ece0f05cbc88fdd1ecd368d6e3b2dfabd999e5b708f1bccaeebb296c9d7b76659967742fe966aa6871cbbffe710b0cd838c6e02e6eb608cb5c81d066b60b5b3604396331d97d4a2c4c2317406e48c9f5387a2c72511d1e6899bd450e9ca88d535755bcfddb53a6df118cd9cdc7d8b4b814f7bc17684d8e5975defaa25d06f410ed0724c16b8f69ec3869bc1f05c71483666968d1c04509875dadd72c6182733d564eb1a7d555dc34f6b817c5418626214d0b2c3901c5a46f5b20fddfdf9f71a7dfd75b9928778a3f65e1832dff22be973c2b259744d500a3027c2a2e08972eaaad4c5c4ec871"; @@ -382,6 +381,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18700.c b/src/modules/module_18700.c index 57c7bdc1e..02652acf0 100644 --- a/src/modules/module_18700.c +++ b/src/modules/module_18700.c @@ -95,6 +95,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18800.c b/src/modules/module_18800.c index 45e30f6b6..5e3550b3b 100644 --- a/src/modules/module_18800.c +++ b/src/modules/module_18800.c @@ -234,6 +234,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_18900.c b/src/modules/module_18900.c index 0d07400f8..66b767ae5 100644 --- a/src/modules/module_18900.c +++ b/src/modules/module_18900.c @@ -302,6 +302,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19000.c b/src/modules/module_19000.c index 286635726..fcea5d683 100644 --- a/src/modules/module_19000.c +++ b/src/modules/module_19000.c @@ -23,8 +23,7 @@ static const char *HASH_NAME = "QNX /etc/shadow (MD5)"; static const u64 KERN_TYPE = 19000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "@m@75f6f129f9c9e77b6b1b78f791ed764a@8741857532330050"; @@ -52,13 +51,6 @@ typedef struct qnx_md5_tmp static const int ROUNDS_QNX = 1000; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 64; - - return kernel_threads_max; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (qnx_md5_tmp_t); @@ -196,6 +188,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -240,7 +234,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_19100.c b/src/modules/module_19100.c index 50b89ecec..bef3b9536 100644 --- a/src/modules/module_19100.c +++ b/src/modules/module_19100.c @@ -196,6 +196,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19200.c b/src/modules/module_19200.c index dbc93ec58..967e47915 100644 --- a/src/modules/module_19200.c +++ b/src/modules/module_19200.c @@ -58,6 +58,12 @@ bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE { if ((device_param->opencl_platform_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU)) { + if (strncmp (device_param->device_name, "AMD EPYC", 8) == 0) + { + // works on Linux: AMD EPYC 7642 48-Core Processor, OpenCL 2.1 (Build 0) + return false; + } + return true; } @@ -209,6 +215,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19210.c b/src/modules/module_19210.c index b014c60cb..23c9e632c 100644 --- a/src/modules/module_19210.c +++ b/src/modules/module_19210.c @@ -234,6 +234,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19300.c b/src/modules/module_19300.c index ad1d7cefc..6715e7ae7 100644 --- a/src/modules/module_19300.c +++ b/src/modules/module_19300.c @@ -23,8 +23,7 @@ static const u64 KERN_TYPE = 19300; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_RAW_HASH; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_BE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_BE; static const u32 SALT_TYPE = SALT_TYPE_GENERIC; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "630d2e918ab98e5fad9c61c0e4697654c4c16d73:18463812876898603420835420139870031762867:4449516425193605979760642927684590668549584534278112685644182848763890902699756869283142014018311837025441092624864168514500447147373198033271040848851687108629922695275682773136540885737874252666804716579965812709728589952868736177317883550827482248620334"; @@ -54,27 +53,6 @@ typedef struct sha1_double_salt } sha1_double_salt_t; -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 256; - - return kernel_threads_max; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - char *jit_build_options = NULL; - - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - // this is a workaround to avoid a compile time of over an hour (and then to not work) on ROCM in pure kernel mode - - hc_asprintf (&jit_build_options, "-D NO_INLINE"); - } - - return jit_build_options; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (sha1_double_salt_t); @@ -226,6 +204,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -264,13 +244,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = MODULE_DEFAULT; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; module_ctx->module_kernel_loops_max = MODULE_DEFAULT; module_ctx->module_kernel_loops_min = MODULE_DEFAULT; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; diff --git a/src/modules/module_19500.c b/src/modules/module_19500.c index eaf90f385..f7f139bfb 100644 --- a/src/modules/module_19500.c +++ b/src/modules/module_19500.c @@ -70,20 +70,6 @@ bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE return false; } -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - char *jit_build_options = NULL; - - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) - { - // this is a workaround to avoid a compile time of over an hour (and then to not work) on ROCM in pure kernel mode - - hc_asprintf (&jit_build_options, "-D NO_INLINE"); - } - - return jit_build_options; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (devise_hash_t); @@ -235,6 +221,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -273,7 +261,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = MODULE_DEFAULT; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; diff --git a/src/modules/module_19600.c b/src/modules/module_19600.c index 296a1dca1..9b9a9f258 100644 --- a/src/modules/module_19600.c +++ b/src/modules/module_19600.c @@ -293,6 +293,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19700.c b/src/modules/module_19700.c index c92d61f3c..8f6459225 100644 --- a/src/modules/module_19700.c +++ b/src/modules/module_19700.c @@ -310,6 +310,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19800.c b/src/modules/module_19800.c index 93d746dd2..44146c46c 100644 --- a/src/modules/module_19800.c +++ b/src/modules/module_19800.c @@ -241,6 +241,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_19900.c b/src/modules/module_19900.c index facce5cca..c8ecebecc 100644 --- a/src/modules/module_19900.c +++ b/src/modules/module_19900.c @@ -241,6 +241,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20011.c b/src/modules/module_20011.c index ffa1dbe4f..bd9eb7976 100644 --- a/src/modules/module_20011.c +++ b/src/modules/module_20011.c @@ -64,29 +64,6 @@ static const int DISKCRYPTOR_VERSION = 0; static const int ROUNDS_DISKCRYPTOR = 1000; static const char *SIGNATURE_DISKCRYPTOR = "$diskcryptor$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm20011_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (pbkdf2_sha512_tmp_t); @@ -218,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -283,6 +262,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_20012.c b/src/modules/module_20012.c index 3873c8a8e..4eb42a35f 100644 --- a/src/modules/module_20012.c +++ b/src/modules/module_20012.c @@ -64,29 +64,6 @@ static const int DISKCRYPTOR_VERSION = 0; static const int ROUNDS_DISKCRYPTOR = 1000; static const char *SIGNATURE_DISKCRYPTOR = "$diskcryptor$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm20012_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (pbkdf2_sha512_tmp_t); @@ -218,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -283,6 +262,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_20013.c b/src/modules/module_20013.c index 141dd1e1a..b2ed70b35 100644 --- a/src/modules/module_20013.c +++ b/src/modules/module_20013.c @@ -64,29 +64,6 @@ static const int DISKCRYPTOR_VERSION = 0; static const int ROUNDS_DISKCRYPTOR = 1000; static const char *SIGNATURE_DISKCRYPTOR = "$diskcryptor$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm20013_init' pipeline, timeout reached - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (pbkdf2_sha512_tmp_t); @@ -218,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -283,6 +262,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_20200.c b/src/modules/module_20200.c index ff63ea7c6..af964cf80 100644 --- a/src/modules/module_20200.c +++ b/src/modules/module_20200.c @@ -231,6 +231,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20300.c b/src/modules/module_20300.c index 2d6ac1fd6..ded45c48e 100644 --- a/src/modules/module_20300.c +++ b/src/modules/module_20300.c @@ -230,6 +230,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20400.c b/src/modules/module_20400.c index 2fd8a7dcd..66a18a0c7 100644 --- a/src/modules/module_20400.c +++ b/src/modules/module_20400.c @@ -223,6 +223,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20500.c b/src/modules/module_20500.c index 3a001c93e..37ce6a085 100644 --- a/src/modules/module_20500.c +++ b/src/modules/module_20500.c @@ -162,6 +162,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20510.c b/src/modules/module_20510.c index 4172c1fda..394a69a3b 100644 --- a/src/modules/module_20510.c +++ b/src/modules/module_20510.c @@ -80,7 +80,6 @@ static const u64 KERN_TYPE = 20510; static const u32 OPTI_TYPE = 0; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS | OPTS_TYPE_AUTODETECT_DISABLE | OPTS_TYPE_SUGGEST_KG; static const u32 SALT_TYPE = SALT_TYPE_NONE; @@ -204,6 +203,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20600.c b/src/modules/module_20600.c index e6a17c5af..a8d23bdc9 100644 --- a/src/modules/module_20600.c +++ b/src/modules/module_20600.c @@ -193,6 +193,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20710.c b/src/modules/module_20710.c index 49705221e..4fe2ba5f1 100644 --- a/src/modules/module_20710.c +++ b/src/modules/module_20710.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20711.c b/src/modules/module_20711.c index 1103ddf7b..a72570d04 100644 --- a/src/modules/module_20711.c +++ b/src/modules/module_20711.c @@ -223,6 +223,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20712.c b/src/modules/module_20712.c index e2b5a492d..987d688c4 100644 --- a/src/modules/module_20712.c +++ b/src/modules/module_20712.c @@ -196,6 +196,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20720.c b/src/modules/module_20720.c index 3dc89ef5e..f65724855 100644 --- a/src/modules/module_20720.c +++ b/src/modules/module_20720.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20730.c b/src/modules/module_20730.c index 26e1c1578..ccd1db2a7 100644 --- a/src/modules/module_20730.c +++ b/src/modules/module_20730.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20800.c b/src/modules/module_20800.c index 54a1b02d5..6cece615d 100644 --- a/src/modules/module_20800.c +++ b/src/modules/module_20800.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_20900.c b/src/modules/module_20900.c index 8a0dd5c60..7b1321ea6 100644 --- a/src/modules/module_20900.c +++ b/src/modules/module_20900.c @@ -129,6 +129,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21000.c b/src/modules/module_21000.c index 08697a332..1cb700b21 100644 --- a/src/modules/module_21000.c +++ b/src/modules/module_21000.c @@ -29,8 +29,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 - | OPTS_TYPE_PT_ADDBITS15 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADDBITS15; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "caec04bdf7c17f763a9ec7439f7c9abda112f1bfc9b1bb684fef9b6142636979b9896cfc236896d821a69a961a143dd19c96d59777258201f1bbe5ecc2a2ecf5"; @@ -50,23 +49,6 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u64 *digest = (u64 *) digest_buf; @@ -187,6 +169,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -252,6 +236,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = MODULE_DEFAULT; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_21100.c b/src/modules/module_21100.c index b722be594..9e2f9392e 100644 --- a/src/modules/module_21100.c +++ b/src/modules/module_21100.c @@ -172,6 +172,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21200.c b/src/modules/module_21200.c index f51d214a6..f8cfd2881 100644 --- a/src/modules/module_21200.c +++ b/src/modules/module_21200.c @@ -186,6 +186,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21300.c b/src/modules/module_21300.c index 1825bef35..75e57c1f4 100644 --- a/src/modules/module_21300.c +++ b/src/modules/module_21300.c @@ -163,6 +163,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21310.c b/src/modules/module_21310.c index 9bd5e991c..f631771c8 100644 --- a/src/modules/module_21310.c +++ b/src/modules/module_21310.c @@ -226,6 +226,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21400.c b/src/modules/module_21400.c index 2959a503f..7e2ea0cad 100644 --- a/src/modules/module_21400.c +++ b/src/modules/module_21400.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21420.c b/src/modules/module_21420.c index e55c031ab..f31dda02b 100644 --- a/src/modules/module_21420.c +++ b/src/modules/module_21420.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21500.c b/src/modules/module_21500.c index ba52c09f0..dba580a7c 100644 --- a/src/modules/module_21500.c +++ b/src/modules/module_21500.c @@ -221,6 +221,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21501.c b/src/modules/module_21501.c index 0c7d25abf..f548bebd5 100644 --- a/src/modules/module_21501.c +++ b/src/modules/module_21501.c @@ -228,6 +228,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21600.c b/src/modules/module_21600.c index 868ed3e98..dd35f47de 100644 --- a/src/modules/module_21600.c +++ b/src/modules/module_21600.c @@ -181,6 +181,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_21700.c b/src/modules/module_21700.c index 394f548db..3daa3a11f 100644 --- a/src/modules/module_21700.c +++ b/src/modules/module_21700.c @@ -72,34 +72,6 @@ u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED c return KERN_RUN_3; } -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - return true; - } - - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: self-test failed - return true; - } - - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -306,6 +278,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -371,6 +345,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_21800.c b/src/modules/module_21800.c index e1dfa4757..a64448e7b 100644 --- a/src/modules/module_21800.c +++ b/src/modules/module_21800.c @@ -26,8 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_DEEP_COMP_KERNEL - | OPTS_TYPE_NATIVE_THREADS; + | OPTS_TYPE_DEEP_COMP_KERNEL; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$electrum$5*02170fee7c35f1ef3b229edc90fbd0793b688a0d6f41137a97aab2343d315cce16*94cf72d8f5d774932b414a3344984859e43721268d2eb35fa531de5a2fc7024b463c730a54f4f46229dd9fede5034b19ac415c2916e9c16b02094f845795df0c397ff76d597886b1f9e014ad1a8f64a3f617d9900aa645b3ba86f16ce542251fc22c41d93fa6bc118be96d9582917e19d2a299743331804cfc7ce2c035367b4cbcfb70adfb1e10a0f2795769f2165d8fd13daa8b45eeac495b5b63e91a87f63b42e483f84a881e49adecacf6519cb564694b42dd9fe80fcbc6cdb63cf5ae33f35255266f5c2524dd93d3cc15eba0f2ccdc3c109cc2d7e8f711b8b440f168caf8b005e8bcdfe694148e94a04d2a738f09349a96600bd8e8edae793b26ebae231022f24e96cb158db141ac40400a9e9ef099e673cfe017281537c57f82fb45c62bdb64462235a6eefb594961d5eb2c46537958e4d04250804c6e9f343ab7a0db07af6b8a9d1a6c5cfcd311b8fb8383ac9ed9d98d427d526c2f517fc97473bd87cb59899bd0e8fb8c57fa0f7e0d53daa57c972cf92764af4b1725a5fb8f504b663ec519731929b3caaa793d8ee74293eee27d0e208a60e26290bc546e6fa9ed865076e13febfea249729218c1b5752e912055fbf993fbac5df2cca2b37c5e0f9c30789858ceeb3c482a8db123966775aeed2eee2fc34efb160d164929f51589bff748ca773f38978bff3508d5a7591fb2d2795df983504a788071f469d78c88fd7899cabbc5804f458653d0206b82771a59522e1fa794d7de1536c51a437f5d6df5efd6654678e5794ca429b5752e1103340ed80786f1e9da7f5b39af628b2212e4d88cd36b8a7136d50a6b6e275ab406ba7c57cc70d77d01c4c16e9363901164fa92dc9e9b99219d5376f24862e775968605001e71b000e2c7123b4b43f3ca40db17efd729388782e46e64d43ccb947db4eb1473ff1a3836b74fe312cd1a33b73b8b8d80c087088932277773c329f2f66a01d6b3fc1e651c56959ebbed7b14a21b977f3acdedf1a0d98d519a74b50c39b3052d840106da4145345d86ec0461cddafacc2a4f0dd646457ad05bf04dcbcc80516a5c5ed14d2d639a70e77b686f19cbfb63f546d81ae19cc8ba35cce3f3b5b9602df25b678e14411fecec87b8347f5047513df415c6b1a3d39871a6bcb0f67d9cf8311596deae45fd1d84a04fd58f1fd55c5156b7309af09094c99a53674809cb87a45f95a2d69f9997a38085519cb4e056f9efd56672a2c1fe927d5ea8eec25b8aff6e56f9a2310f1a481daf407b8adf16201da267c59973920fd21bb087b88123ef98709839d6a3ee34efb8ccd5c15ed0e46cff3172682769531164b66c8689c35a26299dd26d09233d1f64f9667474141cf9c6a6de7f2bc52c3bb44cfe679ff4b912c06df406283836b3581773cb76d375304f46239da5996594a8d03b14c02f1b35a432dc44a96331242ae31174*33a7ee59d6d17ed1ee99dc0a71771227e6f3734b17ba36eb589bdced56244135"; @@ -283,6 +282,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22000.c b/src/modules/module_22000.c index ebacaab95..24f2c9ad9 100644 --- a/src/modules/module_22000.c +++ b/src/modules/module_22000.c @@ -1340,6 +1340,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22001.c b/src/modules/module_22001.c index b0fb51dd9..541835ee5 100644 --- a/src/modules/module_22001.c +++ b/src/modules/module_22001.c @@ -1341,6 +1341,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22100.c b/src/modules/module_22100.c index f5b21082a..344218243 100644 --- a/src/modules/module_22100.c +++ b/src/modules/module_22100.c @@ -429,6 +429,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22200.c b/src/modules/module_22200.c index 284264c7e..229939159 100644 --- a/src/modules/module_22200.c +++ b/src/modules/module_22200.c @@ -49,23 +49,6 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_NETSCALER = "2"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -243,6 +226,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -308,6 +293,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = MODULE_DEFAULT; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_22300.c b/src/modules/module_22300.c index 64f33ad4f..a85d1d753 100644 --- a/src/modules/module_22300.c +++ b/src/modules/module_22300.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22301.c b/src/modules/module_22301.c index f75c196dc..fb675732a 100644 --- a/src/modules/module_22301.c +++ b/src/modules/module_22301.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22400.c b/src/modules/module_22400.c index f16d7a453..0aed7670f 100644 --- a/src/modules/module_22400.c +++ b/src/modules/module_22400.c @@ -321,6 +321,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22500.c b/src/modules/module_22500.c index 534539b4e..c130400a0 100644 --- a/src/modules/module_22500.c +++ b/src/modules/module_22500.c @@ -163,6 +163,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22600.c b/src/modules/module_22600.c index 236ba6453..cd618d638 100644 --- a/src/modules/module_22600.c +++ b/src/modules/module_22600.c @@ -236,6 +236,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22700.c b/src/modules/module_22700.c index 009b4a280..b5f3bafb8 100644 --- a/src/modules/module_22700.c +++ b/src/modules/module_22700.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -25,8 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$multibit$2*2e311aa2cc5ec99f7073cacc8a2d1938*e3ad782e7f92d66a3cdfaec43a46be29*5d1cabd4f4a50ba125f88c47027fff9b"; @@ -48,222 +48,9 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_MULTIBIT = "$multibit$"; -static const u64 SCRYPT_N = 16384; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 32; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} - -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} +#include "scrypt_common.c" int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { @@ -307,9 +94,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // scrypt settings - salt->scrypt_N = SCRYPT_N; - salt->scrypt_r = SCRYPT_R; - salt->scrypt_p = SCRYPT_P; + salt->scrypt_N = 16384; + salt->scrypt_r = 8; + salt->scrypt_p = 1; salt->salt_iter = salt->scrypt_N; salt->salt_repeats = salt->scrypt_p - 1; @@ -391,6 +178,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -401,9 +190,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = MODULE_DEFAULT; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -429,13 +218,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -447,7 +236,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -455,7 +244,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_22911.c b/src/modules/module_22911.c index 0edaaec52..91ae3d2fe 100644 --- a/src/modules/module_22911.c +++ b/src/modules/module_22911.c @@ -216,6 +216,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22921.c b/src/modules/module_22921.c index 851308349..163aacee9 100644 --- a/src/modules/module_22921.c +++ b/src/modules/module_22921.c @@ -21,8 +21,7 @@ static const char *HASH_NAME = "RSA/DSA/EC/OpenSSH Private Keys ($6$)"; static const u64 KERN_TYPE = 22921; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$sshng$6$8$7620048997557487$1224$13517a1204dc69528c474ef5cbb02d548698771f2a607c04ea54eb92f13dedba0f2185d2884b4db0c95ce6432856108ea2db858be443e0f8004ffcd60857e4ff1e42b17f056998ec5f96806a06e39cc6e6d7ef4ce8ae62b57b2ec0d0236c35cf4bc00dd6fda45e4788dcca0f0e44dddae1dad2d6e7b705d076f2f8fc5837eec4a002d9633bcad1f395ca8e85e78459abe293451567494d440c3f087bb7fe4d6588018f92ca327dda514a99d7b4b32434da0e3b1bf9344afb2fe29f8d8315a385fe8b81fd4c202c7d82cd9f0bb1600e59762ab6ea1b42e4e299f0a59ce510767e1e1138453d362d0a1aa6680e86b5aa0bd5c62165f4fe7c2867f9533578085adc36739d6c9cf7b36899aac39dcabac8b39194433423e8e18ba28496bbe14dd01231eb5b091ae9de0f7f9ea714c22edac394077fb758fe496e1880571ade399ac229457ddd98577f8a01a036ad3bc8b03a9fb02e26b4b76f6cb676eabe82d1606fca0c5fca62cd1d82c3df1ed58ab4acd4611b2827ebde722bc05e471a427225818aa36dabf5bf1203ccb0ebc8dec097e49f7f948bfe7b939e6d0ff1125b863c033768f588964f8b77ca1e2425751f873f80e5d6a0671f7860cf4a46533585094726c3afe5f7203fa4a01650fa9839772c713a033139cfc6a6e6f7dc62e5844d4c57ef4fc3321bc85d597a54bd6fe37e9e696cf3b5ec66f55232e0964dc5cf880d8a41a9891150618bd9c088fd9824af0d86f817f2c79429c3d56cd6eb41eb6120f9accc10a863f23a2bb6c57d4bd6193f2283ae0215e2e87e672a8438e2550c044fa9556bdb4afc40d8c2752ffbc6c95571756a3c230bb2fa95f519f8da238ef0857ecf860247a8b26e28269f9bad564e7d8bfba2eac9760b52449251cb35e183f5b309a09071535154c6f1013b58f305b544f3589c9eb0e9ac4267a84374a3eab49c53aa9bedbf97f8f19ebc212d8db74ee03554a3514140667fa4ce8e06aad3f32d1b00015be0e8979fe66736018589beee06d6f318851dbe8d9689e70202185d71fc5e5a3d2996ddb8ae1d7718c49855c6f8c43301e0915f324f30d0d9c6a8504a91ad5a7179aafb87ede58598394949910874850994abe815817359152ff6a7c8cc6f19524dfc5e50ddfd038a2275bf809e3c8f05ed3e3137ebd62d91cd3578533787c3847e3c5e07e5a891480e5ceabcf6c344e7bec8b640ab9a03e90b846b35d2f46ba150accef32d2597b064810b15fd54fca6d2b146feabcd05c0b51617ae95e36f6817a62c3ff42c5c2f6f1d20a8a1fd334d3b7d3f83bba057b79d9b5508bb0cb706ba00acb0ab797401fdcfac80b5b6e38e51aec0b38f33ff4690425ca28d88a2e876591521230150b4e20a4a82e50061cee9c0705100bfe5fdbd8ef27aec20387cf32455ef305bce2a91ae6da91fc41376b97149e9b41c901b24811df9272ff09718923b8d94e8e459a164a22b0eca47653f3efcbf08188c5da78cd9fb9eda1761094f9d8bc3d479e9f40c7d79ebaaba2a5c632329f20a9962040ff8f512b42c5f32a8460d87b8e93c6f980a1562c436eea1c8994fbf671dda3c4ccd3c142acfcdde2ab61227289ad408213ac8e22d9ef487f36925f5ba3b8e7e913d25c4a8592c861d13f03b615bc2760aabc61d68db80d35296a3312fdf4b56c0fbee5ab3fea1cf9caf3960a564046939e8002d2dd909db446d85aeae9dd42a33fe28684f722172e6"; @@ -217,6 +216,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22931.c b/src/modules/module_22931.c index e4a626688..8d21533e4 100644 --- a/src/modules/module_22931.c +++ b/src/modules/module_22931.c @@ -220,6 +220,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22941.c b/src/modules/module_22941.c index 52c1e79a8..4b4bf09ac 100644 --- a/src/modules/module_22941.c +++ b/src/modules/module_22941.c @@ -220,6 +220,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_22951.c b/src/modules/module_22951.c index d9ca9b200..d7c6645ce 100644 --- a/src/modules/module_22951.c +++ b/src/modules/module_22951.c @@ -220,6 +220,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23001.c b/src/modules/module_23001.c index db6fb556a..bbde4ee6e 100644 --- a/src/modules/module_23001.c +++ b/src/modules/module_23001.c @@ -246,6 +246,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23002.c b/src/modules/module_23002.c index 189a78a54..ac58ee5b6 100644 --- a/src/modules/module_23002.c +++ b/src/modules/module_23002.c @@ -246,6 +246,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23003.c b/src/modules/module_23003.c index c3a44d944..dc697a732 100644 --- a/src/modules/module_23003.c +++ b/src/modules/module_23003.c @@ -26,8 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_BE | OPTS_TYPE_PT_ADD80 - | OPTS_TYPE_PT_ADDBITS15 - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_ADDBITS15; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$zip3$*0*1*256*0*39bff47df6152a0214d7a967*65ff418ffb3b1198cccdef0327c03750f328d6dd5287e00e4c467f33b92a6ef40a74bb11b5afad61a6c3c9b279d8bd7961e96af7b470c36fc186fd3cfe059107021c9dea0cf206692f727eeca71f18f5b0b6ee1f702b648bba01aa21c7b7f3f0f7d547838aad46868155a04214f22feef7b31d7a15e1abe6dba5e569c62ee640783bb4a54054c2c69e93ece9f1a2af9d*0*0*0*file.txt"; @@ -247,6 +246,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23100.c b/src/modules/module_23100.c index 22b524e9f..7728d93d2 100644 --- a/src/modules/module_23100.c +++ b/src/modules/module_23100.c @@ -200,6 +200,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23200.c b/src/modules/module_23200.c index 5ec94c72d..3b7b21136 100644 --- a/src/modules/module_23200.c +++ b/src/modules/module_23200.c @@ -195,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23300.c b/src/modules/module_23300.c index decc32913..36e2bcd51 100644 --- a/src/modules/module_23300.c +++ b/src/modules/module_23300.c @@ -263,6 +263,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23400.c b/src/modules/module_23400.c index 7a0e5fb95..13743815f 100644 --- a/src/modules/module_23400.c +++ b/src/modules/module_23400.c @@ -269,6 +269,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23500.c b/src/modules/module_23500.c index fc5a5ee9c..f3eb316dd 100644 --- a/src/modules/module_23500.c +++ b/src/modules/module_23500.c @@ -68,23 +68,6 @@ typedef struct axcrypt2_tmp static const char *SIGNATURE_AXCRYPT2 = "$axcrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (axcrypt2_t); @@ -305,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -370,6 +355,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_23600.c b/src/modules/module_23600.c index 88e68b745..fdb3467d1 100644 --- a/src/modules/module_23600.c +++ b/src/modules/module_23600.c @@ -68,23 +68,6 @@ typedef struct axcrypt2_tmp static const char *SIGNATURE_AXCRYPT2 = "$axcrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "AMD Radeon", 10) == 0) - { - // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (axcrypt2_t); @@ -305,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -370,6 +355,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_23700.c b/src/modules/module_23700.c index 82e70f96f..22c9d9a0a 100644 --- a/src/modules/module_23700.c +++ b/src/modules/module_23700.c @@ -340,6 +340,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_23800.c b/src/modules/module_23800.c index f30a6d392..615548bc0 100644 --- a/src/modules/module_23800.c +++ b/src/modules/module_23800.c @@ -73,6 +73,8 @@ typedef struct rar3_hook u32 first_block_decrypted[4]; + u32 unpack_failed; + u32 crc32; } rar3_hook_t; @@ -201,21 +203,6 @@ static int check_huffman (const unsigned char *next) return 1; /* Passed this check! */ } -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK || device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - // Intel Iris - return true; - } - } - - return false; -} - bool module_hook_extra_param_init (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const folder_config_t *folder_config, MAYBE_UNUSED const backend_ctx_t *backend_ctx, void *hook_extra_param) { rar3_hook_extra_t *rar3_hook_extra = (rar3_hook_extra_t *) hook_extra_param; @@ -290,7 +277,7 @@ bool module_hook_extra_param_term (MAYBE_UNUSED const hashconfig_t *hashconfig, return true; } -unsigned int hc_decompress_rar (unsigned char *Win, unsigned char *Inp, unsigned char *VM, unsigned char *PPM, const unsigned int OutputSize, const unsigned char *Input, const unsigned int PackSize, const unsigned int UnpackSize, const unsigned char *Key, const unsigned char *IV); +unsigned int hc_decompress_rar (unsigned char *Win, unsigned char *Inp, unsigned char *VM, unsigned char *PPM, const unsigned int OutputSize, const unsigned char *Input, const unsigned int PackSize, const unsigned int UnpackSize, const unsigned char *Key, const unsigned char *IV, unsigned int *unpack_failed); void module_hook23 (hc_device_param_t *device_param, const void *hook_extra_param, const void *hook_salts_buf, const u32 salt_pos, const u64 pw_pos) { @@ -332,7 +319,9 @@ void module_hook23 (hc_device_param_t *device_param, const void *hook_extra_para const u8 *key = (u8 *) hook_item->key; const u8 *iv = (u8 *) hook_item->iv; - const u32 crc32 = hc_decompress_rar (rar3_hook_extra->win[device_param->device_id], rar3_hook_extra->inp[device_param->device_id], rar3_hook_extra->vm[device_param->device_id], rar3_hook_extra->ppm[device_param->device_id], unpack_size, data, pack_size, unpack_size, key, iv); + hook_item->unpack_failed = 1; + + const u32 crc32 = hc_decompress_rar (rar3_hook_extra->win[device_param->device_id], rar3_hook_extra->inp[device_param->device_id], rar3_hook_extra->vm[device_param->device_id], rar3_hook_extra->ppm[device_param->device_id], unpack_size, data, pack_size, unpack_size, key, iv, &hook_item->unpack_failed); hook_item->crc32 = crc32; } @@ -607,6 +596,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -672,6 +663,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_23900.c b/src/modules/module_23900.c index 7fe378938..fcee86004 100644 --- a/src/modules/module_23900.c +++ b/src/modules/module_23900.c @@ -204,6 +204,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24000.c b/src/modules/module_24000.c index a3a69e488..b13d398e0 100644 --- a/src/modules/module_24000.c +++ b/src/modules/module_24000.c @@ -9,6 +9,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -23,7 +24,8 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_SELF_TEST_DISABLE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_LOOP_PREPARE | OPTS_TYPE_ST_HEX; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -52,58 +54,11 @@ typedef struct bestcrypt_scrypt } bestcrypt_scrypt_t; -// limit scrypt accel otherwise we hurt ourself when calculating the scrypt tmto -// 16 is actually a bit low, we may need to change this depending on user response - static const char *SIGNATURE_BESTCRYPT_SCRYPT = "$bcve$"; -static const u32 SCRYPT_MAX_ACCEL = 256; -static const u32 SCRYPT_MAX_THREADS = 4; -static const u64 SCRYPT_N = 32768; -static const u64 SCRYPT_R = 16; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 16; -u32 module_kernel_accel_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_accel_min = 1; - - return kernel_accel_min; -} - -u32 module_kernel_accel_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_accel_max = (user_options->kernel_accel_chgd == true) ? user_options->kernel_accel : SCRYPT_MAX_ACCEL; - - return kernel_accel_max; -} - -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1; - - return kernel_loops_max; -} - -u32 module_kernel_threads_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_min = 1; - - return kernel_threads_min; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : SCRYPT_MAX_THREADS; - - return kernel_threads_max; -} +#include "scrypt_common.c" u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { @@ -112,227 +67,6 @@ u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED return esalt_size; } -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u32 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u32 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u32 tmto_start = 1; - u32 tmto_stop = 6; - - if (user_options->scrypt_tmto) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - -/* - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } -*/ - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit -/* - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); -*/ - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks; -// + size_pws_pre -// + size_pws_base; -/* - + EXTRA_SPACE; -*/ - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u32 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) - { - // Invalid extra buffer size. - if ((device_param->is_metal == false) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - return true; - } -/* - if ((device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - return true; - } -*/ - } - - // amdgpu-pro-18.50-708488-ubuntu-18.04: Segmentation fault - if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == false)) - { - return true; - } - - return false; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -385,9 +119,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // scrypt settings - const u32 scrypt_N = SCRYPT_N; - const u32 scrypt_r = SCRYPT_R; - const u32 scrypt_p = SCRYPT_P; + const u32 scrypt_N = 32768; + const u32 scrypt_r = 16; + const u32 scrypt_p = 1; salt->scrypt_N = scrypt_N; salt->scrypt_r = scrypt_r; @@ -408,9 +142,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE bestcrypt_scrypt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); bestcrypt_scrypt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); - salt->salt_iter = 1; - -// salt->salt_iter = salt->scrypt_N; + salt->salt_iter = salt->scrypt_N; salt->salt_repeats = salt->scrypt_p - 1; // ciphertext @@ -463,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -473,9 +207,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = module_esalt_size; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -501,14 +235,14 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; - module_ctx->module_kernel_accel_max = module_kernel_accel_max; - module_ctx->module_kernel_accel_min = module_kernel_accel_min; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; - module_ctx->module_kernel_threads_min = module_kernel_threads_min; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; module_ctx->module_opti_type = module_opti_type; @@ -519,7 +253,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -527,7 +261,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_tmp_size = scrypt_module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_24100.c b/src/modules/module_24100.c index a871090f0..c97b4b9ac 100644 --- a/src/modules/module_24100.c +++ b/src/modules/module_24100.c @@ -284,6 +284,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24200.c b/src/modules/module_24200.c index 4ab9c2a09..8b6a8e5c8 100644 --- a/src/modules/module_24200.c +++ b/src/modules/module_24200.c @@ -324,6 +324,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24300.c b/src/modules/module_24300.c index cad17a5b4..c4c90f502 100644 --- a/src/modules/module_24300.c +++ b/src/modules/module_24300.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24410.c b/src/modules/module_24410.c index 44e3202f9..945ee1041 100644 --- a/src/modules/module_24410.c +++ b/src/modules/module_24410.c @@ -311,6 +311,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24420.c b/src/modules/module_24420.c index 7bd0e1e05..39820834a 100644 --- a/src/modules/module_24420.c +++ b/src/modules/module_24420.c @@ -311,6 +311,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24500.c b/src/modules/module_24500.c index 4633993b1..3b4e6159b 100644 --- a/src/modules/module_24500.c +++ b/src/modules/module_24500.c @@ -23,8 +23,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE - | OPTS_TYPE_MP_MULTI_DISABLE; + | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$telegram$2*100000*77461dcb457ce9539f8e4235d33bd12455b4a38446e63b52ecdf2e7b65af4476*f705dda3247df6d690dfc7f44d8c666979737cae9505d961130071bcc18eeadaef0320ac6985e4a116834c0761e55314464aae56dadb8f80ab8886c16f72f8b95adca08b56a60c4303d84210f75cfd78a3e1a197c84a747988ce2e1b247397b61041823bdb33932714ba16ca7279e6c36b75d3f994479a469b50a7b2c7299a4d7aadb775fb030d3bb55ca77b7ce8ac2f5cf5eb7bdbcc10821b8953a4734b448060246e5bb93f130d6d3f2e28b9e04f2a064820be562274c040cd849f1473d45141559fc45da4c54abeaf5ca40d2d57f8f8e33bdb232c7279872f758b3fb452713b5d91c855383f7cec8376649a53b83951cf8edd519a99e91b8a6cb90153088e35d9fed332c7253771740f49f9dc40c7da50352656395bbfeae63e10f754d24a"; @@ -261,6 +260,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24600.c b/src/modules/module_24600.c index 838d61245..b6f14509a 100644 --- a/src/modules/module_24600.c +++ b/src/modules/module_24600.c @@ -287,6 +287,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24700.c b/src/modules/module_24700.c index 24b41cf61..2b8cfed86 100644 --- a/src/modules/module_24700.c +++ b/src/modules/module_24700.c @@ -123,6 +123,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24800.c b/src/modules/module_24800.c index fff6a347b..18db19378 100644 --- a/src/modules/module_24800.c +++ b/src/modules/module_24800.c @@ -122,6 +122,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_24900.c b/src/modules/module_24900.c index d3e419861..4b288cc41 100644 --- a/src/modules/module_24900.c +++ b/src/modules/module_24900.c @@ -163,6 +163,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25000.c b/src/modules/module_25000.c index 99a365060..ebafcb331 100644 --- a/src/modules/module_25000.c +++ b/src/modules/module_25000.c @@ -23,6 +23,7 @@ static const char *HASH_NAME = "SNMPv3 HMAC-MD5-96/HMAC-SHA1-96"; static const u64 KERN_TYPE = 25000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -294,6 +295,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25100.c b/src/modules/module_25100.c index 20a29ec71..29e2592e9 100644 --- a/src/modules/module_25100.c +++ b/src/modules/module_25100.c @@ -23,6 +23,7 @@ static const char *HASH_NAME = "SNMPv3 HMAC-MD5-96"; static const u64 KERN_TYPE = 25100; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -275,6 +276,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25200.c b/src/modules/module_25200.c index e81eed67e..27740b6bf 100644 --- a/src/modules/module_25200.c +++ b/src/modules/module_25200.c @@ -23,6 +23,7 @@ static const char *HASH_NAME = "SNMPv3 HMAC-SHA1-96"; static const u64 KERN_TYPE = 25200; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -286,6 +287,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25300.c b/src/modules/module_25300.c index b74903769..ab51bb57d 100644 --- a/src/modules/module_25300.c +++ b/src/modules/module_25300.c @@ -267,6 +267,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25400.c b/src/modules/module_25400.c index fe084ae18..c7c3a0bd3 100644 --- a/src/modules/module_25400.c +++ b/src/modules/module_25400.c @@ -82,6 +82,20 @@ typedef struct pdf14_tmp static const char *SIGNATURE_PDF = "$pdf$"; +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = 70; + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 70; + + return kernel_loops_max; +} + static void md5_complete_no_limit (u32 digest[4], const u32 *plain, const u32 plain_len) { // plain = u32 tmp_md5_buf[64] so this is compatible @@ -671,6 +685,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -713,8 +729,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = MODULE_DEFAULT; - module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = module_kernel_loops_max; + module_ctx->module_kernel_loops_min = module_kernel_loops_min; module_ctx->module_kernel_threads_max = MODULE_DEFAULT; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; diff --git a/src/modules/module_25500.c b/src/modules/module_25500.c index 9e2305f84..afc451fb9 100644 --- a/src/modules/module_25500.c +++ b/src/modules/module_25500.c @@ -304,6 +304,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25600.c b/src/modules/module_25600.c index dc6ec869c..dffc6068c 100644 --- a/src/modules/module_25600.c +++ b/src/modules/module_25600.c @@ -288,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25700.c b/src/modules/module_25700.c index 30b0df8d5..a00013a64 100644 --- a/src/modules/module_25700.c +++ b/src/modules/module_25700.c @@ -125,6 +125,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25800.c b/src/modules/module_25800.c index 89c4251b6..fcdb994eb 100644 --- a/src/modules/module_25800.c +++ b/src/modules/module_25800.c @@ -288,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_25900.c b/src/modules/module_25900.c index 898fc5b52..7ad951f6d 100644 --- a/src/modules/module_25900.c +++ b/src/modules/module_25900.c @@ -264,6 +264,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26000.c b/src/modules/module_26000.c index 2d7ea5f7b..35a6dd937 100644 --- a/src/modules/module_26000.c +++ b/src/modules/module_26000.c @@ -22,8 +22,7 @@ static const u64 KERN_TYPE = 26000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_NOT_ITERATED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_BE - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_PT_GENERATE_BE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$mozilla$*3DES*b735d19e6cadb5136376a98c2369f22819d08c79*2b36961682200a877f7d5550975b614acc9fefe3*f03f3575fd5bdbc9e32232316eab7623"; @@ -196,6 +195,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26100.c b/src/modules/module_26100.c index 91a170b44..c42958289 100644 --- a/src/modules/module_26100.c +++ b/src/modules/module_26100.c @@ -250,6 +250,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26200.c b/src/modules/module_26200.c index 88e9b22bd..90f5f49ea 100644 --- a/src/modules/module_26200.c +++ b/src/modules/module_26200.c @@ -163,6 +163,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26300.c b/src/modules/module_26300.c index 0a219af8a..994af2523 100644 --- a/src/modules/module_26300.c +++ b/src/modules/module_26300.c @@ -200,6 +200,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26401.c b/src/modules/module_26401.c index 108fb1697..7add8f50f 100644 --- a/src/modules/module_26401.c +++ b/src/modules/module_26401.c @@ -132,6 +132,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26402.c b/src/modules/module_26402.c index f720ea3e7..c854479f7 100644 --- a/src/modules/module_26402.c +++ b/src/modules/module_26402.c @@ -132,6 +132,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26403.c b/src/modules/module_26403.c index 7248f4a74..d36f4ec41 100644 --- a/src/modules/module_26403.c +++ b/src/modules/module_26403.c @@ -132,6 +132,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26500.c b/src/modules/module_26500.c index 7e766f036..ea7df82aa 100644 --- a/src/modules/module_26500.c +++ b/src/modules/module_26500.c @@ -249,6 +249,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26600.c b/src/modules/module_26600.c index 4f6d0de3b..926555e94 100644 --- a/src/modules/module_26600.c +++ b/src/modules/module_26600.c @@ -333,6 +333,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26610.c b/src/modules/module_26610.c index 532246128..ef6f58d3a 100644 --- a/src/modules/module_26610.c +++ b/src/modules/module_26610.c @@ -313,6 +313,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26700.c b/src/modules/module_26700.c index 46958bb94..63854c0d2 100644 --- a/src/modules/module_26700.c +++ b/src/modules/module_26700.c @@ -23,6 +23,7 @@ static const char *HASH_NAME = "SNMPv3 HMAC-SHA224-128"; static const u64 KERN_TYPE = 26700; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -290,6 +291,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26800.c b/src/modules/module_26800.c index 65756f1ff..024bfa636 100644 --- a/src/modules/module_26800.c +++ b/src/modules/module_26800.c @@ -23,6 +23,7 @@ static const char *HASH_NAME = "SNMPv3 HMAC-SHA256-192"; static const u64 KERN_TYPE = 26800; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -298,6 +299,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_26900.c b/src/modules/module_26900.c index 62159fb51..8d916ebf2 100644 --- a/src/modules/module_26900.c +++ b/src/modules/module_26900.c @@ -24,6 +24,7 @@ static const u64 KERN_TYPE = 26900; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -341,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27000.c b/src/modules/module_27000.c index bf5a190bb..672800eed 100644 --- a/src/modules/module_27000.c +++ b/src/modules/module_27000.c @@ -28,7 +28,6 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_HEX - | OPTS_TYPE_MAXIMUM_THREADS | OPTS_TYPE_AUTODETECT_DISABLE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "b4b9b02e6f09a9bd760f388b67351e2b"; @@ -445,6 +444,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27100.c b/src/modules/module_27100.c index b11a961d1..1c981fbc1 100644 --- a/src/modules/module_27100.c +++ b/src/modules/module_27100.c @@ -28,7 +28,6 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_ADDBITS14 | OPTS_TYPE_PT_UTF16LE | OPTS_TYPE_ST_HEX - | OPTS_TYPE_MAXIMUM_THREADS | OPTS_TYPE_AUTODETECT_DISABLE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "b4b9b02e6f09a9bd760f388b67351e2b"; @@ -343,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27200.c b/src/modules/module_27200.c index ffa2c6c8b..8be60f93a 100644 --- a/src/modules/module_27200.c +++ b/src/modules/module_27200.c @@ -190,6 +190,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27300.c b/src/modules/module_27300.c index 1992ecf6d..ff20acc9d 100644 --- a/src/modules/module_27300.c +++ b/src/modules/module_27300.c @@ -24,6 +24,7 @@ static const u64 KERN_TYPE = 27300; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; @@ -337,6 +338,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27400.c b/src/modules/module_27400.c index f0368c6b5..7d9f0fbd4 100644 --- a/src/modules/module_27400.c +++ b/src/modules/module_27400.c @@ -239,6 +239,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27500.c b/src/modules/module_27500.c index 24ea388fd..ebabe24e5 100644 --- a/src/modules/module_27500.c +++ b/src/modules/module_27500.c @@ -364,6 +364,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27600.c b/src/modules/module_27600.c index 4f2feccd7..b4cdade54 100644 --- a/src/modules/module_27600.c +++ b/src/modules/module_27600.c @@ -380,6 +380,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27700.c b/src/modules/module_27700.c index 10ecefe70..837418626 100644 --- a/src/modules/module_27700.c +++ b/src/modules/module_27700.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -25,8 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$multibit$3*16384*8*1*7523cb5482e81b81*91780fd49b81a782ab840157a69ba7996d81270eaf456c850f314fc1787d9b0b"; @@ -48,222 +48,9 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_MULTIBIT = "$multibit$"; -static const u64 SCRYPT_N = 16384; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 32; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} - -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} +#include "scrypt_common.c" int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { @@ -415,6 +202,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -425,9 +214,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = MODULE_DEFAULT; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -453,13 +242,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -471,7 +260,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -479,7 +268,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_27800.c b/src/modules/module_27800.c index f5bf82a46..b78bebd3e 100644 --- a/src/modules/module_27800.c +++ b/src/modules/module_27800.c @@ -125,6 +125,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_27900.c b/src/modules/module_27900.c index ea06e0f2c..c610e73f2 100644 --- a/src/modules/module_27900.c +++ b/src/modules/module_27900.c @@ -115,6 +115,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28000.c b/src/modules/module_28000.c index 90cf643ce..dade598c1 100644 --- a/src/modules/module_28000.c +++ b/src/modules/module_28000.c @@ -136,6 +136,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28100.c b/src/modules/module_28100.c index f959f051b..502aef425 100644 --- a/src/modules/module_28100.c +++ b/src/modules/module_28100.c @@ -403,6 +403,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28200.c b/src/modules/module_28200.c index dd3ce7998..a8540a1c9 100644 --- a/src/modules/module_28200.c +++ b/src/modules/module_28200.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -25,8 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "EXODUS:16384:8:1:IYkXZgFETRmFp4wQXyP8XMe3LtuOw8wMdLcBVQ+9YWE=:lq0W9ekN5sC0O7Xw:UD4a6mUUhkTbQtGWitXHZUg0pQ4RHI6W/KUyYE95m3k=:ZuNQckXOtr4r21x+DT1zpQ=="; @@ -56,30 +56,9 @@ typedef struct exodus static const char *SIGNATURE_EXODUS = "EXODUS"; -static const u64 SCRYPT_N = 16384; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 1; +static const u32 SCRYPT_THREADS = 32; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} +#include "scrypt_common.c" u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { @@ -95,188 +74,6 @@ u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED return esalt_size; } -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -366,7 +163,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memcpy (salt->salt_buf, tmp_buf, tmp_len); - for (int i = 0; i < 8; i++) salt->salt_buf[i] = byte_swap_32 (salt->salt_buf[i]); + //for (int i = 0; i < 8; i++) salt->salt_buf[i] = byte_swap_32 (salt->salt_buf[i]); + for (int i = 0; i < 8; i++) salt->salt_buf[i] = salt->salt_buf[i]; salt->salt_len = tmp_len; @@ -429,7 +227,8 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 tmp_salt[8] = { 0 }; - for (int i = 0; i < 8; i++) tmp_salt[i] = byte_swap_32 (salt->salt_buf[i]); + //for (int i = 0; i < 8; i++) tmp_salt[i] = byte_swap_32 (salt->salt_buf[i]); + for (int i = 0; i < 8; i++) tmp_salt[i] = salt->salt_buf[i]; char base64_salt[64]; @@ -499,6 +298,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -509,9 +310,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = module_esalt_size; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -537,13 +338,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -563,7 +364,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_28300.c b/src/modules/module_28300.c index b820dd9cb..be8ca0de5 100644 --- a/src/modules/module_28300.c +++ b/src/modules/module_28300.c @@ -178,6 +178,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28400.c b/src/modules/module_28400.c index fdb164cee..404ccf054 100644 --- a/src/modules/module_28400.c +++ b/src/modules/module_28400.c @@ -288,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28501.c b/src/modules/module_28501.c index 123fa932e..764ac9b97 100644 --- a/src/modules/module_28501.c +++ b/src/modules/module_28501.c @@ -162,6 +162,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28502.c b/src/modules/module_28502.c index 2c7b2d79b..793b99634 100644 --- a/src/modules/module_28502.c +++ b/src/modules/module_28502.c @@ -162,6 +162,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28503.c b/src/modules/module_28503.c index 721942880..78618673b 100644 --- a/src/modules/module_28503.c +++ b/src/modules/module_28503.c @@ -344,6 +344,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28504.c b/src/modules/module_28504.c index 90d94fc2b..805beb3cf 100644 --- a/src/modules/module_28504.c +++ b/src/modules/module_28504.c @@ -344,6 +344,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28505.c b/src/modules/module_28505.c index e043d2f14..cee0ac61d 100644 --- a/src/modules/module_28505.c +++ b/src/modules/module_28505.c @@ -161,6 +161,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28506.c b/src/modules/module_28506.c index 7d0312d91..15dcdf554 100644 --- a/src/modules/module_28506.c +++ b/src/modules/module_28506.c @@ -161,6 +161,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = module_benchmark_charset; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28600.c b/src/modules/module_28600.c index b77869507..3a77867b9 100644 --- a/src/modules/module_28600.c +++ b/src/modules/module_28600.c @@ -338,6 +338,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28700.c b/src/modules/module_28700.c index 4bf938a0f..4c88af250 100644 --- a/src/modules/module_28700.c +++ b/src/modules/module_28700.c @@ -363,6 +363,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_28800.c b/src/modules/module_28800.c index 88cf7c413..519299654 100644 --- a/src/modules/module_28800.c +++ b/src/modules/module_28800.c @@ -63,23 +63,6 @@ typedef struct krb5db_17_tmp static const char *SIGNATURE_KRB5DB = "$krb5db$17$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (krb5db_17_tmp_t); @@ -268,6 +251,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -333,6 +318,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_28900.c b/src/modules/module_28900.c index d2fbfe722..6f20f3c59 100644 --- a/src/modules/module_28900.c +++ b/src/modules/module_28900.c @@ -63,23 +63,6 @@ typedef struct krb5db_18_tmp static const char *SIGNATURE_KRB5DB = "$krb5db$18$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (krb5db_18_tmp_t); @@ -277,6 +260,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -342,6 +327,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29000.c b/src/modules/module_29000.c index 3cfab3d33..32dae72c1 100644 --- a/src/modules/module_29000.c +++ b/src/modules/module_29000.c @@ -234,6 +234,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29100.c b/src/modules/module_29100.c index 437cfcb89..81d09de47 100644 --- a/src/modules/module_29100.c +++ b/src/modules/module_29100.c @@ -151,6 +151,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = module_benchmark_salt; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29200.c b/src/modules/module_29200.c index df3fd21c4..bd47d8534 100644 --- a/src/modules/module_29200.c +++ b/src/modules/module_29200.c @@ -276,6 +276,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29311.c b/src/modules/module_29311.c index 8c97d7ea2..cade1b3da 100644 --- a/src/modules/module_29311.c +++ b/src/modules/module_29311.c @@ -79,23 +79,6 @@ static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (tc_t); @@ -266,6 +249,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -331,6 +316,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29312.c b/src/modules/module_29312.c index a002c4d69..f284ffe7b 100644 --- a/src/modules/module_29312.c +++ b/src/modules/module_29312.c @@ -79,23 +79,6 @@ static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (tc_t); @@ -266,6 +249,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -331,6 +316,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29313.c b/src/modules/module_29313.c index b5f877a7a..78e2067de 100644 --- a/src/modules/module_29313.c +++ b/src/modules/module_29313.c @@ -79,23 +79,6 @@ static const int ROUNDS_TRUECRYPT_2K = 2000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (tc_t); @@ -266,6 +249,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -331,6 +316,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29321.c b/src/modules/module_29321.c index ac5e1bf4f..526657c5e 100644 --- a/src/modules/module_29321.c +++ b/src/modules/module_29321.c @@ -264,6 +264,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29322.c b/src/modules/module_29322.c index 4322666c9..345c76f74 100644 --- a/src/modules/module_29322.c +++ b/src/modules/module_29322.c @@ -264,6 +264,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29323.c b/src/modules/module_29323.c index 63c016358..88f851e7b 100644 --- a/src/modules/module_29323.c +++ b/src/modules/module_29323.c @@ -264,6 +264,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29331.c b/src/modules/module_29331.c index 4c22415a7..1a10c3c8b 100644 --- a/src/modules/module_29331.c +++ b/src/modules/module_29331.c @@ -266,6 +266,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29332.c b/src/modules/module_29332.c index 4989b574a..d49724d1a 100644 --- a/src/modules/module_29332.c +++ b/src/modules/module_29332.c @@ -266,6 +266,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29333.c b/src/modules/module_29333.c index 32f9f3ee5..09f413932 100644 --- a/src/modules/module_29333.c +++ b/src/modules/module_29333.c @@ -266,6 +266,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29341.c b/src/modules/module_29341.c index 05a40bcda..8acaf3586 100644 --- a/src/modules/module_29341.c +++ b/src/modules/module_29341.c @@ -80,23 +80,6 @@ static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -279,6 +262,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -344,6 +329,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29342.c b/src/modules/module_29342.c index 799940f12..0dea3ce65 100644 --- a/src/modules/module_29342.c +++ b/src/modules/module_29342.c @@ -80,23 +80,6 @@ static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -279,6 +262,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -344,6 +329,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29343.c b/src/modules/module_29343.c index 6782c08ba..5257bfc57 100644 --- a/src/modules/module_29343.c +++ b/src/modules/module_29343.c @@ -80,23 +80,6 @@ static const int ROUNDS_TRUECRYPT_1K = 1000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_TRUECRYPT = "$truecrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const tc_t *tc = (const tc_t *) hashes->esalts_buf; @@ -279,6 +262,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -344,6 +329,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29411.c b/src/modules/module_29411.c index d5fe9d5c0..a3e7160eb 100644 --- a/src/modules/module_29411.c +++ b/src/modules/module_29411.c @@ -86,23 +86,6 @@ static const int ROUNDS_VERACRYPT_655331 = 655331; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -328,6 +311,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -393,6 +378,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29412.c b/src/modules/module_29412.c index 76ddb550a..969e6d355 100644 --- a/src/modules/module_29412.c +++ b/src/modules/module_29412.c @@ -86,23 +86,6 @@ static const int ROUNDS_VERACRYPT_655331 = 655331; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -328,6 +311,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -393,6 +378,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29413.c b/src/modules/module_29413.c index 296e56911..6e67ec4df 100644 --- a/src/modules/module_29413.c +++ b/src/modules/module_29413.c @@ -86,31 +86,6 @@ static const int ROUNDS_VERACRYPT_655331 = 655331; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13713_loop_extended' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_tmp_t *vc_tmp = (const vc_tmp_t *) tmps; @@ -336,6 +311,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -401,6 +378,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29421.c b/src/modules/module_29421.c index aa1dc80b9..4c0e94163 100644 --- a/src/modules/module_29421.c +++ b/src/modules/module_29421.c @@ -327,6 +327,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29422.c b/src/modules/module_29422.c index 1bbf4c2a5..d32d1471e 100644 --- a/src/modules/module_29422.c +++ b/src/modules/module_29422.c @@ -338,6 +338,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29423.c b/src/modules/module_29423.c index abd264fbf..988bc8a42 100644 --- a/src/modules/module_29423.c +++ b/src/modules/module_29423.c @@ -338,6 +338,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29431.c b/src/modules/module_29431.c index 9a188bf3b..a22c24e3d 100644 --- a/src/modules/module_29431.c +++ b/src/modules/module_29431.c @@ -28,8 +28,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$veracrypt$48f79476aa0aa8327a8a9056e61450f4e2883c9e9669142f2e2f022c2f85303b897d088dea03d64329f6c402a56fed05b3919715929090a25c8ae84c67dbdb36$4ebfa3e9ccc0b391c130a4c3dd6495a1d6eb5d2eab72f8009096f7475ecb736bb3225b6da144e1596d859dad159fae5a739beea88ea074771e9d0b2d7c48ae302606a60d7cff6db54f3e460c548c06a4f47dc1ac203a8c8349fbff6a652219a63f27bc76327543e22be4f8dab8e4f90a4283fbf1552119fe24114ce8869eb20ce87dd72300f7aad3f7b4a26a355f16517725449151cf0373dbd0b281f6ac753485a14a5361cc75d40928e241a6b4684658801774843238048cf8c7f2fd88950abac040e12b0c41fdcaca3702907e951ec11c061a91b3050a4855abe6f3b50b4bd0b17c4be1f5b50b873eadc2d8446cd72c4fcac576bbce3acea769f740c5322ee8c927ffd4dd11c8a9e66f06e58df2e5d4d85c13b44c412bab839c9512b7a0acdd97b37dcccc4b70854eda0f36de12d62dd10cc13bc6154103d083bf6540bc78e5d0aad5d063cc74dad4cbe6e060febda2a9fd79c238f99dcb0766ff4addcfd0c03e619c765f65b1c75d5d22c6536958bcda78077ff44b64c4da741bf50154df310d4e0724238a777b524237b9478277e400ad8146dc3ca1da83e3d2f1c5115a4b7fcdc71dd7d56ba86a2f9b721c9a4137aabb07c3c5fedcf5342c4fae4898c9"; @@ -329,6 +328,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29432.c b/src/modules/module_29432.c index e38243438..563b254c0 100644 --- a/src/modules/module_29432.c +++ b/src/modules/module_29432.c @@ -28,8 +28,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$veracrypt$1b721942019ebe8cedddbed7744a0702c0e053281a467e0ed69bf875c7406407d72eb8f2aea21270e41898c0a2c14382f86e04c15e7bc019d1d9dd813eabee0a$e5173e3cb1d927859d3e6de1006335a5184ae12b4c8dc2db2b1cd785063152a776f4dc5cacc1856a919b880d704b7450f5a0e0c9521bc9b4d67213c36a50e6664a1cbcea33f997b858e654111c7e9fca74f361528e85a28880381ec2600e3c1cd508c3833dd21cc91978185cba53caefd7b3c82d219d49f0b41e536d32e8d3ce194ad7923ca742213e19dcebdbd9687979d5a594654a5c611e8b829c4019e90a3cfb14e5fd7f8ed91e0fc79eed182399f02a3e3e202d4becaa6730e1f05f99ce06ce16dba7777ccddac72e85f2d3be5ecc9c808ac273f10ceb71cad666166abc327c4061a5f47424a5b6d9d093782f34b49924342a2e8cea663446ed4232a9a415ee2dfde988fa827b06d7438fec20ad0689543c3ee4602ce3ec3806fc7d668ef7e34330edd1e077b329a7627fa3ae5c89308258a17ecefbee114c80c2ab06f8271f14de8f2d13d1d6e5a119b71a6bae88ab151f76cdb2442284bc481d0df7e2163c3acfe763d3968195450d275af9034a00184a30cefed163e636626bffe6a35df3472508a49cb2b9b4c4a95d11c5d17e4e0539e9f13112125515778bcd1c2813c62a02673663062ad60583ec6a02c8a572865829e5b8c767b285728bea4907"; @@ -329,6 +328,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29433.c b/src/modules/module_29433.c index 2ba87772a..90e2033c9 100644 --- a/src/modules/module_29433.c +++ b/src/modules/module_29433.c @@ -28,8 +28,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE - | OPTS_TYPE_COPY_TMPS - | OPTS_TYPE_MAXIMUM_THREADS; + | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$veracrypt$5eb128daef63eff7e6db6aa10a8858f89964f47844acca68df82ebb2e73866fa75e3b7a53f9d2ff1ecdd1f4dc90e9c0fdf51f60d11b1992cd2971b4889edfc89$20bbf346fd7693f675b617cb9e4e9a43e6f445021068fc13453b130f2eb1d753ee83ecc61dabec293e88b62110cf6a8fab670e171f6aba2226550b54893263f5fa086b3cc41dd3db2eae07b585e5162c7a0d9723a426d408d83266c4d6018dc1b8b456d28a224033a30bfe62b1e58c2ddf596e07f7ff31849a6f5cfcc1c977b82d8484c270d44ededb0afdb781295e92968fc8cc69766af0ce1e72f02d6b4e124ba4b1af71519dcaade857bb3f371f93a350da6e65ee46c2ac782f134c75c10fe9d653fccc08c614dc362871911af8b83bdfc479f770dfe4b3c86b5d895842c53852fe4912738f848bf7c3e10b8189d25faceab9ef30b6fa0284edaa471752ac2b65335179b8d605417709f64fded7d94383618a921660d4cdb190bbb3769a8e56d2cd1ee07078ebc3b68ebeb016893f7099018e40cb326e32b29a62806eaf1a3fd382f4f876bf721eadfc019c5545813e81fd7168995f743663b136762b07910a63b6eec5b728a4ad07a689cceecb14c2802f334401a0a4fd2ec49e2da7f3cb24d6181f01ceed93ee73dedc3378133c83c9a71155c86785ff20dd5a64323d2fd4bf076bab3c17a1bb45edf81c30a7bd7dbbb097ece0dca83fff9138d56ae668"; @@ -329,6 +328,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29441.c b/src/modules/module_29441.c index baab0733c..6bce07025 100644 --- a/src/modules/module_29441.c +++ b/src/modules/module_29441.c @@ -87,23 +87,6 @@ static const int ROUNDS_VERACRYPT_327661 = 327661; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_t *vc = (const vc_t *) hashes->esalts_buf; @@ -330,6 +313,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -395,6 +380,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29442.c b/src/modules/module_29442.c index 5639eb484..d6616a7c3 100644 --- a/src/modules/module_29442.c +++ b/src/modules/module_29442.c @@ -87,23 +87,6 @@ static const int ROUNDS_VERACRYPT_327661 = 327661; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == false) - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_t *vc = (const vc_t *) hashes->esalts_buf; @@ -330,6 +313,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -395,6 +380,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29443.c b/src/modules/module_29443.c index ff435c5a4..fdfcf7324 100644 --- a/src/modules/module_29443.c +++ b/src/modules/module_29443.c @@ -87,31 +87,6 @@ static const int ROUNDS_VERACRYPT_327661 = 327661; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13713_loop_extended' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { const vc_t *vc = (const vc_t *) hashes->esalts_buf; @@ -338,6 +313,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -403,6 +380,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29451.c b/src/modules/module_29451.c index 821a616b1..d0e527df2 100644 --- a/src/modules/module_29451.c +++ b/src/modules/module_29451.c @@ -86,31 +86,6 @@ static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13751_loop' pipeline, Compilation failed - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -355,6 +330,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -420,6 +397,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29452.c b/src/modules/module_29452.c index a03f6e5a7..1bdf93209 100644 --- a/src/modules/module_29452.c +++ b/src/modules/module_29452.c @@ -86,31 +86,6 @@ static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13752_loop' pipeline, Compilation failed - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -355,6 +330,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -420,6 +397,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29453.c b/src/modules/module_29453.c index 4433fca7b..f73485a17 100644 --- a/src/modules/module_29453.c +++ b/src/modules/module_29453.c @@ -86,31 +86,6 @@ static const int ROUNDS_VERACRYPT_500000 = 500000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13753_loop_extended' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -355,6 +330,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -420,6 +397,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29461.c b/src/modules/module_29461.c index 71c52fae0..136d77532 100644 --- a/src/modules/module_29461.c +++ b/src/modules/module_29461.c @@ -87,31 +87,6 @@ static const int ROUNDS_VERACRYPT_200000 = 200000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13751_comp' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -357,6 +332,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -422,6 +399,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29462.c b/src/modules/module_29462.c index f04ca6a51..c2bb7dfeb 100644 --- a/src/modules/module_29462.c +++ b/src/modules/module_29462.c @@ -87,31 +87,6 @@ static const int ROUNDS_VERACRYPT_200000 = 200000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13752_loop' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -357,6 +332,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -422,6 +399,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29463.c b/src/modules/module_29463.c index 0f6fc068b..3c22d35c4 100644 --- a/src/modules/module_29463.c +++ b/src/modules/module_29463.c @@ -87,31 +87,6 @@ static const int ROUNDS_VERACRYPT_200000 = 200000; static const float MIN_SUFFICIENT_ENTROPY_FILE = 7.0f; static const char *SIGNATURE_VERACRYPT = "$veracrypt$"; -bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) - { - if (device_param->is_metal == true) - { - if (strncmp (device_param->device_name, "Intel", 5) == 0) - { - // Intel Iris Graphics, Metal Version 244.303: failed to create 'm13753_loop_extended' pipeline, timeout reached - return true; - } - } - else - { - if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD) - { - // AMD Radeon Pro W5700X Compute Engine; 1.2 (Apr 22 2021 21:54:44); 11.3.1; 20E241 - return true; - } - } - } - - return false; -} - char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) { char *jit_build_options = NULL; @@ -357,6 +332,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -422,6 +399,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = module_unstable_warning; + module_ctx->module_unstable_warning = MODULE_DEFAULT; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29471.c b/src/modules/module_29471.c index 586e16d74..18d50d294 100644 --- a/src/modules/module_29471.c +++ b/src/modules/module_29471.c @@ -340,6 +340,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29472.c b/src/modules/module_29472.c index a93b325c9..a4c0c275e 100644 --- a/src/modules/module_29472.c +++ b/src/modules/module_29472.c @@ -340,6 +340,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29473.c b/src/modules/module_29473.c index 4f122e7a4..744c1ac6d 100644 --- a/src/modules/module_29473.c +++ b/src/modules/module_29473.c @@ -340,6 +340,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29481.c b/src/modules/module_29481.c index a5068f4a2..3561d5de7 100644 --- a/src/modules/module_29481.c +++ b/src/modules/module_29481.c @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29482.c b/src/modules/module_29482.c index 725e28eef..c7244ab7a 100644 --- a/src/modules/module_29482.c +++ b/src/modules/module_29482.c @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29483.c b/src/modules/module_29483.c index 7db7b3cf9..4063a038f 100644 --- a/src/modules/module_29483.c +++ b/src/modules/module_29483.c @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = module_build_plain_postprocess; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29511.c b/src/modules/module_29511.c index 0f1d38566..2a3f9daf2 100644 --- a/src/modules/module_29511.c +++ b/src/modules/module_29511.c @@ -380,6 +380,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29512.c b/src/modules/module_29512.c index bdda11cac..e4edc5462 100644 --- a/src/modules/module_29512.c +++ b/src/modules/module_29512.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29513.c b/src/modules/module_29513.c index 603dfad8a..1bfe295bf 100644 --- a/src/modules/module_29513.c +++ b/src/modules/module_29513.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29521.c b/src/modules/module_29521.c index bc0e4fb2e..8eba5a72d 100644 --- a/src/modules/module_29521.c +++ b/src/modules/module_29521.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29522.c b/src/modules/module_29522.c index f305db77d..6b1c89088 100644 --- a/src/modules/module_29522.c +++ b/src/modules/module_29522.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29523.c b/src/modules/module_29523.c index 8569428d7..5c551e40c 100644 --- a/src/modules/module_29523.c +++ b/src/modules/module_29523.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29531.c b/src/modules/module_29531.c index 261de25e1..0c8f948c3 100644 --- a/src/modules/module_29531.c +++ b/src/modules/module_29531.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29532.c b/src/modules/module_29532.c index 557dfd82b..0f2af18cd 100644 --- a/src/modules/module_29532.c +++ b/src/modules/module_29532.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29533.c b/src/modules/module_29533.c index da84db774..bbbaaac2f 100644 --- a/src/modules/module_29533.c +++ b/src/modules/module_29533.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29541.c b/src/modules/module_29541.c index 1006486b4..ec81998f6 100644 --- a/src/modules/module_29541.c +++ b/src/modules/module_29541.c @@ -380,6 +380,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29542.c b/src/modules/module_29542.c index 57c4ae421..4d68a99fe 100644 --- a/src/modules/module_29542.c +++ b/src/modules/module_29542.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29543.c b/src/modules/module_29543.c index 1a29da536..f0789ccdd 100644 --- a/src/modules/module_29543.c +++ b/src/modules/module_29543.c @@ -397,6 +397,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29600.c b/src/modules/module_29600.c index 0dbdd3aa8..1242f5672 100644 --- a/src/modules/module_29600.c +++ b/src/modules/module_29600.c @@ -275,6 +275,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29700.c b/src/modules/module_29700.c index 4a2ca92ac..e0f9eab97 100644 --- a/src/modules/module_29700.c +++ b/src/modules/module_29700.c @@ -647,6 +647,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29800.c b/src/modules/module_29800.c index 364076c45..5e3517e20 100644 --- a/src/modules/module_29800.c +++ b/src/modules/module_29800.c @@ -10,6 +10,7 @@ #include "bitops.h" #include "convert.h" #include "shared.h" +#include "memory.h" static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; static const u32 DGST_POS0 = 0; @@ -19,14 +20,13 @@ static const u32 DGST_POS3 = 3; static const u32 DGST_SIZE = DGST_SIZE_4_4; static const u32 HASH_CATEGORY = HASH_CATEGORY_CRYPTOCURRENCY_WALLET; static const char *HASH_NAME = "Bisq .wallet (scrypt)"; -static const u64 KERN_TYPE = 29800; +static const u64 KERN_TYPE = 27700; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_MP_MULTI_DISABLE | OPTS_TYPE_NATIVE_THREADS - | OPTS_TYPE_LOOP_PREPARE - | OPTS_TYPE_SELF_TEST_DISABLE; + | OPTS_TYPE_LOOP_PREPARE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; static const char *ST_HASH = "$bisq$3*32768*8*6*31d838af87f99cb8*5cfb7bf3228d9e865881156e17b1866589ffa6b757011e25d1319083595236d2"; @@ -48,30 +48,9 @@ const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, static const char *SIGNATURE_BISQ = "$bisq$"; -static const u64 SCRYPT_N = 32768; -static const u64 SCRYPT_R = 8; -static const u64 SCRYPT_P = 6; +static const u32 SCRYPT_THREADS = 16; -u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_min = 1024; - - return kernel_loops_min; -} - -u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_loops_max = 1024; - - return kernel_loops_max; -} - -u32 module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u32 kernel_threads_max = 32; - - return kernel_threads_max; -} +#include "scrypt_common.c" u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { @@ -80,198 +59,6 @@ u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con return pw_min; } -u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - // this overrides the reductions of PW_MAX in case optimized kernel is selected - // IOW, even in optimized kernel mode it support length 256 - - const u32 pw_max = PW_MAX; - - return pw_max; -} - -u64 module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - // we need to set the self-test hash settings to pass the self-test - // the decoder for the self-test is called after this function - - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - u64 tmto_start = 0; - u64 tmto_stop = 4; - - if (user_options->scrypt_tmto_chgd == true) - { - tmto_start = user_options->scrypt_tmto; - tmto_stop = user_options->scrypt_tmto; - } - - // size_pws - - const u64 size_pws = kernel_power_max * sizeof (pw_t); - - const u64 size_pws_amp = size_pws; - - // size_pws_comp - - const u64 size_pws_comp = kernel_power_max * (sizeof (u32) * 64); - - // size_pws_idx - - const u64 size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); - - // size_tmps - - const u64 size_tmps = kernel_power_max * hashconfig->tmp_size; - - // size_hooks - - const u64 size_hooks = kernel_power_max * hashconfig->hook_size; - - u64 size_pws_pre = 4; - u64 size_pws_base = 4; - - if (user_options->slow_candidates == true) - { - // size_pws_pre - - size_pws_pre = kernel_power_max * sizeof (pw_pre_t); - - // size_pws_base - - size_pws_base = kernel_power_max * sizeof (pw_pre_t); - } - - // sometimes device_available_mem and device_maxmem_alloc reported back from the opencl runtime are a bit inaccurate. - // let's add some extra space just to be sure. - // now depends on the kernel-accel value (where scrypt and similar benefits), but also hard minimum 64mb and maximum 1024mb limit - - u64 EXTRA_SPACE = (1024ULL * 1024ULL) * device_param->kernel_accel_max; - - EXTRA_SPACE = MAX (EXTRA_SPACE, ( 64ULL * 1024ULL * 1024ULL)); - EXTRA_SPACE = MIN (EXTRA_SPACE, (1024ULL * 1024ULL * 1024ULL)); - - const u64 scrypt_extra_space - = device_param->size_bfs - + device_param->size_combs - + device_param->size_digests - + device_param->size_esalts - + device_param->size_markov_css - + device_param->size_plains - + device_param->size_results - + device_param->size_root_css - + device_param->size_rules - + device_param->size_rules_c - + device_param->size_salts - + device_param->size_shown - + device_param->size_tm - + device_param->size_st_digests - + device_param->size_st_salts - + device_param->size_st_esalts - + size_pws - + size_pws_amp - + size_pws_comp - + size_pws_idx - + size_tmps - + size_hooks - + size_pws_pre - + size_pws_base - + EXTRA_SPACE; - - bool not_enough_memory = true; - - u64 size_scrypt = 0; - - u64 tmto; - - for (tmto = tmto_start; tmto <= tmto_stop; tmto++) - { - size_scrypt = (128ULL * scrypt_r) * scrypt_N; - - size_scrypt /= 1ull << tmto; - - size_scrypt *= kernel_power_max; - - if ((size_scrypt / 4) > device_param->device_maxmem_alloc) continue; - - if ((size_scrypt + scrypt_extra_space) > device_param->device_available_mem) continue; - - not_enough_memory = false; - - break; - } - - if (not_enough_memory == true) return -1; - - return size_scrypt; -} - -u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - const u64 tmp_size = 0; // we'll add some later - - return tmp_size; -} - -u64 module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - // we need to check that all hashes have the same scrypt settings - - for (u32 i = 1; i < hashes->salts_cnt; i++) - { - if ((hashes->salts_buf[i].scrypt_N != scrypt_N) - || (hashes->salts_buf[i].scrypt_r != scrypt_r) - || (hashes->salts_buf[i].scrypt_p != scrypt_p)) - { - return -1; - } - } - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - return tmp_size; -} - -bool module_warmup_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) -{ - return true; -} - -char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) -{ - const u64 scrypt_N = (hashes->salts_buf[0].scrypt_N) ? hashes->salts_buf[0].scrypt_N : SCRYPT_N; - const u64 scrypt_r = (hashes->salts_buf[0].scrypt_r) ? hashes->salts_buf[0].scrypt_r : SCRYPT_R; - const u64 scrypt_p = (hashes->salts_buf[0].scrypt_p) ? hashes->salts_buf[0].scrypt_p : SCRYPT_P; - - const u64 extra_buffer_size = device_param->extra_buffer_size; - - const u64 kernel_power_max = ((OPTS_TYPE & OPTS_TYPE_MP_MULTI_DISABLE) ? 1 : device_param->device_processors) * device_param->kernel_threads_max * device_param->kernel_accel_max; - - const u64 size_scrypt = 128ULL * scrypt_r * scrypt_N; - - const u64 scrypt_tmto_final = (kernel_power_max * size_scrypt) / extra_buffer_size; - - const u64 tmp_size = 128ULL * scrypt_r * scrypt_p; - - char *jit_build_options = NULL; - - hc_asprintf (&jit_build_options, "-D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%" PRIu64 " -D SCRYPT_TMP_ELEM=%" PRIu64, - hashes->salts_buf[0].scrypt_N, - hashes->salts_buf[0].scrypt_r, - hashes->salts_buf[0].scrypt_p, - scrypt_tmto_final, - tmp_size / 16); - - return jit_build_options; -} - int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -422,6 +209,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; @@ -432,9 +221,9 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_dgst_size = module_dgst_size; module_ctx->module_dictstat_disable = MODULE_DEFAULT; module_ctx->module_esalt_size = MODULE_DEFAULT; - module_ctx->module_extra_buffer_size = module_extra_buffer_size; - module_ctx->module_extra_tmp_size = module_extra_tmp_size; - module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = scrypt_module_extra_buffer_size; + module_ctx->module_extra_tmp_size = scrypt_module_extra_tmp_size; + module_ctx->module_extra_tuningdb_block = scrypt_module_extra_tuningdb_block; module_ctx->module_forced_outfile_format = MODULE_DEFAULT; module_ctx->module_hash_binary_count = MODULE_DEFAULT; module_ctx->module_hash_binary_parse = MODULE_DEFAULT; @@ -460,13 +249,13 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_hook23 = MODULE_DEFAULT; module_ctx->module_hook_salt_size = MODULE_DEFAULT; module_ctx->module_hook_size = MODULE_DEFAULT; - module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_build_options = scrypt_module_jit_build_options; module_ctx->module_jit_cache_disable = MODULE_DEFAULT; module_ctx->module_kernel_accel_max = MODULE_DEFAULT; module_ctx->module_kernel_accel_min = MODULE_DEFAULT; - module_ctx->module_kernel_loops_max = module_kernel_loops_max; - module_ctx->module_kernel_loops_min = module_kernel_loops_min; - module_ctx->module_kernel_threads_max = module_kernel_threads_max; + module_ctx->module_kernel_loops_max = scrypt_module_kernel_loops_max; + module_ctx->module_kernel_loops_min = scrypt_module_kernel_loops_min; + module_ctx->module_kernel_threads_max = scrypt_module_kernel_threads_max; module_ctx->module_kernel_threads_min = MODULE_DEFAULT; module_ctx->module_kern_type = module_kern_type; module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; @@ -478,7 +267,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_max = MODULE_DEFAULT; module_ctx->module_pw_min = module_pw_min; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; @@ -486,7 +275,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; - module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_tmp_size = scrypt_module_tmp_size; module_ctx->module_unstable_warning = MODULE_DEFAULT; - module_ctx->module_warmup_disable = module_warmup_disable; + module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_29910.c b/src/modules/module_29910.c index bb76e8da4..8f8028b03 100644 --- a/src/modules/module_29910.c +++ b/src/modules/module_29910.c @@ -255,6 +255,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29920.c b/src/modules/module_29920.c index 259e0f620..6cf4a3611 100644 --- a/src/modules/module_29920.c +++ b/src/modules/module_29920.c @@ -278,6 +278,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29930.c b/src/modules/module_29930.c index d29e9bcfe..eae649504 100644 --- a/src/modules/module_29930.c +++ b/src/modules/module_29930.c @@ -209,6 +209,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_29940.c b/src/modules/module_29940.c index be5522352..aa2791475 100644 --- a/src/modules/module_29940.c +++ b/src/modules/module_29940.c @@ -231,6 +231,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30000.c b/src/modules/module_30000.c index 2a3fd4704..6a524703e 100644 --- a/src/modules/module_30000.c +++ b/src/modules/module_30000.c @@ -144,6 +144,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30120.c b/src/modules/module_30120.c index f17570333..44fa456d3 100644 --- a/src/modules/module_30120.c +++ b/src/modules/module_30120.c @@ -208,6 +208,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30420.c b/src/modules/module_30420.c index 8074d3412..179dd5904 100644 --- a/src/modules/module_30420.c +++ b/src/modules/module_30420.c @@ -160,6 +160,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30500.c b/src/modules/module_30500.c index e68921944..1746f2625 100644 --- a/src/modules/module_30500.c +++ b/src/modules/module_30500.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30600.c b/src/modules/module_30600.c index 2af2eecd4..b546989a7 100644 --- a/src/modules/module_30600.c +++ b/src/modules/module_30600.c @@ -288,6 +288,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30700.c b/src/modules/module_30700.c index b078dc447..a853aeb9d 100644 --- a/src/modules/module_30700.c +++ b/src/modules/module_30700.c @@ -205,6 +205,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30901.c b/src/modules/module_30901.c index 2ffca80aa..24c2b372d 100644 --- a/src/modules/module_30901.c +++ b/src/modules/module_30901.c @@ -24,7 +24,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2PKH), compres static const u64 KERN_TYPE = 30901; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "59887ec9920239bd45b6a9f82b7c4e024f80beaf887e5ee6aac5de0a899d3068"; @@ -167,6 +166,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30902.c b/src/modules/module_30902.c index 25f548d0c..ad4aab7db 100644 --- a/src/modules/module_30902.c +++ b/src/modules/module_30902.c @@ -24,7 +24,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2PKH), uncompr static const u64 KERN_TYPE = 30902; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "2006a306cf8f61c18c4e78e5fc0f5a7aa473b5ffb41f34344a32f8e042786fa1"; @@ -168,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30903.c b/src/modules/module_30903.c index 5ebb4cebf..319871186 100644 --- a/src/modules/module_30903.c +++ b/src/modules/module_30903.c @@ -22,7 +22,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2WPKH, Bech32) static const u64 KERN_TYPE = 30901; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "4d1987d7a341d51557af59996845740135ab2506515426ada57cc8ec05adf794"; @@ -350,6 +349,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30904.c b/src/modules/module_30904.c index ebf7b3d4e..01681e5dd 100644 --- a/src/modules/module_30904.c +++ b/src/modules/module_30904.c @@ -22,7 +22,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2WPKH, Bech32) static const u64 KERN_TYPE = 30902; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "25c9f8f734d87aacd9308705ca50b9819a57425ffbfae41cef869b19764d72c2"; @@ -350,6 +349,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30905.c b/src/modules/module_30905.c index 33dfd9282..352cb832d 100644 --- a/src/modules/module_30905.c +++ b/src/modules/module_30905.c @@ -24,7 +24,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2SH(P2WPKH)), static const u64 KERN_TYPE = 30905; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "83b45ff8d85f37aafc05a8accd1f1cd5e50868b57e2ef0ef6f287bb4d8d17786"; @@ -167,6 +166,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_30906.c b/src/modules/module_30906.c index 6810f6c16..982baa384 100644 --- a/src/modules/module_30906.c +++ b/src/modules/module_30906.c @@ -24,7 +24,6 @@ static const char *HASH_NAME = "Bitcoin raw private key (P2SH(P2WPKH)), static const u64 KERN_TYPE = 30906; static const u32 OPTI_TYPE = OPTI_TYPE_NOT_SALTED; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_NATIVE_THREADS | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_NONE; static const char *ST_PASS = "4c969ccc86d9e1f557b4ff1f19badc9a99718dd2aec8fcf66460612e05f5f7dd"; @@ -167,6 +166,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31000.c b/src/modules/module_31000.c index b7a3c2208..aeb654d19 100644 --- a/src/modules/module_31000.c +++ b/src/modules/module_31000.c @@ -120,6 +120,8 @@ void module_init (module_ctx_t * module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31100.c b/src/modules/module_31100.c index 8db92fb91..6a4125041 100644 --- a/src/modules/module_31100.c +++ b/src/modules/module_31100.c @@ -167,6 +167,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31200.c b/src/modules/module_31200.c index 72abe69f1..1bc8dc8a1 100644 --- a/src/modules/module_31200.c +++ b/src/modules/module_31200.c @@ -252,6 +252,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31300.c b/src/modules/module_31300.c index ae4130837..c828a33bb 100644 --- a/src/modules/module_31300.c +++ b/src/modules/module_31300.c @@ -148,6 +148,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31400.c b/src/modules/module_31400.c index 46bcef397..7539486f1 100644 --- a/src/modules/module_31400.c +++ b/src/modules/module_31400.c @@ -142,6 +142,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31500.c b/src/modules/module_31500.c index 26ec4d0f3..c8e7985c7 100644 --- a/src/modules/module_31500.c +++ b/src/modules/module_31500.c @@ -174,6 +174,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31600.c b/src/modules/module_31600.c index 2752f5d45..1517db1e3 100644 --- a/src/modules/module_31600.c +++ b/src/modules/module_31600.c @@ -196,6 +196,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = module_benchmark_mask; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31700.c b/src/modules/module_31700.c index 1bdb6161a..e67ad51f6 100644 --- a/src/modules/module_31700.c +++ b/src/modules/module_31700.c @@ -205,6 +205,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31800.c b/src/modules/module_31800.c index 8a91a90e7..576e9c018 100644 --- a/src/modules/module_31800.c +++ b/src/modules/module_31800.c @@ -382,6 +382,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_31900.c b/src/modules/module_31900.c index 7ef9a8f07..1ce10d7a2 100644 --- a/src/modules/module_31900.c +++ b/src/modules/module_31900.c @@ -291,6 +291,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32000.c b/src/modules/module_32000.c index f1e17711a..50454f2ba 100644 --- a/src/modules/module_32000.c +++ b/src/modules/module_32000.c @@ -141,6 +141,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32010.c b/src/modules/module_32010.c index d82e5ca6a..7c4279f98 100644 --- a/src/modules/module_32010.c +++ b/src/modules/module_32010.c @@ -150,6 +150,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32020.c b/src/modules/module_32020.c index 98c525586..c55483742 100644 --- a/src/modules/module_32020.c +++ b/src/modules/module_32020.c @@ -185,6 +185,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32030.c b/src/modules/module_32030.c index 11ac43ead..db7014287 100644 --- a/src/modules/module_32030.c +++ b/src/modules/module_32030.c @@ -197,6 +197,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32031.c b/src/modules/module_32031.c index 2ce2cf719..3ff2e3a02 100644 --- a/src/modules/module_32031.c +++ b/src/modules/module_32031.c @@ -202,6 +202,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32040.c b/src/modules/module_32040.c index a9afe56f7..9518db12d 100644 --- a/src/modules/module_32040.c +++ b/src/modules/module_32040.c @@ -198,6 +198,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32041.c b/src/modules/module_32041.c index 445562e30..f4d35528e 100644 --- a/src/modules/module_32041.c +++ b/src/modules/module_32041.c @@ -205,6 +205,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32050.c b/src/modules/module_32050.c index 131651dce..8fceefad2 100644 --- a/src/modules/module_32050.c +++ b/src/modules/module_32050.c @@ -227,6 +227,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32060.c b/src/modules/module_32060.c index eade07596..c27efbad5 100644 --- a/src/modules/module_32060.c +++ b/src/modules/module_32060.c @@ -291,6 +291,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32070.c b/src/modules/module_32070.c index a2a785628..23b84781c 100644 --- a/src/modules/module_32070.c +++ b/src/modules/module_32070.c @@ -240,6 +240,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32100.c b/src/modules/module_32100.c index 0663afc28..1795c700b 100644 --- a/src/modules/module_32100.c +++ b/src/modules/module_32100.c @@ -367,6 +367,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32200.c b/src/modules/module_32200.c index 8a2ccc36e..4c71f9427 100644 --- a/src/modules/module_32200.c +++ b/src/modules/module_32200.c @@ -366,6 +366,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32300.c b/src/modules/module_32300.c index d811506b5..1b66c35c3 100644 --- a/src/modules/module_32300.c +++ b/src/modules/module_32300.c @@ -248,6 +248,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32410.c b/src/modules/module_32410.c index 9554e980b..c1857e389 100644 --- a/src/modules/module_32410.c +++ b/src/modules/module_32410.c @@ -201,6 +201,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32420.c b/src/modules/module_32420.c index c4b6d6494..f8a477d79 100644 --- a/src/modules/module_32420.c +++ b/src/modules/module_32420.c @@ -218,6 +218,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32500.c b/src/modules/module_32500.c index d23a72114..2354ae3cf 100644 --- a/src/modules/module_32500.c +++ b/src/modules/module_32500.c @@ -223,6 +223,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32600.c b/src/modules/module_32600.c index 819610413..9043655c3 100644 --- a/src/modules/module_32600.c +++ b/src/modules/module_32600.c @@ -221,6 +221,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_32700.c b/src/modules/module_32700.c index a34482a42..9bfdd3f02 100644 --- a/src/modules/module_32700.c +++ b/src/modules/module_32700.c @@ -158,6 +158,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_33300.c b/src/modules/module_33300.c new file mode 100644 index 000000000..964aeee9e --- /dev/null +++ b/src/modules/module_33300.c @@ -0,0 +1,218 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 7; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 6; +static const u32 DGST_SIZE = DGST_SIZE_4_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_AUTHENTICATED; +static const char *HASH_NAME = "HMAC-BLAKE2S (key = $pass)"; +static const u64 KERN_TYPE = 33300; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "0d541ae24d30aff2627c4d1a910f766088a64809edb46a05d29649a9b944da6c:1234"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 64; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u32 tmp[8]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + tmp[4] = digest[4]; + tmp[5] = digest[5]; + tmp[6] = digest[6]; + tmp[7] = digest[7]; + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[4], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[5], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[6], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[7], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_33500.c b/src/modules/module_33500.c index e37d265c5..9554ea8f3 100644 --- a/src/modules/module_33500.c +++ b/src/modules/module_33500.c @@ -58,8 +58,8 @@ typedef struct rc4 } rc4_t; static const char *SIGNATURE_RC4 = "$rc4$"; -static const u32 RC4_KEY_BITS = 40; -static const u32 PW_LEN = RC4_KEY_BITS / 8; // 5 +#define RC4_KEY_BITS 40 +#define PW_LEN (RC4_KEY_BITS / 8) // 5 bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_33501.c b/src/modules/module_33501.c index 4f51577a7..04befc153 100644 --- a/src/modules/module_33501.c +++ b/src/modules/module_33501.c @@ -58,8 +58,8 @@ typedef struct rc4 } rc4_t; static const char *SIGNATURE_RC4 = "$rc4$"; -static const u32 RC4_KEY_BITS = 72; -static const u32 PW_LEN = RC4_KEY_BITS / 8; // 9 +#define RC4_KEY_BITS 72 +#define PW_LEN (RC4_KEY_BITS / 8) // 9 bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_33502.c b/src/modules/module_33502.c index f02141e2d..50bf97077 100644 --- a/src/modules/module_33502.c +++ b/src/modules/module_33502.c @@ -58,8 +58,8 @@ typedef struct rc4 } rc4_t; static const char *SIGNATURE_RC4 = "$rc4$"; -static const u32 RC4_KEY_BITS = 104; -static const u32 PW_LEN = RC4_KEY_BITS / 8; // 13 +#define RC4_KEY_BITS 104 +#define PW_LEN (RC4_KEY_BITS / 8) // 13 bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { @@ -342,6 +342,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/module_33700.c b/src/modules/module_33700.c new file mode 100644 index 000000000..71eddf09f --- /dev/null +++ b/src/modules/module_33700.c @@ -0,0 +1,255 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_CIPHER_KPA; +static const char *HASH_NAME = "Microsoft Online Account (PBKDF2-HMAC-SHA256 + AES256)"; +static const u64 KERN_TYPE = 33700; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_UTF16LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$MSONLINEACCOUNT$0$10000$91869d1d5d3a1df25dd3f0e57bbc226a43641bc03086dcb5b6672941fcabce01"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct pkcs_sha256_tmp +{ + u32 ipad[8]; + u32 opad[8]; + + u32 dgst[32]; + u32 out[32]; + +} pkcs_sha256_tmp_t; + +typedef struct pkcs +{ + u32 data_buf[8]; + int data_len; + +} pkcs_t; + +static const char *SIGNATURE_MSOA = "$MSONLINEACCOUNT$"; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (pkcs_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (pkcs_sha256_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + pkcs_t *pkcs = (pkcs_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 4; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_MSOA; + + token.len[0] = 17; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 1; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + token.sep[2] = '$'; + token.len_min[2] = 1; + token.len_max[2] = 5; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + token.sep[3] = '$'; + token.len[3] = 64; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // type + + const u8 *type_pos = token.buf[1]; + + if (type_pos[0] != '0') return (PARSER_SIGNATURE_UNMATCHED); + + // iter + + const u8 *iter_pos = token.buf[2]; + + const u32 iter = hc_strtoul ((const char *) iter_pos, NULL, 10); + + salt->salt_iter = iter - 1; + + // data + + const u8 *data_pos = token.buf[3]; + const int data_len = token.len[3]; + + pkcs->data_len = hex_decode (data_pos, data_len, (u8 *) pkcs->data_buf); + + // fake digest + + digest[0] = pkcs->data_buf[0]; + digest[1] = pkcs->data_buf[1]; + digest[2] = pkcs->data_buf[2]; + digest[3] = pkcs->data_buf[3]; + + // set fake salt + + salt->salt_buf[0] = pkcs->data_buf[0]; + salt->salt_buf[1] = pkcs->data_buf[1]; + salt->salt_buf[2] = pkcs->data_buf[2]; + salt->salt_buf[3] = pkcs->data_buf[3]; + + salt->salt_len = 16; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const pkcs_t *pkcs = (const pkcs_t *) esalt_buf; + + // output + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s0$%d$", + SIGNATURE_MSOA, + salt->salt_iter + 1); + + out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_33800.c b/src/modules/module_33800.c new file mode 100644 index 000000000..9a1efa0f4 --- /dev/null +++ b/src/modules/module_33800.c @@ -0,0 +1,388 @@ +/** + * based on mode 3200 + * + * + * related tickets/issues + * + * https://github.com/hashcat/hashcat/issues/73 + * support to recover Woltlab Burning Board 4.x hashes #73 + * (closed without implementation) + * + * https://github.com/hashcat/hashcat/issues/2788 + * Bcrypt(Bcrypt($Pass)) Kernel Support #2788 + * + * + * john the ripper + * + * https://github.com/openwall/john/issues/2413 + * Add support for Woltlab Burning Board 4.x hashes #2413 + * + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_6; +static const u32 HASH_CATEGORY = HASH_CATEGORY_FORUM_SOFTWARE; +static const char *HASH_NAME = "WBB4 (Woltlab Burning Board) Plugin [bcrypt(bcrypt($pass))]"; +static const u64 KERN_TYPE = 33800; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_INIT2 + | OPTS_TYPE_LOOP2 + | OPTS_TYPE_DYNAMIC_SHARED; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$2a$08$hashcatohohohohohohohegk6PN.SFkoXxDIkacAGKFN9AF8nx.Hi"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +static const char *SIGNATURE_BCRYPT1 = "$2a$"; +static const char *SIGNATURE_BCRYPT2 = "$2b$"; +static const char *SIGNATURE_BCRYPT3 = "$2x$"; +static const char *SIGNATURE_BCRYPT4 = "$2y$"; + +typedef struct bcrypt_tmp +{ + u32 E[18]; + + u32 P[18]; + + u32 S0[256]; + u32 S1[256]; + u32 S2[256]; + u32 S3[256]; + +} bcrypt_tmp_t; + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 pw_max = 72; // Underlaying Blowfish max + + return pw_max; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (bcrypt_tmp_t); + + return tmp_size; +} + +bool module_jit_cache_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + return true; +} + +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + // this mode heavily depends on the available shared memory size + // note the kernel need to have some special code changes in order to make use to use post-48k memory region + // we need to set some macros + + bool use_dynamic = false; + + if (device_param->is_cuda == true) + { + use_dynamic = true; + } + + // this uses some nice feedback effect. + // based on the device_local_mem_size the reqd_work_group_size in the kernel is set to some value + // which is then is read from the opencl host in the kernel_preferred_wgs_multiple1/2/3 result. + // therefore we do not need to set module_kernel_threads_min/max except for CPU, where the threads are set to fixed 1. + + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) + { + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u", 1); + } + else + { + u32 overhead = 0; + + if (device_param->opencl_device_vendor_id == VENDOR_ID_NV) + { + // note we need to use device_param->device_local_mem_size - 4 because opencl jit returns with: + // Entry function '...' uses too much shared data (0xc004 bytes, 0xc000 max) + // on my development system. no clue where the 4 bytes are spent. + // I did some research on this and it seems to be related with the datatype. + // For example, if i used u8 instead, there's only 1 byte wasted. + + if (device_param->is_opencl == true) + { + overhead = 1; + } + } + + if (user_options->kernel_threads_chgd == true) + { + u32 fixed_local_size = user_options->kernel_threads; + + if (use_dynamic == true) + { + if ((fixed_local_size * 4096) > device_param->kernel_dynamic_local_mem_size_memset) + { + // otherwise out-of-bound reads + + fixed_local_size = device_param->kernel_dynamic_local_mem_size_memset / 4096; + } + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u -D DYNAMIC_LOCAL", fixed_local_size); + } + else + { + if ((fixed_local_size * 4096) > (device_param->device_local_mem_size - overhead)) + { + // otherwise out-of-bound reads + + fixed_local_size = (device_param->device_local_mem_size - overhead) / 4096; + } + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u", fixed_local_size); + } + } + else + { + if (use_dynamic == true) + { + // using kernel_dynamic_local_mem_size_memset is a bit hackish. + // we had to brute-force this value out of an already loaded CUDA function. + // there's no official way to query for this value. + + const u32 fixed_local_size = device_param->kernel_dynamic_local_mem_size_memset / 4096; + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u -D DYNAMIC_LOCAL", fixed_local_size); + } + else + { + const u32 fixed_local_size = (device_param->device_local_mem_size - overhead) / 4096; + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u", fixed_local_size); + } + } + } + + return jit_build_options; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 4; + + token.signatures_cnt = 4; + token.signatures_buf[0] = SIGNATURE_BCRYPT1; + token.signatures_buf[1] = SIGNATURE_BCRYPT2; + token.signatures_buf[2] = SIGNATURE_BCRYPT3; + token.signatures_buf[3] = SIGNATURE_BCRYPT4; + + token.len[0] = 4; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 2; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + token.len[2] = 22; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64B; + + token.len[3] = 31; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64B; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *iter_pos = token.buf[1]; + const u8 *salt_pos = token.buf[2]; + const u8 *hash_pos = token.buf[3]; + + const int salt_len = token.len[2]; + const int hash_len = token.len[3]; + + salt->salt_len = 16; + salt->salt_iter = 1u << hc_strtoul ((const char *) iter_pos, NULL, 10); + salt->salt_iter2 = 1u << hc_strtoul ((const char *) iter_pos, NULL, 10); + + memcpy ((char *) salt->salt_sign, line_buf, 6); + //have a copy of that for second round to prevent from calculating it inside kernel + memcpy ((char *) salt->salt_buf_pc, line_buf, 29); + + u8 *salt_buf_ptr = (u8 *) salt->salt_buf; + + u8 tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + + memcpy (salt_buf_ptr, tmp_buf, 16); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + + memcpy (digest, tmp_buf, 24); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + + digest[5] &= ~0xffu; // its just 23 not 24 ! + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + u32 tmp_digest[6]; + + tmp_digest[0] = byte_swap_32 (digest[0]); + tmp_digest[1] = byte_swap_32 (digest[1]); + tmp_digest[2] = byte_swap_32 (digest[2]); + tmp_digest[3] = byte_swap_32 (digest[3]); + tmp_digest[4] = byte_swap_32 (digest[4]); + tmp_digest[5] = byte_swap_32 (digest[5]); + + u32 tmp_salt[4]; + + tmp_salt[0] = byte_swap_32 (salt->salt_buf[0]); + tmp_salt[1] = byte_swap_32 (salt->salt_buf[1]); + tmp_salt[2] = byte_swap_32 (salt->salt_buf[2]); + tmp_salt[3] = byte_swap_32 (salt->salt_buf[3]); + + char tmp_buf[64]; + + base64_encode (int_to_bf64, (const u8 *) tmp_salt, 16, (u8 *) tmp_buf + 0); + base64_encode (int_to_bf64, (const u8 *) tmp_digest, 23, (u8 *) tmp_buf + 22); + + tmp_buf[22 + 31] = 0; // base64_encode wants to pad + + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_cache_disable = module_jit_cache_disable; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_70000.c b/src/modules/module_70000.c new file mode 100644 index 000000000..01504ea09 --- /dev/null +++ b/src/modules/module_70000.c @@ -0,0 +1,326 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH; +static const char *HASH_NAME = "argon2id [Bridged: reference implementation + tunings]"; +static const u64 KERN_TYPE = 70000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_MP_MULTI_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS // optional - improves performance + | BRIDGE_TYPE_REPLACE_LOOP; +static const char *BRIDGE_NAME = "argon2id_reference"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$argon2id$v=19$m=4096,t=3,p=1$FoIjFnZlM2JSJWYXUgMFAw$eYKMzhbW8uyT1LLtKRdRcJj2CQeRrdr2pKv/Y71YbAQ"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +const char *module_bridge_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_NAME; } +u64 module_bridge_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_TYPE; } + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 h[64]; + +} argon2_reference_tmp_t; + +typedef struct +{ + u32 salt_buf[64]; + u32 salt_len; + + u32 digest_buf[64]; + u32 digest_len; + + u32 m; + u32 t; + u32 p; + +} argon2_t; + +static const char *SIGNATURE_ARGON2ID= "$argon2id$"; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (argon2_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (argon2_reference_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + argon2_t *argon2id = (argon2_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 7; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_ARGON2ID; + + token.len[0] = 10; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.len[1] = 4; + token.sep[1] = '$'; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH; + + token.len_min[2] = 3; + token.len_max[2] = 12; + token.sep[2] = ','; // our tokenizer shines here + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + token.len_min[3] = 3; + token.len_max[3] = 5; + token.sep[3] = ','; // ... and here + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH; + + token.len_min[4] = 3; + token.len_max[4] = 5; + token.sep[4] = '$'; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH; + + token.len_min[5] = ((SALT_MIN * 8) / 6) + 0; + token.len_max[5] = ((SALT_MAX * 8) / 6) + 3; + token.sep[5] = '$'; + token.attr[5] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.len_min[6] = ((SALT_MIN * 8) / 6) + 0; + token.len_max[6] = ((SALT_MAX * 8) / 6) + 3; + token.sep[6] = '$'; + token.attr[6] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // version + + const int version_len = token.len[1]; + const u8 *version_pos = token.buf[1]; + + if (version_len != 4) return (PARSER_HASH_VALUE); + + if (memcmp (version_pos, "v=19", 4)) return (PARSER_HASH_VALUE); + + // argon2id config + + const u8 *m_pos = token.buf[2]; + const u8 *t_pos = token.buf[3]; + const u8 *p_pos = token.buf[4]; + + argon2id->m = hc_strtoul ((const char *) m_pos + 2, NULL, 10); + argon2id->t = hc_strtoul ((const char *) t_pos + 2, NULL, 10); + argon2id->p = hc_strtoul ((const char *) p_pos + 2, NULL, 10); + + if (argon2id->m < 1) return (PARSER_HASH_VALUE); + if (argon2id->t < 1) return (PARSER_HASH_VALUE); + if (argon2id->p < 1) return (PARSER_HASH_VALUE); + + // salt + + const int salt_len = token.len[5]; + const u8 *salt_pos = token.buf[5]; + + argon2id->salt_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, (u8 *) argon2id->salt_buf); + + // digest + + const int digest_len = token.len[6]; + const u8 *digest_pos = token.buf[6]; + + argon2id->digest_len = base64_decode (base64_to_int, (const u8 *) digest_pos, digest_len, (u8 *) argon2id->digest_buf); + + // comparison digest + + digest[0] = argon2id->digest_buf[0]; + digest[1] = argon2id->digest_buf[1]; + digest[2] = argon2id->digest_buf[2]; + digest[3] = argon2id->digest_buf[3]; + + // fake salt, we just need to make this unique + + salt->salt_buf[0] = digest[0]; + salt->salt_buf[1] = digest[1]; + salt->salt_buf[2] = digest[2]; + salt->salt_buf[3] = digest[3]; + salt->salt_buf[4] = argon2id->m; + salt->salt_buf[5] = argon2id->t; + salt->salt_buf[6] = argon2id->p; + salt->salt_buf[7] = 0; + + salt->salt_len = 32; + salt->salt_iter = 1; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + // const u32 *digest = (const u32 *) digest_buf; + + const argon2_t *argon2 = (const argon2_t *) esalt_buf; + + // salt + + char base64_salt[512] = { 0 }; + + int len1 = base64_encode (int_to_base64, (const u8 *) argon2->salt_buf, argon2->salt_len, (u8 *) base64_salt); + + for (int i = len1 - 1; i >=0; i--) if (base64_salt[i] == '=') base64_salt[i] = 0; + + // digest + + char base64_digest[512] = { 0 }; + + int len2 = base64_encode (int_to_base64, (const u8 *) argon2->digest_buf, argon2->digest_len, (u8 *) base64_digest); + + for (int i = len2 - 1; i >=0; i--) if (base64_digest[i] == '=') base64_digest[i] = 0; + + // out + + u8 *out_buf = (u8 *) line_buf; + + const int out_len = snprintf ((char *) out_buf, line_size, "%sv=19$m=%d,t=%d,p=%d$%s$%s", + SIGNATURE_ARGON2ID, + argon2->m, + argon2->t, + argon2->p, + base64_salt, + base64_digest); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = module_bridge_name; + module_ctx->module_bridge_type = module_bridge_type; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_70100.c b/src/modules/module_70100.c new file mode 100644 index 000000000..ac5998476 --- /dev/null +++ b/src/modules/module_70100.c @@ -0,0 +1,268 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_16; +static const u32 HASH_CATEGORY = HASH_CATEGORY_GENERIC_KDF; +static const char *HASH_NAME = "scrypt [Bridged: Scrypt-Jane ROMix]"; +static const u64 KERN_TYPE = 70100; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_MP_MULTI_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS // optional - improves performance + | BRIDGE_TYPE_REPLACE_LOOP; +static const char *BRIDGE_NAME = "scrypt_jane"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "SCRYPT:16384:8:1:OTEyNzU0ODg=:Cc8SPjRH1hFQhuIPCdF51uNGtJ2aOY/isuoMlMUsJ8c="; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +const char *module_bridge_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_NAME; } +u64 module_bridge_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_TYPE; } + +static const char *SIGNATURE_SCRYPT = "SCRYPT"; + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + // this overrides the reductions of PW_MAX in case optimized kernel is selected + // IOW, even in optimized kernel mode it support length 256 + + const u32 pw_max = PW_MAX; + + return pw_max; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + #define SCRYPT_R_MAX 16 + #define SCRYPT_P_MAX 16 + + const u64 tmp_size = 128ULL * SCRYPT_R_MAX * SCRYPT_P_MAX; + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 6; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_SCRYPT; + + token.sep[0] = ':'; + token.len[0] = 6; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = ':'; + token.len_min[1] = 1; + token.len_max[1] = 6; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[2] = ':'; + token.len_min[2] = 1; + token.len_max[2] = 6; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[3] = ':'; + token.len_min[3] = 1; + token.len_max[3] = 6; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[4] = ':'; + token.len_min[4] = 0; + token.len_max[4] = 45; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[5] = ':'; + token.len_min[5] = 44; + token.len_max[5] = 88; + token.attr[5] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // scrypt settings + + const u8 *N_pos = token.buf[1]; + const u8 *r_pos = token.buf[2]; + const u8 *p_pos = token.buf[3]; + + salt->scrypt_N = hc_strtoul ((const char *) N_pos, NULL, 10); + salt->scrypt_r = hc_strtoul ((const char *) r_pos, NULL, 10); + salt->scrypt_p = hc_strtoul ((const char *) p_pos, NULL, 10); + + salt->salt_iter = 1; + + if (salt->scrypt_N % 1024) return (PARSER_SALT_VALUE); // we set loop count to 1024 fixed + + // salt + + const u8 *salt_pos = token.buf[4]; + const int salt_len = token.len[4]; + + u8 tmp_buf[128] = { 0 }; + + const int tmp_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); + + memcpy (salt->salt_buf, tmp_buf, tmp_len); + + salt->salt_len = tmp_len; + + // digest - base64 decode + + const u8 *hash_pos = token.buf[5]; + const int hash_len = token.len[5]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + const int digest_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); + + // digest_len should be safe because of 88 limit + + memcpy (digest, tmp_buf, digest_len); + + salt->salt_len_pc = digest_len; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + char base64_salt[64] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) salt->salt_buf, salt->salt_len, (u8 *) base64_salt); + + char base64_digest[128] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) digest_buf, salt->salt_len_pc, (u8 *) base64_digest); + + const int line_len = snprintf (line_buf, line_size, "%s:%u:%u:%u:%s:%s", + SIGNATURE_SCRYPT, + salt->scrypt_N, + salt->scrypt_r, + salt->scrypt_p, + base64_salt, + base64_digest); + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = module_bridge_name; + module_ctx->module_bridge_type = module_bridge_type; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_70200.c b/src/modules/module_70200.c new file mode 100644 index 000000000..e39fd2f25 --- /dev/null +++ b/src/modules/module_70200.c @@ -0,0 +1,268 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_16; +static const u32 HASH_CATEGORY = HASH_CATEGORY_GENERIC_KDF; +static const char *HASH_NAME = "scrypt [Bridged: Scrypt-Yescrypt]"; +static const u64 KERN_TYPE = 70100; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_MP_MULTI_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS // optional - improves performance + | BRIDGE_TYPE_REPLACE_LOOP; +static const char *BRIDGE_NAME = "scrypt_yescrypt"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "SCRYPT:16384:8:1:OTEyNzU0ODg=:Cc8SPjRH1hFQhuIPCdF51uNGtJ2aOY/isuoMlMUsJ8c="; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +const char *module_bridge_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_NAME; } +u64 module_bridge_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_TYPE; } + +static const char *SIGNATURE_SCRYPT = "SCRYPT"; + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + // this overrides the reductions of PW_MAX in case optimized kernel is selected + // IOW, even in optimized kernel mode it support length 256 + + const u32 pw_max = PW_MAX; + + return pw_max; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + #define SCRYPT_R_MAX 16 + #define SCRYPT_P_MAX 16 + + const u64 tmp_size = 128ULL * SCRYPT_R_MAX * SCRYPT_P_MAX; + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 6; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_SCRYPT; + + token.sep[0] = ':'; + token.len[0] = 6; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = ':'; + token.len_min[1] = 1; + token.len_max[1] = 6; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[2] = ':'; + token.len_min[2] = 1; + token.len_max[2] = 6; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[3] = ':'; + token.len_min[3] = 1; + token.len_max[3] = 6; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[4] = ':'; + token.len_min[4] = 0; + token.len_max[4] = 45; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[5] = ':'; + token.len_min[5] = 44; + token.len_max[5] = 88; + token.attr[5] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // scrypt settings + + const u8 *N_pos = token.buf[1]; + const u8 *r_pos = token.buf[2]; + const u8 *p_pos = token.buf[3]; + + salt->scrypt_N = hc_strtoul ((const char *) N_pos, NULL, 10); + salt->scrypt_r = hc_strtoul ((const char *) r_pos, NULL, 10); + salt->scrypt_p = hc_strtoul ((const char *) p_pos, NULL, 10); + + salt->salt_iter = 1; + + if (salt->scrypt_N % 1024) return (PARSER_SALT_VALUE); // we set loop count to 1024 fixed + + // salt + + const u8 *salt_pos = token.buf[4]; + const int salt_len = token.len[4]; + + u8 tmp_buf[128] = { 0 }; + + const int tmp_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); + + memcpy (salt->salt_buf, tmp_buf, tmp_len); + + salt->salt_len = tmp_len; + + // digest - base64 decode + + const u8 *hash_pos = token.buf[5]; + const int hash_len = token.len[5]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + const int digest_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); + + // digest_len should be safe because of 88 limit + + memcpy (digest, tmp_buf, digest_len); + + salt->salt_len_pc = digest_len; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + char base64_salt[64] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) salt->salt_buf, salt->salt_len, (u8 *) base64_salt); + + char base64_digest[128] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) digest_buf, salt->salt_len_pc, (u8 *) base64_digest); + + const int line_len = snprintf (line_buf, line_size, "%s:%u:%u:%u:%s:%s", + SIGNATURE_SCRYPT, + salt->scrypt_N, + salt->scrypt_r, + salt->scrypt_p, + base64_salt, + base64_digest); + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = module_bridge_name; + module_ctx->module_bridge_type = module_bridge_type; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_72000.c b/src/modules/module_72000.c new file mode 100644 index 000000000..d9995764c --- /dev/null +++ b/src/modules/module_72000.c @@ -0,0 +1,264 @@ + +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "memory.h" +#include "emu_inc_hash_md4.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH; +static const char *HASH_NAME = "Generic Hash [Bridged: Python Interpreter free-threading]"; +static const u64 KERN_TYPE = 72000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_AUTODETECT_DISABLE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_MP_MULTI_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS // optional - improves performance + | BRIDGE_TYPE_LAUNCH_LOOP + | BRIDGE_TYPE_UPDATE_SELFTEST; +static const char *BRIDGE_NAME = "python_generic_hash_sp"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "33522b0fd9812aa68586f66dba7c17a8ce64344137f9c7d8b11f32a6921c22de*9348746780603343"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +const char *module_bridge_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_NAME; } +u64 module_bridge_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_TYPE; } + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +typedef struct +{ + u32 hash_buf[16384]; + u32 hash_len; + + u32 salt_buf[16384]; + u32 salt_len; + +} generic_io_t; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (generic_io_tmp_t); + + return tmp_size; +} + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (generic_io_t); + + return esalt_size; +} + +bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const bool potfile_disable = true; + + return potfile_disable; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + generic_io_t *generic_io = (generic_io_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.len_min[0] = 0; + token.len_max[0] = 65536; + token.sep[0] = '*'; + token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH; + + token.len_min[1] = 0; + token.len_max[1] = 65536; + token.sep[1] = '*'; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // To keep this as generic as possible, + // we make a hash of the input data so it fits into digest[] + // and the same for the salt + + const u8 *salt_buf = token.buf[1]; + const int salt_len = token.len[1]; + + memcpy (generic_io->salt_buf, salt_buf, salt_len); + + generic_io->salt_len = salt_len; + + md4_ctx_t ctx1; + + md4_init (&ctx1); + md4_update (&ctx1, (const u32 *) generic_io->salt_buf, generic_io->salt_len); + md4_final (&ctx1); + + salt->salt_buf[0] = ctx1.h[0]; + salt->salt_buf[1] = ctx1.h[1]; + salt->salt_buf[2] = ctx1.h[2]; + salt->salt_buf[3] = ctx1.h[3]; + + salt->salt_len = 16; + salt->salt_iter = 1; + + // digest + + const u8 *hash_buf = token.buf[0]; + const int hash_len = token.len[0]; + + memcpy (generic_io->hash_buf, hash_buf, hash_len); + + generic_io->hash_len = hash_len; + + md4_ctx_t ctx2; + + md4_init (&ctx2); + md4_update (&ctx2, (const u32 *) generic_io->hash_buf, generic_io->hash_len); + md4_final (&ctx2); + + digest[0] = ctx2.h[0]; + digest[1] = ctx2.h[1]; + digest[2] = ctx2.h[2]; + digest[3] = ctx2.h[3]; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const generic_io_t *generic_io = (const generic_io_t *) esalt_buf; + + const int line_len = snprintf (line_buf, line_size, "%s*%s", (char *) generic_io->hash_buf, (char *) generic_io->salt_buf); + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = module_bridge_name; + module_ctx->module_bridge_type = module_bridge_type; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = module_potfile_disable; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_73000.c b/src/modules/module_73000.c new file mode 100644 index 000000000..351893f26 --- /dev/null +++ b/src/modules/module_73000.c @@ -0,0 +1,264 @@ + +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "memory.h" +#include "emu_inc_hash_md4.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH; +static const char *HASH_NAME = "Generic Hash [Bridged: Python Interpreter with GIL]"; +static const u64 KERN_TYPE = 73000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_AUTODETECT_DISABLE + | OPTS_TYPE_NATIVE_THREADS + | OPTS_TYPE_MP_MULTI_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const u64 BRIDGE_TYPE = BRIDGE_TYPE_MATCH_TUNINGS // optional - improves performance + | BRIDGE_TYPE_LAUNCH_LOOP + | BRIDGE_TYPE_UPDATE_SELFTEST; +static const char *BRIDGE_NAME = "python_generic_hash_mp"; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "33522b0fd9812aa68586f66dba7c17a8ce64344137f9c7d8b11f32a6921c22de*9348746780603343"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +const char *module_bridge_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_NAME; } +u64 module_bridge_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return BRIDGE_TYPE; } + +typedef struct +{ + // input + + u32 pw_buf[64]; + u32 pw_len; + + // output + + u32 out_buf[64]; + u32 out_len; + +} generic_io_tmp_t; + +typedef struct +{ + u32 hash_buf[16384]; + u32 hash_len; + + u32 salt_buf[16384]; + u32 salt_len; + +} generic_io_t; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (generic_io_tmp_t); + + return tmp_size; +} + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (generic_io_t); + + return esalt_size; +} + +bool module_potfile_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const bool potfile_disable = true; + + return potfile_disable; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + generic_io_t *generic_io = (generic_io_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.len_min[0] = 0; + token.len_max[0] = 65536; + token.sep[0] = '*'; + token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH; + + token.len_min[1] = 0; + token.len_max[1] = 65536; + token.sep[1] = '*'; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // To keep this as generic as possible, + // we make a hash of the input data so it fits into digest[] + // and the same for the salt + + const u8 *salt_buf = token.buf[1]; + const int salt_len = token.len[1]; + + memcpy (generic_io->salt_buf, salt_buf, salt_len); + + generic_io->salt_len = salt_len; + + md4_ctx_t ctx1; + + md4_init (&ctx1); + md4_update (&ctx1, (const u32 *) generic_io->salt_buf, generic_io->salt_len); + md4_final (&ctx1); + + salt->salt_buf[0] = ctx1.h[0]; + salt->salt_buf[1] = ctx1.h[1]; + salt->salt_buf[2] = ctx1.h[2]; + salt->salt_buf[3] = ctx1.h[3]; + + salt->salt_len = 16; + salt->salt_iter = 1; + + // digest + + const u8 *hash_buf = token.buf[0]; + const int hash_len = token.len[0]; + + memcpy (generic_io->hash_buf, hash_buf, hash_len); + + generic_io->hash_len = hash_len; + + md4_ctx_t ctx2; + + md4_init (&ctx2); + md4_update (&ctx2, (const u32 *) generic_io->hash_buf, generic_io->hash_len); + md4_final (&ctx2); + + digest[0] = ctx2.h[0]; + digest[1] = ctx2.h[1]; + digest[2] = ctx2.h[2]; + digest[3] = ctx2.h[3]; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const generic_io_t *generic_io = (const generic_io_t *) esalt_buf; + + const int line_len = snprintf (line_buf, line_size, "%s*%s", (char *) generic_io->hash_buf, (char *) generic_io->salt_buf); + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = module_bridge_name; + module_ctx->module_bridge_type = module_bridge_type; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = module_potfile_disable; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_99999.c b/src/modules/module_99999.c index b1dd810bd..520db334b 100644 --- a/src/modules/module_99999.c +++ b/src/modules/module_99999.c @@ -170,6 +170,8 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_mask = MODULE_DEFAULT; module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_bridge_name = MODULE_DEFAULT; + module_ctx->module_bridge_type = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; module_ctx->module_deprecated_notice = MODULE_DEFAULT; diff --git a/src/modules/scrypt_common.c b/src/modules/scrypt_common.c new file mode 100644 index 000000000..eadf0b8c2 --- /dev/null +++ b/src/modules/scrypt_common.c @@ -0,0 +1,324 @@ + +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "memory.h" + +u32 scrypt_module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = 2048; + + return kernel_loops_min; +} + +u32 scrypt_module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 2048; + + return kernel_loops_max; +} + +u32 scrypt_module_kernel_threads_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_threads_max = (user_options->kernel_threads_chgd == true) ? user_options->kernel_threads : SCRYPT_THREADS; + + return kernel_threads_max; +} + +u32 tmto = 0; + +u32 scrypt_exptected_threads (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + u32 threads = scrypt_module_kernel_threads_max (hashconfig, user_options, user_options_extra); + + if (hashconfig->opts_type & OPTS_TYPE_NATIVE_THREADS) + { + if (device_param->opencl_device_type & CL_DEVICE_TYPE_CPU) + { + threads = 1; + } + } + + return threads; +} + +const char *scrypt_module_extra_tuningdb_block (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, const backend_ctx_t *backend_ctx, MAYBE_UNUSED const hashes_t *hashes, const u32 device_id, const u32 kernel_accel_user) +{ + hc_device_param_t *device_param = &backend_ctx->devices_param[device_id]; + + // we enforce the same configuration for all hashes, so the next lines should be fine + + const u32 scrypt_N = (hashes->salts_buf[0].scrypt_N == 0) ? hashes->st_salts_buf[0].scrypt_N : hashes->salts_buf[0].scrypt_N; + const u32 scrypt_r = (hashes->salts_buf[0].scrypt_r == 0) ? hashes->st_salts_buf[0].scrypt_r : hashes->salts_buf[0].scrypt_r; + //const u32 scrypt_p = (hashes->salts_buf[0].scrypt_p == 0) ? hashes->st_salts_buf[0].scrypt_p : hashes->salts_buf[0].scrypt_p; + + const u64 size_per_accel = (128ULL * scrypt_r * scrypt_N * scrypt_exptected_threads (hashconfig, user_options, user_options_extra, device_param)); + //const u64 state_per_accel = (128ULL * scrypt_r * scrypt_p * scrypt_exptected_threads (hashconfig, user_options, user_options_extra, device_param)); + + int lines_sz = 4096; + char *lines_buf = hcmalloc (lines_sz); + int lines_pos = 0; + + const u32 device_processors = device_param->device_processors; + + const u32 device_maxworkgroup_size = device_param->device_maxworkgroup_size; + + //const u32 device_local_mem_size = device_param->device_local_mem_size; + + const u64 fixed_mem = (128 * 1024 * 1024); // some storage we need for pws[], tmps[], and others. Is around 72MiB in reality. + + // SCRYPT kernels cause significant spilling, which increases global memory requirements. + // The variables the runtime uses to allocate global memory for this spilling are undocumented. + // As a result, launching the kernel can run into memory allocation errors, especially on devices with a large SM count and a high SCRYPT-R value. + // Based on testing, we assume the following behavior: + // The runtime uses device_maxworkgroup_size as the thread count, multiplies it by the SM count, and then multiplies that by the spill size. + // Additionally, it completely ignores our specified grid sizes, which could otherwise help mitigate this. + // We assume other runtimes behave similarly. + // Note: we need to allocate the 128R buffer three times: main context, TMTO temporary buffer, (half-size) BlockMix. + + const u64 spill_mem = 3 * ((128ULL * scrypt_r) * device_processors * device_maxworkgroup_size); + + const u64 available_mem = MIN (device_param->device_available_mem, (device_param->device_maxmem_alloc * 4)) - (fixed_mem + spill_mem); + + tmto = 0; + + u32 kernel_accel_new = device_processors; + + if (kernel_accel_user) + { + kernel_accel_new = kernel_accel_user; + + if (user_options->scrypt_tmto_chgd == true) + { + // in this branch the user can shoot themselves into the foot + + tmto = user_options->scrypt_tmto; + } + else + { + // only option to save the user is to increase tmto + + for (tmto = 0; tmto < 6; tmto++) + { + const u64 size_per_accel_tmto = size_per_accel >> tmto; + + if ((size_per_accel_tmto * kernel_accel_new) > available_mem) continue; // not enough memory + + break; + } + } + } + else + { + if (user_options->scrypt_tmto_chgd == true) + { + tmto = user_options->scrypt_tmto; + } + else + { + // This is the typical case and the main challenge: choosing the right TMTO value. + // Finding a consistently good algorithm is nearly impossible due to the many factors + // that influence performance. There is no clear rule of thumb. + // + // For example, consider the default scrypt configuration with N=16k and r=8. + // + // In one test with an NVIDIA mobile GPU with 16 GiB of memory (minus X), the device could + // use 28/58 processors. In theory, increasing the TMTO should increase + // performance, but in practice it had no effect at all. + // + // In another test with an NVIDIA discrete GPU with 11 GiB (minus X), the device initially + // used 19/68 processors. Increasing the TMTO to utilize all 68 processors + // did yield the expected performance improvement, matching the theory. + // + // However, with an AMD discrete GPU with 24 GiB (minus X), the optimal case used 46/48 + // processors. Increasing the TMTO should have reduced performance, but + // instead it nearly doubled the speed?! This might be related to AMD GPUs performing + // best with a thread count of 64 instead of 32, but in practice, using 64 threads + // shows little difference compared to 32, suggesting that at a very low level, + // only 32 threads may actually be active. + // + // This algorithm is far from ideal. Fortunately, we have a tuning database, + // so users can find the best -n value for their specific setup, and a forced -n value + // allows to easily calculate the TMTO. + + if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) + { + for (tmto = 0; tmto < 2; tmto++) // results in tmto = 2 + { + if (device_param->device_host_unified_memory == 1) break; // do not touch + + if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) + || (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP)) + { + if (tmto == 0) continue; // at least 1 + } + + const u64 size_per_accel_tmto = size_per_accel >> tmto; + + const float blocks = (float) available_mem / size_per_accel_tmto; + + const float blocks_perc = device_processors / blocks; + + if (blocks_perc > 1.16) continue; + + // probably very low scrypt configuration = register pressure becomes a bottleneck + if ((blocks_perc * (1 << tmto)) < 0.4) + { + if (scrypt_r == 1) continue; + } + + break; + } + } + } + + // from here tmto is known, and we need to update kernel_accel + + if ((device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) && (device_param->device_host_unified_memory == false)) + { + const u64 size_per_accel_tmto = size_per_accel >> tmto; + + kernel_accel_new = available_mem / size_per_accel_tmto; + + kernel_accel_new = MIN (kernel_accel_new, 1024); // max supported + + // luxury option, clamp if we have twice the processors + + if (kernel_accel_new > (device_processors * 2)) + { + const u32 extra = kernel_accel_new % device_processors; + + kernel_accel_new -= extra; + } + + // clamp if close to device processors -- 16% seems fine on a 2080ti, and on a 4090 + + if (kernel_accel_new > device_processors) + { + const u32 extra = kernel_accel_new % device_processors; + + if (extra < (device_processors * 0.16)) + { + kernel_accel_new -= extra; + } + } + } + } + + char *new_device_name = hcstrdup (device_param->device_name); + + for (size_t i = 0; i < strlen (new_device_name); i++) + { + if (new_device_name[i] == ' ') new_device_name[i] = '_'; + } + + lines_pos += snprintf (lines_buf + lines_pos, lines_sz - lines_pos, "%s * %u 1 %u A\n", new_device_name, user_options->hash_mode, kernel_accel_new); + + hcfree (new_device_name); + + return lines_buf; +} + +u64 scrypt_module_extra_buffer_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + // we need to set the self-test hash settings to pass the self-test + // the decoder for the self-test is called after this function + + const u32 scrypt_N = (hashes->salts_buf[0].scrypt_N == 0) ? hashes->st_salts_buf[0].scrypt_N : hashes->salts_buf[0].scrypt_N; + const u32 scrypt_r = (hashes->salts_buf[0].scrypt_r == 0) ? hashes->st_salts_buf[0].scrypt_r : hashes->salts_buf[0].scrypt_r; + //const u32 scrypt_p = (hashes->salts_buf[0].scrypt_p == 0) ? hashes->st_salts_buf[0].scrypt_p : hashes->salts_buf[0].scrypt_p; + + const u64 size_per_accel = 128ULL * scrypt_r * scrypt_N * scrypt_exptected_threads (hashconfig, user_options, user_options_extra, device_param); + + const u64 size_per_accel_tmto = size_per_accel >> tmto; + + const u64 size_scrypt = device_param->kernel_accel_max * size_per_accel_tmto; + + return size_scrypt; +} + +u64 scrypt_module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = 0; // we'll add some later + + return tmp_size; +} + +u64 scrypt_module_extra_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes) +{ + const u32 scrypt_N = (hashes->salts_buf[0].scrypt_N == 0) ? hashes->st_salts_buf[0].scrypt_N : hashes->salts_buf[0].scrypt_N; + const u32 scrypt_r = (hashes->salts_buf[0].scrypt_r == 0) ? hashes->st_salts_buf[0].scrypt_r : hashes->salts_buf[0].scrypt_r; + const u32 scrypt_p = (hashes->salts_buf[0].scrypt_p == 0) ? hashes->st_salts_buf[0].scrypt_p : hashes->salts_buf[0].scrypt_p; + + // in general, since we compile the kernel based on N, r, p, so the JIT can optimize it, we can't have other configuration settings + // we need to check that all hashes have the same scrypt settings + + for (u32 i = 1; i < hashes->salts_cnt; i++) + { + if ((scrypt_N != hashes->salts_buf[i].scrypt_N) + || (scrypt_r != hashes->salts_buf[i].scrypt_r) + || (scrypt_p != hashes->salts_buf[i].scrypt_p)) + { + return (1ULL << 63) + i; + } + } + + // now that we know they all have the same settings, we also need to check the self-test hash is different to what the user hash is using + + if ((hashconfig->opts_type & OPTS_TYPE_SELF_TEST_DISABLE) == 0) + { + if ((scrypt_N != hashes->st_salts_buf[0].scrypt_N) + || (scrypt_r != hashes->st_salts_buf[0].scrypt_r) + || (scrypt_p != hashes->st_salts_buf[0].scrypt_p)) + { + return (1ULL << 62); + } + } + + // this is what we call SCRYPT_SZ in kernel + + u64 tmp_size = 128ULL * scrypt_r * scrypt_p; + + // we need twice the size of SCRYPT_SZ so we can have two elements of that size. + // we can safely process blockmix on the second element without modifying the first element. + // this can be useful when using hooks in combination with P > 1 + + tmp_size *= 2; + + return tmp_size; +} + +char *scrypt_module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + const u32 scrypt_N = (hashes->salts_buf[0].scrypt_N == 0) ? hashes->st_salts_buf[0].scrypt_N : hashes->salts_buf[0].scrypt_N; + const u32 scrypt_r = (hashes->salts_buf[0].scrypt_r == 0) ? hashes->st_salts_buf[0].scrypt_r : hashes->salts_buf[0].scrypt_r; + const u32 scrypt_p = (hashes->salts_buf[0].scrypt_p == 0) ? hashes->st_salts_buf[0].scrypt_p : hashes->salts_buf[0].scrypt_p; + + u64 tmp_size = 128ULL * scrypt_r * scrypt_p; + + tmp_size *= 2; // see scrypt_module_extra_tmp_size for details + + char *jit_build_options = NULL; + + const u32 expected_threads = scrypt_exptected_threads (hashconfig, user_options, user_options_extra, device_param); + + hc_asprintf (&jit_build_options, "-D FIXED_LOCAL_SIZE=%u -D SCRYPT_N=%u -D SCRYPT_R=%u -D SCRYPT_P=%u -D SCRYPT_TMTO=%u -D SCRYPT_TMP_ELEM=%" PRIu64, + expected_threads, + scrypt_N, + scrypt_r, + scrypt_p, + tmto, + tmp_size / 4); + + return jit_build_options; +} + diff --git a/src/monitor.c b/src/monitor.c index ce02a7a90..571e7c8c3 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -42,6 +42,7 @@ int get_runtime_left (const hashcat_ctx_t *hashcat_ctx) static int monitor (hashcat_ctx_t *hashcat_ctx) { + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; hashes_t *hashes = hashcat_ctx->hashes; hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; @@ -87,7 +88,10 @@ static int monitor (hashcat_ctx_t *hashcat_ctx) if (hwmon_ctx->enabled == true) { - performance_check = true; // this check simply requires hwmon to work + if (bridge_ctx->enabled == false) + { + performance_check = true; // this check simply requires hwmon to work + } } if ((runtime_check == false) && (remove_check == false) && (status_check == false) && (restore_check == false) && (hwmon_check == false) && (performance_check == false)) diff --git a/src/potfile.c b/src/potfile.c index a912e1f50..afafca2f1 100644 --- a/src/potfile.c +++ b/src/potfile.c @@ -81,7 +81,10 @@ int sort_pot_orig_line (const void *v1, const void *v2) const pot_orig_line_entry_t *t1 = (const pot_orig_line_entry_t *) v1; const pot_orig_line_entry_t *t2 = (const pot_orig_line_entry_t *) v2; - return t1->line_pos > t2->line_pos; + if (t1->line_pos > t2->line_pos) return 1; + if (t1->line_pos < t2->line_pos) return -1; + + return 0; } // the problem with the GNU tdestroy () function is that it doesn't work with mingw etc diff --git a/src/rp.c b/src/rp.c index 67ebd9322..ace86877b 100644 --- a/src/rp.c +++ b/src/rp.c @@ -906,6 +906,7 @@ int kernel_rules_load (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 } u32 invalid_cnt = 0; + u32 valid_cnt = 0; for (u32 i = 0; i < kernel_rules_cnt; i++) { @@ -924,18 +925,27 @@ int kernel_rules_load (hashcat_ctx_t *hashcat_ctx, kernel_rule_t **out_buf, u32 { if (out_pos == RULES_MAX - 1) { - event_log_warning (hashcat_ctx, "Maximum functions per rule exceeded during chaining of rules, skipping..."); - invalid_cnt++; break; } + else + { + valid_cnt++; + } out->cmds[out_pos] = in->cmds[in_pos]; } } } + if (invalid_cnt > 0) + { + event_log_warning (hashcat_ctx, "Maximum functions per rule exceeded during chaining of rules."); + event_log_warning (hashcat_ctx, "Skipped %u rule chains, %u valid chains remain.", invalid_cnt, valid_cnt); + event_log_warning (hashcat_ctx, NULL); + } + hcfree (repeats); kernel_rules_cnt -= invalid_cnt; diff --git a/src/selftest.c b/src/selftest.c index 313725e55..f1b2b2dd5 100644 --- a/src/selftest.c +++ b/src/selftest.c @@ -14,6 +14,7 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) { + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; hashconfig_t *hashconfig = hashcat_ctx->hashconfig; hashes_t *hashes = hashcat_ctx->hashes; module_ctx_t *module_ctx = hashcat_ctx->module_ctx; @@ -515,20 +516,20 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param { if (highest_pw_len < 16) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, 1, false, 0, false) == -1) return -1; } else if (highest_pw_len < 32) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 0, 1, false, 0, false) == -1) return -1; } else { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 0, 1, false, 0, false) == -1) return -1; } } else { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_4, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_4, 0, 1, false, 0, false) == -1) return -1; } } else @@ -560,11 +561,14 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param } } - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, 1, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_INIT) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_1, 0, 1, false, 0, false) == -1) return -1; + } if (hashconfig->opts_type & OPTS_TYPE_HOOK12) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_12, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_12, 0, 1, false, 0, false) == -1) return -1; if (device_param->is_cuda == true) { @@ -632,7 +636,7 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (hashconfig->opts_type & OPTS_TYPE_LOOP_PREPARE) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2P, 0, 1, false, 0, false) == -1) return -1; } const u32 iter = salt_buf->salt_iter; @@ -646,17 +650,96 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param device_param->kernel_param.loop_pos = loop_pos; device_param->kernel_param.loop_cnt = loop_left; - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 0, 1, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_LOOP) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2, 0, 1, false, 0, false) == -1) return -1; + } if (hashconfig->opts_type & OPTS_TYPE_LOOP_EXTENDED) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2E, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_2E, 0, 1, false, 0, false) == -1) return -1; + } + + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP) + { + #define COPY_TMPS 1 + + if (COPY_TMPS) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->cuda_d_tmps, hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->hip_d_tmps, hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyDtoH (hashcat_ctx, device_param->metal_command_queue, device_param->h_tmps, device_param->metal_d_tmps, 0, hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueReadBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + } + + hashes_t st_hashes; + + memcpy (&st_hashes, hashes, sizeof (hashes_t)); + + st_hashes.digests_buf = st_hashes.st_digests_buf; + st_hashes.salts_buf = st_hashes.st_salts_buf; + st_hashes.esalts_buf = st_hashes.st_esalts_buf; + st_hashes.hook_salts_buf = st_hashes.st_hook_salts_buf; + + if (bridge_ctx->launch_loop (bridge_ctx->platform_context, device_param, hashconfig, &st_hashes, 0, 1) == false) return -1; + + if (COPY_TMPS) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_tmps, device_param->h_tmps, hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_tmps, device_param->h_tmps, hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_tmps, 0, device_param->h_tmps, hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + } } } if (hashconfig->opts_type & OPTS_TYPE_HOOK23) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_23, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_23, 0, 1, false, 0, false) == -1) return -1; if (device_param->is_cuda == true) { @@ -713,7 +796,7 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (hashconfig->opts_type & OPTS_TYPE_INIT2) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_INIT2, 0, 1, false, 0, false) == -1) return -1; } for (u32 salt_repeat = 0; salt_repeat <= salt_repeats; salt_repeat++) @@ -722,7 +805,7 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (hashconfig->opts_type & OPTS_TYPE_LOOP2_PREPARE) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2P, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2P, 0, 1, false, 0, false) == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_LOOP2) @@ -738,7 +821,78 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param device_param->kernel_param.loop_pos = loop_pos; device_param->kernel_param.loop_cnt = loop_left; - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_LOOP2, 0, 1, false, 0, false) == -1) return -1; + + if (hashconfig->bridge_type & BRIDGE_TYPE_LAUNCH_LOOP2) + { + #define COPY_TMPS 1 + + if (COPY_TMPS) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->cuda_d_tmps, hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + + if (hc_cuStreamSynchronize (hashcat_ctx, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyDtoHAsync (hashcat_ctx, device_param->h_tmps, device_param->hip_d_tmps, hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + + if (hc_hipStreamSynchronize (hashcat_ctx, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyDtoH (hashcat_ctx, device_param->metal_command_queue, device_param->h_tmps, device_param->metal_d_tmps, 0, hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + /* blocking */ + if (hc_clEnqueueReadBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + } + + hashes_t st_hashes; + + memcpy (&st_hashes, hashes, sizeof (hashes_t)); + + st_hashes.digests_buf = st_hashes.st_digests_buf; + st_hashes.salts_buf = st_hashes.st_salts_buf; + st_hashes.esalts_buf = st_hashes.st_esalts_buf; + st_hashes.hook_salts_buf = st_hashes.st_hook_salts_buf; + + if (bridge_ctx->launch_loop2 (bridge_ctx->platform_context, device_param, hashconfig, &st_hashes, 0, 1) == false) return -1; + + if (COPY_TMPS) + { + if (device_param->is_cuda == true) + { + if (hc_cuMemcpyHtoDAsync (hashcat_ctx, device_param->cuda_d_tmps, device_param->h_tmps, hashconfig->tmp_size, device_param->cuda_stream) == -1) return -1; + } + + if (device_param->is_hip == true) + { + if (hc_hipMemcpyHtoDAsync (hashcat_ctx, device_param->hip_d_tmps, device_param->h_tmps, hashconfig->tmp_size, device_param->hip_stream) == -1) return -1; + } + + #if defined (__APPLE__) + if (device_param->is_metal == true) + { + if (hc_mtlMemcpyHtoD (hashcat_ctx, device_param->metal_command_queue, device_param->metal_d_tmps, 0, device_param->h_tmps, hashconfig->tmp_size) == -1) return -1; + } + #endif + + if (device_param->is_opencl == true) + { + if (hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->opencl_command_queue, device_param->opencl_d_tmps, CL_TRUE, 0, hashconfig->tmp_size, device_param->h_tmps, 0, NULL, NULL) == -1) return -1; + } + } + } } } } @@ -750,26 +904,29 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (hashconfig->opts_type & OPTS_TYPE_AUX1) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX1, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX1, 0, 1, false, 0, false) == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_AUX2) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX2, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX2, 0, 1, false, 0, false) == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_AUX3) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX3, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX3, 0, 1, false, 0, false) == -1) return -1; } if (hashconfig->opts_type & OPTS_TYPE_AUX4) { - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX4, 0, 1, false, 0) == -1) return -1; + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_AUX4, 0, 1, false, 0, false) == -1) return -1; } } - if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 0, 1, false, 0) == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_COMP) + { + if (run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 0, 1, false, 0, false) == -1) return -1; + } } device_param->spin_damp = spin_damp_sav; @@ -1041,8 +1198,10 @@ HC_API_CALL void *thread_selftest (void *p) thread_param_t *thread_param = (thread_param_t *) p; hashcat_ctx_t *hashcat_ctx = thread_param->hashcat_ctx; - backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; + bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; + hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + hashes_t *hashes = hashcat_ctx->hashes; if (backend_ctx->enabled == false) return NULL; @@ -1055,6 +1214,14 @@ HC_API_CALL void *thread_selftest (void *p) if (device_param->skipped == true) return NULL; if (device_param->skipped_warning == true) return NULL; + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_init != BRIDGE_DEFAULT) + { + if (bridge_ctx->thread_init (bridge_ctx->platform_context, device_param, hashconfig, hashes) == false) return NULL; + } + } + if (device_param->is_cuda == true) { if (hc_cuCtxPushCurrent (hashcat_ctx, device_param->cuda_context) == -1) return NULL; @@ -1097,6 +1264,14 @@ HC_API_CALL void *thread_selftest (void *p) if (hc_hipCtxPopCurrent (hashcat_ctx, &device_param->hip_context) == -1) return NULL; } + if (bridge_ctx->enabled == true) + { + if (bridge_ctx->thread_term != BRIDGE_DEFAULT) + { + bridge_ctx->thread_term (bridge_ctx->platform_context, device_param, hashconfig, hashes); + } + } + if (device_param->is_opencl == true) { if (hc_clFinish (hashcat_ctx, device_param->opencl_command_queue) == -1) return NULL; diff --git a/src/shared.c b/src/shared.c index f738cec83..25bbf5005 100644 --- a/src/shared.c +++ b/src/shared.c @@ -17,12 +17,20 @@ #if defined (__APPLE__) #include +#include #endif #if defined (_WIN) #include #endif +#if defined (_POSIX) +#include +#if !defined (__APPLE__) +#include +#endif +#endif + static const char *const PA_000 = "OK"; static const char *const PA_001 = "Ignored due to comment"; static const char *const PA_002 = "Ignored due to zero length"; @@ -549,7 +557,7 @@ bool hc_string_is_digit (const char *s) return true; } -void setup_environment_variables (const folder_config_t *folder_config) +void setup_environment_variables (const folder_config_t *folder_config, const user_options_t *user_options) { char *compute = getenv ("COMPUTE"); @@ -591,6 +599,14 @@ void setup_environment_variables (const folder_config_t *folder_config) // we can't free tmpdir at this point! } + // creates too much cpu load + if (getenv ("AMD_DIRECT_DISPATCH") == NULL) + putenv ((char *) "AMD_DIRECT_DISPATCH=0"); + + if (user_options->hash_mode == 72000) // ugly but rare hack, we might move this to modules at a later stage + if (getenv ("PYTHON_GIL") == NULL) + putenv ((char *) "PYTHON_GIL=0"); + /* if (getenv ("CL_CONFIG_USE_VECTORIZER") == NULL) putenv ((char *) "CL_CONFIG_USE_VECTORIZER=False"); @@ -1447,6 +1463,38 @@ int generic_salt_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, const u8 * return tmp_len; } +int get_current_arch () +{ + #if defined (_WIN) + + SYSTEM_INFO sysinfo; + + GetNativeSystemInfo (&sysinfo); + + switch (sysinfo.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: return 1; + case PROCESSOR_ARCHITECTURE_INTEL: return 2; + case PROCESSOR_ARCHITECTURE_ARM64: return 3; + case PROCESSOR_ARCHITECTURE_ARM: return 4; + default: return 0; + } + + #else + + struct utsname uts; + + if (uname(&uts) != 0) return 0; // same as default, it doesn't matter if it fails here + + if (strstr(uts.machine, "x86_64")) return 1; + else if (strstr(uts.machine, "i386") || strstr(uts.machine, "i686")) return 2; + else if (strstr(uts.machine, "aarch64") || strstr(uts.machine, "arm64")) return 3; + else if (strstr(uts.machine, "arm")) return 4; + else return 0; + + #endif +} + #if defined (__APPLE__) bool is_apple_silicon (void) @@ -1508,3 +1556,157 @@ int extract_dynamicx_hash (const u8 *input_buf, const int input_len, u8 **output return hash_mode; } + +bool check_file_suffix (const char *file, const char *suffix) +{ + if (file == NULL) return false; + if (suffix == NULL) return false; + + const size_t len_file = strlen (file); + const size_t len_suffix = strlen (suffix); + + if (len_suffix > len_file) return false; + + return strcmp (file + len_file - len_suffix, suffix) == 0; +} + +bool remove_file_suffix (char *file, const char *suffix) +{ + if (file == NULL) return false; + if (suffix == NULL) return false; + + if (check_file_suffix (file, suffix) == false) return false; + + const size_t len_file = strlen (file); + const size_t len_suffix = strlen (suffix); + + file[len_file - len_suffix] = 0; + + return true; +} + +#if defined (_WIN) +#define DEVNULL "NUL" +#else +#define DEVNULL "/dev/null" +#endif + +int suppress_stderr (void) +{ + int null_fd = open (DEVNULL, O_WRONLY); + + if (null_fd < 0) return -1; + + int saved_fd = dup (fileno (stderr)); + + if (saved_fd < 0) + { + close (null_fd); + + return -1; + } + + dup2 (null_fd, fileno (stderr)); + + close (null_fd); + + return saved_fd; +} + +void restore_stderr (int saved_fd) +{ + if (saved_fd < 0) return; + + dup2 (saved_fd, fileno (stderr)); + + close (saved_fd); +} + +bool get_free_memory (u64 *free_mem) +{ + #if defined (_WIN) + + MEMORYSTATUSEX memStatus; + + memStatus.dwLength = sizeof (memStatus); + + if (GlobalMemoryStatusEx (&memStatus)) + { + *free_mem = (u64) memStatus.ullAvailPhys; + + return true; + } + else + { + return false; + } + + #elif defined (__APPLE__) + + mach_port_t host_port = mach_host_self (); + + mach_msg_type_number_t count = HOST_VM_INFO_COUNT; + + vm_statistics_data_t vm_stat; + + if (host_statistics (host_port, HOST_VM_INFO, (host_info_t) &vm_stat, &count) != KERN_SUCCESS) + { + return false; + } + + int64_t page_size; + + host_page_size (host_port, (vm_size_t*) &page_size); + + *free_mem = (u64) (vm_stat.free_count + vm_stat.inactive_count) * page_size; + + return true; + + #else + + struct sysinfo info; + + if (sysinfo (&info) != 0) return false; + + *free_mem = (u64) info.freeram * info.mem_unit; + + return true; + + #endif +} + +u32 previous_power_of_two (const u32 x) +{ + // https://stackoverflow.com/questions/2679815/previous-power-of-2 + // really cool! + + if (x == 0) return 0; + + u32 r = x; + + r |= (r >> 1); + r |= (r >> 2); + r |= (r >> 4); + r |= (r >> 8); + r |= (r >> 16); + + return r - (r >> 1); +} + +u32 next_power_of_two (const u32 x) +{ + if (x == 0) return 1; + + u32 r = x - 1; + + r |= (r >> 1); + r |= (r >> 2); + r |= (r >> 4); + r |= (r >> 8); + r |= (r >> 16); + + r++; + + return r; +} + diff --git a/src/terminal.c b/src/terminal.c index d87faed19..948b4795d 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -101,6 +101,11 @@ void welcome_screen (hashcat_ctx_t *hashcat_ctx, const char *version_tag) event_log_info (hashcat_ctx, "%s (%s) starting in hash-info mode", PROGNAME, version_tag); event_log_info (hashcat_ctx, NULL); } + else if (user_options->session_chgd == true) + { + event_log_info (hashcat_ctx, "%s (%s) starting - session [%s]", PROGNAME, version_tag, user_options->session); + event_log_info (hashcat_ctx, NULL); + } else { event_log_info (hashcat_ctx, "%s (%s) starting", PROGNAME, version_tag); @@ -1179,11 +1184,11 @@ void backend_info (hashcat_ctx_t *hashcat_ctx) if (device_param->device_id_alias_cnt) { - event_log_info (hashcat_ctx, "Backend Device ID #%u (Alias: #%u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u (Alias: #%02u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); } else { - event_log_info (hashcat_ctx, "Backend Device ID #%u", device_id + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u", device_id + 1); } event_log_info (hashcat_ctx, " Name...........: %s", device_name); @@ -1241,11 +1246,11 @@ void backend_info (hashcat_ctx_t *hashcat_ctx) if (device_param->device_id_alias_cnt) { - event_log_info (hashcat_ctx, "Backend Device ID #%u (Alias: #%u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u (Alias: #%02u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); } else { - event_log_info (hashcat_ctx, "Backend Device ID #%u", device_id + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u", device_id + 1); } event_log_info (hashcat_ctx, " Name...........: %s", device_name); @@ -1305,11 +1310,11 @@ void backend_info (hashcat_ctx_t *hashcat_ctx) if (device_param->device_id_alias_cnt) { - event_log_info (hashcat_ctx, "Backend Device ID #%u (Alias: #%u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u (Alias: #%02u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); } else { - event_log_info (hashcat_ctx, "Backend Device ID #%u", device_id + 1); + event_log_info (hashcat_ctx, "Backend Device ID #%02u", device_id + 1); } event_log_info (hashcat_ctx, " Type...........: %s", ((opencl_device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((opencl_device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator"))); @@ -1407,11 +1412,11 @@ void backend_info (hashcat_ctx_t *hashcat_ctx) if (device_param->device_id_alias_cnt) { - event_log_info (hashcat_ctx, " Backend Device ID #%u (Alias: #%u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); + event_log_info (hashcat_ctx, " Backend Device ID #%02u (Alias: #%02u)", device_id + 1, device_param->device_id_alias_buf[0] + 1); } else { - event_log_info (hashcat_ctx, " Backend Device ID #%u", device_id + 1); + event_log_info (hashcat_ctx, " Backend Device ID #%02u", device_id + 1); } event_log_info (hashcat_ctx, " Type...........: %s", ((opencl_device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((opencl_device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator"))); @@ -1452,6 +1457,7 @@ void backend_info (hashcat_ctx_t *hashcat_ctx) void backend_info_compact (hashcat_ctx_t *hashcat_ctx) { + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; const backend_ctx_t *backend_ctx = hashcat_ctx->backend_ctx; const user_options_t *user_options = hashcat_ctx->user_options; @@ -1459,6 +1465,53 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx) if (user_options->machine_readable == true) return; if (user_options->status_json == true) return; + /** + * Bridges + */ + + if (bridge_ctx->enabled == true) + { + const int unit_count = bridge_ctx->get_unit_count (bridge_ctx->platform_context); + + const size_t len = event_log_info (hashcat_ctx, "Assimilation Bridge"); + + char line[HCBUFSIZ_TINY] = { 0 }; + + memset (line, '=', len); + + line[len] = 0; + + event_log_info (hashcat_ctx, "%s", line); + + bool all_same = true; + + char *tmp = bridge_ctx->get_unit_info (bridge_ctx->platform_context, 0); + + for (int i = 1; i < unit_count; i++) + { + if (strcmp (tmp, bridge_ctx->get_unit_info (bridge_ctx->platform_context, i))) + { + all_same = false; + + break; + } + } + + if (all_same == true) + { + event_log_info (hashcat_ctx, "* Unit #%02d -> #%02d: %s", 1, unit_count, tmp); + } + else + { + for (int i = 0; i < unit_count; i++) + { + event_log_info (hashcat_ctx, "* Unit #%02d: %s", i + 1, bridge_ctx->get_unit_info (bridge_ctx->platform_context, i)); + } + } + + event_log_info (hashcat_ctx, NULL); + } + /** * CUDA */ @@ -1468,46 +1521,83 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx) int cuda_devices_cnt = backend_ctx->cuda_devices_cnt; int cuda_driver_version = backend_ctx->cuda_driver_version; - const size_t len = event_log_info (hashcat_ctx, "CUDA API (CUDA %u.%u)", cuda_driver_version / 1000, (cuda_driver_version % 100) / 10); - - char line[HCBUFSIZ_TINY] = { 0 }; - - memset (line, '=', len); - - line[len] = 0; - - event_log_info (hashcat_ctx, "%s", line); - - for (int cuda_devices_idx = 0; cuda_devices_idx < cuda_devices_cnt; cuda_devices_idx++) + // hide empty CUDA platforms + if (cuda_devices_cnt) { - const int backend_devices_idx = backend_ctx->backend_device_from_cuda[cuda_devices_idx]; + const size_t len = event_log_info (hashcat_ctx, "CUDA API (CUDA %u.%u)", cuda_driver_version / 1000, (cuda_driver_version % 100) / 10); - const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + char line[HCBUFSIZ_TINY] = { 0 }; - int device_id = device_param->device_id; - char *device_name = device_param->device_name; - u32 device_processors = device_param->device_processors; - u64 device_global_mem = device_param->device_global_mem; - u64 device_available_mem = device_param->device_available_mem; + memset (line, '=', len); - if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + line[len] = 0; + + event_log_info (hashcat_ctx, "%s", line); + + if (bridge_ctx->enabled == true) { - event_log_info (hashcat_ctx, "* Device #%u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", - device_id + 1, - device_name, - device_available_mem / 1024 / 1024, - device_global_mem / 1024 / 1024, - device_processors); + const int unit_count = bridge_ctx->get_unit_count (bridge_ctx->platform_context); + + const int backend_devices_idx = backend_ctx->backend_device_from_cuda[0]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, unit_count, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, skipped", + device_id + 1, unit_count, + device_name); + } } else { - event_log_info (hashcat_ctx, "* Device #%u: %s, skipped", - device_id + 1, - device_name); - } - } + for (int cuda_devices_idx = 0; cuda_devices_idx < cuda_devices_cnt; cuda_devices_idx++) + { + const int backend_devices_idx = backend_ctx->backend_device_from_cuda[cuda_devices_idx]; - event_log_info (hashcat_ctx, NULL); + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, skipped", + device_id + 1, + device_name); + } + } + } + + event_log_info (hashcat_ctx, NULL); + } } /** @@ -1519,59 +1609,96 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx) int hip_devices_cnt = backend_ctx->hip_devices_cnt; int hip_runtimeVersion = backend_ctx->hip_runtimeVersion; - size_t len; - - if (hip_runtimeVersion > 1000) + // hide empty HIP platforms + if (hip_devices_cnt) { - int hip_version_major = (hip_runtimeVersion - 0) / 10000000; - int hip_version_minor = (hip_runtimeVersion - (hip_version_major * 10000000)) / 100000; - int hip_version_patch = (hip_runtimeVersion - (hip_version_major * 10000000) - (hip_version_minor * 100000)); + size_t len; - len = event_log_info (hashcat_ctx, "HIP API (HIP %u.%u.%u)", hip_version_major, hip_version_minor, hip_version_patch); - } - else - { - len = event_log_info (hashcat_ctx, "HIP API (HIP %u.%u)", hip_runtimeVersion / 100, hip_runtimeVersion % 10); - } - - char line[HCBUFSIZ_TINY] = { 0 }; - - memset (line, '=', len); - - line[len] = 0; - - event_log_info (hashcat_ctx, "%s", line); - - for (int hip_devices_idx = 0; hip_devices_idx < hip_devices_cnt; hip_devices_idx++) - { - const int backend_devices_idx = backend_ctx->backend_device_from_hip[hip_devices_idx]; - - const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; - - int device_id = device_param->device_id; - char *device_name = device_param->device_name; - u32 device_processors = device_param->device_processors; - u64 device_global_mem = device_param->device_global_mem; - u64 device_available_mem = device_param->device_available_mem; - - if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + if (hip_runtimeVersion > 1000) { - event_log_info (hashcat_ctx, "* Device #%u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", - device_id + 1, - device_name, - device_available_mem / 1024 / 1024, - device_global_mem / 1024 / 1024, - device_processors); + int hip_version_major = (hip_runtimeVersion - 0) / 10000000; + int hip_version_minor = (hip_runtimeVersion - (hip_version_major * 10000000)) / 100000; + int hip_version_patch = (hip_runtimeVersion - (hip_version_major * 10000000) - (hip_version_minor * 100000)); + + len = event_log_info (hashcat_ctx, "HIP API (HIP %u.%u.%u)", hip_version_major, hip_version_minor, hip_version_patch); } else { - event_log_info (hashcat_ctx, "* Device #%u: %s, skipped", - device_id + 1, - device_name); + len = event_log_info (hashcat_ctx, "HIP API (HIP %u.%u)", hip_runtimeVersion / 100, hip_runtimeVersion % 10); } - } - event_log_info (hashcat_ctx, NULL); + char line[HCBUFSIZ_TINY] = { 0 }; + + memset (line, '=', len); + + line[len] = 0; + + event_log_info (hashcat_ctx, "%s", line); + + if (bridge_ctx->enabled == true) + { + const int unit_count = bridge_ctx->get_unit_count (bridge_ctx->platform_context); + + const int backend_devices_idx = backend_ctx->backend_device_from_hip[0]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, unit_count, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, skipped", + device_id + 1, unit_count, + device_name); + } + } + else + { + for (int hip_devices_idx = 0; hip_devices_idx < hip_devices_cnt; hip_devices_idx++) + { + const int backend_devices_idx = backend_ctx->backend_device_from_hip[hip_devices_idx]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, skipped", + device_id + 1, + device_name); + } + } + } + + event_log_info (hashcat_ctx, NULL); + } } #if defined (__APPLE__) @@ -1581,50 +1708,88 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx) if (backend_ctx->mtl) { - int metal_devices_cnt = backend_ctx->metal_devices_cnt; + int metal_devices_cnt = backend_ctx->metal_devices_cnt; - char *metal_runtimeVersionStr = backend_ctx->metal_runtimeVersionStr; - - size_t len = event_log_info (hashcat_ctx, "METAL API (Metal %s)", metal_runtimeVersionStr); - - char line[HCBUFSIZ_TINY] = { 0 }; - - memset (line, '=', len); - - line[len] = 0; - - event_log_info (hashcat_ctx, "%s", line); - - for (int metal_devices_idx = 0; metal_devices_idx < metal_devices_cnt; metal_devices_idx++) + // hide empty Metal platforms + if (metal_devices_cnt) { - const int backend_devices_idx = backend_ctx->backend_device_from_metal[metal_devices_idx]; + char *metal_runtimeVersionStr = backend_ctx->metal_runtimeVersionStr; - const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + size_t len = event_log_info (hashcat_ctx, "METAL API (Metal %s)", metal_runtimeVersionStr); - int device_id = device_param->device_id; - char *device_name = device_param->device_name; - u32 device_processors = device_param->device_processors; - u64 device_global_mem = device_param->device_global_mem; - u64 device_available_mem = device_param->device_available_mem; + char line[HCBUFSIZ_TINY] = { 0 }; - if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + memset (line, '=', len); + + line[len] = 0; + + event_log_info (hashcat_ctx, "%s", line); + + if (bridge_ctx->enabled == true) { - event_log_info (hashcat_ctx, "* Device #%u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", - device_id + 1, - device_name, - device_available_mem / 1024 / 1024, - device_global_mem / 1024 / 1024, - device_processors); + const int unit_count = bridge_ctx->get_unit_count (bridge_ctx->platform_context); + + const int backend_devices_idx = backend_ctx->backend_device_from_metal[0]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, unit_count, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, skipped", + device_id + 1, unit_count, + device_name); + } + } else { - event_log_info (hashcat_ctx, "* Device #%u: %s, skipped", - device_id + 1, - device_name); - } - } + for (int metal_devices_idx = 0; metal_devices_idx < metal_devices_cnt; metal_devices_idx++) + { + const int backend_devices_idx = backend_ctx->backend_device_from_metal[metal_devices_idx]; - event_log_info (hashcat_ctx, NULL); + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, %" PRIu64 "/%" PRIu64 " MB, %uMCU", + device_id + 1, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, skipped", + device_id + 1, + device_name); + } + } + } + + event_log_info (hashcat_ctx, NULL); + } } #endif @@ -1658,52 +1823,110 @@ void backend_info_compact (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "%s", line); - for (cl_uint opencl_platform_devices_idx = 0; opencl_platform_devices_idx < opencl_platform_devices_cnt; opencl_platform_devices_idx++) + if (bridge_ctx->enabled == true) { - const int backend_devices_idx = backend_ctx->backend_device_from_opencl_platform[opencl_platforms_idx][opencl_platform_devices_idx]; + const int unit_count = bridge_ctx->get_unit_count (bridge_ctx->platform_context); - const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; - - int device_id = device_param->device_id; - char *device_name = device_param->device_name; - u32 device_processors = device_param->device_processors; - u64 device_maxmem_alloc = device_param->device_maxmem_alloc; - u64 device_global_mem = device_param->device_global_mem; - u64 device_available_mem = device_param->device_available_mem; - - if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + for (cl_uint opencl_platform_devices_idx = 0; opencl_platform_devices_idx < opencl_platform_devices_cnt; opencl_platform_devices_idx++) { - if (strncmp (device_name, "Apple M", 7) == 0) + const int backend_devices_idx = backend_ctx->backend_device_from_opencl_platform[opencl_platforms_idx][opencl_platform_devices_idx]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_maxmem_alloc = device_param->device_maxmem_alloc; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) { - cl_device_type opencl_device_type = device_param->opencl_device_type; + if (strncmp (device_name, "Apple M", 7) == 0) + { + cl_device_type opencl_device_type = device_param->opencl_device_type; - const char *device_type_desc = ((opencl_device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((opencl_device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator")); + const char *device_type_desc = ((opencl_device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((opencl_device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator")); - event_log_info (hashcat_ctx, "* Device #%u: %s, %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", - device_id + 1, - device_name, - device_type_desc, - device_available_mem / 1024 / 1024, - device_global_mem / 1024 / 1024, - device_maxmem_alloc / 1024 / 1024, - device_processors); + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", + device_id + 1, unit_count, + device_name, + device_type_desc, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_maxmem_alloc / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", + device_id + 1, unit_count, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_maxmem_alloc / 1024 / 1024, + device_processors); + } + + break; } else { - event_log_info (hashcat_ctx, "* Device #%u: %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", - device_id + 1, - device_name, - device_available_mem / 1024 / 1024, - device_global_mem / 1024 / 1024, - device_maxmem_alloc / 1024 / 1024, - device_processors); + event_log_info (hashcat_ctx, "* Device #%02u -> #%02u: %s, skipped", + device_id + 1, unit_count, + device_name); } } - else + } + else + { + for (cl_uint opencl_platform_devices_idx = 0; opencl_platform_devices_idx < opencl_platform_devices_cnt; opencl_platform_devices_idx++) { - event_log_info (hashcat_ctx, "* Device #%u: %s, skipped", - device_id + 1, - device_name); + const int backend_devices_idx = backend_ctx->backend_device_from_opencl_platform[opencl_platforms_idx][opencl_platform_devices_idx]; + + const hc_device_param_t *device_param = backend_ctx->devices_param + backend_devices_idx; + + int device_id = device_param->device_id; + char *device_name = device_param->device_name; + u32 device_processors = device_param->device_processors; + u64 device_maxmem_alloc = device_param->device_maxmem_alloc; + u64 device_global_mem = device_param->device_global_mem; + u64 device_available_mem = device_param->device_available_mem; + + if ((device_param->skipped == false) && (device_param->skipped_warning == false)) + { + if (strncmp (device_name, "Apple M", 7) == 0) + { + cl_device_type opencl_device_type = device_param->opencl_device_type; + + const char *device_type_desc = ((opencl_device_type & CL_DEVICE_TYPE_CPU) ? "CPU" : ((opencl_device_type & CL_DEVICE_TYPE_GPU) ? "GPU" : "Accelerator")); + + event_log_info (hashcat_ctx, "* Device #%02u: %s, %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", + device_id + 1, + device_name, + device_type_desc, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_maxmem_alloc / 1024 / 1024, + device_processors); + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, %" PRIu64 "/%" PRIu64 " MB (%" PRIu64 " MB allocatable), %uMCU", + device_id + 1, + device_name, + device_available_mem / 1024 / 1024, + device_global_mem / 1024 / 1024, + device_maxmem_alloc / 1024 / 1024, + device_processors); + } + } + else + { + event_log_info (hashcat_ctx, "* Device #%02u: %s, skipped", + device_id + 1, + device_name); + } } } @@ -1924,7 +2147,7 @@ void status_display_status_json (hashcat_ctx_t *hashcat_ctx) printf (","); } - printf (" { \"device_id\": %u,", device_id + 1); + printf (" { \"device_id\": %02u,", device_id + 1); char *device_name_json_encoded = (char *) hcmalloc (strlen (device_info->device_name) * 2); @@ -1970,6 +2193,7 @@ void status_display_status_json (hashcat_ctx_t *hashcat_ctx) void status_display (hashcat_ctx_t *hashcat_ctx) { + const bridge_ctx_t *bridge_ctx = hashcat_ctx->bridge_ctx; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; const hwmon_ctx_t *hwmon_ctx = hashcat_ctx->hwmon_ctx; const user_options_t *user_options = hashcat_ctx->user_options; @@ -2359,21 +2583,40 @@ void status_display (hashcat_ctx_t *hashcat_ctx) break; } - for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + if (bridge_ctx->enabled == true) { - const device_info_t *device_info = hashcat_status->device_info_buf + device_id; + if (hashcat_status->device_info_cnt == 1) + { + const device_info_t *device_info0 = hashcat_status->device_info_buf + 0; - if (device_info->skipped_dev == true) continue; - if (device_info->skipped_warning_dev == true) continue; + event_log_info (hashcat_ctx, + "Speed.#%02u........: %9sH/s (%0.2fms) @ Accel:%u Loops:%u Thr:%u Vec:%u", 0 + 1, + device_info0->speed_sec_dev, + device_info0->exec_msec_dev, + device_info0->kernel_accel_dev, + device_info0->kernel_loops_dev, + device_info0->kernel_threads_dev, + device_info0->vector_width_dev); + } + } + else + { + for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + { + const device_info_t *device_info = hashcat_status->device_info_buf + device_id; - event_log_info (hashcat_ctx, - "Speed.#%u.........: %9sH/s (%0.2fms) @ Accel:%u Loops:%u Thr:%u Vec:%u", device_id + 1, - device_info->speed_sec_dev, - device_info->exec_msec_dev, - device_info->kernel_accel_dev, - device_info->kernel_loops_dev, - device_info->kernel_threads_dev, - device_info->vector_width_dev); + if (device_info->skipped_dev == true) continue; + if (device_info->skipped_warning_dev == true) continue; + + event_log_info (hashcat_ctx, + "Speed.#%02u........: %9sH/s (%0.2fms) @ Accel:%u Loops:%u Thr:%u Vec:%u", device_id + 1, + device_info->speed_sec_dev, + device_info->exec_msec_dev, + device_info->kernel_accel_dev, + device_info->kernel_loops_dev, + device_info->kernel_threads_dev, + device_info->vector_width_dev); + } } if (hashcat_status->device_info_active > 1) @@ -2491,7 +2734,7 @@ void status_display (hashcat_ctx_t *hashcat_ctx) if (device_info->brain_link_status_dev == BRAIN_LINK_STATUS_CONNECTED) { event_log_info (hashcat_ctx, - "Brain.Link.#%u....: RX: %sB (%sbps), TX: %sB (%sbps), idle", device_id + 1, + "Brain.Link.#%02u...: RX: %sB (%sbps), TX: %sB (%sbps), idle", device_id + 1, device_info->brain_link_recv_bytes_dev, device_info->brain_link_recv_bytes_sec_dev, device_info->brain_link_send_bytes_dev, @@ -2500,7 +2743,7 @@ void status_display (hashcat_ctx_t *hashcat_ctx) else if (device_info->brain_link_status_dev == BRAIN_LINK_STATUS_RECEIVING) { event_log_info (hashcat_ctx, - "Brain.Link.#%u....: RX: %sB (%sbps), TX: %sB (%sbps), receiving", device_id + 1, + "Brain.Link.#%02u...: RX: %sB (%sbps), TX: %sB (%sbps), receiving", device_id + 1, device_info->brain_link_recv_bytes_dev, device_info->brain_link_recv_bytes_sec_dev, device_info->brain_link_send_bytes_dev, @@ -2509,7 +2752,7 @@ void status_display (hashcat_ctx_t *hashcat_ctx) else if (device_info->brain_link_status_dev == BRAIN_LINK_STATUS_SENDING) { event_log_info (hashcat_ctx, - "Brain.Link.#%u....: RX: %sB (%sbps), TX: %sB (%sbps), sending", device_id + 1, + "Brain.Link.#%02u...: RX: %sB (%sbps), TX: %sB (%sbps), sending", device_id + 1, device_info->brain_link_recv_bytes_dev, device_info->brain_link_recv_bytes_sec_dev, device_info->brain_link_send_bytes_dev, @@ -2520,7 +2763,7 @@ void status_display (hashcat_ctx_t *hashcat_ctx) if ((device_info->brain_link_time_recv_dev > 0) && (device_info->brain_link_time_send_dev > 0)) { event_log_info (hashcat_ctx, - "Brain.Link.#%u....: RX: %sB (%sbps), TX: %sB (%sbps)", device_id + 1, + "Brain.Link.#%02u...: RX: %sB (%sbps), TX: %sB (%sbps)", device_id + 1, device_info->brain_link_recv_bytes_dev, device_info->brain_link_recv_bytes_sec_dev, device_info->brain_link_send_bytes_dev, @@ -2529,7 +2772,7 @@ void status_display (hashcat_ctx_t *hashcat_ctx) else { event_log_info (hashcat_ctx, - "Brain.Link.#%u....: N/A", device_id + 1); + "Brain.Link.#%02u...: N/A", device_id + 1); } } } @@ -2557,21 +2800,36 @@ void status_display (hashcat_ctx_t *hashcat_ctx) break; } - for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + if (bridge_ctx->enabled == true) { - const device_info_t *device_info = hashcat_status->device_info_buf + device_id; - - if (device_info->skipped_dev == true) continue; - if (device_info->skipped_warning_dev == true) continue; + const device_info_t *device_info = hashcat_status->device_info_buf + 0; event_log_info (hashcat_ctx, - "Restore.Sub.#%u...: Salt:%u Amplifier:%u-%u Iteration:%u-%u", device_id + 1, + "Restore.Sub.#%02u..: Salt:%u Amplifier:%u-%u Iteration:%u-%u", 0 + 1, device_info->salt_pos_dev, device_info->innerloop_pos_dev, device_info->innerloop_pos_dev + device_info->innerloop_left_dev, device_info->iteration_pos_dev, device_info->iteration_pos_dev + device_info->iteration_left_dev); } + else + { + for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + { + const device_info_t *device_info = hashcat_status->device_info_buf + device_id; + + if (device_info->skipped_dev == true) continue; + if (device_info->skipped_warning_dev == true) continue; + + event_log_info (hashcat_ctx, + "Restore.Sub.#%02u..: Salt:%u Amplifier:%u-%u Iteration:%u-%u", device_id + 1, + device_info->salt_pos_dev, + device_info->innerloop_pos_dev, + device_info->innerloop_pos_dev + device_info->innerloop_left_dev, + device_info->iteration_pos_dev, + device_info->iteration_pos_dev + device_info->iteration_left_dev); + } + } //if (hashconfig->opts_type & OPTS_TYPE_SLOW_CANDIDATES) if (user_options->slow_candidates == true) @@ -2583,18 +2841,32 @@ void status_display (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "Candidate.Engine.: Device Generator"); } - for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + if (bridge_ctx->enabled == true) { - const device_info_t *device_info = hashcat_status->device_info_buf + device_id; + const device_info_t *device_info = hashcat_status->device_info_buf + 0; - if (device_info->skipped_dev == true) continue; - if (device_info->skipped_warning_dev == true) continue; + if (device_info->guess_candidates_dev) + { + event_log_info (hashcat_ctx, + "Candidates.#%02u...: %s", 0 + 1, + device_info->guess_candidates_dev); + } + } + else + { + for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + { + const device_info_t *device_info = hashcat_status->device_info_buf + device_id; - if (device_info->guess_candidates_dev == NULL) continue; + if (device_info->skipped_dev == true) continue; + if (device_info->skipped_warning_dev == true) continue; - event_log_info (hashcat_ctx, - "Candidates.#%u....: %s", device_id + 1, - device_info->guess_candidates_dev); + if (device_info->guess_candidates_dev == NULL) continue; + + event_log_info (hashcat_ctx, + "Candidates.#%02u...: %s", device_id + 1, + device_info->guess_candidates_dev); + } } if (hwmon_ctx->enabled == true) @@ -2603,26 +2875,48 @@ void status_display (hashcat_ctx_t *hashcat_ctx) bool first_dev = true; #endif - for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + if (bridge_ctx->enabled == true) { - const device_info_t *device_info = hashcat_status->device_info_buf + device_id; + const device_info_t *device_info = hashcat_status->device_info_buf + 0; - if (device_info->skipped_dev == true) continue; - if (device_info->skipped_warning_dev == true) continue; - - if (device_info->hwmon_dev == NULL) continue; - - #if defined(__APPLE__) - if (first_dev && strlen (device_info->hwmon_fan_dev) > 0) + if (device_info->hwmon_dev) { - event_log_info (hashcat_ctx, "Hardware.Mon.SMC.: %s", device_info->hwmon_fan_dev); - first_dev = false; - } - #endif + #if defined(__APPLE__) + if (first_dev && strlen (device_info->hwmon_fan_dev) > 0) + { + event_log_info (hashcat_ctx, "Hardware.Mon.SMC.: %s", device_info->hwmon_fan_dev); + first_dev = false; + } + #endif - event_log_info (hashcat_ctx, - "Hardware.Mon.#%u..: %s", device_id + 1, - device_info->hwmon_dev); + event_log_info (hashcat_ctx, + "Hardware.Mon.#%02u.: %s", 0 + 1, + device_info->hwmon_dev); + } + } + else + { + for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + { + const device_info_t *device_info = hashcat_status->device_info_buf + device_id; + + if (device_info->skipped_dev == true) continue; + if (device_info->skipped_warning_dev == true) continue; + + if (device_info->hwmon_dev == NULL) continue; + + #if defined(__APPLE__) + if (first_dev && strlen (device_info->hwmon_fan_dev) > 0) + { + event_log_info (hashcat_ctx, "Hardware.Mon.SMC.: %s", device_info->hwmon_fan_dev); + first_dev = false; + } + #endif + + event_log_info (hashcat_ctx, + "Hardware.Mon.#%02u.: %s", device_id + 1, + device_info->hwmon_dev); + } } } @@ -2689,7 +2983,7 @@ void status_benchmark (hashcat_ctx_t *hashcat_ctx) if (device_info->skipped_warning_dev == true) continue; event_log_info (hashcat_ctx, - "Speed.#%u.........: %9sH/s (%0.2fms) @ Accel:%u Loops:%u Thr:%u Vec:%u", device_id + 1, + "Speed.#%02u........: %9sH/s (%0.2fms) @ Accel:%u Loops:%u Thr:%u Vec:%u", device_id + 1, device_info->speed_sec_dev, device_info->exec_msec_dev, device_info->kernel_accel_dev, @@ -2810,7 +3104,7 @@ void status_speed (hashcat_ctx_t *hashcat_ctx) if (device_info->skipped_warning_dev == true) continue; event_log_info (hashcat_ctx, - "Speed.#%u.........: %9sH/s (%0.2fms)", device_id + 1, + "Speed.#%02u........: %9sH/s (%0.2fms)", device_id + 1, device_info->speed_sec_dev, device_info->exec_msec_dev); } @@ -2928,7 +3222,7 @@ void status_progress (hashcat_ctx_t *hashcat_ctx) if (device_info->skipped_warning_dev == true) continue; event_log_info (hashcat_ctx, - "Progress.#%u......: %" PRIu64, device_id + 1, + "Progress.#%02u.....: %" PRIu64, device_id + 1, device_info->progress_dev); } @@ -2940,7 +3234,7 @@ void status_progress (hashcat_ctx_t *hashcat_ctx) if (device_info->skipped_warning_dev == true) continue; event_log_info (hashcat_ctx, - "Runtime.#%u.......: %0.2fms", device_id + 1, + "Runtime.#%02u......: %0.2fms", device_id + 1, device_info->runtime_msec_dev); } diff --git a/src/tuningdb.c b/src/tuningdb.c index 2f983b31e..41d3795aa 100644 --- a/src/tuningdb.c +++ b/src/tuningdb.c @@ -72,6 +72,8 @@ int tuning_db_init (hashcat_ctx_t *hashcat_ctx) char **tuning_db_files = scan_directory (tuning_db_folder); + hcfree (tuning_db_folder); + for (int i = 0; tuning_db_files[i] != NULL; i++) { char *tuning_db_file = tuning_db_files[i]; @@ -80,9 +82,19 @@ int tuning_db_init (hashcat_ctx_t *hashcat_ctx) const size_t dblen = strlen (tuning_db_file); - if (dblen < suflen) continue; // make sure to not do any out-of-boundary reads + if (dblen < suflen) + { + hcfree (tuning_db_file); - if (memcmp (tuning_db_file + dblen - suflen, TUNING_DB_SUFFIX, suflen) != 0) continue; + continue; // make sure to not do any out-of-boundary reads + } + + if (memcmp (tuning_db_file + dblen - suflen, TUNING_DB_SUFFIX, suflen) != 0) + { + hcfree (tuning_db_file); + + continue; + } HCFILE fp; @@ -90,6 +102,8 @@ int tuning_db_init (hashcat_ctx_t *hashcat_ctx) { event_log_error (hashcat_ctx, "%s: %s", tuning_db_file, strerror (errno)); + for (int j = 0; tuning_db_files[j] != NULL; j++) hcfree (tuning_db_files[j]); + return -1; } @@ -365,7 +379,7 @@ bool tuning_db_process_line (hashcat_ctx_t *hashcat_ctx, const char *line_buf, c return true; } -tuning_db_entry_t *tuning_db_search_real (hashcat_ctx_t *hashcat_ctx, const char *device_name, const cl_device_type device_type, int attack_mode, const int hash_mode) +static tuning_db_entry_t *tuning_db_search_real (hashcat_ctx_t *hashcat_ctx, const char *device_name, const cl_device_type device_type, int attack_mode, const int hash_mode) { tuning_db_t *tuning_db = hashcat_ctx->tuning_db; @@ -501,5 +515,7 @@ tuning_db_entry_t *tuning_db_search (hashcat_ctx_t *hashcat_ctx, const char *dev entry = tuning_db_search_real (hashcat_ctx, device_name, device_type, attack_mode, hash_mode); - return entry; + if (entry) return entry; + + return NULL; } diff --git a/src/usage.c b/src/usage.c index 870c790d0..01cb31bfe 100644 --- a/src/usage.c +++ b/src/usage.c @@ -94,6 +94,10 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " -c, --segment-size | Num | Sets size in MB to cache from the wordfile to X | -c 32", " --bitmap-min | Num | Sets minimum bits allowed for bitmaps to X | --bitmap-min=24", " --bitmap-max | Num | Sets maximum bits allowed for bitmaps to X | --bitmap-max=24", + " --bridge-parameter1 | Str | Sets the generic parameter 1 for a Bridge |", + " --bridge-parameter2 | Str | Sets the generic parameter 2 for a Bridge |", + " --bridge-parameter3 | Str | Sets the generic parameter 3 for a Bridge |", + " --bridge-parameter4 | Str | Sets the generic parameter 4 for a Bridge |", " --cpu-affinity | Str | Locks to CPU devices, separated with commas | --cpu-affinity=1,2,3", " --hook-threads | Num | Sets number of threads for a hook (per compute unit) | --hook-threads=8", " --hash-info | | Show information for each hash-mode |", @@ -104,7 +108,9 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " --backend-ignore-opencl | | Do not try to open OpenCL interface on startup |", " -I, --backend-info | | Show system/environment/backend API info | -I or -II", " -d, --backend-devices | Str | Backend devices to use, separated with commas | -d 1", - " -Y, --backend-devices-virtual | Num | Spawn X virtual instances for each real device | -Y 8", + " -Y, --backend-devices-virtmulti| Num | Spawn X virtual instances on a real device | -Y 8", + " -R, --backend-devices-virthost | Num | Sets the real device to create virtual instances | -R 1", + " --backend-devices-keepfree | Num | Keep specified percentage of device memory free | --backend-devices-keepfree=5", " -D, --opencl-device-types | Str | OpenCL device-types to use, separated with commas | -D 1", " -O, --optimized-kernel-enable | | Enable optimized kernels (limits password length) |", " -M, --multiply-accel-disable | | Disable multiply kernel-accel with processor count |", diff --git a/src/user_options.c b/src/user_options.c index 2adfc7ac2..f70a2640f 100644 --- a/src/user_options.c +++ b/src/user_options.c @@ -21,9 +21,9 @@ #endif #ifdef WITH_BRAIN -static const char *const short_options = "hVvm:a:r:j:k:g:o:t:d:D:n:u:T:c:p:s:l:1:2:3:4:iIbw:OMSY:z"; +static const char *const short_options = "hVvm:a:r:j:k:g:o:t:d:D:n:u:T:c:p:s:l:1:2:3:4:iIbw:OMSY:R:z"; #else -static const char *const short_options = "hVvm:a:r:j:k:g:o:t:d:D:n:u:T:c:p:s:l:1:2:3:4:iIbw:OMSY:"; +static const char *const short_options = "hVvm:a:r:j:k:g:o:t:d:D:n:u:T:c:p:s:l:1:2:3:4:iIbw:OMSY:R:"; #endif static char *const SEPARATOR = ":"; @@ -33,7 +33,9 @@ static const struct option long_options[] = {"advice-disable", no_argument, NULL, IDX_ADVICE_DISABLE}, {"attack-mode", required_argument, NULL, IDX_ATTACK_MODE}, {"backend-devices", required_argument, NULL, IDX_BACKEND_DEVICES}, - {"backend-devices-virtual", required_argument, NULL, IDX_BACKEND_DEVICES_VIRTUAL}, + {"backend-devices-virtmulti", required_argument, NULL, IDX_BACKEND_DEVICES_VIRTMULTI}, + {"backend-devices-virthost", required_argument, NULL, IDX_BACKEND_DEVICES_VIRTHOST}, + {"backend-devices-keepfree", required_argument, NULL, IDX_BACKEND_DEVICES_KEEPFREE}, {"backend-ignore-cuda", no_argument, NULL, IDX_BACKEND_IGNORE_CUDA}, {"backend-ignore-hip", no_argument, NULL, IDX_BACKEND_IGNORE_HIP}, #if defined (__APPLE__) @@ -48,6 +50,10 @@ static const struct option long_options[] = {"benchmark", no_argument, NULL, IDX_BENCHMARK}, {"bitmap-max", required_argument, NULL, IDX_BITMAP_MAX}, {"bitmap-min", required_argument, NULL, IDX_BITMAP_MIN}, + {"bridge-parameter1", required_argument, NULL, IDX_BRIDGE_PARAMETER1}, + {"bridge-parameter2", required_argument, NULL, IDX_BRIDGE_PARAMETER2}, + {"bridge-parameter3", required_argument, NULL, IDX_BRIDGE_PARAMETER3}, + {"bridge-parameter4", required_argument, NULL, IDX_BRIDGE_PARAMETER4}, {"cpu-affinity", required_argument, NULL, IDX_CPU_AFFINITY}, {"custom-charset1", required_argument, NULL, IDX_CUSTOM_CHARSET_1}, {"custom-charset2", required_argument, NULL, IDX_CUSTOM_CHARSET_2}, @@ -177,7 +183,9 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->attack_mode = ATTACK_MODE; user_options->autodetect = AUTODETECT; user_options->backend_devices = NULL; - user_options->backend_devices_virtual = BACKEND_DEVICES_VIRTUAL; + user_options->backend_devices_virtmulti = BACKEND_DEVICES_VIRTMULTI; + user_options->backend_devices_virthost = BACKEND_DEVICES_VIRTHOST; + user_options->backend_devices_keepfree = BACKEND_DEVICES_KEEPFREE; user_options->backend_ignore_cuda = BACKEND_IGNORE_CUDA; user_options->backend_ignore_hip = BACKEND_IGNORE_HIP; #if defined (__APPLE__) @@ -202,6 +210,10 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->brain_session = BRAIN_SESSION; user_options->brain_session_whitelist = NULL; #endif + user_options->bridge_parameter1 = NULL; + user_options->bridge_parameter2 = NULL; + user_options->bridge_parameter3 = NULL; + user_options->bridge_parameter4 = NULL; user_options->cpu_affinity = NULL; user_options->custom_charset_1 = NULL; user_options->custom_charset_2 = NULL; @@ -312,6 +324,11 @@ void user_options_destroy (hashcat_ctx_t *hashcat_ctx) hcfree (user_options->rp_files); + if (user_options->backend_info > 0) + { + hcfree (user_options->opencl_device_types); + } + //do not reset this, it might be used from main.c //memset (user_options, 0, sizeof (user_options_t)); } @@ -366,7 +383,9 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_INCREMENT_MIN: case IDX_INCREMENT_MAX: case IDX_HOOK_THREADS: - case IDX_BACKEND_DEVICES_VIRTUAL: + case IDX_BACKEND_DEVICES_VIRTMULTI: + case IDX_BACKEND_DEVICES_VIRTHOST: + case IDX_BACKEND_DEVICES_KEEPFREE: case IDX_BENCHMARK_MAX: case IDX_BENCHMARK_MIN: #ifdef WITH_BRAIN @@ -447,7 +466,8 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_STATUS_TIMER: user_options->status_timer = hc_strtoul (optarg, NULL, 10); break; case IDX_MACHINE_READABLE: user_options->machine_readable = true; break; case IDX_LOOPBACK: user_options->loopback = true; break; - case IDX_SESSION: user_options->session = optarg; break; + case IDX_SESSION: user_options->session = optarg; + user_options->session_chgd = true; break; case IDX_HASH_MODE: user_options->hash_mode = hc_strtoul (optarg, NULL, 10); user_options->hash_mode_chgd = true; break; case IDX_RUNTIME: user_options->runtime = hc_strtoul (optarg, NULL, 10); @@ -483,6 +503,10 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_HEX_CHARSET: user_options->hex_charset = true; break; case IDX_HEX_SALT: user_options->hex_salt = true; break; case IDX_HEX_WORDLIST: user_options->hex_wordlist = true; break; + case IDX_BRIDGE_PARAMETER1: user_options->bridge_parameter1 = optarg; break; + case IDX_BRIDGE_PARAMETER2: user_options->bridge_parameter2 = optarg; break; + case IDX_BRIDGE_PARAMETER3: user_options->bridge_parameter3 = optarg; break; + case IDX_BRIDGE_PARAMETER4: user_options->bridge_parameter4 = optarg; break; case IDX_CPU_AFFINITY: user_options->cpu_affinity = optarg; break; case IDX_BACKEND_IGNORE_CUDA: user_options->backend_ignore_cuda = true; break; case IDX_BACKEND_IGNORE_HIP: user_options->backend_ignore_hip = true; break; @@ -492,7 +516,9 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_BACKEND_IGNORE_OPENCL: user_options->backend_ignore_opencl = true; break; case IDX_BACKEND_INFO: user_options->backend_info++; break; case IDX_BACKEND_DEVICES: user_options->backend_devices = optarg; break; - case IDX_BACKEND_DEVICES_VIRTUAL: user_options->backend_devices_virtual = hc_strtoul (optarg, NULL, 10); break; + case IDX_BACKEND_DEVICES_VIRTMULTI: user_options->backend_devices_virtmulti = hc_strtoul (optarg, NULL, 10); break; + case IDX_BACKEND_DEVICES_VIRTHOST: user_options->backend_devices_virthost = hc_strtoul (optarg, NULL, 10); break; + case IDX_BACKEND_DEVICES_KEEPFREE: user_options->backend_devices_keepfree = hc_strtoul (optarg, NULL, 10); break; case IDX_BACKEND_VECTOR_WIDTH: user_options->backend_vector_width = hc_strtoul (optarg, NULL, 10); user_options->backend_vector_width_chgd = true; break; case IDX_OPENCL_DEVICE_TYPES: user_options->opencl_device_types = optarg; break; @@ -784,9 +810,23 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) return -1; } - if (user_options->backend_devices_virtual == 0) + if (user_options->backend_devices_virtmulti == 0) { - event_log_error (hashcat_ctx, "Invalid --backend-devices-virtual value specified."); + event_log_error (hashcat_ctx, "Invalid --backend-devices-virtmulti value specified."); + + return -1; + } + + if (user_options->backend_devices_virthost == 0) + { + event_log_error (hashcat_ctx, "Invalid --backend-devices-virthost value specified."); + + return -1; + } + + if (user_options->backend_devices_keepfree > 100) + { + event_log_error (hashcat_ctx, "Invalid --backend-devices-keepfree value specified."); return -1; } @@ -1008,7 +1048,7 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) return -1; } - if (user_options->kernel_loops > 1024) + if (user_options->kernel_loops > KERNEL_LOOPS_MAX) { event_log_error (hashcat_ctx, "Invalid kernel-loops specified."); @@ -1861,6 +1901,14 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) } #endif + if (user_options->hwmon == false) + { + // some algorithm, such as SCRYPT, depend on accurate free memory values + // the only way to get them is through low-level APIs such as nvml via hwmon + + user_options->hwmon = true; + } + if (user_options->stdout_flag) { user_options->hwmon = false; @@ -2167,9 +2215,14 @@ void user_options_info (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "* --backend-devices=%s", user_options->backend_devices); } - if (user_options->backend_devices_virtual) + if (user_options->backend_devices_virtmulti) { - event_log_info (hashcat_ctx, "* --backend-devices-virtual=%u", user_options->backend_devices_virtual); + event_log_info (hashcat_ctx, "* --backend-devices-virtmulti=%u", user_options->backend_devices_virtmulti); + } + + if (user_options->backend_devices_virthost) + { + event_log_info (hashcat_ctx, "* --backend-devices-virthost=%u", user_options->backend_devices_virthost); } if (user_options->opencl_device_types) @@ -2241,9 +2294,14 @@ void user_options_info (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "# option: --backend-devices=%s", user_options->backend_devices); } - if (user_options->backend_devices_virtual) + if (user_options->backend_devices_virtmulti) { - event_log_info (hashcat_ctx, "# option: --backend-devices-virtual=%u", user_options->backend_devices_virtual); + event_log_info (hashcat_ctx, "# option: --backend-devices-virtmulti=%u", user_options->backend_devices_virtmulti); + } + + if (user_options->backend_devices_virthost) + { + event_log_info (hashcat_ctx, "# option: --backend-devices-virthost=%u", user_options->backend_devices_virthost); } if (user_options->opencl_device_types) @@ -3245,6 +3303,10 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx) #ifdef WITH_BRAIN logfile_top_string (user_options->brain_session_whitelist); #endif + logfile_top_string (user_options->bridge_parameter1); + logfile_top_string (user_options->bridge_parameter2); + logfile_top_string (user_options->bridge_parameter3); + logfile_top_string (user_options->bridge_parameter4); logfile_top_string (user_options->cpu_affinity); logfile_top_string (user_options->custom_charset_1); logfile_top_string (user_options->custom_charset_2); @@ -3276,7 +3338,9 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx) logfile_top_uint64 (user_options->limit); logfile_top_uint64 (user_options->skip); logfile_top_uint (user_options->attack_mode); - logfile_top_uint (user_options->backend_devices_virtual); + logfile_top_uint (user_options->backend_devices_virtmulti); + logfile_top_uint (user_options->backend_devices_virthost); + logfile_top_uint (user_options->backend_devices_keepfree); logfile_top_uint (user_options->benchmark); logfile_top_uint (user_options->benchmark_all); logfile_top_uint (user_options->benchmark_max); diff --git a/tools/benchmark_deep.pl b/tools/benchmark_deep.pl index 79bb19580..f6369e995 100755 --- a/tools/benchmark_deep.pl +++ b/tools/benchmark_deep.pl @@ -13,11 +13,11 @@ my $amd_cache = "~/.AMD"; my $hashcat_path = "."; my $kernels_cache = "$hashcat_path/kernels"; my $hashcat_bin = "$hashcat_path/hashcat"; -my $device = 3; +my $device = 1; my $workload_profile = 3; -my $runtime = 24; -my $sleep_sec = 12; -my $default_mask = "?b?b?b?b?b?b?b"; +my $runtime = 11; +my $sleep_sec = 13; +my $default_mask = "?a?a?a?a?a?a?a"; my $result = "result.txt"; my $old_hashcat = 0; # requires to have ran with new hashcat before to create the hashfiles my $repeats = 0; @@ -25,22 +25,18 @@ my $cpu_benchmark = 0; print "\nHardware preparations... You may need to adjust some settings and probably can ignore some of the error\n\n"; -system ("echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"); +system ("echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"); if ($cpu_benchmark == 1) { - system ("echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"); ## for CPU benchmark Intel - system ("echo 0 > /sys/devices/system/cpu/cpufreq/boost"); ## for CPU benchmark AMD + system ("sudo echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"); ## for CPU benchmark Intel + system ("sudo echo 0 > /sys/devices/system/cpu/cpufreq/boost"); ## for CPU benchmark AMD } else { - system ("rocm-smi --resetprofile --resetclocks --resetfans"); - system ("rocm-smi --setfan 100% --setperflevel high"); + #system ("rocm-smi --resetprofile --resetclocks --resetfans"); + #system ("rocm-smi --setfan 100% --setperflevel high"); - system ("nvidia-smi -rac"); - system ("nvidia-smi -pm ENABLED"); - system ("nvidia-smi -acp UNRESTRICTED"); - system ("nvidia-smi -pl 225"); ## needs per-gpu adjust system ("nvidia-settings -a GPUPowerMizerMode=1 -a GPUFanControlState=1 -a GPUTargetFanSpeed=100"); } @@ -552,7 +548,7 @@ sub get_module close (IN); - my $mask = (defined $benchmark_mask) ? $benchmark_mask : $default_mask; + my $mask = $default_mask; if ($pw_min != -1) { @@ -575,6 +571,8 @@ sub get_module } } + $mask = (defined $benchmark_mask) ? $benchmark_mask : $mask; + my $module = { "is_binary" => $is_binary, diff --git a/tools/cachedata2hashcat.py b/tools/cachedata2hashcat.py new file mode 100755 index 000000000..4ec57b6b1 --- /dev/null +++ b/tools/cachedata2hashcat.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# +# Script to extract the hash from a CacheData-file. +#--MicrosoftAccount +### C:\Windows\system32\config\systemprofile\AppData\local\microsoft\windows\CloudAPCache\MicrosoftAccount\\Cache\CacheData +#--AzureAD +### C:\Windows\system32\config\systemprofile\AppData\local\microsoft\windows\CloudAPCache\AzureAD\\Cache\CacheData +# +# This code is build from scratch. Nonetheless, all the initial reverse engineering work has been done +# by https://github.com/tijldeneut and https://github.com/synacktiv +# +# Authors: +# https://github.com/Banaanhangwagen +# https://github.com/Ctrl-Shift-Defeat +# +# v2025-5: initial release +# +# License: MIT +# + +import sys +import struct + +def read_node_info(file, node_count, start_address): + """Extracts node info from the binary file.""" + node_info = [] + node_size = 20 + node_type_counts = {} + for i in range(node_count): + node_start = start_address + i * node_size + node = file[node_start:node_start + node_size] + node_type = node[0] + node_type_counts[node_type] = node_type_counts.get(node_type, 0) + 1 + crypto_blob_size = struct.unpack('111}") + hashes_found += 1 + else: + # Skip the other nodes properly + start_address += crypto_blob_size + encrypted_part_size + 8 + + return hashes_found + + +def print_banner(): + print("╔══════════════════════════════╗") + print("║ Cachedata2hashcat ║") + print("╚══════════════════════════════╝") + + +def main(): + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} path_to_CacheData") + sys.exit(1) + try: + with open(sys.argv[1], 'rb') as f: + file = f.read() + except IOError as e: + print(f"Error opening file: {e}") + sys.exit(1) + + print_banner() + + # Extract version + version = struct.unpack('5}") + if version != 2: + print("\033[91m[!]\033[0m Unsupported version. Be careful when proceeding.") + + # Extract node count + node_count = struct.unpack('14}") + if node_count == 0: + print("\033[91m[!]\033[0m No nodes found. Cannot proceed.") + sys.exit(1) + + node_info, node_type_counts = read_node_info(file, node_count, 0x54) + + type1_count = node_type_counts.get(1, 0) + print(f"\033[92m[+]\033[0m Type 1-nodes: {type1_count:>15}") + if type1_count == 0: + print("\033[91m[!] Warning: No hash-containing nodes (Type 1) found.\033[0m") + + hashes_found = extract_hashes(file, node_info, 0x54 + node_count * 20) + + if hashes_found == 0: + print(f"\033[91m[!]\033[0m No valid hashes found in the file.\033[0m") + else: + print(f"\033[92m[+]\033[0m Successfully extracted {hashes_found} hash(es).") + + +if __name__ == "__main__": + main() diff --git a/tools/package_bin.sh b/tools/package_bin.sh index 2854c4916..b110a8bea 100755 --- a/tools/package_bin.sh +++ b/tools/package_bin.sh @@ -5,7 +5,7 @@ ## License.....: MIT ## -export IN=$HOME/hashcat +export IN=. export OUT=$HOME/xy/hashcat-6.2.6 rm -rf $OUT @@ -14,6 +14,7 @@ rm -rf $OUT.7z mkdir -p $OUT mkdir -p $OUT/tools +mkdir -p $OUT/Python cp $IN/hashcat.exe $OUT/ cp $IN/hashcat.bin $OUT/ @@ -23,6 +24,7 @@ cp -r $IN/docs $OUT/ cp -r $IN/charsets $OUT/ cp -r $IN/layouts $OUT/ cp -r $IN/masks $OUT/ +cp -r $IN/bridges $OUT/ cp -r $IN/modules $OUT/ cp -r $IN/rules $OUT/ cp -r $IN/extra $OUT/ @@ -30,6 +32,7 @@ cp -r $IN/tunings $OUT/ cp $IN/example.dict $OUT/ cp $IN/example[0123456789]*.hash $OUT/ cp $IN/example[0123456789]*.cmd $OUT/ +cp -r $IN/Python/*.py $OUT/Python/ cp -r $IN/OpenCL $OUT/ cp $IN/tools/*hashcat.pl $OUT/tools/ cp $IN/tools/*hashcat.py $OUT/tools/ @@ -60,6 +63,7 @@ unix2dos $OUT/rules/hybrid/*.rule unix2dos $OUT/docs/* unix2dos $OUT/docs/license_libs/* unix2dos $OUT/example*.cmd +unix2dos $OUT/Python/* unix2dos $OUT/OpenCL/* unix2dos $OUT/tools/* unix2dos $OUT/tunings/* @@ -79,6 +83,8 @@ chmod 755 $OUT/layouts chmod 644 $OUT/layouts/* chmod 755 $OUT/masks chmod 644 $OUT/masks/* +chmod 755 $OUT/bridges +chmod 644 $OUT/bridges/* chmod 755 $OUT/modules chmod 644 $OUT/modules/* chmod 644 $OUT/example* @@ -86,6 +92,8 @@ chmod 755 $OUT/example*.sh chmod 755 $OUT/extra chmod 755 $OUT/extra/tab_completion/*.sh chmod 755 $OUT/extra/tab_completion/install +chmod 755 $OUT/Python +chmod 644 $OUT/Python/* chmod 755 $OUT/OpenCL chmod 644 $OUT/OpenCL/* chmod 755 $OUT/tunings diff --git a/tools/test.sh b/tools/test.sh index 7732cf515..abd7777a1 100755 --- a/tools/test.sh +++ b/tools/test.sh @@ -352,12 +352,12 @@ function init() min_len=7 # means length 8, since we start with 0 elif [ "${hash_type}" -eq 22000 ]; then min_len=7 # means length 8, since we start with 0 - elif [ "${hash_type}" -eq 40000 ]; then + elif [ "${hash_type}" -eq 33500 ]; then fixed_len=5 - elif [ "${hash_type}" -eq 40001 ]; then + elif [ "${hash_type}" -eq 33501 ]; then min_len=5 fixed_len=9 - elif [ "${hash_type}" -eq 40002 ]; then + elif [ "${hash_type}" -eq 33502 ]; then min_len=5 fixed_len=13 fi @@ -375,10 +375,14 @@ function init() rm -rf "${OUTD}/${hash_type}_dict1_multi_${i}" "${OUTD}/${hash_type}_dict2_multi_${i}" touch "${OUTD}/${hash_type}_dict1_multi_${i}" "${OUTD}/${hash_type}_dict2_multi_${i}" - if [ "${fixed_len}" -eq "${i}" ]; then - perl tools/test.pl single "${hash_type}" ${i} > "${cmd_file}" + if [ "${fixed_len}" -ne 0 ]; then + if [ "${fixed_len}" -eq "${i}" ]; then + perl tools/test.pl single "${hash_type}" ${i} > "${cmd_file}" + else + perl tools/test.pl single "${hash_type}" ${fixed_len} > "${cmd_file}" + fi else - perl tools/test.pl single "${hash_type}" ${fixed_len} > "${cmd_file}" + perl tools/test.pl single "${hash_type}" ${i} > "${cmd_file}" fi sed 's/^echo *|.*$//' "${cmd_file}" | awk '{print $2}' > "${OUTD}/${hash_type}_passwords_multi_${i}.txt" @@ -1944,11 +1948,11 @@ function attack_6() max=5 elif [ "${hash_type}" -eq 22000 ]; then max=5 - elif [ "${hash_type}" -eq 40000 ]; then + elif [ "${hash_type}" -eq 33500 ]; then min=5 - elif [ "${hash_type}" -eq 40001 ]; then + elif [ "${hash_type}" -eq 33501 ]; then min=8 - elif [ "${hash_type}" -eq 40002 ]; then + elif [ "${hash_type}" -eq 33502 ]; then min=8 fi @@ -2394,11 +2398,11 @@ function attack_7() max=5 elif [ "${hash_type}" -eq 22000 ]; then max=5 - elif [ "${hash_type}" -eq 40000 ]; then + elif [ "${hash_type}" -eq 33500 ]; then min=5 - elif [ "${hash_type}" -eq 40001 ]; then + elif [ "${hash_type}" -eq 33501 ]; then max=3 - elif [ "${hash_type}" -eq 40002 ]; then + elif [ "${hash_type}" -eq 33502 ]; then max=3 fi diff --git a/tools/test_modules/m15700.pm b/tools/test_modules/m15700.pm index 896ce66e5..abee738bf 100644 --- a/tools/test_modules/m15700.pm +++ b/tools/test_modules/m15700.pm @@ -17,8 +17,8 @@ sub module_generate_hash { my $word = shift; my $salt = shift; - my $scrypt_N = shift || 1024 ; # 262144 originally - my $scrypt_r = shift || 1; # 8 originally + my $scrypt_N = shift || 262144; + my $scrypt_r = shift || 8; my $scrypt_p = shift || 1; my $ciphertext = shift || random_bytes (32); diff --git a/tools/test_modules/m22911.pm b/tools/test_modules/m22911.pm index d8c53693f..45aed4d90 100644 --- a/tools/test_modules/m22911.pm +++ b/tools/test_modules/m22911.pm @@ -12,7 +12,7 @@ use Crypt::CBC; use Crypt::DES_EDE3; use Digest::MD5 qw (md5); -sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } +sub module_constraints { [[0, 128], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } sub generate_key { diff --git a/tools/test_modules/m22921.pm b/tools/test_modules/m22921.pm index 4839da1f6..9b35a14e5 100644 --- a/tools/test_modules/m22921.pm +++ b/tools/test_modules/m22921.pm @@ -11,7 +11,7 @@ use warnings; use Crypt::CBC; use Digest::MD5 qw (md5); -sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } +sub module_constraints { [[0, 128], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } sub generate_key { diff --git a/tools/test_modules/m22931.pm b/tools/test_modules/m22931.pm index 138f56e66..0fa5897a8 100644 --- a/tools/test_modules/m22931.pm +++ b/tools/test_modules/m22931.pm @@ -11,7 +11,7 @@ use warnings; use Crypt::CBC; use Digest::MD5 qw (md5); -sub module_constraints { [[0, 256], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } +sub module_constraints { [[0, 128], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } sub generate_key { diff --git a/tools/test_modules/m22941.pm b/tools/test_modules/m22941.pm index d4fb2b554..1e1e39e1f 100644 --- a/tools/test_modules/m22941.pm +++ b/tools/test_modules/m22941.pm @@ -11,7 +11,7 @@ use warnings; use Crypt::CBC; use Digest::MD5 qw (md5); -sub module_constraints { [[0, 256], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } +sub module_constraints { [[0, 128], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } sub generate_key { diff --git a/tools/test_modules/m22951.pm b/tools/test_modules/m22951.pm index c9c794be8..a8b8f14f8 100644 --- a/tools/test_modules/m22951.pm +++ b/tools/test_modules/m22951.pm @@ -11,7 +11,7 @@ use warnings; use Crypt::CBC; use Digest::MD5 qw (md5); -sub module_constraints { [[0, 256], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } +sub module_constraints { [[0, 128], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } sub generate_key { diff --git a/tools/test_modules/m33300.pm b/tools/test_modules/m33300.pm new file mode 100644 index 000000000..6fd276965 --- /dev/null +++ b/tools/test_modules/m33300.pm @@ -0,0 +1,46 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::HMAC qw (hmac_hex); + +use Crypt::Digest::BLAKE2s_256 qw (blake2s_256); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = hmac_hex ($salt, $word, \&blake2s_256); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m33700.pm b/tools/test_modules/m33700.pm new file mode 100644 index 000000000..dab6da2fb --- /dev/null +++ b/tools/test_modules/m33700.pm @@ -0,0 +1,126 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::PBKDF2; +use Crypt::CBC; +use Encode qw(encode); + +sub module_constraints { [[0, 256], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $iter = shift; + my $ct = shift; + + $iter = 10000 unless defined ($iter) && $iter =~ /^\d+$/; + + my $hid = 0; + + my $iv = "\x00" x 16; + + my $key_len = 32; + + my $kdf = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => $iter, + output_len => $key_len, + salt_len => 0 + ); + + my $word_utf16le = encode ("UTF-16LE", $word); + + my $key = $kdf->PBKDF2 ('', $word_utf16le); + + my $is_decrypt = defined ($ct); + + my $data_bin; + + if ($is_decrypt == 1) + { + $data_bin = pack ("H*", $ct); + + my $aes = Crypt::CBC->new ({ + cipher => "Crypt::Rijndael", + key => $key, + iv => $iv, + keysize => $key_len, + literal_key => 1, + header => "none", + padding => "standard", + }); + + my $pt_bin = $aes->decrypt ($data_bin); + + my $pt = unpack ("H*", $pt_bin); + my $pt_tmp = substr ($pt, 0, 16); + + my $kp = "\x00\x00\x00\x00\x01\x00\x00\x00"; + my $kp_tmp = unpack ("H*", $kp); + + if ($pt_tmp eq $kp_tmp) + { + $data_bin = $pt_bin; + } + } + else + { + $data_bin = pack ("H*", "000000000100000000000000600000006000000000000000200000004000"); + } + + my $aes = Crypt::CBC->new ({ + cipher => "Crypt::Rijndael", + key => $key, + iv => $iv, + keysize => $key_len, + literal_key => 1, + header => "none", + padding => "standard", + }); + + my $ct_bin = $aes->encrypt ($data_bin); + + my $hash = sprintf ('$MSONLINEACCOUNT$%d$%d$%s', $hid, $iter, unpack ("H*", $ct_bin)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 18) eq '$MSONLINEACCOUNT$0'; + + my (undef, $signature, $hid, $iter, $ct) = split '\$', $hash; + + return unless defined $signature; + return unless defined $hid; + return unless defined $iter; + return unless defined $ct; + + return unless ($signature eq 'MSONLINEACCOUNT'); + return unless ($hid eq '0'); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $iter, $ct); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m33800.pm b/tools/test_modules/m33800.pm new file mode 100644 index 000000000..86ffc3b75 --- /dev/null +++ b/tools/test_modules/m33800.pm @@ -0,0 +1,76 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::Eksblowfish::Bcrypt qw (bcrypt en_base64); +use MIME::Base64 qw (decode_base64); + +sub module_constraints { [[0, 72], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $iter = shift; + + my $cost = "05"; + + if (length ($iter)) + { + $cost = $iter; + } + + my $hash = bcrypt ($word, sprintf ('$2a$%s$%s$', $cost, en_base64 ($salt))); + + my $hash2 = bcrypt ($hash, sprintf ('$2a$%s$%s$', $cost, en_base64 ($salt))); + + return $hash2; +} + +sub module_verify_hash +{ + my $line = shift; + + my $index1 = index ($line, ":", 33); + + return if $index1 < 1; + + my $hash = substr ($line, 0, $index1); + my $word = substr ($line, $index1 + 1); + + my $index2 = index ($hash, "\$", 4); + + my $iter = substr ($hash, 4, $index2 - 4); + + my $plain_base64 = substr ($hash, $index2 + 1, 22); + + # base64 mapping + + my $base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + my $itoa64_2 = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + my $encoded = ""; + + for (my $i = 0; $i < length ($plain_base64); $i++) + { + my $char = substr ($plain_base64, $i, 1); + + $encoded .= substr ($base64, index ($itoa64_2, $char), 1); + } + + my $salt = decode_base64 ($encoded); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt, $iter); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m70000.pm b/tools/test_modules/m70000.pm new file mode 100644 index 000000000..4b44334ac --- /dev/null +++ b/tools/test_modules/m70000.pm @@ -0,0 +1,76 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use MIME::Base64 qw (decode_base64 encode_base64); +use Crypt::Argon2 qw (argon2_raw); + +sub module_constraints { [[0, 256], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $m = shift // 4096; + my $t = shift // 3; + my $p = shift // 1; + my $len = shift // random_number (1, 2) * 16; + + my $salt_bin = pack ("H*", $salt); + + my $digest_bin = argon2_raw ('argon2id', $word, $salt_bin, $t, $m . "k", $p, $len); + + my $salt_base64 = encode_base64 ($salt_bin, ""); $salt_base64 =~ s/=+$//; + my $digest_base64 = encode_base64 ($digest_bin, ""); $digest_base64 =~ s/=+$//; + + my $hash = sprintf ('$argon2id$v=19$m=%d,t=%d,p=%d$%s$%s', $m, $t, $p, $salt_base64, $digest_base64); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 10) eq '$argon2id$'; + + my (undef, $signature, $version, $config, $salt, $digest) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $config; + return unless defined $salt; + return unless defined $digest; + + my ($m_config, $t_config, $p_config) = split ("\,", $config); + + return unless ($version eq "v=19"); + + my $m = (split ("=", $m_config))[1]; + my $t = (split ("=", $t_config))[1]; + my $p = (split ("=", $p_config))[1]; + + $salt = decode_base64 ($salt); + $digest = decode_base64 ($digest); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, unpack ("H*", $salt), $m, $t, $p, length ($digest)); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m70100.pm b/tools/test_modules/m70100.pm new file mode 100644 index 000000000..ca3f56710 --- /dev/null +++ b/tools/test_modules/m70100.pm @@ -0,0 +1,90 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::ScryptKDF qw (scrypt_hash); +use MIME::Base64 qw (decode_base64); + +sub module_constraints { [[0, 256], [1, 15], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $N = shift // 16384; + my $r = shift // 8; + my $p = shift // 1; + + my $hash_buf = scrypt_hash ($word, $salt, $N, $r, $p, 32); + + my $hash = sprintf ('%s', $hash_buf); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + # scrypt + return unless (substr ($line, 0, 7) eq 'SCRYPT:'); + + # get hash + my $index1 = index ($line, ":", 7); + + return if $index1 < 1; + + # N + my $N = substr ($line, 7, $index1 - 7); + + my $index2 = index ($line, ":", $index1 + 1); + + return if $index2 < 1; + + # r + my $r = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $index1 = index ($line, ":", $index2 + 1); + + return if $index1 < 1; + + # p + my $p = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + $index2 = index ($line, ":", $index1 + 1); + + return if $index2 < 1; + + # salt + my $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + $index1 = index ($line, ":", $index2 + 1); + + return if $index1 < 1; + + # digest + + my $word = substr ($line, $index1 + 1); + + return unless defined $salt; + return unless defined $word; + return unless defined $N; + return unless defined $r; + return unless defined $p; + + $word = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word, $salt, $N, $r, $p); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m70200.pm b/tools/test_modules/m70200.pm new file mode 100644 index 000000000..ca3f56710 --- /dev/null +++ b/tools/test_modules/m70200.pm @@ -0,0 +1,90 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::ScryptKDF qw (scrypt_hash); +use MIME::Base64 qw (decode_base64); + +sub module_constraints { [[0, 256], [1, 15], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $N = shift // 16384; + my $r = shift // 8; + my $p = shift // 1; + + my $hash_buf = scrypt_hash ($word, $salt, $N, $r, $p, 32); + + my $hash = sprintf ('%s', $hash_buf); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + # scrypt + return unless (substr ($line, 0, 7) eq 'SCRYPT:'); + + # get hash + my $index1 = index ($line, ":", 7); + + return if $index1 < 1; + + # N + my $N = substr ($line, 7, $index1 - 7); + + my $index2 = index ($line, ":", $index1 + 1); + + return if $index2 < 1; + + # r + my $r = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $index1 = index ($line, ":", $index2 + 1); + + return if $index1 < 1; + + # p + my $p = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + $index2 = index ($line, ":", $index1 + 1); + + return if $index2 < 1; + + # salt + my $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + $index1 = index ($line, ":", $index2 + 1); + + return if $index1 < 1; + + # digest + + my $word = substr ($line, $index1 + 1); + + return unless defined $salt; + return unless defined $word; + return unless defined $N; + return unless defined $r; + return unless defined $p; + + $word = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word, $salt, $N, $r, $p); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m72000.pm b/tools/test_modules/m72000.pm new file mode 100644 index 000000000..c16d35790 --- /dev/null +++ b/tools/test_modules/m72000.pm @@ -0,0 +1,55 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (sha256); + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = sha256 ($salt . $word); + + for (my $i = 0; $i < 10000; $i++) + { + $digest = sha256 ($digest); + } + + my $hash = sprintf ("%s*%s", unpack ("H*", $digest), $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + my ($digest, $salt) = split '\*', $hash; + + return unless defined $digest; + return unless defined $salt; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m73000.pm b/tools/test_modules/m73000.pm new file mode 100644 index 000000000..c16d35790 --- /dev/null +++ b/tools/test_modules/m73000.pm @@ -0,0 +1,55 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (sha256); + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = sha256 ($salt . $word); + + for (my $i = 0; $i < 10000; $i++) + { + $digest = sha256 ($digest); + } + + my $hash = sprintf ("%s*%s", unpack ("H*", $digest), $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + my ($digest, $salt) = split '\*', $hash; + + return unless defined $digest; + return unless defined $salt; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/win-iconv-32.diff b/tools/win-iconv-32.diff deleted file mode 100644 index 7dc17e3a6..000000000 --- a/tools/win-iconv-32.diff +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/Makefile b/Makefile -index 5937584..8777fad 100644 ---- a/Makefile -+++ b/Makefile -@@ -6,10 +6,10 @@ - # MKDIR_P, INSTALL, RM - # prefix, BINARY_PATH, INCLUDE_PATH, LIBRARY_PATH - --CC ?= gcc --AR ?= ar --RANLIB ?= ranlib --DLLTOOL ?= dlltool -+CC := i686-w64-mingw32-gcc -+AR := i686-w64-mingw32-ar -+RANLIB := i686-w64-mingw32-ranlib -+DLLTOOL := i686-w64-mingw32-dlltool - - MKDIR_P = mkdir -p - INSTALL = install -c -@@ -19,10 +19,10 @@ RM = rm -f - DEFAULT_LIBICONV_DLL ?= \"\" - - CFLAGS += -pedantic -Wall --CFLAGS += -DUSE_LIBICONV_DLL -+#CFLAGS += -DUSE_LIBICONV_DLL - CFLAGS += -DDEFAULT_LIBICONV_DLL=$(DEFAULT_LIBICONV_DLL) - --prefix ?= /usr/local -+prefix ?= /opt/win-iconv-32 - BINARY_PATH = $(prefix)/bin - INCLUDE_PATH = $(prefix)/include - LIBRARY_PATH = $(prefix)/lib diff --git a/tools/win-iconv-64.diff b/tools/win-iconv-64.diff deleted file mode 100644 index 2c658d8c1..000000000 --- a/tools/win-iconv-64.diff +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/Makefile b/Makefile -index 5937584..c4742a3 100644 ---- a/Makefile -+++ b/Makefile -@@ -6,10 +6,10 @@ - # MKDIR_P, INSTALL, RM - # prefix, BINARY_PATH, INCLUDE_PATH, LIBRARY_PATH - --CC ?= gcc --AR ?= ar --RANLIB ?= ranlib --DLLTOOL ?= dlltool -+CC := x86_64-w64-mingw32-gcc -+AR := x86_64-w64-mingw32-ar -+RANLIB := x86_64-w64-mingw32-ranlib -+DLLTOOL := x86_64-w64-mingw32-dlltool - - MKDIR_P = mkdir -p - INSTALL = install -c -@@ -19,10 +19,10 @@ RM = rm -f - DEFAULT_LIBICONV_DLL ?= \"\" - - CFLAGS += -pedantic -Wall --CFLAGS += -DUSE_LIBICONV_DLL -+#CFLAGS += -DUSE_LIBICONV_DLL - CFLAGS += -DDEFAULT_LIBICONV_DLL=$(DEFAULT_LIBICONV_DLL) - --prefix ?= /usr/local -+prefix ?= /opt/win-iconv-64 - BINARY_PATH = $(prefix)/bin - INCLUDE_PATH = $(prefix)/include - LIBRARY_PATH = $(prefix)/lib diff --git a/tunings/Module_08900.hctune b/tunings/Module_08900.hctune index 8aabacba9..46df052b5 100644 --- a/tunings/Module_08900.hctune +++ b/tunings/Module_08900.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,21 +19,8 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 8900 1 N A -DEVICE_TYPE_GPU * 8900 1 N A +# Intentionally left blank. +# This is a generic KDF, and its tuning depends largely on the hash parameters. +# It's better to derive the tuning based on the hash information (handled by the hash-mode plugin). +# The tunings from the hash-mode plugin may be slightly off, so if you have better values, you can hardcode them here. -GeForce_GTX_980 * 8900 1 29 A -GeForce_GTX_1080 * 8900 1 15 A -GeForce_RTX_2080_Ti * 8900 1 68 A -GeForce_RTX_3060_Ti * 8900 1 51 A -GeForce_RTX_3070 * 8900 1 46 A -GeForce_RTX_3090 * 8900 1 82 A -GeForce_RTX_3090_Ti * 8900 1 84 A -GeForce_RTX_4090 * 8900 1 180 A -NVS_510 * 8900 1 12 A -ALIAS_AMD_RX480 * 8900 1 15 A -ALIAS_AMD_Vega64 * 8900 1 30 A -ALIAS_AMD_MI100 * 8900 1 79 A -ALIAS_AMD_RX6900XT * 8900 1 123 A -ALIAS_AMD_RX7900XTX * 8900 1 91 A -ALIAS_AMD_W5700X * 8900 1 4 A diff --git a/tunings/Module_09300.hctune b/tunings/Module_09300.hctune index 0014494fb..d98505795 100644 --- a/tunings/Module_09300.hctune +++ b/tunings/Module_09300.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,18 +19,3 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 9300 1 N A -DEVICE_TYPE_GPU * 9300 1 N A - -GeForce_GTX_980 * 9300 1 128 A -GeForce_GTX_1080 * 9300 1 256 A -GeForce_RTX_2080_Ti * 9300 1 528 A -GeForce_RTX_3060_Ti * 9300 1 256 A -GeForce_RTX_3070 * 9300 1 368 A -GeForce_RTX_3090 * 9300 1 984 A -ALIAS_AMD_RX480 * 9300 1 232 A -ALIAS_AMD_Vega64 * 9300 1 440 A -ALIAS_AMD_MI100 * 9300 1 1000 A -ALIAS_AMD_RX6900XT * 9300 1 720 A -ALIAS_AMD_RX7900XTX * 9300 1 858 A -ALIAS_AMD_W5700X * 9300 1 3 A diff --git a/tunings/Module_15700.hctune b/tunings/Module_15700.hctune index dd67e5f42..a44bd5a9c 100644 --- a/tunings/Module_15700.hctune +++ b/tunings/Module_15700.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,20 +19,3 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 15700 1 N A -DEVICE_TYPE_GPU * 15700 1 1 A - -GeForce_GTX_980 * 15700 1 24 A -GeForce_GTX_1080 * 15700 1 28 A -GeForce_RTX_2080_Ti * 15700 1 68 A -GeForce_RTX_3060_Ti * 15700 1 11 A -GeForce_RTX_3070 * 15700 1 22 A -GeForce_RTX_3090 * 15700 1 82 A -GeForce_RTX_3090_Ti * 15700 1 84 A -GeForce_RTX_4090 * 15700 1 180 A -ALIAS_AMD_RX480 * 15700 1 58 A -ALIAS_AMD_Vega64 * 15700 1 53 A -ALIAS_AMD_MI100 * 15700 1 120 A -ALIAS_AMD_RX6900XT * 15700 1 56 A -ALIAS_AMD_RX7900XTX * 15700 1 45 A -ALIAS_AMD_W5700X * 15700 1 1 A diff --git a/tunings/Module_22700.hctune b/tunings/Module_22700.hctune index 2409eefff..c08bd7a51 100644 --- a/tunings/Module_22700.hctune +++ b/tunings/Module_22700.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,21 +19,14 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 22700 1 N A -DEVICE_TYPE_GPU * 22700 1 N A +#Leaving this here as a reference +#GeForce_GTX_980 * 22700 1 28 A +#GeForce_GTX_1630 * 22700 1 11 A +#GeForce_RTX_2080_Ti * 22700 1 78 A +#GeForce_RTX_3090 * 22700 1 82 A +#GeForce_RTX_4090 * 22700 1 180 A +#ALIAS_AMD_RX480 * 22700 1 28 A +#ALIAS_AMD_Vega64 * 22700 1 28 A +#ALIAS_AMD_RX6900XT * 22700 1 56 A +#ALIAS_AMD_RX7900XTX * 22700 1 92 A -GeForce_GTX_980 * 22700 1 29 A -GeForce_GTX_1080 * 22700 1 15 A -GeForce_RTX_2080_Ti * 22700 1 68 A -GeForce_RTX_3060_Ti * 22700 1 51 A -GeForce_RTX_3070 * 22700 1 46 A -GeForce_RTX_3090 * 22700 1 82 A -GeForce_RTX_3090_Ti * 22700 1 84 A -GeForce_RTX_4090 * 22700 1 180 A -NVS_510 * 22700 1 12 A -ALIAS_AMD_RX480 * 22700 1 15 A -ALIAS_AMD_Vega64 * 22700 1 30 A -ALIAS_AMD_MI100 * 22700 1 79 A -ALIAS_AMD_RX6900XT * 22700 1 123 A -ALIAS_AMD_RX7900XTX * 22700 1 186 A -ALIAS_AMD_W5700X * 22700 1 4 A diff --git a/tunings/Module_24000.hctune b/tunings/Module_24000.hctune index 11fb49268..52e4b78bb 100644 --- a/tunings/Module_24000.hctune +++ b/tunings/Module_24000.hctune @@ -1,5 +1,21 @@ + +# Find the right -n value for your GPU: +# ===================================== +# +# 1. For example, to find the value for 24000, first create a valid hash for 24000 as follows: +# +# $ ./hashcat --example-hashes -m 24000 | grep Example.Hash | grep -v Format | cut -b 25- > tmp.hash.24000 +# +# 2. Now let it iterate through all -n values to a certain point. In this case, I'm using 200, but in general it's a value that is at least twice that of the multiprocessor. If you don't mind you can just leave it as it is, it just runs a little longer. +# +# $ export i=1; while [ $i -ne 201 ]; do echo $i; ./hashcat --quiet tmp.hash.24000 --keep-guessing --self-test-disable --markov-disable --restore-disable --outfile-autohex-disable --wordlist-autohex-disable --potfile-disable --logfile-disable --hwmon-disable --status --status-timer 1 --runtime 28 --machine-readable --optimized-kernel-enable --workload-profile 3 --hash-type 24000 --attack-mode 3 ?b?b?b?b?b?b?b --backend-devices 1 --force -n $i; i=$(($i+1)); done | tee x +# +# 3. Determine the highest measured H/s speed. But don't just use the highest value. Instead, use the number that seems most stable, usually at the beginning. +# +# $ grep "$(printf 'STATUS\t3')" x | cut -f4 -d$'\t' | sort -n | tail +# +# 4. To match the speed you have chosen to the correct value in the 'x' file, simply search for it in it. Then go up a little on the block where you found him. The value -n is the single value that begins before the block start. If you have multiple blocks at the same speed, choose the lowest value for -n + #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 24000 1 N A -DEVICE_TYPE_GPU * 24000 1 1 A diff --git a/tunings/Module_27700.hctune b/tunings/Module_27700.hctune index 4121ae1a4..095c829f6 100644 --- a/tunings/Module_27700.hctune +++ b/tunings/Module_27700.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,21 +19,3 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 27700 1 N A -DEVICE_TYPE_GPU * 27700 1 N A - -GeForce_GTX_980 * 27700 1 29 A -GeForce_GTX_1080 * 27700 1 15 A -GeForce_RTX_2080_Ti * 27700 1 68 A -GeForce_RTX_3060_Ti * 27700 1 51 A -GeForce_RTX_3070 * 27700 1 46 A -GeForce_RTX_3090 * 27700 1 82 A -GeForce_RTX_3090_Ti * 27700 1 84 A -GeForce_RTX_4090 * 27700 1 180 A -NVS_510 * 27700 1 12 A -ALIAS_AMD_RX480 * 27700 1 15 A -ALIAS_AMD_Vega64 * 27700 1 30 A -ALIAS_AMD_MI100 * 27700 1 79 A -ALIAS_AMD_RX6900XT * 27700 1 123 A -ALIAS_AMD_RX7900XTX * 27700 1 171 A -ALIAS_AMD_W5700X * 27700 1 4 A diff --git a/tunings/Module_28200.hctune b/tunings/Module_28200.hctune index a01f9a24d..2759beb00 100644 --- a/tunings/Module_28200.hctune +++ b/tunings/Module_28200.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -19,21 +19,3 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops -DEVICE_TYPE_CPU * 28200 1 N A -DEVICE_TYPE_GPU * 28200 1 N A - -GeForce_GTX_980 * 28200 1 29 A -GeForce_GTX_1080 * 28200 1 15 A -GeForce_RTX_2080_Ti * 28200 1 68 A -GeForce_RTX_3060_Ti * 28200 1 51 A -GeForce_RTX_3070 * 28200 1 46 A -GeForce_RTX_3090 * 28200 1 82 A -GeForce_RTX_3090_Ti * 28200 1 84 A -GeForce_RTX_4090 * 28200 1 180 A -NVS_510 * 28200 1 12 A -ALIAS_AMD_RX480 * 28200 1 15 A -ALIAS_AMD_Vega64 * 28200 1 30 A -ALIAS_AMD_MI100 * 28200 1 79 A -ALIAS_AMD_RX6900XT * 28200 1 123 A -ALIAS_AMD_RX7900XTX * 28200 1 46 A -ALIAS_AMD_W5700X * 28200 1 4 A diff --git a/tunings/Module_29800.hctune b/tunings/Module_29800.hctune index 14b5cec94..ce9ebd31d 100644 --- a/tunings/Module_29800.hctune +++ b/tunings/Module_29800.hctune @@ -1,4 +1,4 @@ -# + # Find the right -n value for your GPU: # ===================================== # @@ -18,15 +18,3 @@ #Device Attack Hash Vector Kernel Kernel #Name Mode Type Width Accel Loops - -DEVICE_TYPE_CPU * 29800 1 N A -DEVICE_TYPE_GPU * 29800 1 N A - -GeForce_GTX_1070_Ti * 29800 1 14 A -GeForce_GTX_1080 * 29800 1 14 A -GeForce_GTX_1080_Ti * 29800 1 20 A -GeForce_RTX_2080_Ti * 29800 1 40 A -GeForce_RTX_3090 * 29800 1 82 A - -ALIAS_AMD_RX6900XT * 29800 1 125 A -ALIAS_AMD_W5700X * 29800 1 4 A