pax_global_header 0000666 0000000 0000000 00000000064 14553115624 0014520 g ustar 00root root 0000000 0000000 52 comment=ede20763915e5395ec388fc8fc1ef215b3d78240
3p-zlib-ng-main/ 0000775 0000000 0000000 00000000000 14553115624 0013670 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/.gitignore 0000664 0000000 0000000 00000000301 14553115624 0015652 0 ustar 00root root 0000000 0000000 stage/
autobuild-parabuild-bootstrap/
zlib/*.lo
zlib/*.o
zlib/*.so*
zlib/*.a
zlib/*.pc
zlib/example*
zlib/minigzip*
zlib/*.dylib
zlib/ztest*.dSYM/
zlib/configure.log
zlib/Makefile
zlib/zconf.h
3p-zlib-ng-main/.gitlab-ci.yml 0000664 0000000 0000000 00000000310 14553115624 0016316 0 ustar 00root root 0000000 0000000 include:
- project: 'alchemy/infrastructure/gitlab-ci-config'
file: '3p-library-m1.yml'
variables:
BUILD_COMMON: 0
BUILD_WINDOWS: 0
BUILD_WINDOWS64: 1
BUILD_LINUX64: 1
BUILD_MACOS: 1
3p-zlib-ng-main/README.md 0000664 0000000 0000000 00000000000 14553115624 0015135 0 ustar 00root root 0000000 0000000 3p-zlib-ng-main/autobuild.xml 0000664 0000000 0000000 00000006770 14553115624 0016414 0 ustar 00root root 0000000 0000000
3p-zlib-ng-main/build-cmd.sh 0000775 0000000 0000000 00000035001 14553115624 0016066 0 ustar 00root root 0000000 0000000 #!/usr/bin/env bash
cd "$(dirname "$0")"
# turn on verbose debugging output for logs.
exec 4>&1; export BASH_XTRACEFD=4; set -x
# make errors fatal
set -e
# bleat on references to undefined shell variables
set -u
ZLIB_SOURCE_DIR="zlib-ng"
top="$(pwd)"
stage="$top"/stage
# load autobuild provided shell functions and variables
case "$AUTOBUILD_PLATFORM" in
windows*)
autobuild="$(cygpath -u "$AUTOBUILD")"
;;
*)
autobuild="$AUTOBUILD"
;;
esac
source_environment_tempfile="$stage/source_environment.sh"
"$autobuild" source_environment > "$source_environment_tempfile"
. "$source_environment_tempfile"
VERSION_HEADER_FILE="$ZLIB_SOURCE_DIR/zlib.h.in"
version=$(sed -n -E 's/#define ZLIBNG_VERSION "([0-9.]+)"/\1/p' "${VERSION_HEADER_FILE}")
echo "${version}" > "${stage}/VERSION.txt"
# create stading dir structures
mkdir -p "$stage/include/zlib"
mkdir -p "$stage/lib/debug"
mkdir -p "$stage/lib/release"
pushd "$ZLIB_SOURCE_DIR"
case "$AUTOBUILD_PLATFORM" in
# ------------------------ windows, windows64 ------------------------
windows*)
load_vsvars
mkdir -p "build"
pushd "build"
# Invoke cmake and use as official build
cmake -G "$AUTOBUILD_WIN_CMAKE_GEN" -A "$AUTOBUILD_WIN_VSPLATFORM" .. -DBUILD_SHARED_LIBS=OFF -DZLIB_COMPAT:BOOL=ON
cmake --build . --config Debug
cmake --build . --config Release
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Debug
ctest -C Release
fi
cp -a "Debug/zlibstaticd.lib" "$stage/lib/debug/zlibd.lib"
cp -a "Release/zlibstatic.lib" "$stage/lib/release/zlib.lib"
cp -a zconf.h "$stage/include/zlib"
cp -a zlib.h "$stage/include/zlib"
cp -a "zlib_name_mangling.h" "$stage/include/zlib"
popd
;;
# ------------------------- darwin, darwin64 -------------------------
darwin*)
# Setup osx sdk platform
SDKNAME="macosx"
export SDKROOT=$(xcodebuild -version -sdk ${SDKNAME} Path)
# Setup build flags
ARCH_FLAGS_X86="-arch x86_64 -mmacosx-version-min=10.15 -isysroot ${SDKROOT} -msse4.2"
ARCH_FLAGS_ARM64="-arch arm64 -mmacosx-version-min=11.0 -isysroot ${SDKROOT}"
DEBUG_COMMON_FLAGS="-O0 -g -fPIC -DPIC"
RELEASE_COMMON_FLAGS="-O3 -g -fPIC -DPIC -fstack-protector-strong"
DEBUG_CFLAGS="$DEBUG_COMMON_FLAGS"
RELEASE_CFLAGS="$RELEASE_COMMON_FLAGS"
DEBUG_CXXFLAGS="$DEBUG_COMMON_FLAGS -std=c++17"
RELEASE_CXXFLAGS="$RELEASE_COMMON_FLAGS -std=c++17"
DEBUG_CPPFLAGS="-DPIC"
RELEASE_CPPFLAGS="-DPIC"
DEBUG_LDFLAGS="-Wl,-headerpad_max_install_names"
RELEASE_LDFLAGS="-Wl,-headerpad_max_install_names"
# x86 deploy target
export MACOSX_DEPLOYMENT_TARGET=10.15
mkdir -p "build_debug_x86"
pushd "build_debug_x86"
CFLAGS="$ARCH_FLAGS_X86 $DEBUG_CFLAGS" \
CXXFLAGS="$ARCH_FLAGS_X86 $DEBUG_CXXFLAGS" \
CPPFLAGS="$ARCH_FLAGS_X86 $DEBUG_CPPFLAGS" \
LDFLAGS="$ARCH_FLAGS_X86 $DEBUG_LDFLAGS" \
cmake .. -GXcode -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON -DWITH_OPTIM:BOOL=OFF \
-DCMAKE_C_FLAGS="$ARCH_FLAGS_X86 $DEBUG_CFLAGS" \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS_X86 $DEBUG_CXXFLAGS" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL="0" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH=NO \
-DCMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS=YES \
-DCMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT=dwarf \
-DCMAKE_XCODE_ATTRIBUTE_LLVM_LTO=NO \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS=sse4.2 \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD="c++17" \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY="libc++" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" \
-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
-DCMAKE_OSX_SYSROOT=${SDKROOT} \
-DCMAKE_OSX_ARCHITECTURES="x86_64" \
-DCMAKE_MACOSX_RPATH=YES \
-DCMAKE_INSTALL_PREFIX="$stage/debug_x86"
cmake --build . --config Debug
cmake --install . --config Debug
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Debug
fi
popd
mkdir -p "build_release_x86"
pushd "build_release_x86"
CFLAGS="$ARCH_FLAGS_X86 $RELEASE_CFLAGS" \
CXXFLAGS="$ARCH_FLAGS_X86 $RELEASE_CXXFLAGS" \
CPPFLAGS="$ARCH_FLAGS_X86 $RELEASE_CPPFLAGS" \
LDFLAGS="$ARCH_FLAGS_X86 ${RELEASE_LDFLAGS}" \
cmake .. -GXcode -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON \
-DCMAKE_C_FLAGS="$ARCH_FLAGS_X86 $RELEASE_CFLAGS" \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS_X86 $RELEASE_CXXFLAGS" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL="3" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH=NO \
-DCMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS=YES \
-DCMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT=dwarf \
-DCMAKE_XCODE_ATTRIBUTE_LLVM_LTO=NO \
-DCMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING=YES \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS=sse4.2 \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD="c++17" \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY="libc++" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" \
-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
-DCMAKE_OSX_SYSROOT=${SDKROOT} \
-DCMAKE_OSX_ARCHITECTURES="x86_64" \
-DCMAKE_MACOSX_RPATH=YES \
-DCMAKE_INSTALL_PREFIX="$stage/release_x86"
cmake --build . --config Release
cmake --install . --config Release
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Release
fi
popd
# ARM64 Deploy Target
export MACOSX_DEPLOYMENT_TARGET=11.0
mkdir -p "build_debug_arm64"
pushd "build_debug_arm64"
CFLAGS="$ARCH_FLAGS_ARM64 $DEBUG_CFLAGS" \
CXXFLAGS="$ARCH_FLAGS_ARM64 $DEBUG_CXXFLAGS" \
CPPFLAGS="$ARCH_FLAGS_ARM64 $DEBUG_CPPFLAGS" \
LDFLAGS="$ARCH_FLAGS_ARM64 $DEBUG_LDFLAGS" \
cmake .. -GXcode -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON -DWITH_OPTIM:BOOL=OFF \
-DCMAKE_C_FLAGS="$ARCH_FLAGS_ARM64 $DEBUG_CFLAGS" \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS_ARM64 $DEBUG_CXXFLAGS" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL="0" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH=NO \
-DCMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS=YES \
-DCMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT=dwarf \
-DCMAKE_XCODE_ATTRIBUTE_LLVM_LTO=NO \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD="c++17" \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY="libc++" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" \
-DCMAKE_OSX_ARCHITECTURES:STRING=arm64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
-DCMAKE_OSX_SYSROOT=${SDKROOT} \
-DCMAKE_MACOSX_RPATH=YES \
-DCMAKE_INSTALL_PREFIX="$stage/debug_arm64"
cmake --build . --config Debug
cmake --install . --config Debug
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Debug
fi
popd
mkdir -p "build_release_arm64"
pushd "build_release_arm64"
CFLAGS="$ARCH_FLAGS_ARM64 $RELEASE_CFLAGS" \
CXXFLAGS="$ARCH_FLAGS_ARM64 $RELEASE_CXXFLAGS" \
CPPFLAGS="$ARCH_FLAGS_ARM64 $RELEASE_CPPFLAGS" \
LDFLAGS="$ARCH_FLAGS_ARM64 ${RELEASE_LDFLAGS}" \
cmake .. -GXcode -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON \
-DCMAKE_C_FLAGS="$ARCH_FLAGS_ARM64 $RELEASE_CFLAGS" \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS_ARM64 $RELEASE_CXXFLAGS" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL="3" \
-DCMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH=NO \
-DCMAKE_XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS=YES \
-DCMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT=dwarf \
-DCMAKE_XCODE_ATTRIBUTE_LLVM_LTO=NO \
-DCMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING=YES \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD="c++17" \
-DCMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY="libc++" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED="NO" \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="" \
-DCMAKE_OSX_ARCHITECTURES:STRING=arm64 \
-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} \
-DCMAKE_OSX_SYSROOT=${SDKROOT} \
-DCMAKE_MACOSX_RPATH=YES \
-DCMAKE_INSTALL_PREFIX="$stage/release_arm64"
cmake --build . --config Release
cmake --install . --config Release
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Release
fi
popd
# create fat libraries
lipo -create ${stage}/debug_x86/lib/libz.a ${stage}/debug_arm64/lib/libz.a -output ${stage}/lib/debug/libz.a
lipo -create ${stage}/release_x86/lib/libz.a ${stage}/release_arm64/lib/libz.a -output ${stage}/lib/release/libz.a
# headers are the same between x86_64 and arm64
mv $stage/release_x86/include/* $stage/include/zlib
;;
# -------------------------- linux, linux64 --------------------------
linux*)
# Default target per autobuild build --address-size
opts="${TARGET_OPTS:--m$AUTOBUILD_ADDRSIZE}"
DEBUG_COMMON_FLAGS="$opts -Og -g -fPIC -DPIC"
RELEASE_COMMON_FLAGS="$opts -O3 -g -fPIC -DPIC -fstack-protector-strong -D_FORTIFY_SOURCE=2"
DEBUG_CFLAGS="$DEBUG_COMMON_FLAGS"
RELEASE_CFLAGS="$RELEASE_COMMON_FLAGS"
DEBUG_CXXFLAGS="$DEBUG_COMMON_FLAGS -std=c++17"
RELEASE_CXXFLAGS="$RELEASE_COMMON_FLAGS -std=c++17"
DEBUG_CPPFLAGS="-DPIC"
RELEASE_CPPFLAGS="-DPIC"
mkdir -p "build_debug"
pushd "build_debug"
CFLAGS="$DEBUG_CFLAGS" \
CPPFLAGS="$DEBUG_CPPFLAGS" \
cmake .. -GNinja -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON \
-DCMAKE_BUILD_TYPE="Debug" \
-DCMAKE_C_FLAGS="$DEBUG_CFLAGS" \
-DCMAKE_INSTALL_PREFIX="$stage/debug"
cmake --build . --config Debug
cmake --install . --config Debug
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Debug
fi
popd
mkdir -p "build_release"
pushd "build_release"
CFLAGS="$RELEASE_CFLAGS" \
CPPFLAGS="$RELEASE_CPPFLAGS" \
cmake .. -GNinja -DBUILD_SHARED_LIBS:BOOL=OFF -DZLIB_COMPAT:BOOL=ON \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_C_FLAGS="$RELEASE_CFLAGS" \
-DCMAKE_INSTALL_PREFIX="$stage/release"
cmake --build . --config Release
cmake --install . --config Release
# conditionally run unit tests
if [ "${DISABLE_UNIT_TESTS:-0}" = "0" ]; then
ctest -C Release
fi
popd
# Copy libraries
cp -a ${stage}/debug/lib/*.a ${stage}/lib/debug/
cp -a ${stage}/release/lib/*.a ${stage}/lib/release/
# copy headers
mv $stage/release/include/* $stage/include/zlib
;;
esac
mkdir -p "$stage/LICENSES"
# The copyright info for zlib is the tail end of its README file. Tempting
# though it is to write something like 'tail -n 31 README', that will
# quietly fail if the length of the copyright notice ever changes.
# Instead, look for the section header that sets off that passage and copy
# from there through EOF. (Given that END is recognized by awk, you might
# reasonably expect '/pattern/,END' to work, but no: END can only be used
# to fire an action past EOF. Have to simulate by using another regexp we
# hope will NOT match.)
cp LICENSE.md "$stage/LICENSES/zlib-ng.txt"
# In case the section header changes, ensure that zlib.txt is non-empty.
# (With -e in effect, a raw test command has the force of an assert.)
# Exiting here means we failed to match the copyright section header.
# Check the README and adjust the awk regexp accordingly.
[ -s "$stage/LICENSES/zlib-ng.txt" ]
popd
3p-zlib-ng-main/zlib-ng/ 0000775 0000000 0000000 00000000000 14553115624 0015232 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/.codecov.yaml 0000664 0000000 0000000 00000000775 14553115624 0017627 0 ustar 00root root 0000000 0000000 codecov:
max_report_age: off
notify:
wait_for_ci: false
require_ci_to_pass: false
comment:
require_base: false
require_head: false
coverage:
status:
project:
default:
threshold: 0.07
fixes:
- '/home/actions-runner/_work/zlib-ng/zlib-ng::'
- '/home/actions-runner/_work/zlib-ng/zlib-ng/build/::'
ignore:
- usr/include/.*
- /usr/include/.*
- /build/usr/include/.*
- usr/lib/.*
- /usr/lib/.*
- /build/usr/lib/.*
- usr/lib64/.*
- /usr/lib64/.*
- /build/usr/lib64/.*
- _deps/**/*
3p-zlib-ng-main/zlib-ng/.gitattributes 0000664 0000000 0000000 00000000216 14553115624 0020124 0 ustar 00root root 0000000 0000000 * text=auto
*.abi text eol=lf
*.c text
*.h text
*.sh text eol=lf
crc32_braid_tbl.h hooks-max-size=1000000
Makefile text
configure text eol=lf
3p-zlib-ng-main/zlib-ng/.github/ 0000775 0000000 0000000 00000000000 14553115624 0016572 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/.github/FUNDING.yml 0000664 0000000 0000000 00000000020 14553115624 0020377 0 ustar 00root root 0000000 0000000 github: zlib-ng
3p-zlib-ng-main/zlib-ng/.github/workflows/ 0000775 0000000 0000000 00000000000 14553115624 0020627 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/.github/workflows/analyze.yml 0000664 0000000 0000000 00000005103 14553115624 0023014 0 ustar 00root root 0000000 0000000 name: Static Analysis
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
static-analysis:
name: GCC
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Add ubuntu mirrors
run: |
# Github Actions caching proxy is at times unreliable
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
run: sudo apt-get install -y gcc-10
- name: Generate project files
run: |
cmake . \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DWITH_FUZZERS=OFF \
-DWITH_CODE_COVERAGE=OFF \
-DWITH_MAINTAINER_WARNINGS=OFF
env:
CC: gcc-10
CFLAGS:
-fanalyzer
-Werror
-Wanalyzer-double-fclose
-Wanalyzer-double-free
-Wanalyzer-exposure-through-output-file
-Wanalyzer-file-leak
-Wanalyzer-free-of-non-heap
-Wanalyzer-malloc-leak
-Wanalyzer-null-argument
-Wanalyzer-null-dereference
-Wanalyzer-possible-null-argument
-Wanalyzer-possible-null-dereference
-Wanalyzer-stale-setjmp-buffer
-Wanalyzer-tainted-array-index
-Wanalyzer-unsafe-call-within-signal-handler
-Wanalyzer-use-after-free
-Wanalyzer-use-of-pointer-in-stale-stack-frame
CI: true
- name: Compile source code
run: cmake --build . -j2 --config Release > /dev/null
Clang:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Install packages (Ubuntu)
run: sudo apt-get install -y clang-tools
- name: Generate project files
run: |
scan-build --status-bugs \
cmake . \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DWITH_FUZZERS=OFF \
-DWITH_CODE_COVERAGE=OFF \
-DWITH_MAINTAINER_WARNINGS=OFF
env:
CI: true
- name: Compile source code
run: |
scan-build --status-bugs \
cmake --build . -j2 --config Release > /dev/null
3p-zlib-ng-main/zlib-ng/.github/workflows/cmake.yml 0000664 0000000 0000000 00000067577 14553115624 0022460 0 ustar 00root root 0000000 0000000 name: CMake
on: [push, pull_request]
env:
TERM: xterm-256color
GTEST_COLOR: 1
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
cmake:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu 20.04 GCC
os: ubuntu-20.04
compiler: gcc
cxx-compiler: g++
- name: Ubuntu GCC ASAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SANITIZER=Address
codecov: ubuntu_gcc
- name: Ubuntu GCC Benchmark
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_BENCHMARKS=ON
codecov: ubuntu_gcc_benchmark
- name: Ubuntu GCC Native Instructions
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_NATIVE_INSTRUCTIONS=ON
codecov: ubuntu_gcc_native_inst
- name: Ubuntu GCC Symbol Prefix
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_SYMBOL_PREFIX=zTest_
codecov: ubuntu_gcc_sprefix
- name: Ubuntu GCC Compat Symbol Prefix
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_COMPAT=ON -DZLIB_SYMBOL_PREFIX=zTest_
codecov: ubuntu_gcc_compat_sprefix
- name: Ubuntu GCC -O3 OSB
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
build-dir: ../build
build-src-dir: ../zlib-ng
# Build with readonly project directory require CMake 3.19+
readonly-project-dir: true
codecov: ubuntu_gcc_osb
cflags: -O3
- name: Ubuntu GCC -O3 OSB add_subdirectory
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
build-dir: ../build
build-src-dir: ../zlib-ng/test/add-subdirectory-project
readonly-project-dir: true
- name: Ubuntu GCC -O1 No Unaligned UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_UNALIGNED=OFF -DWITH_SANITIZER=Undefined
codecov: ubuntu_gcc_o1
cflags: -O1
- name: Ubuntu GCC 32-bit
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32 -DCMAKE_SHARED_LINKER_FLAGS=-m32 -DCMAKE_EXE_LINKER_FLAGS=-m32
packages: gcc-multilib g++-multilib
codecov: ubuntu_gcc_m32
- name: Ubuntu GCC No CTZLL
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_OPTIM=OFF -DHAVE_BUILTIN_CTZLL=OFF
codecov: ubuntu_gcc_no_ctzll
- name: Ubuntu GCC No CTZ
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_OPTIM=OFF -DHAVE_BUILTIN_CTZLL=OFF -DHAVE_BUILTIN_CTZ=OFF
codecov: ubuntu_gcc_no_ctz
- name: Ubuntu GCC No AVX2 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_AVX2=OFF -DWITH_SANITIZER=Undefined
codecov: ubuntu_gcc_no_avx2
- name: Ubuntu GCC No SSE2 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SSE2=OFF -DWITH_SANITIZER=Undefined
codecov: ubuntu_gcc_no_sse2
- name: Ubuntu GCC No SSE4.2 UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_SSE42=OFF -DWITH_SANITIZER=Undefined
codecov: ubuntu_gcc_no_sse42
- name: Ubuntu GCC No PCLMULQDQ UBSAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_PCLMULQDQ=OFF -DWITH_SANITIZER=Undefined
codecov: ubuntu_gcc_no_pclmulqdq
- name: Ubuntu GCC Compat No Opt ASAN
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Address
codecov: ubuntu_gcc_compat_no_opt
cflags: -DNOT_TWEAK_COMPILER
- name: Ubuntu GCC ARM SF ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc-dev-armel-cross
codecov: ubuntu_gcc_armsf
- name: Ubuntu GCC ARM SF Compat No Opt UBSAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-arm.cmake -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined
packages: qemu qemu-user gcc-arm-linux-gnueabi g++-arm-linux-gnueabi libc-dev-armel-cross
codecov: ubuntu_gcc_armsf_compat_no_opt
- name: Ubuntu GCC ARM HF ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc-dev-armel-cross
codecov: ubuntu_gcc_armhf
- name: Ubuntu GCC ARM HF No ACLE ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DWITH_ACLE=OFF -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc-dev-armel-cross
codecov: ubuntu_gcc_armhf_no_acle
- name: Ubuntu GCC ARM HF No NEON ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DWITH_NEON=OFF -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc-dev-armel-cross
codecov: ubuntu_gcc_armhf_no_neon
- name: Ubuntu GCC ARM HF Compat No Opt UBSAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined
packages: qemu qemu-user gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc-dev-armel-cross
codecov: ubuntu_gcc_armhf_compat_no_opt
- name: Ubuntu GCC AARCH64 ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc-dev-arm64-cross
codecov: ubuntu_gcc_aarch64
- name: Ubuntu GCC AARCH64 No ACLE UBSAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_ACLE=OFF -DWITH_SANITIZER=Undefined
packages: qemu qemu-user gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc-dev-arm64-cross
codecov: ubuntu_gcc_aarch64_no_acle
- name: Ubuntu GCC AARCH64 No NEON UBSAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DWITH_NEON=OFF -DWITH_SANITIZER=Undefined
packages: qemu qemu-user gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc-dev-arm64-cross
codecov: ubuntu_gcc_aarch64_no_neon
- name: Ubuntu GCC AARCH64 Compat No Opt UBSAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF -DWITH_SANITIZER=Undefined
packages: qemu qemu-user gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc-dev-arm64-cross
codecov: ubuntu_gcc_aarch64_compat_no_opt
- name: Ubuntu GCC MIPS
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips.cmake
packages: qemu qemu-user gcc-mips-linux-gnu g++-mips-linux-gnu libc-dev-mips-cross
codecov: ubuntu_gcc_mips
- name: Ubuntu GCC MIPS64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips64.cmake
packages: qemu qemu-user gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc-dev-mips64-cross
codecov: ubuntu_gcc_mips64
- name: Ubuntu GCC PPC
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake
packages: qemu qemu-user gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc-dev-powerpc-cross
codecov: ubuntu_gcc_ppc
- name: Ubuntu GCC PPC No Power8
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake -DWITH_POWER8=OFF
packages: qemu qemu-user gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc-dev-powerpc-cross
codecov: ubuntu_gcc_ppc_no_power8
- name: Ubuntu GCC PPC64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64.cmake
packages: qemu qemu-user gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc-dev-ppc64-cross
ldflags: -static
codecov: ubuntu_gcc_ppc64
- name: Ubuntu GCC PPC64 Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64-power9.cmake
packages: qemu qemu-user gcc-powerpc64-linux-gnu g++-powerpc64-linux-gnu libc-dev-ppc64-cross
ldflags: -static
codecov: ubuntu_gcc_ppc64_power9
- name: Ubuntu Clang PPC64 Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64-clang.cmake
packages: qemu qemu-user clang binutils-powerpc64-linux-gnu libc-dev-ppc64-cross libgcc-11-dev-ppc64-cross libstdc++-11-dev-ppc64-cross
- name: Ubuntu GCC PPC64LE
os: ubuntu-20.04
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake
packages: qemu qemu-user gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc-dev-ppc64el-cross
codecov: ubuntu_gcc_ppc64le
- name: Ubuntu GCC PPC64LE No VSX
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-power9.cmake -DWITH_POWER8=OFF -DWITH_POWER9=OFF
packages: qemu qemu-user gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc-dev-ppc64el-cross
codecov: ubuntu_gcc_ppc64le_novsx
- name: Ubuntu GCC PPC64LE Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-power9.cmake
packages: qemu qemu-user gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc-dev-ppc64el-cross
codecov: ubuntu_gcc_ppc64le_power9
- name: Ubuntu Clang PPC64LE Power9
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le-clang.cmake
packages: qemu qemu-user clang binutils-powerpc64le-linux-gnu libc-dev-ppc64el-cross libgcc-11-dev-ppc64el-cross libstdc++-11-dev-ppc64el-cross
- name: Ubuntu GCC SPARC64
os: ubuntu-20.04
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-sparc64.cmake
packages: qemu qemu-user gcc-sparc64-linux-gnu g++-sparc64-linux-gnu libc-dev-sparc64-cross
ldflags: -static
codecov: ubuntu_gcc_sparc64
- name: Ubuntu GCC S390X ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
ldflags: -static
codecov: ubuntu_gcc_s390x
# The dedicated test VM has 4 cores
parallels-jobs: 4
- name: Ubuntu GCC S390X No vectorized CRC32 ASAN
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-s390x.cmake -DWITH_CRC32_VX=OFF -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
packages: qemu qemu-user gcc-s390x-linux-gnu g++-s390x-linux-gnu libc-dev-s390x-cross
ldflags: -static
codecov: ubuntu_gcc_s390x_no_crc32
# The dedicated test VM has 4 cores
parallels-jobs: 4
- name: Ubuntu GCC S390X DFLTCC ASAN
os: z15
compiler: gcc
cxx-compiler: g++
cmake-args: -DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Address
asan-options: detect_leaks=0
ldflags: -static
codecov: ubuntu_gcc_s390x_dfltcc
# The dedicated test VM has 4 cores
parallels-jobs: 4
- name: Ubuntu GCC S390X DFLTCC Compat UBSAN
os: z15
compiler: gcc
cxx-compiler: g++
cmake-args: -DZLIB_COMPAT=ON -DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Undefined
ldflags: -static
codecov: ubuntu_gcc_s390x_dfltcc_compat
# The dedicated test VM has 4 cores
parallels-jobs: 4
- name: Ubuntu Clang S390X DFLTCC MSAN
os: z15
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -GNinja -DWITH_DFLTCC_DEFLATE=ON -DWITH_DFLTCC_INFLATE=ON -DWITH_SANITIZER=Memory
# The dedicated test VM has 4 cores
parallels-jobs: 4
- name: Ubuntu MinGW i686
os: ubuntu-22.04
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw-i686.cmake
packages: wine wine32 gcc-mingw-w64-i686 g++-mingw-w64-i686 libpcre2-8-0=10.39-3ubuntu0.1 libpcre2-8-0:i386=10.39-3ubuntu0.1 libodbc1=2.3.9-5 libodbc1:i386=2.3.9-5 libwine:i386=6.0.3~repack-1 libgphoto2-6:i386=2.5.27-1build2 libsane:i386=1.1.1-5 libgd3=2.3.0-2ubuntu2 libgd3:i386=2.3.0-2ubuntu2 libgcc-s1:i386 libstdc++6:i386
ldflags: -static
codecov: ubuntu_gcc_mingw_i686
# Limit parallel test jobs to prevent wine errors
parallels-jobs: 1
- name: Ubuntu MinGW x86_64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw-x86_64.cmake
packages: wine wine64 gcc-mingw-w64 g++-mingw-w64
ldflags: -static
codecov: ubuntu_gcc_mingw_x86_64
# Limit parallel test jobs to prevent wine errors
parallels-jobs: 1
- name: Ubuntu 20.04 Clang
os: ubuntu-20.04
compiler: clang-6.0
cxx-compiler: clang++-6.0
packages: clang-6.0
- name: Ubuntu Clang
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang
# Check for undefined symbols in the version script for the modern api
- name: Ubuntu Clang Undefined Symbols
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--no-undefined-version" -DZLIBNG_ENABLE_TESTS=OFF
build-shared: ON
packages: clang-11 llvm-11 lld
# Check for undefined symbols in the version script for the compat api
- name: Ubuntu Clang Undefined Symbols Compat
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld -Wl,--no-undefined-version" -DZLIBNG_ENABLE_TESTS=OFF -DZLIB_COMPAT=ON
build-shared: ON
packages: clang-11 llvm-11 lld
- name: Ubuntu Clang Inflate Strict
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -DWITH_INFLATE_STRICT=ON
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_inflate_strict
- name: Ubuntu Clang Inflate Allow Invalid Dist
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -DWITH_INFLATE_ALLOW_INVALID_DIST=ON
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_inflate_allow_invalid_dist
- name: Ubuntu Clang Reduced Memory
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -DWITH_REDUCED_MEM=ON
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_reduced_mem
- name: Ubuntu Clang Memory Map
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cflags: -DUSE_MMAP
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_mmap
- name: Ubuntu Clang Debug
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
packages: clang-11 llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_debug
build-config: Debug
- name: Ubuntu Clang MSAN
os: ubuntu-latest
compiler: clang-11
cxx-compiler: clang++-11
cmake-args: -GNinja -DWITH_SANITIZER=Memory
packages: ninja-build clang-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
# https://github.com/llvm/llvm-project/issues/55785
msan-options: use_sigaltstack=0
- name: Ubuntu Clang RISC-V
os: ubuntu-latest
cmake-args: -GNinja -DCMAKE_TOOLCHAIN_FILE=./cmake/toolchain-riscv.cmake -DTOOLCHAIN_PATH=${PWD}/prebuilt-riscv-toolchain-qemu/riscv-clang -DQEMU_PATH=${PWD}/prebuilt-riscv-toolchain-qemu/riscv-qemu/bin/qemu-riscv64
packages: build-essential cmake ninja-build
codecov: ubuntu_clang_toolchain_riscv
- name: Ubuntu Emscripten WASM32
os: ubuntu-latest
chost: wasm32
cmake-args: -DCMAKE_TOOLCHAIN_FILE=${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_C_COMPILER_TARGET=wasm32 -DCMAKE_CROSSCOMPILING_EMULATOR=${EMSDK_NODE} -DZLIB_COMPAT=ON
- name: Windows MSVC 2022 v143 Win32
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v143
- name: Windows MSVC 2022 v143 Win64
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v143
- name: Windows MSVC 2022 v142 Win32
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v142
- name: Windows MSVC 2022 v142 Win64
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v142
- name: Windows MSVC 2022 v141 Win32
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A Win32 -T v141
- name: Windows MSVC 2022 v141 Win64
os: windows-latest
compiler: cl
cmake-args: -G "Visual Studio 17 2022" -A x64 -T v141
- name: Windows MSVC 2019 v140 Win32
os: windows-2019
compiler: cl
cmake-args: -G "Visual Studio 16 2019" -A Win32 -T v140
- name: Windows MSVC 2019 v140 Win64
os: windows-2019
compiler: cl
cmake-args: -G "Visual Studio 16 2019" -A x64 -T v140
- name: Windows MSVC ARM No Test
os: windows-latest
compiler: cl
cmake-args: -A ARM
- name: Windows MSVC ARM64 No Test
os: windows-latest
compiler: cl
cmake-args: -A ARM64
- name: Windows ClangCl Win32
os: windows-latest
cmake-args: -T ClangCl -A Win32
- name: Windows ClangCl Win64
os: windows-latest
cmake-args: -T ClangCl -A x64
- name: Windows GCC
os: windows-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -G Ninja
codecov: win64_gcc
- name: Windows GCC Compat No Opt
os: windows-latest
compiler: gcc
cxx-compiler: g++
cmake-args: -G Ninja -DZLIB_COMPAT=ON -DWITH_NEW_STRATEGIES=OFF -DWITH_OPTIM=OFF
codecov: win64_gcc_compat_no_opt
- name: macOS Clang ASAN
os: macos-latest
compiler: clang
cxx-compiler: clang++
cmake-args: -DWITH_SANITIZER=Address
codecov: macos_clang
- name: macOS GCC UBSAN
os: macos-latest
compiler: gcc-10
cxx-compiler: g++-10
cmake-args: -DWITH_SANITIZER=Undefined
packages: gcc@10
gcov-exec: gcov-10
codecov: macos_gcc
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Checkout test corpora
uses: actions/checkout@v4
# Don't test against all corpora with MinGW due to Wine being unable to run parallel jobs
# without connection timeout. Without parallel jobs test runs using Wine take close to an hour.
if: contains(matrix.name, 'MinGW') == false
with:
repository: zlib-ng/corpora
path: test/data/corpora
show-progress: 'false'
- name: Add repositories (Wine)
if: contains(matrix.packages, 'wine32')
run: sudo dpkg --add-architecture i386
- name: Add ubuntu mirrors
if: runner.os == 'Linux' && matrix.packages
run: |
# Github Actions caching proxy is at times unreliable
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && matrix.packages
run: |
sudo apt-get update
sudo apt-get install -y --allow-downgrades --no-install-recommends ${{ matrix.packages }}
- name: Download prebuilt RISC-V Clang toolchain & QEMU emulator
if: runner.os == 'Linux' && contains(matrix.name, 'RISC-V')
run: |
gh release download ubuntu20.04_llvm16.0.0_qemu7.0.0 --repo sifive/prepare-riscv-toolchain-qemu
tar zxvf prebuilt-riscv-toolchain-qemu.tar.gz
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install packages (Windows)
if: runner.os == 'Windows'
run: |
# strawberryperl installs /c/Strawberry/c/bin/libstdc++-6.dll, which is incompatible with the mingw64 one.
# zlib-ng does not need perl, so simply remove it.
choco uninstall --no-progress strawberryperl
choco install --no-progress ninja ${{ matrix.packages }}
- name: Install packages (macOS)
if: runner.os == 'macOS'
run: brew install ninja ${{ matrix.packages }}
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Install Emscripten
if: contains(matrix.name, 'WASM32')
uses: mymindstorm/setup-emsdk@v12
- name: Initialize Wine
# Prevent parallel test jobs from initializing Wine at the same time
if: contains(matrix.packages, 'wine')
run: wineboot --init
- name: Compile LLVM C++ libraries (MSAN)
if: contains(matrix.name, 'MSAN')
run: |
git clone --depth=1 https://github.com/llvm/llvm-project --single-branch --branch llvmorg-11.1.0
cmake -S llvm-project/llvm -B llvm-project/build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="libcxx;libcxxabi" \
-DLLVM_USE_SANITIZER=MemoryWithOrigins \
-DLLVM_LIBC_ENABLE_LINTING=OFF
cmake --build llvm-project/build -j2 -- cxx cxxabi
echo "LLVM_BUILD_DIR=`pwd`/llvm-project/build" >> $GITHUB_ENV
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
- name: Make source tree read-only
shell: bash
run: chmod -R a-w .
if: matrix.readonly-project-dir
- name: Generate project files
shell: bash
# Shared libraries turned off for qemu ppc* and sparc & reduce code coverage sources
run: |
cmake -S ${{ matrix.build-src-dir || '.' }} -B ${{ matrix.build-dir || '.' }} ${{ matrix.cmake-args }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} \
-DBUILD_SHARED_LIBS=${{ matrix.build-shared || 'OFF' }} \
-DWITH_FUZZERS=ON \
-DWITH_MAINTAINER_WARNINGS=ON \
${{ matrix.codecov && '-DWITH_CODE_COVERAGE=ON' }}
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
CFLAGS: ${{ matrix.cflags }}
LDFLAGS: ${{ matrix.ldflags }}
CI: true
- name: Compile source code
run: cmake --build ${{ matrix.build-dir || '.' }} -j2 --config ${{ matrix.build-config || 'Release' }}
- name: Run test cases
# Don't run tests on Windows ARM
if: runner.os != 'Windows' || contains(matrix.name, 'ARM') == false
run: ctest --verbose -C Release --output-on-failure --max-width 120 -j ${{ matrix.parallels-jobs || '3' }}
working-directory: ${{ matrix.build-dir || '.' }}
env:
ASAN_OPTIONS: ${{ matrix.asan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
MSAN_OPTIONS: ${{ matrix.msan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
TSAN_OPTIONS: ${{ matrix.tsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
LSAN_OPTIONS: ${{ matrix.lsan-options || 'verbosity=0' }}:abort_on_error=1:halt_on_error=1
UBSAN_OPTIONS: ${{ matrix.ubsan-options || 'verbosity=0' }}:print_stacktrace=1:abort_on_error=1:halt_on_error=1
- name: Make source tree writable
shell: bash
run: chmod -R +w .
if: matrix.readonly-project-dir
- name: Generate coverage report
if: matrix.codecov
shell: bash
run: |
python3 -u -m pip install --user gcovr==5.0
python3 -m gcovr -j 3 --verbose \
--exclude-unreachable-branches \
--gcov-executable "${{ matrix.gcov-exec || 'gcov' }}" \
--root ${{ matrix.build-src-dir || '.' }} \
--xml --output coverage.xml
- name: Upload coverage report
uses: codecov/codecov-action@v3
if: matrix.codecov && (env.CODECOV_TOKEN != '' || github.repository == 'zlib-ng/zlib-ng')
with:
token: ${{ secrets.CODECOV_TOKEN || 'e4fdf847-f541-4ab1-9d50-3d27e5913906' }}
flags: ${{ matrix.codecov }}
name: ${{ matrix.name }}
directory: ${{ matrix.build-src-dir || '.' }}
verbose: true
fail_ci_if_error: true
env:
CODECOV_TOKEN: "${{secrets.CODECOV_TOKEN}}"
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: ${{ matrix.name }} (cmake)
path: |
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
**/Testing/Temporary/*
coverage.xml
retention-days: 30
3p-zlib-ng-main/zlib-ng/.github/workflows/codeql.yml 0000664 0000000 0000000 00000001760 14553115624 0022625 0 ustar 00root root 0000000 0000000 name: "CodeQL"
on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]
schedule:
- cron: "27 17 * * 0"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ cpp ]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"
3p-zlib-ng-main/zlib-ng/.github/workflows/configure.yml 0000664 0000000 0000000 00000022116 14553115624 0023335 0 ustar 00root root 0000000 0000000 name: Configure
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
configure:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu GCC
os: ubuntu-latest
compiler: gcc
configure-args: --warn
- name: Ubuntu 20.04 GCC
os: ubuntu-20.04
compiler: gcc
configure-args: --warn
- name: Ubuntu GCC OSB
os: ubuntu-latest
compiler: gcc
configure-args: --warn
build-dir: ../build
build-src-dir: ../zlib-ng
- name: Ubuntu GCC Compat No Opt
os: ubuntu-latest
compiler: gcc
configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies
- name: Ubuntu GCC ARM SF
os: ubuntu-latest
compiler: arm-linux-gnueabi-gcc
configure-args: --warn
chost: arm-linux-gnueabi
packages: qemu qemu-user gcc-arm-linux-gnueabi libc-dev-armel-cross
- name: Ubuntu GCC ARM SF Compat No Opt
os: ubuntu-latest
compiler: arm-linux-gnueabi-gcc
configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies
chost: arm-linux-gnueabi
packages: qemu qemu-user gcc-arm-linux-gnueabi libc-dev-armel-cross
- name: Ubuntu GCC ARM HF
os: ubuntu-latest
compiler: arm-linux-gnueabihf-gcc
configure-args: --warn
chost: arm-linux-gnueabihf
packages: qemu qemu-user gcc-arm-linux-gnueabihf libc-dev-armel-cross
- name: Ubuntu GCC ARM HF No ACLE
os: ubuntu-latest
compiler: arm-linux-gnueabihf-gcc
configure-args: --warn --without-acle
chost: arm-linux-gnueabihf
packages: qemu qemu-user gcc-arm-linux-gnueabihf libc-dev-armel-cross
- name: Ubuntu GCC ARM HF No NEON
os: ubuntu-latest
compiler: arm-linux-gnueabihf-gcc
configure-args: --warn --without-neon
chost: arm-linux-gnueabihf
packages: qemu qemu-user gcc-arm-linux-gnueabihf libc-dev-armel-cross
- name: Ubuntu GCC ARM HF Compat No Opt
os: ubuntu-latest
compiler: arm-linux-gnueabihf-gcc
configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies
chost: arm-linux-gnueabihf
packages: qemu qemu-user gcc-arm-linux-gnueabihf libc-dev-armel-cross
- name: Ubuntu GCC AARCH64
os: ubuntu-latest
compiler: aarch64-linux-gnu-gcc
configure-args: --warn
chost: aarch64-linux-gnu
packages: qemu qemu-user gcc-aarch64-linux-gnu libc-dev-arm64-cross
- name: Ubuntu GCC AARCH64 No ACLE
os: ubuntu-latest
compiler: aarch64-linux-gnu-gcc
configure-args: --warn --without-acle
chost: aarch64-linux-gnu
packages: qemu qemu-user gcc-aarch64-linux-gnu libc-dev-arm64-cross
- name: Ubuntu GCC AARCH64 No NEON
os: ubuntu-latest
compiler: aarch64-linux-gnu-gcc
configure-args: --warn --without-neon
chost: aarch64-linux-gnu
packages: qemu qemu-user gcc-aarch64-linux-gnu libc-dev-arm64-cross
- name: Ubuntu GCC AARCH64 Compat No Opt
os: ubuntu-latest
compiler: aarch64-linux-gnu-gcc
configure-args: --warn --zlib-compat --without-optimizations --without-new-strategies
chost: aarch64-linux-gnu
packages: qemu qemu-user gcc-aarch64-linux-gnu libc-dev-arm64-cross
- name: Ubuntu GCC MIPS
os: ubuntu-latest
compiler: mips-linux-gnu-gcc
configure-args: --warn
chost: mips-linux-gnu
packages: qemu qemu-user gcc-mips-linux-gnu libc-dev-mips-cross
- name: Ubuntu GCC MIPS64
os: ubuntu-latest
compiler: mips64-linux-gnuabi64-gcc
configure-args: --warn
chost: mips64-linux-gnuabi64
packages: qemu qemu-user gcc-mips64-linux-gnuabi64 libc-dev-mips64-cross
- name: Ubuntu GCC PPC
os: ubuntu-latest
compiler: powerpc-linux-gnu-gcc
configure-args: --warn --static
chost: powerpc-linux-gnu
packages: qemu qemu-user gcc-powerpc-linux-gnu libc-dev-powerpc-cross
cflags: -static
ldflags: -static
- name: Ubuntu GCC PPC No Power8
os: ubuntu-latest
compiler: powerpc-linux-gnu-gcc
configure-args: --warn --without-power8
chost: powerpc-linux-gnu
packages: qemu qemu-user gcc-powerpc-linux-gnu libc-dev-powerpc-cross
- name: Ubuntu GCC PPC64
os: ubuntu-latest
compiler: powerpc64-linux-gnu-gcc
configure-args: --warn --static
chost: powerpc-linux-gnu
packages: qemu qemu-user gcc-powerpc64-linux-gnu libc-dev-ppc64-cross
cflags: -static
ldflags: -static
- name: Ubuntu GCC PPC64LE
os: ubuntu-latest
compiler: powerpc64le-linux-gnu-gcc
configure-args: --warn
chost: powerpc64le-linux-gnu
packages: qemu qemu-user gcc-powerpc64le-linux-gnu libc-dev-ppc64el-cross
- name: Ubuntu GCC S390X
os: ubuntu-latest
compiler: s390x-linux-gnu-gcc
configure-args: --warn --static
chost: s390x-linux-gnu
packages: qemu qemu-user gcc-s390x-linux-gnu libc-dev-s390x-cross
cflags: -static
ldflags: -static
- name: Ubuntu GCC S390X No vectorized CRC32
os: ubuntu-latest
compiler: s390x-linux-gnu-gcc
configure-args: --warn --static --without-crc32-vx
chost: s390x-linux-gnu
packages: qemu qemu-user gcc-s390x-linux-gnu libc-dev-s390x-cross
cflags: -static
ldflags: -static
- name: Ubuntu GCC S390X DFLTCC
os: z15
compiler: gcc
configure-args: --warn --static --with-dfltcc-deflate --with-dfltcc-inflate
- name: Ubuntu GCC S390X DFLTCC Compat
os: z15
compiler: gcc
configure-args: --warn --zlib-compat --static --with-dfltcc-deflate --with-dfltcc-inflate
- name: Ubuntu Emscripten WASM32
os: ubuntu-latest
chost: wasm32
configure-args: --warn --zlib-compat --static
configure-prefix: emconfigure
cflags: -static
ldflags: -static
emu-run: node
- name: macOS GCC Symbol Prefix
os: macOS-latest
compiler: gcc-11
configure-args: --sprefix=zTest_
- name: macOS GCC Symbol Prefix & Compat
os: macOS-latest
compiler: gcc-11
configure-args: --zlib-compat --sprefix=zTest_
- name: macOS GCC
os: macOS-latest
compiler: gcc-11
configure-args: --warn
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Add ubuntu mirrors
if: runner.os == 'Linux' && matrix.packages
run: |
# Github Actions caching proxy is at times unreliable
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && matrix.packages
run: |
sudo apt-get update
sudo apt-get install -y ${{ matrix.packages }}
- name: Install Emscripten
if: contains(matrix.name, 'WASM32')
uses: mymindstorm/setup-emsdk@v12
- name: Generate project files
run: |
mkdir ${{ matrix.build-dir || '.not-used' }}
cd ${{ matrix.build-dir || '.' }}
${{ matrix.configure-prefix }} ${{ matrix.build-src-dir || '.' }}/configure ${{ matrix.configure-args }}
env:
CC: ${{ matrix.compiler }}
CFLAGS: ${{ matrix.cflags }}
LDFLAGS: ${{ matrix.ldflags }}
CHOST: ${{ matrix.chost }}
EMU_RUN: ${{ matrix.emu-run }}
CI: true
- name: Compile source code
run: make -j2
working-directory: ${{ matrix.build-dir }}
- name: Run test cases
run: make test
working-directory: ${{ matrix.build-dir }}
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: ${{ matrix.name }} (configure)
path: |
**/Makefile
${{ matrix.build-dir || '.' }}/configure.log
retention-days: 30
3p-zlib-ng-main/zlib-ng/.github/workflows/fuzz.yml 0000664 0000000 0000000 00000001535 14553115624 0022354 0 ustar 00root root 0000000 0000000 name: OSS-Fuzz
on:
pull_request:
push:
branches:
- stable
- develop
- pre-release
- '2.*'
tags:
- '*'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
fuzzing:
name: Fuzzing
runs-on: ubuntu-latest
steps:
- name: Build Fuzzers
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
with:
oss-fuzz-project-name: 'zlib-ng'
dry-run: false
- name: Run Fuzzers
uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
with:
oss-fuzz-project-name: 'zlib-ng'
fuzz-seconds: 600
dry-run: false
- name: Upload Crash
uses: actions/upload-artifact@v3
if: failure()
with:
name: artifacts
path: ./out/artifacts
3p-zlib-ng-main/zlib-ng/.github/workflows/libpng.yml 0000664 0000000 0000000 00000002717 14553115624 0022634 0 ustar 00root root 0000000 0000000 name: Libpng
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
libpng:
name: Ubuntu Clang
runs-on: ubuntu-latest
steps:
- name: Checkout repository (zlib-ng)
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Generate project files (zlib-ng)
run: |
cmake . \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DZLIB_COMPAT=ON \
-DZLIB_ENABLE_TESTS=OFF
env:
CC: clang
CFLAGS: -fPIC
CI: true
- name: Compile source code (zlib-ng)
run: cmake --build . -j2 --config Release
- name: Checkout repository (libpng)
uses: actions/checkout@v4
with:
repository: glennrp/libpng
path: libpng
show-progress: 'false'
- name: Generate project files (libpng)
run: |
cmake . \
-DCMAKE_BUILD_TYPE=Release \
-DPNG_TESTS=ON \
-DPNG_STATIC=OFF \
-DZLIB_INCLUDE_DIR=.. \
-DZLIB_LIBRARY=$PWD/../libz.a
working-directory: libpng
env:
CC: clang
CI: true
- name: Compile source code (libpng)
run: cmake --build . -j2 --config Release
working-directory: libpng
- name: Run test cases (libpng)
run: ctest -j2 -C Release --output-on-failure --max-width 120
working-directory: libpng
3p-zlib-ng-main/zlib-ng/.github/workflows/link.yml 0000664 0000000 0000000 00000004521 14553115624 0022311 0 ustar 00root root 0000000 0000000 name: Link
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
zlib:
name: Link zlib
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Checkout zlib repository
uses: actions/checkout@v4
with:
show-progress: 'false'
repository: madler/zlib
path: zlib
- name: Generate project files (zlib)
run: cmake -S zlib -B zlib/build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
- name: Compile source code (zlib)
run: cmake --build zlib/build -j2 --config Release
- name: Generate project files (native)
run: cmake -S . -B native -DZLIB_COMPAT=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DZLIB_LIBRARIES=../zlib/build/libz.a -DZLIB_INCLUDE_DIR="../zlib/build;../zlib"
- name: Compile source code (native)
run: cmake --build native -j2 --config Release
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: Link zlib (CMake Logs)
path: |
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
retention-days: 30
zlib-ng-compat:
name: Link zlib-ng compat
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Generate project files (compat)
run: cmake -S . -B compat -DZLIB_COMPAT=ON -DZLIB_ENABLE_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DWITH_MAINTAINER_WARNINGS=ON
- name: Compile source code (compat)
run: cmake --build compat -j2 --config Release
- name: Generate project files (native)
run: cmake -S . -B native -DZLIB_COMPAT=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DZLIB_LIBRARIES=../compat/libz.a -DZLIB_INCLUDE_DIR=../compat
- name: Compile source code (native)
run: cmake --build native -j2 --config Release
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: Link zlib-ng compat (CMake Logs)
path: |
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
retention-days: 30
3p-zlib-ng-main/zlib-ng/.github/workflows/lint.yml 0000664 0000000 0000000 00000000554 14553115624 0022324 0 ustar 00root root 0000000 0000000 name: Lint
on: [pull_request]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Whitespace errors
run: |
git config core.whitespace blank-at-eol
git diff --color --check ${{ github.event.pull_request.base.sha }}
3p-zlib-ng-main/zlib-ng/.github/workflows/nmake.yml 0000664 0000000 0000000 00000004122 14553115624 0022444 0 ustar 00root root 0000000 0000000 name: NMake
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
nmake:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Windows NMake x86
os: windows-2022
makefile: win32/Makefile.msc
arch: x86
- name: Windows NMake x64 compat
os: windows-2022
makefile: win32/Makefile.msc
arch: x86_amd64
additional-args: ZLIB_COMPAT=yes
- name: Windows NMake x64 Symbol Prefix
os: windows-2022
makefile: win32/Makefile.msc
arch: x86_amd64
additional-args: SYMBOL_PREFIX=zTest_
- name: Windows NMake x64 Symbol Prefix Compat
os: windows-2022
makefile: win32/Makefile.msc
arch: x86_amd64
additional-args: ZLIB_COMPAT=yes SYMBOL_PREFIX=zTest_
- name: Windows NMake x64
os: windows-2022
makefile: win32/Makefile.msc
arch: x86_amd64
- name: Windows NMake ARM No Test
os: windows-2022
makefile: win32/Makefile.arm
arch: x86_arm
- name: Windows NMake ARM64 No Test
os: windows-2022
makefile: win32/Makefile.a64
arch: x86_arm64
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Setup development environment
uses: ilammy/msvc-dev-cmd@v1.12.1
with:
arch: ${{ matrix.arch }}
- name: Compile source code
shell: cmd
run: nmake -f ${{ matrix.makefile }} ${{ matrix.additional-args }}
- name: Run test cases
shell: cmd
# Don't run tests on Windows ARM
if: contains(matrix.arch, 'arm') == false
run: |
nmake -f ${{ matrix.makefile }} ${{ matrix.additional-args }} test
nmake -f ${{ matrix.makefile }} ${{ matrix.additional-args }} testdll
3p-zlib-ng-main/zlib-ng/.github/workflows/pigz.yml 0000664 0000000 0000000 00000011022 14553115624 0022317 0 ustar 00root root 0000000 0000000 name: Pigz
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
pigz:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu GCC
os: ubuntu-latest
compiler: gcc
codecov: ubuntu_gcc_pigz
- name: Ubuntu GCC Symbol Prefix
os: ubuntu-latest
compiler: gcc
codecov: ubuntu_gcc_pigz
cmake-args: -DZLIB_SYMBOL_PREFIX=zTest_
- name: Ubuntu Clang
os: ubuntu-latest
compiler: clang
packages: llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz
- name: Ubuntu Clang No Optim
os: ubuntu-latest
compiler: clang
packages: llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz_no_optim
cmake-args: -DWITH_OPTIM=OFF
# Use v2.6 due to NOTHREADS bug https://github.com/madler/pigz/issues/97
- name: Ubuntu Clang No Threads
os: ubuntu-latest
compiler: clang
packages: llvm-11 llvm-11-tools
gcov-exec: llvm-cov-11 gcov
codecov: ubuntu_clang_pigz_no_threads
cmake-args: -DWITH_THREADS=OFF -DPIGZ_VERSION=v2.6
- name: Ubuntu GCC AARCH64
os: ubuntu-latest
cmake-args: -DCMAKE_TOOLCHAIN_FILE=../../cmake/toolchain-aarch64.cmake
packages: qemu qemu-user gcc-aarch64-linux-gnu libc-dev-arm64-cross
codecov: ubuntu_gcc_pigz_aarch64
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Checkout test corpora
uses: actions/checkout@v4
with:
repository: zlib-ng/corpora
path: test/data/corpora
show-progress: 'false'
- name: Add ubuntu mirrors
if: runner.os == 'Linux' && matrix.packages
run: |
# Github Actions caching proxy is at times unreliable
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
if: runner.os == 'Linux' && matrix.packages
run: |
sudo apt-get update
sudo apt-get install -y ${{ matrix.packages }}
- name: Generate project files
run: |
cmake ${{ matrix.cmake-args }} \
-DCMAKE_BUILD_TYPE=${{ matrix.build-config || 'Release' }} \
-DBUILD_SHARED_LIBS=OFF \
-DZLIB_ROOT=../.. \
-DWITH_CODE_COVERAGE=ON \
-DWITH_MAINTAINER_WARNINGS=ON
working-directory: test/pigz
env:
CC: ${{ matrix.compiler }}
CFLAGS: ${{ matrix.cflags }}
LDFLAGS: ${{ matrix.ldflags }}
CI: true
- name: Compile source code
run: cmake --build . -j2 --config ${{ matrix.build-config || 'Release' }}
working-directory: test/pigz
- name: Run test cases
run: ctest --verbose -C Release --output-on-failure --max-width 120 -j ${{ matrix.parallels-jobs || '3' }}
working-directory: test/pigz
- name: Generate coverage report
if: matrix.codecov
run: |
python3 -u -m pip install --user gcovr==5.0
python3 -m gcovr -j 3 --verbose \
--exclude-unreachable-branches \
--gcov-executable "${{ matrix.gcov-exec || 'gcov' }}" \
--root . \
--xml --output coverage.xml
- name: Upload coverage report
uses: codecov/codecov-action@v3
if: matrix.codecov && (env.CODECOV_TOKEN != '' || github.repository == 'zlib-ng/zlib-ng')
with:
token: ${{ secrets.CODECOV_TOKEN || 'e4fdf847-f541-4ab1-9d50-3d27e5913906' }}
flags: ${{ matrix.codecov }}
name: ${{ matrix.name }}
verbose: true
fail_ci_if_error: true
env:
CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}}
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: ${{ matrix.name }} (cmake)
path: |
**/CMakeFiles/CMakeOutput.log
**/CMakeFiles/CMakeError.log
**/Testing/Temporary/*
coverage.xml
retention-days: 30
3p-zlib-ng-main/zlib-ng/.github/workflows/pkgcheck.yml 0000664 0000000 0000000 00000015315 14553115624 0023136 0 ustar 00root root 0000000 0000000 name: Package Check
on: [push, pull_request]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
pkgcheck:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Ubuntu GCC
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
- name: Ubuntu GCC -m32
os: ubuntu-latest
compiler: gcc
cxx-compiler: g++
packages: gcc-multilib g++-multilib
cmake-args: -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
cflags: -m32
cxxflags: -m32
ldflags: -m32
- name: Ubuntu GCC ARM HF
os: ubuntu-latest
chost: arm-linux-gnueabihf
compiler: arm-linux-gnueabihf-gcc
cxx-compiler: arm-linux-gnueabihf-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-armhf.cmake
packages: qemu gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf libc6-dev-armhf-cross
- name: Ubuntu GCC AARCH64
os: ubuntu-latest
chost: aarch64-linux-gnu
compiler: aarch64-linux-gnu-gcc
cxx-compiler: aarch64-linux-gnu-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64.cmake
packages: qemu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu libc6-dev-arm64-cross
- name: Ubuntu GCC MIPS
os: ubuntu-latest
chost: mips-linux-gnu
compiler: mips-linux-gnu-gcc
cxx-compiler: mips-linux-gnu-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips.cmake
packages: qemu gcc-mips-linux-gnu g++-mips-linux-gnu libc6-dev-mips-cross
- name: Ubuntu GCC MIPS64
os: ubuntu-latest
chost: mips64-linux-gnuabi64
compiler: mips64-linux-gnuabi64-gcc
cxx-compiler: mips64-linux-gnuabi64-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mips64.cmake
packages: qemu gcc-mips64-linux-gnuabi64 g++-mips64-linux-gnuabi64 libc6-dev-mips64-cross
- name: Ubuntu GCC PPC
os: ubuntu-latest
chost: powerpc-linux-gnu
compiler: powerpc-linux-gnu-gcc
cxx-compiler: powerpc-linux-gnu-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc.cmake
packages: qemu gcc-powerpc-linux-gnu g++-powerpc-linux-gnu libc6-dev-powerpc-cross
- name: Ubuntu GCC PPC64LE
os: ubuntu-latest
chost: powerpc64le-linux-gnu
compiler: powerpc64le-linux-gnu-gcc
cxx-compiler: powerpc64le-linux-gnu-g++
cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-powerpc64le.cmake
packages: qemu gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-dev-ppc64el-cross
- name: macOS Clang
os: macOS-11
compiler: clang
cxx-compiler: clang++
- name: macOS Clang Symbol Prefix
os: macOS-11
compiler: clang
cxx-compiler: clang++
cmake-args: -DZLIB_SYMBOL_PREFIX=zTest_
configure-args: --sprefix=zTest_
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Add ubuntu mirrors
if: runner.os == 'Linux' && matrix.packages
run: |
# Github Actions caching proxy is at times unreliable
echo -e 'http://azure.archive.ubuntu.com/ubuntu\tpriority:1\n' | sudo tee /etc/apt/mirrors.txt
curl http://mirrors.ubuntu.com/mirrors.txt | sudo tee --append /etc/apt/mirrors.txt
sudo sed -i 's#http://azure.archive.ubuntu.com/ubuntu/#mirror+file:/etc/apt/mirrors.txt#' /etc/apt/sources.list
- name: Install packages (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends ${{ matrix.packages }} \
abigail-tools \
diffoscope \
ninja-build
- name: Install packages (macOS)
if: runner.os == 'macOS'
run: brew install ninja diffoscope ${{ matrix.packages }}
env:
HOMEBREW_NO_INSTALL_CLEANUP: 1
- name: Select Xcode version (macOS)
# Use a version of Xcode that supports ZERO_AR_DATE until CMake supports
# AppleClang linking with libtool using -D argument
# https://gitlab.kitware.com/cmake/cmake/-/issues/19852
if: runner.os == 'macOS'
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '11.7.0'
- name: Compare builds
run: sh test/pkgcheck.sh
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
CFLAGS: ${{ matrix.cflags }}
CXXFLAGS: ${{ matrix.cxxflags }}
CHOST: ${{ matrix.chost }}
CMAKE_ARGS: ${{ matrix.cmake-args }}
CONFIGURE_ARGS: ${{ matrix.configure-args }}
LDFLAGS: ${{ matrix.ldflags }}
- name: Compare builds (compat)
run: sh test/pkgcheck.sh --zlib-compat
env:
CC: ${{ matrix.compiler }}
CFLAGS: ${{ matrix.cflags }}
CHOST: ${{ matrix.chost }}
CMAKE_ARGS: ${{ matrix.cmake-args }}
CONFIGURE_ARGS: ${{ matrix.configure-args }}
LDFLAGS: ${{ matrix.ldflags }}
- name: Check ABI
# macOS runner does not contain abigail
if: runner.os != 'macOS'
run: sh test/abicheck.sh --refresh-if
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
CFLAGS: ${{ matrix.cflags }}
CXXFLAGS: ${{ matrix.cxxflags }}
CHOST: ${{ matrix.chost }}
CMAKE_ARGS: ${{ matrix.cmake-args }}
CONFIGURE_ARGS: ${{ matrix.configure-args }}
LDFLAGS: ${{ matrix.ldflags }}
- name: Check ABI (compat)
# macOS runner does not contain abigail
if: runner.os != 'macOS'
run: sh test/abicheck.sh --zlib-compat --refresh-if
env:
CC: ${{ matrix.compiler }}
CXX: ${{ matrix.cxx-compiler }}
CFLAGS: ${{ matrix.cflags }}
CXXFLAGS: ${{ matrix.cxxflags }}
CHOST: ${{ matrix.chost }}
CMAKE_ARGS: ${{ matrix.cmake-args }}
CONFIGURE_ARGS: ${{ matrix.configure-args }}
LDFLAGS: ${{ matrix.ldflags }}
- name: Upload build errors
uses: actions/upload-artifact@v3
if: failure()
with:
name: ${{ matrix.name }}
path: |
**/*.abi
btmp1/configure.log
btmp1/CMakeFiles/CMakeOutput.log
btmp1/CMakeFiles/CMakeError.log
btmp2/configure.log
btmp2/CMakeFiles/CMakeOutput.log
btmp2/CMakeFiles/CMakeError.log
retention-days: 30
3p-zlib-ng-main/zlib-ng/.github/workflows/release.yml 0000664 0000000 0000000 00000005464 14553115624 0023003 0 ustar 00root root 0000000 0000000 name: Release
on:
push:
tags:
- '*'
jobs:
release:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: Windows MSVC Win32
os: windows-latest
compiler: cl
cmake-args: -A Win32
deploy-name: win-x86
- name: Windows MSVC Win32 Compat
os: windows-latest
compiler: cl
cmake-args: -A Win32 -DZLIB_COMPAT=ON
deploy-name: win-x86-compat
- name: Windows MSVC Win64
os: windows-latest
compiler: cl
cmake-args: -A x64
deploy-name: win-x86-64
- name: Windows MSVC Win64 Compat
os: windows-latest
compiler: cl
cmake-args: -A x64 -DZLIB_COMPAT=ON
deploy-name: win-x86-64-compat
- name: Windows MSVC ARM
os: windows-latest
compiler: cl
cmake-args: -A ARM
deploy-name: win-arm
- name: Windows MSVC ARM Compat
os: windows-latest
compiler: cl
cmake-args: -A ARM -DZLIB_COMPAT=ON
deploy-name: win-arm-compat
- name: Windows MSVC ARM64
os: windows-latest
compiler: cl
cmake-args: -A ARM64
deploy-name: win-arm64
- name: Windows MSVC ARM64 Compat
os: windows-latest
compiler: cl
cmake-args: -A ARM64 -DZLIB_COMPAT=ON
deploy-name: win-arm64-compat
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
show-progress: 'false'
- name: Set environment variables
shell: bash
run: echo "tag=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
- name: Generate project files
shell: bash
run: |
cmake . ${{ matrix.cmake-args }} \
-DCMAKE_BUILD_TYPE=Release \
-DZLIB_ENABLE_TESTS=ON \
-DCMAKE_INSTALL_PREFIX=out \
-DINSTALL_UTILS=ON
env:
CC: ${{ matrix.compiler }}
CI: true
- name: Compile source code
run: cmake --build . -j2 --config Release --target install
- name: Package release (Windows)
if: runner.os == 'Windows'
run: 7z a -tzip ../zlib-ng-${{ matrix.deploy-name }}.zip bin include lib ../LICENSE.md ../PORTING.md ../README.md
working-directory: out
- name: Upload release (Windows)
uses: svenstaro/upload-release-action@v2
if: runner.os == 'Windows'
with:
asset_name: zlib-ng-${{ matrix.deploy-name }}.zip
file: zlib-ng-${{ matrix.deploy-name }}.zip
tag: ${{env.tag}}
repo_token: ${{ secrets.GITHUB_TOKEN }}
overwrite: true
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
3p-zlib-ng-main/zlib-ng/.gitignore 0000664 0000000 0000000 00000001726 14553115624 0017230 0 ustar 00root root 0000000 0000000 *.diff
*.patch
*.orig
*.rej
*~
*.a
*.lo
*.o
*.dylib
*.gcda
*.gcno
*.gcov
/benchmark_zlib
/example
/example64
/examplesh
/gtest_zlib
/libz.so*
/libz-ng.so*
/makefixed
/minigzip
/minigzip64
/minigzipsh
/switchlevels
/zlib.pc
/zlib-ng.pc
.DS_Store
*_fuzzer
*.obj
*.exe
*.pdb
*.exp
*.lib
*.dll
*.res
foo.gz
*.manifest
*.opensdf
*.sln
*.sdf
*.vcxproj
*.vcxproj.filters
*.vcxproj.user
.vs
CMakeCache.txt
CMakeFiles
Testing
/*.cmake
*.stackdump
*._h
zconf.h
zconf.h.cmakein
zconf.h.included
zconf-ng.h
zconf-ng.h.cmakein
ztest*
/test/CTestTestfile.cmake
/test/cmake_install.cmake
configure.log
a.out
/Makefile
/arch/arm/Makefile
/arch/generic/Makefile
/arch/power/Makefile
/arch/x86/Makefile
.kdev4
*.kdev4
/Debug
/example.dir
/minigzip.dir
/zlib.dir
/zlibstatic.dir
/test/*.dir/
/build/
/build[.-]*/
/btmp[12]/
/pkgtmp[12]/
/.idea
/cmake-build-debug
/x64/Debug/
/x64/Release/
/win32/Debug/
/win32/Release/
/ARM*/Debug/
/ARM*/Release/
MinSizeRel
RelWithDebInfo
/_deps/googletest*
3p-zlib-ng-main/zlib-ng/.shellcheckrc 0000664 0000000 0000000 00000001610 14553115624 0017663 0 ustar 00root root 0000000 0000000 disable=SC2140,SC2086,SC2046,SC2015,SC1097,SC1035,SC1036,SC1007,SC2154,SC2155,SC2000,SC2034,SC2016,SC1091,SC1090,SC2212,SC2143,SC2129,SC2102,SC2069,SC1041,SC1042,SC1044,SC1046,SC1119,SC1110,SC1111,SC1112,SC1102,SC1105,SC1101,SC1004,SC1003,SC1012,SC2068,SC2065,SC2064,SC2063,SC2059,SC2053,SC2048,SC2044,SC2032,SC2031,SC2030,SC2029,SC2025,SC2024,SC2022,SC2018,SC2019,SC2017,SC2014,SC2013,SC2012,SC2009,SC2001,SC2098,SC2096,SC2094,SC2091,SC2092,SC2088,SC2087,SC2076,SC2072,SC2071,SC2223,SC2221,SC2222,SC2217,SC2207,SC2206,SC2205,SC2190,SC2188,SC2187,SC2185,SC2179,SC2178,SC2174,SC2168,SC2167,SC2163,SC2161,SC2160,SC2153,SC2150,SC2148,SC2147,SC2146,SC2142,SC2139,SC2126,SC2123,SC2120,SC2119,SC2117,SC2114,SC1117,SC2164,SC1083,SC2004,SC2125,SC2128,SC2011,SC1008,SC1019,SC2093,SC1132,SC1129,SC2236,SC2237,SC2231,SC2230,SC2229,SC2106,SC2102,SC2243,SC2244,SC2245,SC2247,SC2248,SC2249,SC2250,SC2251,SC2252,SC2181
3p-zlib-ng-main/zlib-ng/CMakeLists.txt 0000664 0000000 0000000 00000143600 14553115624 0017776 0 ustar 00root root 0000000 0000000 cmake_minimum_required(VERSION 3.5.1)
if(CMAKE_VERSION VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_VERSION})
else()
cmake_policy(VERSION 3.5.1...3.13.2)
endif()
message(STATUS "Using CMake version ${CMAKE_VERSION}")
# If not specified on the command line, enable C11 as the default
# Configuration items that affect the global compiler environment standards
# should be issued before the "project" command.
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 11) # The C standard whose features are requested to build this target
endif()
if(NOT CMAKE_C_STANDARD_REQUIRED)
set(CMAKE_C_STANDARD_REQUIRED ON) # Boolean describing whether the value of C_STANDARD is a requirement
endif()
if(NOT CMAKE_C_EXTENSIONS)
set(CMAKE_C_EXTENSIONS OFF) # Boolean specifying whether compiler specific extensions are requested
endif()
set(VALID_C_STANDARDS "99" "11")
if(NOT CMAKE_C_STANDARD IN_LIST VALID_C_STANDARDS)
MESSAGE(FATAL_ERROR "CMAKE_C_STANDARD:STRING=${CMAKE_C_STANDARD} not in known standards list\n ${VALID_C_STANDARDS}")
endif()
# Parse the full version number from zlib.h.in and include in ZLIB_FULL_VERSION
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h.in _zlib_h_contents)
string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([0-9]+.[0-9]+.[0-9]+).*\".*"
"\\1" ZLIB_HEADER_VERSION ${_zlib_h_contents})
string(REGEX REPLACE ".*#define[ \t]+ZLIBNG_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
"\\1" ZLIBNG_HEADER_VERSION ${_zlib_h_contents})
message(STATUS "ZLIB_HEADER_VERSION: ${ZLIB_HEADER_VERSION}")
message(STATUS "ZLIBNG_HEADER_VERSION: ${ZLIBNG_HEADER_VERSION}")
project(zlib VERSION ${ZLIB_HEADER_VERSION} LANGUAGES C)
include(CheckTypeSize)
include(CheckSymbolExists)
include(CheckFunctionExists)
include(CheckIncludeFile)
include(CheckCSourceCompiles)
include(CheckCSourceRuns)
include(CheckCCompilerFlag)
include(CMakeDependentOption)
include(FeatureSummary)
include(cmake/detect-arch.cmake)
include(cmake/detect-install-dirs.cmake)
include(cmake/detect-coverage.cmake)
include(cmake/detect-intrinsics.cmake)
include(cmake/detect-sanitizer.cmake)
include(cmake/fallback-macros.cmake)
if(CMAKE_TOOLCHAIN_FILE)
message(STATUS "Using CMake toolchain: ${CMAKE_TOOLCHAIN_FILE}")
endif()
# Make sure we use an appropriate BUILD_TYPE by default, "Release" to be exact
# this should select the maximum generic optimisation on the current platform (i.e. -O3 for gcc/clang)
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(NOT GENERATOR_IS_MULTI_CONFIG)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, standard options are: Debug Release RelWithDebInfo MinSizeRel."
FORCE)
add_feature_info(CMAKE_BUILD_TYPE 1 "Build type: ${CMAKE_BUILD_TYPE} (default)")
else()
add_feature_info(CMAKE_BUILD_TYPE 1 "Build type: ${CMAKE_BUILD_TYPE} (selected)")
endif()
endif()
#
# Options parsing
#
option(WITH_GZFILEOP "Compile with support for gzFile related functions" ON)
option(ZLIB_COMPAT "Compile with zlib compatible API" OFF)
option(ZLIB_ENABLE_TESTS "Build test binaries" ON)
option(ZLIBNG_ENABLE_TESTS "Test zlib-ng specific API" ON)
option(WITH_GTEST "Build gtest_zlib" ON)
option(WITH_FUZZERS "Build test/fuzz" OFF)
option(WITH_BENCHMARKS "Build test/benchmarks" OFF)
option(WITH_BENCHMARK_APPS "Build application benchmarks" OFF)
option(WITH_OPTIM "Build with optimisation" ON)
option(WITH_REDUCED_MEM "Reduced memory usage for special cases (reduces performance)" OFF)
option(WITH_NEW_STRATEGIES "Use new strategies" ON)
option(WITH_NATIVE_INSTRUCTIONS
"Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)" OFF)
option(WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings" OFF)
option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF)
option(WITH_INFLATE_STRICT "Build with strict inflate distance checking" OFF)
option(WITH_INFLATE_ALLOW_INVALID_DIST "Build with zero fill for inflate invalid distances" OFF)
option(WITH_UNALIGNED "Support unaligned reads on platforms that support it" ON)
set(ZLIB_SYMBOL_PREFIX "" CACHE STRING "Give this prefix to all publicly exported symbols.
Useful when embedding into a larger library.
Default is no prefix (empty prefix).")
# Add multi-choice option
set(WITH_SANITIZER AUTO CACHE STRING "Enable sanitizer support")
set_property(CACHE WITH_SANITIZER PROPERTY STRINGS "Memory" "Address" "Undefined" "Thread")
if(BASEARCH_ARM_FOUND)
option(WITH_ACLE "Build with ACLE" ON)
option(WITH_NEON "Build with NEON intrinsics" ON)
cmake_dependent_option(WITH_ARMV6 "Build with ARMv6 SIMD" ON "NOT ARCH STREQUAL \"aarch64\"" OFF)
elseif(BASEARCH_PPC_FOUND)
option(WITH_ALTIVEC "Build with AltiVec (VMX) optimisations for PowerPC" ON)
option(WITH_POWER8 "Build with optimisations for POWER8" ON)
option(WITH_POWER9 "Build with optimisations for POWER9" ON)
elseif(BASEARCH_RISCV_FOUND)
option(WITH_RVV "Build with RVV intrinsics" ON)
elseif(BASEARCH_S360_FOUND)
option(WITH_DFLTCC_DEFLATE "Build with DFLTCC intrinsics for compression on IBM Z" OFF)
option(WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z" OFF)
option(WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z" ON)
elseif(BASEARCH_X86_FOUND)
option(WITH_AVX2 "Build with AVX2" ON)
option(WITH_AVX512 "Build with AVX512" ON)
option(WITH_AVX512VNNI "Build with AVX512 VNNI extensions" ON)
option(WITH_SSE2 "Build with SSE2" ON)
option(WITH_SSSE3 "Build with SSSE3" ON)
option(WITH_SSE42 "Build with SSE42" ON)
option(WITH_PCLMULQDQ "Build with PCLMULQDQ" ON)
option(WITH_VPCLMULQDQ "Build with VPCLMULQDQ" ON)
endif()
option(INSTALL_UTILS "Copy minigzip and minideflate during install" OFF)
mark_as_advanced(FORCE
ZLIB_SYMBOL_PREFIX
WITH_REDUCED_MEM
WITH_ACLE WITH_NEON
WITH_ARMV6
WITH_DFLTCC_DEFLATE
WITH_DFLTCC_INFLATE
WITH_CRC32_VX
WITH_AVX2 WITH_SSE2
WITH_SSSE3 WITH_SSE42
WITH_PCLMULQDQ
WITH_ALTIVEC
WITH_POWER8
WITH_POWER9
WITH_RVV
WITH_INFLATE_STRICT
WITH_INFLATE_ALLOW_INVALID_DIST
WITH_UNALIGNED
INSTALL_UTILS
)
if(ZLIB_COMPAT)
add_definitions(-DZLIB_COMPAT)
set(WITH_GZFILEOP ON)
set(SUFFIX "")
set(ZLIB_FULL_VERSION ${ZLIB_HEADER_VERSION}.zlib-ng)
set(EXPORT_NAME ZLIB)
else()
set(SUFFIX "-ng")
set(ZLIB_FULL_VERSION ${ZLIBNG_HEADER_VERSION})
set(EXPORT_NAME zlib-ng)
endif()
if(WITH_GZFILEOP)
add_definitions(-DWITH_GZFILEOP)
endif()
if(CMAKE_C_COMPILER_ID MATCHES "^Intel")
if(CMAKE_HOST_UNIX)
set(WARNFLAGS -Wall)
set(WARNFLAGS_MAINTAINER -Wall -Wcheck -Wremarks)
set(WARNFLAGS_DISABLE)
else()
set(WARNFLAGS /Wall)
set(WARNFLAGS_MAINTAINER /W5)
set(WARNFLAGS_DISABLE)
endif()
elseif(MSVC)
# Minimum supported MSVC version is 1800 = Visual Studio 12.0/2013
# See also https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html
if(MSVC_VERSION VERSION_LESS 1800)
message(SEND_ERROR "Unsupported Visual Studio compiler version (requires 2013 or later).")
endif()
# TODO. ICC can be used through MSVC. I'm not sure if we'd ever see that combination
# (who'd use cmake from an IDE...) but checking for ICC before checking for MSVC should
# avoid mistakes.
# /Oi ?
set(WARNFLAGS /W3)
set(WARNFLAGS_MAINTAINER /W4)
set(WARNFLAGS_DISABLE)
if(BASEARCH_ARM_FOUND)
add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE)
if(NOT "${ARCH}" MATCHES "aarch64")
set(NEONFLAG "/arch:VFPv4")
endif()
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
# Enable warnings in GCC and Clang
set(WARNFLAGS -Wall)
set(WARNFLAGS_MAINTAINER -Wextra)
set(WARNFLAGS_DISABLE)
# Check whether -fno-lto is available
set(CMAKE_REQUIRED_FLAGS "-fno-lto")
check_c_source_compiles(
"int main() { return 0; }"
FNO_LTO_AVAILABLE FAIL_REGEX "not supported")
set(CMAKE_REQUIRED_FLAGS)
if(FNO_LTO_AVAILABLE)
set(ZNOLTOFLAG "-fno-lto")
endif()
if(NOT WITH_NATIVE_INSTRUCTIONS)
if(BASEARCH_ARM_FOUND)
if("${ARCH}" MATCHES "arm" AND NOT CMAKE_C_FLAGS MATCHES "-mfloat-abi")
# Auto-detect support for ARM floating point ABI
check_include_file(features.h HAVE_FEATURES_H)
if(HAVE_FEATURES_H)
set(CMAKE_REQUIRED_FLAGS -mfloat-abi=softfp)
check_c_source_compiles(
"#include
int main() { return 0; }"
HAVE_FLOATABI_SOFTFP)
if(HAVE_FLOATABI_SOFTFP)
set(FLOATABI -mfloat-abi=softfp)
else()
set(CMAKE_REQUIRED_FLAGS -mfloat-abi=hard)
check_c_source_compiles(
"#include
int main() { return 0; }"
HAVE_FLOATABI_HARD)
if(HAVE_FLOATABI_HARD)
set(FLOATABI -mfloat-abi=hard)
endif()
endif()
set(CMAKE_REQUIRED_FLAGS)
endif()
if(FLOATABI)
message(STATUS "ARM floating point arch: ${FLOATABI}")
add_compile_options(${FLOATABI})
else()
message(STATUS "ARM floating point arch not auto-detected")
endif()
endif()
endif()
# Disable LTO unless Native Instructions are enabled
if(FNO_LTO_AVAILABLE)
set(NOLTOFLAG ${ZNOLTOFLAG})
endif()
endif()
if(MINGW)
# Add `-Wno-pedantic-ms-format` only if the toolchain supports it
check_c_compiler_flag(-Wno-pedantic-ms-format HAVE_NO_PEDANTIC_MS_FORMAT)
if(HAVE_NO_PEDANTIC_MS_FORMAT)
list(APPEND WARNFLAGS_DISABLE -Wno-pedantic-ms-format)
endif()
endif()
endif()
# Set native march/mcpu
if(WITH_NATIVE_INSTRUCTIONS)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE)
if(HAVE_MARCH_NATIVE)
set(NATIVEFLAG "-march=native")
else()
check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE)
if(HAVE_MCPU_NATIVE)
set(NATIVEFLAG "-mcpu=native")
endif()
endif()
# Fall through
endif()
if(NATIVEFLAG)
# Apply flag to all source files and compilation checks
add_compile_options(${NATIVEFLAG})
else()
message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration")
set(WITH_NATIVE_INSTRUCTIONS OFF)
endif()
endif()
# Force disable LTO if WITH_NATIVE_INSTRUCTIONS is not active
if(NOT WITH_NATIVE_INSTRUCTIONS)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF)
foreach(_cfg_name IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER "${_cfg_name}" _cfg_name_uc)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_${_cfg_name_uc} OFF)
endforeach()
endif()
# Set architecture alignment requirements
if(NOT WITH_UNALIGNED)
add_definitions(-DNO_UNALIGNED)
message(STATUS "Unaligned reads manually disabled")
endif()
# Apply warning compiler flags
if(WITH_MAINTAINER_WARNINGS)
add_compile_options(${WARNFLAGS} ${WARNFLAGS_MAINTAINER} ${WARNFLAGS_DISABLE})
else()
add_compile_options(${WARNFLAGS} ${WARNFLAGS_DISABLE})
endif()
# Set code coverage compiler flags
if(WITH_CODE_COVERAGE)
add_code_coverage()
endif()
# Replace optimization level 3 added by default with level 2
if(NOT WITH_CODE_COVERAGE AND NOT MSVC AND NOT CMAKE_C_FLAGS MATCHES "([\\/\\-]O)3")
string(REGEX REPLACE "([\\/\\-]O)3" "\\12"
CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
endif()
#
# Check for standard/system includes
#
check_include_file(arm_acle.h HAVE_ARM_ACLE_H)
if(HAVE_ARM_ACLE_H)
add_definitions(-DHAVE_ARM_ACLE_H)
endif()
check_include_file(sys/auxv.h HAVE_SYS_AUXV_H)
if(HAVE_SYS_AUXV_H)
add_definitions(-DHAVE_SYS_AUXV_H)
endif()
check_include_file(sys/sdt.h HAVE_SYS_SDT_H)
if(HAVE_SYS_SDT_H)
add_definitions(-DHAVE_SYS_SDT_H)
endif()
check_include_file(unistd.h HAVE_UNISTD_H)
#
# Check to see if we have large file support
#
set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
check_type_size(off64_t OFF64_T)
if(HAVE_OFF64_T)
add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
else()
check_type_size(_off64_t _OFF64_T)
if(HAVE__OFF64_T)
add_definitions(-D_LARGEFILE64_SOURCE=1 -D__USE_LARGEFILE64)
else()
check_type_size(__off64_t __OFF64_T)
endif()
endif()
set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
#
# Check for fseeko and other optional functions
#
check_function_exists(fseeko HAVE_FSEEKO)
if(NOT HAVE_FSEEKO)
add_definitions(-DNO_FSEEKO)
endif()
check_function_exists(strerror HAVE_STRERROR)
if(NOT HAVE_STRERROR)
add_definitions(-DNO_STRERROR)
endif()
set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L)
check_symbol_exists(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
if(HAVE_POSIX_MEMALIGN)
add_definitions(-DHAVE_POSIX_MEMALIGN)
endif()
set(CMAKE_REQUIRED_DEFINITIONS)
set(CMAKE_REQUIRED_DEFINITIONS -D_ISOC11_SOURCE=1)
check_symbol_exists(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
if(HAVE_ALIGNED_ALLOC)
add_definitions(-DHAVE_ALIGNED_ALLOC)
endif()
set(CMAKE_REQUIRED_DEFINITIONS)
if(WITH_SANITIZER STREQUAL "Address")
add_address_sanitizer()
elseif(WITH_SANITIZER STREQUAL "Memory")
add_memory_sanitizer()
elseif(WITH_SANITIZER STREQUAL "Thread")
add_thread_sanitizer()
elseif(WITH_SANITIZER STREQUAL "Undefined")
add_undefined_sanitizer()
endif()
#
# Check whether compiler supports -fno-semantic-interposition parameter
#
check_c_compiler_flag(-fno-semantic-interposition HAVE_NO_INTERPOSITION)
#
# Check if we can hide zlib internal symbols that are linked between separate source files using hidden
#
check_c_source_compiles(
"#define Z_INTERNAL __attribute__((visibility (\"hidden\")))
int Z_INTERNAL foo;
int main() {
return 0;
}"
HAVE_ATTRIBUTE_VISIBILITY_HIDDEN FAIL_REGEX "visibility")
if(HAVE_ATTRIBUTE_VISIBILITY_HIDDEN)
add_definitions(-DHAVE_VISIBILITY_HIDDEN)
endif()
#
# Check if we can hide zlib internal symbols that are linked between separate source files using internal
#
check_c_source_compiles(
"#define Z_INTERNAL __attribute__((visibility (\"internal\")))
int Z_INTERNAL foo;
int main() {
return 0;
}"
HAVE_ATTRIBUTE_VISIBILITY_INTERNAL FAIL_REGEX "visibility")
if(HAVE_ATTRIBUTE_VISIBILITY_INTERNAL)
add_definitions(-DHAVE_VISIBILITY_INTERNAL)
endif()
#
# Check for __attribute__((aligned(x))) support in the compiler
#
check_c_source_compiles(
"int main(void) {
__attribute__((aligned(8))) int test = 0;
(void)test;
return 0;
}"
HAVE_ATTRIBUTE_ALIGNED FAIL_REGEX "aligned")
if(HAVE_ATTRIBUTE_ALIGNED)
add_definitions(-DHAVE_ATTRIBUTE_ALIGNED)
endif()
#
# check for __builtin_ctz() support in the compiler
#
check_c_source_compiles(
"int main(void) {
unsigned int zero = 0;
long test = __builtin_ctz(zero);
(void)test;
return 0;
}"
HAVE_BUILTIN_CTZ
)
if(HAVE_BUILTIN_CTZ)
add_definitions(-DHAVE_BUILTIN_CTZ)
endif()
#
# check for __builtin_ctzll() support in the compiler
#
check_c_source_compiles(
"int main(void) {
unsigned int zero = 0;
long test = __builtin_ctzll(zero);
(void)test;
return 0;
}"
HAVE_BUILTIN_CTZLL
)
if(HAVE_BUILTIN_CTZLL)
add_definitions(-DHAVE_BUILTIN_CTZLL)
endif()
#
# check for ptrdiff_t support
#
check_c_source_compiles(
"#include
int main() {
ptrdiff_t *a;
(void)a;
return 0;
}"
HAVE_PTRDIFF_T
)
if(NOT HAVE_PTRDIFF_T)
set(NEED_PTRDIFF_T 1)
check_type_size("void *" SIZEOF_DATA_PTR)
message(STATUS "sizeof(void *) is ${SIZEOF_DATA_PTR} bytes")
if(${SIZEOF_DATA_PTR} MATCHES "4")
set(PTRDIFF_TYPE "uint32_t")
elseif(${SIZEOF_DATA_PTR} MATCHES "8")
set(PTRDIFF_TYPE "uint64_t")
else()
message(FATAL_ERROR "sizeof(void *) is neither 32 nor 64 bit")
endif()
endif()
add_compile_options($<$:-DZLIB_DEBUG>)
if(MSVC)
set(CMAKE_DEBUG_POSTFIX "d")
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
endif()
if(BASEARCH_X86_FOUND)
# FORCE_SSE2 option will only be shown if HAVE_SSE2_INTRIN is true
if("${ARCH}" MATCHES "i[3-6]86")
cmake_dependent_option(FORCE_SSE2 "Always assume CPU is SSE2 capable" OFF "HAVE_SSE2_INTRIN" OFF)
endif()
endif()
#
# Enable deflate_quick at level 1
#
if(NOT WITH_NEW_STRATEGIES)
add_definitions(-DNO_QUICK_STRATEGY)
endif()
#
# Enable deflate_medium at level 4-6
#
if(NOT WITH_NEW_STRATEGIES)
add_definitions(-DNO_MEDIUM_STRATEGY)
endif()
#
# Enable inflate compilation options
#
if(WITH_INFLATE_STRICT)
add_definitions(-DINFLATE_STRICT)
message(STATUS "Inflate strict distance checking enabled")
endif()
if(WITH_INFLATE_ALLOW_INVALID_DIST)
add_definitions(-DINFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR)
message(STATUS "Inflate zero data for invalid distances enabled")
endif()
#
# Enable reduced memory configuration
#
if(WITH_REDUCED_MEM)
add_definitions(-DHASH_SIZE=32768u -DGZBUFSIZE=8192)
message(STATUS "Configured for reduced memory environment")
endif()
set(ZLIB_ARCH_SRCS)
set(ZLIB_ARCH_HDRS)
set(ARCHDIR "arch/generic")
if(BASEARCH_ARM_FOUND)
set(ARCHDIR "arch/arm")
elseif(BASEARCH_PPC_FOUND)
set(ARCHDIR "arch/power")
elseif(BASEARCH_RISCV_FOUND)
set(ARCHDIR "arch/riscv")
elseif(BASEARCH_S360_FOUND)
set(ARCHDIR "arch/s390")
elseif(BASEARCH_X86_FOUND)
set(ARCHDIR "arch/x86")
if(NOT ${ARCH} MATCHES "x86_64")
add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"")
endif()
else()
message(STATUS "No optimized architecture: using ${ARCHDIR}")
endif()
if(WITH_OPTIM)
if(BASEARCH_ARM_FOUND)
add_definitions(-DARM_FEATURES)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
if("${ARCH}" MATCHES "aarch64")
check_c_source_compiles(
"#include
int main() {
return (getauxval(AT_HWCAP) & HWCAP_CRC32);
}"
ARM_AUXV_HAS_CRC32
)
if(ARM_AUXV_HAS_CRC32)
add_definitions(-DARM_AUXV_HAS_CRC32)
else()
message(STATUS "HWCAP_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
endif()
else()
check_c_source_compiles(
"#include
int main() {
return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
}"
ARM_AUXV_HAS_CRC32
)
if(ARM_AUXV_HAS_CRC32)
add_definitions(-DARM_AUXV_HAS_CRC32)
else()
check_c_source_compiles(
"#include
#include
int main() {
return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
}"
ARM_HWCAP_HAS_CRC32
)
if (ARM_HWCAP_HAS_CRC32)
add_definitions(-DARM_AUXV_HAS_CRC32 -DARM_ASM_HWCAP)
else()
message(STATUS "HWCAP2_CRC32 not present in sys/auxv.h; cannot detect support at runtime.")
endif()
endif()
check_c_source_compiles(
"#include
int main() {
return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON);
}"
ARM_AUXV_HAS_NEON
)
if(ARM_AUXV_HAS_NEON)
add_definitions(-DARM_AUXV_HAS_NEON)
else()
check_c_source_compiles(
"#include
int main() {
return (getauxval(AT_HWCAP) & HWCAP_NEON);
}"
ARM_AUXV_HAS_NEON
)
if (ARM_AUXV_HAS_NEON)
add_definitions(-DARM_AUXV_HAS_NEON)
else()
message(STATUS "Neither HWCAP_ARM_NEON or HWCAP_NEON present in sys/auxv.h; cannot detect support at runtime.")
endif()
endif()
endif()
endif()
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/arm_features.c)
if(WITH_ACLE)
check_acle_compiler_flag()
if(HAVE_ACLE_FLAG)
add_definitions(-DARM_ACLE)
set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c)
set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG} ${NOLTOFLAG}")
list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS})
add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"")
else()
set(WITH_ACLE OFF)
endif()
else()
set(WITH_ACLE OFF)
endif()
if(WITH_NEON)
check_neon_compiler_flag()
if(NEON_AVAILABLE)
add_definitions(-DARM_NEON)
set(NEON_SRCS ${ARCHDIR}/adler32_neon.c ${ARCHDIR}/chunkset_neon.c
${ARCHDIR}/compare256_neon.c ${ARCHDIR}/slide_hash_neon.c)
list(APPEND ZLIB_ARCH_SRCS ${NEON_SRCS})
set_property(SOURCE ${NEON_SRCS} PROPERTY COMPILE_FLAGS "${NEONFLAG} ${NOLTOFLAG}")
if(MSVC)
add_definitions(-D__ARM_NEON__)
endif()
add_feature_info(NEON_ADLER32 1 "Support NEON instructions in adler32, using \"${NEONFLAG}\"")
add_feature_info(NEON_SLIDEHASH 1 "Support NEON instructions in slide_hash, using \"${NEONFLAG}\"")
check_neon_ld4_intrinsics()
if(NEON_HAS_LD4)
add_definitions(-DARM_NEON_HASLD4)
endif()
else()
set(WITH_NEON OFF)
endif()
endif()
if(WITH_ARMV6)
check_armv6_compiler_flag()
if(HAVE_ARMV6_INLINE_ASM OR HAVE_ARMV6_INTRIN)
add_definitions(-DARM_SIMD)
set(ARMV6_SRCS ${ARCHDIR}/slide_hash_armv6.c)
set_property(SOURCE ${ARMV6_SRCS} PROPERTY COMPILE_FLAGS "${ARMV6FLAG} ${NOLTOFLAG}")
list(APPEND ZLIB_ARCH_SRCS ${ARMV6_SRCS})
add_feature_info(ARMV6 1 "Support ARMv6 SIMD instructions in slide_hash, using \"${ARMV6FLAG}\"")
if(HAVE_ARMV6_INTRIN)
add_definitions(-DARM_SIMD_INTRIN)
endif()
else()
set(WITH_ARMV6 OFF)
endif()
else()
set(WITH_ARMV6 OFF)
endif()
elseif(BASEARCH_PPC_FOUND)
# Common arch detection code
if(WITH_ALTIVEC)
check_ppc_intrinsics()
endif()
if(WITH_POWER8)
check_power8_intrinsics()
endif()
if(WITH_POWER9)
check_power9_intrinsics()
endif()
if(HAVE_VMX OR HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN)
add_definitions(-DPOWER_FEATURES)
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_features.h)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/power_features.c)
endif()
# VMX specific options and files
if(WITH_ALTIVEC)
if(HAVE_VMX)
add_definitions(-DPPC_FEATURES)
if(HAVE_ALTIVEC)
add_definitions(-DPPC_VMX)
set(PPC_SRCS ${ARCHDIR}/adler32_vmx.c ${ARCHDIR}/slide_hash_vmx.c)
list(APPEND ZLIB_ARCH_SRCS ${PPC_SRCS})
add_feature_info(ALTIVEC 1 "Support the AltiVec instruction set, using \"-maltivec\"")
set_property(SOURCE ${PPC_SRCS} PROPERTY COMPILE_FLAGS "${PPCFLAGS}")
else()
set(WITH_ALTIVEC OFF)
endif()
endif()
endif()
# Power8 specific options and files
if(WITH_POWER8)
if(HAVE_POWER8_INTRIN)
add_definitions(-DPOWER8_VSX)
set(POWER8_SRCS ${ARCHDIR}/adler32_power8.c ${ARCHDIR}/chunkset_power8.c ${ARCHDIR}/slide_hash_power8.c)
if("${ARCH}" MATCHES "powerpc64(le)?")
add_definitions(-DPOWER8_VSX_CRC32)
list(APPEND POWER8_SRCS ${ARCHDIR}/crc32_power8.c)
endif()
list(APPEND ZLIB_ARCH_SRCS ${POWER8_SRCS})
set_property(SOURCE ${POWER8_SRCS} PROPERTY COMPILE_FLAGS "${POWER8FLAG} ${NOLTOFLAG}")
else()
set(WITH_POWER8 OFF)
endif()
endif()
# Power9 specific options and files
if(WITH_POWER9)
if(HAVE_POWER9_INTRIN)
add_definitions(-DPOWER9)
set(POWER9_SRCS ${ARCHDIR}/compare256_power9.c)
list(APPEND ZLIB_ARCH_SRCS ${POWER9_SRCS})
set_property(SOURCE ${POWER9_SRCS} PROPERTY COMPILE_FLAGS "${POWER9FLAG} ${NOLTOFLAG}")
else()
set(WITH_POWER9 OFF)
endif()
endif()
elseif(BASEARCH_RISCV_FOUND)
if(WITH_RVV)
check_rvv_intrinsics()
if(HAVE_RVV_INTRIN)
add_definitions(-DRISCV_FEATURES)
add_definitions(-DRISCV_RVV)
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_features.h)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/riscv_features.c)
# FIXME: we will not set compile flags for riscv_features.c when
# the kernels update hwcap or hwprobe for riscv
set(RVV_SRCS ${ARCHDIR}/riscv_features.c ${ARCHDIR}/adler32_rvv.c ${ARCHDIR}/chunkset_rvv.c ${ARCHDIR}/compare256_rvv.c ${ARCHDIR}/slide_hash_rvv.c)
list(APPEND ZLIB_ARCH_SRCS ${RVV_SRCS})
set_property(SOURCE ${RVV_SRCS} PROPERTY COMPILE_FLAGS "${RISCVFLAG} ${NOLTOFLAG}")
else()
set(WITH_RVV OFF)
endif()
endif()
elseif(BASEARCH_S360_FOUND)
check_s390_intrinsics()
if(HAVE_S390_INTRIN)
add_definitions(-DS390_FEATURES)
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_features.h)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/s390_features.c)
endif()
if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_common.c)
endif()
if(WITH_DFLTCC_DEFLATE)
add_definitions(-DS390_DFLTCC_DEFLATE)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_deflate.c)
endif()
if(WITH_DFLTCC_INFLATE)
add_definitions(-DS390_DFLTCC_INFLATE)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_inflate.c)
endif()
if(WITH_CRC32_VX)
check_vgfma_intrinsics()
if(HAVE_VGFMA_INTRIN)
add_definitions(-DS390_CRC32_VX)
set(CRC32_VX_SRCS ${ARCHDIR}/crc32-vx.c)
list(APPEND ZLIB_ARCH_SRCS ${CRC32_VX_SRCS})
set_property(SOURCE ${CRC32_VX_SRCS} PROPERTY COMPILE_FLAGS "${VGFMAFLAG} ${NOLTOFLAG}")
else()
set(WITH_CRC32_VX OFF)
endif()
endif()
elseif(BASEARCH_X86_FOUND)
add_definitions(-DX86_FEATURES)
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_features.h)
list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86_features.c)
if(MSVC)
list(APPEND ZLIB_ARCH_HDRS fallback_builtins.h)
endif()
if(WITH_AVX2)
check_avx2_intrinsics()
if(HAVE_AVX2_INTRIN)
add_definitions(-DX86_AVX2)
set(AVX2_SRCS ${ARCHDIR}/slide_hash_avx2.c)
add_feature_info(AVX2_SLIDEHASH 1 "Support AVX2 optimized slide_hash, using \"${AVX2FLAG}\"")
list(APPEND AVX2_SRCS ${ARCHDIR}/chunkset_avx2.c)
add_feature_info(AVX2_CHUNKSET 1 "Support AVX2 optimized chunkset, using \"${AVX2FLAG}\"")
list(APPEND AVX2_SRCS ${ARCHDIR}/compare256_avx2.c)
add_feature_info(AVX2_COMPARE256 1 "Support AVX2 optimized compare256, using \"${AVX2FLAG}\"")
list(APPEND AVX2_SRCS ${ARCHDIR}/adler32_avx2.c)
add_feature_info(AVX2_ADLER32 1 "Support AVX2-accelerated adler32, using \"${AVX2FLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${AVX2_SRCS})
set_property(SOURCE ${AVX2_SRCS} PROPERTY COMPILE_FLAGS "${AVX2FLAG} ${NOLTOFLAG}")
else()
set(WITH_AVX2 OFF)
endif()
endif()
if(WITH_AVX512)
check_avx512_intrinsics()
if(HAVE_AVX512_INTRIN)
add_definitions(-DX86_AVX512)
list(APPEND AVX512_SRCS ${ARCHDIR}/adler32_avx512.c)
add_feature_info(AVX512_ADLER32 1 "Support AVX512-accelerated adler32, using \"${AVX512FLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${AVX512_SRCS})
list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/adler32_avx512_p.h)
if(HAVE_MASK_INTRIN)
add_definitions(-DX86_MASK_INTRIN)
endif()
set_property(SOURCE ${AVX512_SRCS} PROPERTY COMPILE_FLAGS "${AVX512FLAG} ${NOLTOFLAG}")
else()
set(WITH_AVX512 OFF)
endif()
endif()
if(WITH_AVX512VNNI)
check_avx512vnni_intrinsics()
if(HAVE_AVX512VNNI_INTRIN)
add_definitions(-DX86_AVX512VNNI)
add_feature_info(AVX512VNNI_ADLER32 1 "Support AVX512VNNI adler32, using \"${AVX512VNNIFLAG}\"")
list(APPEND AVX512VNNI_SRCS ${ARCHDIR}/adler32_avx512_vnni.c)
list(APPEND ZLIB_ARCH_SRCS ${AVX512VNNI_SRCS})
set_property(SOURCE ${AVX512VNNI_SRCS} PROPERTY COMPILE_FLAGS "${AVX512VNNIFLAG} ${NOLTOFLAG}")
else()
set(WITH_AVX512VNNI OFF)
endif()
endif()
if(WITH_SSE42)
check_sse42_intrinsics()
if(HAVE_SSE42_INTRIN)
add_definitions(-DX86_SSE42)
set(SSE42_SRCS ${ARCHDIR}/adler32_sse42.c ${ARCHDIR}/insert_string_sse42.c)
add_feature_info(SSE42_CRC 1 "Support SSE4.2 optimized CRC hash generation, using \"${SSE42FLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS})
set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${NOLTOFLAG}")
else()
set(WITH_SSE42 OFF)
endif()
endif()
if(WITH_SSE2)
check_sse2_intrinsics()
if(HAVE_SSE2_INTRIN)
add_definitions(-DX86_SSE2)
set(SSE2_SRCS ${ARCHDIR}/chunkset_sse2.c ${ARCHDIR}/compare256_sse2.c ${ARCHDIR}/slide_hash_sse2.c)
list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS})
if(NOT ${ARCH} MATCHES "x86_64")
set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG} ${NOLTOFLAG}")
add_feature_info(FORCE_SSE2 FORCE_SSE2 "Assume CPU is SSE2 capable")
if(FORCE_SSE2)
add_definitions(-DX86_NOCHECK_SSE2)
endif()
endif()
else()
set(WITH_SSE2 OFF)
endif()
endif()
if(WITH_SSSE3)
check_ssse3_intrinsics()
if(HAVE_SSSE3_INTRIN)
add_definitions(-DX86_SSSE3)
set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c ${ARCHDIR}/chunkset_ssse3.c)
add_feature_info(SSSE3_ADLER32 1 "Support SSSE3-accelerated adler32, using \"${SSSE3FLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${SSSE3_SRCS})
set_property(SOURCE ${SSSE3_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${NOLTOFLAG}")
else()
set(WITH_SSSE3 OFF)
endif()
endif()
if(WITH_PCLMULQDQ AND WITH_SSSE3 AND WITH_SSE42)
check_pclmulqdq_intrinsics()
if(HAVE_PCLMULQDQ_INTRIN AND HAVE_SSSE3_INTRIN)
add_definitions(-DX86_PCLMULQDQ_CRC)
set(PCLMULQDQ_SRCS ${ARCHDIR}/crc32_pclmulqdq.c)
add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${PCLMULQDQ_SRCS})
set_property(SOURCE ${PCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG} ${NOLTOFLAG}")
if(WITH_VPCLMULQDQ AND WITH_AVX512)
check_vpclmulqdq_intrinsics()
if(HAVE_VPCLMULQDQ_INTRIN AND HAVE_AVX512_INTRIN)
add_definitions(-DX86_VPCLMULQDQ_CRC)
set(VPCLMULQDQ_SRCS ${ARCHDIR}/crc32_vpclmulqdq.c)
add_feature_info(VPCLMUL_CRC 1 "Support CRC hash generation using VPCLMULQDQ, using \"${VPCLMULFLAG} ${AVX512FLAG}\"")
list(APPEND ZLIB_ARCH_SRCS ${VPCLMULQDQ_SRCS})
set_property(SOURCE ${VPCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG} ${NOLTOFLAG}")
else()
set(WITH_VPCLMULQDQ OFF)
endif()
else()
set(WITH_VPCLMULQDQ OFF)
endif()
else()
set(WITH_PCLMULQDQ OFF)
set(WITH_VPCLMULQDQ OFF)
endif()
else()
set(WITH_PCLMULQDQ OFF)
set(WITH_VPCLMULQDQ OFF)
endif()
check_xsave_intrinsics()
if(HAVE_XSAVE_INTRIN)
add_feature_info(XSAVE 1 "Support XSAVE intrinsics using \"${XSAVEFLAG}\"")
set_property(SOURCE ${ARCHDIR}/x86_features.c PROPERTY COMPILE_FLAGS "${XSAVEFLAG}")
endif()
endif()
endif()
message(STATUS "Architecture-specific source files: ${ZLIB_ARCH_SRCS}")
#============================================================================
# zconf.h
#============================================================================
macro(generate_cmakein input output)
file(REMOVE ${output})
file(STRINGS ${input} _lines)
foreach(_line IN LISTS _lines)
string(REGEX REPLACE "#ifdef HAVE_UNISTD_H.*" "@ZCONF_UNISTD_LINE@" _line "${_line}")
string(REGEX REPLACE "#ifdef NEED_PTRDIFF_T.*" "@ZCONF_PTRDIFF_LINE@" _line "${_line}")
if(NEED_PTRDIFF_T)
string(REGEX REPLACE "typedef PTRDIFF_TYPE" "typedef @PTRDIFF_TYPE@" _line "${_line}")
endif()
file(APPEND ${output} "${_line}\n")
endforeach()
endmacro(generate_cmakein)
generate_cmakein( ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.in ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein )
if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
# If we're doing an out of source build and the user has a zconf.h
# in their source tree...
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h)
message(STATUS "Renaming")
message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h")
message(STATUS "to 'zconf${SUFFIX}.h.included' because this file is included with zlib")
message(STATUS "but CMake generates it automatically in the build directory.")
file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.included)
endif()
# If we're doing an out of source build and the user has a zconf.h.cmakein
# in their source tree...
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein)
message(STATUS "Renaming")
message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein")
message(STATUS "to 'zconf${SUFFIX}.h.cmakeincluded' because this file is included with zlib")
message(STATUS "but CMake generates it automatically in the build directory.")
file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakein ${CMAKE_CURRENT_SOURCE_DIR}/zconf${SUFFIX}.h.cmakeincluded)
endif()
endif()
# The user is allowed (but discouraged) to set absolute CMAKE_INSTALL_*DIR paths.
# If they do, we copy these non-relocatable paths into the pkg-config file.
if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
set(PC_INC_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
else()
set(PC_INC_INSTALL_DIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
endif()
if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
set(PC_LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}")
else()
set(PC_LIB_INSTALL_DIR "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
endif()
#============================================================================
# zlib
#============================================================================
set(ZLIB_PUBLIC_HDRS
${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h
${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h
${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h
)
set(ZLIB_PRIVATE_HDRS
adler32_p.h
chunkset_tpl.h
compare256_rle.h
cpu_features.h
crc32_braid_p.h
crc32_braid_comb_p.h
crc32_braid_tbl.h
crc32_fold.h
deflate.h
deflate_p.h
functable.h
inffast_tpl.h
inffixed_tbl.h
inflate.h
inflate_p.h
inftrees.h
insert_string_tpl.h
match_tpl.h
trees.h
trees_emit.h
trees_tbl.h
zbuild.h
zendian.h
zutil.h
)
set(ZLIB_SRCS
adler32.c
adler32_fold.c
chunkset.c
compare256.c
compress.c
cpu_features.c
crc32_braid.c
crc32_braid_comb.c
crc32_fold.c
deflate.c
deflate_fast.c
deflate_huff.c
deflate_medium.c
deflate_quick.c
deflate_rle.c
deflate_slow.c
deflate_stored.c
functable.c
infback.c
inflate.c
inftrees.c
insert_string.c
insert_string_roll.c
slide_hash.c
trees.c
uncompr.c
zutil.c
)
set(ZLIB_GZFILE_PRIVATE_HDRS
gzguts.h
)
set(ZLIB_GZFILE_SRCS
gzlib.c
${CMAKE_CURRENT_BINARY_DIR}/gzread.c
gzwrite.c
)
set(ZLIB_ALL_SRCS ${ZLIB_SRCS} ${ZLIB_ARCH_HDRS} ${ZLIB_ARCH_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
if(WITH_GZFILEOP)
list(APPEND ZLIB_ALL_SRCS ${ZLIB_GZFILE_PRIVATE_HDRS} ${ZLIB_GZFILE_SRCS})
endif()
if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
set(ZLIB_DLL_SRCS win32/zlib${SUFFIX}1.rc)
endif()
if(NOT DEFINED BUILD_SHARED_LIBS)
add_library(zlib SHARED ${ZLIB_ALL_SRCS} ${ZLIB_DLL_SRCS})
add_library(zlibstatic STATIC ${ZLIB_ALL_SRCS})
set(ZLIB_INSTALL_LIBRARIES zlib zlibstatic)
else()
add_library(zlib ${ZLIB_ALL_SRCS})
if(BUILD_SHARED_LIBS)
target_sources(zlib PRIVATE ${ZLIB_DLL_SRCS})
else()
add_library(zlibstatic ALIAS zlib)
endif()
set(ZLIB_INSTALL_LIBRARIES zlib)
endif()
foreach(ZLIB_INSTALL_LIBRARY ${ZLIB_INSTALL_LIBRARIES})
if(NOT ZLIB_COMPAT)
target_compile_definitions(${ZLIB_INSTALL_LIBRARY} PUBLIC ZLIBNG_NATIVE_API)
endif()
target_include_directories(${ZLIB_INSTALL_LIBRARY} PUBLIC
"$"
"$")
endforeach()
if(WIN32)
# Shared library
if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
set_target_properties(zlib PROPERTIES OUTPUT_NAME zlib${SUFFIX})
endif()
# Static library
if(NOT DEFINED BUILD_SHARED_LIBS)
if(MSVC)
set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME zlibstatic${SUFFIX})
else()
set_target_properties(zlibstatic PROPERTIES OUTPUT_NAME z${SUFFIX})
endif()
elseif(NOT BUILD_SHARED_LIBS)
if(MSVC)
set_target_properties(zlib PROPERTIES OUTPUT_NAME zlibstatic${SUFFIX})
else()
set_target_properties(zlib PROPERTIES OUTPUT_NAME z${SUFFIX})
endif()
endif()
else()
# On unix-like platforms the library is almost always called libz
set_target_properties(${ZLIB_INSTALL_LIBRARIES} PROPERTIES OUTPUT_NAME z${SUFFIX})
endif()
if(NOT DEFINED BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS)
set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
if(ZLIB_COMPAT)
set_target_properties(zlib PROPERTIES SOVERSION 1)
else()
set_target_properties(zlib PROPERTIES SOVERSION 2)
endif()
if(NOT CYGWIN)
# This property causes shared libraries on Linux to have the full version
# encoded into their final filename. We disable this on Cygwin because
# it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
# seems to be the default.
#
# This has no effect with MSVC, on that platform the version info for
# the DLL comes from the resource file win32/zlib1.rc
set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
endif()
if(UNIX)
if(HAVE_NO_INTERPOSITION)
set_target_properties(zlib PROPERTIES COMPILE_FLAGS "-fno-semantic-interposition")
endif()
if(NOT APPLE)
if(NOT ZLIB_COMPAT)
add_definitions(-DHAVE_SYMVER)
endif()
set_target_properties(zlib PROPERTIES LINK_FLAGS
"-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.map\"")
endif()
endif()
if(MSYS)
# Suppress version number from shared library name
set(CMAKE_SHARED_LIBRARY_NAME_WITH_VERSION 0)
elseif(WIN32)
# Creates zlib1.dll when building shared library version
if(ZLIB_COMPAT)
set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
else()
set_target_properties(zlib PROPERTIES SUFFIX "2.dll")
endif()
endif()
endif()
#
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
target_compile_options(zlib PRIVATE /std:c++17 /permissive- /Z7 $<$:/Ob3> $<$:/Gy> $<$:/arch:SSE2>)
target_link_options(zlib PRIVATE /DEBUG:FULL $<$:/OPT:REF> $<$:/OPT:ICF>)
endif()
#
if(HAVE_UNISTD_H)
SET(ZCONF_UNISTD_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */")
else()
SET(ZCONF_UNISTD_LINE "#if 0 /* was set to #if 0 by configure/cmake/etc */")
endif()
if(NEED_PTRDIFF_T)
SET(ZCONF_PTRDIFF_LINE "#if 1 /* was set to #if 1 by configure/cmake/etc */")
else()
SET(ZCONF_PTRDIFF_LINE "#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */")
endif()
set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.pc)
if(WITH_GZFILEOP)
set(PKG_CONFIG_CFLAGS "-DWITH_GZFILEOP")
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
${ZLIB_PC} @ONLY)
configure_file(${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein
${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.h.in
${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gzread.c.in
${CMAKE_CURRENT_BINARY_DIR}/gzread.c @ONLY)
if (NOT ZLIB_SYMBOL_PREFIX STREQUAL "")
add_feature_info(ZLIB_SYMBOL_PREFIX ON "Publicly exported symbols have a custom prefix")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib_name_mangling${SUFFIX}.h.in
${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h @ONLY)
else()
add_feature_info(ZLIB_SYMBOL_PREFIX OFF "Publicly exported symbols DO NOT have a custom prefix")
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib_name_mangling.h.empty
${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h COPYONLY)
endif()
# add_definitions(-DZLIB_SYMBOL_PREFIX=${ZLIB_SYMBOL_PREFIX}) # not needed
if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
install(TARGETS ${ZLIB_INSTALL_LIBRARIES}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
endif()
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zlib${SUFFIX}.h)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zlib_name_mangling${SUFFIX}.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zlib_name_mangling${SUFFIX}.h)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" RENAME zconf${SUFFIX}.h)
endif()
if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL)
install(FILES ${ZLIB_PC} DESTINATION "${PKGCONFIG_INSTALL_DIR}")
# INFO: Mimics official zlib CMake target
# Generates ZLIB.cmake in case ZLIB_COMPAT=ON and always exports the CMake target ZLIB::ZLIB
# In case ZLIB_COMPAT=OFF, the CMake target and file follows zlib-ng naming convention
if (ZLIB_COMPAT)
if (TARGET zlib)
set_target_properties(zlib PROPERTIES EXPORT_NAME ZLIB)
else()
set_target_properties(zlibstatic PROPERTIES EXPORT_NAME ZLIB)
endif()
endif()
install(TARGETS ${ZLIB_INSTALL_LIBRARIES}
EXPORT ${EXPORT_NAME}
DESTINATION "${CMAKE_INSTALL_LIBDIR}")
install(EXPORT ${EXPORT_NAME}
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${EXPORT_NAME}"
NAMESPACE ${EXPORT_NAME}::)
endif()
#============================================================================
# Example binaries
#============================================================================
if(ZLIB_ENABLE_TESTS)
enable_testing()
if(BUILD_SHARED_LIBS)
if(ZLIBNG_ENABLE_TESTS)
message(STATUS "Disabling zlib-ng tests because shared libraries are enabled")
set(ZLIBNG_ENABLE_TESTS OFF)
endif()
if(WITH_BENCHMARKS OR WITH_BENCHMARK_APPS)
message(STATUS "Disabling benchmarks because shared libraries are enabled")
set(WITH_BENCHMARKS OFF)
set(WITH_BENCHMARK_APPS OFF)
endif()
endif()
add_subdirectory(test)
endif()
add_feature_info(WITH_GZFILEOP WITH_GZFILEOP "Compile with support for gzFile related functions")
add_feature_info(ZLIB_COMPAT ZLIB_COMPAT "Compile with zlib compatible API")
add_feature_info(ZLIB_ENABLE_TESTS ZLIB_ENABLE_TESTS "Build test binaries")
add_feature_info(ZLIBNG_ENABLE_TESTS ZLIBNG_ENABLE_TESTS "Test zlib-ng specific API")
add_feature_info(WITH_SANITIZER WITH_SANITIZER "Enable sanitizer support")
add_feature_info(WITH_GTEST WITH_GTEST "Build gtest_zlib")
add_feature_info(WITH_FUZZERS WITH_FUZZERS "Build test/fuzz")
add_feature_info(WITH_BENCHMARKS WITH_BENCHMARKS "Build test/benchmarks")
add_feature_info(WITH_BENCHMARK_APPS WITH_BENCHMARK_APPS "Build application benchmarks")
add_feature_info(WITH_OPTIM WITH_OPTIM "Build with optimisation")
add_feature_info(WITH_NEW_STRATEGIES WITH_NEW_STRATEGIES "Use new strategies")
add_feature_info(WITH_NATIVE_INSTRUCTIONS WITH_NATIVE_INSTRUCTIONS
"Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)")
add_feature_info(WITH_MAINTAINER_WARNINGS WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings")
add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting")
add_feature_info(WITH_INFLATE_STRICT WITH_INFLATE_STRICT "Build with strict inflate distance checking")
add_feature_info(WITH_INFLATE_ALLOW_INVALID_DIST WITH_INFLATE_ALLOW_INVALID_DIST "Build with zero fill for inflate invalid distances")
if(BASEARCH_ARM_FOUND)
add_feature_info(WITH_ACLE WITH_ACLE "Build with ACLE")
add_feature_info(WITH_NEON WITH_NEON "Build with NEON intrinsics")
add_feature_info(WITH_ARMV6 WITH_ARMV6 "Build with ARMv6 SIMD")
elseif(BASEARCH_PPC_FOUND)
add_feature_info(WITH_ALTIVEC WITH_ALTIVEC "Build with AltiVec optimisations")
add_feature_info(WITH_POWER8 WITH_POWER8 "Build with optimisations for POWER8")
add_feature_info(WITH_POWER9 WITH_POWER9 "Build with optimisations for POWER9")
elseif(BASEARCH_RISCV_FOUND)
add_feature_info(WITH_RVV WITH_RVV "Build with RVV intrinsics")
elseif(BASEARCH_S360_FOUND)
add_feature_info(WITH_DFLTCC_DEFLATE WITH_DFLTCC_DEFLATE "Build with DFLTCC intrinsics for compression on IBM Z")
add_feature_info(WITH_DFLTCC_INFLATE WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z")
add_feature_info(WITH_CRC32_VX WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z")
elseif(BASEARCH_X86_FOUND)
add_feature_info(WITH_AVX2 WITH_AVX2 "Build with AVX2")
add_feature_info(WITH_AVX512 WITH_AVX512 "Build with AVX512")
add_feature_info(WITH_AVX512VNNI WITH_AVX512VNNI "Build with AVX512 VNNI")
add_feature_info(WITH_SSE2 WITH_SSE2 "Build with SSE2")
add_feature_info(WITH_SSSE3 WITH_SSSE3 "Build with SSSE3")
add_feature_info(WITH_SSE42 WITH_SSE42 "Build with SSE42")
add_feature_info(WITH_PCLMULQDQ WITH_PCLMULQDQ "Build with PCLMULQDQ")
add_feature_info(WITH_VPCLMULQDQ WITH_VPCLMULQDQ "Build with VPCLMULQDQ")
endif()
add_feature_info(INSTALL_UTILS INSTALL_UTILS "Copy minigzip and minideflate during install")
FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES)
#============================================================================
# CPack
#============================================================================
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_IGNORE_FILES .git/ _CPack_Packages/ "${PROJECT_BINARY_DIR}/")
set(CPACK_PACKAGE_NAME "zlib${SUFFIX}")
set(CPACK_PACKAGE_VERSION ${ZLIB_FULL_VERSION})
set(CPACK_PACKAGE_DIRECTORY "${PROJECT_BINARY_DIR}/package")
if("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
message(WARNING "Building to source folder is not recommended. Cpack will be unable to generate source package.")
endif()
include(CPack)
3p-zlib-ng-main/zlib-ng/FAQ.zlib 0000664 0000000 0000000 00000040451 14553115624 0016527 0 ustar 00root root 0000000 0000000 ##
# THIS IS AN UNMAINTAINED COPY OF THE ORIGINAL FILE DISTRIBUTED WITH ZLIB 1.2.11
##
Frequently Asked Questions about zlib
If your question is not there, please check the zlib home page
https://zlib.net/ which may have more recent information.
The latest zlib FAQ is at https://zlib.net/zlib_faq.html
1. Is zlib Y2K-compliant?
Yes. zlib doesn't handle dates.
2. Where can I get a Windows DLL version?
The zlib sources can be compiled without change to produce a DLL. See the
file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
precompiled DLL are found in the zlib web site at https://zlib.net/ .
3. Where can I get a Visual Basic interface to zlib?
See
* https://marknelson.us/1997/01/01/zlib-engine/
* win32/DLL_FAQ.txt in the zlib distribution
4. compress() returns Z_BUF_ERROR.
Make sure that before the call of compress(), the length of the compressed
buffer is equal to the available size of the compressed buffer and not
zero. For Visual Basic, check that this parameter is passed by reference
("as any"), not by value ("as long").
5. deflate() or inflate() returns Z_BUF_ERROR.
Before making the call, make sure that avail_in and avail_out are not zero.
When setting the parameter flush equal to Z_FINISH, also make sure that
avail_out is big enough to allow processing all pending input. Note that a
Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
made with more input or output space. A Z_BUF_ERROR may in fact be
unavoidable depending on how the functions are used, since it is not
possible to tell whether or not there is more output pending when
strm.avail_out returns with zero. See https://zlib.net/zlib_how.html for a
heavily annotated example.
6. Where's the zlib documentation (man pages, etc.)?
It's in zlib.h . Examples of zlib usage are in the files test/example.c
and test/minigzip.c, with more in examples/ .
7. Why don't you use GNU autoconf or libtool or ...?
Because we would like to keep zlib as a very small and simple package.
zlib is rather portable and doesn't need much configuration.
8. I found a bug in zlib.
Most of the time, such problems are due to an incorrect usage of zlib.
Please try to reproduce the problem with a small program and send the
corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
data files without prior agreement.
9. Why do I get "undefined reference to gzputc"?
If "make test" produces something like
example.o(.text+0x154): undefined reference to `gzputc'
check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
/usr/X11R6/lib. Remove any old versions, then do "make install".
10. I need a Delphi interface to zlib.
See the contrib/delphi directory in the zlib distribution.
11. Can zlib handle .zip archives?
Not by itself, no. See the directory contrib/minizip in the zlib
distribution.
12. Can zlib handle .Z files?
No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
the code of uncompress on your own.
13. How can I make a Unix shared library?
By default a shared (and a static) library is built for Unix. So:
make distclean
./configure
make
14. How do I install a shared zlib library on Unix?
After the above, then:
make install
However, many flavors of Unix come with a shared zlib already installed.
Before going to the trouble of compiling a shared version of zlib and
trying to install it, you may want to check if it's already there! If you
can #include , it's there. The -lz option will probably link to
it. You can check the version at the top of zlib.h or with the
ZLIB_VERSION symbol defined in zlib.h .
15. I have a question about OttoPDF.
We are not the authors of OttoPDF. The real author is on the OttoPDF web
site: Joel Hainley, jhainley@myndkryme.com.
16. Can zlib decode Flate data in an Adobe PDF file?
Yes. See https://www.pdflib.com/ . To modify PDF forms, see
https://sourceforge.net/projects/acroformtool/ .
17. Why am I getting this "register_frame_info not found" error on Solaris?
After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
generates an error such as:
ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
symbol __register_frame_info: referenced symbol not found
The symbol __register_frame_info is not part of zlib, it is generated by
the C compiler (cc or gcc). You must recompile applications using zlib
which have this problem. This problem is specific to Solaris. See
http://www.sunfreeware.com/ for Solaris versions of zlib and applications
using zlib.
18. Why does gzip give an error on a file I make with compress/deflate?
The compress and deflate functions produce data in the zlib format, which
is different and incompatible with the gzip format. The gz* functions in
zlib on the other hand use the gzip format. Both the zlib and gzip formats
use the same compressed data format internally, but have different headers
and trailers around the compressed data.
19. Ok, so why are there two different formats?
The gzip format was designed to retain the directory information about a
single file, such as the name and last modification date. The zlib format
on the other hand was designed for in-memory and communication channel
applications, and has a much more compact header and trailer and uses a
faster integrity check than gzip.
20. Well that's nice, but how do I make a gzip file in memory?
You can request that deflate write the gzip format instead of the zlib
format using deflateInit2(). You can also request that inflate decode the
gzip format using inflateInit2(). Read zlib.h for more details.
21. Is zlib thread-safe?
Yes. However any library routines that zlib uses and any application-
provided memory allocation routines must also be thread-safe. zlib's gz*
functions use stdio library routines, and most of zlib's functions use the
library memory allocation routines by default. zlib's *Init* functions
allow for the application to provide custom memory allocation routines.
Of course, you should only operate on any given zlib or gzip stream from a
single thread at a time.
22. Can I use zlib in my commercial application?
Yes. Please read the license in zlib.h.
23. Is zlib under the GNU license?
No. Please read the license in zlib.h.
24. The license says that altered source versions must be "plainly marked". So
what exactly do I need to do to meet that requirement?
You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
particular, the final version number needs to be changed to "f", and an
identification string should be appended to ZLIB_VERSION. Version numbers
x.x.x.f are reserved for modifications to zlib by others than the zlib
maintainers. For example, if the version of the base zlib you are altering
is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
update the version strings in deflate.c and inftrees.c.
For altered source distributions, you should also note the origin and
nature of the changes in zlib.h, as well as in ChangeLog and README, along
with the dates of the alterations. The origin should include at least your
name (or your company's name), and an email address to contact for help or
issues with the library.
Note that distributing a compiled zlib library along with zlib.h and
zconf.h is also a source distribution, and so you should change
ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
in zlib.h as you would for a full source distribution.
25. Will zlib work on a big-endian or little-endian architecture, and can I
exchange compressed data between them?
Yes and yes.
26. Will zlib work on a 64-bit machine?
Yes. It has been tested on 64-bit machines, and has no dependence on any
data types being limited to 32-bits in length. If you have any
difficulties, please provide a complete problem report to zlib@gzip.org
27. Will zlib decompress data from the PKWare Data Compression Library?
No. The PKWare DCL uses a completely different compressed data format than
does PKZIP and zlib. However, you can look in zlib's contrib/blast
directory for a possible solution to your problem.
28. Can I access data randomly in a compressed stream?
No, not without some preparation. If when compressing you periodically use
Z_FULL_FLUSH, carefully write all the pending data at those points, and
keep an index of those locations, then you can start decompression at those
points. You have to be careful to not use Z_FULL_FLUSH too often, since it
can significantly degrade compression. Alternatively, you can scan a
deflate stream once to generate an index, and then use that index for
random access. See examples/zran.c .
29. Does zlib work on MVS, OS/390, CICS, etc.?
It has in the past, but we have not heard of any recent evidence. There
were working ports of zlib 1.1.4 to MVS, but those links no longer work.
If you know of recent, successful applications of zlib on these operating
systems, please let us know. Thanks.
30. Is there some simpler, easier to read version of inflate I can look at to
understand the deflate format?
First off, you should read RFC 1951. Second, yes. Look in zlib's
contrib/puff directory.
31. Does zlib infringe on any patents?
As far as we know, no. In fact, that was originally the whole point behind
zlib. Look here for some more information:
https://www.gzip.org/#faq11
32. Can zlib work with greater than 4 GB of data?
Yes. inflate() and deflate() will process any amount of data correctly.
Each call of inflate() or deflate() is limited to input and output chunks
of the maximum value that can be stored in the compiler's "unsigned int"
type, but there is no limit to the number of chunks. Note however that the
strm.total_in and strm_total_out counters may be limited to 4 GB. These
counters are provided as a convenience and are not used internally by
inflate() or deflate(). The application can easily set up its own counters
updated after each call of inflate() or deflate() to count beyond 4 GB.
compress() and uncompress() may be limited to 4 GB, since they operate in a
single call. gzseek() and gztell() may be limited to 4 GB depending on how
zlib is compiled. See the zlibCompileFlags() function in zlib.h.
The word "may" appears several times above since there is a 4 GB limit only
if the compiler's "long" type is 32 bits. If the compiler's "long" type is
64 bits, then the limit is 16 exabytes.
33. Does zlib have any security vulnerabilities?
The only one that we are aware of is potentially in gzprintf(). If zlib is
compiled to use sprintf() or vsprintf(), then there is no protection
against a buffer overflow of an 8K string space (or other value as set by
gzbuffer()), other than the caller of gzprintf() assuring that the output
will not exceed 8K. On the other hand, if zlib is compiled to use
snprintf() or vsnprintf(), which should normally be the case, then there is
no vulnerability. The ./configure script will display warnings if an
insecure variation of sprintf() will be used by gzprintf(). Also the
zlibCompileFlags() function will return information on what variant of
sprintf() is used by gzprintf().
If you don't have snprintf() or vsnprintf() and would like one, you can
find a portable implementation here:
https://www.ijs.si/software/snprintf/
Note that you should be using the most recent version of zlib. Versions
1.1.3 and before were subject to a double-free vulnerability, and versions
1.2.1 and 1.2.2 were subject to an access exception when decompressing
invalid compressed data.
34. Is there a Java version of zlib?
Probably what you want is to use zlib in Java. zlib is already included
as part of the Java SDK in the java.util.zip package. If you really want
a version of zlib written in the Java language, look on the zlib home
page for links: https://zlib.net/ .
35. I get this or that compiler or source-code scanner warning when I crank it
up to maximally-pedantic. Can't you guys write proper code?
Many years ago, we gave up attempting to avoid warnings on every compiler
in the universe. It just got to be a waste of time, and some compilers
were downright silly as well as contradicted each other. So now, we simply
make sure that the code always works.
36. Valgrind (or some similar memory access checker) says that deflate is
performing a conditional jump that depends on an uninitialized value.
Isn't that a bug?
No. That is intentional for performance reasons, and the output of deflate
is not affected. This only started showing up recently since zlib 1.2.x
uses malloc() by default for allocations, whereas earlier versions used
calloc(), which zeros out the allocated memory. Even though the code was
correct, versions 1.2.4 and later was changed to not stimulate these
checkers.
37. Will zlib read the (insert any ancient or arcane format here) compressed
data format?
Probably not. Look in the comp.compression FAQ for pointers to various
formats and associated software.
38. How can I encrypt/decrypt zip files with zlib?
zlib doesn't support encryption. The original PKZIP encryption is very
weak and can be broken with freely available programs. To get strong
encryption, use GnuPG, https://www.gnupg.org/ , which already includes zlib
compression. For PKZIP compatible "encryption", look at
http://infozip.sourceforge.net/
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
"gzip" is the gzip format, and "deflate" is the zlib format. They should
probably have called the second one "zlib" instead to avoid confusion with
the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
correctly points to the zlib specification in RFC 1950 for the "deflate"
transfer encoding, there have been reports of servers and browsers that
incorrectly produce or expect raw deflate data per the deflate
specification in RFC 1951, most notably Microsoft. So even though the
"deflate" transfer encoding using the zlib format would be the more
efficient approach (and in fact exactly what the zlib format was designed
for), using the "gzip" transfer encoding is probably more reliable due to
an unfortunate choice of name on the part of the HTTP 1.1 authors.
Bottom line: use the gzip format for HTTP 1.1 encoding.
40. Does zlib support the new "Deflate64" format introduced by PKWare?
No. PKWare has apparently decided to keep that format proprietary, since
they have not documented it as they have previous compression formats. In
any case, the compression improvements are so modest compared to other more
modern approaches, that it's not worth the effort to implement.
41. I'm having a problem with the zip functions in zlib, can you help?
There are no zip functions in zlib. You are probably using minizip by
Giles Vollant, which is found in the contrib directory of zlib. It is not
part of zlib. In fact none of the stuff in contrib is part of zlib. The
files in there are not supported by the zlib authors. You need to contact
the authors of the respective contribution for help.
42. The match.asm code in contrib is under the GNU General Public License.
Since it's part of zlib, doesn't that mean that all of zlib falls under the
GNU GPL?
No. The files in contrib are not part of zlib. They were contributed by
other authors and are provided as a convenience to the user within the zlib
distribution. Each item in contrib has its own license.
43. Is zlib subject to export controls? What is its ECCN?
zlib is not subject to export controls, and so is classified as EAR99.
44. Can you please sign these lengthy legal documents and fax them back to us
so that we can use your software in our product?
No. Go away. Shoo.
3p-zlib-ng-main/zlib-ng/INDEX.md 0000664 0000000 0000000 00000005451 14553115624 0016430 0 ustar 00root root 0000000 0000000 Contents
--------
| Name | Description |
|:-----------------|:---------------------------------------------------------------|
| arch/ | Architecture-specific code |
| doc/ | Documentation for formats and algorithms |
| test/example.c | Zlib usages examples for build testing |
| test/minigzip.c | Minimal gzip-like functionality for build testing |
| test/infcover.c | Inflate code coverage for build testing |
| win32/ | Shared library version resources for Windows |
| CMakeLists.txt | Cmake build script |
| configure | Bash configure/build script |
| adler32.c | Compute the Adler-32 checksum of a data stream |
| chunkset.* | Inline functions to copy small data chunks |
| compress.c | Compress a memory buffer |
| deflate.* | Compress data using the deflate algorithm |
| deflate_fast.c | Compress data using the deflate algorithm with fast strategy |
| deflate_medium.c | Compress data using the deflate algorithm with medium strategy |
| deflate_slow.c | Compress data using the deflate algorithm with slow strategy |
| functable.* | Struct containing function pointers to optimized functions |
| gzguts.h | Internal definitions for gzip operations |
| gzlib.c | Functions common to reading and writing gzip files |
| gzread.c | Read gzip files |
| gzwrite.c | Write gzip files |
| infback.* | Inflate using a callback interface |
| inflate.* | Decompress data |
| inffast.* | Decompress data with speed optimizations |
| inffixed_tbl.h | Table for decoding fixed codes |
| inftrees.h | Generate Huffman trees for efficient decoding |
| trees.* | Output deflated data using Huffman coding |
| uncompr.c | Decompress a memory buffer |
| zconf.h.cmakein | zconf.h template for cmake |
| zendian.h | BYTE_ORDER for endian tests |
| zlib.map | Linux symbol information |
| zlib.pc.in | Pkg-config template |
3p-zlib-ng-main/zlib-ng/LICENSE.md 0000664 0000000 0000000 00000001543 14553115624 0016641 0 ustar 00root root 0000000 0000000 (C) 1995-2013 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
3p-zlib-ng-main/zlib-ng/Makefile.in 0000664 0000000 0000000 00000024512 14553115624 0017303 0 ustar 00root root 0000000 0000000 # Makefile for zlib
# Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type:
# ./configure; make test
# Normally configure builds both a static and a shared library.
# If you want to build just a static library, use: ./configure --static
# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
# make install
# To install in $HOME instead of /usr/local, use:
# make install prefix=$HOME
CC=cc
CFLAGS=-O
#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
#CFLAGS=-g -DZLIB_DEBUG
#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
# -Wstrict-prototypes -Wmissing-prototypes
SFLAGS=-O
LDFLAGS=-L.
LIBNAME1=libz-ng
LIBNAME2=zlib-ng
SUFFIX=-ng
TEST_LIBS=$(LIBNAME1).a
LDSHARED=$(CC)
LDSHAREDFLAGS=-shared
VER=2.1.6
VER1=2
STATICLIB=$(LIBNAME1).a
SHAREDLIB=$(LIBNAME1).so
SHAREDLIBV=$(LIBNAME1).so.$(VER)
SHAREDLIBM=$(LIBNAME1).so.$(VER1)
IMPORTLIB=
SHAREDTARGET=$(LIBNAME1).so.$(VER)
PKGFILE=$(LIBNAME2).pc
LIBS=$(STATICLIB) $(SHAREDTARGET)
AR=ar
ARFLAGS=rc
DEFFILE=
RC=
RCFLAGS=
RCOBJS=
STRIP=
RANLIB=ranlib
LDCONFIG=ldconfig
LDSHAREDLIBC=
EXE=
SRCDIR=.
INCLUDES=-I$(SRCDIR)
BUILDDIR=.
ARCHDIR=arch/generic
ARCH_STATIC_OBJS=
ARCH_SHARED_OBJS=
prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
libdir = ${exec_prefix}/lib
sharedlibdir = ${libdir}
includedir = ${prefix}/include
mandir = ${prefix}/share/man
man3dir = ${mandir}/man3
pkgconfigdir = ${libdir}/pkgconfig
OBJZ = \
adler32.o \
adler32_fold.o \
chunkset.o \
compare256.o \
compress.o \
cpu_features.o \
crc32_braid.o \
crc32_braid_comb.o \
crc32_fold.o \
deflate.o \
deflate_fast.o \
deflate_huff.o \
deflate_medium.o \
deflate_quick.o \
deflate_rle.o \
deflate_slow.o \
deflate_stored.o \
functable.o \
infback.o \
inflate.o \
inftrees.o \
insert_string.o \
insert_string_roll.o \
slide_hash.o \
trees.o \
uncompr.o \
zutil.o \
$(ARCH_STATIC_OBJS)
OBJG = \
gzlib.o \
gzread.o \
gzwrite.o
TESTOBJG =
OBJC = $(OBJZ) $(OBJG)
PIC_OBJZ = \
adler32.lo \
adler32_fold.lo \
chunkset.lo \
compare256.lo \
compress.lo \
cpu_features.lo \
crc32_braid.lo \
crc32_braid_comb.lo \
crc32_fold.lo \
deflate.lo \
deflate_fast.lo \
deflate_huff.lo \
deflate_medium.lo \
deflate_quick.lo \
deflate_rle.lo \
deflate_slow.lo \
deflate_stored.lo \
functable.lo \
infback.lo \
inflate.lo \
inftrees.lo \
insert_string.lo \
insert_string_roll.lo \
slide_hash.lo \
trees.lo \
uncompr.lo \
zutil.lo \
$(ARCH_SHARED_OBJS)
PIC_OBJG = \
gzlib.lo \
gzread.lo \
gzwrite.lo
PIC_TESTOBJG =
PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG)
OBJS = $(OBJC)
PIC_OBJS = $(PIC_OBJC)
all: static shared
static: example$(EXE) minigzip$(EXE) makefixed$(EXE) maketrees$(EXE) makecrct$(EXE)
shared: examplesh$(EXE) minigzipsh$(EXE)
check: test
.SECONDARY:
$(ARCHDIR)/%.o: $(SRCDIR)/$(ARCHDIR)/%.c
$(MAKE) -C $(ARCHDIR) $(notdir $@)
$(ARCHDIR)/%.lo: $(SRCDIR)/$(ARCHDIR)/%.c
$(MAKE) -C $(ARCHDIR) $(notdir $@)
%.o: $(ARCHDIR)/%.o
-cp $< $@
%.lo: $(ARCHDIR)/%.lo
-cp $< $@
test: all
$(MAKE) -C test
infcover.o: $(SRCDIR)/test/infcover.c zlib$(SUFFIX).h zconf$(SUFFIX).h zlib_name_mangling$(SUFFIX).h
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/test/infcover.c
infcover$(EXE): infcover.o $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ infcover.o $(STATICLIB)
ifneq ($(STRIP),)
$(STRIP) $@
endif
cover: infcover$(EXE)
rm -f *.gcda
./infcover
gcov inf*.c
$(STATICLIB): $(OBJS)
$(AR) $(ARFLAGS) $@ $(OBJS)
-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
example.o:
$(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $(SRCDIR)/test/example.c
minigzip.o:
$(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $(SRCDIR)/test/minigzip.c
makefixed.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/makefixed.c
maketrees.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/maketrees.c
makecrct.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/tools/makecrct.c
zlibrc.o: $(SRCDIR)/win32/zlib$(SUFFIX)1.rc
$(RC) $(RCFLAGS) -o $@ $(SRCDIR)/win32/zlib$(SUFFIX)1.rc
.SUFFIXES: .lo
%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
%.lo: $(SRCDIR)/%.c
$(CC) $(SFLAGS) -DPIC $(INCLUDES) -c -o $@ $<
gzlib.o: $(SRCDIR)/gzlib.c
$(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
gzlib.lo: $(SRCDIR)/gzlib.c
$(CC) $(SFLAGS) -DPIC -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
gzread.o: gzread.c
$(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
gzread.lo: gzread.c
$(CC) $(SFLAGS) -DPIC -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
gzwrite.o: $(SRCDIR)/gzwrite.c
$(CC) $(CFLAGS) -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
gzwrite.lo: $(SRCDIR)/gzwrite.c
$(CC) $(SFLAGS) -DPIC -DWITH_GZFILEOP $(INCLUDES) -c -o $@ $<
$(SHAREDTARGET): $(PIC_OBJS) $(DEFFILE) $(RCOBJS)
ifneq ($(SHAREDTARGET),)
$(LDSHARED) $(CFLAGS) $(LDSHAREDFLAGS) $(LDFLAGS) -o $@ $(DEFFILE) $(PIC_OBJS) $(RCOBJS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
ifneq ($(SHAREDLIB),$(SHAREDTARGET))
rm -f $(SHAREDLIB) $(SHAREDLIBM)
ln -s $@ $(SHAREDLIB)
ln -s $@ $(SHAREDLIBM)
endif
endif
example$(EXE): example.o $(TESTOBJG) $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(TESTOBJG) $(TEST_LIBS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
minigzip$(EXE): minigzip.o $(TESTOBJG) $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(TESTOBJG) $(TEST_LIBS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
minigzipsh$(EXE): minigzip.o $(PIC_TESTOBJG) $(SHAREDTARGET)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ minigzip.o $(PIC_TESTOBJG) $(SHAREDLIB) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
examplesh$(EXE): example.o $(PIC_TESTOBJG) $(SHAREDTARGET)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ example.o $(PIC_TESTOBJG) $(SHAREDLIB) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
makefixed$(EXE): makefixed.o $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ makefixed.o $(TEST_LIBS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
maketrees$(EXE): maketrees.o $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ maketrees.o $(TEST_LIBS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
makecrct$(EXE): makecrct.o $(STATICLIB)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ makecrct.o $(TEST_LIBS) $(LDSHAREDLIBC)
ifneq ($(STRIP),)
$(STRIP) $@
endif
install-shared: $(SHAREDTARGET)
ifneq ($(SHAREDTARGET),)
-@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi
rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDTARGET)
cp $(SHAREDTARGET) $(DESTDIR)$(sharedlibdir)
chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDTARGET)
ifneq ($(SHAREDLIB),$(SHAREDTARGET))
rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM)
ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB)
ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM)
($(LDCONFIG) || true) >/dev/null 2>&1
# ldconfig is for Linux
endif
ifneq ($(IMPORTLIB),)
cp $(IMPORTLIB) $(DESTDIR)$(sharedlibdir)
chmod 644 $(DESTDIR)$(sharedlibdir)/$(IMPORTLIB)
endif
endif
install-static: $(STATICLIB)
-@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi
rm -f $(DESTDIR)$(libdir)/$(STATICLIB)
cp $(STATICLIB) $(DESTDIR)$(libdir)
chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB)
-@($(RANLIB) $(DESTDIR)$(libdir)/$(STATICLIB) || true) >/dev/null 2>&1
# The ranlib in install-static is needed on NeXTSTEP which checks file times
install-libs: install-shared install-static
-@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi
-@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi
rm -f $(DESTDIR)$(pkgconfigdir)/$(PKGFILE)
cp $(PKGFILE) $(DESTDIR)$(pkgconfigdir)
chmod 644 $(DESTDIR)$(pkgconfigdir)/$(PKGFILE)
install: install-libs
-@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi
rm -f $(DESTDIR)$(includedir)/zlib$(SUFFIX).h $(DESTDIR)$(includedir)/zconf$(SUFFIX).h $(DESTDIR)$(includedir)/zlib_name_mangling$(SUFFIX).h
cp zlib$(SUFFIX).h $(DESTDIR)$(includedir)/zlib$(SUFFIX).h
cp zconf$(SUFFIX).h $(DESTDIR)$(includedir)/zconf$(SUFFIX).h
cp zlib_name_mangling$(SUFFIX).h $(DESTDIR)$(includedir)/zlib_name_mangling$(SUFFIX).h
chmod 644 $(DESTDIR)$(includedir)/zlib$(SUFFIX).h $(DESTDIR)$(includedir)/zconf$(SUFFIX).h $(DESTDIR)$(includedir)/zlib_name_mangling$(SUFFIX).h
uninstall-static:
cd $(DESTDIR)$(libdir) && rm -f $(STATICLIB)
uninstall-shared:
ifneq ($(SHAREDLIB),)
cd $(DESTDIR)$(sharedlibdir) && rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM)
endif
ifneq ($(IMPORTLIB),)
cd $(DESTDIR)$(sharedlibdir) && rm -f $(IMPORTLIB)
endif
uninstall: uninstall-static uninstall-shared
cd $(DESTDIR)$(includedir) && rm -f zlib$(SUFFIX).h zconf$(SUFFIX).h zlib_name_mangling$(SUFFIX).h
cd $(DESTDIR)$(pkgconfigdir) && rm -f $(PKGFILE)
mostlyclean: clean
clean:
@if [ -f $(ARCHDIR)/Makefile ]; then $(MAKE) -C $(ARCHDIR) clean; fi
@if [ -f test/Makefile ]; then $(MAKE) -C test clean; fi
rm -f *.o *.lo *~ \
example$(EXE) minigzip$(EXE) minigzipsh$(EXE) \
infcover makefixed$(EXE) maketrees$(EXE) makecrct$(EXE) \
$(STATICLIB) $(IMPORTLIB) $(SHAREDLIB) $(SHAREDLIBV) $(SHAREDLIBM) \
foo.gz so_locations \
_match.s maketree
rm -rf objs
rm -f *.gcda *.gcno *.gcov
rm -f a.out a.exe
rm -f *._h
rm -rf btmp1 btmp2 pkgtmp1 pkgtmp2
maintainer-clean: distclean
distclean: clean
@if [ -f $(ARCHDIR)/Makefile ]; then $(MAKE) -C $(ARCHDIR) distclean; fi
@if [ -f test/Makefile ]; then $(MAKE) -C test distclean; fi
rm -f $(PKGFILE) configure.log zconf.h zconf.h.cmakein zlib$(SUFFIX).h zlib_name_mangling$(SUFFIX).h *.pc gzread.c
-@rm -f .DS_Store
# Reset Makefile if building inside source tree
@if [ -f Makefile.in ]; then \
printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
printf '\ndistclean:\n\t$(MAKE) -f Makefile.in distclean\n' >> Makefile ; \
touch -r $(SRCDIR)/Makefile.in Makefile ; fi
# Reset zconf.h and zconf.h.cmakein if building inside source tree
@if [ -f zconf.h.in ]; then \
cp -p $(SRCDIR)/zconf.h.in zconf.h ; \
grep -v '^#cmakedefine' $(SRCDIR)/zconf.h.in > zconf.h.cmakein &&\
touch -r $(SRCDIR)/zconf.h.in zconf.h.cmakein ; fi
# Cleanup these files if building outside source tree
@if [ ! -f README.md ]; then rm -f Makefile; fi
# Remove arch and test directory if building outside source tree
@if [ ! -f $(ARCHDIR)/Makefile.in ]; then rm -rf arch; fi
@if [ ! -f test/Makefile.in ]; then rm -rf test; fi
tags:
etags $(SRCDIR)/*.[ch]
3p-zlib-ng-main/zlib-ng/PORTING.md 0000664 0000000 0000000 00000006765 14553115624 0016714 0 ustar 00root root 0000000 0000000 Porting applications to use zlib-ng
===================================
Zlib-ng can be used/compiled in two different modes, that require some
consideration by the application developer.
zlib-compat mode
----------------
Zlib-ng can be compiled in zlib-compat mode, suitable for zlib-replacement
in a single application or system-wide.
Please note that zlib-ng in zlib-compat mode tries to maintain both API and
ABI compatibility with the original zlib. Any issues regarding compatibility
can be reported as bugs.
In certain instances you may not be able to simply replace the zlib library/dll
files and expect the application to work. The application may need to be
recompiled against the zlib-ng headers and libs to ensure full compatibility.
It is also possible for the deflate output stream to differ from the original
zlib due to algorithmic differences between the two libraries. Any tests or
applications that depend on the exact length of the deflate stream being a
certain value will need to be updated.
**Advantages:**
- Easy to port to, since it only requires a recompile of the application and
no changes to the application code.
**Disadvantages:**
- Can conflict with a system-installed zlib, as that can often be linked in
by another library you are linking into your application. This can cause
crashes or incorrect output.
- If your application is pre-allocating a memory buffer and you are providing
deflate/inflate init with your own allocator that allocates from that buffer
(looking at you nginx), you should be aware that zlib-ng needs to allocate
more memory than stock zlib needs. The same problem exists with Intel’s and
Cloudflare’s zlib forks. Doing this is not recommended since it makes it
very hard to maintain compatibility over time.
**Build Considerations:**
- Compile against the *zlib.h* provided by zlib-ng
- Configuration header is named *zconf.h*
- Static library is *libz.a* on Unix and macOS, or *zlib.lib* on Windows
- Shared library is *libz.so* on Unix, *libz.dylib* on macOS, or *zlib1.dll*
on Windows
- Type `z_size_t` is *unsigned __int64* on 64-bit Windows, and *unsigned long* on 32-bit Windows, Unix and macOS
- Type `z_uintmax_t` is *unsigned long* in zlib-compat mode, and *size_t* with zlib-ng API
zlib-ng native mode
-------------------
Zlib-ng in native mode is suitable for co-existing with the standard zlib
library, allowing applications to implement support and testing separately.
The zlib-ng native has implemented some modernization and simplifications
in its API, intended to make life easier for application developers.
**Advantages:**
- Does not conflict with other zlib implementations, and can co-exist as a
system library along with zlib.
- In certain places zlib-ng native uses more appropriate data types, removing
the need for some workarounds in the API compared to zlib.
**Disadvantages:**
- Requires minor changes to applications to use the prefixed zlib-ng
function calls and structs. Usually this means a small prefix `zng_` has to be added.
**Build Considerations:**
- Compile against *zlib-ng.h*
- Configuration header is named *zconf-ng.h*
- Static library is *libz-ng.a* on Unix and macOS, or *zlib-ng.lib* on Windows
- Shared library is *libz-ng.so* on Unix, *libz-ng.dylib* on macOS, or
*zlib-ng2.dll* on Windows
- Type `z_size_t` is *size_t*
zlib-ng compile-time detection
------------------------------
To distinguish zlib-ng from other zlib implementations at compile-time check for the
existence of `ZLIBNG_VERSION` defined in the zlib header.
3p-zlib-ng-main/zlib-ng/README.md 0000664 0000000 0000000 00000035053 14553115624 0016517 0 ustar 00root root 0000000 0000000 | CI | Stable | Develop |
|:---|:-------|:--------|
| GitHub Actions | [![Stable CMake](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml/badge.svg?branch=stable)](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml?query=branch%3Astable)
[![Stable Configure](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml/badge.svg?branch=stable)](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml?query=branch%3Astable)
[![Stable NMake](https://github.com/zlib-ng/zlib-ng/actions/workflows/nmake.yml/badge.svg?branch=stable)](https://github.com/zlib-ng/zlib-ng/actions/workflows/nmake.yml?query=branch%3Astable) | [![Develop CMake](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml/badge.svg?branch=develop)](https://github.com/zlib-ng/zlib-ng/actions/workflows/cmake.yml?query=branch%3Adevelop)
[![Develop Configure](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml/badge.svg?branch=develop)](https://github.com/zlib-ng/zlib-ng/actions/workflows/configure.yml?query=branch%3Adevelop)
[![Develop NMake](https://github.com/zlib-ng/zlib-ng/actions/workflows/nmake.yml/badge.svg?branch=develop)](https://github.com/zlib-ng/zlib-ng/actions/workflows/nmake.yml?query=branch%3Adevelop) |
| CodeFactor | [![CodeFactor](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/badge/stable)](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/overview/stable) | [![CodeFactor](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/badge/develop)](https://www.codefactor.io/repository/github/zlib-ng/zlib-ng/overview/develop) |
| OSS-Fuzz | [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zlib-ng.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zlib-ng) | [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/zlib-ng.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:zlib-ng) |
| Codecov | [![codecov](https://codecov.io/github/zlib-ng/zlib-ng/branch/stable/graph/badge.svg?token=uKsgK9LIuC)](https://codecov.io/github/zlib-ng/zlib-ng/tree/stable) | [![codecov](https://codecov.io/github/zlib-ng/zlib-ng/branch/develop/graph/badge.svg?token=uKsgK9LIuC)](https://codecov.io/github/zlib-ng/zlib-ng/tree/develop) |
## zlib-ng
*zlib data compression library for the next generation systems*
Maintained by Hans Kristian Rosbach
aka Dead2 (zlib-ng à t circlestorm dót org)
Features
--------
* Zlib compatible API with support for dual-linking
* Modernized native API based on zlib API for ease of porting
* Modern C11 syntax and a clean code layout
* Deflate medium and quick algorithms based on Intel’s zlib fork
* Support for CPU intrinsics when available
* Adler32 implementation using SSSE3, AVX2, AVX512, AVX512-VNNI, Neon, VMX & VSX
* CRC32-B implementation using PCLMULQDQ, VPCLMULQDQ, ACLE, & IBM Z
* Hash table implementation using CRC32-C intrinsics on x86 and ARM
* Slide hash implementations using SSE2, AVX2, ARMv6, Neon, VMX & VSX
* Compare256 implementations using SSE2, AVX2, Neon, POWER9 & RVV
* Inflate chunk copying using SSE2, SSSE3, AVX, Neon & VSX
* Support for hardware-accelerated deflate using IBM Z DFLTCC
* Unaligned memory read/writes and large bit buffer improvements
* Includes improvements from Cloudflare and Intel forks
* Configure, CMake, and NMake build system support
* Comprehensive set of CMake unit tests
* Code sanitizers, fuzzing, and coverage
* GitHub Actions continuous integration on Windows, macOS, and Linux
* Emulated CI for ARM, AARCH64, PPC, PPC64, RISCV, SPARC64, S390x using qemu
History
-------
The motivation for this fork was seeing several 3rd party contributions with new optimizations not getting
implemented into the official zlib repository.
Mark Adler has been maintaining zlib for a very long time, and he has done a great job and hopefully he will continue
for a long time yet. The idea of zlib-ng is not to replace zlib, but to co-exist as a drop-in replacement with a
lower threshold for code change.
zlib has a long history and is incredibly portable, even supporting many systems that predate the Internet.
That is great, but it can complicate further development and maintainability. The zlib code contains many workarounds
for really old compilers or to accommodate systems with limitations such as operating in a 16-bit environment.
Many of these workarounds are only maintenance burdens, some of them are pretty huge code-wise. With many workarounds
cluttered throughout the code, it makes it harder for new programmers with an idea/interest for zlib to contribute.
I decided to make a fork, merge all the Intel optimizations, some of the Cloudflare optimizations, plus a couple other
smaller patches. Then started cleaning out workarounds, various dead code, all contrib and example code.
The result is a better performing and easier to maintain zlib-ng.
A lot of improvements have gone into zlib-ng since its start, and numerous people and companies have contributed both
small and big improvements, or valuable testing.
Build
-----
Please read LICENSE.md, it is very simple and very liberal.
There are two ways to build zlib-ng:
### Cmake
To build zlib-ng using the cross-platform makefile generator cmake.
```
cmake .
cmake --build . --config Release
ctest --verbose -C Release
```
Alternatively, you can use the cmake configuration GUI tool ccmake:
```
ccmake .
```
### Configure
To build zlib-ng using the bash configure script:
```
./configure
make
make test
```
Build Options
-------------
| CMake | configure | Description | Default |
|:-------------------------|:-------------------------|:--------------------------------------------------------------------------------------|---------|
| ZLIB_COMPAT | --zlib-compat | Compile with zlib compatible API | OFF |
| ZLIB_ENABLE_TESTS | | Build test binaries | ON |
| WITH_GZFILEOP | --without-gzfileops | Compile with support for gzFile related functions | ON |
| WITH_OPTIM | --without-optimizations | Build with optimisations | ON |
| WITH_NEW_STRATEGIES | --without-new-strategies | Use new strategies | ON |
| WITH_NATIVE_INSTRUCTIONS | | Compiles with full instruction set supported on this host (gcc/clang -march=native) | OFF |
| WITH_SANITIZER | | Build with sanitizer (memory, address, undefined) | OFF |
| WITH_GTEST | | Build gtest_zlib | ON |
| WITH_FUZZERS | | Build test/fuzz | OFF |
| WITH_BENCHMARKS | | Build test/benchmarks | OFF |
| WITH_MAINTAINER_WARNINGS | | Build with project maintainer warnings | OFF |
| WITH_CODE_COVERAGE | | Enable code coverage reporting | OFF |
Install
-------
WARNING: We do not recommend manually installing unless you really know what you are doing, because this can
potentially override the system default zlib library, and any incompatibility or wrong configuration of zlib-ng
can make the whole system unusable, requiring recovery or reinstall.
If you still want a manual install, we recommend using the /opt/ path prefix.
For Linux distros, an alternative way to use zlib-ng (if compiled in zlib-compat mode) instead of zlib, is through
the use of the _LD_PRELOAD_ environment variable. If the program is dynamically linked with zlib, then the program
will temporarily attempt to use zlib-ng instead, without risking system-wide instability.
```
LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.13.zlib-ng /usr/bin/program
```
### Cmake
To install zlib-ng system-wide using cmake:
```sh or powershell
cmake --build . --target install
```
### Configure
To install zlib-ng system-wide using the configure script:
```sh
make install
```
### CPack
After building with cmake, an installation package can be created using cpack. By default a tgz package is created,
but you can append `-G ` to each command to generate alternative packages types (TGZ, ZIP, RPM, DEB). To easily
create a rpm or deb package, you would use `-G RPM` or `-G DEB` respectively.
```sh or powershell
cd build
cpack --config CPackConfig.cmake
cpack --config CPackSourceConfig.cmake
```
### Vcpkg
Alternatively, you can build and install zlib-ng using the [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager:
```sh or powershell
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # "./bootstrap-vcpkg.bat" for powershell
./vcpkg integrate install
./vcpkg install zlib-ng
```
The zlib-ng port in vcpkg is kept up to date by Microsoft team members and community contributors.
If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
Contributing
------------
Zlib-ng is aiming to be open to contributions, and we would be delighted to receive pull requests on github.
Help with testing and reviewing pull requests etc is also very much appreciated.
Please check the Wiki for more info: [Contributing](https://github.com/zlib-ng/zlib-ng/wiki/Contributing)
Acknowledgments
----------------
Thanks go out to all the people and companies who have taken the time to contribute
code reviews, testing and/or patches. Zlib-ng would not have been nearly as good without you.
The deflate format used by zlib was defined by Phil Katz.
The deflate and zlib specifications were written by L. Peter Deutsch.
zlib was originally created by Jean-loup Gailly (compression) and Mark Adler (decompression).
Advanced Build Options
----------------------
| CMake | configure | Description | Default |
|:--------------------------------|:----------------------|:--------------------------------------------------------------------|------------------------|
| FORCE_SSE2 | --force-sse2 | Skip runtime check for SSE2 instructions (Always on for x86_64) | OFF (x86) |
| WITH_AVX2 | | Build with AVX2 intrinsics | ON |
| WITH_AVX512 | | Build with AVX512 intrinsics | ON |
| WITH_AVX512VNNI | | Build with AVX512VNNI intrinsics | ON |
| WITH_SSE2 | | Build with SSE2 intrinsics | ON |
| WITH_SSSE3 | | Build with SSSE3 intrinsics | ON |
| WITH_SSE42 | | Build with SSE42 intrinsics | ON |
| WITH_PCLMULQDQ | | Build with PCLMULQDQ intrinsics | ON |
| WITH_VPCLMULQDQ | --without-vpclmulqdq | Build with VPCLMULQDQ intrinsics | ON |
| WITH_ACLE | --without-acle | Build with ACLE intrinsics | ON |
| WITH_NEON | --without-neon | Build with NEON intrinsics | ON |
| WITH_ARMV6 | --without-armv6 | Build with ARMv6 intrinsics | ON |
| WITH_ALTIVEC | --without-altivec | Build with AltiVec (VMX) intrinsics | ON |
| WITH_POWER8 | --without-power8 | Build with POWER8 optimisations | ON |
| WITH_RVV | | Build with RVV intrinsics | ON |
| WITH_CRC32_VX | --without-crc32-vx | Build with vectorized CRC32 on IBM Z | ON |
| WITH_DFLTCC_DEFLATE | --with-dfltcc-deflate | Build with DFLTCC intrinsics for compression on IBM Z | OFF |
| WITH_DFLTCC_INFLATE | --with-dfltcc-inflate | Build with DFLTCC intrinsics for decompression on IBM Z | OFF |
| WITH_UNALIGNED | --without-unaligned | Allow optimizations that use unaligned reads if safe on current arch| ON |
| WITH_INFLATE_STRICT | | Build with strict inflate distance checking | OFF |
| WITH_INFLATE_ALLOW_INVALID_DIST | | Build with zero fill for inflate invalid distances | OFF |
| INSTALL_UTILS | | Copy minigzip and minideflate during install | OFF |
| ZLIBNG_ENABLE_TESTS | | Test zlib-ng specific API | ON |
Related Projects
----------------
* Fork of the popular minizip https://github.com/zlib-ng/minizip-ng
* Python tool to benchmark minigzip/minideflate https://github.com/zlib-ng/deflatebench
* Python tool to benchmark pigz https://github.com/zlib-ng/pigzbench
* 3rd party patches for zlib-ng compatibility https://github.com/zlib-ng/patches
3p-zlib-ng-main/zlib-ng/adler32.c 0000664 0000000 0000000 00000007662 14553115624 0016645 0 ustar 00root root 0000000 0000000 /* adler32.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011, 2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "functable.h"
#include "adler32_p.h"
/* ========================================================================= */
Z_INTERNAL uint32_t adler32_c(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t sum2;
unsigned n;
/* split Adler-32 into component sums */
sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;
/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(adler, buf, sum2);
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (UNLIKELY(buf == NULL))
return 1L;
/* in case short lengths are provided, keep it somewhat fast */
if (UNLIKELY(len < 16))
return adler32_len_16(adler, buf, len, sum2);
/* do length NMAX blocks -- requires just one modulo operation */
while (len >= NMAX) {
len -= NMAX;
#ifdef UNROLL_MORE
n = NMAX / 16; /* NMAX is divisible by 16 */
#else
n = NMAX / 8; /* NMAX is divisible by 8 */
#endif
do {
#ifdef UNROLL_MORE
DO16(adler, sum2, buf); /* 16 sums unrolled */
buf += 16;
#else
DO8(adler, sum2, buf, 0); /* 8 sums unrolled */
buf += 8;
#endif
} while (--n);
adler %= BASE;
sum2 %= BASE;
}
/* do remaining bytes (less than NMAX, still just one modulo) */
return adler32_len_64(adler, buf, len, sum2);
}
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(adler32_z)(unsigned long adler, const unsigned char *buf, size_t len) {
return (unsigned long)functable.adler32((uint32_t)adler, buf, len);
}
#else
uint32_t Z_EXPORT PREFIX(adler32_z)(uint32_t adler, const unsigned char *buf, size_t len) {
return functable.adler32(adler, buf, len);
}
#endif
/* ========================================================================= */
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(adler32)(unsigned long adler, const unsigned char *buf, unsigned int len) {
return (unsigned long)functable.adler32((uint32_t)adler, buf, len);
}
#else
uint32_t Z_EXPORT PREFIX(adler32)(uint32_t adler, const unsigned char *buf, uint32_t len) {
return functable.adler32(adler, buf, len);
}
#endif
/* ========================================================================= */
static uint32_t adler32_combine_(uint32_t adler1, uint32_t adler2, z_off64_t len2) {
uint32_t sum1;
uint32_t sum2;
unsigned rem;
/* for negative len, return invalid adler32 as a clue for debugging */
if (len2 < 0)
return 0xffffffff;
/* the derivation of this formula is left as an exercise for the reader */
len2 %= BASE; /* assumes len2 >= 0 */
rem = (unsigned)len2;
sum1 = adler1 & 0xffff;
sum2 = rem * sum1;
sum2 %= BASE;
sum1 += (adler2 & 0xffff) + BASE - 1;
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
if (sum1 >= BASE) sum1 -= BASE;
if (sum1 >= BASE) sum1 -= BASE;
if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
if (sum2 >= BASE) sum2 -= BASE;
return sum1 | (sum2 << 16);
}
/* ========================================================================= */
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(adler32_combine)(unsigned long adler1, unsigned long adler2, z_off_t len2) {
return (unsigned long)adler32_combine_((uint32_t)adler1, (uint32_t)adler2, len2);
}
unsigned long Z_EXPORT PREFIX4(adler32_combine)(unsigned long adler1, unsigned long adler2, z_off64_t len2) {
return (unsigned long)adler32_combine_((uint32_t)adler1, (uint32_t)adler2, len2);
}
#else
uint32_t Z_EXPORT PREFIX4(adler32_combine)(uint32_t adler1, uint32_t adler2, z_off64_t len2) {
return adler32_combine_(adler1, adler2, len2);
}
#endif
3p-zlib-ng-main/zlib-ng/adler32_fold.c 0000664 0000000 0000000 00000000705 14553115624 0017640 0 ustar 00root root 0000000 0000000 /* adler32_fold.c -- adler32 folding interface
* Copyright (C) 2022 Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "functable.h"
#include "adler32_fold.h"
#include
Z_INTERNAL uint32_t adler32_fold_copy_c(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
adler = functable.adler32(adler, src, len);
memcpy(dst, src, len);
return adler;
}
3p-zlib-ng-main/zlib-ng/adler32_fold.h 0000664 0000000 0000000 00000000503 14553115624 0017641 0 ustar 00root root 0000000 0000000 /* adler32_fold.h -- adler32 folding interface
* Copyright (C) 2022 Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef ADLER32_FOLD_H_
#define ADLER32_FOLD_H_
Z_INTERNAL uint32_t adler32_fold_copy_c(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
3p-zlib-ng-main/zlib-ng/adler32_p.h 0000664 0000000 0000000 00000004325 14553115624 0017162 0 ustar 00root root 0000000 0000000 /* adler32_p.h -- Private inline functions and macros shared with
* different computation of the Adler-32 checksum
* of a data stream.
* Copyright (C) 1995-2011, 2016 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef ADLER32_P_H
#define ADLER32_P_H
#define BASE 65521U /* largest prime smaller than 65536 */
#define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
#define DO1(sum1, sum2, buf, i) {(sum1) += buf[(i)]; (sum2) += (sum1);}
#define DO2(sum1, sum2, buf, i) {DO1(sum1, sum2, buf, i); DO1(sum1, sum2, buf, i+1);}
#define DO4(sum1, sum2, buf, i) {DO2(sum1, sum2, buf, i); DO2(sum1, sum2, buf, i+2);}
#define DO8(sum1, sum2, buf, i) {DO4(sum1, sum2, buf, i); DO4(sum1, sum2, buf, i+4);}
#define DO16(sum1, sum2, buf) {DO8(sum1, sum2, buf, 0); DO8(sum1, sum2, buf, 8);}
static inline uint32_t adler32_len_1(uint32_t adler, const uint8_t *buf, uint32_t sum2) {
adler += buf[0];
adler %= BASE;
sum2 += adler;
sum2 %= BASE;
return adler | (sum2 << 16);
}
static inline uint32_t adler32_len_16(uint32_t adler, const uint8_t *buf, size_t len, uint32_t sum2) {
while (len) {
--len;
adler += *buf++;
sum2 += adler;
}
adler %= BASE;
sum2 %= BASE; /* only added so many BASE's */
/* return recombined sums */
return adler | (sum2 << 16);
}
static inline uint32_t adler32_copy_len_16(uint32_t adler, const uint8_t *buf, uint8_t *dst, size_t len, uint32_t sum2) {
while (len--) {
*dst = *buf++;
adler += *dst++;
sum2 += adler;
}
adler %= BASE;
sum2 %= BASE; /* only added so many BASE's */
/* return recombined sums */
return adler | (sum2 << 16);
}
static inline uint32_t adler32_len_64(uint32_t adler, const uint8_t *buf, size_t len, uint32_t sum2) {
#ifdef UNROLL_MORE
while (len >= 16) {
len -= 16;
DO16(adler, sum2, buf);
buf += 16;
#else
while (len >= 8) {
len -= 8;
DO8(adler, sum2, buf, 0);
buf += 8;
#endif
}
/* Process tail (len < 16). */
return adler32_len_16(adler, buf, len, sum2);
}
#endif /* ADLER32_P_H */
3p-zlib-ng-main/zlib-ng/arch/ 0000775 0000000 0000000 00000000000 14553115624 0016147 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/.gitignore 0000664 0000000 0000000 00000000101 14553115624 0020127 0 ustar 00root root 0000000 0000000 # ignore Makefiles; they're all automatically generated
Makefile
3p-zlib-ng-main/zlib-ng/arch/arm/ 0000775 0000000 0000000 00000000000 14553115624 0016726 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/arm/Makefile.in 0000664 0000000 0000000 00000004537 14553115624 0021004 0 ustar 00root root 0000000 0000000 # Makefile for zlib
# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
CC=
CFLAGS=
SFLAGS=
INCLUDES=
SUFFIX=
ACLEFLAG=
NEONFLAG=
ARMV6FLAG=
NOLTOFLAG=
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
all: \
adler32_neon.o adler32_neon.lo \
arm_features.o arm_features.lo \
chunkset_neon.o chunkset_neon.lo \
compare256_neon.o compare256_neon.lo \
crc32_acle.o crc32_acle.lo \
slide_hash_neon.o slide_hash_neon.lo \
slide_hash_armv6.o slide_hash_armv6.lo \
insert_string_acle.o insert_string_acle.lo
adler32_neon.o:
$(CC) $(CFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c
adler32_neon.lo:
$(CC) $(SFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_neon.c
arm_features.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/arm_features.c
arm_features.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/arm_features.c
chunkset_neon.o:
$(CC) $(CFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_neon.c
chunkset_neon.lo:
$(CC) $(SFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_neon.c
compare256_neon.o:
$(CC) $(CFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_neon.c
compare256_neon.lo:
$(CC) $(SFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_neon.c
crc32_acle.o:
$(CC) $(CFLAGS) $(ACLEFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c
crc32_acle.lo:
$(CC) $(SFLAGS) $(ACLEFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_acle.c
slide_hash_neon.o:
$(CC) $(CFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_neon.c
slide_hash_neon.lo:
$(CC) $(SFLAGS) $(NEONFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_neon.c
slide_hash_armv6.o:
$(CC) $(CFLAGS) $(ARMV6FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_armv6.c
slide_hash_armv6.lo:
$(CC) $(SFLAGS) $(ARMV6FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_armv6.c
insert_string_acle.o:
$(CC) $(CFLAGS) $(ACLEFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c
insert_string_acle.lo:
$(CC) $(SFLAGS) $(ACLEFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_acle.c
mostlyclean: clean
clean:
rm -f *.o *.lo *~
rm -rf objs
rm -f *.gcda *.gcno *.gcov
distclean: clean
rm -f Makefile
3p-zlib-ng-main/zlib-ng/arch/arm/acle_intrins.h 0000664 0000000 0000000 00000001277 14553115624 0021560 0 ustar 00root root 0000000 0000000 #ifndef ARM_ACLE_INTRINS_H
#define ARM_ACLE_INTRINS_H
#include
#ifdef _MSC_VER
# include
#elif defined(HAVE_ARM_ACLE_H)
# include
#endif
#ifdef ARM_ACLE
#if defined(__aarch64__)
# define Z_TARGET_CRC Z_TARGET("+crc")
#else
# define Z_TARGET_CRC
#endif
#endif
#ifdef ARM_SIMD
#ifdef _MSC_VER
typedef uint32_t uint16x2_t;
#define __uqsub16 _arm_uqsub16
#elif !defined(ARM_SIMD_INTRIN)
typedef uint32_t uint16x2_t;
static inline uint16x2_t __uqsub16(uint16x2_t __a, uint16x2_t __b) {
uint16x2_t __c;
__asm__ __volatile__("uqsub16 %0, %1, %2" : "=r" (__c) : "r"(__a), "r"(__b));
return __c;
}
#endif
#endif
#endif // include guard ARM_ACLE_INTRINS_H
3p-zlib-ng-main/zlib-ng/arch/arm/adler32_neon.c 0000664 0000000 0000000 00000016732 14553115624 0021356 0 ustar 00root root 0000000 0000000 /* Copyright (C) 1995-2011, 2016 Mark Adler
* Copyright (C) 2017 ARM Holdings Inc.
* Authors:
* Adenilson Cavalcanti
* Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef ARM_NEON
#include "neon_intrins.h"
#include "../../zbuild.h"
#include "../../adler32_p.h"
static void NEON_accum32(uint32_t *s, const uint8_t *buf, size_t len) {
static const uint16_t ALIGNED_(16) taps[64] = {
64, 63, 62, 61, 60, 59, 58, 57,
56, 55, 54, 53, 52, 51, 50, 49,
48, 47, 46, 45, 44, 43, 42, 41,
40, 39, 38, 37, 36, 35, 34, 33,
32, 31, 30, 29, 28, 27, 26, 25,
24, 23, 22, 21, 20, 19, 18, 17,
16, 15, 14, 13, 12, 11, 10, 9,
8, 7, 6, 5, 4, 3, 2, 1 };
uint32x4_t adacc = vdupq_n_u32(0);
uint32x4_t s2acc = vdupq_n_u32(0);
uint32x4_t s2acc_0 = vdupq_n_u32(0);
uint32x4_t s2acc_1 = vdupq_n_u32(0);
uint32x4_t s2acc_2 = vdupq_n_u32(0);
adacc = vsetq_lane_u32(s[0], adacc, 0);
s2acc = vsetq_lane_u32(s[1], s2acc, 0);
uint32x4_t s3acc = vdupq_n_u32(0);
uint32x4_t adacc_prev = adacc;
uint16x8_t s2_0, s2_1, s2_2, s2_3;
s2_0 = s2_1 = s2_2 = s2_3 = vdupq_n_u16(0);
uint16x8_t s2_4, s2_5, s2_6, s2_7;
s2_4 = s2_5 = s2_6 = s2_7 = vdupq_n_u16(0);
size_t num_iter = len >> 2;
int rem = len & 3;
for (size_t i = 0; i < num_iter; ++i) {
uint8x16x4_t d0_d3 = vld1q_u8_x4(buf);
/* Unfortunately it doesn't look like there's a direct sum 8 bit to 32
* bit instruction, we'll have to make due summing to 16 bits first */
uint16x8x2_t hsum, hsum_fold;
hsum.val[0] = vpaddlq_u8(d0_d3.val[0]);
hsum.val[1] = vpaddlq_u8(d0_d3.val[1]);
hsum_fold.val[0] = vpadalq_u8(hsum.val[0], d0_d3.val[2]);
hsum_fold.val[1] = vpadalq_u8(hsum.val[1], d0_d3.val[3]);
adacc = vpadalq_u16(adacc, hsum_fold.val[0]);
s3acc = vaddq_u32(s3acc, adacc_prev);
adacc = vpadalq_u16(adacc, hsum_fold.val[1]);
/* If we do straight widening additions to the 16 bit values, we don't incur
* the usual penalties of a pairwise add. We can defer the multiplications
* until the very end. These will not overflow because we are incurring at
* most 408 loop iterations (NMAX / 64), and a given lane is only going to be
* summed into once. This means for the maximum input size, the largest value
* we will see is 255 * 102 = 26010, safely under uint16 max */
s2_0 = vaddw_u8(s2_0, vget_low_u8(d0_d3.val[0]));
s2_1 = vaddw_high_u8(s2_1, d0_d3.val[0]);
s2_2 = vaddw_u8(s2_2, vget_low_u8(d0_d3.val[1]));
s2_3 = vaddw_high_u8(s2_3, d0_d3.val[1]);
s2_4 = vaddw_u8(s2_4, vget_low_u8(d0_d3.val[2]));
s2_5 = vaddw_high_u8(s2_5, d0_d3.val[2]);
s2_6 = vaddw_u8(s2_6, vget_low_u8(d0_d3.val[3]));
s2_7 = vaddw_high_u8(s2_7, d0_d3.val[3]);
adacc_prev = adacc;
buf += 64;
}
s3acc = vshlq_n_u32(s3acc, 6);
if (rem) {
uint32x4_t s3acc_0 = vdupq_n_u32(0);
while (rem--) {
uint8x16_t d0 = vld1q_u8(buf);
uint16x8_t adler;
adler = vpaddlq_u8(d0);
s2_6 = vaddw_u8(s2_6, vget_low_u8(d0));
s2_7 = vaddw_high_u8(s2_7, d0);
adacc = vpadalq_u16(adacc, adler);
s3acc_0 = vaddq_u32(s3acc_0, adacc_prev);
adacc_prev = adacc;
buf += 16;
}
s3acc_0 = vshlq_n_u32(s3acc_0, 4);
s3acc = vaddq_u32(s3acc_0, s3acc);
}
uint16x8x4_t t0_t3 = vld1q_u16_x4(taps);
uint16x8x4_t t4_t7 = vld1q_u16_x4(taps + 32);
s2acc = vmlal_high_u16(s2acc, t0_t3.val[0], s2_0);
s2acc_0 = vmlal_u16(s2acc_0, vget_low_u16(t0_t3.val[0]), vget_low_u16(s2_0));
s2acc_1 = vmlal_high_u16(s2acc_1, t0_t3.val[1], s2_1);
s2acc_2 = vmlal_u16(s2acc_2, vget_low_u16(t0_t3.val[1]), vget_low_u16(s2_1));
s2acc = vmlal_high_u16(s2acc, t0_t3.val[2], s2_2);
s2acc_0 = vmlal_u16(s2acc_0, vget_low_u16(t0_t3.val[2]), vget_low_u16(s2_2));
s2acc_1 = vmlal_high_u16(s2acc_1, t0_t3.val[3], s2_3);
s2acc_2 = vmlal_u16(s2acc_2, vget_low_u16(t0_t3.val[3]), vget_low_u16(s2_3));
s2acc = vmlal_high_u16(s2acc, t4_t7.val[0], s2_4);
s2acc_0 = vmlal_u16(s2acc_0, vget_low_u16(t4_t7.val[0]), vget_low_u16(s2_4));
s2acc_1 = vmlal_high_u16(s2acc_1, t4_t7.val[1], s2_5);
s2acc_2 = vmlal_u16(s2acc_2, vget_low_u16(t4_t7.val[1]), vget_low_u16(s2_5));
s2acc = vmlal_high_u16(s2acc, t4_t7.val[2], s2_6);
s2acc_0 = vmlal_u16(s2acc_0, vget_low_u16(t4_t7.val[2]), vget_low_u16(s2_6));
s2acc_1 = vmlal_high_u16(s2acc_1, t4_t7.val[3], s2_7);
s2acc_2 = vmlal_u16(s2acc_2, vget_low_u16(t4_t7.val[3]), vget_low_u16(s2_7));
s2acc = vaddq_u32(s2acc_0, s2acc);
s2acc_2 = vaddq_u32(s2acc_1, s2acc_2);
s2acc = vaddq_u32(s2acc, s2acc_2);
uint32x2_t adacc2, s2acc2, as;
s2acc = vaddq_u32(s2acc, s3acc);
adacc2 = vpadd_u32(vget_low_u32(adacc), vget_high_u32(adacc));
s2acc2 = vpadd_u32(vget_low_u32(s2acc), vget_high_u32(s2acc));
as = vpadd_u32(adacc2, s2acc2);
s[0] = vget_lane_u32(as, 0);
s[1] = vget_lane_u32(as, 1);
}
static void NEON_handle_tail(uint32_t *pair, const uint8_t *buf, size_t len) {
unsigned int i;
for (i = 0; i < len; ++i) {
pair[0] += buf[i];
pair[1] += pair[0];
}
}
Z_INTERNAL uint32_t adler32_neon(uint32_t adler, const uint8_t *buf, size_t len) {
/* split Adler-32 into component sums */
uint32_t sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;
/* in case user likes doing a byte at a time, keep it fast */
if (len == 1)
return adler32_len_1(adler, buf, sum2);
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (buf == NULL)
return 1L;
/* in case short lengths are provided, keep it somewhat fast */
if (len < 16)
return adler32_len_16(adler, buf, len, sum2);
uint32_t pair[2];
int n = NMAX;
unsigned int done = 0;
/* Split Adler-32 into component sums, it can be supplied by
* the caller sites (e.g. in a PNG file).
*/
pair[0] = adler;
pair[1] = sum2;
/* If memory is not SIMD aligned, do scalar sums to an aligned
* offset, provided that doing so doesn't completely eliminate
* SIMD operation. Aligned loads are still faster on ARM, even
* though there's no explicit aligned load instruction */
unsigned int align_offset = ((uintptr_t)buf & 15);
unsigned int align_adj = (align_offset) ? 16 - align_offset : 0;
if (align_offset && len >= (16 + align_adj)) {
NEON_handle_tail(pair, buf, align_adj);
n -= align_adj;
done += align_adj;
} else {
/* If here, we failed the len criteria test, it wouldn't be
* worthwhile to do scalar aligning sums */
align_adj = 0;
}
while (done < len) {
int remaining = (int)(len - done);
n = MIN(remaining, (done == align_adj) ? n : NMAX);
if (n < 16)
break;
NEON_accum32(pair, buf + done, n >> 4);
pair[0] %= BASE;
pair[1] %= BASE;
int actual_nsums = (n >> 4) << 4;
done += actual_nsums;
}
/* Handle the tail elements. */
if (done < len) {
NEON_handle_tail(pair, (buf + done), len - done);
pair[0] %= BASE;
pair[1] %= BASE;
}
/* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
return (pair[1] << 16) | pair[0];
}
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/arm_features.c 0000664 0000000 0000000 00000005702 14553115624 0021553 0 ustar 00root root 0000000 0000000 #include "../../zbuild.h"
#include "arm_features.h"
#if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
# include
# ifdef ARM_ASM_HWCAP
# include
# endif
#elif defined(__FreeBSD__) && defined(__aarch64__)
# include
# ifndef ID_AA64ISAR0_CRC32_VAL
# define ID_AA64ISAR0_CRC32_VAL ID_AA64ISAR0_CRC32
# endif
#elif defined(__APPLE__)
# if !defined(_DARWIN_C_SOURCE)
# define _DARWIN_C_SOURCE /* enable types aliases (eg u_int) */
# endif
# include
#elif defined(_WIN32)
# include
#endif
static int arm_has_crc32() {
#if defined(__linux__) && defined(ARM_AUXV_HAS_CRC32)
# ifdef HWCAP_CRC32
return (getauxval(AT_HWCAP) & HWCAP_CRC32) != 0 ? 1 : 0;
# else
return (getauxval(AT_HWCAP2) & HWCAP2_CRC32) != 0 ? 1 : 0;
# endif
#elif defined(__FreeBSD__) && defined(__aarch64__)
return getenv("QEMU_EMULATING") == NULL
&& ID_AA64ISAR0_CRC32_VAL(READ_SPECIALREG(id_aa64isar0_el1)) >= ID_AA64ISAR0_CRC32_BASE;
#elif defined(__APPLE__)
int hascrc32;
size_t size = sizeof(hascrc32);
return sysctlbyname("hw.optional.armv8_crc32", &hascrc32, &size, NULL, 0) == 0
&& hascrc32 == 1;
#elif defined(_WIN32)
return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
#elif defined(ARM_NOCHECK_ACLE)
return 1;
#else
return 0;
#endif
}
/* AArch64 has neon. */
#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
static inline int arm_has_neon() {
#if defined(__linux__) && defined(ARM_AUXV_HAS_NEON)
# ifdef HWCAP_ARM_NEON
return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON) != 0 ? 1 : 0;
# else
return (getauxval(AT_HWCAP) & HWCAP_NEON) != 0 ? 1 : 0;
# endif
#elif defined(__APPLE__)
int hasneon;
size_t size = sizeof(hasneon);
return sysctlbyname("hw.optional.neon", &hasneon, &size, NULL, 0) == 0
&& hasneon == 1;
#elif defined(_M_ARM) && defined(WINAPI_FAMILY_PARTITION)
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
return 1; /* Always supported */
# endif
#endif
#if defined(ARM_NOCHECK_NEON)
return 1;
#else
return 0;
#endif
}
#endif
/* AArch64 does not have ARMv6 SIMD. */
#if !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
static inline int arm_has_simd() {
#if defined(__linux__) && defined(HAVE_SYS_AUXV_H)
const char *platform = (const char *)getauxval(AT_PLATFORM);
return strncmp(platform, "v6l", 3) == 0
|| strncmp(platform, "v7l", 3) == 0
|| strncmp(platform, "v8l", 3) == 0;
#elif defined(ARM_NOCHECK_SIMD)
return 1;
#else
return 0;
#endif
}
#endif
void Z_INTERNAL arm_check_features(struct arm_cpu_features *features) {
#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
features->has_simd = 0; /* never available */
features->has_neon = 1; /* always available */
#else
features->has_simd = arm_has_simd();
features->has_neon = arm_has_neon();
#endif
features->has_crc32 = arm_has_crc32();
}
3p-zlib-ng-main/zlib-ng/arch/arm/arm_features.h 0000664 0000000 0000000 00000000514 14553115624 0021554 0 ustar 00root root 0000000 0000000 /* arm_features.h -- check for ARM features.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef ARM_H_
#define ARM_H_
struct arm_cpu_features {
int has_simd;
int has_neon;
int has_crc32;
};
void Z_INTERNAL arm_check_features(struct arm_cpu_features *features);
#endif /* ARM_H_ */
3p-zlib-ng-main/zlib-ng/arch/arm/chunkset_neon.c 0000664 0000000 0000000 00000005327 14553115624 0021744 0 ustar 00root root 0000000 0000000 /* chunkset_neon.c -- NEON inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef ARM_NEON
#include "neon_intrins.h"
#include "../../zbuild.h"
#include "../generic/chunk_permute_table.h"
typedef uint8x16_t chunk_t;
#define CHUNK_SIZE 16
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
#define HAVE_CHUNK_MAG
static const lut_rem_pair perm_idx_lut[13] = {
{0, 1}, /* 3 */
{0, 0}, /* don't care */
{1 * 32, 1}, /* 5 */
{2 * 32, 4}, /* 6 */
{3 * 32, 2}, /* 7 */
{0 * 32, 0}, /* don't care */
{4 * 32, 7}, /* 9 */
{5 * 32, 6}, /* 10 */
{6 * 32, 5}, /* 11 */
{7 * 32, 4}, /* 12 */
{8 * 32, 3}, /* 13 */
{9 * 32, 2}, /* 14 */
{10 * 32, 1},/* 15 */
};
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
uint16_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = vreinterpretq_u8_u16(vdupq_n_u16(tmp));
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
uint32_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = vreinterpretq_u8_u32(vdupq_n_u32(tmp));
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
uint64_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = vreinterpretq_u8_u64(vdupq_n_u64(tmp));
}
#define CHUNKSIZE chunksize_neon
#define CHUNKCOPY chunkcopy_neon
#define CHUNKUNROLL chunkunroll_neon
#define CHUNKMEMSET chunkmemset_neon
#define CHUNKMEMSET_SAFE chunkmemset_safe_neon
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
*chunk = vld1q_u8(s);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
vst1q_u8(out, *chunk);
}
static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t dist) {
lut_rem_pair lut_rem = perm_idx_lut[dist - 3];
*chunk_rem = lut_rem.remval;
/* See note in chunkset_ssse3.c for why this is ok */
__msan_unpoison(buf + dist, 16 - dist);
/* This version of table is only available on aarch64 */
#if defined(_M_ARM64) || defined(_M_ARM64EC) || defined(__aarch64__)
uint8x16_t ret_vec = vld1q_u8(buf);
uint8x16_t perm_vec = vld1q_u8(permute_table + lut_rem.idx);
return vqtbl1q_u8(ret_vec, perm_vec);
#else
uint8x8_t ret0, ret1, a, b, perm_vec0, perm_vec1;
perm_vec0 = vld1_u8(permute_table + lut_rem.idx);
perm_vec1 = vld1_u8(permute_table + lut_rem.idx + 8);
a = vld1_u8(buf);
b = vld1_u8(buf + 8);
ret0 = vtbl1_u8(a, perm_vec0);
uint8x8x2_t ab = {{a, b}};
ret1 = vtbl2_u8(ab, perm_vec1);
return vcombine_u8(ret0, ret1);
#endif
}
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_neon
#include "inffast_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/compare256_neon.c 0000664 0000000 0000000 00000002733 14553115624 0022001 0 ustar 00root root 0000000 0000000 /* compare256_neon.c - NEON version of compare256
* Copyright (C) 2022 Nathan Moinvaziri
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "fallback_builtins.h"
#if defined(ARM_NEON) && defined(HAVE_BUILTIN_CTZLL)
#include "neon_intrins.h"
static inline uint32_t compare256_neon_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
uint8x16_t a, b, cmp;
uint64_t lane;
a = vld1q_u8(src0);
b = vld1q_u8(src1);
cmp = veorq_u8(a, b);
lane = vgetq_lane_u64(vreinterpretq_u64_u8(cmp), 0);
if (lane) {
uint32_t match_byte = (uint32_t)__builtin_ctzll(lane) / 8;
return len + match_byte;
}
len += 8;
lane = vgetq_lane_u64(vreinterpretq_u64_u8(cmp), 1);
if (lane) {
uint32_t match_byte = (uint32_t)__builtin_ctzll(lane) / 8;
return len + match_byte;
}
len += 8;
src0 += 16, src1 += 16;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_neon(const uint8_t *src0, const uint8_t *src1) {
return compare256_neon_static(src0, src1);
}
#define LONGEST_MATCH longest_match_neon
#define COMPARE256 compare256_neon_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_neon
#define COMPARE256 compare256_neon_static
#include "match_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/crc32_acle.c 0000664 0000000 0000000 00000003664 14553115624 0021003 0 ustar 00root root 0000000 0000000 /* crc32_acle.c -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
* Copyright (C) 2016 Yang Zhang
* For conditions of distribution and use, see copyright notice in zlib.h
*
*/
#ifdef ARM_ACLE
#include "acle_intrins.h"
#include "../../zbuild.h"
Z_INTERNAL Z_TARGET_CRC uint32_t crc32_acle(uint32_t crc, const uint8_t *buf, size_t len) {
Z_REGISTER uint32_t c;
Z_REGISTER const uint16_t *buf2;
Z_REGISTER const uint32_t *buf4;
Z_REGISTER const uint64_t *buf8;
c = ~crc;
if (UNLIKELY(len == 1)) {
c = __crc32b(c, *buf);
c = ~c;
return c;
}
if ((ptrdiff_t)buf & (sizeof(uint64_t) - 1)) {
if (len && ((ptrdiff_t)buf & 1)) {
c = __crc32b(c, *buf++);
len--;
}
if ((len >= sizeof(uint16_t)) && ((ptrdiff_t)buf & sizeof(uint16_t))) {
buf2 = (const uint16_t *) buf;
c = __crc32h(c, *buf2++);
len -= sizeof(uint16_t);
buf4 = (const uint32_t *) buf2;
} else {
buf4 = (const uint32_t *) buf;
}
if ((len >= sizeof(uint32_t)) && ((ptrdiff_t)buf & sizeof(uint32_t))) {
c = __crc32w(c, *buf4++);
len -= sizeof(uint32_t);
}
buf8 = (const uint64_t *) buf4;
} else {
buf8 = (const uint64_t *) buf;
}
while (len >= sizeof(uint64_t)) {
c = __crc32d(c, *buf8++);
len -= sizeof(uint64_t);
}
if (len >= sizeof(uint32_t)) {
buf4 = (const uint32_t *) buf8;
c = __crc32w(c, *buf4++);
len -= sizeof(uint32_t);
buf2 = (const uint16_t *) buf4;
} else {
buf2 = (const uint16_t *) buf8;
}
if (len >= sizeof(uint16_t)) {
c = __crc32h(c, *buf2++);
len -= sizeof(uint16_t);
}
buf = (const unsigned char *) buf2;
if (len) {
c = __crc32b(c, *buf);
}
c = ~c;
return c;
}
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/insert_string_acle.c 0000664 0000000 0000000 00000001264 14553115624 0022753 0 ustar 00root root 0000000 0000000 /* insert_string_acle.c -- insert_string integer hash variant using ACLE's CRC instructions
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
*/
#ifdef ARM_ACLE
#include "acle_intrins.h"
#include "../../zbuild.h"
#include "../../deflate.h"
#define HASH_CALC(s, h, val) \
h = __crc32w(0, val)
#define HASH_CALC_VAR h
#define HASH_CALC_VAR_INIT uint32_t h = 0
#define UPDATE_HASH Z_TARGET_CRC update_hash_acle
#define INSERT_STRING Z_TARGET_CRC insert_string_acle
#define QUICK_INSERT_STRING Z_TARGET_CRC quick_insert_string_acle
#include "../../insert_string_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/neon_intrins.h 0000664 0000000 0000000 00000003376 14553115624 0021615 0 ustar 00root root 0000000 0000000 #ifndef ARM_NEON_INTRINS_H
#define ARM_NEON_INTRINS_H
#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC))
/* arm64_neon.h is MSVC specific */
# include
#else
# include
#endif
#if defined(ARM_NEON) && !defined(__aarch64__) && !defined(_M_ARM64) && !defined(_M_ARM64EC)
/* Compatibility shim for the _high family of functions */
#define vmull_high_u8(a, b) vmull_u8(vget_high_u8(a), vget_high_u8(b))
#define vmlal_high_u8(a, b, c) vmlal_u8(a, vget_high_u8(b), vget_high_u8(c))
#define vmlal_high_u16(a, b, c) vmlal_u16(a, vget_high_u16(b), vget_high_u16(c))
#define vaddw_high_u8(a, b) vaddw_u8(a, vget_high_u8(b))
#endif
#ifdef ARM_NEON
#define vqsubq_u16_x4_x1(out, a, b) do { \
out.val[0] = vqsubq_u16(a.val[0], b); \
out.val[1] = vqsubq_u16(a.val[1], b); \
out.val[2] = vqsubq_u16(a.val[2], b); \
out.val[3] = vqsubq_u16(a.val[3], b); \
} while (0)
# ifndef ARM_NEON_HASLD4
static inline uint16x8x4_t vld1q_u16_x4(uint16_t const *a) {
uint16x8x4_t ret = (uint16x8x4_t) {{
vld1q_u16(a),
vld1q_u16(a+8),
vld1q_u16(a+16),
vld1q_u16(a+24)}};
return ret;
}
static inline uint8x16x4_t vld1q_u8_x4(uint8_t const *a) {
uint8x16x4_t ret = (uint8x16x4_t) {{
vld1q_u8(a),
vld1q_u8(a+16),
vld1q_u8(a+32),
vld1q_u8(a+48)}};
return ret;
}
static inline void vst1q_u16_x4(uint16_t *p, uint16x8x4_t a) {
vst1q_u16(p, a.val[0]);
vst1q_u16(p + 8, a.val[1]);
vst1q_u16(p + 16, a.val[2]);
vst1q_u16(p + 24, a.val[3]);
}
# endif // HASLD4 check
#endif
#endif // include guard ARM_NEON_INTRINS_H
3p-zlib-ng-main/zlib-ng/arch/arm/slide_hash_armv6.c 0000664 0000000 0000000 00000002715 14553115624 0022315 0 ustar 00root root 0000000 0000000 /* slide_hash_armv6.c -- Optimized hash table shifting for ARMv6 with support for SIMD instructions
* Copyright (C) 2023 Cameron Cawley
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#if defined(ARM_SIMD)
#include "acle_intrins.h"
#include "../../zbuild.h"
#include "../../deflate.h"
/* SIMD version of hash_chain rebase */
static inline void slide_hash_chain(Pos *table, uint32_t entries, uint16_t wsize) {
Z_REGISTER uint16x2_t v;
uint16x2_t p0, p1, p2, p3;
Z_REGISTER size_t n;
size_t size = entries*sizeof(table[0]);
Assert((size % (sizeof(uint16x2_t) * 4) == 0), "hash table size err");
Assert(sizeof(Pos) == 2, "Wrong Pos size");
v = wsize | (wsize << 16);
n = size / (sizeof(uint16x2_t) * 4);
do {
p0 = *((const uint16x2_t *)(table));
p1 = *((const uint16x2_t *)(table+2));
p2 = *((const uint16x2_t *)(table+4));
p3 = *((const uint16x2_t *)(table+6));
p0 = __uqsub16(p0, v);
p1 = __uqsub16(p1, v);
p2 = __uqsub16(p2, v);
p3 = __uqsub16(p3, v);
*((uint16x2_t *)(table)) = p0;
*((uint16x2_t *)(table+2)) = p1;
*((uint16x2_t *)(table+4)) = p2;
*((uint16x2_t *)(table+6)) = p3;
table += 8;
} while (--n);
}
Z_INTERNAL void slide_hash_armv6(deflate_state *s) {
unsigned int wsize = s->w_size;
slide_hash_chain(s->head, HASH_SIZE, wsize);
slide_hash_chain(s->prev, wsize, wsize);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/arm/slide_hash_neon.c 0000664 0000000 0000000 00000002430 14553115624 0022213 0 ustar 00root root 0000000 0000000 /* slide_hash_neon.c -- Optimized hash table shifting for ARM with support for NEON instructions
* Copyright (C) 2017-2020 Mika T. Lindqvist
*
* Authors:
* Mika T. Lindqvist
* Jun He
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef ARM_NEON
#include "neon_intrins.h"
#include "../../zbuild.h"
#include "../../deflate.h"
/* SIMD version of hash_chain rebase */
static inline void slide_hash_chain(Pos *table, uint32_t entries, uint16_t wsize) {
Z_REGISTER uint16x8_t v;
uint16x8x4_t p0, p1;
Z_REGISTER size_t n;
size_t size = entries*sizeof(table[0]);
Assert((size % sizeof(uint16x8_t) * 8 == 0), "hash table size err");
Assert(sizeof(Pos) == 2, "Wrong Pos size");
v = vdupq_n_u16(wsize);
n = size / (sizeof(uint16x8_t) * 8);
do {
p0 = vld1q_u16_x4(table);
p1 = vld1q_u16_x4(table+32);
vqsubq_u16_x4_x1(p0, p0, v);
vqsubq_u16_x4_x1(p1, p1, v);
vst1q_u16_x4(table, p0);
vst1q_u16_x4(table+32, p1);
table += 64;
} while (--n);
}
Z_INTERNAL void slide_hash_neon(deflate_state *s) {
unsigned int wsize = s->w_size;
slide_hash_chain(s->head, HASH_SIZE, wsize);
slide_hash_chain(s->prev, wsize, wsize);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/generic/ 0000775 0000000 0000000 00000000000 14553115624 0017563 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/generic/Makefile.in 0000664 0000000 0000000 00000000535 14553115624 0021633 0 ustar 00root root 0000000 0000000 # Makefile for zlib
# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
CC=
CFLAGS=
SFLAGS=
INCLUDES=
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
all:
mostlyclean: clean
clean:
rm -f *.o *.lo *~ \
rm -rf objs
rm -f *.gcda *.gcno *.gcov
distclean: clean
rm -f Makefile
3p-zlib-ng-main/zlib-ng/arch/generic/chunk_permute_table.h 0000664 0000000 0000000 00000006524 14553115624 0023763 0 ustar 00root root 0000000 0000000 /* chunk_permute_table.h - shared AVX/SSSE3 permutation table for use with chunkmemset family of functions.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef CHUNK_PERMUTE_TABLE_H_
#define CHUNK_PERMUTE_TABLE_H_
#include "zbuild.h"
/* Need entries for all numbers not an even modulus for 1, 2, 4, 8, 16 & 32 */
static const ALIGNED_(32) uint8_t permute_table[26*32] = {
0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, /* dist 3 */
0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, /* dist 5 */
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, /* dist 6 */
0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, /* dist 7 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, /* dist 9 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, /* dist 10 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* dist 11 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4, 5, 6, 7, /* dist 12 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, /* dist 13 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 1, 2, 3, /* dist 14 */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, /* dist 15 */
/* Beyond dists of 15 means we have to permute from a vector > len(m128i). Because AVX couldn't permute
* beyond 128 bit lanes until AVX512 for sub 4-byte sequences, we have to do some math here for an eventual
* blend with a comparison. That means we need to wrap the indices with yet another derived table. For simplicity,
* we'll use absolute indexing here to derive a blend vector. This is actually a lot simpler with ARM's TBL, but,
* this is what we're dealt.
*/
16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* dist 17 */
16, 17, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, /* dist 18 */
16, 17, 18, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, /* dist 19 */
16, 17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* dist 20 */
16, 17, 18, 19, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, /* dist 21 */
16, 17, 18, 19, 20, 21, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, /* dist 22 */
16, 17, 18, 19, 20, 21, 22, 0, 1, 2, 3, 4, 5, 6, 7, 8, /* dist 23 */
16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, /* dist 24 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 0, 1, 2, 3, 4, 5, 6, /* dist 25 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 1, 2, 3, 4, 5, /* dist 26 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, /* dist 27 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 1, 2, 3, /* dist 28 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 1, 2, /* dist 29 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 1, /* dist 30 */
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, /* dist 31 */
};
typedef struct lut_rem_pair_s {
uint16_t idx;
uint16_t remval;
} lut_rem_pair;
#endif
3p-zlib-ng-main/zlib-ng/arch/power/ 0000775 0000000 0000000 00000000000 14553115624 0017303 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/power/Makefile.in 0000664 0000000 0000000 00000005052 14553115624 0021352 0 ustar 00root root 0000000 0000000 # Makefile for POWER-specific files
# Copyright (C) 2020 Matheus Castanho , IBM
# Copyright (C) 2021 Mika T. Lindqvist
# For conditions of distribution and use, see copyright notice in zlib.h
CC=
CFLAGS=
SFLAGS=
INCLUDES=
SUFFIX=
P8FLAGS=-mcpu=power8
P9FLAGS=-mcpu=power9
PPCFLAGS=-maltivec
NOLTOFLAG=
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
all: power_features.o \
power_features.lo \
adler32_power8.o \
adler32_power8.lo \
adler32_vmx.o \
adler32_vmx.lo \
chunkset_power8.o \
chunkset_power8.lo \
compare256_power9.o \
compare256_power9.lo \
crc32_power8.o \
crc32_power8.lo \
slide_hash_power8.o \
slide_hash_power8.lo \
slide_hash_vmx.o \
slide_hash_vmx.lo
power_features.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/power_features.c
power_features.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/power_features.c
adler32_power8.o:
$(CC) $(CFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_power8.c
adler32_power8.lo:
$(CC) $(SFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_power8.c
adler32_vmx.o:
$(CC) $(CFLAGS) $(PPCFLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_vmx.c
adler32_vmx.lo:
$(CC) $(SFLAGS) $(PPCFLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_vmx.c
chunkset_power8.o:
$(CC) $(CFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_power8.c
chunkset_power8.lo:
$(CC) $(SFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_power8.c
compare256_power9.o:
$(CC) $(CFLAGS) $(P9FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_power9.c
compare256_power9.lo:
$(CC) $(SFLAGS) $(P9FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_power9.c
crc32_power8.o:
$(CC) $(CFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_power8.c
crc32_power8.lo:
$(CC) $(SFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_power8.c
slide_hash_power8.o:
$(CC) $(CFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_power8.c
slide_hash_power8.lo:
$(CC) $(SFLAGS) $(P8FLAGS) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_power8.c
slide_hash_vmx.o:
$(CC) $(CFLAGS) ${PPCFLAGS} $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_vmx.c
slide_hash_vmx.lo:
$(CC) $(SFLAGS) ${PPCFLAGS} $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_vmx.c
mostlyclean: clean
clean:
rm -f *.o *.lo *~
rm -rf objs
rm -f *.gcda *.gcno *.gcov
distclean: clean
rm -f Makefile
3p-zlib-ng-main/zlib-ng/arch/power/adler32_power8.c 0000664 0000000 0000000 00000012063 14553115624 0022211 0 ustar 00root root 0000000 0000000 /* Adler32 for POWER8 using VSX instructions.
* Copyright (C) 2020 IBM Corporation
* Author: Rogerio Alves
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Calculate adler32 checksum for 16 bytes at once using POWER8+ VSX (vector)
* instructions.
*
* If adler32 do 1 byte at time on the first iteration s1 is s1_0 (_n means
* iteration n) is the initial value of adler - at start _0 is 1 unless
* adler initial value is different than 1. So s1_1 = s1_0 + c[0] after
* the first calculation. For the iteration s1_2 = s1_1 + c[1] and so on.
* Hence, for iteration N, s1_N = s1_(N-1) + c[N] is the value of s1 on
* after iteration N.
*
* Therefore, for s2 and iteration N, s2_N = s2_0 + N*s1_N + N*c[0] +
* N-1*c[1] + ... + c[N]
*
* In a more general way:
*
* s1_N = s1_0 + sum(i=1 to N)c[i]
* s2_N = s2_0 + N*s1 + sum (i=1 to N)(N-i+1)*c[i]
*
* Where s1_N, s2_N are the values for s1, s2 after N iterations. So if we
* can process N-bit at time we can do this at once.
*
* Since VSX can support 16-bit vector instructions, we can process
* 16-bit at time using N = 16 we have:
*
* s1 = s1_16 = s1_(16-1) + c[16] = s1_0 + sum(i=1 to 16)c[i]
* s2 = s2_16 = s2_0 + 16*s1 + sum(i=1 to 16)(16-i+1)*c[i]
*
* After the first iteration we calculate the adler32 checksum for 16 bytes.
*
* For more background about adler32 please check the RFC:
* https://www.ietf.org/rfc/rfc1950.txt
*/
#ifdef POWER8_VSX
#include
#include "zbuild.h"
#include "adler32_p.h"
/* Vector across sum unsigned int (saturate). */
static inline vector unsigned int vec_sumsu(vector unsigned int __a, vector unsigned int __b) {
__b = vec_sld(__a, __a, 8);
__b = vec_add(__b, __a);
__a = vec_sld(__b, __b, 4);
__a = vec_add(__a, __b);
return __a;
}
Z_INTERNAL uint32_t adler32_power8(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t s1 = adler & 0xffff;
uint32_t s2 = (adler >> 16) & 0xffff;
/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(s1, buf, s2);
/* If buffer is empty or len=0 we need to return adler initial value. */
if (UNLIKELY(buf == NULL))
return 1;
/* This is faster than VSX code for len < 64. */
if (len < 64)
return adler32_len_64(s1, buf, len, s2);
/* Use POWER VSX instructions for len >= 64. */
const vector unsigned int v_zeros = { 0 };
const vector unsigned char v_mul = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7,
6, 5, 4, 3, 2, 1};
const vector unsigned char vsh = vec_splat_u8(4);
const vector unsigned int vmask = {0xffffffff, 0x0, 0x0, 0x0};
vector unsigned int vs1 = { 0 };
vector unsigned int vs2 = { 0 };
vector unsigned int vs1_save = { 0 };
vector unsigned int vsum1, vsum2;
vector unsigned char vbuf;
int n;
vs1[0] = s1;
vs2[0] = s2;
/* Do length bigger than NMAX in blocks of NMAX size. */
while (len >= NMAX) {
len -= NMAX;
n = NMAX / 16;
do {
vbuf = vec_xl(0, (unsigned char *) buf);
vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */
/* sum(i=1 to 16) buf[i]*(16-i+1). */
vsum2 = vec_msum(vbuf, v_mul, v_zeros);
/* Save vs1. */
vs1_save = vec_add(vs1_save, vs1);
/* Accumulate the sums. */
vs1 = vec_add(vsum1, vs1);
vs2 = vec_add(vsum2, vs2);
buf += 16;
} while (--n);
/* Once each block of NMAX size. */
vs1 = vec_sumsu(vs1, vsum1);
vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */
vs2 = vec_add(vs1_save, vs2);
vs2 = vec_sumsu(vs2, vsum2);
/* vs1[0] = (s1_i + sum(i=1 to 16)buf[i]) mod 65521. */
vs1[0] = vs1[0] % BASE;
/* vs2[0] = s2_i + 16*s1_save +
sum(i=1 to 16)(16-i+1)*buf[i] mod 65521. */
vs2[0] = vs2[0] % BASE;
vs1 = vec_and(vs1, vmask);
vs2 = vec_and(vs2, vmask);
vs1_save = v_zeros;
}
/* len is less than NMAX one modulo is needed. */
if (len >= 16) {
while (len >= 16) {
len -= 16;
vbuf = vec_xl(0, (unsigned char *) buf);
vsum1 = vec_sum4s(vbuf, v_zeros); /* sum(i=1 to 16) buf[i]. */
/* sum(i=1 to 16) buf[i]*(16-i+1). */
vsum2 = vec_msum(vbuf, v_mul, v_zeros);
/* Save vs1. */
vs1_save = vec_add(vs1_save, vs1);
/* Accumulate the sums. */
vs1 = vec_add(vsum1, vs1);
vs2 = vec_add(vsum2, vs2);
buf += 16;
}
/* Since the size will be always less than NMAX we do this once. */
vs1 = vec_sumsu(vs1, vsum1);
vs1_save = vec_sll(vs1_save, vsh); /* 16*vs1_save. */
vs2 = vec_add(vs1_save, vs2);
vs2 = vec_sumsu(vs2, vsum2);
}
/* Copy result back to s1, s2 (mod 65521). */
s1 = vs1[0] % BASE;
s2 = vs2[0] % BASE;
/* Process tail (len < 16). */
return adler32_len_16(s1, buf, len, s2);
}
#endif /* POWER8_VSX */
3p-zlib-ng-main/zlib-ng/arch/power/adler32_vmx.c 0000664 0000000 0000000 00000014101 14553115624 0021572 0 ustar 00root root 0000000 0000000 /* adler32_vmx.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011 Mark Adler
* Copyright (C) 2017-2023 Mika T. Lindqvist
* Copyright (C) 2021 Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef PPC_VMX
#include
#include "zbuild.h"
#include "zendian.h"
#include "adler32_p.h"
#define vmx_zero() (vec_splat_u32(0))
static inline void vmx_handle_head_or_tail(uint32_t *pair, const uint8_t *buf, size_t len) {
unsigned int i;
for (i = 0; i < len; ++i) {
pair[0] += buf[i];
pair[1] += pair[0];
}
}
static void vmx_accum32(uint32_t *s, const uint8_t *buf, size_t len) {
/* Different taps for the separable components of sums */
const vector unsigned char t0 = {64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49};
const vector unsigned char t1 = {48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33};
const vector unsigned char t2 = {32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17};
const vector unsigned char t3 = {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
/* As silly and inefficient as it seems, creating 1 permutation vector to permute
* a 2 element vector from a single load + a subsequent shift is just barely faster
* than doing 2 indexed insertions into zero initialized vectors from unaligned memory. */
const vector unsigned char s0_perm = {0, 1, 2, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
const vector unsigned char shift_vec = vec_sl(vec_splat_u8(8), vec_splat_u8(2));
vector unsigned int adacc, s2acc;
vector unsigned int pair_vec = vec_ld(0, s);
adacc = vec_perm(pair_vec, pair_vec, s0_perm);
#if BYTE_ORDER == LITTLE_ENDIAN
s2acc = vec_sro(pair_vec, shift_vec);
#else
s2acc = vec_slo(pair_vec, shift_vec);
#endif
vector unsigned int zero = vmx_zero();
vector unsigned int s3acc = zero;
vector unsigned int s3acc_0 = zero;
vector unsigned int adacc_prev = adacc;
vector unsigned int adacc_prev_0 = zero;
vector unsigned int s2acc_0 = zero;
vector unsigned int s2acc_1 = zero;
vector unsigned int s2acc_2 = zero;
/* Maintain a running sum of a second half, this might help use break yet another
* data dependency bubble in the sum */
vector unsigned int adacc_0 = zero;
int num_iter = len / 4;
int rem = len & 3;
for (int i = 0; i < num_iter; ++i) {
vector unsigned char d0 = vec_ld(0, buf);
vector unsigned char d1 = vec_ld(16, buf);
vector unsigned char d2 = vec_ld(32, buf);
vector unsigned char d3 = vec_ld(48, buf);
/* The core operation of the loop, basically
* what is being unrolled below */
adacc = vec_sum4s(d0, adacc);
s3acc = vec_add(s3acc, adacc_prev);
s3acc_0 = vec_add(s3acc_0, adacc_prev_0);
s2acc = vec_msum(t0, d0, s2acc);
/* interleave dependent sums in here */
adacc_0 = vec_sum4s(d1, adacc_0);
s2acc_0 = vec_msum(t1, d1, s2acc_0);
adacc = vec_sum4s(d2, adacc);
s2acc_1 = vec_msum(t2, d2, s2acc_1);
s2acc_2 = vec_msum(t3, d3, s2acc_2);
adacc_0 = vec_sum4s(d3, adacc_0);
adacc_prev = adacc;
adacc_prev_0 = adacc_0;
buf += 64;
}
adacc = vec_add(adacc, adacc_0);
s3acc = vec_add(s3acc, s3acc_0);
s3acc = vec_sl(s3acc, vec_splat_u32(6));
if (rem) {
adacc_prev = vec_add(adacc_prev_0, adacc_prev);
adacc_prev = vec_sl(adacc_prev, vec_splat_u32(4));
while (rem--) {
vector unsigned char d0 = vec_ld(0, buf);
adacc = vec_sum4s(d0, adacc);
s3acc = vec_add(s3acc, adacc_prev);
s2acc = vec_msum(t3, d0, s2acc);
adacc_prev = vec_sl(adacc, vec_splat_u32(4));
buf += 16;
}
}
/* Sum up independent second sums */
s2acc = vec_add(s2acc, s2acc_0);
s2acc_2 = vec_add(s2acc_1, s2acc_2);
s2acc = vec_add(s2acc, s2acc_2);
s2acc = vec_add(s2acc, s3acc);
adacc = vec_add(adacc, vec_sld(adacc, adacc, 8));
s2acc = vec_add(s2acc, vec_sld(s2acc, s2acc, 8));
adacc = vec_add(adacc, vec_sld(adacc, adacc, 4));
s2acc = vec_add(s2acc, vec_sld(s2acc, s2acc, 4));
vec_ste(adacc, 0, s);
vec_ste(s2acc, 0, s+1);
}
Z_INTERNAL uint32_t adler32_vmx(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t sum2;
uint32_t pair[16] ALIGNED_(16);
memset(&pair[2], 0, 14);
int n = NMAX;
unsigned int done = 0, i;
/* Split Adler-32 into component sums, it can be supplied by
* the caller sites (e.g. in a PNG file).
*/
sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;
pair[0] = adler;
pair[1] = sum2;
/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(adler, buf, sum2);
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (UNLIKELY(buf == NULL))
return 1L;
/* in case short lengths are provided, keep it somewhat fast */
if (UNLIKELY(len < 16))
return adler32_len_16(adler, buf, len, sum2);
// Align buffer
unsigned int al = 0;
if ((uintptr_t)buf & 0xf) {
al = 16-((uintptr_t)buf & 0xf);
if (al > len) {
al=len;
}
vmx_handle_head_or_tail(pair, buf, al);
done += al;
/* Rather than rebasing, we can reduce the max sums for the
* first round only */
n -= al;
}
for (i = al; i < len; i += n) {
int remaining = (int)(len-i);
n = MIN(remaining, (i == al) ? n : NMAX);
if (n < 16)
break;
vmx_accum32(pair, buf + i, n / 16);
pair[0] %= BASE;
pair[1] %= BASE;
done += (n / 16) * 16;
}
/* Handle the tail elements. */
if (done < len) {
vmx_handle_head_or_tail(pair, (buf + done), len - done);
pair[0] %= BASE;
pair[1] %= BASE;
}
/* D = B * 65536 + A, see: https://en.wikipedia.org/wiki/Adler-32. */
return (pair[1] << 16) | pair[0];
}
#endif
3p-zlib-ng-main/zlib-ng/arch/power/chunkset_power8.c 0000664 0000000 0000000 00000002622 14553115624 0022601 0 ustar 00root root 0000000 0000000 /* chunkset_power8.c -- VSX inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef POWER8_VSX
#include
#include "../../zbuild.h"
typedef vector unsigned char chunk_t;
#define CHUNK_SIZE 16
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
uint16_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = (vector unsigned char)vec_splats(tmp);
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
uint32_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = (vector unsigned char)vec_splats(tmp);
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
uint64_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = (vector unsigned char)vec_splats((unsigned long long)tmp);
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
*chunk = vec_xl(0, s);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
vec_xst(*chunk, 0, out);
}
#define CHUNKSIZE chunksize_power8
#define CHUNKCOPY chunkcopy_power8
#define CHUNKUNROLL chunkunroll_power8
#define CHUNKMEMSET chunkmemset_power8
#define CHUNKMEMSET_SAFE chunkmemset_safe_power8
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_power8
#include "inffast_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/power/compare256_power9.c 0000664 0000000 0000000 00000004105 14553115624 0022637 0 ustar 00root root 0000000 0000000 /* compare256_power9.c - Power9 version of compare256
* Copyright (C) 2019 Matheus Castanho , IBM
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef POWER9
#include
#include "../../zbuild.h"
#include "../../zendian.h"
/* Older versions of GCC misimplemented semantics for these bit counting builtins.
* https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=3f30f2d1dbb3228b8468b26239fe60c2974ce2ac */
#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 12)
#if BYTE_ORDER == LITTLE_ENDIAN
# define zng_vec_vctzlsbb(vc, len) len = __builtin_vec_vctzlsbb(vc)
#else
# define zng_vec_vctzlsbb(vc, len) len = __builtin_vec_vclzlsbb(vc)
#endif
#else
# define zng_vec_vctzlsbb(vc, len) len = vec_cntlz_lsbb(vc)
#endif
static inline uint32_t compare256_power9_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0, cmplen;
do {
vector unsigned char vsrc0, vsrc1, vc;
vsrc0 = *((vector unsigned char *)src0);
vsrc1 = *((vector unsigned char *)src1);
/* Compare 16 bytes at a time. Each byte of vc will be either
* all ones or all zeroes, depending on the result of the comparison. */
vc = (vector unsigned char)vec_cmpne(vsrc0, vsrc1);
/* Since the index of matching bytes will contain only zeroes
* on vc (since we used cmpne), counting the number of consecutive
* bytes where LSB == 0 is the same as counting the length of the match. */
zng_vec_vctzlsbb(vc, cmplen);
if (cmplen != 16)
return len + cmplen;
src0 += 16, src1 += 16, len += 16;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_power9(const uint8_t *src0, const uint8_t *src1) {
return compare256_power9_static(src0, src1);
}
#define LONGEST_MATCH longest_match_power9
#define COMPARE256 compare256_power9_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_power9
#define COMPARE256 compare256_power9_static
#include "match_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/power/crc32_constants.h 0000664 0000000 0000000 00000164145 14553115624 0022477 0 ustar 00root root 0000000 0000000 /* Constants table used by crc32_power8.c
* Copyright (C) 2021 IBM Corporation
*
* This file was automatically generated, DO NOT EDIT IT MANUALLY.
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zendian.h"
#include "zbuild.h"
/* Reduce 262144 kbits to 1024 bits */
static const __vector unsigned long long vcrc_const[255] ALIGNED_(16) = {
#if BYTE_ORDER == LITTLE_ENDIAN
/* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */
{ 0x0000000099ea94a8, 0x00000001651797d2 },
/* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */
{ 0x00000000945a8420, 0x0000000021e0d56c },
/* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */
{ 0x0000000030762706, 0x000000000f95ecaa },
/* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */
{ 0x00000001a52fc582, 0x00000001ebd224ac },
/* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */
{ 0x00000001a4a7167a, 0x000000000ccb97ca },
/* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */
{ 0x000000000c18249a, 0x00000001006ec8a8 },
/* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */
{ 0x00000000a924ae7c, 0x000000014f58f196 },
/* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */
{ 0x00000001e12ccc12, 0x00000001a7192ca6 },
/* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */
{ 0x00000000a0b9d4ac, 0x000000019a64bab2 },
/* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */
{ 0x0000000095e8ddfe, 0x0000000014f4ed2e },
/* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */
{ 0x00000000233fddc4, 0x000000011092b6a2 },
/* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */
{ 0x00000001b4529b62, 0x00000000c8a1629c },
/* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */
{ 0x00000001a7fa0e64, 0x000000017bf32e8e },
/* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */
{ 0x00000001b5334592, 0x00000001f8cc6582 },
/* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */
{ 0x000000011f8ee1b4, 0x000000008631ddf0 },
/* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */
{ 0x000000006252e632, 0x000000007e5a76d0 },
/* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */
{ 0x00000000ab973e84, 0x000000002b09b31c },
/* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */
{ 0x000000007734f5ec, 0x00000001b2df1f84 },
/* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */
{ 0x000000007c547798, 0x00000001d6f56afc },
/* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */
{ 0x000000007ec40210, 0x00000001b9b5e70c },
/* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */
{ 0x00000001ab1695a8, 0x0000000034b626d2 },
/* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */
{ 0x0000000090494bba, 0x000000014c53479a },
/* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */
{ 0x00000001123fb816, 0x00000001a6d179a4 },
/* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */
{ 0x00000001e188c74c, 0x000000015abd16b4 },
/* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */
{ 0x00000001c2d3451c, 0x00000000018f9852 },
/* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */
{ 0x00000000f55cf1ca, 0x000000001fb3084a },
/* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */
{ 0x00000001a0531540, 0x00000000c53dfb04 },
/* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */
{ 0x0000000132cd7ebc, 0x00000000e10c9ad6 },
/* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */
{ 0x0000000073ab7f36, 0x0000000025aa994a },
/* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */
{ 0x0000000041aed1c2, 0x00000000fa3a74c4 },
/* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */
{ 0x0000000136c53800, 0x0000000033eb3f40 },
/* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */
{ 0x0000000126835a30, 0x000000017193f296 },
/* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */
{ 0x000000006241b502, 0x0000000043f6c86a },
/* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */
{ 0x00000000d5196ad4, 0x000000016b513ec6 },
/* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */
{ 0x000000009cfa769a, 0x00000000c8f25b4e },
/* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */
{ 0x00000000920e5df4, 0x00000001a45048ec },
/* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */
{ 0x0000000169dc310e, 0x000000000c441004 },
/* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */
{ 0x0000000009fc331c, 0x000000000e17cad6 },
/* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */
{ 0x000000010d94a81e, 0x00000001253ae964 },
/* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */
{ 0x0000000027a20ab2, 0x00000001d7c88ebc },
/* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */
{ 0x0000000114f87504, 0x00000001e7ca913a },
/* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */
{ 0x000000004b076d96, 0x0000000033ed078a },
/* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */
{ 0x00000000da4d1e74, 0x00000000e1839c78 },
/* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */
{ 0x000000001b81f672, 0x00000001322b267e },
/* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */
{ 0x000000009367c988, 0x00000000638231b6 },
/* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */
{ 0x00000001717214ca, 0x00000001ee7f16f4 },
/* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */
{ 0x000000009f47d820, 0x0000000117d9924a },
/* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */
{ 0x000000010d9a47d2, 0x00000000e1a9e0c4 },
/* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */
{ 0x00000000a696c58c, 0x00000001403731dc },
/* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */
{ 0x000000002aa28ec6, 0x00000001a5ea9682 },
/* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */
{ 0x00000001fe18fd9a, 0x0000000101c5c578 },
/* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */
{ 0x000000019d4fc1ae, 0x00000000dddf6494 },
/* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */
{ 0x00000001ba0e3dea, 0x00000000f1c3db28 },
/* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */
{ 0x0000000074b59a5e, 0x000000013112fb9c },
/* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */
{ 0x00000000f2b5ea98, 0x00000000b680b906 },
/* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */
{ 0x0000000187132676, 0x000000001a282932 },
/* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */
{ 0x000000010a8c6ad4, 0x0000000089406e7e },
/* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */
{ 0x00000001e21dfe70, 0x00000001def6be8c },
/* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */
{ 0x00000001da0050e4, 0x0000000075258728 },
/* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */
{ 0x00000000772172ae, 0x000000019536090a },
/* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */
{ 0x00000000e47724aa, 0x00000000f2455bfc },
/* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */
{ 0x000000003cd63ac4, 0x000000018c40baf4 },
/* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */
{ 0x00000001bf47d352, 0x000000004cd390d4 },
/* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */
{ 0x000000018dc1d708, 0x00000001e4ece95a },
/* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */
{ 0x000000002d4620a4, 0x000000001a3ee918 },
/* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */
{ 0x0000000058fd1740, 0x000000007c652fb8 },
/* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */
{ 0x00000000dadd9bfc, 0x000000011c67842c },
/* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */
{ 0x00000001ea2140be, 0x00000000254f759c },
/* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */
{ 0x000000009de128ba, 0x000000007ece94ca },
/* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */
{ 0x000000013ac3aa8e, 0x0000000038f258c2 },
/* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */
{ 0x0000000099980562, 0x00000001cdf17b00 },
/* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */
{ 0x00000001c1579c86, 0x000000011f882c16 },
/* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */
{ 0x0000000068dbbf94, 0x0000000100093fc8 },
/* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */
{ 0x000000004509fb04, 0x00000001cd684f16 },
/* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */
{ 0x00000001202f6398, 0x000000004bc6a70a },
/* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */
{ 0x000000013aea243e, 0x000000004fc7e8e4 },
/* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */
{ 0x00000001b4052ae6, 0x0000000130103f1c },
/* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */
{ 0x00000001cd2a0ae8, 0x0000000111b0024c },
/* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */
{ 0x00000001fe4aa8b4, 0x000000010b3079da },
/* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */
{ 0x00000001d1559a42, 0x000000010192bcc2 },
/* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */
{ 0x00000001f3e05ecc, 0x0000000074838d50 },
/* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */
{ 0x0000000104ddd2cc, 0x000000001b20f520 },
/* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */
{ 0x000000015393153c, 0x0000000050c3590a },
/* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */
{ 0x0000000057e942c6, 0x00000000b41cac8e },
/* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */
{ 0x000000012c633850, 0x000000000c72cc78 },
/* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */
{ 0x00000000ebcaae4c, 0x0000000030cdb032 },
/* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */
{ 0x000000013ee532a6, 0x000000013e09fc32 },
/* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */
{ 0x00000001bf0cbc7e, 0x000000001ed624d2 },
/* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */
{ 0x00000000d50b7a5a, 0x00000000781aee1a },
/* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */
{ 0x0000000002fca6e8, 0x00000001c4d8348c },
/* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */
{ 0x000000007af40044, 0x0000000057a40336 },
/* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */
{ 0x0000000016178744, 0x0000000085544940 },
/* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */
{ 0x000000014c177458, 0x000000019cd21e80 },
/* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */
{ 0x000000011b6ddf04, 0x000000013eb95bc0 },
/* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */
{ 0x00000001f3e29ccc, 0x00000001dfc9fdfc },
/* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */
{ 0x0000000135ae7562, 0x00000000cd028bc2 },
/* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */
{ 0x0000000190ef812c, 0x0000000090db8c44 },
/* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */
{ 0x0000000067a2c786, 0x000000010010a4ce },
/* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */
{ 0x0000000048b9496c, 0x00000001c8f4c72c },
/* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */
{ 0x000000015a422de6, 0x000000001c26170c },
/* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */
{ 0x00000001ef0e3640, 0x00000000e3fccf68 },
/* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */
{ 0x00000001006d2d26, 0x00000000d513ed24 },
/* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */
{ 0x00000001170d56d6, 0x00000000141beada },
/* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */
{ 0x00000000a5fb613c, 0x000000011071aea0 },
/* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */
{ 0x0000000040bbf7fc, 0x000000012e19080a },
/* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */
{ 0x000000016ac3a5b2, 0x0000000100ecf826 },
/* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */
{ 0x00000000abf16230, 0x0000000069b09412 },
/* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */
{ 0x00000001ebe23fac, 0x0000000122297bac },
/* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */
{ 0x000000008b6a0894, 0x00000000e9e4b068 },
/* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */
{ 0x00000001288ea478, 0x000000004b38651a },
/* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */
{ 0x000000016619c442, 0x00000001468360e2 },
/* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */
{ 0x0000000086230038, 0x00000000121c2408 },
/* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */
{ 0x000000017746a756, 0x00000000da7e7d08 },
/* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */
{ 0x0000000191b8f8f8, 0x00000001058d7652 },
/* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */
{ 0x000000008e167708, 0x000000014a098a90 },
/* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */
{ 0x0000000148b22d54, 0x0000000020dbe72e },
/* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */
{ 0x0000000044ba2c3c, 0x000000011e7323e8 },
/* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */
{ 0x00000000b54d2b52, 0x00000000d5d4bf94 },
/* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */
{ 0x0000000005a4fd8a, 0x0000000199d8746c },
/* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */
{ 0x0000000139f9fc46, 0x00000000ce9ca8a0 },
/* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */
{ 0x000000015a1fa824, 0x00000000136edece },
/* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */
{ 0x000000000a61ae4c, 0x000000019b92a068 },
/* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */
{ 0x0000000145e9113e, 0x0000000071d62206 },
/* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */
{ 0x000000006a348448, 0x00000000dfc50158 },
/* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */
{ 0x000000004d80a08c, 0x00000001517626bc },
/* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */
{ 0x000000014b6837a0, 0x0000000148d1e4fa },
/* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */
{ 0x000000016896a7fc, 0x0000000094d8266e },
/* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */
{ 0x000000014f187140, 0x00000000606c5e34 },
/* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */
{ 0x000000019581b9da, 0x000000019766beaa },
/* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */
{ 0x00000001091bc984, 0x00000001d80c506c },
/* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */
{ 0x000000001067223c, 0x000000001e73837c },
/* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */
{ 0x00000001ab16ea02, 0x0000000064d587de },
/* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */
{ 0x000000013c4598a8, 0x00000000f4a507b0 },
/* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */
{ 0x00000000b3735430, 0x0000000040e342fc },
/* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */
{ 0x00000001bb3fc0c0, 0x00000001d5ad9c3a },
/* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */
{ 0x00000001570ae19c, 0x0000000094a691a4 },
/* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */
{ 0x00000001ea910712, 0x00000001271ecdfa },
/* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */
{ 0x0000000167127128, 0x000000009e54475a },
/* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */
{ 0x0000000019e790a2, 0x00000000c9c099ee },
/* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */
{ 0x000000003788f710, 0x000000009a2f736c },
/* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */
{ 0x00000001682a160e, 0x00000000bb9f4996 },
/* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */
{ 0x000000007f0ebd2e, 0x00000001db688050 },
/* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */
{ 0x000000002b032080, 0x00000000e9b10af4 },
/* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */
{ 0x00000000cfd1664a, 0x000000012d4545e4 },
/* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */
{ 0x00000000aa1181c2, 0x000000000361139c },
/* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */
{ 0x00000000ddd08002, 0x00000001a5a1a3a8 },
/* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */
{ 0x00000000e8dd0446, 0x000000006844e0b0 },
/* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */
{ 0x00000001bbd94a00, 0x00000000c3762f28 },
/* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */
{ 0x00000000ab6cd180, 0x00000001d26287a2 },
/* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */
{ 0x0000000031803ce2, 0x00000001f6f0bba8 },
/* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */
{ 0x0000000024f40b0c, 0x000000002ffabd62 },
/* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */
{ 0x00000001ba1d9834, 0x00000000fb4516b8 },
/* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */
{ 0x0000000104de61aa, 0x000000018cfa961c },
/* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */
{ 0x0000000113e40d46, 0x000000019e588d52 },
/* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */
{ 0x00000001415598a0, 0x00000001180f0bbc },
/* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */
{ 0x00000000bf6c8c90, 0x00000000e1d9177a },
/* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */
{ 0x00000001788b0504, 0x0000000105abc27c },
/* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */
{ 0x0000000038385d02, 0x00000000972e4a58 },
/* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */
{ 0x00000001b6c83844, 0x0000000183499a5e },
/* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */
{ 0x0000000051061a8a, 0x00000001c96a8cca },
/* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */
{ 0x000000017351388a, 0x00000001a1a5b60c },
/* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */
{ 0x0000000132928f92, 0x00000000e4b6ac9c },
/* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */
{ 0x00000000e6b4f48a, 0x00000001807e7f5a },
/* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */
{ 0x0000000039d15e90, 0x000000017a7e3bc8 },
/* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */
{ 0x00000000312d6074, 0x00000000d73975da },
/* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */
{ 0x000000017bbb2cc4, 0x000000017375d038 },
/* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */
{ 0x000000016ded3e18, 0x00000000193680bc },
/* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */
{ 0x00000000f1638b16, 0x00000000999b06f6 },
/* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */
{ 0x00000001d38b9ecc, 0x00000001f685d2b8 },
/* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */
{ 0x000000018b8d09dc, 0x00000001f4ecbed2 },
/* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */
{ 0x00000000e7bc27d2, 0x00000000ba16f1a0 },
/* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */
{ 0x00000000275e1e96, 0x0000000115aceac4 },
/* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */
{ 0x00000000e2e3031e, 0x00000001aeff6292 },
/* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */
{ 0x00000001041c84d8, 0x000000009640124c },
/* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */
{ 0x00000000706ce672, 0x0000000114f41f02 },
/* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */
{ 0x000000015d5070da, 0x000000009c5f3586 },
/* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */
{ 0x0000000038f9493a, 0x00000001878275fa },
/* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */
{ 0x00000000a3348a76, 0x00000000ddc42ce8 },
/* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */
{ 0x00000001ad0aab92, 0x0000000181d2c73a },
/* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */
{ 0x000000019e85f712, 0x0000000141c9320a },
/* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */
{ 0x000000005a871e76, 0x000000015235719a },
/* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */
{ 0x000000017249c662, 0x00000000be27d804 },
/* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */
{ 0x000000003a084712, 0x000000006242d45a },
/* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */
{ 0x00000000ed438478, 0x000000009a53638e },
/* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */
{ 0x00000000abac34cc, 0x00000001001ecfb6 },
/* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */
{ 0x000000005f35ef3e, 0x000000016d7c2d64 },
/* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */
{ 0x0000000047d6608c, 0x00000001d0ce46c0 },
/* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */
{ 0x000000002d01470e, 0x0000000124c907b4 },
/* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */
{ 0x0000000158bbc7b0, 0x0000000018a555ca },
/* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */
{ 0x00000000c0a23e8e, 0x000000006b0980bc },
/* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */
{ 0x00000001ebd85c88, 0x000000008bbba964 },
/* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */
{ 0x000000019ee20bb2, 0x00000001070a5a1e },
/* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */
{ 0x00000001acabf2d6, 0x000000002204322a },
/* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */
{ 0x00000001b7963d56, 0x00000000a27524d0 },
/* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */
{ 0x000000017bffa1fe, 0x0000000020b1e4ba },
/* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */
{ 0x000000001f15333e, 0x0000000032cc27fc },
/* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */
{ 0x000000018593129e, 0x0000000044dd22b8 },
/* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */
{ 0x000000019cb32602, 0x00000000dffc9e0a },
/* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */
{ 0x0000000142b05cc8, 0x00000001b7a0ed14 },
/* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */
{ 0x00000001be49e7a4, 0x00000000c7842488 },
/* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */
{ 0x0000000108f69d6c, 0x00000001c02a4fee },
/* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */
{ 0x000000006c0971f0, 0x000000003c273778 },
/* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */
{ 0x000000005b16467a, 0x00000001d63f8894 },
/* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */
{ 0x00000001551a628e, 0x000000006be557d6 },
/* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */
{ 0x000000019e42ea92, 0x000000006a7806ea },
/* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */
{ 0x000000012fa83ff2, 0x000000016155aa0c },
/* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */
{ 0x000000011ca9cde0, 0x00000000908650ac },
/* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */
{ 0x00000000c8e5cd74, 0x00000000aa5a8084 },
/* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */
{ 0x0000000096c27f0c, 0x0000000191bb500a },
/* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */
{ 0x000000002baed926, 0x0000000064e9bed0 },
/* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */
{ 0x000000017c8de8d2, 0x000000009444f302 },
/* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */
{ 0x00000000d43d6068, 0x000000019db07d3c },
/* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */
{ 0x00000000cb2c4b26, 0x00000001359e3e6e },
/* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */
{ 0x0000000145b8da26, 0x00000001e4f10dd2 },
/* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */
{ 0x000000018fff4b08, 0x0000000124f5735e },
/* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */
{ 0x0000000150b58ed0, 0x0000000124760a4c },
/* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */
{ 0x00000001549f39bc, 0x000000000f1fc186 },
/* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */
{ 0x00000000ef4d2f42, 0x00000000150e4cc4 },
/* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */
{ 0x00000001b1468572, 0x000000002a6204e8 },
/* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */
{ 0x000000013d7403b2, 0x00000000beb1d432 },
/* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */
{ 0x00000001a4681842, 0x0000000135f3f1f0 },
/* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */
{ 0x0000000167714492, 0x0000000074fe2232 },
/* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */
{ 0x00000001e599099a, 0x000000001ac6e2ba },
/* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */
{ 0x00000000fe128194, 0x0000000013fca91e },
/* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */
{ 0x0000000077e8b990, 0x0000000183f4931e },
/* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */
{ 0x00000001a267f63a, 0x00000000b6d9b4e4 },
/* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */
{ 0x00000001945c245a, 0x00000000b5188656 },
/* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */
{ 0x0000000149002e76, 0x0000000027a81a84 },
/* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */
{ 0x00000001bb8310a4, 0x0000000125699258 },
/* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */
{ 0x000000019ec60bcc, 0x00000001b23de796 },
/* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */
{ 0x000000012d8590ae, 0x00000000fe4365dc },
/* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */
{ 0x0000000065b00684, 0x00000000c68f497a },
/* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */
{ 0x000000015e5aeadc, 0x00000000fbf521ee },
/* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */
{ 0x00000000b77ff2b0, 0x000000015eac3378 },
/* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */
{ 0x0000000188da2ff6, 0x0000000134914b90 },
/* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */
{ 0x0000000063da929a, 0x0000000016335cfe },
/* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */
{ 0x00000001389caa80, 0x000000010372d10c },
/* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */
{ 0x000000013db599d2, 0x000000015097b908 },
/* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */
{ 0x0000000122505a86, 0x00000001227a7572 },
/* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */
{ 0x000000016bd72746, 0x000000009a8f75c0 },
/* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */
{ 0x00000001c3faf1d4, 0x00000000682c77a2 },
/* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */
{ 0x00000001111c826c, 0x00000000231f091c },
/* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */
{ 0x00000000153e9fb2, 0x000000007d4439f2 },
/* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */
{ 0x000000002b1f7b60, 0x000000017e221efc },
/* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */
{ 0x00000000b1dba570, 0x0000000167457c38 },
/* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */
{ 0x00000001f6397b76, 0x00000000bdf081c4 },
/* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */
{ 0x0000000156335214, 0x000000016286d6b0 },
/* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */
{ 0x00000001d70e3986, 0x00000000c84f001c },
/* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */
{ 0x000000003701a774, 0x0000000064efe7c0 },
/* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */
{ 0x00000000ac81ef72, 0x000000000ac2d904 },
/* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */
{ 0x0000000133212464, 0x00000000fd226d14 },
/* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */
{ 0x00000000e4e45610, 0x000000011cfd42e0 },
/* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */
{ 0x000000000c1bd370, 0x000000016e5a5678 },
/* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */
{ 0x00000001a7b9e7a6, 0x00000001d888fe22 },
/* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */
{ 0x000000007d657a10, 0x00000001af77fcd4 }
#else /* BYTE_ORDER == LITTLE_ENDIAN */
/* x^261120 mod p(x)` << 1, x^261184 mod p(x)` << 1 */
{ 0x00000001651797d2, 0x0000000099ea94a8 },
/* x^260096 mod p(x)` << 1, x^260160 mod p(x)` << 1 */
{ 0x0000000021e0d56c, 0x00000000945a8420 },
/* x^259072 mod p(x)` << 1, x^259136 mod p(x)` << 1 */
{ 0x000000000f95ecaa, 0x0000000030762706 },
/* x^258048 mod p(x)` << 1, x^258112 mod p(x)` << 1 */
{ 0x00000001ebd224ac, 0x00000001a52fc582 },
/* x^257024 mod p(x)` << 1, x^257088 mod p(x)` << 1 */
{ 0x000000000ccb97ca, 0x00000001a4a7167a },
/* x^256000 mod p(x)` << 1, x^256064 mod p(x)` << 1 */
{ 0x00000001006ec8a8, 0x000000000c18249a },
/* x^254976 mod p(x)` << 1, x^255040 mod p(x)` << 1 */
{ 0x000000014f58f196, 0x00000000a924ae7c },
/* x^253952 mod p(x)` << 1, x^254016 mod p(x)` << 1 */
{ 0x00000001a7192ca6, 0x00000001e12ccc12 },
/* x^252928 mod p(x)` << 1, x^252992 mod p(x)` << 1 */
{ 0x000000019a64bab2, 0x00000000a0b9d4ac },
/* x^251904 mod p(x)` << 1, x^251968 mod p(x)` << 1 */
{ 0x0000000014f4ed2e, 0x0000000095e8ddfe },
/* x^250880 mod p(x)` << 1, x^250944 mod p(x)` << 1 */
{ 0x000000011092b6a2, 0x00000000233fddc4 },
/* x^249856 mod p(x)` << 1, x^249920 mod p(x)` << 1 */
{ 0x00000000c8a1629c, 0x00000001b4529b62 },
/* x^248832 mod p(x)` << 1, x^248896 mod p(x)` << 1 */
{ 0x000000017bf32e8e, 0x00000001a7fa0e64 },
/* x^247808 mod p(x)` << 1, x^247872 mod p(x)` << 1 */
{ 0x00000001f8cc6582, 0x00000001b5334592 },
/* x^246784 mod p(x)` << 1, x^246848 mod p(x)` << 1 */
{ 0x000000008631ddf0, 0x000000011f8ee1b4 },
/* x^245760 mod p(x)` << 1, x^245824 mod p(x)` << 1 */
{ 0x000000007e5a76d0, 0x000000006252e632 },
/* x^244736 mod p(x)` << 1, x^244800 mod p(x)` << 1 */
{ 0x000000002b09b31c, 0x00000000ab973e84 },
/* x^243712 mod p(x)` << 1, x^243776 mod p(x)` << 1 */
{ 0x00000001b2df1f84, 0x000000007734f5ec },
/* x^242688 mod p(x)` << 1, x^242752 mod p(x)` << 1 */
{ 0x00000001d6f56afc, 0x000000007c547798 },
/* x^241664 mod p(x)` << 1, x^241728 mod p(x)` << 1 */
{ 0x00000001b9b5e70c, 0x000000007ec40210 },
/* x^240640 mod p(x)` << 1, x^240704 mod p(x)` << 1 */
{ 0x0000000034b626d2, 0x00000001ab1695a8 },
/* x^239616 mod p(x)` << 1, x^239680 mod p(x)` << 1 */
{ 0x000000014c53479a, 0x0000000090494bba },
/* x^238592 mod p(x)` << 1, x^238656 mod p(x)` << 1 */
{ 0x00000001a6d179a4, 0x00000001123fb816 },
/* x^237568 mod p(x)` << 1, x^237632 mod p(x)` << 1 */
{ 0x000000015abd16b4, 0x00000001e188c74c },
/* x^236544 mod p(x)` << 1, x^236608 mod p(x)` << 1 */
{ 0x00000000018f9852, 0x00000001c2d3451c },
/* x^235520 mod p(x)` << 1, x^235584 mod p(x)` << 1 */
{ 0x000000001fb3084a, 0x00000000f55cf1ca },
/* x^234496 mod p(x)` << 1, x^234560 mod p(x)` << 1 */
{ 0x00000000c53dfb04, 0x00000001a0531540 },
/* x^233472 mod p(x)` << 1, x^233536 mod p(x)` << 1 */
{ 0x00000000e10c9ad6, 0x0000000132cd7ebc },
/* x^232448 mod p(x)` << 1, x^232512 mod p(x)` << 1 */
{ 0x0000000025aa994a, 0x0000000073ab7f36 },
/* x^231424 mod p(x)` << 1, x^231488 mod p(x)` << 1 */
{ 0x00000000fa3a74c4, 0x0000000041aed1c2 },
/* x^230400 mod p(x)` << 1, x^230464 mod p(x)` << 1 */
{ 0x0000000033eb3f40, 0x0000000136c53800 },
/* x^229376 mod p(x)` << 1, x^229440 mod p(x)` << 1 */
{ 0x000000017193f296, 0x0000000126835a30 },
/* x^228352 mod p(x)` << 1, x^228416 mod p(x)` << 1 */
{ 0x0000000043f6c86a, 0x000000006241b502 },
/* x^227328 mod p(x)` << 1, x^227392 mod p(x)` << 1 */
{ 0x000000016b513ec6, 0x00000000d5196ad4 },
/* x^226304 mod p(x)` << 1, x^226368 mod p(x)` << 1 */
{ 0x00000000c8f25b4e, 0x000000009cfa769a },
/* x^225280 mod p(x)` << 1, x^225344 mod p(x)` << 1 */
{ 0x00000001a45048ec, 0x00000000920e5df4 },
/* x^224256 mod p(x)` << 1, x^224320 mod p(x)` << 1 */
{ 0x000000000c441004, 0x0000000169dc310e },
/* x^223232 mod p(x)` << 1, x^223296 mod p(x)` << 1 */
{ 0x000000000e17cad6, 0x0000000009fc331c },
/* x^222208 mod p(x)` << 1, x^222272 mod p(x)` << 1 */
{ 0x00000001253ae964, 0x000000010d94a81e },
/* x^221184 mod p(x)` << 1, x^221248 mod p(x)` << 1 */
{ 0x00000001d7c88ebc, 0x0000000027a20ab2 },
/* x^220160 mod p(x)` << 1, x^220224 mod p(x)` << 1 */
{ 0x00000001e7ca913a, 0x0000000114f87504 },
/* x^219136 mod p(x)` << 1, x^219200 mod p(x)` << 1 */
{ 0x0000000033ed078a, 0x000000004b076d96 },
/* x^218112 mod p(x)` << 1, x^218176 mod p(x)` << 1 */
{ 0x00000000e1839c78, 0x00000000da4d1e74 },
/* x^217088 mod p(x)` << 1, x^217152 mod p(x)` << 1 */
{ 0x00000001322b267e, 0x000000001b81f672 },
/* x^216064 mod p(x)` << 1, x^216128 mod p(x)` << 1 */
{ 0x00000000638231b6, 0x000000009367c988 },
/* x^215040 mod p(x)` << 1, x^215104 mod p(x)` << 1 */
{ 0x00000001ee7f16f4, 0x00000001717214ca },
/* x^214016 mod p(x)` << 1, x^214080 mod p(x)` << 1 */
{ 0x0000000117d9924a, 0x000000009f47d820 },
/* x^212992 mod p(x)` << 1, x^213056 mod p(x)` << 1 */
{ 0x00000000e1a9e0c4, 0x000000010d9a47d2 },
/* x^211968 mod p(x)` << 1, x^212032 mod p(x)` << 1 */
{ 0x00000001403731dc, 0x00000000a696c58c },
/* x^210944 mod p(x)` << 1, x^211008 mod p(x)` << 1 */
{ 0x00000001a5ea9682, 0x000000002aa28ec6 },
/* x^209920 mod p(x)` << 1, x^209984 mod p(x)` << 1 */
{ 0x0000000101c5c578, 0x00000001fe18fd9a },
/* x^208896 mod p(x)` << 1, x^208960 mod p(x)` << 1 */
{ 0x00000000dddf6494, 0x000000019d4fc1ae },
/* x^207872 mod p(x)` << 1, x^207936 mod p(x)` << 1 */
{ 0x00000000f1c3db28, 0x00000001ba0e3dea },
/* x^206848 mod p(x)` << 1, x^206912 mod p(x)` << 1 */
{ 0x000000013112fb9c, 0x0000000074b59a5e },
/* x^205824 mod p(x)` << 1, x^205888 mod p(x)` << 1 */
{ 0x00000000b680b906, 0x00000000f2b5ea98 },
/* x^204800 mod p(x)` << 1, x^204864 mod p(x)` << 1 */
{ 0x000000001a282932, 0x0000000187132676 },
/* x^203776 mod p(x)` << 1, x^203840 mod p(x)` << 1 */
{ 0x0000000089406e7e, 0x000000010a8c6ad4 },
/* x^202752 mod p(x)` << 1, x^202816 mod p(x)` << 1 */
{ 0x00000001def6be8c, 0x00000001e21dfe70 },
/* x^201728 mod p(x)` << 1, x^201792 mod p(x)` << 1 */
{ 0x0000000075258728, 0x00000001da0050e4 },
/* x^200704 mod p(x)` << 1, x^200768 mod p(x)` << 1 */
{ 0x000000019536090a, 0x00000000772172ae },
/* x^199680 mod p(x)` << 1, x^199744 mod p(x)` << 1 */
{ 0x00000000f2455bfc, 0x00000000e47724aa },
/* x^198656 mod p(x)` << 1, x^198720 mod p(x)` << 1 */
{ 0x000000018c40baf4, 0x000000003cd63ac4 },
/* x^197632 mod p(x)` << 1, x^197696 mod p(x)` << 1 */
{ 0x000000004cd390d4, 0x00000001bf47d352 },
/* x^196608 mod p(x)` << 1, x^196672 mod p(x)` << 1 */
{ 0x00000001e4ece95a, 0x000000018dc1d708 },
/* x^195584 mod p(x)` << 1, x^195648 mod p(x)` << 1 */
{ 0x000000001a3ee918, 0x000000002d4620a4 },
/* x^194560 mod p(x)` << 1, x^194624 mod p(x)` << 1 */
{ 0x000000007c652fb8, 0x0000000058fd1740 },
/* x^193536 mod p(x)` << 1, x^193600 mod p(x)` << 1 */
{ 0x000000011c67842c, 0x00000000dadd9bfc },
/* x^192512 mod p(x)` << 1, x^192576 mod p(x)` << 1 */
{ 0x00000000254f759c, 0x00000001ea2140be },
/* x^191488 mod p(x)` << 1, x^191552 mod p(x)` << 1 */
{ 0x000000007ece94ca, 0x000000009de128ba },
/* x^190464 mod p(x)` << 1, x^190528 mod p(x)` << 1 */
{ 0x0000000038f258c2, 0x000000013ac3aa8e },
/* x^189440 mod p(x)` << 1, x^189504 mod p(x)` << 1 */
{ 0x00000001cdf17b00, 0x0000000099980562 },
/* x^188416 mod p(x)` << 1, x^188480 mod p(x)` << 1 */
{ 0x000000011f882c16, 0x00000001c1579c86 },
/* x^187392 mod p(x)` << 1, x^187456 mod p(x)` << 1 */
{ 0x0000000100093fc8, 0x0000000068dbbf94 },
/* x^186368 mod p(x)` << 1, x^186432 mod p(x)` << 1 */
{ 0x00000001cd684f16, 0x000000004509fb04 },
/* x^185344 mod p(x)` << 1, x^185408 mod p(x)` << 1 */
{ 0x000000004bc6a70a, 0x00000001202f6398 },
/* x^184320 mod p(x)` << 1, x^184384 mod p(x)` << 1 */
{ 0x000000004fc7e8e4, 0x000000013aea243e },
/* x^183296 mod p(x)` << 1, x^183360 mod p(x)` << 1 */
{ 0x0000000130103f1c, 0x00000001b4052ae6 },
/* x^182272 mod p(x)` << 1, x^182336 mod p(x)` << 1 */
{ 0x0000000111b0024c, 0x00000001cd2a0ae8 },
/* x^181248 mod p(x)` << 1, x^181312 mod p(x)` << 1 */
{ 0x000000010b3079da, 0x00000001fe4aa8b4 },
/* x^180224 mod p(x)` << 1, x^180288 mod p(x)` << 1 */
{ 0x000000010192bcc2, 0x00000001d1559a42 },
/* x^179200 mod p(x)` << 1, x^179264 mod p(x)` << 1 */
{ 0x0000000074838d50, 0x00000001f3e05ecc },
/* x^178176 mod p(x)` << 1, x^178240 mod p(x)` << 1 */
{ 0x000000001b20f520, 0x0000000104ddd2cc },
/* x^177152 mod p(x)` << 1, x^177216 mod p(x)` << 1 */
{ 0x0000000050c3590a, 0x000000015393153c },
/* x^176128 mod p(x)` << 1, x^176192 mod p(x)` << 1 */
{ 0x00000000b41cac8e, 0x0000000057e942c6 },
/* x^175104 mod p(x)` << 1, x^175168 mod p(x)` << 1 */
{ 0x000000000c72cc78, 0x000000012c633850 },
/* x^174080 mod p(x)` << 1, x^174144 mod p(x)` << 1 */
{ 0x0000000030cdb032, 0x00000000ebcaae4c },
/* x^173056 mod p(x)` << 1, x^173120 mod p(x)` << 1 */
{ 0x000000013e09fc32, 0x000000013ee532a6 },
/* x^172032 mod p(x)` << 1, x^172096 mod p(x)` << 1 */
{ 0x000000001ed624d2, 0x00000001bf0cbc7e },
/* x^171008 mod p(x)` << 1, x^171072 mod p(x)` << 1 */
{ 0x00000000781aee1a, 0x00000000d50b7a5a },
/* x^169984 mod p(x)` << 1, x^170048 mod p(x)` << 1 */
{ 0x00000001c4d8348c, 0x0000000002fca6e8 },
/* x^168960 mod p(x)` << 1, x^169024 mod p(x)` << 1 */
{ 0x0000000057a40336, 0x000000007af40044 },
/* x^167936 mod p(x)` << 1, x^168000 mod p(x)` << 1 */
{ 0x0000000085544940, 0x0000000016178744 },
/* x^166912 mod p(x)` << 1, x^166976 mod p(x)` << 1 */
{ 0x000000019cd21e80, 0x000000014c177458 },
/* x^165888 mod p(x)` << 1, x^165952 mod p(x)` << 1 */
{ 0x000000013eb95bc0, 0x000000011b6ddf04 },
/* x^164864 mod p(x)` << 1, x^164928 mod p(x)` << 1 */
{ 0x00000001dfc9fdfc, 0x00000001f3e29ccc },
/* x^163840 mod p(x)` << 1, x^163904 mod p(x)` << 1 */
{ 0x00000000cd028bc2, 0x0000000135ae7562 },
/* x^162816 mod p(x)` << 1, x^162880 mod p(x)` << 1 */
{ 0x0000000090db8c44, 0x0000000190ef812c },
/* x^161792 mod p(x)` << 1, x^161856 mod p(x)` << 1 */
{ 0x000000010010a4ce, 0x0000000067a2c786 },
/* x^160768 mod p(x)` << 1, x^160832 mod p(x)` << 1 */
{ 0x00000001c8f4c72c, 0x0000000048b9496c },
/* x^159744 mod p(x)` << 1, x^159808 mod p(x)` << 1 */
{ 0x000000001c26170c, 0x000000015a422de6 },
/* x^158720 mod p(x)` << 1, x^158784 mod p(x)` << 1 */
{ 0x00000000e3fccf68, 0x00000001ef0e3640 },
/* x^157696 mod p(x)` << 1, x^157760 mod p(x)` << 1 */
{ 0x00000000d513ed24, 0x00000001006d2d26 },
/* x^156672 mod p(x)` << 1, x^156736 mod p(x)` << 1 */
{ 0x00000000141beada, 0x00000001170d56d6 },
/* x^155648 mod p(x)` << 1, x^155712 mod p(x)` << 1 */
{ 0x000000011071aea0, 0x00000000a5fb613c },
/* x^154624 mod p(x)` << 1, x^154688 mod p(x)` << 1 */
{ 0x000000012e19080a, 0x0000000040bbf7fc },
/* x^153600 mod p(x)` << 1, x^153664 mod p(x)` << 1 */
{ 0x0000000100ecf826, 0x000000016ac3a5b2 },
/* x^152576 mod p(x)` << 1, x^152640 mod p(x)` << 1 */
{ 0x0000000069b09412, 0x00000000abf16230 },
/* x^151552 mod p(x)` << 1, x^151616 mod p(x)` << 1 */
{ 0x0000000122297bac, 0x00000001ebe23fac },
/* x^150528 mod p(x)` << 1, x^150592 mod p(x)` << 1 */
{ 0x00000000e9e4b068, 0x000000008b6a0894 },
/* x^149504 mod p(x)` << 1, x^149568 mod p(x)` << 1 */
{ 0x000000004b38651a, 0x00000001288ea478 },
/* x^148480 mod p(x)` << 1, x^148544 mod p(x)` << 1 */
{ 0x00000001468360e2, 0x000000016619c442 },
/* x^147456 mod p(x)` << 1, x^147520 mod p(x)` << 1 */
{ 0x00000000121c2408, 0x0000000086230038 },
/* x^146432 mod p(x)` << 1, x^146496 mod p(x)` << 1 */
{ 0x00000000da7e7d08, 0x000000017746a756 },
/* x^145408 mod p(x)` << 1, x^145472 mod p(x)` << 1 */
{ 0x00000001058d7652, 0x0000000191b8f8f8 },
/* x^144384 mod p(x)` << 1, x^144448 mod p(x)` << 1 */
{ 0x000000014a098a90, 0x000000008e167708 },
/* x^143360 mod p(x)` << 1, x^143424 mod p(x)` << 1 */
{ 0x0000000020dbe72e, 0x0000000148b22d54 },
/* x^142336 mod p(x)` << 1, x^142400 mod p(x)` << 1 */
{ 0x000000011e7323e8, 0x0000000044ba2c3c },
/* x^141312 mod p(x)` << 1, x^141376 mod p(x)` << 1 */
{ 0x00000000d5d4bf94, 0x00000000b54d2b52 },
/* x^140288 mod p(x)` << 1, x^140352 mod p(x)` << 1 */
{ 0x0000000199d8746c, 0x0000000005a4fd8a },
/* x^139264 mod p(x)` << 1, x^139328 mod p(x)` << 1 */
{ 0x00000000ce9ca8a0, 0x0000000139f9fc46 },
/* x^138240 mod p(x)` << 1, x^138304 mod p(x)` << 1 */
{ 0x00000000136edece, 0x000000015a1fa824 },
/* x^137216 mod p(x)` << 1, x^137280 mod p(x)` << 1 */
{ 0x000000019b92a068, 0x000000000a61ae4c },
/* x^136192 mod p(x)` << 1, x^136256 mod p(x)` << 1 */
{ 0x0000000071d62206, 0x0000000145e9113e },
/* x^135168 mod p(x)` << 1, x^135232 mod p(x)` << 1 */
{ 0x00000000dfc50158, 0x000000006a348448 },
/* x^134144 mod p(x)` << 1, x^134208 mod p(x)` << 1 */
{ 0x00000001517626bc, 0x000000004d80a08c },
/* x^133120 mod p(x)` << 1, x^133184 mod p(x)` << 1 */
{ 0x0000000148d1e4fa, 0x000000014b6837a0 },
/* x^132096 mod p(x)` << 1, x^132160 mod p(x)` << 1 */
{ 0x0000000094d8266e, 0x000000016896a7fc },
/* x^131072 mod p(x)` << 1, x^131136 mod p(x)` << 1 */
{ 0x00000000606c5e34, 0x000000014f187140 },
/* x^130048 mod p(x)` << 1, x^130112 mod p(x)` << 1 */
{ 0x000000019766beaa, 0x000000019581b9da },
/* x^129024 mod p(x)` << 1, x^129088 mod p(x)` << 1 */
{ 0x00000001d80c506c, 0x00000001091bc984 },
/* x^128000 mod p(x)` << 1, x^128064 mod p(x)` << 1 */
{ 0x000000001e73837c, 0x000000001067223c },
/* x^126976 mod p(x)` << 1, x^127040 mod p(x)` << 1 */
{ 0x0000000064d587de, 0x00000001ab16ea02 },
/* x^125952 mod p(x)` << 1, x^126016 mod p(x)` << 1 */
{ 0x00000000f4a507b0, 0x000000013c4598a8 },
/* x^124928 mod p(x)` << 1, x^124992 mod p(x)` << 1 */
{ 0x0000000040e342fc, 0x00000000b3735430 },
/* x^123904 mod p(x)` << 1, x^123968 mod p(x)` << 1 */
{ 0x00000001d5ad9c3a, 0x00000001bb3fc0c0 },
/* x^122880 mod p(x)` << 1, x^122944 mod p(x)` << 1 */
{ 0x0000000094a691a4, 0x00000001570ae19c },
/* x^121856 mod p(x)` << 1, x^121920 mod p(x)` << 1 */
{ 0x00000001271ecdfa, 0x00000001ea910712 },
/* x^120832 mod p(x)` << 1, x^120896 mod p(x)` << 1 */
{ 0x000000009e54475a, 0x0000000167127128 },
/* x^119808 mod p(x)` << 1, x^119872 mod p(x)` << 1 */
{ 0x00000000c9c099ee, 0x0000000019e790a2 },
/* x^118784 mod p(x)` << 1, x^118848 mod p(x)` << 1 */
{ 0x000000009a2f736c, 0x000000003788f710 },
/* x^117760 mod p(x)` << 1, x^117824 mod p(x)` << 1 */
{ 0x00000000bb9f4996, 0x00000001682a160e },
/* x^116736 mod p(x)` << 1, x^116800 mod p(x)` << 1 */
{ 0x00000001db688050, 0x000000007f0ebd2e },
/* x^115712 mod p(x)` << 1, x^115776 mod p(x)` << 1 */
{ 0x00000000e9b10af4, 0x000000002b032080 },
/* x^114688 mod p(x)` << 1, x^114752 mod p(x)` << 1 */
{ 0x000000012d4545e4, 0x00000000cfd1664a },
/* x^113664 mod p(x)` << 1, x^113728 mod p(x)` << 1 */
{ 0x000000000361139c, 0x00000000aa1181c2 },
/* x^112640 mod p(x)` << 1, x^112704 mod p(x)` << 1 */
{ 0x00000001a5a1a3a8, 0x00000000ddd08002 },
/* x^111616 mod p(x)` << 1, x^111680 mod p(x)` << 1 */
{ 0x000000006844e0b0, 0x00000000e8dd0446 },
/* x^110592 mod p(x)` << 1, x^110656 mod p(x)` << 1 */
{ 0x00000000c3762f28, 0x00000001bbd94a00 },
/* x^109568 mod p(x)` << 1, x^109632 mod p(x)` << 1 */
{ 0x00000001d26287a2, 0x00000000ab6cd180 },
/* x^108544 mod p(x)` << 1, x^108608 mod p(x)` << 1 */
{ 0x00000001f6f0bba8, 0x0000000031803ce2 },
/* x^107520 mod p(x)` << 1, x^107584 mod p(x)` << 1 */
{ 0x000000002ffabd62, 0x0000000024f40b0c },
/* x^106496 mod p(x)` << 1, x^106560 mod p(x)` << 1 */
{ 0x00000000fb4516b8, 0x00000001ba1d9834 },
/* x^105472 mod p(x)` << 1, x^105536 mod p(x)` << 1 */
{ 0x000000018cfa961c, 0x0000000104de61aa },
/* x^104448 mod p(x)` << 1, x^104512 mod p(x)` << 1 */
{ 0x000000019e588d52, 0x0000000113e40d46 },
/* x^103424 mod p(x)` << 1, x^103488 mod p(x)` << 1 */
{ 0x00000001180f0bbc, 0x00000001415598a0 },
/* x^102400 mod p(x)` << 1, x^102464 mod p(x)` << 1 */
{ 0x00000000e1d9177a, 0x00000000bf6c8c90 },
/* x^101376 mod p(x)` << 1, x^101440 mod p(x)` << 1 */
{ 0x0000000105abc27c, 0x00000001788b0504 },
/* x^100352 mod p(x)` << 1, x^100416 mod p(x)` << 1 */
{ 0x00000000972e4a58, 0x0000000038385d02 },
/* x^99328 mod p(x)` << 1, x^99392 mod p(x)` << 1 */
{ 0x0000000183499a5e, 0x00000001b6c83844 },
/* x^98304 mod p(x)` << 1, x^98368 mod p(x)` << 1 */
{ 0x00000001c96a8cca, 0x0000000051061a8a },
/* x^97280 mod p(x)` << 1, x^97344 mod p(x)` << 1 */
{ 0x00000001a1a5b60c, 0x000000017351388a },
/* x^96256 mod p(x)` << 1, x^96320 mod p(x)` << 1 */
{ 0x00000000e4b6ac9c, 0x0000000132928f92 },
/* x^95232 mod p(x)` << 1, x^95296 mod p(x)` << 1 */
{ 0x00000001807e7f5a, 0x00000000e6b4f48a },
/* x^94208 mod p(x)` << 1, x^94272 mod p(x)` << 1 */
{ 0x000000017a7e3bc8, 0x0000000039d15e90 },
/* x^93184 mod p(x)` << 1, x^93248 mod p(x)` << 1 */
{ 0x00000000d73975da, 0x00000000312d6074 },
/* x^92160 mod p(x)` << 1, x^92224 mod p(x)` << 1 */
{ 0x000000017375d038, 0x000000017bbb2cc4 },
/* x^91136 mod p(x)` << 1, x^91200 mod p(x)` << 1 */
{ 0x00000000193680bc, 0x000000016ded3e18 },
/* x^90112 mod p(x)` << 1, x^90176 mod p(x)` << 1 */
{ 0x00000000999b06f6, 0x00000000f1638b16 },
/* x^89088 mod p(x)` << 1, x^89152 mod p(x)` << 1 */
{ 0x00000001f685d2b8, 0x00000001d38b9ecc },
/* x^88064 mod p(x)` << 1, x^88128 mod p(x)` << 1 */
{ 0x00000001f4ecbed2, 0x000000018b8d09dc },
/* x^87040 mod p(x)` << 1, x^87104 mod p(x)` << 1 */
{ 0x00000000ba16f1a0, 0x00000000e7bc27d2 },
/* x^86016 mod p(x)` << 1, x^86080 mod p(x)` << 1 */
{ 0x0000000115aceac4, 0x00000000275e1e96 },
/* x^84992 mod p(x)` << 1, x^85056 mod p(x)` << 1 */
{ 0x00000001aeff6292, 0x00000000e2e3031e },
/* x^83968 mod p(x)` << 1, x^84032 mod p(x)` << 1 */
{ 0x000000009640124c, 0x00000001041c84d8 },
/* x^82944 mod p(x)` << 1, x^83008 mod p(x)` << 1 */
{ 0x0000000114f41f02, 0x00000000706ce672 },
/* x^81920 mod p(x)` << 1, x^81984 mod p(x)` << 1 */
{ 0x000000009c5f3586, 0x000000015d5070da },
/* x^80896 mod p(x)` << 1, x^80960 mod p(x)` << 1 */
{ 0x00000001878275fa, 0x0000000038f9493a },
/* x^79872 mod p(x)` << 1, x^79936 mod p(x)` << 1 */
{ 0x00000000ddc42ce8, 0x00000000a3348a76 },
/* x^78848 mod p(x)` << 1, x^78912 mod p(x)` << 1 */
{ 0x0000000181d2c73a, 0x00000001ad0aab92 },
/* x^77824 mod p(x)` << 1, x^77888 mod p(x)` << 1 */
{ 0x0000000141c9320a, 0x000000019e85f712 },
/* x^76800 mod p(x)` << 1, x^76864 mod p(x)` << 1 */
{ 0x000000015235719a, 0x000000005a871e76 },
/* x^75776 mod p(x)` << 1, x^75840 mod p(x)` << 1 */
{ 0x00000000be27d804, 0x000000017249c662 },
/* x^74752 mod p(x)` << 1, x^74816 mod p(x)` << 1 */
{ 0x000000006242d45a, 0x000000003a084712 },
/* x^73728 mod p(x)` << 1, x^73792 mod p(x)` << 1 */
{ 0x000000009a53638e, 0x00000000ed438478 },
/* x^72704 mod p(x)` << 1, x^72768 mod p(x)` << 1 */
{ 0x00000001001ecfb6, 0x00000000abac34cc },
/* x^71680 mod p(x)` << 1, x^71744 mod p(x)` << 1 */
{ 0x000000016d7c2d64, 0x000000005f35ef3e },
/* x^70656 mod p(x)` << 1, x^70720 mod p(x)` << 1 */
{ 0x00000001d0ce46c0, 0x0000000047d6608c },
/* x^69632 mod p(x)` << 1, x^69696 mod p(x)` << 1 */
{ 0x0000000124c907b4, 0x000000002d01470e },
/* x^68608 mod p(x)` << 1, x^68672 mod p(x)` << 1 */
{ 0x0000000018a555ca, 0x0000000158bbc7b0 },
/* x^67584 mod p(x)` << 1, x^67648 mod p(x)` << 1 */
{ 0x000000006b0980bc, 0x00000000c0a23e8e },
/* x^66560 mod p(x)` << 1, x^66624 mod p(x)` << 1 */
{ 0x000000008bbba964, 0x00000001ebd85c88 },
/* x^65536 mod p(x)` << 1, x^65600 mod p(x)` << 1 */
{ 0x00000001070a5a1e, 0x000000019ee20bb2 },
/* x^64512 mod p(x)` << 1, x^64576 mod p(x)` << 1 */
{ 0x000000002204322a, 0x00000001acabf2d6 },
/* x^63488 mod p(x)` << 1, x^63552 mod p(x)` << 1 */
{ 0x00000000a27524d0, 0x00000001b7963d56 },
/* x^62464 mod p(x)` << 1, x^62528 mod p(x)` << 1 */
{ 0x0000000020b1e4ba, 0x000000017bffa1fe },
/* x^61440 mod p(x)` << 1, x^61504 mod p(x)` << 1 */
{ 0x0000000032cc27fc, 0x000000001f15333e },
/* x^60416 mod p(x)` << 1, x^60480 mod p(x)` << 1 */
{ 0x0000000044dd22b8, 0x000000018593129e },
/* x^59392 mod p(x)` << 1, x^59456 mod p(x)` << 1 */
{ 0x00000000dffc9e0a, 0x000000019cb32602 },
/* x^58368 mod p(x)` << 1, x^58432 mod p(x)` << 1 */
{ 0x00000001b7a0ed14, 0x0000000142b05cc8 },
/* x^57344 mod p(x)` << 1, x^57408 mod p(x)` << 1 */
{ 0x00000000c7842488, 0x00000001be49e7a4 },
/* x^56320 mod p(x)` << 1, x^56384 mod p(x)` << 1 */
{ 0x00000001c02a4fee, 0x0000000108f69d6c },
/* x^55296 mod p(x)` << 1, x^55360 mod p(x)` << 1 */
{ 0x000000003c273778, 0x000000006c0971f0 },
/* x^54272 mod p(x)` << 1, x^54336 mod p(x)` << 1 */
{ 0x00000001d63f8894, 0x000000005b16467a },
/* x^53248 mod p(x)` << 1, x^53312 mod p(x)` << 1 */
{ 0x000000006be557d6, 0x00000001551a628e },
/* x^52224 mod p(x)` << 1, x^52288 mod p(x)` << 1 */
{ 0x000000006a7806ea, 0x000000019e42ea92 },
/* x^51200 mod p(x)` << 1, x^51264 mod p(x)` << 1 */
{ 0x000000016155aa0c, 0x000000012fa83ff2 },
/* x^50176 mod p(x)` << 1, x^50240 mod p(x)` << 1 */
{ 0x00000000908650ac, 0x000000011ca9cde0 },
/* x^49152 mod p(x)` << 1, x^49216 mod p(x)` << 1 */
{ 0x00000000aa5a8084, 0x00000000c8e5cd74 },
/* x^48128 mod p(x)` << 1, x^48192 mod p(x)` << 1 */
{ 0x0000000191bb500a, 0x0000000096c27f0c },
/* x^47104 mod p(x)` << 1, x^47168 mod p(x)` << 1 */
{ 0x0000000064e9bed0, 0x000000002baed926 },
/* x^46080 mod p(x)` << 1, x^46144 mod p(x)` << 1 */
{ 0x000000009444f302, 0x000000017c8de8d2 },
/* x^45056 mod p(x)` << 1, x^45120 mod p(x)` << 1 */
{ 0x000000019db07d3c, 0x00000000d43d6068 },
/* x^44032 mod p(x)` << 1, x^44096 mod p(x)` << 1 */
{ 0x00000001359e3e6e, 0x00000000cb2c4b26 },
/* x^43008 mod p(x)` << 1, x^43072 mod p(x)` << 1 */
{ 0x00000001e4f10dd2, 0x0000000145b8da26 },
/* x^41984 mod p(x)` << 1, x^42048 mod p(x)` << 1 */
{ 0x0000000124f5735e, 0x000000018fff4b08 },
/* x^40960 mod p(x)` << 1, x^41024 mod p(x)` << 1 */
{ 0x0000000124760a4c, 0x0000000150b58ed0 },
/* x^39936 mod p(x)` << 1, x^40000 mod p(x)` << 1 */
{ 0x000000000f1fc186, 0x00000001549f39bc },
/* x^38912 mod p(x)` << 1, x^38976 mod p(x)` << 1 */
{ 0x00000000150e4cc4, 0x00000000ef4d2f42 },
/* x^37888 mod p(x)` << 1, x^37952 mod p(x)` << 1 */
{ 0x000000002a6204e8, 0x00000001b1468572 },
/* x^36864 mod p(x)` << 1, x^36928 mod p(x)` << 1 */
{ 0x00000000beb1d432, 0x000000013d7403b2 },
/* x^35840 mod p(x)` << 1, x^35904 mod p(x)` << 1 */
{ 0x0000000135f3f1f0, 0x00000001a4681842 },
/* x^34816 mod p(x)` << 1, x^34880 mod p(x)` << 1 */
{ 0x0000000074fe2232, 0x0000000167714492 },
/* x^33792 mod p(x)` << 1, x^33856 mod p(x)` << 1 */
{ 0x000000001ac6e2ba, 0x00000001e599099a },
/* x^32768 mod p(x)` << 1, x^32832 mod p(x)` << 1 */
{ 0x0000000013fca91e, 0x00000000fe128194 },
/* x^31744 mod p(x)` << 1, x^31808 mod p(x)` << 1 */
{ 0x0000000183f4931e, 0x0000000077e8b990 },
/* x^30720 mod p(x)` << 1, x^30784 mod p(x)` << 1 */
{ 0x00000000b6d9b4e4, 0x00000001a267f63a },
/* x^29696 mod p(x)` << 1, x^29760 mod p(x)` << 1 */
{ 0x00000000b5188656, 0x00000001945c245a },
/* x^28672 mod p(x)` << 1, x^28736 mod p(x)` << 1 */
{ 0x0000000027a81a84, 0x0000000149002e76 },
/* x^27648 mod p(x)` << 1, x^27712 mod p(x)` << 1 */
{ 0x0000000125699258, 0x00000001bb8310a4 },
/* x^26624 mod p(x)` << 1, x^26688 mod p(x)` << 1 */
{ 0x00000001b23de796, 0x000000019ec60bcc },
/* x^25600 mod p(x)` << 1, x^25664 mod p(x)` << 1 */
{ 0x00000000fe4365dc, 0x000000012d8590ae },
/* x^24576 mod p(x)` << 1, x^24640 mod p(x)` << 1 */
{ 0x00000000c68f497a, 0x0000000065b00684 },
/* x^23552 mod p(x)` << 1, x^23616 mod p(x)` << 1 */
{ 0x00000000fbf521ee, 0x000000015e5aeadc },
/* x^22528 mod p(x)` << 1, x^22592 mod p(x)` << 1 */
{ 0x000000015eac3378, 0x00000000b77ff2b0 },
/* x^21504 mod p(x)` << 1, x^21568 mod p(x)` << 1 */
{ 0x0000000134914b90, 0x0000000188da2ff6 },
/* x^20480 mod p(x)` << 1, x^20544 mod p(x)` << 1 */
{ 0x0000000016335cfe, 0x0000000063da929a },
/* x^19456 mod p(x)` << 1, x^19520 mod p(x)` << 1 */
{ 0x000000010372d10c, 0x00000001389caa80 },
/* x^18432 mod p(x)` << 1, x^18496 mod p(x)` << 1 */
{ 0x000000015097b908, 0x000000013db599d2 },
/* x^17408 mod p(x)` << 1, x^17472 mod p(x)` << 1 */
{ 0x00000001227a7572, 0x0000000122505a86 },
/* x^16384 mod p(x)` << 1, x^16448 mod p(x)` << 1 */
{ 0x000000009a8f75c0, 0x000000016bd72746 },
/* x^15360 mod p(x)` << 1, x^15424 mod p(x)` << 1 */
{ 0x00000000682c77a2, 0x00000001c3faf1d4 },
/* x^14336 mod p(x)` << 1, x^14400 mod p(x)` << 1 */
{ 0x00000000231f091c, 0x00000001111c826c },
/* x^13312 mod p(x)` << 1, x^13376 mod p(x)` << 1 */
{ 0x000000007d4439f2, 0x00000000153e9fb2 },
/* x^12288 mod p(x)` << 1, x^12352 mod p(x)` << 1 */
{ 0x000000017e221efc, 0x000000002b1f7b60 },
/* x^11264 mod p(x)` << 1, x^11328 mod p(x)` << 1 */
{ 0x0000000167457c38, 0x00000000b1dba570 },
/* x^10240 mod p(x)` << 1, x^10304 mod p(x)` << 1 */
{ 0x00000000bdf081c4, 0x00000001f6397b76 },
/* x^9216 mod p(x)` << 1, x^9280 mod p(x)` << 1 */
{ 0x000000016286d6b0, 0x0000000156335214 },
/* x^8192 mod p(x)` << 1, x^8256 mod p(x)` << 1 */
{ 0x00000000c84f001c, 0x00000001d70e3986 },
/* x^7168 mod p(x)` << 1, x^7232 mod p(x)` << 1 */
{ 0x0000000064efe7c0, 0x000000003701a774 },
/* x^6144 mod p(x)` << 1, x^6208 mod p(x)` << 1 */
{ 0x000000000ac2d904, 0x00000000ac81ef72 },
/* x^5120 mod p(x)` << 1, x^5184 mod p(x)` << 1 */
{ 0x00000000fd226d14, 0x0000000133212464 },
/* x^4096 mod p(x)` << 1, x^4160 mod p(x)` << 1 */
{ 0x000000011cfd42e0, 0x00000000e4e45610 },
/* x^3072 mod p(x)` << 1, x^3136 mod p(x)` << 1 */
{ 0x000000016e5a5678, 0x000000000c1bd370 },
/* x^2048 mod p(x)` << 1, x^2112 mod p(x)` << 1 */
{ 0x00000001d888fe22, 0x00000001a7b9e7a6 },
/* x^1024 mod p(x)` << 1, x^1088 mod p(x)` << 1 */
{ 0x00000001af77fcd4, 0x000000007d657a10 }
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
};
/* Reduce final 1024-2048 bits to 64 bits, shifting 32 bits to include the trailing 32 bits of zeros */
static const __vector unsigned long long vcrc_short_const[16] ALIGNED_(16) = {
#if BYTE_ORDER == LITTLE_ENDIAN
/* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */
{ 0x99168a18ec447f11, 0xed837b2613e8221e },
/* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */
{ 0xe23e954e8fd2cd3c, 0xc8acdd8147b9ce5a },
/* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */
{ 0x92f8befe6b1d2b53, 0xd9ad6d87d4277e25 },
/* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */
{ 0xf38a3556291ea462, 0xc10ec5e033fbca3b },
/* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */
{ 0x974ac56262b6ca4b, 0xc0b55b0e82e02e2f },
/* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */
{ 0x855712b3784d2a56, 0x71aa1df0e172334d },
/* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */
{ 0xa5abe9f80eaee722, 0xfee3053e3969324d },
/* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */
{ 0x1fa0943ddb54814c, 0xf44779b93eb2bd08 },
/* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */
{ 0xa53ff440d7bbfe6a, 0xf5449b3f00cc3374 },
/* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */
{ 0xebe7e3566325605c, 0x6f8346e1d777606e },
/* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */
{ 0xc65a272ce5b592b8, 0xe3ab4f2ac0b95347 },
/* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */
{ 0x5705a9ca4721589f, 0xaa2215ea329ecc11 },
/* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */
{ 0xe3720acb88d14467, 0x1ed8f66ed95efd26 },
/* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */
{ 0xba1aca0315141c31, 0x78ed02d5a700e96a },
/* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */
{ 0xad2a31b3ed627dae, 0xba8ccbe832b39da3 },
/* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */
{ 0x6655004fa06a2517, 0xedb88320b1e6b092 }
#else /* BYTE_ORDER == LITTLE_ENDIAN */
/* x^1952 mod p(x) , x^1984 mod p(x) , x^2016 mod p(x) , x^2048 mod p(x) */
{ 0xed837b2613e8221e, 0x99168a18ec447f11 },
/* x^1824 mod p(x) , x^1856 mod p(x) , x^1888 mod p(x) , x^1920 mod p(x) */
{ 0xc8acdd8147b9ce5a, 0xe23e954e8fd2cd3c },
/* x^1696 mod p(x) , x^1728 mod p(x) , x^1760 mod p(x) , x^1792 mod p(x) */
{ 0xd9ad6d87d4277e25, 0x92f8befe6b1d2b53 },
/* x^1568 mod p(x) , x^1600 mod p(x) , x^1632 mod p(x) , x^1664 mod p(x) */
{ 0xc10ec5e033fbca3b, 0xf38a3556291ea462 },
/* x^1440 mod p(x) , x^1472 mod p(x) , x^1504 mod p(x) , x^1536 mod p(x) */
{ 0xc0b55b0e82e02e2f, 0x974ac56262b6ca4b },
/* x^1312 mod p(x) , x^1344 mod p(x) , x^1376 mod p(x) , x^1408 mod p(x) */
{ 0x71aa1df0e172334d, 0x855712b3784d2a56 },
/* x^1184 mod p(x) , x^1216 mod p(x) , x^1248 mod p(x) , x^1280 mod p(x) */
{ 0xfee3053e3969324d, 0xa5abe9f80eaee722 },
/* x^1056 mod p(x) , x^1088 mod p(x) , x^1120 mod p(x) , x^1152 mod p(x) */
{ 0xf44779b93eb2bd08, 0x1fa0943ddb54814c },
/* x^928 mod p(x) , x^960 mod p(x) , x^992 mod p(x) , x^1024 mod p(x) */
{ 0xf5449b3f00cc3374, 0xa53ff440d7bbfe6a },
/* x^800 mod p(x) , x^832 mod p(x) , x^864 mod p(x) , x^896 mod p(x) */
{ 0x6f8346e1d777606e, 0xebe7e3566325605c },
/* x^672 mod p(x) , x^704 mod p(x) , x^736 mod p(x) , x^768 mod p(x) */
{ 0xe3ab4f2ac0b95347, 0xc65a272ce5b592b8 },
/* x^544 mod p(x) , x^576 mod p(x) , x^608 mod p(x) , x^640 mod p(x) */
{ 0xaa2215ea329ecc11, 0x5705a9ca4721589f },
/* x^416 mod p(x) , x^448 mod p(x) , x^480 mod p(x) , x^512 mod p(x) */
{ 0x1ed8f66ed95efd26, 0xe3720acb88d14467 },
/* x^288 mod p(x) , x^320 mod p(x) , x^352 mod p(x) , x^384 mod p(x) */
{ 0x78ed02d5a700e96a, 0xba1aca0315141c31 },
/* x^160 mod p(x) , x^192 mod p(x) , x^224 mod p(x) , x^256 mod p(x) */
{ 0xba8ccbe832b39da3, 0xad2a31b3ed627dae },
/* x^32 mod p(x) , x^64 mod p(x) , x^96 mod p(x) , x^128 mod p(x) */
{ 0xedb88320b1e6b092, 0x6655004fa06a2517 }
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
};
/* Barrett constants */
/* 33 bit reflected Barrett constant m - (4^32)/n */
static const __vector unsigned long long v_Barrett_const[2] ALIGNED_(16) = {
/* x^64 div p(x) */
#if BYTE_ORDER == LITTLE_ENDIAN
{ 0x00000001f7011641, 0x0000000000000000 },
{ 0x00000001db710641, 0x0000000000000000 }
#else /* BYTE_ORDER == LITTLE_ENDIAN */
{ 0x0000000000000000, 0x00000001f7011641 },
{ 0x0000000000000000, 0x00000001db710641 }
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
};
3p-zlib-ng-main/zlib-ng/arch/power/crc32_power8.c 0000664 0000000 0000000 00000057140 14553115624 0021676 0 ustar 00root root 0000000 0000000 /* crc32 for POWER8 using VSX instructions
* Copyright (C) 2021 IBM Corporation
*
* Author: Rogerio Alves
*
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Calculate the checksum of data that is 16 byte aligned and a multiple of
* 16 bytes.
*
* The first step is to reduce it to 1024 bits. We do this in 8 parallel
* chunks in order to mask the latency of the vpmsum instructions. If we
* have more than 32 kB of data to checksum we repeat this step multiple
* times, passing in the previous 1024 bits.
*
* The next step is to reduce the 1024 bits to 64 bits. This step adds
* 32 bits of 0s to the end - this matches what a CRC does. We just
* calculate constants that land the data in this 32 bits.
*
* We then use fixed point Barrett reduction to compute a mod n over GF(2)
* for n = CRC using POWER8 instructions. We use x = 32.
*
* http://en.wikipedia.org/wiki/Barrett_reduction
*
* This code uses gcc vector builtins instead using assembly directly.
*/
#include
#include "zendian.h"
#include "zbuild.h"
#include "crc32_constants.h"
#include "crc32_braid_tbl.h"
#if defined (__clang__)
#include "fallback_builtins.h"
#endif
#define MAX_SIZE 32768
#define VMX_ALIGN 16
#define VMX_ALIGN_MASK (VMX_ALIGN-1)
static unsigned int crc32_align(unsigned int crc, const unsigned char *p, unsigned long len) {
while (len--)
crc = crc_table[(crc ^ *p++) & 0xff] ^ (crc >> 8);
return crc;
}
static unsigned int ALIGNED_(32) __crc32_vpmsum(unsigned int crc, const void* p, unsigned long len);
Z_INTERNAL uint32_t crc32_power8(uint32_t crc, const unsigned char *p, size_t _len) {
unsigned int prealign;
unsigned int tail;
unsigned long len = (unsigned long) _len;
if (p == (const unsigned char *) 0x0)
return 0;
crc ^= 0xffffffff;
if (len < VMX_ALIGN + VMX_ALIGN_MASK) {
crc = crc32_align(crc, p, len);
goto out;
}
if ((unsigned long)p & VMX_ALIGN_MASK) {
prealign = VMX_ALIGN - ((unsigned long)p & VMX_ALIGN_MASK);
crc = crc32_align(crc, p, prealign);
len -= prealign;
p += prealign;
}
crc = __crc32_vpmsum(crc, p, len & ~VMX_ALIGN_MASK);
tail = len & VMX_ALIGN_MASK;
if (tail) {
p += len & ~VMX_ALIGN_MASK;
crc = crc32_align(crc, p, tail);
}
out:
crc ^= 0xffffffff;
return crc;
}
/* When we have a load-store in a single-dispatch group and address overlap
* such that forward is not allowed (load-hit-store) the group must be flushed.
* A group ending NOP prevents the flush.
*/
#define GROUP_ENDING_NOP __asm__("ori 2,2,0" ::: "memory")
#if BYTE_ORDER == BIG_ENDIAN
#define BYTESWAP_DATA
#endif
#ifdef BYTESWAP_DATA
#define VEC_PERM(vr, va, vb, vc) vr = vec_perm(va, vb, (__vector unsigned char) vc)
#if BYTE_ORDER == LITTLE_ENDIAN
/* Byte reverse permute constant LE. */
static const __vector unsigned long long vperm_const ALIGNED_(16) = { 0x08090A0B0C0D0E0FUL, 0x0001020304050607UL };
#else
static const __vector unsigned long long vperm_const ALIGNED_(16) = { 0x0F0E0D0C0B0A0908UL, 0X0706050403020100UL };
#endif
#else
#define VEC_PERM(vr, va, vb, vc)
#endif
static unsigned int ALIGNED_(32) __crc32_vpmsum(unsigned int crc, const void* p, unsigned long len) {
const __vector unsigned long long vzero = {0,0};
const __vector unsigned long long vones = {0xffffffffffffffffUL, 0xffffffffffffffffUL};
const __vector unsigned long long vmask_32bit =
(__vector unsigned long long)vec_sld((__vector unsigned char)vzero, (__vector unsigned char)vones, 4);
const __vector unsigned long long vmask_64bit =
(__vector unsigned long long)vec_sld((__vector unsigned char)vzero, (__vector unsigned char)vones, 8);
__vector unsigned long long vcrc;
__vector unsigned long long vconst1, vconst2;
/* vdata0-vdata7 will contain our data (p). */
__vector unsigned long long vdata0, vdata1, vdata2, vdata3, vdata4, vdata5, vdata6, vdata7;
/* v0-v7 will contain our checksums */
__vector unsigned long long v0 = {0,0};
__vector unsigned long long v1 = {0,0};
__vector unsigned long long v2 = {0,0};
__vector unsigned long long v3 = {0,0};
__vector unsigned long long v4 = {0,0};
__vector unsigned long long v5 = {0,0};
__vector unsigned long long v6 = {0,0};
__vector unsigned long long v7 = {0,0};
/* Vector auxiliary variables. */
__vector unsigned long long va0, va1, va2, va3, va4, va5, va6, va7;
unsigned int offset; /* Constant table offset. */
unsigned long i; /* Counter. */
unsigned long chunks;
unsigned long block_size;
int next_block = 0;
/* Align by 128 bits. The last 128 bit block will be processed at end. */
unsigned long length = len & 0xFFFFFFFFFFFFFF80UL;
vcrc = (__vector unsigned long long)__builtin_pack_vector_int128(0UL, crc);
/* Short version. */
if (len < 256) {
/* Calculate where in the constant table we need to start. */
offset = 256 - len;
vconst1 = vec_ld(offset, vcrc_short_const);
vdata0 = vec_ld(0, (__vector unsigned long long*) p);
VEC_PERM(vdata0, vdata0, vconst1, vperm_const);
/* xor initial value */
vdata0 = vec_xor(vdata0, vcrc);
vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw(
(__vector unsigned int)vdata0, (__vector unsigned int)vconst1);
v0 = vec_xor(v0, vdata0);
for (i = 16; i < len; i += 16) {
vconst1 = vec_ld(offset + i, vcrc_short_const);
vdata0 = vec_ld(i, (__vector unsigned long long*) p);
VEC_PERM(vdata0, vdata0, vconst1, vperm_const);
vdata0 = (__vector unsigned long long) __builtin_crypto_vpmsumw(
(__vector unsigned int)vdata0, (__vector unsigned int)vconst1);
v0 = vec_xor(v0, vdata0);
}
} else {
/* Load initial values. */
vdata0 = vec_ld(0, (__vector unsigned long long*) p);
vdata1 = vec_ld(16, (__vector unsigned long long*) p);
VEC_PERM(vdata0, vdata0, vdata0, vperm_const);
VEC_PERM(vdata1, vdata1, vdata1, vperm_const);
vdata2 = vec_ld(32, (__vector unsigned long long*) p);
vdata3 = vec_ld(48, (__vector unsigned long long*) p);
VEC_PERM(vdata2, vdata2, vdata2, vperm_const);
VEC_PERM(vdata3, vdata3, vdata3, vperm_const);
vdata4 = vec_ld(64, (__vector unsigned long long*) p);
vdata5 = vec_ld(80, (__vector unsigned long long*) p);
VEC_PERM(vdata4, vdata4, vdata4, vperm_const);
VEC_PERM(vdata5, vdata5, vdata5, vperm_const);
vdata6 = vec_ld(96, (__vector unsigned long long*) p);
vdata7 = vec_ld(112, (__vector unsigned long long*) p);
VEC_PERM(vdata6, vdata6, vdata6, vperm_const);
VEC_PERM(vdata7, vdata7, vdata7, vperm_const);
/* xor in initial value */
vdata0 = vec_xor(vdata0, vcrc);
p = (char *)p + 128;
do {
/* Checksum in blocks of MAX_SIZE. */
block_size = length;
if (block_size > MAX_SIZE) {
block_size = MAX_SIZE;
}
length = length - block_size;
/*
* Work out the offset into the constants table to start at. Each
* constant is 16 bytes, and it is used against 128 bytes of input
* data - 128 / 16 = 8
*/
offset = (MAX_SIZE/8) - (block_size/8);
/* We reduce our final 128 bytes in a separate step */
chunks = (block_size/128)-1;
vconst1 = vec_ld(offset, vcrc_const);
va0 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata0,
(__vector unsigned long long)vconst1);
va1 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata1,
(__vector unsigned long long)vconst1);
va2 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata2,
(__vector unsigned long long)vconst1);
va3 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata3,
(__vector unsigned long long)vconst1);
va4 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata4,
(__vector unsigned long long)vconst1);
va5 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata5,
(__vector unsigned long long)vconst1);
va6 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata6,
(__vector unsigned long long)vconst1);
va7 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata7,
(__vector unsigned long long)vconst1);
if (chunks > 1) {
offset += 16;
vconst2 = vec_ld(offset, vcrc_const);
GROUP_ENDING_NOP;
vdata0 = vec_ld(0, (__vector unsigned long long*) p);
VEC_PERM(vdata0, vdata0, vdata0, vperm_const);
vdata1 = vec_ld(16, (__vector unsigned long long*) p);
VEC_PERM(vdata1, vdata1, vdata1, vperm_const);
vdata2 = vec_ld(32, (__vector unsigned long long*) p);
VEC_PERM(vdata2, vdata2, vdata2, vperm_const);
vdata3 = vec_ld(48, (__vector unsigned long long*) p);
VEC_PERM(vdata3, vdata3, vdata3, vperm_const);
vdata4 = vec_ld(64, (__vector unsigned long long*) p);
VEC_PERM(vdata4, vdata4, vdata4, vperm_const);
vdata5 = vec_ld(80, (__vector unsigned long long*) p);
VEC_PERM(vdata5, vdata5, vdata5, vperm_const);
vdata6 = vec_ld(96, (__vector unsigned long long*) p);
VEC_PERM(vdata6, vdata6, vdata6, vperm_const);
vdata7 = vec_ld(112, (__vector unsigned long long*) p);
VEC_PERM(vdata7, vdata7, vdata7, vperm_const);
p = (char *)p + 128;
/*
* main loop. Each iteration calculates the CRC for a 128-byte
* block.
*/
for (i = 0; i < chunks-2; i++) {
vconst1 = vec_ld(offset, vcrc_const);
offset += 16;
GROUP_ENDING_NOP;
v0 = vec_xor(v0, va0);
va0 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata0,
(__vector unsigned long long)vconst2);
vdata0 = vec_ld(0, (__vector unsigned long long*) p);
VEC_PERM(vdata0, vdata0, vdata0, vperm_const);
GROUP_ENDING_NOP;
v1 = vec_xor(v1, va1);
va1 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata1,
(__vector unsigned long long)vconst2);
vdata1 = vec_ld(16, (__vector unsigned long long*) p);
VEC_PERM(vdata1, vdata1, vdata1, vperm_const);
GROUP_ENDING_NOP;
v2 = vec_xor(v2, va2);
va2 = __builtin_crypto_vpmsumd((__vector unsigned long long)
vdata2, (__vector unsigned long long)vconst2);
vdata2 = vec_ld(32, (__vector unsigned long long*) p);
VEC_PERM(vdata2, vdata2, vdata2, vperm_const);
GROUP_ENDING_NOP;
v3 = vec_xor(v3, va3);
va3 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata3,
(__vector unsigned long long)vconst2);
vdata3 = vec_ld(48, (__vector unsigned long long*) p);
VEC_PERM(vdata3, vdata3, vdata3, vperm_const);
vconst2 = vec_ld(offset, vcrc_const);
GROUP_ENDING_NOP;
v4 = vec_xor(v4, va4);
va4 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata4,
(__vector unsigned long long)vconst1);
vdata4 = vec_ld(64, (__vector unsigned long long*) p);
VEC_PERM(vdata4, vdata4, vdata4, vperm_const);
GROUP_ENDING_NOP;
v5 = vec_xor(v5, va5);
va5 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata5,
(__vector unsigned long long)vconst1);
vdata5 = vec_ld(80, (__vector unsigned long long*) p);
VEC_PERM(vdata5, vdata5, vdata5, vperm_const);
GROUP_ENDING_NOP;
v6 = vec_xor(v6, va6);
va6 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata6,
(__vector unsigned long long)vconst1);
vdata6 = vec_ld(96, (__vector unsigned long long*) p);
VEC_PERM(vdata6, vdata6, vdata6, vperm_const);
GROUP_ENDING_NOP;
v7 = vec_xor(v7, va7);
va7 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata7,
(__vector unsigned long long)vconst1);
vdata7 = vec_ld(112, (__vector unsigned long long*) p);
VEC_PERM(vdata7, vdata7, vdata7, vperm_const);
p = (char *)p + 128;
}
/* First cool down */
vconst1 = vec_ld(offset, vcrc_const);
offset += 16;
v0 = vec_xor(v0, va0);
va0 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata0,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v1 = vec_xor(v1, va1);
va1 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata1,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v2 = vec_xor(v2, va2);
va2 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata2,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v3 = vec_xor(v3, va3);
va3 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata3,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v4 = vec_xor(v4, va4);
va4 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata4,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v5 = vec_xor(v5, va5);
va5 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata5,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v6 = vec_xor(v6, va6);
va6 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata6,
(__vector unsigned long long)vconst1);
GROUP_ENDING_NOP;
v7 = vec_xor(v7, va7);
va7 = __builtin_crypto_vpmsumd((__vector unsigned long long)vdata7,
(__vector unsigned long long)vconst1);
}/* else */
/* Second cool down. */
v0 = vec_xor(v0, va0);
v1 = vec_xor(v1, va1);
v2 = vec_xor(v2, va2);
v3 = vec_xor(v3, va3);
v4 = vec_xor(v4, va4);
v5 = vec_xor(v5, va5);
v6 = vec_xor(v6, va6);
v7 = vec_xor(v7, va7);
/*
* vpmsumd produces a 96 bit result in the least significant bits
* of the register. Since we are bit reflected we have to shift it
* left 32 bits so it occupies the least significant bits in the
* bit reflected domain.
*/
v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0,
(__vector unsigned char)vzero, 4);
v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v1,
(__vector unsigned char)vzero, 4);
v2 = (__vector unsigned long long)vec_sld((__vector unsigned char)v2,
(__vector unsigned char)vzero, 4);
v3 = (__vector unsigned long long)vec_sld((__vector unsigned char)v3,
(__vector unsigned char)vzero, 4);
v4 = (__vector unsigned long long)vec_sld((__vector unsigned char)v4,
(__vector unsigned char)vzero, 4);
v5 = (__vector unsigned long long)vec_sld((__vector unsigned char)v5,
(__vector unsigned char)vzero, 4);
v6 = (__vector unsigned long long)vec_sld((__vector unsigned char)v6,
(__vector unsigned char)vzero, 4);
v7 = (__vector unsigned long long)vec_sld((__vector unsigned char)v7,
(__vector unsigned char)vzero, 4);
/* xor with the last 1024 bits. */
va0 = vec_ld(0, (__vector unsigned long long*) p);
VEC_PERM(va0, va0, va0, vperm_const);
va1 = vec_ld(16, (__vector unsigned long long*) p);
VEC_PERM(va1, va1, va1, vperm_const);
va2 = vec_ld(32, (__vector unsigned long long*) p);
VEC_PERM(va2, va2, va2, vperm_const);
va3 = vec_ld(48, (__vector unsigned long long*) p);
VEC_PERM(va3, va3, va3, vperm_const);
va4 = vec_ld(64, (__vector unsigned long long*) p);
VEC_PERM(va4, va4, va4, vperm_const);
va5 = vec_ld(80, (__vector unsigned long long*) p);
VEC_PERM(va5, va5, va5, vperm_const);
va6 = vec_ld(96, (__vector unsigned long long*) p);
VEC_PERM(va6, va6, va6, vperm_const);
va7 = vec_ld(112, (__vector unsigned long long*) p);
VEC_PERM(va7, va7, va7, vperm_const);
p = (char *)p + 128;
vdata0 = vec_xor(v0, va0);
vdata1 = vec_xor(v1, va1);
vdata2 = vec_xor(v2, va2);
vdata3 = vec_xor(v3, va3);
vdata4 = vec_xor(v4, va4);
vdata5 = vec_xor(v5, va5);
vdata6 = vec_xor(v6, va6);
vdata7 = vec_xor(v7, va7);
/* Check if we have more blocks to process */
next_block = 0;
if (length != 0) {
next_block = 1;
/* zero v0-v7 */
v0 = vec_xor(v0, v0);
v1 = vec_xor(v1, v1);
v2 = vec_xor(v2, v2);
v3 = vec_xor(v3, v3);
v4 = vec_xor(v4, v4);
v5 = vec_xor(v5, v5);
v6 = vec_xor(v6, v6);
v7 = vec_xor(v7, v7);
}
length = length + 128;
} while (next_block);
/* Calculate how many bytes we have left. */
length = (len & 127);
/* Calculate where in (short) constant table we need to start. */
offset = 128 - length;
v0 = vec_ld(offset, vcrc_short_const);
v1 = vec_ld(offset + 16, vcrc_short_const);
v2 = vec_ld(offset + 32, vcrc_short_const);
v3 = vec_ld(offset + 48, vcrc_short_const);
v4 = vec_ld(offset + 64, vcrc_short_const);
v5 = vec_ld(offset + 80, vcrc_short_const);
v6 = vec_ld(offset + 96, vcrc_short_const);
v7 = vec_ld(offset + 112, vcrc_short_const);
offset += 128;
v0 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata0, (__vector unsigned int)v0);
v1 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata1, (__vector unsigned int)v1);
v2 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata2, (__vector unsigned int)v2);
v3 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata3, (__vector unsigned int)v3);
v4 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata4, (__vector unsigned int)v4);
v5 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata5, (__vector unsigned int)v5);
v6 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata6, (__vector unsigned int)v6);
v7 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata7, (__vector unsigned int)v7);
/* Now reduce the tail (0-112 bytes). */
for (i = 0; i < length; i+=16) {
vdata0 = vec_ld(i,(__vector unsigned long long*)p);
VEC_PERM(vdata0, vdata0, vdata0, vperm_const);
va0 = vec_ld(offset + i,vcrc_short_const);
va0 = (__vector unsigned long long)__builtin_crypto_vpmsumw(
(__vector unsigned int)vdata0, (__vector unsigned int)va0);
v0 = vec_xor(v0, va0);
}
/* xor all parallel chunks together. */
v0 = vec_xor(v0, v1);
v2 = vec_xor(v2, v3);
v4 = vec_xor(v4, v5);
v6 = vec_xor(v6, v7);
v0 = vec_xor(v0, v2);
v4 = vec_xor(v4, v6);
v0 = vec_xor(v0, v4);
}
/* Barrett Reduction */
vconst1 = vec_ld(0, v_Barrett_const);
vconst2 = vec_ld(16, v_Barrett_const);
v1 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0,
(__vector unsigned char)v0, 8);
v0 = vec_xor(v1,v0);
/* shift left one bit */
__vector unsigned char vsht_splat = vec_splat_u8 (1);
v0 = (__vector unsigned long long)vec_sll((__vector unsigned char)v0, vsht_splat);
v0 = vec_and(v0, vmask_64bit);
/*
* The reflected version of Barrett reduction. Instead of bit
* reflecting our data (which is expensive to do), we bit reflect our
* constants and our algorithm, which means the intermediate data in
* our vector registers goes from 0-63 instead of 63-0. We can reflect
* the algorithm because we don't carry in mod 2 arithmetic.
*/
/* bottom 32 bits of a */
v1 = vec_and(v0, vmask_32bit);
/* ma */
v1 = __builtin_crypto_vpmsumd((__vector unsigned long long)v1,
(__vector unsigned long long)vconst1);
/* bottom 32bits of ma */
v1 = vec_and(v1, vmask_32bit);
/* qn */
v1 = __builtin_crypto_vpmsumd((__vector unsigned long long)v1,
(__vector unsigned long long)vconst2);
/* a - qn, subtraction is xor in GF(2) */
v0 = vec_xor (v0, v1);
/*
* Since we are bit reflected, the result (ie the low 32 bits) is in
* the high 32 bits. We just need to shift it left 4 bytes
* V0 [ 0 1 X 3 ]
* V0 [ 0 X 2 3 ]
*/
/* shift result into top 64 bits of */
v0 = (__vector unsigned long long)vec_sld((__vector unsigned char)v0,
(__vector unsigned char)vzero, 4);
#if BYTE_ORDER == BIG_ENDIAN
return v0[0];
#else
return v0[1];
#endif
}
3p-zlib-ng-main/zlib-ng/arch/power/fallback_builtins.h 0000664 0000000 0000000 00000001554 14553115624 0023131 0 ustar 00root root 0000000 0000000 /* Helper functions to work around issues with clang builtins
* Copyright (C) 2021 IBM Corporation
*
* Authors:
* Daniel Black
* Rogerio Alves
* Tulio Magno Quites Machado Filho
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef POWER_BUILTINS_H
#define POWER_BUILTINS_H
/*
* These stubs fix clang incompatibilities with GCC builtins.
*/
#ifndef __builtin_crypto_vpmsumw
#define __builtin_crypto_vpmsumw __builtin_crypto_vpmsumb
#endif
#ifndef __builtin_crypto_vpmsumd
#define __builtin_crypto_vpmsumd __builtin_crypto_vpmsumb
#endif
static inline __vector unsigned long long __attribute__((overloadable))
vec_ld(int __a, const __vector unsigned long long* __b) {
return (__vector unsigned long long)__builtin_altivec_lvx(__a, __b);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/power/power_features.c 0000664 0000000 0000000 00000002136 14553115624 0022503 0 ustar 00root root 0000000 0000000 /* power_features.c - POWER feature check
* Copyright (C) 2020 Matheus Castanho , IBM
* Copyright (C) 2021-2022 Mika T. Lindqvist
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef HAVE_SYS_AUXV_H
# include
#endif
#ifdef __FreeBSD__
# include
#endif
#include "../../zbuild.h"
#include "power_features.h"
void Z_INTERNAL power_check_features(struct power_cpu_features *features) {
#ifdef PPC_FEATURES
unsigned long hwcap;
#ifdef __FreeBSD__
elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
#else
hwcap = getauxval(AT_HWCAP);
#endif
if (hwcap & PPC_FEATURE_HAS_ALTIVEC)
features->has_altivec = 1;
#endif
#ifdef POWER_FEATURES
unsigned long hwcap2;
#ifdef __FreeBSD__
elf_aux_info(AT_HWCAP2, &hwcap2, sizeof(hwcap2));
#else
hwcap2 = getauxval(AT_HWCAP2);
#endif
#ifdef POWER8_VSX
if (hwcap2 & PPC_FEATURE2_ARCH_2_07)
features->has_arch_2_07 = 1;
#endif
#ifdef POWER9
if (hwcap2 & PPC_FEATURE2_ARCH_3_00)
features->has_arch_3_00 = 1;
#endif
#endif
}
3p-zlib-ng-main/zlib-ng/arch/power/power_features.h 0000664 0000000 0000000 00000000752 14553115624 0022512 0 ustar 00root root 0000000 0000000 /* power_features.h -- check for POWER CPU features
* Copyright (C) 2020 Matheus Castanho , IBM
* Copyright (C) 2021 Mika T. Lindqvist
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef POWER_H_
#define POWER_H_
struct power_cpu_features {
int has_altivec;
int has_arch_2_07;
int has_arch_3_00;
};
void Z_INTERNAL power_check_features(struct power_cpu_features *features);
#endif /* POWER_H_ */
3p-zlib-ng-main/zlib-ng/arch/power/slide_hash_power8.c 0000664 0000000 0000000 00000000502 14553115624 0023053 0 ustar 00root root 0000000 0000000 /* Optimized slide_hash for POWER processors
* Copyright (C) 2019-2020 IBM Corporation
* Author: Matheus Castanho
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef POWER8_VSX
#define SLIDE_PPC slide_hash_power8
#include "slide_ppc_tpl.h"
#endif /* POWER8_VSX */
3p-zlib-ng-main/zlib-ng/arch/power/slide_hash_vmx.c 0000664 0000000 0000000 00000000471 14553115624 0022446 0 ustar 00root root 0000000 0000000 /* Optimized slide_hash for PowerPC processors with VMX instructions
* Copyright (C) 2017-2021 Mika T. Lindqvist
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef PPC_VMX
#define SLIDE_PPC slide_hash_vmx
#include "slide_ppc_tpl.h"
#endif /* PPC_VMX */
3p-zlib-ng-main/zlib-ng/arch/power/slide_ppc_tpl.h 0000664 0000000 0000000 00000001474 14553115624 0022303 0 ustar 00root root 0000000 0000000 /* Optimized slide_hash for PowerPC processors
* Copyright (C) 2017-2021 Mika T. Lindqvist
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include
#include "zbuild.h"
#include "deflate.h"
static inline void slide_hash_chain(Pos *table, uint32_t entries, uint16_t wsize) {
const vector unsigned short vmx_wsize = vec_splats(wsize);
Pos *p = table;
do {
vector unsigned short value, result;
value = vec_ld(0, p);
result = vec_subs(value, vmx_wsize);
vec_st(result, 0, p);
p += 8;
entries -= 8;
} while (entries > 0);
}
void Z_INTERNAL SLIDE_PPC(deflate_state *s) {
uint16_t wsize = s->w_size;
slide_hash_chain(s->head, HASH_SIZE, wsize);
slide_hash_chain(s->prev, wsize, wsize);
}
3p-zlib-ng-main/zlib-ng/arch/riscv/ 0000775 0000000 0000000 00000000000 14553115624 0017275 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/riscv/README.md 0000664 0000000 0000000 00000003350 14553115624 0020555 0 ustar 00root root 0000000 0000000 # Building RISC-V Target with Cmake #
> **Warning**
> Runtime rvv detection (using `hwcap`) requires linux kernel 6.5 or newer.
>
> When running on older kernels, we fall back to compile-time detection, potentially this can cause crashes if rvv is enabled at compile but not supported by the target cpu.
> Therefore if older kernel support is needed, rvv should be disabled if the target cpu does not support it.
## Prerequisite: Build RISC-V Clang Toolchain and QEMU ##
If you don't have prebuilt clang and riscv64 qemu, you can refer to the [script](https://github.com/sifive/prepare-riscv-toolchain-qemu/blob/main/prepare_riscv_toolchain_qemu.sh) to get the source. Copy the script to the zlib-ng root directory, and run it to download the source and build them. Modify the content according to your conditions (e.g., toolchain version).
```bash
./prepare_riscv_toolchain_qemu.sh
```
After running script, clang & qemu are built in `build-toolchain-qemu/riscv-clang/` & `build-toolchain-qemu/riscv-qemu/`.
`build-toolchain-qemu/riscv-clang/` is your `TOOLCHAIN_PATH`.
`build-toolchain-qemu/riscv-qemu/bin/qemu-riscv64` is your `QEMU_PATH`.
You can also download the prebuilt toolchain & qemu from [the release page](https://github.com/sifive/prepare-riscv-toolchain-qemu/releases), and enjoy using them.
## Cross-Compile for RISC-V Target ##
```bash
cmake -G Ninja -B ./build-riscv \
-D CMAKE_TOOLCHAIN_FILE=./cmake/toolchain-riscv.cmake \
-D CMAKE_INSTALL_PREFIX=./build-riscv/install \
-D TOOLCHAIN_PATH={TOOLCHAIN_PATH} \
-D QEMU_PATH={QEMU_PATH} \
.
cmake --build ./build-riscv
```
Disable the option if there is no RVV support:
```
-D WITH_RVV=OFF
```
## Run Unittests on User Mode QEMU ##
```bash
cd ./build-riscv && ctest --verbose
```
3p-zlib-ng-main/zlib-ng/arch/riscv/adler32_rvv.c 0000664 0000000 0000000 00000011644 14553115624 0021600 0 ustar 00root root 0000000 0000000 /* adler32_rvv.c - RVV version of adler32
* Copyright (C) 2023 SiFive, Inc. All rights reserved.
* Contributed by Alex Chiang
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef RISCV_RVV
#include
#include
#include "../../zbuild.h"
#include "../../adler32_p.h"
static inline uint32_t adler32_rvv_impl(uint32_t adler, uint8_t* restrict dst, const uint8_t *src, size_t len, int COPY) {
/* split Adler-32 into component sums */
uint32_t sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;
/* in case user likes doing a byte at a time, keep it fast */
if (len == 1) {
if (COPY) memcpy(dst, src, 1);
return adler32_len_1(adler, src, sum2);
}
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (src == NULL)
return 1L;
/* in case short lengths are provided, keep it somewhat fast */
if (len < 16) {
if (COPY) memcpy(dst, src, len);
return adler32_len_16(adler, src, len, sum2);
}
size_t left = len;
size_t vl = __riscv_vsetvlmax_e8m1();
vl = vl > 256 ? 256 : vl;
vuint32m4_t v_buf32_accu = __riscv_vmv_v_x_u32m4(0, vl);
vuint32m4_t v_adler32_prev_accu = __riscv_vmv_v_x_u32m4(0, vl);
vuint16m2_t v_buf16_accu;
/*
* We accumulate 8-bit data, and to prevent overflow, we have to use a 32-bit accumulator.
* However, adding 8-bit data into a 32-bit accumulator isn't efficient. We use 16-bit & 32-bit
* accumulators to boost performance.
*
* The block_size is the largest multiple of vl that <= 256, because overflow would occur when
* vl > 256 (255 * 256 <= UINT16_MAX).
*
* We accumulate 8-bit data into a 16-bit accumulator and then
* move the data into the 32-bit accumulator at the last iteration.
*/
size_t block_size = (256 / vl) * vl;
size_t nmax_limit = (NMAX / block_size);
size_t cnt = 0;
while (left >= block_size) {
v_buf16_accu = __riscv_vmv_v_x_u16m2(0, vl);
size_t subprob = block_size;
while (subprob > 0) {
vuint8m1_t v_buf8 = __riscv_vle8_v_u8m1(src, vl);
if (COPY) __riscv_vse8_v_u8m1(dst, v_buf8, vl);
v_adler32_prev_accu = __riscv_vwaddu_wv_u32m4(v_adler32_prev_accu, v_buf16_accu, vl);
v_buf16_accu = __riscv_vwaddu_wv_u16m2(v_buf16_accu, v_buf8, vl);
src += vl;
if (COPY) dst += vl;
subprob -= vl;
}
v_adler32_prev_accu = __riscv_vmacc_vx_u32m4(v_adler32_prev_accu, block_size / vl, v_buf32_accu, vl);
v_buf32_accu = __riscv_vwaddu_wv_u32m4(v_buf32_accu, v_buf16_accu, vl);
left -= block_size;
/* do modulo once each block of NMAX size */
if (++cnt >= nmax_limit) {
v_adler32_prev_accu = __riscv_vremu_vx_u32m4(v_adler32_prev_accu, BASE, vl);
cnt = 0;
}
}
/* the left len <= 256 now, we can use 16-bit accum safely */
v_buf16_accu = __riscv_vmv_v_x_u16m2(0, vl);
size_t res = left;
while (left >= vl) {
vuint8m1_t v_buf8 = __riscv_vle8_v_u8m1(src, vl);
if (COPY) __riscv_vse8_v_u8m1(dst, v_buf8, vl);
v_adler32_prev_accu = __riscv_vwaddu_wv_u32m4(v_adler32_prev_accu, v_buf16_accu, vl);
v_buf16_accu = __riscv_vwaddu_wv_u16m2(v_buf16_accu, v_buf8, vl);
src += vl;
if (COPY) dst += vl;
left -= vl;
}
v_adler32_prev_accu = __riscv_vmacc_vx_u32m4(v_adler32_prev_accu, res / vl, v_buf32_accu, vl);
v_adler32_prev_accu = __riscv_vremu_vx_u32m4(v_adler32_prev_accu, BASE, vl);
v_buf32_accu = __riscv_vwaddu_wv_u32m4(v_buf32_accu, v_buf16_accu, vl);
vuint32m4_t v_seq = __riscv_vid_v_u32m4(vl);
vuint32m4_t v_rev_seq = __riscv_vrsub_vx_u32m4(v_seq, vl, vl);
vuint32m4_t v_sum32_accu = __riscv_vmul_vv_u32m4(v_buf32_accu, v_rev_seq, vl);
v_sum32_accu = __riscv_vadd_vv_u32m4(v_sum32_accu, __riscv_vmul_vx_u32m4(v_adler32_prev_accu, vl, vl), vl);
vuint32m1_t v_sum2_sum = __riscv_vmv_s_x_u32m1(0, vl);
v_sum2_sum = __riscv_vredsum_vs_u32m4_u32m1(v_sum32_accu, v_sum2_sum, vl);
uint32_t sum2_sum = __riscv_vmv_x_s_u32m1_u32(v_sum2_sum);
sum2 += (sum2_sum + adler * (len - left));
vuint32m1_t v_adler_sum = __riscv_vmv_s_x_u32m1(0, vl);
v_adler_sum = __riscv_vredsum_vs_u32m4_u32m1(v_buf32_accu, v_adler_sum, vl);
uint32_t adler_sum = __riscv_vmv_x_s_u32m1_u32(v_adler_sum);
adler += adler_sum;
while (left--) {
if (COPY) *dst++ = *src;
adler += *src++;
sum2 += adler;
}
sum2 %= BASE;
adler %= BASE;
return adler | (sum2 << 16);
}
Z_INTERNAL uint32_t adler32_fold_copy_rvv(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
return adler32_rvv_impl(adler, dst, src, len, 1);
}
Z_INTERNAL uint32_t adler32_rvv(uint32_t adler, const uint8_t *buf, size_t len) {
return adler32_rvv_impl(adler, NULL, buf, len, 0);
}
#endif // RISCV_RVV
3p-zlib-ng-main/zlib-ng/arch/riscv/chunkset_rvv.c 0000664 0000000 0000000 00000010115 14553115624 0022160 0 ustar 00root root 0000000 0000000 /* chunkset_rvv.c - RVV version of chunkset
* Copyright (C) 2023 SiFive, Inc. All rights reserved.
* Contributed by Alex Chiang
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include
#include "zbuild.h"
/*
* RISC-V glibc would enable RVV optimized memcpy at runtime by IFUNC,
* so we prefer using large size chunk and copy memory as much as possible.
*/
#define CHUNK_SIZE 32
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
#define CHUNK_MEMSET_RVV_IMPL(elen) \
do { \
size_t vl, len = CHUNK_SIZE / sizeof(uint##elen##_t); \
uint##elen##_t val = *(uint##elen##_t*)from; \
uint##elen##_t* chunk_p = (uint##elen##_t*)chunk; \
do { \
vl = __riscv_vsetvl_e##elen##m4(len); \
vuint##elen##m4_t v_val = __riscv_vmv_v_x_u##elen##m4(val, vl); \
__riscv_vse##elen##_v_u##elen##m4(chunk_p, v_val, vl); \
len -= vl; chunk_p += vl; \
} while (len > 0); \
} while (0)
/* We don't have a 32-byte datatype for RISC-V arch. */
typedef struct chunk_s {
uint64_t data[4];
} chunk_t;
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
CHUNK_MEMSET_RVV_IMPL(16);
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
CHUNK_MEMSET_RVV_IMPL(32);
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
CHUNK_MEMSET_RVV_IMPL(64);
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
memcpy(chunk->data, (uint8_t *)s, CHUNK_SIZE);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
memcpy(out, chunk->data, CHUNK_SIZE);
}
#define CHUNKSIZE chunksize_rvv
#define CHUNKCOPY chunkcopy_rvv
#define CHUNKUNROLL chunkunroll_rvv
#define CHUNKMEMSET chunkmemset_rvv
#define CHUNKMEMSET_SAFE chunkmemset_safe_rvv
#define HAVE_CHUNKCOPY
/*
* Assuming that the length is non-zero, and that `from` lags `out` by at least
* sizeof chunk_t bytes, please see the comments in chunkset_tpl.h.
*
* We load/store a single chunk once in the `CHUNKCOPY`.
* However, RISC-V glibc would enable RVV optimized memcpy at runtime by IFUNC,
* such that, we prefer copy large memory size once to make good use of the the RVV advance.
*
* To be aligned to the other platforms, we didn't modify `CHUNKCOPY` method a lot,
* but we still copy as much memory as possible for some conditions.
*
* case 1: out - from >= len (no overlap)
* We can use memcpy to copy `len` size once
* because the memory layout would be the same.
*
* case 2: overlap
* We copy N chunks using memcpy at once, aiming to achieve our goal:
* to copy as much memory as possible.
*
* After using a single memcpy to copy N chunks, we have to use series of
* loadchunk and storechunk to ensure the result is correct.
*/
static inline uint8_t* CHUNKCOPY(uint8_t *out, uint8_t const *from, unsigned len) {
Assert(len > 0, "chunkcopy should never have a length 0");
int32_t align = ((len - 1) % sizeof(chunk_t)) + 1;
memcpy(out, from, sizeof(chunk_t));
out += align;
from += align;
len -= align;
ptrdiff_t dist = out - from;
if (dist >= len) {
memcpy(out, from, len);
out += len;
from += len;
return out;
}
if (dist >= sizeof(chunk_t)) {
dist = (dist / sizeof(chunk_t)) * sizeof(chunk_t);
memcpy(out, from, dist);
out += dist;
from += dist;
len -= dist;
}
while (len > 0) {
memcpy(out, from, sizeof(chunk_t));
out += sizeof(chunk_t);
from += sizeof(chunk_t);
len -= sizeof(chunk_t);
}
return out;
}
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_rvv
#include "inffast_tpl.h"
3p-zlib-ng-main/zlib-ng/arch/riscv/compare256_rvv.c 0000664 0000000 0000000 00000002534 14553115624 0022225 0 ustar 00root root 0000000 0000000 /* compare256_rvv.c - RVV version of compare256
* Copyright (C) 2023 SiFive, Inc. All rights reserved.
* Contributed by Alex Chiang
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef RISCV_RVV
#include "../../zbuild.h"
#include "fallback_builtins.h"
#include
static inline uint32_t compare256_rvv_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
size_t vl;
long found_diff;
do {
vl = __riscv_vsetvl_e8m4(256 - len);
vuint8m4_t v_src0 = __riscv_vle8_v_u8m4(src0, vl);
vuint8m4_t v_src1 = __riscv_vle8_v_u8m4(src1, vl);
vbool2_t v_mask = __riscv_vmsne_vv_u8m4_b2(v_src0, v_src1, vl);
found_diff = __riscv_vfirst_m_b2(v_mask, vl);
if (found_diff >= 0)
return len + (uint32_t)found_diff;
src0 += vl, src1 += vl, len += vl;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_rvv(const uint8_t *src0, const uint8_t *src1) {
return compare256_rvv_static(src0, src1);
}
#define LONGEST_MATCH longest_match_rvv
#define COMPARE256 compare256_rvv_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_rvv
#define COMPARE256 compare256_rvv_static
#include "match_tpl.h"
#endif // RISCV_RVV
3p-zlib-ng-main/zlib-ng/arch/riscv/riscv_features.c 0000664 0000000 0000000 00000002220 14553115624 0022461 0 ustar 00root root 0000000 0000000 #include
#include
#include
#include
#include
#include "../../zbuild.h"
#include "riscv_features.h"
#define ISA_V_HWCAP (1 << ('v' - 'a'))
int Z_INTERNAL is_kernel_version_greater_or_equal_to_6_5() {
struct utsname buffer;
uname(&buffer);
int major, minor;
if (sscanf(buffer.release, "%d.%d", &major, &minor) != 2) {
// Something bad with uname()
return 0;
}
if (major > 6 || major == 6 && minor >= 5)
return 1;
return 0;
}
void Z_INTERNAL riscv_check_features_compile_time(struct riscv_cpu_features *features) {
#if defined(__riscv_v) && defined(__linux__)
features->has_rvv = 1;
#else
features->has_rvv = 0;
#endif
}
void Z_INTERNAL riscv_check_features_runtime(struct riscv_cpu_features *features) {
unsigned long hw_cap = getauxval(AT_HWCAP);
features->has_rvv = hw_cap & ISA_V_HWCAP;
}
void Z_INTERNAL riscv_check_features(struct riscv_cpu_features *features) {
if (is_kernel_version_greater_or_equal_to_6_5())
riscv_check_features_runtime(features);
else
riscv_check_features_compile_time(features);
}
3p-zlib-ng-main/zlib-ng/arch/riscv/riscv_features.h 0000664 0000000 0000000 00000000653 14553115624 0022476 0 ustar 00root root 0000000 0000000 /* riscv_features.h -- check for riscv features.
*
* Copyright (C) 2023 SiFive, Inc. All rights reserved.
* Contributed by Alex Chiang
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef RISCV_H_
#define RISCV_H_
struct riscv_cpu_features {
int has_rvv;
};
void Z_INTERNAL riscv_check_features(struct riscv_cpu_features *features);
#endif /* RISCV_H_ */
3p-zlib-ng-main/zlib-ng/arch/riscv/slide_hash_rvv.c 0000664 0000000 0000000 00000002064 14553115624 0022443 0 ustar 00root root 0000000 0000000 /* slide_hash_rvv.c - RVV version of slide_hash
* Copyright (C) 2023 SiFive, Inc. All rights reserved.
* Contributed by Alex Chiang
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef RISCV_RVV
#include
#include "../../zbuild.h"
#include "../../deflate.h"
static inline void slide_hash_chain(Pos *table, uint32_t entries, uint16_t wsize) {
size_t vl;
while (entries > 0) {
vl = __riscv_vsetvl_e16m4(entries);
vuint16m4_t v_tab = __riscv_vle16_v_u16m4(table, vl);
vuint16m4_t v_diff = __riscv_vsub_vx_u16m4(v_tab, wsize, vl);
vbool4_t mask = __riscv_vmsltu_vx_u16m4_b4(v_tab, wsize, vl);
v_tab = __riscv_vmerge_vxm_u16m4(v_diff, 0, mask, vl);
__riscv_vse16_v_u16m4(table, v_tab, vl);
table += vl, entries -= vl;
}
}
Z_INTERNAL void slide_hash_rvv(deflate_state *s) {
uint16_t wsize = (uint16_t)s->w_size;
slide_hash_chain(s->head, HASH_SIZE, wsize);
slide_hash_chain(s->prev, wsize, wsize);
}
#endif // RISCV_RVV
3p-zlib-ng-main/zlib-ng/arch/s390/ 0000775 0000000 0000000 00000000000 14553115624 0016645 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/s390/Makefile.in 0000664 0000000 0000000 00000002326 14553115624 0020715 0 ustar 00root root 0000000 0000000 # Makefile for zlib-ng
# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
CC=
CFLAGS=
SFLAGS=
INCLUDES=
SUFFIX=
VGFMAFLAG=
NOLTOFLAG=
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
s390_features.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/s390_features.c
s390_features.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/s390_features.c
dfltcc_common.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_common.c
dfltcc_common.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_common.c
dfltcc_deflate.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_deflate.c
dfltcc_deflate.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_deflate.c
dfltcc_inflate.o:
$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_inflate.c
dfltcc_inflate.lo:
$(CC) $(SFLAGS) $(INCLUDES) -c -o $@ $(SRCDIR)/dfltcc_inflate.c
crc32-vx.o:
$(CC) $(CFLAGS) $(VGFMAFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32-vx.c
crc32-vx.lo:
$(CC) $(SFLAGS) $(VGFMAFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32-vx.c
mostlyclean: clean
clean:
rm -f *.o *.lo *~
rm -rf objs
rm -f *.gcda *.gcno *.gcov
distclean: clean
rm -f Makefile
3p-zlib-ng-main/zlib-ng/arch/s390/README.md 0000664 0000000 0000000 00000027402 14553115624 0020131 0 ustar 00root root 0000000 0000000 # Introduction
This directory contains SystemZ deflate hardware acceleration support.
It can be enabled using the following build commands:
$ ./configure --with-dfltcc-deflate --with-dfltcc-inflate
$ make
or
$ cmake -DWITH_DFLTCC_DEFLATE=1 -DWITH_DFLTCC_INFLATE=1 .
$ make
When built like this, zlib-ng would compress using hardware on level 1,
and using software on all other levels. Decompression will always happen
in hardware. In order to enable hardware compression for levels 1-6
(i.e. to make it used by default) one could add
`-DDFLTCC_LEVEL_MASK=0x7e` to CFLAGS when building zlib-ng.
SystemZ deflate hardware acceleration is available on [IBM z15](
https://www.ibm.com/products/z15) and newer machines under the name [
"Integrated Accelerator for zEnterprise Data Compression"](
https://www.ibm.com/support/z-content-solutions/compression/). The
programming interface to it is a machine instruction called DEFLATE
CONVERSION CALL (DFLTCC). It is documented in Chapter 26 of [Principles
of Operation](https://publibfp.dhe.ibm.com/epubs/pdf/a227832c.pdf). Both
the code and the rest of this document refer to this feature simply as
"DFLTCC".
# Performance
Performance figures are published [here](
https://github.com/iii-i/zlib-ng/wiki/Performance-with-dfltcc-patch-applied-and-dfltcc-support-built-on-dfltcc-enabled-machine
). The compression speed-up can be as high as 110x and the decompression
speed-up can be as high as 15x.
# Limitations
Two DFLTCC compression calls with identical inputs are not guaranteed to
produce identical outputs. Therefore care should be taken when using
hardware compression when reproducible results are desired. In
particular, zlib-ng-specific `zng_deflateSetParams` call allows setting
`Z_DEFLATE_REPRODUCIBLE` parameter, which disables DFLTCC support for a
particular stream.
DFLTCC does not support every single zlib-ng feature, in particular:
* `inflate(Z_BLOCK)` and `inflate(Z_TREES)`
* `inflateMark()`
* `inflatePrime()`
* `inflateSyncPoint()`
When used, these functions will either switch to software, or, in case
this is not possible, gracefully fail.
# Code structure
All SystemZ-specific code lives in `arch/s390` directory and is
integrated with the rest of zlib-ng using hook macros.
## Hook macros
DFLTCC takes as arguments a parameter block, an input buffer, an output
buffer and a window. `ZALLOC_DEFLATE_STATE()`, `ZALLOC_INFLATE_STATE()`,
`ZFREE_STATE()`, `ZCOPY_DEFLATE_STATE()`, `ZCOPY_INFLATE_STATE()`,
`ZALLOC_WINDOW()`, `ZCOPY_WINDOW()` and `TRY_FREE_WINDOW()` macros encapsulate
allocation details for the parameter block (which is allocated alongside
zlib-ng state) and the window (which must be page-aligned and large enough).
Software and hardware window formats do not match, therefore,
`deflateSetDictionary()`, `deflateGetDictionary()`, `inflateSetDictionary()`
and `inflateGetDictionary()` need special handling, which is triggered using
`DEFLATE_SET_DICTIONARY_HOOK()`, `DEFLATE_GET_DICTIONARY_HOOK()`,
`INFLATE_SET_DICTIONARY_HOOK()` and `INFLATE_GET_DICTIONARY_HOOK()` macros.
`deflateResetKeep()` and `inflateResetKeep()` update the DFLTCC
parameter block using `DEFLATE_RESET_KEEP_HOOK()` and
`INFLATE_RESET_KEEP_HOOK()` macros.
`INFLATE_PRIME_HOOK()`, `INFLATE_MARK_HOOK()` and
`INFLATE_SYNC_POINT_HOOK()` macros make the respective unsupported
calls gracefully fail.
`DEFLATE_PARAMS_HOOK()` implements switching between hardware and
software compression mid-stream using `deflateParams()`. Switching
normally entails flushing the current block, which might not be possible
in low memory situations. `deflateParams()` uses `DEFLATE_DONE()` hook
in order to detect and gracefully handle such situations.
The algorithm implemented in hardware has different compression ratio
than the one implemented in software. `DEFLATE_BOUND_ADJUST_COMPLEN()`
and `DEFLATE_NEED_CONSERVATIVE_BOUND()` macros make `deflateBound()`
return the correct results for the hardware implementation.
Actual compression and decompression are handled by `DEFLATE_HOOK()` and
`INFLATE_TYPEDO_HOOK()` macros. Since inflation with DFLTCC manages the
window on its own, calling `updatewindow()` is suppressed using
`INFLATE_NEED_UPDATEWINDOW()` macro.
In addition to compression, DFLTCC computes CRC-32 and Adler-32
checksums, therefore, whenever it's used, software checksumming is
suppressed using `DEFLATE_NEED_CHECKSUM()` and `INFLATE_NEED_CHECKSUM()`
macros.
While software always produces reproducible compression results, this
is not the case for DFLTCC. Therefore, zlib-ng users are given the
ability to specify whether or not reproducible compression results
are required. While it is always possible to specify this setting
before the compression begins, it is not always possible to do so in
the middle of a deflate stream - the exact conditions for that are
determined by `DEFLATE_CAN_SET_REPRODUCIBLE()` macro.
## SystemZ-specific code
When zlib-ng is built with DFLTCC, the hooks described above are
converted to calls to functions, which are implemented in
`arch/s390/dfltcc_*` files. The functions can be grouped in three broad
categories:
* Base DFLTCC support, e.g. wrapping the machine instruction -
`dfltcc()` and allocating aligned memory - `dfltcc_alloc_state()`.
* Translating between software and hardware data formats, e.g.
`dfltcc_deflate_set_dictionary()`.
* Translating between software and hardware state machines, e.g.
`dfltcc_deflate()` and `dfltcc_inflate()`.
The functions from the first two categories are fairly simple, however,
various quirks in both software and hardware state machines make the
functions from the third category quite complicated.
### `dfltcc_deflate()` function
This function is called by `deflate()` and has the following
responsibilities:
* Checking whether DFLTCC can be used with the current stream. If this
is not the case, then it returns `0`, making `deflate()` use some
other function in order to compress in software. Otherwise it returns
`1`.
* Block management and Huffman table generation. DFLTCC ends blocks only
when explicitly instructed to do so by the software. Furthermore,
whether to use fixed or dynamic Huffman tables must also be determined
by the software. Since looking at data in order to gather statistics
would negate performance benefits, the following approach is used: the
first `DFLTCC_FIRST_FHT_BLOCK_SIZE` bytes are placed into a fixed
block, and every next `DFLTCC_BLOCK_SIZE` bytes are placed into
dynamic blocks.
* Writing EOBS. Block Closing Control bit in the parameter block
instructs DFLTCC to write EOBS, however, certain conditions need to be
met: input data length must be non-zero or Continuation Flag must be
set. To put this in simpler terms, DFLTCC will silently refuse to
write EOBS if this is the only thing that it is asked to do. Since the
code has to be able to emit EOBS in software anyway, in order to avoid
tricky corner cases Block Closing Control is never used. Whether to
write EOBS is instead controlled by `soft_bcc` variable.
* Triggering block post-processing. Depending on flush mode, `deflate()`
must perform various additional actions when a block or a stream ends.
`dfltcc_deflate()` informs `deflate()` about this using
`block_state *result` parameter.
* Converting software state fields into hardware parameter block fields,
and vice versa. For example, `wrap` and Check Value Type or `bi_valid`
and Sub-Byte Boundary. Certain fields cannot be translated and must
persist untouched in the parameter block between calls, for example,
Continuation Flag or Continuation State Buffer.
* Handling flush modes and low-memory situations. These aspects are
quite intertwined and pervasive. The general idea here is that the
code must not do anything in software - whether explicitly by e.g.
calling `send_eobs()`, or implicitly - by returning to `deflate()`
with certain return and `*result` values, when Continuation Flag is
set.
* Ending streams. When a new block is started and flush mode is
`Z_FINISH`, Block Header Final parameter block bit is used to mark
this block as final. However, sometimes an empty final block is
needed, and, unfortunately, just like with EOBS, DFLTCC will silently
refuse to do this. The general idea of DFLTCC implementation is to
rely as much as possible on the existing code. Here in order to do
this, the code pretends that it does not support DFLTCC, which makes
`deflate()` call a software compression function, which writes an
empty final block. Whether this is required is controlled by
`need_empty_block` variable.
* Error handling. This is simply converting
Operation-Ending-Supplemental Code to string. Errors can only happen
due to things like memory corruption, and therefore they don't affect
the `deflate()` return code.
### `dfltcc_inflate()` function
This function is called by `inflate()` from the `TYPEDO` state (that is,
when all the metadata is parsed and the stream is positioned at the type
bits of deflate block header) and it's responsible for the following:
* Falling back to software when flush mode is `Z_BLOCK` or `Z_TREES`.
Unfortunately, there is no way to ask DFLTCC to stop decompressing on
block or tree boundary.
* `inflate()` decompression loop management. This is controlled using
the return value, which can be either `DFLTCC_INFLATE_BREAK` or
`DFLTCC_INFLATE_CONTINUE`.
* Converting software state fields into hardware parameter block fields,
and vice versa. For example, `whave` and History Length or `wnext` and
History Offset.
* Ending streams. This instructs `inflate()` to return `Z_STREAM_END`
and is controlled by `last` state field.
* Error handling. Like deflate, error handling comprises
Operation-Ending-Supplemental Code to string conversion. Unlike
deflate, errors may happen due to bad inputs, therefore they are
propagated to `inflate()` by setting `mode` field to `MEM` or `BAD`.
# Testing
Given complexity of DFLTCC machine instruction, it is not clear whether
QEMU TCG will ever support it. At the time of writing, one has to have
access to an IBM z15+ VM or LPAR in order to test DFLTCC support. Since
DFLTCC is a non-privileged instruction, neither special VM/LPAR
configuration nor root are required.
zlib-ng CI uses an IBM-provided z15 self-hosted builder for the DFLTCC
testing. There are no IBM Z builds of GitHub Actions runner, and
stable qemu-user has problems with .NET apps, so the builder runs the
x86_64 runner version with qemu-user built from the master branch.
## Configuring the builder.
### Install prerequisites.
```
$ sudo dnf install docker
```
### Add services.
```
$ sudo cp self-hosted-builder/*.service /etc/systemd/system/
$ sudo systemctl daemon-reload
```
### Create a config file.
```
$ sudo tee /etc/actions-runner
repo=/
access_token=
```
Access token should have the repo scope, consult
https://docs.github.com/en/rest/reference/actions#create-a-registration-token-for-a-repository
for details.
### Autostart the x86_64 emulation support.
```
$ sudo systemctl enable --now qemu-user-static
```
### Autostart the runner.
```
$ sudo systemctl enable --now actions-runner
```
## Rebuilding the image
In order to update the `iiilinuxibmcom/actions-runner` image, e.g. to get the
latest OS security fixes, use the following commands:
```
$ sudo docker build \
--pull \
-f self-hosted-builder/actions-runner.Dockerfile \
-t iiilinuxibmcom/actions-runner
$ sudo systemctl restart actions-runner
```
## Removing persistent data
The `actions-runner` service stores various temporary data, such as runner
registration information, work directories and logs, in the `actions-runner`
volume. In order to remove it and start from scratch, e.g. when switching the
runner to a different repository, use the following commands:
```
$ sudo systemctl stop actions-runner
$ sudo docker rm -f actions-runner
$ sudo docker volume rm actions-runner
```
3p-zlib-ng-main/zlib-ng/arch/s390/crc32-vx.c 0000664 0000000 0000000 00000020657 14553115624 0020372 0 ustar 00root root 0000000 0000000 /*
* Hardware-accelerated CRC-32 variants for Linux on z Systems
*
* Use the z/Architecture Vector Extension Facility to accelerate the
* computing of bitreflected CRC-32 checksums.
*
* This CRC-32 implementation algorithm is bitreflected and processes
* the least-significant bit first (Little-Endian).
*
* This code was originally written by Hendrik Brueckner
* for use in the Linux kernel and has been
* relicensed under the zlib license.
*/
#include "../../zbuild.h"
#include "crc32_braid_p.h"
#include
typedef unsigned char uv16qi __attribute__((vector_size(16)));
typedef unsigned int uv4si __attribute__((vector_size(16)));
typedef unsigned long long uv2di __attribute__((vector_size(16)));
static uint32_t crc32_le_vgfm_16(uint32_t crc, const uint8_t *buf, size_t len) {
/*
* The CRC-32 constant block contains reduction constants to fold and
* process particular chunks of the input data stream in parallel.
*
* For the CRC-32 variants, the constants are precomputed according to
* these definitions:
*
* R1 = [(x4*128+32 mod P'(x) << 32)]' << 1
* R2 = [(x4*128-32 mod P'(x) << 32)]' << 1
* R3 = [(x128+32 mod P'(x) << 32)]' << 1
* R4 = [(x128-32 mod P'(x) << 32)]' << 1
* R5 = [(x64 mod P'(x) << 32)]' << 1
* R6 = [(x32 mod P'(x) << 32)]' << 1
*
* The bitreflected Barret reduction constant, u', is defined as
* the bit reversal of floor(x**64 / P(x)).
*
* where P(x) is the polynomial in the normal domain and the P'(x) is the
* polynomial in the reversed (bitreflected) domain.
*
* CRC-32 (IEEE 802.3 Ethernet, ...) polynomials:
*
* P(x) = 0x04C11DB7
* P'(x) = 0xEDB88320
*/
const uv16qi perm_le2be = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; /* BE->LE mask */
const uv2di r2r1 = {0x1C6E41596, 0x154442BD4}; /* R2, R1 */
const uv2di r4r3 = {0x0CCAA009E, 0x1751997D0}; /* R4, R3 */
const uv2di r5 = {0, 0x163CD6124}; /* R5 */
const uv2di ru_poly = {0, 0x1F7011641}; /* u' */
const uv2di crc_poly = {0, 0x1DB710641}; /* P'(x) << 1 */
/*
* Load the initial CRC value.
*
* The CRC value is loaded into the rightmost word of the
* vector register and is later XORed with the LSB portion
* of the loaded input data.
*/
uv2di v0 = {0, 0};
v0 = (uv2di)vec_insert(crc, (uv4si)v0, 3);
/* Load a 64-byte data chunk and XOR with CRC */
uv2di v1 = vec_perm(((uv2di *)buf)[0], ((uv2di *)buf)[0], perm_le2be);
uv2di v2 = vec_perm(((uv2di *)buf)[1], ((uv2di *)buf)[1], perm_le2be);
uv2di v3 = vec_perm(((uv2di *)buf)[2], ((uv2di *)buf)[2], perm_le2be);
uv2di v4 = vec_perm(((uv2di *)buf)[3], ((uv2di *)buf)[3], perm_le2be);
v1 ^= v0;
buf += 64;
len -= 64;
while (len >= 64) {
/* Load the next 64-byte data chunk */
uv16qi part1 = vec_perm(((uv16qi *)buf)[0], ((uv16qi *)buf)[0], perm_le2be);
uv16qi part2 = vec_perm(((uv16qi *)buf)[1], ((uv16qi *)buf)[1], perm_le2be);
uv16qi part3 = vec_perm(((uv16qi *)buf)[2], ((uv16qi *)buf)[2], perm_le2be);
uv16qi part4 = vec_perm(((uv16qi *)buf)[3], ((uv16qi *)buf)[3], perm_le2be);
/*
* Perform a GF(2) multiplication of the doublewords in V1 with
* the R1 and R2 reduction constants in V0. The intermediate result
* is then folded (accumulated) with the next data chunk in PART1 and
* stored in V1. Repeat this step for the register contents
* in V2, V3, and V4 respectively.
*/
v1 = (uv2di)vec_gfmsum_accum_128(r2r1, v1, part1);
v2 = (uv2di)vec_gfmsum_accum_128(r2r1, v2, part2);
v3 = (uv2di)vec_gfmsum_accum_128(r2r1, v3, part3);
v4 = (uv2di)vec_gfmsum_accum_128(r2r1, v4, part4);
buf += 64;
len -= 64;
}
/*
* Fold V1 to V4 into a single 128-bit value in V1. Multiply V1 with R3
* and R4 and accumulating the next 128-bit chunk until a single 128-bit
* value remains.
*/
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2);
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v3);
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v4);
while (len >= 16) {
/* Load next data chunk */
v2 = vec_perm(*(uv2di *)buf, *(uv2di *)buf, perm_le2be);
/* Fold next data chunk */
v1 = (uv2di)vec_gfmsum_accum_128(r4r3, v1, (uv16qi)v2);
buf += 16;
len -= 16;
}
/*
* Set up a vector register for byte shifts. The shift value must
* be loaded in bits 1-4 in byte element 7 of a vector register.
* Shift by 8 bytes: 0x40
* Shift by 4 bytes: 0x20
*/
uv16qi v9 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
v9 = vec_insert((unsigned char)0x40, v9, 7);
/*
* Prepare V0 for the next GF(2) multiplication: shift V0 by 8 bytes
* to move R4 into the rightmost doubleword and set the leftmost
* doubleword to 0x1.
*/
v0 = vec_srb(r4r3, (uv2di)v9);
v0[0] = 1;
/*
* Compute GF(2) product of V1 and V0. The rightmost doubleword
* of V1 is multiplied with R4. The leftmost doubleword of V1 is
* multiplied by 0x1 and is then XORed with rightmost product.
* Implicitly, the intermediate leftmost product becomes padded
*/
v1 = (uv2di)vec_gfmsum_128(v0, v1);
/*
* Now do the final 32-bit fold by multiplying the rightmost word
* in V1 with R5 and XOR the result with the remaining bits in V1.
*
* To achieve this by a single VGFMAG, right shift V1 by a word
* and store the result in V2 which is then accumulated. Use the
* vector unpack instruction to load the rightmost half of the
* doubleword into the rightmost doubleword element of V1; the other
* half is loaded in the leftmost doubleword.
* The vector register with CONST_R5 contains the R5 constant in the
* rightmost doubleword and the leftmost doubleword is zero to ignore
* the leftmost product of V1.
*/
v9 = vec_insert((unsigned char)0x20, v9, 7);
v2 = vec_srb(v1, (uv2di)v9);
v1 = vec_unpackl((uv4si)v1); /* Split rightmost doubleword */
v1 = (uv2di)vec_gfmsum_accum_128(r5, v1, (uv16qi)v2);
/*
* Apply a Barret reduction to compute the final 32-bit CRC value.
*
* The input values to the Barret reduction are the degree-63 polynomial
* in V1 (R(x)), degree-32 generator polynomial, and the reduction
* constant u. The Barret reduction result is the CRC value of R(x) mod
* P(x).
*
* The Barret reduction algorithm is defined as:
*
* 1. T1(x) = floor( R(x) / x^32 ) GF2MUL u
* 2. T2(x) = floor( T1(x) / x^32 ) GF2MUL P(x)
* 3. C(x) = R(x) XOR T2(x) mod x^32
*
* Note: The leftmost doubleword of vector register containing
* CONST_RU_POLY is zero and, thus, the intermediate GF(2) product
* is zero and does not contribute to the final result.
*/
/* T1(x) = floor( R(x) / x^32 ) GF2MUL u */
v2 = vec_unpackl((uv4si)v1);
v2 = (uv2di)vec_gfmsum_128(ru_poly, v2);
/*
* Compute the GF(2) product of the CRC polynomial with T1(x) in
* V2 and XOR the intermediate result, T2(x), with the value in V1.
* The final result is stored in word element 2 of V2.
*/
v2 = vec_unpackl((uv4si)v2);
v2 = (uv2di)vec_gfmsum_accum_128(crc_poly, v2, (uv16qi)v1);
return ((uv4si)v2)[2];
}
#define VX_MIN_LEN 64
#define VX_ALIGNMENT 16L
#define VX_ALIGN_MASK (VX_ALIGNMENT - 1)
uint32_t Z_INTERNAL crc32_s390_vx(uint32_t crc, const unsigned char *buf, size_t len) {
size_t prealign, aligned, remaining;
if (len < VX_MIN_LEN + VX_ALIGN_MASK)
return PREFIX(crc32_braid)(crc, buf, len);
if ((uintptr_t)buf & VX_ALIGN_MASK) {
prealign = VX_ALIGNMENT - ((uintptr_t)buf & VX_ALIGN_MASK);
len -= prealign;
crc = PREFIX(crc32_braid)(crc, buf, prealign);
buf += prealign;
}
aligned = len & ~VX_ALIGN_MASK;
remaining = len & VX_ALIGN_MASK;
crc = crc32_le_vgfm_16(crc ^ 0xffffffff, buf, aligned) ^ 0xffffffff;
if (remaining)
crc = PREFIX(crc32_braid)(crc, buf + aligned, remaining);
return crc;
}
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_common.c 0000664 0000000 0000000 00000002421 14553115624 0021617 0 ustar 00root root 0000000 0000000 /* dfltcc_deflate.c - IBM Z DEFLATE CONVERSION CALL general support. */
#include "zbuild.h"
#include "dfltcc_common.h"
#include "dfltcc_detail.h"
/*
Memory management.
DFLTCC requires parameter blocks and window to be aligned. zlib-ng allows
users to specify their own allocation functions, so using e.g.
`posix_memalign' is not an option. Thus, we overallocate and take the
aligned portion of the buffer.
*/
static const int PAGE_ALIGN = 0x1000;
void Z_INTERNAL *PREFIX(dfltcc_alloc_window)(PREFIX3(streamp) strm, uInt items, uInt size) {
void *p;
void *w;
/* To simplify freeing, we store the pointer to the allocated buffer right
* before the window. Note that DFLTCC always uses HB_SIZE bytes.
*/
p = ZALLOC(strm, sizeof(void *) + MAX(items * size, HB_SIZE) + PAGE_ALIGN, sizeof(unsigned char));
if (p == NULL)
return NULL;
w = ALIGN_UP((char *)p + sizeof(void *), PAGE_ALIGN);
*(void **)((char *)w - sizeof(void *)) = p;
return w;
}
void Z_INTERNAL PREFIX(dfltcc_copy_window)(void *dest, const void *src, size_t n) {
memcpy(dest, src, MAX(n, HB_SIZE));
}
void Z_INTERNAL PREFIX(dfltcc_free_window)(PREFIX3(streamp) strm, void *w) {
if (w)
ZFREE(strm, *(void **)((unsigned char *)w - sizeof(void *)));
}
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_common.h 0000664 0000000 0000000 00000002536 14553115624 0021633 0 ustar 00root root 0000000 0000000 #ifndef DFLTCC_COMMON_H
#define DFLTCC_COMMON_H
#include "zutil.h"
void Z_INTERNAL *PREFIX(dfltcc_alloc_window)(PREFIX3(streamp) strm, uInt items, uInt size);
void Z_INTERNAL PREFIX(dfltcc_copy_window)(void *dest, const void *src, size_t n);
void Z_INTERNAL PREFIX(dfltcc_free_window)(PREFIX3(streamp) strm, void *w);
#define ZFREE_STATE ZFREE
#define ZALLOC_WINDOW PREFIX(dfltcc_alloc_window)
#define ZCOPY_WINDOW PREFIX(dfltcc_copy_window)
#define ZFREE_WINDOW PREFIX(dfltcc_free_window)
#define TRY_FREE_WINDOW PREFIX(dfltcc_free_window)
#define DFLTCC_BLOCK_HEADER_BITS 3
#define DFLTCC_HLITS_COUNT_BITS 5
#define DFLTCC_HDISTS_COUNT_BITS 5
#define DFLTCC_HCLENS_COUNT_BITS 4
#define DFLTCC_MAX_HCLENS 19
#define DFLTCC_HCLEN_BITS 3
#define DFLTCC_MAX_HLITS 286
#define DFLTCC_MAX_HDISTS 30
#define DFLTCC_MAX_HLIT_HDIST_BITS 7
#define DFLTCC_MAX_SYMBOL_BITS 16
#define DFLTCC_MAX_EOBS_BITS 15
#define DFLTCC_MAX_PADDING_BITS 7
#define DEFLATE_BOUND_COMPLEN(source_len) \
((DFLTCC_BLOCK_HEADER_BITS + \
DFLTCC_HLITS_COUNT_BITS + \
DFLTCC_HDISTS_COUNT_BITS + \
DFLTCC_HCLENS_COUNT_BITS + \
DFLTCC_MAX_HCLENS * DFLTCC_HCLEN_BITS + \
(DFLTCC_MAX_HLITS + DFLTCC_MAX_HDISTS) * DFLTCC_MAX_HLIT_HDIST_BITS + \
(source_len) * DFLTCC_MAX_SYMBOL_BITS + \
DFLTCC_MAX_EOBS_BITS + \
DFLTCC_MAX_PADDING_BITS) >> 3)
#endif
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_deflate.c 0000664 0000000 0000000 00000035664 14553115624 0021752 0 ustar 00root root 0000000 0000000 /* dfltcc_deflate.c - IBM Z DEFLATE CONVERSION CALL compression support. */
/*
Use the following commands to build zlib-ng with DFLTCC compression support:
$ ./configure --with-dfltcc-deflate
or
$ cmake -DWITH_DFLTCC_DEFLATE=1 .
and then
$ make
*/
#include "zbuild.h"
#include "deflate.h"
#include "trees_emit.h"
#include "dfltcc_deflate.h"
#include "dfltcc_detail.h"
struct dfltcc_deflate_state {
struct dfltcc_state common;
uint16_t level_mask; /* Levels on which to use DFLTCC */
uint32_t block_size; /* New block each X bytes */
size_t block_threshold; /* New block after total_in > X */
uint32_t dht_threshold; /* New block only if avail_in >= X */
};
#define GET_DFLTCC_DEFLATE_STATE(state) ((struct dfltcc_deflate_state *)GET_DFLTCC_STATE(state))
void Z_INTERNAL *PREFIX(dfltcc_alloc_deflate_state)(PREFIX3(streamp) strm) {
return dfltcc_alloc_state(strm, sizeof(deflate_state), sizeof(struct dfltcc_deflate_state));
}
void Z_INTERNAL PREFIX(dfltcc_reset_deflate_state)(PREFIX3(streamp) strm) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_deflate_state *dfltcc_state = GET_DFLTCC_DEFLATE_STATE(state);
dfltcc_reset_state(&dfltcc_state->common);
/* Initialize tuning parameters */
dfltcc_state->level_mask = DFLTCC_LEVEL_MASK;
dfltcc_state->block_size = DFLTCC_BLOCK_SIZE;
dfltcc_state->block_threshold = DFLTCC_FIRST_FHT_BLOCK_SIZE;
dfltcc_state->dht_threshold = DFLTCC_DHT_MIN_SAMPLE_SIZE;
}
void Z_INTERNAL PREFIX(dfltcc_copy_deflate_state)(void *dst, const void *src) {
dfltcc_copy_state(dst, src, sizeof(deflate_state), sizeof(struct dfltcc_deflate_state));
}
static inline int dfltcc_can_deflate_with_params(PREFIX3(streamp) strm, int level, uInt window_bits, int strategy,
int reproducible) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_deflate_state *dfltcc_state = GET_DFLTCC_DEFLATE_STATE(state);
/* Unsupported compression settings */
if ((dfltcc_state->level_mask & (1 << level)) == 0)
return 0;
if (window_bits != HB_BITS)
return 0;
if (strategy != Z_FIXED && strategy != Z_DEFAULT_STRATEGY)
return 0;
if (reproducible)
return 0;
/* Unsupported hardware */
if (!is_bit_set(dfltcc_state->common.af.fns, DFLTCC_GDHT) ||
!is_bit_set(dfltcc_state->common.af.fns, DFLTCC_CMPR) ||
!is_bit_set(dfltcc_state->common.af.fmts, DFLTCC_FMT0))
return 0;
return 1;
}
int Z_INTERNAL PREFIX(dfltcc_can_deflate)(PREFIX3(streamp) strm) {
deflate_state *state = (deflate_state *)strm->state;
return dfltcc_can_deflate_with_params(strm, state->level, state->w_bits, state->strategy, state->reproducible);
}
static inline void dfltcc_gdht(PREFIX3(streamp) strm) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param;
size_t avail_in = strm->avail_in;
dfltcc(DFLTCC_GDHT, param, NULL, NULL, &strm->next_in, &avail_in, NULL);
}
static inline dfltcc_cc dfltcc_cmpr(PREFIX3(streamp) strm) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param;
size_t avail_in = strm->avail_in;
size_t avail_out = strm->avail_out;
dfltcc_cc cc;
cc = dfltcc(DFLTCC_CMPR | HBT_CIRCULAR,
param, &strm->next_out, &avail_out,
&strm->next_in, &avail_in, state->window);
strm->total_in += (strm->avail_in - avail_in);
strm->total_out += (strm->avail_out - avail_out);
strm->avail_in = avail_in;
strm->avail_out = avail_out;
return cc;
}
static inline void send_eobs(PREFIX3(streamp) strm, const struct dfltcc_param_v0 *param) {
deflate_state *state = (deflate_state *)strm->state;
send_bits(state, PREFIX(bi_reverse)(param->eobs >> (15 - param->eobl), param->eobl), param->eobl, state->bi_buf, state->bi_valid);
PREFIX(flush_pending)(strm);
if (state->pending != 0) {
/* The remaining data is located in pending_out[0:pending]. If someone
* calls put_byte() - this might happen in deflate() - the byte will be
* placed into pending_buf[pending], which is incorrect. Move the
* remaining data to the beginning of pending_buf so that put_byte() is
* usable again.
*/
memmove(state->pending_buf, state->pending_out, state->pending);
state->pending_out = state->pending_buf;
}
#ifdef ZLIB_DEBUG
state->compressed_len += param->eobl;
#endif
}
int Z_INTERNAL PREFIX(dfltcc_deflate)(PREFIX3(streamp) strm, int flush, block_state *result) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_deflate_state *dfltcc_state = GET_DFLTCC_DEFLATE_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->common.param;
uInt masked_avail_in;
dfltcc_cc cc;
int need_empty_block;
int soft_bcc;
int no_flush;
if (!PREFIX(dfltcc_can_deflate)(strm)) {
/* Clear history. */
if (flush == Z_FULL_FLUSH)
param->hl = 0;
return 0;
}
again:
masked_avail_in = 0;
soft_bcc = 0;
no_flush = flush == Z_NO_FLUSH;
/* No input data. Return, except when Continuation Flag is set, which means
* that DFLTCC has buffered some output in the parameter block and needs to
* be called again in order to flush it.
*/
if (strm->avail_in == 0 && !param->cf) {
/* A block is still open, and the hardware does not support closing
* blocks without adding data. Thus, close it manually.
*/
if (!no_flush && param->bcf) {
send_eobs(strm, param);
param->bcf = 0;
}
/* Let one of deflate_* functions write a trailing empty block. */
if (flush == Z_FINISH)
return 0;
/* Clear history. */
if (flush == Z_FULL_FLUSH)
param->hl = 0;
/* Trigger block post-processing if necessary. */
*result = no_flush ? need_more : block_done;
return 1;
}
/* There is an open non-BFINAL block, we are not going to close it just
* yet, we have compressed more than DFLTCC_BLOCK_SIZE bytes and we see
* more than DFLTCC_DHT_MIN_SAMPLE_SIZE bytes. Open a new block with a new
* DHT in order to adapt to a possibly changed input data distribution.
*/
if (param->bcf && no_flush &&
strm->total_in > dfltcc_state->block_threshold &&
strm->avail_in >= dfltcc_state->dht_threshold) {
if (param->cf) {
/* We need to flush the DFLTCC buffer before writing the
* End-of-block Symbol. Mask the input data and proceed as usual.
*/
masked_avail_in += strm->avail_in;
strm->avail_in = 0;
no_flush = 0;
} else {
/* DFLTCC buffer is empty, so we can manually write the
* End-of-block Symbol right away.
*/
send_eobs(strm, param);
param->bcf = 0;
dfltcc_state->block_threshold = strm->total_in + dfltcc_state->block_size;
}
}
/* No space for compressed data. If we proceed, dfltcc_cmpr() will return
* DFLTCC_CC_OP1_TOO_SHORT without buffering header bits, but we will still
* set BCF=1, which is wrong. Avoid complications and return early.
*/
if (strm->avail_out == 0) {
*result = need_more;
return 1;
}
/* The caller gave us too much data. Pass only one block worth of
* uncompressed data to DFLTCC and mask the rest, so that on the next
* iteration we start a new block.
*/
if (no_flush && strm->avail_in > dfltcc_state->block_size) {
masked_avail_in += (strm->avail_in - dfltcc_state->block_size);
strm->avail_in = dfltcc_state->block_size;
}
/* When we have an open non-BFINAL deflate block and caller indicates that
* the stream is ending, we need to close an open deflate block and open a
* BFINAL one.
*/
need_empty_block = flush == Z_FINISH && param->bcf && !param->bhf;
/* Translate stream to parameter block */
param->cvt = state->wrap == 2 ? CVT_CRC32 : CVT_ADLER32;
if (!no_flush)
/* We need to close a block. Always do this in software - when there is
* no input data, the hardware will not honor BCC. */
soft_bcc = 1;
if (flush == Z_FINISH && !param->bcf)
/* We are about to open a BFINAL block, set Block Header Final bit
* until the stream ends.
*/
param->bhf = 1;
/* DFLTCC-CMPR will write to next_out, so make sure that buffers with
* higher precedence are empty.
*/
Assert(state->pending == 0, "There must be no pending bytes");
Assert(state->bi_valid < 8, "There must be less than 8 pending bits");
param->sbb = (unsigned int)state->bi_valid;
if (param->sbb > 0)
*strm->next_out = (unsigned char)state->bi_buf;
/* Honor history and check value */
param->nt = 0;
if (state->wrap == 1)
param->cv = strm->adler;
else if (state->wrap == 2)
param->cv = ZSWAP32(state->crc_fold.value);
/* When opening a block, choose a Huffman-Table Type */
if (!param->bcf) {
if (state->strategy == Z_FIXED || (strm->total_in == 0 && dfltcc_state->block_threshold > 0))
param->htt = HTT_FIXED;
else {
param->htt = HTT_DYNAMIC;
dfltcc_gdht(strm);
}
}
/* Deflate */
do {
cc = dfltcc_cmpr(strm);
if (strm->avail_in < 4096 && masked_avail_in > 0)
/* We are about to call DFLTCC with a small input buffer, which is
* inefficient. Since there is masked data, there will be at least
* one more DFLTCC call, so skip the current one and make the next
* one handle more data.
*/
break;
} while (cc == DFLTCC_CC_AGAIN);
/* Translate parameter block to stream */
strm->msg = oesc_msg(dfltcc_state->common.msg, param->oesc);
state->bi_valid = param->sbb;
if (state->bi_valid == 0)
state->bi_buf = 0; /* Avoid accessing next_out */
else
state->bi_buf = *strm->next_out & ((1 << state->bi_valid) - 1);
if (state->wrap == 1)
strm->adler = param->cv;
else if (state->wrap == 2)
state->crc_fold.value = ZSWAP32(param->cv);
/* Unmask the input data */
strm->avail_in += masked_avail_in;
masked_avail_in = 0;
/* If we encounter an error, it means there is a bug in DFLTCC call */
Assert(cc != DFLTCC_CC_OP2_CORRUPT || param->oesc == 0, "BUG");
/* Update Block-Continuation Flag. It will be used to check whether to call
* GDHT the next time.
*/
if (cc == DFLTCC_CC_OK) {
if (soft_bcc) {
send_eobs(strm, param);
param->bcf = 0;
dfltcc_state->block_threshold = strm->total_in + dfltcc_state->block_size;
} else
param->bcf = 1;
if (flush == Z_FINISH) {
if (need_empty_block)
/* Make the current deflate() call also close the stream */
return 0;
else {
bi_windup(state);
*result = finish_done;
}
} else {
if (flush == Z_FULL_FLUSH)
param->hl = 0; /* Clear history */
*result = flush == Z_NO_FLUSH ? need_more : block_done;
}
} else {
param->bcf = 1;
*result = need_more;
}
if (strm->avail_in != 0 && strm->avail_out != 0)
goto again; /* deflate() must use all input or all output */
return 1;
}
/*
Switching between hardware and software compression.
DFLTCC does not support all zlib settings, e.g. generation of non-compressed
blocks or alternative window sizes. When such settings are applied on the
fly with deflateParams, we need to convert between hardware and software
window formats.
*/
static int dfltcc_was_deflate_used(PREFIX3(streamp) strm) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param;
return strm->total_in > 0 || param->nt == 0 || param->hl > 0;
}
int Z_INTERNAL PREFIX(dfltcc_deflate_params)(PREFIX3(streamp) strm, int level, int strategy, int *flush) {
deflate_state *state = (deflate_state *)strm->state;
int could_deflate = PREFIX(dfltcc_can_deflate)(strm);
int can_deflate = dfltcc_can_deflate_with_params(strm, level, state->w_bits, strategy, state->reproducible);
if (can_deflate == could_deflate)
/* We continue to work in the same mode - no changes needed */
return Z_OK;
if (!dfltcc_was_deflate_used(strm))
/* DFLTCC was not used yet - no changes needed */
return Z_OK;
/* For now, do not convert between window formats - simply get rid of the old data instead */
*flush = Z_FULL_FLUSH;
return Z_OK;
}
int Z_INTERNAL PREFIX(dfltcc_deflate_done)(PREFIX3(streamp) strm, int flush) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
/* When deflate(Z_FULL_FLUSH) is called with small avail_out, it might
* close the block without resetting the compression state. Detect this
* situation and return that deflation is not done.
*/
if (flush == Z_FULL_FLUSH && strm->avail_out == 0)
return 0;
/* Return that deflation is not done if DFLTCC is used and either it
* buffered some data (Continuation Flag is set), or has not written EOBS
* yet (Block-Continuation Flag is set).
*/
return !PREFIX(dfltcc_can_deflate)(strm) || (!param->cf && !param->bcf);
}
int Z_INTERNAL PREFIX(dfltcc_can_set_reproducible)(PREFIX3(streamp) strm, int reproducible) {
deflate_state *state = (deflate_state *)strm->state;
return reproducible != state->reproducible && !dfltcc_was_deflate_used(strm);
}
/*
Preloading history.
*/
int Z_INTERNAL PREFIX(dfltcc_deflate_set_dictionary)(PREFIX3(streamp) strm,
const unsigned char *dictionary, uInt dict_length) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
append_history(param, state->window, dictionary, dict_length);
state->strstart = 1; /* Add FDICT to zlib header */
state->block_start = state->strstart; /* Make deflate_stored happy */
return Z_OK;
}
int Z_INTERNAL PREFIX(dfltcc_deflate_get_dictionary)(PREFIX3(streamp) strm, unsigned char *dictionary, uInt *dict_length) {
deflate_state *state = (deflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
if (dictionary)
get_history(param, state->window, dictionary);
if (dict_length)
*dict_length = param->hl;
return Z_OK;
}
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_deflate.h 0000664 0000000 0000000 00000004727 14553115624 0021753 0 ustar 00root root 0000000 0000000 #ifndef DFLTCC_DEFLATE_H
#define DFLTCC_DEFLATE_H
#include "dfltcc_common.h"
void Z_INTERNAL *PREFIX(dfltcc_alloc_deflate_state)(PREFIX3(streamp));
void Z_INTERNAL PREFIX(dfltcc_reset_deflate_state)(PREFIX3(streamp));
void Z_INTERNAL PREFIX(dfltcc_copy_deflate_state)(void *dst, const void *src);
int Z_INTERNAL PREFIX(dfltcc_can_deflate)(PREFIX3(streamp) strm);
int Z_INTERNAL PREFIX(dfltcc_deflate)(PREFIX3(streamp) strm, int flush, block_state *result);
int Z_INTERNAL PREFIX(dfltcc_deflate_params)(PREFIX3(streamp) strm, int level, int strategy, int *flush);
int Z_INTERNAL PREFIX(dfltcc_deflate_done)(PREFIX3(streamp) strm, int flush);
int Z_INTERNAL PREFIX(dfltcc_can_set_reproducible)(PREFIX3(streamp) strm, int reproducible);
int Z_INTERNAL PREFIX(dfltcc_deflate_set_dictionary)(PREFIX3(streamp) strm,
const unsigned char *dictionary, uInt dict_length);
int Z_INTERNAL PREFIX(dfltcc_deflate_get_dictionary)(PREFIX3(streamp) strm, unsigned char *dictionary, uInt* dict_length);
#define ZALLOC_DEFLATE_STATE PREFIX(dfltcc_alloc_deflate_state)
#define ZCOPY_DEFLATE_STATE PREFIX(dfltcc_copy_deflate_state)
#define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \
do { \
if (PREFIX(dfltcc_can_deflate)((strm))) \
return PREFIX(dfltcc_deflate_set_dictionary)((strm), (dict), (dict_len)); \
} while (0)
#define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) \
do { \
if (PREFIX(dfltcc_can_deflate)((strm))) \
return PREFIX(dfltcc_deflate_get_dictionary)((strm), (dict), (dict_len)); \
} while (0)
#define DEFLATE_RESET_KEEP_HOOK PREFIX(dfltcc_reset_deflate_state)
#define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) \
do { \
int err; \
\
err = PREFIX(dfltcc_deflate_params)((strm), (level), (strategy), (hook_flush)); \
if (err == Z_STREAM_ERROR) \
return err; \
} while (0)
#define DEFLATE_DONE PREFIX(dfltcc_deflate_done)
#define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, source_len) \
do { \
if (deflateStateCheck((strm)) || PREFIX(dfltcc_can_deflate)((strm))) \
(complen) = DEFLATE_BOUND_COMPLEN(source_len); \
} while (0)
#define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) (PREFIX(dfltcc_can_deflate)((strm)))
#define DEFLATE_HOOK PREFIX(dfltcc_deflate)
#define DEFLATE_NEED_CHECKSUM(strm) (!PREFIX(dfltcc_can_deflate)((strm)))
#define DEFLATE_CAN_SET_REPRODUCIBLE PREFIX(dfltcc_can_set_reproducible)
#endif
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_detail.h 0000664 0000000 0000000 00000024450 14553115624 0021604 0 ustar 00root root 0000000 0000000 #include "../../zbuild.h"
#include
#ifdef HAVE_SYS_SDT_H
#include
#endif
/*
Tuning parameters.
*/
#ifndef DFLTCC_LEVEL_MASK
#define DFLTCC_LEVEL_MASK 0x2
#endif
#ifndef DFLTCC_BLOCK_SIZE
#define DFLTCC_BLOCK_SIZE 1048576
#endif
#ifndef DFLTCC_FIRST_FHT_BLOCK_SIZE
#define DFLTCC_FIRST_FHT_BLOCK_SIZE 4096
#endif
#ifndef DFLTCC_DHT_MIN_SAMPLE_SIZE
#define DFLTCC_DHT_MIN_SAMPLE_SIZE 4096
#endif
#ifndef DFLTCC_RIBM
#define DFLTCC_RIBM 0
#endif
/*
Parameter Block for Query Available Functions.
*/
#define static_assert(c, msg) __attribute__((unused)) static char static_assert_failed_ ## msg[c ? 1 : -1]
struct dfltcc_qaf_param {
char fns[16];
char reserved1[8];
char fmts[2];
char reserved2[6];
};
#define DFLTCC_SIZEOF_QAF 32
static_assert(sizeof(struct dfltcc_qaf_param) == DFLTCC_SIZEOF_QAF, qaf);
static inline int is_bit_set(const char *bits, int n) {
return bits[n / 8] & (1 << (7 - (n % 8)));
}
static inline void clear_bit(char *bits, int n) {
bits[n / 8] &= ~(1 << (7 - (n % 8)));
}
#define DFLTCC_FACILITY 151
static inline int is_dfltcc_enabled(void) {
uint64_t facilities[(DFLTCC_FACILITY / 64) + 1];
Z_REGISTER uint8_t r0 __asm__("r0");
memset(facilities, 0, sizeof(facilities));
r0 = sizeof(facilities) / sizeof(facilities[0]) - 1;
/* STFLE is supported since z9-109 and only in z/Architecture mode. When
* compiling with -m31, gcc defaults to ESA mode, however, since the kernel
* is 64-bit, it's always z/Architecture mode at runtime.
*/
__asm__ volatile(
#ifndef __clang__
".machinemode push\n"
".machinemode zarch\n"
#endif
"stfle %[facilities]\n"
#ifndef __clang__
".machinemode pop\n"
#endif
: [facilities] "=Q" (facilities), [r0] "+r" (r0) :: "cc");
return is_bit_set((const char *)facilities, DFLTCC_FACILITY);
}
#define DFLTCC_FMT0 0
/*
Parameter Block for Generate Dynamic-Huffman Table, Compress and Expand.
*/
#define CVT_CRC32 0
#define CVT_ADLER32 1
#define HTT_FIXED 0
#define HTT_DYNAMIC 1
struct dfltcc_param_v0 {
uint16_t pbvn; /* Parameter-Block-Version Number */
uint8_t mvn; /* Model-Version Number */
uint8_t ribm; /* Reserved for IBM use */
uint32_t reserved32 : 31;
uint32_t cf : 1; /* Continuation Flag */
uint8_t reserved64[8];
uint32_t nt : 1; /* New Task */
uint32_t reserved129 : 1;
uint32_t cvt : 1; /* Check Value Type */
uint32_t reserved131 : 1;
uint32_t htt : 1; /* Huffman-Table Type */
uint32_t bcf : 1; /* Block-Continuation Flag */
uint32_t bcc : 1; /* Block Closing Control */
uint32_t bhf : 1; /* Block Header Final */
uint32_t reserved136 : 1;
uint32_t reserved137 : 1;
uint32_t dhtgc : 1; /* DHT Generation Control */
uint32_t reserved139 : 5;
uint32_t reserved144 : 5;
uint32_t sbb : 3; /* Sub-Byte Boundary */
uint8_t oesc; /* Operation-Ending-Supplemental Code */
uint32_t reserved160 : 12;
uint32_t ifs : 4; /* Incomplete-Function Status */
uint16_t ifl; /* Incomplete-Function Length */
uint8_t reserved192[8];
uint8_t reserved256[8];
uint8_t reserved320[4];
uint16_t hl; /* History Length */
uint32_t reserved368 : 1;
uint16_t ho : 15; /* History Offset */
uint32_t cv; /* Check Value */
uint32_t eobs : 15; /* End-of-block Symbol */
uint32_t reserved431: 1;
uint8_t eobl : 4; /* End-of-block Length */
uint32_t reserved436 : 12;
uint32_t reserved448 : 4;
uint16_t cdhtl : 12; /* Compressed-Dynamic-Huffman Table
Length */
uint8_t reserved464[6];
uint8_t cdht[288]; /* Compressed-Dynamic-Huffman Table */
uint8_t reserved[24];
uint8_t ribm2[8]; /* Reserved for IBM use */
uint8_t csb[1152]; /* Continuation-State Buffer */
};
#define DFLTCC_SIZEOF_GDHT_V0 384
#define DFLTCC_SIZEOF_CMPR_XPND_V0 1536
static_assert(offsetof(struct dfltcc_param_v0, csb) == DFLTCC_SIZEOF_GDHT_V0, gdht_v0);
static_assert(sizeof(struct dfltcc_param_v0) == DFLTCC_SIZEOF_CMPR_XPND_V0, cmpr_xpnd_v0);
static inline z_const char *oesc_msg(char *buf, int oesc) {
if (oesc == 0x00)
return NULL; /* Successful completion */
else {
sprintf(buf, "Operation-Ending-Supplemental Code is 0x%.2X", oesc);
return buf;
}
}
/*
C wrapper for the DEFLATE CONVERSION CALL instruction.
*/
typedef enum {
DFLTCC_CC_OK = 0,
DFLTCC_CC_OP1_TOO_SHORT = 1,
DFLTCC_CC_OP2_TOO_SHORT = 2,
DFLTCC_CC_OP2_CORRUPT = 2,
DFLTCC_CC_AGAIN = 3,
} dfltcc_cc;
#define DFLTCC_QAF 0
#define DFLTCC_GDHT 1
#define DFLTCC_CMPR 2
#define DFLTCC_XPND 4
#define HBT_CIRCULAR (1 << 7)
#define DFLTCC_FN_MASK ((1 << 7) - 1)
#define HB_BITS 15
#define HB_SIZE (1 << HB_BITS)
static inline dfltcc_cc dfltcc(int fn, void *param,
unsigned char **op1, size_t *len1,
z_const unsigned char **op2, size_t *len2, void *hist) {
unsigned char *t2 = op1 ? *op1 : NULL;
unsigned char *orig_t2 = t2;
size_t t3 = len1 ? *len1 : 0;
z_const unsigned char *t4 = op2 ? *op2 : NULL;
size_t t5 = len2 ? *len2 : 0;
Z_REGISTER int r0 __asm__("r0") = fn;
Z_REGISTER void *r1 __asm__("r1") = param;
Z_REGISTER unsigned char *r2 __asm__("r2") = t2;
Z_REGISTER size_t r3 __asm__("r3") = t3;
Z_REGISTER z_const unsigned char *r4 __asm__("r4") = t4;
Z_REGISTER size_t r5 __asm__("r5") = t5;
int cc;
__asm__ volatile(
#ifdef HAVE_SYS_SDT_H
STAP_PROBE_ASM(zlib, dfltcc_entry, STAP_PROBE_ASM_TEMPLATE(5))
#endif
".insn rrf,0xb9390000,%[r2],%[r4],%[hist],0\n"
#ifdef HAVE_SYS_SDT_H
STAP_PROBE_ASM(zlib, dfltcc_exit, STAP_PROBE_ASM_TEMPLATE(5))
#endif
"ipm %[cc]\n"
: [r2] "+r" (r2)
, [r3] "+r" (r3)
, [r4] "+r" (r4)
, [r5] "+r" (r5)
, [cc] "=r" (cc)
: [r0] "r" (r0)
, [r1] "r" (r1)
, [hist] "r" (hist)
#ifdef HAVE_SYS_SDT_H
, STAP_PROBE_ASM_OPERANDS(5, r2, r3, r4, r5, hist)
#endif
: "cc", "memory");
t2 = r2; t3 = r3; t4 = r4; t5 = r5;
switch (fn & DFLTCC_FN_MASK) {
case DFLTCC_QAF:
__msan_unpoison(param, DFLTCC_SIZEOF_QAF);
break;
case DFLTCC_GDHT:
__msan_unpoison(param, DFLTCC_SIZEOF_GDHT_V0);
break;
case DFLTCC_CMPR:
__msan_unpoison(param, DFLTCC_SIZEOF_CMPR_XPND_V0);
__msan_unpoison(orig_t2, t2 - orig_t2 + (((struct dfltcc_param_v0 *)param)->sbb == 0 ? 0 : 1));
break;
case DFLTCC_XPND:
__msan_unpoison(param, DFLTCC_SIZEOF_CMPR_XPND_V0);
__msan_unpoison(orig_t2, t2 - orig_t2);
break;
}
if (op1)
*op1 = t2;
if (len1)
*len1 = t3;
if (op2)
*op2 = t4;
if (len2)
*len2 = t5;
return (cc >> 28) & 3;
}
/*
Extension of inflate_state and deflate_state. Must be doubleword-aligned.
*/
struct dfltcc_state {
struct dfltcc_param_v0 param; /* Parameter block. */
struct dfltcc_qaf_param af; /* Available functions. */
char msg[64]; /* Buffer for strm->msg */
};
#define ALIGN_UP(p, size) (__typeof__(p))(((uintptr_t)(p) + ((size) - 1)) & ~((size) - 1))
#define GET_DFLTCC_STATE(state) ((struct dfltcc_state *)((char *)(state) + ALIGN_UP(sizeof(*state), 8)))
static inline void *dfltcc_alloc_state(PREFIX3(streamp) strm, uInt size, uInt extension_size) {
return ZALLOC(strm, 1, ALIGN_UP(size, 8) + extension_size);
}
static inline void dfltcc_reset_state(struct dfltcc_state *dfltcc_state) {
/* Initialize available functions */
if (is_dfltcc_enabled()) {
dfltcc(DFLTCC_QAF, &dfltcc_state->param, NULL, NULL, NULL, NULL, NULL);
memmove(&dfltcc_state->af, &dfltcc_state->param, sizeof(dfltcc_state->af));
} else
memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af));
/* Initialize parameter block */
memset(&dfltcc_state->param, 0, sizeof(dfltcc_state->param));
dfltcc_state->param.nt = 1;
dfltcc_state->param.ribm = DFLTCC_RIBM;
}
static inline void dfltcc_copy_state(void *dst, const void *src, uInt size, uInt extension_size) {
memcpy(dst, src, ALIGN_UP(size, 8) + extension_size);
}
static inline void append_history(struct dfltcc_param_v0 *param, unsigned char *history,
const unsigned char *buf, uInt count) {
size_t offset;
size_t n;
/* Do not use more than 32K */
if (count > HB_SIZE) {
buf += count - HB_SIZE;
count = HB_SIZE;
}
offset = (param->ho + param->hl) % HB_SIZE;
if (offset + count <= HB_SIZE)
/* Circular history buffer does not wrap - copy one chunk */
memcpy(history + offset, buf, count);
else {
/* Circular history buffer wraps - copy two chunks */
n = HB_SIZE - offset;
memcpy(history + offset, buf, n);
memcpy(history, buf + n, count - n);
}
n = param->hl + count;
if (n <= HB_SIZE)
/* All history fits into buffer - no need to discard anything */
param->hl = n;
else {
/* History does not fit into buffer - discard extra bytes */
param->ho = (param->ho + (n - HB_SIZE)) % HB_SIZE;
param->hl = HB_SIZE;
}
}
static inline void get_history(struct dfltcc_param_v0 *param, const unsigned char *history,
unsigned char *buf) {
if (param->ho + param->hl <= HB_SIZE)
/* Circular history buffer does not wrap - copy one chunk */
memcpy(buf, history + param->ho, param->hl);
else {
/* Circular history buffer wraps - copy two chunks */
memcpy(buf, history + param->ho, HB_SIZE - param->ho);
memcpy(buf + HB_SIZE - param->ho, history, param->ho + param->hl - HB_SIZE);
}
}
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_inflate.c 0000664 0000000 0000000 00000015521 14553115624 0021756 0 ustar 00root root 0000000 0000000 /* dfltcc_inflate.c - IBM Z DEFLATE CONVERSION CALL decompression support. */
/*
Use the following commands to build zlib-ng with DFLTCC decompression support:
$ ./configure --with-dfltcc-inflate
or
$ cmake -DWITH_DFLTCC_INFLATE=1 .
and then
$ make
*/
#include "zbuild.h"
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "dfltcc_inflate.h"
#include "dfltcc_detail.h"
struct inflate_state Z_INTERNAL *PREFIX(dfltcc_alloc_inflate_state)(PREFIX3(streamp) strm) {
return (struct inflate_state *)dfltcc_alloc_state(strm, sizeof(struct inflate_state), sizeof(struct dfltcc_state));
}
void Z_INTERNAL PREFIX(dfltcc_reset_inflate_state)(PREFIX3(streamp) strm) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
dfltcc_reset_state(dfltcc_state);
}
void Z_INTERNAL PREFIX(dfltcc_copy_inflate_state)(struct inflate_state *dst, const struct inflate_state *src) {
dfltcc_copy_state(dst, src, sizeof(struct inflate_state), sizeof(struct dfltcc_state));
}
int Z_INTERNAL PREFIX(dfltcc_can_inflate)(PREFIX3(streamp) strm) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
/* Unsupported hardware */
return is_bit_set(dfltcc_state->af.fns, DFLTCC_XPND) && is_bit_set(dfltcc_state->af.fmts, DFLTCC_FMT0);
}
static inline dfltcc_cc dfltcc_xpnd(PREFIX3(streamp) strm) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param;
size_t avail_in = strm->avail_in;
size_t avail_out = strm->avail_out;
dfltcc_cc cc;
cc = dfltcc(DFLTCC_XPND | HBT_CIRCULAR,
param, &strm->next_out, &avail_out,
&strm->next_in, &avail_in, state->window);
strm->avail_in = avail_in;
strm->avail_out = avail_out;
return cc;
}
dfltcc_inflate_action Z_INTERNAL PREFIX(dfltcc_inflate)(PREFIX3(streamp) strm, int flush, int *ret) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
dfltcc_cc cc;
if (flush == Z_BLOCK || flush == Z_TREES) {
/* DFLTCC does not support stopping on block boundaries */
if (PREFIX(dfltcc_inflate_disable)(strm)) {
*ret = Z_STREAM_ERROR;
return DFLTCC_INFLATE_BREAK;
} else
return DFLTCC_INFLATE_SOFTWARE;
}
if (state->last) {
if (state->bits != 0) {
strm->next_in++;
strm->avail_in--;
state->bits = 0;
}
state->mode = CHECK;
return DFLTCC_INFLATE_CONTINUE;
}
if (strm->avail_in == 0 && !param->cf)
return DFLTCC_INFLATE_BREAK;
if (PREFIX(inflate_ensure_window)(state)) {
state->mode = MEM;
return DFLTCC_INFLATE_CONTINUE;
}
/* Translate stream to parameter block */
param->cvt = ((state->wrap & 4) && state->flags) ? CVT_CRC32 : CVT_ADLER32;
param->sbb = state->bits;
if (param->hl)
param->nt = 0; /* Honor history for the first block */
if (state->wrap & 4)
param->cv = state->flags ? ZSWAP32(state->check) : state->check;
/* Inflate */
do {
cc = dfltcc_xpnd(strm);
} while (cc == DFLTCC_CC_AGAIN);
/* Translate parameter block to stream */
strm->msg = oesc_msg(dfltcc_state->msg, param->oesc);
state->last = cc == DFLTCC_CC_OK;
state->bits = param->sbb;
if (state->wrap & 4)
strm->adler = state->check = state->flags ? ZSWAP32(param->cv) : param->cv;
if (cc == DFLTCC_CC_OP2_CORRUPT && param->oesc != 0) {
/* Report an error if stream is corrupted */
state->mode = BAD;
return DFLTCC_INFLATE_CONTINUE;
}
state->mode = TYPEDO;
/* Break if operands are exhausted, otherwise continue looping */
return (cc == DFLTCC_CC_OP1_TOO_SHORT || cc == DFLTCC_CC_OP2_TOO_SHORT) ?
DFLTCC_INFLATE_BREAK : DFLTCC_INFLATE_CONTINUE;
}
int Z_INTERNAL PREFIX(dfltcc_was_inflate_used)(PREFIX3(streamp) strm) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_param_v0 *param = &GET_DFLTCC_STATE(state)->param;
return !param->nt;
}
/*
Rotates a circular buffer.
The implementation is based on https://cplusplus.com/reference/algorithm/rotate/
*/
static void rotate(unsigned char *start, unsigned char *pivot, unsigned char *end) {
unsigned char *p = pivot;
unsigned char tmp;
while (p != start) {
tmp = *start;
*start = *p;
*p = tmp;
start++;
p++;
if (p == end)
p = pivot;
else if (start == pivot)
pivot = p;
}
}
int Z_INTERNAL PREFIX(dfltcc_inflate_disable)(PREFIX3(streamp) strm) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
if (!PREFIX(dfltcc_can_inflate)(strm))
return 0;
if (PREFIX(dfltcc_was_inflate_used)(strm))
/* DFLTCC has already decompressed some data. Since there is not
* enough information to resume decompression in software, the call
* must fail.
*/
return 1;
/* DFLTCC was not used yet - decompress in software */
memset(&dfltcc_state->af, 0, sizeof(dfltcc_state->af));
/* Convert the window from the hardware to the software format */
rotate(state->window, state->window + param->ho, state->window + HB_SIZE);
state->whave = state->wnext = MIN(param->hl, state->wsize);
return 0;
}
/*
Preloading history.
*/
int Z_INTERNAL PREFIX(dfltcc_inflate_set_dictionary)(PREFIX3(streamp) strm,
const unsigned char *dictionary, uInt dict_length) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
if (PREFIX(inflate_ensure_window)(state)) {
state->mode = MEM;
return Z_MEM_ERROR;
}
append_history(param, state->window, dictionary, dict_length);
state->havedict = 1;
return Z_OK;
}
int Z_INTERNAL PREFIX(dfltcc_inflate_get_dictionary)(PREFIX3(streamp) strm,
unsigned char *dictionary, uInt *dict_length) {
struct inflate_state *state = (struct inflate_state *)strm->state;
struct dfltcc_state *dfltcc_state = GET_DFLTCC_STATE(state);
struct dfltcc_param_v0 *param = &dfltcc_state->param;
if (dictionary && state->window)
get_history(param, state->window, dictionary);
if (dict_length)
*dict_length = param->hl;
return Z_OK;
}
3p-zlib-ng-main/zlib-ng/arch/s390/dfltcc_inflate.h 0000664 0000000 0000000 00000005323 14553115624 0021762 0 ustar 00root root 0000000 0000000 #ifndef DFLTCC_INFLATE_H
#define DFLTCC_INFLATE_H
#include "dfltcc_common.h"
struct inflate_state Z_INTERNAL *PREFIX(dfltcc_alloc_inflate_state)(PREFIX3(streamp) strm);
void Z_INTERNAL PREFIX(dfltcc_reset_inflate_state)(PREFIX3(streamp) strm);
void Z_INTERNAL PREFIX(dfltcc_copy_inflate_state)(struct inflate_state *dst, const struct inflate_state *src);
int Z_INTERNAL PREFIX(dfltcc_can_inflate)(PREFIX3(streamp) strm);
typedef enum {
DFLTCC_INFLATE_CONTINUE,
DFLTCC_INFLATE_BREAK,
DFLTCC_INFLATE_SOFTWARE,
} dfltcc_inflate_action;
dfltcc_inflate_action Z_INTERNAL PREFIX(dfltcc_inflate)(PREFIX3(streamp) strm, int flush, int *ret);
int Z_INTERNAL PREFIX(dfltcc_was_inflate_used)(PREFIX3(streamp) strm);
int Z_INTERNAL PREFIX(dfltcc_inflate_disable)(PREFIX3(streamp) strm);
int Z_INTERNAL PREFIX(dfltcc_inflate_set_dictionary)(PREFIX3(streamp) strm,
const unsigned char *dictionary, uInt dict_length);
int Z_INTERNAL PREFIX(dfltcc_inflate_get_dictionary)(PREFIX3(streamp) strm,
unsigned char *dictionary, uInt* dict_length);
#define ZALLOC_INFLATE_STATE PREFIX(dfltcc_alloc_inflate_state)
#define ZCOPY_INFLATE_STATE PREFIX(dfltcc_copy_inflate_state)
#define INFLATE_RESET_KEEP_HOOK PREFIX(dfltcc_reset_inflate_state)
#define INFLATE_PRIME_HOOK(strm, bits, value) \
do { if (PREFIX(dfltcc_inflate_disable)((strm))) return Z_STREAM_ERROR; } while (0)
#define INFLATE_TYPEDO_HOOK(strm, flush) \
if (PREFIX(dfltcc_can_inflate)((strm))) { \
dfltcc_inflate_action action; \
\
RESTORE(); \
action = PREFIX(dfltcc_inflate)((strm), (flush), &ret); \
LOAD(); \
if (action == DFLTCC_INFLATE_CONTINUE) \
break; \
else if (action == DFLTCC_INFLATE_BREAK) \
goto inf_leave; \
}
#define INFLATE_NEED_CHECKSUM(strm) (!PREFIX(dfltcc_can_inflate)((strm)))
#define INFLATE_NEED_UPDATEWINDOW(strm) (!PREFIX(dfltcc_can_inflate)((strm)))
#define INFLATE_MARK_HOOK(strm) \
do { \
if (PREFIX(dfltcc_was_inflate_used)((strm))) return -(1L << 16); \
} while (0)
#define INFLATE_SYNC_POINT_HOOK(strm) \
do { \
if (PREFIX(dfltcc_was_inflate_used)((strm))) return Z_STREAM_ERROR; \
} while (0)
#define INFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) \
do { \
if (PREFIX(dfltcc_can_inflate)((strm))) \
return PREFIX(dfltcc_inflate_set_dictionary)((strm), (dict), (dict_len)); \
} while (0)
#define INFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) \
do { \
if (PREFIX(dfltcc_can_inflate)((strm))) \
return PREFIX(dfltcc_inflate_get_dictionary)((strm), (dict), (dict_len)); \
} while (0)
#endif
3p-zlib-ng-main/zlib-ng/arch/s390/s390_features.c 0000664 0000000 0000000 00000000475 14553115624 0021413 0 ustar 00root root 0000000 0000000 #include "../../zbuild.h"
#include "s390_features.h"
#ifdef HAVE_SYS_AUXV_H
# include
#endif
#ifndef HWCAP_S390_VXRS
#define HWCAP_S390_VXRS HWCAP_S390_VX
#endif
void Z_INTERNAL s390_check_features(struct s390_cpu_features *features) {
features->has_vx = getauxval(AT_HWCAP) & HWCAP_S390_VXRS;
}
3p-zlib-ng-main/zlib-ng/arch/s390/s390_features.h 0000664 0000000 0000000 00000000263 14553115624 0021413 0 ustar 00root root 0000000 0000000 #ifndef S390_FEATURES_H_
#define S390_FEATURES_H_
struct s390_cpu_features {
int has_vx;
};
void Z_INTERNAL s390_check_features(struct s390_cpu_features *features);
#endif
3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/ 0000775 0000000 0000000 00000000000 14553115624 0022506 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/actions-runner.Dockerfile 0000664 0000000 0000000 00000002345 14553115624 0027452 0 ustar 00root root 0000000 0000000 # Self-Hosted IBM Z Github Actions Runner.
# Temporary image: amd64 dependencies.
FROM amd64/ubuntu:20.04 as ld-prefix
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y install ca-certificates libicu66 libssl1.1
# Main image.
FROM s390x/ubuntu:20.04
# Packages for zlib-ng testing.
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y install \
clang-11 \
cmake \
curl \
gcc \
git \
jq \
libxml2-dev \
libxslt-dev \
llvm-11-tools \
ninja-build \
python-is-python3 \
python3 \
python3-dev \
python3-pip
# amd64 dependencies.
COPY --from=ld-prefix / /usr/x86_64-linux-gnu/
RUN ln -fs ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /usr/x86_64-linux-gnu/lib64/
RUN ln -fs /etc/resolv.conf /usr/x86_64-linux-gnu/etc/
ENV QEMU_LD_PREFIX=/usr/x86_64-linux-gnu
# amd64 Github Actions Runner.
RUN useradd -m actions-runner
USER actions-runner
WORKDIR /home/actions-runner
RUN curl -L https://github.com/actions/runner/releases/download/v2.287.1/actions-runner-linux-x64-2.287.1.tar.gz | tar -xz
VOLUME /home/actions-runner
# Scripts.
COPY fs/ /
ENTRYPOINT ["/usr/bin/entrypoint"]
CMD ["/usr/bin/actions-runner"]
3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/actions-runner.service 0000664 0000000 0000000 00000001316 14553115624 0027040 0 ustar 00root root 0000000 0000000 [Unit]
Description=Self-Hosted IBM Z Github Actions Runner
Wants=qemu-user-static
After=qemu-user-static
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
ExecStartPre=-/usr/bin/docker rm --force actions-runner
ExecStart=/usr/bin/docker run \
--env-file=/etc/actions-runner \
--init \
--interactive \
--name=actions-runner \
--rm \
--volume=actions-runner:/home/actions-runner \
iiilinuxibmcom/actions-runner
ExecStop=/bin/sh -c "docker exec actions-runner kill -INT -- -1"
ExecStop=/bin/sh -c "docker wait actions-runner"
ExecStop=/bin/sh -c "docker rm actions-runner"
[Install]
WantedBy=multi-user.target
3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/fs/ 0000775 0000000 0000000 00000000000 14553115624 0023116 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/fs/usr/ 0000775 0000000 0000000 00000000000 14553115624 0023727 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/fs/usr/bin/ 0000775 0000000 0000000 00000000000 14553115624 0024477 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/fs/usr/bin/actions-runner 0000775 0000000 0000000 00000001737 14553115624 0027404 0 ustar 00root root 0000000 0000000 #!/bin/bash
#
# Ephemeral runner startup script.
#
# Expects the following environment variables:
#
# - repo=/
# - access_token=
#
set -e -u
# Check the cached registration token.
token_file=registration-token.json
set +e
expires_at=$(jq --raw-output .expires_at "$token_file" 2>/dev/null)
status=$?
set -e
if [[ $status -ne 0 || $(date +%s) -ge $(date -d "$expires_at" +%s) ]]; then
# Refresh the cached registration token.
curl \
-X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token $access_token" \
"https://api.github.com/repos/$repo/actions/runners/registration-token" \
-o "$token_file"
fi
# (Re-)register the runner.
registration_token=$(jq --raw-output .token "$token_file")
./config.sh remove --token "$registration_token" || true
./config.sh \
--url "https://github.com/$repo" \
--token "$registration_token" \
--labels z15 \
--ephemeral
# Run one job.
./run.sh
3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/fs/usr/bin/entrypoint 0000775 0000000 0000000 00000001344 14553115624 0026642 0 ustar 00root root 0000000 0000000 #!/bin/bash
#
# Container entrypoint that waits for all spawned processes.
#
set -e -u
# Create a FIFO and start reading from its read end.
tempdir=$(mktemp -d "/tmp/done.XXXXXXXXXX")
trap 'rm -r "$tempdir"' EXIT
done="$tempdir/pipe"
mkfifo "$done"
cat "$done" & waiter=$!
# Start the workload. Its descendants will inherit the FIFO's write end.
status=0
if [ "$#" -eq 0 ]; then
bash 9>"$done" || status=$?
else
"$@" 9>"$done" || status=$?
fi
# When the workload and all of its descendants exit, the FIFO's write end will
# be closed and `cat "$done"` will exit. Wait until it happens. This is needed
# in order to handle SelfUpdater, which the workload may start in background
# before exiting.
wait "$waiter"
exit "$status"
3p-zlib-ng-main/zlib-ng/arch/s390/self-hosted-builder/qemu-user-static.service 0000664 0000000 0000000 00000000726 14553115624 0027305 0 ustar 00root root 0000000 0000000 [Unit]
Description=Support for transparent execution of non-native binaries with QEMU user emulation
[Service]
Type=oneshot
# The source code for iiilinuxibmcom/qemu-user-static is at https://github.com/iii-i/qemu-user-static/tree/v6.1.0-1
# TODO: replace it with multiarch/qemu-user-static once version >6.1 is available
ExecStart=/usr/bin/docker run --rm --interactive --privileged iiilinuxibmcom/qemu-user-static --reset -p yes
[Install]
WantedBy=multi-user.target
3p-zlib-ng-main/zlib-ng/arch/x86/ 0000775 0000000 0000000 00000000000 14553115624 0016574 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/arch/x86/Makefile.in 0000664 0000000 0000000 00000012152 14553115624 0020642 0 ustar 00root root 0000000 0000000 # Makefile for zlib
# Copyright (C) 1995-2013 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
CC=
CFLAGS=
SFLAGS=
INCLUDES=
SUFFIX=
AVX512FLAG=-mavx512f -mavx512dq -mavx512vl -mavx512bw
AVX512VNNIFLAG=-mavx512vnni
AVX2FLAG=-mavx2
SSE2FLAG=-msse2
SSSE3FLAG=-mssse3
SSE42FLAG=-msse4.2
PCLMULFLAG=-mpclmul
VPCLMULFLAG=-mvpclmulqdq
XSAVEFLAG=-mxsave
NOLTOFLAG=
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
all: \
x86_features.o x86_features.lo \
adler32_avx2.o adler32_avx2.lo \
adler32_avx512.o adler32_avx512.lo \
adler32_avx512_vnni.o adler32_avx512_vnni.lo \
adler32_sse42.o adler32_sse42.lo \
adler32_ssse3.o adler32_ssse3.lo \
chunkset_avx2.o chunkset_avx2.lo \
chunkset_sse2.o chunkset_sse2.lo \
chunkset_ssse3.o chunkset_ssse3.lo \
compare256_avx2.o compare256_avx2.lo \
compare256_sse2.o compare256_sse2.lo \
insert_string_sse42.o insert_string_sse42.lo \
crc32_pclmulqdq.o crc32_pclmulqdq.lo \
crc32_vpclmulqdq.o crc32_vpclmulqdq.lo \
slide_hash_avx2.o slide_hash_avx2.lo \
slide_hash_sse2.o slide_hash_sse2.lo
x86_features.o:
$(CC) $(CFLAGS) $(XSAVEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/x86_features.c
x86_features.lo:
$(CC) $(SFLAGS) $(XSAVEFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/x86_features.c
chunkset_avx2.o:
$(CC) $(CFLAGS) $(AVX2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_avx2.c
chunkset_avx2.lo:
$(CC) $(SFLAGS) $(AVX2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_avx2.c
chunkset_sse2.o:
$(CC) $(CFLAGS) $(SSE2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_sse2.c
chunkset_sse2.lo:
$(CC) $(SFLAGS) $(SSE2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_sse2.c
chunkset_ssse3.o:
$(CC) $(CFLAGS) $(SSSE3FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_ssse3.c
chunkset_ssse3.lo:
$(CC) $(SFLAGS) $(SSSE3FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/chunkset_ssse3.c
compare256_avx2.o:
$(CC) $(CFLAGS) $(AVX2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_avx2.c
compare256_avx2.lo:
$(CC) $(SFLAGS) $(AVX2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_avx2.c
compare256_sse2.o:
$(CC) $(CFLAGS) $(SSE2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_sse2.c
compare256_sse2.lo:
$(CC) $(SFLAGS) $(SSE2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/compare256_sse2.c
insert_string_sse42.o:
$(CC) $(CFLAGS) $(SSE42FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_sse42.c
insert_string_sse42.lo:
$(CC) $(SFLAGS) $(SSE42FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/insert_string_sse42.c
crc32_pclmulqdq.o:
$(CC) $(CFLAGS) $(PCLMULFLAG) $(SSE42FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_pclmulqdq.c
crc32_pclmulqdq.lo:
$(CC) $(SFLAGS) $(PCLMULFLAG) $(SSE42FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_pclmulqdq.c
crc32_vpclmulqdq.o:
$(CC) $(CFLAGS) $(PCLMULFLAG) $(SSE42FLAG) $(VPCLMULFLAG) $(AVX512FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_vpclmulqdq.c
crc32_vpclmulqdq.lo:
$(CC) $(SFLAGS) $(PCLMULFLAG) $(SSE42FLAG) $(VPCLMULFLAG) $(AVX512FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/crc32_vpclmulqdq.c
slide_hash_avx2.o:
$(CC) $(CFLAGS) $(AVX2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_avx2.c
slide_hash_avx2.lo:
$(CC) $(SFLAGS) $(AVX2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_avx2.c
slide_hash_sse2.o:
$(CC) $(CFLAGS) $(SSE2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_sse2.c
slide_hash_sse2.lo:
$(CC) $(SFLAGS) $(SSE2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/slide_hash_sse2.c
adler32_avx2.o: $(SRCDIR)/adler32_avx2.c
$(CC) $(CFLAGS) $(AVX2FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx2.c
adler32_avx2.lo: $(SRCDIR)/adler32_avx2.c
$(CC) $(SFLAGS) $(AVX2FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx2.c
adler32_avx512.o: $(SRCDIR)/adler32_avx512.c
$(CC) $(CFLAGS) $(AVX512FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx512.c
adler32_avx512.lo: $(SRCDIR)/adler32_avx512.c
$(CC) $(SFLAGS) $(AVX512FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx512.c
adler32_avx512_vnni.o: $(SRCDIR)/adler32_avx512_vnni.c
$(CC) $(CFLAGS) $(AVX512VNNIFLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx512_vnni.c
adler32_avx512_vnni.lo: $(SRCDIR)/adler32_avx512_vnni.c
$(CC) $(SFLAGS) $(AVX512VNNIFLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_avx512_vnni.c
adler32_ssse3.o: $(SRCDIR)/adler32_ssse3.c
$(CC) $(CFLAGS) $(SSSE3FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_ssse3.c
adler32_ssse3.lo: $(SRCDIR)/adler32_ssse3.c
$(CC) $(SFLAGS) $(SSSE3FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_ssse3.c
adler32_sse42.o: $(SRCDIR)/adler32_sse42.c
$(CC) $(CFLAGS) $(SSE42FLAG) $(NOLTOFLAG) $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_sse42.c
adler32_sse42.lo: $(SRCDIR)/adler32_sse42.c
$(CC) $(SFLAGS) $(SSE42FLAG) $(NOLTOFLAG) -DPIC $(INCLUDES) -c -o $@ $(SRCDIR)/adler32_sse42.c
mostlyclean: clean
clean:
rm -f *.o *.lo *~
rm -rf objs
rm -f *.gcda *.gcno *.gcov
distclean: clean
rm -f Makefile
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_avx2.c 0000664 0000000 0000000 00000013744 14553115624 0021145 0 ustar 00root root 0000000 0000000 /* adler32_avx2.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011 Mark Adler
* Copyright (C) 2022 Adam Stylinski
* Authors:
* Brian Bockelman
* Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef X86_AVX2
#include "../../zbuild.h"
#include
#include "../../adler32_fold.h"
#include "../../adler32_p.h"
#include "adler32_avx2_p.h"
#include "x86_intrins.h"
#ifdef X86_SSE42
extern uint32_t adler32_fold_copy_sse42(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
extern uint32_t adler32_ssse3(uint32_t adler, const uint8_t *src, size_t len);
#define copy_sub32(a, b, c, d) adler32_fold_copy_sse42(a, b, c, d)
#define sub32(a, b, c) adler32_ssse3(a, b, c)
#else
#define copy_sub32(a, b, c, d) adler32_copy_len_16(adler0, c, b, d, adler1)
#define sub32(a, b, c) adler32_len_16(adler0, b, c, adler1)
#endif
static inline uint32_t adler32_fold_copy_impl(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len, const int COPY) {
if (src == NULL) return 1L;
if (len == 0) return adler;
uint32_t adler0, adler1;
adler1 = (adler >> 16) & 0xffff;
adler0 = adler & 0xffff;
rem_peel:
if (len < 16) {
if (COPY) {
return adler32_copy_len_16(adler0, src, dst, len, adler1);
} else {
return adler32_len_16(adler0, src, len, adler1);
}
} else if (len < 32) {
if (COPY) {
return copy_sub32(adler, dst, src, len);
} else {
return sub32(adler, src, len);
}
}
__m256i vs1, vs2;
const __m256i dot2v = _mm256_setr_epi8(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,
14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
const __m256i dot3v = _mm256_set1_epi16(1);
const __m256i zero = _mm256_setzero_si256();
while (len >= 32) {
vs1 = _mm256_zextsi128_si256(_mm_cvtsi32_si128(adler0));
vs2 = _mm256_zextsi128_si256(_mm_cvtsi32_si128(adler1));
__m256i vs1_0 = vs1;
__m256i vs3 = _mm256_setzero_si256();
size_t k = MIN(len, NMAX);
k -= k % 32;
len -= k;
while (k >= 32) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 32 vs1 + sum( (32-i+1) c[i] )
*/
__m256i vbuf = _mm256_loadu_si256((__m256i*)src);
src += 32;
k -= 32;
__m256i vs1_sad = _mm256_sad_epu8(vbuf, zero); // Sum of abs diff, resulting in 2 x int32's
if (COPY) {
_mm256_storeu_si256((__m256i*)dst, vbuf);
dst += 32;
}
vs1 = _mm256_add_epi32(vs1, vs1_sad);
vs3 = _mm256_add_epi32(vs3, vs1_0);
__m256i v_short_sum2 = _mm256_maddubs_epi16(vbuf, dot2v); // sum 32 uint8s to 16 shorts
__m256i vsum2 = _mm256_madd_epi16(v_short_sum2, dot3v); // sum 16 shorts to 8 uint32s
vs2 = _mm256_add_epi32(vsum2, vs2);
vs1_0 = vs1;
}
/* Defer the multiplication with 32 to outside of the loop */
vs3 = _mm256_slli_epi32(vs3, 5);
vs2 = _mm256_add_epi32(vs2, vs3);
/* The compiler is generating the following sequence for this integer modulus
* when done the scalar way, in GPRs:
adler = (s1_unpack[0] % BASE) + (s1_unpack[1] % BASE) + (s1_unpack[2] % BASE) + (s1_unpack[3] % BASE) +
(s1_unpack[4] % BASE) + (s1_unpack[5] % BASE) + (s1_unpack[6] % BASE) + (s1_unpack[7] % BASE);
mov $0x80078071,%edi // move magic constant into 32 bit register %edi
...
vmovd %xmm1,%esi // move vector lane 0 to 32 bit register %esi
mov %rsi,%rax // zero-extend this value to 64 bit precision in %rax
imul %rdi,%rsi // do a signed multiplication with magic constant and vector element
shr $0x2f,%rsi // shift right by 47
imul $0xfff1,%esi,%esi // do a signed multiplication with value truncated to 32 bits with 0xfff1
sub %esi,%eax // subtract lower 32 bits of original vector value from modified one above
...
// repeats for each element with vpextract instructions
This is tricky with AVX2 for a number of reasons:
1.) There's no 64 bit multiplication instruction, but there is a sequence to get there
2.) There's ways to extend vectors to 64 bit precision, but no simple way to truncate
back down to 32 bit precision later (there is in AVX512)
3.) Full width integer multiplications aren't cheap
We can, however, do a relatively cheap sequence for horizontal sums.
Then, we simply do the integer modulus on the resulting 64 bit GPR, on a scalar value. It was
previously thought that casting to 64 bit precision was needed prior to the horizontal sum, but
that is simply not the case, as NMAX is defined as the maximum number of scalar sums that can be
performed on the maximum possible inputs before overflow
*/
/* In AVX2-land, this trip through GPRs will probably be unavoidable, as there's no cheap and easy
* conversion from 64 bit integer to 32 bit (needed for the inexpensive modulus with a constant).
* This casting to 32 bit is cheap through GPRs (just register aliasing). See above for exactly
* what the compiler is doing to avoid integer divisions. */
adler0 = partial_hsum256(vs1) % BASE;
adler1 = hsum256(vs2) % BASE;
}
adler = adler0 | (adler1 << 16);
if (len) {
goto rem_peel;
}
return adler;
}
Z_INTERNAL uint32_t adler32_avx2(uint32_t adler, const uint8_t *src, size_t len) {
return adler32_fold_copy_impl(adler, NULL, src, len, 0);
}
Z_INTERNAL uint32_t adler32_fold_copy_avx2(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
return adler32_fold_copy_impl(adler, dst, src, len, 1);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_avx2_p.h 0000664 0000000 0000000 00000002415 14553115624 0021462 0 ustar 00root root 0000000 0000000 /* adler32_avx2_p.h -- adler32 avx2 utility functions
* Copyright (C) 2022 Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef ADLER32_AVX2_P_H_
#define ADLER32_AVX2_P_H_
#if defined(X86_AVX2) || defined(X86_AVX512VNNI)
/* 32 bit horizontal sum, adapted from Agner Fog's vector library. */
static inline uint32_t hsum256(__m256i x) {
__m128i sum1 = _mm_add_epi32(_mm256_extracti128_si256(x, 1),
_mm256_castsi256_si128(x));
__m128i sum2 = _mm_add_epi32(sum1, _mm_unpackhi_epi64(sum1, sum1));
__m128i sum3 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 1));
return (uint32_t)_mm_cvtsi128_si32(sum3);
}
static inline uint32_t partial_hsum256(__m256i x) {
/* We need a permutation vector to extract every other integer. The
* rest are going to be zeros */
const __m256i perm_vec = _mm256_setr_epi32(0, 2, 4, 6, 1, 1, 1, 1);
__m256i non_zero = _mm256_permutevar8x32_epi32(x, perm_vec);
__m128i non_zero_sse = _mm256_castsi256_si128(non_zero);
__m128i sum2 = _mm_add_epi32(non_zero_sse,_mm_unpackhi_epi64(non_zero_sse, non_zero_sse));
__m128i sum3 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 1));
return (uint32_t)_mm_cvtsi128_si32(sum3);
}
#endif
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_avx512.c 0000664 0000000 0000000 00000007034 14553115624 0021306 0 ustar 00root root 0000000 0000000 /* adler32_avx512.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011 Mark Adler
* Authors:
* Adam Stylinski
* Brian Bockelman
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef X86_AVX512
#include "../../zbuild.h"
#include "../../adler32_p.h"
#include "../../adler32_fold.h"
#include "../../cpu_features.h"
#include
#include "x86_intrins.h"
#include "adler32_avx512_p.h"
static inline uint32_t adler32_fold_copy_impl(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len, const int COPY) {
if (src == NULL) return 1L;
if (len == 0) return adler;
uint32_t adler0, adler1;
adler1 = (adler >> 16) & 0xffff;
adler0 = adler & 0xffff;
rem_peel:
if (len < 64) {
/* This handles the remaining copies, just call normal adler checksum after this */
if (COPY) {
__mmask64 storemask = (0xFFFFFFFFFFFFFFFFUL >> (64 - len));
__m512i copy_vec = _mm512_maskz_loadu_epi8(storemask, src);
_mm512_mask_storeu_epi8(dst, storemask, copy_vec);
}
#ifdef X86_AVX2
return adler32_avx2(adler, src, len);
#elif defined(X86_SSSE3)
return adler32_ssse3(adler, src, len);
#else
return adler32_len_16(adler0, src, len, adler1);
#endif
}
__m512i vbuf, vs1_0, vs3;
const __m512i dot2v = _mm512_set_epi8(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, 32, 33, 34, 35, 36, 37,
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, 64);
const __m512i dot3v = _mm512_set1_epi16(1);
const __m512i zero = _mm512_setzero_si512();
size_t k;
while (len >= 64) {
__m512i vs1 = _mm512_zextsi128_si512(_mm_cvtsi32_si128(adler0));
__m512i vs2 = _mm512_zextsi128_si512(_mm_cvtsi32_si128(adler1));
vs1_0 = vs1;
vs3 = _mm512_setzero_si512();
k = MIN(len, NMAX);
k -= k % 64;
len -= k;
while (k >= 64) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 64 vs1 + sum( (64-i+1) c[i] )
*/
vbuf = _mm512_loadu_si512(src);
if (COPY) {
_mm512_storeu_si512(dst, vbuf);
dst += 64;
}
src += 64;
k -= 64;
__m512i vs1_sad = _mm512_sad_epu8(vbuf, zero);
__m512i v_short_sum2 = _mm512_maddubs_epi16(vbuf, dot2v);
vs1 = _mm512_add_epi32(vs1_sad, vs1);
vs3 = _mm512_add_epi32(vs3, vs1_0);
__m512i vsum2 = _mm512_madd_epi16(v_short_sum2, dot3v);
vs2 = _mm512_add_epi32(vsum2, vs2);
vs1_0 = vs1;
}
vs3 = _mm512_slli_epi32(vs3, 6);
vs2 = _mm512_add_epi32(vs2, vs3);
adler0 = partial_hsum(vs1) % BASE;
adler1 = _mm512_reduce_add_epu32(vs2) % BASE;
}
adler = adler0 | (adler1 << 16);
/* Process tail (len < 64). */
if (len) {
goto rem_peel;
}
return adler;
}
Z_INTERNAL uint32_t adler32_fold_copy_avx512(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
return adler32_fold_copy_impl(adler, dst, src, len, 1);
}
Z_INTERNAL uint32_t adler32_avx512(uint32_t adler, const uint8_t *src, size_t len) {
return adler32_fold_copy_impl(adler, NULL, src, len, 0);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_avx512_p.h 0000664 0000000 0000000 00000003617 14553115624 0021635 0 ustar 00root root 0000000 0000000 #ifndef AVX512_FUNCS_H
#define AVX512_FUNCS_H
#include
#include
/* Written because *_add_epi32(a) sets off ubsan */
static inline uint32_t _mm512_reduce_add_epu32(__m512i x) {
__m256i a = _mm512_extracti64x4_epi64(x, 1);
__m256i b = _mm512_extracti64x4_epi64(x, 0);
__m256i a_plus_b = _mm256_add_epi32(a, b);
__m128i c = _mm256_extracti128_si256(a_plus_b, 1);
__m128i d = _mm256_extracti128_si256(a_plus_b, 0);
__m128i c_plus_d = _mm_add_epi32(c, d);
__m128i sum1 = _mm_unpackhi_epi64(c_plus_d, c_plus_d);
__m128i sum2 = _mm_add_epi32(sum1, c_plus_d);
__m128i sum3 = _mm_shuffle_epi32(sum2, 0x01);
__m128i sum4 = _mm_add_epi32(sum2, sum3);
return _mm_cvtsi128_si32(sum4);
}
static inline uint32_t partial_hsum(__m512i x) {
/* We need a permutation vector to extract every other integer. The
* rest are going to be zeros. Marking this const so the compiler stands
* a better chance of keeping this resident in a register through entire
* loop execution. We certainly have enough zmm registers (32) */
const __m512i perm_vec = _mm512_setr_epi32(0, 2, 4, 6, 8, 10, 12, 14,
1, 1, 1, 1, 1, 1, 1, 1);
__m512i non_zero = _mm512_permutexvar_epi32(perm_vec, x);
/* From here, it's a simple 256 bit wide reduction sum */
__m256i non_zero_avx = _mm512_castsi512_si256(non_zero);
/* See Agner Fog's vectorclass for a decent reference. Essentially, phadd is
* pretty slow, much slower than the longer instruction sequence below */
__m128i sum1 = _mm_add_epi32(_mm256_extracti128_si256(non_zero_avx, 1),
_mm256_castsi256_si128(non_zero_avx));
__m128i sum2 = _mm_add_epi32(sum1,_mm_unpackhi_epi64(sum1, sum1));
__m128i sum3 = _mm_add_epi32(sum2,_mm_shuffle_epi32(sum2, 1));
return (uint32_t)_mm_cvtsi128_si32(sum3);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_avx512_vnni.c 0000664 0000000 0000000 00000016503 14553115624 0022341 0 ustar 00root root 0000000 0000000 /* adler32_avx512_vnni.c -- compute the Adler-32 checksum of a data stream
* Based on Brian Bockelman's AVX2 version
* Copyright (C) 1995-2011 Mark Adler
* Authors:
* Adam Stylinski
* Brian Bockelman
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef X86_AVX512VNNI
#include "../../zbuild.h"
#include "../../adler32_p.h"
#include "../../cpu_features.h"
#include
#include "../../adler32_fold.h"
#include "x86_intrins.h"
#include "adler32_avx512_p.h"
#include "adler32_avx2_p.h"
Z_INTERNAL uint32_t adler32_avx512_vnni(uint32_t adler, const uint8_t *src, size_t len) {
if (src == NULL) return 1L;
if (len == 0) return adler;
uint32_t adler0, adler1;
adler1 = (adler >> 16) & 0xffff;
adler0 = adler & 0xffff;
rem_peel:
if (len < 32)
#if defined(X86_SSSE3)
return adler32_ssse3(adler, src, len);
#else
return adler32_len_16(adler0, src, len, adler1);
#endif
if (len < 64)
#ifdef X86_AVX2
return adler32_avx2(adler, src, len);
#elif defined(X86_SSE3)
return adler32_ssse3(adler, src, len);
#else
return adler32_len_16(adler0, src, len, adler1);
#endif
const __m512i dot2v = _mm512_set_epi8(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, 32, 33, 34, 35, 36, 37,
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, 64);
const __m512i zero = _mm512_setzero_si512();
__m512i vs1, vs2;
while (len >= 64) {
vs1 = _mm512_zextsi128_si512(_mm_cvtsi32_si128(adler0));
vs2 = _mm512_zextsi128_si512(_mm_cvtsi32_si128(adler1));
size_t k = MIN(len, NMAX);
k -= k % 64;
len -= k;
__m512i vs1_0 = vs1;
__m512i vs3 = _mm512_setzero_si512();
/* We might get a tad bit more ILP here if we sum to a second register in the loop */
__m512i vs2_1 = _mm512_setzero_si512();
__m512i vbuf0, vbuf1;
/* Remainder peeling */
if (k % 128) {
vbuf1 = _mm512_loadu_si512((__m512i*)src);
src += 64;
k -= 64;
__m512i vs1_sad = _mm512_sad_epu8(vbuf1, zero);
vs1 = _mm512_add_epi32(vs1, vs1_sad);
vs3 = _mm512_add_epi32(vs3, vs1_0);
vs2 = _mm512_dpbusd_epi32(vs2, vbuf1, dot2v);
vs1_0 = vs1;
}
/* Manually unrolled this loop by 2 for an decent amount of ILP */
while (k >= 128) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 64 vs1 + sum( (64-i+1) c[i] )
*/
vbuf0 = _mm512_loadu_si512((__m512i*)src);
vbuf1 = _mm512_loadu_si512((__m512i*)(src + 64));
src += 128;
k -= 128;
__m512i vs1_sad = _mm512_sad_epu8(vbuf0, zero);
vs1 = _mm512_add_epi32(vs1, vs1_sad);
vs3 = _mm512_add_epi32(vs3, vs1_0);
/* multiply-add, resulting in 16 ints. Fuse with sum stage from prior versions, as we now have the dp
* instructions to eliminate them */
vs2 = _mm512_dpbusd_epi32(vs2, vbuf0, dot2v);
vs3 = _mm512_add_epi32(vs3, vs1);
vs1_sad = _mm512_sad_epu8(vbuf1, zero);
vs1 = _mm512_add_epi32(vs1, vs1_sad);
vs2_1 = _mm512_dpbusd_epi32(vs2_1, vbuf1, dot2v);
vs1_0 = vs1;
}
vs3 = _mm512_slli_epi32(vs3, 6);
vs2 = _mm512_add_epi32(vs2, vs3);
vs2 = _mm512_add_epi32(vs2, vs2_1);
adler0 = partial_hsum(vs1) % BASE;
adler1 = _mm512_reduce_add_epu32(vs2) % BASE;
}
adler = adler0 | (adler1 << 16);
/* Process tail (len < 64). */
if (len) {
goto rem_peel;
}
return adler;
}
Z_INTERNAL uint32_t adler32_fold_copy_avx512_vnni(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
if (src == NULL) return 1L;
if (len == 0) return adler;
uint32_t adler0, adler1;
adler1 = (adler >> 16) & 0xffff;
adler0 = adler & 0xffff;
rem_peel_copy:
if (len < 32) {
/* This handles the remaining copies, just call normal adler checksum after this */
__mmask32 storemask = (0xFFFFFFFFUL >> (32 - len));
__m256i copy_vec = _mm256_maskz_loadu_epi8(storemask, src);
_mm256_mask_storeu_epi8(dst, storemask, copy_vec);
#if defined(X86_SSSE3)
return adler32_ssse3(adler, src, len);
#else
return adler32_len_16(adler0, src, len, adler1);
#endif
}
const __m256i dot2v = _mm256_set_epi8(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, 32);
const __m256i zero = _mm256_setzero_si256();
__m256i vs1, vs2;
while (len >= 32) {
vs1 = _mm256_zextsi128_si256(_mm_cvtsi32_si128(adler0));
vs2 = _mm256_zextsi128_si256(_mm_cvtsi32_si128(adler1));
size_t k = MIN(len, NMAX);
k -= k % 32;
len -= k;
__m256i vs1_0 = vs1;
__m256i vs3 = _mm256_setzero_si256();
/* We might get a tad bit more ILP here if we sum to a second register in the loop */
__m256i vs2_1 = _mm256_setzero_si256();
__m256i vbuf0, vbuf1;
/* Remainder peeling */
if (k % 64) {
vbuf1 = _mm256_loadu_si256((__m256i*)src);
_mm256_storeu_si256((__m256i*)dst, vbuf1);
dst += 32;
src += 32;
k -= 32;
__m256i vs1_sad = _mm256_sad_epu8(vbuf1, zero);
vs1 = _mm256_add_epi32(vs1, vs1_sad);
vs3 = _mm256_add_epi32(vs3, vs1_0);
vs2 = _mm256_dpbusd_epi32(vs2, vbuf1, dot2v);
vs1_0 = vs1;
}
/* Manually unrolled this loop by 2 for an decent amount of ILP */
while (k >= 64) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 64 vs1 + sum( (64-i+1) c[i] )
*/
vbuf0 = _mm256_loadu_si256((__m256i*)src);
vbuf1 = _mm256_loadu_si256((__m256i*)(src + 32));
_mm256_storeu_si256((__m256i*)dst, vbuf0);
_mm256_storeu_si256((__m256i*)(dst + 32), vbuf1);
dst += 64;
src += 64;
k -= 64;
__m256i vs1_sad = _mm256_sad_epu8(vbuf0, zero);
vs1 = _mm256_add_epi32(vs1, vs1_sad);
vs3 = _mm256_add_epi32(vs3, vs1_0);
/* multiply-add, resulting in 16 ints. Fuse with sum stage from prior versions, as we now have the dp
* instructions to eliminate them */
vs2 = _mm256_dpbusd_epi32(vs2, vbuf0, dot2v);
vs3 = _mm256_add_epi32(vs3, vs1);
vs1_sad = _mm256_sad_epu8(vbuf1, zero);
vs1 = _mm256_add_epi32(vs1, vs1_sad);
vs2_1 = _mm256_dpbusd_epi32(vs2_1, vbuf1, dot2v);
vs1_0 = vs1;
}
vs3 = _mm256_slli_epi32(vs3, 5);
vs2 = _mm256_add_epi32(vs2, vs3);
vs2 = _mm256_add_epi32(vs2, vs2_1);
adler0 = partial_hsum256(vs1) % BASE;
adler1 = hsum256(vs2) % BASE;
}
adler = adler0 | (adler1 << 16);
/* Process tail (len < 64). */
if (len) {
goto rem_peel_copy;
}
return adler;
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_sse42.c 0000664 0000000 0000000 00000007151 14553115624 0021220 0 ustar 00root root 0000000 0000000 /* adler32_sse42.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011 Mark Adler
* Authors:
* Adam Stylinski
* Brian Bockelman
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "../../adler32_p.h"
#include "../../adler32_fold.h"
#include "adler32_ssse3_p.h"
#include
#ifdef X86_SSE42
Z_INTERNAL uint32_t adler32_fold_copy_sse42(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len) {
uint32_t adler0, adler1;
adler1 = (adler >> 16) & 0xffff;
adler0 = adler & 0xffff;
rem_peel:
if (len < 16) {
return adler32_copy_len_16(adler0, src, dst, len, adler1);
}
__m128i vbuf, vbuf_0;
__m128i vs1_0, vs3, vs1, vs2, vs2_0, v_sad_sum1, v_short_sum2, v_short_sum2_0,
v_sad_sum2, vsum2, vsum2_0;
__m128i zero = _mm_setzero_si128();
const __m128i dot2v = _mm_setr_epi8(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17);
const __m128i dot2v_0 = _mm_setr_epi8(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
const __m128i dot3v = _mm_set1_epi16(1);
size_t k;
while (len >= 16) {
k = MIN(len, NMAX);
k -= k % 16;
len -= k;
vs1 = _mm_cvtsi32_si128(adler0);
vs2 = _mm_cvtsi32_si128(adler1);
vs3 = _mm_setzero_si128();
vs2_0 = _mm_setzero_si128();
vs1_0 = vs1;
while (k >= 32) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] )
*/
vbuf = _mm_loadu_si128((__m128i*)src);
vbuf_0 = _mm_loadu_si128((__m128i*)(src + 16));
src += 32;
k -= 32;
v_sad_sum1 = _mm_sad_epu8(vbuf, zero);
v_sad_sum2 = _mm_sad_epu8(vbuf_0, zero);
_mm_storeu_si128((__m128i*)dst, vbuf);
_mm_storeu_si128((__m128i*)(dst + 16), vbuf_0);
dst += 32;
v_short_sum2 = _mm_maddubs_epi16(vbuf, dot2v);
v_short_sum2_0 = _mm_maddubs_epi16(vbuf_0, dot2v_0);
vs1 = _mm_add_epi32(v_sad_sum1, vs1);
vs3 = _mm_add_epi32(vs1_0, vs3);
vsum2 = _mm_madd_epi16(v_short_sum2, dot3v);
vsum2_0 = _mm_madd_epi16(v_short_sum2_0, dot3v);
vs1 = _mm_add_epi32(v_sad_sum2, vs1);
vs2 = _mm_add_epi32(vsum2, vs2);
vs2_0 = _mm_add_epi32(vsum2_0, vs2_0);
vs1_0 = vs1;
}
vs2 = _mm_add_epi32(vs2_0, vs2);
vs3 = _mm_slli_epi32(vs3, 5);
vs2 = _mm_add_epi32(vs3, vs2);
vs3 = _mm_setzero_si128();
while (k >= 16) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] )
*/
vbuf = _mm_loadu_si128((__m128i*)src);
src += 16;
k -= 16;
v_sad_sum1 = _mm_sad_epu8(vbuf, zero);
v_short_sum2 = _mm_maddubs_epi16(vbuf, dot2v_0);
vs1 = _mm_add_epi32(v_sad_sum1, vs1);
vs3 = _mm_add_epi32(vs1_0, vs3);
vsum2 = _mm_madd_epi16(v_short_sum2, dot3v);
vs2 = _mm_add_epi32(vsum2, vs2);
vs1_0 = vs1;
_mm_storeu_si128((__m128i*)dst, vbuf);
dst += 16;
}
vs3 = _mm_slli_epi32(vs3, 4);
vs2 = _mm_add_epi32(vs2, vs3);
adler0 = partial_hsum(vs1) % BASE;
adler1 = hsum(vs2) % BASE;
}
/* If this is true, there's fewer than 16 elements remaining */
if (len) {
goto rem_peel;
}
return adler0 | (adler1 << 16);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_ssse3.c 0000664 0000000 0000000 00000012305 14553115624 0021315 0 ustar 00root root 0000000 0000000 /* adler32_ssse3.c -- compute the Adler-32 checksum of a data stream
* Copyright (C) 1995-2011 Mark Adler
* Authors:
* Adam Stylinski
* Brian Bockelman
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "../../adler32_p.h"
#include "adler32_ssse3_p.h"
#ifdef X86_SSSE3
#include
Z_INTERNAL uint32_t adler32_ssse3(uint32_t adler, const uint8_t *buf, size_t len) {
uint32_t sum2;
/* split Adler-32 into component sums */
sum2 = (adler >> 16) & 0xffff;
adler &= 0xffff;
/* in case user likes doing a byte at a time, keep it fast */
if (UNLIKELY(len == 1))
return adler32_len_1(adler, buf, sum2);
/* initial Adler-32 value (deferred check for len == 1 speed) */
if (UNLIKELY(buf == NULL))
return 1L;
/* in case short lengths are provided, keep it somewhat fast */
if (UNLIKELY(len < 16))
return adler32_len_16(adler, buf, len, sum2);
const __m128i dot2v = _mm_setr_epi8(32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17);
const __m128i dot2v_0 = _mm_setr_epi8(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
const __m128i dot3v = _mm_set1_epi16(1);
const __m128i zero = _mm_setzero_si128();
__m128i vbuf, vs1_0, vs3, vs1, vs2, vs2_0, v_sad_sum1, v_short_sum2, v_short_sum2_0,
vbuf_0, v_sad_sum2, vsum2, vsum2_0;
/* If our buffer is unaligned (likely), make the determination whether
* or not there's enough of a buffer to consume to make the scalar, aligning
* additions worthwhile or if it's worth it to just eat the cost of an unaligned
* load. This is a pretty simple test, just test if 16 - the remainder + len is
* < 16 */
size_t max_iters = NMAX;
size_t rem = (uintptr_t)buf & 15;
size_t align_offset = 16 - rem;
size_t k = 0;
if (rem) {
if (len < 16 + align_offset) {
/* Let's eat the cost of this one unaligned load so that
* we don't completely skip over the vectorization. Doing
* 16 bytes at a time unaligned is better than 16 + <= 15
* sums */
vbuf = _mm_loadu_si128((__m128i*)buf);
len -= 16;
buf += 16;
vs1 = _mm_cvtsi32_si128(adler);
vs2 = _mm_cvtsi32_si128(sum2);
vs3 = _mm_setzero_si128();
vs1_0 = vs1;
goto unaligned_jmp;
}
for (size_t i = 0; i < align_offset; ++i) {
adler += *(buf++);
sum2 += adler;
}
/* lop off the max number of sums based on the scalar sums done
* above */
len -= align_offset;
max_iters -= align_offset;
}
while (len >= 16) {
vs1 = _mm_cvtsi32_si128(adler);
vs2 = _mm_cvtsi32_si128(sum2);
vs3 = _mm_setzero_si128();
vs2_0 = _mm_setzero_si128();
vs1_0 = vs1;
k = (len < max_iters ? len : max_iters);
k -= k % 16;
len -= k;
while (k >= 32) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] )
*/
vbuf = _mm_load_si128((__m128i*)buf);
vbuf_0 = _mm_load_si128((__m128i*)(buf + 16));
buf += 32;
k -= 32;
v_sad_sum1 = _mm_sad_epu8(vbuf, zero);
v_sad_sum2 = _mm_sad_epu8(vbuf_0, zero);
vs1 = _mm_add_epi32(v_sad_sum1, vs1);
vs3 = _mm_add_epi32(vs1_0, vs3);
vs1 = _mm_add_epi32(v_sad_sum2, vs1);
v_short_sum2 = _mm_maddubs_epi16(vbuf, dot2v);
vsum2 = _mm_madd_epi16(v_short_sum2, dot3v);
v_short_sum2_0 = _mm_maddubs_epi16(vbuf_0, dot2v_0);
vs2 = _mm_add_epi32(vsum2, vs2);
vsum2_0 = _mm_madd_epi16(v_short_sum2_0, dot3v);
vs2_0 = _mm_add_epi32(vsum2_0, vs2_0);
vs1_0 = vs1;
}
vs2 = _mm_add_epi32(vs2_0, vs2);
vs3 = _mm_slli_epi32(vs3, 5);
vs2 = _mm_add_epi32(vs3, vs2);
vs3 = _mm_setzero_si128();
while (k >= 16) {
/*
vs1 = adler + sum(c[i])
vs2 = sum2 + 16 vs1 + sum( (16-i+1) c[i] )
*/
vbuf = _mm_load_si128((__m128i*)buf);
buf += 16;
k -= 16;
unaligned_jmp:
v_sad_sum1 = _mm_sad_epu8(vbuf, zero);
vs1 = _mm_add_epi32(v_sad_sum1, vs1);
vs3 = _mm_add_epi32(vs1_0, vs3);
v_short_sum2 = _mm_maddubs_epi16(vbuf, dot2v_0);
vsum2 = _mm_madd_epi16(v_short_sum2, dot3v);
vs2 = _mm_add_epi32(vsum2, vs2);
vs1_0 = vs1;
}
vs3 = _mm_slli_epi32(vs3, 4);
vs2 = _mm_add_epi32(vs2, vs3);
/* We don't actually need to do a full horizontal sum, since psadbw is actually doing
* a partial reduction sum implicitly and only summing to integers in vector positions
* 0 and 2. This saves us some contention on the shuffle port(s) */
adler = partial_hsum(vs1) % BASE;
sum2 = hsum(vs2) % BASE;
max_iters = NMAX;
}
/* Process tail (len < 16). */
return adler32_len_16(adler, buf, len, sum2);
}
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/adler32_ssse3_p.h 0000664 0000000 0000000 00000001355 14553115624 0021644 0 ustar 00root root 0000000 0000000 /* adler32_ssse3_p.h -- adler32 ssse3 utility functions
* Copyright (C) 2022 Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef ADLER32_SSSE3_P_H_
#define ADLER32_SSSE3_P_H_
#ifdef X86_SSSE3
#include
#include
static inline uint32_t partial_hsum(__m128i x) {
__m128i second_int = _mm_srli_si128(x, 8);
__m128i sum = _mm_add_epi32(x, second_int);
return _mm_cvtsi128_si32(sum);
}
static inline uint32_t hsum(__m128i x) {
__m128i sum1 = _mm_unpackhi_epi64(x, x);
__m128i sum2 = _mm_add_epi32(x, sum1);
__m128i sum3 = _mm_shuffle_epi32(sum2, 0x01);
__m128i sum4 = _mm_add_epi32(sum2, sum3);
return _mm_cvtsi128_si32(sum4);
}
#endif
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/chunkset_avx2.c 0000664 0000000 0000000 00000012230 14553115624 0021522 0 ustar 00root root 0000000 0000000 /* chunkset_avx2.c -- AVX2 inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#ifdef X86_AVX2
#include
#include "../generic/chunk_permute_table.h"
typedef __m256i chunk_t;
#define CHUNK_SIZE 32
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
#define HAVE_CHUNK_MAG
/* Populate don't cares so that this is a direct lookup (with some indirection into the permute table), because dist can
* never be 0 - 2, we'll start with an offset, subtracting 3 from the input */
static const lut_rem_pair perm_idx_lut[29] = {
{ 0, 2}, /* 3 */
{ 0, 0}, /* don't care */
{ 1 * 32, 2}, /* 5 */
{ 2 * 32, 2}, /* 6 */
{ 3 * 32, 4}, /* 7 */
{ 0 * 32, 0}, /* don't care */
{ 4 * 32, 5}, /* 9 */
{ 5 * 32, 22}, /* 10 */
{ 6 * 32, 21}, /* 11 */
{ 7 * 32, 20}, /* 12 */
{ 8 * 32, 6}, /* 13 */
{ 9 * 32, 4}, /* 14 */
{10 * 32, 2}, /* 15 */
{ 0 * 32, 0}, /* don't care */
{11 * 32, 15}, /* 17 */
{11 * 32 + 16, 14}, /* 18 */
{11 * 32 + 16 * 2, 13}, /* 19 */
{11 * 32 + 16 * 3, 12}, /* 20 */
{11 * 32 + 16 * 4, 11}, /* 21 */
{11 * 32 + 16 * 5, 10}, /* 22 */
{11 * 32 + 16 * 6, 9}, /* 23 */
{11 * 32 + 16 * 7, 8}, /* 24 */
{11 * 32 + 16 * 8, 7}, /* 25 */
{11 * 32 + 16 * 9, 6}, /* 26 */
{11 * 32 + 16 * 10, 5}, /* 27 */
{11 * 32 + 16 * 11, 4}, /* 28 */
{11 * 32 + 16 * 12, 3}, /* 29 */
{11 * 32 + 16 * 13, 2}, /* 30 */
{11 * 32 + 16 * 14, 1} /* 31 */
};
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
int16_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm256_set1_epi16(tmp);
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
int32_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm256_set1_epi32(tmp);
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
int64_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm256_set1_epi64x(tmp);
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
*chunk = _mm256_loadu_si256((__m256i *)s);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
_mm256_storeu_si256((__m256i *)out, *chunk);
}
static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t dist) {
lut_rem_pair lut_rem = perm_idx_lut[dist - 3];
__m256i ret_vec;
/* While technically we only need to read 4 or 8 bytes into this vector register for a lot of cases, GCC is
* compiling this to a shared load for all branches, preferring the simpler code. Given that the buf value isn't in
* GPRs to begin with the 256 bit load is _probably_ just as inexpensive */
*chunk_rem = lut_rem.remval;
/* See note in chunkset_ssse3.c for why this is ok */
__msan_unpoison(buf + dist, 32 - dist);
if (dist < 16) {
/* This simpler case still requires us to shuffle in 128 bit lanes, so we must apply a static offset after
* broadcasting the first vector register to both halves. This is _marginally_ faster than doing two separate
* shuffles and combining the halves later */
const __m256i permute_xform =
_mm256_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16);
__m256i perm_vec = _mm256_load_si256((__m256i*)(permute_table+lut_rem.idx));
__m128i ret_vec0 = _mm_loadu_si128((__m128i*)buf);
perm_vec = _mm256_add_epi8(perm_vec, permute_xform);
ret_vec = _mm256_inserti128_si256(_mm256_castsi128_si256(ret_vec0), ret_vec0, 1);
ret_vec = _mm256_shuffle_epi8(ret_vec, perm_vec);
} else if (dist == 16) {
__m128i ret_vec0 = _mm_loadu_si128((__m128i*)buf);
return _mm256_inserti128_si256(_mm256_castsi128_si256(ret_vec0), ret_vec0, 1);
} else {
__m128i ret_vec0 = _mm_loadu_si128((__m128i*)buf);
__m128i ret_vec1 = _mm_loadu_si128((__m128i*)(buf + 16));
/* Take advantage of the fact that only the latter half of the 256 bit vector will actually differ */
__m128i perm_vec1 = _mm_load_si128((__m128i*)(permute_table + lut_rem.idx));
__m128i xlane_permutes = _mm_cmpgt_epi8(_mm_set1_epi8(16), perm_vec1);
__m128i xlane_res = _mm_shuffle_epi8(ret_vec0, perm_vec1);
/* Since we can't wrap twice, we can simply keep the later half exactly how it is instead of having to _also_
* shuffle those values */
__m128i latter_half = _mm_blendv_epi8(ret_vec1, xlane_res, xlane_permutes);
ret_vec = _mm256_inserti128_si256(_mm256_castsi128_si256(ret_vec0), latter_half, 1);
}
return ret_vec;
}
#define CHUNKSIZE chunksize_avx2
#define CHUNKCOPY chunkcopy_avx2
#define CHUNKUNROLL chunkunroll_avx2
#define CHUNKMEMSET chunkmemset_avx2
#define CHUNKMEMSET_SAFE chunkmemset_safe_avx2
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_avx2
#include "inffast_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/chunkset_sse2.c 0000664 0000000 0000000 00000002511 14553115624 0021517 0 ustar 00root root 0000000 0000000 /* chunkset_sse2.c -- SSE2 inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#ifdef X86_SSE2
#include
typedef __m128i chunk_t;
#define CHUNK_SIZE 16
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
int16_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi16(tmp);
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
int32_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi32(tmp);
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
int64_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi64x(tmp);
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
*chunk = _mm_loadu_si128((__m128i *)s);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
_mm_storeu_si128((__m128i *)out, *chunk);
}
#define CHUNKSIZE chunksize_sse2
#define CHUNKCOPY chunkcopy_sse2
#define CHUNKUNROLL chunkunroll_sse2
#define CHUNKMEMSET chunkmemset_sse2
#define CHUNKMEMSET_SAFE chunkmemset_safe_sse2
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_sse2
#include "inffast_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/chunkset_ssse3.c 0000664 0000000 0000000 00000005725 14553115624 0021715 0 ustar 00root root 0000000 0000000 /* chunkset_ssse3.c -- SSSE3 inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
/* This requires SSE2 support. While it's implicit with SSSE3, we can minimize
* code size by sharing the chunkcopy functions, which will certainly compile
* to identical machine code */
#if defined(X86_SSSE3) && defined(X86_SSE2)
#include
#include "../generic/chunk_permute_table.h"
typedef __m128i chunk_t;
#define CHUNK_SIZE 16
#define HAVE_CHUNKMEMSET_2
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
#define HAVE_CHUNK_MAG
#define HAVE_CHUNKCOPY
#define HAVE_CHUNKUNROLL
static const lut_rem_pair perm_idx_lut[13] = {
{0, 1}, /* 3 */
{0, 0}, /* don't care */
{1 * 32, 1}, /* 5 */
{2 * 32, 4}, /* 6 */
{3 * 32, 2}, /* 7 */
{0 * 32, 0}, /* don't care */
{4 * 32, 7}, /* 9 */
{5 * 32, 6}, /* 10 */
{6 * 32, 5}, /* 11 */
{7 * 32, 4}, /* 12 */
{8 * 32, 3}, /* 13 */
{9 * 32, 2}, /* 14 */
{10 * 32, 1},/* 15 */
};
static inline void chunkmemset_2(uint8_t *from, chunk_t *chunk) {
int16_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi16(tmp);
}
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
int32_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi32(tmp);
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
int64_t tmp;
memcpy(&tmp, from, sizeof(tmp));
*chunk = _mm_set1_epi64x(tmp);
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
*chunk = _mm_loadu_si128((__m128i *)s);
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
_mm_storeu_si128((__m128i *)out, *chunk);
}
static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t dist) {
lut_rem_pair lut_rem = perm_idx_lut[dist - 3];
__m128i perm_vec, ret_vec;
/* Important to note:
* This is _not_ to subvert the memory sanitizer but to instead unpoison some
* bytes we willingly and purposefully load uninitialized that we swizzle over
* in a vector register, anyway. If what we assume is wrong about what is used,
* the memory sanitizer will still usefully flag it */
__msan_unpoison(buf + dist, 16 - dist);
ret_vec = _mm_loadu_si128((__m128i*)buf);
*chunk_rem = lut_rem.remval;
perm_vec = _mm_load_si128((__m128i*)(permute_table + lut_rem.idx));
ret_vec = _mm_shuffle_epi8(ret_vec, perm_vec);
return ret_vec;
}
extern uint8_t* chunkcopy_sse2(uint8_t *out, uint8_t const *from, unsigned len);
extern uint8_t* chunkunroll_sse2(uint8_t *out, unsigned *dist, unsigned *len);
#define CHUNKSIZE chunksize_ssse3
#define CHUNKMEMSET chunkmemset_ssse3
#define CHUNKMEMSET_SAFE chunkmemset_safe_ssse3
#define CHUNKCOPY chunkcopy_sse2
#define CHUNKUNROLL chunkunroll_sse2
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_ssse3
#include "inffast_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/compare256_avx2.c 0000664 0000000 0000000 00000003601 14553115624 0021563 0 ustar 00root root 0000000 0000000 /* compare256_avx2.c -- AVX2 version of compare256
* Copyright Mika T. Lindqvist
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "fallback_builtins.h"
#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ)
#include
#ifdef _MSC_VER
# include
#endif
static inline uint32_t compare256_avx2_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
__m256i ymm_src0, ymm_src1, ymm_cmp;
ymm_src0 = _mm256_loadu_si256((__m256i*)src0);
ymm_src1 = _mm256_loadu_si256((__m256i*)src1);
ymm_cmp = _mm256_cmpeq_epi8(ymm_src0, ymm_src1); /* non-identical bytes = 00, identical bytes = FF */
unsigned mask = (unsigned)_mm256_movemask_epi8(ymm_cmp);
if (mask != 0xFFFFFFFF) {
uint32_t match_byte = (uint32_t)__builtin_ctz(~mask); /* Invert bits so identical = 0 */
return len + match_byte;
}
src0 += 32, src1 += 32, len += 32;
ymm_src0 = _mm256_loadu_si256((__m256i*)src0);
ymm_src1 = _mm256_loadu_si256((__m256i*)src1);
ymm_cmp = _mm256_cmpeq_epi8(ymm_src0, ymm_src1);
mask = (unsigned)_mm256_movemask_epi8(ymm_cmp);
if (mask != 0xFFFFFFFF) {
uint32_t match_byte = (uint32_t)__builtin_ctz(~mask);
return len + match_byte;
}
src0 += 32, src1 += 32, len += 32;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_avx2(const uint8_t *src0, const uint8_t *src1) {
return compare256_avx2_static(src0, src1);
}
#define LONGEST_MATCH longest_match_avx2
#define COMPARE256 compare256_avx2_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_avx2
#define COMPARE256 compare256_avx2_static
#include "match_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/compare256_sse2.c 0000664 0000000 0000000 00000005513 14553115624 0021563 0 ustar 00root root 0000000 0000000 /* compare256_sse2.c -- SSE2 version of compare256
* Copyright Adam Stylinski
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "fallback_builtins.h"
#if defined(X86_SSE2) && defined(HAVE_BUILTIN_CTZ)
#include
static inline uint32_t compare256_sse2_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
int align_offset = ((uintptr_t)src0) & 15;
const uint8_t *end0 = src0 + 256;
const uint8_t *end1 = src1 + 256;
__m128i xmm_src0, xmm_src1, xmm_cmp;
/* Do the first load unaligned, than all subsequent ones we have at least
* one aligned load. Sadly aligning both loads is probably unrealistic */
xmm_src0 = _mm_loadu_si128((__m128i*)src0);
xmm_src1 = _mm_loadu_si128((__m128i*)src1);
xmm_cmp = _mm_cmpeq_epi8(xmm_src0, xmm_src1);
unsigned mask = (unsigned)_mm_movemask_epi8(xmm_cmp);
/* Compiler _may_ turn this branch into a ptest + movemask,
* since a lot of those uops are shared and fused */
if (mask != 0xFFFF) {
uint32_t match_byte = (uint32_t)__builtin_ctz(~mask);
return len + match_byte;
}
int align_adv = 16 - align_offset;
len += align_adv;
src0 += align_adv;
src1 += align_adv;
/* Do a flooring division (should just be a shift right) */
int num_iter = (256 - len) / 16;
for (int i = 0; i < num_iter; ++i) {
xmm_src0 = _mm_load_si128((__m128i*)src0);
xmm_src1 = _mm_loadu_si128((__m128i*)src1);
xmm_cmp = _mm_cmpeq_epi8(xmm_src0, xmm_src1);
mask = (unsigned)_mm_movemask_epi8(xmm_cmp);
/* Compiler _may_ turn this branch into a ptest + movemask,
* since a lot of those uops are shared and fused */
if (mask != 0xFFFF) {
uint32_t match_byte = (uint32_t)__builtin_ctz(~mask);
return len + match_byte;
}
len += 16, src0 += 16, src1 += 16;
}
if (align_offset) {
src0 = end0 - 16;
src1 = end1 - 16;
len = 256 - 16;
xmm_src0 = _mm_loadu_si128((__m128i*)src0);
xmm_src1 = _mm_loadu_si128((__m128i*)src1);
xmm_cmp = _mm_cmpeq_epi8(xmm_src0, xmm_src1);
mask = (unsigned)_mm_movemask_epi8(xmm_cmp);
if (mask != 0xFFFF) {
uint32_t match_byte = (uint32_t)__builtin_ctz(~mask);
return len + match_byte;
}
}
return 256;
}
Z_INTERNAL uint32_t compare256_sse2(const uint8_t *src0, const uint8_t *src1) {
return compare256_sse2_static(src0, src1);
}
#define LONGEST_MATCH longest_match_sse2
#define COMPARE256 compare256_sse2_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_sse2
#define COMPARE256 compare256_sse2_static
#include "match_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/crc32_fold_pclmulqdq_tpl.h 0000664 0000000 0000000 00000013432 14553115624 0023631 0 ustar 00root root 0000000 0000000 /*
* Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ
* instruction.
*
* A white paper describing this algorithm can be found at:
* doc/crc-pclmulqdq.pdf
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Copyright (C) 2016 Marian Beermann (support for initial value)
* Authors:
* Wajdi Feghali
* Jim Guilford
* Vinodh Gopal
* Erdinc Ozturk
* Jim Kukunas
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef COPY
Z_INTERNAL void CRC32_FOLD_COPY(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
#else
Z_INTERNAL void CRC32_FOLD(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
#endif
unsigned long algn_diff;
__m128i xmm_t0, xmm_t1, xmm_t2, xmm_t3;
__m128i xmm_crc0, xmm_crc1, xmm_crc2, xmm_crc3;
__m128i xmm_crc_part = _mm_setzero_si128();
#ifdef COPY
char ALIGNED_(16) partial_buf[16] = { 0 };
#else
__m128i xmm_initial = _mm_cvtsi32_si128(init_crc);
int32_t first = init_crc != 0;
/* Technically the CRC functions don't even call this for input < 64, but a bare minimum of 31
* bytes of input is needed for the aligning load that occurs. If there's an initial CRC, to
* carry it forward through the folded CRC there must be 16 - src % 16 + 16 bytes available, which
* by definition can be up to 15 bytes + one full vector load. */
assert(len >= 31 || first == 0);
#endif
crc32_fold_load((__m128i *)crc->fold, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
if (len < 16) {
#ifdef COPY
if (len == 0)
return;
memcpy(partial_buf, src, len);
xmm_crc_part = _mm_load_si128((const __m128i *)partial_buf);
memcpy(dst, partial_buf, len);
#endif
goto partial;
}
algn_diff = ((uintptr_t)16 - ((uintptr_t)src & 0xF)) & 0xF;
if (algn_diff) {
xmm_crc_part = _mm_loadu_si128((__m128i *)src);
#ifdef COPY
_mm_storeu_si128((__m128i *)dst, xmm_crc_part);
dst += algn_diff;
#else
XOR_INITIAL128(xmm_crc_part);
if (algn_diff < 4 && init_crc != 0) {
xmm_t0 = xmm_crc_part;
xmm_crc_part = _mm_loadu_si128((__m128i*)src + 1);
fold_1(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_t0);
src += 16;
len -= 16;
}
#endif
partial_fold(algn_diff, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, &xmm_crc_part);
src += algn_diff;
len -= algn_diff;
}
#ifdef X86_VPCLMULQDQ
if (len >= 256) {
#ifdef COPY
size_t n = fold_16_vpclmulqdq_copy(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, dst, src, len);
dst += n;
#else
size_t n = fold_16_vpclmulqdq(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, src, len,
xmm_initial, first);
first = 0;
#endif
len -= n;
src += n;
}
#endif
while (len >= 64) {
len -= 64;
xmm_t0 = _mm_load_si128((__m128i *)src);
xmm_t1 = _mm_load_si128((__m128i *)src + 1);
xmm_t2 = _mm_load_si128((__m128i *)src + 2);
xmm_t3 = _mm_load_si128((__m128i *)src + 3);
src += 64;
fold_4(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
#ifdef COPY
_mm_storeu_si128((__m128i *)dst, xmm_t0);
_mm_storeu_si128((__m128i *)dst + 1, xmm_t1);
_mm_storeu_si128((__m128i *)dst + 2, xmm_t2);
_mm_storeu_si128((__m128i *)dst + 3, xmm_t3);
dst += 64;
#else
XOR_INITIAL128(xmm_t0);
#endif
xmm_crc0 = _mm_xor_si128(xmm_crc0, xmm_t0);
xmm_crc1 = _mm_xor_si128(xmm_crc1, xmm_t1);
xmm_crc2 = _mm_xor_si128(xmm_crc2, xmm_t2);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_t3);
}
/*
* len = num bytes left - 64
*/
if (len >= 48) {
len -= 48;
xmm_t0 = _mm_load_si128((__m128i *)src);
xmm_t1 = _mm_load_si128((__m128i *)src + 1);
xmm_t2 = _mm_load_si128((__m128i *)src + 2);
src += 48;
#ifdef COPY
_mm_storeu_si128((__m128i *)dst, xmm_t0);
_mm_storeu_si128((__m128i *)dst + 1, xmm_t1);
_mm_storeu_si128((__m128i *)dst + 2, xmm_t2);
dst += 48;
#else
XOR_INITIAL128(xmm_t0);
#endif
fold_3(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
xmm_crc1 = _mm_xor_si128(xmm_crc1, xmm_t0);
xmm_crc2 = _mm_xor_si128(xmm_crc2, xmm_t1);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_t2);
} else if (len >= 32) {
len -= 32;
xmm_t0 = _mm_load_si128((__m128i *)src);
xmm_t1 = _mm_load_si128((__m128i *)src + 1);
src += 32;
#ifdef COPY
_mm_storeu_si128((__m128i *)dst, xmm_t0);
_mm_storeu_si128((__m128i *)dst + 1, xmm_t1);
dst += 32;
#else
XOR_INITIAL128(xmm_t0);
#endif
fold_2(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
xmm_crc2 = _mm_xor_si128(xmm_crc2, xmm_t0);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_t1);
} else if (len >= 16) {
len -= 16;
xmm_t0 = _mm_load_si128((__m128i *)src);
src += 16;
#ifdef COPY
_mm_storeu_si128((__m128i *)dst, xmm_t0);
dst += 16;
#else
XOR_INITIAL128(xmm_t0);
#endif
fold_1(&xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_t0);
}
partial:
if (len) {
memcpy(&xmm_crc_part, src, len);
#ifdef COPY
_mm_storeu_si128((__m128i *)partial_buf, xmm_crc_part);
memcpy(dst, partial_buf, len);
#endif
partial_fold(len, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3, &xmm_crc_part);
}
crc32_fold_save((__m128i *)crc->fold, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
}
3p-zlib-ng-main/zlib-ng/arch/x86/crc32_fold_vpclmulqdq_tpl.h 0000664 0000000 0000000 00000010724 14553115624 0024020 0 ustar 00root root 0000000 0000000 /* crc32_fold_vpclmulqdq_tpl.h -- VPCMULQDQ-based CRC32 folding template.
* Copyright Wangyang Guo (wangyang.guo@intel.com)
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef COPY
static size_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1,
__m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, size_t len) {
#else
static size_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1,
__m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, size_t len,
__m128i init_crc, int32_t first) {
__m512i zmm_initial = _mm512_zextsi128_si512(init_crc);
#endif
__m512i zmm_t0, zmm_t1, zmm_t2, zmm_t3;
__m512i zmm_crc0, zmm_crc1, zmm_crc2, zmm_crc3;
__m512i z0, z1, z2, z3;
size_t len_tmp = len;
const __m512i zmm_fold4 = _mm512_set4_epi32(
0x00000001, 0x54442bd4, 0x00000001, 0xc6e41596);
const __m512i zmm_fold16 = _mm512_set4_epi32(
0x00000001, 0x1542778a, 0x00000001, 0x322d1430);
// zmm register init
zmm_crc0 = _mm512_setzero_si512();
zmm_t0 = _mm512_loadu_si512((__m512i *)src);
#ifndef COPY
XOR_INITIAL512(zmm_t0);
#endif
zmm_crc1 = _mm512_loadu_si512((__m512i *)src + 1);
zmm_crc2 = _mm512_loadu_si512((__m512i *)src + 2);
zmm_crc3 = _mm512_loadu_si512((__m512i *)src + 3);
/* already have intermediate CRC in xmm registers
* fold4 with 4 xmm_crc to get zmm_crc0
*/
zmm_crc0 = _mm512_inserti32x4(zmm_crc0, *xmm_crc0, 0);
zmm_crc0 = _mm512_inserti32x4(zmm_crc0, *xmm_crc1, 1);
zmm_crc0 = _mm512_inserti32x4(zmm_crc0, *xmm_crc2, 2);
zmm_crc0 = _mm512_inserti32x4(zmm_crc0, *xmm_crc3, 3);
z0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x01);
zmm_crc0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x10);
zmm_crc0 = _mm512_ternarylogic_epi32(zmm_crc0, z0, zmm_t0, 0x96);
#ifdef COPY
_mm512_storeu_si512((__m512i *)dst, zmm_t0);
_mm512_storeu_si512((__m512i *)dst + 1, zmm_crc1);
_mm512_storeu_si512((__m512i *)dst + 2, zmm_crc2);
_mm512_storeu_si512((__m512i *)dst + 3, zmm_crc3);
dst += 256;
#endif
len -= 256;
src += 256;
// fold-16 loops
while (len >= 256) {
zmm_t0 = _mm512_loadu_si512((__m512i *)src);
zmm_t1 = _mm512_loadu_si512((__m512i *)src + 1);
zmm_t2 = _mm512_loadu_si512((__m512i *)src + 2);
zmm_t3 = _mm512_loadu_si512((__m512i *)src + 3);
z0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold16, 0x01);
z1 = _mm512_clmulepi64_epi128(zmm_crc1, zmm_fold16, 0x01);
z2 = _mm512_clmulepi64_epi128(zmm_crc2, zmm_fold16, 0x01);
z3 = _mm512_clmulepi64_epi128(zmm_crc3, zmm_fold16, 0x01);
zmm_crc0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold16, 0x10);
zmm_crc1 = _mm512_clmulepi64_epi128(zmm_crc1, zmm_fold16, 0x10);
zmm_crc2 = _mm512_clmulepi64_epi128(zmm_crc2, zmm_fold16, 0x10);
zmm_crc3 = _mm512_clmulepi64_epi128(zmm_crc3, zmm_fold16, 0x10);
zmm_crc0 = _mm512_ternarylogic_epi32(zmm_crc0, z0, zmm_t0, 0x96);
zmm_crc1 = _mm512_ternarylogic_epi32(zmm_crc1, z1, zmm_t1, 0x96);
zmm_crc2 = _mm512_ternarylogic_epi32(zmm_crc2, z2, zmm_t2, 0x96);
zmm_crc3 = _mm512_ternarylogic_epi32(zmm_crc3, z3, zmm_t3, 0x96);
#ifdef COPY
_mm512_storeu_si512((__m512i *)dst, zmm_t0);
_mm512_storeu_si512((__m512i *)dst + 1, zmm_t1);
_mm512_storeu_si512((__m512i *)dst + 2, zmm_t2);
_mm512_storeu_si512((__m512i *)dst + 3, zmm_t3);
dst += 256;
#endif
len -= 256;
src += 256;
}
// zmm_crc[0,1,2,3] -> zmm_crc0
z0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x01);
zmm_crc0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x10);
zmm_crc0 = _mm512_ternarylogic_epi32(zmm_crc0, z0, zmm_crc1, 0x96);
z0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x01);
zmm_crc0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x10);
zmm_crc0 = _mm512_ternarylogic_epi32(zmm_crc0, z0, zmm_crc2, 0x96);
z0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x01);
zmm_crc0 = _mm512_clmulepi64_epi128(zmm_crc0, zmm_fold4, 0x10);
zmm_crc0 = _mm512_ternarylogic_epi32(zmm_crc0, z0, zmm_crc3, 0x96);
// zmm_crc0 -> xmm_crc[0, 1, 2, 3]
*xmm_crc0 = _mm512_extracti32x4_epi32(zmm_crc0, 0);
*xmm_crc1 = _mm512_extracti32x4_epi32(zmm_crc0, 1);
*xmm_crc2 = _mm512_extracti32x4_epi32(zmm_crc0, 2);
*xmm_crc3 = _mm512_extracti32x4_epi32(zmm_crc0, 3);
return (len_tmp - len); // return n bytes processed
}
3p-zlib-ng-main/zlib-ng/arch/x86/crc32_pclmulqdq.c 0000664 0000000 0000000 00000001723 14553115624 0021741 0 ustar 00root root 0000000 0000000 /*
* Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ
* instruction.
*
* A white paper describing this algorithm can be found at:
* doc/crc-pclmulqdq.pdf
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Copyright (C) 2016 Marian Beermann (support for initial value)
* Authors:
* Wajdi Feghali
* Jim Guilford
* Vinodh Gopal
* Erdinc Ozturk
* Jim Kukunas
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifdef X86_PCLMULQDQ_CRC
#define CRC32_FOLD_COPY crc32_fold_pclmulqdq_copy
#define CRC32_FOLD crc32_fold_pclmulqdq
#define CRC32_FOLD_RESET crc32_fold_pclmulqdq_reset
#define CRC32_FOLD_FINAL crc32_fold_pclmulqdq_final
#define CRC32 crc32_pclmulqdq
#include "crc32_pclmulqdq_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/crc32_pclmulqdq_tpl.h 0000664 0000000 0000000 00000032640 14553115624 0022627 0 ustar 00root root 0000000 0000000 /*
* Compute the CRC32 using a parallelized folding approach with the PCLMULQDQ
* instruction.
*
* A white paper describing this algorithm can be found at:
* doc/crc-pclmulqdq.pdf
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Copyright (C) 2016 Marian Beermann (support for initial value)
* Authors:
* Wajdi Feghali
* Jim Guilford
* Vinodh Gopal
* Erdinc Ozturk
* Jim Kukunas
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include
#include
#include // _mm_extract_epi32
#ifdef X86_VPCLMULQDQ
# include
#endif
#include "../../crc32_fold.h"
#include "../../crc32_braid_p.h"
#include "x86_intrins.h"
#include
#ifdef X86_VPCLMULQDQ
static size_t fold_16_vpclmulqdq(__m128i *xmm_crc0, __m128i *xmm_crc1,
__m128i *xmm_crc2, __m128i *xmm_crc3, const uint8_t *src, size_t len, __m128i init_crc,
int32_t first);
static size_t fold_16_vpclmulqdq_copy(__m128i *xmm_crc0, __m128i *xmm_crc1,
__m128i *xmm_crc2, __m128i *xmm_crc3, uint8_t *dst, const uint8_t *src, size_t len);
#endif
static void fold_1(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3) {
const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4,
0x00000001, 0xc6e41596);
__m128i x_tmp3;
__m128 ps_crc0, ps_crc3, ps_res;
x_tmp3 = *xmm_crc3;
*xmm_crc3 = *xmm_crc0;
*xmm_crc0 = _mm_clmulepi64_si128(*xmm_crc0, xmm_fold4, 0x01);
*xmm_crc3 = _mm_clmulepi64_si128(*xmm_crc3, xmm_fold4, 0x10);
ps_crc0 = _mm_castsi128_ps(*xmm_crc0);
ps_crc3 = _mm_castsi128_ps(*xmm_crc3);
ps_res = _mm_xor_ps(ps_crc0, ps_crc3);
*xmm_crc0 = *xmm_crc1;
*xmm_crc1 = *xmm_crc2;
*xmm_crc2 = x_tmp3;
*xmm_crc3 = _mm_castps_si128(ps_res);
}
static void fold_2(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3) {
const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4,
0x00000001, 0xc6e41596);
__m128i x_tmp3, x_tmp2;
__m128 ps_crc0, ps_crc1, ps_crc2, ps_crc3, ps_res31, ps_res20;
x_tmp3 = *xmm_crc3;
x_tmp2 = *xmm_crc2;
*xmm_crc3 = *xmm_crc1;
*xmm_crc1 = _mm_clmulepi64_si128(*xmm_crc1, xmm_fold4, 0x01);
*xmm_crc3 = _mm_clmulepi64_si128(*xmm_crc3, xmm_fold4, 0x10);
ps_crc3 = _mm_castsi128_ps(*xmm_crc3);
ps_crc1 = _mm_castsi128_ps(*xmm_crc1);
ps_res31 = _mm_xor_ps(ps_crc3, ps_crc1);
*xmm_crc2 = *xmm_crc0;
*xmm_crc0 = _mm_clmulepi64_si128(*xmm_crc0, xmm_fold4, 0x01);
*xmm_crc2 = _mm_clmulepi64_si128(*xmm_crc2, xmm_fold4, 0x10);
ps_crc0 = _mm_castsi128_ps(*xmm_crc0);
ps_crc2 = _mm_castsi128_ps(*xmm_crc2);
ps_res20 = _mm_xor_ps(ps_crc0, ps_crc2);
*xmm_crc0 = x_tmp2;
*xmm_crc1 = x_tmp3;
*xmm_crc2 = _mm_castps_si128(ps_res20);
*xmm_crc3 = _mm_castps_si128(ps_res31);
}
static void fold_3(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3) {
const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4,
0x00000001, 0xc6e41596);
__m128i x_tmp3;
__m128 ps_crc0, ps_crc1, ps_crc2, ps_crc3, ps_res32, ps_res21, ps_res10;
x_tmp3 = *xmm_crc3;
*xmm_crc3 = *xmm_crc2;
*xmm_crc2 = _mm_clmulepi64_si128(*xmm_crc2, xmm_fold4, 0x01);
*xmm_crc3 = _mm_clmulepi64_si128(*xmm_crc3, xmm_fold4, 0x10);
ps_crc2 = _mm_castsi128_ps(*xmm_crc2);
ps_crc3 = _mm_castsi128_ps(*xmm_crc3);
ps_res32 = _mm_xor_ps(ps_crc2, ps_crc3);
*xmm_crc2 = *xmm_crc1;
*xmm_crc1 = _mm_clmulepi64_si128(*xmm_crc1, xmm_fold4, 0x01);
*xmm_crc2 = _mm_clmulepi64_si128(*xmm_crc2, xmm_fold4, 0x10);
ps_crc1 = _mm_castsi128_ps(*xmm_crc1);
ps_crc2 = _mm_castsi128_ps(*xmm_crc2);
ps_res21 = _mm_xor_ps(ps_crc1, ps_crc2);
*xmm_crc1 = *xmm_crc0;
*xmm_crc0 = _mm_clmulepi64_si128(*xmm_crc0, xmm_fold4, 0x01);
*xmm_crc1 = _mm_clmulepi64_si128(*xmm_crc1, xmm_fold4, 0x10);
ps_crc0 = _mm_castsi128_ps(*xmm_crc0);
ps_crc1 = _mm_castsi128_ps(*xmm_crc1);
ps_res10 = _mm_xor_ps(ps_crc0, ps_crc1);
*xmm_crc0 = x_tmp3;
*xmm_crc1 = _mm_castps_si128(ps_res10);
*xmm_crc2 = _mm_castps_si128(ps_res21);
*xmm_crc3 = _mm_castps_si128(ps_res32);
}
static void fold_4(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2, __m128i *xmm_crc3) {
const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4,
0x00000001, 0xc6e41596);
__m128i x_tmp0, x_tmp1, x_tmp2, x_tmp3;
__m128 ps_crc0, ps_crc1, ps_crc2, ps_crc3;
__m128 ps_t0, ps_t1, ps_t2, ps_t3;
__m128 ps_res0, ps_res1, ps_res2, ps_res3;
x_tmp0 = *xmm_crc0;
x_tmp1 = *xmm_crc1;
x_tmp2 = *xmm_crc2;
x_tmp3 = *xmm_crc3;
*xmm_crc0 = _mm_clmulepi64_si128(*xmm_crc0, xmm_fold4, 0x01);
x_tmp0 = _mm_clmulepi64_si128(x_tmp0, xmm_fold4, 0x10);
ps_crc0 = _mm_castsi128_ps(*xmm_crc0);
ps_t0 = _mm_castsi128_ps(x_tmp0);
ps_res0 = _mm_xor_ps(ps_crc0, ps_t0);
*xmm_crc1 = _mm_clmulepi64_si128(*xmm_crc1, xmm_fold4, 0x01);
x_tmp1 = _mm_clmulepi64_si128(x_tmp1, xmm_fold4, 0x10);
ps_crc1 = _mm_castsi128_ps(*xmm_crc1);
ps_t1 = _mm_castsi128_ps(x_tmp1);
ps_res1 = _mm_xor_ps(ps_crc1, ps_t1);
*xmm_crc2 = _mm_clmulepi64_si128(*xmm_crc2, xmm_fold4, 0x01);
x_tmp2 = _mm_clmulepi64_si128(x_tmp2, xmm_fold4, 0x10);
ps_crc2 = _mm_castsi128_ps(*xmm_crc2);
ps_t2 = _mm_castsi128_ps(x_tmp2);
ps_res2 = _mm_xor_ps(ps_crc2, ps_t2);
*xmm_crc3 = _mm_clmulepi64_si128(*xmm_crc3, xmm_fold4, 0x01);
x_tmp3 = _mm_clmulepi64_si128(x_tmp3, xmm_fold4, 0x10);
ps_crc3 = _mm_castsi128_ps(*xmm_crc3);
ps_t3 = _mm_castsi128_ps(x_tmp3);
ps_res3 = _mm_xor_ps(ps_crc3, ps_t3);
*xmm_crc0 = _mm_castps_si128(ps_res0);
*xmm_crc1 = _mm_castps_si128(ps_res1);
*xmm_crc2 = _mm_castps_si128(ps_res2);
*xmm_crc3 = _mm_castps_si128(ps_res3);
}
static const unsigned ALIGNED_(32) pshufb_shf_table[60] = {
0x84838281, 0x88878685, 0x8c8b8a89, 0x008f8e8d, /* shl 15 (16 - 1)/shr1 */
0x85848382, 0x89888786, 0x8d8c8b8a, 0x01008f8e, /* shl 14 (16 - 3)/shr2 */
0x86858483, 0x8a898887, 0x8e8d8c8b, 0x0201008f, /* shl 13 (16 - 4)/shr3 */
0x87868584, 0x8b8a8988, 0x8f8e8d8c, 0x03020100, /* shl 12 (16 - 4)/shr4 */
0x88878685, 0x8c8b8a89, 0x008f8e8d, 0x04030201, /* shl 11 (16 - 5)/shr5 */
0x89888786, 0x8d8c8b8a, 0x01008f8e, 0x05040302, /* shl 10 (16 - 6)/shr6 */
0x8a898887, 0x8e8d8c8b, 0x0201008f, 0x06050403, /* shl 9 (16 - 7)/shr7 */
0x8b8a8988, 0x8f8e8d8c, 0x03020100, 0x07060504, /* shl 8 (16 - 8)/shr8 */
0x8c8b8a89, 0x008f8e8d, 0x04030201, 0x08070605, /* shl 7 (16 - 9)/shr9 */
0x8d8c8b8a, 0x01008f8e, 0x05040302, 0x09080706, /* shl 6 (16 -10)/shr10*/
0x8e8d8c8b, 0x0201008f, 0x06050403, 0x0a090807, /* shl 5 (16 -11)/shr11*/
0x8f8e8d8c, 0x03020100, 0x07060504, 0x0b0a0908, /* shl 4 (16 -12)/shr12*/
0x008f8e8d, 0x04030201, 0x08070605, 0x0c0b0a09, /* shl 3 (16 -13)/shr13*/
0x01008f8e, 0x05040302, 0x09080706, 0x0d0c0b0a, /* shl 2 (16 -14)/shr14*/
0x0201008f, 0x06050403, 0x0a090807, 0x0e0d0c0b /* shl 1 (16 -15)/shr15*/
};
static void partial_fold(const size_t len, __m128i *xmm_crc0, __m128i *xmm_crc1, __m128i *xmm_crc2,
__m128i *xmm_crc3, __m128i *xmm_crc_part) {
const __m128i xmm_fold4 = _mm_set_epi32( 0x00000001, 0x54442bd4,
0x00000001, 0xc6e41596);
const __m128i xmm_mask3 = _mm_set1_epi32((int32_t)0x80808080);
__m128i xmm_shl, xmm_shr, xmm_tmp1, xmm_tmp2, xmm_tmp3;
__m128i xmm_a0_0, xmm_a0_1;
__m128 ps_crc3, psa0_0, psa0_1, ps_res;
xmm_shl = _mm_load_si128((__m128i *)(pshufb_shf_table + (4 * (len - 1))));
xmm_shr = xmm_shl;
xmm_shr = _mm_xor_si128(xmm_shr, xmm_mask3);
xmm_a0_0 = _mm_shuffle_epi8(*xmm_crc0, xmm_shl);
*xmm_crc0 = _mm_shuffle_epi8(*xmm_crc0, xmm_shr);
xmm_tmp1 = _mm_shuffle_epi8(*xmm_crc1, xmm_shl);
*xmm_crc0 = _mm_or_si128(*xmm_crc0, xmm_tmp1);
*xmm_crc1 = _mm_shuffle_epi8(*xmm_crc1, xmm_shr);
xmm_tmp2 = _mm_shuffle_epi8(*xmm_crc2, xmm_shl);
*xmm_crc1 = _mm_or_si128(*xmm_crc1, xmm_tmp2);
*xmm_crc2 = _mm_shuffle_epi8(*xmm_crc2, xmm_shr);
xmm_tmp3 = _mm_shuffle_epi8(*xmm_crc3, xmm_shl);
*xmm_crc2 = _mm_or_si128(*xmm_crc2, xmm_tmp3);
*xmm_crc3 = _mm_shuffle_epi8(*xmm_crc3, xmm_shr);
*xmm_crc_part = _mm_shuffle_epi8(*xmm_crc_part, xmm_shl);
*xmm_crc3 = _mm_or_si128(*xmm_crc3, *xmm_crc_part);
xmm_a0_1 = _mm_clmulepi64_si128(xmm_a0_0, xmm_fold4, 0x10);
xmm_a0_0 = _mm_clmulepi64_si128(xmm_a0_0, xmm_fold4, 0x01);
ps_crc3 = _mm_castsi128_ps(*xmm_crc3);
psa0_0 = _mm_castsi128_ps(xmm_a0_0);
psa0_1 = _mm_castsi128_ps(xmm_a0_1);
ps_res = _mm_xor_ps(ps_crc3, psa0_0);
ps_res = _mm_xor_ps(ps_res, psa0_1);
*xmm_crc3 = _mm_castps_si128(ps_res);
}
static inline void crc32_fold_load(__m128i *fold, __m128i *fold0, __m128i *fold1, __m128i *fold2, __m128i *fold3) {
*fold0 = _mm_load_si128(fold + 0);
*fold1 = _mm_load_si128(fold + 1);
*fold2 = _mm_load_si128(fold + 2);
*fold3 = _mm_load_si128(fold + 3);
}
static inline void crc32_fold_save(__m128i *fold, const __m128i *fold0, const __m128i *fold1,
const __m128i *fold2, const __m128i *fold3) {
_mm_storeu_si128(fold + 0, *fold0);
_mm_storeu_si128(fold + 1, *fold1);
_mm_storeu_si128(fold + 2, *fold2);
_mm_storeu_si128(fold + 3, *fold3);
}
Z_INTERNAL uint32_t CRC32_FOLD_RESET(crc32_fold *crc) {
__m128i xmm_crc0 = _mm_cvtsi32_si128(0x9db42487);
__m128i xmm_zero = _mm_setzero_si128();
crc32_fold_save((__m128i *)crc->fold, &xmm_crc0, &xmm_zero, &xmm_zero, &xmm_zero);
return 0;
}
#define ONCE(op) if (first) { first = 0; op; }
#define XOR_INITIAL128(where) ONCE(where = _mm_xor_si128(where, xmm_initial))
#ifdef X86_VPCLMULQDQ
# define XOR_INITIAL512(where) ONCE(where = _mm512_xor_si512(where, zmm_initial))
#endif
#ifdef X86_VPCLMULQDQ
# include "crc32_fold_vpclmulqdq_tpl.h"
#endif
#include "crc32_fold_pclmulqdq_tpl.h"
#define COPY
#ifdef X86_VPCLMULQDQ
# include "crc32_fold_vpclmulqdq_tpl.h"
#endif
#include "crc32_fold_pclmulqdq_tpl.h"
static const unsigned ALIGNED_(16) crc_k[] = {
0xccaa009e, 0x00000000, /* rk1 */
0x751997d0, 0x00000001, /* rk2 */
0xccaa009e, 0x00000000, /* rk5 */
0x63cd6124, 0x00000001, /* rk6 */
0xf7011640, 0x00000001, /* rk7 */
0xdb710640, 0x00000001 /* rk8 */
};
static const unsigned ALIGNED_(16) crc_mask[4] = {
0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000
};
static const unsigned ALIGNED_(16) crc_mask2[4] = {
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
};
Z_INTERNAL uint32_t CRC32_FOLD_FINAL(crc32_fold *crc) {
const __m128i xmm_mask = _mm_load_si128((__m128i *)crc_mask);
const __m128i xmm_mask2 = _mm_load_si128((__m128i *)crc_mask2);
__m128i xmm_crc0, xmm_crc1, xmm_crc2, xmm_crc3;
__m128i x_tmp0, x_tmp1, x_tmp2, crc_fold;
crc32_fold_load((__m128i *)crc->fold, &xmm_crc0, &xmm_crc1, &xmm_crc2, &xmm_crc3);
/*
* k1
*/
crc_fold = _mm_load_si128((__m128i *)crc_k);
x_tmp0 = _mm_clmulepi64_si128(xmm_crc0, crc_fold, 0x10);
xmm_crc0 = _mm_clmulepi64_si128(xmm_crc0, crc_fold, 0x01);
xmm_crc1 = _mm_xor_si128(xmm_crc1, x_tmp0);
xmm_crc1 = _mm_xor_si128(xmm_crc1, xmm_crc0);
x_tmp1 = _mm_clmulepi64_si128(xmm_crc1, crc_fold, 0x10);
xmm_crc1 = _mm_clmulepi64_si128(xmm_crc1, crc_fold, 0x01);
xmm_crc2 = _mm_xor_si128(xmm_crc2, x_tmp1);
xmm_crc2 = _mm_xor_si128(xmm_crc2, xmm_crc1);
x_tmp2 = _mm_clmulepi64_si128(xmm_crc2, crc_fold, 0x10);
xmm_crc2 = _mm_clmulepi64_si128(xmm_crc2, crc_fold, 0x01);
xmm_crc3 = _mm_xor_si128(xmm_crc3, x_tmp2);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc2);
/*
* k5
*/
crc_fold = _mm_load_si128((__m128i *)(crc_k + 4));
xmm_crc0 = xmm_crc3;
xmm_crc3 = _mm_clmulepi64_si128(xmm_crc3, crc_fold, 0);
xmm_crc0 = _mm_srli_si128(xmm_crc0, 8);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc0);
xmm_crc0 = xmm_crc3;
xmm_crc3 = _mm_slli_si128(xmm_crc3, 4);
xmm_crc3 = _mm_clmulepi64_si128(xmm_crc3, crc_fold, 0x10);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc0);
xmm_crc3 = _mm_and_si128(xmm_crc3, xmm_mask2);
/*
* k7
*/
xmm_crc1 = xmm_crc3;
xmm_crc2 = xmm_crc3;
crc_fold = _mm_load_si128((__m128i *)(crc_k + 8));
xmm_crc3 = _mm_clmulepi64_si128(xmm_crc3, crc_fold, 0);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc2);
xmm_crc3 = _mm_and_si128(xmm_crc3, xmm_mask);
xmm_crc2 = xmm_crc3;
xmm_crc3 = _mm_clmulepi64_si128(xmm_crc3, crc_fold, 0x10);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc2);
xmm_crc3 = _mm_xor_si128(xmm_crc3, xmm_crc1);
crc->value = ~((uint32_t)_mm_extract_epi32(xmm_crc3, 2));
return crc->value;
}
Z_INTERNAL uint32_t CRC32(uint32_t crc32, const uint8_t *buf, size_t len) {
/* For lens < 64, crc32_braid method is faster. The CRC32 instruction for
* these short lengths might also prove to be effective */
if (len < 64)
return PREFIX(crc32_braid)(crc32, buf, len);
crc32_fold ALIGNED_(16) crc_state;
CRC32_FOLD_RESET(&crc_state);
CRC32_FOLD(&crc_state, buf, len, crc32);
return CRC32_FOLD_FINAL(&crc_state);
}
3p-zlib-ng-main/zlib-ng/arch/x86/crc32_vpclmulqdq.c 0000664 0000000 0000000 00000001100 14553115624 0022114 0 ustar 00root root 0000000 0000000 /* crc32_vpclmulqdq.c -- VPCMULQDQ-based CRC32 folding implementation.
* Copyright Wangyang Guo (wangyang.guo@intel.com)
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#if defined(X86_PCLMULQDQ_CRC) && defined(X86_VPCLMULQDQ_CRC)
#define X86_VPCLMULQDQ
#define CRC32_FOLD_COPY crc32_fold_vpclmulqdq_copy
#define CRC32_FOLD crc32_fold_vpclmulqdq
#define CRC32_FOLD_RESET crc32_fold_vpclmulqdq_reset
#define CRC32_FOLD_FINAL crc32_fold_vpclmulqdq_final
#define CRC32 crc32_vpclmulqdq
#include "crc32_pclmulqdq_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/insert_string_sse42.c 0000664 0000000 0000000 00000001225 14553115624 0022652 0 ustar 00root root 0000000 0000000 /* insert_string_sse42.c -- insert_string integer hash variant using SSE4.2's CRC instructions
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
*/
#ifdef X86_SSE42
#include "../../zbuild.h"
#include
#include "../../deflate.h"
#define HASH_CALC(s, h, val)\
h = _mm_crc32_u32(h, val)
#define HASH_CALC_VAR h
#define HASH_CALC_VAR_INIT uint32_t h = 0
#define UPDATE_HASH update_hash_sse42
#define INSERT_STRING insert_string_sse42
#define QUICK_INSERT_STRING quick_insert_string_sse42
#include "../../insert_string_tpl.h"
#endif
3p-zlib-ng-main/zlib-ng/arch/x86/slide_hash_avx2.c 0000664 0000000 0000000 00000002124 14553115624 0022002 0 ustar 00root root 0000000 0000000 /*
* AVX2 optimized hash slide, based on Intel's slide_sse implementation
*
* Copyright (C) 2017 Intel Corporation
* Authors:
* Arjan van de Ven
* Jim Kukunas
* Mika T. Lindqvist
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "../../deflate.h"
#include
static inline void slide_hash_chain(Pos *table, uint32_t entries, const __m256i wsize) {
table += entries;
table -= 16;
do {
__m256i value, result;
value = _mm256_loadu_si256((__m256i *)table);
result = _mm256_subs_epu16(value, wsize);
_mm256_storeu_si256((__m256i *)table, result);
table -= 16;
entries -= 16;
} while (entries > 0);
}
Z_INTERNAL void slide_hash_avx2(deflate_state *s) {
uint16_t wsize = (uint16_t)s->w_size;
const __m256i ymm_wsize = _mm256_set1_epi16((short)wsize);
slide_hash_chain(s->head, HASH_SIZE, ymm_wsize);
slide_hash_chain(s->prev, wsize, ymm_wsize);
}
3p-zlib-ng-main/zlib-ng/arch/x86/slide_hash_sse2.c 0000664 0000000 0000000 00000003312 14553115624 0021776 0 ustar 00root root 0000000 0000000 /*
* SSE optimized hash slide
*
* Copyright (C) 2017 Intel Corporation
* Authors:
* Arjan van de Ven
* Jim Kukunas
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "../../deflate.h"
#include
#include
static inline void slide_hash_chain(Pos *table0, Pos *table1, uint32_t entries0,
uint32_t entries1, const __m128i wsize) {
uint32_t entries;
Pos *table;
__m128i value0, value1, result0, result1;
int on_chain = 0;
next_chain:
table = (on_chain) ? table1 : table0;
entries = (on_chain) ? entries1 : entries0;
table += entries;
table -= 16;
/* ZALLOC allocates this pointer unless the user chose a custom allocator.
* Our alloc function is aligned to 64 byte boundaries */
do {
value0 = _mm_load_si128((__m128i *)table);
value1 = _mm_load_si128((__m128i *)(table + 8));
result0 = _mm_subs_epu16(value0, wsize);
result1 = _mm_subs_epu16(value1, wsize);
_mm_store_si128((__m128i *)table, result0);
_mm_store_si128((__m128i *)(table + 8), result1);
table -= 16;
entries -= 16;
} while (entries > 0);
++on_chain;
if (on_chain > 1) {
return;
} else {
goto next_chain;
}
}
Z_INTERNAL void slide_hash_sse2(deflate_state *s) {
uint16_t wsize = (uint16_t)s->w_size;
const __m128i xmm_wsize = _mm_set1_epi16((short)wsize);
assert(((uintptr_t)s->head & 15) == 0);
assert(((uintptr_t)s->prev & 15) == 0);
slide_hash_chain(s->head, s->prev, HASH_SIZE, wsize, xmm_wsize);
}
3p-zlib-ng-main/zlib-ng/arch/x86/x86_features.c 0000664 0000000 0000000 00000005232 14553115624 0021265 0 ustar 00root root 0000000 0000000 /* x86_features.c - x86 feature check
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Author:
* Jim Kukunas
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "../../zbuild.h"
#include "x86_features.h"
#ifdef _MSC_VER
# include
#else
// Newer versions of GCC and clang come with cpuid.h
# include
#endif
#include
static inline void cpuid(int info, unsigned* eax, unsigned* ebx, unsigned* ecx, unsigned* edx) {
#ifdef _MSC_VER
unsigned int registers[4];
__cpuid((int *)registers, info);
*eax = registers[0];
*ebx = registers[1];
*ecx = registers[2];
*edx = registers[3];
#else
__cpuid(info, *eax, *ebx, *ecx, *edx);
#endif
}
static inline void cpuidex(int info, int subinfo, unsigned* eax, unsigned* ebx, unsigned* ecx, unsigned* edx) {
#ifdef _MSC_VER
unsigned int registers[4];
__cpuidex((int *)registers, info, subinfo);
*eax = registers[0];
*ebx = registers[1];
*ecx = registers[2];
*edx = registers[3];
#else
__cpuid_count(info, subinfo, *eax, *ebx, *ecx, *edx);
#endif
}
static inline uint64_t xgetbv(unsigned int xcr) {
#ifdef _MSC_VER
return _xgetbv(xcr);
#else
uint32_t eax, edx;
__asm__ ( ".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c"(xcr));
return (uint64_t)(edx) << 32 | eax;
#endif
}
void Z_INTERNAL x86_check_features(struct x86_cpu_features *features) {
unsigned eax, ebx, ecx, edx;
unsigned maxbasic;
cpuid(0, &maxbasic, &ebx, &ecx, &edx);
cpuid(1 /*CPU_PROCINFO_AND_FEATUREBITS*/, &eax, &ebx, &ecx, &edx);
features->has_sse2 = edx & 0x4000000;
features->has_ssse3 = ecx & 0x200;
features->has_sse42 = ecx & 0x100000;
features->has_pclmulqdq = ecx & 0x2;
if (ecx & 0x08000000) {
uint64_t xfeature = xgetbv(0);
features->has_os_save_ymm = ((xfeature & 0x06) == 0x06);
features->has_os_save_zmm = ((xfeature & 0xe6) == 0xe6);
}
if (maxbasic >= 7) {
cpuidex(7, 0, &eax, &ebx, &ecx, &edx);
// check BMI1 bit
// Reference: https://software.intel.com/sites/default/files/article/405250/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family.pdf
features->has_vpclmulqdq = ecx & 0x400;
// check AVX2 bit if the OS supports saving YMM registers
if (features->has_os_save_ymm) {
features->has_avx2 = ebx & 0x20;
}
// check AVX512 bits if the OS supports saving ZMM registers
if (features->has_os_save_zmm) {
features->has_avx512 = ebx & 0x00010000;
features->has_avx512vnni = ecx & 0x800;
}
}
}
3p-zlib-ng-main/zlib-ng/arch/x86/x86_features.h 0000664 0000000 0000000 00000001056 14553115624 0021272 0 ustar 00root root 0000000 0000000 /* x86_features.h -- check for CPU features
* Copyright (C) 2013 Intel Corporation Jim Kukunas
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef X86_FEATURES_H_
#define X86_FEATURES_H_
struct x86_cpu_features {
int has_avx2;
int has_avx512;
int has_avx512vnni;
int has_sse2;
int has_ssse3;
int has_sse42;
int has_pclmulqdq;
int has_vpclmulqdq;
int has_os_save_ymm;
int has_os_save_zmm;
};
void Z_INTERNAL x86_check_features(struct x86_cpu_features *features);
#endif /* CPU_H_ */
3p-zlib-ng-main/zlib-ng/arch/x86/x86_intrins.h 0000664 0000000 0000000 00000007726 14553115624 0021154 0 ustar 00root root 0000000 0000000 #ifndef X86_INTRINS_H
#define X86_INTRINS_H
/* Unfortunately GCC didn't support these things until version 10.
* Similarly, AppleClang didn't support them in Xcode 9.2 but did in 9.3.
*/
#ifdef __AVX2__
#include
#if (!defined(__clang__) && defined(__GNUC__) && __GNUC__ < 10) \
|| (defined(__apple_build_version__) && __apple_build_version__ < 9020039)
static inline __m256i _mm256_zextsi128_si256(__m128i a) {
__m128i r;
__asm__ volatile ("vmovdqa %1,%0" : "=x" (r) : "x" (a));
return _mm256_castsi128_si256(r);
}
#ifdef __AVX512F__
static inline __m512i _mm512_zextsi128_si512(__m128i a) {
__m128i r;
__asm__ volatile ("vmovdqa %1,%0" : "=x" (r) : "x" (a));
return _mm512_castsi128_si512(r);
}
#endif // __AVX512F__
#endif // gcc/AppleClang version test
#endif // __AVX2__
/* GCC <9 is missing some AVX512 intrinsics.
*/
#ifdef __AVX512F__
#if (!defined(__clang__) && defined(__GNUC__) && __GNUC__ < 9)
#include
#define PACK(c0, c1, c2, c3) (((int)(unsigned char)(c0) << 24) | ((int)(unsigned char)(c1) << 16) | \
((int)(unsigned char)(c2) << 8) | ((int)(unsigned char)(c3)))
static inline __m512i _mm512_set_epi8(char __q63, char __q62, char __q61, char __q60,
char __q59, char __q58, char __q57, char __q56,
char __q55, char __q54, char __q53, char __q52,
char __q51, char __q50, char __q49, char __q48,
char __q47, char __q46, char __q45, char __q44,
char __q43, char __q42, char __q41, char __q40,
char __q39, char __q38, char __q37, char __q36,
char __q35, char __q34, char __q33, char __q32,
char __q31, char __q30, char __q29, char __q28,
char __q27, char __q26, char __q25, char __q24,
char __q23, char __q22, char __q21, char __q20,
char __q19, char __q18, char __q17, char __q16,
char __q15, char __q14, char __q13, char __q12,
char __q11, char __q10, char __q09, char __q08,
char __q07, char __q06, char __q05, char __q04,
char __q03, char __q02, char __q01, char __q00) {
return _mm512_set_epi32(PACK(__q63, __q62, __q61, __q60), PACK(__q59, __q58, __q57, __q56),
PACK(__q55, __q54, __q53, __q52), PACK(__q51, __q50, __q49, __q48),
PACK(__q47, __q46, __q45, __q44), PACK(__q43, __q42, __q41, __q40),
PACK(__q39, __q38, __q37, __q36), PACK(__q35, __q34, __q33, __q32),
PACK(__q31, __q30, __q29, __q28), PACK(__q27, __q26, __q25, __q24),
PACK(__q23, __q22, __q21, __q20), PACK(__q19, __q18, __q17, __q16),
PACK(__q15, __q14, __q13, __q12), PACK(__q11, __q10, __q09, __q08),
PACK(__q07, __q06, __q05, __q04), PACK(__q03, __q02, __q01, __q00));
}
#undef PACK
#endif // gcc version test
#endif // __AVX512F__
/* Missing zero-extension AVX and AVX512 intrinsics.
* Fixed in Microsoft Visual Studio 2017 version 15.7
* https://developercommunity.visualstudio.com/t/missing-zero-extension-avx-and-avx512-intrinsics/175737
*/
#if defined(_MSC_VER) && _MSC_VER < 1914
#ifdef __AVX2__
static inline __m256i _mm256_zextsi128_si256(__m128i a) {
return _mm256_inserti128_si256(_mm256_setzero_si256(), a, 0);
}
#endif // __AVX2__
#ifdef __AVX512F__
static inline __m512i _mm512_zextsi128_si512(__m128i a) {
return _mm512_inserti32x4(_mm512_setzero_si512(), a, 0);
}
#endif // __AVX512F__
#endif // defined(_MSC_VER) && _MSC_VER < 1914
#endif // include guard X86_INTRINS_H
3p-zlib-ng-main/zlib-ng/chunkset.c 0000664 0000000 0000000 00000002076 14553115624 0017227 0 ustar 00root root 0000000 0000000 /* chunkset.c -- inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
typedef uint64_t chunk_t;
#define CHUNK_SIZE 8
#define HAVE_CHUNKMEMSET_4
#define HAVE_CHUNKMEMSET_8
static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) {
uint8_t *dest = (uint8_t *)chunk;
memcpy(dest, from, sizeof(uint32_t));
memcpy(dest+4, from, sizeof(uint32_t));
}
static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) {
memcpy(chunk, from, sizeof(uint64_t));
}
static inline void loadchunk(uint8_t const *s, chunk_t *chunk) {
memcpy(chunk, (uint8_t *)s, sizeof(uint64_t));
}
static inline void storechunk(uint8_t *out, chunk_t *chunk) {
memcpy(out, chunk, sizeof(uint64_t));
}
#define CHUNKSIZE chunksize_c
#define CHUNKCOPY chunkcopy_c
#define CHUNKUNROLL chunkunroll_c
#define CHUNKMEMSET chunkmemset_c
#define CHUNKMEMSET_SAFE chunkmemset_safe_c
#include "chunkset_tpl.h"
#define INFLATE_FAST inflate_fast_c
#include "inffast_tpl.h"
3p-zlib-ng-main/zlib-ng/chunkset_tpl.h 0000664 0000000 0000000 00000014542 14553115624 0020114 0 ustar 00root root 0000000 0000000 /* chunkset_tpl.h -- inline functions to copy small data chunks.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include
#if CHUNK_SIZE == 32 && defined(X86_SSSE3) && defined(X86_SSE2)
extern uint8_t* chunkmemset_ssse3(uint8_t *out, unsigned dist, unsigned len);
#endif
/* Returns the chunk size */
Z_INTERNAL uint32_t CHUNKSIZE(void) {
return sizeof(chunk_t);
}
/* Behave like memcpy, but assume that it's OK to overwrite at least
chunk_t bytes of output even if the length is shorter than this,
that the length is non-zero, and that `from` lags `out` by at least
sizeof chunk_t bytes (or that they don't overlap at all or simply that
the distance is less than the length of the copy).
Aside from better memory bus utilisation, this means that short copies
(chunk_t bytes or fewer) will fall straight through the loop
without iteration, which will hopefully make the branch prediction more
reliable. */
#ifndef HAVE_CHUNKCOPY
Z_INTERNAL uint8_t* CHUNKCOPY(uint8_t *out, uint8_t const *from, unsigned len) {
Assert(len > 0, "chunkcopy should never have a length 0");
chunk_t chunk;
int32_t align = ((len - 1) % sizeof(chunk_t)) + 1;
loadchunk(from, &chunk);
storechunk(out, &chunk);
out += align;
from += align;
len -= align;
while (len > 0) {
loadchunk(from, &chunk);
storechunk(out, &chunk);
out += sizeof(chunk_t);
from += sizeof(chunk_t);
len -= sizeof(chunk_t);
}
return out;
}
#endif
/* Perform short copies until distance can be rewritten as being at least
sizeof chunk_t.
This assumes that it's OK to overwrite at least the first
2*sizeof(chunk_t) bytes of output even if the copy is shorter than this.
This assumption holds because inflate_fast() starts every iteration with at
least 258 bytes of output space available (258 being the maximum length
output from a single token; see inflate_fast()'s assumptions below). */
#ifndef HAVE_CHUNKUNROLL
Z_INTERNAL uint8_t* CHUNKUNROLL(uint8_t *out, unsigned *dist, unsigned *len) {
unsigned char const *from = out - *dist;
chunk_t chunk;
while (*dist < *len && *dist < sizeof(chunk_t)) {
loadchunk(from, &chunk);
storechunk(out, &chunk);
out += *dist;
*len -= *dist;
*dist += *dist;
}
return out;
}
#endif
#ifndef HAVE_CHUNK_MAG
/* Loads a magazine to feed into memory of the pattern */
static inline chunk_t GET_CHUNK_MAG(uint8_t *buf, uint32_t *chunk_rem, uint32_t dist) {
/* This code takes string of length dist from "from" and repeats
* it for as many times as can fit in a chunk_t (vector register) */
uint32_t cpy_dist;
uint32_t bytes_remaining = sizeof(chunk_t);
chunk_t chunk_load;
uint8_t *cur_chunk = (uint8_t *)&chunk_load;
while (bytes_remaining) {
cpy_dist = MIN(dist, bytes_remaining);
memcpy(cur_chunk, buf, cpy_dist);
bytes_remaining -= cpy_dist;
cur_chunk += cpy_dist;
/* This allows us to bypass an expensive integer division since we're effectively
* counting in this loop, anyway */
*chunk_rem = cpy_dist;
}
return chunk_load;
}
#endif
/* Copy DIST bytes from OUT - DIST into OUT + DIST * k, for 0 <= k < LEN/DIST.
Return OUT + LEN. */
Z_INTERNAL uint8_t* CHUNKMEMSET(uint8_t *out, unsigned dist, unsigned len) {
/* Debug performance related issues when len < sizeof(uint64_t):
Assert(len >= sizeof(uint64_t), "chunkmemset should be called on larger chunks"); */
Assert(dist > 0, "chunkmemset cannot have a distance 0");
/* Only AVX2 */
#if CHUNK_SIZE == 32 && defined(X86_SSSE3) && defined(X86_SSE2)
if (len <= 16) {
return chunkmemset_ssse3(out, dist, len);
}
#endif
uint8_t *from = out - dist;
if (dist == 1) {
memset(out, *from, len);
return out + len;
} else if (dist > sizeof(chunk_t)) {
return CHUNKCOPY(out, out - dist, len);
}
chunk_t chunk_load;
uint32_t chunk_mod = 0;
/* TODO: possibly build up a permutation table for this if not an even modulus */
#ifdef HAVE_CHUNKMEMSET_2
if (dist == 2) {
chunkmemset_2(from, &chunk_load);
} else
#endif
#ifdef HAVE_CHUNKMEMSET_4
if (dist == 4) {
chunkmemset_4(from, &chunk_load);
} else
#endif
#ifdef HAVE_CHUNKMEMSET_8
if (dist == 8) {
chunkmemset_8(from, &chunk_load);
} else if (dist == sizeof(chunk_t)) {
loadchunk(from, &chunk_load);
} else
#endif
{
chunk_load = GET_CHUNK_MAG(from, &chunk_mod, dist);
}
/* If we're lucky enough and dist happens to be an even modulus of our vector length,
* we can do two stores per loop iteration, which for most ISAs, especially x86, is beneficial */
if (chunk_mod == 0) {
while (len >= (2 * sizeof(chunk_t))) {
storechunk(out, &chunk_load);
storechunk(out + sizeof(chunk_t), &chunk_load);
out += 2 * sizeof(chunk_t);
len -= 2 * sizeof(chunk_t);
}
}
/* If we don't have a "dist" length that divides evenly into a vector
* register, we can write the whole vector register but we need only
* advance by the amount of the whole string that fits in our chunk_t.
* If we do divide evenly into the vector length, adv_amount = chunk_t size*/
uint32_t adv_amount = sizeof(chunk_t) - chunk_mod;
while (len >= sizeof(chunk_t)) {
storechunk(out, &chunk_load);
len -= adv_amount;
out += adv_amount;
}
if (len) {
memcpy(out, &chunk_load, len);
out += len;
}
return out;
}
Z_INTERNAL uint8_t* CHUNKMEMSET_SAFE(uint8_t *out, unsigned dist, unsigned len, unsigned left) {
#if !defined(UNALIGNED64_OK)
# if !defined(UNALIGNED_OK)
static const uint32_t align_mask = 7;
# else
static const uint32_t align_mask = 3;
# endif
#endif
len = MIN(len, left);
uint8_t *from = out - dist;
#if !defined(UNALIGNED64_OK)
while (((uintptr_t)out & align_mask) && (len > 0)) {
*out++ = *from++;
--len;
--left;
}
#endif
if (left < (unsigned)(3 * sizeof(chunk_t))) {
while (len > 0) {
*out++ = *from++;
--len;
}
return out;
}
if (len)
return CHUNKMEMSET(out, dist, len);
return out;
}
3p-zlib-ng-main/zlib-ng/cmake/ 0000775 0000000 0000000 00000000000 14553115624 0016312 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/cmake/detect-arch.c 0000664 0000000 0000000 00000006510 14553115624 0020643 0 ustar 00root root 0000000 0000000 // archdetect.c -- Detect compiler architecture and raise preprocessor error
// containing a simple arch identifier.
// Copyright (C) 2019 Hans Kristian Rosbach
// Licensed under the Zlib license, see LICENSE.md for details
// x86_64
#if defined(__x86_64__) || defined(_M_X64)
#error archfound x86_64
// x86
#elif defined(__i386) || defined(_M_IX86)
#error archfound i686
// ARM
#elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
#error archfound aarch64
#elif defined(__arm__) || defined(__arm) || defined(_M_ARM) || defined(__TARGET_ARCH_ARM)
#if defined(__ARM64_ARCH_8__) || defined(__ARMv8__) || defined(__ARMv8_A__)
#error archfound armv8
#elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__)
#error archfound armv7
#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6M__)
#error archfound armv6
#elif defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5TEJ__)
#error archfound armv5
#elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARCH_5E__)
#error archfound armv4
#elif defined(__ARM_ARCH_3__) || defined(__TARGET_ARCH_3M__)
#error archfound armv3
#elif defined(__ARM_ARCH_2__)
#error archfound armv2
#endif
// PowerPC
#elif defined(__powerpc__) || defined(_ppc__) || defined(__PPC__)
#if defined(__64BIT__) || defined(__powerpc64__) || defined(__ppc64__)
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#error archfound powerpc64le
#else
#error archfound powerpc64
#endif
#else
#error archfound powerpc
#endif
// --------------- Less common architectures alphabetically below ---------------
// ALPHA
#elif defined(__alpha__) || defined(__alpha)
#error archfound alpha
// Blackfin
#elif defined(__BFIN__)
#error archfound blackfin
// Itanium
#elif defined(__ia64) || defined(_M_IA64)
#error archfound ia64
// MIPS
#elif defined(__mips__) || defined(__mips)
#error archfound mips
// Motorola 68000-series
#elif defined(__m68k__)
#error archfound m68k
// SuperH
#elif defined(__sh__)
#error archfound sh
// SPARC
#elif defined(__sparc__) || defined(__sparc)
#if defined(__sparcv9) || defined(__sparc_v9__)
#error archfound sparc9
#elif defined(__sparcv8) || defined(__sparc_v8__)
#error archfound sparc8
#endif
// SystemZ
#elif defined(__370__)
#error archfound s370
#elif defined(__s390__)
#error archfound s390
#elif defined(__s390x) || defined(__zarch__)
#error archfound s390x
// PARISC
#elif defined(__hppa__)
#error archfound parisc
// RS-6000
#elif defined(__THW_RS6000)
#error archfound rs6000
// RISC-V
#elif defined(__riscv)
#if __riscv_xlen == 64
#error archfound riscv64
#elif __riscv_xlen == 32
#error archfound riscv32
#endif
// LOONGARCH
#elif defined(__loongarch_lp64)
#error archfound loongarch64
// Emscripten (WebAssembly)
#elif defined(__EMSCRIPTEN__)
#error archfound wasm32
// return 'unrecognized' if we do not know what architecture this is
#else
#error archfound unrecognized
#endif
3p-zlib-ng-main/zlib-ng/cmake/detect-arch.cmake 0000664 0000000 0000000 00000007076 14553115624 0021511 0 ustar 00root root 0000000 0000000 # detect-arch.cmake -- Detect compiler architecture and set ARCH and BASEARCH
# Copyright (C) 2019 Hans Kristian Rosbach
# Licensed under the Zlib license, see LICENSE.md for details
set(ARCHDETECT_FOUND TRUE)
if(CMAKE_OSX_ARCHITECTURES)
# If multiple architectures are requested (universal build), pick only the first
list(GET CMAKE_OSX_ARCHITECTURES 0 ARCH)
elseif(MSVC)
if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86")
set(ARCH "i686")
elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64")
set(ARCH "x86_64")
elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARMV7")
set(ARCH "arm")
elseif ("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64" OR "${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM64EC")
set(ARCH "aarch64")
endif()
elseif(EMSCRIPTEN)
set(ARCH "wasm32")
elseif(CMAKE_CROSSCOMPILING)
set(ARCH ${CMAKE_C_COMPILER_TARGET})
else()
# Let preprocessor parse archdetect.c and raise an error containing the arch identifier
enable_language(C)
try_run(
run_result_unused
compile_result_unused
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_LIST_DIR}/detect-arch.c
COMPILE_OUTPUT_VARIABLE RAWOUTPUT
CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
# Find basearch tag, and extract the arch word into BASEARCH variable
string(REGEX REPLACE ".*archfound ([a-zA-Z0-9_]+).*" "\\1" ARCH "${RAWOUTPUT}")
if(NOT ARCH)
set(ARCH unknown)
endif()
endif()
# Make sure we have ARCH set
if(NOT ARCH OR ARCH STREQUAL "unknown")
set(ARCH ${CMAKE_SYSTEM_PROCESSOR})
message(STATUS "Arch not recognized, falling back to cmake arch: '${ARCH}'")
else()
message(STATUS "Arch detected: '${ARCH}'")
endif()
# Base arch detection
if("${ARCH}" MATCHES "(x86_64|AMD64|i[3-6]86)")
set(BASEARCH "x86")
set(BASEARCH_X86_FOUND TRUE)
elseif("${ARCH}" MATCHES "(arm(v[0-9])?|aarch64|cortex)")
set(BASEARCH "arm")
set(BASEARCH_ARM_FOUND TRUE)
elseif("${ARCH}" MATCHES "ppc(64(le)?)?|powerpc(64(le)?)?")
set(BASEARCH "ppc")
set(BASEARCH_PPC_FOUND TRUE)
elseif("${ARCH}" MATCHES "alpha")
set(BASEARCH "alpha")
set(BASEARCH_ALPHA_FOUND TRUE)
elseif("${ARCH}" MATCHES "blackfin")
set(BASEARCH "blackfin")
set(BASEARCH_BLACKFIN_FOUND TRUE)
elseif("${ARCH}" MATCHES "ia64")
set(BASEARCH "ia64")
set(BASEARCH_IA64_FOUND TRUE)
elseif("${ARCH}" MATCHES "mips")
set(BASEARCH "mips")
set(BASEARCH_MIPS_FOUND TRUE)
elseif("${ARCH}" MATCHES "m68k")
set(BASEARCH "m68k")
set(BASEARCH_M68K_FOUND TRUE)
elseif("${ARCH}" MATCHES "sh")
set(BASEARCH "sh")
set(BASEARCH_SH_FOUND TRUE)
elseif("${ARCH}" MATCHES "sparc[89]?")
set(BASEARCH "sparc")
set(BASEARCH_SPARC_FOUND TRUE)
elseif("${ARCH}" MATCHES "s3[679]0x?")
set(BASEARCH "s360")
set(BASEARCH_S360_FOUND TRUE)
elseif("${ARCH}" MATCHES "parisc")
set(BASEARCH "parisc")
set(BASEARCH_PARISC_FOUND TRUE)
elseif("${ARCH}" MATCHES "rs6000")
set(BASEARCH "rs6000")
set(BASEARCH_RS6000_FOUND TRUE)
elseif("${ARCH}" MATCHES "riscv(32|64)")
set(BASEARCH "riscv")
set(BASEARCH_RISCV_FOUND TRUE)
elseif("${ARCH}" MATCHES "loongarch64")
set(BASEARCH "loongarch")
set(BASEARCH_LOONGARCH_FOUND TRUE)
elseif("${ARCH}" MATCHES "wasm32")
set(BASEARCH "wasm32")
set(BASEARCH_WASM32_FOUND TRUE)
else()
set(BASEARCH "x86")
set(BASEARCH_X86_FOUND TRUE)
message(STATUS "Basearch '${ARCH}' not recognized, defaulting to 'x86'.")
endif()
message(STATUS "Basearch of '${ARCH}' has been detected as: '${BASEARCH}'")
3p-zlib-ng-main/zlib-ng/cmake/detect-coverage.cmake 0000664 0000000 0000000 00000003415 14553115624 0022360 0 ustar 00root root 0000000 0000000 # detect-coverage.cmake -- Detect supported compiler coverage flags
# Licensed under the Zlib license, see LICENSE.md for details
macro(add_code_coverage)
# Check for -coverage flag support for Clang/GCC
if(CMAKE_VERSION VERSION_LESS 3.14)
set(CMAKE_REQUIRED_LIBRARIES -lgcov)
else()
set(CMAKE_REQUIRED_LINK_OPTIONS -coverage)
endif()
check_c_compiler_flag(-coverage HAVE_COVERAGE)
set(CMAKE_REQUIRED_LIBRARIES)
set(CMAKE_REQUIRED_LINK_OPTIONS)
if(HAVE_COVERAGE)
add_compile_options(-coverage)
add_link_options(-coverage)
message(STATUS "Code coverage enabled using: -coverage")
else()
# Some versions of GCC don't support -coverage shorthand
if(CMAKE_VERSION VERSION_LESS 3.14)
set(CMAKE_REQUIRED_LIBRARIES -lgcov)
else()
set(CMAKE_REQUIRED_LINK_OPTIONS -lgcov -fprofile-arcs)
endif()
check_c_compiler_flag("-ftest-coverage -fprofile-arcs -fprofile-values" HAVE_TEST_COVERAGE)
set(CMAKE_REQUIRED_LIBRARIES)
set(CMAKE_REQUIRED_LINK_OPTIONS)
if(HAVE_TEST_COVERAGE)
add_compile_options(-ftest-coverage -fprofile-arcs -fprofile-values)
add_link_options(-lgcov -fprofile-arcs)
message(STATUS "Code coverage enabled using: -ftest-coverage")
else()
message(WARNING "Compiler does not support code coverage")
set(WITH_CODE_COVERAGE OFF)
endif()
endif()
# Set optimization level to zero for code coverage builds
if (WITH_CODE_COVERAGE)
# Use CMake compiler flag variables due to add_compile_options failure on Windows GCC
set(CMAKE_C_FLAGS "-O0 ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "-O0 ${CMAKE_CXX_FLAGS}")
endif()
endmacro()
3p-zlib-ng-main/zlib-ng/cmake/detect-install-dirs.cmake 0000664 0000000 0000000 00000004153 14553115624 0023172 0 ustar 00root root 0000000 0000000 # detect-install-dirs.cmake -- Detect install directory parameters
# Copyright (C) 2021 Hans Kristian Rosbach
# Licensed under the Zlib license, see LICENSE.md for details
# Determine installation directory for executables
if (DEFINED BIN_INSTALL_DIR)
set(BIN_INSTALL_DIR "${BIN_INSTALL_DIR}" CACHE PATH "Installation directory for executables (Deprecated)" FORCE)
set(CMAKE_INSTALL_BINDIR "${BIN_INSTALL_DIR}")
elseif (DEFINED INSTALL_BIN_DIR)
set(CMAKE_INSTALL_BINDIR "${INSTALL_BIN_DIR}")
endif()
# Determine installation directory for libraries
if (DEFINED LIB_INSTALL_DIR)
set(LIB_INSTALL_DIR "${LIB_INSTALL_DIR}" CACHE PATH "Installation directory for libraries (Deprecated)" FORCE)
set(CMAKE_INSTALL_LIBDIR "${LIB_INSTALL_DIR}")
elseif (DEFINED INSTALL_LIB_DIR)
set(CMAKE_INSTALL_LIBDIR "${INSTALL_LIB_DIR}")
endif()
# Determine installation directory for include files
if (DEFINED INC_INSTALL_DIR)
set(INC_INSTALL_DIR "${INC_INSTALL_DIR}" CACHE PATH "Installation directory for headers (Deprecated)" FORCE)
set(CMAKE_INSTALL_INCLUDEDIR "${INC_INSTALL_DIR}")
elseif (DEFINED INSTALL_INC_DIR)
set(CMAKE_INSTALL_INCLUDEDIR "${INSTALL_INC_DIR}")
endif()
# Define GNU standard installation directories
include(GNUInstallDirs)
# Determine installation directory for pkgconfig files
if (DEFINED PKGCONFIG_INSTALL_DIR)
set(PKGCONFIG_INSTALL_DIR "${PKGCONFIG_INSTALL_DIR}" CACHE PATH "Installation directory for pkgconfig (.pc) files" FORCE)
elseif (DEFINED INSTALL_PKGCONFIG_DIR)
set(PKGCONFIG_INSTALL_DIR "${INSTALL_PKGCONFIG_DIR}" CACHE PATH "Installation directory for pkgconfig (.pc) files" FORCE)
elseif (DEFINED CMAKE_INSTALL_PKGCONFIGDIR)
set(PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_PKGCONFIGDIR}" CACHE PATH "Installation directory for pkgconfig (.pc) files" FORCE)
elseif (DEFINED CMAKE_INSTALL_FULL_PKGCONFIGDIR)
set(PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_FULL_PKGCONFIGDIR}" CACHE PATH "Installation directory for pkgconfig (.pc) files" FORCE)
else()
set(PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
endif()
3p-zlib-ng-main/zlib-ng/cmake/detect-intrinsics.cmake 0000664 0000000 0000000 00000044210 14553115624 0022750 0 ustar 00root root 0000000 0000000 # detect-intrinsics.cmake -- Detect compiler intrinsics support
# Licensed under the Zlib license, see LICENSE.md for details
macro(check_acle_compiler_flag)
if(MSVC)
# Both ARM and ARM64-targeting msvc support intrinsics, but
# ARM msvc is missing some intrinsics introduced with ARMv8, e.g. crc32
if(MSVC_C_ARCHITECTURE_ID STREQUAL "ARM64")
set(HAVE_ACLE_FLAG TRUE)
endif()
else()
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(ACLEFLAG "-march=armv8-a+crc" CACHE INTERNAL "Compiler option to enable ACLE support")
endif()
endif()
# Check whether compiler supports ACLE flag
set(CMAKE_REQUIRED_FLAGS "${ACLEFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"int main() { return 0; }"
HAVE_ACLE_FLAG FAIL_REGEX "not supported")
if(NOT NATIVEFLAG AND NOT HAVE_ACLE_FLAG)
set(ACLEFLAG "-march=armv8-a+crc+simd" CACHE INTERNAL "Compiler option to enable ACLE support" FORCE)
# Check whether compiler supports ACLE flag
set(CMAKE_REQUIRED_FLAGS "${ACLEFLAG}")
check_c_source_compiles(
"int main() { return 0; }"
HAVE_ACLE_FLAG2 FAIL_REGEX "not supported")
set(HAVE_ACLE_FLAG ${HAVE_ACLE_FLAG2} CACHE INTERNAL "Have compiler option to enable ACLE intrinsics" FORCE)
unset(HAVE_ACLE_FLAG2 CACHE) # Don't cache this internal variable
endif()
set(CMAKE_REQUIRED_FLAGS)
endif()
endmacro()
macro(check_armv6_compiler_flag)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
check_c_compiler_flag("-march=armv6" HAVE_MARCH_ARMV6)
if(HAVE_MARCH_ARMV6)
set(ARMV6FLAG "-march=armv6" CACHE INTERNAL "Compiler option to enable ARMv6 support")
endif()
endif()
endif()
# Check whether compiler supports ARMv6 inline asm
set(CMAKE_REQUIRED_FLAGS "${ARMV6FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"unsigned int f(unsigned int a, unsigned int b) {
unsigned int c;
__asm__ __volatile__ ( \"uqsub16 %0, %1, %2\" : \"=r\" (c) : \"r\" (a), \"r\" (b) );
return (int)c;
}
int main(void) { return f(1,2); }"
HAVE_ARMV6_INLINE_ASM
)
# Check whether compiler supports ARMv6 intrinsics
check_c_source_compiles(
"#if defined(_MSC_VER)
#include
#else
#include
#endif
unsigned int f(unsigned int a, unsigned int b) {
#if defined(_MSC_VER)
return _arm_uqsub16(a, b);
#else
return __uqsub16(a, b);
#endif
}
int main(void) { return 0; }"
HAVE_ARMV6_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_avx512_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(AVX512FLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl")
else()
set(AVX512FLAG "/arch:AVX512")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
# For CPUs that can benefit from AVX512, it seems GCC generates suboptimal
# instruction scheduling unless you specify a reasonable -mtune= target
set(AVX512FLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl")
if(NOT MSVC)
check_c_compiler_flag("-mtune=cascadelake" HAVE_CASCADE_LAKE)
if(HAVE_CASCADE_LAKE)
set(AVX512FLAG "${AVX512FLAG} -mtune=cascadelake")
else()
set(AVX512FLAG "${AVX512FLAG} -mtune=skylake-avx512")
endif()
unset(HAVE_CASCADE_LAKE)
endif()
endif()
elseif(MSVC)
set(AVX512FLAG "/arch:AVX512")
endif()
# Check whether compiler supports AVX512 intrinsics
set(CMAKE_REQUIRED_FLAGS "${AVX512FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
__m512i f(__m512i y) {
__m512i x = _mm512_set1_epi8(2);
return _mm512_sub_epi8(x, y);
}
int main(void) { return 0; }"
HAVE_AVX512_INTRIN
)
# Evidently both GCC and clang were late to implementing these
check_c_source_compiles(
"#include
__mmask16 f(__mmask16 x) { return _knot_mask16(x); }
int main(void) { return 0; }"
HAVE_MASK_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_avx512vnni_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(AVX512VNNIFLAG "-mavx512f -mavx512bw -mavx512dq -mavx512vl -mavx512vnni")
else()
set(AVX512VNNIFLAG "/arch:AVX512")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(AVX512VNNIFLAG "-mavx512f -mavx512dq -mavx512bw -mavx512vl -mavx512vnni")
if(NOT MSVC)
check_c_compiler_flag("-mtune=cascadelake" HAVE_CASCADE_LAKE)
if(HAVE_CASCADE_LAKE)
set(AVX512VNNIFLAG "${AVX512VNNIFLAG} -mtune=cascadelake")
else()
set(AVX512VNNIFLAG "${AVX512VNNIFLAG} -mtune=skylake-avx512")
endif()
unset(HAVE_CASCADE_LAKE)
endif()
endif()
elseif(MSVC)
set(AVX512VNNIFLAG "/arch:AVX512")
endif()
# Check whether compiler supports AVX512vnni intrinsics
set(CMAKE_REQUIRED_FLAGS "${AVX512VNNIFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
__m512i f(__m512i x, __m512i y) {
__m512i z = _mm512_setzero_epi32();
return _mm512_dpbusd_epi32(z, x, y);
}
int main(void) { return 0; }"
HAVE_AVX512VNNI_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_avx2_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(AVX2FLAG "-mavx2")
else()
set(AVX2FLAG "/arch:AVX2")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(AVX2FLAG "-mavx2")
endif()
elseif(MSVC)
set(AVX2FLAG "/arch:AVX2")
endif()
# Check whether compiler supports AVX2 intrinics
set(CMAKE_REQUIRED_FLAGS "${AVX2FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
__m256i f(__m256i x) {
const __m256i y = _mm256_set1_epi16(1);
return _mm256_subs_epu16(x, y);
}
int main(void) { return 0; }"
HAVE_AVX2_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_neon_compiler_flag)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
if("${ARCH}" MATCHES "aarch64")
set(NEONFLAG "-march=armv8-a+simd")
else()
set(NEONFLAG "-mfpu=neon")
endif()
endif()
endif()
# Check whether compiler supports NEON flag
set(CMAKE_REQUIRED_FLAGS "${NEONFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#if defined(_M_ARM64) || defined(_M_ARM64EC)
# include
#else
# include
#endif
int main() { return 0; }"
NEON_AVAILABLE FAIL_REGEX "not supported")
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_neon_ld4_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
if("${ARCH}" MATCHES "aarch64")
set(NEONFLAG "-march=armv8-a+simd")
else()
set(NEONFLAG "-mfpu=neon")
endif()
endif()
endif()
# Check whether compiler supports loading 4 neon vecs into a register range
set(CMAKE_REQUIRED_FLAGS "${NEONFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC))
# include
#else
# include
#endif
int32x4x4_t f(int var[16]) { return vld1q_s32_x4(var); }
int main(void) { return 0; }"
NEON_HAS_LD4)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_pclmulqdq_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(PCLMULFLAG "-mpclmul")
endif()
endif()
# Check whether compiler supports PCLMULQDQ intrinsics
if(NOT (APPLE AND "${ARCH}" MATCHES "i386"))
# The pclmul code currently crashes on Mac in 32bit mode. Avoid for now.
set(CMAKE_REQUIRED_FLAGS "${PCLMULFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
#include
__m128i f(__m128i a, __m128i b) { return _mm_clmulepi64_si128(a, b, 0x10); }
int main(void) { return 0; }"
HAVE_PCLMULQDQ_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
else()
set(HAVE_PCLMULQDQ_INTRIN OFF)
endif()
endmacro()
macro(check_vpclmulqdq_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(VPCLMULFLAG "-mvpclmulqdq -mavx512f")
endif()
endif()
# Check whether compiler supports VPCLMULQDQ intrinsics
if(NOT (APPLE AND "${ARCH}" MATCHES "i386"))
set(CMAKE_REQUIRED_FLAGS "${VPCLMULFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
#include
__m512i f(__m512i a) {
__m512i b = _mm512_setzero_si512();
return _mm512_clmulepi64_epi128(a, b, 0x10);
}
int main(void) { return 0; }"
HAVE_VPCLMULQDQ_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
else()
set(HAVE_VPCLMULQDQ_INTRIN OFF)
endif()
endmacro()
macro(check_ppc_intrinsics)
# Check if compiler supports AltiVec
set(CMAKE_REQUIRED_FLAGS "-maltivec ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
int main(void)
{
vector int a = vec_splats(0);
vector int b = vec_splats(0);
a = vec_add(a, b);
return 0;
}"
HAVE_ALTIVEC
)
set(CMAKE_REQUIRED_FLAGS)
if(HAVE_ALTIVEC)
set(PPCFLAGS "-maltivec")
endif()
set(CMAKE_REQUIRED_FLAGS "-maltivec -mno-vsx ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
int main(void)
{
vector int a = vec_splats(0);
vector int b = vec_splats(0);
a = vec_add(a, b);
return 0;
}"
HAVE_NOVSX
)
set(CMAKE_REQUIRED_FLAGS)
if(HAVE_NOVSX)
set(PPCFLAGS "${PPCFLAGS} -mno-vsx")
endif()
# Check if we have what we need for AltiVec optimizations
set(CMAKE_REQUIRED_FLAGS "${PPCFLAGS} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
#ifdef __FreeBSD__
#include
#endif
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE_HAS_ALTIVEC);
#else
return (getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC);
#endif
}"
HAVE_VMX
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_power8_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(POWER8FLAG "-mcpu=power8")
endif()
endif()
# Check if we have what we need for POWER8 optimizations
set(CMAKE_REQUIRED_FLAGS "${POWER8FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
#ifdef __FreeBSD__
#include
#endif
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP2, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE2_ARCH_2_07);
#else
return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07);
#endif
}"
HAVE_POWER8_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_rvv_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(RISCVFLAG "-march=rv64gcv")
endif()
endif()
# Check whether compiler supports RVV
set(CMAKE_REQUIRED_FLAGS "${RISCVFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
int main() {
return 0;
}"
HAVE_RVV_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_s390_intrinsics)
check_c_source_compiles(
"#include
#ifndef HWCAP_S390_VXRS
#define HWCAP_S390_VXRS HWCAP_S390_VX
#endif
int main() {
return (getauxval(AT_HWCAP) & HWCAP_S390_VXRS);
}"
HAVE_S390_INTRIN
)
endmacro()
macro(check_power9_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(POWER9FLAG "-mcpu=power9")
endif()
endif()
# Check if we have what we need for POWER9 optimizations
set(CMAKE_REQUIRED_FLAGS "${POWER9FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
#ifdef __FreeBSD__
#include
#endif
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP2, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE2_ARCH_3_00);
#else
return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00);
#endif
}"
HAVE_POWER9_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_sse2_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(SSE2FLAG "-msse2")
else()
set(SSE2FLAG "/arch:SSE2")
endif()
elseif(MSVC)
if(NOT "${ARCH}" MATCHES "x86_64")
set(SSE2FLAG "/arch:SSE2")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(SSE2FLAG "-msse2")
endif()
endif()
# Check whether compiler supports SSE2 intrinsics
set(CMAKE_REQUIRED_FLAGS "${SSE2FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
__m128i f(__m128i x, __m128i y) { return _mm_sad_epu8(x, y); }
int main(void) { return 0; }"
HAVE_SSE2_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_ssse3_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(SSSE3FLAG "-mssse3")
else()
set(SSSE3FLAG "/arch:SSSE3")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(SSSE3FLAG "-mssse3")
endif()
endif()
# Check whether compiler supports SSSE3 intrinsics
set(CMAKE_REQUIRED_FLAGS "${SSSE3FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
__m128i f(__m128i u) {
__m128i v = _mm_set1_epi32(1);
return _mm_hadd_epi32(u, v);
}
int main(void) { return 0; }"
HAVE_SSSE3_INTRIN
)
endmacro()
macro(check_sse42_intrinsics)
if(CMAKE_C_COMPILER_ID MATCHES "Intel")
if(CMAKE_HOST_UNIX OR APPLE)
set(SSE42FLAG "-msse4.2")
else()
set(SSE42FLAG "/arch:SSE4.2")
endif()
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
if(NOT NATIVEFLAG)
set(SSE42FLAG "-msse4.2")
endif()
endif()
# Check whether compiler supports SSE4.2 intrinsics
set(CMAKE_REQUIRED_FLAGS "${SSE42FLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
unsigned int f(unsigned int a, unsigned int b) { return _mm_crc32_u32(a, b); }
int main(void) { return 0; }"
HAVE_SSE42_INTRIN
)
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_vgfma_intrinsics)
if(NOT NATIVEFLAG)
set(VGFMAFLAG "-march=z13")
if(CMAKE_C_COMPILER_ID MATCHES "GNU")
set(VGFMAFLAG "${VGFMAFLAG} -mzarch")
endif()
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(VGFMAFLAG "${VGFMAFLAG} -fzvector")
endif()
endif()
# Check whether compiler supports "VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE" intrinsic
set(CMAKE_REQUIRED_FLAGS "${VGFMAFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#include
int main(void) {
unsigned long long a __attribute__((vector_size(16))) = { 0 };
unsigned long long b __attribute__((vector_size(16))) = { 0 };
unsigned char c __attribute__((vector_size(16))) = { 0 };
c = vec_gfmsum_accum_128(a, b, c);
return c[0];
}"
HAVE_VGFMA_INTRIN FAIL_REGEX "not supported")
set(CMAKE_REQUIRED_FLAGS)
endmacro()
macro(check_xsave_intrinsics)
if(NOT NATIVEFLAG AND NOT MSVC)
set(XSAVEFLAG "-mxsave")
endif()
set(CMAKE_REQUIRED_FLAGS "${XSAVEFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}")
check_c_source_compiles(
"#ifdef _MSC_VER
# include
#else
# include
#endif
unsigned int f(unsigned int a) { return (int) _xgetbv(a); }
int main(void) { return 0; }"
HAVE_XSAVE_INTRIN FAIL_REGEX "not supported")
set(CMAKE_REQUIRED_FLAGS)
endmacro()
3p-zlib-ng-main/zlib-ng/cmake/detect-sanitizer.cmake 0000664 0000000 0000000 00000013226 14553115624 0022576 0 ustar 00root root 0000000 0000000 # detect-sanitizer.cmake -- Detect supported compiler sanitizer flags
# Licensed under the Zlib license, see LICENSE.md for details
macro(add_common_sanitizer_flags)
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
add_compile_options(-g3)
endif()
check_c_compiler_flag(-fno-omit-frame-pointer HAVE_NO_OMIT_FRAME_POINTER)
if(HAVE_NO_OMIT_FRAME_POINTER)
add_compile_options(-fno-omit-frame-pointer)
add_link_options(-fno-omit-frame-pointer)
endif()
check_c_compiler_flag(-fno-optimize-sibling-calls HAVE_NO_OPTIMIZE_SIBLING_CALLS)
if(HAVE_NO_OPTIMIZE_SIBLING_CALLS)
add_compile_options(-fno-optimize-sibling-calls)
add_link_options(-fno-optimize-sibling-calls)
endif()
endmacro()
macro(check_sanitizer_support known_checks supported_checks)
set(available_checks "")
# Build list of supported sanitizer flags by incrementally trying compilation with
# known sanitizer checks
foreach(check ${known_checks})
if(available_checks STREQUAL "")
set(compile_checks "${check}")
else()
set(compile_checks "${available_checks},${check}")
endif()
set(CMAKE_REQUIRED_FLAGS -fsanitize=${compile_checks})
check_c_source_compiles("int main() { return 0; }" HAVE_SANITIZER_${check}
FAIL_REGEX "not supported|unrecognized command|unknown option")
set(CMAKE_REQUIRED_FLAGS)
if(HAVE_SANITIZER_${check})
set(available_checks ${compile_checks})
endif()
endforeach()
set(${supported_checks} ${available_checks})
endmacro()
macro(add_address_sanitizer)
set(known_checks
address
pointer-compare
pointer-subtract
)
check_sanitizer_support("${known_checks}" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Address sanitizer is enabled: ${supported_checks}")
add_compile_options(-fsanitize=${supported_checks})
add_link_options(-fsanitize=${supported_checks})
add_common_sanitizer_flags()
else()
message(STATUS "Address sanitizer is not supported")
endif()
if(CMAKE_CROSSCOMPILING_EMULATOR)
# Only check for leak sanitizer if not cross-compiling due to qemu crash
message(WARNING "Leak sanitizer is not supported when cross compiling")
else()
# Leak sanitizer requires address sanitizer
check_sanitizer_support("leak" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Leak sanitizer is enabled: ${supported_checks}")
add_compile_options(-fsanitize=${supported_checks})
add_link_options(-fsanitize=${supported_checks})
add_common_sanitizer_flags()
else()
message(STATUS "Leak sanitizer is not supported")
endif()
endif()
endmacro()
macro(add_memory_sanitizer)
check_sanitizer_support("memory" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Memory sanitizer is enabled: ${supported_checks}")
add_compile_options(-fsanitize=${supported_checks})
add_link_options(-fsanitize=${supported_checks})
add_common_sanitizer_flags()
check_c_compiler_flag(-fsanitize-memory-track-origins HAVE_MEMORY_TRACK_ORIGINS)
if(HAVE_MEMORY_TRACK_ORIGINS)
add_compile_options(-fsanitize-memory-track-origins)
add_link_options(-fsanitize-memory-track-origins)
endif()
else()
message(STATUS "Memory sanitizer is not supported")
endif()
endmacro()
macro(add_thread_sanitizer)
check_sanitizer_support("thread" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Thread sanitizer is enabled: ${supported_checks}")
add_compile_options(-fsanitize=${supported_checks})
add_link_options(-fsanitize=${supported_checks})
add_common_sanitizer_flags()
else()
message(STATUS "Thread sanitizer is not supported")
endif()
endmacro()
macro(add_undefined_sanitizer)
set(known_checks
array-bounds
bool
bounds
builtin
enum
float-cast-overflow
float-divide-by-zero
function
integer-divide-by-zero
local-bounds
null
nonnull-attribute
pointer-overflow
return
returns-nonnull-attribute
shift
shift-base
shift-exponent
signed-integer-overflow
undefined
unsigned-integer-overflow
unsigned-shift-base
vla-bound
vptr
)
# Only check for alignment sanitizer flag if unaligned access is not supported
if(NOT WITH_UNALIGNED)
list(APPEND known_checks alignment)
endif()
# Object size sanitizer has no effect at -O0 and produces compiler warning if enabled
if(NOT CMAKE_C_FLAGS MATCHES "-O0")
list(APPEND known_checks object-size)
endif()
check_sanitizer_support("${known_checks}" supported_checks)
if(NOT ${supported_checks} STREQUAL "")
message(STATUS "Undefined behavior sanitizer is enabled: ${supported_checks}")
add_compile_options(-fsanitize=${supported_checks})
add_link_options(-fsanitize=${supported_checks})
# Group sanitizer flag -fsanitize=undefined will automatically add alignment, even if
# it is not in our sanitize flag list, so we need to explicitly disable alignment sanitizing.
if(WITH_UNALIGNED)
add_compile_options(-fno-sanitize=alignment)
endif()
add_common_sanitizer_flags()
else()
message(STATUS "Undefined behavior sanitizer is not supported")
endif()
endmacro()
3p-zlib-ng-main/zlib-ng/cmake/fallback-macros.cmake 0000664 0000000 0000000 00000001154 14553115624 0022336 0 ustar 00root root 0000000 0000000 # fallback-macros.cmake -- CMake fallback macros
# Copyright (C) 2022 Nathan Moinvaziri
# Licensed under the Zlib license, see LICENSE.md for details
# CMake less than version 3.5.2
if(NOT COMMAND add_compile_options)
macro(add_compile_options options)
string(APPEND CMAKE_C_FLAGS ${options})
string(APPEND CMAKE_CXX_FLAGS ${options})
endmacro()
endif()
# CMake less than version 3.14
if(NOT COMMAND add_link_options)
macro(add_link_options options)
string(APPEND CMAKE_EXE_LINKER_FLAGS ${options})
string(APPEND CMAKE_SHARED_LINKER_FLAGS ${options})
endmacro()
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-aarch64.cmake 0000664 0000000 0000000 00000001562 14553115624 0022526 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET "aarch64-linux-gnu")
set(CMAKE_CXX_COMPILER_TARGET "aarch64-linux-gnu")
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-aarch64 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-arm.cmake 0000664 0000000 0000000 00000001774 14553115624 0022062 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSTEM_VERSION 1)
if(NOT DEFINED CMAKE_C_COMPILER_TARGET)
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabi)
endif()
if(NOT DEFINED CMAKE_CXX_COMPILER_TARGET)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabi)
endif()
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-armhf.cmake 0000664 0000000 0000000 00000001626 14553115624 0022374 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabihf)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabihf)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-arm -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-llvm-mingw-aarch64.cmake 0000664 0000000 0000000 00000003143 14553115624 0024612 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_FRONTEND_VARIANT GNU)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_C_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# Required to propagate 'LLVM_MINGW_ROOT' variables to C compiler feature test.
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LLVM_MINGW_ROOT)
if(NOT LLVM_MINGW_ROOT)
set(LLVM_MINGW_ROOT $ENV{LLVM_MINGW_ROOT})
endif()
cmake_path(CONVERT "${LLVM_MINGW_ROOT}" TO_CMAKE_PATH_LIST LLVM_MINGW_ROOT)
set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT} ${LLVM_MINGW_ROOT}/aarch64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ALWAYS)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-clang HINTS ${LLVM_MINGW_ROOT}/bin)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Compiler for ${CMAKE_C_COMPILER_TARGET} not found. Try setting llvm-mingw root path to LLVM_MINGW_ROOT variable!")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH ${CMAKE_CXX_COMPILER_TARGET}-clang++ HINTS ${LLVM_MINGW_ROOT}/bin)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH ${CMAKE_RC_COMPILER_TARGET}-windres HINTS ${LLVM_MINGW_ROOT}/bin)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
add_compile_options($<$:-gcodeview>)
add_link_options(-Wl,-pdb=)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-llvm-mingw-armv7.cmake 0000664 0000000 0000000 00000003131 14553115624 0024413 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_FRONTEND_VARIANT GNU)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_C_COMPILER_TARGET armv7-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET armv7-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET armv7-w64-mingw32)
set(CMAKE_SYSTEM_PROCESSOR armv7)
# Required to propagate 'LLVM_MINGW_ROOT' variables to C compiler feature test.
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LLVM_MINGW_ROOT)
if(NOT LLVM_MINGW_ROOT)
set(LLVM_MINGW_ROOT $ENV{LLVM_MINGW_ROOT})
endif()
cmake_path(CONVERT "${LLVM_MINGW_ROOT}" TO_CMAKE_PATH_LIST LLVM_MINGW_ROOT)
set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT} ${LLVM_MINGW_ROOT}/armv7-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ALWAYS)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-clang HINTS ${LLVM_MINGW_ROOT}/bin)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Compiler for ${CMAKE_C_COMPILER_TARGET} not found. Try setting llvm-mingw root path to LLVM_MINGW_ROOT variable!")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH ${CMAKE_CXX_COMPILER_TARGET}-clang++ HINTS ${LLVM_MINGW_ROOT}/bin)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH ${CMAKE_RC_COMPILER_TARGET}-windres HINTS ${LLVM_MINGW_ROOT}/bin)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
add_compile_options($<$:-gcodeview>)
add_link_options(-Wl,-pdb=)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-llvm-mingw-i686.cmake 0000664 0000000 0000000 00000003130 14553115624 0024052 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_FRONTEND_VARIANT GNU)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_C_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_SYSTEM_PROCESSOR i686)
# Required to propagate 'LLVM_MINGW_ROOT' variables to C compiler feature test.
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LLVM_MINGW_ROOT)
if(NOT LLVM_MINGW_ROOT)
set(LLVM_MINGW_ROOT $ENV{LLVM_MINGW_ROOT})
endif()
cmake_path(CONVERT "${LLVM_MINGW_ROOT}" TO_CMAKE_PATH_LIST LLVM_MINGW_ROOT)
set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT} ${LLVM_MINGW_ROOT}/i686-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ALWAYS)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-clang HINTS ${LLVM_MINGW_ROOT}/bin)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Compiler for ${CMAKE_C_COMPILER_TARGET} not found. Try setting llvm-mingw root path to LLVM_MINGW_ROOT variable!")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH ${CMAKE_CXX_COMPILER_TARGET}-clang++ HINTS ${LLVM_MINGW_ROOT}/bin)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH ${CMAKE_RC_COMPILER_TARGET}-windres HINTS ${LLVM_MINGW_ROOT}/bin)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
add_compile_options($<$:-gcodeview>)
add_link_options(-Wl,-pdb=)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-llvm-mingw-x86_64.cmake 0000664 0000000 0000000 00000003142 14553115624 0024317 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_FRONTEND_VARIANT GNU)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_C_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
# Required to propagate 'LLVM_MINGW_ROOT' variables to C compiler feature test.
set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LLVM_MINGW_ROOT)
if(NOT LLVM_MINGW_ROOT)
set(LLVM_MINGW_ROOT $ENV{LLVM_MINGW_ROOT})
endif()
cmake_path(CONVERT "${LLVM_MINGW_ROOT}" TO_CMAKE_PATH_LIST LLVM_MINGW_ROOT)
set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT} ${LLVM_MINGW_ROOT}/x86_64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ALWAYS)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_program(C_COMPILER_FULL_PATH ${CMAKE_C_COMPILER_TARGET}-clang HINTS ${LLVM_MINGW_ROOT}/bin)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Compiler for ${CMAKE_C_COMPILER_TARGET} not found. Try setting llvm-mingw root path to LLVM_MINGW_ROOT variable!")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH ${CMAKE_CXX_COMPILER_TARGET}-clang++ HINTS ${LLVM_MINGW_ROOT}/bin)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH ${CMAKE_RC_COMPILER_TARGET}-windres HINTS ${LLVM_MINGW_ROOT}/bin)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
add_compile_options($<$:-gcodeview>)
add_link_options(-Wl,-pdb=)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-mingw-i686.cmake 0000664 0000000 0000000 00000002172 14553115624 0023107 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET i686-w64-mingw32)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# Prefer posix gcc variant for gtest pthread support
find_program(C_COMPILER_FULL_PATH NAMES
${CMAKE_C_COMPILER_TARGET}-gcc-posix
${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES
${CMAKE_CXX_COMPILER_TARGET}-g++-posix
${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH NAMES
${CMAKE_RC_COMPILER_TARGET}-windres)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-mingw-x86_64.cmake 0000664 0000000 0000000 00000002176 14553115624 0023355 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_CXX_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_RC_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR wine)
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# Prefer posix gcc variant for gtest pthread support
find_program(C_COMPILER_FULL_PATH NAMES
${CMAKE_C_COMPILER_TARGET}-gcc-posix
${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES
${CMAKE_CXX_COMPILER_TARGET}-g++-posix
${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
find_program(RC_COMPILER_FULL_PATH NAMES ${CMAKE_RC_COMPILER_TARGET}-windres)
if(RC_COMPILER_FULL_PATH)
set(CMAKE_RC_COMPILER ${RC_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-mips.cmake 0000664 0000000 0000000 00000001770 14553115624 0022247 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR mips)
set(CMAKE_SYSTEM_VERSION 1)
if(NOT DEFINED CMAKE_C_COMPILER_TARGET)
set(CMAKE_C_COMPILER_TARGET mips-linux-gnu)
endif()
if(NOT DEFINED CMAKE_CXX_COMPILER_TARGET)
set(CMAKE_CXX_COMPILER_TARGET mips-linux-gnu)
endif()
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-mips -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-mips64.cmake 0000664 0000000 0000000 00000002012 14553115624 0022407 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR mips64)
set(CMAKE_SYSTEM_VERSION 1)
if(NOT DEFINED CMAKE_C_COMPILER_TARGET)
set(CMAKE_C_COMPILER_TARGET mips64-linux-gnuabi64)
endif()
if(NOT DEFINED CMAKE_CXX_COMPILER_TARGET)
set(CMAKE_CXX_COMPILER_TARGET mips64-linux-gnuabi64)
endif()
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-mips64 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc.cmake 0000664 0000000 0000000 00000001640 14553115624 0022752 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR powerpc)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET powerpc-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET powerpc-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc -cpu 7400 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64-clang.cmake 0000664 0000000 0000000 00000001054 14553115624 0024205 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER clang)
set(CMAKE_C_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_CXX_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64 -cpu power9 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64-power9.cmake 0000664 0000000 0000000 00000001646 14553115624 0024355 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64 -cpu power9 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64.cmake 0000664 0000000 0000000 00000001646 14553115624 0023132 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET powerpc64-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64 -cpu power8 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64le-clang.cmake 0000664 0000000 0000000 00000001064 14553115624 0024527 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER clang)
set(CMAKE_C_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_CXX_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64le -cpu power9 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64le-power9.cmake 0000664 0000000 0000000 00000001656 14553115624 0024677 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64le -cpu power9 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-powerpc64le.cmake 0000664 0000000 0000000 00000001656 14553115624 0023454 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET powerpc64le-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-ppc64le -cpu power8 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-riscv.cmake 0000664 0000000 0000000 00000002110 14553115624 0022412 0 ustar 00root root 0000000 0000000 set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "riscv64")
# Avoid to use system path for cross-compile
set(CMAKE_FIND_USE_CMAKE_SYSTEM_PATH FALSE)
set(TOOLCHAIN_PATH "" CACHE STRING "The toolchain path.")
if(NOT TOOLCHAIN_PATH)
set(TOOLCHAIN_PATH ${CMAKE_SOURCE_DIR}/prebuilt-riscv-toolchain-qemu/riscv-clang)
endif()
set(TOOLCHAIN_PREFIX "riscv64-unknown-linux-gnu-" CACHE STRING "The toolchain prefix.")
set(QEMU_PATH "" CACHE STRING "The qemu path.")
if(NOT QEMU_PATH)
set(QEMU_PATH ${CMAKE_SOURCE_DIR}/prebuilt-riscv-toolchain-qemu/riscv-qemu/bin/qemu-riscv64)
endif()
# toolchain setting
set(CMAKE_C_COMPILER "${TOOLCHAIN_PATH}/bin/${TOOLCHAIN_PREFIX}clang")
set(CMAKE_CXX_COMPILER "${TOOLCHAIN_PATH}/bin/${TOOLCHAIN_PREFIX}clang++")
# disable auto-vectorizer
add_compile_options(-fno-vectorize -fno-slp-vectorize)
# emulator setting
set(QEMU_CPU_OPTION "rv64,zba=true,zbb=true,zbc=true,zbs=true,v=true,vlen=512,elen=64,vext_spec=v1.0")
set(CMAKE_CROSSCOMPILING_EMULATOR ${QEMU_PATH} -cpu ${QEMU_CPU_OPTION} -L ${TOOLCHAIN_PATH}/sysroot/)
3p-zlib-ng-main/zlib-ng/cmake/toolchain-s390x.cmake 0000664 0000000 0000000 00000001622 14553115624 0022161 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR s390x)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET s390x-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET s390x-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-s390x -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/cmake/toolchain-sparc64.cmake 0000664 0000000 0000000 00000001632 14553115624 0022556 0 ustar 00root root 0000000 0000000 set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR sparc64)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_C_COMPILER_TARGET sparc64-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET sparc64-linux-gnu)
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-sparc64 -L /usr/${CMAKE_C_COMPILER_TARGET}/)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
find_program(C_COMPILER_FULL_PATH NAMES ${CMAKE_C_COMPILER_TARGET}-gcc)
if(NOT C_COMPILER_FULL_PATH)
message(FATAL_ERROR "Cross-compiler for ${CMAKE_C_COMPILER_TARGET} not found")
endif()
set(CMAKE_C_COMPILER ${C_COMPILER_FULL_PATH})
find_program(CXX_COMPILER_FULL_PATH NAMES g++-${CMAKE_CXX_COMPILER_TARGET} ${CMAKE_CXX_COMPILER_TARGET}-g++)
if(CXX_COMPILER_FULL_PATH)
set(CMAKE_CXX_COMPILER ${CXX_COMPILER_FULL_PATH})
endif()
3p-zlib-ng-main/zlib-ng/compare256.c 0000664 0000000 0000000 00000011437 14553115624 0017267 0 ustar 00root root 0000000 0000000 /* compare256.c -- 256 byte memory comparison with match length return
* Copyright (C) 2020 Nathan Moinvaziri
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "zutil_p.h"
#include "fallback_builtins.h"
/* ALIGNED, byte comparison */
static inline uint32_t compare256_c_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src0 += 1, src1 += 1, len += 1;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_c(const uint8_t *src0, const uint8_t *src1) {
return compare256_c_static(src0, src1);
}
#define LONGEST_MATCH longest_match_c
#define COMPARE256 compare256_c_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_c
#define COMPARE256 compare256_c_static
#include "match_tpl.h"
#if defined(UNALIGNED_OK) && BYTE_ORDER == LITTLE_ENDIAN
/* 16-bit unaligned integer comparison */
static inline uint32_t compare256_unaligned_16_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
if (zng_memcmp_2(src0, src1) != 0)
return len + (*src0 == *src1);
src0 += 2, src1 += 2, len += 2;
if (zng_memcmp_2(src0, src1) != 0)
return len + (*src0 == *src1);
src0 += 2, src1 += 2, len += 2;
if (zng_memcmp_2(src0, src1) != 0)
return len + (*src0 == *src1);
src0 += 2, src1 += 2, len += 2;
if (zng_memcmp_2(src0, src1) != 0)
return len + (*src0 == *src1);
src0 += 2, src1 += 2, len += 2;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_unaligned_16(const uint8_t *src0, const uint8_t *src1) {
return compare256_unaligned_16_static(src0, src1);
}
#define LONGEST_MATCH longest_match_unaligned_16
#define COMPARE256 compare256_unaligned_16_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_unaligned_16
#define COMPARE256 compare256_unaligned_16_static
#include "match_tpl.h"
#ifdef HAVE_BUILTIN_CTZ
/* 32-bit unaligned integer comparison */
static inline uint32_t compare256_unaligned_32_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
uint32_t sv, mv, diff;
memcpy(&sv, src0, sizeof(sv));
memcpy(&mv, src1, sizeof(mv));
diff = sv ^ mv;
if (diff) {
uint32_t match_byte = __builtin_ctz(diff) / 8;
return len + match_byte;
}
src0 += 4, src1 += 4, len += 4;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_unaligned_32(const uint8_t *src0, const uint8_t *src1) {
return compare256_unaligned_32_static(src0, src1);
}
#define LONGEST_MATCH longest_match_unaligned_32
#define COMPARE256 compare256_unaligned_32_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_unaligned_32
#define COMPARE256 compare256_unaligned_32_static
#include "match_tpl.h"
#endif
#if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL)
/* UNALIGNED64_OK, 64-bit integer comparison */
static inline uint32_t compare256_unaligned_64_static(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
uint64_t sv, mv, diff;
memcpy(&sv, src0, sizeof(sv));
memcpy(&mv, src1, sizeof(mv));
diff = sv ^ mv;
if (diff) {
uint64_t match_byte = __builtin_ctzll(diff) / 8;
return len + (uint32_t)match_byte;
}
src0 += 8, src1 += 8, len += 8;
} while (len < 256);
return 256;
}
Z_INTERNAL uint32_t compare256_unaligned_64(const uint8_t *src0, const uint8_t *src1) {
return compare256_unaligned_64_static(src0, src1);
}
#define LONGEST_MATCH longest_match_unaligned_64
#define COMPARE256 compare256_unaligned_64_static
#include "match_tpl.h"
#define LONGEST_MATCH_SLOW
#define LONGEST_MATCH longest_match_slow_unaligned_64
#define COMPARE256 compare256_unaligned_64_static
#include "match_tpl.h"
#endif
#endif
3p-zlib-ng-main/zlib-ng/compare256_rle.h 0000664 0000000 0000000 00000006623 14553115624 0020137 0 ustar 00root root 0000000 0000000 /* compare256_rle.h -- 256 byte run-length encoding comparison
* Copyright (C) 2022 Nathan Moinvaziri
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "fallback_builtins.h"
typedef uint32_t (*compare256_rle_func)(const uint8_t* src0, const uint8_t* src1);
/* ALIGNED, byte comparison */
static inline uint32_t compare256_rle_c(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
do {
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
if (*src0 != *src1)
return len;
src1 += 1, len += 1;
} while (len < 256);
return 256;
}
#ifdef UNALIGNED_OK
/* 16-bit unaligned integer comparison */
static inline uint32_t compare256_rle_unaligned_16(const uint8_t *src0, const uint8_t *src1) {
uint32_t len = 0;
uint16_t src0_cmp, src1_cmp;
memcpy(&src0_cmp, src0, sizeof(src0_cmp));
do {
memcpy(&src1_cmp, src1, sizeof(src1_cmp));
if (src0_cmp != src1_cmp)
return len + (*src0 == *src1);
src1 += 2, len += 2;
memcpy(&src1_cmp, src1, sizeof(src1_cmp));
if (src0_cmp != src1_cmp)
return len + (*src0 == *src1);
src1 += 2, len += 2;
memcpy(&src1_cmp, src1, sizeof(src1_cmp));
if (src0_cmp != src1_cmp)
return len + (*src0 == *src1);
src1 += 2, len += 2;
memcpy(&src1_cmp, src1, sizeof(src1_cmp));
if (src0_cmp != src1_cmp)
return len + (*src0 == *src1);
src1 += 2, len += 2;
} while (len < 256);
return 256;
}
#ifdef HAVE_BUILTIN_CTZ
/* 32-bit unaligned integer comparison */
static inline uint32_t compare256_rle_unaligned_32(const uint8_t *src0, const uint8_t *src1) {
uint32_t sv, len = 0;
uint16_t src0_cmp;
memcpy(&src0_cmp, src0, sizeof(src0_cmp));
sv = ((uint32_t)src0_cmp << 16) | src0_cmp;
do {
uint32_t mv, diff;
memcpy(&mv, src1, sizeof(mv));
diff = sv ^ mv;
if (diff) {
uint32_t match_byte = __builtin_ctz(diff) / 8;
return len + match_byte;
}
src1 += 4, len += 4;
} while (len < 256);
return 256;
}
#endif
#if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL)
/* 64-bit unaligned integer comparison */
static inline uint32_t compare256_rle_unaligned_64(const uint8_t *src0, const uint8_t *src1) {
uint32_t src0_cmp32, len = 0;
uint16_t src0_cmp;
uint64_t sv;
memcpy(&src0_cmp, src0, sizeof(src0_cmp));
src0_cmp32 = ((uint32_t)src0_cmp << 16) | src0_cmp;
sv = ((uint64_t)src0_cmp32 << 32) | src0_cmp32;
do {
uint64_t mv, diff;
memcpy(&mv, src1, sizeof(mv));
diff = sv ^ mv;
if (diff) {
uint64_t match_byte = __builtin_ctzll(diff) / 8;
return len + (uint32_t)match_byte;
}
src1 += 8, len += 8;
} while (len < 256);
return 256;
}
#endif
#endif
3p-zlib-ng-main/zlib-ng/compress.c 0000664 0000000 0000000 00000007463 14553115624 0017243 0 ustar 00root root 0000000 0000000 /* compress.c -- compress a memory buffer
* Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "zutil.h"
/* ===========================================================================
* Architecture-specific hooks.
*/
#ifdef S390_DFLTCC_DEFLATE
# include "arch/s390/dfltcc_common.h"
#else
/* Returns the upper bound on compressed data length based on uncompressed data length, assuming default settings.
* Zero means that arch-specific deflation code behaves identically to the regular zlib-ng algorithms. */
# define DEFLATE_BOUND_COMPLEN(source_len) 0
#endif
/* ===========================================================================
Compresses the source buffer into the destination buffer. The level
parameter has the same meaning as in deflateInit. sourceLen is the byte
length of the source buffer. Upon entry, destLen is the total size of the
destination buffer, which must be at least 0.1% larger than sourceLen plus
12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
Z_STREAM_ERROR if the level parameter is invalid.
*/
int Z_EXPORT PREFIX(compress2)(unsigned char *dest, z_uintmax_t *destLen, const unsigned char *source,
z_uintmax_t sourceLen, int level) {
PREFIX3(stream) stream;
int err;
const unsigned int max = (unsigned int)-1;
z_size_t left;
left = *destLen;
*destLen = 0;
stream.zalloc = NULL;
stream.zfree = NULL;
stream.opaque = NULL;
err = PREFIX(deflateInit)(&stream, level);
if (err != Z_OK)
return err;
stream.next_out = dest;
stream.avail_out = 0;
stream.next_in = (z_const unsigned char *)source;
stream.avail_in = 0;
do {
if (stream.avail_out == 0) {
stream.avail_out = left > (unsigned long)max ? max : (unsigned int)left;
left -= stream.avail_out;
}
if (stream.avail_in == 0) {
stream.avail_in = sourceLen > (unsigned long)max ? max : (unsigned int)sourceLen;
sourceLen -= stream.avail_in;
}
err = PREFIX(deflate)(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
} while (err == Z_OK);
*destLen = stream.total_out;
PREFIX(deflateEnd)(&stream);
return err == Z_STREAM_END ? Z_OK : err;
}
/* ===========================================================================
*/
int Z_EXPORT PREFIX(compress)(unsigned char *dest, z_uintmax_t *destLen, const unsigned char *source, z_uintmax_t sourceLen) {
return PREFIX(compress2)(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
}
/* ===========================================================================
If the default memLevel or windowBits for deflateInit() is changed, then
this function needs to be updated.
*/
z_uintmax_t Z_EXPORT PREFIX(compressBound)(z_uintmax_t sourceLen) {
z_uintmax_t complen = DEFLATE_BOUND_COMPLEN(sourceLen);
if (complen > 0)
/* Architecture-specific code provided an upper bound. */
return complen + ZLIB_WRAPLEN;
#ifndef NO_QUICK_STRATEGY
return sourceLen /* The source size itself */
+ (sourceLen == 0 ? 1 : 0) /* Always at least one byte for any input */
+ (sourceLen < 9 ? 1 : 0) /* One extra byte for lengths less than 9 */
+ DEFLATE_QUICK_OVERHEAD(sourceLen) /* Source encoding overhead, padded to next full byte */
+ DEFLATE_BLOCK_OVERHEAD /* Deflate block overhead bytes */
+ ZLIB_WRAPLEN; /* zlib wrapper */
#else
return sourceLen + (sourceLen >> 4) + 7 + ZLIB_WRAPLEN;
#endif
}
3p-zlib-ng-main/zlib-ng/configure 0000775 0000000 0000000 00000220452 14553115624 0017146 0 ustar 00root root 0000000 0000000 #!/bin/sh
# configure script for zlib.
#
# Normally configure builds both a static and a shared library.
# If you want to build just a static library, use: ./configure --static
#
# To impose specific compiler or flags or install directory, use for example:
# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
# or for csh/tcsh users:
# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
# If you have problems, try without defining CC and CFLAGS before reporting
# an error.
# start off configure.log
echo -------------------- >> configure.log
echo $0 $* >> configure.log
date >> configure.log
SRCDIR=$(cd $(dirname $0); pwd)
BUILDDIR=$(pwd)
# set command prefix for cross-compilation
if [ -n "${CHOST}" ]; then
# normalize the chost before parsing it
NORM_CHOST=$(sh "$SRCDIR"/tools/config.sub $CHOST)
uname="$(echo "${NORM_CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')"
CROSS_PREFIX="${CHOST}-"
ARCH="$(echo "${NORM_CHOST}" | sed -e 's/-.*//')"
else
ARCH="$(uname -m)"
fi
case "${ARCH}" in
x86_64)
case "${CFLAGS}" in
*-m32*)
ARCH=i686
;;
esac
;;
i386 | i486 | i586 | i686)
case "${CFLAGS}" in
*-m64*)
ARCH=x86_64
;;
esac
;;
esac
# destination name for windows import library
IMPORTLIB=
# establish commands for library building
if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
AR=${AR-"${CROSS_PREFIX}ar"}
test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
else
AR=${AR-"ar"}
test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
fi
ARFLAGS=${ARFLAGS-"rc"}
if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then
RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"}
test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log
else
RANLIB=${RANLIB-"ranlib"}
fi
# set defaults before processing command line options
LDCONFIG=${LDCONFIG-"ldconfig"}
DEFFILE=
RC=
RCFLAGS=
RCOBJS=
STRIP=
ARCHS=
PC_CFLAGS=
prefix=${prefix-/usr/local}
exec_prefix=${exec_prefix-'${prefix}'}
bindir=${bindir-'${exec_prefix}/bin'}
libdir=${libdir-'${exec_prefix}/lib'}
sharedlibdir=${sharedlibdir-'${libdir}'}
includedir=${includedir-'${prefix}/include'}
mandir=${mandir-'${prefix}/share/man'}
shared_ext='.so'
shared=1
gzfileops=1
unalignedok=1
compat=0
cover=0
build32=0
build64=0
buildvpclmulqdq=1
buildacle=1
buildarmv6=1
buildaltivec=1
buildpower8=1
buildpower9=1
buildneon=1
builddfltccdeflate=0
builddfltccinflate=0
buildcrc32vx=1
floatabi=
forcesse2=0
# For CPUs that can benefit from AVX512, it seems GCC generates suboptimal
# instruction scheduling unless you specify a reasonable -mtune= target
avx512flag="-mavx512f -mavx512dq -mavx512bw -mavx512vl"
avx512vnniflag="${avx512flag} -mavx512vnni"
avx2flag="-mavx2"
sse2flag="-msse2"
ssse3flag="-mssse3"
sse42flag="-msse4.2"
pclmulflag="-mpclmul"
vpclmulflag="-mvpclmulqdq -mavx512f"
xsaveflag="-mxsave"
acleflag=
neonflag=
armv6flag=
noltoflag="-fno-lto"
vgfmaflag="-march=z13"
vmxflag="-maltivec"
symbol_prefix=""
without_optimizations=0
without_new_strategies=0
reducedmem=0
gcc=0
warn=0
debug=0
visibility=1
old_cc="$CC"
old_cflags="$CFLAGS"
OBJC='$(OBJZ)'
PIC_OBJC='$(PIC_OBJZ)'
INSTALLTARGETS="install-shared install-static"
UNINSTALLTARGETS="uninstall-shared uninstall-static"
TEST="teststatic"
# leave this script, optionally in a bad way
leave()
{
if test "$*" != "0"; then
echo "** $0 aborting." | tee -a configure.log
fi
rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version
echo -------------------- >> configure.log
echo >> configure.log
echo >> configure.log
exit $1
}
# process command line options
while test $# -ge 1
do
case "$1" in
-h* | --help)
echo 'usage:' | tee -a configure.log
echo ' configure [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log
echo ' [--static] [--32] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log
echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log
echo ' [--sprefix=SYMBOL_PREFIX] Adds a prefix to all exported symbols' | tee -a configure.log
echo ' [--warn] Enables extra compiler warnings' | tee -a configure.log
echo ' [--debug] Enables extra debug prints during operation' | tee -a configure.log
echo ' [--zlib-compat] Compiles for zlib-compatible API instead of zlib-ng API' | tee -a configure.log
echo ' [--without-unaligned] Compiles without fast unaligned access' | tee -a configure.log
echo ' [--without-gzfileops] Compiles without the gzfile parts of the API enabled' | tee -a configure.log
echo ' [--without-optimizations] Compiles without support for optional instruction sets' | tee -a configure.log
echo ' [--without-new-strategies] Compiles without using new additional deflate strategies' | tee -a configure.log
echo ' [--without-acle] Compiles without ARM C Language Extensions' | tee -a configure.log
echo ' [--without-neon] Compiles without ARM Neon SIMD instruction set' | tee -a configure.log
echo ' [--without-armv6] Compiles without ARMv6 SIMD instruction set' | tee -a configure.log
echo ' [--without-altivec] Compiles without PPC AltiVec support' | tee -a configure.log
echo ' [--without-power8] Compiles without Power8 instruction set' | tee -a configure.log
echo ' [--with-dfltcc-deflate] Use DEFLATE CONVERSION CALL instruction for compression on IBM Z' | tee -a configure.log
echo ' [--with-dfltcc-inflate] Use DEFLATE CONVERSION CALL instruction for decompression on IBM Z' | tee -a configure.log
echo ' [--without-crc32-vx] Build without vectorized CRC32 on IBM Z' | tee -a configure.log
echo ' [--with-reduced-mem] Reduced memory usage for special cases (reduces performance)' | tee -a configure.log
echo ' [--force-sse2] Assume SSE2 instructions are always available (disabled by default on x86, enabled on x86_64)' | tee -a configure.log
exit 0 ;;
-p*=* | --prefix=*) prefix=$(echo $1 | sed 's/.*=//'); shift ;;
-e*=* | --eprefix=*) exec_prefix=$(echo $1 | sed 's/.*=//'); shift ;;
-m*=* | --sprefix=*) symbol_prefix=$(echo $1 | sed 's/.*=//'); shift ;;
-l*=* | --libdir=*) libdir=$(echo $1 | sed 's/.*=//'); shift ;;
--sharedlibdir=*) sharedlibdir=$(echo $1 | sed 's/.*=//'); shift ;;
-i*=* | --includedir=*) includedir=$(echo $1 | sed 's/.*=//');shift ;;
-u*=* | --uname=*) uname=$(echo $1 | sed 's/.*=//');shift ;;
-p* | --prefix) prefix="$2"; shift; shift ;;
-e* | --eprefix) exec_prefix="$2"; shift; shift ;;
-m* | --sprefix) symbol_prefix="$2"; shift; shift ;;
-l* | --libdir) libdir="$2"; shift; shift ;;
-i* | --includedir) includedir="$2"; shift; shift ;;
-s* | --shared | --enable-shared) shared=1; shift ;;
-t | --static) shared=0; shift ;;
--zlib-compat) compat=1; shift ;;
--without-unaligned) unalignedok=0; shift ;;
--without-gzfileops) gzfileops=0; shift ;;
--cover) cover=1; shift ;;
-3* | --32) build32=1; shift ;;
-6* | --64) build64=1; shift ;;
--without-vpclmulqdq) buildvpclmulqdq=0; shift ;;
--without-acle) buildacle=0; shift ;;
--without-neon) buildneon=0; shift ;;
--without-armv6) buildarmv6=0; shift ;;
--without-altivec) buildaltivec=0 ; shift ;;
--without-power8) buildpower8=0 ; shift ;;
--without-power9) buildpower9=0 ; shift ;;
--with-dfltcc-deflate) builddfltccdeflate=1; shift ;;
--with-dfltcc-inflate) builddfltccinflate=1; shift ;;
--without-crc32-vx) buildcrc32vx=0; shift ;;
--with-reduced-mem) reducedmem=1; shift ;;
--force-sse2) forcesse2=1; shift ;;
-a*=* | --archs=*) ARCHS=$(echo $1 | sed 's/.*=//'); shift ;;
--sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;;
--localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;;
-noopt | --without-optimizations) without_optimizations=1; shift;;
-oldstrat | --without-new-strategies) without_new_strategies=1; shift;;
-w* | --warn) warn=1; shift ;;
-d* | --debug) debug=1; shift ;;
*)
echo "unknown option: $1" | tee -a configure.log
echo "$0 --help for help" | tee -a configure.log
leave 1;;
esac
done
# temporary file name
test=ztest$$
# put arguments in log, also put test file in log if used in arguments
show()
{
case "$@" in
*$test.c*)
echo "=== $test.c ===" >> configure.log
cat $test.c >> configure.log
echo "===" >> configure.log;;
esac
echo "$@" >> configure.log
}
# check for gcc vs. cc and set compile and link flags based on the system identified by uname
cat > $test.c <&1) in
*gcc*) gcc=1 ;;
*clang*) gcc=1 ;;
esac
if test $build32 -eq 1; then
CFLAGS="${CFLAGS} -m32"
SFLAGS="${SFLAGS} -m32"
LDFLAGS="${LDFLAGS} -m32"
fi
if test $build64 -eq 1; then
CFLAGS="${CFLAGS} -m64"
SFLAGS="${SFLAGS} -m64"
LDFLAGS="${LDFLAGS} -m64"
fi
# Set library name depending on zlib-compat option
if test $compat -eq 0; then
LIBNAME=libz-ng
LIBNAME2=zlib-ng
SUFFIX=-ng
else
LIBNAME=libz
LIBNAME2=zlib
SUFFIX=""
fi
STATICLIB=${LIBNAME}.a
MAPNAME=${LIBNAME2}.map
# extract zlib version numbers from zlib.h
if test $compat -eq 0; then
VER=$(sed -n -e '/ZLIBNG_VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}/zlib-ng.h.in)
VER3=$(sed -n -e '/ZLIBNG_VERSION "/s/.*"\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' < ${SRCDIR}/zlib-ng.h.in)
VER2=$(sed -n -e '/ZLIBNG_VERSION "/s/.*"\([0-9]*\.[0-9]*\)\..*/\1/p' < ${SRCDIR}/zlib-ng.h.in)
VER1=$(sed -n -e '/ZLIBNG_VERSION "/s/.*"\([0-9]*\)\..*/\1/p' < ${SRCDIR}/zlib-ng.h.in)
else
VER=$(sed -n -e '/ZLIB_VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}/zlib.h.in)
VER3=$(sed -n -e '/ZLIB_VERSION "/s/.*"\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' < ${SRCDIR}/zlib.h.in)
VER2=$(sed -n -e '/ZLIB_VERSION "/s/.*"\([0-9]*\.[0-9]*\)\..*/\1/p' < ${SRCDIR}/zlib.h.in)
VER1=$(sed -n -e '/ZLIB_VERSION "/s/.*"\([0-9]*\)\..*/\1/p' < ${SRCDIR}/zlib.h.in)
fi
show $cc -c $test.c
if test "$gcc" -eq 1 && ($cc $CFLAGS -c $test.c) >> configure.log 2>&1; then
echo "$cc" | tee -a configure.log
CC="$cc"
CFLAGS="${CFLAGS} -std=c11"
# Re-check ARCH if the compiler is a cross-compiler.
if $CC -print-multiarch 1> /dev/null 2>&1 && test -n "$($CC -print-multiarch)" 1> /dev/null 2>&1; then
CC_ARCH=$($CC $CFLAGS -print-multiarch | sed 's/-.*//g')
else
CC_ARCH=$($CC $CFLAGS -dumpmachine | sed 's/-.*//g')
fi
case $CC_ARCH in
i386 | i486 | i586 | i686)
# Honor user choice if gcc is multilib and 64-bit is requested
if test $build64 -eq 1; then
ARCH=x86_64
else
ARCH=$CC_ARCH
fi ;;
x86_64)
# Honor user choice if gcc is multilib and 32-bit is requested
if test $build32 -ne 1; then
ARCH=$CC_ARCH
fi ;;
arm | armeb)
ARCH=arm
if test "${uname}" = "eabi"; then
uname=arm
fi ;;
armv8l)
ARCH=armv8-a ;;
aarch64 | aarch64_be | arm64)
if test "${uname}" = "elf"; then
uname=aarch64
fi
ARCH=aarch64 ;;
powerpc | ppc)
ARCH=powerpc ;;
powerpc64 | ppc64)
ARCH=powerpc64 ;;
powerpc64le | ppc64le)
ARCH=powerpc64le ;;
esac
CFLAGS="-O2 ${CFLAGS}"
if test -n "${ARCHS}"; then
CFLAGS="${CFLAGS} ${ARCHS}"
LDFLAGS="${LDFLAGS} ${ARCHS}"
fi
CFLAGS="${CFLAGS} -Wall"
SFLAGS="${CFLAGS} -fPIC"
if test "$warn" -eq 1; then
CFLAGS="${CFLAGS} -Wextra"
fi
if test $debug -eq 1; then
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
else
CFLAGS="${CFLAGS} -DNDEBUG"
SFLAGS="${SFLAGS} -DNDEBUG"
fi
if test -z "$uname"; then
uname=$( (uname -s || echo unknown) 2>/dev/null)
fi
case "$uname" in
Linux* | linux* | GNU | GNU/* | solaris*)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1},--version-script,${SRCDIR}/${MAPNAME}" ;;
*BSD | *bsd* | DragonFly)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1},--version-script,${SRCDIR}/${MAPNAME}"
LDCONFIG="ldconfig -m" ;;
CYGWIN* | Cygwin* | cygwin*)
visibility=0
ARFLAGS="rcs"
SFLAGS="${CFLAGS}"
shared_ext='.dll'
sharedlibdir='${bindir}'
if test $compat -eq 0; then
SHAREDLIB=cygz-ng$shared_ext
else
SHAREDLIB=cygz$shared_ext
fi
SHAREDLIBM=''
SHAREDLIBV=''
SHAREDTARGET=$SHAREDLIB
IMPORTLIB="${LIBNAME}.dll.a"
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,--out-implib,${IMPORTLIB},--version-script,${SRCDIR}/${MAPNAME}"
LDSHAREDLIBC=""
if test $gzfileops -eq 0; then
DEFFILE='win32/${LIBNAME2}.def'
fi
RC="${CROSS_PREFIX}windres"
RCFLAGS="-I ${BUILDDIR}"
RCOBJS='zlibrc.o'
STRIP="${CROSS_PREFIX}strip"
EXE='.exe' ;;
MSYS* | msys*)
visibility=0
ARFLAGS="rcs"
SFLAGS="${CFLAGS}"
shared_ext='.dll'
sharedlibdir='${bindir}'
if test $compat -eq 0; then
SHAREDLIB=msys-z-ng$shared_ext
else
SHAREDLIB=msys-z$shared_ext
fi
SHAREDLIBM=''
SHAREDLIBV=''
SHAREDTARGET=$SHAREDLIB
IMPORTLIB="${LIBNAME}.dll.a"
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,--out-implib,${IMPORTLIB}"
LDSHAREDLIBC=""
if test $gzfileops -eq 0; then
DEFFILE='win32/${LIBNAME2}.def'
fi
RC="${CROSS_PREFIX}windres"
RCFLAGS="-I ${BUILDDIR}"
RCOBJS='zlibrc.o'
STRIP="${CROSS_PREFIX}strip"
EXE='.exe' ;;
MINGW* | mingw*)
visibility=0
ARFLAGS="rcs"
CFLAGS="${CFLAGS} -D_POSIX_C_SOURCE=200809L -D_GNU_SOURCE=1 -Wno-pedantic-ms-format"
SFLAGS="${CFLAGS}"
shared_ext='.dll'
sharedlibdir='${bindir}'
SHAREDLIB=${LIBNAME}-$VER1$shared_ext
SHAREDLIBM=''
SHAREDLIBV=''
SHAREDTARGET=$SHAREDLIB
IMPORTLIB="${LIBNAME}.dll.a"
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,--out-implib=${IMPORTLIB} -Wl,--version-script=${SRCDIR}/${MAPNAME}"
LDSHAREDLIBC=""
if test $gzfileops -eq 0; then
DEFFILE='win32/${LIBNAME2}.def'
fi
RC="${CROSS_PREFIX}windres"
RCFLAGS="-I ${BUILDDIR}"
if [ "$CC" = "mingw32-gcc" ]; then
case $ARCH in
i386 | i486 | i586 | i686) RCFLAGS="${RCFLAGS} -F pe-i386";;
esac;
fi
RCOBJS='zlibrc.o'
STRIP="${CROSS_PREFIX}strip"
EXE='.exe' ;;
QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
# (alain.bonnefoy@icbt.com)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,-h${LIBNAME}.so.${VER1}" ;;
HP-UX*)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared"
case $( (uname -m || echo unknown) 2>/dev/null) in
ia64)
shared_ext='.so'
SHAREDLIB='${LIBNAME}.so' ;;
*)
shared_ext='.sl'
SHAREDLIB='${LIBNAME}.sl' ;;
esac ;;
Darwin* | darwin*)
shared_ext='.dylib'
SHAREDLIB=${LIBNAME}$shared_ext
SHAREDLIBV=${LIBNAME}.$VER$shared_ext
SHAREDLIBM=${LIBNAME}.$VER1$shared_ext
SHAREDTARGET=$SHAREDLIBV
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-dynamiclib -install_name @rpath/${SHAREDLIBM} -compatibility_version ${VER1} -current_version ${VER3}"
if libtool -V 2>&1 | grep Apple > /dev/null; then
AR="libtool"
else
AR="/usr/bin/libtool"
fi
ARFLAGS="-o" ;;
aarch64)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared -Wl,-soname,${LIBNAME}.so.${VER1} -Wl,--version-script,${SRCDIR}/${MAPNAME}"
LDSHAREDLIBC="-Wl,--start-group -lc -lrdimon -Wl,--end-group" ;;
*)
LDSHARED=${LDSHARED-"$cc"}
LDSHAREDFLAGS="-shared" ;;
esac
else
# find system name and corresponding cc options
CC=${CC-cc}
gcc=0
echo "$CC" | tee -a configure.log
if test -z "$uname"; then
uname=$( (uname -sr || echo unknown) 2>/dev/null)
fi
case "$uname" in
HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"ld"}
LDSHAREDFLAGS="-b"
case $( (uname -m || echo unknown) 2>/dev/null) in
ia64)
shared_ext='.so'
SHAREDLIB='${LIBNAME}.so' ;;
*)
shared_ext='.sl'
SHAREDLIB='${LIBNAME}.sl' ;;
esac ;;
AIX*) # Courtesy of dbakker@arrayasolutions.com
SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
LDSHARED=${LDSHARED-"xlc"}
LDSHAREDFLAGS="-G" ;;
# send working options for other systems to zlib@gzip.org
*) SFLAGS=${CFLAGS-"-O"}
CFLAGS=${CFLAGS-"-O"}
LDSHARED=${LDSHARED-"cc"}
LDSHAREDFLAGS="-shared" ;;
esac
fi
# Symbol versioning
case "$uname" in
CYGWIN* | Cygwin* | cygwin* | MINGW* | mingw* | MSYS* | msys* | Darwin* | darwin*)
echo "Checking for Symbol versioning... No."
;;
*)
if test $shared -eq 1; then
echo "Checking for Symbol versioning... Yes."
CFLAGS="${CFLAGS} -DHAVE_SYMVER"
SFLAGS="${SFLAGS} -DHAVE_SYMVER"
else
echo "Checking for Symbol versioning... No."
fi
;;
esac
# Simplify some later conditionals
case "$uname" in
Linux* | linux*)
LINUX=1 ;;
*)
LINUX=0 ;;
esac
# destination names for shared library if not defined above
SHAREDLIB=${SHAREDLIB-"${LIBNAME}$shared_ext"}
SHAREDLIBV=${SHAREDLIBV-"${LIBNAME}$shared_ext.$VER"}
SHAREDLIBM=${SHAREDLIBM-"${LIBNAME}$shared_ext.$VER1"}
SHAREDTARGET=${SHAREDTARGET-"${LIBNAME}$shared_ext.$VER"}
echo >> configure.log
# define functions for testing compiler and library characteristics and logging the results
cat > $test.c </dev/null; then
try()
{
show "$@"
test "$( ("$@") 2>&1 | tee -a configure.log)" = ""
}
echo - using any output from compiler to indicate an error >> configure.log
else
try()
{
show "$@"
( "$@" ) >> configure.log 2>&1
ret=$?
if test $ret -ne 0; then
echo "(exit code $ret)" >> configure.log
fi
return $ret
}
fi
cat > $test.c << EOF
int foo() { return 0; }
EOF
echo "Checking for obsessive-compulsive compiler options..." >> configure.log
if try $CC -c $CFLAGS $test.c; then
:
else
echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log
leave 1
fi
echo >> configure.log
# see if shared library build supported
cat > $test.c <> configure.log
# check for large file support, and if none, check for fseeko()
cat > $test.c <
off64_t dummy = 0;
EOF
if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then
CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
echo "Checking for off64_t... Yes." | tee -a configure.log
echo "Checking for fseeko... Yes." | tee -a configure.log
else
echo "Checking for off64_t... No." | tee -a configure.log
echo >> configure.log
cat > $test.c <
int main() {
_off64_t dummy = 0;
return 0;
}
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for _off64_t... Yes." | tee -a configure.log
else
echo "Checking for _off64_t... No." | tee -a configure.log
fi
echo >> configure.log
cat > $test.c <
int main(void) {
fseeko(NULL, 0, 0);
return 0;
}
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for fseeko... Yes." | tee -a configure.log
else
CFLAGS="${CFLAGS} -DNO_FSEEKO"
SFLAGS="${SFLAGS} -DNO_FSEEKO"
echo "Checking for fseeko... No." | tee -a configure.log
fi
fi
echo >> configure.log
cat > $test.c <
int main(void) {
void *ptr = 0;
int ret = posix_memalign(&ptr, 64, 10);
if (ptr)
free(ptr);
return ret;
}
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for posix_memalign... Yes." | tee -a configure.log
CFLAGS="${CFLAGS} -DHAVE_POSIX_MEMALIGN"
SFLAGS="${SFLAGS} -DHAVE_POSIX_MEMALIGN"
else
echo "Checking for posix_memalign... No." | tee -a configure.log
fi
echo >> configure.log
cat > $test.c <
int main(void) {
void *ptr = aligned_alloc(64, 10);
if (ptr)
free(ptr);
return 0;
}
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for aligned_alloc... Yes." | tee -a configure.log
CFLAGS="${CFLAGS} -DHAVE_ALIGNED_ALLOC"
SFLAGS="${SFLAGS} -DHAVE_ALIGNED_ALLOC"
else
echo "Checking for aligned_alloc... No." | tee -a configure.log
fi
echo >> configure.log
# check for strerror() for use by gz* functions
cat > $test.c <
#include
int main() { return strlen(strerror(errno)); }
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for strerror... Yes." | tee -a configure.log
else
CFLAGS="${CFLAGS} -DNO_STRERROR"
SFLAGS="${SFLAGS} -DNO_STRERROR"
echo "Checking for strerror... No." | tee -a configure.log
fi
# check for getauxval() or elf_aux_info() for architecture feature detection at run-time
cat > $test.c <
int main() {
#ifdef __FreeBSD__
int test;
return elf_aux_info(AT_PAGESZ, &test, sizeof(test));
#else
return getauxval(0);
#endif
}
EOF
if try $CC $CFLAGS -o $test $test.c $LDSHAREDLIBC; then
echo "Checking for getauxval() or elf_aux_info() in sys/auxv.h... Yes." | tee -a configure.log
CFLAGS="${CFLAGS} -DHAVE_SYS_AUXV_H"
SFLAGS="${SFLAGS} -DHAVE_SYS_AUXV_H"
else
echo "Checking for getauxval() in sys/auxv.h... No." | tee -a configure.log
fi
# We need to remove consigured files (zconf.h etc) from source directory if building outside of it
if [ "$SRCDIR" != "$BUILDDIR" ]; then
rm -f $SRCDIR/zconf${SUFFIX}.h
rm -f $SRCDIR/zlib${SUFFIX}.h
rm -f $SRCDIR/zlib_name_mangling${SUFFIX}.h
fi
# Rename @ZLIB_SYMBOL_PREFIX@ to $symbol_prefix in gzread.c, zlib.h and zlib_name_mangling.h
sed < $SRCDIR/gzread.c.in "s/@ZLIB_SYMBOL_PREFIX@/$symbol_prefix/g" > gzread.c
sed < $SRCDIR/zlib${SUFFIX}.h.in "s/@ZLIB_SYMBOL_PREFIX@/$symbol_prefix/g" > zlib${SUFFIX}.h
if [ ! -z "$symbol_prefix" ]; then
sed < $SRCDIR/zlib_name_mangling${SUFFIX}.h.in "s/@ZLIB_SYMBOL_PREFIX@/$symbol_prefix/g" > zlib_name_mangling${SUFFIX}.h
else
# symbol_prefix is not set, copy the empty mangling header
cp -p $SRCDIR/zlib_name_mangling.h.empty zlib_name_mangling${SUFFIX}.h
fi
# copy clean zconf.h for subsequent edits
cp -p $SRCDIR/zconf${SUFFIX}.h.in zconf${SUFFIX}.h
echo >> configure.log
# check for unistd.h and save result in zconf.h
cat > $test.c <
int main() { return 0; }
EOF
if try $CC -c $CFLAGS $test.c; then
sed < zconf${SUFFIX}.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf${SUFFIX}.temp.h
mv zconf${SUFFIX}.temp.h zconf${SUFFIX}.h
echo "Checking for unistd.h... Yes." | tee -a configure.log
else
sed < zconf${SUFFIX}.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be set to #if 1/ 0\1 was set to #if 0/" > zconf${SUFFIX}.temp.h
mv zconf${SUFFIX}.temp.h zconf${SUFFIX}.h
echo "Checking for unistd.h... No." | tee -a configure.log
fi
echo >> configure.log
# check for ptrdiff_t and save result in zconf.h
printf "Checking for ptrdiff_t... " | tee -a configure.log
cat > $test.c <
int fun(ptrdiff_t *a) { (void)a; return 0; }
EOF
if try $CC -c $CFLAGS $test.c; then
echo "Yes." | tee -a configure.log
else
echo "No." | tee -a configure.log
sed < zconf${SUFFIX}.h "/^#ifdef NEED_PTRDIFF_T.* may be/s/def NEED_PTRDIFF_T\(.*\) may be/ 1\1 was/" > zconf${SUFFIX}.temp.h
mv zconf${SUFFIX}.temp.h zconf${SUFFIX}.h
printf "Checking for sizeof(void *)... " | tee -a configure.log
cat > $test.c <
#define COMPILE_TIME_ASSERT(pred) struct s { int x: (pred) ? 1 : -1; }
COMPILE_TIME_ASSERT(sizeof(int32_t) == sizeof(void *));
EOF
if try $CC -c $CFLAGS $test.c; then
echo "sizeof(int32_t)." | tee -a configure.log
sed < zconf${SUFFIX}.h "s/^typedef PTRDIFF_TYPE ptrdiff_t;/typedef int32_t ptrdiff_t;/g" > zconf${SUFFIX}.temp.h
mv zconf${SUFFIX}.temp.h zconf${SUFFIX}.h
else
cat > $test.c <
#define COMPILE_TIME_ASSERT(pred) struct s { int x: (pred) ? 1 : -1; }
COMPILE_TIME_ASSERT(sizeof(int64_t) == sizeof(void *));
EOF
if try $CC -c $CFLAGS $test.c; then
echo "sizeof(int64_t)." | tee -a configure.log
sed < zconf${SUFFIX}.h "s/^typedef PTRDIFF_TYPE ptrdiff_t;/typedef int64_t ptrdiff_t;/g" > zconf${SUFFIX}.temp.h
mv zconf${SUFFIX}.temp.h zconf${SUFFIX}.h
else
echo "unknown." | tee -a configure.log
exit 1
fi
fi
fi
# if --zlib-compat was requested
if test $compat -eq 1; then
gzfileops=1
CFLAGS="${CFLAGS} -DZLIB_COMPAT"
SFLAGS="${SFLAGS} -DZLIB_COMPAT"
case "$uname" in
CYGWIN* | Cygwin* | cygwin* | MSYS* | msys* | MINGW* | mingw*)
DEFFILE="win32/zlibcompat.def" ;;
esac
fi
if [ ! -z "$DEFFILE" ]; then
mkdir -p win32
sed < $SRCDIR/$DEFFILE.in "s/@ZLIB_SYMBOL_PREFIX@/$symbol_prefix/g" > $DEFFILE
fi
# if --gzfileops was requested
if test $gzfileops -eq 1; then
CFLAGS="${CFLAGS} -DWITH_GZFILEOP"
SFLAGS="${SFLAGS} -DWITH_GZFILEOP"
OBJC="${OBJC} \$(OBJG)"
PIC_OBJC="${PIC_OBJC} \$(PIC_OBJG)"
else
TESTOBJG="\$(OBJG)"
PIC_TESTOBJG="\$(OBJG)"
fi
# set architecture alignment requirements
if test $unalignedok -eq 0; then
CFLAGS="${CFLAGS} -DNO_UNALIGNED"
SFLAGS="${SFLAGS} -DNO_UNALIGNED"
echo "Unaligned reads manually disabled." | tee -a configure.log
fi
# enable reduced memory configuration
if test $reducedmem -eq 1; then
echo "Configuring for reduced memory environment." | tee -a configure.log
CFLAGS="${CFLAGS} -DHASH_SIZE=32768u -DGZBUFSIZE=8192"
fi
# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X
if test $cover -eq 1; then
CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
LDFLAGS="${LDFLAGS} -fprofile-arcs -ftest-coverage"
if test -n "$GCC_CLASSIC"; then
CC=$GCC_CLASSIC
fi
fi
echo >> configure.log
# Check for ANSI C compliant compiler
cat > $test.c <
#include
#include
#include "zconf${SUFFIX}.h"
int main() {
#ifdef STDC
return 0;
#endif
return 1;
}
EOF
if try $CC -c $CFLAGS $test.c; then
echo "Checking for ANSI C compliant compiler... Yes." | tee -a configure.log
:
else
echo "Checking for ANSI C compliant compiler... No." | tee -a configure.log
echo "Error: ANSI C compatible compiler needed, cannot continue." | tee -a configure.log
leave 1
fi
# Check for -fno-semantic-interposition compiler support
echo "" > test.c
cat > $test.c <> configure.log 2>&1; then
echo "Checking for -fno-semantic-interposition... Yes." | tee -a configure.log
SFLAGS="$SFLAGS -fno-semantic-interposition"
else
echo "Checking for -fno-semantic-interposition... No." | tee -a configure.log
fi
# Check for -fno-lto compiler support
if test $gcc -eq 1 -a $without_optimizations -eq 0; then
cat > $test.c <> configure.log 2>&1; then
echo "Checking for -fno-lto... Yes." | tee -a configure.log
else
echo "Checking for -fno-lto... No." | tee -a configure.log
noltoflag=""
fi
fi
# see if we can hide zlib internal symbols that are linked between separate source files using hidden
if test "$gcc" -eq 1 && test "$visibility" -eq 1; then
echo >> configure.log
cat > $test.c <> configure.log
echo "Checking for attribute(visibility(hidden)) support... Yes." | tee -a configure.log
else
echo >> configure.log
echo "Checking for attribute(visibility(hidden)) support... No." | tee -a configure.log
fi
fi
# see if we can hide zlib internal symbols that are linked between separate source files using internal
if test "$gcc" -eq 1 && test "$visibility" -eq 1; then
echo >> configure.log
cat > $test.c <> configure.log
echo "Checking for attribute(visibility(internal)) support... Yes." | tee -a configure.log
else
echo >> configure.log
echo "Checking for attribute(visibility(internal)) support... No." | tee -a configure.log
fi
fi
# Check for attribute(aligned) support in compiler
cat > $test.c << EOF
int main(void) {
__attribute__((aligned(8))) int test = 0;
(void)test;
return 0;
}
EOF
if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then
echo "Checking for attribute(aligned) ... Yes." | tee -a configure.log
CFLAGS="$CFLAGS -DHAVE_ATTRIBUTE_ALIGNED"
SFLAGS="$SFLAGS -DHAVE_ATTRIBUTE_ALIGNED"
else
echo "Checking for attribute(aligned) ... No." | tee -a configure.log
fi
# Check for __builtin_ctz() support in compiler
cat > $test.c << EOF
long f(unsigned int x) { return __builtin_ctz(x); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then
echo "Checking for __builtin_ctz ... Yes." | tee -a configure.log
CFLAGS="$CFLAGS -DHAVE_BUILTIN_CTZ"
SFLAGS="$SFLAGS -DHAVE_BUILTIN_CTZ"
else
echo "Checking for __builtin_ctz ... No." | tee -a configure.log
fi
# Check for __builtin_ctzll() support in compiler
cat > $test.c << EOF
long f(unsigned long long x) { return __builtin_ctzll(x); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then
echo "Checking for __builtin_ctzll ... Yes." | tee -a configure.log
CFLAGS="$CFLAGS -DHAVE_BUILTIN_CTZLL"
SFLAGS="$SFLAGS -DHAVE_BUILTIN_CTZLL"
else
echo "Checking for __builtin_ctzll ... No." | tee -a configure.log
fi
check_avx2_intrinsics() {
# Check whether compiler supports AVX2 intrinsics
cat > $test.c << EOF
#include
__m256i f(__m256i x) {
const __m256i y = _mm256_set1_epi16(1);
return _mm256_subs_epu16(x, y);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${avx2flag} $test.c; then
echo "Checking for AVX2 intrinsics ... Yes." | tee -a configure.log
HAVE_AVX2_INTRIN=1
else
echo "Checking for AVX2 intrinsics ... No." | tee -a configure.log
HAVE_AVX2_INTRIN=0
fi
}
check_avx512_intrinsics() {
# Check whether compiler supports AVX512 intrinsics
cat > $test.c << EOF
#include
__m512i f(__m512i y) {
__m512i x = _mm512_set1_epi8(2);
return _mm512_sub_epi8(x, y);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${avx512flag} $test.c; then
echo "Checking for AVX512 intrinsics ... Yes." | tee -a configure.log
HAVE_AVX512_INTRIN=1
else
echo "Checking for AVX512 intrinsics ... No." | tee -a configure.log
HAVE_AVX512_INTRIN=0
fi
}
check_mtune_skylake_avx512_compiler_flag() {
# Check whether -mtune=skylake-avx512 works correctly
cat > $test.c << EOF
int main() { return 0; }
EOF
if try $CC -c $CFLAGS -mtune=skylake-avx512 $test.c; then
MTUNE_SKYLAKE_AVX512_AVAILABLE=1
echo "Check whether -mtune=skylake-avx512 works ... Yes." | tee -a configure.log
else
echo "Check whether -mtune=skylake-avx512 works ... No." | tee -a configure.log
MTUNE_SKYLAKE_AVX512_AVAILABLE=0
fi
}
check_mtune_cascadelake_compiler_flag() {
# Check whether -mtune=cascadelake works correctly
cat > $test.c << EOF
int main() { return 0; }
EOF
if try $CC -c $CFLAGS -mtune=cascadelake $test.c; then
MTUNE_CASCADELAKE_AVAILABLE=1
echo "Check whether -mtune=cascadelake works ... Yes." | tee -a configure.log
else
echo "Check whether -mtune=cascadelake works ... No." | tee -a configure.log
MTUNE_CASCADELAKE_AVAILABLE=0
check_mtune_skylake_avx512_compiler_flag
fi
}
check_avx512vnni_intrinsics() {
# Check whether compiler supports AVX512-VNNI intrinsics
cat > $test.c << EOF
#include
__m512i f(__m512i x, __m512i y) {
__m512i z = _mm512_setzero_epi32();
return _mm512_dpbusd_epi32(z, x, y);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${avx512vnniflag} $test.c; then
echo "Checking for AVX512VNNI intrinsics ... Yes." | tee -a configure.log
HAVE_AVX512VNNI_INTRIN=1
else
echo "Checking for AVX512VNNI intrinsics ... No." | tee -a configure.log
HAVE_AVX512VNNI_INTRIN=0
fi
}
check_mask_intrinsics() {
# Check whether compiler supports AVX512 k-mask intrinsics
cat > $test.c << EOF
#include
__mmask16 f(__mmask16 x) { return _knot_mask16(x); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${avx512flag} $test.c; then
echo "Checking for AVX512 k-mask intrinsics ... Yes." | tee -a configure.log
HAVE_MASK_INTRIN=1
else
echo "Checking for AVX512 k-mask intrinsics ... No." | tee -a configure.log
HAVE_MASK_INTRIN=0
fi
}
check_acle_compiler_flag() {
# Check whether -march=armv8-a+crc works correctly
cat > $test.c << EOF
int main() { return 0; }
EOF
if try $CC -c $CFLAGS -march=armv8-a+crc $test.c; then
ACLE_AVAILABLE=1
echo "Check whether -march=armv8-a+crc works ... Yes." | tee -a configure.log
acleflag="-march=armv8-a+crc"
else
echo "Check whether -march=armv8-a+crc works ... No." | tee -a configure.log
if try $CC -c $CFLAGS -march=armv8-a+crc+simd $test.c; then
ACLE_AVAILABLE=1
echo "Check whether -march=armv8-a+crc+simd works ... Yes." | tee -a configure.log
acleflag="-march=armv8-a+crc+simd"
else
ACLE_AVAILABLE=0
echo "Check whether -march=armv8-a+crc+simd works ... No." | tee -a configure.log
fi
fi
}
check_neon_compiler_flag() {
if test "$ARCH" = "aarch64"; then
neonflag="-march=armv8-a+simd"
else
neonflag="-mfpu=neon"
fi
# Check whether neon flag is available on ARM processors.
cat > $test.c << EOF
#if defined(_M_ARM64) || defined(_M_ARM64EC)
# include
#else
# include
#endif
int main() { return 0; }
EOF
if try $CC -c $CFLAGS $neonflag $test.c; then
NEON_AVAILABLE=1
echo "Check whether $neonflag is available ... Yes." | tee -a configure.log
else
NEON_AVAILABLE=0
echo "Check whether $neonflag is available ... No." | tee -a configure.log
fi
}
check_neon_ld4_intrinsics() {
cat > $test.c << EOF
#if defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC))
# include
#else
# include
#endif
int32x4x4_t f(int var[16]) { return vld1q_s32_x4(var); }
int main(void) { return 0; }
EOF
if try $CC -c $CFLAGS $neonflag $test.c; then
NEON_HAS_LD4=1
echo "check whether compiler supports 4 wide register loads ... Yes." | tee -a configure.log
else
NEON_HAS_LD4=0
echo "check whether compiler supports 4 wide register loads ... No." | tee -a configure.log
fi
}
check_armv6_intrinsics() {
# Check whether -march=armv6 works correctly
cat > $test.c << EOF
int main() { return 0; }
EOF
if try $CC -c $CFLAGS -march=armv6 $test.c; then
armv6flag=-march=armv6
echo "Check whether -march=armv6 works ... Yes." | tee -a configure.log
else
echo "Check whether -march=armv6 works ... No." | tee -a configure.log
fi
# Check whether compiler supports ARMv6 inline asm
cat > $test.c << EOF
unsigned int f(unsigned int a, unsigned int b) {
unsigned int c;
__asm__ __volatile__ ( "uqsub16 %0, %1, %2" : "=r" (c) : "r" (a), "r" (b) );
return c;
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${armv6flag} $test.c; then
echo "Checking for ARMv6 inline assembly ... Yes." | tee -a configure.log
HAVE_ARMV6_INLINE_ASM=1
else
echo "Checking for ARMv6 inline assembly ... No." | tee -a configure.log
HAVE_ARMV6_INLINE_ASM=0
fi
# Check whether compiler supports ARMv6 intrinsics
cat > $test.c << EOF
#include
unsigned int f(unsigned int a, unsigned int b) {
return __uqsub16(a, b);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${armv6flag} $test.c; then
echo "Checking for ARMv6 intrinsics ... Yes." | tee -a configure.log
HAVE_ARMV6_INTRIN=1
else
echo "Checking for ARMv6 intrinsics ... No." | tee -a configure.log
HAVE_ARMV6_INTRIN=0
fi
}
check_pclmulqdq_intrinsics() {
# Check whether compiler supports PCLMULQDQ intrinsics
cat > $test.c << EOF
#include
#include
__m128i f(__m128i a, __m128i b) { return _mm_clmulepi64_si128(a, b, 0x10); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${pclmulflag} $test.c; then
echo "Checking for PCLMULQDQ intrinsics ... Yes." | tee -a configure.log
HAVE_PCLMULQDQ_INTRIN=1
else
echo "Checking for PCLMULQDQ intrinsics ... No." | tee -a configure.log
HAVE_PCLMULQDQ_INTRIN=0
fi
}
check_vpclmulqdq_intrinsics() {
# Check whether compiler supports VPCLMULQDQ intrinsics
cat > $test.c << EOF
#include
#include
__m512i f(__m512i a) {
__m512i b = _mm512_setzero_si512();
return _mm512_clmulepi64_epi128(a, b, 0x10);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${vpclmulflag} $test.c; then
echo "Checking for VPCLMULQDQ intrinsics ... Yes." | tee -a configure.log
HAVE_VPCLMULQDQ_INTRIN=1
else
echo "Checking for VPCLMULQDQ intrinsics ... No." | tee -a configure.log
HAVE_VPCLMULQDQ_INTRIN=0
fi
}
check_xsave_intrinsics() {
# Check whether compiler supports XSAVE intrinsics
cat > $test.c << EOF
#ifdef _MSC_VER
# include
#else
# include
#endif
unsigned int f(unsigned int a) { return (int) _xgetbv(a); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${xsaveflag} $test.c; then
echo "Checking for XSAVE intrinsics ... Yes." | tee -a configure.log
HAVE_XSAVE_INTRIN=1
else
echo "Checking for XSAVE intrinsics ... No." | tee -a configure.log
HAVE_XSAVE_INTRIN=0
fi
}
check_ppc_intrinsics() {
cat > $test.c << EOF
#include
int main(void)
{
vector int a = vec_splats(0);
vector int b = vec_splats(0);
a = vec_add(a, b);
return 0;
}
EOF
if test $buildaltivec -eq 1 && try ${CC} ${CFLAGS} -maltivec $test.c; then
echo "Checking for AltiVec intrinsics ... Yes." | tee -a configure.log
HAVE_ALTIVEC_INTRIN=1
else
echo "Checking for AltiVec intrinsics ... No." | tee -a configure.log
HAVE_ALTIVEC_INTRIN=0
fi
if test $buildaltivec -eq 1 && try ${CC} ${CFLAGS} -maltivec -mno-vsx $test.c; then
echo "Checking if -mno-vsx is supported ... Yes." | tee -a configure.log
vmxflag="$vmxflag -mno-vsx"
else
echo "Checking if -mno-vsx is supported ... No." | tee -a configure.log
fi
cat > $test.c << EOF
#ifdef __FreeBSD__
#include
#endif
#include
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE_HAS_ALTIVEC);
#else
return (getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC);
#endif
}
EOF
if try $CC -c $CFLAGS -maltivec $test.c; then
HAVE_VMX=1
echo "Check whether VMX instructions are available ... Yes." | tee -a configure.log
else
HAVE_VMX=0
echo "Check whether VMX instructions are available ... No." | tee -a configure.log
fi
}
check_power8_intrinsics() {
# Check whether features needed by POWER8 optimisations are available
cat > $test.c << EOF
#ifdef __FreeBSD__
#include
#endif
#include
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP2, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE2_ARCH_2_07);
#else
return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_2_07);
#endif
}
EOF
if test $buildpower8 -eq 1 && try $CC -c $CFLAGS -mcpu=power8 $test.c; then
HAVE_POWER8_INTRIN=1
echo "Check whether POWER8 instructions are available ... Yes." | tee -a configure.log
else
HAVE_POWER8_INTRIN=0
echo "Check whether POWER8 instructions are available ... No." | tee -a configure.log
fi
}
check_power9_intrinsics() {
# Check whether features needed by POWER9 optimisations are available
cat > $test.c << EOF
#ifdef __FreeBSD__
#include
#endif
#include
int main() {
#ifdef __FreeBSD__
unsigned long hwcap;
elf_aux_info(AT_HWCAP2, &hwcap, sizeof(hwcap));
return (hwcap & PPC_FEATURE2_ARCH_3_00);
#else
return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_00);
#endif
}
EOF
if test $buildpower9 -eq 1 && try $CC -c $CFLAGS -mcpu=power9 $test.c; then
HAVE_POWER9_INTRIN=1
echo "Check whether POWER9 instructions are available ... Yes." | tee -a configure.log
else
HAVE_POWER9_INTRIN=0
echo "Check whether POWER9 instructions are available ... No." | tee -a configure.log
fi
}
check_sse2_intrinsics() {
# Check whether compiler supports SSE2 intrinsics
cat > $test.c << EOF
#include
__m128i f(__m128i x, __m128i y) { return _mm_sad_epu8(x, y); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${sse2flag} $test.c; then
echo "Checking for SSE2 intrinsics ... Yes." | tee -a configure.log
HAVE_SSE2_INTRIN=1
else
echo "Checking for SSE2 intrinsics ... No." | tee -a configure.log
HAVE_SSE2_INTRIN=0
fi
}
check_sse42_intrinsics() {
# Check whether compiler supports SSE4.2 intrinsics
cat > $test.c << EOF
#include
unsigned int f(unsigned int a, unsigned int b) { return _mm_crc32_u32(a, b); }
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${sse42flag} $test.c; then
echo "Checking for SSE4.2 intrinsics ... Yes." | tee -a configure.log
HAVE_SSE42_INTRIN=1
else
echo "Checking for SSE4.2 intrinsics ... No." | tee -a configure.log
HAVE_SSE42_INTRIN=0
fi
}
check_ssse3_intrinsics() {
# Check whether compiler supports SSSE3 intrinsics
cat > $test.c << EOF
#include
__m128i f(__m128i u) {
__m128i v = _mm_set1_epi32(1);
return _mm_hadd_epi32(u, v);
}
int main(void) { return 0; }
EOF
if try ${CC} ${CFLAGS} ${ssse3flag} $test.c; then
echo "Checking for SSSE3 intrinsics ... Yes." | tee -a configure.log
HAVE_SSSE3_INTRIN=1
else
echo "Checking for SSSE3 intrinsics ... No." | tee -a configure.log
HAVE_SSSE3_INTRIN=0
fi
}
check_vgfma_intrinsics() {
# Check whether "VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE" intrinsic is available
printf "Checking for -mzarch... " | tee -a configure.log
if try $CC -x c -c /dev/null -o /dev/null -mzarch; then
echo Yes. | tee -a configure.log
vgfmaflag="${vgfmaflag} -mzarch"
else
echo No. | tee -a configure.log
fi
printf "Checking for -fzvector... " | tee -a configure.log
if try $CC -x c -c /dev/null -o /dev/null -fzvector; then
echo Yes. | tee -a configure.log
vgfmaflag="${vgfmaflag} -fzvector"
else
echo No. | tee -a configure.log
fi
cat > $test.c << EOF
#include
int main(void) {
unsigned long long a __attribute__((vector_size(16))) = { 0 };
unsigned long long b __attribute__((vector_size(16))) = { 0 };
unsigned char c __attribute__((vector_size(16))) = { 0 };
c = vec_gfmsum_accum_128(a, b, c);
return c[0];
}
EOF
printf "Checking for VGFMA support... " | tee -a configure.log
if try $CC -c $CFLAGS $vgfmaflag $test.c; then
HAVE_VGFMA_INTRIN=1
echo "Yes." | tee -a configure.log
else
HAVE_VGFMA_INTRIN=0
echo "No." | tee -a configure.log
fi
}
# Check whether to disable deflate_medium and deflate_quick
if test $without_new_strategies -eq 1; then
CFLAGS="${CFLAGS} -DNO_QUICK_STRATEGY -DNO_MEDIUM_STRATEGY"
SFLAGS="${SFLAGS} -DNO_QUICK_STRATEGY -DNO_MEDIUM_STRATEGY"
fi
ARCHDIR='arch/generic'
ARCH_STATIC_OBJS=''
ARCH_SHARED_OBJS=''
# Set ARCH specific FLAGS
case "${ARCH}" in
# x86/amd64 specific optimizations
i386 | i486 | i586 | i686 |x86_64)
ARCHDIR=arch/x86
# Enable arch-specific optimizations
if test $without_optimizations -eq 0; then
CFLAGS="${CFLAGS} -DX86_FEATURES"
SFLAGS="${SFLAGS} -DX86_FEATURES"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} x86_features.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} x86_features.lo"
check_avx2_intrinsics
if test ${HAVE_AVX2_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_AVX2"
SFLAGS="${SFLAGS} -DX86_AVX2"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} slide_hash_avx2.o chunkset_avx2.o compare256_avx2.o adler32_avx2.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} slide_hash_avx2.lo chunkset_avx2.lo compare256_avx2.lo adler32_avx2.lo"
fi
check_avx512_intrinsics
if test ${HAVE_AVX512_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_AVX512"
SFLAGS="${SFLAGS} -DX86_AVX512"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_avx512.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_avx512.lo"
check_mask_intrinsics
if test ${HAVE_MASK_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_MASK_INTRIN"
SFLAGS="${SFLAGS} -DX86_MASK_INTRIN"
fi
fi
check_mtune_cascadelake_compiler_flag
if test ${MTUNE_CASCADELAKE_AVAILABLE} -eq 1; then
avx512flag="${avx512flag} -mtune=cascadelake"
avx512vnniflag="${avx512vnniflag} -mtune=cascadelake"
else
if test ${MTUNE_SKYLAKE_AVX512_AVAILABLE} -eq 1; then
avx512flag="${avx512flag} -mtune=skylake-avx512"
avx512vnniflag="${avx512vnniflag} -mtune=skylake-avx512"
fi
fi
check_avx512vnni_intrinsics
if test ${HAVE_AVX512VNNI_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_AVX512VNNI"
SFLAGS="${SFLAGS} -DX86_AVX512VNNI"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_avx512_vnni.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_avx512_vnni.lo"
fi
check_sse42_intrinsics
if test ${HAVE_SSE42_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_SSE42"
SFLAGS="${SFLAGS} -DX86_SSE42"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_sse42.o insert_string_sse42.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_sse42.lo insert_string_sse42.lo"
fi
check_sse2_intrinsics
if test ${HAVE_SSE2_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_SSE2"
SFLAGS="${SFLAGS} -DX86_SSE2"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} chunkset_sse2.o compare256_sse2.o slide_hash_sse2.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} chunkset_sse2.lo compare256_sse2.lo slide_hash_sse2.lo"
if test $forcesse2 -eq 1; then
CFLAGS="${CFLAGS} -DX86_NOCHECK_SSE2"
SFLAGS="${SFLAGS} -DX86_NOCHECK_SSE2"
fi
fi
check_ssse3_intrinsics
if test ${HAVE_SSSE3_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_SSSE3"
SFLAGS="${SFLAGS} -DX86_SSSE3"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_ssse3.o chunkset_ssse3.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_ssse3.lo chunkset_ssse3.lo"
fi
check_pclmulqdq_intrinsics
if test ${HAVE_PCLMULQDQ_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_PCLMULQDQ_CRC"
SFLAGS="${SFLAGS} -DX86_PCLMULQDQ_CRC"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_pclmulqdq.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_pclmulqdq.lo"
if test $buildvpclmulqdq -eq 1; then
check_vpclmulqdq_intrinsics
if test ${HAVE_VPCLMULQDQ_INTRIN} -eq 1 && test ${HAVE_AVX512_INTRIN} -eq 1; then
CFLAGS="${CFLAGS} -DX86_VPCLMULQDQ_CRC"
SFLAGS="${SFLAGS} -DX86_VPCLMULQDQ_CRC"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_vpclmulqdq.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_vpclmulqdq.lo"
fi
fi
fi
check_xsave_intrinsics
if test ${HAVE_XSAVE_INTRIN} -eq 0; then
xsaveflag=""
fi
fi
;;
# ARM specific optimizations
arm* | aarch64)
case "${ARCH}" in
arm*)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=arm
;;
aarch64)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=aarch64
buildarmv6=0
;;
esac
ARCHDIR=arch/arm
cat > $test.c << EOF
int main() { return 0; }
EOF
if try $CC -w -c $SFLAGS $test.c -mfloat-abi=softfp &&
try $LDSHARED $LDSHAREDFLAGS $LDFLAGS -o $test$shared_ext $test.o $LDSHAREDLIBC; then
floatabi="-mfloat-abi=softfp"
else
if try $CC -w -c $SFLAGS $test.c -mfloat-abi=hard &&
try $LDSHARED $LDSHAREDFLAGS $LDFLAGS -o $test$shared_ext $test.o $LDSHAREDLIBC; then
floatabi="-mfloat-abi=hard"
fi
fi
if [ -z $floatabi ]; then
echo "ARM floating point arch not auto-detected" | tee -a configure.log
else
echo "ARM floating point arch: ${floatabi}" | tee -a configure.log
CFLAGS="${CFLAGS} ${floatabi}"
SFLAGS="${SFLAGS} ${floatabi}"
fi
if test $without_optimizations -eq 0; then
CFLAGS="${CFLAGS} -DARM_FEATURES"
SFLAGS="${SFLAGS} -DARM_FEATURES"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} arm_features.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} arm_features.lo"
cat > $test.c <
EOF
if try $CC -c $CFLAGS $test.c; then
echo "Checking for arm_acle.h... Yes." | tee -a configure.log
CFLAGS="${CFLAGS} -DHAVE_ARM_ACLE_H"
SFLAGS="${SFLAGS} -DHAVE_ARM_ACLE_H"
else
echo "Checking for arm_acle.h... No." | tee -a configure.log
fi
if test $LINUX -eq 1; then
if test "$ARCH" = "aarch64"; then
cat > $test.c <
int main() {
return (getauxval(AT_HWCAP) & HWCAP_CRC32);
}
EOF
if try $CC -c $CFLAGS $test.c; then
CFLAGS="${CFLAGS} -DARM_AUXV_HAS_CRC32"
SFLAGS="${SFLAGS} -DARM_AUXV_HAS_CRC32"
else
echo "HWCAP_CRC32 not present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
fi
else
cat > $test.c <
int main() {
return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
}
EOF
if try $CC -c $CFLAGS $test.c; then
CFLAGS="${CFLAGS} -DARM_AUXV_HAS_CRC32"
SFLAGS="${SFLAGS} -DARM_AUXV_HAS_CRC32"
else
cat > $test.c <
#include
int main() {
return (getauxval(AT_HWCAP2) & HWCAP2_CRC32);
}
EOF
if try $CC -c $CFLAGS $test.c; then
CFLAGS="${CFLAGS} -DARM_AUXV_HAS_CRC32 -DARM_ASM_HWCAP"
SFLAGS="${SFLAGS} -DARM_AUXV_HAS_CRC32 -DARM_ASM_HWCAP"
else
echo "HWCAP2_CRC32 not present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
fi
fi
cat > $test.c <
int main() {
return (getauxval(AT_HWCAP) & HWCAP_ARM_NEON);
}
EOF
if try $CC -c $CFLAGS $test.c; then
CFLAGS="${CFLAGS} -DARM_AUXV_HAS_NEON"
SFLAGS="${SFLAGS} -DARM_AUXV_HAS_NEON"
else
cat > $test.c <
int main() {
return (getauxval(AT_HWCAP) & HWCAP_NEON);
}
EOF
if try $CC -c $CFLAGS $test.c; then
CFLAGS="${CFLAGS} -DARM_AUXV_HAS_NEON"
SFLAGS="${SFLAGS} -DARM_AUXV_HAS_NEON"
else
echo "Neither HWCAP_ARM_NEON or HWCAP_NEON present in sys/auxv.h; cannot detect support at runtime." | tee -a configure.log
fi
fi
fi
fi
if test $buildacle -eq 1; then
check_acle_compiler_flag
if test $ACLE_AVAILABLE -eq 1; then
CFLAGS="${CFLAGS} -DARM_ACLE"
SFLAGS="${SFLAGS} -DARM_ACLE"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_acle.o insert_string_acle.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_acle.lo insert_string_acle.lo"
fi
fi
if test $buildneon -eq 1; then
check_neon_compiler_flag
if test $NEON_AVAILABLE -eq 1; then
CFLAGS="${CFLAGS} -DARM_NEON"
SFLAGS="${SFLAGS} -DARM_NEON"
check_neon_ld4_intrinsics
if test $NEON_HAS_LD4 -eq 1; then
CFLAGS="${CFLAGS} -DARM_NEON_HASLD4"
SFLAGS="${SFLAGS} -DARM_NEON_HASLD4"
fi
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_neon.o chunkset_neon.o compare256_neon.o slide_hash_neon.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_neon.lo chunkset_neon.lo compare256_neon.lo slide_hash_neon.lo"
fi
fi
if test $buildarmv6 -eq 1; then
check_armv6_intrinsics
if test $HAVE_ARMV6_INTRIN -eq 1 || test $HAVE_ARMV6_INLINE_ASM -eq 1; then
CFLAGS="${CFLAGS} -DARM_SIMD"
SFLAGS="${SFLAGS} -DARM_SIMD"
if test $HAVE_ARMV6_INTRIN -eq 1; then
CFLAGS="${CFLAGS} -DARM_SIMD_INTRIN"
SFLAGS="${SFLAGS} -DARM_SIMD_INTRIN"
fi
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} slide_hash_armv6.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} slide_hash_armv6.lo"
fi
fi
fi
;;
powerpc*)
case "${ARCH}" in
powerpc)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc
;;
powerpc64)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc64
;;
powerpc64le)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=ppc64le
;;
esac
ARCHDIR=arch/power
if test $without_optimizations -eq 0; then
check_ppc_intrinsics
check_power8_intrinsics
check_power9_intrinsics
if test $HAVE_VMX -eq 1; then
CFLAGS="${CFLAGS} -DPPC_FEATURES"
SFLAGS="${SFLAGS} -DPPC_FEATURES"
fi
if test $HAVE_VMX -eq 1 -o $HAVE_POWER8_INTRIN -eq 1; then
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} power_features.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} power_features.lo"
fi
if test $HAVE_VMX -eq 1 -a $HAVE_ALTIVEC_INTRIN -eq 1; then
CFLAGS="${CFLAGS} -DPPC_VMX"
SFLAGS="${SFLAGS} -DPPC_VMX"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_vmx.o slide_hash_vmx.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_vmx.lo slide_hash_vmx.lo"
fi
if test $HAVE_POWER8_INTRIN -eq 1; then
CFLAGS="${CFLAGS} -DPOWER8_VSX -DPOWER_FEATURES"
SFLAGS="${SFLAGS} -DPOWER8_VSX -DPOWER_FEATURES"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} adler32_power8.o chunkset_power8.o slide_hash_power8.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} adler32_power8.lo chunkset_power8.lo slide_hash_power8.lo"
case "${ARCH}" in
powerpc64*)
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32_power8.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_power8.lo"
CFLAGS="${CFLAGS} -DPOWER8_VSX_CRC32"
SFLAGS="${SFLAGS} -DPOWER8_VSX_CRC32"
;;
esac
fi
if test $HAVE_POWER9_INTRIN -eq 1; then
CFLAGS="${CFLAGS} -DPOWER9 -DPOWER_FEATURES"
SFLAGS="${SFLAGS} -DPOWER9 -DPOWER_FEATURES"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} compare256_power9.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} compare256_power9.lo"
fi
fi
;;
s390x)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=s390x
ARCHDIR=arch/s390
if test $without_optimizations -eq 0; then
if test $buildcrc32vx -eq 1; then
CFLAGS="${CFLAGS} -DS390_FEATURES"
SFLAGS="${SFLAGS} -DS390_FEATURES"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} s390_features.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} s390_features.lo"
fi
if test $builddfltccdeflate -eq 1 -o $builddfltccinflate -eq 1; then
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_common.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_common.lo"
fi
if test $builddfltccdeflate -eq 1; then
CFLAGS="${CFLAGS} -DS390_DFLTCC_DEFLATE"
SFLAGS="${SFLAGS} -DS390_DFLTCC_DEFLATE"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_deflate.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_deflate.lo"
ARCH="${ARCH}+dfltcc-deflate"
fi
if test $builddfltccinflate -eq 1; then
CFLAGS="${CFLAGS} -DS390_DFLTCC_INFLATE"
SFLAGS="${SFLAGS} -DS390_DFLTCC_INFLATE"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} dfltcc_inflate.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} dfltcc_inflate.lo"
ARCH="${ARCH}+dfltcc-inflate"
fi
if test $buildcrc32vx -eq 1; then
check_vgfma_intrinsics
if test $HAVE_VGFMA_INTRIN -eq 1; then
CFLAGS="${CFLAGS} -DS390_CRC32_VX"
SFLAGS="${SFLAGS} -DS390_CRC32_VX"
ARCH_STATIC_OBJS="${ARCH_STATIC_OBJS} crc32-vx.o"
ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32-vx.lo"
ARCH="${ARCH}+crc32-vx"
fi
fi
fi
;;
*)
[ ! -z $CROSS_PREFIX ] && QEMU_ARCH=$ARCH
;;
esac
echo "Uname: $uname"
echo "ARCH: ${ARCH}"
echo "Using arch directory: ${ARCHDIR}"
echo "Architecture-specific static object files:${ARCH_STATIC_OBJS}"
echo "Architecture-specific shared object files:${ARCH_SHARED_OBJS}"
# show the results in the log
echo >> configure.log
echo ALL = $ALL >> configure.log
echo AR = $AR >> configure.log
echo ARFLAGS = $ARFLAGS >> configure.log
echo CC = $CC >> configure.log
echo CFLAGS = $CFLAGS >> configure.log
echo EXE = $EXE >> configure.log
echo LDCONFIG = $LDCONFIG >> configure.log
echo LDFLAGS = $LDFLAGS >> configure.log
echo LDSHARED = $LDSHARED >> configure.log
echo LDSHAREDFLAGS = $LDSHAREDFLAGS >> configure.log
echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log
echo DEFFILE = $DEFFILE >> configure.log
echo RC = $RC >> configure.log
echo RCFLAGS = $RCFLAGS >> configure.log
echo RCOBJS = $RCOBJS >> configure.log
echo STRIP = $STRIP >> configure.log
echo OBJC = $OBJC >> configure.log
echo TESTOBJG = $TESTOBJG >> configure.log
echo PIC_TESTOBJG = $PIC_TESTOBJG >> configure.log
echo PIC_OBJC = $PIC_OBJC >> configure.log
echo RANLIB = $RANLIB >> configure.log
echo SFLAGS = $SFLAGS >> configure.log
echo SHAREDLIB = $SHAREDLIB >> configure.log
echo SHAREDLIBM = $SHAREDLIBM >> configure.log
echo SHAREDLIBV = $SHAREDLIBV >> configure.log
echo SHAREDTARGET = $SHAREDTARGET >> configure.log
echo IMPORTLIB = $IMPORTLIB >> configure.log
echo INSTALLTARGETS = $INSTALLTARGETS >> configure.log
echo UNINSTALLTARGETS = $UNINSTALLTARGETS >> configure.log
echo SRCDIR = $SRCDIR >> configure.log
echo BUILDDIR = $BUILDDIR >> configure.log
echo STATICLIB = $STATICLIB >> configure.log
echo TEST = $TEST >> configure.log
echo VER = $VER >> configure.log
echo exec_prefix = $exec_prefix >> configure.log
echo includedir = $includedir >> configure.log
echo bindir = $bindir >> configure.log
echo libdir = $libdir >> configure.log
echo mandir = $mandir >> configure.log
echo prefix = $prefix >> configure.log
echo symbol_prefix = $symbol_prefix >> configure.log
echo sharedlibdir = $sharedlibdir >> configure.log
echo uname = $uname >> configure.log
echo sse2flag = $sse2flag >> configure.log
echo ssse3flag = $ssse3flag >> configure.log
echo sse42flag = $sse42flag >> configure.log
echo pclmulflag = $pclmulflag >> configure.log
echo vpclmulflag = $vpclmulflag >> configure.log
echo xsaveflag = $xsaveflag >> configure.log
echo acleflag = $acleflag >> configure.log
echo neonflag = $neonflag >> configure.log
echo armv6flag = $armv6flag >> configure.log
echo ARCHDIR = ${ARCHDIR} >> configure.log
echo ARCH_STATIC_OBJS = ${ARCH_STATIC_OBJS} >> configure.log
echo ARCH_SHARED_OBJS = ${ARCH_SHARED_OBJS} >> configure.log
# Handle sed incompatibilities when using -i
replace_in_file() {
if [ "$OS" = 'Darwin' ]; then
sed -i '.tmp' -e "$1" "$2"
else
sed -i'.tmp' -e "$1" "$2"
fi
}
# update Makefile with the configure results
INCLUDES="-I$SRCDIR"
if [ "$SRCDIR" != "$BUILDDIR" ]; then INCLUDES="-I$BUILDDIR ${INCLUDES}"; fi
sed < $SRCDIR/Makefile.in "
/^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s#=.*#=$CFLAGS#
/^SFLAGS *=/s#=.*#=$SFLAGS#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
/^LDSHARED *=/s#=.*#=$LDSHARED#
/^LDSHAREDFLAGS *=/s#=.*#=$LDSHAREDFLAGS#
/^LIBNAME1 *=/s#=.*#=$LIBNAME#
/^LIBNAME2 *=/s#=.*#=$LIBNAME2#
/^SUFFIX *=/s#=.*#=$SUFFIX#
/^STATICLIB *=/s#=.*#=$STATICLIB#
/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
/^SHAREDTARGET *=/s#=.*#=$SHAREDTARGET#
/^IMPORTLIB *=/s#=.*#=$IMPORTLIB#
/^VER *=/s#=.*#=$VER#
/^VER1 *=/s#=.*#=$VER1#
/^AR *=/s#=.*#=$AR#
/^ARFLAGS *=/s#=.*#=$ARFLAGS#
/^RANLIB *=/s#=.*#=$RANLIB#
/^LDCONFIG *=/s#=.*#=$LDCONFIG#
/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC#
/^DEFFILE *=/s#=.*#=$DEFFILE#
/^RC *=/s#=.*#=$RC#
/^RCFLAGS *=/s#=.*#=$RCFLAGS#
/^RCOBJS *=/s#=.*#=$RCOBJS#
/^STRIP *=/s#=.*#=$STRIP#
/^EXE *=/s#=.*#=$EXE#
/^prefix *=/s#=.*#= $prefix#
/^exec_prefix *=/s#=.*#= $exec_prefix#
/^bindir *=/s#=.*#= $bindir#
/^symbol_prefix *=/s#=.*#= $symbol_prefix#
/^libdir *=/s#=.*#= $libdir#
/^sharedlibdir *=/s#=.*#= $sharedlibdir#
/^includedir *=/s#=.*#= $includedir#
/^mandir *=/s#=.*#= $mandir#
/^SRCDIR *=/s#=.*#=$SRCDIR#
/^INCLUDES *=/s#=.*#=$INCLUDES#
/^OBJC *=/s#=.*#= $OBJC#
/^TESTOBJG *=/s#=.*#= $TESTOBJG#
/^PIC_TESTOBJG *=/s#=.*#= $PIC_TESTOBJG#
/^PIC_OBJC *=/s#=.*#= $PIC_OBJC#
/^all: */s#:.*#: $ALL#
/^install-libs: */s#:.*#: $INSTALLTARGETS#
/^uninstall-libs: */s#:.*#: $UNINSTALLTARGETS#
/^ARCHDIR *=/s#=.*#=$ARCHDIR#
/^ARCH_STATIC_OBJS *=/s#=.*#=$ARCH_STATIC_OBJS#
/^ARCH_SHARED_OBJS *=/s#=.*#=$ARCH_SHARED_OBJS#
" > Makefile
# Append header files dependencies.
for file in $SRCDIR/*.c $SRCDIR/test/*.c $SRCDIR/test/fuzz/*.c $SRCDIR/$ARCHDIR/*.c $SRCDIR/tools/*.c; do
if test ! -f $file; then
continue
fi
short_name=$(echo $file | sed -e "s#$SRCDIR/##g")
incs=$(grep -h include $file | sed -n 's/# *\include *"\(.*\.h\)".*/\1/p' | sort | uniq)
includes=$(for i in $incs; do
# Check that the include file exists in the current dir,
# otherwise it may be one of the system include header.
if test -e $SRCDIR/$i; then
printf " \$(SRCDIR)/$i"
fi
# We also need to check whether the include file is in the ARCHDIR.
if test -e $SRCDIR/$ARCHDIR/$i; then
printf " \$(SRCDIR)/$ARCHDIR/$i"
fi
done)
obj=$(basename $(echo $file | sed -e 's/\.c/\.o/g' -e 's#^\./##g'))
lobj=$(basename $(echo $file | sed -e 's/\.c/\.lo/g' -e 's#^\./##g'))
if grep -q "^$obj:" Makefile; then
# Replace the existing line with a line with all dependences.
$(replace_in_file "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" Makefile)
else
# Append at the end of Makefile a new line with the header dependences.
echo "$obj: \$(SRCDIR)/$short_name $includes" >> Makefile
# In case this is one of the ARCHDIR files, append a dependence line
# that will force the `$(MAKE) -C $(ARCHDIR)` generic rule. Without this
# we would only execute the copy rule from ARCHDIR to SRCDIR.
if test -e $SRCDIR/$ARCHDIR/$(basename $file); then
echo "$ARCHDIR/$obj: \$(SRCDIR)/$short_name $includes" >> Makefile
fi
fi
if grep -q "^$lobj:" Makefile; then
# Replace the existing line with a line with all dependences.
$(replace_in_file "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" Makefile)
else
# Append at the end of Makefile a new line with the header dependences.
echo "$lobj: \$(SRCDIR)/$short_name $includes" >> Makefile
fi
done
# Generate Makefile in arch dir
mkdir -p $ARCHDIR
ARCHINCLUDES="-I$SRCDIR/$ARCHDIR -I$SRCDIR"
if [ "$SRCDIR" != "$BUILDDIR" ]; then ARCHINCLUDES="-I$BUILDDIR ${ARCHINCLUDES}"; fi
sed < $SRCDIR/$ARCHDIR/Makefile.in "
/^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s#=.*#=$CFLAGS#
/^SFLAGS *=/s#=.*#=$SFLAGS#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
/^INCLUDES *=/s#=.*#=$ARCHINCLUDES#
/^SUFFIX *=/s#=.*#=$SUFFIX#
/^SRCDIR *=/s#=.*#=$SRCDIR/$ARCHDIR#
/^SRCTOP *=/s#=.*#=$SRCDIR#
/^BUILDDIR *=/s#=.*#=$BUILDDIR#
/^AVX2FLAG *=/s#=.*#=$avx2flag#
/^AVX512FLAG *=/s#=.*#=$avx512flag#
/^AVX512VNNIFLAG *=/s#=.*#=$avx512vnniflag#
/^SSE2FLAG *=/s#=.*#=$sse2flag#
/^SSSE3FLAG *=/s#=.*#=$ssse3flag#
/^SSE42FLAG *=/s#=.*#=$sse42flag#
/^PCLMULFLAG *=/s#=.*#=$pclmulflag#
/^VPCLMULFLAG *=/s#=.*#=$vpclmulflag#
/^XSAVEFLAG *=/s#=.*#=$xsaveflag#
/^ACLEFLAG *=/s#=.*#=$acleflag#
/^NEONFLAG *=/s#=.*#=$neonflag#
/^ARMV6FLAG *=/s#=.*#=$armv6flag#
/^NOLTOFLAG *=/s#=.*#=$noltoflag#
/^VGFMAFLAG *=/s#=.*#=$vgfmaflag#
/^PPCFLAGS *=/s#=.*#=$vmxflag#
" > $ARCHDIR/Makefile
# Append header files dependencies.
for file in $SRCDIR/$ARCHDIR/*.c; do
if test ! -f $file; then
continue
fi
incs=$(grep -h include $file | sed -n 's/# *\include *"\(.*\.h\)".*/\1/p' | sort | uniq)
includes=$(for i in $incs; do
# Check that the include file exists in the current dir,
# otherwise it may be one of the system include header.
if test -e $SRCDIR/$i; then
printf " \$(SRCTOP)/$i"
fi
# We also need to check whether the include file is in the ARCHDIR.
if test -e $SRCDIR/$ARCHDIR/$i; then
printf " \$(SRCDIR)/$i"
fi
done)
obj=$(basename $(echo $file | sed -e 's/\.c/\.o/g' -e 's#^\./##g'))
lobj=$(basename $(echo $file | sed -e 's/\.c/\.lo/g' -e 's#^\./##g'))
short_name=$(basename $file)
if grep -q "^$obj:" $ARCHDIR/Makefile; then
# Replace the existing line with a line with all dependences.
$(replace_in_file "s#$obj:.*#$obj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile)
else
# Append at the end of Makefile a new line with the header dependences.
echo "$obj: \$(SRCDIR)/$short_name $includes" >> $ARCHDIR/Makefile
fi
if grep -q "^$lobj:" $ARCHDIR/Makefile; then
# Replace the existing line with a line with all dependences.
$(replace_in_file "s#$lobj:.*#$lobj: \$(SRCDIR)/$short_name $includes#g" $ARCHDIR/Makefile)
else
# Append at the end of Makefile a new line with the header dependences.
echo "$lobj: \$(SRCDIR)/$short_name $includes" >> $ARCHDIR/Makefile
fi
done
# Emscripten does not support large amounts of data via stdin/out
# https://github.com/emscripten-core/emscripten/issues/16755#issuecomment-1102732849
if test "$CHOST" != "wasm32"; then
TEST="${TEST} ghtests"
fi
# Determine emulator to use when running tests
if test -z "$EMU_RUN" && test $QEMU_ARCH; then
EMU_RUN="qemu-$QEMU_ARCH -L /usr/${CHOST}/"
fi
if test -n "$EMU_RUN"; then
echo "Using cross-compile emulator: $EMU_RUN"
fi
if test $gzfileops -eq 1; then
PC_CFLAGS="-DWITH_GZFILEOP"
fi
# Generate Makefile in test dir
mkdir -p test
sed < $SRCDIR/test/Makefile.in "
/^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s#=.*#=$CFLAGS#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
/^EXE *=/s#=.*#=$EXE#
/^alltests: */s#:.*#: $TEST#
/^SRCDIR *=/s#=.*#=$SRCDIR/test#
/^SRCTOP *=/s#=.*#=$SRCDIR#
/^EMU_RUN *=/s#=.*#=$EMU_RUN#
/^LIBNAME *=/s#=.*#=$LIBNAME#
" > test/Makefile
# create zlib.pc with the configure results
sed < $SRCDIR/zlib.pc.in "
/^CC *=/s#=.*#=$CC#
/^CFLAGS *=/s#=.*#=$CFLAGS#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
/^LDSHARED *=/s#=.*#=$LDSHARED#
/^LDSHAREDFLAGS *=/s#=.*#=$LDSHAREDFLAGS#
/^STATICLIB *=/s#=.*#=$STATICLIB#
/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
/^IMPORTLIB *=/s#=.*#=$IMPORTLIB#
/^AR *=/s#=.*#=$AR#
/^ARFLAGS *=/s#=.*#=$ARFLAGS#
/^RANLIB *=/s#=.*#=$RANLIB#
/^EXE *=/s#=.*#=$EXE#
/^prefix *=/s#=.*#=$prefix#
/^exec_prefix *=/s#=.*#=$exec_prefix#
/^bindir *=/s#=.*#=$bindir#
/^symbol_prefix *=/s#=.*#=$symbol_prefix#
/^libdir *=/s#=.*#=$libdir#
/^sharedlibdir *=/s#=.*#=$sharedlibdir#
/^includedir *=/s#=.*#=$includedir#
/^mandir *=/s#=.*#=$mandir#
/^LDFLAGS *=/s#=.*#=$LDFLAGS#
" | sed -e "
s/\@VERSION\@/$VER/g;
s/\@SUFFIX\@/$SUFFIX/g;
s/\@PKG_CONFIG_CFLAGS\@/$PC_CFLAGS/g;
" > ${LIBNAME2}.pc
# done
leave 0
3p-zlib-ng-main/zlib-ng/cpu_features.c 0000664 0000000 0000000 00000001357 14553115624 0020071 0 ustar 00root root 0000000 0000000 /* cpu_features.c -- CPU architecture feature check
* Copyright (C) 2017 Hans Kristian Rosbach
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "cpu_features.h"
#include
Z_INTERNAL void cpu_check_features(struct cpu_features *features) {
memset(features, 0, sizeof(struct cpu_features));
#if defined(X86_FEATURES)
x86_check_features(&features->x86);
#elif defined(ARM_FEATURES)
arm_check_features(&features->arm);
#elif defined(PPC_FEATURES) || defined(POWER_FEATURES)
power_check_features(&features->power);
#elif defined(S390_FEATURES)
s390_check_features(&features->s390);
#elif defined(RISCV_FEATURES)
riscv_check_features(&features->riscv);
#endif
}
3p-zlib-ng-main/zlib-ng/cpu_features.h 0000664 0000000 0000000 00000025443 14553115624 0020100 0 ustar 00root root 0000000 0000000 /* cpu_features.h -- CPU architecture feature check
* Copyright (C) 2017 Hans Kristian Rosbach
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef CPU_FEATURES_H_
#define CPU_FEATURES_H_
#include "adler32_fold.h"
#include "crc32_fold.h"
#if defined(X86_FEATURES)
# include "arch/x86/x86_features.h"
# include "fallback_builtins.h"
#elif defined(ARM_FEATURES)
# include "arch/arm/arm_features.h"
#elif defined(PPC_FEATURES) || defined(POWER_FEATURES)
# include "arch/power/power_features.h"
#elif defined(S390_FEATURES)
# include "arch/s390/s390_features.h"
#elif defined(RISCV_FEATURES)
# include "arch/riscv/riscv_features.h"
#endif
struct cpu_features {
#if defined(X86_FEATURES)
struct x86_cpu_features x86;
#elif defined(ARM_FEATURES)
struct arm_cpu_features arm;
#elif defined(PPC_FEATURES) || defined(POWER_FEATURES)
struct power_cpu_features power;
#elif defined(S390_FEATURES)
struct s390_cpu_features s390;
#elif defined(RISCV_FEATURES)
struct riscv_cpu_features riscv;
#else
char empty;
#endif
};
extern void cpu_check_features(struct cpu_features *features);
/* adler32 */
typedef uint32_t (*adler32_func)(uint32_t adler, const uint8_t *buf, size_t len);
extern uint32_t adler32_c(uint32_t adler, const uint8_t *buf, size_t len);
#ifdef ARM_NEON
extern uint32_t adler32_neon(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef PPC_VMX
extern uint32_t adler32_vmx(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef RISCV_RVV
extern uint32_t adler32_rvv(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef X86_SSSE3
extern uint32_t adler32_ssse3(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef X86_AVX2
extern uint32_t adler32_avx2(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef X86_AVX512
extern uint32_t adler32_avx512(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef X86_AVX512VNNI
extern uint32_t adler32_avx512_vnni(uint32_t adler, const uint8_t *buf, size_t len);
#endif
#ifdef POWER8_VSX
extern uint32_t adler32_power8(uint32_t adler, const uint8_t *buf, size_t len);
#endif
/* adler32 folding */
#ifdef RISCV_RVV
extern uint32_t adler32_fold_copy_rvv(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_SSE42
extern uint32_t adler32_fold_copy_sse42(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_AVX2
extern uint32_t adler32_fold_copy_avx2(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_AVX512
extern uint32_t adler32_fold_copy_avx512(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
#ifdef X86_AVX512VNNI
extern uint32_t adler32_fold_copy_avx512_vnni(uint32_t adler, uint8_t *dst, const uint8_t *src, size_t len);
#endif
/* CRC32 folding */
#ifdef X86_PCLMULQDQ_CRC
extern uint32_t crc32_fold_pclmulqdq_reset(crc32_fold *crc);
extern void crc32_fold_pclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
extern void crc32_fold_pclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
extern uint32_t crc32_fold_pclmulqdq_final(crc32_fold *crc);
extern uint32_t crc32_pclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len);
#endif
#if defined(X86_PCLMULQDQ_CRC) && defined(X86_VPCLMULQDQ_CRC)
extern uint32_t crc32_fold_vpclmulqdq_reset(crc32_fold *crc);
extern void crc32_fold_vpclmulqdq_copy(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
extern void crc32_fold_vpclmulqdq(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
extern uint32_t crc32_fold_vpclmulqdq_final(crc32_fold *crc);
extern uint32_t crc32_vpclmulqdq(uint32_t crc32, const uint8_t *buf, size_t len);
#endif
/* memory chunking */
extern uint32_t chunksize_c(void);
extern uint8_t* chunkmemset_safe_c(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#ifdef X86_SSE2
extern uint32_t chunksize_sse2(void);
extern uint8_t* chunkmemset_safe_sse2(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef X86_SSSE3
extern uint8_t* chunkmemset_safe_ssse3(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef X86_AVX2
extern uint32_t chunksize_avx2(void);
extern uint8_t* chunkmemset_safe_avx2(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef ARM_NEON
extern uint32_t chunksize_neon(void);
extern uint8_t* chunkmemset_safe_neon(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef POWER8_VSX
extern uint32_t chunksize_power8(void);
extern uint8_t* chunkmemset_safe_power8(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef RISCV_RVV
extern uint32_t chunksize_rvv(void);
extern uint8_t* chunkmemset_safe_rvv(uint8_t *out, unsigned dist, unsigned len, unsigned left);
#endif
#ifdef ZLIB_COMPAT
typedef struct z_stream_s z_stream;
#else
typedef struct zng_stream_s zng_stream;
#endif
/* inflate fast loop */
extern void inflate_fast_c(PREFIX3(stream) *strm, uint32_t start);
#ifdef X86_SSE2
extern void inflate_fast_sse2(PREFIX3(stream) *strm, uint32_t start);
#endif
#ifdef X86_SSSE3
extern void inflate_fast_ssse3(PREFIX3(stream) *strm, uint32_t start);
#endif
#ifdef X86_AVX2
extern void inflate_fast_avx2(PREFIX3(stream) *strm, uint32_t start);
#endif
#ifdef ARM_NEON
extern void inflate_fast_neon(PREFIX3(stream) *strm, uint32_t start);
#endif
#ifdef POWER8_VSX
extern void inflate_fast_power8(PREFIX3(stream) *strm, uint32_t start);
#endif
#ifdef RISCV_RVV
extern void inflate_fast_rvv(PREFIX3(stream) *strm, uint32_t start);
#endif
/* CRC32 */
typedef uint32_t (*crc32_func)(uint32_t crc32, const uint8_t *buf, size_t len);
extern uint32_t PREFIX(crc32_braid)(uint32_t crc, const uint8_t *buf, size_t len);
#ifdef ARM_ACLE
extern uint32_t crc32_acle(uint32_t crc, const uint8_t *buf, size_t len);
#elif defined(POWER8_VSX)
extern uint32_t crc32_power8(uint32_t crc, const uint8_t *buf, size_t len);
#elif defined(S390_CRC32_VX)
extern uint32_t crc32_s390_vx(uint32_t crc, const uint8_t *buf, size_t len);
#endif
/* compare256 */
typedef uint32_t (*compare256_func)(const uint8_t *src0, const uint8_t *src1);
extern uint32_t compare256_c(const uint8_t *src0, const uint8_t *src1);
#if defined(UNALIGNED_OK) && BYTE_ORDER == LITTLE_ENDIAN
extern uint32_t compare256_unaligned_16(const uint8_t *src0, const uint8_t *src1);
#ifdef HAVE_BUILTIN_CTZ
extern uint32_t compare256_unaligned_32(const uint8_t *src0, const uint8_t *src1);
#endif
#if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL)
extern uint32_t compare256_unaligned_64(const uint8_t *src0, const uint8_t *src1);
#endif
#endif
#if defined(X86_SSE2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t compare256_sse2(const uint8_t *src0, const uint8_t *src1);
#endif
#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t compare256_avx2(const uint8_t *src0, const uint8_t *src1);
#endif
#if defined(ARM_NEON) && defined(HAVE_BUILTIN_CTZLL)
extern uint32_t compare256_neon(const uint8_t *src0, const uint8_t *src1);
#endif
#ifdef POWER9
extern uint32_t compare256_power9(const uint8_t *src0, const uint8_t *src1);
#endif
#ifdef RISCV_RVV
extern uint32_t compare256_rvv(const uint8_t *src0, const uint8_t *src1);
#endif
#ifdef DEFLATE_H_
/* insert_string */
extern void insert_string_c(deflate_state *const s, const uint32_t str, uint32_t count);
#ifdef X86_SSE42
extern void insert_string_sse42(deflate_state *const s, const uint32_t str, uint32_t count);
#elif defined(ARM_ACLE)
extern void insert_string_acle(deflate_state *const s, const uint32_t str, uint32_t count);
#endif
/* longest_match */
extern uint32_t longest_match_c(deflate_state *const s, Pos cur_match);
#if defined(UNALIGNED_OK) && BYTE_ORDER == LITTLE_ENDIAN
extern uint32_t longest_match_unaligned_16(deflate_state *const s, Pos cur_match);
#ifdef HAVE_BUILTIN_CTZ
extern uint32_t longest_match_unaligned_32(deflate_state *const s, Pos cur_match);
#endif
#if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL)
extern uint32_t longest_match_unaligned_64(deflate_state *const s, Pos cur_match);
#endif
#endif
#if defined(X86_SSE2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t longest_match_sse2(deflate_state *const s, Pos cur_match);
#endif
#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t longest_match_avx2(deflate_state *const s, Pos cur_match);
#endif
#if defined(ARM_NEON) && defined(HAVE_BUILTIN_CTZLL)
extern uint32_t longest_match_neon(deflate_state *const s, Pos cur_match);
#endif
#ifdef POWER9
extern uint32_t longest_match_power9(deflate_state *const s, Pos cur_match);
#endif
#ifdef RISCV_RVV
extern uint32_t longest_match_rvv(deflate_state *const s, Pos cur_match);
#endif
/* longest_match_slow */
extern uint32_t longest_match_slow_c(deflate_state *const s, Pos cur_match);
#if defined(UNALIGNED_OK) && BYTE_ORDER == LITTLE_ENDIAN
extern uint32_t longest_match_slow_unaligned_16(deflate_state *const s, Pos cur_match);
extern uint32_t longest_match_slow_unaligned_32(deflate_state *const s, Pos cur_match);
#ifdef UNALIGNED64_OK
extern uint32_t longest_match_slow_unaligned_64(deflate_state *const s, Pos cur_match);
#endif
#endif
#if defined(X86_SSE2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t longest_match_slow_sse2(deflate_state *const s, Pos cur_match);
#endif
#if defined(X86_AVX2) && defined(HAVE_BUILTIN_CTZ)
extern uint32_t longest_match_slow_avx2(deflate_state *const s, Pos cur_match);
#endif
#if defined(ARM_NEON) && defined(HAVE_BUILTIN_CTZLL)
extern uint32_t longest_match_slow_neon(deflate_state *const s, Pos cur_match);
#endif
#ifdef POWER9
extern uint32_t longest_match_slow_power9(deflate_state *const s, Pos cur_match);
#endif
#ifdef RISCV_RVV
extern uint32_t longest_match_slow_rvv(deflate_state *const s, Pos cur_match);
#endif
/* quick_insert_string */
extern Pos quick_insert_string_c(deflate_state *const s, const uint32_t str);
#ifdef X86_SSE42
extern Pos quick_insert_string_sse42(deflate_state *const s, const uint32_t str);
#elif defined(ARM_ACLE)
extern Pos quick_insert_string_acle(deflate_state *const s, const uint32_t str);
#endif
/* slide_hash */
typedef void (*slide_hash_func)(deflate_state *s);
#ifdef X86_SSE2
extern void slide_hash_sse2(deflate_state *s);
#endif
#if defined(ARM_SIMD)
extern void slide_hash_armv6(deflate_state *s);
#endif
#if defined(ARM_NEON)
extern void slide_hash_neon(deflate_state *s);
#endif
#if defined(PPC_VMX)
extern void slide_hash_vmx(deflate_state *s);
#endif
#if defined(POWER8_VSX)
extern void slide_hash_power8(deflate_state *s);
#endif
#if defined(RISCV_RVV)
extern void slide_hash_rvv(deflate_state *s);
#endif
#ifdef X86_AVX2
extern void slide_hash_avx2(deflate_state *s);
#endif
/* update_hash */
extern uint32_t update_hash_c(deflate_state *const s, uint32_t h, uint32_t val);
#ifdef X86_SSE42
extern uint32_t update_hash_sse42(deflate_state *const s, uint32_t h, uint32_t val);
#elif defined(ARM_ACLE)
extern uint32_t update_hash_acle(deflate_state *const s, uint32_t h, uint32_t val);
#endif
#endif
#endif
3p-zlib-ng-main/zlib-ng/crc32_braid.c 0000664 0000000 0000000 00000017251 14553115624 0017461 0 ustar 00root root 0000000 0000000 /* crc32_braid.c -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* This interleaved implementation of a CRC makes use of pipelined multiple
* arithmetic-logic units, commonly found in modern CPU cores. It is due to
* Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution.
*/
#include "zbuild.h"
#include "zutil.h"
#include "functable.h"
#include "crc32_braid_p.h"
#include "crc32_braid_tbl.h"
/* ========================================================================= */
const uint32_t * Z_EXPORT PREFIX(get_crc_table)(void) {
return (const uint32_t *)crc_table;
}
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(crc32_z)(unsigned long crc, const unsigned char *buf, size_t len) {
if (buf == NULL) return 0;
return (unsigned long)functable.crc32((uint32_t)crc, buf, len);
}
#else
uint32_t Z_EXPORT PREFIX(crc32_z)(uint32_t crc, const unsigned char *buf, size_t len) {
if (buf == NULL) return 0;
return functable.crc32(crc, buf, len);
}
#endif
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(crc32)(unsigned long crc, const unsigned char *buf, unsigned int len) {
return (unsigned long)PREFIX(crc32_z)((uint32_t)crc, buf, len);
}
#else
uint32_t Z_EXPORT PREFIX(crc32)(uint32_t crc, const unsigned char *buf, uint32_t len) {
return PREFIX(crc32_z)(crc, buf, len);
}
#endif
/* ========================================================================= */
/*
A CRC of a message is computed on N braids of words in the message, where
each word consists of W bytes (4 or 8). If N is 3, for example, then three
running sparse CRCs are calculated respectively on each braid, at these
indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ...
This is done starting at a word boundary, and continues until as many blocks
of N * W bytes as are available have been processed. The results are combined
into a single CRC at the end. For this code, N must be in the range 1..6 and
W must be 4 or 8. The upper limit on N can be increased if desired by adding
more #if blocks, extending the patterns apparent in the code. In addition,
crc32 tables would need to be regenerated, if the maximum N value is increased.
N and W are chosen empirically by benchmarking the execution time on a given
processor. The choices for N and W below were based on testing on Intel Kaby
Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64
Octeon II processors. The Intel, AMD, and ARM processors were all fastest
with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4.
They were all tested with either gcc or clang, all using the -O3 optimization
level. Your mileage may vary.
*/
/* ========================================================================= */
#if BYTE_ORDER == LITTLE_ENDIAN
# define ZSWAPWORD(word) (word)
# define BRAID_TABLE crc_braid_table
#elif BYTE_ORDER == BIG_ENDIAN
# if W == 8
# define ZSWAPWORD(word) ZSWAP64(word)
# elif W == 4
# define ZSWAPWORD(word) ZSWAP32(word)
# endif
# define BRAID_TABLE crc_braid_big_table
#else
# error "No endian defined"
#endif
#define DO1 c = crc_table[(c ^ *buf++) & 0xff] ^ (c >> 8)
#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
/* ========================================================================= */
#ifdef W
/*
Return the CRC of the W bytes in the word_t data, taking the
least-significant byte of the word as the first byte of data, without any pre
or post conditioning. This is used to combine the CRCs of each braid.
*/
#if BYTE_ORDER == LITTLE_ENDIAN
static uint32_t crc_word(z_word_t data) {
int k;
for (k = 0; k < W; k++)
data = (data >> 8) ^ crc_table[data & 0xff];
return (uint32_t)data;
}
#elif BYTE_ORDER == BIG_ENDIAN
static z_word_t crc_word(z_word_t data) {
int k;
for (k = 0; k < W; k++)
data = (data << 8) ^
crc_big_table[(data >> ((W - 1) << 3)) & 0xff];
return data;
}
#endif /* BYTE_ORDER */
#endif /* W */
/* ========================================================================= */
Z_INTERNAL uint32_t PREFIX(crc32_braid)(uint32_t crc, const uint8_t *buf, size_t len) {
Z_REGISTER uint32_t c;
/* Pre-condition the CRC */
c = (~crc) & 0xffffffff;
#ifdef W
/* If provided enough bytes, do a braided CRC calculation. */
if (len >= N * W + W - 1) {
size_t blks;
z_word_t const *words;
int k;
/* Compute the CRC up to a z_word_t boundary. */
while (len && ((uintptr_t)buf & (W - 1)) != 0) {
len--;
DO1;
}
/* Compute the CRC on as many N z_word_t blocks as are available. */
blks = len / (N * W);
len -= blks * N * W;
words = (z_word_t const *)buf;
z_word_t crc0, word0, comb;
#if N > 1
z_word_t crc1, word1;
#if N > 2
z_word_t crc2, word2;
#if N > 3
z_word_t crc3, word3;
#if N > 4
z_word_t crc4, word4;
#if N > 5
z_word_t crc5, word5;
#endif
#endif
#endif
#endif
#endif
/* Initialize the CRC for each braid. */
crc0 = ZSWAPWORD(c);
#if N > 1
crc1 = 0;
#if N > 2
crc2 = 0;
#if N > 3
crc3 = 0;
#if N > 4
crc4 = 0;
#if N > 5
crc5 = 0;
#endif
#endif
#endif
#endif
#endif
/* Process the first blks-1 blocks, computing the CRCs on each braid independently. */
while (--blks) {
/* Load the word for each braid into registers. */
word0 = crc0 ^ words[0];
#if N > 1
word1 = crc1 ^ words[1];
#if N > 2
word2 = crc2 ^ words[2];
#if N > 3
word3 = crc3 ^ words[3];
#if N > 4
word4 = crc4 ^ words[4];
#if N > 5
word5 = crc5 ^ words[5];
#endif
#endif
#endif
#endif
#endif
words += N;
/* Compute and update the CRC for each word. The loop should get unrolled. */
crc0 = BRAID_TABLE[0][word0 & 0xff];
#if N > 1
crc1 = BRAID_TABLE[0][word1 & 0xff];
#if N > 2
crc2 = BRAID_TABLE[0][word2 & 0xff];
#if N > 3
crc3 = BRAID_TABLE[0][word3 & 0xff];
#if N > 4
crc4 = BRAID_TABLE[0][word4 & 0xff];
#if N > 5
crc5 = BRAID_TABLE[0][word5 & 0xff];
#endif
#endif
#endif
#endif
#endif
for (k = 1; k < W; k++) {
crc0 ^= BRAID_TABLE[k][(word0 >> (k << 3)) & 0xff];
#if N > 1
crc1 ^= BRAID_TABLE[k][(word1 >> (k << 3)) & 0xff];
#if N > 2
crc2 ^= BRAID_TABLE[k][(word2 >> (k << 3)) & 0xff];
#if N > 3
crc3 ^= BRAID_TABLE[k][(word3 >> (k << 3)) & 0xff];
#if N > 4
crc4 ^= BRAID_TABLE[k][(word4 >> (k << 3)) & 0xff];
#if N > 5
crc5 ^= BRAID_TABLE[k][(word5 >> (k << 3)) & 0xff];
#endif
#endif
#endif
#endif
#endif
}
}
/* Process the last block, combining the CRCs of the N braids at the same time. */
comb = crc_word(crc0 ^ words[0]);
#if N > 1
comb = crc_word(crc1 ^ words[1] ^ comb);
#if N > 2
comb = crc_word(crc2 ^ words[2] ^ comb);
#if N > 3
comb = crc_word(crc3 ^ words[3] ^ comb);
#if N > 4
comb = crc_word(crc4 ^ words[4] ^ comb);
#if N > 5
comb = crc_word(crc5 ^ words[5] ^ comb);
#endif
#endif
#endif
#endif
#endif
words += N;
c = ZSWAPWORD(comb);
/* Update the pointer to the remaining bytes to process. */
buf = (const unsigned char *)words;
}
#endif /* W */
/* Complete the computation of the CRC on any remaining bytes. */
while (len >= 8) {
len -= 8;
DO8;
}
while (len) {
len--;
DO1;
}
/* Return the CRC, post-conditioned. */
return c ^ 0xffffffff;
}
3p-zlib-ng-main/zlib-ng/crc32_braid_comb.c 0000664 0000000 0000000 00000004422 14553115624 0020455 0 ustar 00root root 0000000 0000000 /* crc32_braid_comb.c -- compute the CRC-32 of a data stream
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* This interleaved implementation of a CRC makes use of pipelined multiple
* arithmetic-logic units, commonly found in modern CPU cores. It is due to
* Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution.
*/
#include "zbuild.h"
#include "zutil.h"
#include "crc32_braid_p.h"
#include "crc32_braid_tbl.h"
#include "crc32_braid_comb_p.h"
/* ========================================================================= */
static uint32_t crc32_combine_(uint32_t crc1, uint32_t crc2, z_off64_t len2) {
return multmodp(x2nmodp(len2, 3), crc1) ^ crc2;
}
static uint32_t crc32_combine_gen_(z_off64_t len2) {
return x2nmodp(len2, 3);
}
static uint32_t crc32_combine_op_(uint32_t crc1, uint32_t crc2, const uint32_t op) {
return multmodp(op, crc1) ^ crc2;
}
/* ========================================================================= */
#ifdef ZLIB_COMPAT
unsigned long Z_EXPORT PREFIX(crc32_combine)(unsigned long crc1, unsigned long crc2, z_off_t len2) {
return (unsigned long)crc32_combine_((uint32_t)crc1, (uint32_t)crc2, len2);
}
unsigned long Z_EXPORT PREFIX4(crc32_combine)(unsigned long crc1, unsigned long crc2, z_off64_t len2) {
return (unsigned long)crc32_combine_((uint32_t)crc1, (uint32_t)crc2, len2);
}
unsigned long Z_EXPORT PREFIX(crc32_combine_gen)(z_off_t len2) {
return crc32_combine_gen_(len2);
}
unsigned long Z_EXPORT PREFIX4(crc32_combine_gen)(z_off64_t len2) {
return crc32_combine_gen_(len2);
}
unsigned long Z_EXPORT PREFIX(crc32_combine_op)(unsigned long crc1, unsigned long crc2, const unsigned long op) {
return (unsigned long)crc32_combine_op_((uint32_t)crc1, (uint32_t)crc2, (uint32_t)op);
}
#else
uint32_t Z_EXPORT PREFIX4(crc32_combine)(uint32_t crc1, uint32_t crc2, z_off64_t len2) {
return crc32_combine_(crc1, crc2, len2);
}
uint32_t Z_EXPORT PREFIX(crc32_combine_gen)(z_off64_t len2) {
return crc32_combine_gen_(len2);
}
uint32_t Z_EXPORT PREFIX(crc32_combine_op)(uint32_t crc1, uint32_t crc2, const uint32_t op) {
return crc32_combine_op_(crc1, crc2, op);
}
#endif
/* ========================================================================= */
3p-zlib-ng-main/zlib-ng/crc32_braid_comb_p.h 0000664 0000000 0000000 00000001614 14553115624 0021001 0 ustar 00root root 0000000 0000000 #ifndef CRC32_BRAID_COMB_P_H_
#define CRC32_BRAID_COMB_P_H_
/*
Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial,
reflected. For speed, this requires that a not be zero.
*/
static uint32_t multmodp(uint32_t a, uint32_t b) {
uint32_t m, p;
m = (uint32_t)1 << 31;
p = 0;
for (;;) {
if (a & m) {
p ^= b;
if ((a & (m - 1)) == 0)
break;
}
m >>= 1;
b = b & 1 ? (b >> 1) ^ POLY : b >> 1;
}
return p;
}
/*
Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been
initialized.
*/
static uint32_t x2nmodp(z_off64_t n, unsigned k) {
uint32_t p;
p = (uint32_t)1 << 31; /* x^0 == 1 */
while (n) {
if (n & 1)
p = multmodp(x2n_table[k & 31], p);
n >>= 1;
k++;
}
return p;
}
#endif /* CRC32_BRAID_COMB_P_H_ */
3p-zlib-ng-main/zlib-ng/crc32_braid_p.h 0000664 0000000 0000000 00000001724 14553115624 0020003 0 ustar 00root root 0000000 0000000 #ifndef CRC32_BRAID_P_H_
#define CRC32_BRAID_P_H_
#include "zbuild.h"
#include "zendian.h"
/* Define N */
#ifdef Z_TESTN
# define N Z_TESTN
#else
# define N 5
#endif
#if N < 1 || N > 6
# error N must be in 1..6
#endif
/*
Define W and the associated z_word_t type. If W is not defined, then a
braided calculation is not used, and the associated tables and code are not
compiled.
*/
#ifdef Z_TESTW
# if Z_TESTW-1 != -1
# define W Z_TESTW
# endif
#else
# ifndef W
# if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__)
# define W 8
# else
# define W 4
# endif
# endif
#endif
#ifdef W
# if W == 8
typedef uint64_t z_word_t;
# else
# undef W
# define W 4
typedef uint32_t z_word_t;
# endif
#endif
/* CRC polynomial. */
#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */
extern uint32_t PREFIX(crc32_braid)(uint32_t crc, const uint8_t *buf, size_t len);
#endif /* CRC32_BRAID_P_H_ */
3p-zlib-ng-main/zlib-ng/crc32_braid_tbl.h 0000664 0000000 0000000 00002204047 14553115624 0020332 0 ustar 00root root 0000000 0000000 #ifndef CRC32_BRAID_TBL_H_
#define CRC32_BRAID_TBL_H_
/* crc32_braid_tbl.h -- tables for braided CRC calculation
* Generated automatically by makecrct.c
*/
static const uint32_t crc_table[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
0x2d02ef8d};
#ifdef W
#if W == 8
static const z_word_t crc_big_table[] = {
0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000,
0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000,
0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000,
0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000,
0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000,
0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000,
0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000,
0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000,
0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000,
0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000,
0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000,
0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000,
0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000,
0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000,
0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000,
0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000,
0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000,
0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000,
0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000,
0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000,
0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000,
0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000,
0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000,
0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000,
0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000,
0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000,
0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000,
0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000,
0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000,
0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000,
0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000,
0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000,
0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000,
0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000,
0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000,
0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000,
0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000,
0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000,
0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000,
0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000,
0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000,
0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000,
0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000,
0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000,
0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000,
0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000,
0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000,
0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000,
0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000,
0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000,
0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000,
0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000,
0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000,
0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000,
0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000,
0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000,
0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000,
0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000,
0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000,
0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000,
0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000,
0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000,
0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000,
0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000,
0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000,
0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000,
0x8567077200000000, 0x1357000500000000, 0x824abf9500000000,
0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000,
0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000,
0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000,
0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000,
0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000,
0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000,
0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000,
0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000,
0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000,
0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000,
0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000,
0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000,
0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000,
0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000,
0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000,
0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000,
0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000,
0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000,
0x8def022d00000000};
#else /* W == 4 */
static const z_word_t crc_big_table[] = {
0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07,
0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79,
0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7,
0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84,
0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13,
0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663,
0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5,
0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5,
0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832,
0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51,
0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf,
0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1,
0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76,
0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606,
0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996,
0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6,
0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c,
0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712,
0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c,
0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4,
0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943,
0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333,
0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe,
0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce,
0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359,
0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a,
0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04,
0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a,
0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0,
0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580,
0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10,
0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060,
0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1,
0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf,
0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31,
0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852,
0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5,
0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5,
0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75,
0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005,
0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292,
0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1,
0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f,
0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111,
0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0,
0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0,
0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40,
0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530,
0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba,
0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4,
0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a,
0x8def022d};
#endif
#endif /* W */
#if N == 1
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa,
0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b,
0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232,
0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8,
0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e,
0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa,
0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b,
0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f,
0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719,
0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3,
0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa,
0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b,
0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed,
0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89,
0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25,
0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041,
0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c,
0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed,
0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4,
0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758,
0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e,
0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a,
0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed,
0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889,
0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df,
0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544,
0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d,
0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c,
0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1,
0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95,
0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839,
0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d,
0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976,
0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7,
0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be,
0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144,
0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12,
0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376,
0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a,
0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e,
0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278,
0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682,
0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b,
0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a,
0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561,
0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05,
0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9,
0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd,
0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0,
0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61,
0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678,
0x264b06e6},
{0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413,
0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3,
0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d,
0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653,
0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9,
0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e,
0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5,
0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712,
0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8,
0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6,
0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068,
0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8,
0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579,
0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade,
0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37,
0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590,
0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4,
0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64,
0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea,
0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678,
0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282,
0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25,
0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102,
0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5,
0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f,
0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146,
0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8,
0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08,
0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c,
0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b,
0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972,
0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5,
0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d,
0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd,
0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833,
0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d,
0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7,
0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60,
0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2,
0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105,
0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff,
0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1,
0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f,
0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf,
0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617,
0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0,
0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959,
0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe,
0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca,
0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a,
0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184,
0x92364a30},
{0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216,
0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8,
0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170,
0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035,
0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6,
0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145,
0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d,
0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e,
0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d,
0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408,
0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0,
0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e,
0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c,
0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf,
0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a,
0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9,
0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1,
0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f,
0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987,
0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4,
0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37,
0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84,
0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca,
0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79,
0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba,
0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d,
0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5,
0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b,
0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643,
0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0,
0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525,
0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496,
0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8,
0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026,
0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e,
0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db,
0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118,
0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab,
0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf,
0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c,
0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf,
0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a,
0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32,
0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec,
0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82,
0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31,
0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4,
0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957,
0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f,
0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1,
0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869,
0xe4c4abcc},
{0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0,
0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271,
0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61,
0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52,
0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43,
0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333,
0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64,
0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314,
0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205,
0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136,
0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26,
0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997,
0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849,
0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739,
0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8,
0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98,
0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b,
0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba,
0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa,
0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d,
0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c,
0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc,
0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af,
0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf,
0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce,
0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922,
0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532,
0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183,
0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710,
0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860,
0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1,
0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1,
0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956,
0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7,
0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7,
0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4,
0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5,
0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5,
0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb,
0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb,
0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da,
0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9,
0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9,
0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48,
0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df,
0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af,
0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e,
0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e,
0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d,
0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c,
0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c,
0xca64c78c},
{0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757,
0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a,
0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733,
0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70,
0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42,
0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5,
0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086,
0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4,
0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d,
0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d,
0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f,
0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859,
0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5,
0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028,
0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891,
0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec,
0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde,
0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817,
0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24,
0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e,
0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7,
0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4,
0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196,
0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0,
0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52,
0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f,
0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36,
0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675,
0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647,
0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d,
0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be,
0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc,
0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645,
0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138,
0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a,
0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c,
0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0,
0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d,
0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194,
0xde0506f1},
{0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc,
0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f,
0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a,
0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8,
0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023,
0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e,
0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84,
0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7,
0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922,
0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0,
0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b,
0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816,
0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c,
0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f,
0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba,
0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98,
0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873,
0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e,
0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134,
0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7,
0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732,
0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0,
0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b,
0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26,
0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc,
0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef,
0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a,
0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8,
0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43,
0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e,
0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24,
0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07,
0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982,
0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0,
0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b,
0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576,
0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c,
0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f,
0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda,
0xbe9834ed},
{0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504,
0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49,
0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e,
0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859,
0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c,
0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620,
0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae,
0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2,
0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175,
0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05,
0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40,
0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f,
0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850,
0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d,
0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da,
0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af,
0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea,
0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74,
0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa,
0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a,
0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd,
0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a,
0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f,
0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290,
0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed,
0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0,
0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167,
0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0,
0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5,
0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc,
0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842,
0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e,
0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299,
0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec,
0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9,
0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66,
0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9,
0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4,
0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33,
0x9324fd72},
{0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
0x2d02ef8d}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000,
0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000,
0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000,
0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000,
0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000,
0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000,
0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000,
0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000,
0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000,
0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000,
0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000,
0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000,
0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000,
0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000,
0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000,
0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000,
0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000,
0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000,
0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000,
0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000,
0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000,
0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000,
0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000,
0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000,
0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000,
0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000,
0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000,
0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000,
0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000,
0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000,
0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000,
0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000,
0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000,
0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000,
0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000,
0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000,
0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000,
0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000,
0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000,
0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000,
0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000,
0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000,
0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000,
0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000,
0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000,
0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000,
0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000,
0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000,
0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000,
0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000,
0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000,
0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000,
0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000,
0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000,
0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000,
0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000,
0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000,
0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000,
0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000,
0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000,
0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000,
0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000,
0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000,
0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000,
0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000,
0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000,
0x8567077200000000, 0x1357000500000000, 0x824abf9500000000,
0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000,
0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000,
0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000,
0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000,
0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000,
0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000,
0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000,
0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000,
0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000,
0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000,
0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000,
0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000,
0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000,
0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000,
0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000,
0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000,
0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000,
0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000,
0x8def022d00000000},
{0x0000000000000000, 0x41311b1900000000, 0x8262363200000000,
0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000,
0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000,
0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000,
0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000,
0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000,
0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000,
0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000,
0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000,
0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000,
0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000,
0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000,
0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000,
0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000,
0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000,
0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000,
0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000,
0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000,
0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000,
0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000,
0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000,
0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000,
0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000,
0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000,
0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000,
0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000,
0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000,
0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000,
0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000,
0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000,
0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000,
0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000,
0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000,
0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000,
0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000,
0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000,
0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000,
0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000,
0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000,
0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000,
0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000,
0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000,
0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000,
0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000,
0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000,
0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000,
0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000,
0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000,
0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000,
0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000,
0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000,
0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000,
0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000,
0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000,
0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000,
0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000,
0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000,
0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000,
0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000,
0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000,
0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000,
0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000,
0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000,
0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000,
0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000,
0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000,
0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000,
0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000,
0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000,
0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000,
0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000,
0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000,
0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000,
0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000,
0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000,
0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000,
0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000,
0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000,
0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000,
0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000,
0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000,
0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000,
0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000,
0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000,
0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000,
0x72fd249300000000},
{0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000,
0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000,
0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000,
0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000,
0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000,
0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000,
0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000,
0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000,
0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000,
0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000,
0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000,
0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000,
0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000,
0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000,
0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000,
0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000,
0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000,
0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000,
0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000,
0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000,
0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000,
0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000,
0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000,
0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000,
0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000,
0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000,
0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000,
0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000,
0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000,
0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000,
0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000,
0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000,
0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000,
0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000,
0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000,
0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000,
0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000,
0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000,
0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000,
0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000,
0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000,
0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000,
0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000,
0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000,
0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000,
0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000,
0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000,
0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000,
0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000,
0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000,
0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000,
0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000,
0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000,
0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000,
0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000,
0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000,
0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000,
0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000,
0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000,
0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000,
0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000,
0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000,
0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000,
0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000,
0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000,
0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000,
0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000,
0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000,
0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000,
0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000,
0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000,
0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000,
0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000,
0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000,
0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000,
0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000,
0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000,
0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000,
0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000,
0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000,
0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000,
0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000,
0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000,
0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000,
0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000,
0xed3498be00000000},
{0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000,
0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000,
0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000,
0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000,
0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000,
0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000,
0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000,
0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000,
0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000,
0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000,
0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000,
0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000,
0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000,
0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000,
0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000,
0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000,
0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000,
0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000,
0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000,
0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000,
0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000,
0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000,
0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000,
0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000,
0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000,
0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000,
0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000,
0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000,
0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000,
0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000,
0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000,
0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000,
0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000,
0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000,
0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000,
0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000,
0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000,
0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000,
0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000,
0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000,
0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000,
0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000,
0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000,
0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000,
0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000,
0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000,
0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000,
0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000,
0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000,
0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000,
0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000,
0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000,
0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000,
0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000,
0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000,
0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000,
0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000,
0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000,
0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000,
0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000,
0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000,
0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000,
0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000,
0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000,
0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000,
0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000,
0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000,
0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000,
0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000,
0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000,
0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000,
0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000,
0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000,
0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000,
0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000,
0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000,
0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000,
0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000,
0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000,
0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000,
0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000,
0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000,
0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000,
0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000,
0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000,
0xf10605de00000000},
{0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000,
0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000,
0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000,
0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000,
0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000,
0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000,
0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000,
0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000,
0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000,
0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000,
0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000,
0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000,
0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000,
0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000,
0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000,
0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000,
0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000,
0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000,
0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000,
0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000,
0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000,
0x572f712300000000, 0x4958f35800000000, 0xf971936500000000,
0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000,
0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000,
0x8813836800000000, 0x383ae35500000000, 0xe840431200000000,
0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000,
0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000,
0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000,
0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000,
0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000,
0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000,
0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000,
0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000,
0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000,
0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000,
0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000,
0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000,
0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000,
0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000,
0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000,
0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000,
0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000,
0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000,
0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000,
0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000,
0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000,
0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000,
0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000,
0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000,
0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000,
0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000,
0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000,
0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000,
0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000,
0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000,
0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000,
0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000,
0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000,
0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000,
0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000,
0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000,
0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000,
0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000,
0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000,
0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000,
0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000,
0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000,
0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000,
0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000,
0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000,
0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000,
0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000,
0x983485b900000000, 0x281de58400000000, 0xf86745c300000000,
0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000,
0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000,
0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000,
0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000,
0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000,
0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000,
0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000,
0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000,
0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000,
0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000,
0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000,
0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000,
0x8cc764ca00000000},
{0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000,
0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000,
0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000,
0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000,
0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000,
0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000,
0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000,
0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000,
0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000,
0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000,
0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000,
0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000,
0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000,
0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000,
0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000,
0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000,
0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000,
0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000,
0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000,
0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000,
0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000,
0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000,
0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000,
0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000,
0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000,
0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000,
0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000,
0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000,
0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000,
0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000,
0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000,
0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000,
0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000,
0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000,
0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000,
0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000,
0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000,
0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000,
0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000,
0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000,
0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000,
0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000,
0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000,
0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000,
0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000,
0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000,
0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000,
0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000,
0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000,
0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000,
0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000,
0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000,
0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000,
0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000,
0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000,
0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000,
0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000,
0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000,
0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000,
0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000,
0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000,
0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000,
0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000,
0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000,
0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000,
0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000,
0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000,
0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000,
0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000,
0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000,
0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000,
0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000,
0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000,
0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000,
0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000,
0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000,
0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000,
0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000,
0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000,
0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000,
0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000,
0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000,
0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000,
0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000,
0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000,
0xccabc4e400000000},
{0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000,
0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000,
0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000,
0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000,
0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000,
0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000,
0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000,
0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000,
0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000,
0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000,
0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000,
0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000,
0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000,
0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000,
0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000,
0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000,
0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000,
0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000,
0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000,
0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000,
0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000,
0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000,
0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000,
0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000,
0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000,
0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000,
0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000,
0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000,
0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000,
0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000,
0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000,
0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000,
0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000,
0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000,
0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000,
0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000,
0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000,
0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000,
0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000,
0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000,
0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000,
0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000,
0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000,
0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000,
0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000,
0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000,
0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000,
0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000,
0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000,
0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000,
0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000,
0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000,
0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000,
0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000,
0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000,
0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000,
0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000,
0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000,
0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000,
0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000,
0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000,
0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000,
0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000,
0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000,
0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000,
0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000,
0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000,
0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000,
0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000,
0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000,
0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000,
0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000,
0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000,
0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000,
0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000,
0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000,
0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000,
0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000,
0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000,
0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000,
0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000,
0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000,
0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000,
0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000,
0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000,
0x304a369200000000},
{0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000,
0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000,
0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000,
0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000,
0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000,
0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000,
0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000,
0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000,
0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000,
0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000,
0x1923316900000000, 0x87239ba500000000, 0x566276f900000000,
0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000,
0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000,
0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000,
0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000,
0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000,
0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000,
0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000,
0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000,
0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000,
0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000,
0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000,
0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000,
0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000,
0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000,
0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000,
0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000,
0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000,
0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000,
0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000,
0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000,
0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000,
0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000,
0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000,
0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000,
0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000,
0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000,
0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000,
0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000,
0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000,
0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000,
0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000,
0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000,
0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000,
0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000,
0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000,
0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000,
0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000,
0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000,
0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000,
0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000,
0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000,
0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000,
0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000,
0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000,
0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000,
0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000,
0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000,
0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000,
0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000,
0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000,
0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000,
0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000,
0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000,
0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000,
0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000,
0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000,
0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000,
0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000,
0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000,
0x6171384400000000, 0xff71928800000000, 0xe678578200000000,
0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000,
0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000,
0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000,
0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000,
0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000,
0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000,
0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000,
0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000,
0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000,
0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000,
0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000,
0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000,
0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000,
0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000,
0xe6064b2600000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757,
0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a,
0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733,
0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871,
0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70,
0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42,
0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5,
0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787,
0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086,
0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4,
0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d,
0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0,
0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d,
0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f,
0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859,
0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b,
0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5,
0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028,
0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891,
0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed,
0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec,
0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde,
0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817,
0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825,
0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24,
0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e,
0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7,
0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a,
0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4,
0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196,
0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0,
0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2,
0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52,
0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f,
0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36,
0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174,
0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675,
0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647,
0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d,
0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf,
0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be,
0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc,
0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645,
0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98,
0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138,
0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a,
0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c,
0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e,
0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0,
0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d,
0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194,
0xde0506f1},
{0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc,
0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f,
0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a,
0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29,
0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8,
0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023,
0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e,
0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065,
0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84,
0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7,
0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922,
0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71,
0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0,
0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b,
0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816,
0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd,
0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c,
0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f,
0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba,
0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579,
0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98,
0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873,
0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e,
0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5,
0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134,
0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7,
0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732,
0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461,
0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0,
0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b,
0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26,
0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd,
0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc,
0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef,
0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a,
0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049,
0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8,
0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43,
0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e,
0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5,
0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24,
0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07,
0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982,
0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1,
0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0,
0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b,
0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576,
0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d,
0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c,
0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f,
0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda,
0xbe9834ed},
{0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504,
0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49,
0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e,
0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192,
0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859,
0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c,
0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620,
0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265,
0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae,
0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2,
0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175,
0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38,
0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05,
0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40,
0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f,
0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca,
0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850,
0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d,
0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da,
0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864,
0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af,
0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea,
0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74,
0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31,
0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa,
0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a,
0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd,
0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180,
0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a,
0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f,
0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290,
0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5,
0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed,
0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0,
0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167,
0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b,
0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0,
0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5,
0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc,
0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189,
0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842,
0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e,
0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299,
0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4,
0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec,
0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9,
0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66,
0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23,
0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9,
0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4,
0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33,
0x9324fd72},
{0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
0x2d02ef8d}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07,
0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79,
0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7,
0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84,
0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13,
0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663,
0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5,
0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5,
0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832,
0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51,
0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf,
0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1,
0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76,
0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606,
0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996,
0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6,
0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c,
0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712,
0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c,
0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4,
0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943,
0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333,
0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe,
0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce,
0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359,
0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a,
0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04,
0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a,
0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0,
0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580,
0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10,
0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060,
0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1,
0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf,
0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31,
0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852,
0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5,
0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5,
0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75,
0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005,
0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292,
0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1,
0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f,
0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111,
0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0,
0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0,
0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40,
0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530,
0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba,
0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4,
0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a,
0x8def022d},
{0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64,
0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1,
0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e,
0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61,
0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82,
0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff,
0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7,
0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da,
0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139,
0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6,
0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89,
0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c,
0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0,
0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d,
0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a,
0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177,
0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de,
0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b,
0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824,
0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e,
0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad,
0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0,
0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d,
0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60,
0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83,
0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822,
0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d,
0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8,
0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171,
0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c,
0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b,
0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6,
0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca,
0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f,
0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430,
0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf,
0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c,
0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51,
0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9,
0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84,
0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67,
0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398,
0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7,
0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62,
0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e,
0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923,
0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4,
0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9,
0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070,
0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5,
0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a,
0x72fd2493},
{0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907,
0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f,
0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a,
0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e,
0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512,
0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14,
0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b,
0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d,
0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731,
0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925,
0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620,
0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28,
0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70,
0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176,
0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d,
0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b,
0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b,
0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63,
0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266,
0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a,
0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446,
0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40,
0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557,
0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51,
0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d,
0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0,
0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5,
0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed,
0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd,
0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb,
0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0,
0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6,
0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de,
0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6,
0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3,
0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7,
0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb,
0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd,
0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92,
0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094,
0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598,
0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c,
0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489,
0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81,
0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9,
0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af,
0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4,
0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2,
0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2,
0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba,
0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf,
0xed3498be},
{0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f,
0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d,
0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0,
0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42,
0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95,
0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2,
0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a,
0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d,
0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea,
0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748,
0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5,
0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27,
0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b,
0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac,
0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4,
0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3,
0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44,
0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6,
0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b,
0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329,
0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe,
0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9,
0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1,
0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6,
0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921,
0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555,
0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8,
0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a,
0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd,
0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a,
0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2,
0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5,
0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2,
0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330,
0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad,
0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f,
0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8,
0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef,
0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc,
0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb,
0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c,
0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e,
0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03,
0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1,
0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6,
0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1,
0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9,
0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e,
0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409,
0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb,
0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966,
0xf10605de}};
#endif /* W */
#endif /* N == 1 */
#if N == 2
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87,
0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede,
0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab,
0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c,
0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1,
0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7,
0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e,
0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308,
0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5,
0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472,
0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07,
0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e,
0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa,
0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec,
0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6,
0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0,
0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3,
0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba,
0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf,
0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975,
0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8,
0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde,
0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a,
0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c,
0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1,
0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65,
0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410,
0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649,
0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a,
0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c,
0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946,
0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450,
0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e,
0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857,
0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022,
0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5,
0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758,
0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e,
0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d,
0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b,
0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6,
0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401,
0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74,
0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d,
0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073,
0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65,
0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f,
0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749,
0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a,
0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033,
0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846,
0x0d7139d7},
{0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563,
0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f,
0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875,
0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536,
0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8,
0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43,
0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f,
0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184,
0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a,
0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39,
0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523,
0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f,
0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d,
0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6,
0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b,
0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0,
0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151,
0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d,
0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47,
0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a,
0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964,
0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef,
0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d,
0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6,
0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348,
0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53,
0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449,
0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645,
0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4,
0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f,
0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2,
0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69,
0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46,
0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a,
0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650,
0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13,
0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded,
0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366,
0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57,
0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc,
0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222,
0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61,
0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b,
0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277,
0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558,
0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3,
0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e,
0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5,
0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74,
0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78,
0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262,
0x1c53e98a},
{0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b,
0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40,
0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580,
0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7,
0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a,
0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37,
0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75,
0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218,
0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5,
0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2,
0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02,
0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59,
0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1,
0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c,
0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a,
0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307,
0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486,
0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd,
0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d,
0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2,
0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f,
0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72,
0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8,
0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985,
0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268,
0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94,
0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454,
0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f,
0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e,
0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3,
0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915,
0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778,
0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821,
0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a,
0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba,
0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d,
0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560,
0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d,
0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe,
0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3,
0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e,
0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509,
0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9,
0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92,
0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb,
0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6,
0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50,
0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d,
0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc,
0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7,
0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927,
0x3f88e851},
{0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96,
0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8,
0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0,
0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14,
0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7,
0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4,
0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe,
0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad,
0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e,
0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa,
0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2,
0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c,
0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab,
0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8,
0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d,
0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e,
0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7,
0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99,
0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1,
0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690,
0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933,
0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20,
0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf,
0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc,
0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f,
0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92,
0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca,
0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4,
0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd,
0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de,
0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb,
0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8,
0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474,
0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a,
0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252,
0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6,
0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55,
0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846,
0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7,
0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4,
0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47,
0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3,
0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb,
0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5,
0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49,
0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a,
0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f,
0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c,
0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305,
0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b,
0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523,
0x3dee8ca6},
{0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f,
0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91,
0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e,
0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c,
0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02,
0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12,
0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567,
0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277,
0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679,
0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b,
0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4,
0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a,
0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0,
0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0,
0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91,
0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881,
0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173,
0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d,
0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912,
0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8,
0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6,
0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6,
0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b,
0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b,
0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75,
0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f,
0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00,
0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee,
0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c,
0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c,
0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d,
0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d,
0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67,
0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89,
0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706,
0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14,
0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a,
0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a,
0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f,
0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f,
0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591,
0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983,
0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c,
0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2,
0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8,
0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8,
0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89,
0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99,
0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b,
0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485,
0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a,
0x36197165},
{0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382,
0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85,
0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06,
0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca,
0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e,
0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc,
0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616,
0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54,
0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10,
0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc,
0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f,
0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58,
0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef,
0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad,
0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b,
0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29,
0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6,
0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1,
0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622,
0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039,
0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d,
0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f,
0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32,
0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770,
0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034,
0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f,
0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc,
0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db,
0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154,
0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16,
0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0,
0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592,
0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca,
0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd,
0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e,
0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882,
0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6,
0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384,
0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1,
0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3,
0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7,
0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b,
0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8,
0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff,
0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7,
0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5,
0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23,
0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761,
0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee,
0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9,
0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a,
0x1a3b93aa},
{0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a,
0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca,
0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3,
0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb,
0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c,
0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58,
0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed,
0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9,
0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e,
0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906,
0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f,
0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf,
0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0,
0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4,
0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769,
0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d,
0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632,
0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82,
0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb,
0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73,
0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484,
0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0,
0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5,
0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1,
0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516,
0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f,
0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946,
0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6,
0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9,
0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad,
0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820,
0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364,
0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab,
0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b,
0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62,
0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a,
0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd,
0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089,
0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c,
0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8,
0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f,
0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477,
0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e,
0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be,
0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71,
0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635,
0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8,
0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc,
0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3,
0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753,
0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a,
0xe147d714},
{0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c,
0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b,
0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92,
0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4,
0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069,
0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526,
0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25,
0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a,
0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7,
0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491,
0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958,
0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f,
0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307,
0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648,
0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999,
0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6,
0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a,
0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d,
0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4,
0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61,
0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc,
0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3,
0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53,
0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c,
0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1,
0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c,
0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5,
0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92,
0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e,
0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771,
0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0,
0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def,
0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0,
0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7,
0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e,
0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58,
0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285,
0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca,
0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce,
0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81,
0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c,
0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a,
0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3,
0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4,
0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb,
0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4,
0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75,
0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a,
0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296,
0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1,
0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808,
0x494f0c4b}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000,
0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000,
0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000,
0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000,
0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000,
0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000,
0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000,
0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000,
0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000,
0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000,
0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000,
0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000,
0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000,
0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000,
0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000,
0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000,
0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000,
0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000,
0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000,
0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000,
0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000,
0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000,
0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000,
0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000,
0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000,
0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000,
0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000,
0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000,
0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000,
0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000,
0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000,
0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000,
0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000,
0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000,
0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000,
0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000,
0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000,
0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000,
0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000,
0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000,
0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000,
0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000,
0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000,
0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000,
0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000,
0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000,
0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000,
0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000,
0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000,
0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000,
0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000,
0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000,
0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000,
0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000,
0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000,
0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000,
0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000,
0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000,
0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000,
0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000,
0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000,
0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000,
0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000,
0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000,
0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000,
0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000,
0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000,
0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000,
0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000,
0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000,
0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000,
0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000,
0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000,
0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000,
0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000,
0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000,
0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000,
0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000,
0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000,
0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000,
0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000,
0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000,
0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000,
0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000,
0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000,
0x4b0c4f4900000000},
{0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000,
0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000,
0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000,
0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000,
0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000,
0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000,
0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000,
0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000,
0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000,
0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000,
0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000,
0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000,
0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000,
0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000,
0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000,
0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000,
0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000,
0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000,
0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000,
0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000,
0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000,
0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000,
0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000,
0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000,
0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000,
0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000,
0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000,
0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000,
0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000,
0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000,
0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000,
0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000,
0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000,
0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000,
0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000,
0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000,
0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000,
0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000,
0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000,
0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000,
0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000,
0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000,
0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000,
0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000,
0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000,
0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000,
0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000,
0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000,
0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000,
0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000,
0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000,
0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000,
0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000,
0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000,
0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000,
0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000,
0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000,
0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000,
0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000,
0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000,
0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000,
0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000,
0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000,
0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000,
0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000,
0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000,
0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000,
0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000,
0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000,
0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000,
0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000,
0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000,
0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000,
0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000,
0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000,
0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000,
0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000,
0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000,
0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000,
0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000,
0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000,
0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000,
0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000,
0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000,
0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000,
0x14d747e100000000},
{0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000,
0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000,
0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000,
0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000,
0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000,
0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000,
0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000,
0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000,
0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000,
0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000,
0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000,
0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000,
0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000,
0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000,
0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000,
0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000,
0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000,
0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000,
0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000,
0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000,
0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000,
0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000,
0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000,
0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000,
0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000,
0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000,
0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000,
0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000,
0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000,
0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000,
0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000,
0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000,
0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000,
0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000,
0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000,
0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000,
0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000,
0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000,
0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000,
0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000,
0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000,
0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000,
0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000,
0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000,
0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000,
0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000,
0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000,
0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000,
0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000,
0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000,
0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000,
0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000,
0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000,
0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000,
0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000,
0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000,
0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000,
0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000,
0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000,
0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000,
0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000,
0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000,
0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000,
0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000,
0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000,
0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000,
0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000,
0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000,
0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000,
0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000,
0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000,
0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000,
0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000,
0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000,
0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000,
0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000,
0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000,
0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000,
0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000,
0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000,
0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000,
0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000,
0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000,
0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000,
0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000,
0xaa933b1a00000000},
{0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000,
0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000,
0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000,
0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000,
0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000,
0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000,
0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000,
0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000,
0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000,
0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000,
0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000,
0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000,
0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000,
0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000,
0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000,
0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000,
0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000,
0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000,
0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000,
0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000,
0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000,
0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000,
0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000,
0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000,
0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000,
0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000,
0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000,
0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000,
0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000,
0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000,
0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000,
0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000,
0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000,
0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000,
0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000,
0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000,
0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000,
0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000,
0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000,
0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000,
0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000,
0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000,
0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000,
0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000,
0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000,
0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000,
0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000,
0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000,
0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000,
0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000,
0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000,
0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000,
0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000,
0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000,
0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000,
0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000,
0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000,
0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000,
0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000,
0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000,
0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000,
0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000,
0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000,
0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000,
0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000,
0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000,
0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000,
0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000,
0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000,
0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000,
0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000,
0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000,
0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000,
0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000,
0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000,
0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000,
0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000,
0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000,
0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000,
0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000,
0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000,
0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000,
0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000,
0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000,
0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000,
0x6571193600000000},
{0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000,
0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000,
0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000,
0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000,
0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000,
0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000,
0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000,
0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000,
0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000,
0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000,
0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000,
0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000,
0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000,
0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000,
0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000,
0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000,
0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000,
0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000,
0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000,
0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000,
0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000,
0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000,
0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000,
0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000,
0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000,
0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000,
0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000,
0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000,
0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000,
0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000,
0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000,
0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000,
0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000,
0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000,
0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000,
0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000,
0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000,
0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000,
0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000,
0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000,
0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000,
0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000,
0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000,
0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000,
0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000,
0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000,
0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000,
0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000,
0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000,
0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000,
0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000,
0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000,
0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000,
0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000,
0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000,
0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000,
0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000,
0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000,
0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000,
0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000,
0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000,
0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000,
0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000,
0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000,
0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000,
0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000,
0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000,
0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000,
0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000,
0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000,
0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000,
0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000,
0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000,
0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000,
0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000,
0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000,
0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000,
0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000,
0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000,
0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000,
0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000,
0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000,
0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000,
0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000,
0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000,
0xa68cee3d00000000},
{0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000,
0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000,
0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000,
0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000,
0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000,
0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000,
0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000,
0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000,
0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000,
0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000,
0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000,
0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000,
0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000,
0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000,
0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000,
0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000,
0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000,
0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000,
0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000,
0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000,
0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000,
0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000,
0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000,
0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000,
0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000,
0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000,
0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000,
0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000,
0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000,
0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000,
0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000,
0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000,
0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000,
0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000,
0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000,
0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000,
0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000,
0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000,
0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000,
0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000,
0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000,
0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000,
0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000,
0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000,
0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000,
0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000,
0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000,
0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000,
0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000,
0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000,
0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000,
0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000,
0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000,
0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000,
0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000,
0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000,
0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000,
0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000,
0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000,
0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000,
0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000,
0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000,
0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000,
0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000,
0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000,
0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000,
0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000,
0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000,
0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000,
0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000,
0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000,
0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000,
0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000,
0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000,
0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000,
0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000,
0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000,
0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000,
0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000,
0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000,
0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000,
0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000,
0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000,
0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000,
0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000,
0x51e8883f00000000},
{0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000,
0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000,
0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000,
0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000,
0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000,
0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000,
0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000,
0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000,
0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000,
0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000,
0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000,
0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000,
0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000,
0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000,
0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000,
0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000,
0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000,
0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000,
0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000,
0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000,
0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000,
0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000,
0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000,
0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000,
0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000,
0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000,
0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000,
0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000,
0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000,
0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000,
0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000,
0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000,
0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000,
0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000,
0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000,
0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000,
0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000,
0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000,
0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000,
0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000,
0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000,
0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000,
0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000,
0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000,
0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000,
0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000,
0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000,
0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000,
0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000,
0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000,
0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000,
0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000,
0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000,
0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000,
0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000,
0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000,
0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000,
0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000,
0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000,
0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000,
0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000,
0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000,
0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000,
0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000,
0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000,
0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000,
0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000,
0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000,
0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000,
0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000,
0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000,
0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000,
0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000,
0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000,
0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000,
0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000,
0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000,
0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000,
0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000,
0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000,
0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000,
0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000,
0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000,
0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000,
0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000,
0x8ae9531c00000000},
{0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000,
0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000,
0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000,
0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000,
0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000,
0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000,
0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000,
0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000,
0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000,
0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000,
0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000,
0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000,
0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000,
0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000,
0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000,
0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000,
0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000,
0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000,
0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000,
0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000,
0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000,
0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000,
0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000,
0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000,
0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000,
0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000,
0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000,
0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000,
0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000,
0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000,
0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000,
0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000,
0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000,
0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000,
0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000,
0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000,
0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000,
0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000,
0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000,
0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000,
0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000,
0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000,
0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000,
0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000,
0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000,
0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000,
0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000,
0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000,
0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000,
0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000,
0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000,
0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000,
0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000,
0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000,
0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000,
0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000,
0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000,
0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000,
0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000,
0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000,
0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000,
0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000,
0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000,
0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000,
0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000,
0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000,
0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000,
0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000,
0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000,
0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000,
0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000,
0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000,
0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000,
0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000,
0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000,
0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000,
0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000,
0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000,
0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000,
0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000,
0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000,
0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000,
0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000,
0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000,
0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000,
0xd739710d00000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa,
0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b,
0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232,
0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8,
0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e,
0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa,
0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b,
0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f,
0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719,
0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3,
0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa,
0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b,
0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed,
0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89,
0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25,
0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041,
0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c,
0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed,
0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4,
0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758,
0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e,
0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a,
0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed,
0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889,
0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df,
0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544,
0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d,
0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c,
0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1,
0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95,
0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839,
0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d,
0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976,
0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7,
0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be,
0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144,
0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12,
0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376,
0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a,
0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e,
0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278,
0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682,
0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b,
0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a,
0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561,
0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05,
0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9,
0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd,
0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0,
0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61,
0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678,
0x264b06e6},
{0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413,
0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3,
0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d,
0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653,
0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9,
0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e,
0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5,
0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712,
0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8,
0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6,
0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068,
0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8,
0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579,
0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade,
0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37,
0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590,
0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4,
0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64,
0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea,
0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678,
0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282,
0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25,
0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102,
0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5,
0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f,
0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146,
0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8,
0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08,
0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c,
0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b,
0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972,
0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5,
0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d,
0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd,
0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833,
0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d,
0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7,
0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60,
0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2,
0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105,
0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff,
0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1,
0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f,
0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf,
0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617,
0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0,
0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959,
0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe,
0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca,
0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a,
0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184,
0x92364a30},
{0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216,
0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8,
0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170,
0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035,
0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6,
0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145,
0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d,
0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e,
0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d,
0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408,
0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0,
0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e,
0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c,
0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf,
0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a,
0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9,
0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1,
0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f,
0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987,
0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4,
0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37,
0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84,
0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca,
0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79,
0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba,
0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d,
0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5,
0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b,
0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643,
0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0,
0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525,
0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496,
0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8,
0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026,
0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e,
0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db,
0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118,
0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab,
0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf,
0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c,
0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf,
0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a,
0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32,
0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec,
0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82,
0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31,
0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4,
0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957,
0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f,
0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1,
0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869,
0xe4c4abcc},
{0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0,
0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271,
0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61,
0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52,
0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43,
0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333,
0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64,
0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314,
0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205,
0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136,
0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26,
0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997,
0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849,
0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739,
0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8,
0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98,
0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b,
0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba,
0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa,
0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d,
0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c,
0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc,
0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af,
0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf,
0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce,
0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922,
0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532,
0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183,
0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710,
0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860,
0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1,
0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1,
0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956,
0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7,
0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7,
0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4,
0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5,
0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5,
0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb,
0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb,
0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da,
0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9,
0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9,
0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48,
0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df,
0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af,
0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e,
0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e,
0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d,
0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c,
0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c,
0xca64c78c}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5,
0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d,
0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf,
0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027,
0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050,
0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098,
0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb,
0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173,
0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104,
0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c,
0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e,
0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6,
0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358,
0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390,
0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312,
0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da,
0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd,
0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335,
0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387,
0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de,
0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9,
0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261,
0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283,
0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b,
0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c,
0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c,
0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e,
0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6,
0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1,
0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619,
0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b,
0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653,
0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785,
0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d,
0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf,
0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757,
0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720,
0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8,
0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593,
0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b,
0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c,
0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4,
0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506,
0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe,
0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428,
0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0,
0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462,
0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa,
0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd,
0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445,
0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7,
0x8cc764ca},
{0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b,
0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27,
0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a,
0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285,
0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef,
0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf,
0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a,
0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a,
0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70,
0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf,
0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2,
0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e,
0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f,
0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f,
0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae,
0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe,
0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97,
0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b,
0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436,
0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e,
0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4,
0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4,
0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46,
0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716,
0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c,
0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5,
0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8,
0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774,
0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d,
0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d,
0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc,
0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec,
0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82,
0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e,
0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623,
0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c,
0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6,
0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6,
0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c,
0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c,
0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66,
0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9,
0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4,
0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978,
0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416,
0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946,
0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7,
0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7,
0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e,
0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32,
0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f,
0xccabc4e4},
{0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4,
0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895,
0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50,
0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656,
0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154,
0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906,
0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258,
0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a,
0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08,
0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e,
0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb,
0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa,
0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44,
0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316,
0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0,
0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2,
0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7,
0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6,
0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73,
0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba,
0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8,
0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea,
0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b,
0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29,
0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b,
0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e,
0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb,
0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a,
0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef,
0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd,
0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b,
0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019,
0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3,
0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2,
0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417,
0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11,
0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13,
0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241,
0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b,
0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09,
0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b,
0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d,
0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8,
0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9,
0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003,
0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851,
0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7,
0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5,
0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190,
0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1,
0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134,
0x304a3692},
{0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84,
0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f,
0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15,
0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2,
0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf,
0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7,
0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb,
0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3,
0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae,
0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749,
0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243,
0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8,
0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29,
0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61,
0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8,
0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0,
0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1,
0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a,
0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40,
0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e,
0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03,
0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b,
0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee,
0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6,
0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb,
0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f,
0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495,
0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e,
0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f,
0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067,
0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be,
0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6,
0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e,
0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5,
0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf,
0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958,
0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305,
0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d,
0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338,
0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370,
0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d,
0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca,
0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0,
0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b,
0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083,
0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb,
0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012,
0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a,
0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b,
0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0,
0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea,
0xe6064b26}};
#endif /* W */
#endif /* N == 2 */
#if N == 3
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f,
0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999,
0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee,
0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615,
0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383,
0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb,
0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275,
0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d,
0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b,
0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460,
0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317,
0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1,
0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5,
0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd,
0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04,
0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c,
0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7,
0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11,
0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66,
0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7,
0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871,
0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309,
0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd,
0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85,
0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913,
0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d,
0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a,
0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc,
0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57,
0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f,
0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6,
0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e,
0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f,
0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289,
0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe,
0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05,
0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893,
0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb,
0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0,
0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8,
0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e,
0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5,
0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2,
0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574,
0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5,
0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add,
0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114,
0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c,
0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7,
0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701,
0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076,
0x09cd8551},
{0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193,
0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2,
0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c,
0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71,
0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a,
0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d,
0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71,
0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436,
0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d,
0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000,
0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae,
0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf,
0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930,
0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277,
0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff,
0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8,
0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef,
0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e,
0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20,
0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95,
0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e,
0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9,
0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d,
0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a,
0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151,
0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4,
0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a,
0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b,
0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c,
0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b,
0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3,
0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4,
0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b,
0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a,
0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4,
0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189,
0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92,
0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5,
0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9,
0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe,
0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5,
0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8,
0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66,
0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707,
0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8,
0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f,
0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707,
0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40,
0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017,
0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876,
0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8,
0x7bc97a0c},
{0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300,
0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0,
0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80,
0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701,
0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41,
0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81,
0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43,
0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83,
0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3,
0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42,
0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202,
0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2,
0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7,
0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407,
0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47,
0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87,
0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86,
0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46,
0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506,
0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44,
0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704,
0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4,
0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5,
0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505,
0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45,
0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f,
0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f,
0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f,
0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e,
0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e,
0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e,
0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce,
0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c,
0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc,
0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c,
0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d,
0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d,
0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d,
0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88,
0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48,
0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708,
0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89,
0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9,
0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309,
0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb,
0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b,
0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b,
0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b,
0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a,
0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a,
0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a,
0x7851a2ca},
{0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb,
0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8,
0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0,
0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f,
0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a,
0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf,
0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5,
0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380,
0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815,
0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa,
0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2,
0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1,
0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1,
0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4,
0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa,
0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df,
0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6,
0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5,
0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad,
0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca,
0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f,
0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a,
0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8,
0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d,
0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708,
0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d,
0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865,
0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636,
0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f,
0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a,
0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744,
0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061,
0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0,
0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293,
0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb,
0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874,
0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1,
0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4,
0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f,
0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a,
0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f,
0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120,
0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778,
0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b,
0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a,
0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af,
0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81,
0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4,
0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd,
0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e,
0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6,
0x566b6848},
{0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59,
0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4,
0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67,
0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef,
0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97,
0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88,
0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687,
0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698,
0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0,
0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068,
0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb,
0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056,
0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016,
0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009,
0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028,
0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037,
0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a,
0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7,
0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054,
0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7,
0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af,
0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0,
0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4,
0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab,
0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3,
0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a,
0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9,
0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54,
0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09,
0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16,
0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37,
0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28,
0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e,
0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3,
0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40,
0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8,
0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0,
0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf,
0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6,
0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9,
0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1,
0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059,
0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca,
0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067,
0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031,
0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e,
0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f,
0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010,
0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d,
0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0,
0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073,
0xd8ac6b35},
{0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2,
0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd,
0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696,
0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3,
0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f,
0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35,
0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5,
0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f,
0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673,
0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46,
0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d,
0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632,
0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28,
0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192,
0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c,
0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6,
0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0,
0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff,
0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4,
0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95,
0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9,
0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03,
0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7,
0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d,
0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151,
0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808,
0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343,
0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c,
0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a,
0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0,
0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e,
0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594,
0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6,
0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399,
0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2,
0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7,
0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb,
0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571,
0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289,
0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33,
0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f,
0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a,
0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461,
0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e,
0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c,
0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6,
0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918,
0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2,
0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484,
0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb,
0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0,
0xa140efa8},
{0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706,
0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed,
0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289,
0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a,
0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214,
0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3,
0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3,
0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254,
0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a,
0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9,
0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad,
0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746,
0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060,
0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187,
0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef,
0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408,
0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e,
0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495,
0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1,
0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532,
0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c,
0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb,
0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb,
0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c,
0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42,
0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060,
0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04,
0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef,
0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99,
0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e,
0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16,
0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1,
0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7,
0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c,
0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38,
0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb,
0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5,
0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42,
0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62,
0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85,
0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb,
0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18,
0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c,
0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997,
0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1,
0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36,
0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e,
0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9,
0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf,
0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24,
0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040,
0x917cd6a1},
{0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf,
0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd,
0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896,
0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9,
0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3,
0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f,
0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d,
0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1,
0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab,
0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4,
0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f,
0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d,
0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4,
0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978,
0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad,
0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621,
0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46,
0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854,
0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f,
0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a,
0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890,
0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c,
0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4,
0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238,
0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622,
0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab,
0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0,
0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2,
0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295,
0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19,
0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc,
0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140,
0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd,
0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf,
0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184,
0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb,
0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1,
0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d,
0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb,
0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257,
0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d,
0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22,
0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069,
0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b,
0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6,
0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a,
0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf,
0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33,
0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254,
0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146,
0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d,
0x18ba364e}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000,
0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000,
0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000,
0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000,
0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000,
0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000,
0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000,
0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000,
0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000,
0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000,
0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000,
0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000,
0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000,
0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000,
0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000,
0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000,
0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000,
0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000,
0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000,
0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000,
0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000,
0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000,
0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000,
0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000,
0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000,
0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000,
0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000,
0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000,
0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000,
0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000,
0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000,
0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000,
0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000,
0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000,
0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000,
0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000,
0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000,
0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000,
0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000,
0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000,
0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000,
0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000,
0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000,
0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000,
0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000,
0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000,
0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000,
0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000,
0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000,
0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000,
0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000,
0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000,
0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000,
0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000,
0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000,
0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000,
0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000,
0x08eda52100000000, 0x4391370100000000, 0x005a918600000000,
0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000,
0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000,
0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000,
0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000,
0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000,
0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000,
0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000,
0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000,
0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000,
0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000,
0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000,
0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000,
0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000,
0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000,
0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000,
0x7b23114500000000, 0x305f836500000000, 0x739425e200000000,
0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000,
0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000,
0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000,
0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000,
0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000,
0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000,
0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000,
0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000,
0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000,
0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000,
0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000,
0x4e36ba1800000000},
{0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000,
0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000,
0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000,
0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000,
0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000,
0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000,
0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000,
0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000,
0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000,
0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000,
0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000,
0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000,
0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000,
0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000,
0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000,
0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000,
0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000,
0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000,
0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000,
0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000,
0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000,
0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000,
0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000,
0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000,
0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000,
0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000,
0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000,
0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000,
0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000,
0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000,
0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000,
0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000,
0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000,
0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000,
0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000,
0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000,
0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000,
0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000,
0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000,
0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000,
0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000,
0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000,
0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000,
0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000,
0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000,
0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000,
0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000,
0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000,
0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000,
0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000,
0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000,
0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000,
0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000,
0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000,
0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000,
0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000,
0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000,
0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000,
0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000,
0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000,
0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000,
0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000,
0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000,
0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000,
0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000,
0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000,
0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000,
0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000,
0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000,
0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000,
0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000,
0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000,
0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000,
0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000,
0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000,
0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000,
0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000,
0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000,
0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000,
0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000,
0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000,
0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000,
0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000,
0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000,
0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000,
0xa1d67c9100000000},
{0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000,
0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000,
0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000,
0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000,
0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000,
0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000,
0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000,
0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000,
0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000,
0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000,
0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000,
0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000,
0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000,
0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000,
0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000,
0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000,
0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000,
0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000,
0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000,
0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000,
0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000,
0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000,
0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000,
0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000,
0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000,
0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000,
0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000,
0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000,
0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000,
0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000,
0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000,
0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000,
0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000,
0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000,
0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000,
0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000,
0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000,
0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000,
0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000,
0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000,
0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000,
0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000,
0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000,
0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000,
0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000,
0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000,
0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000,
0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000,
0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000,
0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000,
0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000,
0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000,
0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000,
0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000,
0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000,
0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000,
0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000,
0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000,
0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000,
0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000,
0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000,
0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000,
0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000,
0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000,
0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000,
0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000,
0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000,
0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000,
0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000,
0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000,
0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000,
0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000,
0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000,
0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000,
0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000,
0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000,
0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000,
0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000,
0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000,
0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000,
0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000,
0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000,
0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000,
0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000,
0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000,
0xa8ef40a100000000},
{0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000,
0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000,
0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000,
0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000,
0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000,
0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000,
0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000,
0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000,
0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000,
0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000,
0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000,
0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000,
0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000,
0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000,
0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000,
0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000,
0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000,
0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000,
0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000,
0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000,
0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000,
0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000,
0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000,
0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000,
0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000,
0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000,
0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000,
0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000,
0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000,
0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000,
0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000,
0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000,
0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000,
0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000,
0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000,
0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000,
0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000,
0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000,
0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000,
0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000,
0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000,
0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000,
0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000,
0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000,
0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000,
0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000,
0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000,
0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000,
0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000,
0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000,
0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000,
0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000,
0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000,
0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000,
0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000,
0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000,
0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000,
0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000,
0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000,
0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000,
0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000,
0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000,
0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000,
0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000,
0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000,
0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000,
0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000,
0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000,
0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000,
0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000,
0x933d017400000000, 0xd506661100000000, 0x46a022f000000000,
0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000,
0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000,
0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000,
0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000,
0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000,
0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000,
0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000,
0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000,
0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000,
0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000,
0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000,
0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000,
0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000,
0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000,
0x356bacd800000000},
{0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000,
0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000,
0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000,
0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000,
0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000,
0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000,
0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000,
0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000,
0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000,
0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000,
0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000,
0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000,
0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000,
0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000,
0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000,
0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000,
0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000,
0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000,
0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000,
0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000,
0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000,
0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000,
0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000,
0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000,
0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000,
0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000,
0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000,
0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000,
0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000,
0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000,
0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000,
0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000,
0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000,
0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000,
0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000,
0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000,
0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000,
0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000,
0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000,
0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000,
0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000,
0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000,
0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000,
0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000,
0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000,
0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000,
0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000,
0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000,
0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000,
0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000,
0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000,
0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000,
0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000,
0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000,
0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000,
0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000,
0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000,
0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000,
0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000,
0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000,
0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000,
0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000,
0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000,
0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000,
0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000,
0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000,
0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000,
0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000,
0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000,
0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000,
0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000,
0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000,
0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000,
0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000,
0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000,
0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000,
0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000,
0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000,
0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000,
0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000,
0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000,
0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000,
0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000,
0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000,
0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000,
0x48686b5600000000},
{0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000,
0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000,
0x805af17200000000, 0x403ed96500000000, 0x002643b900000000,
0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000,
0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000,
0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000,
0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000,
0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000,
0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000,
0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000,
0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000,
0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000,
0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000,
0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000,
0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000,
0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000,
0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000,
0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000,
0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000,
0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000,
0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000,
0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000,
0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000,
0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000,
0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000,
0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000,
0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000,
0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000,
0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000,
0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000,
0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000,
0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000,
0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000,
0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000,
0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000,
0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000,
0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000,
0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000,
0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000,
0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000,
0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000,
0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000,
0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000,
0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000,
0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000,
0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000,
0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000,
0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000,
0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000,
0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000,
0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000,
0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000,
0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000,
0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000,
0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000,
0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000,
0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000,
0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000,
0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000,
0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000,
0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000,
0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000,
0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000,
0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000,
0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000,
0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000,
0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000,
0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000,
0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000,
0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000,
0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000,
0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000,
0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000,
0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000,
0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000,
0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000,
0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000,
0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000,
0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000,
0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000,
0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000,
0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000,
0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000,
0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000,
0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000,
0xcaa2517800000000},
{0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000,
0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000,
0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000,
0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000,
0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000,
0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000,
0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000,
0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000,
0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000,
0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000,
0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000,
0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000,
0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000,
0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000,
0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000,
0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000,
0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000,
0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000,
0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000,
0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000,
0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000,
0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000,
0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000,
0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000,
0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000,
0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000,
0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000,
0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000,
0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000,
0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000,
0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000,
0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000,
0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000,
0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000,
0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000,
0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000,
0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000,
0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000,
0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000,
0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000,
0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000,
0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000,
0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000,
0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000,
0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000,
0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000,
0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000,
0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000,
0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000,
0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000,
0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000,
0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000,
0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000,
0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000,
0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000,
0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000,
0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000,
0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000,
0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000,
0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000,
0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000,
0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000,
0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000,
0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000,
0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000,
0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000,
0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000,
0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000,
0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000,
0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000,
0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000,
0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000,
0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000,
0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000,
0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000,
0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000,
0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000,
0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000,
0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000,
0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000,
0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000,
0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000,
0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000,
0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000,
0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000,
0x0c7ac97b00000000},
{0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000,
0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000,
0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000,
0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000,
0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000,
0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000,
0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000,
0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000,
0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000,
0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000,
0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000,
0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000,
0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000,
0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000,
0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000,
0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000,
0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000,
0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000,
0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000,
0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000,
0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000,
0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000,
0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000,
0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000,
0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000,
0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000,
0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000,
0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000,
0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000,
0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000,
0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000,
0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000,
0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000,
0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000,
0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000,
0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000,
0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000,
0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000,
0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000,
0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000,
0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000,
0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000,
0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000,
0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000,
0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000,
0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000,
0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000,
0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000,
0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000,
0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000,
0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000,
0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000,
0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000,
0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000,
0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000,
0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000,
0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000,
0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000,
0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000,
0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000,
0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000,
0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000,
0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000,
0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000,
0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000,
0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000,
0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000,
0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000,
0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000,
0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000,
0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000,
0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000,
0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000,
0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000,
0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000,
0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000,
0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000,
0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000,
0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000,
0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000,
0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000,
0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000,
0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000,
0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000,
0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000,
0x5185cd0900000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f,
0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91,
0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e,
0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c,
0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02,
0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12,
0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567,
0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277,
0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679,
0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b,
0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4,
0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a,
0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0,
0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0,
0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91,
0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881,
0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173,
0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d,
0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912,
0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8,
0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6,
0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6,
0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b,
0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b,
0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75,
0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f,
0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00,
0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee,
0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c,
0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c,
0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d,
0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d,
0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67,
0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89,
0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706,
0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14,
0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a,
0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a,
0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f,
0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f,
0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591,
0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983,
0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c,
0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2,
0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8,
0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8,
0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89,
0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99,
0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b,
0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485,
0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a,
0x36197165},
{0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382,
0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85,
0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06,
0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca,
0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e,
0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc,
0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616,
0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54,
0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10,
0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc,
0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f,
0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58,
0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef,
0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad,
0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b,
0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29,
0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6,
0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1,
0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622,
0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039,
0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d,
0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f,
0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32,
0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770,
0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034,
0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f,
0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc,
0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db,
0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154,
0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16,
0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0,
0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592,
0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca,
0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd,
0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e,
0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882,
0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6,
0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384,
0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1,
0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3,
0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7,
0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b,
0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8,
0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff,
0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7,
0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5,
0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23,
0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761,
0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee,
0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9,
0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a,
0x1a3b93aa},
{0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a,
0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca,
0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3,
0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb,
0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c,
0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58,
0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed,
0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9,
0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e,
0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906,
0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f,
0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf,
0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0,
0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4,
0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769,
0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d,
0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632,
0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82,
0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb,
0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73,
0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484,
0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0,
0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5,
0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1,
0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516,
0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f,
0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946,
0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6,
0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9,
0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad,
0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820,
0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364,
0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab,
0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b,
0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62,
0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a,
0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd,
0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089,
0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c,
0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8,
0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f,
0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477,
0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e,
0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be,
0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71,
0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635,
0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8,
0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc,
0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3,
0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753,
0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a,
0xe147d714},
{0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c,
0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b,
0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92,
0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4,
0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069,
0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526,
0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25,
0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a,
0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7,
0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491,
0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958,
0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f,
0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307,
0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648,
0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999,
0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6,
0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a,
0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d,
0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4,
0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61,
0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc,
0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3,
0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53,
0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c,
0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1,
0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c,
0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5,
0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92,
0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e,
0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771,
0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0,
0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def,
0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0,
0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7,
0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e,
0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58,
0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285,
0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca,
0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce,
0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81,
0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c,
0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a,
0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3,
0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4,
0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb,
0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4,
0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75,
0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a,
0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296,
0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1,
0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808,
0x494f0c4b}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d,
0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac,
0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8,
0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95,
0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817,
0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d,
0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac,
0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6,
0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564,
0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39,
0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d,
0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac,
0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de,
0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594,
0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b,
0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01,
0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f,
0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de,
0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba,
0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65,
0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7,
0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad,
0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de,
0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294,
0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716,
0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71,
0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15,
0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4,
0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca,
0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280,
0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f,
0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15,
0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9,
0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748,
0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c,
0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971,
0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3,
0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9,
0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196,
0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc,
0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e,
0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03,
0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67,
0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296,
0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a,
0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170,
0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af,
0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5,
0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb,
0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a,
0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e,
0x4b0c4f49},
{0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09,
0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc,
0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e,
0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc,
0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934,
0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2,
0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b,
0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad,
0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155,
0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187,
0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65,
0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390,
0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e,
0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378,
0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889,
0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f,
0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0,
0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145,
0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7,
0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a,
0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2,
0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924,
0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2,
0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514,
0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec,
0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709,
0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb,
0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e,
0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1,
0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227,
0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6,
0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030,
0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0,
0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55,
0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7,
0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165,
0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d,
0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b,
0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c,
0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a,
0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362,
0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0,
0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52,
0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7,
0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237,
0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1,
0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020,
0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6,
0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719,
0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec,
0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e,
0x14d747e1},
{0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0,
0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b,
0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652,
0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437,
0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514,
0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265,
0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de,
0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af,
0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c,
0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9,
0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0,
0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b,
0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6,
0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7,
0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734,
0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045,
0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8,
0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303,
0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a,
0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9,
0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea,
0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b,
0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6,
0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7,
0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4,
0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6,
0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f,
0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054,
0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9,
0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8,
0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b,
0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a,
0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441,
0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a,
0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3,
0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6,
0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5,
0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94,
0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9,
0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288,
0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab,
0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce,
0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7,
0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c,
0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527,
0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256,
0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5,
0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4,
0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39,
0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2,
0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db,
0xaa933b1a},
{0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603,
0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d,
0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9,
0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b,
0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a,
0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792,
0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4,
0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c,
0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d,
0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f,
0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb,
0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65,
0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330,
0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8,
0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da,
0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742,
0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f,
0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1,
0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5,
0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f,
0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e,
0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6,
0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8,
0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250,
0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021,
0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb,
0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f,
0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511,
0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c,
0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4,
0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886,
0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e,
0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b,
0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5,
0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791,
0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003,
0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272,
0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea,
0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc,
0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24,
0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55,
0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7,
0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3,
0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d,
0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548,
0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0,
0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2,
0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a,
0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47,
0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9,
0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad,
0x65711936}};
#endif /* W */
#endif /* N == 3 */
#if N == 4
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a,
0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe,
0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b,
0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656,
0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd,
0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d,
0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7,
0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47,
0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac,
0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691,
0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404,
0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0,
0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4,
0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424,
0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5,
0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65,
0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67,
0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3,
0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626,
0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9,
0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222,
0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2,
0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a,
0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a,
0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1,
0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2,
0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077,
0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3,
0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1,
0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621,
0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0,
0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60,
0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0,
0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64,
0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1,
0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc,
0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027,
0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7,
0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9,
0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79,
0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292,
0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af,
0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a,
0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee,
0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e,
0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe,
0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f,
0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff,
0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd,
0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29,
0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc,
0xe3c45916},
{0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344,
0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59,
0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e,
0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463,
0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98,
0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d,
0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3,
0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656,
0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad,
0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0,
0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397,
0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a,
0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2,
0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357,
0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8,
0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d,
0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696,
0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b,
0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc,
0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0,
0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b,
0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be,
0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811,
0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384,
0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f,
0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955,
0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362,
0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f,
0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94,
0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701,
0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe,
0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b,
0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1,
0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc,
0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b,
0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986,
0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d,
0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8,
0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4,
0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371,
0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a,
0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87,
0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0,
0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad,
0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527,
0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2,
0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d,
0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998,
0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73,
0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e,
0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59,
0xa7520488},
{0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20,
0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09,
0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431,
0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a,
0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203,
0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b,
0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14,
0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c,
0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25,
0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e,
0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36,
0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f,
0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649,
0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961,
0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58,
0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170,
0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b,
0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742,
0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a,
0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55,
0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c,
0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64,
0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f,
0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77,
0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e,
0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a,
0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2,
0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b,
0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090,
0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8,
0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881,
0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9,
0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6,
0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f,
0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7,
0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c,
0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695,
0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd,
0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb,
0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3,
0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa,
0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1,
0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9,
0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0,
0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df,
0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7,
0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace,
0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6,
0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd,
0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4,
0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec,
0x3522e9e4},
{0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1,
0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86,
0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b,
0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669,
0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7,
0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352,
0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03,
0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6,
0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38,
0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a,
0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7,
0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80,
0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7,
0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522,
0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d,
0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8,
0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103,
0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54,
0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9,
0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0,
0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e,
0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb,
0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1,
0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624,
0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea,
0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a,
0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37,
0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360,
0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab,
0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e,
0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741,
0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4,
0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334,
0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63,
0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de,
0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c,
0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942,
0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7,
0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131,
0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4,
0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a,
0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758,
0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5,
0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2,
0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32,
0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7,
0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8,
0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d,
0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6,
0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1,
0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c,
0x97411e28},
{0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474,
0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5,
0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6,
0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7,
0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938,
0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051,
0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a,
0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3,
0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c,
0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d,
0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e,
0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf,
0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740,
0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29,
0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592,
0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb,
0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4,
0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365,
0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036,
0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7,
0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08,
0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561,
0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a,
0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663,
0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac,
0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d,
0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce,
0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f,
0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50,
0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639,
0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82,
0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb,
0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954,
0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5,
0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86,
0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7,
0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418,
0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71,
0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa,
0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93,
0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c,
0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d,
0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e,
0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df,
0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60,
0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309,
0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2,
0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db,
0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4,
0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45,
0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16,
0x93c7a00b},
{0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45,
0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb,
0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d,
0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696,
0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf,
0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb,
0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028,
0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c,
0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65,
0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be,
0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038,
0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6,
0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15,
0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11,
0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d,
0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19,
0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05,
0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b,
0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d,
0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c,
0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35,
0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31,
0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068,
0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c,
0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25,
0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a,
0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac,
0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22,
0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e,
0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a,
0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36,
0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32,
0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84,
0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a,
0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c,
0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057,
0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e,
0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a,
0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc,
0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8,
0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1,
0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a,
0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec,
0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62,
0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4,
0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0,
0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc,
0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8,
0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4,
0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a,
0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc,
0xce5f968d},
{0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de,
0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b,
0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d,
0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680,
0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4,
0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d,
0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde,
0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97,
0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3,
0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e,
0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678,
0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d,
0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723,
0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a,
0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0,
0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9,
0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85,
0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770,
0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56,
0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a,
0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e,
0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67,
0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785,
0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc,
0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788,
0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90,
0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6,
0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843,
0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f,
0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336,
0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac,
0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5,
0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68,
0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d,
0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb,
0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36,
0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72,
0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b,
0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b,
0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402,
0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446,
0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb,
0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed,
0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418,
0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95,
0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc,
0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946,
0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f,
0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233,
0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6,
0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0,
0x3e721277},
{0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb,
0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9,
0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11,
0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d,
0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9,
0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c,
0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881,
0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274,
0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790,
0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc,
0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514,
0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56,
0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9,
0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c,
0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13,
0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6,
0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c,
0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e,
0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386,
0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376,
0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692,
0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67,
0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416,
0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3,
0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07,
0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd,
0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15,
0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457,
0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd,
0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28,
0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337,
0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2,
0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594,
0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6,
0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e,
0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52,
0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6,
0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143,
0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17,
0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2,
0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306,
0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a,
0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182,
0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0,
0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496,
0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63,
0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c,
0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89,
0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903,
0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041,
0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9,
0x1c65ace7}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000,
0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000,
0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000,
0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000,
0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000,
0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000,
0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000,
0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000,
0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000,
0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000,
0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000,
0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000,
0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000,
0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000,
0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000,
0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000,
0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000,
0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000,
0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000,
0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000,
0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000,
0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000,
0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000,
0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000,
0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000,
0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000,
0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000,
0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000,
0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000,
0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000,
0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000,
0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000,
0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000,
0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000,
0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000,
0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000,
0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000,
0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000,
0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000,
0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000,
0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000,
0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000,
0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000,
0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000,
0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000,
0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000,
0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000,
0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000,
0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000,
0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000,
0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000,
0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000,
0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000,
0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000,
0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000,
0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000,
0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000,
0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000,
0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000,
0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000,
0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000,
0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000,
0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000,
0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000,
0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000,
0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000,
0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000,
0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000,
0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000,
0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000,
0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000,
0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000,
0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000,
0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000,
0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000,
0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000,
0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000,
0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000,
0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000,
0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000,
0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000,
0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000,
0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000,
0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000,
0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000,
0xe7ac651c00000000},
{0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000,
0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000,
0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000,
0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000,
0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000,
0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000,
0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000,
0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000,
0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000,
0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000,
0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000,
0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000,
0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000,
0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000,
0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000,
0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000,
0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000,
0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000,
0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000,
0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000,
0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000,
0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000,
0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000,
0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000,
0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000,
0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000,
0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000,
0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000,
0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000,
0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000,
0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000,
0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000,
0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000,
0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000,
0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000,
0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000,
0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000,
0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000,
0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000,
0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000,
0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000,
0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000,
0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000,
0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000,
0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000,
0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000,
0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000,
0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000,
0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000,
0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000,
0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000,
0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000,
0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000,
0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000,
0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000,
0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000,
0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000,
0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000,
0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000,
0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000,
0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000,
0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000,
0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000,
0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000,
0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000,
0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000,
0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000,
0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000,
0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000,
0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000,
0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000,
0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000,
0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000,
0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000,
0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000,
0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000,
0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000,
0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000,
0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000,
0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000,
0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000,
0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000,
0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000,
0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000,
0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000,
0x7712723e00000000},
{0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000,
0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000,
0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000,
0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000,
0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000,
0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000,
0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000,
0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000,
0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000,
0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000,
0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000,
0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000,
0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000,
0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000,
0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000,
0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000,
0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000,
0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000,
0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000,
0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000,
0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000,
0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000,
0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000,
0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000,
0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000,
0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000,
0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000,
0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000,
0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000,
0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000,
0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000,
0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000,
0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000,
0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000,
0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000,
0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000,
0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000,
0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000,
0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000,
0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000,
0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000,
0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000,
0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000,
0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000,
0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000,
0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000,
0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000,
0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000,
0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000,
0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000,
0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000,
0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000,
0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000,
0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000,
0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000,
0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000,
0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000,
0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000,
0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000,
0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000,
0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000,
0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000,
0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000,
0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000,
0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000,
0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000,
0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000,
0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000,
0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000,
0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000,
0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000,
0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000,
0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000,
0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000,
0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000,
0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000,
0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000,
0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000,
0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000,
0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000,
0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000,
0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000,
0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000,
0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000,
0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000,
0x8d965fce00000000},
{0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000,
0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000,
0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000,
0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000,
0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000,
0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000,
0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000,
0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000,
0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000,
0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000,
0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000,
0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000,
0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000,
0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000,
0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000,
0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000,
0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000,
0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000,
0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000,
0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000,
0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000,
0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000,
0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000,
0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000,
0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000,
0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000,
0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000,
0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000,
0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000,
0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000,
0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000,
0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000,
0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000,
0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000,
0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000,
0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000,
0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000,
0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000,
0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000,
0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000,
0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000,
0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000,
0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000,
0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000,
0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000,
0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000,
0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000,
0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000,
0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000,
0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000,
0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000,
0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000,
0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000,
0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000,
0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000,
0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000,
0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000,
0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000,
0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000,
0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000,
0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000,
0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000,
0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000,
0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000,
0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000,
0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000,
0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000,
0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000,
0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000,
0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000,
0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000,
0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000,
0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000,
0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000,
0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000,
0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000,
0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000,
0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000,
0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000,
0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000,
0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000,
0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000,
0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000,
0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000,
0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000,
0x0ba0c79300000000},
{0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000,
0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000,
0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000,
0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000,
0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000,
0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000,
0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000,
0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000,
0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000,
0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000,
0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000,
0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000,
0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000,
0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000,
0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000,
0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000,
0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000,
0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000,
0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000,
0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000,
0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000,
0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000,
0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000,
0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000,
0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000,
0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000,
0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000,
0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000,
0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000,
0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000,
0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000,
0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000,
0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000,
0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000,
0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000,
0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000,
0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000,
0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000,
0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000,
0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000,
0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000,
0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000,
0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000,
0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000,
0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000,
0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000,
0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000,
0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000,
0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000,
0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000,
0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000,
0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000,
0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000,
0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000,
0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000,
0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000,
0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000,
0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000,
0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000,
0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000,
0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000,
0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000,
0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000,
0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000,
0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000,
0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000,
0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000,
0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000,
0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000,
0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000,
0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000,
0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000,
0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000,
0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000,
0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000,
0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000,
0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000,
0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000,
0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000,
0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000,
0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000,
0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000,
0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000,
0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000,
0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000,
0x281e419700000000},
{0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000,
0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000,
0x304a428900000000, 0x38a922b500000000, 0x011e763800000000,
0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000,
0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000,
0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000,
0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000,
0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000,
0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000,
0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000,
0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000,
0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000,
0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000,
0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000,
0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000,
0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000,
0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000,
0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000,
0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000,
0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000,
0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000,
0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000,
0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000,
0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000,
0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000,
0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000,
0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000,
0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000,
0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000,
0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000,
0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000,
0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000,
0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000,
0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000,
0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000,
0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000,
0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000,
0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000,
0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000,
0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000,
0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000,
0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000,
0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000,
0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000,
0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000,
0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000,
0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000,
0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000,
0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000,
0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000,
0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000,
0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000,
0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000,
0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000,
0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000,
0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000,
0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000,
0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000,
0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000,
0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000,
0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000,
0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000,
0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000,
0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000,
0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000,
0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000,
0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000,
0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000,
0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000,
0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000,
0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000,
0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000,
0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000,
0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000,
0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000,
0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000,
0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000,
0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000,
0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000,
0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000,
0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000,
0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000,
0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000,
0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000,
0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000,
0xe4e9223500000000},
{0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000,
0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000,
0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000,
0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000,
0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000,
0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000,
0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000,
0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000,
0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000,
0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000,
0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000,
0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000,
0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000,
0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000,
0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000,
0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000,
0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000,
0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000,
0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000,
0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000,
0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000,
0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000,
0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000,
0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000,
0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000,
0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000,
0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000,
0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000,
0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000,
0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000,
0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000,
0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000,
0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000,
0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000,
0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000,
0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000,
0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000,
0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000,
0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000,
0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000,
0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000,
0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000,
0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000,
0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000,
0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000,
0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000,
0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000,
0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000,
0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000,
0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000,
0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000,
0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000,
0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000,
0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000,
0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000,
0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000,
0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000,
0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000,
0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000,
0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000,
0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000,
0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000,
0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000,
0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000,
0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000,
0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000,
0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000,
0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000,
0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000,
0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000,
0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000,
0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000,
0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000,
0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000,
0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000,
0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000,
0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000,
0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000,
0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000,
0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000,
0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000,
0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000,
0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000,
0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000,
0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000,
0x880452a700000000},
{0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000,
0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000,
0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000,
0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000,
0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000,
0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000,
0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000,
0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000,
0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000,
0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000,
0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000,
0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000,
0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000,
0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000,
0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000,
0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000,
0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000,
0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000,
0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000,
0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000,
0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000,
0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000,
0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000,
0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000,
0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000,
0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000,
0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000,
0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000,
0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000,
0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000,
0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000,
0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000,
0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000,
0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000,
0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000,
0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000,
0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000,
0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000,
0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000,
0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000,
0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000,
0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000,
0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000,
0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000,
0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000,
0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000,
0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000,
0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000,
0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000,
0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000,
0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000,
0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000,
0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000,
0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000,
0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000,
0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000,
0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000,
0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000,
0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000,
0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000,
0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000,
0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000,
0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000,
0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000,
0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000,
0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000,
0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000,
0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000,
0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000,
0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000,
0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000,
0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000,
0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000,
0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000,
0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000,
0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000,
0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000,
0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000,
0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000,
0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000,
0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000,
0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000,
0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000,
0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000,
0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000,
0x1659c4e300000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87,
0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede,
0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab,
0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c,
0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1,
0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7,
0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e,
0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308,
0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5,
0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472,
0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07,
0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e,
0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa,
0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec,
0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6,
0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0,
0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3,
0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba,
0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf,
0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975,
0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8,
0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde,
0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a,
0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c,
0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1,
0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65,
0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410,
0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649,
0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a,
0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c,
0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946,
0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450,
0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e,
0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857,
0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022,
0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5,
0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758,
0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e,
0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d,
0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b,
0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6,
0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401,
0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74,
0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d,
0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073,
0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65,
0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f,
0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749,
0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a,
0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033,
0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846,
0x0d7139d7},
{0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563,
0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f,
0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875,
0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536,
0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8,
0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43,
0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f,
0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184,
0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a,
0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39,
0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523,
0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f,
0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d,
0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6,
0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b,
0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0,
0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151,
0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d,
0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47,
0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a,
0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964,
0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef,
0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d,
0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6,
0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348,
0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53,
0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449,
0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645,
0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4,
0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f,
0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2,
0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69,
0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46,
0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a,
0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650,
0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13,
0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded,
0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366,
0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57,
0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc,
0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222,
0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61,
0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b,
0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277,
0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558,
0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3,
0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e,
0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5,
0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74,
0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78,
0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262,
0x1c53e98a},
{0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b,
0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40,
0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580,
0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7,
0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a,
0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37,
0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75,
0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218,
0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5,
0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2,
0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02,
0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59,
0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1,
0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c,
0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a,
0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307,
0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486,
0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd,
0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d,
0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2,
0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f,
0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72,
0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8,
0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985,
0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268,
0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94,
0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454,
0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f,
0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e,
0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3,
0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915,
0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778,
0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821,
0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a,
0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba,
0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d,
0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560,
0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d,
0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe,
0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3,
0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e,
0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509,
0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9,
0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92,
0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb,
0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6,
0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50,
0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d,
0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc,
0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7,
0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927,
0x3f88e851},
{0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96,
0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8,
0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0,
0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14,
0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7,
0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4,
0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe,
0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad,
0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e,
0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa,
0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2,
0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c,
0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab,
0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8,
0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d,
0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e,
0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7,
0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99,
0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1,
0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690,
0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933,
0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20,
0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf,
0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc,
0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f,
0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92,
0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca,
0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4,
0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd,
0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de,
0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb,
0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8,
0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474,
0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a,
0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252,
0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6,
0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55,
0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846,
0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7,
0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4,
0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47,
0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3,
0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb,
0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5,
0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49,
0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a,
0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f,
0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c,
0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305,
0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b,
0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523,
0x3dee8ca6}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0,
0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587,
0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa,
0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09,
0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee,
0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3,
0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3,
0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce,
0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429,
0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda,
0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7,
0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0,
0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd,
0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0,
0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287,
0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a,
0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9,
0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e,
0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3,
0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3,
0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054,
0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49,
0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da,
0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7,
0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20,
0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d,
0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00,
0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347,
0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14,
0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209,
0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e,
0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33,
0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3,
0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194,
0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9,
0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a,
0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd,
0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0,
0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d,
0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460,
0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87,
0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674,
0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509,
0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e,
0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae,
0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3,
0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694,
0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989,
0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da,
0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d,
0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0,
0xa68cee3d},
{0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19,
0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae,
0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb,
0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a,
0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55,
0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1,
0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c,
0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8,
0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7,
0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936,
0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453,
0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4,
0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941,
0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5,
0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93,
0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17,
0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e,
0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89,
0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec,
0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0,
0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf,
0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b,
0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b,
0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f,
0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0,
0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e,
0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b,
0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc,
0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5,
0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261,
0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637,
0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3,
0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57,
0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0,
0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85,
0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454,
0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b,
0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f,
0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423,
0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7,
0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8,
0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739,
0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c,
0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb,
0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f,
0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b,
0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd,
0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59,
0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070,
0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7,
0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2,
0x51e8883f},
{0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a,
0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276,
0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed,
0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55,
0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b,
0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8,
0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320,
0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413,
0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd,
0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75,
0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee,
0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312,
0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca,
0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9,
0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad,
0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e,
0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504,
0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8,
0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63,
0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353,
0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d,
0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be,
0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae,
0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d,
0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943,
0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7,
0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c,
0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390,
0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a,
0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239,
0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d,
0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e,
0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c,
0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0,
0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b,
0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93,
0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d,
0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e,
0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c,
0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f,
0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1,
0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579,
0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2,
0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e,
0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c,
0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f,
0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b,
0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158,
0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2,
0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e,
0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5,
0x8ae9531c},
{0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4,
0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd,
0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220,
0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf,
0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495,
0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def,
0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90,
0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea,
0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0,
0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f,
0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2,
0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab,
0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e,
0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754,
0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda,
0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0,
0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c,
0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215,
0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8,
0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910,
0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a,
0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30,
0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658,
0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22,
0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478,
0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2,
0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f,
0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606,
0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba,
0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0,
0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e,
0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034,
0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f,
0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996,
0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b,
0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84,
0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de,
0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4,
0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5,
0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f,
0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5,
0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a,
0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7,
0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce,
0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65,
0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f,
0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91,
0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb,
0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57,
0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e,
0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3,
0xd739710d}};
#endif /* W */
#endif /* N == 4 */
#if N == 5
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df,
0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8,
0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef,
0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376,
0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201,
0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399,
0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372,
0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea,
0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d,
0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004,
0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353,
0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334,
0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a,
0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2,
0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a,
0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2,
0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b,
0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c,
0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b,
0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f,
0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338,
0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0,
0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6,
0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e,
0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319,
0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3,
0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4,
0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783,
0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a,
0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492,
0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a,
0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2,
0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496,
0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1,
0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6,
0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f,
0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548,
0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0,
0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741,
0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9,
0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae,
0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437,
0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760,
0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707,
0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433,
0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab,
0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703,
0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b,
0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412,
0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475,
0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722,
0xe9947565},
{0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5,
0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22,
0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c,
0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed,
0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d,
0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1,
0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e,
0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32,
0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142,
0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93,
0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d,
0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a,
0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58,
0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14,
0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81,
0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd,
0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab,
0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c,
0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72,
0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f,
0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff,
0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3,
0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30,
0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c,
0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c,
0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558,
0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146,
0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581,
0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7,
0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab,
0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e,
0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272,
0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838,
0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff,
0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1,
0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330,
0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840,
0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c,
0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb,
0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7,
0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7,
0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616,
0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208,
0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf,
0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85,
0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9,
0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c,
0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10,
0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76,
0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1,
0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf,
0xf7d05006},
{0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b,
0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774,
0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58,
0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a,
0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb,
0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952,
0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e,
0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7,
0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746,
0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14,
0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338,
0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907,
0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777,
0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de,
0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064,
0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd,
0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951,
0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e,
0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42,
0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b,
0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a,
0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3,
0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904,
0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad,
0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c,
0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d,
0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861,
0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e,
0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2,
0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b,
0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1,
0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78,
0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f,
0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40,
0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c,
0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e,
0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf,
0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166,
0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d,
0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4,
0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805,
0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157,
0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b,
0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644,
0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43,
0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea,
0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850,
0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9,
0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165,
0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a,
0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676,
0xb2075b94},
{0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf,
0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61,
0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be,
0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd,
0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3,
0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063,
0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105,
0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5,
0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb,
0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8,
0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07,
0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9,
0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5,
0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515,
0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4,
0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014,
0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7,
0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269,
0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6,
0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af,
0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1,
0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111,
0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d,
0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad,
0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3,
0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75,
0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa,
0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74,
0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7,
0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477,
0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6,
0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176,
0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af,
0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71,
0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae,
0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd,
0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3,
0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073,
0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0,
0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400,
0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e,
0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d,
0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2,
0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c,
0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5,
0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505,
0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4,
0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004,
0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7,
0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279,
0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6,
0xba50bcb9},
{0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897,
0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb,
0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2,
0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2,
0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372,
0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70,
0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92,
0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190,
0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40,
0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430,
0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759,
0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75,
0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2,
0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0,
0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7,
0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5,
0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39,
0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215,
0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c,
0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5,
0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625,
0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27,
0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c,
0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e,
0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee,
0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71,
0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18,
0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134,
0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8,
0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba,
0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd,
0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff,
0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a,
0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6,
0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf,
0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf,
0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f,
0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d,
0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d,
0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f,
0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af,
0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df,
0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6,
0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a,
0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef,
0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed,
0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa,
0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8,
0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624,
0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08,
0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861,
0x808abcf4},
{0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2,
0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd,
0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76,
0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52,
0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e,
0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124,
0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147,
0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d,
0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31,
0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15,
0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae,
0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1,
0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d,
0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307,
0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9,
0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3,
0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084,
0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb,
0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850,
0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2,
0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe,
0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94,
0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261,
0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b,
0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917,
0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53,
0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8,
0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787,
0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0,
0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba,
0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404,
0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e,
0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af,
0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0,
0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b,
0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f,
0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543,
0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129,
0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627,
0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d,
0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51,
0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75,
0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce,
0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1,
0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760,
0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a,
0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4,
0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde,
0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089,
0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6,
0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d,
0xefdb3f95},
{0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8,
0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7,
0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945,
0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9,
0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652,
0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc,
0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a,
0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4,
0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f,
0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3,
0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51,
0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e,
0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c,
0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362,
0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11,
0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff,
0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7,
0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8,
0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a,
0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690,
0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b,
0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5,
0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05,
0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb,
0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740,
0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f,
0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded,
0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2,
0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa,
0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714,
0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67,
0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89,
0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7,
0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8,
0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a,
0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6,
0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d,
0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3,
0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9,
0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57,
0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc,
0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540,
0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2,
0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd,
0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93,
0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d,
0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e,
0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0,
0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8,
0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7,
0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75,
0x0e2fbf43},
{0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc,
0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a,
0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3,
0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7,
0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b,
0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154,
0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3,
0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc,
0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330,
0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264,
0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd,
0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b,
0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a,
0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175,
0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275,
0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a,
0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234,
0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2,
0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b,
0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a,
0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6,
0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189,
0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b,
0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204,
0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8,
0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226,
0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff,
0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219,
0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167,
0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258,
0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158,
0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267,
0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c,
0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da,
0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003,
0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157,
0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b,
0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4,
0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179,
0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246,
0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a,
0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de,
0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107,
0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1,
0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba,
0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285,
0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185,
0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba,
0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4,
0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322,
0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb,
0xf4377108}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000,
0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000,
0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000,
0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000,
0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000,
0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000,
0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000,
0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000,
0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000,
0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000,
0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000,
0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000,
0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000,
0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000,
0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000,
0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000,
0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000,
0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000,
0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000,
0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000,
0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000,
0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000,
0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000,
0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000,
0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000,
0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000,
0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000,
0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000,
0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000,
0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000,
0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000,
0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000,
0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000,
0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000,
0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000,
0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000,
0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000,
0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000,
0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000,
0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000,
0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000,
0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000,
0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000,
0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000,
0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000,
0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000,
0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000,
0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000,
0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000,
0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000,
0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000,
0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000,
0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000,
0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000,
0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000,
0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000,
0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000,
0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000,
0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000,
0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000,
0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000,
0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000,
0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000,
0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000,
0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000,
0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000,
0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000,
0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000,
0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000,
0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000,
0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000,
0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000,
0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000,
0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000,
0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000,
0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000,
0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000,
0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000,
0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000,
0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000,
0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000,
0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000,
0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000,
0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000,
0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000,
0x087137f400000000},
{0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000,
0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000,
0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000,
0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000,
0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000,
0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000,
0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000,
0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000,
0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000,
0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000,
0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000,
0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000,
0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000,
0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000,
0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000,
0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000,
0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000,
0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000,
0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000,
0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000,
0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000,
0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000,
0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000,
0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000,
0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000,
0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000,
0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000,
0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000,
0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000,
0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000,
0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000,
0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000,
0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000,
0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000,
0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000,
0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000,
0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000,
0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000,
0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000,
0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000,
0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000,
0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000,
0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000,
0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000,
0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000,
0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000,
0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000,
0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000,
0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000,
0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000,
0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000,
0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000,
0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000,
0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000,
0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000,
0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000,
0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000,
0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000,
0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000,
0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000,
0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000,
0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000,
0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000,
0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000,
0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000,
0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000,
0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000,
0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000,
0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000,
0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000,
0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000,
0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000,
0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000,
0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000,
0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000,
0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000,
0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000,
0x1129fad400000000, 0x621116d400000000, 0x544094f000000000,
0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000,
0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000,
0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000,
0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000,
0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000,
0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000,
0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000,
0x43bf2f0e00000000},
{0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000,
0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000,
0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000,
0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000,
0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000,
0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000,
0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000,
0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000,
0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000,
0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000,
0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000,
0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000,
0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000,
0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000,
0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000,
0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000,
0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000,
0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000,
0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000,
0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000,
0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000,
0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000,
0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000,
0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000,
0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000,
0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000,
0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000,
0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000,
0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000,
0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000,
0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000,
0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000,
0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000,
0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000,
0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000,
0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000,
0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000,
0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000,
0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000,
0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000,
0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000,
0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000,
0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000,
0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000,
0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000,
0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000,
0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000,
0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000,
0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000,
0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000,
0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000,
0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000,
0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000,
0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000,
0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000,
0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000,
0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000,
0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000,
0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000,
0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000,
0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000,
0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000,
0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000,
0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000,
0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000,
0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000,
0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000,
0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000,
0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000,
0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000,
0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000,
0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000,
0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000,
0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000,
0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000,
0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000,
0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000,
0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000,
0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000,
0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000,
0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000,
0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000,
0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000,
0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000,
0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000,
0x953fdbef00000000},
{0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000,
0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000,
0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000,
0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000,
0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000,
0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000,
0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000,
0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000,
0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000,
0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000,
0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000,
0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000,
0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000,
0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000,
0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000,
0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000,
0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000,
0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000,
0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000,
0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000,
0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000,
0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000,
0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000,
0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000,
0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000,
0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000,
0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000,
0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000,
0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000,
0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000,
0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000,
0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000,
0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000,
0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000,
0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000,
0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000,
0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000,
0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000,
0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000,
0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000,
0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000,
0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000,
0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000,
0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000,
0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000,
0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000,
0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000,
0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000,
0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000,
0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000,
0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000,
0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000,
0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000,
0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000,
0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000,
0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000,
0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000,
0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000,
0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000,
0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000,
0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000,
0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000,
0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000,
0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000,
0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000,
0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000,
0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000,
0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000,
0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000,
0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000,
0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000,
0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000,
0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000,
0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000,
0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000,
0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000,
0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000,
0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000,
0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000,
0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000,
0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000,
0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000,
0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000,
0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000,
0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000,
0xf4bc8a8000000000},
{0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000,
0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000,
0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000,
0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000,
0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000,
0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000,
0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000,
0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000,
0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000,
0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000,
0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000,
0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000,
0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000,
0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000,
0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000,
0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000,
0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000,
0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000,
0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000,
0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000,
0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000,
0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000,
0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000,
0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000,
0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000,
0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000,
0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000,
0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000,
0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000,
0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000,
0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000,
0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000,
0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000,
0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000,
0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000,
0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000,
0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000,
0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000,
0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000,
0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000,
0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000,
0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000,
0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000,
0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000,
0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000,
0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000,
0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000,
0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000,
0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000,
0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000,
0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000,
0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000,
0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000,
0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000,
0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000,
0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000,
0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000,
0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000,
0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000,
0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000,
0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000,
0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000,
0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000,
0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000,
0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000,
0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000,
0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000,
0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000,
0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000,
0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000,
0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000,
0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000,
0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000,
0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000,
0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000,
0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000,
0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000,
0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000,
0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000,
0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000,
0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000,
0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000,
0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000,
0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000,
0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000,
0xb9bc50ba00000000},
{0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000,
0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000,
0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000,
0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000,
0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000,
0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000,
0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000,
0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000,
0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000,
0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000,
0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000,
0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000,
0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000,
0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000,
0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000,
0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000,
0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000,
0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000,
0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000,
0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000,
0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000,
0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000,
0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000,
0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000,
0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000,
0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000,
0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000,
0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000,
0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000,
0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000,
0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000,
0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000,
0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000,
0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000,
0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000,
0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000,
0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000,
0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000,
0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000,
0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000,
0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000,
0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000,
0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000,
0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000,
0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000,
0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000,
0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000,
0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000,
0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000,
0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000,
0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000,
0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000,
0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000,
0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000,
0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000,
0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000,
0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000,
0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000,
0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000,
0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000,
0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000,
0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000,
0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000,
0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000,
0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000,
0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000,
0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000,
0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000,
0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000,
0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000,
0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000,
0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000,
0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000,
0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000,
0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000,
0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000,
0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000,
0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000,
0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000,
0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000,
0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000,
0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000,
0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000,
0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000,
0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000,
0x945b07b200000000},
{0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000,
0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000,
0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000,
0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000,
0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000,
0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000,
0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000,
0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000,
0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000,
0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000,
0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000,
0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000,
0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000,
0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000,
0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000,
0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000,
0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000,
0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000,
0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000,
0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000,
0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000,
0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000,
0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000,
0x149f066100000000, 0xef839db200000000, 0x468814fc00000000,
0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000,
0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000,
0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000,
0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000,
0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000,
0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000,
0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000,
0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000,
0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000,
0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000,
0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000,
0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000,
0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000,
0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000,
0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000,
0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000,
0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000,
0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000,
0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000,
0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000,
0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000,
0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000,
0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000,
0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000,
0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000,
0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000,
0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000,
0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000,
0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000,
0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000,
0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000,
0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000,
0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000,
0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000,
0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000,
0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000,
0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000,
0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000,
0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000,
0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000,
0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000,
0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000,
0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000,
0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000,
0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000,
0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000,
0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000,
0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000,
0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000,
0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000,
0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000,
0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000,
0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000,
0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000,
0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000,
0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000,
0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000,
0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000,
0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000,
0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000,
0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000,
0x0650d0f700000000},
{0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000,
0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000,
0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000,
0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000,
0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000,
0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000,
0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000,
0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000,
0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000,
0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000,
0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000,
0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000,
0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000,
0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000,
0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000,
0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000,
0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000,
0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000,
0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000,
0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000,
0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000,
0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000,
0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000,
0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000,
0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000,
0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000,
0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000,
0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000,
0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000,
0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000,
0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000,
0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000,
0xc702c15700000000, 0x809085f800000000, 0x082039d200000000,
0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000,
0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000,
0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000,
0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000,
0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000,
0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000,
0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000,
0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000,
0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000,
0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000,
0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000,
0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000,
0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000,
0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000,
0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000,
0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000,
0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000,
0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000,
0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000,
0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000,
0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000,
0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000,
0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000,
0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000,
0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000,
0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000,
0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000,
0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000,
0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000,
0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000,
0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000,
0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000,
0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000,
0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000,
0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000,
0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000,
0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000,
0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000,
0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000,
0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000,
0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000,
0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000,
0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000,
0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000,
0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000,
0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000,
0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000,
0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000,
0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000,
0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000,
0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000,
0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000,
0x657594e900000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59,
0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4,
0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67,
0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef,
0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97,
0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88,
0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687,
0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698,
0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0,
0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068,
0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb,
0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056,
0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016,
0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009,
0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028,
0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037,
0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a,
0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7,
0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054,
0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7,
0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af,
0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0,
0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4,
0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab,
0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3,
0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a,
0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9,
0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54,
0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09,
0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16,
0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37,
0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28,
0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e,
0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3,
0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40,
0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8,
0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0,
0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf,
0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6,
0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9,
0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1,
0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059,
0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca,
0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067,
0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031,
0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e,
0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f,
0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010,
0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d,
0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0,
0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073,
0xd8ac6b35},
{0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2,
0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd,
0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696,
0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3,
0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f,
0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35,
0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5,
0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f,
0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673,
0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46,
0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d,
0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632,
0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28,
0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192,
0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c,
0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6,
0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0,
0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff,
0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4,
0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95,
0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9,
0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03,
0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7,
0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d,
0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151,
0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808,
0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343,
0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c,
0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a,
0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0,
0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e,
0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594,
0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6,
0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399,
0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2,
0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7,
0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb,
0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571,
0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289,
0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33,
0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f,
0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a,
0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461,
0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e,
0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c,
0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6,
0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918,
0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2,
0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484,
0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb,
0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0,
0xa140efa8},
{0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706,
0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed,
0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289,
0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a,
0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214,
0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3,
0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3,
0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254,
0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a,
0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9,
0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad,
0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746,
0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060,
0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187,
0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef,
0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408,
0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e,
0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495,
0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1,
0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532,
0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c,
0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb,
0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb,
0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c,
0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42,
0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060,
0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04,
0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef,
0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99,
0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e,
0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16,
0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1,
0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7,
0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c,
0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38,
0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb,
0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5,
0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42,
0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62,
0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85,
0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb,
0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18,
0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c,
0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997,
0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1,
0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36,
0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e,
0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9,
0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf,
0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24,
0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040,
0x917cd6a1},
{0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf,
0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd,
0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896,
0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9,
0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3,
0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f,
0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d,
0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1,
0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab,
0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4,
0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f,
0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d,
0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4,
0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978,
0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad,
0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621,
0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46,
0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854,
0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f,
0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a,
0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890,
0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c,
0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4,
0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238,
0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622,
0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab,
0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0,
0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2,
0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295,
0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19,
0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc,
0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140,
0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd,
0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf,
0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184,
0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb,
0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1,
0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d,
0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb,
0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257,
0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d,
0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22,
0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069,
0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b,
0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6,
0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a,
0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf,
0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33,
0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254,
0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146,
0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d,
0x18ba364e}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873,
0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661,
0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441,
0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44,
0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1,
0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05,
0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa,
0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e,
0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb,
0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be,
0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e,
0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c,
0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d,
0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9,
0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f,
0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b,
0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39,
0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b,
0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b,
0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20,
0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595,
0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61,
0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0,
0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644,
0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1,
0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d,
0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d,
0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f,
0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad,
0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359,
0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f,
0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b,
0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7,
0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5,
0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5,
0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0,
0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65,
0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091,
0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633,
0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7,
0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272,
0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77,
0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57,
0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145,
0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9,
0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d,
0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb,
0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f,
0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad,
0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf,
0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f,
0x4e36ba18},
{0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b,
0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8,
0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19,
0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4,
0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239,
0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd,
0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258,
0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc,
0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41,
0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c,
0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d,
0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e,
0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba,
0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e,
0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8,
0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c,
0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f,
0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c,
0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d,
0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d,
0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0,
0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014,
0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc,
0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628,
0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5,
0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941,
0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0,
0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53,
0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880,
0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264,
0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92,
0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776,
0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8,
0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b,
0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea,
0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837,
0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca,
0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e,
0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211,
0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5,
0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08,
0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5,
0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934,
0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7,
0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049,
0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad,
0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b,
0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf,
0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c,
0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f,
0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e,
0xa1d67c91},
{0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9,
0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de,
0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94,
0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0,
0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a,
0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924,
0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052,
0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c,
0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6,
0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2,
0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8,
0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f,
0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d,
0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273,
0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30,
0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e,
0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7,
0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980,
0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca,
0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8,
0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62,
0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c,
0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c,
0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032,
0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798,
0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d,
0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07,
0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630,
0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389,
0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7,
0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4,
0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca,
0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55,
0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662,
0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828,
0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c,
0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6,
0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98,
0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3,
0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d,
0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037,
0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913,
0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759,
0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e,
0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1,
0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf,
0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c,
0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2,
0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b,
0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c,
0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276,
0xa8ef40a1},
{0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e,
0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8,
0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819,
0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f,
0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d,
0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756,
0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0,
0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb,
0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9,
0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f,
0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e,
0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8,
0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835,
0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e,
0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62,
0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749,
0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b,
0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d,
0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc,
0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80,
0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2,
0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599,
0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05,
0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e,
0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c,
0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e,
0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef,
0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359,
0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b,
0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0,
0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc,
0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7,
0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f,
0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189,
0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568,
0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e,
0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c,
0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27,
0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794,
0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf,
0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d,
0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db,
0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a,
0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c,
0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544,
0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f,
0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013,
0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38,
0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea,
0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c,
0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd,
0x356bacd8}};
#endif /* W */
#endif /* N == 5 */
#if N == 6
#if W == 8
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370,
0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d,
0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69,
0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426,
0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3,
0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f,
0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c,
0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490,
0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155,
0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a,
0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e,
0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603,
0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349,
0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5,
0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50,
0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc,
0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b,
0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76,
0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862,
0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9,
0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c,
0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0,
0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937,
0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b,
0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e,
0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e,
0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a,
0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357,
0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0,
0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c,
0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9,
0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165,
0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766,
0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b,
0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f,
0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030,
0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5,
0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59,
0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63,
0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf,
0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a,
0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845,
0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51,
0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c,
0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f,
0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3,
0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46,
0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea,
0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d,
0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60,
0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74,
0x8568a0a8},
{0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5,
0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf,
0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5,
0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba,
0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf,
0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f,
0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0,
0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450,
0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55,
0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a,
0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620,
0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a,
0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454,
0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4,
0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534,
0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584,
0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694,
0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e,
0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4,
0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1,
0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4,
0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164,
0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1,
0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911,
0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314,
0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c,
0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6,
0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec,
0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc,
0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c,
0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c,
0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c,
0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716,
0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c,
0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676,
0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879,
0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c,
0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc,
0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77,
0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7,
0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2,
0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd,
0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7,
0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad,
0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897,
0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827,
0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7,
0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947,
0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57,
0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d,
0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37,
0x0d907052},
{0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d,
0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89,
0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31,
0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81,
0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e,
0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0,
0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f,
0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291,
0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e,
0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e,
0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936,
0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2,
0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13,
0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d,
0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f,
0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1,
0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a,
0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae,
0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516,
0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f,
0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20,
0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe,
0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28,
0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6,
0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419,
0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5,
0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d,
0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889,
0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412,
0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c,
0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e,
0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0,
0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02,
0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986,
0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e,
0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e,
0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221,
0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf,
0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913,
0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d,
0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622,
0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592,
0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a,
0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae,
0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c,
0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82,
0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20,
0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe,
0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025,
0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1,
0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719,
0xfd1a6c8a},
{0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3,
0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb,
0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d,
0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb,
0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9,
0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156,
0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045,
0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa,
0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8,
0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e,
0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8,
0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0,
0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38,
0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87,
0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46,
0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9,
0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585,
0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d,
0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb,
0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531,
0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03,
0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc,
0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33,
0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c,
0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be,
0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d,
0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b,
0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303,
0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f,
0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0,
0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801,
0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe,
0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e,
0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346,
0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620,
0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776,
0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844,
0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb,
0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0,
0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f,
0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d,
0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b,
0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d,
0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75,
0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795,
0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a,
0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb,
0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354,
0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28,
0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30,
0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856,
0x7895f01a},
{0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188,
0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33,
0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d,
0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445,
0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2,
0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058,
0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43,
0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9,
0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e,
0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06,
0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228,
0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93,
0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e,
0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4,
0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b,
0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371,
0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265,
0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede,
0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0,
0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f,
0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8,
0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32,
0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae,
0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544,
0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3,
0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f,
0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911,
0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa,
0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be,
0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54,
0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b,
0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1,
0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652,
0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9,
0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7,
0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f,
0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68,
0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782,
0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797,
0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d,
0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a,
0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2,
0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc,
0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647,
0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4,
0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e,
0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41,
0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab,
0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf,
0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904,
0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a,
0x9239b848},
{0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad,
0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0,
0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40,
0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b,
0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d,
0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b,
0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb,
0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d,
0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b,
0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0,
0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840,
0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d,
0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b,
0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d,
0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6,
0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0,
0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580,
0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd,
0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d,
0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b,
0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d,
0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b,
0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6,
0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0,
0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6,
0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c,
0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c,
0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461,
0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841,
0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317,
0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac,
0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa,
0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7,
0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba,
0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a,
0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161,
0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777,
0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21,
0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a,
0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc,
0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da,
0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1,
0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01,
0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c,
0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241,
0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917,
0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac,
0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa,
0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da,
0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397,
0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537,
0xeb36d3cc},
{0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b,
0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059,
0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251,
0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d,
0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9,
0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c,
0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41,
0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4,
0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10,
0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c,
0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54,
0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476,
0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8,
0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d,
0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92,
0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307,
0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad,
0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f,
0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87,
0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17,
0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3,
0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46,
0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197,
0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02,
0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6,
0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e,
0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96,
0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4,
0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e,
0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b,
0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934,
0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1,
0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7,
0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5,
0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd,
0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1,
0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475,
0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0,
0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155,
0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0,
0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304,
0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348,
0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140,
0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862,
0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14,
0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181,
0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e,
0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab,
0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01,
0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523,
0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b,
0x38e5f3c5},
{0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06,
0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad,
0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509,
0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba,
0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414,
0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3,
0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733,
0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994,
0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a,
0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889,
0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d,
0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386,
0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621,
0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886,
0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e,
0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389,
0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f,
0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294,
0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30,
0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3,
0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d,
0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba,
0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a,
0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad,
0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03,
0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2,
0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306,
0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad,
0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b,
0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc,
0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914,
0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3,
0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435,
0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e,
0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a,
0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589,
0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27,
0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080,
0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21,
0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586,
0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28,
0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b,
0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f,
0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94,
0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12,
0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5,
0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d,
0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba,
0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c,
0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7,
0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103,
0x3d3101a2}};
static const z_word_t crc_braid_big_table[][256] = {
{0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000,
0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000,
0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000,
0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000,
0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000,
0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000,
0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000,
0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000,
0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000,
0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000,
0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000,
0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000,
0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000,
0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000,
0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000,
0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000,
0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000,
0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000,
0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000,
0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000,
0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000,
0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000,
0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000,
0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000,
0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000,
0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000,
0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000,
0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000,
0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000,
0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000,
0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000,
0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000,
0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000,
0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000,
0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000,
0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000,
0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000,
0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000,
0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000,
0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000,
0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000,
0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000,
0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000,
0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000,
0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000,
0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000,
0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000,
0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000,
0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000,
0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000,
0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000,
0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000,
0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000,
0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000,
0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000,
0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000,
0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000,
0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000,
0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000,
0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000,
0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000,
0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000,
0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000,
0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000,
0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000,
0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000,
0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000,
0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000,
0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000,
0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000,
0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000,
0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000,
0x3688267d00000000, 0x9718319500000000, 0x35af787600000000,
0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000,
0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000,
0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000,
0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000,
0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000,
0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000,
0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000,
0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000,
0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000,
0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000,
0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000,
0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000,
0xa201313d00000000},
{0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000,
0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000,
0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000,
0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000,
0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000,
0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000,
0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000,
0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000,
0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000,
0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000,
0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000,
0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000,
0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000,
0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000,
0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000,
0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000,
0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000,
0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000,
0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000,
0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000,
0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000,
0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000,
0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000,
0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000,
0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000,
0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000,
0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000,
0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000,
0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000,
0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000,
0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000,
0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000,
0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000,
0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000,
0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000,
0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000,
0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000,
0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000,
0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000,
0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000,
0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000,
0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000,
0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000,
0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000,
0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000,
0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000,
0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000,
0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000,
0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000,
0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000,
0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000,
0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000,
0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000,
0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000,
0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000,
0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000,
0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000,
0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000,
0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000,
0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000,
0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000,
0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000,
0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000,
0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000,
0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000,
0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000,
0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000,
0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000,
0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000,
0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000,
0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000,
0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000,
0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000,
0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000,
0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000,
0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000,
0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000,
0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000,
0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000,
0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000,
0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000,
0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000,
0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000,
0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000,
0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000,
0xc5f3e53800000000},
{0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000,
0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000,
0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000,
0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000,
0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000,
0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000,
0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000,
0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000,
0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000,
0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000,
0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000,
0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000,
0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000,
0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000,
0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000,
0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000,
0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000,
0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000,
0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000,
0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000,
0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000,
0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000,
0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000,
0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000,
0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000,
0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000,
0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000,
0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000,
0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000,
0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000,
0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000,
0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000,
0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000,
0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000,
0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000,
0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000,
0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000,
0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000,
0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000,
0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000,
0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000,
0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000,
0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000,
0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000,
0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000,
0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000,
0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000,
0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000,
0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000,
0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000,
0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000,
0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000,
0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000,
0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000,
0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000,
0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000,
0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000,
0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000,
0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000,
0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000,
0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000,
0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000,
0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000,
0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000,
0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000,
0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000,
0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000,
0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000,
0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000,
0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000,
0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000,
0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000,
0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000,
0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000,
0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000,
0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000,
0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000,
0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000,
0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000,
0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000,
0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000,
0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000,
0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000,
0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000,
0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000,
0xccd336eb00000000},
{0x0000000000000000, 0x6238282a00000000, 0xc470505400000000,
0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000,
0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000,
0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000,
0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000,
0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000,
0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000,
0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000,
0xb249204500000000, 0xd071086f00000000, 0x7639701100000000,
0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000,
0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000,
0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000,
0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000,
0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000,
0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000,
0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000,
0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000,
0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000,
0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000,
0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000,
0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000,
0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000,
0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000,
0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000,
0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000,
0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000,
0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000,
0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000,
0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000,
0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000,
0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000,
0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000,
0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000,
0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000,
0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000,
0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000,
0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000,
0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000,
0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000,
0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000,
0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000,
0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000,
0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000,
0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000,
0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000,
0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000,
0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000,
0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000,
0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000,
0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000,
0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000,
0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000,
0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000,
0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000,
0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000,
0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000,
0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000,
0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000,
0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000,
0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000,
0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000,
0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000,
0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000,
0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000,
0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000,
0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000,
0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000,
0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000,
0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000,
0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000,
0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000,
0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000,
0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000,
0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000,
0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000,
0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000,
0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000,
0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000,
0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000,
0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000,
0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000,
0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000,
0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000,
0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000,
0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000,
0x48b8399200000000},
{0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000,
0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000,
0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000,
0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000,
0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000,
0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000,
0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000,
0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000,
0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000,
0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000,
0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000,
0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000,
0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000,
0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000,
0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000,
0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000,
0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000,
0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000,
0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000,
0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000,
0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000,
0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000,
0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000,
0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000,
0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000,
0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000,
0xb521428400000000, 0xf909d42700000000, 0x762efede00000000,
0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000,
0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000,
0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000,
0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000,
0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000,
0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000,
0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000,
0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000,
0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000,
0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000,
0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000,
0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000,
0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000,
0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000,
0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000,
0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000,
0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000,
0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000,
0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000,
0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000,
0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000,
0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000,
0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000,
0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000,
0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000,
0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000,
0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000,
0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000,
0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000,
0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000,
0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000,
0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000,
0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000,
0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000,
0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000,
0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000,
0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000,
0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000,
0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000,
0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000,
0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000,
0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000,
0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000,
0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000,
0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000,
0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000,
0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000,
0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000,
0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000,
0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000,
0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000,
0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000,
0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000,
0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000,
0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000,
0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000,
0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000,
0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000,
0x1af0957800000000},
{0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000,
0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000,
0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000,
0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000,
0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000,
0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000,
0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000,
0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000,
0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000,
0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000,
0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000,
0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000,
0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000,
0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000,
0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000,
0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000,
0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000,
0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000,
0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000,
0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000,
0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000,
0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000,
0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000,
0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000,
0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000,
0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000,
0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000,
0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000,
0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000,
0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000,
0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000,
0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000,
0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000,
0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000,
0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000,
0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000,
0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000,
0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000,
0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000,
0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000,
0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000,
0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000,
0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000,
0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000,
0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000,
0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000,
0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000,
0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000,
0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000,
0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000,
0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000,
0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000,
0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000,
0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000,
0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000,
0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000,
0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000,
0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000,
0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000,
0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000,
0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000,
0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000,
0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000,
0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000,
0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000,
0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000,
0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000,
0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000,
0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000,
0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000,
0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000,
0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000,
0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000,
0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000,
0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000,
0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000,
0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000,
0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000,
0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000,
0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000,
0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000,
0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000,
0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000,
0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000,
0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000,
0x8a6c1afd00000000},
{0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000,
0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000,
0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000,
0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000,
0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000,
0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000,
0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000,
0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000,
0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000,
0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000,
0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000,
0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000,
0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000,
0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000,
0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000,
0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000,
0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000,
0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000,
0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000,
0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000,
0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000,
0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000,
0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000,
0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000,
0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000,
0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000,
0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000,
0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000,
0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000,
0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000,
0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000,
0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000,
0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000,
0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000,
0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000,
0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000,
0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000,
0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000,
0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000,
0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000,
0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000,
0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000,
0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000,
0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000,
0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000,
0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000,
0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000,
0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000,
0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000,
0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000,
0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000,
0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000,
0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000,
0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000,
0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000,
0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000,
0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000,
0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000,
0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000,
0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000,
0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000,
0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000,
0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000,
0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000,
0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000,
0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000,
0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000,
0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000,
0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000,
0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000,
0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000,
0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000,
0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000,
0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000,
0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000,
0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000,
0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000,
0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000,
0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000,
0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000,
0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000,
0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000,
0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000,
0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000,
0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000,
0x5270900d00000000},
{0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000,
0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000,
0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000,
0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000,
0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000,
0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000,
0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000,
0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000,
0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000,
0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000,
0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000,
0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000,
0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000,
0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000,
0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000,
0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000,
0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000,
0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000,
0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000,
0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000,
0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000,
0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000,
0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000,
0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000,
0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000,
0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000,
0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000,
0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000,
0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000,
0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000,
0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000,
0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000,
0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000,
0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000,
0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000,
0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000,
0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000,
0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000,
0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000,
0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000,
0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000,
0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000,
0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000,
0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000,
0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000,
0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000,
0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000,
0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000,
0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000,
0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000,
0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000,
0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000,
0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000,
0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000,
0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000,
0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000,
0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000,
0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000,
0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000,
0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000,
0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000,
0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000,
0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000,
0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000,
0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000,
0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000,
0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000,
0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000,
0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000,
0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000,
0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000,
0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000,
0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000,
0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000,
0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000,
0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000,
0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000,
0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000,
0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000,
0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000,
0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000,
0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000,
0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000,
0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000,
0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000,
0xa8a0688500000000}};
#else /* W == 4 */
static const uint32_t crc_braid_table[][256] = {
{0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f,
0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999,
0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee,
0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615,
0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383,
0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb,
0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275,
0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d,
0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b,
0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460,
0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317,
0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1,
0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5,
0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd,
0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04,
0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c,
0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7,
0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11,
0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66,
0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7,
0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871,
0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309,
0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd,
0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85,
0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913,
0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d,
0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a,
0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc,
0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57,
0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f,
0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6,
0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e,
0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f,
0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289,
0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe,
0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05,
0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893,
0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb,
0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0,
0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8,
0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e,
0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5,
0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2,
0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574,
0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5,
0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add,
0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114,
0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c,
0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7,
0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701,
0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076,
0x09cd8551},
{0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193,
0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2,
0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c,
0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71,
0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a,
0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d,
0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71,
0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436,
0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d,
0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000,
0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae,
0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf,
0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930,
0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277,
0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff,
0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8,
0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef,
0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e,
0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20,
0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95,
0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e,
0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9,
0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d,
0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a,
0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151,
0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4,
0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a,
0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b,
0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c,
0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b,
0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3,
0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4,
0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b,
0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a,
0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4,
0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189,
0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92,
0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5,
0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9,
0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe,
0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5,
0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8,
0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66,
0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707,
0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8,
0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f,
0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707,
0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40,
0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017,
0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876,
0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8,
0x7bc97a0c},
{0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300,
0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0,
0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80,
0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701,
0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41,
0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81,
0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43,
0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83,
0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3,
0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42,
0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202,
0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2,
0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7,
0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407,
0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47,
0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87,
0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86,
0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46,
0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506,
0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44,
0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704,
0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4,
0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5,
0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505,
0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45,
0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f,
0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f,
0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f,
0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e,
0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e,
0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e,
0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce,
0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c,
0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc,
0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c,
0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d,
0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d,
0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d,
0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88,
0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48,
0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708,
0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89,
0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9,
0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309,
0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb,
0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b,
0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b,
0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b,
0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a,
0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a,
0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a,
0x7851a2ca},
{0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb,
0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8,
0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0,
0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f,
0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a,
0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf,
0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5,
0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380,
0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815,
0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa,
0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2,
0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1,
0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1,
0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4,
0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa,
0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df,
0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6,
0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5,
0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad,
0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca,
0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f,
0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a,
0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8,
0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d,
0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708,
0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d,
0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865,
0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636,
0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f,
0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a,
0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744,
0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061,
0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0,
0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293,
0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb,
0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874,
0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1,
0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4,
0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f,
0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a,
0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f,
0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120,
0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778,
0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b,
0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a,
0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af,
0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81,
0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4,
0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd,
0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e,
0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6,
0x566b6848}};
static const z_word_t crc_braid_big_table[][256] = {
{0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912,
0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba,
0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3,
0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30,
0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e,
0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3,
0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73,
0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe,
0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0,
0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643,
0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a,
0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082,
0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4,
0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279,
0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735,
0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8,
0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad,
0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05,
0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c,
0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718,
0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46,
0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb,
0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc,
0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41,
0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f,
0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad,
0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4,
0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c,
0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779,
0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4,
0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8,
0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235,
0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7,
0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f,
0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476,
0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195,
0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb,
0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46,
0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622,
0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af,
0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1,
0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12,
0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b,
0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3,
0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51,
0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc,
0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90,
0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d,
0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708,
0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0,
0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9,
0x48686b56},
{0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c,
0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae,
0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb,
0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90,
0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410,
0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b,
0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6,
0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed,
0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d,
0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036,
0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953,
0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1,
0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca,
0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781,
0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d,
0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416,
0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f,
0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd,
0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8,
0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b,
0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb,
0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0,
0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5,
0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e,
0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e,
0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558,
0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d,
0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf,
0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6,
0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad,
0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971,
0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a,
0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b,
0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969,
0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c,
0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57,
0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7,
0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c,
0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab,
0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0,
0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160,
0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b,
0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e,
0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac,
0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d,
0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546,
0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a,
0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1,
0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8,
0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a,
0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f,
0xcaa25178},
{0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00,
0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b,
0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed,
0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777,
0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01,
0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a,
0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef,
0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74,
0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002,
0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498,
0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee,
0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75,
0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05,
0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e,
0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8,
0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73,
0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404,
0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f,
0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9,
0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71,
0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607,
0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c,
0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb,
0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470,
0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806,
0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790,
0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6,
0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d,
0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a,
0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991,
0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7,
0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c,
0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09,
0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92,
0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4,
0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e,
0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08,
0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593,
0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3,
0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778,
0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e,
0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94,
0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2,
0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079,
0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c,
0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497,
0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1,
0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a,
0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d,
0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396,
0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0,
0x0c7ac97b},
{0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669,
0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853,
0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062,
0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527,
0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad,
0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545,
0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27,
0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf,
0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45,
0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800,
0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031,
0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b,
0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26,
0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce,
0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d,
0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5,
0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130,
0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a,
0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b,
0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480,
0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a,
0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2,
0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e,
0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996,
0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c,
0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc,
0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd,
0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7,
0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232,
0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da,
0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439,
0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1,
0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da,
0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0,
0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1,
0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94,
0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e,
0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6,
0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2,
0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a,
0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0,
0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95,
0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4,
0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e,
0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395,
0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d,
0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e,
0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676,
0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83,
0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9,
0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888,
0x5185cd09}};
#endif /* W */
#endif /* N == 6 */
static const uint32_t x2n_table[] = {
0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000,
0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467,
0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0,
0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169,
0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37,
0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a,
0xc40ba6d0, 0xc4e22c3c};
#endif /* CRC32_BRAID_TBL_H_ */
3p-zlib-ng-main/zlib-ng/crc32_fold.c 0000664 0000000 0000000 00000002215 14553115624 0017316 0 ustar 00root root 0000000 0000000 /* crc32_fold.c -- crc32 folding interface
* Copyright (C) 2021 Nathan Moinvaziri
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "functable.h"
#include "crc32_fold.h"
#include
Z_INTERNAL uint32_t crc32_fold_reset_c(crc32_fold *crc) {
crc->value = CRC32_INITIAL_VALUE;
return crc->value;
}
Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len) {
crc->value = functable.crc32(crc->value, src, len);
memcpy(dst, src, len);
}
Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc) {
/* Note: while this is basically the same thing as the vanilla CRC function, we still need
* a functable entry for it so that we can generically dispatch to this function with the
* same arguments for the versions that _do_ do a folding CRC but we don't want a copy. The
* init_crc is an unused argument in this context */
Z_UNUSED(init_crc);
crc->value = functable.crc32(crc->value, src, len);
}
Z_INTERNAL uint32_t crc32_fold_final_c(crc32_fold *crc) {
return crc->value;
}
3p-zlib-ng-main/zlib-ng/crc32_fold.h 0000664 0000000 0000000 00000001312 14553115624 0017320 0 ustar 00root root 0000000 0000000 /* crc32_fold.h -- crc32 folding interface
* Copyright (C) 2021 Nathan Moinvaziri
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef CRC32_FOLD_H_
#define CRC32_FOLD_H_
#define CRC32_FOLD_BUFFER_SIZE (16 * 4)
/* sizeof(__m128i) * (4 folds) */
typedef struct crc32_fold_s {
uint8_t fold[CRC32_FOLD_BUFFER_SIZE];
uint32_t value;
} crc32_fold;
Z_INTERNAL uint32_t crc32_fold_reset_c(crc32_fold *crc);
Z_INTERNAL void crc32_fold_copy_c(crc32_fold *crc, uint8_t *dst, const uint8_t *src, size_t len);
Z_INTERNAL void crc32_fold_c(crc32_fold *crc, const uint8_t *src, size_t len, uint32_t init_crc);
Z_INTERNAL uint32_t crc32_fold_final_c(crc32_fold *crc);
#endif
3p-zlib-ng-main/zlib-ng/deflate.c 0000664 0000000 0000000 00000152075 14553115624 0017014 0 ustar 00root root 0000000 0000000 /* deflate.c -- compress data using the deflation algorithm
* Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/*
* ALGORITHM
*
* The "deflation" process depends on being able to identify portions
* of the input text which are identical to earlier input (within a
* sliding window trailing behind the input currently being processed).
*
* The most straightforward technique turns out to be the fastest for
* most input files: try all possible matches and select the longest.
* The key feature of this algorithm is that insertions into the string
* dictionary are very simple and thus fast, and deletions are avoided
* completely. Insertions are performed at each input character, whereas
* string matches are performed only when the previous match ends. So it
* is preferable to spend more time in matches to allow very fast string
* insertions and avoid deletions. The matching algorithm for small
* strings is inspired from that of Rabin & Karp. A brute force approach
* is used to find longer strings when a small match has been found.
* A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
* (by Leonid Broukhis).
* A previous version of this file used a more sophisticated algorithm
* (by Fiala and Greene) which is guaranteed to run in linear amortized
* time, but has a larger average cost, uses more memory and is patented.
* However the F&G algorithm may be faster for some highly redundant
* files if the parameter max_chain_length (described below) is too large.
*
* ACKNOWLEDGEMENTS
*
* The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
* I found it in 'freeze' written by Leonid Broukhis.
* Thanks to many people for bug reports and testing.
*
* REFERENCES
*
* Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
* Available in https://tools.ietf.org/html/rfc1951
*
* A description of the Rabin and Karp algorithm is given in the book
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
*
* Fiala,E.R., and Greene,D.H.
* Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
*
*/
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
/* Avoid conflicts with zlib.h macros */
#ifdef ZLIB_COMPAT
# undef deflateInit
# undef deflateInit2
#endif
const char PREFIX(deflate_copyright)[] = " deflate 1.3.0 Copyright 1995-2023 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
include such an acknowledgment, I would appreciate that you keep this
copyright string in the executable of your product.
*/
/* ===========================================================================
* Architecture-specific hooks.
*/
#ifdef S390_DFLTCC_DEFLATE
# include "arch/s390/dfltcc_deflate.h"
#else
/* Memory management for the deflate state. Useful for allocating arch-specific extension blocks. */
# define ZALLOC_DEFLATE_STATE(strm) ((deflate_state *)ZALLOC(strm, 1, sizeof(deflate_state)))
# define ZFREE_STATE(strm, addr) ZFREE(strm, addr)
# define ZCOPY_DEFLATE_STATE(dst, src) memcpy(dst, src, sizeof(deflate_state))
/* Memory management for the window. Useful for allocation the aligned window. */
# define ZALLOC_WINDOW(strm, items, size) ZALLOC(strm, items, size)
# define TRY_FREE_WINDOW(strm, addr) TRY_FREE(strm, addr)
/* Invoked at the beginning of deflateSetDictionary(). Useful for checking arch-specific window data. */
# define DEFLATE_SET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0)
/* Invoked at the beginning of deflateGetDictionary(). Useful for adjusting arch-specific window data. */
# define DEFLATE_GET_DICTIONARY_HOOK(strm, dict, dict_len) do {} while (0)
/* Invoked at the end of deflateResetKeep(). Useful for initializing arch-specific extension blocks. */
# define DEFLATE_RESET_KEEP_HOOK(strm) do {} while (0)
/* Invoked at the beginning of deflateParams(). Useful for updating arch-specific compression parameters. */
# define DEFLATE_PARAMS_HOOK(strm, level, strategy, hook_flush) do {} while (0)
/* Returns whether the last deflate(flush) operation did everything it's supposed to do. */
# define DEFLATE_DONE(strm, flush) 1
/* Adjusts the upper bound on compressed data length based on compression parameters and uncompressed data length.
* Useful when arch-specific deflation code behaves differently than regular zlib-ng algorithms. */
# define DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen) do {} while (0)
/* Returns whether an optimistic upper bound on compressed data length should *not* be used.
* Useful when arch-specific deflation code behaves differently than regular zlib-ng algorithms. */
# define DEFLATE_NEED_CONSERVATIVE_BOUND(strm) 0
/* Invoked for each deflate() call. Useful for plugging arch-specific deflation code. */
# define DEFLATE_HOOK(strm, flush, bstate) 0
/* Returns whether zlib-ng should compute a checksum. Set to 0 if arch-specific deflation code already does that. */
# define DEFLATE_NEED_CHECKSUM(strm) 1
/* Returns whether reproducibility parameter can be set to a given value. */
# define DEFLATE_CAN_SET_REPRODUCIBLE(strm, reproducible) 1
#endif
/* ===========================================================================
* Function prototypes.
*/
static int deflateStateCheck (PREFIX3(stream) *strm);
Z_INTERNAL block_state deflate_stored(deflate_state *s, int flush);
Z_INTERNAL block_state deflate_fast (deflate_state *s, int flush);
Z_INTERNAL block_state deflate_quick (deflate_state *s, int flush);
#ifndef NO_MEDIUM_STRATEGY
Z_INTERNAL block_state deflate_medium(deflate_state *s, int flush);
#endif
Z_INTERNAL block_state deflate_slow (deflate_state *s, int flush);
Z_INTERNAL block_state deflate_rle (deflate_state *s, int flush);
Z_INTERNAL block_state deflate_huff (deflate_state *s, int flush);
static void lm_set_level (deflate_state *s, int level);
static void lm_init (deflate_state *s);
Z_INTERNAL unsigned read_buf (PREFIX3(stream) *strm, unsigned char *buf, unsigned size);
extern uint32_t update_hash_roll (deflate_state *const s, uint32_t h, uint32_t val);
extern void insert_string_roll (deflate_state *const s, uint32_t str, uint32_t count);
extern Pos quick_insert_string_roll(deflate_state *const s, uint32_t str);
/* ===========================================================================
* Local data
*/
/* Values for max_lazy_match, good_match and max_chain_length, depending on
* the desired pack level (0..9). The values given below have been tuned to
* exclude worst case performance for pathological files. Better values may be
* found for specific files.
*/
typedef struct config_s {
uint16_t good_length; /* reduce lazy search above this match length */
uint16_t max_lazy; /* do not perform lazy search above this match length */
uint16_t nice_length; /* quit search above this match length */
uint16_t max_chain;
compress_func func;
} config;
static const config configuration_table[10] = {
/* good lazy nice chain */
/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
#ifdef NO_QUICK_STRATEGY
/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
/* 2 */ {4, 5, 16, 8, deflate_fast},
#else
/* 1 */ {0, 0, 0, 0, deflate_quick},
/* 2 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
#endif
#ifdef NO_MEDIUM_STRATEGY
/* 3 */ {4, 6, 32, 32, deflate_fast},
/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
/* 5 */ {8, 16, 32, 32, deflate_slow},
/* 6 */ {8, 16, 128, 128, deflate_slow},
#else
/* 3 */ {4, 6, 16, 6, deflate_medium},
/* 4 */ {4, 12, 32, 24, deflate_medium}, /* lazy matches */
/* 5 */ {8, 16, 32, 32, deflate_medium},
/* 6 */ {8, 16, 128, 128, deflate_medium},
#endif
/* 7 */ {8, 32, 128, 256, deflate_slow},
/* 8 */ {32, 128, 258, 1024, deflate_slow},
/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
/* Note: the deflate() code requires max_lazy >= STD_MIN_MATCH and max_chain >= 4
* For deflate_fast() (levels <= 3) good is ignored and lazy has a different
* meaning.
*/
/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0))
/* ===========================================================================
* Initialize the hash table. prev[] will be initialized on the fly.
*/
#define CLEAR_HASH(s) do { \
memset((unsigned char *)s->head, 0, HASH_SIZE * sizeof(*s->head)); \
} while (0)
/* ========================================================================= */
/* This function is hidden in ZLIB_COMPAT builds. */
int32_t ZNG_CONDEXPORT PREFIX(deflateInit2)(PREFIX3(stream) *strm, int32_t level, int32_t method, int32_t windowBits,
int32_t memLevel, int32_t strategy) {
/* Todo: ignore strm->next_in if we use it as window */
uint32_t window_padding = 0;
deflate_state *s;
int wrap = 1;
/* Force initialization functable, because deflate captures function pointers from functable. */
functable.force_init();
if (strm == NULL)
return Z_STREAM_ERROR;
strm->msg = NULL;
if (strm->zalloc == NULL) {
strm->zalloc = PREFIX(zcalloc);
strm->opaque = NULL;
}
if (strm->zfree == NULL)
strm->zfree = PREFIX(zcfree);
if (level == Z_DEFAULT_COMPRESSION)
level = 6;
if (windowBits < 0) { /* suppress zlib wrapper */
wrap = 0;
if (windowBits < -MAX_WBITS)
return Z_STREAM_ERROR;
windowBits = -windowBits;
#ifdef GZIP
} else if (windowBits > MAX_WBITS) {
wrap = 2; /* write gzip wrapper instead */
windowBits -= 16;
#endif
}
if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < MIN_WBITS ||
windowBits > MAX_WBITS || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED ||
(windowBits == 8 && wrap != 1)) {
return Z_STREAM_ERROR;
}
if (windowBits == 8)
windowBits = 9; /* until 256-byte window bug fixed */
s = ZALLOC_DEFLATE_STATE(strm);
if (s == NULL)
return Z_MEM_ERROR;
strm->state = (struct internal_state *)s;
s->strm = strm;
s->status = INIT_STATE; /* to pass state test in deflateReset() */
s->wrap = wrap;
s->gzhead = NULL;
s->w_bits = (unsigned int)windowBits;
s->w_size = 1 << s->w_bits;
s->w_mask = s->w_size - 1;
#ifdef X86_PCLMULQDQ_CRC
window_padding = 8;
#endif
s->window = (unsigned char *) ZALLOC_WINDOW(strm, s->w_size + window_padding, 2*sizeof(unsigned char));
s->prev = (Pos *) ZALLOC(strm, s->w_size, sizeof(Pos));
memset(s->prev, 0, s->w_size * sizeof(Pos));
s->head = (Pos *) ZALLOC(strm, HASH_SIZE, sizeof(Pos));
s->high_water = 0; /* nothing written to s->window yet */
s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
/* We overlay pending_buf and sym_buf. This works since the average size
* for length/distance pairs over any compressed block is assured to be 31
* bits or less.
*
* Analysis: The longest fixed codes are a length code of 8 bits plus 5
* extra bits, for lengths 131 to 257. The longest fixed distance codes are
* 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest
* possible fixed-codes length/distance pair is then 31 bits total.
*
* sym_buf starts one-fourth of the way into pending_buf. So there are
* three bytes in sym_buf for every four bytes in pending_buf. Each symbol
* in sym_buf is three bytes -- two for the distance and one for the
* literal/length. As each symbol is consumed, the pointer to the next
* sym_buf value to read moves forward three bytes. From that symbol, up to
* 31 bits are written to pending_buf. The closest the written pending_buf
* bits gets to the next sym_buf symbol to read is just before the last
* code is written. At that time, 31*(n-2) bits have been written, just
* after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
* 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
* symbols are written.) The closest the writing gets to what is unread is
* then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
* can range from 128 to 32768.
*
* Therefore, at a minimum, there are 142 bits of space between what is
* written and what is read in the overlain buffers, so the symbols cannot
* be overwritten by the compressed data. That space is actually 139 bits,
* due to the three-bit fixed-code block header.
*
* That covers the case where either Z_FIXED is specified, forcing fixed
* codes, or when the use of fixed codes is chosen, because that choice
* results in a smaller compressed block than dynamic codes. That latter
* condition then assures that the above analysis also covers all dynamic
* blocks. A dynamic-code block will only be chosen to be emitted if it has
* fewer bits than a fixed-code block would for the same set of symbols.
* Therefore its average symbol length is assured to be less than 31. So
* the compressed data for a dynamic block also cannot overwrite the
* symbols from which it is being constructed.
*/
s->pending_buf = (unsigned char *) ZALLOC(strm, s->lit_bufsize, 4);
s->pending_buf_size = s->lit_bufsize * 4;
if (s->window == NULL || s->prev == NULL || s->head == NULL || s->pending_buf == NULL) {
s->status = FINISH_STATE;
strm->msg = ERR_MSG(Z_MEM_ERROR);
PREFIX(deflateEnd)(strm);
return Z_MEM_ERROR;
}
s->sym_buf = s->pending_buf + s->lit_bufsize;
s->sym_end = (s->lit_bufsize - 1) * 3;
/* We avoid equality with lit_bufsize*3 because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
*/
s->level = level;
s->strategy = strategy;
s->block_open = 0;
s->reproducible = 0;
return PREFIX(deflateReset)(strm);
}
#ifndef ZLIB_COMPAT
int32_t Z_EXPORT PREFIX(deflateInit)(PREFIX3(stream) *strm, int32_t level) {
return PREFIX(deflateInit2)(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
}
#endif
/* Function used by zlib.h and zlib-ng version 2.0 macros */
int32_t Z_EXPORT PREFIX(deflateInit_)(PREFIX3(stream) *strm, int32_t level, const char *version, int32_t stream_size) {
if (CHECK_VER_STSIZE(version, stream_size))
return Z_VERSION_ERROR;
return PREFIX(deflateInit2)(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
}
/* Function used by zlib.h and zlib-ng version 2.0 macros */
int32_t Z_EXPORT PREFIX(deflateInit2_)(PREFIX3(stream) *strm, int32_t level, int32_t method, int32_t windowBits,
int32_t memLevel, int32_t strategy, const char *version, int32_t stream_size) {
if (CHECK_VER_STSIZE(version, stream_size))
return Z_VERSION_ERROR;
return PREFIX(deflateInit2)(strm, level, method, windowBits, memLevel, strategy);
}
/* =========================================================================
* Check for a valid deflate stream state. Return 0 if ok, 1 if not.
*/
static int deflateStateCheck(PREFIX3(stream) *strm) {
deflate_state *s;
if (strm == NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
return 1;
s = strm->state;
if (s == NULL || s->strm != strm || (s->status < INIT_STATE || s->status > MAX_STATE))
return 1;
return 0;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateSetDictionary)(PREFIX3(stream) *strm, const uint8_t *dictionary, uint32_t dictLength) {
deflate_state *s;
unsigned int str, n;
int wrap;
uint32_t avail;
const unsigned char *next;
if (deflateStateCheck(strm) || dictionary == NULL)
return Z_STREAM_ERROR;
s = strm->state;
wrap = s->wrap;
if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
return Z_STREAM_ERROR;
/* when using zlib wrappers, compute Adler-32 for provided dictionary */
if (wrap == 1)
strm->adler = functable.adler32(strm->adler, dictionary, dictLength);
DEFLATE_SET_DICTIONARY_HOOK(strm, dictionary, dictLength); /* hook for IBM Z DFLTCC */
s->wrap = 0; /* avoid computing Adler-32 in read_buf */
/* if dictionary would fill window, just replace the history */
if (dictLength >= s->w_size) {
if (wrap == 0) { /* already empty otherwise */
CLEAR_HASH(s);
s->strstart = 0;
s->block_start = 0;
s->insert = 0;
}
dictionary += dictLength - s->w_size; /* use the tail */
dictLength = s->w_size;
}
/* insert dictionary into window and hash */
avail = strm->avail_in;
next = strm->next_in;
strm->avail_in = dictLength;
strm->next_in = (z_const unsigned char *)dictionary;
PREFIX(fill_window)(s);
while (s->lookahead >= STD_MIN_MATCH) {
str = s->strstart;
n = s->lookahead - (STD_MIN_MATCH - 1);
s->insert_string(s, str, n);
s->strstart = str + n;
s->lookahead = STD_MIN_MATCH - 1;
PREFIX(fill_window)(s);
}
s->strstart += s->lookahead;
s->block_start = (int)s->strstart;
s->insert = s->lookahead;
s->lookahead = 0;
s->prev_length = 0;
s->match_available = 0;
strm->next_in = (z_const unsigned char *)next;
strm->avail_in = avail;
s->wrap = wrap;
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateGetDictionary)(PREFIX3(stream) *strm, uint8_t *dictionary, uint32_t *dictLength) {
deflate_state *s;
unsigned int len;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
DEFLATE_GET_DICTIONARY_HOOK(strm, dictionary, dictLength); /* hook for IBM Z DFLTCC */
s = strm->state;
len = s->strstart + s->lookahead;
if (len > s->w_size)
len = s->w_size;
if (dictionary != NULL && len)
memcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
if (dictLength != NULL)
*dictLength = len;
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateResetKeep)(PREFIX3(stream) *strm) {
deflate_state *s;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
strm->total_in = strm->total_out = 0;
strm->msg = NULL; /* use zfree if we ever allocate msg dynamically */
strm->data_type = Z_UNKNOWN;
s = (deflate_state *)strm->state;
s->pending = 0;
s->pending_out = s->pending_buf;
if (s->wrap < 0)
s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
s->status =
#ifdef GZIP
s->wrap == 2 ? GZIP_STATE :
#endif
INIT_STATE;
#ifdef GZIP
if (s->wrap == 2) {
strm->adler = functable.crc32_fold_reset(&s->crc_fold);
} else
#endif
strm->adler = ADLER32_INITIAL_VALUE;
s->last_flush = -2;
zng_tr_init(s);
DEFLATE_RESET_KEEP_HOOK(strm); /* hook for IBM Z DFLTCC */
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateReset)(PREFIX3(stream) *strm) {
int ret = PREFIX(deflateResetKeep)(strm);
if (ret == Z_OK)
lm_init(strm->state);
return ret;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateSetHeader)(PREFIX3(stream) *strm, PREFIX(gz_headerp) head) {
if (deflateStateCheck(strm) || strm->state->wrap != 2)
return Z_STREAM_ERROR;
strm->state->gzhead = head;
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflatePending)(PREFIX3(stream) *strm, uint32_t *pending, int32_t *bits) {
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
if (pending != NULL)
*pending = strm->state->pending;
if (bits != NULL)
*bits = strm->state->bi_valid;
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflatePrime)(PREFIX3(stream) *strm, int32_t bits, int32_t value) {
deflate_state *s;
uint64_t value64 = (uint64_t)value;
int32_t put;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
if (bits < 0 || bits > BIT_BUF_SIZE || bits > (int32_t)(sizeof(value) << 3) ||
s->sym_buf < s->pending_out + ((BIT_BUF_SIZE + 7) >> 3))
return Z_BUF_ERROR;
do {
put = BIT_BUF_SIZE - s->bi_valid;
put = MIN(put, bits);
if (s->bi_valid == 0)
s->bi_buf = value64;
else
s->bi_buf |= (value64 & ((UINT64_C(1) << put) - 1)) << s->bi_valid;
s->bi_valid += put;
zng_tr_flush_bits(s);
value64 >>= put;
bits -= put;
} while (bits);
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateParams)(PREFIX3(stream) *strm, int32_t level, int32_t strategy) {
deflate_state *s;
compress_func func;
int hook_flush = Z_NO_FLUSH;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
if (level == Z_DEFAULT_COMPRESSION)
level = 6;
if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED)
return Z_STREAM_ERROR;
DEFLATE_PARAMS_HOOK(strm, level, strategy, &hook_flush); /* hook for IBM Z DFLTCC */
func = configuration_table[s->level].func;
if (((strategy != s->strategy || func != configuration_table[level].func) && s->last_flush != -2)
|| hook_flush != Z_NO_FLUSH) {
/* Flush the last buffer. Use Z_BLOCK mode, unless the hook requests a "stronger" one. */
int flush = RANK(hook_flush) > RANK(Z_BLOCK) ? hook_flush : Z_BLOCK;
int err = PREFIX(deflate)(strm, flush);
if (err == Z_STREAM_ERROR)
return err;
if (strm->avail_in || ((int)s->strstart - s->block_start) + s->lookahead || !DEFLATE_DONE(strm, flush))
return Z_BUF_ERROR;
}
if (s->level != level) {
if (s->level == 0 && s->matches != 0) {
if (s->matches == 1) {
functable.slide_hash(s);
} else {
CLEAR_HASH(s);
}
s->matches = 0;
}
lm_set_level(s, level);
}
s->strategy = strategy;
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateTune)(PREFIX3(stream) *strm, int32_t good_length, int32_t max_lazy, int32_t nice_length, int32_t max_chain) {
deflate_state *s;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
s->good_match = (unsigned int)good_length;
s->max_lazy_match = (unsigned int)max_lazy;
s->nice_match = nice_length;
s->max_chain_length = (unsigned int)max_chain;
return Z_OK;
}
/* =========================================================================
* For the default windowBits of 15 and memLevel of 8, this function returns
* a close to exact, as well as small, upper bound on the compressed size.
* They are coded as constants here for a reason--if the #define's are
* changed, then this function needs to be changed as well. The return
* value for 15 and 8 only works for those exact settings.
*
* For any setting other than those defaults for windowBits and memLevel,
* the value returned is a conservative worst case for the maximum expansion
* resulting from using fixed blocks instead of stored blocks, which deflate
* can emit on compressed data for some combinations of the parameters.
*
* This function could be more sophisticated to provide closer upper bounds for
* every combination of windowBits and memLevel. But even the conservative
* upper bound of about 14% expansion does not seem onerous for output buffer
* allocation.
*/
unsigned long Z_EXPORT PREFIX(deflateBound)(PREFIX3(stream) *strm, unsigned long sourceLen) {
deflate_state *s;
unsigned long complen, wraplen;
/* conservative upper bound for compressed data */
complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
DEFLATE_BOUND_ADJUST_COMPLEN(strm, complen, sourceLen); /* hook for IBM Z DFLTCC */
/* if can't get parameters, return conservative bound plus zlib wrapper */
if (deflateStateCheck(strm))
return complen + 6;
/* compute wrapper length */
s = strm->state;
switch (s->wrap) {
case 0: /* raw deflate */
wraplen = 0;
break;
case 1: /* zlib wrapper */
wraplen = ZLIB_WRAPLEN + (s->strstart ? 4 : 0);
break;
#ifdef GZIP
case 2: /* gzip wrapper */
wraplen = GZIP_WRAPLEN;
if (s->gzhead != NULL) { /* user-supplied gzip header */
unsigned char *str;
if (s->gzhead->extra != NULL) {
wraplen += 2 + s->gzhead->extra_len;
}
str = s->gzhead->name;
if (str != NULL) {
do {
wraplen++;
} while (*str++);
}
str = s->gzhead->comment;
if (str != NULL) {
do {
wraplen++;
} while (*str++);
}
if (s->gzhead->hcrc)
wraplen += 2;
}
break;
#endif
default: /* for compiler happiness */
wraplen = ZLIB_WRAPLEN;
}
/* if not default parameters, return conservative bound */
if (DEFLATE_NEED_CONSERVATIVE_BOUND(strm) || /* hook for IBM Z DFLTCC */
s->w_bits != MAX_WBITS || HASH_BITS < 15) {
if (s->level == 0) {
/* upper bound for stored blocks with length 127 (memLevel == 1) --
~4% overhead plus a small constant */
complen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + (sourceLen >> 11) + 7;
}
return complen + wraplen;
}
#ifndef NO_QUICK_STRATEGY
return sourceLen /* The source size itself */
+ (sourceLen == 0 ? 1 : 0) /* Always at least one byte for any input */
+ (sourceLen < 9 ? 1 : 0) /* One extra byte for lengths less than 9 */
+ DEFLATE_QUICK_OVERHEAD(sourceLen) /* Source encoding overhead, padded to next full byte */
+ DEFLATE_BLOCK_OVERHEAD /* Deflate block overhead bytes */
+ wraplen; /* none, zlib or gzip wrapper */
#else
return sourceLen + (sourceLen >> 4) + 7 + wraplen;
#endif
}
/* =========================================================================
* Flush as much pending output as possible. All deflate() output, except for
* some deflate_stored() output, goes through this function so some
* applications may wish to modify it to avoid allocating a large
* strm->next_out buffer and copying into it. (See also read_buf()).
*/
Z_INTERNAL void PREFIX(flush_pending)(PREFIX3(stream) *strm) {
uint32_t len;
deflate_state *s = strm->state;
zng_tr_flush_bits(s);
len = MIN(s->pending, strm->avail_out);
if (len == 0)
return;
Tracev((stderr, "[FLUSH]"));
memcpy(strm->next_out, s->pending_out, len);
strm->next_out += len;
s->pending_out += len;
strm->total_out += len;
strm->avail_out -= len;
s->pending -= len;
if (s->pending == 0)
s->pending_out = s->pending_buf;
}
/* ===========================================================================
* Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1].
*/
#define HCRC_UPDATE(beg) \
do { \
if (s->gzhead->hcrc && s->pending > (beg)) \
strm->adler = PREFIX(crc32)(strm->adler, s->pending_buf + (beg), s->pending - (beg)); \
} while (0)
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflate)(PREFIX3(stream) *strm, int32_t flush) {
int32_t old_flush; /* value of flush param for previous deflate call */
deflate_state *s;
if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0)
return Z_STREAM_ERROR;
s = strm->state;
if (strm->next_out == NULL || (strm->avail_in != 0 && strm->next_in == NULL)
|| (s->status == FINISH_STATE && flush != Z_FINISH)) {
ERR_RETURN(strm, Z_STREAM_ERROR);
}
if (strm->avail_out == 0) {
ERR_RETURN(strm, Z_BUF_ERROR);
}
old_flush = s->last_flush;
s->last_flush = flush;
/* Flush as much pending output as possible */
if (s->pending != 0) {
PREFIX(flush_pending)(strm);
if (strm->avail_out == 0) {
/* Since avail_out is 0, deflate will be called again with
* more output space, but possibly with both pending and
* avail_in equal to zero. There won't be anything to do,
* but this is not an error situation so make sure we
* return OK instead of BUF_ERROR at next call of deflate:
*/
s->last_flush = -1;
return Z_OK;
}
/* Make sure there is something to do and avoid duplicate consecutive
* flushes. For repeated and useless calls with Z_FINISH, we keep
* returning Z_STREAM_END instead of Z_BUF_ERROR.
*/
} else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && flush != Z_FINISH) {
ERR_RETURN(strm, Z_BUF_ERROR);
}
/* User must not provide more input after the first FINISH: */
if (s->status == FINISH_STATE && strm->avail_in != 0) {
ERR_RETURN(strm, Z_BUF_ERROR);
}
/* Write the header */
if (s->status == INIT_STATE && s->wrap == 0)
s->status = BUSY_STATE;
if (s->status == INIT_STATE) {
/* zlib header */
unsigned int header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
unsigned int level_flags;
if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
level_flags = 0;
else if (s->level < 6)
level_flags = 1;
else if (s->level == 6)
level_flags = 2;
else
level_flags = 3;
header |= (level_flags << 6);
if (s->strstart != 0)
header |= PRESET_DICT;
header += 31 - (header % 31);
put_short_msb(s, (uint16_t)header);
/* Save the adler32 of the preset dictionary: */
if (s->strstart != 0)
put_uint32_msb(s, strm->adler);
strm->adler = ADLER32_INITIAL_VALUE;
s->status = BUSY_STATE;
/* Compression must start with an empty pending buffer */
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
}
#ifdef GZIP
if (s->status == GZIP_STATE) {
/* gzip header */
functable.crc32_fold_reset(&s->crc_fold);
put_byte(s, 31);
put_byte(s, 139);
put_byte(s, 8);
if (s->gzhead == NULL) {
put_uint32(s, 0);
put_byte(s, 0);
put_byte(s, s->level == 9 ? 2 :
(s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0));
put_byte(s, OS_CODE);
s->status = BUSY_STATE;
/* Compression must start with an empty pending buffer */
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
} else {
put_byte(s, (s->gzhead->text ? 1 : 0) +
(s->gzhead->hcrc ? 2 : 0) +
(s->gzhead->extra == NULL ? 0 : 4) +
(s->gzhead->name == NULL ? 0 : 8) +
(s->gzhead->comment == NULL ? 0 : 16)
);
put_uint32(s, s->gzhead->time);
put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0));
put_byte(s, s->gzhead->os & 0xff);
if (s->gzhead->extra != NULL)
put_short(s, (uint16_t)s->gzhead->extra_len);
if (s->gzhead->hcrc)
strm->adler = PREFIX(crc32)(strm->adler, s->pending_buf, s->pending);
s->gzindex = 0;
s->status = EXTRA_STATE;
}
}
if (s->status == EXTRA_STATE) {
if (s->gzhead->extra != NULL) {
uint32_t beg = s->pending; /* start of bytes to update crc */
uint32_t left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
while (s->pending + left > s->pending_buf_size) {
uint32_t copy = s->pending_buf_size - s->pending;
memcpy(s->pending_buf + s->pending, s->gzhead->extra + s->gzindex, copy);
s->pending = s->pending_buf_size;
HCRC_UPDATE(beg);
s->gzindex += copy;
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
beg = 0;
left -= copy;
}
memcpy(s->pending_buf + s->pending, s->gzhead->extra + s->gzindex, left);
s->pending += left;
HCRC_UPDATE(beg);
s->gzindex = 0;
}
s->status = NAME_STATE;
}
if (s->status == NAME_STATE) {
if (s->gzhead->name != NULL) {
uint32_t beg = s->pending; /* start of bytes to update crc */
unsigned char val;
do {
if (s->pending == s->pending_buf_size) {
HCRC_UPDATE(beg);
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
beg = 0;
}
val = s->gzhead->name[s->gzindex++];
put_byte(s, val);
} while (val != 0);
HCRC_UPDATE(beg);
s->gzindex = 0;
}
s->status = COMMENT_STATE;
}
if (s->status == COMMENT_STATE) {
if (s->gzhead->comment != NULL) {
uint32_t beg = s->pending; /* start of bytes to update crc */
unsigned char val;
do {
if (s->pending == s->pending_buf_size) {
HCRC_UPDATE(beg);
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
beg = 0;
}
val = s->gzhead->comment[s->gzindex++];
put_byte(s, val);
} while (val != 0);
HCRC_UPDATE(beg);
}
s->status = HCRC_STATE;
}
if (s->status == HCRC_STATE) {
if (s->gzhead->hcrc) {
if (s->pending + 2 > s->pending_buf_size) {
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
}
put_short(s, (uint16_t)strm->adler);
functable.crc32_fold_reset(&s->crc_fold);
}
s->status = BUSY_STATE;
/* Compression must start with an empty pending buffer */
PREFIX(flush_pending)(strm);
if (s->pending != 0) {
s->last_flush = -1;
return Z_OK;
}
}
#endif
/* Start a new block or continue the current one.
*/
if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
block_state bstate;
bstate = DEFLATE_HOOK(strm, flush, &bstate) ? bstate : /* hook for IBM Z DFLTCC */
s->level == 0 ? deflate_stored(s, flush) :
s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
s->strategy == Z_RLE ? deflate_rle(s, flush) :
(*(configuration_table[s->level].func))(s, flush);
if (bstate == finish_started || bstate == finish_done) {
s->status = FINISH_STATE;
}
if (bstate == need_more || bstate == finish_started) {
if (strm->avail_out == 0) {
s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
}
return Z_OK;
/* If flush != Z_NO_FLUSH && avail_out == 0, the next call
* of deflate should use the same flush parameter to make sure
* that the flush is complete. So we don't have to output an
* empty block here, this will be done at next call. This also
* ensures that for a very small output buffer, we emit at most
* one empty block.
*/
}
if (bstate == block_done) {
if (flush == Z_PARTIAL_FLUSH) {
zng_tr_align(s);
} else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
zng_tr_stored_block(s, (char*)0, 0L, 0);
/* For a full flush, this empty block will be recognized
* as a special marker by inflate_sync().
*/
if (flush == Z_FULL_FLUSH) {
CLEAR_HASH(s); /* forget history */
if (s->lookahead == 0) {
s->strstart = 0;
s->block_start = 0;
s->insert = 0;
}
}
}
PREFIX(flush_pending)(strm);
if (strm->avail_out == 0) {
s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
return Z_OK;
}
}
}
if (flush != Z_FINISH)
return Z_OK;
/* Write the trailer */
#ifdef GZIP
if (s->wrap == 2) {
strm->adler = functable.crc32_fold_final(&s->crc_fold);
put_uint32(s, strm->adler);
put_uint32(s, (uint32_t)strm->total_in);
} else
#endif
{
if (s->wrap == 1)
put_uint32_msb(s, strm->adler);
}
PREFIX(flush_pending)(strm);
/* If avail_out is zero, the application will call deflate again
* to flush the rest.
*/
if (s->wrap > 0)
s->wrap = -s->wrap; /* write the trailer only once! */
if (s->pending == 0) {
Assert(s->bi_valid == 0, "bi_buf not flushed");
return Z_STREAM_END;
}
return Z_OK;
}
/* ========================================================================= */
int32_t Z_EXPORT PREFIX(deflateEnd)(PREFIX3(stream) *strm) {
int32_t status;
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
status = strm->state->status;
/* Deallocate in reverse order of allocations: */
TRY_FREE(strm, strm->state->pending_buf);
TRY_FREE(strm, strm->state->head);
TRY_FREE(strm, strm->state->prev);
TRY_FREE_WINDOW(strm, strm->state->window);
ZFREE_STATE(strm, strm->state);
strm->state = NULL;
return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
}
/* =========================================================================
* Copy the source state to the destination state.
*/
int32_t Z_EXPORT PREFIX(deflateCopy)(PREFIX3(stream) *dest, PREFIX3(stream) *source) {
deflate_state *ds;
deflate_state *ss;
uint32_t window_padding = 0;
if (deflateStateCheck(source) || dest == NULL)
return Z_STREAM_ERROR;
ss = source->state;
memcpy((void *)dest, (void *)source, sizeof(PREFIX3(stream)));
ds = ZALLOC_DEFLATE_STATE(dest);
if (ds == NULL)
return Z_MEM_ERROR;
dest->state = (struct internal_state *) ds;
ZCOPY_DEFLATE_STATE(ds, ss);
ds->strm = dest;
#ifdef X86_PCLMULQDQ_CRC
window_padding = 8;
#endif
ds->window = (unsigned char *) ZALLOC_WINDOW(dest, ds->w_size + window_padding, 2*sizeof(unsigned char));
ds->prev = (Pos *) ZALLOC(dest, ds->w_size, sizeof(Pos));
ds->head = (Pos *) ZALLOC(dest, HASH_SIZE, sizeof(Pos));
ds->pending_buf = (unsigned char *) ZALLOC(dest, ds->lit_bufsize, 4);
if (ds->window == NULL || ds->prev == NULL || ds->head == NULL || ds->pending_buf == NULL) {
PREFIX(deflateEnd)(dest);
return Z_MEM_ERROR;
}
memcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(unsigned char));
memcpy((void *)ds->prev, (void *)ss->prev, ds->w_size * sizeof(Pos));
memcpy((void *)ds->head, (void *)ss->head, HASH_SIZE * sizeof(Pos));
memcpy(ds->pending_buf, ss->pending_buf, ds->pending_buf_size);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
ds->l_desc.dyn_tree = ds->dyn_ltree;
ds->d_desc.dyn_tree = ds->dyn_dtree;
ds->bl_desc.dyn_tree = ds->bl_tree;
return Z_OK;
}
/* ===========================================================================
* Read a new buffer from the current input stream, update the adler32
* and total number of bytes read. All deflate() input goes through
* this function so some applications may wish to modify it to avoid
* allocating a large strm->next_in buffer and copying from it.
* (See also flush_pending()).
*/
Z_INTERNAL unsigned PREFIX(read_buf)(PREFIX3(stream) *strm, unsigned char *buf, unsigned size) {
uint32_t len = MIN(strm->avail_in, size);
if (len == 0)
return 0;
strm->avail_in -= len;
if (!DEFLATE_NEED_CHECKSUM(strm)) {
memcpy(buf, strm->next_in, len);
#ifdef GZIP
} else if (strm->state->wrap == 2) {
functable.crc32_fold_copy(&strm->state->crc_fold, buf, strm->next_in, len);
#endif
} else if (strm->state->wrap == 1) {
strm->adler = functable.adler32_fold_copy(strm->adler, buf, strm->next_in, len);
} else {
memcpy(buf, strm->next_in, len);
}
strm->next_in += len;
strm->total_in += len;
return len;
}
/* ===========================================================================
* Set longest match variables based on level configuration
*/
static void lm_set_level(deflate_state *s, int level) {
s->max_lazy_match = configuration_table[level].max_lazy;
s->good_match = configuration_table[level].good_length;
s->nice_match = configuration_table[level].nice_length;
s->max_chain_length = configuration_table[level].max_chain;
/* Use rolling hash for deflate_slow algorithm with level 9. It allows us to
* properly lookup different hash chains to speed up longest_match search. Since hashing
* method changes depending on the level we cannot put this into functable. */
if (s->max_chain_length > 1024) {
s->update_hash = &update_hash_roll;
s->insert_string = &insert_string_roll;
s->quick_insert_string = &quick_insert_string_roll;
} else {
s->update_hash = functable.update_hash;
s->insert_string = functable.insert_string;
s->quick_insert_string = functable.quick_insert_string;
}
s->level = level;
}
/* ===========================================================================
* Initialize the "longest match" routines for a new zlib stream
*/
static void lm_init(deflate_state *s) {
s->window_size = 2 * s->w_size;
CLEAR_HASH(s);
/* Set the default configuration parameters:
*/
lm_set_level(s, s->level);
s->strstart = 0;
s->block_start = 0;
s->lookahead = 0;
s->insert = 0;
s->prev_length = 0;
s->match_available = 0;
s->match_start = 0;
s->ins_h = 0;
}
/* ===========================================================================
* Fill the window when the lookahead becomes insufficient.
* Updates strstart and lookahead.
*
* IN assertion: lookahead < MIN_LOOKAHEAD
* OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
* At least one byte has been read, or avail_in == 0; reads are
* performed for at least two bytes (required for the zip translate_eol
* option -- not supported here).
*/
void Z_INTERNAL PREFIX(fill_window)(deflate_state *s) {
unsigned n;
unsigned int more; /* Amount of free space at the end of the window. */
unsigned int wsize = s->w_size;
Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
do {
more = s->window_size - s->lookahead - s->strstart;
/* If the window is almost full and there is insufficient lookahead,
* move the upper half to the lower one to make room in the upper half.
*/
if (s->strstart >= wsize+MAX_DIST(s)) {
memcpy(s->window, s->window+wsize, (unsigned)wsize);
if (s->match_start >= wsize) {
s->match_start -= wsize;
} else {
s->match_start = 0;
s->prev_length = 0;
}
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
s->block_start -= (int)wsize;
if (s->insert > s->strstart)
s->insert = s->strstart;
functable.slide_hash(s);
more += wsize;
}
if (s->strm->avail_in == 0)
break;
/* If there was no sliding:
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
* more == window_size - lookahead - strstart
* => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
* => more >= window_size - 2*WSIZE + 2
* In the BIG_MEM or MMAP case (not yet supported),
* window_size == input_size + MIN_LOOKAHEAD &&
* strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
* Otherwise, window_size == 2*WSIZE so more >= 2.
* If there was sliding, more >= WSIZE. So in all cases, more >= 2.
*/
Assert(more >= 2, "more < 2");
n = PREFIX(read_buf)(s->strm, s->window + s->strstart + s->lookahead, more);
s->lookahead += n;
/* Initialize the hash value now that we have some input: */
if (s->lookahead + s->insert >= STD_MIN_MATCH) {
unsigned int str = s->strstart - s->insert;
if (UNLIKELY(s->max_chain_length > 1024)) {
s->ins_h = s->update_hash(s, s->window[str], s->window[str+1]);
} else if (str >= 1) {
s->quick_insert_string(s, str + 2 - STD_MIN_MATCH);
}
unsigned int count = s->insert;
if (UNLIKELY(s->lookahead == 1)) {
count -= 1;
}
if (count > 0) {
s->insert_string(s, str, count);
s->insert -= count;
}
}
/* If the whole input has less than STD_MIN_MATCH bytes, ins_h is garbage,
* but this is not important since only literal bytes will be emitted.
*/
} while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
/* If the WIN_INIT bytes after the end of the current data have never been
* written, then zero those bytes in order to avoid memory check reports of
* the use of uninitialized (or uninitialised as Julian writes) bytes by
* the longest match routines. Update the high water mark for the next
* time through here. WIN_INIT is set to STD_MAX_MATCH since the longest match
* routines allow scanning to strstart + STD_MAX_MATCH, ignoring lookahead.
*/
if (s->high_water < s->window_size) {
unsigned int curr = s->strstart + s->lookahead;
unsigned int init;
if (s->high_water < curr) {
/* Previous high water mark below current data -- zero WIN_INIT
* bytes or up to end of window, whichever is less.
*/
init = s->window_size - curr;
if (init > WIN_INIT)
init = WIN_INIT;
memset(s->window + curr, 0, init);
s->high_water = curr + init;
} else if (s->high_water < curr + WIN_INIT) {
/* High water mark at or above current data, but below current data
* plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
* to end of window, whichever is less.
*/
init = curr + WIN_INIT - s->high_water;
if (init > s->window_size - s->high_water)
init = s->window_size - s->high_water;
memset(s->window + s->high_water, 0, init);
s->high_water += init;
}
}
Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD,
"not enough room for search");
}
#ifndef ZLIB_COMPAT
/* =========================================================================
* Checks whether buffer size is sufficient and whether this parameter is a duplicate.
*/
static int32_t deflateSetParamPre(zng_deflate_param_value **out, size_t min_size, zng_deflate_param_value *param) {
int32_t buf_error = param->size < min_size;
if (*out != NULL) {
(*out)->status = Z_BUF_ERROR;
buf_error = 1;
}
*out = param;
return buf_error;
}
/* ========================================================================= */
int32_t Z_EXPORT zng_deflateSetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count) {
size_t i;
deflate_state *s;
zng_deflate_param_value *new_level = NULL;
zng_deflate_param_value *new_strategy = NULL;
zng_deflate_param_value *new_reproducible = NULL;
int param_buf_error;
int version_error = 0;
int buf_error = 0;
int stream_error = 0;
/* Initialize the statuses. */
for (i = 0; i < count; i++)
params[i].status = Z_OK;
/* Check whether the stream state is consistent. */
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
/* Check buffer sizes and detect duplicates. */
for (i = 0; i < count; i++) {
switch (params[i].param) {
case Z_DEFLATE_LEVEL:
param_buf_error = deflateSetParamPre(&new_level, sizeof(int), ¶ms[i]);
break;
case Z_DEFLATE_STRATEGY:
param_buf_error = deflateSetParamPre(&new_strategy, sizeof(int), ¶ms[i]);
break;
case Z_DEFLATE_REPRODUCIBLE:
param_buf_error = deflateSetParamPre(&new_reproducible, sizeof(int), ¶ms[i]);
break;
default:
params[i].status = Z_VERSION_ERROR;
version_error = 1;
param_buf_error = 0;
break;
}
if (param_buf_error) {
params[i].status = Z_BUF_ERROR;
buf_error = 1;
}
}
/* Exit early if small buffers or duplicates are detected. */
if (buf_error)
return Z_BUF_ERROR;
/* Apply changes, remember if there were errors. */
if (new_level != NULL || new_strategy != NULL) {
int ret = PREFIX(deflateParams)(strm, new_level == NULL ? s->level : *(int *)new_level->buf,
new_strategy == NULL ? s->strategy : *(int *)new_strategy->buf);
if (ret != Z_OK) {
if (new_level != NULL)
new_level->status = Z_STREAM_ERROR;
if (new_strategy != NULL)
new_strategy->status = Z_STREAM_ERROR;
stream_error = 1;
}
}
if (new_reproducible != NULL) {
int val = *(int *)new_reproducible->buf;
if (DEFLATE_CAN_SET_REPRODUCIBLE(strm, val)) {
s->reproducible = val;
} else {
new_reproducible->status = Z_STREAM_ERROR;
stream_error = 1;
}
}
/* Report version errors only if there are no real errors. */
return stream_error ? Z_STREAM_ERROR : (version_error ? Z_VERSION_ERROR : Z_OK);
}
/* ========================================================================= */
int32_t Z_EXPORT zng_deflateGetParams(zng_stream *strm, zng_deflate_param_value *params, size_t count) {
deflate_state *s;
size_t i;
int32_t buf_error = 0;
int32_t version_error = 0;
/* Initialize the statuses. */
for (i = 0; i < count; i++)
params[i].status = Z_OK;
/* Check whether the stream state is consistent. */
if (deflateStateCheck(strm))
return Z_STREAM_ERROR;
s = strm->state;
for (i = 0; i < count; i++) {
switch (params[i].param) {
case Z_DEFLATE_LEVEL:
if (params[i].size < sizeof(int))
params[i].status = Z_BUF_ERROR;
else
*(int *)params[i].buf = s->level;
break;
case Z_DEFLATE_STRATEGY:
if (params[i].size < sizeof(int))
params[i].status = Z_BUF_ERROR;
else
*(int *)params[i].buf = s->strategy;
break;
case Z_DEFLATE_REPRODUCIBLE:
if (params[i].size < sizeof(int))
params[i].status = Z_BUF_ERROR;
else
*(int *)params[i].buf = s->reproducible;
break;
default:
params[i].status = Z_VERSION_ERROR;
version_error = 1;
break;
}
if (params[i].status == Z_BUF_ERROR)
buf_error = 1;
}
return buf_error ? Z_BUF_ERROR : (version_error ? Z_VERSION_ERROR : Z_OK);
}
#endif
3p-zlib-ng-main/zlib-ng/deflate.h 0000664 0000000 0000000 00000037610 14553115624 0017016 0 ustar 00root root 0000000 0000000 #ifndef DEFLATE_H_
#define DEFLATE_H_
/* deflate.h -- internal compression state
* Copyright (C) 1995-2016 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
#include "zutil.h"
#include "zendian.h"
#include "adler32_fold.h"
#include "crc32_fold.h"
/* define NO_GZIP when compiling if you want to disable gzip header and
trailer creation by deflate(). NO_GZIP would be used to avoid linking in
the crc code when it is not needed. For shared libraries, gzip encoding
should be left enabled. */
#ifndef NO_GZIP
# define GZIP
#endif
/* ===========================================================================
* Internal compression state.
*/
#define LENGTH_CODES 29
/* number of length codes, not counting the special END_BLOCK code */
#define LITERALS 256
/* number of literal bytes 0..255 */
#define L_CODES (LITERALS+1+LENGTH_CODES)
/* number of Literal or Length codes, including the END_BLOCK code */
#define D_CODES 30
/* number of distance codes */
#define BL_CODES 19
/* number of codes used to transfer the bit lengths */
#define HEAP_SIZE (2*L_CODES+1)
/* maximum heap size */
#define BIT_BUF_SIZE 64
/* size of bit buffer in bi_buf */
#define END_BLOCK 256
/* end of block literal code */
#define INIT_STATE 1 /* zlib header -> BUSY_STATE */
#ifdef GZIP
# define GZIP_STATE 4 /* gzip header -> BUSY_STATE | EXTRA_STATE */
# define EXTRA_STATE 5 /* gzip extra block -> NAME_STATE */
# define NAME_STATE 6 /* gzip file name -> COMMENT_STATE */
# define COMMENT_STATE 7 /* gzip comment -> HCRC_STATE */
# define HCRC_STATE 8 /* gzip header CRC -> BUSY_STATE */
#endif
#define BUSY_STATE 2 /* deflate -> FINISH_STATE */
#define FINISH_STATE 3 /* stream complete */
#ifdef GZIP
# define MAX_STATE HCRC_STATE
#else
# define MAX_STATE FINISH_STATE
#endif
/* Stream status */
#define HASH_BITS 16u /* log2(HASH_SIZE) */
#ifndef HASH_SIZE
# define HASH_SIZE 65536u /* number of elements in hash table */
#endif
#define HASH_MASK (HASH_SIZE - 1u) /* HASH_SIZE-1 */
/* Data structure describing a single value and its code string. */
typedef struct ct_data_s {
union {
uint16_t freq; /* frequency count */
uint16_t code; /* bit string */
} fc;
union {
uint16_t dad; /* father node in Huffman tree */
uint16_t len; /* length of bit string */
} dl;
} ct_data;
#define Freq fc.freq
#define Code fc.code
#define Dad dl.dad
#define Len dl.len
typedef struct static_tree_desc_s static_tree_desc;
typedef struct tree_desc_s {
ct_data *dyn_tree; /* the dynamic tree */
int max_code; /* largest code with non zero frequency */
const static_tree_desc *stat_desc; /* the corresponding static tree */
} tree_desc;
typedef uint16_t Pos;
/* A Pos is an index in the character window. We use short instead of int to
* save space in the various tables.
*/
/* Type definitions for hash callbacks */
typedef struct internal_state deflate_state;
typedef uint32_t (* update_hash_cb) (deflate_state *const s, uint32_t h, uint32_t val);
typedef void (* insert_string_cb) (deflate_state *const s, uint32_t str, uint32_t count);
typedef Pos (* quick_insert_string_cb)(deflate_state *const s, uint32_t str);
struct internal_state {
PREFIX3(stream) *strm; /* pointer back to this zlib stream */
unsigned char *pending_buf; /* output still pending */
unsigned char *pending_out; /* next pending byte to output to the stream */
uint32_t pending_buf_size; /* size of pending_buf */
uint32_t pending; /* nb of bytes in the pending buffer */
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
uint32_t gzindex; /* where in extra, name, or comment */
PREFIX(gz_headerp) gzhead; /* gzip header information to write */
int status; /* as the name implies */
int last_flush; /* value of flush param for previous deflate call */
int reproducible; /* Whether reproducible compression results are required. */
int block_open;
/* Whether or not a block is currently open for the QUICK deflation scheme.
* This is set to 1 if there is an active block, or 0 if the block was just closed.
*/
/* used by deflate.c: */
unsigned int w_size; /* LZ77 window size (32K by default) */
unsigned int w_bits; /* log2(w_size) (8..16) */
unsigned int w_mask; /* w_size - 1 */
unsigned int lookahead; /* number of valid bytes ahead in window */
unsigned int high_water;
/* High water mark offset in window for initialized bytes -- bytes above
* this are set to zero in order to avoid memory check warnings when
* longest match routines access bytes past the input. This is then
* updated to the new high water mark.
*/
unsigned int window_size;
/* Actual size of window: 2*wSize, except when the user input buffer
* is directly used as sliding window.
*/
unsigned char *window;
/* Sliding window. Input bytes are read into the second half of the window,
* and move to the first half later to keep a dictionary of at least wSize
* bytes. With this organization, matches are limited to a distance of
* wSize-STD_MAX_MATCH bytes, but this ensures that IO is always
* performed with a length multiple of the block size. Also, it limits
* the window size to 64K, which is quite useful on MSDOS.
* To do: use the user input buffer as sliding window.
*/
Pos *prev;
/* Link to older string with same hash index. To limit the size of this
* array to 64K, this link is maintained only for the last 32K strings.
* An index in this array is thus a window index modulo 32K.
*/
Pos *head; /* Heads of the hash chains or 0. */
uint32_t ins_h; /* hash index of string to be inserted */
int block_start;
/* Window position at the beginning of the current output block. Gets
* negative when the window is moved backwards.
*/
unsigned int match_length; /* length of best match */
Pos prev_match; /* previous match */
int match_available; /* set if previous match exists */
unsigned int strstart; /* start of string to insert */
unsigned int match_start; /* start of matching string */
unsigned int prev_length;
/* Length of the best match at previous step. Matches not greater than this
* are discarded. This is used in the lazy match evaluation.
*/
unsigned int max_chain_length;
/* To speed up deflation, hash chains are never searched beyond this length.
* A higher limit improves compression ratio but degrades the speed.
*/
unsigned int max_lazy_match;
/* Attempt to find a better match only when the current match is strictly smaller
* than this value. This mechanism is used only for compression levels >= 4.
*/
# define max_insert_length max_lazy_match
/* Insert new strings in the hash table only if the match length is not
* greater than this length. This saves time but degrades compression.
* max_insert_length is used only for compression levels <= 3.
*/
update_hash_cb update_hash;
insert_string_cb insert_string;
quick_insert_string_cb quick_insert_string;
/* Hash function callbacks that can be configured depending on the deflate
* algorithm being used */
int level; /* compression level (1..9) */
int strategy; /* favor or force Huffman coding*/
unsigned int good_match;
/* Use a faster search when the previous match is longer than this */
int nice_match; /* Stop searching when current match exceeds this */
struct crc32_fold_s ALIGNED_(16) crc_fold;
/* used by trees.c: */
/* Didn't use ct_data typedef below to suppress compiler warning */
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
struct tree_desc_s l_desc; /* desc. for literal tree */
struct tree_desc_s d_desc; /* desc. for distance tree */
struct tree_desc_s bl_desc; /* desc. for bit length tree */
uint16_t bl_count[MAX_BITS+1];
/* number of codes at each bit length for an optimal tree */
int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
int heap_len; /* number of elements in the heap */
int heap_max; /* element of largest frequency */
/* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
* The same heap array is used to build all trees.
*/
unsigned char depth[2*L_CODES+1];
/* Depth of each subtree used as tie breaker for trees of equal frequency
*/
unsigned int lit_bufsize;
/* Size of match buffer for literals/lengths. There are 4 reasons for
* limiting lit_bufsize to 64K:
* - frequencies can be kept in 16 bit counters
* - if compression is not successful for the first block, all input
* data is still in the window so we can still emit a stored block even
* when input comes from standard input. (This can also be done for
* all blocks if lit_bufsize is not greater than 32K.)
* - if compression is not successful for a file smaller than 64K, we can
* even emit a stored file instead of a stored block (saving 5 bytes).
* This is applicable only for zip (not gzip or zlib).
* - creating new Huffman trees less frequently may not provide fast
* adaptation to changes in the input data statistics. (Take for
* example a binary file with poorly compressible code followed by
* a highly compressible string table.) Smaller buffer sizes give
* fast adaptation but have of course the overhead of transmitting
* trees more frequently.
* - I can't count above 4
*/
unsigned char *sym_buf; /* buffer for distances and literals/lengths */
unsigned int sym_next; /* running index in sym_buf */
unsigned int sym_end; /* symbol table full when sym_next reaches this */
unsigned long opt_len; /* bit length of current block with optimal trees */
unsigned long static_len; /* bit length of current block with static trees */
unsigned int matches; /* number of string matches in current block */
unsigned int insert; /* bytes at end of window left to insert */
/* compressed_len and bits_sent are only used if ZLIB_DEBUG is defined */
unsigned long compressed_len; /* total bit length of compressed file mod 2^32 */
unsigned long bits_sent; /* bit length of compressed data sent mod 2^32 */
/* Reserved for future use and alignment purposes */
char *reserved_p;
uint64_t bi_buf;
/* Output buffer. bits are inserted starting at the bottom (least significant bits). */
int32_t bi_valid;
/* Number of valid bits in bi_buf. All bits above the last valid bit are always zero. */
/* Reserved for future use and alignment purposes */
int32_t reserved[11];
} ALIGNED_(8);
typedef enum {
need_more, /* block not completed, need more input or more output */
block_done, /* block flush performed */
finish_started, /* finish started, need only more output at next deflate */
finish_done /* finish done, accept no more input or output */
} block_state;
/* Output a byte on the stream.
* IN assertion: there is enough room in pending_buf.
*/
#define put_byte(s, c) { \
s->pending_buf[s->pending++] = (unsigned char)(c); \
}
/* ===========================================================================
* Output a short LSB first on the stream.
* IN assertion: there is enough room in pending_buf.
*/
static inline void put_short(deflate_state *s, uint16_t w) {
#if BYTE_ORDER == BIG_ENDIAN
w = ZSWAP16(w);
#endif
memcpy(&s->pending_buf[s->pending], &w, sizeof(w));
s->pending += 2;
}
/* ===========================================================================
* Output a short MSB first on the stream.
* IN assertion: there is enough room in pending_buf.
*/
static inline void put_short_msb(deflate_state *s, uint16_t w) {
#if BYTE_ORDER == LITTLE_ENDIAN
w = ZSWAP16(w);
#endif
memcpy(&s->pending_buf[s->pending], &w, sizeof(w));
s->pending += 2;
}
/* ===========================================================================
* Output a 32-bit unsigned int LSB first on the stream.
* IN assertion: there is enough room in pending_buf.
*/
static inline void put_uint32(deflate_state *s, uint32_t dw) {
#if BYTE_ORDER == BIG_ENDIAN
dw = ZSWAP32(dw);
#endif
memcpy(&s->pending_buf[s->pending], &dw, sizeof(dw));
s->pending += 4;
}
/* ===========================================================================
* Output a 32-bit unsigned int MSB first on the stream.
* IN assertion: there is enough room in pending_buf.
*/
static inline void put_uint32_msb(deflate_state *s, uint32_t dw) {
#if BYTE_ORDER == LITTLE_ENDIAN
dw = ZSWAP32(dw);
#endif
memcpy(&s->pending_buf[s->pending], &dw, sizeof(dw));
s->pending += 4;
}
/* ===========================================================================
* Output a 64-bit unsigned int LSB first on the stream.
* IN assertion: there is enough room in pending_buf.
*/
static inline void put_uint64(deflate_state *s, uint64_t lld) {
#if BYTE_ORDER == BIG_ENDIAN
lld = ZSWAP64(lld);
#endif
memcpy(&s->pending_buf[s->pending], &lld, sizeof(lld));
s->pending += 8;
}
#define MIN_LOOKAHEAD (STD_MAX_MATCH + STD_MIN_MATCH + 1)
/* Minimum amount of lookahead, except at the end of the input file.
* See deflate.c for comments about the STD_MIN_MATCH+1.
*/
#define MAX_DIST(s) ((s)->w_size - MIN_LOOKAHEAD)
/* In order to simplify the code, particularly on 16 bit machines, match
* distances are limited to MAX_DIST instead of WSIZE.
*/
#define WIN_INIT STD_MAX_MATCH
/* Number of bytes after end of data in window to initialize in order to avoid
memory checker errors from longest match routines */
void Z_INTERNAL PREFIX(fill_window)(deflate_state *s);
void Z_INTERNAL slide_hash_c(deflate_state *s);
/* in trees.c */
void Z_INTERNAL zng_tr_init(deflate_state *s);
void Z_INTERNAL zng_tr_flush_block(deflate_state *s, char *buf, uint32_t stored_len, int last);
void Z_INTERNAL zng_tr_flush_bits(deflate_state *s);
void Z_INTERNAL zng_tr_align(deflate_state *s);
void Z_INTERNAL zng_tr_stored_block(deflate_state *s, char *buf, uint32_t stored_len, int last);
uint16_t Z_INTERNAL PREFIX(bi_reverse)(unsigned code, int len);
void Z_INTERNAL PREFIX(flush_pending)(PREFIX3(streamp) strm);
#define d_code(dist) ((dist) < 256 ? zng_dist_code[dist] : zng_dist_code[256+((dist)>>7)])
/* Mapping from a distance to a distance code. dist is the distance - 1 and
* must not have side effects. zng_dist_code[256] and zng_dist_code[257] are never
* used.
*/
/* Bit buffer and compress bits calculation debugging */
#ifdef ZLIB_DEBUG
# define cmpr_bits_add(s, len) s->compressed_len += (len)
# define cmpr_bits_align(s) s->compressed_len = (s->compressed_len + 7) & ~7L
# define sent_bits_add(s, bits) s->bits_sent += (bits)
# define sent_bits_align(s) s->bits_sent = (s->bits_sent + 7) & ~7L
#else
# define cmpr_bits_add(s, len) Z_UNUSED(len)
# define cmpr_bits_align(s)
# define sent_bits_add(s, bits) Z_UNUSED(bits)
# define sent_bits_align(s)
#endif
#endif /* DEFLATE_H_ */
3p-zlib-ng-main/zlib-ng/deflate_fast.c 0000664 0000000 0000000 00000010003 14553115624 0020011 0 ustar 00root root 0000000 0000000 /* deflate_fast.c -- compress data using the fast strategy of deflation algorithm
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
/* ===========================================================================
* Compress as much as possible from the input stream, return the current
* block state.
* This function does not perform lazy evaluation of matches and inserts
* new strings in the dictionary only for unmatched strings or for short
* matches. It is used only for the fast compression options.
*/
Z_INTERNAL block_state deflate_fast(deflate_state *s, int flush) {
Pos hash_head; /* head of the hash chain */
int bflush = 0; /* set if current block must be flushed */
int64_t dist;
uint32_t match_len = 0;
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need STD_MAX_MATCH bytes
* for the next match, plus WANT_MIN_MATCH bytes to insert the
* string following the next match.
*/
if (s->lookahead < MIN_LOOKAHEAD) {
PREFIX(fill_window)(s);
if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) {
return need_more;
}
if (UNLIKELY(s->lookahead == 0))
break; /* flush the current block */
}
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
if (s->lookahead >= WANT_MIN_MATCH) {
hash_head = functable.quick_insert_string(s, s->strstart);
dist = (int64_t)s->strstart - hash_head;
/* Find the longest match, discarding those <= prev_length.
* At this point we have always match length < WANT_MIN_MATCH
*/
if (dist <= MAX_DIST(s) && dist > 0 && hash_head != 0) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
match_len = functable.longest_match(s, hash_head);
/* longest_match() sets match_start */
}
}
if (match_len >= WANT_MIN_MATCH) {
check_match(s, s->strstart, s->match_start, match_len);
bflush = zng_tr_tally_dist(s, s->strstart - s->match_start, match_len - STD_MIN_MATCH);
s->lookahead -= match_len;
/* Insert new strings in the hash table only if the match length
* is not too large. This saves time but degrades compression.
*/
if (match_len <= s->max_insert_length && s->lookahead >= WANT_MIN_MATCH) {
match_len--; /* string at strstart already in table */
s->strstart++;
functable.insert_string(s, s->strstart, match_len);
s->strstart += match_len;
} else {
s->strstart += match_len;
functable.quick_insert_string(s, s->strstart + 2 - STD_MIN_MATCH);
/* If lookahead < STD_MIN_MATCH, ins_h is garbage, but it does not
* matter since it will be recomputed at next deflate call.
*/
}
match_len = 0;
} else {
/* No match, output a literal byte */
bflush = zng_tr_tally_lit(s, s->window[s->strstart]);
s->lookahead--;
s->strstart++;
}
if (UNLIKELY(bflush))
FLUSH_BLOCK(s, 0);
}
s->insert = s->strstart < (STD_MIN_MATCH - 1) ? s->strstart : (STD_MIN_MATCH - 1);
if (UNLIKELY(flush == Z_FINISH)) {
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (UNLIKELY(s->sym_next))
FLUSH_BLOCK(s, 0);
return block_done;
}
3p-zlib-ng-main/zlib-ng/deflate_huff.c 0000664 0000000 0000000 00000002575 14553115624 0020023 0 ustar 00root root 0000000 0000000 /* deflate_huff.c -- compress data using huffman encoding only strategy
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
/* ===========================================================================
* For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
* (It will be regenerated if this run of deflate switches away from Huffman.)
*/
Z_INTERNAL block_state deflate_huff(deflate_state *s, int flush) {
int bflush = 0; /* set if current block must be flushed */
for (;;) {
/* Make sure that we have a literal to write. */
if (s->lookahead == 0) {
PREFIX(fill_window)(s);
if (s->lookahead == 0) {
if (flush == Z_NO_FLUSH)
return need_more;
break; /* flush the current block */
}
}
/* Output a literal byte */
bflush = zng_tr_tally_lit(s, s->window[s->strstart]);
s->lookahead--;
s->strstart++;
if (bflush)
FLUSH_BLOCK(s, 0);
}
s->insert = 0;
if (flush == Z_FINISH) {
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
3p-zlib-ng-main/zlib-ng/deflate_medium.c 0000664 0000000 0000000 00000024703 14553115624 0020350 0 ustar 00root root 0000000 0000000 /* deflate_medium.c -- The deflate_medium deflate strategy
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Authors:
* Arjan van de Ven
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#ifndef NO_MEDIUM_STRATEGY
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
struct match {
uint16_t match_start;
uint16_t match_length;
uint16_t strstart;
uint16_t orgstart;
};
static int emit_match(deflate_state *s, struct match match) {
int bflush = 0;
/* matches that are not long enough we need to emit as literals */
if (match.match_length < WANT_MIN_MATCH) {
while (match.match_length) {
bflush += zng_tr_tally_lit(s, s->window[match.strstart]);
s->lookahead--;
match.strstart++;
match.match_length--;
}
return bflush;
}
check_match(s, match.strstart, match.match_start, match.match_length);
bflush += zng_tr_tally_dist(s, match.strstart - match.match_start, match.match_length - STD_MIN_MATCH);
s->lookahead -= match.match_length;
return bflush;
}
static void insert_match(deflate_state *s, struct match match) {
if (UNLIKELY(s->lookahead <= (unsigned int)(match.match_length + WANT_MIN_MATCH)))
return;
/* matches that are not long enough we need to emit as literals */
if (LIKELY(match.match_length < WANT_MIN_MATCH)) {
match.strstart++;
match.match_length--;
if (UNLIKELY(match.match_length > 0)) {
if (match.strstart >= match.orgstart) {
if (match.strstart + match.match_length - 1 >= match.orgstart) {
functable.insert_string(s, match.strstart, match.match_length);
} else {
functable.insert_string(s, match.strstart, match.orgstart - match.strstart + 1);
}
match.strstart += match.match_length;
match.match_length = 0;
}
}
return;
}
/* Insert new strings in the hash table only if the match length
* is not too large. This saves time but degrades compression.
*/
if (match.match_length <= 16 * s->max_insert_length && s->lookahead >= WANT_MIN_MATCH) {
match.match_length--; /* string at strstart already in table */
match.strstart++;
if (LIKELY(match.strstart >= match.orgstart)) {
if (LIKELY(match.strstart + match.match_length - 1 >= match.orgstart)) {
functable.insert_string(s, match.strstart, match.match_length);
} else {
functable.insert_string(s, match.strstart, match.orgstart - match.strstart + 1);
}
} else if (match.orgstart < match.strstart + match.match_length) {
functable.insert_string(s, match.orgstart, match.strstart + match.match_length - match.orgstart);
}
match.strstart += match.match_length;
match.match_length = 0;
} else {
match.strstart += match.match_length;
match.match_length = 0;
if (match.strstart >= (STD_MIN_MATCH - 2))
functable.quick_insert_string(s, match.strstart + 2 - STD_MIN_MATCH);
/* If lookahead < WANT_MIN_MATCH, ins_h is garbage, but it does not
* matter since it will be recomputed at next deflate call.
*/
}
}
static void fizzle_matches(deflate_state *s, struct match *current, struct match *next) {
Pos limit;
unsigned char *match, *orig;
int changed = 0;
struct match c, n;
/* step zero: sanity checks */
if (current->match_length <= 1)
return;
if (UNLIKELY(current->match_length > 1 + next->match_start))
return;
if (UNLIKELY(current->match_length > 1 + next->strstart))
return;
match = s->window - current->match_length + 1 + next->match_start;
orig = s->window - current->match_length + 1 + next->strstart;
/* quick exit check.. if this fails then don't bother with anything else */
if (LIKELY(*match != *orig))
return;
c = *current;
n = *next;
/* step one: try to move the "next" match to the left as much as possible */
limit = next->strstart > MAX_DIST(s) ? next->strstart - (Pos)MAX_DIST(s) : 0;
match = s->window + n.match_start - 1;
orig = s->window + n.strstart - 1;
while (*match == *orig) {
if (UNLIKELY(c.match_length < 1))
break;
if (UNLIKELY(n.strstart <= limit))
break;
if (UNLIKELY(n.match_length >= 256))
break;
if (UNLIKELY(n.match_start <= 1))
break;
n.strstart--;
n.match_start--;
n.match_length++;
c.match_length--;
match--;
orig--;
changed++;
}
if (!changed)
return;
if (c.match_length <= 1 && n.match_length != 2) {
n.orgstart++;
*current = c;
*next = n;
} else {
return;
}
}
Z_INTERNAL block_state deflate_medium(deflate_state *s, int flush) {
/* Align the first struct to start on a new cacheline, this allows us to fit both structs in one cacheline */
ALIGNED_(16) struct match current_match;
struct match next_match;
/* For levels below 5, don't check the next position for a better match */
int early_exit = s->level < 5;
memset(¤t_match, 0, sizeof(struct match));
memset(&next_match, 0, sizeof(struct match));
for (;;) {
Pos hash_head = 0; /* head of the hash chain */
int bflush = 0; /* set if current block must be flushed */
int64_t dist;
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need STD_MAX_MATCH bytes
* for the next match, plus WANT_MIN_MATCH bytes to insert the
* string following the next current_match.
*/
if (s->lookahead < MIN_LOOKAHEAD) {
PREFIX(fill_window)(s);
if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
return need_more;
}
if (UNLIKELY(s->lookahead == 0))
break; /* flush the current block */
next_match.match_length = 0;
}
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
/* If we already have a future match from a previous round, just use that */
if (!early_exit && next_match.match_length > 0) {
current_match = next_match;
next_match.match_length = 0;
} else {
hash_head = 0;
if (s->lookahead >= WANT_MIN_MATCH) {
hash_head = functable.quick_insert_string(s, s->strstart);
}
current_match.strstart = (uint16_t)s->strstart;
current_match.orgstart = current_match.strstart;
/* Find the longest match, discarding those <= prev_length.
* At this point we have always match_length < WANT_MIN_MATCH
*/
dist = (int64_t)s->strstart - hash_head;
if (dist <= MAX_DIST(s) && dist > 0 && hash_head != 0) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
current_match.match_length = (uint16_t)functable.longest_match(s, hash_head);
current_match.match_start = (uint16_t)s->match_start;
if (UNLIKELY(current_match.match_length < WANT_MIN_MATCH))
current_match.match_length = 1;
if (UNLIKELY(current_match.match_start >= current_match.strstart)) {
/* this can happen due to some restarts */
current_match.match_length = 1;
}
} else {
/* Set up the match to be a 1 byte literal */
current_match.match_start = 0;
current_match.match_length = 1;
}
}
insert_match(s, current_match);
/* now, look ahead one */
if (LIKELY(!early_exit && s->lookahead > MIN_LOOKAHEAD && (uint32_t)(current_match.strstart + current_match.match_length) < (s->window_size - MIN_LOOKAHEAD))) {
s->strstart = current_match.strstart + current_match.match_length;
hash_head = functable.quick_insert_string(s, s->strstart);
next_match.strstart = (uint16_t)s->strstart;
next_match.orgstart = next_match.strstart;
/* Find the longest match, discarding those <= prev_length.
* At this point we have always match_length < WANT_MIN_MATCH
*/
dist = (int64_t)s->strstart - hash_head;
if (dist <= MAX_DIST(s) && dist > 0 && hash_head != 0) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
next_match.match_length = (uint16_t)functable.longest_match(s, hash_head);
next_match.match_start = (uint16_t)s->match_start;
if (UNLIKELY(next_match.match_start >= next_match.strstart)) {
/* this can happen due to some restarts */
next_match.match_length = 1;
}
if (next_match.match_length < WANT_MIN_MATCH)
next_match.match_length = 1;
else
fizzle_matches(s, ¤t_match, &next_match);
} else {
/* Set up the match to be a 1 byte literal */
next_match.match_start = 0;
next_match.match_length = 1;
}
s->strstart = current_match.strstart;
} else {
next_match.match_length = 0;
}
/* now emit the current match */
bflush = emit_match(s, current_match);
/* move the "cursor" forward */
s->strstart += current_match.match_length;
if (UNLIKELY(bflush))
FLUSH_BLOCK(s, 0);
}
s->insert = s->strstart < (STD_MIN_MATCH - 1) ? s->strstart : (STD_MIN_MATCH - 1);
if (flush == Z_FINISH) {
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (UNLIKELY(s->sym_next))
FLUSH_BLOCK(s, 0);
return block_done;
}
#endif
3p-zlib-ng-main/zlib-ng/deflate_p.h 0000664 0000000 0000000 00000010422 14553115624 0017325 0 ustar 00root root 0000000 0000000 /* deflate_p.h -- Private inline functions and macros shared with more than
* one deflate method
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
*/
#ifndef DEFLATE_P_H
#define DEFLATE_P_H
/* Forward declare common non-inlined functions declared in deflate.c */
#ifdef ZLIB_DEBUG
/* ===========================================================================
* Check that the match at match_start is indeed a match.
*/
static inline void check_match(deflate_state *s, Pos start, Pos match, int length) {
/* check that the match length is valid*/
if (length < STD_MIN_MATCH || length > STD_MAX_MATCH) {
fprintf(stderr, " start %u, match %u, length %d\n", start, match, length);
z_error("invalid match length");
}
/* check that the match isn't at the same position as the start string */
if (match == start) {
fprintf(stderr, " start %u, match %u, length %d\n", start, match, length);
z_error("invalid match position");
}
/* check that the match is indeed a match */
if (memcmp(s->window + match, s->window + start, length) != 0) {
int32_t i = 0;
fprintf(stderr, " start %u, match %u, length %d\n", start, match, length);
do {
fprintf(stderr, " %03d: match [%02x] start [%02x]\n", i++,
s->window[match++], s->window[start++]);
} while (--length != 0);
z_error("invalid match");
}
if (z_verbose > 1) {
fprintf(stderr, "\\[%u,%d]", start-match, length);
do {
putc(s->window[start++], stderr);
} while (--length != 0);
}
}
#else
#define check_match(s, start, match, length)
#endif
Z_INTERNAL void PREFIX(flush_pending)(PREFIX3(stream) *strm);
Z_INTERNAL unsigned PREFIX(read_buf)(PREFIX3(stream) *strm, unsigned char *buf, unsigned size);
/* ===========================================================================
* Save the match info and tally the frequency counts. Return true if
* the current block must be flushed.
*/
extern const unsigned char Z_INTERNAL zng_length_code[];
extern const unsigned char Z_INTERNAL zng_dist_code[];
static inline int zng_tr_tally_lit(deflate_state *s, unsigned char c) {
/* c is the unmatched char */
s->sym_buf[s->sym_next++] = 0;
s->sym_buf[s->sym_next++] = 0;
s->sym_buf[s->sym_next++] = c;
s->dyn_ltree[c].Freq++;
Tracevv((stderr, "%c", c));
Assert(c <= (STD_MAX_MATCH-STD_MIN_MATCH), "zng_tr_tally: bad literal");
return (s->sym_next == s->sym_end);
}
static inline int zng_tr_tally_dist(deflate_state *s, uint32_t dist, uint32_t len) {
/* dist: distance of matched string */
/* len: match length-STD_MIN_MATCH */
s->sym_buf[s->sym_next++] = (uint8_t)(dist);
s->sym_buf[s->sym_next++] = (uint8_t)(dist >> 8);
s->sym_buf[s->sym_next++] = (uint8_t)len;
s->matches++;
dist--;
Assert(dist < MAX_DIST(s) && (uint16_t)d_code(dist) < (uint16_t)D_CODES,
"zng_tr_tally: bad match");
s->dyn_ltree[zng_length_code[len]+LITERALS+1].Freq++;
s->dyn_dtree[d_code(dist)].Freq++;
return (s->sym_next == s->sym_end);
}
/* ===========================================================================
* Flush the current block, with given end-of-file flag.
* IN assertion: strstart is set to the end of the current match.
*/
#define FLUSH_BLOCK_ONLY(s, last) { \
zng_tr_flush_block(s, (s->block_start >= 0 ? \
(char *)&s->window[(unsigned)s->block_start] : \
NULL), \
(uint32_t)((int)s->strstart - s->block_start), \
(last)); \
s->block_start = (int)s->strstart; \
PREFIX(flush_pending)(s->strm); \
}
/* Same but force premature exit if necessary. */
#define FLUSH_BLOCK(s, last) { \
FLUSH_BLOCK_ONLY(s, last); \
if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
}
/* Maximum stored block length in deflate format (not including header). */
#define MAX_STORED 65535
/* Compression function. Returns the block state after the call. */
typedef block_state (*compress_func) (deflate_state *s, int flush);
/* Match function. Returns the longest match. */
typedef uint32_t (*match_func) (deflate_state *const s, Pos cur_match);
#endif
3p-zlib-ng-main/zlib-ng/deflate_quick.c 0000664 0000000 0000000 00000010524 14553115624 0020200 0 ustar 00root root 0000000 0000000 /*
* The deflate_quick deflate strategy, designed to be used when cycles are
* at a premium.
*
* Copyright (C) 2013 Intel Corporation. All rights reserved.
* Authors:
* Wajdi Feghali
* Jim Guilford
* Vinodh Gopal
* Erdinc Ozturk
* Jim Kukunas
*
* Portions are Copyright (C) 2016 12Sided Technology, LLC.
* Author:
* Phil Vachon
*
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "zutil_p.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
#include "trees_emit.h"
extern const ct_data static_ltree[L_CODES+2];
extern const ct_data static_dtree[D_CODES];
#define QUICK_START_BLOCK(s, last) { \
zng_tr_emit_tree(s, STATIC_TREES, last); \
s->block_open = 1 + (int)last; \
s->block_start = (int)s->strstart; \
}
#define QUICK_END_BLOCK(s, last) { \
if (s->block_open) { \
zng_tr_emit_end_block(s, static_ltree, last); \
s->block_open = 0; \
s->block_start = (int)s->strstart; \
PREFIX(flush_pending)(s->strm); \
if (s->strm->avail_out == 0) \
return (last) ? finish_started : need_more; \
} \
}
Z_INTERNAL block_state deflate_quick(deflate_state *s, int flush) {
Pos hash_head;
int64_t dist;
unsigned match_len, last;
last = (flush == Z_FINISH) ? 1 : 0;
if (UNLIKELY(last && s->block_open != 2)) {
/* Emit end of previous block */
QUICK_END_BLOCK(s, 0);
/* Emit start of last block */
QUICK_START_BLOCK(s, last);
} else if (UNLIKELY(s->block_open == 0 && s->lookahead > 0)) {
/* Start new block only when we have lookahead data, so that if no
input data is given an empty block will not be written */
QUICK_START_BLOCK(s, last);
}
for (;;) {
if (UNLIKELY(s->pending + ((BIT_BUF_SIZE + 7) >> 3) >= s->pending_buf_size)) {
PREFIX(flush_pending)(s->strm);
if (s->strm->avail_out == 0) {
return (last && s->strm->avail_in == 0 && s->bi_valid == 0 && s->block_open == 0) ? finish_started : need_more;
}
}
if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD)) {
PREFIX(fill_window)(s);
if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) {
return need_more;
}
if (UNLIKELY(s->lookahead == 0))
break;
if (UNLIKELY(s->block_open == 0)) {
/* Start new block when we have lookahead data, so that if no
input data is given an empty block will not be written */
QUICK_START_BLOCK(s, last);
}
}
if (LIKELY(s->lookahead >= WANT_MIN_MATCH)) {
hash_head = functable.quick_insert_string(s, s->strstart);
dist = (int64_t)s->strstart - hash_head;
if (dist <= MAX_DIST(s) && dist > 0) {
const uint8_t *str_start = s->window + s->strstart;
const uint8_t *match_start = s->window + hash_head;
if (zng_memcmp_2(str_start, match_start) == 0) {
match_len = functable.compare256(str_start+2, match_start+2) + 2;
if (match_len >= WANT_MIN_MATCH) {
if (UNLIKELY(match_len > s->lookahead))
match_len = s->lookahead;
if (UNLIKELY(match_len > STD_MAX_MATCH))
match_len = STD_MAX_MATCH;
check_match(s, s->strstart, hash_head, match_len);
zng_tr_emit_dist(s, static_ltree, static_dtree, match_len - STD_MIN_MATCH, (uint32_t)dist);
s->lookahead -= match_len;
s->strstart += match_len;
continue;
}
}
}
}
zng_tr_emit_lit(s, static_ltree, s->window[s->strstart]);
s->strstart++;
s->lookahead--;
}
s->insert = s->strstart < (STD_MIN_MATCH - 1) ? s->strstart : (STD_MIN_MATCH - 1);
if (UNLIKELY(last)) {
QUICK_END_BLOCK(s, 1);
return finish_done;
}
QUICK_END_BLOCK(s, 0);
return block_done;
}
3p-zlib-ng-main/zlib-ng/deflate_rle.c 0000664 0000000 0000000 00000005762 14553115624 0017656 0 ustar 00root root 0000000 0000000 /* deflate_rle.c -- compress data using RLE strategy of deflation algorithm
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "compare256_rle.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
#ifdef UNALIGNED_OK
# if defined(UNALIGNED64_OK) && defined(HAVE_BUILTIN_CTZLL)
# define compare256_rle compare256_rle_unaligned_64
# elif defined(HAVE_BUILTIN_CTZ)
# define compare256_rle compare256_rle_unaligned_32
# else
# define compare256_rle compare256_rle_unaligned_16
# endif
#else
# define compare256_rle compare256_rle_c
#endif
/* ===========================================================================
* For Z_RLE, simply look for runs of bytes, generate matches only of distance
* one. Do not maintain a hash table. (It will be regenerated if this run of
* deflate switches away from Z_RLE.)
*/
Z_INTERNAL block_state deflate_rle(deflate_state *s, int flush) {
int bflush = 0; /* set if current block must be flushed */
unsigned char *scan; /* scan goes up to strend for length of run */
uint32_t match_len = 0;
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need STD_MAX_MATCH bytes
* for the longest run, plus one for the unrolled loop.
*/
if (s->lookahead <= STD_MAX_MATCH) {
PREFIX(fill_window)(s);
if (s->lookahead <= STD_MAX_MATCH && flush == Z_NO_FLUSH)
return need_more;
if (s->lookahead == 0)
break; /* flush the current block */
}
/* See how many times the previous byte repeats */
if (s->lookahead >= STD_MIN_MATCH && s->strstart > 0) {
scan = s->window + s->strstart - 1;
if (scan[0] == scan[1] && scan[1] == scan[2]) {
match_len = compare256_rle(scan, scan+3)+2;
match_len = MIN(match_len, s->lookahead);
match_len = MIN(match_len, STD_MAX_MATCH);
}
Assert(scan+match_len <= s->window + s->window_size - 1, "wild scan");
}
/* Emit match if have run of STD_MIN_MATCH or longer, else emit literal */
if (match_len >= STD_MIN_MATCH) {
check_match(s, s->strstart, s->strstart - 1, match_len);
bflush = zng_tr_tally_dist(s, 1, match_len - STD_MIN_MATCH);
s->lookahead -= match_len;
s->strstart += match_len;
match_len = 0;
} else {
/* No match, output a literal byte */
bflush = zng_tr_tally_lit(s, s->window[s->strstart]);
s->lookahead--;
s->strstart++;
}
if (bflush)
FLUSH_BLOCK(s, 0);
}
s->insert = 0;
if (flush == Z_FINISH) {
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
3p-zlib-ng-main/zlib-ng/deflate_slow.c 0000664 0000000 0000000 00000013063 14553115624 0020051 0 ustar 00root root 0000000 0000000 /* deflate_slow.c -- compress data using the slow strategy of deflation algorithm
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
/* ===========================================================================
* Same as deflate_medium, but achieves better compression. We use a lazy
* evaluation for matches: a match is finally adopted only if there is
* no better match at the next window position.
*/
Z_INTERNAL block_state deflate_slow(deflate_state *s, int flush) {
Pos hash_head; /* head of hash chain */
int bflush; /* set if current block must be flushed */
int64_t dist;
uint32_t match_len;
match_func *longest_match;
if (s->max_chain_length <= 1024)
longest_match = &functable.longest_match;
else
longest_match = &functable.longest_match_slow;
/* Process the input block. */
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need STD_MAX_MATCH bytes
* for the next match, plus WANT_MIN_MATCH bytes to insert the
* string following the next match.
*/
if (s->lookahead < MIN_LOOKAHEAD) {
PREFIX(fill_window)(s);
if (UNLIKELY(s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH)) {
return need_more;
}
if (UNLIKELY(s->lookahead == 0))
break; /* flush the current block */
}
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
hash_head = 0;
if (LIKELY(s->lookahead >= WANT_MIN_MATCH)) {
hash_head = s->quick_insert_string(s, s->strstart);
}
/* Find the longest match, discarding those <= prev_length.
*/
s->prev_match = (Pos)s->match_start;
match_len = STD_MIN_MATCH - 1;
dist = (int64_t)s->strstart - hash_head;
if (dist <= MAX_DIST(s) && dist > 0 && s->prev_length < s->max_lazy_match && hash_head != 0) {
/* To simplify the code, we prevent matches with the string
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
match_len = (*longest_match)(s, hash_head);
/* longest_match() sets match_start */
if (match_len <= 5 && (s->strategy == Z_FILTERED)) {
/* If prev_match is also WANT_MIN_MATCH, match_start is garbage
* but we will ignore the current match anyway.
*/
match_len = STD_MIN_MATCH - 1;
}
}
/* If there was a match at the previous step and the current
* match is not better, output the previous match:
*/
if (s->prev_length >= STD_MIN_MATCH && match_len <= s->prev_length) {
unsigned int max_insert = s->strstart + s->lookahead - STD_MIN_MATCH;
/* Do not insert strings in hash table beyond this. */
check_match(s, s->strstart-1, s->prev_match, s->prev_length);
bflush = zng_tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - STD_MIN_MATCH);
/* Insert in hash table all strings up to the end of the match.
* strstart-1 and strstart are already inserted. If there is not
* enough lookahead, the last two strings are not inserted in
* the hash table.
*/
s->prev_length -= 1;
s->lookahead -= s->prev_length;
unsigned int mov_fwd = s->prev_length - 1;
if (max_insert > s->strstart) {
unsigned int insert_cnt = mov_fwd;
if (UNLIKELY(insert_cnt > max_insert - s->strstart))
insert_cnt = max_insert - s->strstart;
s->insert_string(s, s->strstart + 1, insert_cnt);
}
s->prev_length = 0;
s->match_available = 0;
s->strstart += mov_fwd + 1;
if (UNLIKELY(bflush))
FLUSH_BLOCK(s, 0);
} else if (s->match_available) {
/* If there was no match at the previous position, output a
* single literal. If there was a match but the current match
* is longer, truncate the previous match to a single literal.
*/
bflush = zng_tr_tally_lit(s, s->window[s->strstart-1]);
if (UNLIKELY(bflush))
FLUSH_BLOCK_ONLY(s, 0);
s->prev_length = match_len;
s->strstart++;
s->lookahead--;
if (UNLIKELY(s->strm->avail_out == 0))
return need_more;
} else {
/* There is no previous match to compare with, wait for
* the next step to decide.
*/
s->prev_length = match_len;
s->match_available = 1;
s->strstart++;
s->lookahead--;
}
}
Assert(flush != Z_NO_FLUSH, "no flush?");
if (UNLIKELY(s->match_available)) {
(void) zng_tr_tally_lit(s, s->window[s->strstart-1]);
s->match_available = 0;
}
s->insert = s->strstart < (STD_MIN_MATCH - 1) ? s->strstart : (STD_MIN_MATCH - 1);
if (UNLIKELY(flush == Z_FINISH)) {
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (UNLIKELY(s->sym_next))
FLUSH_BLOCK(s, 0);
return block_done;
}
3p-zlib-ng-main/zlib-ng/deflate_stored.c 0000664 0000000 0000000 00000020347 14553115624 0020370 0 ustar 00root root 0000000 0000000 /* deflate_stored.c -- store data without compression using deflation algorithm
*
* Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "zbuild.h"
#include "deflate.h"
#include "deflate_p.h"
#include "functable.h"
/* ===========================================================================
* Copy without compression as much as possible from the input stream, return
* the current block state.
*
* In case deflateParams() is used to later switch to a non-zero compression
* level, s->matches (otherwise unused when storing) keeps track of the number
* of hash table slides to perform. If s->matches is 1, then one hash table
* slide will be done when switching. If s->matches is 2, the maximum value
* allowed here, then the hash table will be cleared, since two or more slides
* is the same as a clear.
*
* deflate_stored() is written to minimize the number of times an input byte is
* copied. It is most efficient with large input and output buffers, which
* maximizes the opportunites to have a single copy from next_in to next_out.
*/
Z_INTERNAL block_state deflate_stored(deflate_state *s, int flush) {
/* Smallest worthy block size when not flushing or finishing. By default
* this is 32K. This can be as small as 507 bytes for memLevel == 1. For
* large input and output buffers, the stored block size will be larger.
*/
unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);
/* Copy as many min_block or larger stored blocks directly to next_out as
* possible. If flushing, copy the remaining available input to next_out as
* stored blocks, if there is enough space.
*/
unsigned len, left, have, last = 0;
unsigned used = s->strm->avail_in;
do {
/* Set len to the maximum size block that we can copy directly with the
* available input data and output space. Set left to how much of that
* would be copied from what's left in the window.
*/
len = MAX_STORED; /* maximum deflate stored block length */
have = (s->bi_valid + 42) >> 3; /* number of header bytes */
if (s->strm->avail_out < have) /* need room for header */
break;
/* maximum stored block length that will fit in avail_out: */
have = s->strm->avail_out - have;
left = (int)s->strstart - s->block_start; /* bytes left in window */
if (len > (unsigned long)left + s->strm->avail_in)
len = left + s->strm->avail_in; /* limit len to the input */
len = MIN(len, have); /* limit len to the output */
/* If the stored block would be less than min_block in length, or if
* unable to copy all of the available input when flushing, then try
* copying to the window and the pending buffer instead. Also don't
* write an empty block when flushing -- deflate() does that.
*/
if (len < min_block && ((len == 0 && flush != Z_FINISH) || flush == Z_NO_FLUSH || len != left + s->strm->avail_in))
break;
/* Make a dummy stored block in pending to get the header bytes,
* including any pending bits. This also updates the debugging counts.
*/
last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
zng_tr_stored_block(s, (char *)0, 0L, last);
/* Replace the lengths in the dummy stored block with len. */
s->pending -= 4;
put_short(s, (uint16_t)len);
put_short(s, (uint16_t)~len);
/* Write the stored block header bytes. */
PREFIX(flush_pending)(s->strm);
/* Update debugging counts for the data about to be copied. */
cmpr_bits_add(s, len << 3);
sent_bits_add(s, len << 3);
/* Copy uncompressed bytes from the window to next_out. */
if (left) {
left = MIN(left, len);
memcpy(s->strm->next_out, s->window + s->block_start, left);
s->strm->next_out += left;
s->strm->avail_out -= left;
s->strm->total_out += left;
s->block_start += (int)left;
len -= left;
}
/* Copy uncompressed bytes directly from next_in to next_out, updating
* the check value.
*/
if (len) {
PREFIX(read_buf)(s->strm, s->strm->next_out, len);
s->strm->next_out += len;
s->strm->avail_out -= len;
s->strm->total_out += len;
}
} while (last == 0);
/* Update the sliding window with the last s->w_size bytes of the copied
* data, or append all of the copied data to the existing window if less
* than s->w_size bytes were copied. Also update the number of bytes to
* insert in the hash tables, in the event that deflateParams() switches to
* a non-zero compression level.
*/
used -= s->strm->avail_in; /* number of input bytes directly copied */
if (used) {
/* If any input was used, then no unused input remains in the window,
* therefore s->block_start == s->strstart.
*/
if (used >= s->w_size) { /* supplant the previous history */
s->matches = 2; /* clear hash */
memcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
s->strstart = s->w_size;
s->insert = s->strstart;
} else {
if (s->window_size - s->strstart <= used) {
/* Slide the window down. */
s->strstart -= s->w_size;
memcpy(s->window, s->window + s->w_size, s->strstart);
if (s->matches < 2)
s->matches++; /* add a pending slide_hash() */
s->insert = MIN(s->insert, s->strstart);
}
memcpy(s->window + s->strstart, s->strm->next_in - used, used);
s->strstart += used;
s->insert += MIN(used, s->w_size - s->insert);
}
s->block_start = (int)s->strstart;
}
s->high_water = MAX(s->high_water, s->strstart);
/* If the last block was written to next_out, then done. */
if (last)
return finish_done;
/* If flushing and all input has been consumed, then done. */
if (flush != Z_NO_FLUSH && flush != Z_FINISH && s->strm->avail_in == 0 && (int)s->strstart == s->block_start)
return block_done;
/* Fill the window with any remaining input. */
have = s->window_size - s->strstart;
if (s->strm->avail_in > have && s->block_start >= (int)s->w_size) {
/* Slide the window down. */
s->block_start -= (int)s->w_size;
s->strstart -= s->w_size;
memcpy(s->window, s->window + s->w_size, s->strstart);
if (s->matches < 2)
s->matches++; /* add a pending slide_hash() */
have += s->w_size; /* more space now */
s->insert = MIN(s->insert, s->strstart);
}
have = MIN(have, s->strm->avail_in);
if (have) {
PREFIX(read_buf)(s->strm, s->window + s->strstart, have);
s->strstart += have;
s->insert += MIN(have, s->w_size - s->insert);
}
s->high_water = MAX(s->high_water, s->strstart);
/* There was not enough avail_out to write a complete worthy or flushed
* stored block to next_out. Write a stored block to pending instead, if we
* have enough input for a worthy block, or if flushing and there is enough
* room for the remaining input as a stored block in the pending buffer.
*/
have = (s->bi_valid + 42) >> 3; /* number of header bytes */
/* maximum stored block length that will fit in pending: */
have = MIN(s->pending_buf_size - have, MAX_STORED);
min_block = MIN(have, s->w_size);
left = (int)s->strstart - s->block_start;
if (left >= min_block || ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && s->strm->avail_in == 0 && left <= have)) {
len = MIN(left, have);
last = flush == Z_FINISH && s->strm->avail_in == 0 && len == left ? 1 : 0;
zng_tr_stored_block(s, (char *)s->window + s->block_start, len, last);
s->block_start += (int)len;
PREFIX(flush_pending)(s->strm);
}
/* We've done all we can with the available input and output. */
return last ? finish_started : need_more;
}
3p-zlib-ng-main/zlib-ng/doc/ 0000775 0000000 0000000 00000000000 14553115624 0015777 5 ustar 00root root 0000000 0000000 3p-zlib-ng-main/zlib-ng/doc/algorithm.txt 0000664 0000000 0000000 00000022170 14553115624 0020530 0 ustar 00root root 0000000 0000000 1. Compression algorithm (deflate)
The deflation algorithm used by gzip (also zip and zlib) is a variation of
LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
the input data. The second occurrence of a string is replaced by a
pointer to the previous string, in the form of a pair (distance,
length). Distances are limited to 32K bytes, and lengths are limited
to 258 bytes. When a string does not occur anywhere in the previous
32K bytes, it is emitted as a sequence of literal bytes. (In this
description, `string' must be taken as an arbitrary sequence of bytes,
and is not restricted to printable characters.)
Literals or match lengths are compressed with one Huffman tree, and
match distances are compressed with another tree. The trees are stored
in a compact form at the start of each block. The blocks can have any
size (except that the compressed data for one block must fit in
available memory). A block is terminated when deflate() determines that
it would be useful to start another block with fresh trees. (This is
somewhat similar to the behavior of LZW-based _compress_.)
Duplicated strings are found using a hash table. All input strings of
length 3 are inserted in the hash table. A hash index is computed for
the next 3 bytes. If the hash chain for this index is not empty, all
strings in the chain are compared with the current input string, and
the longest match is selected.
The hash chains are searched starting with the most recent strings, to
favor small distances and thus take advantage of the Huffman encoding.
The hash chains are singly linked. There are no deletions from the
hash chains, the algorithm simply discards matches that are too old.
To avoid a worst-case situation, very long hash chains are arbitrarily
truncated at a certain length, determined by a runtime option (level
parameter of deflateInit). So deflate() does not always find the longest
possible match but generally finds a match which is long enough.
deflate() also defers the selection of matches with a lazy evaluation
mechanism. After a match of length N has been found, deflate() searches for
a longer match at the next input byte. If a longer match is found, the
previous match is truncated to a length of one (thus producing a single
literal byte) and the process of lazy evaluation begins again. Otherwise,
the original match is kept, and the next match search is attempted only N
steps later.
The lazy match evaluation is also subject to a runtime parameter. If
the current match is long enough, deflate() reduces the search for a longer
match, thus speeding up the whole process. If compression ratio is more
important than speed, deflate() attempts a complete second search even if
the first match is already long enough.
The lazy match evaluation is not performed for the fastest compression
modes (level parameter 1 to 3). For these fast modes, new strings
are inserted in the hash table only when no match was found, or
when the match is not too long. This degrades the compression ratio
but saves time since there are both fewer insertions and fewer searches.
2. Decompression algorithm (inflate)
2.1 Introduction
The key question is how to represent a Huffman code (or any prefix code) so
that you can decode fast. The most important characteristic is that shorter
codes are much more common than longer codes, so pay attention to decoding the
short codes fast, and let the long codes take longer to decode.
inflate() sets up a first level table that covers some number of bits of
input less than the length of longest code. It gets that many bits from the
stream, and looks it up in the table. The table will tell if the next
code is that many bits or less and how many, and if it is, it will tell
the value, else it will point to the next level table for which inflate()
grabs more bits and tries to decode a longer code.
How many bits to make the first lookup is a tradeoff between the time it
takes to decode and the time it takes to build the table. If building the
table took no time (and if you had infinite memory), then there would only
be a first level table to cover all the way to the longest code. However,
building the table ends up taking a lot longer for more bits since short
codes are replicated many times in such a table. What inflate() does is
simply to make the number of bits in the first table a variable, and then
to set that variable for the maximum speed.
For inflate, which has 286 possible codes for the literal/length tree, the size
of the first table is nine bits. Also the distance trees have 30 possible
values, and the size of the first table is six bits. Note that for each of
those cases, the table ended up one bit longer than the ``average'' code
length, i.e. the code length of an approximately flat code which would be a
little more than eight bits for 286 symbols and a little less than five bits
for 30 symbols.
2.2 More details on the inflate table lookup
Ok, you want to know what this cleverly obfuscated inflate tree actually
looks like. You are correct that it's not a Huffman tree. It is simply a
lookup table for the first, let's say, nine bits of a Huffman symbol. The
symbol could be as short as one bit or as long as 15 bits. If a particular
symbol is shorter than nine bits, then that symbol's translation is duplicated
in all those entries that start with that symbol's bits. For example, if the
symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
symbol is nine bits long, it appears in the table once.
If the symbol is longer than nine bits, then that entry in the table points
to another similar table for the remaining bits. Again, there are duplicated
entries as needed. The idea is that most of the time the symbol will be short
and there will only be one table look up. (That's whole idea behind data
compression in the first place.) For the less frequent long symbols, there
will be two lookups. If you had a compression method with really long
symbols, you could have as many levels of lookups as is efficient. For
inflate, two is enough.
So a table entry either points to another table (in which case nine bits in
the above example are gobbled), or it contains the translation for the symbol
and the number of bits to gobble. Then you start again with the next
ungobbled bit.
You may wonder: why not just have one lookup table for how ever many bits the
longest symbol is? The reason is that if you do that, you end up spending
more time filling in duplicate symbol entries than you do actually decoding.
At least for deflate's output that generates new trees every several 10's of
kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
would take too long if you're only decoding several thousand symbols. At the
other extreme, you could make a new table for every bit in the code. In fact,
that's essentially a Huffman tree. But then you spend too much time
traversing the tree while decoding, even for short symbols.
So the number of bits for the first lookup table is a trade of the time to
fill out the table vs. the time spent looking at the second level and above of
the table.
Here is an example, scaled down:
The code being decoded, with 10 symbols, from 1 to 6 bits long:
A: 0
B: 10
C: 1100
D: 11010
E: 11011
F: 11100
G: 11101
H: 11110
I: 111110
J: 111111
Let's make the first table three bits long (eight entries):
000: A,1
001: A,1
010: A,1
011: A,1
100: B,2
101: B,2
110: -> table X (gobble 3 bits)
111: -> table Y (gobble 3 bits)
Each entry is what the bits decode as and how many bits that is, i.e. how
many bits to gobble. Or the entry points to another table, with the number of
bits to gobble implicit in the size of the table.
Table X is two bits long since the longest code starting with 110 is five bits
long:
00: C,1
01: C,1
10: D,2
11: E,2
Table Y is three bits long since the longest code starting with 111 is six
bits long:
000: F,2
001: F,2
010: G,2
011: G,2
100: H,2
101: H,2
110: I,3
111: J,3
So what we have here are three tables with a total of 20 entries that had to
be constructed. That's compared to 64 entries for a single table. Or
compared to 16 entries for a Huffman tree (six two entry tables and one four
entry table). Assuming that the code ideally represents the probability of
the symbols, it takes on the average 1.25 lookups per symbol. That's compared
to one lookup for the single table, or 1.66 lookups per symbol for the
Huffman tree.
There, I think that gives you a picture of what's going on. For inflate, the
meaning of a particular symbol is often more than just a letter. It can be a
byte (a "literal"), or it can be either a length or a distance which
indicates a base value and a number of bits to fetch after the code that is
added to the base value. Or it might be the special end-of-block code. The
data structures created in inftrees.c try to encode all that information
compactly in the tables.
Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu
References:
[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
pp. 337-343.
``DEFLATE Compressed Data Format Specification'' available in
https://tools.ietf.org/html/rfc1951
3p-zlib-ng-main/zlib-ng/doc/crc-doc.1.0.pdf 0000664 0000000 0000000 00002753716 14553115624 0020326 0 ustar 00root root 0000000 0000000 %PDF-1.4
%ÐÔÅØ
3 0 obj <<
/Length 1611
/Filter /FlateDecode
>>
stream
xÚÅXKÛ6¾çW=É@ň/‘:&›´HŠE²=5=нV–\IÎÖýõáP¶œhÓ¢HÒ“Éáóúøqäç·OžþÀõŠ&¸V«Û튫œiÃW9×Lbu[~K^~X‹<ñýiÜÕíÝ:•™H‚ˆÆ÷m‡³œñÄmÖ©0Iwi~óoHuCR‘¸mïêŠÆc·þýöõŠË‚q[¬RÁYÁ-ÙÞvýq\ÍW–´èjj$ãÆ€ºe¶à¤þ¬zŽ€ÉŸ\åÆr
¾ìâ~³2¬0ÇíÖ0.ó•bRFS|ÉŠe¹T«t¦æÚŠÎÞmp`’×¾½¯ÛaɈfÚÎmˆiÊy:|—lr}ѼbF
2_Ú¥÷®ñäÆ«¶d¦ai‘¯Ò‚åY1³þÑÉ7uÙwC·ÉÀM×ÈfïƺkCƒ]’Ã6IÛÞùÃè÷˜oB€ïi¿üžÒ$Ö<ÉxF>ˆR[äy@È™ÕNÐATÉÍ0ö®Œ¥v¦éÌ¢Ó€Ò,ÁÝîêñT$0äÐå‚| Q凤}½!qÔtøcįM å°ÒÐJÝâlô}ãŽ> †¯0®“ƒë]Óø¦þË»M(œò€*]_¥ÜpJ§y,¹dVHøÍ óÑe¼^
%uRvûÃq¤kw{š>ìêOÜÍÕ='³YŠx‘1ÈÊÈÐÏY´P9=)¤›z¤s¯|zŸélát°\_.ùܾ`îfÔxŸ µà€4£R®À'»d©È
Sæ:iû.”°‚È}©ÊܪVƒSIWÏÞ¼ Á¡§]¥†®HX·ôË™ ÁÍ/¿Ò <•Z áŒj;z ‚â “=¸‡#~Òàtví.1¦²É µõ4ì¶øï¢Àõc\¹`'ÉJ"ª,¡*ÌiU
ªžFÄÂ\MB;•s ÖS0Núí‚ÃûÓ)P*ŠFÊÆó50zÙ¸a 0† ¹5ú õÓœVÏh
ûæÇÑ<5Q“ÔN‹‰üÄ+%Ð&y"•Ó…‘Š„;%A^¼À V=h0WÑ0J.‘‡X|•f÷Ö~toÃyûCã¾Å_ôÂõž;d€HÝœHÐÆzôQEÅ6v®#xÃï±|ài+ö8“Dòã9PÓŒù`ŽÌwE{ »øÏM ™@À4CE=Àç‰F>`²kˆ#+R› !„åá1šzñ,•³Ã¼ýI9D(!—ìɉƒ;š9JÇàÿX§<9†„—>îßÒoëÆ#03iBaú™‹{OÇ
u½Ê¢Ê¦,ÚxísHÒÐᨿ÷C¬ô@G*e/Béæè.c²m T˜¼çR=ùýð ÇiÏ%3H·TþñŠï §}DôÞ¿&„á•xW!¥±G ÊçðÔ«œz(¡X‘™Ð,XÛ½8Or`Sú™ž—|=KìËb“f¦Ö%-„N^Àµäª)ÒƺX…9s ¤Ð2vAÙu§'è·¾ž¬hÿnëú{بMf¹´QÒƳ
ÜrÓ{ÄÊ@2ºc¸X@$>Úñ]²³à ?…RØe`m iòLl·zÂ`=@MÊKqR¢M$#€èÄvVg Czû?¸†àÕù2^…'bx7€«;z³$Þ@(&©®ƒü°ÖØ¡¬¹¶_À9U_4RõQ¤ù©œ"íÚÖÆ
a„®—rH¬Ñߦ6ÿ5ü©^®©:C6=4.p%¹§ˆªÆËZ>}.!n€žÉÝÁîÂ~]h>†Ža¼¡ž‰NšóFtØmÇðúÁ
uX0ØûÀößüâå<šN\3ç3E|öê“—5²04Ä\á£H9ð"5vê@¢b,(×ZšÄü;vSgv{ã‡sŽ¡‚o0ïB[ y
/1ȱG /y +½¿«H:(æÿªi4K Qgþzsl€Þ›úìð
Ñw/Ÿå¡(˜(Îß?/>M”…ÏçË÷QÛõ{×ĆMÒW6D§¶ÛCBàÚæ_ü’‡Ûmb†ŸÜ×qËÏǪslÿÁ{œ}5ÚšÅÀµbJp€{Á¬ÿíòäåí“¿ mmú
endstream
endobj
2 0 obj <<
/Type /Page
/Contents 3 0 R
/Resources 1 0 R
/MediaBox [0 0 612 792]
/Parent 15 0 R
>> endobj
1 0 obj <<
/Font << /F15 4 0 R /F16 5 0 R /F17 6 0 R /F29 7 0 R /F28 8 0 R /F30 9 0 R /F31 10 0 R /F35 11 0 R /F36 12 0 R /F8 13 0 R /F11 14 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
18 0 obj <<
/Length 2263
/Filter /FlateDecode
>>
stream
xÚÕZYsÛF~÷¯à#X1'sNå!Q¬Ôn•S®D[µÞˆIˆA€AËÚ_¿=38‰¡H):¼O¸†þzº¿>ÀŸ/Þ|®gIåìâjF¸FŠÐ™
Q&f«Ù¿Žø|A0¥ÉY¹Þìꬸž/ãÉf¾ *)çT'·s8³ÕÖ=`Iy5ÿÏÅ?¿?'d(›Ä0›á õkX2z»@\ªvš/ƯqàÆ[B„æ‰vfÂ8R
ŽÑÙL46û#[oòì&Ü®‚uÎ~wÆ:YÄ|k¸|ð†0Þxß2æ6,Iƒ÷83hgwïҙ䮶ݕNîöŸP£^Úƒñªïïežwh IZ¨FàׇðD†À`Bâ–Ð%lºêèb팰Ëël“ö¹¶Û° Â’:[Ã:©Ékn·GIG(e‹ÒœîßžËj5õïþ‰æƒ<†´ÛO‚a ýX•‡:YÚí¶Ã[”Å¢t(¾8X¶ÊÓͦ{x™7¿pÏ>7ù!+š’VižÛ|¾Ðš>õ¦±PH€òÂiTƒº6í•_u›¢Ý¦,û,ÚëžÀýÎ*,¿öh¥GK)2„O!# -9O>:8ѳÿöÕ»*O–Þ›Ó:›“¤„‚½LB‰l¢D›Cq™þY±Ê¾d«]šð8o“æõÈQ„”÷PÈef]Šîôï¶ ,º‚Êï
…]`å¬JÑ¿©3Kˆ e“ƒºlÁÒBÏpp@}c¨HÞ…*Q{`ëbgµ×dUv»Ë´”£„‘S©ú€HùžÏ
ç°ž[/æ Én{v]Ûú¦ÌËk OÍØÿSÆÚ™FSŠp>Þ¥”,·U’i•m½;höúœóÀH Ñ´"\´7e¶´kpuŸ#ü¬?C‡žå6°µs4É¿ñÙ€Å
Ð6VCæ¼*«uZì[bÄÎi~]VY}³Þ~+qhC¸pf\RÏmh3HK¼ñq؈ãëz¢"kHN‰€Ž€—À;a
ìHS$Ý-ól PØvµ+V`»»p}vc—Îa>‡ËOXàÆŒpJÂÍlŽi8Ü—ÊŸ_ÍÜá~m}írSdílsëÆ•ªþ·yúßmûÄÆvº²Ël“ÙŽã;´ÜW‹p¹†Š*½¶á¢®Òx~ëÈsÕµ/K`mÙ‚N|ʨFŠ2ÛÞ…;Aá´(|„8ex°²€¦Qàö˜Ô62èÝk®w“nÛòÕUtÖm¶ªªÝ”D^DŒÏ‚•°8‘Ó×HB–iÚÿ‘LÁ´Ìí‚c3+d»bV¨™DF1íh¤8$2‚¸iTÃ1jfƒEï@q©ÂA¶Wx‚ò¡ ÃŒŒ^ð[³Œ
–)„{¤Ÿ0ÆSM%¢´›…©1Š
utIr„÷°ut#4¼ú[ÄÂÄ'ú=óƒþ3òŠT?Äù¡Ý1ÔB Ý ¸Ì\õà ¹Ž½Ž!` ½-í‰Ûs5Ú’Ïk¨néä*Z°°Îc*A hÒ.øa*€#NõÞÖŽt ¸Ž 0šöîã¯4ô–~2ňF\šq,6Ñb÷KfoûƇ'6k8Áõ±ÛQ?ëÉk·†BoÙüv.à.Ë„JØD„mQüþž8Üp÷‡#qÁî(s<¢ä¾Ù‡e®÷~
:ƒyMXö¯ˆFïò©ˆƒ_
jø6Øä>Ô~Œ¹ `nk4{„÷î9¦cïJ
^åúg°ãPƒ3:•1Rf$$‚̆a€œ $h£q9rMÞNŠ6Þ¥Ëü®(×YÛ¶åSã¾n^ÑÎÀs%´ÁYz™ïÕZ+{]ÙfÕ!Â!P¦S²Ç¢c†ƒ\db!@wÖ
Éâé»À%%’Æ•PI)Ç‘ãT2 „˜æBRÜ3þU#ZqJ…ˆP/•ú´¨Ô/•|œSH4,ùÈè#QÁê'„å#
†IX’ÂRÝ–a"Æa ¥dË@þ’«s3?œ›á•RíH㵟ÆÝË~=~_’”
ƒ„6Ý ÑÑb‡ê¡È«#‰øUJH¯¼{ž+F¹¶$ J}¯hkß'Áƒ2P¥üpiÛÜ,ÂâeÕÚf*º•m+ȶ_»¢d\R´B]ÿÚŽP×AØjçÀîu])ÉùƲ™lدéz“Û·az‰sÅópÌôÓjå[ÄwîÇü³qƒ“{Ô¦î265%0-„üb°è»È«F¼}Ê›èS¾iܘÞ9¿kSÚ$êïÌbŒŠìg‡AÀÐ`²ÏHyŠ¦Ï°ÝþåQr MíÓÛëaoÍ7#É‚@ëO}ôUÚëÌ‘zpä¡|„wñ{Õ”)/AÂaƒ‘>òbv‚kòGÑæB